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.
- package/lib/context/liminal.js +17 -15
- package/lib/context/phaneric.js +3 -3
- package/lib/context.js +3 -3
- package/lib/element/assertion/contained.js +19 -17
- package/lib/element/assertion/defined.js +16 -14
- package/lib/element/conclusion.js +10 -11
- package/lib/element/declaration/variable.js +2 -2
- package/lib/element/deduction.js +7 -7
- package/lib/element/equality.js +3 -3
- package/lib/element/frame.js +8 -3
- package/lib/element/goal.js +7 -8
- package/lib/element/judgement.js +8 -10
- package/lib/element/metavariable.js +44 -40
- package/lib/element/proof.js +2 -2
- package/lib/element/proofAssertion/premise.js +17 -21
- package/lib/element/proofAssertion/step.js +5 -5
- package/lib/element/proofAssertion/supposition.js +39 -35
- package/lib/element/rule.js +24 -22
- package/lib/element/statement.js +56 -32
- package/lib/element/substitution/frame.js +71 -62
- package/lib/element/substitution/reference.js +21 -21
- package/lib/element/substitution/statement.js +81 -98
- package/lib/element/substitution/term.js +76 -67
- package/lib/element/substitution.js +5 -5
- package/lib/element/term.js +2 -2
- package/lib/element/topLevelAssertion/axiom.js +4 -5
- package/lib/element/topLevelAssertion/conjecture.js +3 -3
- package/lib/element/topLevelAssertion/lemma.js +3 -3
- package/lib/element/topLevelAssertion/theorem.js +3 -3
- package/lib/element/topLevelAssertion.js +59 -69
- package/lib/node/metavariable.js +18 -1
- package/lib/process/unify.js +5 -7
- package/lib/process/validation.js +5 -2
- package/lib/utilities/element.js +34 -56
- package/package.json +2 -2
- package/src/context/liminal.js +18 -16
- package/src/context/phaneric.js +3 -3
- package/src/context.js +2 -2
- package/src/element/assertion/contained.js +19 -18
- package/src/element/assertion/defined.js +16 -16
- package/src/element/conclusion.js +9 -11
- package/src/element/declaration/variable.js +1 -1
- package/src/element/deduction.js +6 -6
- package/src/element/equality.js +2 -2
- package/src/element/frame.js +10 -2
- package/src/element/goal.js +6 -8
- package/src/element/judgement.js +7 -11
- package/src/element/metavariable.js +56 -52
- package/src/element/proof.js +1 -1
- package/src/element/proofAssertion/premise.js +17 -25
- package/src/element/proofAssertion/step.js +4 -4
- package/src/element/proofAssertion/supposition.js +44 -43
- package/src/element/rule.js +27 -25
- package/src/element/statement.js +71 -41
- package/src/element/substitution/frame.js +88 -82
- package/src/element/substitution/reference.js +30 -32
- package/src/element/substitution/statement.js +97 -132
- package/src/element/substitution/term.js +95 -89
- package/src/element/substitution.js +6 -6
- package/src/element/term.js +1 -1
- package/src/element/topLevelAssertion/axiom.js +3 -5
- package/src/element/topLevelAssertion/conjecture.js +2 -2
- package/src/element/topLevelAssertion/lemma.js +2 -2
- package/src/element/topLevelAssertion/theorem.js +2 -2
- package/src/element/topLevelAssertion.js +61 -80
- package/src/node/metavariable.js +28 -1
- package/src/process/unify.js +7 -16
- package/src/process/validation.js +5 -4
- 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,
|
|
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(
|
|
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.
|
|
140
|
-
(
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
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
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
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
|
-
|
|
211
|
-
|
|
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
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
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,
|
|
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,
|
|
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
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
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
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
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,
|
|
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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
|