occam-nominal 1.0.310 → 1.0.317

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 (69) hide show
  1. package/lib/context/liminal.js +17 -15
  2. package/lib/context/phaneric.js +3 -3
  3. package/lib/context.js +3 -3
  4. package/lib/element/assertion/contained.js +19 -17
  5. package/lib/element/assertion/defined.js +16 -14
  6. package/lib/element/conclusion.js +10 -11
  7. package/lib/element/declaration/variable.js +2 -2
  8. package/lib/element/deduction.js +7 -7
  9. package/lib/element/equality.js +3 -3
  10. package/lib/element/frame.js +8 -3
  11. package/lib/element/goal.js +7 -8
  12. package/lib/element/judgement.js +8 -10
  13. package/lib/element/metavariable.js +44 -40
  14. package/lib/element/proof.js +2 -2
  15. package/lib/element/proofAssertion/premise.js +17 -21
  16. package/lib/element/proofAssertion/step.js +5 -5
  17. package/lib/element/proofAssertion/supposition.js +39 -35
  18. package/lib/element/rule.js +24 -22
  19. package/lib/element/statement.js +56 -32
  20. package/lib/element/substitution/frame.js +71 -62
  21. package/lib/element/substitution/reference.js +21 -21
  22. package/lib/element/substitution/statement.js +81 -98
  23. package/lib/element/substitution/term.js +76 -67
  24. package/lib/element/substitution.js +5 -5
  25. package/lib/element/term.js +2 -2
  26. package/lib/element/topLevelAssertion/axiom.js +4 -5
  27. package/lib/element/topLevelAssertion/conjecture.js +3 -3
  28. package/lib/element/topLevelAssertion/lemma.js +3 -3
  29. package/lib/element/topLevelAssertion/theorem.js +3 -3
  30. package/lib/element/topLevelAssertion.js +59 -69
  31. package/lib/node/metavariable.js +18 -1
  32. package/lib/process/unify.js +5 -7
  33. package/lib/process/validation.js +5 -2
  34. package/lib/utilities/element.js +34 -56
  35. package/package.json +2 -2
  36. package/src/context/liminal.js +18 -16
  37. package/src/context/phaneric.js +3 -3
  38. package/src/context.js +2 -2
  39. package/src/element/assertion/contained.js +19 -18
  40. package/src/element/assertion/defined.js +16 -16
  41. package/src/element/conclusion.js +9 -11
  42. package/src/element/declaration/variable.js +1 -1
  43. package/src/element/deduction.js +6 -6
  44. package/src/element/equality.js +2 -2
  45. package/src/element/frame.js +10 -2
  46. package/src/element/goal.js +6 -8
  47. package/src/element/judgement.js +7 -11
  48. package/src/element/metavariable.js +56 -52
  49. package/src/element/proof.js +1 -1
  50. package/src/element/proofAssertion/premise.js +17 -25
  51. package/src/element/proofAssertion/step.js +4 -4
  52. package/src/element/proofAssertion/supposition.js +44 -43
  53. package/src/element/rule.js +27 -25
  54. package/src/element/statement.js +71 -41
  55. package/src/element/substitution/frame.js +88 -82
  56. package/src/element/substitution/reference.js +30 -32
  57. package/src/element/substitution/statement.js +97 -132
  58. package/src/element/substitution/term.js +95 -89
  59. package/src/element/substitution.js +6 -6
  60. package/src/element/term.js +1 -1
  61. package/src/element/topLevelAssertion/axiom.js +3 -5
  62. package/src/element/topLevelAssertion/conjecture.js +2 -2
  63. package/src/element/topLevelAssertion/lemma.js +2 -2
  64. package/src/element/topLevelAssertion/theorem.js +2 -2
  65. package/src/element/topLevelAssertion.js +61 -80
  66. package/src/node/metavariable.js +28 -1
  67. package/src/process/unify.js +7 -16
  68. package/src/process/validation.js +5 -4
  69. package/src/utilities/element.js +49 -64
@@ -24,19 +24,15 @@ function _interop_require_default(obj) {
24
24
  }
25
25
  const { breakPointFromJSON } = _occamlanguages.breakPointUtilities;
