occam-nominal 1.0.571 → 1.0.575
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 +97 -11
- package/lib/context.js +27 -1
- package/lib/element/fact/premise.js +15 -8
- package/lib/element/fact/step.js +3 -3
- package/lib/element/fact/supposition.js +15 -8
- package/lib/element/fact.js +16 -16
- package/lib/element/hypothesis.js +21 -18
- package/lib/element/label.js +6 -3
- package/lib/element/parameter.js +37 -3
- package/lib/element/procedureReference.js +135 -14
- package/lib/example/nominal/bnf.js +5 -7
- package/lib/node/fact/premise.js +4 -4
- package/lib/node/fact/supposition.js +4 -4
- package/lib/node/hypothesis.js +4 -4
- package/lib/node/procedureReference.js +13 -4
- package/lib/nonTerminalNodeMap.js +2 -4
- package/lib/preamble.js +1 -2
- package/lib/process/instantiate.js +5 -5
- package/lib/ruleNames.js +2 -6
- package/lib/utilities/element.js +66 -82
- 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 +185 -38
- package/src/context.js +44 -0
- package/src/element/fact/premise.js +20 -8
- package/src/element/fact/step.js +2 -2
- package/src/element/fact/supposition.js +21 -9
- package/src/element/fact.js +16 -16
- package/src/element/hypothesis.js +23 -17
- package/src/element/label.js +7 -1
- package/src/element/parameter.js +63 -2
- package/src/element/procedureReference.js +212 -18
- package/src/example/nominal/bnf.js +4 -6
- package/src/node/fact/premise.js +5 -5
- package/src/node/fact/supposition.js +5 -5
- package/src/node/hypothesis.js +5 -5
- package/src/node/procedureReference.js +18 -3
- package/src/nonTerminalNodeMap.js +1 -4
- package/src/preamble.js +1 -2
- package/src/process/instantiate.js +4 -4
- package/src/ruleNames.js +1 -2
- package/src/utilities/element.js +87 -108
- package/src/utilities/json.js +54 -2
- package/src/utilities/string.js +7 -8
- package/lib/element/procedureCall.js +0 -132
- package/lib/node/procedureCall.js +0 -31
- package/src/element/procedureCall.js +0 -190
- package/src/node/procedureCall.js +0 -30
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, procedureReferences){
|
|
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.procedureReferences = procedureReferences;
|
|
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
|
+
getProcedureReferences(procedureReferences = []) {
|
|
88
|
+
const context = this.getContext();
|
|
89
|
+
push(procedureReferences, this.procedureReferences);
|
|
90
|
+
context.getProcedureReferences(procedureReferences);
|
|
91
|
+
return procedureReferences;
|
|
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
|
+
addProcedureReference(procedureReference) {
|
|
233
|
+
const context = this, procedureReferenceString = procedureReference.getString();
|
|
234
|
+
context.trace(`Adding the '${procedureReferenceString}' procedure call to the cladic context...`);
|
|
235
|
+
const procedureReferenceA = procedureReference; ///
|
|
236
|
+
extract(this.procedureReferences, (procedureReference)=>{
|
|
237
|
+
const procedureReferenceB = procedureReference, procedureReferenceAEqualToProcedureallB = procedureReferenceA.isEqualTo(procedureReferenceB);
|
|
238
|
+
if (procedureReferenceAEqualToProcedureallB) {
|
|
239
|
+
const procedureReferenceString = procedureReference.getString();
|
|
240
|
+
context.trace(`Removed the existing '${procedureReferenceString}' procedure call from the cladic context...`);
|
|
241
|
+
return true;
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
this.procedureReferences.push(procedureReference);
|
|
245
|
+
context.debug(`...added the '${procedureReferenceString}' 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
|
+
addProcedureReferences(procedureReferences) {
|
|
297
|
+
procedureReferences.forEach((procedureReference)=>{
|
|
298
|
+
this.addProcedureReference(procedureReference);
|
|
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
|
+
findProcedureReferenceByProcedureReferenceNode(procedureReferenceNode) {
|
|
383
|
+
const procedureReferences = this.getProcedureReferences(), procedureReference = procedureReferences.find((procedureReference)=>{
|
|
384
|
+
const procedureReferenceNodeMatches = procedureReference.matchProcedureReferenceNode(procedureReferenceNode);
|
|
385
|
+
if (procedureReferenceNodeMatches) {
|
|
386
|
+
return true;
|
|
387
|
+
}
|
|
388
|
+
}) || null;
|
|
389
|
+
return procedureReference;
|
|
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
|
+
isProcedureReferencePresentByProcedureReferenceNode(procedureReferenceNode) {
|
|
428
|
+
const procedureReference = this.findProcedureReferenceByProcedureReferenceNode(procedureReferenceNode), procedureReferencePresent = procedureReference !== null;
|
|
429
|
+
return procedureReferencePresent;
|
|
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.addProcedureReferences(this.procedureReferences);
|
|
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 = [], procedureReferences = [], cladicContext = new CladicContext(context, terms, links, frames, equalities, assertions, statements, parameters, assumptions, metavariables, procedureReferences);
|
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250ZXh0L2NsYWRpYy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgYXJyYXlVdGlsaXRpZXMgfSBmcm9tIFwibmVjZXNzYXJ5XCI7XG5cbmltcG9ydCBDb250ZXh0IGZyb20gXCIuLi9jb250ZXh0XCI7XG5cbmNvbnN0IHsgcHVzaCwgZXh0cmFjdCB9ID0gYXJyYXlVdGlsaXRpZXM7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENsYWRpY0NvbnRleHQgZXh0ZW5kcyBDb250ZXh0IHtcbiAgY29uc3RydWN0b3IoY29udGV4dCwgdGVybXMsIGxpbmtzLCBmcmFtZXMsIGVxdWFsaXRpZXMsIGFzc2VydGlvbnMsIHN0YXRlbWVudHMsIHBhcmFtZXRlcnMsIGFzc3VtcHRpb25zLCBtZXRhdmFyaWFibGVzLCBwcm9jZWR1cmVSZWZlcmVuY2VzKSB7XG4gICAgc3VwZXIoY29udGV4dCk7XG5cbiAgICB0aGlzLnRlcm1zID0gdGVybXM7XG4gICAgdGhpcy5saW5rcyA9IGxpbmtzO1xuICAgIHRoaXMuZnJhbWVzID0gZnJhbWVzO1xuICAgIHRoaXMuZXF1YWxpdGllcyA9IGVxdWFsaXRpZXM7XG4gICAgdGhpcy5hc3NlcnRpb25zID0gYXNzZXJ0aW9ucztcbiAgICB0aGlzLnN0YXRlbWVudHMgPSBzdGF0ZW1lbnRzO1xuICAgIHRoaXMucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XG4gICAgdGhpcy5hc3N1bXB0aW9ucyA9IGFzc3VtcHRpb25zO1xuICAgIHRoaXMubWV0YXZhcmlhYmxlcyA9IG1ldGF2YXJpYWJsZXM7XG4gICAgdGhpcy5wcm9jZWR1cmVSZWZlcmVuY2VzID0gcHJvY2VkdXJlUmVmZXJlbmNlcztcbiAgfVxuXG4gIGdldFRlcm1zKHRlcm1zID0gW10pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cbiAgICBwdXNoKHRlcm1zLCB0aGlzLnRlcm1zKTtcblxuICAgIGNvbnRleHQuZ2V0VGVybXModGVybXMpO1xuXG4gICAgcmV0dXJuIHRlcm1zO1xuICB9XG5cbiAgZ2V0TGlua3MobGlua3MgPSBbXSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblxuICAgIHB1c2gobGlua3MsIHRoaXMubGlua3MpO1xuXG4gICAgY29udGV4dC5nZXRMaW5rcyhsaW5rcyk7XG5cbiAgICByZXR1cm4gbGlua3M7XG4gIH1cblxuICBnZXRGcmFtZXMoZnJhbWVzID0gW10pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cbiAgICBwdXNoKGZyYW1lcywgdGhpcy5mcmFtZXMpO1xuXG4gICAgY29udGV4dC5nZXRGcmFtZXMoZnJhbWVzKTtcblxuICAgIHJldHVybiBmcmFtZXM7XG4gIH1cblxuICBnZXRFcXVhbGl0aWVzKGVxdWFsaXRpZXMgPSBbXSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblxuICAgIHB1c2goZXF1YWxpdGllcywgdGhpcy5lcXVhbGl0aWVzKTtcblxuICAgIGNvbnRleHQuZ2V0RXF1YWxpdGllcyhlcXVhbGl0aWVzKTtcblxuICAgIHJldHVybiBlcXVhbGl0aWVzO1xuICB9XG5cbiAgZ2V0U3RhdGVtZW50cyhzdGF0ZW1lbnRzID0gW10pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cbiAgICBwdXNoKHN0YXRlbWVudHMsIHRoaXMuc3RhdGVtZW50cyk7XG5cbiAgICBjb250ZXh0LmdldFN0YXRlbWVudHMoc3RhdGVtZW50cyk7XG5cbiAgICByZXR1cm4gc3RhdGVtZW50cztcbiAgfVxuXG4gIGdldFBhcmFtZXRlcnMocGFyYW1ldGVycyA9IFtdKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXG4gICAgcHVzaChwYXJhbWV0ZXJzLCB0aGlzLnBhcmFtZXRlcnMpO1xuXG4gICAgY29udGV4dC5nZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpO1xuXG4gICAgcmV0dXJuIHBhcmFtZXRlcnM7XG4gIH1cblxuICBnZXRBc3NlcnRpb25zKGFzc2VydGlvbnMgPSBbXSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblxuICAgIHB1c2goYXNzZXJ0aW9ucywgdGhpcy5hc3NlcnRpb25zKTtcblxuICAgIGNvbnRleHQuZ2V0QXNzZXJ0aW9ucyhhc3NlcnRpb25zKTtcblxuICAgIHJldHVybiBhc3NlcnRpb25zO1xuICB9XG5cbiAgZ2V0QXNzdW1wdGlvbnMoYXNzdW1wdGlvbnMgPSBbXSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblxuICAgIHB1c2goYXNzdW1wdGlvbnMsIHRoaXMuYXNzdW1wdGlvbnMpO1xuXG4gICAgY29udGV4dC5nZXRBc3N1bXB0aW9ucyhhc3N1bXB0aW9ucyk7XG5cbiAgICByZXR1cm4gYXNzdW1wdGlvbnM7XG4gIH1cblxuICBnZXRNZXRhdmFyaWFibGVzKG1ldGF2YXJpYWJsZXMgPSBbXSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblxuICAgIHB1c2gobWV0YXZhcmlhYmxlcywgdGhpcy5tZXRhdmFyaWFibGVzKTtcblxuICAgIGNvbnRleHQuZ2V0TWV0YXZhcmlhYmxlcyhtZXRhdmFyaWFibGVzKTtcblxuICAgIHJldHVybiBtZXRhdmFyaWFibGVzO1xuICB9XG5cbiAgZ2V0UHJvY2VkdXJlUmVmZXJlbmNlcyhwcm9jZWR1cmVSZWZlcmVuY2VzID0gW10pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cbiAgICBwdXNoKHByb2NlZHVyZVJlZmVyZW5jZXMsIHRoaXMucHJvY2VkdXJlUmVmZXJlbmNlcyk7XG5cbiAgICBjb250ZXh0LmdldFByb2NlZHVyZVJlZmVyZW5jZXMocHJvY2VkdXJlUmVmZXJlbmNlcyk7XG5cbiAgICByZXR1cm4gcHJvY2VkdXJlUmVmZXJlbmNlcztcbiAgfVxuXG4gIGFkZFRlcm0odGVybSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICB0ZXJtU3RyaW5nID0gdGVybS5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYEFkZGluZyB0aGUgJyR7dGVybVN0cmluZ30nIHRlcm0gdG8gdGhlIGNsYWRpYyBjb250ZXh0Li4uYCk7XG5cbiAgICBjb25zdCB0ZXJtQSA9IHRlcm07IC8vL1xuXG4gICAgZXh0cmFjdCh0aGlzLnRlcm1zLCAodGVybSkgPT4ge1xuICAgICAgY29uc3QgdGVybUIgPSB0ZXJtLCAvLy9cbiAgICAgICAgICAgIHRlcm1BRXF1YWxUb1Rlcm1CID0gdGVybUEuaXNFcXVhbFRvKHRlcm1CKTtcblxuICAgICAgaWYgKHRlcm1BRXF1YWxUb1Rlcm1CKSB7XG4gICAgICAgIGNvbnN0IHRlcm1TdHJpbmcgPSB0ZXJtLmdldFN0cmluZygpO1xuXG4gICAgICAgIGNvbnRleHQudHJhY2UoYFJlbW92ZWQgdGhlIGV4aXN0aW5nICcke3Rlcm1TdHJpbmd9JyB0ZXJtIGZyb20gdGhlIGNsYWRpYyBjb250ZXh0Li4uYCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnRlcm1zLnB1c2godGVybSk7XG5cbiAgICBjb250ZXh0LmRlYnVnKGAuLi5hZGRlZCB0aGUgJyR7dGVybVN0cmluZ30nIHRlcm0gdG8gdGhlIGNsYWRpYyBjb250ZXh0LmApO1xuICB9XG5cbiAgYWRkTGluayhsaW5rKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMsIC8vL1xuICAgICAgICAgIGxpbmtTdHJpbmcgPSBsaW5rLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgQWRkaW5nIHRoZSAnJHtsaW5rU3RyaW5nfScgbGluayB0byB0aGUgY2xhZGljIGNvbnRleHQuLi5gKTtcblxuICAgIGNvbnN0IGxpbmtBID0gbGluazsgLy8vXG5cbiAgICBleHRyYWN0KHRoaXMubGlua3MsIChsaW5rKSA9PiB7XG4gICAgICBjb25zdCBsaW5rQiA9IGxpbmssIC8vL1xuICAgICAgICAgICAgbGlua0FFcXVhbFRvTGlua0IgPSBsaW5rQS5pc0VxdWFsVG8obGlua0IpO1xuXG4gICAgICBpZiAobGlua0FFcXVhbFRvTGlua0IpIHtcbiAgICAgICAgY29uc3QgbGlua1N0cmluZyA9IGxpbmsuZ2V0U3RyaW5nKCk7XG5cbiAgICAgICAgY29udGV4dC50cmFjZShgUmVtb3ZlZCB0aGUgZXhpc3RpbmcgJyR7bGlua1N0cmluZ30nIGxpbmsgZnJvbSB0aGUgY2xhZGljIGNvbnRleHQuLi5gKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMubGlua3MucHVzaChsaW5rKTtcblxuICAgIGNvbnRleHQuZGVidWcoYC4uLmFkZGVkIHRoZSAnJHtsaW5rU3RyaW5nfScgbGluayB0byB0aGUgY2xhZGljIGNvbnRleHQuYCk7XG4gIH1cblxuICBhZGRGcmFtZShmcmFtZSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICBmcmFtZVN0cmluZyA9IGZyYW1lLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgQWRkaW5nIHRoZSAnJHtmcmFtZVN0cmluZ30nIGZyYW1lIHRvIHRoZSBjbGFkaWMgY29udGV4dC4uLmApO1xuXG4gICAgY29uc3QgZnJhbWVBID0gZnJhbWU7IC8vL1xuXG4gICAgZXh0cmFjdCh0aGlzLmZyYW1lcywgKGZyYW1lKSA9PiB7XG4gICAgICBjb25zdCBmcmFtZUIgPSBmcmFtZSwgLy8vXG4gICAgICAgICAgICBmcmFtZUFFcXVhbFRvRnJhbWVCID0gZnJhbWVBLmlzRXF1YWxUbyhmcmFtZUIpO1xuXG4gICAgICBpZiAoZnJhbWVBRXF1YWxUb0ZyYW1lQikge1xuICAgICAgICBjb25zdCBmcmFtZVN0cmluZyA9IGZyYW1lLmdldFN0cmluZygpO1xuXG4gICAgICAgIGNvbnRleHQudHJhY2UoYFJlbW92ZWQgdGhlIGV4aXN0aW5nICcke2ZyYW1lU3RyaW5nfScgZnJhbWUgZnJvbSB0aGUgY2xhZGljIGNvbnRleHQuLi5gKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuZnJhbWVzLnB1c2goZnJhbWUpO1xuXG4gICAgY29udGV4dC5kZWJ1ZyhgLi4uYWRkZWQgdGhlICcke2ZyYW1lU3RyaW5nfScgZnJhbWUgdG8gdGhlIGNsYWRpYyBjb250ZXh0LmApO1xuICB9XG5cbiAgYWRkRXF1YWxpdHkoZXF1YWxpdHkpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcywgLy8vXG4gICAgICAgICAgZXF1YWxpdHlTdHJpbmcgPSBlcXVhbGl0eS5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYEFkZGluZyB0aGUgJyR7ZXF1YWxpdHlTdHJpbmd9JyBlcXVhbGl0eSB0byB0aGUgY2xhZGljIGNvbnRleHQuLi5gKTtcblxuICAgIGNvbnN0IGVxdWFsaXR5QSA9IGVxdWFsaXR5OyAvLy9cblxuICAgIGV4dHJhY3QodGhpcy5lcXVhbGl0aWVzLCAoZXF1YWxpdHkpID0+IHtcbiAgICAgIGNvbnN0IGVxdWFsaXR5QiA9IGVxdWFsaXR5LCAvLy9cbiAgICAgICAgICAgIGVxdWFsaXR5QUVxdWFsVG9FcXVhbGl0eUIgPSBlcXVhbGl0eUEuaXNFcXVhbFRvKGVxdWFsaXR5Qik7XG5cbiAgICAgIGlmIChlcXVhbGl0eUFFcXVhbFRvRXF1YWxpdHlCKSB7XG4gICAgICAgIGNvbnN0IGVxdWFsaXR5U3RyaW5nID0gZXF1YWxpdHkuZ2V0U3RyaW5nKCk7XG5cbiAgICAgICAgY29udGV4dC50cmFjZShgUmVtb3ZlZCB0aGUgZXhpc3RpbmcgJyR7ZXF1YWxpdHlTdHJpbmd9JyBlcXVhbGl0eSBmcm9tIHRoZSBjbGFkaWMgY29udGV4dC4uLmApO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5lcXVhbGl0aWVzLnB1c2goZXF1YWxpdHkpO1xuXG4gICAgY29udGV4dC5kZWJ1ZyhgLi4uYWRkZWQgdGhlICcke2VxdWFsaXR5U3RyaW5nfScgZXF1YWxpdHkgdG8gdGhlIGNsYWRpYyBjb250ZXh0LmApO1xuICB9XG5cbiAgYWRkQXNzZXJ0aW9uKGFzc2VydGlvbikge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICBhc3NlcnRpb25TdHJpbmcgPSBhc3NlcnRpb24uZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBBZGRpbmcgdGhlICcke2Fzc2VydGlvblN0cmluZ30nIGFzc2VydGlvbiB0byB0aGUgY2xhZGljIGNvbnRleHQuLi5gKTtcblxuICAgIGNvbnN0IGFzc2VydGlvbkEgPSBhc3NlcnRpb247IC8vL1xuXG4gICAgZXh0cmFjdCh0aGlzLmFzc2VydGlvbnMsIChhc3NlcnRpb24pID0+IHtcbiAgICAgIGNvbnN0IGFzc2VydGlvbkIgPSBhc3NlcnRpb24sIC8vL1xuICAgICAgICAgICAgYXNzZXJ0aW9uQUVxdWFsVG9Bc3NlcnRpb25CID0gYXNzZXJ0aW9uQS5pc0VxdWFsVG8oYXNzZXJ0aW9uQik7XG5cbiAgICAgIGlmIChhc3NlcnRpb25BRXF1YWxUb0Fzc2VydGlvbkIpIHtcbiAgICAgICAgY29uc3QgYXNzZXJ0aW9uU3RyaW5nID0gYXNzZXJ0aW9uLmdldFN0cmluZygpO1xuXG4gICAgICAgIGNvbnRleHQudHJhY2UoYFJlbW92ZWQgdGhlIGV4aXN0aW5nICcke2Fzc2VydGlvblN0cmluZ30nIGFzc2VydGlvbiBmcm9tIHRoZSBjbGFkaWMgY29udGV4dC4uLmApO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5hc3NlcnRpb25zLnB1c2goYXNzZXJ0aW9uKTtcblxuICAgIGNvbnRleHQuZGVidWcoYC4uLmFkZGVkIHRoZSAnJHthc3NlcnRpb25TdHJpbmd9JyBhc3NlcnRpb24gdG8gdGhlIGNsYWRpYyBjb250ZXh0LmApO1xuICB9XG5cbiAgYWRkU3RhdGVtZW50KHN0YXRlbWVudCkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgIHN0YXRlbWVudFN0cmluZyA9IHN0YXRlbWVudC5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYEFkZGluZyB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IHRvIHRoZSBjbGFkaWMgY29udGV4dC4uLmApO1xuXG4gICAgY29uc3Qgc3RhdGVtZW50QSA9IHN0YXRlbWVudDsgLy8vXG5cbiAgICBleHRyYWN0KHRoaXMuc3RhdGVtZW50cywgKHN0YXRlbWVudCkgPT4ge1xuICAgICAgY29uc3Qgc3RhdGVtZW50QiA9IHN0YXRlbWVudCwgLy8vXG4gICAgICAgIHN0YXRlbWVudEFFcXVhbFRvU3RhdGVtZW50QiA9IHN0YXRlbWVudEEuaXNFcXVhbFRvKHN0YXRlbWVudEIpO1xuXG4gICAgICBpZiAoc3RhdGVtZW50QUVxdWFsVG9TdGF0ZW1lbnRCKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlbWVudFN0cmluZyA9IHN0YXRlbWVudC5nZXRTdHJpbmcoKTtcblxuICAgICAgICBjb250ZXh0LnRyYWNlKGBSZW1vdmVkIHRoZSBleGlzdGluZyAnJHtzdGF0ZW1lbnRTdHJpbmd9JyBzdGF0ZW1lbnQgZnJvbSB0aGUgY2xhZGljIGNvbnRleHQuLi5gKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuc3RhdGVtZW50cy5wdXNoKHN0YXRlbWVudCk7XG5cbiAgICBjb250ZXh0LmRlYnVnKGAuLi5hZGRlZCB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IHRvIHRoZSBjbGFkaWMgY29udGV4dC5gKTtcbiAgfVxuXG4gIGFkZFBhcmFtZXRlcihwYXJhbXRlcikge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICBwYXJhbXRlclN0cmluZyA9IHBhcmFtdGVyLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgQWRkaW5nIHRoZSAnJHtwYXJhbXRlclN0cmluZ30nIHBhcmFtdGVyIHRvIHRoZSBjbGFkaWMgY29udGV4dC4uLmApO1xuXG4gICAgY29uc3QgcGFyYW10ZXJBID0gcGFyYW10ZXI7IC8vL1xuXG4gICAgZXh0cmFjdCh0aGlzLnBhcmFtdGVycywgKHBhcmFtdGVyKSA9PiB7XG4gICAgICBjb25zdCBwYXJhbXRlckIgPSBwYXJhbXRlciwgLy8vXG4gICAgICAgICAgICBwYXJhbXRlckFFcXVhbFRvUGFyYW1ldGVyQiA9IHBhcmFtdGVyQS5pc0VxdWFsVG8ocGFyYW10ZXJCKTtcblxuICAgICAgaWYgKHBhcmFtdGVyQUVxdWFsVG9QYXJhbWV0ZXJCKSB7XG4gICAgICAgIGNvbnN0IHBhcmFtdGVyU3RyaW5nID0gcGFyYW10ZXIuZ2V0U3RyaW5nKCk7XG5cbiAgICAgICAgY29udGV4dC50cmFjZShgUmVtb3ZlZCB0aGUgZXhpc3RpbmcgJyR7cGFyYW10ZXJTdHJpbmd9JyBwYXJhbXRlciBmcm9tIHRoZSBjbGFkaWMgY29udGV4dC4uLmApO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5wYXJhbXRlcnMucHVzaChwYXJhbXRlcik7XG5cbiAgICBjb250ZXh0LmRlYnVnKGAuLi5hZGRlZCB0aGUgJyR7cGFyYW10ZXJTdHJpbmd9JyBwYXJhbXRlciB0byB0aGUgY2xhZGljIGNvbnRleHQuYCk7XG4gIH1cblxuICBhZGRBc3N1bXB0aW9uKGFzc3VtcHRpb24pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcywgLy8vXG4gICAgICAgICAgYXNzdW1wdGlvblN0cmluZyA9IGFzc3VtcHRpb24uZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBBZGRpbmcgdGhlICcke2Fzc3VtcHRpb25TdHJpbmd9JyBhc3N1bXB0aW9uIHRvIHRoZSBjbGFkaWMgY29udGV4dC4uLmApO1xuXG4gICAgY29uc3QgYXNzdW1wdGlvbkEgPSBhc3N1bXB0aW9uOyAvLy9cblxuICAgIGV4dHJhY3QodGhpcy5hc3N1bXB0aW9ucywgKGFzc3VtcHRpb24pID0+IHtcbiAgICAgIGNvbnN0IGFzc3VtcHRpb25CID0gYXNzdW1wdGlvbiwgLy8vXG4gICAgICAgICAgICBhc3N1bXB0aW9uQUVxdWFsVG9Bc3N1bXB0aW9uQiA9IGFzc3VtcHRpb25BLmlzRXF1YWxUbyhhc3N1bXB0aW9uQik7XG5cbiAgICAgIGlmIChhc3N1bXB0aW9uQUVxdWFsVG9Bc3N1bXB0aW9uQikge1xuICAgICAgICBjb25zdCBhc3N1bXB0aW9uU3RyaW5nID0gYXNzdW1wdGlvbi5nZXRTdHJpbmcoKTtcblxuICAgICAgICBjb250ZXh0LnRyYWNlKGBSZW1vdmVkIHRoZSBleGlzdGluZyAnJHthc3N1bXB0aW9uU3RyaW5nfScgYXNzdW1wdGlvbiBmcm9tIHRoZSBjbGFkaWMgY29udGV4dC4uLmApO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5hc3N1bXB0aW9ucy5wdXNoKGFzc3VtcHRpb24pO1xuXG4gICAgY29udGV4dC5kZWJ1ZyhgLi4uYWRkZWQgdGhlICcke2Fzc3VtcHRpb25TdHJpbmd9JyBhc3N1bXB0aW9uIHRvIHRoZSBjbGFkaWMgY29udGV4dC5gKTtcbiAgfVxuXG4gIGFkZE1ldGF2YXJpYWJsZShtZXRhdmFyaWFibGUpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcywgLy8vXG4gICAgICAgICAgbWV0YXZhcmlhYmxlU3RyaW5nID0gbWV0YXZhcmlhYmxlLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgQWRkaW5nIHRoZSAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUgdG8gdGhlIGNsYWRpYyBjb250ZXh0Li4uYCk7XG5cbiAgICBjb25zdCBtZXRhdmFyaWFibGVBID0gbWV0YXZhcmlhYmxlOyAvLy9cblxuICAgIGV4dHJhY3QodGhpcy5tZXRhdmFyaWFibGVzLCAobWV0YXZhcmlhYmxlKSA9PiB7XG4gICAgICBjb25zdCBtZXRhdmFyaWFibGVCID0gbWV0YXZhcmlhYmxlLCAvLy9cbiAgICAgICAgICAgIG1ldGF2YXJpYWJsZUFFcXVhbFRvTWV0YXZhcmlhYmxlQiA9IG1ldGF2YXJpYWJsZUEuaXNFcXVhbFRvKG1ldGF2YXJpYWJsZUIpO1xuXG4gICAgICBpZiAobWV0YXZhcmlhYmxlQUVxdWFsVG9NZXRhdmFyaWFibGVCKSB7XG4gICAgICAgIGNvbnN0IG1ldGF2YXJpYWJsZVN0cmluZyA9IG1ldGF2YXJpYWJsZS5nZXRTdHJpbmcoKTtcblxuICAgICAgICBjb250ZXh0LnRyYWNlKGBSZW1vdmVkIHRoZSBleGlzdGluZyAnJHttZXRhdmFyaWFibGVTdHJpbmd9JyBtZXRhdmFyaWFibGUgZnJvbSB0aGUgY2xhZGljIGNvbnRleHQuLi5gKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMubWV0YXZhcmlhYmxlcy5wdXNoKG1ldGF2YXJpYWJsZSk7XG5cbiAgICBjb250ZXh0LmRlYnVnKGAuLi5hZGRlZCB0aGUgJyR7bWV0YXZhcmlhYmxlU3RyaW5nfScgbWV0YXZhcmlhYmxlIHRvIHRoZSBjbGFkaWMgY29udGV4dC5gKTtcbiAgfVxuXG4gIGFkZFN1YnN0aXR1dGlvbihzdWJzdGl0dXRpb24pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cbiAgICBjb250ZXh0LmFkZFN1YnN0aXR1dGlvbihzdWJzdGl0dXRpb24pO1xuICB9XG5cbiAgYWRkUHJvY2VkdXJlUmVmZXJlbmNlKHByb2NlZHVyZVJlZmVyZW5jZSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLCAvLy9cbiAgICAgICAgICBwcm9jZWR1cmVSZWZlcmVuY2VTdHJpbmcgPSBwcm9jZWR1cmVSZWZlcmVuY2UuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBBZGRpbmcgdGhlICcke3Byb2NlZHVyZVJlZmVyZW5jZVN0cmluZ30nIHByb2NlZHVyZSBjYWxsIHRvIHRoZSBjbGFkaWMgY29udGV4dC4uLmApO1xuXG4gICAgY29uc3QgcHJvY2VkdXJlUmVmZXJlbmNlQSA9IHByb2NlZHVyZVJlZmVyZW5jZTsgLy8vXG5cbiAgICBleHRyYWN0KHRoaXMucHJvY2VkdXJlUmVmZXJlbmNlcywgKHByb2NlZHVyZVJlZmVyZW5jZSkgPT4ge1xuICAgICAgY29uc3QgcHJvY2VkdXJlUmVmZXJlbmNlQiA9IHByb2NlZHVyZVJlZmVyZW5jZSwgLy8vXG4gICAgICAgICAgICBwcm9jZWR1cmVSZWZlcmVuY2VBRXF1YWxUb1Byb2NlZHVyZWFsbEIgPSBwcm9jZWR1cmVSZWZlcmVuY2VBLmlzRXF1YWxUbyhwcm9jZWR1cmVSZWZlcmVuY2VCKTtcblxuICAgICAgaWYgKHByb2NlZHVyZVJlZmVyZW5jZUFFcXVhbFRvUHJvY2VkdXJlYWxsQikge1xuICAgICAgICBjb25zdCBwcm9jZWR1cmVSZWZlcmVuY2VTdHJpbmcgPSBwcm9jZWR1cmVSZWZlcmVuY2UuZ2V0U3RyaW5nKCk7XG5cbiAgICAgICAgY29udGV4dC50cmFjZShgUmVtb3ZlZCB0aGUgZXhpc3RpbmcgJyR7cHJvY2VkdXJlUmVmZXJlbmNlU3RyaW5nfScgcHJvY2VkdXJlIGNhbGwgZnJvbSB0aGUgY2xhZGljIGNvbnRleHQuLi5gKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMucHJvY2VkdXJlUmVmZXJlbmNlcy5wdXNoKHByb2NlZHVyZVJlZmVyZW5jZSk7XG5cbiAgICBjb250ZXh0LmRlYnVnKGAuLi5hZGRlZCB0aGUgJyR7cHJvY2VkdXJlUmVmZXJlbmNlU3RyaW5nfScgcHJvY2VkdXJlIGNhbGwgdG8gdGhlIGNsYWRpYyBjb250ZXh0LmApO1xuICB9XG5cbiAgYWRkQXNzaWdubWVudChhc3NpZ25tZW50KSB7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXG4gICAgY29udGV4dC5hZGRBc3NpZ25tZW50KGFzc2lnbm1lbnQpO1xuICB9XG5cbiAgYWRkVGVybXModGVybXMpIHtcbiAgICB0ZXJtcy5mb3JFYWNoKCh0ZXJtKSA9PiB7XG4gICAgICB0aGlzLmFkZFRlcm0odGVybSk7XG4gICAgfSk7XG4gIH1cblxuICBhZGRMaW5rcyhsaW5rcykge1xuICAgIGxpbmtzLmZvckVhY2goKGxpbmspID0+IHtcbiAgICAgIHRoaXMuYWRkTGluayhsaW5rKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZEZyYW1lcyhmcmFtZXMpIHtcbiAgICBmcmFtZXMuZm9yRWFjaCgoZnJhbWUpID0+IHtcbiAgICAgIHRoaXMuYWRkRnJhbWUoZnJhbWUpO1xuICAgIH0pO1xuICB9XG5cbiAgYWRkRXF1YWxpdGllcyhlcXVhbGl0aWVzKSB7XG4gICAgZXF1YWxpdGllcy5mb3JFYWNoKChlcXVhbGl0eSkgPT4ge1xuICAgICAgdGhpcy5hZGRFcXVhbGl0eShlcXVhbGl0eSk7XG4gICAgfSk7XG4gIH1cblxuICBhZGRBc3NlcnRpb25zKGFzc2VydGlvbnMpIHtcbiAgICBhc3NlcnRpb25zLmZvckVhY2goKGFzc2VydGlvbikgPT4ge1xuICAgICAgdGhpcy5hZGRBc3NlcnRpb24oYXNzZXJ0aW9uKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZFN0YXRlbWVudHMoc3RhdGVtZW50cykge1xuICAgIHN0YXRlbWVudHMuZm9yRWFjaCgoc3RhdGVtZW50KSA9PiB7XG4gICAgICB0aGlzLmFkZFN0YXRlbWVudChzdGF0ZW1lbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgYWRkUGFyYW1ldGVycyhwYXJhbWV0ZXJzKSB7XG4gICAgcGFyYW1ldGVycy5mb3JFYWNoKChwYXJhbWV0ZXIpID0+IHtcbiAgICAgIHRoaXMuYWRkUGFyYW1ldGVyKHBhcmFtZXRlcik7XG4gICAgfSk7XG4gIH1cblxuICBhZGRBc3N1bXB0aW9ucyhhc3N1bXB0aW9ucykge1xuICAgIGFzc3VtcHRpb25zLmZvckVhY2goKGFzc3VtcHRpb24pID0+IHtcbiAgICAgIHRoaXMuYWRkQXNzdW1wdGlvbihhc3N1bXB0aW9uKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZE1ldGF2YXJpYWJsZXMobWV0YXZhcmlhYmxlcykge1xuICAgIG1ldGF2YXJpYWJsZXMuZm9yRWFjaCgobWV0YXZhcmlhYmxlKSA9PiB7XG4gICAgICB0aGlzLmFkZE1ldGF2YXJpYWJsZShtZXRhdmFyaWFibGUpO1xuICAgIH0pO1xuICB9XG5cbiAgYWRkUHJvY2VkdXJlUmVmZXJlbmNlcyhwcm9jZWR1cmVSZWZlcmVuY2VzKSB7XG4gICAgcHJvY2VkdXJlUmVmZXJlbmNlcy5mb3JFYWNoKChwcm9jZWR1cmVSZWZlcmVuY2UpID0+IHtcbiAgICAgIHRoaXMuYWRkUHJvY2VkdXJlUmVmZXJlbmNlKHByb2NlZHVyZVJlZmVyZW5jZSk7XG4gICAgfSk7XG4gIH1cblxuICBmaW5kVGVybUJ5VGVybU5vZGUodGVybU5vZGUpIHtcbiAgICBjb25zdCB0ZXJtcyA9IHRoaXMuZ2V0VGVybXMoKSxcbiAgICAgICAgICB0ZXJtID0gdGVybXMuZmluZCgodGVybSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGVybU5vZGVNYXRjaGVzID0gdGVybS5tYXRjaFRlcm1Ob2RlKHRlcm1Ob2RlKTtcblxuICAgICAgICAgICAgaWYgKHRlcm1Ob2RlTWF0Y2hlcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIHRlcm07XG4gIH1cblxuICBmaW5kTGlua0J5TGlua05vZGUobGlua05vZGUpIHtcbiAgICBjb25zdCBsaW5rcyA9IHRoaXMuZ2V0TGlua3MoKSxcbiAgICAgICAgICBsaW5rID0gbGlua3MuZmluZCgobGluaykgPT4ge1xuICAgICAgICAgICAgY29uc3QgbGlua05vZGVNYXRjaGVzID0gbGluay5tYXRjaExpbmtOb2RlKGxpbmtOb2RlKTtcblxuICAgICAgICAgICAgaWYgKGxpbmtOb2RlTWF0Y2hlcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIGxpbms7XG4gIH1cblxuICBmaW5kRnJhbWVCeUZyYW1lTm9kZShmcmFtZU5vZGUpIHtcbiAgICBjb25zdCBmcmFtZXMgPSB0aGlzLmdldEZyYW1lcygpLFxuICAgICAgICAgIGZyYW1lID0gZnJhbWVzLmZpbmQoKGZyYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmcmFtZU5vZGVNYXRjaGVzID0gZnJhbWUubWF0Y2hGcmFtZU5vZGUoZnJhbWVOb2RlKTtcblxuICAgICAgICAgICAgaWYgKGZyYW1lTm9kZU1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBmcmFtZTtcbiAgfVxuXG4gIGZpbmRFcXVhbGl0eUJ5RXF1YWxpdHlOb2RlKGVxdWFsaXR5Tm9kZSkge1xuICAgIGNvbnN0IGVxdWFsaXRpZXMgPSB0aGlzLmdldEVxdWFsaXRpZXMoKSxcbiAgICAgICAgICBlcXVhbGl0eSA9IGVxdWFsaXRpZXMuZmluZCgoZXF1YWxpdHkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVxdWFsaXR5Tm9kZU1hdGNoZXMgPSBlcXVhbGl0eS5tYXRjaEVxdWFsaXR5Tm9kZShlcXVhbGl0eU5vZGUpO1xuXG4gICAgICAgICAgICBpZiAoZXF1YWxpdHlOb2RlTWF0Y2hlcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIGVxdWFsaXR5O1xuICB9XG5cbiAgZmluZEFzc2VydGlvbkJ5QXNzZXJ0aW9uTm9kZShhc3NlcnRpb25Ob2RlKSB7XG4gICAgY29uc3QgYXNzZXJ0aW9ucyA9IHRoaXMuZ2V0QXNzZXJ0aW9ucygpLFxuICAgICAgICAgIGFzc2VydGlvbiA9IGFzc2VydGlvbnMuZmluZCgoYXNzZXJ0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhc3NlcnRpb25Ob2RlTWF0Y2hlcyA9IGFzc2VydGlvbi5tYXRjaEFzc2VydGlvbk5vZGUoYXNzZXJ0aW9uTm9kZSk7XG5cbiAgICAgICAgICAgIGlmIChhc3NlcnRpb25Ob2RlTWF0Y2hlcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIGFzc2VydGlvbjtcbiAgfVxuXG4gIGZpbmRTdGF0ZW1lbnRCeVN0YXRlbWVudE5vZGUoc3RhdGVtZW50Tm9kZSkge1xuICAgIGNvbnN0IHN0YXRlbWVudHMgPSB0aGlzLmdldFN0YXRlbWVudHMoKSxcbiAgICAgICAgICBzdGF0ZW1lbnQgPSBzdGF0ZW1lbnRzLmZpbmQoKHN0YXRlbWVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RhdGVtZW50Tm9kZU1hdGNoZXMgPSBzdGF0ZW1lbnQubWF0Y2hTdGF0ZW1lbnROb2RlKHN0YXRlbWVudE5vZGUpO1xuXG4gICAgICAgICAgICBpZiAoc3RhdGVtZW50Tm9kZU1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBzdGF0ZW1lbnQ7XG4gIH1cblxuICBmaW5kUGFyYW1ldGVyQnlQYXJhbWV0ZXJOb2RlKHBhcmFtZXRlck5vZGUpIHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gdGhpcy5nZXRQYXJhbWV0ZXJzKCksXG4gICAgICAgICAgcGFyYW1ldGVyID0gcGFyYW1ldGVycy5maW5kKChwYXJhbWV0ZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtZXRlck5vZGVNYXRjaGVzID0gcGFyYW1ldGVyLm1hdGNoUGFyYW1ldGVyTm9kZShwYXJhbWV0ZXJOb2RlKTtcblxuICAgICAgICAgICAgaWYgKHBhcmFtZXRlck5vZGVNYXRjaGVzKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gcGFyYW1ldGVyO1xuICB9XG5cbiAgZmluZEFzc3VtcHRpb25CeUFzc3VtcHRpb25Ob2RlKGFzc3VtcHRpb25Ob2RlKSB7XG4gICAgY29uc3QgYXNzdW1wdGlvbnMgPSB0aGlzLmdldEFzc3VtcHRpb25zKCksXG4gICAgICAgICAgYXNzdW1wdGlvbiA9IGFzc3VtcHRpb25zLmZpbmQoKGFzc3VtcHRpb24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFzc3VtcHRpb25Ob2RlTWF0Y2hlcyA9IGFzc3VtcHRpb24ubWF0Y2hBc3N1bXB0aW9uTm9kZShhc3N1bXB0aW9uTm9kZSk7XG5cbiAgICAgICAgICAgIGlmIChhc3N1bXB0aW9uTm9kZU1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBhc3N1bXB0aW9uO1xuICB9XG5cbiAgZmluZE1ldGF2YXJpYWJsZUJ5TWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKSB7XG4gICAgY29uc3QgbWV0YXZhcmlhYmxlcyA9IHRoaXMuZ2V0TWV0YXZhcmlhYmxlcygpLFxuICAgICAgICAgIG1ldGF2YXJpYWJsZSA9IG1ldGF2YXJpYWJsZXMuZmluZCgobWV0YXZhcmlhYmxlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcyA9IG1ldGF2YXJpYWJsZS5tYXRjaE1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSk7XG5cbiAgICAgICAgICAgIGlmIChtZXRhdmFyaWFibGVOb2RlTWF0Y2hlcykge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSB8fCBudWxsO1xuXG4gICAgcmV0dXJuIG1ldGF2YXJpYWJsZTtcbiAgfVxuXG4gIGZpbmRQcm9jZWR1cmVSZWZlcmVuY2VCeVByb2NlZHVyZVJlZmVyZW5jZU5vZGUocHJvY2VkdXJlUmVmZXJlbmNlTm9kZSkge1xuICAgIGNvbnN0IHByb2NlZHVyZVJlZmVyZW5jZXMgPSB0aGlzLmdldFByb2NlZHVyZVJlZmVyZW5jZXMoKSxcbiAgICAgICAgICBwcm9jZWR1cmVSZWZlcmVuY2UgPSBwcm9jZWR1cmVSZWZlcmVuY2VzLmZpbmQoKHByb2NlZHVyZVJlZmVyZW5jZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJvY2VkdXJlUmVmZXJlbmNlTm9kZU1hdGNoZXMgPSBwcm9jZWR1cmVSZWZlcmVuY2UubWF0Y2hQcm9jZWR1cmVSZWZlcmVuY2VOb2RlKHByb2NlZHVyZVJlZmVyZW5jZU5vZGUpO1xuXG4gICAgICAgICAgICBpZiAocHJvY2VkdXJlUmVmZXJlbmNlTm9kZU1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBwcm9jZWR1cmVSZWZlcmVuY2U7XG4gIH1cblxuICBpc1Rlcm1QcmVzZW50QnlUZXJtTm9kZSh0ZXJtTm9kZSkge1xuICAgIGNvbnN0IHRlcm0gPSB0aGlzLmZpbmRUZXJtQnlUZXJtTm9kZSh0ZXJtTm9kZSksXG4gICAgICAgICAgdGVybVByZXNlbnQgPSAodGVybSAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gdGVybVByZXNlbnQ7XG4gIH1cblxuICBpc0xpbmtQcmVzZW50QnlMaW5rTm9kZShsaW5rTm9kZSkge1xuICAgIGNvbnN0IGxpbmsgPSB0aGlzLmZpbmRMaW5rQnlMaW5rTm9kZShsaW5rTm9kZSksXG4gICAgICAgICAgbGlua1ByZXNlbnQgPSAobGluayAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gbGlua1ByZXNlbnQ7XG4gIH1cblxuICBpc0ZyYW1lUHJlc2VudEJ5RnJhbWVOb2RlKGZyYW1lTm9kZSkge1xuICAgIGNvbnN0IGZyYW1lID0gdGhpcy5maW5kRnJhbWVCeUZyYW1lTm9kZShmcmFtZU5vZGUpLFxuICAgICAgICAgIGZyYW1lUHJlc2VudCA9IChmcmFtZSAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gZnJhbWVQcmVzZW50O1xuICB9XG5cbiAgaXNFcXVhbGl0eVByZXNlbnRCeUVxdWFsaXR5Tm9kZShlcXVhbGl0eU5vZGUpIHtcbiAgICBjb25zdCBlcXVhbGl0eSA9IHRoaXMuZmluZEVxdWFsaXR5QnlFcXVhbGl0eU5vZGUoZXF1YWxpdHlOb2RlKSxcbiAgICAgICAgICBlcXVhbGl0eVByZXNlbnQgPSAoZXF1YWxpdHkgIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIGVxdWFsaXR5UHJlc2VudDtcbiAgfVxuXG4gIGlzQXNzZXJ0aW9uUHJlc2VudEJ5QXNzZXJ0aW9uTm9kZShhc3NlcnRpb25Ob2RlKSB7XG4gICAgY29uc3QgYXNzZXJ0aW9uID0gdGhpcy5maW5kQXNzZXJ0aW9uQnlBc3NlcnRpb25Ob2RlKGFzc2VydGlvbk5vZGUpLFxuICAgICAgICAgIGFzc2VydGlvblByZXNlbnQgPSAoYXNzZXJ0aW9uICE9PSBudWxsKTtcblxuICAgIHJldHVybiBhc3NlcnRpb25QcmVzZW50O1xuICB9XG5cbiAgaXNTdGF0ZW1lbnRQcmVzZW50QnlTdGF0ZW1lbnROb2RlKHN0YXRlbWVudE5vZGUpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnQgPSB0aGlzLmZpbmRTdGF0ZW1lbnRCeVN0YXRlbWVudE5vZGUoc3RhdGVtZW50Tm9kZSksXG4gICAgICAgICAgc3RhdGVtZW50UHJlc2VudCA9IChzdGF0ZW1lbnQgIT09IG51bGwpO1xuXG4gICAgcmV0dXJuIHN0YXRlbWVudFByZXNlbnQ7XG4gIH1cblxuICBpc1BhcmFtZXRlclByZXNlbnRCeVBhcmFtZXRlck5vZGUocGFyYW1ldGVyTm9kZSkge1xuICAgIGNvbnN0IHBhcmFtZXRlciA9IHRoaXMuZmluZFBhcmFtZXRlckJ5UGFyYW1ldGVyTm9kZShwYXJhbWV0ZXJOb2RlKSxcbiAgICAgICAgICBwYXJhbWV0ZXJQcmVzZW50ID0gKHBhcmFtZXRlciAhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gcGFyYW1ldGVyUHJlc2VudDtcbiAgfVxuXG4gIGlzQXNzdW1wdGlvblByZXNlbnRCeUFzc3VtcHRpb25Ob2RlKGFzc3VtcHRpb25Ob2RlKSB7XG4gICAgY29uc3QgYXNzdW1wdGlvbiA9IHRoaXMuZmluZEFzc3VtcHRpb25CeUFzc3VtcHRpb25Ob2RlKGFzc3VtcHRpb25Ob2RlKSxcbiAgICAgICAgICBhc3N1bXB0aW9uUHJlc2VudCA9IChhc3N1bXB0aW9uICE9PSBudWxsKTtcblxuICAgIHJldHVybiBhc3N1bXB0aW9uUHJlc2VudDtcbiAgfVxuXG4gIGlzTWV0YXZhcmlhYmxlUHJlc2VudEJ5TWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKSB7XG4gICAgY29uc3QgbWV0YXZhcmlhYmxlbiA9IHRoaXMuZmluZE1ldGF2YXJpYWJsZUJ5TWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKSxcbiAgICAgICAgICBtZXRhdmFyaWFibGVuUHJlc2VudCA9IChtZXRhdmFyaWFibGVuICE9PSBudWxsKTtcblxuICAgIHJldHVybiBtZXRhdmFyaWFibGVuUHJlc2VudDtcbiAgfVxuXG4gIGlzUHJvY2VkdXJlUmVmZXJlbmNlUHJlc2VudEJ5UHJvY2VkdXJlUmVmZXJlbmNlTm9kZShwcm9jZWR1cmVSZWZlcmVuY2VOb2RlKSB7XG4gICAgY29uc3QgcHJvY2VkdXJlUmVmZXJlbmNlID0gdGhpcy5maW5kUHJvY2VkdXJlUmVmZXJlbmNlQnlQcm9jZWR1cmVSZWZlcmVuY2VOb2RlKHByb2NlZHVyZVJlZmVyZW5jZU5vZGUpLFxuICAgICAgICAgIHByb2NlZHVyZVJlZmVyZW5jZVByZXNlbnQgPSAocHJvY2VkdXJlUmVmZXJlbmNlICE9PSBudWxsKTtcblxuICAgIHJldHVybiBwcm9jZWR1cmVSZWZlcmVuY2VQcmVzZW50O1xuICB9XG5cbiAgbWVyZ2UoY29udGV4dCkge1xuICAgIGNvbnRleHQuZGVidWcoYE1lcmdpbmcgdGhlIGNsYWRpYyBjb250ZXh0YCk7XG5cbiAgICBjb250ZXh0LmFkZFRlcm1zKHRoaXMudGVybXMpO1xuXG4gICAgY29udGV4dC5hZGRMaW5rcyh0aGlzLmxpbmtzKTtcblxuICAgIGNvbnRleHQuYWRkRnJhbWVzKHRoaXMuZnJhbWVzKTtcblxuICAgIGNvbnRleHQuYWRkRXF1YWxpdGllcyh0aGlzLmVxdWFsaXRpZXMpO1xuXG4gICAgY29udGV4dC5hZGRBc3NlcnRpb25zKHRoaXMuYXNzZXJ0aW9ucyk7XG5cbiAgICBjb250ZXh0LmFkZFN0YXRlbWVudHModGhpcy5zdGF0ZW1lbnRzKTtcblxuICAgIGNvbnRleHQuYWRkUGFyYW1ldGVycyh0aGlzLnBhcmFtZXRlcnMpO1xuXG4gICAgY29udGV4dC5hZGRBc3N1bXB0aW9ucyh0aGlzLmFzc3VtcHRpb25zKTtcblxuICAgIGNvbnRleHQuYWRkTWV0YXZhcmlhYmxlcyh0aGlzLm1ldGF2YXJpYWJsZXMpO1xuXG4gICAgY29udGV4dC5hZGRQcm9jZWR1cmVSZWZlcmVuY2VzKHRoaXMucHJvY2VkdXJlUmVmZXJlbmNlcyk7XG4gIH1cblxuICBzdGF0aWMgZnJvbU5vdGhpbmcoY29udGV4dCkge1xuICAgIGNvbnN0IHRlcm1zID0gW10sXG4gICAgICAgICAgbGlua3MgPSBbXSxcbiAgICAgICAgICBmcmFtZXMgPSBbXSxcbiAgICAgICAgICBlcXVhbGl0aWVzID0gW10sXG4gICAgICAgICAgc3RhdGVtZW50cyA9IFtdLFxuICAgICAgICAgIHBhcmFtZXRlcnMgPSBbXSxcbiAgICAgICAgICBhc3NlcnRpb25zID0gW10sXG4gICAgICAgICAgYXNzdW1wdGlvbnMgPSBbXSxcbiAgICAgICAgICBtZXRhdmFyaWFibGVzID0gW10sXG4gICAgICAgICAgcHJvY2VkdXJlUmVmZXJlbmNlcyA9IFtdLFxuICAgICAgICAgIGNsYWRpY0NvbnRleHQgPSBuZXcgQ2xhZGljQ29udGV4dChjb250ZXh0LCB0ZXJtcywgbGlua3MsIGZyYW1lcywgZXF1YWxpdGllcywgYXNzZXJ0aW9ucywgc3RhdGVtZW50cywgcGFyYW1ldGVycywgYXNzdW1wdGlvbnMsIG1ldGF2YXJpYWJsZXMsIHByb2NlZHVyZVJlZmVyZW5jZXMpO1xuXG4gICAgcmV0dXJuIGNsYWRpY0NvbnRleHQ7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJDbGFkaWNDb250ZXh0IiwicHVzaCIsImV4dHJhY3QiLCJhcnJheVV0aWxpdGllcyIsIkNvbnRleHQiLCJjb250ZXh0IiwidGVybXMiLCJsaW5rcyIsImZyYW1lcyIsImVxdWFsaXRpZXMiLCJhc3NlcnRpb25zIiwic3RhdGVtZW50cyIsInBhcmFtZXRlcnMiLCJhc3N1bXB0aW9ucyIsIm1ldGF2YXJpYWJsZXMiLCJwcm9jZWR1cmVSZWZlcmVuY2VzIiwiZ2V0VGVybXMiLCJnZXRDb250ZXh0IiwiZ2V0TGlua3MiLCJnZXRGcmFtZXMiLCJnZXRFcXVhbGl0aWVzIiwiZ2V0U3RhdGVtZW50cyIsImdldFBhcmFtZXRlcnMiLCJnZXRBc3NlcnRpb25zIiwiZ2V0QXNzdW1wdGlvbnMiLCJnZXRNZXRhdmFyaWFibGVzIiwiZ2V0UHJvY2VkdXJlUmVmZXJlbmNlcyIsImFkZFRlcm0iLCJ0ZXJtIiwidGVybVN0cmluZyIsImdldFN0cmluZyIsInRyYWNlIiwidGVybUEiLCJ0ZXJtQiIsInRlcm1BRXF1YWxUb1Rlcm1CIiwiaXNFcXVhbFRvIiwiZGVidWciLCJhZGRMaW5rIiwibGluayIsImxpbmtTdHJpbmciLCJsaW5rQSIsImxpbmtCIiwibGlua0FFcXVhbFRvTGlua0IiLCJhZGRGcmFtZSIsImZyYW1lIiwiZnJhbWVTdHJpbmciLCJmcmFtZUEiLCJmcmFtZUIiLCJmcmFtZUFFcXVhbFRvRnJhbWVCIiwiYWRkRXF1YWxpdHkiLCJlcXVhbGl0eSIsImVxdWFsaXR5U3RyaW5nIiwiZXF1YWxpdHlBIiwiZXF1YWxpdHlCIiwiZXF1YWxpdHlBRXF1YWxUb0VxdWFsaXR5QiIsImFkZEFzc2VydGlvbiIsImFzc2VydGlvbiIsImFzc2VydGlvblN0cmluZyIsImFzc2VydGlvbkEiLCJhc3NlcnRpb25CIiwiYXNzZXJ0aW9uQUVxdWFsVG9Bc3NlcnRpb25CIiwiYWRkU3RhdGVtZW50Iiwic3RhdGVtZW50Iiwic3RhdGVtZW50U3RyaW5nIiwic3RhdGVtZW50QSIsInN0YXRlbWVudEIiLCJzdGF0ZW1lbnRBRXF1YWxUb1N0YXRlbWVudEIiLCJhZGRQYXJhbWV0ZXIiLCJwYXJhbXRlciIsInBhcmFtdGVyU3RyaW5nIiwicGFyYW10ZXJBIiwicGFyYW10ZXJzIiwicGFyYW10ZXJCIiwicGFyYW10ZXJBRXF1YWxUb1BhcmFtZXRlckIiLCJhZGRBc3N1bXB0aW9uIiwiYXNzdW1wdGlvbiIsImFzc3VtcHRpb25TdHJpbmciLCJhc3N1bXB0aW9uQSIsImFzc3VtcHRpb25CIiwiYXNzdW1wdGlvbkFFcXVhbFRvQXNzdW1wdGlvbkIiLCJhZGRNZXRhdmFyaWFibGUiLCJtZXRhdmFyaWFibGUiLCJtZXRhdmFyaWFibGVTdHJpbmciLCJtZXRhdmFyaWFibGVBIiwibWV0YXZhcmlhYmxlQiIsIm1ldGF2YXJpYWJsZUFFcXVhbFRvTWV0YXZhcmlhYmxlQiIsImFkZFN1YnN0aXR1dGlvbiIsInN1YnN0aXR1dGlvbiIsImFkZFByb2NlZHVyZVJlZmVyZW5jZSIsInByb2NlZHVyZVJlZmVyZW5jZSIsInByb2NlZHVyZVJlZmVyZW5jZVN0cmluZyIsInByb2NlZHVyZVJlZmVyZW5jZUEiLCJwcm9jZWR1cmVSZWZlcmVuY2VCIiwicHJvY2VkdXJlUmVmZXJlbmNlQUVxdWFsVG9Qcm9jZWR1cmVhbGxCIiwiYWRkQXNzaWdubWVudCIsImFzc2lnbm1lbnQiLCJhZGRUZXJtcyIsImZvckVhY2giLCJhZGRMaW5rcyIsImFkZEZyYW1lcyIsImFkZEVxdWFsaXRpZXMiLCJhZGRBc3NlcnRpb25zIiwiYWRkU3RhdGVtZW50cyIsImFkZFBhcmFtZXRlcnMiLCJwYXJhbWV0ZXIiLCJhZGRBc3N1bXB0aW9ucyIsImFkZE1ldGF2YXJpYWJsZXMiLCJhZGRQcm9jZWR1cmVSZWZlcmVuY2VzIiwiZmluZFRlcm1CeVRlcm1Ob2RlIiwidGVybU5vZGUiLCJmaW5kIiwidGVybU5vZGVNYXRjaGVzIiwibWF0Y2hUZXJtTm9kZSIsImZpbmRMaW5rQnlMaW5rTm9kZSIsImxpbmtOb2RlIiwibGlua05vZGVNYXRjaGVzIiwibWF0Y2hMaW5rTm9kZSIsImZpbmRGcmFtZUJ5RnJhbWVOb2RlIiwiZnJhbWVOb2RlIiwiZnJhbWVOb2RlTWF0Y2hlcyIsIm1hdGNoRnJhbWVOb2RlIiwiZmluZEVxdWFsaXR5QnlFcXVhbGl0eU5vZGUiLCJlcXVhbGl0eU5vZGUiLCJlcXVhbGl0eU5vZGVNYXRjaGVzIiwibWF0Y2hFcXVhbGl0eU5vZGUiLCJmaW5kQXNzZXJ0aW9uQnlBc3NlcnRpb25Ob2RlIiwiYXNzZXJ0aW9uTm9kZSIsImFzc2VydGlvbk5vZGVNYXRjaGVzIiwibWF0Y2hBc3NlcnRpb25Ob2RlIiwiZmluZFN0YXRlbWVudEJ5U3RhdGVtZW50Tm9kZSIsInN0YXRlbWVudE5vZGUiLCJzdGF0ZW1lbnROb2RlTWF0Y2hlcyIsIm1hdGNoU3RhdGVtZW50Tm9kZSIsImZpbmRQYXJhbWV0ZXJCeVBhcmFtZXRlck5vZGUiLCJwYXJhbWV0ZXJOb2RlIiwicGFyYW1ldGVyTm9kZU1hdGNoZXMiLCJtYXRjaFBhcmFtZXRlck5vZGUiLCJmaW5kQXNzdW1wdGlvbkJ5QXNzdW1wdGlvbk5vZGUiLCJhc3N1bXB0aW9uTm9kZSIsImFzc3VtcHRpb25Ob2RlTWF0Y2hlcyIsIm1hdGNoQXNzdW1wdGlvbk5vZGUiLCJmaW5kTWV0YXZhcmlhYmxlQnlNZXRhdmFyaWFibGVOb2RlIiwibWV0YXZhcmlhYmxlTm9kZSIsIm1ldGF2YXJpYWJsZU5vZGVNYXRjaGVzIiwibWF0Y2hNZXRhdmFyaWFibGVOb2RlIiwiZmluZFByb2NlZHVyZVJlZmVyZW5jZUJ5UHJvY2VkdXJlUmVmZXJlbmNlTm9kZSIsInByb2NlZHVyZVJlZmVyZW5jZU5vZGUiLCJwcm9jZWR1cmVSZWZlcmVuY2VOb2RlTWF0Y2hlcyIsIm1hdGNoUHJvY2VkdXJlUmVmZXJlbmNlTm9kZSIsImlzVGVybVByZXNlbnRCeVRlcm1Ob2RlIiwidGVybVByZXNlbnQiLCJpc0xpbmtQcmVzZW50QnlMaW5rTm9kZSIsImxpbmtQcmVzZW50IiwiaXNGcmFtZVByZXNlbnRCeUZyYW1lTm9kZSIsImZyYW1lUHJlc2VudCIsImlzRXF1YWxpdHlQcmVzZW50QnlFcXVhbGl0eU5vZGUiLCJlcXVhbGl0eVByZXNlbnQiLCJpc0Fzc2VydGlvblByZXNlbnRCeUFzc2VydGlvbk5vZGUiLCJhc3NlcnRpb25QcmVzZW50IiwiaXNTdGF0ZW1lbnRQcmVzZW50QnlTdGF0ZW1lbnROb2RlIiwic3RhdGVtZW50UHJlc2VudCIsImlzUGFyYW1ldGVyUHJlc2VudEJ5UGFyYW1ldGVyTm9kZSIsInBhcmFtZXRlclByZXNlbnQiLCJpc0Fzc3VtcHRpb25QcmVzZW50QnlBc3N1bXB0aW9uTm9kZSIsImFzc3VtcHRpb25QcmVzZW50IiwiaXNNZXRhdmFyaWFibGVQcmVzZW50QnlNZXRhdmFyaWFibGVOb2RlIiwibWV0YXZhcmlhYmxlbiIsIm1ldGF2YXJpYWJsZW5QcmVzZW50IiwiaXNQcm9jZWR1cmVSZWZlcmVuY2VQcmVzZW50QnlQcm9jZWR1cmVSZWZlcmVuY2VOb2RlIiwicHJvY2VkdXJlUmVmZXJlbmNlUHJlc2VudCIsIm1lcmdlIiwiZnJvbU5vdGhpbmciLCJjbGFkaWNDb250ZXh0Il0sIm1hcHBpbmdzIjoiQUFBQTs7OzsrQkFRQTs7O2VBQXFCQTs7OzJCQU5VO2dFQUVYOzs7Ozs7QUFFcEIsTUFBTSxFQUFFQyxJQUFJLEVBQUVDLE9BQU8sRUFBRSxHQUFHQyx5QkFBYztBQUV6QixNQUFNSCxzQkFBc0JJLGdCQUFPO0lBQ2hELFlBQVlDLE9BQU8sRUFBRUMsS0FBSyxFQUFFQyxLQUFLLEVBQUVDLE1BQU0sRUFBRUMsVUFBVSxFQUFFQyxVQUFVLEVBQUVDLFVBQVUs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
|