occam-nominal 1.0.367 → 1.0.372

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.
Files changed (63) hide show
  1. package/lib/element/assertion/contained.js +114 -106
  2. package/lib/element/assertion/defined.js +91 -94
  3. package/lib/element/assertion/type.js +13 -8
  4. package/lib/element/assumption/implicit.js +7 -7
  5. package/lib/element/assumption.js +6 -7
  6. package/lib/element/claim.js +5 -5
  7. package/lib/element/combinator.js +36 -24
  8. package/lib/element/constraint.js +6 -7
  9. package/lib/element/constructor.js +5 -5
  10. package/lib/element/declaration/combinator.js +9 -8
  11. package/lib/element/declaration/metavariable.js +18 -18
  12. package/lib/element/declaration/variable.js +4 -4
  13. package/lib/element/equality.js +62 -70
  14. package/lib/element/fact/premise.js +1 -1
  15. package/lib/element/frame.js +86 -107
  16. package/lib/element/goal.js +108 -114
  17. package/lib/element/judgement.js +51 -57
  18. package/lib/element/metavariable.js +32 -29
  19. package/lib/element/property.js +3 -3
  20. package/lib/element/rule.js +30 -27
  21. package/lib/element/signature.js +15 -17
  22. package/lib/element/substitution/frame.js +52 -52
  23. package/lib/element/substitution/reference.js +55 -50
  24. package/lib/element/substitution/term.js +52 -52
  25. package/lib/element/variable.js +16 -16
  26. package/lib/pass/continuation.js +30 -17
  27. package/lib/pass/continuationZip.js +36 -25
  28. package/lib/pass/zip.js +7 -5
  29. package/lib/process/equate.js +7 -7
  30. package/lib/process/validation.js +12 -18
  31. package/lib/utilities/continuation.js +1 -16
  32. package/package.json +9 -9
  33. package/src/element/assertion/contained.js +126 -124
  34. package/src/element/assertion/defined.js +100 -112
  35. package/src/element/assertion/type.js +15 -7
  36. package/src/element/assumption/implicit.js +6 -7
  37. package/src/element/assumption.js +5 -8
  38. package/src/element/claim.js +4 -4
  39. package/src/element/combinator.js +46 -25
  40. package/src/element/constraint.js +5 -8
  41. package/src/element/constructor.js +4 -4
  42. package/src/element/declaration/combinator.js +10 -9
  43. package/src/element/declaration/metavariable.js +20 -21
  44. package/src/element/declaration/variable.js +4 -4
  45. package/src/element/equality.js +74 -87
  46. package/src/element/fact/premise.js +1 -1
  47. package/src/element/frame.js +100 -131
  48. package/src/element/goal.js +127 -134
  49. package/src/element/judgement.js +60 -67
  50. package/src/element/metavariable.js +38 -30
  51. package/src/element/property.js +2 -2
  52. package/src/element/rule.js +39 -32
  53. package/src/element/signature.js +14 -19
  54. package/src/element/substitution/frame.js +64 -61
  55. package/src/element/substitution/reference.js +67 -55
  56. package/src/element/substitution/term.js +64 -61
  57. package/src/element/variable.js +19 -17
  58. package/src/pass/continuation.js +45 -22
  59. package/src/pass/continuationZip.js +51 -33
  60. package/src/pass/zip.js +7 -4
  61. package/src/process/equate.js +10 -10
  62. package/src/process/validation.js +11 -21
  63. package/src/utilities/continuation.js +0 -23
@@ -8,12 +8,11 @@ Object.defineProperty(exports, "default", {
8
8
  return _default;
9
9
  }
10
10
  });
11
- const _necessary = require("necessary");
12
11
  const _occamlanguages = require("occam-languages");
13
12
  const _elements = /*#__PURE__*/ _interop_require_wildcard(require("../elements"));
14
13
  const _instantiate = require("../process/instantiate");
15
- const _context = require("../utilities/context");
16
14
  const _continuation = require("../utilities/continuation");
15
+ const _context = require("../utilities/context");
17
16
  function _getRequireWildcardCache(nodeInterop) {
18
17
  if (typeof WeakMap !== "function") return null;
19
18
  var cacheBabelInterop = new WeakMap();
@@ -55,7 +54,7 @@ function _interop_require_wildcard(obj, nodeInterop) {
55
54
  }
56
55
  return newObj;
57
56
  }