26
26
  const _default = (0, _elements.define)(class StatementSubstitution extends _substitution.default {
27
- constructor(contexts, string, node, breakPoint, resolved, substitution, targetStatement, replacementStatement){
27
+ constructor(contexts, string, node, breakPoint, resolved, targetStatement, replacementStatement){
28
28
  super(contexts, string, node, breakPoint);
29
29
  this.resolved = resolved;
30
- this.substitution = substitution;
31
30
  this.targetStatement = targetStatement;
32
31
  this.replacementStatement = replacementStatement;
33
32
  }
34
33
  isResolved() {
35
34
  return this.resolved;
36
35
  }
37
- getSubstitution() {
38
- return this.substitution;
39
- }
40
36
  getTargetStatement() {
41
37
  return this.targetStatement;
42
38
  }
@@ -55,13 +51,12 @@ const _default = (0, _elements.define)(class StatementSubstitution extends _subs
55
51
  const replacementStatementNode = this.replacementStatement.getNode(), replacementNode = replacementStatementNode; ///
56
52
  return replacementNode;
57
53
  }
54
+ isSimple() {
55
+ return this.targetStatement.isSimple();
56
+ }
58
57
  getMetavariableNode() {
59
58
  return this.targetStatement.getMetavariableNode();
60
59
  }
61
- isSimple() {
62
- const simple = this.substitution === null;
63
- return simple;
64
- }
65
60
  matchMetavariableNode(metavariableNode) {
66
61
  return this.targetStatement.matchMetavariableNode(metavariableNode);
67
62
  }
@@ -74,7 +69,7 @@ const _default = (0, _elements.define)(class StatementSubstitution extends _subs
74
69
  const targetStatementComparesToParameter = this.targetStatement.compareParameter(parameter), comparesToParameter = targetStatementComparesToParameter; ///
75
70
  return comparesToParameter;
76
71
  }
77
- validate(substitution, context, continuatino) {
72
+ validate(context, continuatino) {
78
73
  const statementSubstitutionString = this.getString(); ///
79
74
  context.trace(`Validating the '${statementSubstitutionString}' statement substitution...`);
80
75
  const validSubstitution = this.findValidSubstitution(context);
@@ -87,12 +82,9 @@ const _default = (0, _elements.define)(class StatementSubstitution extends _subs
87
82
  const generalContext = this.getGeneralContext(), specificContext = this.getSpecificContext();
88
83
  (0, _context.attempts)((generalContext, specificContext)=>{
89
84
  const validateTargetStatement = this.validateTargetStatement.bind(this), validateReplacementStatement = this.validateReplacementStatement.bind(this);
90
- (0, _continuation.all)([
85
+ return (0, _continuation.all)([
91
86
  validateTargetStatement,
92
- validateReplacementStatement,
93
- (generalContext, specificContext, continuatino)=>{
94
- this.validateSubstitution(substitution, generalContext, specificContext, continuatino);
95
- }
87
+ validateReplacementStatement
96
88
  ], generalContext, specificContext, (validates)=>{
97
89
  let statementSubstitution = null;
98
90
  if (validates) {
@@ -106,26 +98,10 @@ const _default = (0, _elements.define)(class StatementSubstitution extends _subs
106
98
  if (validates) {
107
99
  context.debug(`...validated the '${statementSubstitutionString}' statement substitution.`);
108
100
  }
109
- continuatino(statementSubstitution);
101
+ return continuatino(statementSubstitution);
110
102
  });
111
103
  }, generalContext, specificContext);
112
104
  }
113
- validateSubstitution(substitution, generalContext, specificContext, continuatino) {
114
- if (substitution === null) {
115
- const substitutionValidates = true;
116
- continuatino(substitutionValidates);
117
- return;
118
- }
119
- let substitutionValidates;
120
- const context = generalContext, statementSubstitutionString = this.getString(); ///
121
- context.trace(`Validating the '${statementSubstitutionString}' statement substitution's substitution...`);
122
- this.substitution = substitution;
123
- substitutionValidates = true;
124
- if (substitutionValidates) {
125
- context.debug(`...validatewd the '${statementSubstitutionString}' statement substitution's substitution.`);
126
- }
127
- continuatino(substitutionValidates);
128
- }
129
105
  validateTargetStatement(generalContext, specificContext, continuatino) {
130
106
  const context = generalContext, statementSubstitutionString = this.getString(); ///
131
107
  context.trace(`Validating the '${statementSubstitutionString}' statement substitution's target statement...`);
@@ -136,20 +112,18 @@ const _default = (0, _elements.define)(class StatementSubstitution extends _subs
136
112
  continuatino(targetStatementValidates);
137
113
  return;
138
114
  }
139
- (0, _context.manifest)((context)=>{
140
- (0, _context.elide)((context)=>{
141
- this.targetStatement.validate(context, (targetStatement)=>{
142
- let targetStatementValidates = false;
143
- if (targetStatement !== null) {
144
- targetStatementValidates = true;
145
- }
146
- if (targetStatementValidates) {
147
- context.debug(`...validated the '${statementSubstitutionString}' statement substitution's target statement...`);
148
- }
149
- continuatino(targetStatementValidates);
150
- });
151
- }, context);
152
- }, specificContext, context);
115
+ (0, _context.elide)((context)=>{
116
+ this.targetStatement.validate(context, (targetStatement)=>{
117
+ let targetStatementValidates = false;
118
+ if (targetStatement !== null) {
119
+ targetStatementValidates = true;
120
+ }
121
+ if (targetStatementValidates) {
122
+ context.debug(`...validated the '${statementSubstitutionString}' statement substitution's target statement...`);
123
+ }
124
+ continuatino(targetStatementValidates);
125
+ });
126
+ }, context);
153
127
  }
154
128
  validateReplacementStatement(generalContext, specificContext, continuatino) {
155
129
  const context = specificContext, statementSubstitutionString = this.getString(); ///
@@ -184,57 +158,68 @@ const _default = (0, _elements.define)(class StatementSubstitution extends _subs
184
158
  }
185
159
  return targetStatemnentUnifies;
186
160
  }
187
- unifyReplacementStatement(substitution, context) {
188
- let replacementStatemnentUnifies = false;
161
+ unifyReplacementStatement(substitution, context, continuation) {
189
162
  const generalSubstitution = this, specificSubstitution = substitution, generalSubstitutionString = generalSubstitution.getString(), specificSubstitutionString = specificSubstitution.getString();
190
163
  context.trace(`Unifying the '${specificSubstitutionString}' substitution's replacement statement with the '${generalSubstitutionString}' substitution's replacement statement...`);
191
164
  const generalSubstitutionSpecificContext = generalSubstitution.getSpecificContext(), specificSubstitutionSpecificContext = specificSubstitution.getSpecificContext(), generalSubstitutionReplacementStatement = generalSubstitution.getReplacementStatement(), specificSubstitutionReplacementStatement = specificSubstitution.getReplacementStatement(), generalContext = generalSubstitutionSpecificContext, specificContext = specificSubstitutionSpecificContext, generalStatement = generalSubstitutionReplacementStatement, specificStatement = specificSubstitutionReplacementStatement; ///
192
165
  (0, _context.reconcile)((specificContext)=>{
193
- const statementUnifies = generalStatement.unifyStatement(specificStatement, generalContext, specificContext);
194
- if (statementUnifies) {
195
- specificContext.commit(context);
196
- replacementStatemnentUnifies = true;
197
- }
166
+ return generalStatement.unifyStatement(specificStatement, generalContext, specificContext, (statementUnifies)=>{
167
+ let replacementStatemnentUnifies = false;
168
+ if (statementUnifies) {
169
+ specificContext.commit(context);
170
+ replacementStatemnentUnifies = true;
171
+ }
172
+ if (replacementStatemnentUnifies) {
173
+ context.trace(`...unified the '${specificSubstitutionString}' substitution's replacement statement with the '${generalSubstitutionString}' substitution's replacement statement.`);
174
+ }
175
+ return continuation(replacementStatemnentUnifies);
176
+ });
198
177
  }, specificContext);
199
- if (replacementStatemnentUnifies) {
200
- context.trace(`...unified the '${specificSubstitutionString}' substitution's replacement statement with the '${generalSubstitutionString}' substitution's replacement statement.`);
201
- }
202
- return replacementStatemnentUnifies;
203
178
  }
204
- unifyComplexSubstitution(complexSubstitution, context) {
205
- let substitution = null;
179
+ unifyComplexSubstitution(complexSubstitution, context, continuation) {
206
180
  const simpleSubstitution = this, simpleSubstitutionString = simpleSubstitution.getString(), complexSubstitutionString = complexSubstitution.getString(); ///
207
181
  context.trace(`Unifying the '${complexSubstitutionString}' complex substitution with the '${simpleSubstitutionString}' simple substitution...`);
208
- let simpleSubstitutionUnifies = false;
209
182
  (0, _context.reconcile)((context)=>{
210
- const replacementStatementUnifies = this.unifyReplacementStatement(complexSubstitution, context);
211
- if (replacementStatementUnifies) {
183
+ return this.unifyReplacementStatement(complexSubstitution, context, (replacementStatementUnifies)=>{
184
+ let substitution = null;
185
+ if (!replacementStatementUnifies) {
186
+ return continuation(substitution);
187
+ }
188
+ let simpleSubstitutionUnifies = false;
212
189
  const soleNonTrivialDerivedSubstitution = context.getSoleNonTrivialDerivedSubstitution();
213
190
  substitution = soleNonTrivialDerivedSubstitution; ///
214
- }
191
+ if (substitution !== null) {
192
+ simpleSubstitutionUnifies = true;
193
+ }
194
+ if (simpleSubstitutionUnifies) {
195
+ context.debug(`...unified the '${complexSubstitutionString}' complex substitution with the '${simpleSubstitutionString}' simple substitution.`);
196
+ }
197
+ return continuation(substitution);
198
+ });
215
199
  }, context);
216
- if (substitution !== null) {
217
- simpleSubstitutionUnifies = true;
218
- }
219
- if (simpleSubstitutionUnifies) {
220
- context.debug(`...unified the '${complexSubstitutionString}' complex substitution with the '${simpleSubstitutionString}' simple substitution.`);
221
- }
222
- return substitution;
223
200
  }
224
- resolve(context) {
201
+ resolve(context, continuation) {
225
202
  const metavariableNode = this.getMetavariableNode(), simpleDerivedSubstitution = context.findSimpleDerivedSubstitutionByMetavariableNode(metavariableNode);
226
- if (simpleDerivedSubstitution !== null) {
227
- const simpleSubstitution = simpleDerivedSubstitution, complexSubstitution = this, complexSubstitutionString = complexSubstitution.getString();
228
- context.trace(`Resolving the ${complexSubstitutionString}' complex substitution...`);
229
- const substitution = simpleSubstitution.unifyComplexSubstitution(complexSubstitution, context);
230
- if (substitution !== null) {
231
- const simpleSubstitutionUnifies = this.substitution.unifySubstitution(substitution, context);
232
- if (simpleSubstitutionUnifies) {
203
+ if (simpleDerivedSubstitution === null) {
204
+ return continuation();
205
+ }
206
+ const simpleSubstitution = simpleDerivedSubstitution, complexSubstitution = this, complexSubstitutionString = complexSubstitution.getString();
207
+ context.trace(`Resolving the ${complexSubstitutionString}' complex substitution...`);
208
+ return simpleSubstitution.unifyComplexSubstitution(complexSubstitution, context, (substitution)=>{
209
+ if (substitution === null) {
210
+ return continuation();
211
+ }
212
+ const replacementSubstitution = substitution; ///
213
+ substitution = this.targetStatement.getSubstitution();
214
+ const targetSubstitution = substitution; ///
215
+ return targetSubstitution.unifySubstitution(replacementSubstitution, context, (substitutionUnifies)=>{
216
+ if (substitutionUnifies) {
233
217
  this.resolved = true;
234
218
  context.debug(`...resolved the '${complexSubstitutionString}' complex substitution.`);
235
219
  }
236
- }
237
- }
220
+ return continuation();
221
+ });
222
+ });
238
223
  }
239
224
  static name = "StatementSubstitution";
240
225
  static fromJSON(json, context) {
@@ -243,11 +228,11 @@ const _default = (0, _elements.define)(class StatementSubstitution extends _subs
243
228
  if (this.name === name) {
244
229
  (0, _context.instantiate)((context)=>{
245
230
  (0, _context.unserialises)((json, generalContext, specificContext)=>{
246
- const { string } = json, statementSubstitutionNode = (0, _instantiate.instantiateStatementSubstitution)(string, context), node = statementSubstitutionNode, breakPoint = breakPointFromJSON(json), resolved = resolvedFromStatementSubstitutionNode(statementSubstitutionNode, context), substitution = substitutionFromStatementSubstitutionNode(statementSubstitutionNode, generalContext, specificContext), targetStatement = targetStatementFromStatementSubstitutionNode(statementSubstitutionNode, generalContext), replacementStatement = replacementStatementFromStatementSubstitutionNode(statementSubstitutionNode, specificContext), contexts = [
231
+ const { string } = json, statementSubstitutionNode = (0, _instantiate.instantiateStatementSubstitution)(string, context), node = statementSubstitutionNode, breakPoint = breakPointFromJSON(json), resolved = resolvedFromStatementSubstitutionNode(statementSubstitutionNode, generalContext, specificContext), targetStatement = targetStatementFromStatementSubstitutionNode(statementSubstitutionNode, generalContext), replacementStatement = replacementStatementFromStatementSubstitutionNode(statementSubstitutionNode, specificContext), contexts = [
247
232
  generalContext,
248
233
  specificContext
249
234
  ];
250
- statementSubstitutionn = new StatementSubstitution(contexts, string, node, breakPoint, resolved, substitution, targetStatement, replacementStatement);
235
+ statementSubstitutionn = new StatementSubstitution(contexts, string, node, breakPoint, resolved, targetStatement, replacementStatement);
251
236
  }, json, context);
252
237
  }, context);
253
238
  }
@@ -258,11 +243,12 @@ const _default = (0, _elements.define)(class StatementSubstitution extends _subs
258
243
  statement = (0, _brackets.stripBracketsFromStatement)(statement, context); ///
259
244
  let statementSubstitution;
260
245
  (0, _context.ablates)((generalContext, specificContext)=>{
261
- const context = specificContext; ///
262
- (0, _context.instantiate)((context)=>{
263
- const specificContext = context, statementSubstitutionString = (0, _string.statementSubstitutionStringFromStatementAndMetavariable)(statement, metavariable), string = statementSubstitutionString, statementSubstitutionNode = (0, _instantiate.instantiateStatementSubstitution)(string, context);
264
- statementSubstitution = (0, _element.statementSubstitutionFromStatementSubstitutionNode)(statementSubstitutionNode, generalContext, specificContext);
265
- }, context);
246
+ (0, _context.instantiate)((specificContext)=>{
247
+ (0, _context.manifest)((generalContext)=>{
248
+ const statementSubstitutionString = (0, _string.statementSubstitutionStringFromStatementAndMetavariable)(statement, metavariable), string = statementSubstitutionString, context = specificContext, statementSubstitutionNode = (0, _instantiate.instantiateStatementSubstitution)(string, context);
249
+ statementSubstitution = (0, _element.statementSubstitutionFromStatementSubstitutionNode)(statementSubstitutionNode, generalContext, specificContext);
250
+ }, generalContext, specificContext);
251
+ }, specificContext);
266
252
  }, generalContext, specificContext);
267
253
  return statementSubstitution;
268
254
  }
@@ -271,23 +257,20 @@ const _default = (0, _elements.define)(class StatementSubstitution extends _subs
271
257
  statement = (0, _brackets.stripBracketsFromStatement)(statement, context); ///
272
258
  let statementSubstitution;
273
259
  (0, _context.ablates)((generalContext, specificContext)=>{
274
- const context = specificContext; ///
275
- (0, _context.instantiate)((context)=>{
276
- const specificContext = context, statementSubstitutionString = (0, _string.statementSubstitutionStringFromStatementMetavariableAndSubstitution)(statement, metavariable, substitution), string = statementSubstitutionString, statementSubstitutionNode = (0, _instantiate.instantiateStatementSubstitution)(string, context);
277
- statementSubstitution = (0, _element.statementSubstitutionFromStatementSubstitutionNode)(statementSubstitutionNode, generalContext, specificContext);
278
- }, context);
260
+ (0, _context.instantiate)((specificContext)=>{
261
+ (0, _context.manifest)((generalContext)=>{
262
+ const statementSubstitutionString = (0, _string.statementSubstitutionStringFromStatementMetavariableAndSubstitution)(statement, metavariable, substitution), string = statementSubstitutionString, context = specificContext, statementSubstitutionNode = (0, _instantiate.instantiateStatementSubstitution)(string, context);
263
+ statementSubstitution = (0, _element.statementSubstitutionFromStatementSubstitutionNode)(statementSubstitutionNode, generalContext, specificContext);
264
+ }, generalContext, specificContext);
265
+ }, specificContext);
279
266
  }, generalContext, specificContext);
280
267
  return statementSubstitution;
281
268
  }
282
269
  });
283
- function resolvedFromStatementSubstitutionNode(statementSubstitutionNode, context) {
270
+ function resolvedFromStatementSubstitutionNode(statementSubstitutionNode, generalContext, specificContext) {
284
271
  const resolved = true;
285
272
  return resolved;
286
273
  }
287
- function substitutionFromStatementSubstitutionNode(statementSubstitutionNode, context) {
288
- const substitutionNode = statementSubstitutionNode.getSubstitutionNode(), substitution = context.findSubstitutionBySubstitutionNode(substitutionNode);
289
- return substitution;
290
- }
291
274
  function targetStatementFromStatementSubstitutionNode(statementSubstitutionNode, generalContext) {
292
275
  const targetStatementNode = statementSubstitutionNode.getTargetStatementNode(), targetStatement = generalContext.findStatementByStatementNode(targetStatementNode);
293
276
  return targetStatement;
@@ -297,4 +280,4 @@ function replacementStatementFromStatementSubstitutionNode(statementSubstitution
297
280
  return replacementStatement;
298
281
  }
299
282
 
300
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbGVtZW50L3N1YnN0aXR1dGlvbi9zdGF0ZW1lbnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7IGJyZWFrUG9pbnRVdGlsaXRpZXMgfSBmcm9tIFwib2NjYW0tbGFuZ3VhZ2VzXCI7XG5cbmltcG9ydCBTdWJzdGl0dXRpb24gZnJvbSBcIi4uL3N1YnN0aXR1dGlvblwiO1xuXG5pbXBvcnQgeyBhbGwgfSBmcm9tIFwiLi4vLi4vdXRpbGl0aWVzL2NvbnRpbnVhdGlvblwiO1xuaW1wb3J0IHsgZGVmaW5lIH0gZnJvbSBcIi4uLy4uL2VsZW1lbnRzXCI7XG5pbXBvcnQgeyBzdHJpcEJyYWNrZXRzRnJvbVN0YXRlbWVudCB9IGZyb20gXCIuLi8uLi91dGlsaXRpZXMvYnJhY2tldHNcIjtcbmltcG9ydCB7IGluc3RhbnRpYXRlU3RhdGVtZW50U3Vic3RpdHV0aW9uIH0gZnJvbSBcIi4uLy4uL3Byb2Nlc3MvaW5zdGFudGlhdGVcIjtcbmltcG9ydCB7IHN0YXRlbWVudFN1YnN0aXR1dGlvbkZyb21TdGF0ZW1lbnRTdWJzdGl0dXRpb25Ob2RlIH0gZnJvbSBcIi4uLy4uL3V0aWxpdGllcy9lbGVtZW50XCI7XG5pbXBvcnQgeyBlbGlkZSwgYWJsYXRlcywgbWFuaWZlc3QsIGF0dGVtcHRzLCByZWNvbmNpbGUsIGluc3RhbnRpYXRlLCB1bnNlcmlhbGlzZXMgfSBmcm9tIFwiLi4vLi4vdXRpbGl0aWVzL2NvbnRleHRcIjtcbmltcG9ydCB7IHN0YXRlbWVudFN1YnN0aXR1dGlvblN0cmluZ0Zyb21TdGF0ZW1lbnRBbmRNZXRhdmFyaWFibGUsIHN0YXRlbWVudFN1YnN0aXR1dGlvblN0cmluZ0Zyb21TdGF0ZW1lbnRNZXRhdmFyaWFibGVBbmRTdWJzdGl0dXRpb24gfSBmcm9tIFwiLi4vLi4vdXRpbGl0aWVzL3N0cmluZ1wiO1xuXG5jb25zdCB7IGJyZWFrUG9pbnRGcm9tSlNPTiB9ID0gYnJlYWtQb2ludFV0aWxpdGllcztcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lKGNsYXNzIFN0YXRlbWVudFN1YnN0aXR1dGlvbiBleHRlbmRzIFN1YnN0aXR1dGlvbiB7XG4gIGNvbnN0cnVjdG9yKGNvbnRleHRzLCBzdHJpbmcsIG5vZGUsIGJyZWFrUG9pbnQsIHJlc29sdmVkLCBzdWJzdGl0dXRpb24sIHRhcmdldFN0YXRlbWVudCwgcmVwbGFjZW1lbnRTdGF0ZW1lbnQpIHtcbiAgICBzdXBlcihjb250ZXh0cywgc3RyaW5nLCBub2RlLCBicmVha1BvaW50KTtcblxuICAgIHRoaXMucmVzb2x2ZWQgPSByZXNvbHZlZDtcbiAgICB0aGlzLnN1YnN0aXR1dGlvbiA9IHN1YnN0aXR1dGlvbjtcbiAgICB0aGlzLnRhcmdldFN0YXRlbWVudCA9IHRhcmdldFN0YXRlbWVudDtcbiAgICB0aGlzLnJlcGxhY2VtZW50U3RhdGVtZW50ID0gcmVwbGFjZW1lbnRTdGF0ZW1lbnQ7XG4gIH1cblxuICBpc1Jlc29sdmVkKCkge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVkO1xuICB9XG5cbiAgZ2V0U3Vic3RpdHV0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnN1YnN0aXR1dGlvbjtcbiAgfVxuXG4gIGdldFRhcmdldFN0YXRlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy50YXJnZXRTdGF0ZW1lbnQ7XG4gIH1cblxuICBnZXRSZXBsYWNlbWVudFN0YXRlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5yZXBsYWNlbWVudFN0YXRlbWVudDtcbiAgfVxuXG4gIGdldFN0YXRlbWVudFN1YnN0aXR1dGlvbk5vZGUoKSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Tm9kZSgpLFxuICAgICAgICAgIHN0YXRlbWVudFN1YnN0aXR1dGlvbk5vZGUgPSBub2RlOyAvLy9cblxuICAgIHJldHVybiBzdGF0ZW1lbnRTdWJzdGl0dXRpb25Ob2RlO1xuICB9XG5cbiAgZ2V0VGFyZ2V0Tm9kZSgpIHtcbiAgICBjb25zdCB0YXJnZXRTdGF0ZW1lbnROb2RlID0gdGhpcy50YXJnZXRTdGF0ZW1lbnQuZ2V0Tm9kZSgpLFxuICAgICAgICAgIHRhcmdldE5vZGUgPSB0YXJnZXRTdGF0ZW1lbnROb2RlOyAvLy9cblxuICAgIHJldHVybiB0YXJnZXROb2RlO1xuICB9XG5cbiAgZ2V0UmVwbGFjZW1lbnROb2RlKCkge1xuICAgIGNvbnN0IHJlcGxhY2VtZW50U3RhdGVtZW50Tm9kZSA9IHRoaXMucmVwbGFjZW1lbnRTdGF0ZW1lbnQuZ2V0Tm9kZSgpLFxuICAgICAgICAgIHJlcGxhY2VtZW50Tm9kZSA9IHJlcGxhY2VtZW50U3RhdGVtZW50Tm9kZTsgLy8vXG5cbiAgICByZXR1cm4gcmVwbGFjZW1lbnROb2RlO1xuICB9XG5cbiAgZ2V0TWV0YXZhcmlhYmxlTm9kZSgpIHsgcmV0dXJuIHRoaXMudGFyZ2V0U3RhdGVtZW50LmdldE1ldGF2YXJpYWJsZU5vZGUoKTsgfVxuXG4gIGlzU2ltcGxlKCkge1xuICAgIGNvbnN0IHNpbXBsZSA9ICh0aGlzLnN1YnN0aXR1dGlvbiA9PT0gbnVsbCk7XG5cbiAgICByZXR1cm4gc2ltcGxlO1xuICB9XG5cbiAgbWF0Y2hNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpIHsgcmV0dXJuIHRoaXMudGFyZ2V0U3RhdGVtZW50Lm1hdGNoTWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKTsgfVxuXG4gIGNvbXBhcmVTdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KSB7XG4gICAgc3RhdGVtZW50ID0gc3RyaXBCcmFja2V0c0Zyb21TdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KTsgLy8vXG5cbiAgICBjb25zdCByZXBsYWNlbWVudFN0YXRlbWVudEVxdWFsVG9TdGF0ZW1lbnQgPSB0aGlzLnJlcGxhY2VtZW50U3RhdGVtZW50LmlzRXF1YWxUbyhzdGF0ZW1lbnQpLFxuICAgICAgICAgIGNvbXBhcmVzVG9TdGF0ZW1lbnQgPSByZXBsYWNlbWVudFN0YXRlbWVudEVxdWFsVG9TdGF0ZW1lbnQ7ICAvLy9cblxuICAgIHJldHVybiBjb21wYXJlc1RvU3RhdGVtZW50O1xuICB9XG5cbiAgY29tcGFyZVBhcmFtZXRlcihwYXJhbWV0ZXIpIHtcbiAgICBjb25zdCB0YXJnZXRTdGF0ZW1lbnRDb21wYXJlc1RvUGFyYW1ldGVyID0gdGhpcy50YXJnZXRTdGF0ZW1lbnQuY29tcGFyZVBhcmFtZXRlcihwYXJhbWV0ZXIpLFxuICAgICAgICAgIGNvbXBhcmVzVG9QYXJhbWV0ZXIgPSB0YXJnZXRTdGF0ZW1lbnRDb21wYXJlc1RvUGFyYW1ldGVyOyAgLy8vXG5cbiAgICByZXR1cm4gY29tcGFyZXNUb1BhcmFtZXRlcjtcbiAgfVxuXG4gIHZhbGlkYXRlKHN1YnN0aXR1dGlvbiwgY29udGV4dCwgY29udGludWF0aW5vKSB7XG4gICAgY29uc3Qgc3RhdGVtZW50U3Vic3RpdHV0aW9uU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgIC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7c3RhdGVtZW50U3Vic3RpdHV0aW9uU3RyaW5nfScgc3RhdGVtZW50IHN1YnN0aXR1dGlvbi4uLmApO1xuXG4gICAgY29uc3QgdmFsaWRTdWJzdGl0dXRpb24gPSB0aGlzLmZpbmRWYWxpZFN1YnN0aXR1dGlvbihjb250ZXh0KTtcblxuICAgIGlmICh2YWxpZFN1YnN0aXR1dGlvbiAhPT0gbnVsbCkge1xuICAgICAgY29uc3Qgc3RhdGVtZW50U3Vic3RpdHV0aW9uID0gdmFsaWRTdWJzdGl0dXRpb247ICAvLy9cblxuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udGhlICcke3N0YXRlbWVudFN1YnN0aXR1dGlvblN0cmluZ30nIHN0YXRlbWVudCBzdWJzdGl0dXRpb24gaXMgYWxyZWFkeSB2YWxpZC5gKTtcblxuICAgICAgY29udGludWF0aW5vKHN0YXRlbWVudFN1YnN0aXR1dGlvbik7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBnZW5lcmFsQ29udGV4dCA9IHRoaXMuZ2V0R2VuZXJhbENvbnRleHQoKSxcbiAgICAgICAgICBzcGVjaWZpY0NvbnRleHQgPSB0aGlzLmdldFNwZWNpZmljQ29udGV4dCgpO1xuXG4gICAgYXR0ZW1wdHMoKGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IHZhbGlkYXRlVGFyZ2V0U3RhdGVtZW50ID0gdGhpcy52YWxpZGF0ZVRhcmdldFN0YXRlbWVudC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgdmFsaWRhdGVSZXBsYWNlbWVudFN0YXRlbWVudCA9IHRoaXMudmFsaWRhdGVSZXBsYWNlbWVudFN0YXRlbWVudC5iaW5kKHRoaXMpO1xuXG4gICAgICBhbGwoW1xuICAgICAgICB2YWxpZGF0ZVRhcmdldFN0YXRlbWVudCxcbiAgICAgICAgdmFsaWRhdGVSZXBsYWNlbWVudFN0YXRlbWVudCxcbiAgICAgICAgKGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQsIGNvbnRpbnVhdGlubykgPT4ge1xuICAgICAgICAgIHRoaXMudmFsaWRhdGVTdWJzdGl0dXRpb24oc3Vic3RpdHV0aW9uLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0LCBjb250aW51YXRpbm8pO1xuICAgICAgICB9XG4gICAgICBdLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0LCAodmFsaWRhdGVzKSA9PiB7XG4gICAgICAgIGxldCBzdGF0ZW1lbnRTdWJzdGl0dXRpb24gPSBudWxsO1xuXG4gICAgICAgIGlmICh2YWxpZGF0ZXMpIHtcbiAgICAgICAgICBjb25zdCBzdWJzdGl0dXRpb24gPSB0aGlzOyAgLy8vXG5cbiAgICAgICAgICBzdGF0ZW1lbnRTdWJzdGl0dXRpb24gPSBzdWJzdGl0dXRpb247IC8vL1xuXG4gICAgICAgICAgY29udGV4dC5hZGRTdWJzdGl0dXRpb24oc3Vic3RpdHV0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWxpZGF0ZXMpIHtcbiAgICAgICAgICB0aGlzLmNvbW1pdChnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWxpZGF0ZXMpIHtcbiAgICAgICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke3N0YXRlbWVudFN1YnN0aXR1dGlvblN0cmluZ30nIHN0YXRlbWVudCBzdWJzdGl0dXRpb24uYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250aW51YXRpbm8oc3RhdGVtZW50U3Vic3RpdHV0aW9uKTtcbiAgICAgIH0pO1xuICAgIH0sIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpO1xuICB9XG5cbiAgdmFsaWRhdGVTdWJzdGl0dXRpb24oc3Vic3RpdHV0aW9uLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0LCBjb250aW51YXRpbm8pIHtcbiAgICBpZiAoc3Vic3RpdHV0aW9uID09PSBudWxsKSB7XG4gICAgICBjb25zdCBzdWJzdGl0dXRpb25WYWxpZGF0ZXMgPSB0cnVlO1xuXG4gICAgICBjb250aW51YXRpbm8oc3Vic3RpdHV0aW9uVmFsaWRhdGVzKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBzdWJzdGl0dXRpb25WYWxpZGF0ZXM7XG5cbiAgICBjb25zdCBjb250ZXh0ID0gZ2VuZXJhbENvbnRleHQsICAvLy9cbiAgICAgICAgICBzdGF0ZW1lbnRTdWJzdGl0dXRpb25TdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke3N0YXRlbWVudFN1YnN0aXR1dGlvblN0cmluZ30nIHN0YXRlbWVudCBzdWJzdGl0dXRpb24ncyBzdWJzdGl0dXRpb24uLi5gKTtcblxuICAgIHRoaXMuc3Vic3RpdHV0aW9uID0gc3Vic3RpdHV0aW9uO1xuXG4gICAgc3Vic3RpdHV0aW9uVmFsaWRhdGVzID0gdHJ1ZTtcblxuICAgIGlmIChzdWJzdGl0dXRpb25WYWxpZGF0ZXMpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRld2QgdGhlICcke3N0YXRlbWVudFN1YnN0aXR1dGlvblN0cmluZ30nIHN0YXRlbWVudCBzdWJzdGl0dXRpb24ncyBzdWJzdGl0dXRpb24uYCk7XG4gICAgfVxuXG4gICAgY29udGludWF0aW5vKHN1YnN0aXR1dGlvblZhbGlkYXRlcyk7XG4gIH1cblxuICB2YWxpZGF0ZVRhcmdldFN0YXRlbWVudChnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0LCBjb250aW51YXRpbm8pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gZ2VuZXJhbENvbnRleHQsICAvLy9cbiAgICAgICAgICBzdGF0ZW1lbnRTdWJzdGl0dXRpb25TdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdWJzdGl0dXRpb25TdHJpbmd9JyBzdGF0ZW1lbnQgc3Vic3RpdHV0aW9uJ3MgdGFyZ2V0IHN0YXRlbWVudC4uLmApO1xuXG4gICAgY29uc3QgdGFyZ2V0U3RhdGVtZW50U2luZ3VsYXIgPSB0aGlzLnRhcmdldFN0YXRlbWVudC5pc1Npbmd1bGFyKCk7XG5cbiAgICBpZiAoIXRhcmdldFN0YXRlbWVudFNpbmd1bGFyKSB7XG4gICAgICBjb25zdCB0YXJnZXRTdGF0ZW1lbnRTdHJpbmcgPSB0aGlzLnRhcmdldFN0YXRlbWVudC5nZXRTdHJpbmcoKSxcbiAgICAgICAgICAgIHRhcmdldFN0YXRlbWVudFZhbGlkYXRlcyA9IGZhbHNlO1xuXG4gICAgICBjb250ZXh0LmRlYnVnKGBUaGUgJyR7dGFyZ2V0U3RhdGVtZW50U3RyaW5nfScgdGFyZ2V0IHN0YXRlbWVudCBpcyBub3Qgc2luZ3VsYXIuYCk7XG5cbiAgICAgIGNvbnRpbnVhdGlubyh0YXJnZXRTdGF0ZW1lbnRWYWxpZGF0ZXMpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbWFuaWZlc3QoKGNvbnRleHQpID0+IHtcbiAgICAgIGVsaWRlKChjb250ZXh0KSA9PiB7XG4gICAgICAgIHRoaXMudGFyZ2V0U3RhdGVtZW50LnZhbGlkYXRlKGNvbnRleHQsICh0YXJnZXRTdGF0ZW1lbnQpID0+IHtcbiAgICAgICAgICBsZXQgdGFyZ2V0U3RhdGVtZW50VmFsaWRhdGVzID0gZmFsc2U7XG5cbiAgICAgICAgICBpZiAodGFyZ2V0U3RhdGVtZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0YXJnZXRTdGF0ZW1lbnRWYWxpZGF0ZXMgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0YXJnZXRTdGF0ZW1lbnRWYWxpZGF0ZXMpIHtcbiAgICAgICAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7c3RhdGVtZW50U3Vic3RpdHV0aW9uU3RyaW5nfScgc3RhdGVtZW50IHN1YnN0aXR1dGlvbidzIHRhcmdldCBzdGF0ZW1lbnQuLi5gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250aW51YXRpbm8odGFyZ2V0U3RhdGVtZW50VmFsaWRhdGVzKTtcbiAgICAgICAgfSk7XG4gICAgICB9LCBjb250ZXh0KTtcbiAgICB9LCBzcGVjaWZpY0NvbnRleHQsIGNvbnRleHQpO1xuICB9XG5cbiAgdmFsaWRhdGVSZXBsYWNlbWVudFN0YXRlbWVudChnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0LCBjb250aW51YXRpbm8pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gc3BlY2lmaWNDb250ZXh0LCAgLy8vXG4gICAgICAgICAgc3RhdGVtZW50U3Vic3RpdHV0aW9uU3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgIC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7c3RhdGVtZW50U3Vic3RpdHV0aW9uU3RyaW5nfScgc3RhdGVtZW50IHN1YnN0aXR1dGlvbidzIHJlcGxhY2VtZW50IHN0YXRlbWVudC4uLmApO1xuXG4gICAgZWxpZGUoKGNvbnRleHQpID0+IHtcbiAgICAgIHRoaXMucmVwbGFjZW1lbnRTdGF0ZW1lbnQudmFsaWRhdGUoY29udGV4dCwgKHJlcGxhY2VtZW50U3RhdGVtZW50KSA9PiB7XG4gICAgICAgIGxldCByZXBsYWNlbWVudFN0YXRlbWVudFZhbGlkYXRlcyA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChyZXBsYWNlbWVudFN0YXRlbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAgIHJlcGxhY2VtZW50U3RhdGVtZW50VmFsaWRhdGVzID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXBsYWNlbWVudFN0YXRlbWVudFZhbGlkYXRlcykge1xuICAgICAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7c3RhdGVtZW50U3Vic3RpdHV0aW9uU3RyaW5nfScgc3RhdGVtZW50IHN1YnN0aXR1dGlvbidzIHJlcGxhY2VtZW50IHN0YXRlbWVudC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRpbnVhdGlubyhyZXBsYWNlbWVudFN0YXRlbWVudFZhbGlkYXRlcyk7XG4gICAgICB9KTtcbiAgICB9LCBjb250ZXh0KTtcbiAgfVxuXG4gIHVuaWZ5VGFyZ2V0U3RhdGVtZW50KHN1YnN0aXR1dGlvbiwgY29udGV4dCkge1xuICAgIGxldCB0YXJnZXRTdGF0ZW1uZW50VW5pZmllcyA9IGZhbHNlO1xuXG4gICAgY29uc3QgZ2VuZXJhbFN1YnN0aXR1dGlvbiA9IHRoaXMsIC8vL1xuICAgICAgICAgIHNwZWNpZmljU3Vic3RpdHV0aW9uID0gc3Vic3RpdHV0aW9uLFxuICAgICAgICAgIGdlbmVyYWxTdWJzdGl0dXRpb25TdHJpbmcgPSBnZW5lcmFsU3Vic3RpdHV0aW9uLmdldFN0cmluZygpLFxuICAgICAgICAgIHNwZWNpZmljU3Vic3RpdHV0aW9uU3RyaW5nID0gc3BlY2lmaWNTdWJzdGl0dXRpb24uZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBVbmlmeWluZyB0aGUgJyR7c3BlY2lmaWNTdWJzdGl0dXRpb25TdHJpbmd9JyBzdWJzdGl0dXRpb24ncyB0YXJnZXQgc3RhdGVtZW50IHdpdGggdGhlICcke2dlbmVyYWxTdWJzdGl0dXRpb25TdHJpbmd9JyBzdWJzdGl0dXRpb24ncyB0YXJnZXQgc3RhdGVtZW50Li4uYCk7XG5cbiAgICBjb25zdCBnZW5lcmFsU3Vic3RpdHV0aW9uR2VuZXJhbENvbnRleHQgPSBnZW5lcmFsU3Vic3RpdHV0aW9uLmdldEdlbmVyYWxDb250ZXh0KCksXG4gICAgICAgICAgc3BlY2lmaWNTdWJzdGl0dXRpb25HZW5lcmFsQ29udGV4dCA9IHNwZWNpZmljU3Vic3RpdHV0aW9uLmdldEdlbmVyYWxDb250ZXh0KCksXG4gICAgICAgICAgZ2VuZXJhbFN1YnN0aXR1dGlvblRhcmdldFN0YXRlbWVudCA9IGdlbmVyYWxTdWJzdGl0dXRpb24uZ2V0VGFyZ2V0U3RhdGVtZW50KCksXG4gICAgICAgICAgc3BlY2lmaWNTdWJzdGl0dXRpb25UYXJnZXRTdGF0ZW1lbnQgPSBzcGVjaWZpY1N1YnN0aXR1dGlvbi5nZXRUYXJnZXRTdGF0ZW1lbnQoKSxcbiAgICAgICAgICBnZW5lcmFsQ29udGV4dCA9IGdlbmVyYWxTdWJzdGl0dXRpb25HZW5lcmFsQ29udGV4dCwgIC8vL1xuICAgICAgICAgIHNwZWNpZmljQ29udGV4dCA9IHNwZWNpZmljU3Vic3RpdHV0aW9uR2VuZXJhbENvbnRleHQsICAvLy9cbiAgICAgICAgICBnZW5lcmFsU3RhdGVtZW50ID0gZ2VuZXJhbFN1YnN0aXR1dGlvblRhcmdldFN0YXRlbWVudCwgLy8vXG4gICAgICAgICAgc3BlY2lmaWNTdGF0ZW1lbnQgPSBzcGVjaWZpY1N1YnN0aXR1dGlvblRhcmdldFN0YXRlbWVudDsgLy8vXG5cbiAgICByZWNvbmNpbGUoKHNwZWNpZmljQ29udGV4dCkgPT4ge1xuICAgICAgY29uc3Qgc3RhdGVtZW50VW5pZmllcyA9IGdlbmVyYWxTdGF0ZW1lbnQudW5pZnlTdGF0ZW1lbnQoc3BlY2lmaWNTdGF0ZW1lbnQsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpO1xuXG4gICAgICBpZiAoc3RhdGVtZW50VW5pZmllcykge1xuICAgICAgICBzcGVjaWZpY0NvbnRleHQuY29tbWl0KGNvbnRleHQpO1xuXG4gICAgICAgIHRhcmdldFN0YXRlbW5lbnRVbmlmaWVzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9LCBzcGVjaWZpY0NvbnRleHQpO1xuXG4gICAgaWYgKHRhcmdldFN0YXRlbW5lbnRVbmlmaWVzKSB7XG4gICAgICBjb250ZXh0LnRyYWNlKGAuLi51bmlmaWVkIHRoZSAnJHtzcGVjaWZpY1N1YnN0aXR1dGlvblN0cmluZ30nIHN1YnN0aXR1dGlvbidzIHRhcmdldCBzdGF0ZW1lbnQgd2l0aCB0aGUgJyR7Z2VuZXJhbFN1YnN0aXR1dGlvblN0cmluZ30nIHN1YnN0aXR1dGlvbidzIHRhcmdldCBzdGF0ZW1lbnQuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldFN0YXRlbW5lbnRVbmlmaWVzO1xuICB9XG5cbiAgdW5pZnlSZXBsYWNlbWVudFN0YXRlbWVudChzdWJzdGl0dXRpb24sIGNvbnRleHQpIHtcbiAgICBsZXQgcmVwbGFjZW1lbnRTdGF0ZW1uZW50VW5pZmllcyA9IGZhbHNlO1xuXG4gICAgY29uc3QgZ2VuZXJhbFN1YnN0aXR1dGlvbiA9IHRoaXMsIC8vL1xuICAgICAgICAgIHNwZWNpZmljU3Vic3RpdHV0aW9uID0gc3Vic3RpdHV0aW9uLFxuICAgICAgICAgIGdlbmVyYWxTdWJzdGl0dXRpb25TdHJpbmcgPSBnZW5lcmFsU3Vic3RpdHV0aW9uLmdldFN0cmluZygpLFxuICAgICAgICAgIHNwZWNpZmljU3Vic3RpdHV0aW9uU3RyaW5nID0gc3BlY2lmaWNTdWJzdGl0dXRpb24uZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBVbmlmeWluZyB0aGUgJyR7c3BlY2lmaWNTdWJzdGl0dXRpb25TdHJpbmd9JyBzdWJzdGl0dXRpb24ncyByZXBsYWNlbWVudCBzdGF0ZW1lbnQgd2l0aCB0aGUgJyR7Z2VuZXJhbFN1YnN0aXR1dGlvblN0cmluZ30nIHN1YnN0aXR1dGlvbidzIHJlcGxhY2VtZW50IHN0YXRlbWVudC4uLmApO1xuXG4gICAgY29uc3QgZ2VuZXJhbFN1YnN0aXR1dGlvblNwZWNpZmljQ29udGV4dCA9IGdlbmVyYWxTdWJzdGl0dXRpb24uZ2V0U3BlY2lmaWNDb250ZXh0KCksXG4gICAgICAgICAgc3BlY2lmaWNTdWJzdGl0dXRpb25TcGVjaWZpY0NvbnRleHQgPSBzcGVjaWZpY1N1YnN0aXR1dGlvbi5nZXRTcGVjaWZpY0NvbnRleHQoKSxcbiAgICAgICAgICBnZW5lcmFsU3Vic3RpdHV0aW9uUmVwbGFjZW1lbnRTdGF0ZW1lbnQgPSBnZW5lcmFsU3Vic3RpdHV0aW9uLmdldFJlcGxhY2VtZW50U3RhdGVtZW50KCksXG4gICAgICAgICAgc3BlY2lmaWNTdWJzdGl0dXRpb25SZXBsYWNlbWVudFN0YXRlbWVudCA9IHNwZWNpZmljU3Vic3RpdHV0aW9uLmdldFJlcGxhY2VtZW50U3RhdGVtZW50KCksXG4gICAgICAgICAgZ2VuZXJhbENvbnRleHQgPSBnZW5lcmFsU3Vic3RpdHV0aW9uU3BlY2lmaWNDb250ZXh0LCAgLy8vXG4gICAgICAgICAgc3BlY2lmaWNDb250ZXh0ID0gc3BlY2lmaWNTdWJzdGl0dXRpb25TcGVjaWZpY0NvbnRleHQsICAvLy9cbiAgICAgICAgICBnZW5lcmFsU3RhdGVtZW50ID0gZ2VuZXJhbFN1YnN0aXR1dGlvblJlcGxhY2VtZW50U3RhdGVtZW50LCAvLy9cbiAgICAgICAgICBzcGVjaWZpY1N0YXRlbWVudCA9IHNwZWNpZmljU3Vic3RpdHV0aW9uUmVwbGFjZW1lbnRTdGF0ZW1lbnQ7IC8vL1xuXG4gICAgcmVjb25jaWxlKChzcGVjaWZpY0NvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IHN0YXRlbWVudFVuaWZpZXMgPSBnZW5lcmFsU3RhdGVtZW50LnVuaWZ5U3RhdGVtZW50KHNwZWNpZmljU3RhdGVtZW50LCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KTtcblxuICAgICAgaWYgKHN0YXRlbWVudFVuaWZpZXMpIHtcbiAgICAgICAgc3BlY2lmaWNDb250ZXh0LmNvbW1pdChjb250ZXh0KTtcblxuICAgICAgICByZXBsYWNlbWVudFN0YXRlbW5lbnRVbmlmaWVzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9LCBzcGVjaWZpY0NvbnRleHQpO1xuXG4gICAgaWYgKHJlcGxhY2VtZW50U3RhdGVtbmVudFVuaWZpZXMpIHtcbiAgICAgIGNvbnRleHQudHJhY2UoYC4uLnVuaWZpZWQgdGhlICcke3NwZWNpZmljU3Vic3RpdHV0aW9uU3RyaW5nfScgc3Vic3RpdHV0aW9uJ3MgcmVwbGFjZW1lbnQgc3RhdGVtZW50IHdpdGggdGhlICcke2dlbmVyYWxTdWJzdGl0dXRpb25TdHJpbmd9JyBzdWJzdGl0dXRpb24ncyByZXBsYWNlbWVudCBzdGF0ZW1lbnQuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcGxhY2VtZW50U3RhdGVtbmVudFVuaWZpZXM7XG4gIH1cblxuICB1bmlmeUNvbXBsZXhTdWJzdGl0dXRpb24oY29tcGxleFN1YnN0aXR1dGlvbiwgY29udGV4dCkge1xuICAgIGxldCBzdWJzdGl0dXRpb24gPSBudWxsO1xuXG4gICAgY29uc3Qgc2ltcGxlU3Vic3RpdHV0aW9uID0gdGhpcywgIC8vL1xuICAgICAgICAgIHNpbXBsZVN1YnN0aXR1dGlvblN0cmluZyA9IHNpbXBsZVN1YnN0aXR1dGlvbi5nZXRTdHJpbmcoKSwgIC8vL1xuICAgICAgICAgIGNvbXBsZXhTdWJzdGl0dXRpb25TdHJpbmcgPSBjb21wbGV4U3Vic3RpdHV0aW9uLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBVbmlmeWluZyB0aGUgJyR7Y29tcGxleFN1YnN0aXR1dGlvblN0cmluZ30nIGNvbXBsZXggc3Vic3RpdHV0aW9uIHdpdGggdGhlICcke3NpbXBsZVN1YnN0aXR1dGlvblN0cmluZ30nIHNpbXBsZSBzdWJzdGl0dXRpb24uLi5gKTtcblxuICAgIGxldCBzaW1wbGVTdWJzdGl0dXRpb25VbmlmaWVzID0gZmFsc2U7XG5cbiAgICByZWNvbmNpbGUoKGNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IHJlcGxhY2VtZW50U3RhdGVtZW50VW5pZmllcyA9IHRoaXMudW5pZnlSZXBsYWNlbWVudFN0YXRlbWVudChjb21wbGV4U3Vic3RpdHV0aW9uLCBjb250ZXh0KTtcblxuICAgICAgaWYgKHJlcGxhY2VtZW50U3RhdGVtZW50VW5pZmllcykge1xuICAgICAgICBjb25zdCBzb2xlTm9uVHJpdmlhbERlcml2ZWRTdWJzdGl0dXRpb24gPSBjb250ZXh0LmdldFNvbGVOb25Ucml2aWFsRGVyaXZlZFN1YnN0aXR1dGlvbigpO1xuXG4gICAgICAgIHN1YnN0aXR1dGlvbiA9IHNvbGVOb25Ucml2aWFsRGVyaXZlZFN1YnN0aXR1dGlvbjsgIC8vL1xuICAgICAgfVxuICAgIH0sIGNvbnRleHQpO1xuXG4gICAgaWYgKHN1YnN0aXR1dGlvbiAhPT0gbnVsbCkge1xuICAgICAgc2ltcGxlU3Vic3RpdHV0aW9uVW5pZmllcyA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHNpbXBsZVN1YnN0aXR1dGlvblVuaWZpZXMpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnVuaWZpZWQgdGhlICcke2NvbXBsZXhTdWJzdGl0dXRpb25TdHJpbmd9JyBjb21wbGV4IHN1YnN0aXR1dGlvbiB3aXRoIHRoZSAnJHtzaW1wbGVTdWJzdGl0dXRpb25TdHJpbmd9JyBzaW1wbGUgc3Vic3RpdHV0aW9uLmApO1xuICAgIH1cblxuICAgIHJldHVybiBzdWJzdGl0dXRpb247XG4gIH1cblxuICByZXNvbHZlKGNvbnRleHQpIHtcbiAgICBjb25zdCBtZXRhdmFyaWFibGVOb2RlID0gdGhpcy5nZXRNZXRhdmFyaWFibGVOb2RlKCksXG4gICAgICAgICAgc2ltcGxlRGVyaXZlZFN1YnN0aXR1dGlvbiA9IGNvbnRleHQuZmluZFNpbXBsZURlcml2ZWRTdWJzdGl0dXRpb25CeU1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSk7XG5cbiAgICBpZiAoc2ltcGxlRGVyaXZlZFN1YnN0aXR1dGlvbiAhPT0gbnVsbCkge1xuICAgICAgY29uc3Qgc2ltcGxlU3Vic3RpdHV0aW9uID0gc2ltcGxlRGVyaXZlZFN1YnN0aXR1dGlvbiwgLy8vXG4gICAgICAgICAgICBjb21wbGV4U3Vic3RpdHV0aW9uID0gdGhpcywgLy8vXG4gICAgICAgICAgICBjb21wbGV4U3Vic3RpdHV0aW9uU3RyaW5nID0gY29tcGxleFN1YnN0aXR1dGlvbi5nZXRTdHJpbmcoKTtcblxuICAgICAgY29udGV4dC50cmFjZShgUmVzb2x2aW5nIHRoZSAke2NvbXBsZXhTdWJzdGl0dXRpb25TdHJpbmd9JyBjb21wbGV4IHN1YnN0aXR1dGlvbi4uLmApO1xuXG4gICAgICBjb25zdCBzdWJzdGl0dXRpb24gPSBzaW1wbGVTdWJzdGl0dXRpb24udW5pZnlDb21wbGV4U3Vic3RpdHV0aW9uKGNvbXBsZXhTdWJzdGl0dXRpb24sIGNvbnRleHQpO1xuXG4gICAgICBpZiAoc3Vic3RpdHV0aW9uICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHNpbXBsZVN1YnN0aXR1dGlvblVuaWZpZXMgPSB0aGlzLnN1YnN0aXR1dGlvbi51bmlmeVN1YnN0aXR1dGlvbihzdWJzdGl0dXRpb24sIGNvbnRleHQpO1xuXG4gICAgICAgIGlmIChzaW1wbGVTdWJzdGl0dXRpb25VbmlmaWVzKSB7XG4gICAgICAgICAgdGhpcy5yZXNvbHZlZCA9IHRydWU7XG5cbiAgICAgICAgICBjb250ZXh0LmRlYnVnKGAuLi5yZXNvbHZlZCB0aGUgJyR7Y29tcGxleFN1YnN0aXR1dGlvblN0cmluZ30nIGNvbXBsZXggc3Vic3RpdHV0aW9uLmApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIG5hbWUgPSBcIlN0YXRlbWVudFN1YnN0aXR1dGlvblwiO1xuXG4gIHN0YXRpYyBmcm9tSlNPTihqc29uLCBjb250ZXh0KSB7XG4gICAgbGV0IHN0YXRlbWVudFN1YnN0aXR1dGlvbm4gPSBudWxsO1xuXG4gICAgY29uc3QgeyBuYW1lIH0gPSBqc29uO1xuXG4gICAgaWYgKHRoaXMubmFtZSA9PT0gbmFtZSkge1xuICAgICAgaW5zdGFudGlhdGUoKGNvbnRleHQpID0+IHtcbiAgICAgICAgdW5zZXJpYWxpc2VzKChqc29uLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBzdHJpbmcgfSA9IGpzb24sXG4gICAgICAgICAgICAgICAgc3RhdGVtZW50U3Vic3RpdHV0aW9uTm9kZSA9IGluc3RhbnRpYXRlU3RhdGVtZW50U3Vic3RpdHV0aW9uKHN0cmluZywgY29udGV4dCksXG4gICAgICAgICAgICAgICAgbm9kZSA9IHN0YXRlbWVudFN1YnN0aXR1dGlvbk5vZGUsIC8vL1xuICAgICAgICAgICAgICAgIGJyZWFrUG9pbnQgPSBicmVha1BvaW50RnJvbUpTT04oanNvbiksXG4gICAgICAgICAgICAgICAgcmVzb2x2ZWQgPSByZXNvbHZlZEZyb21TdGF0ZW1lbnRTdWJzdGl0dXRpb25Ob2RlKHN0YXRlbWVudFN1YnN0aXR1dGlvbk5vZGUsIGNvbnRleHQpLFxuICAgICAgICAgICAgICAgIHN1YnN0aXR1dGlvbiA9IHN1YnN0aXR1dGlvbkZyb21TdGF0ZW1lbnRTdWJzdGl0dXRpb25Ob2RlKHN0YXRlbWVudFN1YnN0aXR1dGlvbk5vZGUsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpLFxuICAgICAgICAgICAgICAgIHRhcmdldFN0YXRlbWVudCA9IHRhcmdldFN0YXRlbWVudEZyb21TdGF0ZW1lbnRTdWJzdGl0dXRpb25Ob2RlKHN0YXRlbWVudFN1YnN0aXR1dGlvbk5vZGUsIGdlbmVyYWxDb250ZXh0KSxcbiAgICAgICAgICAgICAgICByZXBsYWNlbWVudFN0YXRlbWVudCA9IHJlcGxhY2VtZW50U3RhdGVtZW50RnJvbVN0YXRlbWVudFN1YnN0aXR1dGlvbk5vZGUoc3RhdGVtZW50U3Vic3RpdHV0aW9uTm9kZSwgc3BlY2lmaWNDb250ZXh0KSxcbiAgICAgICAgICAgICAgICBjb250ZXh0cyA9IFtcbiAgICAgICAgICAgICAgICAgIGdlbmVyYWxDb250ZXh0LFxuICAgICAgICAgICAgICAgICAgc3BlY2lmaWNDb250ZXh0XG4gICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgIHN0YXRlbWVudFN1YnN0aXR1dGlvbm4gPSBuZXcgU3RhdGVtZW50U3Vic3RpdHV0aW9uKGNvbnRleHRzLCBzdHJpbmcsIG5vZGUsIGJyZWFrUG9pbnQsIHJlc29sdmVkLCBzdWJzdGl0dXRpb24sIHRhcmdldFN0YXRlbWVudCwgcmVwbGFjZW1lbnRTdGF0ZW1lbnQpO1xuICAgICAgICB9LCBqc29uLCBjb250ZXh0KTtcbiAgICAgIH0sIGNvbnRleHQpO1xuICAgIH1cblxuICAgIHJldHVybiBzdGF0ZW1lbnRTdWJzdGl0dXRpb25uO1xuICB9XG5cbiAgc3RhdGljIGZyb21TdGF0ZW1lbnRBbmRNZXRhdmFyaWFibGUoc3RhdGVtZW50LCBtZXRhdmFyaWFibGUsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gc3BlY2lmaWNDb250ZXh0OyAgLy8vXG5cbiAgICBzdGF0ZW1lbnQgPSBzdHJpcEJyYWNrZXRzRnJvbVN0YXRlbWVudChzdGF0ZW1lbnQsIGNvbnRleHQpOyAvLy9cblxuICAgIGxldCBzdGF0ZW1lbnRTdWJzdGl0dXRpb247XG5cbiAgICBhYmxhdGVzKChnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0ID0gc3BlY2lmaWNDb250ZXh0OyAgLy8vXG5cbiAgICAgIGluc3RhbnRpYXRlKChjb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IHNwZWNpZmljQ29udGV4dCA9IGNvbnRleHQsICAvLy9cbiAgICAgICAgICAgICAgc3RhdGVtZW50U3Vic3RpdHV0aW9uU3RyaW5nID0gc3RhdGVtZW50U3Vic3RpdHV0aW9uU3RyaW5nRnJvbVN0YXRlbWVudEFuZE1ldGF2YXJpYWJsZShzdGF0ZW1lbnQsIG1ldGF2YXJpYWJsZSksXG4gICAgICAgICAgICAgIHN0cmluZyA9IHN0YXRlbWVudFN1YnN0aXR1dGlvblN0cmluZywgLy8vXG4gICAgICAgICAgICAgIHN0YXRlbWVudFN1YnN0aXR1dGlvbk5vZGUgPSBpbnN0YW50aWF0ZVN0YXRlbWVudFN1YnN0aXR1dGlvbihzdHJpbmcsIGNvbnRleHQpO1xuXG4gICAgICAgIHN0YXRlbWVudFN1YnN0aXR1dGlvbiA9IHN0YXRlbWVudFN1YnN0aXR1dGlvbkZyb21TdGF0ZW1lbnRTdWJzdGl0dXRpb25Ob2RlKHN0YXRlbWVudFN1YnN0aXR1dGlvbk5vZGUsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpO1xuICAgICAgfSwgY29udGV4dCk7XG4gICAgfSwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCk7XG5cbiAgICByZXR1cm4gc3RhdGVtZW50U3Vic3RpdHV0aW9uO1xuICB9XG5cbiAgc3RhdGljIGZyb21TdGF0ZW1lbnRNZXRhdmFyaWFibGVBbmRTdWJzdGl0dXRpb24oc3RhdGVtZW50LCBtZXRhdmFyaWFibGUsIHN1YnN0aXR1dGlvbiwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCkge1xuICAgIGNvbnN0IGNvbnRleHQgPSBzcGVjaWZpY0NvbnRleHQ7ICAvLy9cblxuICAgIHN0YXRlbWVudCA9IHN0cmlwQnJhY2tldHNGcm9tU3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCk7IC8vL1xuXG4gICAgbGV0IHN0YXRlbWVudFN1YnN0aXR1dGlvbjtcblxuICAgIGFibGF0ZXMoKGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBzcGVjaWZpY0NvbnRleHQ7ICAvLy9cblxuICAgICAgaW5zdGFudGlhdGUoKGNvbnRleHQpID0+IHtcbiAgICAgICAgY29uc3Qgc3BlY2lmaWNDb250ZXh0ID0gY29udGV4dCwgIC8vL1xuICAgICAgICAgICAgICBzdGF0ZW1lbnRTdWJzdGl0dXRpb25TdHJpbmcgPSBzdGF0ZW1lbnRTdWJzdGl0dXRpb25TdHJpbmdGcm9tU3RhdGVtZW50TWV0YXZhcmlhYmxlQW5kU3Vic3RpdHV0aW9uKHN0YXRlbWVudCwgbWV0YXZhcmlhYmxlLCBzdWJzdGl0dXRpb24pLFxuICAgICAgICAgICAgICBzdHJpbmcgPSBzdGF0ZW1lbnRTdWJzdGl0dXRpb25TdHJpbmcsIC8vL1xuICAgICAgICAgICAgICBzdGF0ZW1lbnRTdWJzdGl0dXRpb25Ob2RlID0gaW5zdGFudGlhdGVTdGF0ZW1lbnRTdWJzdGl0dXRpb24oc3RyaW5nLCBjb250ZXh0KTtcblxuICAgICAgICBzdGF0ZW1lbnRTdWJzdGl0dXRpb24gPSBzdGF0ZW1lbnRTdWJzdGl0dXRpb25Gcm9tU3RhdGVtZW50U3Vic3RpdHV0aW9uTm9kZShzdGF0ZW1lbnRTdWJzdGl0dXRpb25Ob2RlLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KTtcbiAgICAgIH0sIGNvbnRleHQpO1xuICAgIH0sIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpO1xuXG4gICAgcmV0dXJuIHN0YXRlbWVudFN1YnN0aXR1dGlvbjtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIHJlc29sdmVkRnJvbVN0YXRlbWVudFN1YnN0aXR1dGlvbk5vZGUoc3RhdGVtZW50U3Vic3RpdHV0aW9uTm9kZSwgY29udGV4dCkge1xuICBjb25zdCByZXNvbHZlZCA9IHRydWU7XG5cbiAgcmV0dXJuIHJlc29sdmVkO1xufVxuXG5mdW5jdGlvbiBzdWJzdGl0dXRpb25Gcm9tU3RhdGVtZW50U3Vic3RpdHV0aW9uTm9kZShzdGF0ZW1lbnRTdWJzdGl0dXRpb25Ob2RlLCBjb250ZXh0KSB7XG4gIGNvbnN0IHN1YnN0aXR1dGlvbk5vZGUgPSBzdGF0ZW1lbnRTdWJzdGl0dXRpb25Ob2RlLmdldFN1YnN0aXR1dGlvbk5vZGUoKSxcbiAgICAgICAgc3Vic3RpdHV0aW9uID0gY29udGV4dC5maW5kU3Vic3RpdHV0aW9uQnlTdWJzdGl0dXRpb25Ob2RlKHN1YnN0aXR1dGlvbk5vZGUpO1xuXG4gIHJldHVybiBzdWJzdGl0dXRpb247XG59XG5cbmZ1bmN0aW9uIHRhcmdldFN0YXRlbWVudEZyb21TdGF0ZW1lbnRTdWJzdGl0dXRpb25Ob2RlKHN0YXRlbWVudFN1YnN0aXR1dGlvbk5vZGUsIGdlbmVyYWxDb250ZXh0KSB7XG4gIGNvbnN0IHRhcmdldFN0YXRlbWVudE5vZGUgPSBzdGF0ZW1lbnRTdWJzdGl0dXRpb25Ob2RlLmdldFRhcmdldFN0YXRlbWVudE5vZGUoKSxcbiAgICAgICAgdGFyZ2V0U3RhdGVtZW50ID0gZ2VuZXJhbENvbnRleHQuZmluZFN0YXRlbWVudEJ5U3RhdGVtZW50Tm9kZSh0YXJnZXRTdGF0ZW1lbnROb2RlKTtcblxuICByZXR1cm4gdGFyZ2V0U3RhdGVtZW50O1xufVxuXG5mdW5jdGlvbiByZXBsYWNlbWVudFN0YXRlbWVudEZyb21TdGF0ZW1lbnRTdWJzdGl0dXRpb25Ob2RlKHN0YXRlbWVudFN1YnN0aXR1dGlvbk5vZGUsIHNwZWNpZmljQ29udGV4dCkge1xuICBjb25zdCByZXBsYWNlbWVudFN0YXRlbWVudE5vZGUgPSBzdGF0ZW1lbnRTdWJzdGl0dXRpb25Ob2RlLmdldFJlcGxhY2VtZW50U3RhdGVtZW50Tm9kZSgpLFxuICAgICAgICByZXBsYWNlbWVudFN0YXRlbWVudCA9IHNwZWNpZmljQ29udGV4dC5maW5kU3RhdGVtZW50QnlTdGF0ZW1lbnROb2RlKHJlcGxhY2VtZW50U3RhdGVtZW50Tm9kZSk7XG5cbiAgcmV0dXJuIHJlcGxhY2VtZW50U3RhdGVtZW50O1xufVxuIl0sIm5hbWVzIjpbImJyZWFrUG9pbnRGcm9tSlNPTiIsImJyZWFrUG9pbnRVdGlsaXRpZXMiLCJkZWZpbmUiLCJTdGF0ZW1lbnRTdWJzdGl0dXRpb24iLCJTdWJzdGl0dXRpb24iLCJjb250ZXh0cyIsInN0cmluZyIsIm5vZGUiLCJicmVha1BvaW50IiwicmVzb2x2ZWQiLCJzdWJzdGl0dXRpb24iLCJ0YXJnZXRTdGF0ZW1lbnQiLCJyZXBsYWNlbWVudFN0YXRlbWVudCIsImlzUmVzb2x2ZWQiLCJnZXRTdWJzdGl0dXRpb24iLCJnZXRUYXJnZXRTdGF0ZW1lbnQiLCJnZXRSZXBsYWNlbWVudFN0YXRlbWVudCIsImdldFN0YXRlbWVudFN1YnN0aXR1dGlvbk5vZGUiLCJnZXROb2RlIiwic3RhdGVtZW50U3Vic3RpdHV0aW9uTm9kZSIsImdldFRhcmdldE5vZGUiLCJ0YXJnZXRTdGF0ZW1lbnROb2RlIiwidGFyZ2V0Tm9kZSIsImdldFJlcGxhY2VtZW50Tm9kZSIsInJlcGxhY2VtZW50U3RhdGVtZW50Tm9kZSIsInJlcGxhY2VtZW50Tm9kZSIsImdldE1ldGF2YXJpYWJsZU5vZGUiLCJpc1NpbXBsZSIsInNpbXBsZSIsIm1hdGNoTWV0YXZhcmlhYmxlTm9kZSIsIm1ldGF2YXJpYWJsZU5vZGUiLCJjb21wYXJlU3RhdGVtZW50Iiwic3RhdGVtZW50IiwiY29udGV4dCIsInN0cmlwQnJhY2tldHNGcm9tU3RhdGVtZW50IiwicmVwbGFjZW1lbnRTdGF0ZW1lbnRFcXVhbFRvU3RhdGVtZW50IiwiaXNFcXVhbFRvIiwiY29tcGFyZXNUb1N0YXRlbWVudCIsImNvbXBhcmVQYXJhbWV0ZXIiLCJwYXJhbWV0ZXIiLCJ0YXJnZXRTdGF0ZW1lbnRDb21wYXJlc1RvUGFyYW1ldGVyIiwiY29tcGFyZXNUb1BhcmFtZXRlciIsInZhbGlkYXRlIiwiY29udGludWF0aW5vIiwic3RhdGVtZW50U3Vic3RpdHV0aW9uU3RyaW5nIiwiZ2V0U3RyaW5nIiwidHJhY2UiLCJ2YWxpZFN1YnN0aXR1dGlvbiIsImZpbmRWYWxpZFN1YnN0aXR1dGlvbiIsInN0YXRlbWVudFN1YnN0aXR1dGlvbiIsImRlYnVnIiwiZ2VuZXJhbENvbnRleHQiLCJnZXRHZW5lcmFsQ29udGV4dCIsInNwZWNpZmljQ29udGV4dCIsImdldFNwZWNpZmljQ29udGV4dCIsImF0dGVtcHRzIiwidmFsaWRhdGVUYXJnZXRTdGF0ZW1lbnQiLCJiaW5kIiwidmFsaWRhdGVSZXBsYWNlbWVudFN0YXRlbWVudCIsImFsbCIsInZhbGlkYXRlU3Vic3RpdHV0aW9uIiwidmFsaWRhdGVzIiwiYWRkU3Vic3RpdHV0aW9uIiwiY29tbWl0Iiwic3Vic3RpdHV0aW9uVmFsaWRhdGVzIiwidGFyZ2V0U3RhdGVtZW50U2luZ3VsYXIiLCJpc1Npbmd1bGFyIiwidGFyZ2V0U3RhdGVtZW50U3RyaW5nIiwidGFyZ2V0U3RhdGVtZW50VmFsaWRhdGVzIiwibWFuaWZlc3QiLCJlbGlkZSIsInJlcGxhY2VtZW50U3RhdGVtZW50VmFsaWRhdGVzIiwidW5pZnlUYXJnZXRTdGF0ZW1lbnQiLCJ0YXJnZXRTdGF0ZW1uZW50VW5pZmllcyIsImdlbmVyYWxTdWJzdGl0dXRpb24iLCJzcGVjaWZpY1N1YnN0aXR1dGlvbiIsImdlbmVyYWxTdWJzdGl0dXRpb25TdHJpbmciLCJzcGVjaWZpY1N1YnN0aXR1dGlvblN0cmluZyIsImdlbmVyYWxTdWJzdGl0dXRpb25HZW5lcmFsQ29udGV4dCIsInNwZWNpZmljU3Vic3RpdHV0aW9uR2VuZXJhbENvbnRleHQiLCJnZW5lcmFsU3Vic3RpdHV0aW9uVGFyZ2V0U3RhdGVtZW50Iiwic3BlY2lmaWNTdWJzdGl0dXRpb25UYXJnZXRTdGF0ZW1lbnQiLCJnZW5lcmFsU3RhdGVtZW50Iiwic3BlY2lmaWNTdGF0ZW1lbnQiLCJyZWNvbmNpbGUiLCJzdGF0ZW1lbnRVbmlmaWVzIiwidW5pZnlTdGF0ZW1lbnQiLCJ1bmlmeVJlcGxhY2VtZW50U3RhdGVtZW50IiwicmVwbGFjZW1lbnRTdGF0ZW1uZW50VW5pZmllcyIsImdlbmVyYWxTdWJzdGl0dXRpb25TcGVjaWZpY0NvbnRleHQiLCJzcGVjaWZpY1N1YnN0aXR1dGlvblNwZWNpZmljQ29udGV4dCIsImdlbmVyYWxTdWJzdGl0dXRpb25SZXBsYWNlbWVudFN0YXRlbWVudCIsInNwZWNpZmljU3Vic3RpdHV0aW9uUmVwbGFjZW1lbnRTdGF0ZW1lbnQiLCJ1bmlmeUNvbXBsZXhTdWJzdGl0dXRpb24iLCJjb21wbGV4U3Vic3RpdHV0aW9uIiwic2ltcGxlU3Vic3RpdHV0aW9uIiwic2ltcGxlU3Vic3RpdHV0aW9uU3RyaW5nIiwiY29tcGxleFN1YnN0aXR1dGlvblN0cmluZyIsInNpbXBsZVN1YnN0aXR1dGlvblVuaWZpZXMiLCJyZXBsYWNlbWVudFN0YXRlbWVudFVuaWZpZXMiLCJzb2xlTm9uVHJpdmlhbERlcml2ZWRTdWJzdGl0dXRpb24iLCJnZXRTb2xlTm9uVHJpdmlhbERlcml2ZWRTdWJzdGl0dXRpb24iLCJyZXNvbHZlIiwic2ltcGxlRGVyaXZlZFN1YnN0aXR1dGlvbiIsImZpbmRTaW1wbGVEZXJpdmVkU3Vic3RpdHV0aW9uQnlNZXRhdmFyaWFibGVOb2RlIiwidW5pZnlTdWJzdGl0dXRpb24iLCJuYW1lIiwiZnJvbUpTT04iLCJqc29uIiwic3RhdGVtZW50U3Vic3RpdHV0aW9ubiIsImluc3RhbnRpYXRlIiwidW5zZXJpYWxpc2VzIiwiaW5zdGFudGlhdGVTdGF0ZW1lbnRTdWJzdGl0dXRpb24iLCJyZXNvbHZlZEZyb21TdGF0ZW1lbnRTdWJzdGl0dXRpb25Ob2RlIiwic3Vic3RpdHV0aW9uRnJvbVN0YXRlbWVudFN1YnN0aXR1dGlvbk5vZGUiLCJ0YXJnZXRTdGF0ZW1lbnRGcm9tU3RhdGVtZW50U3Vic3RpdHV0aW9uTm9kZSIsInJlcGxhY2VtZW50U3RhdGVtZW50RnJvbVN0YXRlbWVudFN1YnN0aXR1dGlvbk5vZGUiLCJmcm9tU3RhdGVtZW50QW5kTWV0YXZhcmlhYmxlIiwibWV0YXZhcmlhYmxlIiwiYWJsYXRlcyIsInN0YXRlbWVudFN1YnN0aXR1dGlvblN0cmluZ0Zyb21TdGF0ZW1lbnRBbmRNZXRhdmFyaWFibGUiLCJzdGF0ZW1lbnRTdWJzdGl0dXRpb25Gcm9tU3RhdGVtZW50U3Vic3RpdHV0aW9uTm9kZSIsImZyb21TdGF0ZW1lbnRNZXRhdmFyaWFibGVBbmRTdWJzdGl0dXRpb24iLCJzdGF0ZW1lbnRTdWJzdGl0dXRpb25TdHJpbmdGcm9tU3RhdGVtZW50TWV0YXZhcmlhYmxlQW5kU3Vic3RpdHV0aW9uIiwic3Vic3RpdHV0aW9uTm9kZSIsImdldFN1YnN0aXR1dGlvbk5vZGUiLCJmaW5kU3Vic3RpdHV0aW9uQnlTdWJzdGl0dXRpb25Ob2RlIiwiZ2V0VGFyZ2V0U3RhdGVtZW50Tm9kZSIsImZpbmRTdGF0ZW1lbnRCeVN0YXRlbWVudE5vZGUiLCJnZXRSZXBsYWNlbWVudFN0YXRlbWVudE5vZGUiXSwibWFwcGluZ3MiOiJBQUFBOzs7OytCQWdCQTs7O2VBQUE7OztnQ0Fkb0M7cUVBRVg7OEJBRUw7MEJBQ0c7MEJBQ29COzZCQUNNO3lCQUNrQjt5QkFDc0I7d0JBQ29EOzs7Ozs7QUFFN0ksTUFBTSxFQUFFQSxrQkFBa0IsRUFBRSxHQUFHQyxtQ0FBbUI7TUFFbEQsV0FBZUMsSUFBQUEsZ0JBQU0sRUFBQyxNQUFNQyw4QkFBOEJDLHFCQUFZO0lBQ3BFLFlBQVlDLFFBQVEsRUFBRUMsTUFBTSxFQUFFQyxJQUFJLEVBQUVDLFVBQVUsRUFBRUMsUUFBUSxFQUFFQyxZQUFZLEVBQUVDLGVBQWUsRUFBRUMsb0JBQW9CLENBQUU7UUFDN0csS0FBSyxDQUFDUCxVQUFVQyxRQUFRQyxNQUFNQztRQUU5QixJQUFJLENBQUNDLFFBQVEsR0FBR0E7UUFDaEIsSUFBSSxDQUFDQyxZQUFZLEdBQUdBO1FBQ3BCLElBQUksQ0FBQ0MsZUFBZSxHQUFHQTtRQUN2QixJQUFJLENBQUNDLG9CQUFvQixHQUFHQTtJQUM5QjtJQUVBQyxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUNKLFFBQVE7SUFDdEI7SUFFQUssa0JBQWtCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDSixZQUFZO0lBQzFCO0lBRUFLLHFCQUFxQjtRQUNuQixPQUFPLElBQUksQ0FBQ0osZUFBZTtJQUM3QjtJQUVBSywwQkFBMEI7UUFDeEIsT0FBTyxJQUFJLENBQUNKLG9CQUFvQjtJQUNsQztJQUVBSywrQkFBK0I7UUFDN0IsTUFBTVYsT0FBTyxJQUFJLENBQUNXLE9BQU8sSUFDbkJDLDRCQUE0Qlos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
283
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbGVtZW50L3N1YnN0aXR1dGlvbi9zdGF0ZW1lbnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7IGJyZWFrUG9pbnRVdGlsaXRpZXMgfSBmcm9tIFwib2NjYW0tbGFuZ3VhZ2VzXCI7XG5cbmltcG9ydCBTdWJzdGl0dXRpb24gZnJvbSBcIi4uL3N1YnN0aXR1dGlvblwiO1xuXG5pbXBvcnQgeyBhbGwgfSBmcm9tIFwiLi4vLi4vdXRpbGl0aWVzL2NvbnRpbnVhdGlvblwiO1xuaW1wb3J0IHsgZGVmaW5lIH0gZnJvbSBcIi4uLy4uL2VsZW1lbnRzXCI7XG5pbXBvcnQgeyBzdHJpcEJyYWNrZXRzRnJvbVN0YXRlbWVudCB9IGZyb20gXCIuLi8uLi91dGlsaXRpZXMvYnJhY2tldHNcIjtcbmltcG9ydCB7IGluc3RhbnRpYXRlU3RhdGVtZW50U3Vic3RpdHV0aW9uIH0gZnJvbSBcIi4uLy4uL3Byb2Nlc3MvaW5zdGFudGlhdGVcIjtcbmltcG9ydCB7IHN0YXRlbWVudFN1YnN0aXR1dGlvbkZyb21TdGF0ZW1lbnRTdWJzdGl0dXRpb25Ob2RlIH0gZnJvbSBcIi4uLy4uL3V0aWxpdGllcy9lbGVtZW50XCI7XG5pbXBvcnQgeyBlbGlkZSwgYWJsYXRlcywgbWFuaWZlc3QsIGF0dGVtcHRzLCByZWNvbmNpbGUsIGluc3RhbnRpYXRlLCB1bnNlcmlhbGlzZXMgfSBmcm9tIFwiLi4vLi4vdXRpbGl0aWVzL2NvbnRleHRcIjtcbmltcG9ydCB7IHN0YXRlbWVudFN1YnN0aXR1dGlvblN0cmluZ0Zyb21TdGF0ZW1lbnRBbmRNZXRhdmFyaWFibGUsIHN0YXRlbWVudFN1YnN0aXR1dGlvblN0cmluZ0Zyb21TdGF0ZW1lbnRNZXRhdmFyaWFibGVBbmRTdWJzdGl0dXRpb24gfSBmcm9tIFwiLi4vLi4vdXRpbGl0aWVzL3N0cmluZ1wiO1xuXG5jb25zdCB7IGJyZWFrUG9pbnRGcm9tSlNPTiB9ID0gYnJlYWtQb2ludFV0aWxpdGllcztcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lKGNsYXNzIFN0YXRlbWVudFN1YnN0aXR1dGlvbiBleHRlbmRzIFN1YnN0aXR1dGlvbiB7XG4gIGNvbnN0cnVjdG9yKGNvbnRleHRzLCBzdHJpbmcsIG5vZGUsIGJyZWFrUG9pbnQsIHJlc29sdmVkLCB0YXJnZXRTdGF0ZW1lbnQsIHJlcGxhY2VtZW50U3RhdGVtZW50KSB7XG4gICAgc3VwZXIoY29udGV4dHMsIHN0cmluZywgbm9kZSwgYnJlYWtQb2ludCk7XG5cbiAgICB0aGlzLnJlc29sdmVkID0gcmVzb2x2ZWQ7XG4gICAgdGhpcy50YXJnZXRTdGF0ZW1lbnQgPSB0YXJnZXRTdGF0ZW1lbnQ7XG4gICAgdGhpcy5yZXBsYWNlbWVudFN0YXRlbWVudCA9IHJlcGxhY2VtZW50U3RhdGVtZW50O1xuICB9XG5cbiAgaXNSZXNvbHZlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlZDtcbiAgfVxuXG4gIGdldFRhcmdldFN0YXRlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy50YXJnZXRTdGF0ZW1lbnQ7XG4gIH1cblxuICBnZXRSZXBsYWNlbWVudFN0YXRlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5yZXBsYWNlbWVudFN0YXRlbWVudDtcbiAgfVxuXG4gIGdldFN0YXRlbWVudFN1YnN0aXR1dGlvbk5vZGUoKSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Tm9kZSgpLFxuICAgICAgICAgIHN0YXRlbWVudFN1YnN0aXR1dGlvbk5vZGUgPSBub2RlOyAvLy9cblxuICAgIHJldHVybiBzdGF0ZW1lbnRTdWJzdGl0dXRpb25Ob2RlO1xuICB9XG5cbiAgZ2V0VGFyZ2V0Tm9kZSgpIHtcbiAgICBjb25zdCB0YXJnZXRTdGF0ZW1lbnROb2RlID0gdGhpcy50YXJnZXRTdGF0ZW1lbnQuZ2V0Tm9kZSgpLFxuICAgICAgICAgIHRhcmdldE5vZGUgPSB0YXJnZXRTdGF0ZW1lbnROb2RlOyAvLy9cblxuICAgIHJldHVybiB0YXJnZXROb2RlO1xuICB9XG5cbiAgZ2V0UmVwbGFjZW1lbnROb2RlKCkge1xuICAgIGNvbnN0IHJlcGxhY2VtZW50U3RhdGVtZW50Tm9kZSA9IHRoaXMucmVwbGFjZW1lbnRTdGF0ZW1lbnQuZ2V0Tm9kZSgpLFxuICAgICAgICAgIHJlcGxhY2VtZW50Tm9kZSA9IHJlcGxhY2VtZW50U3RhdGVtZW50Tm9kZTsgLy8vXG5cbiAgICByZXR1cm4gcmVwbGFjZW1lbnROb2RlO1xuICB9XG5cbiAgaXNTaW1wbGUoKSB7IHJldHVybiB0aGlzLnRhcmdldFN0YXRlbWVudC5pc1NpbXBsZSgpOyB9XG5cbiAgZ2V0TWV0YXZhcmlhYmxlTm9kZSgpIHsgcmV0dXJuIHRoaXMudGFyZ2V0U3RhdGVtZW50LmdldE1ldGF2YXJpYWJsZU5vZGUoKTsgfVxuXG4gIG1hdGNoTWV0YXZhcmlhYmxlTm9kZShtZXRhdmFyaWFibGVOb2RlKSB7IHJldHVybiB0aGlzLnRhcmdldFN0YXRlbWVudC5tYXRjaE1ldGF2YXJpYWJsZU5vZGUobWV0YXZhcmlhYmxlTm9kZSk7IH1cblxuICBjb21wYXJlU3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCkge1xuICAgIHN0YXRlbWVudCA9IHN0cmlwQnJhY2tldHNGcm9tU3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCk7IC8vL1xuXG4gICAgY29uc3QgcmVwbGFjZW1lbnRTdGF0ZW1lbnRFcXVhbFRvU3RhdGVtZW50ID0gdGhpcy5yZXBsYWNlbWVudFN0YXRlbWVudC5pc0VxdWFsVG8oc3RhdGVtZW50KSxcbiAgICAgICAgICBjb21wYXJlc1RvU3RhdGVtZW50ID0gcmVwbGFjZW1lbnRTdGF0ZW1lbnRFcXVhbFRvU3RhdGVtZW50OyAgLy8vXG5cbiAgICByZXR1cm4gY29tcGFyZXNUb1N0YXRlbWVudDtcbiAgfVxuXG4gIGNvbXBhcmVQYXJhbWV0ZXIocGFyYW1ldGVyKSB7XG4gICAgY29uc3QgdGFyZ2V0U3RhdGVtZW50Q29tcGFyZXNUb1BhcmFtZXRlciA9IHRoaXMudGFyZ2V0U3RhdGVtZW50LmNvbXBhcmVQYXJhbWV0ZXIocGFyYW1ldGVyKSxcbiAgICAgICAgICBjb21wYXJlc1RvUGFyYW1ldGVyID0gdGFyZ2V0U3RhdGVtZW50Q29tcGFyZXNUb1BhcmFtZXRlcjsgIC8vL1xuXG4gICAgcmV0dXJuIGNvbXBhcmVzVG9QYXJhbWV0ZXI7XG4gIH1cblxuICB2YWxpZGF0ZShjb250ZXh0LCBjb250aW51YXRpbm8pIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRTdWJzdGl0dXRpb25TdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdWJzdGl0dXRpb25TdHJpbmd9JyBzdGF0ZW1lbnQgc3Vic3RpdHV0aW9uLi4uYCk7XG5cbiAgICBjb25zdCB2YWxpZFN1YnN0aXR1dGlvbiA9IHRoaXMuZmluZFZhbGlkU3Vic3RpdHV0aW9uKGNvbnRleHQpO1xuXG4gICAgaWYgKHZhbGlkU3Vic3RpdHV0aW9uICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBzdGF0ZW1lbnRTdWJzdGl0dXRpb24gPSB2YWxpZFN1YnN0aXR1dGlvbjsgIC8vL1xuXG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi50aGUgJyR7c3RhdGVtZW50U3Vic3RpdHV0aW9uU3RyaW5nfScgc3RhdGVtZW50IHN1YnN0aXR1dGlvbiBpcyBhbHJlYWR5IHZhbGlkLmApO1xuXG4gICAgICBjb250aW51YXRpbm8oc3RhdGVtZW50U3Vic3RpdHV0aW9uKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGdlbmVyYWxDb250ZXh0ID0gdGhpcy5nZXRHZW5lcmFsQ29udGV4dCgpLFxuICAgICAgICAgIHNwZWNpZmljQ29udGV4dCA9IHRoaXMuZ2V0U3BlY2lmaWNDb250ZXh0KCk7XG5cbiAgICBhdHRlbXB0cygoZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgdmFsaWRhdGVUYXJnZXRTdGF0ZW1lbnQgPSB0aGlzLnZhbGlkYXRlVGFyZ2V0U3RhdGVtZW50LmJpbmQodGhpcyksXG4gICAgICAgICAgICB2YWxpZGF0ZVJlcGxhY2VtZW50U3RhdGVtZW50ID0gdGhpcy52YWxpZGF0ZVJlcGxhY2VtZW50U3RhdGVtZW50LmJpbmQodGhpcyk7XG5cbiAgICAgIHJldHVybiBhbGwoW1xuICAgICAgICB2YWxpZGF0ZVRhcmdldFN0YXRlbWVudCxcbiAgICAgICAgdmFsaWRhdGVSZXBsYWNlbWVudFN0YXRlbWVudFxuICAgICAgXSwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCwgKHZhbGlkYXRlcykgPT4ge1xuICAgICAgICBsZXQgc3RhdGVtZW50U3Vic3RpdHV0aW9uID0gbnVsbDtcblxuICAgICAgICBpZiAodmFsaWRhdGVzKSB7XG4gICAgICAgICAgY29uc3Qgc3Vic3RpdHV0aW9uID0gdGhpczsgIC8vL1xuXG4gICAgICAgICAgc3RhdGVtZW50U3Vic3RpdHV0aW9uID0gc3Vic3RpdHV0aW9uOyAvLy9cblxuICAgICAgICAgIGNvbnRleHQuYWRkU3Vic3RpdHV0aW9uKHN1YnN0aXR1dGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsaWRhdGVzKSB7XG4gICAgICAgICAgdGhpcy5jb21taXQoZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsaWRhdGVzKSB7XG4gICAgICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGVkIHRoZSAnJHtzdGF0ZW1lbnRTdWJzdGl0dXRpb25TdHJpbmd9JyBzdGF0ZW1lbnQgc3Vic3RpdHV0aW9uLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlubyhzdGF0ZW1lbnRTdWJzdGl0dXRpb24pO1xuICAgICAgfSk7XG4gICAgfSwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCk7XG4gIH1cblxuICB2YWxpZGF0ZVRhcmdldFN0YXRlbWVudChnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0LCBjb250aW51YXRpbm8pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gZ2VuZXJhbENvbnRleHQsICAvLy9cbiAgICAgICAgICBzdGF0ZW1lbnRTdWJzdGl0dXRpb25TdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdWJzdGl0dXRpb25TdHJpbmd9JyBzdGF0ZW1lbnQgc3Vic3RpdHV0aW9uJ3MgdGFyZ2V0IHN0YXRlbWVudC4uLmApO1xuXG4gICAgY29uc3QgdGFyZ2V0U3RhdGVtZW50U2luZ3VsYXIgPSB0aGlzLnRhcmdldFN0YXRlbWVudC5pc1Npbmd1bGFyKCk7XG5cbiAgICBpZiAoIXRhcmdldFN0YXRlbWVudFNpbmd1bGFyKSB7XG4gICAgICBjb25zdCB0YXJnZXRTdGF0ZW1lbnRTdHJpbmcgPSB0aGlzLnRhcmdldFN0YXRlbWVudC5nZXRTdHJpbmcoKSxcbiAgICAgICAgICAgIHRhcmdldFN0YXRlbWVudFZhbGlkYXRlcyA9IGZhbHNlO1xuXG4gICAgICBjb250ZXh0LmRlYnVnKGBUaGUgJyR7dGFyZ2V0U3RhdGVtZW50U3RyaW5nfScgdGFyZ2V0IHN0YXRlbWVudCBpcyBub3Qgc2luZ3VsYXIuYCk7XG5cbiAgICAgIGNvbnRpbnVhdGlubyh0YXJnZXRTdGF0ZW1lbnRWYWxpZGF0ZXMpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZWxpZGUoKGNvbnRleHQpID0+IHtcbiAgICAgIHRoaXMudGFyZ2V0U3RhdGVtZW50LnZhbGlkYXRlKGNvbnRleHQsICh0YXJnZXRTdGF0ZW1lbnQpID0+IHtcbiAgICAgICAgbGV0IHRhcmdldFN0YXRlbWVudFZhbGlkYXRlcyA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh0YXJnZXRTdGF0ZW1lbnQgIT09IG51bGwpIHtcbiAgICAgICAgICB0YXJnZXRTdGF0ZW1lbnRWYWxpZGF0ZXMgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhcmdldFN0YXRlbWVudFZhbGlkYXRlcykge1xuICAgICAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7c3RhdGVtZW50U3Vic3RpdHV0aW9uU3RyaW5nfScgc3RhdGVtZW50IHN1YnN0aXR1dGlvbidzIHRhcmdldCBzdGF0ZW1lbnQuLi5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRpbnVhdGlubyh0YXJnZXRTdGF0ZW1lbnRWYWxpZGF0ZXMpO1xuICAgICAgfSk7XG4gICAgfSwgY29udGV4dCk7XG4gIH1cblxuICB2YWxpZGF0ZVJlcGxhY2VtZW50U3RhdGVtZW50KGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQsIGNvbnRpbnVhdGlubykge1xuICAgIGNvbnN0IGNvbnRleHQgPSBzcGVjaWZpY0NvbnRleHQsICAvLy9cbiAgICAgICAgICBzdGF0ZW1lbnRTdWJzdGl0dXRpb25TdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtzdGF0ZW1lbnRTdWJzdGl0dXRpb25TdHJpbmd9JyBzdGF0ZW1lbnQgc3Vic3RpdHV0aW9uJ3MgcmVwbGFjZW1lbnQgc3RhdGVtZW50Li4uYCk7XG5cbiAgICBlbGlkZSgoY29udGV4dCkgPT4ge1xuICAgICAgdGhpcy5yZXBsYWNlbWVudFN0YXRlbWVudC52YWxpZGF0ZShjb250ZXh0LCAocmVwbGFjZW1lbnRTdGF0ZW1lbnQpID0+IHtcbiAgICAgICAgbGV0IHJlcGxhY2VtZW50U3RhdGVtZW50VmFsaWRhdGVzID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHJlcGxhY2VtZW50U3RhdGVtZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgcmVwbGFjZW1lbnRTdGF0ZW1lbnRWYWxpZGF0ZXMgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlcGxhY2VtZW50U3RhdGVtZW50VmFsaWRhdGVzKSB7XG4gICAgICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGVkIHRoZSAnJHtzdGF0ZW1lbnRTdWJzdGl0dXRpb25TdHJpbmd9JyBzdGF0ZW1lbnQgc3Vic3RpdHV0aW9uJ3MgcmVwbGFjZW1lbnQgc3RhdGVtZW50LmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGludWF0aW5vKHJlcGxhY2VtZW50U3RhdGVtZW50VmFsaWRhdGVzKTtcbiAgICAgIH0pO1xuICAgIH0sIGNvbnRleHQpO1xuICB9XG5cbiAgdW5pZnlUYXJnZXRTdGF0ZW1lbnQoc3Vic3RpdHV0aW9uLCBjb250ZXh0KSB7XG4gICAgbGV0IHRhcmdldFN0YXRlbW5lbnRVbmlmaWVzID0gZmFsc2U7XG5cbiAgICBjb25zdCBnZW5lcmFsU3Vic3RpdHV0aW9uID0gdGhpcywgLy8vXG4gICAgICAgICAgc3BlY2lmaWNTdWJzdGl0dXRpb24gPSBzdWJzdGl0dXRpb24sXG4gICAgICAgICAgZ2VuZXJhbFN1YnN0aXR1dGlvblN0cmluZyA9IGdlbmVyYWxTdWJzdGl0dXRpb24uZ2V0U3RyaW5nKCksXG4gICAgICAgICAgc3BlY2lmaWNTdWJzdGl0dXRpb25TdHJpbmcgPSBzcGVjaWZpY1N1YnN0aXR1dGlvbi5nZXRTdHJpbmcoKTtcblxuICAgIGNvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHtzcGVjaWZpY1N1YnN0aXR1dGlvblN0cmluZ30nIHN1YnN0aXR1dGlvbidzIHRhcmdldCBzdGF0ZW1lbnQgd2l0aCB0aGUgJyR7Z2VuZXJhbFN1YnN0aXR1dGlvblN0cmluZ30nIHN1YnN0aXR1dGlvbidzIHRhcmdldCBzdGF0ZW1lbnQuLi5gKTtcblxuICAgIGNvbnN0IGdlbmVyYWxTdWJzdGl0dXRpb25HZW5lcmFsQ29udGV4dCA9IGdlbmVyYWxTdWJzdGl0dXRpb24uZ2V0R2VuZXJhbENvbnRleHQoKSxcbiAgICAgICAgICBzcGVjaWZpY1N1YnN0aXR1dGlvbkdlbmVyYWxDb250ZXh0ID0gc3BlY2lmaWNTdWJzdGl0dXRpb24uZ2V0R2VuZXJhbENvbnRleHQoKSxcbiAgICAgICAgICBnZW5lcmFsU3Vic3RpdHV0aW9uVGFyZ2V0U3RhdGVtZW50ID0gZ2VuZXJhbFN1YnN0aXR1dGlvbi5nZXRUYXJnZXRTdGF0ZW1lbnQoKSxcbiAgICAgICAgICBzcGVjaWZpY1N1YnN0aXR1dGlvblRhcmdldFN0YXRlbWVudCA9IHNwZWNpZmljU3Vic3RpdHV0aW9uLmdldFRhcmdldFN0YXRlbWVudCgpLFxuICAgICAgICAgIGdlbmVyYWxDb250ZXh0ID0gZ2VuZXJhbFN1YnN0aXR1dGlvbkdlbmVyYWxDb250ZXh0LCAgLy8vXG4gICAgICAgICAgc3BlY2lmaWNDb250ZXh0ID0gc3BlY2lmaWNTdWJzdGl0dXRpb25HZW5lcmFsQ29udGV4dCwgIC8vL1xuICAgICAgICAgIGdlbmVyYWxTdGF0ZW1lbnQgPSBnZW5lcmFsU3Vic3RpdHV0aW9uVGFyZ2V0U3RhdGVtZW50LCAvLy9cbiAgICAgICAgICBzcGVjaWZpY1N0YXRlbWVudCA9IHNwZWNpZmljU3Vic3RpdHV0aW9uVGFyZ2V0U3RhdGVtZW50OyAvLy9cblxuICAgIHJlY29uY2lsZSgoc3BlY2lmaWNDb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBzdGF0ZW1lbnRVbmlmaWVzID0gZ2VuZXJhbFN0YXRlbWVudC51bmlmeVN0YXRlbWVudChzcGVjaWZpY1N0YXRlbWVudCwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCk7XG5cbiAgICAgIGlmIChzdGF0ZW1lbnRVbmlmaWVzKSB7XG4gICAgICAgIHNwZWNpZmljQ29udGV4dC5jb21taXQoY29udGV4dCk7XG5cbiAgICAgICAgdGFyZ2V0U3RhdGVtbmVudFVuaWZpZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH0sIHNwZWNpZmljQ29udGV4dCk7XG5cbiAgICBpZiAodGFyZ2V0U3RhdGVtbmVudFVuaWZpZXMpIHtcbiAgICAgIGNvbnRleHQudHJhY2UoYC4uLnVuaWZpZWQgdGhlICcke3NwZWNpZmljU3Vic3RpdHV0aW9uU3RyaW5nfScgc3Vic3RpdHV0aW9uJ3MgdGFyZ2V0IHN0YXRlbWVudCB3aXRoIHRoZSAnJHtnZW5lcmFsU3Vic3RpdHV0aW9uU3RyaW5nfScgc3Vic3RpdHV0aW9uJ3MgdGFyZ2V0IHN0YXRlbWVudC5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0U3RhdGVtbmVudFVuaWZpZXM7XG4gIH1cblxuICB1bmlmeVJlcGxhY2VtZW50U3RhdGVtZW50KHN1YnN0aXR1dGlvbiwgY29udGV4dCwgY29udGludWF0aW9uKSB7XG4gICAgY29uc3QgZ2VuZXJhbFN1YnN0aXR1dGlvbiA9IHRoaXMsIC8vL1xuICAgICAgICAgIHNwZWNpZmljU3Vic3RpdHV0aW9uID0gc3Vic3RpdHV0aW9uLFxuICAgICAgICAgIGdlbmVyYWxTdWJzdGl0dXRpb25TdHJpbmcgPSBnZW5lcmFsU3Vic3RpdHV0aW9uLmdldFN0cmluZygpLFxuICAgICAgICAgIHNwZWNpZmljU3Vic3RpdHV0aW9uU3RyaW5nID0gc3BlY2lmaWNTdWJzdGl0dXRpb24uZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBVbmlmeWluZyB0aGUgJyR7c3BlY2lmaWNTdWJzdGl0dXRpb25TdHJpbmd9JyBzdWJzdGl0dXRpb24ncyByZXBsYWNlbWVudCBzdGF0ZW1lbnQgd2l0aCB0aGUgJyR7Z2VuZXJhbFN1YnN0aXR1dGlvblN0cmluZ30nIHN1YnN0aXR1dGlvbidzIHJlcGxhY2VtZW50IHN0YXRlbWVudC4uLmApO1xuXG4gICAgY29uc3QgZ2VuZXJhbFN1YnN0aXR1dGlvblNwZWNpZmljQ29udGV4dCA9IGdlbmVyYWxTdWJzdGl0dXRpb24uZ2V0U3BlY2lmaWNDb250ZXh0KCksXG4gICAgICAgICAgc3BlY2lmaWNTdWJzdGl0dXRpb25TcGVjaWZpY0NvbnRleHQgPSBzcGVjaWZpY1N1YnN0aXR1dGlvbi5nZXRTcGVjaWZpY0NvbnRleHQoKSxcbiAgICAgICAgICBnZW5lcmFsU3Vic3RpdHV0aW9uUmVwbGFjZW1lbnRTdGF0ZW1lbnQgPSBnZW5lcmFsU3Vic3RpdHV0aW9uLmdldFJlcGxhY2VtZW50U3RhdGVtZW50KCksXG4gICAgICAgICAgc3BlY2lmaWNTdWJzdGl0dXRpb25SZXBsYWNlbWVudFN0YXRlbWVudCA9IHNwZWNpZmljU3Vic3RpdHV0aW9uLmdldFJlcGxhY2VtZW50U3RhdGVtZW50KCksXG4gICAgICAgICAgZ2VuZXJhbENvbnRleHQgPSBnZW5lcmFsU3Vic3RpdHV0aW9uU3BlY2lmaWNDb250ZXh0LCAgLy8vXG4gICAgICAgICAgc3BlY2lmaWNDb250ZXh0ID0gc3BlY2lmaWNTdWJzdGl0dXRpb25TcGVjaWZpY0NvbnRleHQsICAvLy9cbiAgICAgICAgICBnZW5lcmFsU3RhdGVtZW50ID0gZ2VuZXJhbFN1YnN0aXR1dGlvblJlcGxhY2VtZW50U3RhdGVtZW50LCAvLy9cbiAgICAgICAgICBzcGVjaWZpY1N0YXRlbWVudCA9IHNwZWNpZmljU3Vic3RpdHV0aW9uUmVwbGFjZW1lbnRTdGF0ZW1lbnQ7IC8vL1xuXG4gICAgcmVjb25jaWxlKChzcGVjaWZpY0NvbnRleHQpID0+IHtcbiAgICAgIHJldHVybiBnZW5lcmFsU3RhdGVtZW50LnVuaWZ5U3RhdGVtZW50KHNwZWNpZmljU3RhdGVtZW50LCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0LCAoc3RhdGVtZW50VW5pZmllcykgPT4ge1xuICAgICAgICBsZXQgcmVwbGFjZW1lbnRTdGF0ZW1uZW50VW5pZmllcyA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChzdGF0ZW1lbnRVbmlmaWVzKSB7XG4gICAgICAgICAgc3BlY2lmaWNDb250ZXh0LmNvbW1pdChjb250ZXh0KTtcblxuICAgICAgICAgIHJlcGxhY2VtZW50U3RhdGVtbmVudFVuaWZpZXMgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlcGxhY2VtZW50U3RhdGVtbmVudFVuaWZpZXMpIHtcbiAgICAgICAgICBjb250ZXh0LnRyYWNlKGAuLi51bmlmaWVkIHRoZSAnJHtzcGVjaWZpY1N1YnN0aXR1dGlvblN0cmluZ30nIHN1YnN0aXR1dGlvbidzIHJlcGxhY2VtZW50IHN0YXRlbWVudCB3aXRoIHRoZSAnJHtnZW5lcmFsU3Vic3RpdHV0aW9uU3RyaW5nfScgc3Vic3RpdHV0aW9uJ3MgcmVwbGFjZW1lbnQgc3RhdGVtZW50LmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihyZXBsYWNlbWVudFN0YXRlbW5lbnRVbmlmaWVzKTtcbiAgICAgIH0pO1xuICAgIH0sIHNwZWNpZmljQ29udGV4dCk7XG4gIH1cblxuICB1bmlmeUNvbXBsZXhTdWJzdGl0dXRpb24oY29tcGxleFN1YnN0aXR1dGlvbiwgY29udGV4dCwgY29udGludWF0aW9uKSB7XG4gICAgY29uc3Qgc2ltcGxlU3Vic3RpdHV0aW9uID0gdGhpcywgIC8vL1xuICAgICAgICAgIHNpbXBsZVN1YnN0aXR1dGlvblN0cmluZyA9IHNpbXBsZVN1YnN0aXR1dGlvbi5nZXRTdHJpbmcoKSwgIC8vL1xuICAgICAgICAgIGNvbXBsZXhTdWJzdGl0dXRpb25TdHJpbmcgPSBjb21wbGV4U3Vic3RpdHV0aW9uLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBVbmlmeWluZyB0aGUgJyR7Y29tcGxleFN1YnN0aXR1dGlvblN0cmluZ30nIGNvbXBsZXggc3Vic3RpdHV0aW9uIHdpdGggdGhlICcke3NpbXBsZVN1YnN0aXR1dGlvblN0cmluZ30nIHNpbXBsZSBzdWJzdGl0dXRpb24uLi5gKTtcblxuICAgIHJlY29uY2lsZSgoY29udGV4dCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMudW5pZnlSZXBsYWNlbWVudFN0YXRlbWVudChjb21wbGV4U3Vic3RpdHV0aW9uLCBjb250ZXh0LCAocmVwbGFjZW1lbnRTdGF0ZW1lbnRVbmlmaWVzKSA9PiB7XG4gICAgICAgIGxldCBzdWJzdGl0dXRpb24gPSBudWxsO1xuXG4gICAgICAgIGlmICghcmVwbGFjZW1lbnRTdGF0ZW1lbnRVbmlmaWVzKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihzdWJzdGl0dXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNpbXBsZVN1YnN0aXR1dGlvblVuaWZpZXMgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBzb2xlTm9uVHJpdmlhbERlcml2ZWRTdWJzdGl0dXRpb24gPSBjb250ZXh0LmdldFNvbGVOb25Ucml2aWFsRGVyaXZlZFN1YnN0aXR1dGlvbigpO1xuXG4gICAgICAgIHN1YnN0aXR1dGlvbiA9IHNvbGVOb25Ucml2aWFsRGVyaXZlZFN1YnN0aXR1dGlvbjsgIC8vL1xuXG4gICAgICAgIGlmIChzdWJzdGl0dXRpb24gIT09IG51bGwpIHtcbiAgICAgICAgICBzaW1wbGVTdWJzdGl0dXRpb25VbmlmaWVzID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaW1wbGVTdWJzdGl0dXRpb25VbmlmaWVzKSB7XG4gICAgICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udW5pZmllZCB0aGUgJyR7Y29tcGxleFN1YnN0aXR1dGlvblN0cmluZ30nIGNvbXBsZXggc3Vic3RpdHV0aW9uIHdpdGggdGhlICcke3NpbXBsZVN1YnN0aXR1dGlvblN0cmluZ30nIHNpbXBsZSBzdWJzdGl0dXRpb24uYCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29udGludWF0aW9uKHN1YnN0aXR1dGlvbik7XG4gICAgICB9KTtcbiAgICB9LCBjb250ZXh0KTtcbiAgfVxuXG4gIHJlc29sdmUoY29udGV4dCwgY29udGludWF0aW9uKSB7XG4gICAgY29uc3QgbWV0YXZhcmlhYmxlTm9kZSA9IHRoaXMuZ2V0TWV0YXZhcmlhYmxlTm9kZSgpLFxuICAgICAgICAgIHNpbXBsZURlcml2ZWRTdWJzdGl0dXRpb24gPSBjb250ZXh0LmZpbmRTaW1wbGVEZXJpdmVkU3Vic3RpdHV0aW9uQnlNZXRhdmFyaWFibGVOb2RlKG1ldGF2YXJpYWJsZU5vZGUpO1xuXG4gICAgaWYgKHNpbXBsZURlcml2ZWRTdWJzdGl0dXRpb24gPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBjb250aW51YXRpb24oKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaW1wbGVTdWJzdGl0dXRpb24gPSBzaW1wbGVEZXJpdmVkU3Vic3RpdHV0aW9uLCAvLy9cbiAgICAgICAgICBjb21wbGV4U3Vic3RpdHV0aW9uID0gdGhpcywgLy8vXG4gICAgICAgICAgY29tcGxleFN1YnN0aXR1dGlvblN0cmluZyA9IGNvbXBsZXhTdWJzdGl0dXRpb24uZ2V0U3RyaW5nKCk7XG5cbiAgICBjb250ZXh0LnRyYWNlKGBSZXNvbHZpbmcgdGhlICR7Y29tcGxleFN1YnN0aXR1dGlvblN0cmluZ30nIGNvbXBsZXggc3Vic3RpdHV0aW9uLi4uYCk7XG5cbiAgICByZXR1cm4gc2ltcGxlU3Vic3RpdHV0aW9uLnVuaWZ5Q29tcGxleFN1YnN0aXR1dGlvbihjb21wbGV4U3Vic3RpdHV0aW9uLCBjb250ZXh0LCAoc3Vic3RpdHV0aW9uKSA9PiB7XG4gICAgICBpZiAoc3Vic3RpdHV0aW9uID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBjb250aW51YXRpb24oKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVwbGFjZW1lbnRTdWJzdGl0dXRpb24gPSBzdWJzdGl0dXRpb247IC8vL1xuXG4gICAgICBzdWJzdGl0dXRpb24gPSB0aGlzLnRhcmdldFN0YXRlbWVudC5nZXRTdWJzdGl0dXRpb24oKTtcblxuICAgICAgY29uc3QgdGFyZ2V0U3Vic3RpdHV0aW9uID0gc3Vic3RpdHV0aW9uOyAvLy9cblxuICAgICAgcmV0dXJuIHRhcmdldFN1YnN0aXR1dGlvbi51bmlmeVN1YnN0aXR1dGlvbihyZXBsYWNlbWVudFN1YnN0aXR1dGlvbiwgY29udGV4dCwgKHN1YnN0aXR1dGlvblVuaWZpZXMpID0+IHtcbiAgICAgICAgaWYgKHN1YnN0aXR1dGlvblVuaWZpZXMpIHtcbiAgICAgICAgICB0aGlzLnJlc29sdmVkID0gdHJ1ZTtcblxuICAgICAgICAgIGNvbnRleHQuZGVidWcoYC4uLnJlc29sdmVkIHRoZSAnJHtjb21wbGV4U3Vic3RpdHV0aW9uU3RyaW5nfScgY29tcGxleCBzdWJzdGl0dXRpb24uYCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29udGludWF0aW9uKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBuYW1lID0gXCJTdGF0ZW1lbnRTdWJzdGl0dXRpb25cIjtcblxuICBzdGF0aWMgZnJvbUpTT04oanNvbiwgY29udGV4dCkge1xuICAgIGxldCBzdGF0ZW1lbnRTdWJzdGl0dXRpb25uID0gbnVsbDtcblxuICAgIGNvbnN0IHsgbmFtZSB9ID0ganNvbjtcblxuICAgIGlmICh0aGlzLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgIGluc3RhbnRpYXRlKChjb250ZXh0KSA9PiB7XG4gICAgICAgIHVuc2VyaWFsaXNlcygoanNvbiwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgc3RyaW5nIH0gPSBqc29uLFxuICAgICAgICAgICAgICAgIHN0YXRlbWVudFN1YnN0aXR1dGlvbk5vZGUgPSBpbnN0YW50aWF0ZVN0YXRlbWVudFN1YnN0aXR1dGlvbihzdHJpbmcsIGNvbnRleHQpLFxuICAgICAgICAgICAgICAgIG5vZGUgPSBzdGF0ZW1lbnRTdWJzdGl0dXRpb25Ob2RlLCAvLy9cbiAgICAgICAgICAgICAgICBicmVha1BvaW50ID0gYnJlYWtQb2ludEZyb21KU09OKGpzb24pLFxuICAgICAgICAgICAgICAgIHJlc29sdmVkID0gcmVzb2x2ZWRGcm9tU3RhdGVtZW50U3Vic3RpdHV0aW9uTm9kZShzdGF0ZW1lbnRTdWJzdGl0dXRpb25Ob2RlLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KSxcbiAgICAgICAgICAgICAgICB0YXJnZXRTdGF0ZW1lbnQgPSB0YXJnZXRTdGF0ZW1lbnRGcm9tU3RhdGVtZW50U3Vic3RpdHV0aW9uTm9kZShzdGF0ZW1lbnRTdWJzdGl0dXRpb25Ob2RlLCBnZW5lcmFsQ29udGV4dCksXG4gICAgICAgICAgICAgICAgcmVwbGFjZW1lbnRTdGF0ZW1lbnQgPSByZXBsYWNlbWVudFN0YXRlbWVudEZyb21TdGF0ZW1lbnRTdWJzdGl0dXRpb25Ob2RlKHN0YXRlbWVudFN1YnN0aXR1dGlvbk5vZGUsIHNwZWNpZmljQ29udGV4dCksXG4gICAgICAgICAgICAgICAgY29udGV4dHMgPSBbXG4gICAgICAgICAgICAgICAgICBnZW5lcmFsQ29udGV4dCxcbiAgICAgICAgICAgICAgICAgIHNwZWNpZmljQ29udGV4dFxuICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICBzdGF0ZW1lbnRTdWJzdGl0dXRpb25uID0gbmV3IFN0YXRlbWVudFN1YnN0aXR1dGlvbihjb250ZXh0cywgc3RyaW5nLCBub2RlLCBicmVha1BvaW50LCByZXNvbHZlZCwgdGFyZ2V0U3RhdGVtZW50LCByZXBsYWNlbWVudFN0YXRlbWVudCk7XG4gICAgICAgIH0sIGpzb24sIGNvbnRleHQpO1xuICAgICAgfSwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YXRlbWVudFN1YnN0aXR1dGlvbm47XG4gIH1cblxuICBzdGF0aWMgZnJvbVN0YXRlbWVudEFuZE1ldGF2YXJpYWJsZShzdGF0ZW1lbnQsIG1ldGF2YXJpYWJsZSwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCkge1xuICAgIGNvbnN0IGNvbnRleHQgPSBzcGVjaWZpY0NvbnRleHQ7ICAvLy9cblxuICAgIHN0YXRlbWVudCA9IHN0cmlwQnJhY2tldHNGcm9tU3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCk7IC8vL1xuXG4gICAgbGV0IHN0YXRlbWVudFN1YnN0aXR1dGlvbjtcblxuICAgIGFibGF0ZXMoKGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpID0+IHtcbiAgICAgIGluc3RhbnRpYXRlKChzcGVjaWZpY0NvbnRleHQpID0+IHtcbiAgICAgICAgbWFuaWZlc3QoKGdlbmVyYWxDb250ZXh0KSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3RhdGVtZW50U3Vic3RpdHV0aW9uU3RyaW5nID0gc3RhdGVtZW50U3Vic3RpdHV0aW9uU3RyaW5nRnJvbVN0YXRlbWVudEFuZE1ldGF2YXJpYWJsZShzdGF0ZW1lbnQsIG1ldGF2YXJpYWJsZSksXG4gICAgICAgICAgICAgICAgc3RyaW5nID0gc3RhdGVtZW50U3Vic3RpdHV0aW9uU3RyaW5nLCAvLy9cbiAgICAgICAgICAgICAgICBjb250ZXh0ID0gc3BlY2lmaWNDb250ZXh0LCAgLy8vXG4gICAgICAgICAgICAgICAgc3RhdGVtZW50U3Vic3RpdHV0aW9uTm9kZSA9IGluc3RhbnRpYXRlU3RhdGVtZW50U3Vic3RpdHV0aW9uKHN0cmluZywgY29udGV4dCk7XG5cbiAgICAgICAgICBzdGF0ZW1lbnRTdWJzdGl0dXRpb24gPSBzdGF0ZW1lbnRTdWJzdGl0dXRpb25Gcm9tU3RhdGVtZW50U3Vic3RpdHV0aW9uTm9kZShzdGF0ZW1lbnRTdWJzdGl0dXRpb25Ob2RlLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KTtcbiAgICAgICAgfSwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCk7XG4gICAgICB9LCBzcGVjaWZpY0NvbnRleHQpO1xuICAgIH0sIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpO1xuXG4gICAgcmV0dXJuIHN0YXRlbWVudFN1YnN0aXR1dGlvbjtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tU3RhdGVtZW50TWV0YXZhcmlhYmxlQW5kU3Vic3RpdHV0aW9uKHN0YXRlbWVudCwgbWV0YXZhcmlhYmxlLCBzdWJzdGl0dXRpb24sIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gc3BlY2lmaWNDb250ZXh0OyAgLy8vXG5cbiAgICBzdGF0ZW1lbnQgPSBzdHJpcEJyYWNrZXRzRnJvbVN0YXRlbWVudChzdGF0ZW1lbnQsIGNvbnRleHQpOyAvLy9cblxuICAgIGxldCBzdGF0ZW1lbnRTdWJzdGl0dXRpb247XG5cbiAgICBhYmxhdGVzKChnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KSA9PiB7XG4gICAgICBpbnN0YW50aWF0ZSgoc3BlY2lmaWNDb250ZXh0KSA9PiB7XG4gICAgICAgIG1hbmlmZXN0KChnZW5lcmFsQ29udGV4dCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0YXRlbWVudFN1YnN0aXR1dGlvblN0cmluZyA9IHN0YXRlbWVudFN1YnN0aXR1dGlvblN0cmluZ0Zyb21TdGF0ZW1lbnRNZXRhdmFyaWFibGVBbmRTdWJzdGl0dXRpb24oc3RhdGVtZW50LCBtZXRhdmFyaWFibGUsIHN1YnN0aXR1dGlvbiksXG4gICAgICAgICAgICAgICAgc3RyaW5nID0gc3RhdGVtZW50U3Vic3RpdHV0aW9uU3RyaW5nLCAvLy9cbiAgICAgICAgICAgICAgICBjb250ZXh0ID0gc3BlY2lmaWNDb250ZXh0LCAgLy8vXG4gICAgICAgICAgICAgICAgc3RhdGVtZW50U3Vic3RpdHV0aW9uTm9kZSA9IGluc3RhbnRpYXRlU3RhdGVtZW50U3Vic3RpdHV0aW9uKHN0cmluZywgY29udGV4dCk7XG5cbiAgICAgICAgICBzdGF0ZW1lbnRTdWJzdGl0dXRpb24gPSBzdGF0ZW1lbnRTdWJzdGl0dXRpb25Gcm9tU3RhdGVtZW50U3Vic3RpdHV0aW9uTm9kZShzdGF0ZW1lbnRTdWJzdGl0dXRpb25Ob2RlLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0KTtcbiAgICAgICAgfSwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCk7XG4gICAgICB9LCBzcGVjaWZpY0NvbnRleHQpO1xuICAgIH0sIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpO1xuXG4gICAgcmV0dXJuIHN0YXRlbWVudFN1YnN0aXR1dGlvbjtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIHJlc29sdmVkRnJvbVN0YXRlbWVudFN1YnN0aXR1dGlvbk5vZGUoc3RhdGVtZW50U3Vic3RpdHV0aW9uTm9kZSwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCkge1xuICBjb25zdCByZXNvbHZlZCA9IHRydWU7XG5cbiAgcmV0dXJuIHJlc29sdmVkO1xufVxuXG5mdW5jdGlvbiB0YXJnZXRTdGF0ZW1lbnRGcm9tU3RhdGVtZW50U3Vic3RpdHV0aW9uTm9kZShzdGF0ZW1lbnRTdWJzdGl0dXRpb25Ob2RlLCBnZW5lcmFsQ29udGV4dCkge1xuICBjb25zdCB0YXJnZXRTdGF0ZW1lbnROb2RlID0gc3RhdGVtZW50U3Vic3RpdHV0aW9uTm9kZS5nZXRUYXJnZXRTdGF0ZW1lbnROb2RlKCksXG4gICAgICAgIHRhcmdldFN0YXRlbWVudCA9IGdlbmVyYWxDb250ZXh0LmZpbmRTdGF0ZW1lbnRCeVN0YXRlbWVudE5vZGUodGFyZ2V0U3RhdGVtZW50Tm9kZSk7XG5cbiAgcmV0dXJuIHRhcmdldFN0YXRlbWVudDtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZW1lbnRTdGF0ZW1lbnRGcm9tU3RhdGVtZW50U3Vic3RpdHV0aW9uTm9kZShzdGF0ZW1lbnRTdWJzdGl0dXRpb25Ob2RlLCBzcGVjaWZpY0NvbnRleHQpIHtcbiAgY29uc3QgcmVwbGFjZW1lbnRTdGF0ZW1lbnROb2RlID0gc3RhdGVtZW50U3Vic3RpdHV0aW9uTm9kZS5nZXRSZXBsYWNlbWVudFN0YXRlbWVudE5vZGUoKSxcbiAgICAgICAgcmVwbGFjZW1lbnRTdGF0ZW1lbnQgPSBzcGVjaWZpY0NvbnRleHQuZmluZFN0YXRlbWVudEJ5U3RhdGVtZW50Tm9kZShyZXBsYWNlbWVudFN0YXRlbWVudE5vZGUpO1xuXG4gIHJldHVybiByZXBsYWNlbWVudFN0YXRlbWVudDtcbn1cbiJdLCJuYW1lcyI6WyJicmVha1BvaW50RnJvbUpTT04iLCJicmVha1BvaW50VXRpbGl0aWVzIiwiZGVmaW5lIiwiU3RhdGVtZW50U3Vic3RpdHV0aW9uIiwiU3Vic3RpdHV0aW9uIiwiY29udGV4dHMiLCJzdHJpbmciLCJub2RlIiwiYnJlYWtQb2ludCIsInJlc29sdmVkIiwidGFyZ2V0U3RhdGVtZW50IiwicmVwbGFjZW1lbnRTdGF0ZW1lbnQiLCJpc1Jlc29sdmVkIiwiZ2V0VGFyZ2V0U3RhdGVtZW50IiwiZ2V0UmVwbGFjZW1lbnRTdGF0ZW1lbnQiLCJnZXRTdGF0ZW1lbnRTdWJzdGl0dXRpb25Ob2RlIiwiZ2V0Tm9kZSIsInN0YXRlbWVudFN1YnN0aXR1dGlvbk5vZGUiLCJnZXRUYXJnZXROb2RlIiwidGFyZ2V0U3RhdGVtZW50Tm9kZSIsInRhcmdldE5vZGUiLCJnZXRSZXBsYWNlbWVudE5vZGUiLCJyZXBsYWNlbWVudFN0YXRlbWVudE5vZGUiLCJyZXBsYWNlbWVudE5vZGUiLCJpc1NpbXBsZSIsImdldE1ldGF2YXJpYWJsZU5vZGUiLCJtYXRjaE1ldGF2YXJpYWJsZU5vZGUiLCJtZXRhdmFyaWFibGVOb2RlIiwiY29tcGFyZVN0YXRlbWVudCIsInN0YXRlbWVudCIsImNvbnRleHQiLCJzdHJpcEJyYWNrZXRzRnJvbVN0YXRlbWVudCIsInJlcGxhY2VtZW50U3RhdGVtZW50RXF1YWxUb1N0YXRlbWVudCIsImlzRXF1YWxUbyIsImNvbXBhcmVzVG9TdGF0ZW1lbnQiLCJjb21wYXJlUGFyYW1ldGVyIiwicGFyYW1ldGVyIiwidGFyZ2V0U3RhdGVtZW50Q29tcGFyZXNUb1BhcmFtZXRlciIsImNvbXBhcmVzVG9QYXJhbWV0ZXIiLCJ2YWxpZGF0ZSIsImNvbnRpbnVhdGlubyIsInN0YXRlbWVudFN1YnN0aXR1dGlvblN0cmluZyIsImdldFN0cmluZyIsInRyYWNlIiwidmFsaWRTdWJzdGl0dXRpb24iLCJmaW5kVmFsaWRTdWJzdGl0dXRpb24iLCJzdGF0ZW1lbnRTdWJzdGl0dXRpb24iLCJkZWJ1ZyIsImdlbmVyYWxDb250ZXh0IiwiZ2V0R2VuZXJhbENvbnRleHQiLCJzcGVjaWZpY0NvbnRleHQiLCJnZXRTcGVjaWZpY0NvbnRleHQiLCJhdHRlbXB0cyIsInZhbGlkYXRlVGFyZ2V0U3RhdGVtZW50IiwiYmluZCIsInZhbGlkYXRlUmVwbGFjZW1lbnRTdGF0ZW1lbnQiLCJhbGwiLCJ2YWxpZGF0ZXMiLCJzdWJzdGl0dXRpb24iLCJhZGRTdWJzdGl0dXRpb24iLCJjb21taXQiLCJ0YXJnZXRTdGF0ZW1lbnRTaW5ndWxhciIsImlzU2luZ3VsYXIiLCJ0YXJnZXRTdGF0ZW1lbnRTdHJpbmciLCJ0YXJnZXRTdGF0ZW1lbnRWYWxpZGF0ZXMiLCJlbGlkZSIsInJlcGxhY2VtZW50U3RhdGVtZW50VmFsaWRhdGVzIiwidW5pZnlUYXJnZXRTdGF0ZW1lbnQiLCJ0YXJnZXRTdGF0ZW1uZW50VW5pZmllcyIsImdlbmVyYWxTdWJzdGl0dXRpb24iLCJzcGVjaWZpY1N1YnN0aXR1dGlvbiIsImdlbmVyYWxTdWJzdGl0dXRpb25TdHJpbmciLCJzcGVjaWZpY1N1YnN0aXR1dGlvblN0cmluZyIsImdlbmVyYWxTdWJzdGl0dXRpb25HZW5lcmFsQ29udGV4dCIsInNwZWNpZmljU3Vic3RpdHV0aW9uR2VuZXJhbENvbnRleHQiLCJnZW5lcmFsU3Vic3RpdHV0aW9uVGFyZ2V0U3RhdGVtZW50Iiwic3BlY2lmaWNTdWJzdGl0dXRpb25UYXJnZXRTdGF0ZW1lbnQiLCJnZW5lcmFsU3RhdGVtZW50Iiwic3BlY2lmaWNTdGF0ZW1lbnQiLCJyZWNvbmNpbGUiLCJzdGF0ZW1lbnRVbmlmaWVzIiwidW5pZnlTdGF0ZW1lbnQiLCJ1bmlmeVJlcGxhY2VtZW50U3RhdGVtZW50IiwiY29udGludWF0aW9uIiwiZ2VuZXJhbFN1YnN0aXR1dGlvblNwZWNpZmljQ29udGV4dCIsInNwZWNpZmljU3Vic3RpdHV0aW9uU3BlY2lmaWNDb250ZXh0IiwiZ2VuZXJhbFN1YnN0aXR1dGlvblJlcGxhY2VtZW50U3RhdGVtZW50Iiwic3BlY2lmaWNTdWJzdGl0dXRpb25SZXBsYWNlbWVudFN0YXRlbWVudCIsInJlcGxhY2VtZW50U3RhdGVtbmVudFVuaWZpZXMiLCJ1bmlmeUNvbXBsZXhTdWJzdGl0dXRpb24iLCJjb21wbGV4U3Vic3RpdHV0aW9uIiwic2ltcGxlU3Vic3RpdHV0aW9uIiwic2ltcGxlU3Vic3RpdHV0aW9uU3RyaW5nIiwiY29tcGxleFN1YnN0aXR1dGlvblN0cmluZyIsInJlcGxhY2VtZW50U3RhdGVtZW50VW5pZmllcyIsInNpbXBsZVN1YnN0aXR1dGlvblVuaWZpZXMiLCJzb2xlTm9uVHJpdmlhbERlcml2ZWRTdWJzdGl0dXRpb24iLCJnZXRTb2xlTm9uVHJpdmlhbERlcml2ZWRTdWJzdGl0dXRpb24iLCJyZXNvbHZlIiwic2ltcGxlRGVyaXZlZFN1YnN0aXR1dGlvbiIsImZpbmRTaW1wbGVEZXJpdmVkU3Vic3RpdHV0aW9uQnlNZXRhdmFyaWFibGVOb2RlIiwicmVwbGFjZW1lbnRTdWJzdGl0dXRpb24iLCJnZXRTdWJzdGl0dXRpb24iLCJ0YXJnZXRTdWJzdGl0dXRpb24iLCJ1bmlmeVN1YnN0aXR1dGlvbiIsInN1YnN0aXR1dGlvblVuaWZpZXMiLCJuYW1lIiwiZnJvbUpTT04iLCJqc29uIiwic3RhdGVtZW50U3Vic3RpdHV0aW9ubiIsImluc3RhbnRpYXRlIiwidW5zZXJpYWxpc2VzIiwiaW5zdGFudGlhdGVTdGF0ZW1lbnRTdWJzdGl0dXRpb24iLCJyZXNvbHZlZEZyb21TdGF0ZW1lbnRTdWJzdGl0dXRpb25Ob2RlIiwidGFyZ2V0U3RhdGVtZW50RnJvbVN0YXRlbWVudFN1YnN0aXR1dGlvbk5vZGUiLCJyZXBsYWNlbWVudFN0YXRlbWVudEZyb21TdGF0ZW1lbnRTdWJzdGl0dXRpb25Ob2RlIiwiZnJvbVN0YXRlbWVudEFuZE1ldGF2YXJpYWJsZSIsIm1ldGF2YXJpYWJsZSIsImFibGF0ZXMiLCJtYW5pZmVzdCIsInN0YXRlbWVudFN1YnN0aXR1dGlvblN0cmluZ0Zyb21TdGF0ZW1lbnRBbmRNZXRhdmFyaWFibGUiLCJzdGF0ZW1lbnRTdWJzdGl0dXRpb25Gcm9tU3RhdGVtZW50U3Vic3RpdHV0aW9uTm9kZSIsImZyb21TdGF0ZW1lbnRNZXRhdmFyaWFibGVBbmRTdWJzdGl0dXRpb24iLCJzdGF0ZW1lbnRTdWJzdGl0dXRpb25TdHJpbmdGcm9tU3RhdGVtZW50TWV0YXZhcmlhYmxlQW5kU3Vic3RpdHV0aW9uIiwiZ2V0VGFyZ2V0U3RhdGVtZW50Tm9kZSIsImZpbmRTdGF0ZW1lbnRCeVN0YXRlbWVudE5vZGUiLCJnZXRSZXBsYWNlbWVudFN0YXRlbWVudE5vZGUiXSwibWFwcGluZ3MiOiJBQUFBOzs7OytCQWdCQTs7O2VBQUE7OztnQ0Fkb0M7cUVBRVg7OEJBRUw7MEJBQ0c7MEJBQ29COzZCQUNNO3lCQUNrQjt5QkFDc0I7d0JBQ29EOzs7Ozs7QUFFN0ksTUFBTSxFQUFFQSxrQkFBa0IsRUFBRSxHQUFHQyxtQ0FBbUI7TUFFbEQsV0FBZUMsSUFBQUEsZ0JBQU0sRUFBQyxNQUFNQyw4QkFBOEJDLHFCQUFZO0lBQ3BFLFlBQVlDLFFBQVEsRUFBRUMsTUFBTSxFQUFFQyxJQUFJLEVBQUVDLFVBQVUsRUFBRUMsUUFBUSxFQUFFQyxlQUFlLEVBQUVDLG9CQUFvQixDQUFFO1FBQy9GLEtBQUssQ0FBQ04sVUFBVUMsUUFBUUMsTUFBTUM7UUFFOUIsSUFBSSxDQUFDQyxRQUFRLEdBQUdBO1FBQ2hCLElBQUksQ0FBQ0MsZUFBZSxHQUFHQTtRQUN2QixJQUFJLENBQUNDLG9CQUFvQixHQUFHQTtJQUM5QjtJQUVBQyxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUNILFFBQVE7SUFDdEI7SUFFQUkscUJBQXFCO1FBQ25CLE9BQU8sSUFBSSxDQUFDSCxlQUFlO0lBQzdCO0lBRUFJLDBCQUEwQjtRQUN4QixPQUFPLElBQUksQ0FBQ0gsb0JBQW9CO0lBQ2xDO0lBRUFJLCtCQUErQjtRQUM3QixNQUFNUixPQUFPLElBQUksQ0FBQ1MsT0FBTyxJQUNuQkMsNEJBQTRCVixNQUFNLEdBQUc7UUFFM0MsT0FBT1U7SUFDVDtJQUVBQyxnQkFBZ0I7UUFDZCxNQUFNQyxzQkFBc0IsSUFBSSxDQUFDVCxlQUFlLENBQUNNLE9BQU8sSUFDbERJLGFBQWFELHFCQUFxQixHQUFHO1FBRTNDLE9BQU9DO0lBQ1Q7SUFFQUMscUJBQXFCO1FBQ25CLE1BQU1DLDJCQUEyQixJQUFJLENBQUNYLG9CQUFvQixDQUFDSyxPQUFPLElBQzVETyxrQkFBa0JELDBCQUEwQixHQUFH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