58
- const { clone } = _necessary.arrayUtilities, { breakPointFromJSON, breakPointToBreakPointJSON } = _occamlanguages.breakPointUtilities;
57
+ const { breakPointFromJSON, breakPointToBreakPointJSON } = _occamlanguages.breakPointUtilities;
59
58
  const _default = (0, _elements.define)(class Goal extends _occamlanguages.Element {
60
59
  constructor(context, string, node, breakPoint, reference, statement){
61
60
  super(context, string, node, breakPoint);
@@ -94,117 +93,110 @@ const _default = (0, _elements.define)(class Goal extends _occamlanguages.Elemen
94
93
  }
95
94
  return subproofAssertion;
96
95
  }
97
- findValidGoal(context) {
98
- const goalNode = this.getGoalNode(), goal = context.findGoalByGoalNode(goalNode), validGoal = goal; ///
99
- return validGoal;
96
+ findGoal(context) {
97
+ const goalNode = this.getGoalNode(), goal = context.findGoalByGoalNode(goalNode);
98
+ return goal;
100
99
  }
101
100
  validate(context, continuation) {
102
- const goalString = this.getString(); ///
103
- context.trace(`Validating the '${goalString}' goal...`);
104
- const validGoal = this.findValidGoal(context);
105
- if (validGoal !== null) {
106
- const goal = validGoal; ///
107
- context.debug(`...the '${goalString}' goal is already present.`);
108
- return continuation(goal);
109
- }
110
- const validateStatement = this.validateStatement.bind(this), validateReference = this.validateReference.bind(this);
111
- return (0, _continuation.all)([
112
- validateReference,
113
- validateStatement
114
- ], context, (validates)=>{
115
- if (!validates) {
116
- const goal = null;
117
- return continuation(goal);
118
- }
119
- const validatesWhenStated = this.validateWhenStated.bind(this), validatesWhenDerived = this.validateWhenDerived.bind(this);
120
- return (0, _continuation.exists)([
121
- validatesWhenStated,
122
- validatesWhenDerived
123
- ], context, (validates)=>{
124
- let goal = null;
125
- if (validates) {
126
- goal = this; ///
101
+ let validates;
102
+ const goalnString = this.getString(); ///
103
+ context.trace(`Validating the '${goalnString}' goal...`);
104
+ let goaln;
105
+ const goal = this.findGoal(context);
106
+ if (goal !== null) {
107
+ context.debug(`The '${goalnString}' goal is already present.`);
108
+ validates = continuation(goaln, context);
109
+ } else {
110
+ goaln = this;
111
+ const validateStatement = this.validateStatement.bind(this), validateReference = this.validateReference.bind(this);
112
+ validates = (0, _continuation.all)([
113
+ validateStatement,
114
+ validateReference
115
+ ], context, (context)=>{
116
+ let validates;
117
+ const validateWhenStated = this.validateWhenStated.bind(this), validateWhenDerived = this.validateWhenDerived.bind(this);
118
+ validates = (0, _continuation.exists)([
119
+ validateWhenStated,
120
+ validateWhenDerived
121
+ ], context, (context)=>{
122
+ const goal = goaln; ///
127
123
  context.addGoal(goal);
128
- }
129
- if (validates) {
130
- context.debug(`...validated the '${goalString}' goal.`);
131
- }
132
- return continuation(goal);
124
+ return continuation(goaln, context);
125
+ });
126
+ return validates;
133
127
  });
134
- });
128
+ }
129
+ if (validates) {
130
+ context.debug(`...validated the '${goalnString}' goal.`);
131
+ }
132
+ return validates;
135
133
  }
136
134
  validateReference(context, continuation) {
135
+ let referenceValidates;
137
136
  const goalString = this.getString(); ///
138
137
  context.trace(`Validating the '${goalString}' goal's reference...`);
139
- return this.reference.validate(context, (reference)=>{
140
- let referenceValidates = false;
141
- if (reference !== null) {
142
- this.reference = reference;
143
- referenceValidates = true;
144
- }
145
- if (referenceValidates) {
146
- context.debug(`...validated the '${goalString}' goal's reference.`);
147
- }
148
- return continuation(referenceValidates);
138
+ referenceValidates = this.reference.validate(context, (reference, context)=>{
139
+ this.reference = reference;
140
+ return continuation(context);
149
141
  });
142
+ if (referenceValidates) {
143
+ context.debug(`...validates the'${goalString}' goal's reference.`);
144
+ }
145
+ return referenceValidates;
150
146
  }
151
147
  validateStatement(context, continuation) {
148
+ let statementValidates;
152
149
  const goalString = this.getString(); ///
153
150
  context.trace(`Validating the '${goalString}' goal's statement...`);
154
- return this.statement.validate(context, (statement)=>{
155
- let statementValidates = false;
156
- if (statement !== null) {
157
- statementValidates = true;
158
- }
159
- if (statementValidates) {
160
- context.debug(`...validated the '${goalString}' goal's statement.`);
161
- }
162
- return continuation(statementValidates);
151
+ statementValidates = this.statement.validate(context, (statement, context)=>{
152
+ this.statement = statement;
153
+ return continuation(context);
163
154
  });
155
+ if (statementValidates) {
156
+ context.debug(`...validates the'${goalString}' goal's statement.`);
157
+ }
158
+ return statementValidates;
164
159
  }
165
160
  validateWhenStated(context, continuation) {
161
+ let validatesWhenStated = false;
166
162
  const stated = context.isStated();
167
- if (!stated) {
168
- const validatesWhenStated = false;
169
- return continuation(validatesWhenStated);
170
- }
171
- let validatesWhenStated;
172
- const goalString = this.getString(); ///
173
- context.trace(`Validating the '${goalString}' stated goal...`);
174
- validatesWhenStated = true;
175
- if (validatesWhenStated) {
176
- context.debug(`...validated the '${goalString}' stated goal.`);
163
+ if (stated) {
164
+ const goalString = this.getString(); ///
165
+ context.trace(`Validating the '${goalString}' stated goal...`);
166
+ validatesWhenStated = continuation(context);
167
+ if (validatesWhenStated) {
168
+ context.debug(`...validated the '${goalString}' stated goal.`);
169
+ }
177
170
  }
178
- return continuation(validatesWhenStated);
171
+ return validatesWhenStated;
179
172
  }
180
173
  validateWhenDerived(context, continuation) {
174
+ let validatesWhenDerived = false;
181
175
  const stated = context.isStated();
182
- if (stated) {
183
- const validatesWhenDerived = false;
184
- return continuation(validatesWhenDerived);
176
+ if (!stated) {
177
+ const goalString = this.getString(); ///
178
+ context.trace(`Validating the '${goalString}' derived goal...`);
179
+ const schemas = context.getSchemas();
180
+ validatesWhenDerived = (0, _continuation.some)(schemas, (schema, context)=>{
181
+ let passed;
182
+ const label = schema.getLabel();
183
+ this.unifyLabel(label, context, (labelUnifies)=>{
184
+ if (labelUnifies) {
185
+ this.unifySchema(schema, context, (schemaUnifies)=>{
186
+ passed = schemaUnifies; ///
187
+ });
188
+ }
189
+ });
190
+ return passed;
191
+ }, context, (context)=>true);
192
+ if (validatesWhenDerived) {
193
+ validatesWhenDerived = continuation(context);
194
+ }
195
+ if (validatesWhenDerived) {
196
+ context.debug(`...validated the '${goalString}' derived goal.`);
197
+ }
185
198
  }
186
- let validatesWhenDerived = false;
187
- const goalString = this.getString(); ///
188
- context.trace(`Validating the '${goalString}' derived goal...`);
189
- let schemas;
190
- schemas = context.getSchemas();
191
- schemas = clone(schemas); ///
192
- return (0, _continuation.filter)(schemas, (schema, continuation)=>{
193
- const label = schema.getLabel();
194
- return this.unifyLabel(label, context, continuation);
195
- }, ()=>{
196
- return (0, _continuation.each)(schemas, (schema, continuation)=>{
197
- return this.unifySchema(schema, context, continuation);
198
- }, (schemasUnifiy)=>{
199
- if (schemasUnifiy) {
200
- validatesWhenDerived = true;
201
- }
202
- if (validatesWhenDerived) {
203
- context.debug(`...validated the '${goalString}' derived goal.`);
204
- }
205
- return continuation(validatesWhenDerived);
206
- });
207
- });
199
+ return validatesWhenDerived;
208
200
  }
209
201
  unifyLabel(label, context, continuation) {
210
202
  const goalString = this.getString(), labelString = label.getString();
@@ -225,36 +217,38 @@ const _default = (0, _elements.define)(class Goal extends _occamlanguages.Elemen
225
217
  return (0, _context.reconcile)((context)=>{
226
218
  const label = schema.getLabel();
227
219
  return this.reference.unifyLabel(label, context, (labelUnifies)=>{
228
- if (labelUnifies) {
229
- const specificContext = context, schemaConditional = schema.isConditional(), subproofAssertion = subproofAssertionFromStatement(this.statement, context);
230
- if (schemaConditional) {
231
- if (subproofAssertion === null) {
232
- const schemaUnifies = false;
233
- return continuation(schemaUnifies);
234
- }
235
- return subproofAssertion.unifySchema(schema, generalContext, specificContext, (schemaUnifies)=>{
236
- if (schemaUnifies) {
237
- context.debug(`...unified the '${schemaString}' schema with the '${goalString}' goal.`);
238
- }
239
- return continuation(schemaUnifies);
240
- });
241
- }
242
- if (subproofAssertion !== null) {
220
+ if (!labelUnifies) {
221
+ const schemaUnifies = false;
222
+ return continuation(schemaUnifies);
223
+ }
224
+ const specificContext = context, schemaConditional = schema.isConditional(), subproofAssertion = subproofAssertionFromStatement(this.statement, context);
225
+ if (schemaConditional) {
226
+ if (subproofAssertion === null) {
243
227
  const schemaUnifies = false;
244
228
  return continuation(schemaUnifies);
245
229
  }
246
- const deduction = schema.getDeduction();
247
- this.unifyDeduction(deduction, generalContext, specificContext, (deductionUnifies)=>{
248
- let schemaUnifies = false;
249
- if (deductionUnifies) {
250
- schemaUnifies = true;
251
- }
230
+ return subproofAssertion.unifySchema(schema, generalContext, specificContext, (schemaUnifies)=>{
252
231
  if (schemaUnifies) {
253
232
  context.debug(`...unified the '${schemaString}' schema with the '${goalString}' goal.`);
254
233
  }
255
234
  return continuation(schemaUnifies);
256
235
  });
257
236
  }
237
+ if (subproofAssertion !== null) {
238
+ const schemaUnifies = false;
239
+ return continuation(schemaUnifies);
240
+ }
241
+ const deduction = schema.getDeduction();
242
+ this.unifyDeduction(deduction, generalContext, specificContext, (deductionUnifies)=>{
243
+ let schemaUnifies = false;
244
+ if (deductionUnifies) {
245
+ schemaUnifies = true;
246
+ }
247
+ if (schemaUnifies) {
248
+ context.debug(`...unified the '${schemaString}' schema with the '${goalString}' goal.`);
249
+ }
250
+ return continuation(schemaUnifies);
251
+ });
258
252
  });
259
253
  }, context);
260
254
  }
@@ -315,4 +309,4 @@ function subproofAssertionFromStatement(statement, context) {
315
309
  return subproofAssertion;
316
310
  }
317
311
 
318
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbGVtZW50L2dvYWwuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7IGFycmF5VXRpbGl0aWVzIH0gZnJvbSBcIm5lY2Vzc2FyeVwiO1xuaW1wb3J0IHsgRWxlbWVudCwgYnJlYWtQb2ludFV0aWxpdGllcyB9IGZyb20gXCJvY2NhbS1sYW5ndWFnZXNcIjtcblxuaW1wb3J0IGVsZW1lbnRzIGZyb20gXCIuLi9lbGVtZW50c1wiO1xuXG5pbXBvcnQgeyBkZWZpbmUgfSBmcm9tIFwiLi4vZWxlbWVudHNcIjtcbmltcG9ydCB7IGluc3RhbnRpYXRlR29hbCB9IGZyb20gXCIuLi9wcm9jZXNzL2luc3RhbnRpYXRlXCI7XG5pbXBvcnQgeyByZWNvbmNpbGUsIGluc3RhbnRpYXRlIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9jb250ZXh0XCI7XG5pbXBvcnQgeyBhbGwsIGVhY2gsIGV4aXN0cywgZmlsdGVyIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9jb250aW51YXRpb25cIjtcblxuY29uc3QgeyBjbG9uZSB9ID0gYXJyYXlVdGlsaXRpZXMsXG4gICAgICB7IGJyZWFrUG9pbnRGcm9tSlNPTiwgYnJlYWtQb2ludFRvQnJlYWtQb2ludEpTT04gfSA9IGJyZWFrUG9pbnRVdGlsaXRpZXM7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZShjbGFzcyBHb2FsIGV4dGVuZHMgRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKGNvbnRleHQsIHN0cmluZywgbm9kZSwgYnJlYWtQb2ludCwgcmVmZXJlbmNlLCBzdGF0ZW1lbnQpIHtcbiAgICBzdXBlcihjb250ZXh0LCBzdHJpbmcsIG5vZGUsIGJyZWFrUG9pbnQpO1xuXG4gICAgdGhpcy5yZWZlcmVuY2UgPSByZWZlcmVuY2U7XG4gICAgdGhpcy5zdGF0ZW1lbnQgPSBzdGF0ZW1lbnQ7XG4gIH1cblxuICBnZXRSZWZlcmVuY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVmZXJlbmNlO1xuICB9XG5cbiAgZ2V0U3RhdGVtZW50KCkge1xuICAgIHJldHVybiB0aGlzLnN0YXRlbWVudDtcbiAgfVxuXG4gIGdldEdvYWxOb2RlKCkge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldE5vZGUoKSxcbiAgICAgICAgICBnb2FsTm9kZSA9IG5vZGU7ICAvLy9cblxuICAgIHJldHVybiBnb2FsTm9kZTtcbiAgfVxuXG4gIGdldFN0YXRlbWVudE5vZGUoKSB7IHJldHVybiB0aGlzLnN0YXRlbWVudC5nZXRTdGF0ZW1lbnROb2RlKCk7IH1cblxuICBnZXRNZXRhdmFyaWFibGUoKSB7IHJldHVybiB0aGlzLnJlZmVyZW5jZS5nZXRNZXRhdmFyaWFibGUoKTsgfVxuXG4gIGlzRXF1YWxUbyhnb2FsKSB7XG4gICAgY29uc3QgZ29hbE5vZGUgPSBnb2FsLmdldE5vZGUoKSxcbiAgICAgICAgICBnb2FsTm9kZU1hdGNoZXMgPSB0aGlzLm1hdGNoR29hbE5vZGUoZ29hbE5vZGUpLFxuICAgICAgICAgIGVxdWFsVG8gPSBnb2FsTm9kZU1hdGNoZXM7ICAvLy9cblxuICAgIHJldHVybiBlcXVhbFRvO1xuICB9XG5cbiAgbWF0Y2hHb2FsTm9kZShnb2FsTm9kZSkge1xuICAgIGNvbnN0IG5vZGUgPSBnb2FsTm9kZSwgLy8vXG4gICAgICAgICAgbm9kZU1hdGNoZXMgPSB0aGlzLm1hdGNoTm9kZShub2RlKSxcbiAgICAgICAgICBnb2FsTm9kZU1hdGNoZXMgPSBub2RlTWF0Y2hlczsgLy8vXG5cbiAgICByZXR1cm4gZ29hbE5vZGVNYXRjaGVzO1xuICB9XG5cbiAgZmluZFN1YnByb29mQXNzZXJ0aW9uKGNvbnRleHQpIHtcbiAgICBsZXQgc3VicHJvb2ZBc3NlcnRpb24gPSBudWxsO1xuXG4gICAgY29uc3Qgc3RhdGVtZW50Tm9kZSA9IHRoaXMuZ2V0U3RhdGVtZW50Tm9kZSgpLFxuICAgICAgICAgIHN1YnByb29mQXNzZXJ0aW9uTm9kZSA9IHN0YXRlbWVudE5vZGUuZ2V0U3VicHJvb2ZBc3NlcnRpb25Ob2RlKCk7XG5cbiAgICBpZiAoc3VicHJvb2ZBc3NlcnRpb25Ob2RlICE9PSBudWxsKSB7XG4gICAgICBzdWJwcm9vZkFzc2VydGlvbiA9IGNvbnRleHQuZmluZEFzc2VydGlvbkJ5QXNzZXJ0aW9uTm9kZShzdWJwcm9vZkFzc2VydGlvbk5vZGUpO1xuICAgIH1cblxuICAgIHJldHVybiBzdWJwcm9vZkFzc2VydGlvbjtcbiAgfVxuXG4gIGZpbmRWYWxpZEdvYWwoY29udGV4dCkge1xuICAgIGNvbnN0IGdvYWxOb2RlID0gdGhpcy5nZXRHb2FsTm9kZSgpLFxuICAgICAgICAgIGdvYWwgPSBjb250ZXh0LmZpbmRHb2FsQnlHb2FsTm9kZShnb2FsTm9kZSksXG4gICAgICAgICAgdmFsaWRHb2FsID0gZ29hbDsgIC8vL1xuXG4gICAgcmV0dXJuIHZhbGlkR29hbDtcbiAgfVxuXG4gIHZhbGlkYXRlKGNvbnRleHQsIGNvbnRpbnVhdGlvbikge1xuICAgIGNvbnN0IGdvYWxTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtnb2FsU3RyaW5nfScgZ29hbC4uLmApO1xuXG4gICAgY29uc3QgdmFsaWRHb2FsID0gdGhpcy5maW5kVmFsaWRHb2FsKGNvbnRleHQpO1xuXG4gICAgaWYgKHZhbGlkR29hbCAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgZ29hbCA9IHZhbGlkR29hbDsgLy8vXG5cbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnRoZSAnJHtnb2FsU3RyaW5nfScgZ29hbCBpcyBhbHJlYWR5IHByZXNlbnQuYCk7XG5cbiAgICAgIHJldHVybiBjb250aW51YXRpb24oZ29hbCk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRhdGVTdGF0ZW1lbnQgPSB0aGlzLnZhbGlkYXRlU3RhdGVtZW50LmJpbmQodGhpcyksXG4gICAgICAgICAgdmFsaWRhdGVSZWZlcmVuY2UgPSB0aGlzLnZhbGlkYXRlUmVmZXJlbmNlLmJpbmQodGhpcyk7XG5cbiAgICByZXR1cm4gYWxsKFtcbiAgICAgIHZhbGlkYXRlUmVmZXJlbmNlLFxuICAgICAgdmFsaWRhdGVTdGF0ZW1lbnRcbiAgICBdLCBjb250ZXh0LCAodmFsaWRhdGVzKSA9PiB7XG4gICAgICBpZiAoIXZhbGlkYXRlcykge1xuICAgICAgICBjb25zdCBnb2FsID0gbnVsbDtcblxuICAgICAgICByZXR1cm4gY29udGludWF0aW9uKGdvYWwpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2YWxpZGF0ZXNXaGVuU3RhdGVkID0gdGhpcy52YWxpZGF0ZVdoZW5TdGF0ZWQuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHZhbGlkYXRlc1doZW5EZXJpdmVkID0gdGhpcy52YWxpZGF0ZVdoZW5EZXJpdmVkLmJpbmQodGhpcyk7XG5cbiAgICAgIHJldHVybiBleGlzdHMoW1xuICAgICAgICB2YWxpZGF0ZXNXaGVuU3RhdGVkLFxuICAgICAgICB2YWxpZGF0ZXNXaGVuRGVyaXZlZFxuICAgICAgXSwgY29udGV4dCwgKHZhbGlkYXRlcykgPT4ge1xuICAgICAgICBsZXQgZ29hbCA9IG51bGw7XG5cbiAgICAgICAgaWYgKHZhbGlkYXRlcykge1xuICAgICAgICAgIGdvYWwgPSB0aGlzOyAvLy9cblxuICAgICAgICAgIGNvbnRleHQuYWRkR29hbChnb2FsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWxpZGF0ZXMpIHtcbiAgICAgICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke2dvYWxTdHJpbmd9JyBnb2FsLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihnb2FsKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgdmFsaWRhdGVSZWZlcmVuY2UoY29udGV4dCwgY29udGludWF0aW9uKSB7XG4gICAgY29uc3QgZ29hbFN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7ICAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke2dvYWxTdHJpbmd9JyBnb2FsJ3MgcmVmZXJlbmNlLi4uYCk7XG5cbiAgICByZXR1cm4gdGhpcy5yZWZlcmVuY2UudmFsaWRhdGUoY29udGV4dCwgKHJlZmVyZW5jZSkgPT4ge1xuICAgICAgbGV0IHJlZmVyZW5jZVZhbGlkYXRlcyA9IGZhbHNlO1xuXG4gICAgICBpZiAocmVmZXJlbmNlICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMucmVmZXJlbmNlID0gcmVmZXJlbmNlO1xuXG4gICAgICAgIHJlZmVyZW5jZVZhbGlkYXRlcyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWZlcmVuY2VWYWxpZGF0ZXMpIHtcbiAgICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGVkIHRoZSAnJHtnb2FsU3RyaW5nfScgZ29hbCdzIHJlZmVyZW5jZS5gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihyZWZlcmVuY2VWYWxpZGF0ZXMpO1xuICAgIH0pO1xuICB9XG5cbiAgdmFsaWRhdGVTdGF0ZW1lbnQoY29udGV4dCwgY29udGludWF0aW9uKSB7XG4gICAgY29uc3QgZ29hbFN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7ICAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke2dvYWxTdHJpbmd9JyBnb2FsJ3Mgc3RhdGVtZW50Li4uYCk7XG5cbiAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQudmFsaWRhdGUoY29udGV4dCwgKHN0YXRlbWVudCkgPT4ge1xuICAgICAgbGV0IHN0YXRlbWVudFZhbGlkYXRlcyA9IGZhbHNlO1xuXG4gICAgICBpZiAoc3RhdGVtZW50ICE9PSBudWxsKSB7XG4gICAgICAgIHN0YXRlbWVudFZhbGlkYXRlcyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZW1lbnRWYWxpZGF0ZXMpIHtcbiAgICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGVkIHRoZSAnJHtnb2FsU3RyaW5nfScgZ29hbCdzIHN0YXRlbWVudC5gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihzdGF0ZW1lbnRWYWxpZGF0ZXMpO1xuICAgIH0pO1xuICB9XG5cbiAgdmFsaWRhdGVXaGVuU3RhdGVkKGNvbnRleHQsIGNvbnRpbnVhdGlvbikge1xuICAgIGNvbnN0IHN0YXRlZCA9IGNvbnRleHQuaXNTdGF0ZWQoKTtcblxuICAgIGlmICghc3RhdGVkKSB7XG4gICAgICBjb25zdCB2YWxpZGF0ZXNXaGVuU3RhdGVkID0gZmFsc2U7XG5cbiAgICAgIHJldHVybiBjb250aW51YXRpb24odmFsaWRhdGVzV2hlblN0YXRlZCk7XG4gICAgfVxuXG4gICAgbGV0IHZhbGlkYXRlc1doZW5TdGF0ZWQ7XG5cbiAgICBjb25zdCBnb2FsU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgIC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7Z29hbFN0cmluZ30nIHN0YXRlZCBnb2FsLi4uYCk7XG5cbiAgICB2YWxpZGF0ZXNXaGVuU3RhdGVkID0gdHJ1ZVxuXG4gICAgaWYgKHZhbGlkYXRlc1doZW5TdGF0ZWQpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7Z29hbFN0cmluZ30nIHN0YXRlZCBnb2FsLmApO1xuICAgIH1cblxuICAgIHJldHVybiBjb250aW51YXRpb24odmFsaWRhdGVzV2hlblN0YXRlZCk7XG4gIH1cblxuICB2YWxpZGF0ZVdoZW5EZXJpdmVkKGNvbnRleHQsIGNvbnRpbnVhdGlvbikge1xuICAgIGNvbnN0IHN0YXRlZCA9IGNvbnRleHQuaXNTdGF0ZWQoKTtcblxuICAgIGlmIChzdGF0ZWQpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRlc1doZW5EZXJpdmVkID0gZmFsc2U7XG5cbiAgICAgIHJldHVybiBjb250aW51YXRpb24odmFsaWRhdGVzV2hlbkRlcml2ZWQpO1xuICAgIH1cblxuICAgIGxldCB2YWxpZGF0ZXNXaGVuRGVyaXZlZCA9IGZhbHNlO1xuXG4gICAgY29uc3QgZ29hbFN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7ICAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke2dvYWxTdHJpbmd9JyBkZXJpdmVkIGdvYWwuLi5gKTtcblxuICAgIGxldCBzY2hlbWFzO1xuXG4gICAgc2NoZW1hcyA9IGNvbnRleHQuZ2V0U2NoZW1hcygpO1xuXG4gICAgc2NoZW1hcyA9IGNsb25lKHNjaGVtYXMpOyAvLy9cblxuICAgIHJldHVybiBmaWx0ZXIoc2NoZW1hcywgKHNjaGVtYSwgY29udGludWF0aW9uKSA9PiB7XG4gICAgICBjb25zdCBsYWJlbCA9IHNjaGVtYS5nZXRMYWJlbCgpO1xuXG4gICAgICByZXR1cm4gdGhpcy51bmlmeUxhYmVsKGxhYmVsLCBjb250ZXh0LCBjb250aW51YXRpb24pO1xuICAgIH0sICgpID0+IHtcbiAgICAgIHJldHVybiBlYWNoKHNjaGVtYXMsIChzY2hlbWEsIGNvbnRpbnVhdGlvbikgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy51bmlmeVNjaGVtYShzY2hlbWEsIGNvbnRleHQsIGNvbnRpbnVhdGlvbik7XG4gICAgICB9LCAoc2NoZW1hc1VuaWZpeSkgPT4ge1xuICAgICAgICBpZiAoc2NoZW1hc1VuaWZpeSkge1xuICAgICAgICAgIHZhbGlkYXRlc1doZW5EZXJpdmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWxpZGF0ZXNXaGVuRGVyaXZlZCkge1xuICAgICAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7Z29hbFN0cmluZ30nIGRlcml2ZWQgZ29hbC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb250aW51YXRpb24odmFsaWRhdGVzV2hlbkRlcml2ZWQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICB1bmlmeUxhYmVsKGxhYmVsLCBjb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBjb25zdCBnb2FsU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKSwgIC8vL1xuICAgICAgICAgIGxhYmVsU3RyaW5nID0gbGFiZWwuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBVbmlmeWluZyB0aGUgJyR7bGFiZWxTdHJpbmd9JyBsYWJlbCB3aXRoIHRoZSAnJHtnb2FsU3RyaW5nfScgZ29hbC4uLmApO1xuXG4gICAgcmV0dXJuIHJlY29uY2lsZSgoY29udGV4dCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMucmVmZXJlbmNlLnVuaWZ5TGFiZWwobGFiZWwsIGNvbnRleHQsIChsYWJlbFVuaWZpZXMpID0+IHtcbiAgICAgICAgaWYgKGxhYmVsVW5pZmllcykge1xuICAgICAgICAgIGNvbnRleHQuZGVidWcoYC4uLnVuaWZpZWQgdGhlICcke2xhYmVsU3RyaW5nfScgbGFiZWwgd2l0aCB0aGUgJyR7Z29hbFN0cmluZ30nIGdvYWwncyByZWZlcmVuY2UuYCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29udGludWF0aW9uKGxhYmVsVW5pZmllcyk7XG4gICAgICB9KTtcbiAgICB9LCBjb250ZXh0KTtcbiAgfVxuXG4gIHVuaWZ5U2NoZW1hKHNjaGVtYSwgY29udGV4dCwgY29udGludWF0aW9uKSB7XG4gICAgY29uc3QgZ29hbFN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCksXG4gICAgICAgICAgc2NoZW1hU3RyaW5nID0gc2NoZW1hLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgVW5pZnlpbmcgdGhlICcke3NjaGVtYVN0cmluZ30nIHNjaGVtYSB3aXRoIHRoZSAnJHtnb2FsU3RyaW5nfScgZ29hbC4uLmApO1xuXG4gICAgY29uc3QgZ2VuZXJhbENvbnRleHQgPSBjb250ZXh0OyAgLy8vXG5cbiAgICByZXR1cm4gcmVjb25jaWxlKChjb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBsYWJlbCA9IHNjaGVtYS5nZXRMYWJlbCgpO1xuXG4gICAgICByZXR1cm4gdGhpcy5yZWZlcmVuY2UudW5pZnlMYWJlbChsYWJlbCwgY29udGV4dCwgKGxhYmVsVW5pZmllcykgPT4ge1xuICAgICAgICBpZiAobGFiZWxVbmlmaWVzKSB7XG4gICAgICAgICAgY29uc3Qgc3BlY2lmaWNDb250ZXh0ID0gY29udGV4dCwgIC8vL1xuICAgICAgICAgICAgICAgIHNjaGVtYUNvbmRpdGlvbmFsID0gc2NoZW1hLmlzQ29uZGl0aW9uYWwoKSxcbiAgICAgICAgICAgICAgICBzdWJwcm9vZkFzc2VydGlvbiA9IHN1YnByb29mQXNzZXJ0aW9uRnJvbVN0YXRlbWVudCh0aGlzLnN0YXRlbWVudCwgY29udGV4dCk7XG5cbiAgICAgICAgICBpZiAoc2NoZW1hQ29uZGl0aW9uYWwpIHtcbiAgICAgICAgICAgIGlmIChzdWJwcm9vZkFzc2VydGlvbiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBjb25zdCBzY2hlbWFVbmlmaWVzID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihzY2hlbWFVbmlmaWVzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHN1YnByb29mQXNzZXJ0aW9uLnVuaWZ5U2NoZW1hKHNjaGVtYSwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCwgKHNjaGVtYVVuaWZpZXMpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHNjaGVtYVVuaWZpZXMpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmRlYnVnKGAuLi51bmlmaWVkIHRoZSAnJHtzY2hlbWFTdHJpbmd9JyBzY2hlbWEgd2l0aCB0aGUgJyR7Z29hbFN0cmluZ30nIGdvYWwuYCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gY29udGludWF0aW9uKHNjaGVtYVVuaWZpZXMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHN1YnByb29mQXNzZXJ0aW9uICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBzY2hlbWFVbmlmaWVzID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHJldHVybiBjb250aW51YXRpb24oc2NoZW1hVW5pZmllcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZGVkdWN0aW9uID0gc2NoZW1hLmdldERlZHVjdGlvbigpO1xuXG4gICAgICAgICAgdGhpcy51bmlmeURlZHVjdGlvbihkZWR1Y3Rpb24sIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQsIChkZWR1Y3Rpb25VbmlmaWVzKSA9PiB7XG4gICAgICAgICAgICBsZXQgc2NoZW1hVW5pZmllcyA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAoZGVkdWN0aW9uVW5pZmllcykge1xuICAgICAgICAgICAgICBzY2hlbWFVbmlmaWVzID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNjaGVtYVVuaWZpZXMpIHtcbiAgICAgICAgICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udW5pZmllZCB0aGUgJyR7c2NoZW1hU3RyaW5nfScgc2NoZW1hIHdpdGggdGhlICcke2dvYWxTdHJpbmd9JyBnb2FsLmApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gY29udGludWF0aW9uKHNjaGVtYVVuaWZpZXMpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LCBjb250ZXh0KTtcbiAgfVxuXG4gIHVuaWZ5RGVkdWN0aW9uKGRlZHVjdGlvbiwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCwgY29udGludWF0aW9uKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHNwZWNpZmljQ29udGV4dCwgIC8vL1xuICAgICAgICAgIGdvYWxTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpLCAgLy8vXG4gICAgICAgICAgZGVkdWN0aW9uU3RyaW5nID0gZGVkdWN0aW9uLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgVW5pZnlpbmcgdGhlICcke2RlZHVjdGlvblN0cmluZ30nIGRlZHVjdGlvbidzIHN0YXRlbWVudCAgd2l0aCB0aGUgJyR7Z29hbFN0cmluZ30nIGdvYWwncyAnJHtnb2FsU3RyaW5nfScgc3RhdGVtZW50Li4uYCk7XG5cbiAgICBjb25zdCBzdGF0ZW1lbnQgPSBkZWR1Y3Rpb24uZ2V0U3RhdGVtZW50KCksXG4gICAgICAgICAgZGVkdWN0aW9uQ29udGV4dCA9IGRlZHVjdGlvbi5nZXRDb250ZXh0KCk7IC8vL1xuXG4gICAgc3BlY2lmaWNDb250ZXh0ID0gZGVkdWN0aW9uQ29udGV4dDsgLy8vXG5cbiAgICByZXR1cm4gcmVjb25jaWxlKChzcGVjaWZpY0NvbnRleHQpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnN0YXRlbWVudC51bmlmeVN0YXRlbWVudChzdGF0ZW1lbnQsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQsIChzdGF0ZW1lbnRVbmlmaWVzKSA9PiB7XG4gICAgICAgIGxldCBkZWR1Y3Rpb25VbmlmaWVzID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHN0YXRlbWVudFVuaWZpZXMpIHtcbiAgICAgICAgICBkZWR1Y3Rpb25VbmlmaWVzID0gdHJ1ZTtcblxuICAgICAgICAgIHNwZWNpZmljQ29udGV4dC5jb21taXQoY29udGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVkdWN0aW9uVW5pZmllcykge1xuICAgICAgICAgIGNvbnRleHQuZGVidWcoYC4uLnVuaWZpZWQgdGhlICcke2RlZHVjdGlvblN0cmluZ30nIGRlZHVjdGlvbidzIHN0YXRlbWVudCB3aXRoIHRoZSAnJHtnb2FsU3RyaW5nfScgZ29hbCdzICcke2dvYWxTdHJpbmd9JyBzdGF0ZW1lbnQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29udGludWF0aW9uKGRlZHVjdGlvblVuaWZpZXMpO1xuICAgICAgfSk7XG4gICAgfSwgc3BlY2lmaWNDb250ZXh0KTtcbiAgfVxuXG4gIHRvSlNPTigpIHtcbiAgICBjb25zdCBzdHJpbmcgPSB0aGlzLmdldFN0cmluZygpO1xuXG4gICAgbGV0IGJyZWFrUG9pbnQ7XG5cbiAgICBicmVha1BvaW50ID0gdGhpcy5nZXRCcmVha1BvaW50KCk7XG5cbiAgICBjb25zdCBicmVha1BvaW50SlNPTiA9IGJyZWFrUG9pbnRUb0JyZWFrUG9pbnRKU09OKGJyZWFrUG9pbnQpO1xuXG4gICAgYnJlYWtQb2ludCA9IGJyZWFrUG9pbnRKU09OOyAgLy8vXG5cbiAgICBjb25zdCBqc29uID0ge1xuICAgICAgc3RyaW5nLFxuICAgICAgYnJlYWtQb2ludFxuICAgIH07XG5cbiAgICByZXR1cm4ganNvbjtcbiAgfVxuXG4gIHN0YXRpYyBuYW1lID0gXCJHb2FsXCI7XG5cbiAgc3RhdGljIGZyb21KU09OKGpzb24sIGNvbnRleHQpIHtcbiAgICByZXR1cm4gaW5zdGFudGlhdGUoKGNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IHsgc3RyaW5nIH0gPSBqc29uLFxuICAgICAgICAgICAgZ29hbE5vZGUgPSBpbnN0YW50aWF0ZUdvYWwoc3RyaW5nLCBjb250ZXh0KSxcbiAgICAgICAgICAgIG5vZGUgPSBnb2FsTm9kZSwgIC8vL1xuICAgICAgICAgICAgYnJlYWtQb2ludCA9IGJyZWFrUG9pbnRGcm9tSlNPTihqc29uKSxcbiAgICAgICAgICAgIHJlZmVyZW5jZSA9IHJlZmVyZW5jZUZyb21Hb2FsTm9kZShnb2FsTm9kZSwgY29udGV4dCksXG4gICAgICAgICAgICBzdGF0ZW1lbnQgPSBzdGF0ZW1lbnRGcm9tR29hbE5vZGUoZ29hbE5vZGUsIGNvbnRleHQpLFxuICAgICAgICAgICAgZ29hbCA9IG5ldyBHb2FsKGNvbnRleHQsIHN0cmluZywgbm9kZSwgYnJlYWtQb2ludCwgcmVmZXJlbmNlLCBzdGF0ZW1lbnQpO1xuXG4gICAgICByZXR1cm4gZ29hbDtcbiAgICB9LCBjb250ZXh0KTtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIHJlZmVyZW5jZUZyb21Hb2FsTm9kZShnb2FsTm9kZSwgY29udGV4dCkge1xuICBjb25zdCBtZXRhdmFyaWFibGVOb2RlID0gZ29hbE5vZGUuZ2V0TWV0YXZhcmlhYmxlTm9kZShjb250ZXh0KSxcbiAgICAgICAgcmVmZXJlbmNlID0gY29udGV4dC5maW5kUmVmZXJlbmNlQnlNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpO1xuXG4gIHJldHVybiByZWZlcmVuY2U7XG59XG5cbmZ1bmN0aW9uIHN0YXRlbWVudEZyb21Hb2FsTm9kZShnb2FsTm9kZSwgY29udGV4dCkge1xuICBjb25zdCBzdGF0ZW1lbnROb2RlID0gZ29hbE5vZGUuZ2V0U3RhdGVtZW50Tm9kZSgpLFxuICAgICAgICBzdGF0ZW1lbnQgPSBjb250ZXh0LmZpbmRTdGF0ZW1lbnRCeVN0YXRlbWVudE5vZGUoc3RhdGVtZW50Tm9kZSk7XG5cbiAgcmV0dXJuIHN0YXRlbWVudDtcbn1cblxuZnVuY3Rpb24gc3VicHJvb2ZBc3NlcnRpb25Gcm9tU3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCkge1xuICBsZXQgc3VicHJvb2ZBc3NlcnRpb247XG5cbiAgY29uc3QgeyBTdWJwcm9vZkFzc2VydGlvbiB9ID0gZWxlbWVudHM7XG5cbiAgc3VicHJvb2ZBc3NlcnRpb24gPSBTdWJwcm9vZkFzc2VydGlvbi5mcm9tU3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCk7XG5cbiAgaWYgKHN1YnByb29mQXNzZXJ0aW9uICE9PSBudWxsKSB7XG4gICAgc3VicHJvb2ZBc3NlcnRpb24gPSBzdWJwcm9vZkFzc2VydGlvbi52YWxpZGF0ZShjb250ZXh0KTsgIC8vL1xuICB9XG5cbiAgcmV0dXJuIHN1YnByb29mQXNzZXJ0aW9uO1xufVxuIl0sIm5hbWVzIjpbImNsb25lIiwiYXJyYXlVdGlsaXRpZXMiLCJicmVha1BvaW50RnJvbUpTT04iLCJicmVha1BvaW50VG9CcmVha1BvaW50SlNPTiIsImJyZWFrUG9pbnRVdGlsaXRpZXMiLCJkZWZpbmUiLCJHb2FsIiwiRWxlbWVudCIsImNvbnRleHQiLCJzdHJpbmciLCJub2RlIiwiYnJlYWtQb2ludCIsInJlZmVyZW5jZSIsInN0YXRlbWVudCIsImdldFJlZmVyZW5jZSIsImdldFN0YXRlbWVudCIsImdldEdvYWxOb2RlIiwiZ2V0Tm9kZSIsImdvYWxOb2RlIiwiZ2V0U3RhdGVtZW50Tm9kZSIsImdldE1ldGF2YXJpYWJsZSIsImlzRXF1YWxUbyIsImdvYWwiLCJnb2FsTm9kZU1hdGNoZXMiLCJtYXRjaEdvYWxOb2RlIiwiZXF1YWxUbyIsIm5vZGVNYXRjaGVzIiwibWF0Y2hOb2RlIiwiZmluZFN1YnByb29mQXNzZXJ0aW9uIiwic3VicHJvb2ZBc3NlcnRpb24iLCJzdGF0ZW1lbnROb2RlIiwic3VicHJvb2ZBc3NlcnRpb25Ob2RlIiwiZ2V0U3VicHJvb2ZBc3NlcnRpb25Ob2RlIiwiZmluZEFzc2VydGlvbkJ5QXNzZXJ0aW9uTm9kZSIsImZpbmRWYWxpZEdvYWwiLCJmaW5kR29hbEJ5R29hbE5vZGUiLCJ2YWxpZEdvYWwiLCJ2YWxpZGF0ZSIsImNvbnRpbnVhdGlvbiIsImdvYWxTdHJpbmciLCJnZXRTdHJpbmciLCJ0cmFjZSIsImRlYnVnIiwidmFsaWRhdGVTdGF0ZW1lbnQiLCJiaW5kIiwidmFsaWRhdGVSZWZlcmVuY2UiLCJhbGwiLCJ2YWxpZGF0ZXMiLCJ2YWxpZGF0ZXNXaGVuU3RhdGVkIiwidmFsaWRhdGVXaGVuU3RhdGVkIiwidmFsaWRhdGVzV2hlbkRlcml2ZWQiLCJ2YWxpZGF0ZVdoZW5EZXJpdmVkIiwiZXhpc3RzIiwiYWRkR29hbCIsInJlZmVyZW5jZVZhbGlkYXRlcyIsInN0YXRlbWVudFZhbGlkYXRlcyIsInN0YXRlZCIsImlzU3RhdGVkIiwic2NoZW1hcyIsImdldFNjaGVtYXMiLCJmaWx0ZXIiLCJzY2hlbWEiLCJsYWJlbCIsImdldExhYmVsIiwidW5pZnlMYWJlbCIsImVhY2giLCJ1bmlmeVNjaGVtYSIsInNjaGVtYXNVbmlmaXkiLCJsYWJlbFN0cmluZyIsInJlY29uY2lsZSIsImxhYmVsVW5pZmllcyIsInNjaGVtYVN0cmluZyIsImdlbmVyYWxDb250ZXh0Iiwic3BlY2lmaWNDb250ZXh0Iiwic2NoZW1hQ29uZGl0aW9uYWwiLCJpc0NvbmRpdGlvbmFsIiwic3VicHJvb2ZBc3NlcnRpb25Gcm9tU3RhdGVtZW50Iiwic2NoZW1hVW5pZmllcyIsImRlZHVjdGlvbiIsImdldERlZHVjdGlvbiIsInVuaWZ5RGVkdWN0aW9uIiwiZGVkdWN0aW9uVW5pZmllcyIsImRlZHVjdGlvblN0cmluZyIsImRlZHVjdGlvbkNvbnRleHQiLCJnZXRDb250ZXh0IiwidW5pZnlTdGF0ZW1lbnQiLCJzdGF0ZW1lbnRVbmlmaWVzIiwiY29tbWl0IiwidG9KU09OIiwiZ2V0QnJlYWtQb2ludCIsImJyZWFrUG9pbnRKU09OIiwianNvbiIsIm5hbWUiLCJmcm9tSlNPTiIsImluc3RhbnRpYXRlIiwiaW5zdGFudGlhdGVHb2FsIiwicmVmZXJlbmNlRnJvbUdvYWxOb2RlIiwic3RhdGVtZW50RnJvbUdvYWxOb2RlIiwibWV0YXZhcmlhYmxlTm9kZSIsImdldE1ldGF2YXJpYWJsZU5vZGUiLCJmaW5kUmVmZXJlbmNlQnlNZXRhdmFyaWFibGVOb2RlIiwiZmluZFN0YXRlbWVudEJ5U3RhdGVtZW50Tm9kZSIsIlN1YnByb29mQXNzZXJ0aW9uIiwiZWxlbWVudHMiLCJmcm9tU3RhdGVtZW50Il0sIm1hcHBpbmdzIjoiQUFBQTs7OzsrQkFlQTs7O2VBQUE7OzsyQkFiK0I7Z0NBQ2M7a0VBRXhCOzZCQUdXO3lCQUNPOzhCQUNHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFMUMsTUFBTSxFQUFFQSxLQUFLLEVBQUUsR0FBR0MseUJBQWMsRUFDMUIsRUFBRUMsa0JBQWtCLEVBQUVDLDBCQUEwQixFQUFFLEdBQUdDLG1DQUFtQjtNQUU5RSxXQUFlQyxJQUFBQSxnQkFBTSxFQUFDLE1BQU1DLGFBQWFDLHVCQUFPO0lBQzlDLFlBQVlDLE9BQU8sRUFBRUMsTUFBTSxFQUFFQyxJQUFJLEVBQUVDLFVBQVUsRUFBRUMsU0FBUyxFQUFFQyxTQUFTLENBQUU7UUFD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
312
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbGVtZW50L2dvYWwuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7IEVsZW1lbnQsIGJyZWFrUG9pbnRVdGlsaXRpZXMgfSBmcm9tIFwib2NjYW0tbGFuZ3VhZ2VzXCI7XG5cbmltcG9ydCBlbGVtZW50cyBmcm9tIFwiLi4vZWxlbWVudHNcIjtcblxuaW1wb3J0IHsgZGVmaW5lIH0gZnJvbSBcIi4uL2VsZW1lbnRzXCI7XG5pbXBvcnQgeyBpbnN0YW50aWF0ZUdvYWwgfSBmcm9tIFwiLi4vcHJvY2Vzcy9pbnN0YW50aWF0ZVwiO1xuaW1wb3J0IHsgYWxsLCBzb21lLCBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2NvbnRpbnVhdGlvblwiO1xuaW1wb3J0IHsgcmVjb25jaWxlLCBpbnN0YW50aWF0ZSB9IGZyb20gXCIuLi91dGlsaXRpZXMvY29udGV4dFwiO1xuXG5jb25zdCB7IGJyZWFrUG9pbnRGcm9tSlNPTiwgYnJlYWtQb2ludFRvQnJlYWtQb2ludEpTT04gfSA9IGJyZWFrUG9pbnRVdGlsaXRpZXM7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZShjbGFzcyBHb2FsIGV4dGVuZHMgRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKGNvbnRleHQsIHN0cmluZywgbm9kZSwgYnJlYWtQb2ludCwgcmVmZXJlbmNlLCBzdGF0ZW1lbnQpIHtcbiAgICBzdXBlcihjb250ZXh0LCBzdHJpbmcsIG5vZGUsIGJyZWFrUG9pbnQpO1xuXG4gICAgdGhpcy5yZWZlcmVuY2UgPSByZWZlcmVuY2U7XG4gICAgdGhpcy5zdGF0ZW1lbnQgPSBzdGF0ZW1lbnQ7XG4gIH1cblxuICBnZXRSZWZlcmVuY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVmZXJlbmNlO1xuICB9XG5cbiAgZ2V0U3RhdGVtZW50KCkge1xuICAgIHJldHVybiB0aGlzLnN0YXRlbWVudDtcbiAgfVxuXG4gIGdldEdvYWxOb2RlKCkge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldE5vZGUoKSxcbiAgICAgICAgICBnb2FsTm9kZSA9IG5vZGU7ICAvLy9cblxuICAgIHJldHVybiBnb2FsTm9kZTtcbiAgfVxuXG4gIGdldFN0YXRlbWVudE5vZGUoKSB7IHJldHVybiB0aGlzLnN0YXRlbWVudC5nZXRTdGF0ZW1lbnROb2RlKCk7IH1cblxuICBnZXRNZXRhdmFyaWFibGUoKSB7IHJldHVybiB0aGlzLnJlZmVyZW5jZS5nZXRNZXRhdmFyaWFibGUoKTsgfVxuXG4gIGlzRXF1YWxUbyhnb2FsKSB7XG4gICAgY29uc3QgZ29hbE5vZGUgPSBnb2FsLmdldE5vZGUoKSxcbiAgICAgICAgICBnb2FsTm9kZU1hdGNoZXMgPSB0aGlzLm1hdGNoR29hbE5vZGUoZ29hbE5vZGUpLFxuICAgICAgICAgIGVxdWFsVG8gPSBnb2FsTm9kZU1hdGNoZXM7ICAvLy9cblxuICAgIHJldHVybiBlcXVhbFRvO1xuICB9XG5cbiAgbWF0Y2hHb2FsTm9kZShnb2FsTm9kZSkge1xuICAgIGNvbnN0IG5vZGUgPSBnb2FsTm9kZSwgLy8vXG4gICAgICAgICAgbm9kZU1hdGNoZXMgPSB0aGlzLm1hdGNoTm9kZShub2RlKSxcbiAgICAgICAgICBnb2FsTm9kZU1hdGNoZXMgPSBub2RlTWF0Y2hlczsgLy8vXG5cbiAgICByZXR1cm4gZ29hbE5vZGVNYXRjaGVzO1xuICB9XG5cbiAgZmluZFN1YnByb29mQXNzZXJ0aW9uKGNvbnRleHQpIHtcbiAgICBsZXQgc3VicHJvb2ZBc3NlcnRpb24gPSBudWxsO1xuXG4gICAgY29uc3Qgc3RhdGVtZW50Tm9kZSA9IHRoaXMuZ2V0U3RhdGVtZW50Tm9kZSgpLFxuICAgICAgICAgIHN1YnByb29mQXNzZXJ0aW9uTm9kZSA9IHN0YXRlbWVudE5vZGUuZ2V0U3VicHJvb2ZBc3NlcnRpb25Ob2RlKCk7XG5cbiAgICBpZiAoc3VicHJvb2ZBc3NlcnRpb25Ob2RlICE9PSBudWxsKSB7XG4gICAgICBzdWJwcm9vZkFzc2VydGlvbiA9IGNvbnRleHQuZmluZEFzc2VydGlvbkJ5QXNzZXJ0aW9uTm9kZShzdWJwcm9vZkFzc2VydGlvbk5vZGUpO1xuICAgIH1cblxuICAgIHJldHVybiBzdWJwcm9vZkFzc2VydGlvbjtcbiAgfVxuXG4gIGZpbmRHb2FsKGNvbnRleHQpIHtcbiAgICBjb25zdCBnb2FsTm9kZSA9IHRoaXMuZ2V0R29hbE5vZGUoKSxcbiAgICAgICAgICBnb2FsID0gY29udGV4dC5maW5kR29hbEJ5R29hbE5vZGUoZ29hbE5vZGUpO1xuXG4gICAgcmV0dXJuIGdvYWw7XG4gIH1cblxuICB2YWxpZGF0ZShjb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBsZXQgdmFsaWRhdGVzO1xuXG4gICAgY29uc3QgZ29hbG5TdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtnb2FsblN0cmluZ30nIGdvYWwuLi5gKTtcblxuICAgIGxldCBnb2FsbjtcblxuICAgIGNvbnN0IGdvYWwgPSB0aGlzLmZpbmRHb2FsKGNvbnRleHQpO1xuXG4gICAgaWYgKGdvYWwgIT09IG51bGwpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYFRoZSAnJHtnb2FsblN0cmluZ30nIGdvYWwgaXMgYWxyZWFkeSBwcmVzZW50LmApO1xuXG4gICAgICB2YWxpZGF0ZXMgPSBjb250aW51YXRpb24oZ29hbG4sIGNvbnRleHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnb2FsbiA9IHRoaXM7XG5cbiAgICAgIGNvbnN0IHZhbGlkYXRlU3RhdGVtZW50ID0gdGhpcy52YWxpZGF0ZVN0YXRlbWVudC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgdmFsaWRhdGVSZWZlcmVuY2UgPSB0aGlzLnZhbGlkYXRlUmVmZXJlbmNlLmJpbmQodGhpcyk7XG5cbiAgICAgIHZhbGlkYXRlcyA9IGFsbChbXG4gICAgICAgIHZhbGlkYXRlU3RhdGVtZW50LFxuICAgICAgICB2YWxpZGF0ZVJlZmVyZW5jZVxuICAgICAgXSwgY29udGV4dCwgKGNvbnRleHQpID0+IHtcbiAgICAgICAgbGV0IHZhbGlkYXRlcztcblxuICAgICAgICBjb25zdCB2YWxpZGF0ZVdoZW5TdGF0ZWQgPSB0aGlzLnZhbGlkYXRlV2hlblN0YXRlZC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgICB2YWxpZGF0ZVdoZW5EZXJpdmVkID0gdGhpcy52YWxpZGF0ZVdoZW5EZXJpdmVkLmJpbmQodGhpcyk7XG5cbiAgICAgICAgdmFsaWRhdGVzID0gZXhpc3RzKFtcbiAgICAgICAgICB2YWxpZGF0ZVdoZW5TdGF0ZWQsXG4gICAgICAgICAgdmFsaWRhdGVXaGVuRGVyaXZlZFxuICAgICAgICBdLCBjb250ZXh0LCAoY29udGV4dCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGdvYWwgPSBnb2FsbjsgIC8vL1xuXG4gICAgICAgICAgY29udGV4dC5hZGRHb2FsKGdvYWwpO1xuXG4gICAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihnb2FsbiwgY29udGV4dCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB2YWxpZGF0ZXM7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodmFsaWRhdGVzKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke2dvYWxuU3RyaW5nfScgZ29hbC5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdGVzO1xuICB9XG5cbiAgdmFsaWRhdGVSZWZlcmVuY2UoY29udGV4dCwgY29udGludWF0aW9uKSB7XG4gICAgbGV0IHJlZmVyZW5jZVZhbGlkYXRlcztcblxuICAgIGNvbnN0IGdvYWxTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtnb2FsU3RyaW5nfScgZ29hbCdzIHJlZmVyZW5jZS4uLmApO1xuXG4gICAgcmVmZXJlbmNlVmFsaWRhdGVzID0gdGhpcy5yZWZlcmVuY2UudmFsaWRhdGUoY29udGV4dCwgKHJlZmVyZW5jZSwgY29udGV4dCkgPT4ge1xuICAgICAgdGhpcy5yZWZlcmVuY2UgPSByZWZlcmVuY2U7XG5cbiAgICAgIHJldHVybiBjb250aW51YXRpb24oY29udGV4dCk7XG4gICAgfSk7XG5cbiAgICBpZiAocmVmZXJlbmNlVmFsaWRhdGVzKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZXMgdGhlJyR7Z29hbFN0cmluZ30nIGdvYWwncyByZWZlcmVuY2UuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlZmVyZW5jZVZhbGlkYXRlcztcbiAgfVxuXG4gIHZhbGlkYXRlU3RhdGVtZW50KGNvbnRleHQsIGNvbnRpbnVhdGlvbikge1xuICAgIGxldCBzdGF0ZW1lbnRWYWxpZGF0ZXM7XG5cbiAgICBjb25zdCBnb2FsU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgIC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7Z29hbFN0cmluZ30nIGdvYWwncyBzdGF0ZW1lbnQuLi5gKTtcblxuICAgIHN0YXRlbWVudFZhbGlkYXRlcyA9IHRoaXMuc3RhdGVtZW50LnZhbGlkYXRlKGNvbnRleHQsIChzdGF0ZW1lbnQsIGNvbnRleHQpID0+IHtcbiAgICAgIHRoaXMuc3RhdGVtZW50ID0gc3RhdGVtZW50O1xuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKGNvbnRleHQpO1xuICAgIH0pO1xuXG4gICAgaWYgKHN0YXRlbWVudFZhbGlkYXRlcykge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGVzIHRoZScke2dvYWxTdHJpbmd9JyBnb2FsJ3Mgc3RhdGVtZW50LmApO1xuICAgIH1cblxuICAgIHJldHVybiBzdGF0ZW1lbnRWYWxpZGF0ZXM7XG4gIH1cblxuICB2YWxpZGF0ZVdoZW5TdGF0ZWQoY29udGV4dCwgY29udGludWF0aW9uKSB7XG4gICAgbGV0IHZhbGlkYXRlc1doZW5TdGF0ZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IHN0YXRlZCA9IGNvbnRleHQuaXNTdGF0ZWQoKTtcblxuICAgIGlmIChzdGF0ZWQpIHtcbiAgICAgIGNvbnN0IGdvYWxTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAvLy9cblxuICAgICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7Z29hbFN0cmluZ30nIHN0YXRlZCBnb2FsLi4uYCk7XG5cbiAgICAgIHZhbGlkYXRlc1doZW5TdGF0ZWQgPSBjb250aW51YXRpb24oY29udGV4dCk7XG5cbiAgICAgIGlmICh2YWxpZGF0ZXNXaGVuU3RhdGVkKSB7XG4gICAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7Z29hbFN0cmluZ30nIHN0YXRlZCBnb2FsLmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0ZXNXaGVuU3RhdGVkO1xuICB9XG5cbiAgdmFsaWRhdGVXaGVuRGVyaXZlZChjb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBsZXQgdmFsaWRhdGVzV2hlbkRlcml2ZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IHN0YXRlZCA9IGNvbnRleHQuaXNTdGF0ZWQoKTtcblxuICAgIGlmICghc3RhdGVkKSB7XG4gICAgICBjb25zdCBnb2FsU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgLy8vXG5cbiAgICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke2dvYWxTdHJpbmd9JyBkZXJpdmVkIGdvYWwuLi5gKTtcblxuICAgICAgY29uc3Qgc2NoZW1hcyA9IGNvbnRleHQuZ2V0U2NoZW1hcygpO1xuXG4gICAgICB2YWxpZGF0ZXNXaGVuRGVyaXZlZCA9IHNvbWUoc2NoZW1hcywgKHNjaGVtYSwgY29udGV4dCkgPT4ge1xuICAgICAgICBsZXQgcGFzc2VkO1xuXG4gICAgICAgIGNvbnN0IGxhYmVsID0gc2NoZW1hLmdldExhYmVsKCk7XG5cbiAgICAgICAgdGhpcy51bmlmeUxhYmVsKGxhYmVsLCBjb250ZXh0LCAobGFiZWxVbmlmaWVzKSA9PiB7XG4gICAgICAgICAgaWYgKGxhYmVsVW5pZmllcykge1xuICAgICAgICAgICAgdGhpcy51bmlmeVNjaGVtYShzY2hlbWEsIGNvbnRleHQsIChzY2hlbWFVbmlmaWVzKSA9PiB7XG4gICAgICAgICAgICAgIHBhc3NlZCA9IHNjaGVtYVVuaWZpZXM7ICAvLy9cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHBhc3NlZDtcbiAgICAgIH0sIGNvbnRleHQsIChjb250ZXh0KSA9PiB0cnVlKTtcblxuICAgICAgaWYgKHZhbGlkYXRlc1doZW5EZXJpdmVkKSB7XG4gICAgICAgIHZhbGlkYXRlc1doZW5EZXJpdmVkID0gY29udGludWF0aW9uKGNvbnRleHQpO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsaWRhdGVzV2hlbkRlcml2ZWQpIHtcbiAgICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGVkIHRoZSAnJHtnb2FsU3RyaW5nfScgZGVyaXZlZCBnb2FsLmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0ZXNXaGVuRGVyaXZlZDtcbiAgfVxuXG4gIHVuaWZ5TGFiZWwobGFiZWwsIGNvbnRleHQsIGNvbnRpbnVhdGlvbikge1xuICAgIGNvbnN0IGdvYWxTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpLCAgLy8vXG4gICAgICAgICAgbGFiZWxTdHJpbmcgPSBsYWJlbC5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHtsYWJlbFN0cmluZ30nIGxhYmVsIHdpdGggdGhlICcke2dvYWxTdHJpbmd9JyBnb2FsLi4uYCk7XG5cbiAgICByZXR1cm4gcmVjb25jaWxlKChjb250ZXh0KSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5yZWZlcmVuY2UudW5pZnlMYWJlbChsYWJlbCwgY29udGV4dCwgKGxhYmVsVW5pZmllcykgPT4ge1xuICAgICAgICBpZiAobGFiZWxVbmlmaWVzKSB7XG4gICAgICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udW5pZmllZCB0aGUgJyR7bGFiZWxTdHJpbmd9JyBsYWJlbCB3aXRoIHRoZSAnJHtnb2FsU3RyaW5nfScgZ29hbCdzIHJlZmVyZW5jZS5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb250aW51YXRpb24obGFiZWxVbmlmaWVzKTtcbiAgICAgIH0pO1xuICAgIH0sIGNvbnRleHQpO1xuICB9XG5cbiAgdW5pZnlTY2hlbWEoc2NoZW1hLCBjb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBjb25zdCBnb2FsU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKSxcbiAgICAgICAgICBzY2hlbWFTdHJpbmcgPSBzY2hlbWEuZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBVbmlmeWluZyB0aGUgJyR7c2NoZW1hU3RyaW5nfScgc2NoZW1hIHdpdGggdGhlICcke2dvYWxTdHJpbmd9JyBnb2FsLi4uYCk7XG5cbiAgICBjb25zdCBnZW5lcmFsQ29udGV4dCA9IGNvbnRleHQ7ICAvLy9cblxuICAgIHJldHVybiByZWNvbmNpbGUoKGNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IGxhYmVsID0gc2NoZW1hLmdldExhYmVsKCk7XG5cbiAgICAgIHJldHVybiB0aGlzLnJlZmVyZW5jZS51bmlmeUxhYmVsKGxhYmVsLCBjb250ZXh0LCAobGFiZWxVbmlmaWVzKSA9PiB7XG4gICAgICAgIGlmICghbGFiZWxVbmlmaWVzKSB7XG4gICAgICAgICAgY29uc3Qgc2NoZW1hVW5pZmllcyA9IGZhbHNlO1xuXG4gICAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihzY2hlbWFVbmlmaWVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNwZWNpZmljQ29udGV4dCA9IGNvbnRleHQsICAvLy9cbiAgICAgICAgICAgICAgc2NoZW1hQ29uZGl0aW9uYWwgPSBzY2hlbWEuaXNDb25kaXRpb25hbCgpLFxuICAgICAgICAgICAgICBzdWJwcm9vZkFzc2VydGlvbiA9IHN1YnByb29mQXNzZXJ0aW9uRnJvbVN0YXRlbWVudCh0aGlzLnN0YXRlbWVudCwgY29udGV4dCk7XG5cbiAgICAgICAgaWYgKHNjaGVtYUNvbmRpdGlvbmFsKSB7XG4gICAgICAgICAgaWYgKHN1YnByb29mQXNzZXJ0aW9uID09PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBzY2hlbWFVbmlmaWVzID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHJldHVybiBjb250aW51YXRpb24oc2NoZW1hVW5pZmllcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHN1YnByb29mQXNzZXJ0aW9uLnVuaWZ5U2NoZW1hKHNjaGVtYSwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCwgKHNjaGVtYVVuaWZpZXMpID0+IHtcbiAgICAgICAgICAgIGlmIChzY2hlbWFVbmlmaWVzKSB7XG4gICAgICAgICAgICAgIGNvbnRleHQuZGVidWcoYC4uLnVuaWZpZWQgdGhlICcke3NjaGVtYVN0cmluZ30nIHNjaGVtYSB3aXRoIHRoZSAnJHtnb2FsU3RyaW5nfScgZ29hbC5gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihzY2hlbWFVbmlmaWVzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdWJwcm9vZkFzc2VydGlvbiAhPT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IHNjaGVtYVVuaWZpZXMgPSBmYWxzZTtcblxuICAgICAgICAgIHJldHVybiBjb250aW51YXRpb24oc2NoZW1hVW5pZmllcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWR1Y3Rpb24gPSBzY2hlbWEuZ2V0RGVkdWN0aW9uKCk7XG5cbiAgICAgICAgdGhpcy51bmlmeURlZHVjdGlvbihkZWR1Y3Rpb24sIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQsIChkZWR1Y3Rpb25VbmlmaWVzKSA9PiB7XG4gICAgICAgICAgbGV0IHNjaGVtYVVuaWZpZXMgPSBmYWxzZTtcblxuICAgICAgICAgIGlmIChkZWR1Y3Rpb25VbmlmaWVzKSB7XG4gICAgICAgICAgICBzY2hlbWFVbmlmaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc2NoZW1hVW5pZmllcykge1xuICAgICAgICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udW5pZmllZCB0aGUgJyR7c2NoZW1hU3RyaW5nfScgc2NoZW1hIHdpdGggdGhlICcke2dvYWxTdHJpbmd9JyBnb2FsLmApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb250aW51YXRpb24oc2NoZW1hVW5pZmllcyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSwgY29udGV4dCk7XG4gIH1cblxuICB1bmlmeURlZHVjdGlvbihkZWR1Y3Rpb24sIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQsIGNvbnRpbnVhdGlvbikge1xuICAgIGNvbnN0IGNvbnRleHQgPSBzcGVjaWZpY0NvbnRleHQsICAvLy9cbiAgICAgICAgICBnb2FsU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKSwgIC8vL1xuICAgICAgICAgIGRlZHVjdGlvblN0cmluZyA9IGRlZHVjdGlvbi5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHtkZWR1Y3Rpb25TdHJpbmd9JyBkZWR1Y3Rpb24ncyBzdGF0ZW1lbnQgIHdpdGggdGhlICcke2dvYWxTdHJpbmd9JyBnb2FsJ3MgJyR7Z29hbFN0cmluZ30nIHN0YXRlbWVudC4uLmApO1xuXG4gICAgY29uc3Qgc3RhdGVtZW50ID0gZGVkdWN0aW9uLmdldFN0YXRlbWVudCgpLFxuICAgICAgICAgIGRlZHVjdGlvbkNvbnRleHQgPSBkZWR1Y3Rpb24uZ2V0Q29udGV4dCgpOyAvLy9cblxuICAgIHNwZWNpZmljQ29udGV4dCA9IGRlZHVjdGlvbkNvbnRleHQ7IC8vL1xuXG4gICAgcmV0dXJuIHJlY29uY2lsZSgoc3BlY2lmaWNDb250ZXh0KSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5zdGF0ZW1lbnQudW5pZnlTdGF0ZW1lbnQoc3RhdGVtZW50LCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0LCAoc3RhdGVtZW50VW5pZmllcykgPT4ge1xuICAgICAgICBsZXQgZGVkdWN0aW9uVW5pZmllcyA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChzdGF0ZW1lbnRVbmlmaWVzKSB7XG4gICAgICAgICAgZGVkdWN0aW9uVW5pZmllcyA9IHRydWU7XG5cbiAgICAgICAgICBzcGVjaWZpY0NvbnRleHQuY29tbWl0KGNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlZHVjdGlvblVuaWZpZXMpIHtcbiAgICAgICAgICBjb250ZXh0LmRlYnVnKGAuLi51bmlmaWVkIHRoZSAnJHtkZWR1Y3Rpb25TdHJpbmd9JyBkZWR1Y3Rpb24ncyBzdGF0ZW1lbnQgd2l0aCB0aGUgJyR7Z29hbFN0cmluZ30nIGdvYWwncyAnJHtnb2FsU3RyaW5nfScgc3RhdGVtZW50LmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihkZWR1Y3Rpb25VbmlmaWVzKTtcbiAgICAgIH0pO1xuICAgIH0sIHNwZWNpZmljQ29udGV4dCk7XG4gIH1cblxuICB0b0pTT04oKSB7XG4gICAgY29uc3Qgc3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTtcblxuICAgIGxldCBicmVha1BvaW50O1xuXG4gICAgYnJlYWtQb2ludCA9IHRoaXMuZ2V0QnJlYWtQb2ludCgpO1xuXG4gICAgY29uc3QgYnJlYWtQb2ludEpTT04gPSBicmVha1BvaW50VG9CcmVha1BvaW50SlNPTihicmVha1BvaW50KTtcblxuICAgIGJyZWFrUG9pbnQgPSBicmVha1BvaW50SlNPTjsgIC8vL1xuXG4gICAgY29uc3QganNvbiA9IHtcbiAgICAgIHN0cmluZyxcbiAgICAgIGJyZWFrUG9pbnRcbiAgICB9O1xuXG4gICAgcmV0dXJuIGpzb247XG4gIH1cblxuICBzdGF0aWMgbmFtZSA9IFwiR29hbFwiO1xuXG4gIHN0YXRpYyBmcm9tSlNPTihqc29uLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGluc3RhbnRpYXRlKChjb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCB7IHN0cmluZyB9ID0ganNvbixcbiAgICAgICAgICAgIGdvYWxOb2RlID0gaW5zdGFudGlhdGVHb2FsKHN0cmluZywgY29udGV4dCksXG4gICAgICAgICAgICBub2RlID0gZ29hbE5vZGUsICAvLy9cbiAgICAgICAgICAgIGJyZWFrUG9pbnQgPSBicmVha1BvaW50RnJvbUpTT04oanNvbiksXG4gICAgICAgICAgICByZWZlcmVuY2UgPSByZWZlcmVuY2VGcm9tR29hbE5vZGUoZ29hbE5vZGUsIGNvbnRleHQpLFxuICAgICAgICAgICAgc3RhdGVtZW50ID0gc3RhdGVtZW50RnJvbUdvYWxOb2RlKGdvYWxOb2RlLCBjb250ZXh0KSxcbiAgICAgICAgICAgIGdvYWwgPSBuZXcgR29hbChjb250ZXh0LCBzdHJpbmcsIG5vZGUsIGJyZWFrUG9pbnQsIHJlZmVyZW5jZSwgc3RhdGVtZW50KTtcblxuICAgICAgcmV0dXJuIGdvYWw7XG4gICAgfSwgY29udGV4dCk7XG4gIH1cbn0pO1xuXG5mdW5jdGlvbiByZWZlcmVuY2VGcm9tR29hbE5vZGUoZ29hbE5vZGUsIGNvbnRleHQpIHtcbiAgY29uc3QgbWV0YXZhcmlhYmxlTm9kZSA9IGdvYWxOb2RlLmdldE1ldGF2YXJpYWJsZU5vZGUoY29udGV4dCksXG4gICAgICAgIHJlZmVyZW5jZSA9IGNvbnRleHQuZmluZFJlZmVyZW5jZUJ5TWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKTtcblxuICByZXR1cm4gcmVmZXJlbmNlO1xufVxuXG5mdW5jdGlvbiBzdGF0ZW1lbnRGcm9tR29hbE5vZGUoZ29hbE5vZGUsIGNvbnRleHQpIHtcbiAgY29uc3Qgc3RhdGVtZW50Tm9kZSA9IGdvYWxOb2RlLmdldFN0YXRlbWVudE5vZGUoKSxcbiAgICAgICAgc3RhdGVtZW50ID0gY29udGV4dC5maW5kU3RhdGVtZW50QnlTdGF0ZW1lbnROb2RlKHN0YXRlbWVudE5vZGUpO1xuXG4gIHJldHVybiBzdGF0ZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIHN1YnByb29mQXNzZXJ0aW9uRnJvbVN0YXRlbWVudChzdGF0ZW1lbnQsIGNvbnRleHQpIHtcbiAgbGV0IHN1YnByb29mQXNzZXJ0aW9uO1xuXG4gIGNvbnN0IHsgU3VicHJvb2ZBc3NlcnRpb24gfSA9IGVsZW1lbnRzO1xuXG4gIHN1YnByb29mQXNzZXJ0aW9uID0gU3VicHJvb2ZBc3NlcnRpb24uZnJvbVN0YXRlbWVudChzdGF0ZW1lbnQsIGNvbnRleHQpO1xuXG4gIGlmIChzdWJwcm9vZkFzc2VydGlvbiAhPT0gbnVsbCkge1xuICAgIHN1YnByb29mQXNzZXJ0aW9uID0gc3VicHJvb2ZBc3NlcnRpb24udmFsaWRhdGUoY29udGV4dCk7ICAvLy9cbiAgfVxuXG4gIHJldHVybiBzdWJwcm9vZkFzc2VydGlvbjtcbn1cbiJdLCJuYW1lcyI6WyJicmVha1BvaW50RnJvbUpTT04iLCJicmVha1BvaW50VG9CcmVha1BvaW50SlNPTiIsImJyZWFrUG9pbnRVdGlsaXRpZXMiLCJkZWZpbmUiLCJHb2FsIiwiRWxlbWVudCIsImNvbnRleHQiLCJzdHJpbmciLCJub2RlIiwiYnJlYWtQb2ludCIsInJlZmVyZW5jZSIsInN0YXRlbWVudCIsImdldFJlZmVyZW5jZSIsImdldFN0YXRlbWVudCIsImdldEdvYWxOb2RlIiwiZ2V0Tm9kZSIsImdvYWxOb2RlIiwiZ2V0U3RhdGVtZW50Tm9kZSIsImdldE1ldGF2YXJpYWJsZSIsImlzRXF1YWxUbyIsImdvYWwiLCJnb2FsTm9kZU1hdGNoZXMiLCJtYXRjaEdvYWxOb2RlIiwiZXF1YWxUbyIsIm5vZGVNYXRjaGVzIiwibWF0Y2hOb2RlIiwiZmluZFN1YnByb29mQXNzZXJ0aW9uIiwic3VicHJvb2ZBc3NlcnRpb24iLCJzdGF0ZW1lbnROb2RlIiwic3VicHJvb2ZBc3NlcnRpb25Ob2RlIiwiZ2V0U3VicHJvb2ZBc3NlcnRpb25Ob2RlIiwiZmluZEFzc2VydGlvbkJ5QXNzZXJ0aW9uTm9kZSIsImZpbmRHb2FsIiwiZmluZEdvYWxCeUdvYWxOb2RlIiwidmFsaWRhdGUiLCJjb250aW51YXRpb24iLCJ2YWxpZGF0ZXMiLCJnb2FsblN0cmluZyIsImdldFN0cmluZyIsInRyYWNlIiwiZ29hbG4iLCJkZWJ1ZyIsInZhbGlkYXRlU3RhdGVtZW50IiwiYmluZCIsInZhbGlkYXRlUmVmZXJlbmNlIiwiYWxsIiwidmFsaWRhdGVXaGVuU3RhdGVkIiwidmFsaWRhdGVXaGVuRGVyaXZlZCIsImV4aXN0cyIsImFkZEdvYWwiLCJyZWZlcmVuY2VWYWxpZGF0ZXMiLCJnb2FsU3RyaW5nIiwic3RhdGVtZW50VmFsaWRhdGVzIiwidmFsaWRhdGVzV2hlblN0YXRlZCIsInN0YXRlZCIsImlzU3RhdGVkIiwidmFsaWRhdGVzV2hlbkRlcml2ZWQiLCJzY2hlbWFzIiwiZ2V0U2NoZW1hcyIsInNvbWUiLCJzY2hlbWEiLCJwYXNzZWQiLCJsYWJlbCIsImdldExhYmVsIiwidW5pZnlMYWJlbCIsImxhYmVsVW5pZmllcyIsInVuaWZ5U2NoZW1hIiwic2NoZW1hVW5pZmllcyIsImxhYmVsU3RyaW5nIiwicmVjb25jaWxlIiwic2NoZW1hU3RyaW5nIiwiZ2VuZXJhbENvbnRleHQiLCJzcGVjaWZpY0NvbnRleHQiLCJzY2hlbWFDb25kaXRpb25hbCIsImlzQ29uZGl0aW9uYWwiLCJzdWJwcm9vZkFzc2VydGlvbkZyb21TdGF0ZW1lbnQiLCJkZWR1Y3Rpb24iLCJnZXREZWR1Y3Rpb24iLCJ1bmlmeURlZHVjdGlvbiIsImRlZHVjdGlvblVuaWZpZXMiLCJkZWR1Y3Rpb25TdHJpbmciLCJkZWR1Y3Rpb25Db250ZXh0IiwiZ2V0Q29udGV4dCIsInVuaWZ5U3RhdGVtZW50Iiwic3RhdGVtZW50VW5pZmllcyIsImNvbW1pdCIsInRvSlNPTiIsImdldEJyZWFrUG9pbnQiLCJicmVha1BvaW50SlNPTiIsImpzb24iLCJuYW1lIiwiZnJvbUpTT04iLCJpbnN0YW50aWF0ZSIsImluc3RhbnRpYXRlR29hbCIsInJlZmVyZW5jZUZyb21Hb2FsTm9kZSIsInN0YXRlbWVudEZyb21Hb2FsTm9kZSIsIm1ldGF2YXJpYWJsZU5vZGUiLCJnZXRNZXRhdmFyaWFibGVOb2RlIiwiZmluZFJlZmVyZW5jZUJ5TWV0YXZhcmlhYmxlTm9kZSIsImZpbmRTdGF0ZW1lbnRCeVN0YXRlbWVudE5vZGUiLCJTdWJwcm9vZkFzc2VydGlvbiIsImVsZW1lbnRzIiwiZnJvbVN0YXRlbWVudCJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7K0JBYUE7OztlQUFBOzs7Z0NBWDZDO2tFQUV4Qjs2QkFHVzs4QkFDRTt5QkFDSzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRXZDLE1BQU0sRUFBRUEsa0JBQWtCLEVBQUVDLDBCQUEwQixFQUFFLEdBQUdDLG1DQUFtQjtNQUU5RSxXQUFlQyxJQUFBQSxnQkFBTSxFQUFDLE1BQU1DLGFBQWFDLHVCQUFPO0lBQzlDLFlBQVlDLE9BQU8sRUFBRUMsTUFBTSxFQUFFQyxJQUFJLEVBQUVDLFVBQVUsRUFBRUMsU0FBUyxFQUFFQyxTQUFTLENBQUU7UUFDbkUsS0FBSyxDQUFDTCxTQUFTQyxRQUFRQyxNQUFNQztRQUU3QixJQUFJLENBQUNDLFNBQVMsR0FBR0E7UUFDakIsSUFBSSxDQUFDQyxTQUFTLEdBQUdBO0lBQ25CO0lBRUFDLGVBQWU7UUFDYixPQUFPLElBQUksQ0FBQ0YsU0FBUztJQUN2QjtJQUVBRyxlQUFlO1FBQ2IsT0FBTyxJQUFJLENBQUNGLFNBQVM7SUFDdkI7SUFFQUcsY0FBYztRQUNaLE1BQU1OLE9BQU8sSUFBSSxDQUFDTyxPQUFPLElBQ25CQyxXQUFXUixNQUFPLEdBQUc7UUFFM0IsT0FBT1E7SUFDVDtJQUVBQyxtQkFBbUI7UUFBRSxPQUFPLElBQUksQ0FBQ04sU0FBUyxDQUFDTSxnQkFBZ0I7SUFBSTtJQUUvREMsa0JBQWtCO1FBQUUsT0FBTyxJQUFJLENBQUNSLFNBQVMsQ0FBQ1EsZUFBZTtJQUFJ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