@citolab/qti-components 6.9.1-beta.81 → 7.0.1
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/cdn/index.global.js +277 -0
- package/cdn/index.min.cjs +4489 -0
- package/cdn/index.min.js +4489 -0
- package/dist/custom-element-eslint-rules.js +25 -19
- package/dist/item.css +172 -5
- package/dist/qti-components/index.cjs +660 -465
- package/dist/qti-components/index.cjs.map +1 -0
- package/dist/qti-components/index.d.cts +4 -4
- package/dist/qti-components/index.d.ts +4 -4
- package/dist/qti-components/index.js +615 -423
- package/dist/qti-components/index.js.map +1 -0
- package/dist/qti-components-jsx.d.ts +398 -64
- package/dist/qti-item/index.cjs +2 -3
- package/dist/qti-item/index.cjs.map +1 -0
- package/dist/qti-item/index.d.cts +1 -1
- package/dist/qti-item/index.d.ts +1 -1
- package/dist/qti-item/index.js +2 -3
- package/dist/qti-item/index.js.map +1 -0
- package/dist/qti-loader/index.cjs +5 -6
- package/dist/qti-loader/index.cjs.map +1 -0
- package/dist/qti-loader/index.d.cts +1 -1
- package/dist/qti-loader/index.d.ts +1 -1
- package/dist/qti-loader/index.js +5 -6
- package/dist/qti-loader/index.js.map +1 -0
- package/dist/{qti-simple-choice-DC5DJota.d.cts → qti-simple-choice-CynLWb8d.d.cts} +74 -26
- package/dist/{qti-simple-choice-DC5DJota.d.ts → qti-simple-choice-CynLWb8d.d.ts} +74 -26
- package/dist/qti-test/index.cjs +4632 -0
- package/dist/qti-test/index.cjs.map +1 -0
- package/dist/qti-test/index.d.cts +304 -0
- package/dist/qti-test/index.d.ts +304 -0
- package/dist/qti-test/index.js +4599 -0
- package/dist/qti-test/index.js.map +1 -0
- package/dist/qti-transformers/index.cjs +5 -6
- package/dist/qti-transformers/index.cjs.map +1 -0
- package/dist/qti-transformers/index.js +5 -6
- package/dist/qti-transformers/index.js.map +1 -0
- package/dist/vscode.css-custom-data.json +28 -0
- package/dist/vscode.html-custom-data.json +179 -230
- package/package.json +96 -67
- package/dist/custom-elements.json +0 -24168
- package/dist/index.global.js +0 -226
- package/dist/index.js +0 -7860
- package/dist/index.min.js +0 -952
- /package/{LICENSE → LICENSE.md} +0 -0
- /package/{readme.md → README.md} +0 -0
|
@@ -1,23 +1,5 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
|
-
var __defProps = Object.defineProperties;
|
|
3
2
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
5
|
-
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
6
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
-
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
8
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
9
|
-
var __spreadValues = (a, b) => {
|
|
10
|
-
for (var prop in b || (b = {}))
|
|
11
|
-
if (__hasOwnProp.call(b, prop))
|
|
12
|
-
__defNormalProp(a, prop, b[prop]);
|
|
13
|
-
if (__getOwnPropSymbols)
|
|
14
|
-
for (var prop of __getOwnPropSymbols(b)) {
|
|
15
|
-
if (__propIsEnum.call(b, prop))
|
|
16
|
-
__defNormalProp(a, prop, b[prop]);
|
|
17
|
-
}
|
|
18
|
-
return a;
|
|
19
|
-
};
|
|
20
|
-
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
21
3
|
var __decorateClass = (decorators, target, key, kind) => {
|
|
22
4
|
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
23
5
|
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
@@ -34,9 +16,10 @@ import { customElement, property } from "lit/decorators.js";
|
|
|
34
16
|
|
|
35
17
|
// src/lib/decorators/watch.ts
|
|
36
18
|
function watch(propertyName, options) {
|
|
37
|
-
const resolvedOptions =
|
|
38
|
-
waitUntilFirstUpdate: false
|
|
39
|
-
|
|
19
|
+
const resolvedOptions = {
|
|
20
|
+
waitUntilFirstUpdate: false,
|
|
21
|
+
...options
|
|
22
|
+
};
|
|
40
23
|
return (proto, decoratedFnName) => {
|
|
41
24
|
const { update } = proto;
|
|
42
25
|
const watchedProperties = Array.isArray(propertyName) ? propertyName : [propertyName];
|
|
@@ -93,11 +76,11 @@ var QtiAssessmentItem = class extends LitElement {
|
|
|
93
76
|
identifier: this.getAttribute("identifier"),
|
|
94
77
|
variables: itemContextVariables
|
|
95
78
|
};
|
|
96
|
-
this._initialContext =
|
|
79
|
+
this._initialContext = { ...this._context, variables: this._context.variables };
|
|
97
80
|
this._feedbackElements = [];
|
|
98
81
|
this._interactionElements = [];
|
|
99
82
|
this.addEventListener("qti-register-variable", (e) => {
|
|
100
|
-
this._context =
|
|
83
|
+
this._context = { ...this._context, variables: [...this._context.variables, e.detail.variable] };
|
|
101
84
|
this._initialContext = this._context;
|
|
102
85
|
e.stopPropagation();
|
|
103
86
|
});
|
|
@@ -113,6 +96,7 @@ var QtiAssessmentItem = class extends LitElement {
|
|
|
113
96
|
});
|
|
114
97
|
this.addEventListener("end-attempt", (e) => {
|
|
115
98
|
const { responseIdentifier, countAttempt } = e.detail;
|
|
99
|
+
this.validate();
|
|
116
100
|
this.updateResponseVariable(responseIdentifier, "true");
|
|
117
101
|
this.processResponse(countAttempt);
|
|
118
102
|
});
|
|
@@ -128,26 +112,29 @@ var QtiAssessmentItem = class extends LitElement {
|
|
|
128
112
|
this.addEventListener("qti-interaction-response", this.handleUpdateResponseVariable);
|
|
129
113
|
}
|
|
130
114
|
get variables() {
|
|
131
|
-
return this._context.variables.map((v) =>
|
|
115
|
+
return this._context.variables.map((v) => ({
|
|
132
116
|
identifier: v.identifier,
|
|
133
117
|
value: v.value,
|
|
134
|
-
type: v.type
|
|
135
|
-
|
|
118
|
+
type: v.type,
|
|
119
|
+
// add externalscored, a fixed prop to the test, so the testcontext can read and decide how to score this item
|
|
120
|
+
...v.type === "outcome" && v.identifier === "SCORE" ? { externalScored: v.externalScored } : {}
|
|
121
|
+
}));
|
|
136
122
|
}
|
|
137
123
|
set variables(value) {
|
|
138
124
|
if (!Array.isArray(value) || value.some((v) => !("identifier" in v))) {
|
|
139
125
|
console.warn("variables property should be an array of VariableDeclaration");
|
|
140
126
|
return;
|
|
141
127
|
}
|
|
142
|
-
this._context =
|
|
128
|
+
this._context = {
|
|
129
|
+
...this._context,
|
|
143
130
|
variables: this._context.variables.map((variable) => {
|
|
144
131
|
const matchingValue = value.find((v) => v.identifier === variable.identifier);
|
|
145
132
|
if (matchingValue) {
|
|
146
|
-
return
|
|
133
|
+
return { ...variable, ...matchingValue };
|
|
147
134
|
}
|
|
148
135
|
return variable;
|
|
149
136
|
})
|
|
150
|
-
}
|
|
137
|
+
};
|
|
151
138
|
this._context.variables.forEach((variable) => {
|
|
152
139
|
if (variable.type === "response") {
|
|
153
140
|
const interactionElement = this._interactionElements.find(
|
|
@@ -207,7 +194,7 @@ var QtiAssessmentItem = class extends LitElement {
|
|
|
207
194
|
}
|
|
208
195
|
}
|
|
209
196
|
processResponse(countNumAttempts = true) {
|
|
210
|
-
|
|
197
|
+
this.validate();
|
|
211
198
|
const responseProcessor = this.querySelector("qti-response-processing");
|
|
212
199
|
if (!responseProcessor) {
|
|
213
200
|
return false;
|
|
@@ -222,7 +209,7 @@ var QtiAssessmentItem = class extends LitElement {
|
|
|
222
209
|
if (countNumAttempts) {
|
|
223
210
|
this.updateOutcomeVariable(
|
|
224
211
|
"numAttempts",
|
|
225
|
-
(+
|
|
212
|
+
(+this._context.variables.find((v) => v.identifier === "numAttempts")?.value + 1).toString()
|
|
226
213
|
);
|
|
227
214
|
}
|
|
228
215
|
this._emit("qti-response-processed");
|
|
@@ -246,9 +233,10 @@ var QtiAssessmentItem = class extends LitElement {
|
|
|
246
233
|
this.updateResponseVariable(responseIdentifier, response);
|
|
247
234
|
}
|
|
248
235
|
updateResponseVariable(identifier, value) {
|
|
249
|
-
this._context =
|
|
250
|
-
|
|
251
|
-
|
|
236
|
+
this._context = {
|
|
237
|
+
...this._context,
|
|
238
|
+
variables: this._context.variables.map((v) => v.identifier !== identifier ? v : { ...v, value })
|
|
239
|
+
};
|
|
252
240
|
this._emit("qti-interaction-changed", {
|
|
253
241
|
item: this.identifier,
|
|
254
242
|
responseIdentifier: identifier,
|
|
@@ -259,32 +247,39 @@ var QtiAssessmentItem = class extends LitElement {
|
|
|
259
247
|
}
|
|
260
248
|
}
|
|
261
249
|
updateOutcomeVariable(identifier, value) {
|
|
262
|
-
var _a;
|
|
263
250
|
const outcomeVariable = this.getOutcome(identifier);
|
|
264
251
|
if (!outcomeVariable) {
|
|
265
252
|
console.warn(`Can not set qti-outcome-identifier: ${identifier}, it is not available`);
|
|
266
253
|
return;
|
|
267
254
|
}
|
|
268
|
-
this._context =
|
|
255
|
+
this._context = {
|
|
256
|
+
...this._context,
|
|
269
257
|
variables: this._context.variables.map((v) => {
|
|
270
258
|
if (v.identifier !== identifier) {
|
|
271
259
|
return v;
|
|
272
260
|
}
|
|
273
|
-
return
|
|
261
|
+
return {
|
|
262
|
+
...v,
|
|
274
263
|
value: outcomeVariable.cardinality === "single" ? value : [...v.value, value]
|
|
275
|
-
}
|
|
264
|
+
};
|
|
276
265
|
})
|
|
277
|
-
}
|
|
266
|
+
};
|
|
278
267
|
this._feedbackElements.forEach((fe) => fe.checkShowFeedback(identifier));
|
|
279
268
|
this._emit("qti-outcome-changed", {
|
|
280
269
|
item: this.identifier,
|
|
281
270
|
outcomeIdentifier: identifier,
|
|
282
|
-
value:
|
|
271
|
+
value: this._context.variables.find((v) => v.identifier === identifier)?.value
|
|
283
272
|
});
|
|
284
273
|
}
|
|
274
|
+
validate() {
|
|
275
|
+
if (this._interactionElements.every((interactionElement) => interactionElement.validate())) return true;
|
|
276
|
+
if (this._interactionElements.some((interactionElement) => interactionElement.validate())) return false;
|
|
277
|
+
return null;
|
|
278
|
+
}
|
|
285
279
|
_getCompletionStatus() {
|
|
286
|
-
|
|
287
|
-
if (
|
|
280
|
+
const valid = this.validate();
|
|
281
|
+
if (valid === true) return "completed";
|
|
282
|
+
if (valid === false) return "incomplete";
|
|
288
283
|
return "not_attempted";
|
|
289
284
|
}
|
|
290
285
|
_emit(name, detail = null) {
|
|
@@ -429,7 +424,6 @@ function setLocation(xmlFragment, location) {
|
|
|
429
424
|
location += "/";
|
|
430
425
|
}
|
|
431
426
|
xmlFragment.querySelectorAll("[src],[href],[primary-path]").forEach((elWithSrc) => {
|
|
432
|
-
var _a;
|
|
433
427
|
let attr = "";
|
|
434
428
|
if (elWithSrc.getAttribute("src")) {
|
|
435
429
|
attr = "src";
|
|
@@ -440,7 +434,7 @@ function setLocation(xmlFragment, location) {
|
|
|
440
434
|
if (elWithSrc.getAttribute("primary-path")) {
|
|
441
435
|
attr = "primary-path";
|
|
442
436
|
}
|
|
443
|
-
const attrValue =
|
|
437
|
+
const attrValue = elWithSrc.getAttribute(attr)?.trim();
|
|
444
438
|
if (!attrValue.startsWith("data:") && !attrValue.startsWith("http")) {
|
|
445
439
|
const newSrcValue = location + encodeURI(attrValue);
|
|
446
440
|
elWithSrc.setAttribute(attr, newSrcValue);
|
|
@@ -463,7 +457,7 @@ var qtiTransformItem = () => {
|
|
|
463
457
|
let xmlFragment;
|
|
464
458
|
const api = {
|
|
465
459
|
async load(uri, cancelPreviousRequest = false) {
|
|
466
|
-
return new Promise((resolve
|
|
460
|
+
return new Promise((resolve) => {
|
|
467
461
|
loadXML(uri, cancelPreviousRequest).then((xml2) => {
|
|
468
462
|
xmlFragment = xml2;
|
|
469
463
|
api.path(uri.substring(0, uri.lastIndexOf("/")));
|
|
@@ -574,7 +568,6 @@ var QtiAssessmentStimulusRef = class extends LitElement2 {
|
|
|
574
568
|
* @param stimulusRef - The element to which the stimulus will be appended.
|
|
575
569
|
*/
|
|
576
570
|
async updateStimulusRef(stimulusRef) {
|
|
577
|
-
const path = this.href.substring(0, this.href.lastIndexOf("/"));
|
|
578
571
|
const stimulus = await qtiTransformItem().load(this.href).then((api) => api.htmlDoc());
|
|
579
572
|
if (stimulus) {
|
|
580
573
|
const elements = stimulus.querySelectorAll("qti-stimulus-body, qti-stylesheet");
|
|
@@ -824,8 +817,7 @@ var QtiOutcomeDeclaration = class extends QtiVariableDeclaration {
|
|
|
824
817
|
this.externalScored = null;
|
|
825
818
|
}
|
|
826
819
|
render() {
|
|
827
|
-
|
|
828
|
-
const value = (_b = (_a = this.itemContext) == null ? void 0 : _a.variables.find((v) => v.identifier === this.identifier)) == null ? void 0 : _b.value;
|
|
820
|
+
const value = this.itemContext?.variables.find((v) => v.identifier === this.identifier)?.value;
|
|
829
821
|
return html6`${JSON.stringify(value, null, 2)}`;
|
|
830
822
|
}
|
|
831
823
|
get interpolationTable() {
|
|
@@ -901,8 +893,7 @@ import { css as css3, html as html7 } from "lit";
|
|
|
901
893
|
import { customElement as customElement8, property as property5, state as state2 } from "lit/decorators.js";
|
|
902
894
|
var QtiResponseDeclaration = class extends QtiVariableDeclaration {
|
|
903
895
|
render() {
|
|
904
|
-
|
|
905
|
-
const value = (_b = (_a = this.itemContext) == null ? void 0 : _a.variables.find((v) => v.identifier === this.identifier)) == null ? void 0 : _b.value;
|
|
896
|
+
const value = this.itemContext?.variables.find((v) => v.identifier === this.identifier)?.value;
|
|
906
897
|
return html7`${JSON.stringify(value, null, 2)}`;
|
|
907
898
|
}
|
|
908
899
|
connectedCallback() {
|
|
@@ -1005,7 +996,7 @@ QtiContentBody = __decorateClass([
|
|
|
1005
996
|
import { LitElement as LitElement10, css as css4, html as html9 } from "lit";
|
|
1006
997
|
import { customElement as customElement11, property as property6 } from "lit/decorators.js";
|
|
1007
998
|
var QtiRubricBlock = class extends LitElement10 {
|
|
1008
|
-
handleclassNamesChange(
|
|
999
|
+
handleclassNamesChange() {
|
|
1009
1000
|
const classNames = this.classNames.split(" ");
|
|
1010
1001
|
classNames.forEach((className) => {
|
|
1011
1002
|
switch (className) {
|
|
@@ -1104,7 +1095,7 @@ var QtiFeedback = class extends LitElement11 {
|
|
|
1104
1095
|
if (Array.isArray(outcomeVariable.value)) {
|
|
1105
1096
|
isFound = outcomeVariable.value.includes(this.identifier);
|
|
1106
1097
|
} else {
|
|
1107
|
-
isFound = !IsNullOrUndefined(this.identifier) && !IsNullOrUndefined(outcomeVariable
|
|
1098
|
+
isFound = !IsNullOrUndefined(this.identifier) && !IsNullOrUndefined(outcomeVariable?.value) && this.identifier === outcomeVariable.value || false;
|
|
1108
1099
|
}
|
|
1109
1100
|
this.showFeedback(isFound);
|
|
1110
1101
|
}
|
|
@@ -1205,10 +1196,8 @@ import { LitElement as LitElement12 } from "lit";
|
|
|
1205
1196
|
var Interaction = class extends LitElement12 {
|
|
1206
1197
|
constructor() {
|
|
1207
1198
|
super();
|
|
1208
|
-
this.responseIdentifier = "";
|
|
1209
1199
|
this.disabled = false;
|
|
1210
1200
|
this.readonly = false;
|
|
1211
|
-
this._correctResponse = "";
|
|
1212
1201
|
this._internals = this.attachInternals();
|
|
1213
1202
|
}
|
|
1214
1203
|
reportValidity() {
|
|
@@ -1269,7 +1258,7 @@ var QtiExtendedTextInteraction = class extends Interaction {
|
|
|
1269
1258
|
this._rows = 5;
|
|
1270
1259
|
this._value = "";
|
|
1271
1260
|
}
|
|
1272
|
-
handleclassNamesChange(
|
|
1261
|
+
handleclassNamesChange(_, classes) {
|
|
1273
1262
|
const classNames = classes.split(" ");
|
|
1274
1263
|
let rowsSet = false;
|
|
1275
1264
|
classNames.forEach((className) => {
|
|
@@ -1353,7 +1342,7 @@ var QtiExtendedTextInteraction = class extends Interaction {
|
|
|
1353
1342
|
@keydown="${(event) => event.stopImmediatePropagation()}"
|
|
1354
1343
|
@keyup="${this.textChanged}"
|
|
1355
1344
|
@change="${this.textChanged}"
|
|
1356
|
-
@blur="${(
|
|
1345
|
+
@blur="${(_) => {
|
|
1357
1346
|
this.reportValidity();
|
|
1358
1347
|
}}"
|
|
1359
1348
|
placeholder="${ifDefined(this.placeholderText ? this.placeholderText : void 0)}"
|
|
@@ -1369,7 +1358,6 @@ var QtiExtendedTextInteraction = class extends Interaction {
|
|
|
1369
1358
|
this.setEmptyAttribute(input.value);
|
|
1370
1359
|
if (this._value !== input.value) {
|
|
1371
1360
|
this.value = input.value;
|
|
1372
|
-
const isValid = this.validate();
|
|
1373
1361
|
this.saveResponse(input.value);
|
|
1374
1362
|
}
|
|
1375
1363
|
}
|
|
@@ -1542,7 +1530,7 @@ var QtiTextEntryInteraction = class extends Interaction {
|
|
|
1542
1530
|
name="${this.responseIdentifier}"
|
|
1543
1531
|
spellcheck="false"
|
|
1544
1532
|
autocomplete="off"
|
|
1545
|
-
@blur="${(
|
|
1533
|
+
@blur="${(_) => {
|
|
1546
1534
|
this.reportValidity();
|
|
1547
1535
|
}}"
|
|
1548
1536
|
@keydown="${(event) => event.stopImmediatePropagation()}"
|
|
@@ -1565,7 +1553,6 @@ var QtiTextEntryInteraction = class extends Interaction {
|
|
|
1565
1553
|
this.setEmptyAttribute(input.value);
|
|
1566
1554
|
if (this._value !== input.value) {
|
|
1567
1555
|
this.value = input.value;
|
|
1568
|
-
const isValid = this.validate();
|
|
1569
1556
|
this.saveResponse(input.value);
|
|
1570
1557
|
}
|
|
1571
1558
|
}
|
|
@@ -1732,8 +1719,10 @@ var ChoicesMixin = (superClass, selector) => {
|
|
|
1732
1719
|
}
|
|
1733
1720
|
_setInputType(choiceElement) {
|
|
1734
1721
|
this._internals.ariaLabel = this.maxChoices === 1 ? "radio-group" : "checkbox-group";
|
|
1735
|
-
|
|
1736
|
-
choiceElement.internals.
|
|
1722
|
+
const role = this.maxChoices === 1 ? "radio" : "checkbox";
|
|
1723
|
+
choiceElement.internals.role = role;
|
|
1724
|
+
choiceElement.internals.states.delete(role === "radio" ? "checkbox" : "radio");
|
|
1725
|
+
choiceElement.internals.states.add(role);
|
|
1737
1726
|
}
|
|
1738
1727
|
_choiceElementSelectedHandler(event) {
|
|
1739
1728
|
this._toggleChoiceChecked(event.target);
|
|
@@ -1747,8 +1736,7 @@ var ChoicesMixin = (superClass, selector) => {
|
|
|
1747
1736
|
this._handleChoiceSelection();
|
|
1748
1737
|
}
|
|
1749
1738
|
_setChoiceChecked(choice, checked) {
|
|
1750
|
-
|
|
1751
|
-
if ((_a = choice.internals) == null ? void 0 : _a.states) {
|
|
1739
|
+
if (choice.internals?.states) {
|
|
1752
1740
|
if (checked) {
|
|
1753
1741
|
choice.internals.states.add("--checked");
|
|
1754
1742
|
choice.internals.ariaChecked = "true";
|
|
@@ -1895,7 +1883,7 @@ var QtiInlineChoiceInteraction = class extends Interaction {
|
|
|
1895
1883
|
return selectedOption ? selectedOption.value !== "" : false;
|
|
1896
1884
|
}
|
|
1897
1885
|
reset() {
|
|
1898
|
-
this.options = this.options.map((option, i) =>
|
|
1886
|
+
this.options = this.options.map((option, i) => ({ ...option, selected: i === 0 }));
|
|
1899
1887
|
}
|
|
1900
1888
|
set value(value) {
|
|
1901
1889
|
this.options = this.options.map((option) => {
|
|
@@ -1917,7 +1905,7 @@ var QtiInlineChoiceInteraction = class extends Interaction {
|
|
|
1917
1905
|
}
|
|
1918
1906
|
choiceSelected(event) {
|
|
1919
1907
|
const selectedOptionValue = event.target.value;
|
|
1920
|
-
this.options = this.options.map((option) =>
|
|
1908
|
+
this.options = this.options.map((option) => ({ ...option, selected: option.value === selectedOptionValue }));
|
|
1921
1909
|
this.saveResponse(selectedOptionValue);
|
|
1922
1910
|
}
|
|
1923
1911
|
};
|
|
@@ -1956,24 +1944,20 @@ var ShuffleMixin = (superClass, selector) => {
|
|
|
1956
1944
|
class ShuffleElement extends superClass {
|
|
1957
1945
|
constructor() {
|
|
1958
1946
|
super(...arguments);
|
|
1959
|
-
this.
|
|
1960
|
-
}
|
|
1961
|
-
set shuffle(value) {
|
|
1962
|
-
const oldValue = this._shuffle;
|
|
1963
|
-
this._shuffle = value;
|
|
1964
|
-
if (value) {
|
|
1965
|
-
this._shuffleChoices();
|
|
1966
|
-
} else {
|
|
1967
|
-
this._resetShuffleChoices();
|
|
1968
|
-
}
|
|
1969
|
-
this.requestUpdate("shuffle", oldValue);
|
|
1970
|
-
}
|
|
1971
|
-
get shuffle() {
|
|
1972
|
-
return this._shuffle;
|
|
1947
|
+
this.shuffle = "false";
|
|
1973
1948
|
}
|
|
1949
|
+
// Defaults to 'false'
|
|
1974
1950
|
connectedCallback() {
|
|
1975
1951
|
super.connectedCallback();
|
|
1976
|
-
|
|
1952
|
+
this._applyShuffle();
|
|
1953
|
+
}
|
|
1954
|
+
updated(changedProperties) {
|
|
1955
|
+
if (changedProperties.has("shuffle")) {
|
|
1956
|
+
this._applyShuffle();
|
|
1957
|
+
}
|
|
1958
|
+
}
|
|
1959
|
+
_applyShuffle() {
|
|
1960
|
+
if (this.shuffle === "true") {
|
|
1977
1961
|
this._shuffleChoices();
|
|
1978
1962
|
} else {
|
|
1979
1963
|
this._resetShuffleChoices();
|
|
@@ -1981,69 +1965,42 @@ var ShuffleMixin = (superClass, selector) => {
|
|
|
1981
1965
|
}
|
|
1982
1966
|
_shuffleChoices() {
|
|
1983
1967
|
const choices = Array.from(this.querySelectorAll(selector));
|
|
1984
|
-
const
|
|
1985
|
-
const
|
|
1986
|
-
|
|
1987
|
-
if (choice.hasAttribute("fixed")) {
|
|
1988
|
-
fixedElements.push({ element: choice, index });
|
|
1989
|
-
} else {
|
|
1990
|
-
nonFixedElements.push(choice);
|
|
1991
|
-
}
|
|
1992
|
-
});
|
|
1993
|
-
if (nonFixedElements.length <= 1) {
|
|
1968
|
+
const fixedChoices = choices.filter((choice) => choice.hasAttribute("fixed"));
|
|
1969
|
+
const nonFixedChoices = choices.filter((choice) => !choice.hasAttribute("fixed"));
|
|
1970
|
+
if (nonFixedChoices.length <= 1) {
|
|
1994
1971
|
console.warn("Shuffling is not possible with fewer than 2 non-fixed elements.");
|
|
1995
1972
|
return;
|
|
1996
1973
|
}
|
|
1997
|
-
|
|
1998
|
-
|
|
1999
|
-
let
|
|
2000
|
-
|
|
2001
|
-
|
|
2002
|
-
|
|
2003
|
-
for (let i = nonFixedElements.length - 1; i > 0; i--) {
|
|
1974
|
+
const originalOrder = [...nonFixedChoices];
|
|
1975
|
+
let shuffled = false;
|
|
1976
|
+
let attempts = 0;
|
|
1977
|
+
while (!shuffled && attempts < 10) {
|
|
1978
|
+
attempts++;
|
|
1979
|
+
for (let i = nonFixedChoices.length - 1; i > 0; i--) {
|
|
2004
1980
|
const j = Math.floor(Math.random() * (i + 1));
|
|
2005
|
-
[
|
|
1981
|
+
[nonFixedChoices[i], nonFixedChoices[j]] = [nonFixedChoices[j], nonFixedChoices[i]];
|
|
2006
1982
|
}
|
|
2007
|
-
|
|
2008
|
-
if (isShuffled) break;
|
|
1983
|
+
shuffled = !nonFixedChoices.every((choice, index) => choice === originalOrder[index]);
|
|
2009
1984
|
}
|
|
2010
|
-
if (!
|
|
1985
|
+
if (!shuffled) {
|
|
2011
1986
|
console.warn("Failed to shuffle the choices after multiple attempts.");
|
|
2012
1987
|
}
|
|
2013
1988
|
let order = 1;
|
|
2014
|
-
|
|
2015
|
-
|
|
2016
|
-
choice.style.setProperty("order", String(order++));
|
|
2017
|
-
} else {
|
|
2018
|
-
const nonFixedChoice = nonFixedElements.shift();
|
|
2019
|
-
nonFixedChoice.style.setProperty("order", String(order++));
|
|
2020
|
-
}
|
|
1989
|
+
[...fixedChoices, ...nonFixedChoices].forEach((choice) => {
|
|
1990
|
+
choice.style.setProperty("order", String(order++));
|
|
2021
1991
|
});
|
|
2022
1992
|
}
|
|
2023
1993
|
_resetShuffleChoices() {
|
|
2024
|
-
|
|
2025
|
-
choices.forEach((choice, index) => {
|
|
1994
|
+
this.querySelectorAll(selector).forEach((choice) => {
|
|
2026
1995
|
choice.style.setProperty("order", "initial");
|
|
2027
1996
|
});
|
|
2028
1997
|
}
|
|
2029
1998
|
}
|
|
2030
1999
|
__decorateClass([
|
|
2031
|
-
property13({
|
|
2032
|
-
|
|
2033
|
-
reflect: true,
|
|
2034
|
-
converter: stringToBooleanConverter
|
|
2035
|
-
})
|
|
2036
|
-
], ShuffleElement.prototype, "shuffle", 1);
|
|
2000
|
+
property13({ type: String, reflect: true })
|
|
2001
|
+
], ShuffleElement.prototype, "shuffle", 2);
|
|
2037
2002
|
return ShuffleElement;
|
|
2038
2003
|
};
|
|
2039
|
-
var stringToBooleanConverter = {
|
|
2040
|
-
fromAttribute(value) {
|
|
2041
|
-
return value === "true";
|
|
2042
|
-
},
|
|
2043
|
-
toAttribute(value) {
|
|
2044
|
-
return value ? "true" : "false";
|
|
2045
|
-
}
|
|
2046
|
-
};
|
|
2047
2004
|
|
|
2048
2005
|
// src/lib/qti-components/qti-interaction/internal/vocabulary/vocabulary-mixin.ts
|
|
2049
2006
|
import { property as property14 } from "lit/decorators.js";
|
|
@@ -2063,8 +2020,7 @@ var VocabularyMixin = (superClass, selector) => {
|
|
|
2063
2020
|
this._addLabels();
|
|
2064
2021
|
}
|
|
2065
2022
|
get class() {
|
|
2066
|
-
|
|
2067
|
-
return ((_a = this._classes) == null ? void 0 : _a.join(" ")) || "";
|
|
2023
|
+
return this._classes?.join(" ") || "";
|
|
2068
2024
|
}
|
|
2069
2025
|
updated(_changedProperties) {
|
|
2070
2026
|
super.updated(_changedProperties);
|
|
@@ -2177,8 +2133,8 @@ var QtiChoiceInteraction = class extends VocabularyMixin(
|
|
|
2177
2133
|
}
|
|
2178
2134
|
render() {
|
|
2179
2135
|
return html17`
|
|
2180
|
-
<slot name="prompt"></slot><slot part="slot"></slot>
|
|
2181
|
-
<div role="alert" id="validationMessage"></div>
|
|
2136
|
+
<slot part="prompt" name="prompt"></slot><slot part="slot"></slot>
|
|
2137
|
+
<div part="message" role="alert" id="validationMessage"></div>
|
|
2182
2138
|
`;
|
|
2183
2139
|
}
|
|
2184
2140
|
};
|
|
@@ -2191,9 +2147,9 @@ QtiChoiceInteraction = __decorateClass([
|
|
|
2191
2147
|
], QtiChoiceInteraction);
|
|
2192
2148
|
|
|
2193
2149
|
// src/lib/qti-components/qti-outcome-processing/qti-outcome-processing.ts
|
|
2194
|
-
import { css as css12, html as html18, LitElement as
|
|
2150
|
+
import { css as css12, html as html18, LitElement as LitElement13 } from "lit";
|
|
2195
2151
|
import { customElement as customElement20 } from "lit/decorators.js";
|
|
2196
|
-
var QtiOutcomeProcessing = class extends
|
|
2152
|
+
var QtiOutcomeProcessing = class extends LitElement13 {
|
|
2197
2153
|
render() {
|
|
2198
2154
|
return html18`<slot></slot>`;
|
|
2199
2155
|
}
|
|
@@ -2222,7 +2178,7 @@ var QtiOutcomeProcessingProcessor = class {
|
|
|
2222
2178
|
};
|
|
2223
2179
|
|
|
2224
2180
|
// src/lib/qti-components/qti-response-processing/qti-response-processing/qti-response-processing.ts
|
|
2225
|
-
import { css as css13, html as html19, LitElement as
|
|
2181
|
+
import { css as css13, html as html19, LitElement as LitElement14 } from "lit";
|
|
2226
2182
|
import { customElement as customElement21 } from "lit/decorators.js";
|
|
2227
2183
|
|
|
2228
2184
|
// src/lib/qti-components/internal/template-strings.ts
|
|
@@ -2280,11 +2236,13 @@ var mapResponsePoint = `<qti-response-processing>
|
|
|
2280
2236
|
</qti-response-processing>`;
|
|
2281
2237
|
|
|
2282
2238
|
// src/lib/qti-components/qti-response-processing/qti-response-processing/qti-response-processing.ts
|
|
2283
|
-
var QtiResponseProcessing = class extends
|
|
2239
|
+
var QtiResponseProcessing = class extends LitElement14 {
|
|
2284
2240
|
render() {
|
|
2285
2241
|
return html19`<slot></slot>`;
|
|
2286
2242
|
}
|
|
2287
2243
|
process() {
|
|
2244
|
+
const assessmentItem = this.closest("qti-assessment-item");
|
|
2245
|
+
if (!assessmentItem) return;
|
|
2288
2246
|
const rules = [...this.children];
|
|
2289
2247
|
for (const rule of rules) {
|
|
2290
2248
|
rule.process();
|
|
@@ -2330,8 +2288,8 @@ import { property as property16 } from "lit/decorators.js";
|
|
|
2330
2288
|
|
|
2331
2289
|
// src/lib/qti-components/qti-response-processing/qti-rule/qti-rule.ts
|
|
2332
2290
|
import { customElement as customElement22 } from "lit/decorators.js";
|
|
2333
|
-
import { html as html20, LitElement as
|
|
2334
|
-
var QtiRule = class extends
|
|
2291
|
+
import { html as html20, LitElement as LitElement15 } from "lit";
|
|
2292
|
+
var QtiRule = class extends LitElement15 {
|
|
2335
2293
|
render() {
|
|
2336
2294
|
return html20`<slot></slot>`;
|
|
2337
2295
|
}
|
|
@@ -2431,13 +2389,12 @@ var QtiSetOutcomeValueRule = class {
|
|
|
2431
2389
|
customElements.define("qti-set-outcome-value", QtiSetOutcomeValue);
|
|
2432
2390
|
|
|
2433
2391
|
// src/lib/qti-components/qti-response-processing/qti-response-else/qti-response-else.ts
|
|
2434
|
-
import { LitElement as
|
|
2435
|
-
var QtiResponseElse = class extends
|
|
2392
|
+
import { LitElement as LitElement16, html as html22 } from "lit";
|
|
2393
|
+
var QtiResponseElse = class extends LitElement16 {
|
|
2436
2394
|
render() {
|
|
2437
2395
|
return html22`<slot></slot>`;
|
|
2438
2396
|
}
|
|
2439
2397
|
calculate() {
|
|
2440
|
-
const result = true;
|
|
2441
2398
|
return true;
|
|
2442
2399
|
}
|
|
2443
2400
|
getSubRules() {
|
|
@@ -2483,9 +2440,9 @@ customElements.define("qti-response-else-if", QtiResponseElseIf);
|
|
|
2483
2440
|
|
|
2484
2441
|
// src/lib/qti-components/qti-response-processing/qti-expression/qti-expression.ts
|
|
2485
2442
|
import { consume as consume4 } from "@lit/context";
|
|
2486
|
-
import { css as css14, html as html24, LitElement as
|
|
2443
|
+
import { css as css14, html as html24, LitElement as LitElement17 } from "lit";
|
|
2487
2444
|
import { state as state8 } from "lit/decorators.js";
|
|
2488
|
-
var QtiExpression = class extends
|
|
2445
|
+
var QtiExpression = class extends LitElement17 {
|
|
2489
2446
|
constructor() {
|
|
2490
2447
|
super(...arguments);
|
|
2491
2448
|
this.getVariables = () => (
|
|
@@ -2849,7 +2806,7 @@ var QtiGt = class extends QtiExpression {
|
|
|
2849
2806
|
const values = this.getVariables();
|
|
2850
2807
|
const value1 = values[0];
|
|
2851
2808
|
const value2 = values[1];
|
|
2852
|
-
if (value1.baseType ===
|
|
2809
|
+
if ((value1.baseType === "integer" || value1.baseType === "float") && (value2.baseType === "integer" || value2.baseType === "float")) {
|
|
2853
2810
|
return +value1.value > +value2.value;
|
|
2854
2811
|
} else {
|
|
2855
2812
|
console.error("unexpected baseType or cardinality in qti gt");
|
|
@@ -2868,7 +2825,7 @@ var QtiGte = class extends QtiConditionExpression {
|
|
|
2868
2825
|
const values = this.getVariables();
|
|
2869
2826
|
const value1 = values[0];
|
|
2870
2827
|
const value2 = values[1];
|
|
2871
|
-
if (value1.baseType ===
|
|
2828
|
+
if ((value1.baseType === "integer" || value1.baseType === "float") && (value2.baseType === "integer" || value2.baseType === "float")) {
|
|
2872
2829
|
return +value1.value >= +value2.value;
|
|
2873
2830
|
} else {
|
|
2874
2831
|
console.error("unexpected baseType or cardinality in qti gte");
|
|
@@ -2905,7 +2862,7 @@ var QtiLt = class extends QtiExpression {
|
|
|
2905
2862
|
const values = this.getVariables();
|
|
2906
2863
|
const value1 = values[0];
|
|
2907
2864
|
const value2 = values[1];
|
|
2908
|
-
if (value1.baseType ===
|
|
2865
|
+
if ((value1.baseType === "integer" || value1.baseType === "float") && (value2.baseType === "integer" || value2.baseType === "float")) {
|
|
2909
2866
|
return +value1.value < +value2.value;
|
|
2910
2867
|
} else {
|
|
2911
2868
|
console.error("unexpected baseType or cardinality in qti lt");
|
|
@@ -2924,7 +2881,7 @@ var QtiLte = class extends QtiConditionExpression {
|
|
|
2924
2881
|
const values = this.getVariables();
|
|
2925
2882
|
const value1 = values[0];
|
|
2926
2883
|
const value2 = values[1];
|
|
2927
|
-
if (value1.baseType ===
|
|
2884
|
+
if ((value1.baseType === "integer" || value1.baseType === "float") && (value2.baseType === "integer" || value2.baseType === "float")) {
|
|
2928
2885
|
return +value1.value <= +value2.value;
|
|
2929
2886
|
} else {
|
|
2930
2887
|
console.error("unexpected baseType or cardinality in qti lte");
|
|
@@ -2975,8 +2932,8 @@ customElements.define("qti-map-response", QtiMapResponse);
|
|
|
2975
2932
|
|
|
2976
2933
|
// src/lib/qti-components/qti-response-processing/qti-expression/qti-mapping/qti-mapping.ts
|
|
2977
2934
|
import { property as property21 } from "lit/decorators.js";
|
|
2978
|
-
import { LitElement as
|
|
2979
|
-
var QtiMapping = class extends
|
|
2935
|
+
import { LitElement as LitElement18 } from "lit";
|
|
2936
|
+
var QtiMapping = class extends LitElement18 {
|
|
2980
2937
|
constructor() {
|
|
2981
2938
|
super(...arguments);
|
|
2982
2939
|
this.defaultValue = 0;
|
|
@@ -3021,7 +2978,6 @@ var QtiMatch = class _QtiMatch extends QtiExpression {
|
|
|
3021
2978
|
return null;
|
|
3022
2979
|
}
|
|
3023
2980
|
static match(valueToMap, correctValueInfo) {
|
|
3024
|
-
var _a;
|
|
3025
2981
|
switch (correctValueInfo.cardinality) {
|
|
3026
2982
|
case "single": {
|
|
3027
2983
|
if (valueToMap.value === null) return false;
|
|
@@ -3030,7 +2986,7 @@ var QtiMatch = class _QtiMatch extends QtiExpression {
|
|
|
3030
2986
|
return false;
|
|
3031
2987
|
}
|
|
3032
2988
|
return ScoringHelper.compareSingleValues(
|
|
3033
|
-
|
|
2989
|
+
valueToMap.value?.toString(),
|
|
3034
2990
|
correctValueInfo.value.toString(),
|
|
3035
2991
|
correctValueInfo.baseType
|
|
3036
2992
|
);
|
|
@@ -3099,7 +3055,7 @@ var QtiMember = class extends QtiExpression {
|
|
|
3099
3055
|
console.warn("The member operator takes two sub-expressions");
|
|
3100
3056
|
}
|
|
3101
3057
|
const [value1, value2] = values;
|
|
3102
|
-
if (!(value1.baseType === value2.baseType)) {
|
|
3058
|
+
if (!(value1.baseType === value2.baseType || value1.baseType === "integer" && value2.baseType === "float" || value1.baseType === "float" && value2.baseType === "integer")) {
|
|
3103
3059
|
console.warn("Which must both have the same base-type");
|
|
3104
3060
|
}
|
|
3105
3061
|
if (!(value2.cardinality === "multiple" || value2.cardinality === "ordered")) {
|
|
@@ -3209,12 +3165,11 @@ customElements.define("qti-ordered", QtiOrdered);
|
|
|
3209
3165
|
|
|
3210
3166
|
// src/lib/qti-components/qti-response-processing/qti-expression/qti-printed-variable/qti-printed-variable.ts
|
|
3211
3167
|
import { consume as consume5 } from "@lit/context";
|
|
3212
|
-
import { LitElement as
|
|
3168
|
+
import { LitElement as LitElement19, html as html26 } from "lit";
|
|
3213
3169
|
import { property as property22, state as state9 } from "lit/decorators.js";
|
|
3214
|
-
var QtiPrintedVariable = class extends
|
|
3170
|
+
var QtiPrintedVariable = class extends LitElement19 {
|
|
3215
3171
|
render() {
|
|
3216
|
-
|
|
3217
|
-
const value = (_b = (_a = this.context) == null ? void 0 : _a.variables.find((v) => v.identifier === this.identifier)) == null ? void 0 : _b.value;
|
|
3172
|
+
const value = this.context?.variables.find((v) => v.identifier === this.identifier)?.value;
|
|
3218
3173
|
return html26`${JSON.stringify(value, null, 2)}`;
|
|
3219
3174
|
}
|
|
3220
3175
|
calculate() {
|
|
@@ -3252,6 +3207,40 @@ var QtiProduct = class extends QtiExpression {
|
|
|
3252
3207
|
};
|
|
3253
3208
|
customElements.define("qti-product", QtiProduct);
|
|
3254
3209
|
|
|
3210
|
+
// src/lib/qti-components/qti-response-processing/qti-expression/qti-subtract/qti-subtract.ts
|
|
3211
|
+
var QtiSubtract = class extends qtiSubtractMixin(QtiExpression) {
|
|
3212
|
+
getResult() {
|
|
3213
|
+
const value = this.calculateChildren(Array.from(this.children));
|
|
3214
|
+
return value;
|
|
3215
|
+
}
|
|
3216
|
+
};
|
|
3217
|
+
function qtiSubtractMixin(Base) {
|
|
3218
|
+
return class MockQtiSubtract extends Base {
|
|
3219
|
+
calculateChildren(children) {
|
|
3220
|
+
const values = children.map((expression) => {
|
|
3221
|
+
if (!expression.calculate) {
|
|
3222
|
+
console.error("Element doesn't implement QtiConditionExpression");
|
|
3223
|
+
return null;
|
|
3224
|
+
}
|
|
3225
|
+
const value = expression.calculate();
|
|
3226
|
+
if (Number.isNaN(value)) {
|
|
3227
|
+
console.error("Unexpected value in qti-subtract, expected number");
|
|
3228
|
+
return null;
|
|
3229
|
+
}
|
|
3230
|
+
return Number(value);
|
|
3231
|
+
});
|
|
3232
|
+
if (values.some((value) => value === null)) {
|
|
3233
|
+
console.error("One or more child expressions returned invalid values");
|
|
3234
|
+
return 0;
|
|
3235
|
+
}
|
|
3236
|
+
return values[0] - values[1];
|
|
3237
|
+
}
|
|
3238
|
+
};
|
|
3239
|
+
}
|
|
3240
|
+
|
|
3241
|
+
// src/lib/qti-components/qti-response-processing/qti-expression/qti-subtract/index.ts
|
|
3242
|
+
customElements.define("qti-subtract", QtiSubtract);
|
|
3243
|
+
|
|
3255
3244
|
// src/lib/qti-components/qti-response-processing/qti-expression/qti-string-match/qti-string-match.ts
|
|
3256
3245
|
import { property as property23 } from "lit/decorators.js";
|
|
3257
3246
|
var QtiStringMatch = class extends QtiExpression {
|
|
@@ -3351,7 +3340,7 @@ var QtiPortableCustomInteraction = class extends Interaction {
|
|
|
3351
3340
|
};
|
|
3352
3341
|
this.getResolvablePathString = (path, basePath) => {
|
|
3353
3342
|
path = path.replace(/\.js$/, "");
|
|
3354
|
-
return
|
|
3343
|
+
return path?.toLocaleLowerCase().startsWith("http") || !basePath ? path : this.removeDoubleSlashes(`${basePath}/${path}`);
|
|
3355
3344
|
};
|
|
3356
3345
|
this.getResolvablePath = (path, basePath) => {
|
|
3357
3346
|
return Array.isArray(path) ? path.map((p) => this.getResolvablePathString(p, basePath)) : this.getResolvablePathString(path, basePath);
|
|
@@ -3398,7 +3387,7 @@ var QtiPortableCustomInteraction = class extends Interaction {
|
|
|
3398
3387
|
validate() {
|
|
3399
3388
|
return true;
|
|
3400
3389
|
}
|
|
3401
|
-
set value(
|
|
3390
|
+
set value(_) {
|
|
3402
3391
|
}
|
|
3403
3392
|
get value() {
|
|
3404
3393
|
return this.rawResponse;
|
|
@@ -3425,7 +3414,7 @@ var QtiPortableCustomInteraction = class extends Interaction {
|
|
|
3425
3414
|
if (el) {
|
|
3426
3415
|
let properties = {};
|
|
3427
3416
|
for (const child of el.children) {
|
|
3428
|
-
properties =
|
|
3417
|
+
properties = { ...properties, ...getPropertyValue(child) };
|
|
3429
3418
|
}
|
|
3430
3419
|
return properties;
|
|
3431
3420
|
}
|
|
@@ -3433,7 +3422,7 @@ var QtiPortableCustomInteraction = class extends Interaction {
|
|
|
3433
3422
|
for (const properties of a) {
|
|
3434
3423
|
const key = properties.getAttribute("key");
|
|
3435
3424
|
if (!key) {
|
|
3436
|
-
config =
|
|
3425
|
+
config = { ...config, ...getChildProperties(properties) };
|
|
3437
3426
|
}
|
|
3438
3427
|
return config;
|
|
3439
3428
|
}
|
|
@@ -3586,12 +3575,8 @@ var TouchDragAndDrop = class _TouchDragAndDrop {
|
|
|
3586
3575
|
// Flag to ensure dragstart event is dispatched once
|
|
3587
3576
|
this.rootNode = null;
|
|
3588
3577
|
// Root node for boundary calculations
|
|
3589
|
-
this.
|
|
3590
|
-
// To keep track of the currently focused draggable element
|
|
3591
|
-
this.focusableDropZones = [];
|
|
3578
|
+
this.allDropzones = [];
|
|
3592
3579
|
// All dropzones for keyboard navigation
|
|
3593
|
-
this.currentDropZoneIndex = -1;
|
|
3594
|
-
// Index for tabbing through drop zones
|
|
3595
3580
|
this.dataTransfer = {
|
|
3596
3581
|
data: {},
|
|
3597
3582
|
setData(type, val) {
|
|
@@ -3625,28 +3610,21 @@ var TouchDragAndDrop = class _TouchDragAndDrop {
|
|
|
3625
3610
|
document.addEventListener("touchend", this.handleTouchEnd.bind(this), { passive: false });
|
|
3626
3611
|
document.addEventListener("mouseup", this.handleTouchEnd.bind(this), { passive: false });
|
|
3627
3612
|
document.addEventListener("touchcancel", this.handleTouchCancel.bind(this), { passive: false });
|
|
3628
|
-
document.addEventListener("keydown", this.handleKeyDown.bind(this));
|
|
3629
|
-
document.addEventListener("keyup", this.handleKeyUp.bind(this));
|
|
3630
3613
|
}
|
|
3631
3614
|
addDraggableElements(draggables) {
|
|
3632
3615
|
draggables.forEach((el) => {
|
|
3633
3616
|
el.setAttribute("tabindex", "0");
|
|
3634
|
-
el.addEventListener("focus", () => this.focusedElement = el);
|
|
3635
|
-
el.addEventListener("blur", () => this.focusedElement = null);
|
|
3636
3617
|
el.addEventListener("touchstart", this.handleTouchStart.bind(this), { passive: false });
|
|
3637
3618
|
el.addEventListener("mousedown", this.handleTouchStart.bind(this), { passive: false });
|
|
3638
3619
|
});
|
|
3639
3620
|
}
|
|
3640
|
-
|
|
3641
|
-
|
|
3642
|
-
|
|
3643
|
-
|
|
3644
|
-
|
|
3645
|
-
|
|
3646
|
-
|
|
3647
|
-
// // el.addEventListener('mousedown', this.handleTouchStart.bind(this), { passive: false });
|
|
3648
|
-
// });
|
|
3649
|
-
// }
|
|
3621
|
+
getInteraction(el) {
|
|
3622
|
+
let parent = el;
|
|
3623
|
+
while (parent && !parent.tagName.toLocaleLowerCase().endsWith("-interaction")) {
|
|
3624
|
+
parent = parent.parentElement;
|
|
3625
|
+
}
|
|
3626
|
+
return parent;
|
|
3627
|
+
}
|
|
3650
3628
|
handleTouchStart(e) {
|
|
3651
3629
|
this.touchStartTime = Date.now();
|
|
3652
3630
|
const { x, y } = this.getEventCoordinates(e);
|
|
@@ -3673,6 +3651,11 @@ var TouchDragAndDrop = class _TouchDragAndDrop {
|
|
|
3673
3651
|
}
|
|
3674
3652
|
handleTouchMove(e) {
|
|
3675
3653
|
if (this.isDraggable && this.dragSource) {
|
|
3654
|
+
const interaction = this.getInteraction(this.dragSource);
|
|
3655
|
+
this.allDropzones = [
|
|
3656
|
+
...Array.from(interaction.querySelectorAll("[dropzone]")),
|
|
3657
|
+
...Array.from(interaction.shadowRoot?.querySelectorAll("[dropzone]"))
|
|
3658
|
+
];
|
|
3676
3659
|
const { x, y } = this.getEventCoordinates(e);
|
|
3677
3660
|
const currentTouch = { clientX: x, clientY: y };
|
|
3678
3661
|
if (this.calculateDragDistance(currentTouch) >= this.MIN_DRAG_DISTANCE) {
|
|
@@ -3681,6 +3664,20 @@ var TouchDragAndDrop = class _TouchDragAndDrop {
|
|
|
3681
3664
|
}
|
|
3682
3665
|
this.createDragClone(e, currentTouch);
|
|
3683
3666
|
e.preventDefault();
|
|
3667
|
+
const closestDropzone = this.findClosestDropzone();
|
|
3668
|
+
this.currentDropTarget = closestDropzone;
|
|
3669
|
+
if (closestDropzone !== this.lastTarget) {
|
|
3670
|
+
if (this.lastTarget) {
|
|
3671
|
+
this.dispatchCustomEvent(this.lastTarget, "dragleave");
|
|
3672
|
+
}
|
|
3673
|
+
if (closestDropzone) {
|
|
3674
|
+
this.dispatchCustomEvent(closestDropzone, "dragenter");
|
|
3675
|
+
}
|
|
3676
|
+
this.lastTarget = closestDropzone;
|
|
3677
|
+
}
|
|
3678
|
+
if (this.lastTarget) {
|
|
3679
|
+
this.dispatchCustomEvent(this.lastTarget, "dragover");
|
|
3680
|
+
}
|
|
3684
3681
|
}
|
|
3685
3682
|
}
|
|
3686
3683
|
createDragClone(e, currentTouch) {
|
|
@@ -3716,7 +3713,7 @@ var TouchDragAndDrop = class _TouchDragAndDrop {
|
|
|
3716
3713
|
}
|
|
3717
3714
|
}
|
|
3718
3715
|
}
|
|
3719
|
-
const dropTarget = this.
|
|
3716
|
+
const dropTarget = this.currentDropTarget;
|
|
3720
3717
|
if (dropTarget !== this.lastTarget) {
|
|
3721
3718
|
this.dispatchCustomEvent(dropTarget, "dragenter");
|
|
3722
3719
|
this.dispatchCustomEvent(this.lastTarget, "dragleave");
|
|
@@ -3726,7 +3723,7 @@ var TouchDragAndDrop = class _TouchDragAndDrop {
|
|
|
3726
3723
|
if (this.currentDropTarget) this.dispatchCustomEvent(dropTarget, "dragover");
|
|
3727
3724
|
}
|
|
3728
3725
|
handleTouchEnd(e) {
|
|
3729
|
-
|
|
3726
|
+
this.allDropzones = [];
|
|
3730
3727
|
this.touchEndTriggered = true;
|
|
3731
3728
|
this.isDraggable = false;
|
|
3732
3729
|
let dropFound = false;
|
|
@@ -3737,13 +3734,59 @@ var TouchDragAndDrop = class _TouchDragAndDrop {
|
|
|
3737
3734
|
} else if (this.isDragging) {
|
|
3738
3735
|
const dragEndEvent = new CustomEvent("dragend", { bubbles: true, cancelable: true });
|
|
3739
3736
|
dragEndEvent["dataTransfer"] = { dropEffect: "none" };
|
|
3740
|
-
|
|
3737
|
+
this.dragSource?.dispatchEvent(dragEndEvent);
|
|
3741
3738
|
}
|
|
3742
3739
|
this.resetDragState(dropFound);
|
|
3743
3740
|
}
|
|
3744
3741
|
handleTouchCancel(e) {
|
|
3745
3742
|
this.resetDragState();
|
|
3746
3743
|
}
|
|
3744
|
+
findClosestDropzone() {
|
|
3745
|
+
if (!this.dragSource || this.allDropzones.length === 0) return null;
|
|
3746
|
+
const dragRect = this.dragSource.getBoundingClientRect();
|
|
3747
|
+
const dragCorners = this.getCorners(dragRect);
|
|
3748
|
+
const dragCenter = this.getCenter(dragRect);
|
|
3749
|
+
let closestDropzone = null;
|
|
3750
|
+
let minDistance = Infinity;
|
|
3751
|
+
for (const dropzone of this.allDropzones) {
|
|
3752
|
+
const dropRect = dropzone.getBoundingClientRect();
|
|
3753
|
+
const dropCorners = this.getCorners(dropRect);
|
|
3754
|
+
const dropCenter = this.getCenter(dropRect);
|
|
3755
|
+
const cornerDistance = this.calculateTotalCornerDistance(dragCorners, dropCorners) / this.getRectDiagonal(dropRect);
|
|
3756
|
+
const centerDistance = this.calculateDistance(dragCenter, dropCenter);
|
|
3757
|
+
const totalDistance = cornerDistance * 0.5 + centerDistance * 0.5;
|
|
3758
|
+
if (totalDistance < minDistance) {
|
|
3759
|
+
minDistance = totalDistance;
|
|
3760
|
+
closestDropzone = dropzone;
|
|
3761
|
+
}
|
|
3762
|
+
}
|
|
3763
|
+
return closestDropzone;
|
|
3764
|
+
}
|
|
3765
|
+
getCenter(rect) {
|
|
3766
|
+
return {
|
|
3767
|
+
x: rect.left + rect.width / 2,
|
|
3768
|
+
y: rect.top + rect.height / 2
|
|
3769
|
+
};
|
|
3770
|
+
}
|
|
3771
|
+
getRectDiagonal(rect) {
|
|
3772
|
+
return Math.sqrt(rect.width ** 2 + rect.height ** 2);
|
|
3773
|
+
}
|
|
3774
|
+
getCorners(rect) {
|
|
3775
|
+
return {
|
|
3776
|
+
topLeft: { x: rect.left, y: rect.top },
|
|
3777
|
+
topRight: { x: rect.right, y: rect.top },
|
|
3778
|
+
bottomLeft: { x: rect.left, y: rect.bottom },
|
|
3779
|
+
bottomRight: { x: rect.right, y: rect.bottom }
|
|
3780
|
+
};
|
|
3781
|
+
}
|
|
3782
|
+
calculateTotalCornerDistance(cornersA, cornersB) {
|
|
3783
|
+
return this.calculateDistance(cornersA.topLeft, cornersB.topLeft) + this.calculateDistance(cornersA.topRight, cornersB.topRight) + this.calculateDistance(cornersA.bottomLeft, cornersB.bottomLeft) + this.calculateDistance(cornersA.bottomRight, cornersB.bottomRight);
|
|
3784
|
+
}
|
|
3785
|
+
calculateDistance(pointA, pointB) {
|
|
3786
|
+
const dx = pointA.x - pointB.x;
|
|
3787
|
+
const dy = pointA.y - pointB.y;
|
|
3788
|
+
return Math.sqrt(dx * dx + dy * dy);
|
|
3789
|
+
}
|
|
3747
3790
|
findDropTarget(event) {
|
|
3748
3791
|
const { x, y } = this.getEventCoordinates(event);
|
|
3749
3792
|
return this.getDropTargetAtPoint(document, x, y);
|
|
@@ -3775,41 +3818,6 @@ var TouchDragAndDrop = class _TouchDragAndDrop {
|
|
|
3775
3818
|
}
|
|
3776
3819
|
return null;
|
|
3777
3820
|
}
|
|
3778
|
-
handleKeyDown(e) {
|
|
3779
|
-
if (this.focusedElement) {
|
|
3780
|
-
if (e.key === " " && !this.isDragging) {
|
|
3781
|
-
e.preventDefault();
|
|
3782
|
-
this.isDraggable = true;
|
|
3783
|
-
this.dragSource = this.focusedElement;
|
|
3784
|
-
this.isDragging = true;
|
|
3785
|
-
this.collectDropZones();
|
|
3786
|
-
this.dispatchCustomEvent(this.dragSource, "dragstart");
|
|
3787
|
-
} else if (e.key === "Tab" && this.isDragging) {
|
|
3788
|
-
e.preventDefault();
|
|
3789
|
-
this.moveToNextDropZone();
|
|
3790
|
-
}
|
|
3791
|
-
}
|
|
3792
|
-
}
|
|
3793
|
-
handleKeyUp(e) {
|
|
3794
|
-
if (e.key === " " && this.isDragging && this.currentDropTarget) {
|
|
3795
|
-
e.preventDefault();
|
|
3796
|
-
this.dispatchCustomEvent(this.currentDropTarget, "drop");
|
|
3797
|
-
this.dispatchCustomEvent(this.dragSource, "dragend");
|
|
3798
|
-
this.resetDragState(true);
|
|
3799
|
-
}
|
|
3800
|
-
}
|
|
3801
|
-
collectDropZones() {
|
|
3802
|
-
this.focusableDropZones = Array.from(document.querySelectorAll("[dropzone]"));
|
|
3803
|
-
this.currentDropZoneIndex = -1;
|
|
3804
|
-
}
|
|
3805
|
-
moveToNextDropZone() {
|
|
3806
|
-
if (this.focusableDropZones.length === 0) return;
|
|
3807
|
-
this.currentDropZoneIndex = (this.currentDropZoneIndex + 1) % this.focusableDropZones.length;
|
|
3808
|
-
const nextDropZone = this.focusableDropZones[this.currentDropZoneIndex];
|
|
3809
|
-
nextDropZone.focus();
|
|
3810
|
-
this.currentDropTarget = nextDropZone;
|
|
3811
|
-
this.dispatchCustomEvent(nextDropZone, "dragenter");
|
|
3812
|
-
}
|
|
3813
3821
|
getEventCoordinates(event, page = false) {
|
|
3814
3822
|
const touch = event.touches ? event.touches[0] : event;
|
|
3815
3823
|
return {
|
|
@@ -3839,26 +3847,6 @@ var TouchDragAndDrop = class _TouchDragAndDrop {
|
|
|
3839
3847
|
this.dragClone.style.top = `${boundedTop}px`;
|
|
3840
3848
|
});
|
|
3841
3849
|
}
|
|
3842
|
-
applyTransformBoundaries(deltaX, deltaY) {
|
|
3843
|
-
let boundaryRect;
|
|
3844
|
-
if (this.rootNode instanceof ShadowRoot) {
|
|
3845
|
-
boundaryRect = this.rootNode.host.getBoundingClientRect();
|
|
3846
|
-
} else if (this.rootNode instanceof Document) {
|
|
3847
|
-
boundaryRect = document.documentElement.getBoundingClientRect();
|
|
3848
|
-
} else {
|
|
3849
|
-
boundaryRect = new DOMRect(0, 0, window.innerWidth, window.innerHeight);
|
|
3850
|
-
}
|
|
3851
|
-
const elementRect = this.dragSource.getBoundingClientRect();
|
|
3852
|
-
const elementWidth = elementRect.width;
|
|
3853
|
-
const elementHeight = elementRect.height;
|
|
3854
|
-
const newLeft = elementRect.left + deltaX;
|
|
3855
|
-
const newTop = elementRect.top + deltaY;
|
|
3856
|
-
const boundedLeft = Math.max(boundaryRect.left, Math.min(newLeft, boundaryRect.right - elementWidth));
|
|
3857
|
-
const boundedTop = Math.max(boundaryRect.top, Math.min(newTop, boundaryRect.bottom - elementHeight));
|
|
3858
|
-
const boundedDeltaX = boundedLeft - elementRect.left;
|
|
3859
|
-
const boundedDeltaY = boundedTop - elementRect.top;
|
|
3860
|
-
return { boundedDeltaX, boundedDeltaY };
|
|
3861
|
-
}
|
|
3862
3850
|
applyBoundaries(newLeft, newTop, element) {
|
|
3863
3851
|
let boundaryRect;
|
|
3864
3852
|
if (this.rootNode instanceof ShadowRoot) {
|
|
@@ -3887,11 +3875,10 @@ var TouchDragAndDrop = class _TouchDragAndDrop {
|
|
|
3887
3875
|
element.dispatchEvent(event);
|
|
3888
3876
|
}
|
|
3889
3877
|
resetDragState(dropFound = false) {
|
|
3890
|
-
var _a;
|
|
3891
3878
|
if (this.isDragging) {
|
|
3892
3879
|
if (this.useDragClone) {
|
|
3893
3880
|
this.dragSource.style.opacity = "1.0";
|
|
3894
|
-
|
|
3881
|
+
this.dragClone?.parentElement.removeChild(this.dragClone);
|
|
3895
3882
|
} else {
|
|
3896
3883
|
if (!dropFound) this.dragSource.style.transform = "translate(0, 0)";
|
|
3897
3884
|
this.dragSource.style.zIndex = "";
|
|
@@ -3907,6 +3894,7 @@ var TouchDragAndDrop = class _TouchDragAndDrop {
|
|
|
3907
3894
|
this.touchStartTime = 0;
|
|
3908
3895
|
this.touchStartPoint = null;
|
|
3909
3896
|
this.touchEndTriggered = false;
|
|
3897
|
+
this.allDropzones = [];
|
|
3910
3898
|
this.dataTransfer = {
|
|
3911
3899
|
data: {},
|
|
3912
3900
|
setData(type, val) {
|
|
@@ -3993,43 +3981,53 @@ var DroppablesMixin = (superClass, useShadowRoot, droppablesSelector) => {
|
|
|
3993
3981
|
droppable.removeEventListener("drop", this.dropHandler);
|
|
3994
3982
|
}
|
|
3995
3983
|
disconnectedCallback() {
|
|
3996
|
-
var _a;
|
|
3997
3984
|
if (this.isMatchTabular()) return;
|
|
3998
3985
|
super.disconnectedCallback();
|
|
3999
|
-
|
|
3986
|
+
this.observer?.disconnect();
|
|
4000
3987
|
}
|
|
4001
3988
|
dragenterHandler(ev) {
|
|
4002
3989
|
ev.preventDefault();
|
|
4003
3990
|
}
|
|
4004
3991
|
dragoverHandler(ev) {
|
|
3992
|
+
const responseIdentifierDraggable = ev.dataTransfer.getData("responseIdentifier");
|
|
4005
3993
|
ev.preventDefault();
|
|
4006
|
-
this.
|
|
4007
|
-
|
|
3994
|
+
if (responseIdentifierDraggable === this.responseIdentifier) {
|
|
3995
|
+
this.activateDroppable(ev.currentTarget);
|
|
3996
|
+
ev.dataTransfer.dropEffect = "move";
|
|
3997
|
+
}
|
|
4008
3998
|
return false;
|
|
4009
3999
|
}
|
|
4010
4000
|
activateDroppable(droppable) {
|
|
4001
|
+
this._internals.states.delete("--dragzone-active");
|
|
4011
4002
|
droppable.setAttribute("active", "");
|
|
4012
4003
|
}
|
|
4013
4004
|
async dropHandler(ev) {
|
|
4014
4005
|
ev.preventDefault();
|
|
4015
4006
|
const droppable = ev.currentTarget;
|
|
4016
4007
|
const identifier = ev.dataTransfer.getData("text");
|
|
4017
|
-
const
|
|
4008
|
+
const responseIdentifierDraggable = ev.dataTransfer.getData("responseIdentifier");
|
|
4009
|
+
const draggable = this.findDraggable(responseIdentifierDraggable, identifier);
|
|
4018
4010
|
if (!draggable) return false;
|
|
4019
|
-
if (draggable && !this.isValidDrop(droppable, draggable)) {
|
|
4011
|
+
if (draggable && !this.isValidDrop(droppable, draggable, responseIdentifierDraggable)) {
|
|
4020
4012
|
draggable.style.transform = "translate(0, 0)";
|
|
4021
4013
|
return false;
|
|
4022
4014
|
}
|
|
4023
4015
|
await this.moveDraggableToDroppable(draggable, droppable);
|
|
4024
|
-
this.deactivateDroppable(droppable);
|
|
4016
|
+
this.deactivateDroppable(droppable, false);
|
|
4025
4017
|
return false;
|
|
4026
4018
|
}
|
|
4027
|
-
findDraggable(identifier) {
|
|
4019
|
+
findDraggable(responseIdentifier, identifier) {
|
|
4028
4020
|
if (!identifier) return null;
|
|
4029
|
-
|
|
4021
|
+
if (responseIdentifier === this.responseIdentifier) {
|
|
4022
|
+
return this.querySelector(`[identifier=${identifier}]`) || this.shadowRoot.querySelector(`[identifier=${identifier}]`);
|
|
4023
|
+
} else {
|
|
4024
|
+
const assessmentItem = this.closest("qti-assessment-item");
|
|
4025
|
+
const interaction = assessmentItem.querySelector(`[response-identifier=${responseIdentifier}]`);
|
|
4026
|
+
return interaction.querySelector(`[identifier=${identifier}]`);
|
|
4027
|
+
}
|
|
4030
4028
|
}
|
|
4031
|
-
isValidDrop(droppable, draggable) {
|
|
4032
|
-
return
|
|
4029
|
+
isValidDrop(droppable, draggable, responseIdentifierDraggable) {
|
|
4030
|
+
return this.responseIdentifier === responseIdentifierDraggable;
|
|
4033
4031
|
}
|
|
4034
4032
|
async moveDraggableToDroppable(draggable, droppable) {
|
|
4035
4033
|
const moveElement = () => {
|
|
@@ -4045,7 +4043,10 @@ var DroppablesMixin = (superClass, useShadowRoot, droppablesSelector) => {
|
|
|
4045
4043
|
const transition = document.startViewTransition(moveElement);
|
|
4046
4044
|
await transition.finished;
|
|
4047
4045
|
}
|
|
4048
|
-
deactivateDroppable(droppable) {
|
|
4046
|
+
deactivateDroppable(droppable, makeDragzoneActive = true) {
|
|
4047
|
+
if (makeDragzoneActive) {
|
|
4048
|
+
this._internals.states.add("--dragzone-active");
|
|
4049
|
+
}
|
|
4049
4050
|
droppable.removeAttribute("active");
|
|
4050
4051
|
}
|
|
4051
4052
|
dragleaveHandler(ev) {
|
|
@@ -4133,11 +4134,12 @@ import { property as property26 } from "lit/decorators.js";
|
|
|
4133
4134
|
// src/lib/decorators/live-query.ts
|
|
4134
4135
|
function liveQuery(querySelector, options) {
|
|
4135
4136
|
let observer;
|
|
4136
|
-
const resolvedOptions =
|
|
4137
|
+
const resolvedOptions = {
|
|
4138
|
+
...options
|
|
4139
|
+
};
|
|
4137
4140
|
return (proto, decoratedFnName) => {
|
|
4138
4141
|
const { connectedCallback, disconnectedCallback } = proto;
|
|
4139
4142
|
proto.connectedCallback = function() {
|
|
4140
|
-
var _a;
|
|
4141
4143
|
connectedCallback.call(this);
|
|
4142
4144
|
const callback = (mutationList) => {
|
|
4143
4145
|
const elementsToWatch = Array.from(this.querySelectorAll(querySelector));
|
|
@@ -4151,7 +4153,7 @@ function liveQuery(querySelector, options) {
|
|
|
4151
4153
|
};
|
|
4152
4154
|
observer = new MutationObserver(callback);
|
|
4153
4155
|
observer.observe(this, { childList: true, subtree: true });
|
|
4154
|
-
const elementsAdded =
|
|
4156
|
+
const elementsAdded = this.querySelectorAll(querySelector) ?? [];
|
|
4155
4157
|
this[decoratedFnName](Array.from(elementsAdded), []);
|
|
4156
4158
|
};
|
|
4157
4159
|
proto.disconnectedCallback = function() {
|
|
@@ -4182,11 +4184,19 @@ var DragDropInteractionMixin = (superClass, draggablesSelector, useShadowRootFor
|
|
|
4182
4184
|
this.handleDragStart = (ev) => {
|
|
4183
4185
|
const target = ev.currentTarget;
|
|
4184
4186
|
ev.dataTransfer.setData("text", target.getAttribute("identifier"));
|
|
4187
|
+
if (this.responseIdentifier) {
|
|
4188
|
+
ev.dataTransfer.setData("responseIdentifier", this.responseIdentifier);
|
|
4189
|
+
}
|
|
4190
|
+
this._internals.states.add("--dragzone-enabled");
|
|
4185
4191
|
target.setAttribute("dragging", "");
|
|
4186
|
-
this.
|
|
4192
|
+
this.activateDragLocation();
|
|
4193
|
+
this.activateDroppables(target);
|
|
4187
4194
|
};
|
|
4188
4195
|
this.handleDragEnd = async (ev) => {
|
|
4189
4196
|
ev.preventDefault();
|
|
4197
|
+
this._internals.states.delete("--dragzone-enabled");
|
|
4198
|
+
this._internals.states.delete("--dragzone-active");
|
|
4199
|
+
this.deactivateDragLocation();
|
|
4190
4200
|
this.deactivateDroppables();
|
|
4191
4201
|
const draggable = ev.currentTarget;
|
|
4192
4202
|
draggable.removeAttribute("dragging");
|
|
@@ -4197,38 +4207,6 @@ var DragDropInteractionMixin = (superClass, draggablesSelector, useShadowRootFor
|
|
|
4197
4207
|
}
|
|
4198
4208
|
}
|
|
4199
4209
|
};
|
|
4200
|
-
// MH: This method is just to make sure this can be tested.
|
|
4201
|
-
// because I can't get the dropEffect to be 'move' in the test
|
|
4202
|
-
this.checkForMoveTestItem = (ev) => {
|
|
4203
|
-
if (!ev.dataTransfer.items) {
|
|
4204
|
-
return Promise.resolve(false);
|
|
4205
|
-
}
|
|
4206
|
-
return new Promise((resolve) => {
|
|
4207
|
-
let hasMoveTestItem = false;
|
|
4208
|
-
const items = Array.from(ev.dataTransfer.items);
|
|
4209
|
-
const pending = items.length;
|
|
4210
|
-
if (pending === 0) {
|
|
4211
|
-
resolve(false);
|
|
4212
|
-
return;
|
|
4213
|
-
}
|
|
4214
|
-
items.forEach((item) => {
|
|
4215
|
-
if (item.kind === "string" && item.type === "text") {
|
|
4216
|
-
item.getAsString((data) => {
|
|
4217
|
-
if (data === "move-test") {
|
|
4218
|
-
hasMoveTestItem = true;
|
|
4219
|
-
}
|
|
4220
|
-
if (pending === 0) {
|
|
4221
|
-
resolve(hasMoveTestItem);
|
|
4222
|
-
}
|
|
4223
|
-
});
|
|
4224
|
-
} else {
|
|
4225
|
-
if (pending === 0) {
|
|
4226
|
-
resolve(hasMoveTestItem);
|
|
4227
|
-
}
|
|
4228
|
-
}
|
|
4229
|
-
});
|
|
4230
|
-
});
|
|
4231
|
-
};
|
|
4232
4210
|
}
|
|
4233
4211
|
handleDraggablesChange(dragsAdded, dragsRemoved) {
|
|
4234
4212
|
if (this.isMatchTabular()) return;
|
|
@@ -4280,16 +4258,56 @@ var DragDropInteractionMixin = (superClass, draggablesSelector, useShadowRootFor
|
|
|
4280
4258
|
this.droppables = Array.from(
|
|
4281
4259
|
useShadowRootForDroppables ? this.shadowRoot.querySelectorAll(droppablesSelector) : this.querySelectorAll(droppablesSelector)
|
|
4282
4260
|
);
|
|
4261
|
+
const choicesContainerWidth = this.dataset.choicesContainerWidth;
|
|
4262
|
+
if (choicesContainerWidth) {
|
|
4263
|
+
this.droppables.forEach((d) => {
|
|
4264
|
+
d.style.width = `${choicesContainerWidth}px`;
|
|
4265
|
+
d.style.boxSizing = `border-box`;
|
|
4266
|
+
});
|
|
4267
|
+
}
|
|
4268
|
+
}
|
|
4269
|
+
getDragContainers() {
|
|
4270
|
+
const draggleble = Array.from(this.querySelectorAll(`[part='drags']`) || []);
|
|
4271
|
+
const dragglebleShadow = this.shadowRoot ? Array.from(this.shadowRoot.querySelectorAll(`[part='drags']`) || []) : [];
|
|
4272
|
+
return draggleble.concat(dragglebleShadow);
|
|
4273
|
+
}
|
|
4274
|
+
activateDroppables(target) {
|
|
4275
|
+
const dragContainers = this.getDragContainers();
|
|
4276
|
+
dragContainers.forEach((d) => {
|
|
4277
|
+
d.setAttribute("enabled", "");
|
|
4278
|
+
d.setAttribute("dropzone", "move");
|
|
4279
|
+
if (d.hasAttribute("disabled")) {
|
|
4280
|
+
if (d.contains(target) || d.shadowRoot && d.shadowRoot.contains(target)) {
|
|
4281
|
+
d.removeAttribute("disabled");
|
|
4282
|
+
d.setAttribute("dropzone", "move");
|
|
4283
|
+
}
|
|
4284
|
+
}
|
|
4285
|
+
});
|
|
4286
|
+
this.droppables.forEach((d) => {
|
|
4287
|
+
d.setAttribute("enabled", "");
|
|
4288
|
+
if (d.hasAttribute("disabled")) {
|
|
4289
|
+
if (d.contains(target) || d.shadowRoot && d.shadowRoot.contains(target)) {
|
|
4290
|
+
d.removeAttribute("disabled");
|
|
4291
|
+
d.setAttribute("dropzone", "move");
|
|
4292
|
+
}
|
|
4293
|
+
}
|
|
4294
|
+
});
|
|
4283
4295
|
}
|
|
4284
|
-
|
|
4285
|
-
this.
|
|
4296
|
+
activateDragLocation() {
|
|
4297
|
+
this._internals.states.add("--dragzone-enabled");
|
|
4298
|
+
}
|
|
4299
|
+
deactivateDragLocation() {
|
|
4300
|
+
this._internals.states.delete("--dragzone-enabled");
|
|
4286
4301
|
}
|
|
4287
4302
|
deactivateDroppables() {
|
|
4303
|
+
const dragContainers = this.getDragContainers();
|
|
4304
|
+
dragContainers.forEach((d) => {
|
|
4305
|
+
d.removeAttribute("enabled");
|
|
4306
|
+
});
|
|
4288
4307
|
this.droppables.forEach((d) => d.removeAttribute("enabled"));
|
|
4289
4308
|
}
|
|
4290
4309
|
async wasDropped(ev) {
|
|
4291
|
-
|
|
4292
|
-
return ev.dataTransfer.dropEffect !== "none" || hasMoveTestItem;
|
|
4310
|
+
return ev.dataTransfer.dropEffect !== "none";
|
|
4293
4311
|
}
|
|
4294
4312
|
wasMoved(ev) {
|
|
4295
4313
|
return ev.dataTransfer.dropEffect === "move";
|
|
@@ -4312,6 +4330,35 @@ var DragDropInteractionMixin = (superClass, draggablesSelector, useShadowRootFor
|
|
|
4312
4330
|
moveDraggable(draggable, parent, index);
|
|
4313
4331
|
});
|
|
4314
4332
|
}
|
|
4333
|
+
validate() {
|
|
4334
|
+
const validAssociations = this.getValidAssociations();
|
|
4335
|
+
let isValid = true;
|
|
4336
|
+
let validityMessage = "";
|
|
4337
|
+
if (this.maxAssociations > 0 && validAssociations > this.maxAssociations) {
|
|
4338
|
+
isValid = false;
|
|
4339
|
+
validityMessage = this.dataset.maxSelectionsMessage || `You've selected too many associations. Maximum allowed is ${this.maxAssociations}.`;
|
|
4340
|
+
} else if (this.minAssociations > 0 && validAssociations < this.minAssociations) {
|
|
4341
|
+
isValid = false;
|
|
4342
|
+
validityMessage = this.dataset.minSelectionsMessage || `You haven't selected enough associations. Minimum required is ${this.minAssociations}.`;
|
|
4343
|
+
}
|
|
4344
|
+
const lastElementChild = this.lastElementChild;
|
|
4345
|
+
this._internals.setValidity(isValid ? {} : { customError: true }, validityMessage, lastElementChild);
|
|
4346
|
+
this.reportValidity();
|
|
4347
|
+
return isValid;
|
|
4348
|
+
}
|
|
4349
|
+
reportValidity() {
|
|
4350
|
+
const validationMessageElement = this.shadowRoot.querySelector("#validationMessage");
|
|
4351
|
+
if (validationMessageElement) {
|
|
4352
|
+
if (!this._internals.validity.valid) {
|
|
4353
|
+
validationMessageElement.textContent = this._internals.validationMessage;
|
|
4354
|
+
validationMessageElement.style.display = "block";
|
|
4355
|
+
} else {
|
|
4356
|
+
validationMessageElement.textContent = "";
|
|
4357
|
+
validationMessageElement.style.display = "none";
|
|
4358
|
+
}
|
|
4359
|
+
}
|
|
4360
|
+
return this._internals.validity.valid;
|
|
4361
|
+
}
|
|
4315
4362
|
checkMaxAssociations() {
|
|
4316
4363
|
this.droppables.forEach((d, index) => {
|
|
4317
4364
|
const maxMatch = +(d.getAttribute("match-max") || 1);
|
|
@@ -4338,7 +4385,16 @@ var DragDropInteractionMixin = (superClass, draggablesSelector, useShadowRootFor
|
|
|
4338
4385
|
set value(value) {
|
|
4339
4386
|
if (this.isMatchTabular()) return;
|
|
4340
4387
|
this.resetDroppables();
|
|
4341
|
-
value
|
|
4388
|
+
value?.forEach((entry) => this.placeResponse(entry));
|
|
4389
|
+
if (Array.isArray(value)) {
|
|
4390
|
+
const formData = new FormData();
|
|
4391
|
+
value.forEach((response) => {
|
|
4392
|
+
formData.append(this.responseIdentifier, response);
|
|
4393
|
+
});
|
|
4394
|
+
this._internals.setFormValue(formData);
|
|
4395
|
+
} else {
|
|
4396
|
+
this._internals.setFormValue(value);
|
|
4397
|
+
}
|
|
4342
4398
|
}
|
|
4343
4399
|
placeResponse(response) {
|
|
4344
4400
|
const [dropId, ...dragIds] = response.split(" ").reverse();
|
|
@@ -4366,14 +4422,11 @@ var DragDropInteractionMixin = (superClass, draggablesSelector, useShadowRootFor
|
|
|
4366
4422
|
await transition.finished;
|
|
4367
4423
|
}
|
|
4368
4424
|
}
|
|
4369
|
-
validate() {
|
|
4370
|
-
const validAssociations = this.getValidAssociations();
|
|
4371
|
-
return this.minAssociations <= 0 || this.minAssociations <= validAssociations;
|
|
4372
|
-
}
|
|
4373
4425
|
getValidAssociations() {
|
|
4374
4426
|
return this.droppables.filter((d) => d.childElementCount > 0).length;
|
|
4375
4427
|
}
|
|
4376
4428
|
saveResponse() {
|
|
4429
|
+
this.validate();
|
|
4377
4430
|
const response = this.collectResponseData();
|
|
4378
4431
|
this.dispatchEvent(
|
|
4379
4432
|
new CustomEvent("qti-interaction-response", {
|
|
@@ -4481,9 +4534,10 @@ var QtiAssociateInteraction = class extends DragDropInteractionMixin(
|
|
|
4481
4534
|
<div part="drop-container">
|
|
4482
4535
|
${this._childrenMap.length > 0 && Array.from(Array(Math.ceil(this._childrenMap.length / 2)).keys()).map(
|
|
4483
4536
|
(_, index) => html28`<div part="associables-container">
|
|
4484
|
-
|
|
4485
|
-
|
|
4486
|
-
|
|
4537
|
+
<div name="left${index}" part="drop-list" class="dl" identifier="droplist${index}_left"></div>
|
|
4538
|
+
<div name="right${index}" part="drop-list" class="dl" identifier="droplist${index}_right"></div>
|
|
4539
|
+
</div>
|
|
4540
|
+
<div role="alert" id="validationMessage"></div>`
|
|
4487
4541
|
)}
|
|
4488
4542
|
</div>`;
|
|
4489
4543
|
}
|
|
@@ -4524,7 +4578,7 @@ var QtiCustomInteraction = class extends Interaction {
|
|
|
4524
4578
|
// is embedded in an iframe and coming from another domain
|
|
4525
4579
|
// Therefor we need to use the new CES API to communicates via the broadcast API
|
|
4526
4580
|
setupCES() {
|
|
4527
|
-
const iframe = this.shadowRoot.querySelector("#pciContainer"),
|
|
4581
|
+
const iframe = this.shadowRoot.querySelector("#pciContainer"), iframeDoc = iframe.contentDocument;
|
|
4528
4582
|
window.addEventListener("message", this.handlePostMessage);
|
|
4529
4583
|
iframeDoc.open();
|
|
4530
4584
|
iframeDoc.write(`
|
|
@@ -4681,12 +4735,12 @@ var QtiEndAttemptInteraction = class extends Interaction {
|
|
|
4681
4735
|
get value() {
|
|
4682
4736
|
return "";
|
|
4683
4737
|
}
|
|
4684
|
-
set value(
|
|
4738
|
+
set value(_) {
|
|
4685
4739
|
}
|
|
4686
4740
|
render() {
|
|
4687
4741
|
return html30`<button ?disabled=${this.disabled} part="button" @click=${this.endAttempt}>${this.title}</button>`;
|
|
4688
4742
|
}
|
|
4689
|
-
endAttempt(
|
|
4743
|
+
endAttempt(_) {
|
|
4690
4744
|
this.dispatchEvent(
|
|
4691
4745
|
new CustomEvent("end-attempt", {
|
|
4692
4746
|
bubbles: true,
|
|
@@ -4707,11 +4761,99 @@ QtiEndAttemptInteraction = __decorateClass([
|
|
|
4707
4761
|
], QtiEndAttemptInteraction);
|
|
4708
4762
|
|
|
4709
4763
|
// src/lib/qti-components/qti-interaction/qti-gap-match-interaction/qti-gap-match-interaction.ts
|
|
4710
|
-
import {
|
|
4764
|
+
import { html as html31 } from "lit";
|
|
4711
4765
|
import { customElement as customElement27 } from "lit/decorators.js";
|
|
4766
|
+
|
|
4767
|
+
// src/lib/qti-components/qti-interaction/qti-gap-match-interaction/qti-gap-match-interaction.styles.ts
|
|
4768
|
+
import { css as css16 } from "lit";
|
|
4769
|
+
var qti_gap_match_interaction_styles_default = css16`
|
|
4770
|
+
:host {
|
|
4771
|
+
display: flex;
|
|
4772
|
+
align-items: flex-start;
|
|
4773
|
+
flex-direction: column;
|
|
4774
|
+
flex-wrap: wrap;
|
|
4775
|
+
gap: 0.5rem;
|
|
4776
|
+
}
|
|
4777
|
+
|
|
4778
|
+
:host(.qti-choices-top) {
|
|
4779
|
+
flex-direction: column;
|
|
4780
|
+
}
|
|
4781
|
+
:host(.qti-choices-bottom) {
|
|
4782
|
+
flex-direction: column-reverse;
|
|
4783
|
+
}
|
|
4784
|
+
:host(.qti-choices-left) {
|
|
4785
|
+
flex-direction: row;
|
|
4786
|
+
}
|
|
4787
|
+
:host(.qti-choices-right) {
|
|
4788
|
+
flex-direction: row-reverse;
|
|
4789
|
+
}
|
|
4790
|
+
/* [part='drops'] , */
|
|
4791
|
+
[name='prompt'] {
|
|
4792
|
+
width: 100%;
|
|
4793
|
+
}
|
|
4794
|
+
[name='drags'] {
|
|
4795
|
+
display: flex;
|
|
4796
|
+
align-items: flex-start;
|
|
4797
|
+
flex: 1;
|
|
4798
|
+
border: 2px solid transparent;
|
|
4799
|
+
padding: 0.3rem;
|
|
4800
|
+
border-radius: 0.3rem;
|
|
4801
|
+
gap: 0.5rem;
|
|
4802
|
+
}
|
|
4803
|
+
`;
|
|
4804
|
+
|
|
4805
|
+
// src/lib/qti-components/qti-interaction/qti-gap-match-interaction/qti-gap-match-interaction.ts
|
|
4712
4806
|
var QtiGapMatchInteraction = class extends DragDropInteractionMixin(Interaction, "qti-gap-text", false, "qti-gap") {
|
|
4807
|
+
constructor() {
|
|
4808
|
+
super(...arguments);
|
|
4809
|
+
this.observer = null;
|
|
4810
|
+
this.resizeObserver = null;
|
|
4811
|
+
}
|
|
4713
4812
|
render() {
|
|
4714
|
-
return html31`<slot name="prompt"> </slot
|
|
4813
|
+
return html31`<slot name="prompt"> </slot>
|
|
4814
|
+
<slot part="drags" name="drags"></slot>
|
|
4815
|
+
<slot part="drops"></slot>
|
|
4816
|
+
<div role="alert" id="validationMessage"></div>`;
|
|
4817
|
+
}
|
|
4818
|
+
firstUpdated(_changedProperties) {
|
|
4819
|
+
super.firstUpdated(_changedProperties);
|
|
4820
|
+
this.updateMinDimensionsForDrowZones();
|
|
4821
|
+
this.observer = new MutationObserver(() => this.updateMinDimensionsForDrowZones());
|
|
4822
|
+
this.observer.observe(this, { childList: true, subtree: true });
|
|
4823
|
+
this.resizeObserver = new ResizeObserver(() => this.updateMinDimensionsForDrowZones());
|
|
4824
|
+
const gapTexts = this.querySelectorAll("qti-gap-text");
|
|
4825
|
+
gapTexts.forEach((gapText) => this.resizeObserver?.observe(gapText));
|
|
4826
|
+
}
|
|
4827
|
+
disconnectedCallback() {
|
|
4828
|
+
super.disconnectedCallback();
|
|
4829
|
+
if (this.observer) {
|
|
4830
|
+
this.observer.disconnect();
|
|
4831
|
+
this.observer = null;
|
|
4832
|
+
}
|
|
4833
|
+
if (this.resizeObserver) {
|
|
4834
|
+
this.resizeObserver.disconnect();
|
|
4835
|
+
this.resizeObserver = null;
|
|
4836
|
+
}
|
|
4837
|
+
}
|
|
4838
|
+
updateMinDimensionsForDrowZones() {
|
|
4839
|
+
const gapTexts = this.querySelectorAll("qti-gap-text");
|
|
4840
|
+
const gaps = this.querySelectorAll("qti-gap");
|
|
4841
|
+
let maxHeight = 0;
|
|
4842
|
+
let maxWidth = 0;
|
|
4843
|
+
gapTexts.forEach((gapText) => {
|
|
4844
|
+
const rect = gapText.getBoundingClientRect();
|
|
4845
|
+
maxHeight = Math.max(maxHeight, rect.height);
|
|
4846
|
+
maxWidth = Math.max(maxWidth, rect.width);
|
|
4847
|
+
});
|
|
4848
|
+
const dragSlot = this.shadowRoot?.querySelector('[part="drags"]');
|
|
4849
|
+
if (dragSlot) {
|
|
4850
|
+
dragSlot.style.minHeight = `${maxHeight}px`;
|
|
4851
|
+
dragSlot.style.minWidth = `${maxWidth}px`;
|
|
4852
|
+
}
|
|
4853
|
+
for (const gap of gaps) {
|
|
4854
|
+
gap.style.minHeight = `${maxHeight}px`;
|
|
4855
|
+
gap.style.minWidth = `${maxWidth}px`;
|
|
4856
|
+
}
|
|
4715
4857
|
}
|
|
4716
4858
|
set correctResponse(value) {
|
|
4717
4859
|
let matches = [];
|
|
@@ -4723,54 +4865,24 @@ var QtiGapMatchInteraction = class extends DragDropInteractionMixin(Interaction,
|
|
|
4723
4865
|
});
|
|
4724
4866
|
}
|
|
4725
4867
|
const gaps = this.querySelectorAll("qti-gap");
|
|
4726
|
-
gaps.forEach((gap
|
|
4727
|
-
var _a, _b, _c, _d;
|
|
4868
|
+
gaps.forEach((gap) => {
|
|
4728
4869
|
const identifier = gap.getAttribute("identifier");
|
|
4729
|
-
const textIdentifier =
|
|
4730
|
-
const text =
|
|
4870
|
+
const textIdentifier = matches.find((x) => x.gap === identifier)?.text;
|
|
4871
|
+
const text = this.querySelector(`qti-gap-text[identifier="${textIdentifier}"]`)?.textContent.trim();
|
|
4731
4872
|
if (textIdentifier && text) {
|
|
4732
|
-
if (!
|
|
4873
|
+
if (!gap.nextElementSibling?.classList.contains("correct-option")) {
|
|
4733
4874
|
const textSpan = document.createElement("span");
|
|
4734
4875
|
textSpan.classList.add("correct-option");
|
|
4735
4876
|
textSpan.textContent = text;
|
|
4736
4877
|
gap.insertAdjacentElement("afterend", textSpan);
|
|
4737
4878
|
}
|
|
4738
|
-
} else if (
|
|
4879
|
+
} else if (gap.nextElementSibling?.classList.contains("correct-option")) {
|
|
4739
4880
|
gap.nextElementSibling.remove();
|
|
4740
4881
|
}
|
|
4741
4882
|
});
|
|
4742
4883
|
}
|
|
4743
4884
|
};
|
|
4744
|
-
QtiGapMatchInteraction.styles =
|
|
4745
|
-
css16`
|
|
4746
|
-
:host {
|
|
4747
|
-
display: flex;
|
|
4748
|
-
align-items: flex-start;
|
|
4749
|
-
flex-direction: column;
|
|
4750
|
-
gap: 0.5rem;
|
|
4751
|
-
}
|
|
4752
|
-
|
|
4753
|
-
:host(.qti-choices-top) {
|
|
4754
|
-
flex-direction: column;
|
|
4755
|
-
}
|
|
4756
|
-
:host(.qti-choices-bottom) {
|
|
4757
|
-
flex-direction: column-reverse;
|
|
4758
|
-
}
|
|
4759
|
-
:host(.qti-choices-left) {
|
|
4760
|
-
flex-direction: row;
|
|
4761
|
-
}
|
|
4762
|
-
:host(.qti-choices-right) {
|
|
4763
|
-
flex-direction: row-reverse;
|
|
4764
|
-
}
|
|
4765
|
-
/* [part='drops'] , */
|
|
4766
|
-
[part='drags'] {
|
|
4767
|
-
display: flex;
|
|
4768
|
-
align-items: flex-start;
|
|
4769
|
-
flex: 1;
|
|
4770
|
-
gap: 0.5rem;
|
|
4771
|
-
}
|
|
4772
|
-
`
|
|
4773
|
-
];
|
|
4885
|
+
QtiGapMatchInteraction.styles = qti_gap_match_interaction_styles_default;
|
|
4774
4886
|
QtiGapMatchInteraction = __decorateClass([
|
|
4775
4887
|
customElement27("qti-gap-match-interaction")
|
|
4776
4888
|
], QtiGapMatchInteraction);
|
|
@@ -4869,13 +4981,12 @@ var QtiGraphicAssociateInteraction = class extends Interaction {
|
|
|
4869
4981
|
return this._lines;
|
|
4870
4982
|
}
|
|
4871
4983
|
render() {
|
|
4872
|
-
var _a, _b, _c, _d;
|
|
4873
4984
|
return html32`<slot name="prompt"></slot>
|
|
4874
4985
|
<line-container>
|
|
4875
4986
|
<svg
|
|
4876
|
-
width=${ifDefined3(
|
|
4877
|
-
height=${ifDefined3(
|
|
4878
|
-
viewbox="0 0 ${
|
|
4987
|
+
width=${ifDefined3(this.grImage[0]?.width)}
|
|
4988
|
+
height=${ifDefined3(this.grImage[0]?.height)}
|
|
4989
|
+
viewbox="0 0 ${this.grImage[0]?.width} ${this.grImage[0]?.height}"
|
|
4879
4990
|
>
|
|
4880
4991
|
${repeat(
|
|
4881
4992
|
this._lines,
|
|
@@ -4908,7 +5019,8 @@ var QtiGraphicAssociateInteraction = class extends Interaction {
|
|
|
4908
5019
|
/>`}
|
|
4909
5020
|
</svg>
|
|
4910
5021
|
<slot></slot>
|
|
4911
|
-
</line-container
|
|
5022
|
+
</line-container>
|
|
5023
|
+
<div role="alert" id="validationMessage"></div>`;
|
|
4912
5024
|
}
|
|
4913
5025
|
positionHotspotOnRegister(e) {
|
|
4914
5026
|
const img = this.querySelector("img");
|
|
@@ -5002,21 +5114,116 @@ QtiGraphicAssociateInteraction = __decorateClass([
|
|
|
5002
5114
|
], QtiGraphicAssociateInteraction);
|
|
5003
5115
|
|
|
5004
5116
|
// src/lib/qti-components/qti-interaction/qti-graphic-gap-match-interaction/qti-graphic-gap-match-interaction.ts
|
|
5005
|
-
import {
|
|
5117
|
+
import { html as html33 } from "lit";
|
|
5006
5118
|
import { customElement as customElement29 } from "lit/decorators.js";
|
|
5119
|
+
|
|
5120
|
+
// src/lib/qti-components/qti-interaction/qti-graphic-gap-match-interaction/qti-graphic-gap-match-interaction.styles.ts
|
|
5121
|
+
import { css as css18 } from "lit";
|
|
5122
|
+
var qti_graphic_gap_match_interaction_styles_default = css18`
|
|
5123
|
+
:host {
|
|
5124
|
+
display: flex;
|
|
5125
|
+
align-items: flex-start;
|
|
5126
|
+
flex-direction: column;
|
|
5127
|
+
flex-wrap: wrap;
|
|
5128
|
+
gap: 0.5rem;
|
|
5129
|
+
}
|
|
5130
|
+
|
|
5131
|
+
:host(.qti-choices-top) {
|
|
5132
|
+
flex-direction: column-reverse;
|
|
5133
|
+
}
|
|
5134
|
+
:host(.qti-choices-bottom) {
|
|
5135
|
+
flex-direction: column;
|
|
5136
|
+
}
|
|
5137
|
+
:host(.qti-choices-left) {
|
|
5138
|
+
flex-direction: row-reverse;
|
|
5139
|
+
& [name='drags'] {
|
|
5140
|
+
width: 25%;
|
|
5141
|
+
}
|
|
5142
|
+
& [part='image'] {
|
|
5143
|
+
width: 75%;
|
|
5144
|
+
}
|
|
5145
|
+
}
|
|
5146
|
+
:host(.qti-choices-right) {
|
|
5147
|
+
flex-direction: row;
|
|
5148
|
+
& [name='drags'] {
|
|
5149
|
+
width: 25%;
|
|
5150
|
+
}
|
|
5151
|
+
& [part='image'] {
|
|
5152
|
+
width: 75%;
|
|
5153
|
+
}
|
|
5154
|
+
}
|
|
5155
|
+
[part='image'] {
|
|
5156
|
+
display: block;
|
|
5157
|
+
position: relative;
|
|
5158
|
+
}
|
|
5159
|
+
/* [part='drops'] , */
|
|
5160
|
+
|
|
5161
|
+
[name='drags'] {
|
|
5162
|
+
display: flex;
|
|
5163
|
+
align-items: flex-start;
|
|
5164
|
+
flex-wrap: wrap;
|
|
5165
|
+
flex: 1;
|
|
5166
|
+
border: 2px solid transparent;
|
|
5167
|
+
padding: 0.3rem;
|
|
5168
|
+
border-radius: 0.3rem;
|
|
5169
|
+
gap: 0.5rem;
|
|
5170
|
+
}
|
|
5171
|
+
::slotted(img) {
|
|
5172
|
+
display: inline-block;
|
|
5173
|
+
user-select: none;
|
|
5174
|
+
pointer-events: none;
|
|
5175
|
+
}
|
|
5176
|
+
`;
|
|
5177
|
+
|
|
5178
|
+
// src/lib/qti-components/qti-interaction/qti-graphic-gap-match-interaction/qti-graphic-gap-match-interaction.ts
|
|
5007
5179
|
var QtiGraphicGapMatchInteraction = class extends DragDropInteractionMixin(
|
|
5008
5180
|
Interaction,
|
|
5009
|
-
"qti-gap-img",
|
|
5181
|
+
"qti-gap-img, qti-gap-text",
|
|
5010
5182
|
false,
|
|
5011
5183
|
"qti-associable-hotspot"
|
|
5012
5184
|
) {
|
|
5185
|
+
constructor() {
|
|
5186
|
+
super(...arguments);
|
|
5187
|
+
this.observer = null;
|
|
5188
|
+
this.resizeObserver = null;
|
|
5189
|
+
}
|
|
5013
5190
|
render() {
|
|
5014
5191
|
return html33` <slot name="prompt"></slot>
|
|
5015
|
-
<slot></slot>
|
|
5016
|
-
<slot name="
|
|
5192
|
+
<slot part="image"></slot>
|
|
5193
|
+
<slot part="drags" name="drags"></slot>
|
|
5194
|
+
<div role="alert" id="validationMessage"></div>`;
|
|
5195
|
+
}
|
|
5196
|
+
firstUpdated(_changedProperties) {
|
|
5197
|
+
super.firstUpdated(_changedProperties);
|
|
5198
|
+
this.updateMinDimensionsForDrowZones();
|
|
5199
|
+
this.observer = new MutationObserver(() => this.updateMinDimensionsForDrowZones());
|
|
5200
|
+
this.observer.observe(this, { childList: true, subtree: true });
|
|
5201
|
+
this.resizeObserver = new ResizeObserver(() => this.updateMinDimensionsForDrowZones());
|
|
5202
|
+
const draggableGaps = this.querySelectorAll("qti-gap-img, qti-gap-text");
|
|
5203
|
+
draggableGaps.forEach((gapText) => this.resizeObserver?.observe(gapText));
|
|
5204
|
+
}
|
|
5205
|
+
updateMinDimensionsForDrowZones() {
|
|
5206
|
+
const draggableGaps = this.querySelectorAll("qti-gap-img, qti-gap-text");
|
|
5207
|
+
const gaps = this.querySelectorAll("qti-associable-hotspot");
|
|
5208
|
+
let maxHeight = 0;
|
|
5209
|
+
let maxWidth = 0;
|
|
5210
|
+
draggableGaps.forEach((gapText) => {
|
|
5211
|
+
const rect = gapText.getBoundingClientRect();
|
|
5212
|
+
maxHeight = Math.max(maxHeight, rect.height);
|
|
5213
|
+
maxWidth = Math.max(maxWidth, rect.width);
|
|
5214
|
+
});
|
|
5215
|
+
const slots = this.shadowRoot.querySelectorAll("slot");
|
|
5216
|
+
const dragSlot = Array.from(slots).find((slot) => slot.name === "drags");
|
|
5217
|
+
if (dragSlot) {
|
|
5218
|
+
dragSlot.style.minHeight = `${maxHeight}px`;
|
|
5219
|
+
dragSlot.style.minWidth = `${maxWidth}px`;
|
|
5220
|
+
}
|
|
5221
|
+
for (const gap of gaps) {
|
|
5222
|
+
gap.style.minHeight = `${maxHeight}px`;
|
|
5223
|
+
gap.style.minWidth = `${maxWidth}px`;
|
|
5224
|
+
}
|
|
5017
5225
|
}
|
|
5018
5226
|
positionHotspotOnRegister(e) {
|
|
5019
|
-
const img = this.querySelector("img");
|
|
5020
5227
|
const hotspot = e.target;
|
|
5021
5228
|
const coords = hotspot.getAttribute("coords");
|
|
5022
5229
|
const shape = hotspot.getAttribute("shape");
|
|
@@ -5052,16 +5259,7 @@ var QtiGraphicGapMatchInteraction = class extends DragDropInteractionMixin(
|
|
|
5052
5259
|
this.removeEventListener("qti-register-hotspot", this.positionHotspotOnRegister);
|
|
5053
5260
|
}
|
|
5054
5261
|
};
|
|
5055
|
-
QtiGraphicGapMatchInteraction.styles =
|
|
5056
|
-
:host {
|
|
5057
|
-
display: inline-block;
|
|
5058
|
-
position: relative;
|
|
5059
|
-
}
|
|
5060
|
-
slot[name='qti-gap-img'] {
|
|
5061
|
-
display: flex;
|
|
5062
|
-
gap: 1rem;
|
|
5063
|
-
}
|
|
5064
|
-
`;
|
|
5262
|
+
QtiGraphicGapMatchInteraction.styles = qti_graphic_gap_match_interaction_styles_default;
|
|
5065
5263
|
QtiGraphicGapMatchInteraction = __decorateClass([
|
|
5066
5264
|
customElement29("qti-graphic-gap-match-interaction")
|
|
5067
5265
|
], QtiGraphicGapMatchInteraction);
|
|
@@ -5080,6 +5278,7 @@ var QtiGraphicOrderInteraction = class extends ChoicesMixin(Interaction, "qti-ho
|
|
|
5080
5278
|
<!-- slot for the prompt -->
|
|
5081
5279
|
<slot></slot>
|
|
5082
5280
|
<!-- slot for the image and hotspots -->
|
|
5281
|
+
<div role="alert" id="validationMessage"></div>
|
|
5083
5282
|
`;
|
|
5084
5283
|
}
|
|
5085
5284
|
setHotspotOrder(e) {
|
|
@@ -5203,9 +5402,9 @@ import { customElement as customElement33, property as property30, state as stat
|
|
|
5203
5402
|
import { unsafeHTML as unsafeHTML2 } from "lit/directives/unsafe-html.js";
|
|
5204
5403
|
|
|
5205
5404
|
// src/lib/qti-components/qti-interaction/qti-simple-associable-choice.ts
|
|
5206
|
-
import { css as css21, html as html36, LitElement as
|
|
5405
|
+
import { css as css21, html as html36, LitElement as LitElement20 } from "lit";
|
|
5207
5406
|
import { customElement as customElement32, property as property29 } from "lit/decorators.js";
|
|
5208
|
-
var QtiSimpleAssociableChoice = class extends ActiveElementMixin(
|
|
5407
|
+
var QtiSimpleAssociableChoice = class extends ActiveElementMixin(LitElement20, "qti-simple-associable-choice") {
|
|
5209
5408
|
constructor() {
|
|
5210
5409
|
super(...arguments);
|
|
5211
5410
|
this.matchMin = 0;
|
|
@@ -5381,20 +5580,21 @@ var QtiMatchInteraction = class extends DragDropInteractionMixin(
|
|
|
5381
5580
|
}
|
|
5382
5581
|
render() {
|
|
5383
5582
|
if (!this.classList.contains("qti-match-tabular")) {
|
|
5384
|
-
return html37`<slot name="prompt"></slot> <slot></slot
|
|
5583
|
+
return html37`<slot name="prompt"></slot> <slot></slot>
|
|
5584
|
+
<div role="alert" id="validationMessage"></div>`;
|
|
5385
5585
|
}
|
|
5386
5586
|
return html37`
|
|
5387
5587
|
<slot name="prompt"></slot>
|
|
5388
5588
|
<table>
|
|
5389
5589
|
<tr>
|
|
5390
5590
|
<td></td>
|
|
5391
|
-
${this.cols.map((col
|
|
5591
|
+
${this.cols.map((col) => html37`<th part="r-header">${unsafeHTML2(col.innerHTML)}</th>`)}
|
|
5392
5592
|
</tr>
|
|
5393
5593
|
|
|
5394
5594
|
${this.rows.map(
|
|
5395
|
-
(row
|
|
5595
|
+
(row) => html37`<tr>
|
|
5396
5596
|
<td part="c-header">${unsafeHTML2(row.innerHTML)}</td>
|
|
5397
|
-
${this.cols.map((col
|
|
5597
|
+
${this.cols.map((col) => {
|
|
5398
5598
|
const rowId = row.getAttribute("identifier");
|
|
5399
5599
|
const colId = col.getAttribute("identifier");
|
|
5400
5600
|
const value = `${rowId} ${colId}`;
|
|
@@ -5459,13 +5659,16 @@ var QtiMediaInteraction = class extends Interaction {
|
|
|
5459
5659
|
}
|
|
5460
5660
|
}
|
|
5461
5661
|
static get properties() {
|
|
5462
|
-
return
|
|
5463
|
-
|
|
5464
|
-
|
|
5465
|
-
|
|
5466
|
-
|
|
5662
|
+
return {
|
|
5663
|
+
...Interaction.properties,
|
|
5664
|
+
...{
|
|
5665
|
+
step: {
|
|
5666
|
+
type: Number,
|
|
5667
|
+
attribute: "step",
|
|
5668
|
+
default: 10
|
|
5669
|
+
}
|
|
5467
5670
|
}
|
|
5468
|
-
}
|
|
5671
|
+
};
|
|
5469
5672
|
}
|
|
5470
5673
|
render() {
|
|
5471
5674
|
return html38` <slot name="prompt"></slot>
|
|
@@ -5523,12 +5726,12 @@ var QtiOrderInteraction = class extends ShuffleMixin(
|
|
|
5523
5726
|
}
|
|
5524
5727
|
if (this.correctResponses.length === 0) {
|
|
5525
5728
|
const responses = Array.isArray(value) ? value : [value];
|
|
5526
|
-
responses.forEach((response
|
|
5729
|
+
responses.forEach((response) => {
|
|
5527
5730
|
let simpleChoice = this.querySelector(`qti-simple-choice[identifier="${response}"]`);
|
|
5528
5731
|
if (!simpleChoice) {
|
|
5529
5732
|
simpleChoice = this.shadowRoot.querySelector(`qti-simple-choice[identifier="${response}"]`);
|
|
5530
5733
|
}
|
|
5531
|
-
const text = simpleChoice
|
|
5734
|
+
const text = simpleChoice?.textContent.trim();
|
|
5532
5735
|
this.correctResponses = [...this.correctResponses, text];
|
|
5533
5736
|
});
|
|
5534
5737
|
}
|
|
@@ -5622,13 +5825,13 @@ QtiOrderInteraction = __decorateClass([
|
|
|
5622
5825
|
], QtiOrderInteraction);
|
|
5623
5826
|
|
|
5624
5827
|
// src/lib/qti-components/qti-interaction/qti-position-object-interaction/qti-position-object-interaction.ts
|
|
5625
|
-
import { LitElement as
|
|
5626
|
-
var
|
|
5828
|
+
import { LitElement as LitElement21, css as css25, html as html40 } from "lit";
|
|
5829
|
+
var QtiPositionObjectInteraction = class extends LitElement21 {
|
|
5627
5830
|
render() {
|
|
5628
5831
|
return html40`<slot></slot>`;
|
|
5629
5832
|
}
|
|
5630
5833
|
};
|
|
5631
|
-
|
|
5834
|
+
QtiPositionObjectInteraction.styles = [
|
|
5632
5835
|
css25`
|
|
5633
5836
|
:host {
|
|
5634
5837
|
display: block;
|
|
@@ -5642,12 +5845,12 @@ QtiSPositionObjectInteraction.styles = [
|
|
|
5642
5845
|
}
|
|
5643
5846
|
`
|
|
5644
5847
|
];
|
|
5645
|
-
customElements.define("qti-position-object-interaction",
|
|
5848
|
+
customElements.define("qti-position-object-interaction", QtiPositionObjectInteraction);
|
|
5646
5849
|
|
|
5647
5850
|
// src/lib/qti-components/qti-interaction/qti-position-object-interaction/qti-position-object-stage.ts
|
|
5648
|
-
import { LitElement as
|
|
5851
|
+
import { LitElement as LitElement22, css as css26, html as html41 } from "lit";
|
|
5649
5852
|
import { customElement as customElement36 } from "lit/decorators.js";
|
|
5650
|
-
var QtiPositionObjectStage = class extends
|
|
5853
|
+
var QtiPositionObjectStage = class extends LitElement22 {
|
|
5651
5854
|
render() {
|
|
5652
5855
|
return html41`<slot></slot>`;
|
|
5653
5856
|
}
|
|
@@ -5678,7 +5881,7 @@ var QtiPositionObjectStage = class extends LitElement30 {
|
|
|
5678
5881
|
});
|
|
5679
5882
|
document.addEventListener("mouseup", this.removeMoveListener);
|
|
5680
5883
|
}
|
|
5681
|
-
removeMoveListener(
|
|
5884
|
+
removeMoveListener() {
|
|
5682
5885
|
document.removeEventListener("mousemove", this.dragElementHandler, true);
|
|
5683
5886
|
}
|
|
5684
5887
|
disconnectedCallback() {
|
|
@@ -5816,9 +6019,9 @@ var QtiSliderInteraction = class extends Interaction {
|
|
|
5816
6019
|
this._value = 0;
|
|
5817
6020
|
this.stepLabel = false;
|
|
5818
6021
|
this.reverse = false;
|
|
5819
|
-
this._handleDisabledChange = (
|
|
6022
|
+
this._handleDisabledChange = () => {
|
|
5820
6023
|
};
|
|
5821
|
-
this._handleReadonlyChange = (
|
|
6024
|
+
this._handleReadonlyChange = () => {
|
|
5822
6025
|
};
|
|
5823
6026
|
this.csLive = getComputedStyle(this);
|
|
5824
6027
|
}
|
|
@@ -5965,9 +6168,6 @@ var QtiSliderInteraction = class extends Interaction {
|
|
|
5965
6168
|
}
|
|
5966
6169
|
};
|
|
5967
6170
|
QtiSliderInteraction.styles = [css28``];
|
|
5968
|
-
__decorateClass([
|
|
5969
|
-
query3("#knob")
|
|
5970
|
-
], QtiSliderInteraction.prototype, "_knob", 2);
|
|
5971
6171
|
__decorateClass([
|
|
5972
6172
|
query3("#rail")
|
|
5973
6173
|
], QtiSliderInteraction.prototype, "_rail", 2);
|
|
@@ -5998,39 +6198,29 @@ QtiSliderInteraction = __decorateClass([
|
|
|
5998
6198
|
|
|
5999
6199
|
// src/lib/qti-components/qti-custom-operator/qti-custom-operator.ts
|
|
6000
6200
|
import { consume as consume6 } from "@lit/context";
|
|
6001
|
-
import { LitElement as
|
|
6201
|
+
import { LitElement as LitElement23, html as html44 } from "lit";
|
|
6002
6202
|
import { customElement as customElement39, state as state17 } from "lit/decorators.js";
|
|
6003
|
-
var QtiCustomOperator = class extends
|
|
6203
|
+
var QtiCustomOperator = class extends LitElement23 {
|
|
6004
6204
|
render() {
|
|
6005
6205
|
return html44`<slot @slotchange=${this.handleSlotChange}></slot>`;
|
|
6006
6206
|
}
|
|
6007
|
-
handleSlotChange(
|
|
6008
|
-
|
|
6009
|
-
const commentNode = Array.from((_b = (_a = this.firstElementChild) == null ? void 0 : _a.childNodes) != null ? _b : []).find(
|
|
6207
|
+
handleSlotChange() {
|
|
6208
|
+
const commentNode = Array.from(this.firstElementChild?.childNodes ?? []).find(
|
|
6010
6209
|
(node) => node.nodeType === Node.COMMENT_NODE
|
|
6011
6210
|
);
|
|
6012
6211
|
try {
|
|
6013
|
-
this.operatorFunction = new Function("context", "fn", "item",
|
|
6212
|
+
this.operatorFunction = new Function("context", "fn", "item", commentNode.textContent ?? "");
|
|
6014
6213
|
} catch (e) {
|
|
6015
6214
|
console.error("custom-operator contains invalid javascript code", e);
|
|
6016
6215
|
}
|
|
6017
6216
|
}
|
|
6018
6217
|
calculate() {
|
|
6019
6218
|
const fn = {
|
|
6020
|
-
variable: (responseIdentifier) =>
|
|
6021
|
-
|
|
6022
|
-
return (_c = (_b = (_a = this._context) == null ? void 0 : _a.variables.find((v) => v.identifier === responseIdentifier)) == null ? void 0 : _b.value) != null ? _c : "";
|
|
6023
|
-
},
|
|
6024
|
-
correct: (responseIdentifier) => {
|
|
6025
|
-
var _a, _b, _c;
|
|
6026
|
-
return (_c = (_b = (_a = this._context) == null ? void 0 : _a.variables.find((v) => v.identifier === responseIdentifier)) == null ? void 0 : _b.correctResponse) != null ? _c : "";
|
|
6027
|
-
}
|
|
6219
|
+
variable: (responseIdentifier) => this._context?.variables.find((v) => v.identifier === responseIdentifier)?.value ?? "",
|
|
6220
|
+
correct: (responseIdentifier) => this._context?.variables.find((v) => v.identifier === responseIdentifier)?.correctResponse ?? ""
|
|
6028
6221
|
};
|
|
6029
6222
|
const item = {
|
|
6030
|
-
getVariable: (variableIdentifier) =>
|
|
6031
|
-
var _a;
|
|
6032
|
-
return (_a = this._context) == null ? void 0 : _a.variables.find((v) => v.identifier === variableIdentifier);
|
|
6033
|
-
},
|
|
6223
|
+
getVariable: (variableIdentifier) => this._context?.variables.find((v) => v.identifier === variableIdentifier),
|
|
6034
6224
|
updateOutcomeVariable: (outcomeIdentifier, value) => {
|
|
6035
6225
|
this.dispatchEvent(
|
|
6036
6226
|
new CustomEvent("qti-set-outcome-value", {
|
|
@@ -6068,9 +6258,9 @@ QtiCustomOperator = __decorateClass([
|
|
|
6068
6258
|
], QtiCustomOperator);
|
|
6069
6259
|
|
|
6070
6260
|
// src/lib/qti-components/qti-interaction/qti-associable-hotspot.ts
|
|
6071
|
-
import { LitElement as
|
|
6261
|
+
import { LitElement as LitElement24, css as css29, html as html45 } from "lit";
|
|
6072
6262
|
import { customElement as customElement40 } from "lit/decorators.js";
|
|
6073
|
-
var QtiAssociableHotspot = class extends
|
|
6263
|
+
var QtiAssociableHotspot = class extends LitElement24 {
|
|
6074
6264
|
connectedCallback() {
|
|
6075
6265
|
super.connectedCallback();
|
|
6076
6266
|
this.dispatchEvent(
|
|
@@ -6082,7 +6272,7 @@ var QtiAssociableHotspot = class extends LitElement32 {
|
|
|
6082
6272
|
);
|
|
6083
6273
|
}
|
|
6084
6274
|
render() {
|
|
6085
|
-
return html45` <slot name="
|
|
6275
|
+
return html45` <slot name="drags"></slot> `;
|
|
6086
6276
|
}
|
|
6087
6277
|
};
|
|
6088
6278
|
QtiAssociableHotspot.styles = css29`
|
|
@@ -6097,15 +6287,15 @@ QtiAssociableHotspot = __decorateClass([
|
|
|
6097
6287
|
], QtiAssociableHotspot);
|
|
6098
6288
|
|
|
6099
6289
|
// src/lib/qti-components/qti-interaction/qti-gap.ts
|
|
6100
|
-
import { css as css30, html as html46, LitElement as
|
|
6290
|
+
import { css as css30, html as html46, LitElement as LitElement25 } from "lit";
|
|
6101
6291
|
import { customElement as customElement41, property as property34 } from "lit/decorators.js";
|
|
6102
|
-
var QtiGap = class extends
|
|
6292
|
+
var QtiGap = class extends LitElement25 {
|
|
6103
6293
|
constructor() {
|
|
6104
6294
|
super(...arguments);
|
|
6105
6295
|
this.tabindex = 0;
|
|
6106
6296
|
}
|
|
6107
6297
|
render() {
|
|
6108
|
-
return html46` <slot name="
|
|
6298
|
+
return html46` <slot name="drags"></slot>`;
|
|
6109
6299
|
}
|
|
6110
6300
|
};
|
|
6111
6301
|
QtiGap.styles = css30`
|
|
@@ -6122,15 +6312,15 @@ QtiGap = __decorateClass([
|
|
|
6122
6312
|
], QtiGap);
|
|
6123
6313
|
|
|
6124
6314
|
// src/lib/qti-components/qti-interaction/qti-gap-img.ts
|
|
6125
|
-
import { css as css31, LitElement as
|
|
6315
|
+
import { css as css31, LitElement as LitElement26 } from "lit";
|
|
6126
6316
|
import { customElement as customElement42, property as property35 } from "lit/decorators.js";
|
|
6127
|
-
var QtiGapImg = class extends
|
|
6317
|
+
var QtiGapImg = class extends LitElement26 {
|
|
6128
6318
|
constructor() {
|
|
6129
6319
|
super(...arguments);
|
|
6130
6320
|
this.tabindex = 0;
|
|
6131
6321
|
}
|
|
6132
6322
|
connectedCallback() {
|
|
6133
|
-
this.setAttribute("slot", "
|
|
6323
|
+
this.setAttribute("slot", "drags");
|
|
6134
6324
|
}
|
|
6135
6325
|
};
|
|
6136
6326
|
QtiGapImg.styles = css31`
|
|
@@ -6147,16 +6337,16 @@ QtiGapImg = __decorateClass([
|
|
|
6147
6337
|
], QtiGapImg);
|
|
6148
6338
|
|
|
6149
6339
|
// src/lib/qti-components/qti-interaction/qti-gap-text.ts
|
|
6150
|
-
import { css as css32, html as html47, LitElement as
|
|
6340
|
+
import { css as css32, html as html47, LitElement as LitElement27 } from "lit";
|
|
6151
6341
|
import { customElement as customElement43, property as property36 } from "lit/decorators.js";
|
|
6152
|
-
var QtiGapText = class extends ActiveElementMixin(
|
|
6342
|
+
var QtiGapText = class extends ActiveElementMixin(LitElement27, "qti-gap-text") {
|
|
6153
6343
|
constructor() {
|
|
6154
6344
|
super(...arguments);
|
|
6155
6345
|
this.tabindex = 0;
|
|
6156
6346
|
}
|
|
6157
6347
|
connectedCallback() {
|
|
6158
6348
|
super.connectedCallback();
|
|
6159
|
-
this.setAttribute("slot", "
|
|
6349
|
+
this.setAttribute("slot", "drags");
|
|
6160
6350
|
}
|
|
6161
6351
|
render() {
|
|
6162
6352
|
return html47`<slot></slot>`;
|
|
@@ -6176,9 +6366,9 @@ QtiGapText = __decorateClass([
|
|
|
6176
6366
|
], QtiGapText);
|
|
6177
6367
|
|
|
6178
6368
|
// src/lib/qti-components/qti-interaction/qti-hotspot-choice.ts
|
|
6179
|
-
import { css as css33, LitElement as
|
|
6369
|
+
import { css as css33, LitElement as LitElement28 } from "lit";
|
|
6180
6370
|
import { customElement as customElement44, property as property37 } from "lit/decorators.js";
|
|
6181
|
-
var QtiHotspotChoice = class extends ActiveElementMixin(
|
|
6371
|
+
var QtiHotspotChoice = class extends ActiveElementMixin(LitElement28, "qti-hotspot-choice") {
|
|
6182
6372
|
};
|
|
6183
6373
|
QtiHotspotChoice.styles = css33`
|
|
6184
6374
|
:host {
|
|
@@ -6195,9 +6385,9 @@ QtiHotspotChoice = __decorateClass([
|
|
|
6195
6385
|
], QtiHotspotChoice);
|
|
6196
6386
|
|
|
6197
6387
|
// src/lib/qti-components/qti-interaction/qti-hottext.ts
|
|
6198
|
-
import { css as css34, html as html48, LitElement as
|
|
6388
|
+
import { css as css34, html as html48, LitElement as LitElement29 } from "lit";
|
|
6199
6389
|
import { customElement as customElement45 } from "lit/decorators.js";
|
|
6200
|
-
var QtiHottext = class extends ActiveElementMixin(
|
|
6390
|
+
var QtiHottext = class extends ActiveElementMixin(LitElement29, "qti-hottext") {
|
|
6201
6391
|
render() {
|
|
6202
6392
|
return html48`<div part="ch"><div part="cha"></div></div>
|
|
6203
6393
|
<slot></slot> `;
|
|
@@ -6214,9 +6404,9 @@ QtiHottext = __decorateClass([
|
|
|
6214
6404
|
], QtiHottext);
|
|
6215
6405
|
|
|
6216
6406
|
// src/lib/qti-components/qti-interaction/qti-inline-choice.ts
|
|
6217
|
-
import { css as css35, html as html49, LitElement as
|
|
6407
|
+
import { css as css35, html as html49, LitElement as LitElement30 } from "lit";
|
|
6218
6408
|
import { customElement as customElement46, property as property38 } from "lit/decorators.js";
|
|
6219
|
-
var QtiInlineChoice = class extends
|
|
6409
|
+
var QtiInlineChoice = class extends LitElement30 {
|
|
6220
6410
|
static get styles() {
|
|
6221
6411
|
return [
|
|
6222
6412
|
css35`
|
|
@@ -6263,9 +6453,9 @@ QtiInlineChoice = __decorateClass([
|
|
|
6263
6453
|
], QtiInlineChoice);
|
|
6264
6454
|
|
|
6265
6455
|
// src/lib/qti-components/qti-interaction/qti-simple-choice.ts
|
|
6266
|
-
import { css as css36, html as html50, LitElement as
|
|
6456
|
+
import { css as css36, html as html50, LitElement as LitElement31, nothing as nothing2 } from "lit";
|
|
6267
6457
|
import { customElement as customElement47, property as property39 } from "lit/decorators.js";
|
|
6268
|
-
var QtiSimpleChoice = class extends ActiveElementMixin(
|
|
6458
|
+
var QtiSimpleChoice = class extends ActiveElementMixin(LitElement31, "qti-simple-choice") {
|
|
6269
6459
|
get checked() {
|
|
6270
6460
|
return this["internals"].states.has("--checked");
|
|
6271
6461
|
}
|
|
@@ -6369,6 +6559,7 @@ export {
|
|
|
6369
6559
|
QtiOutcomeProcessing,
|
|
6370
6560
|
QtiOutcomeProcessingProcessor,
|
|
6371
6561
|
QtiPortableCustomInteraction,
|
|
6562
|
+
QtiPositionObjectInteraction,
|
|
6372
6563
|
QtiPositionObjectStage,
|
|
6373
6564
|
QtiPrintedVariable,
|
|
6374
6565
|
QtiProduct,
|
|
@@ -6381,7 +6572,6 @@ export {
|
|
|
6381
6572
|
QtiResponseProcessing,
|
|
6382
6573
|
QtiRubricBlock,
|
|
6383
6574
|
QtiRule,
|
|
6384
|
-
QtiSPositionObjectInteraction,
|
|
6385
6575
|
QtiSelectPointInteraction,
|
|
6386
6576
|
QtiSetOutcomeValue,
|
|
6387
6577
|
QtiSetOutcomeValueRule,
|
|
@@ -6390,12 +6580,14 @@ export {
|
|
|
6390
6580
|
QtiSliderInteraction,
|
|
6391
6581
|
QtiStringMatch,
|
|
6392
6582
|
QtiStylesheet,
|
|
6583
|
+
QtiSubtract,
|
|
6393
6584
|
QtiSum,
|
|
6394
6585
|
QtiSumExpression,
|
|
6395
6586
|
QtiTextEntryInteraction,
|
|
6396
6587
|
QtiVariable,
|
|
6397
6588
|
itemContext,
|
|
6398
6589
|
itemContextVariables,
|
|
6399
|
-
qtiAndMixin
|
|
6590
|
+
qtiAndMixin,
|
|
6591
|
+
qtiSubtractMixin
|
|
6400
6592
|
};
|
|
6401
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0udHMiLCAiLi4vLi4vc3JjL2xpYi9kZWNvcmF0b3JzL3dhdGNoLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYvcXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLXRyYW5zZm9ybWVycy9xdGktdHJhbnNmb3JtZXJzLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLXRyYW5zZm9ybWVycy9xdGktdHJhbnNmb3JtLWl0ZW0udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvYWN0aXZlLWVsZW1lbnQvYWN0aXZlLWVsZW1lbnQubWl4aW4udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaXRlbS1ib2R5L3F0aS1pdGVtLWJvZHkudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaXRlbS1ib2R5L3F0aS1pdGVtLWJvZHkuc3R5bGVzLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXByb21wdC9xdGktcHJvbXB0LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXN0eWxlc2hlZXQvcXRpLXN0eWxlc2hlZXQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLXZhcmlhYmxlLWRlY2xhcmF0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXZhcmlhYmxlLWRlY2xhcmF0aW9uL3F0aS1yZXNwb25zZS1kZWNsYXJhdGlvbi9xdGktcmVzcG9uc2UtZGVjbGFyYXRpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktY29tcGFuaW9uLW1hdGVyaWFscy1pbmZvL3F0aS1jb21wYW5pb24tbWF0ZXJpYWxzLWluZm8udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcnVicmljLWJsb2NrL3F0aS1jb250ZW50LWJvZHkudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcnVicmljLWJsb2NrL3F0aS1ydWJyaWMtYmxvY2sudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktZmVlZGJhY2svcXRpLWZlZWRiYWNrLWJsb2NrL3F0aS1mZWVkYmFjay1ibG9jay50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1mZWVkYmFjay9xdGktZmVlZGJhY2sudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9pbnRlcm5hbC91dGlscy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1mZWVkYmFjay9xdGktZmVlZGJhY2staW5saW5lL3F0aS1mZWVkYmFjay1pbmxpbmUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktZmVlZGJhY2svcXRpLW1vZGFsLWZlZWRiYWNrL3F0aS1tb2RhbC1mZWVkYmFjay50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZXh0ZW5kZWQtdGV4dC1pbnRlcmFjdGlvbi9xdGktZXh0ZW5kZWQtdGV4dC1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbi9xdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbi9xdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbi5zdHlsZXMudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvY2hvaWNlcy9jaG9pY2VzLm1peGluLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uL3F0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9zaHVmZmxlL3NodWZmbGUtbWl4aW4udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvdm9jYWJ1bGFyeS92b2NhYnVsYXJ5LW1peGluLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbi5zdHlsZXMudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktb3V0Y29tZS1wcm9jZXNzaW5nL3F0aS1vdXRjb21lLXByb2Nlc3NpbmcudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL2ludGVybmFsL3RlbXBsYXRlLXN0cmluZ3MudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcnVsZS9xdGktbG9va3VwLW91dGNvbWUtdmFsdWUvcXRpLWxvb2t1cC1vdXRjb21lLXZhbHVlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJ1bGUvcXRpLXJ1bGUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcnVsZS9xdGktcmVzcG9uc2UtY29uZGl0aW9uL3F0aS1yZXNwb25zZS1jb25kaXRpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcnVsZS9xdGktc2V0LW91dGNvbWUtdmFsdWUvcXRpLXNldC1vdXRjb21lLXZhbHVlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJlc3BvbnNlLWVsc2UvcXRpLXJlc3BvbnNlLWVsc2UudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcmVzcG9uc2UtZWxzZS9xdGktcmVzcG9uc2UtaWYvcXRpLXJlc3BvbnNlLWVsc2UtaWYvcXRpLXJlc3BvbnNlLWVsc2UtaWYudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcmVzcG9uc2UtZWxzZS9xdGktcmVzcG9uc2UtaWYvcXRpLXJlc3BvbnNlLWlmLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWV4cHJlc3Npb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktY29uZGl0aW9uLWV4cHJlc3Npb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktYW5kL3F0aS1hbmQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktYW5kL2luZGV4LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWJhc2V2YWx1ZS9xdGktYmFzZXZhbHVlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWNvbnRhaW5zL3F0aS1jb250YWlucy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1jb3JyZWN0L3F0aS1jb3JyZWN0LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWVxdWFsLXJvdW5kZWQvcXRpLWVxdWFsLXJvdW5kZWQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktZXF1YWwvcXRpLWVxdWFsLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvdXRpbGl0aWVzL3Njb3JpbmctaGVscGVyLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWd0L3F0aS1ndC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1ndGUvcXRpLWd0ZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1pcy1udWxsL3F0aS1pcy1udWxsLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWx0L3F0aS1sdC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1sdGUvcXRpLWx0ZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tYXAtcmVzcG9uc2UvcXRpLW1hcC1yZXNwb25zZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tYXBwaW5nL3F0aS1tYXBwaW5nLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW1hdGNoL3F0aS1tYXRjaC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tZW1iZXIvcXRpLW1lbWJlci50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tdWx0aXBsZS9xdGktbXVsdGlwbGUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbm90L3F0aS1ub3QudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktb3IvcXRpLW9yLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW9yZGVyZWQvcXRpLW9yZGVyZWQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktcHJpbnRlZC12YXJpYWJsZS9xdGktcHJpbnRlZC12YXJpYWJsZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1wcm9kdWN0L3F0aS1wcm9kdWN0LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLXN0cmluZy1tYXRjaC9xdGktc3RyaW5nLW1hdGNoLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLXN1bS9xdGktc3VtLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLXZhcmlhYmxlL3F0aS12YXJpYWJsZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uL3F0aS1wb3J0YWJsZS1jdXN0b20taW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbi9xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9kcmFnLWRyb3AtYXBpLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9kcm9wcGFibGVzLW1peGluLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9mbGlwcGFibGVzLW1peGluLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9kcmFnLWRyb3AtaW50ZXJhY3Rpb24tbWl4aW4udHMiLCAiLi4vLi4vc3JjL2xpYi9kZWNvcmF0b3JzL2xpdmUtcXVlcnkudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbi9xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uLnN0eWxlcy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktY3VzdG9tLWludGVyYWN0aW9uL3F0aS1jdXN0b20taW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uL3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uL3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWFzc29jaWF0ZS1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9ob3RzcG90cy9ob3RzcG90LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWdhcC1tYXRjaC1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtb3JkZXItaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtb3JkZXItaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHNwb3QtaW50ZXJhY3Rpb24vcXRpLWhvdHNwb3QtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLW1hdGNoLWludGVyYWN0aW9uL3F0aS1tYXRjaC1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1tYXRjaC1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24uc3R5bGVzLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1tZWRpYS1pbnRlcmFjdGlvbi9xdGktbWVkaWEtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLW9yZGVyLWludGVyYWN0aW9uL3F0aS1vcmRlci1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LXN0YWdlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1zZWxlY3QtcG9pbnQtaW50ZXJhY3Rpb24vcXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktc2xpZGVyLWludGVyYWN0aW9uL3F0aS1zbGlkZXItaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktY3VzdG9tLW9wZXJhdG9yL3F0aS1jdXN0b20tb3BlcmF0b3IudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWFzc29jaWFibGUtaG90c3BvdC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1nYXAtaW1nLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1nYXAtdGV4dC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktaG90c3BvdC1jaG9pY2UudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWlubGluZS1jaG9pY2UudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXNpbXBsZS1jaG9pY2UudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgcHJvdmlkZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL3dhdGNoJztcbmltcG9ydCB0eXBlIHsgSW50ZXJhY3Rpb25DaGFuZ2VkRGV0YWlscywgT3V0Y29tZUNoYW5nZWREZXRhaWxzIH0gZnJvbSAnLi4vaW50ZXJuYWwvZXZlbnQtdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBSZXNwb25zZUludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuaW1wb3J0IHR5cGUgeyBWYXJpYWJsZURlY2xhcmF0aW9uLCBWYXJpYWJsZVZhbHVlIH0gZnJvbSAnLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IE91dGNvbWVWYXJpYWJsZSwgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgdHlwZSB7IFF0aUZlZWRiYWNrIH0gZnJvbSAnLi4vcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjayc7XG5pbXBvcnQgdHlwZSB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB0eXBlIHsgUXRpUmVzcG9uc2VQcm9jZXNzaW5nIH0gZnJvbSAnLi4vcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnO1xuaW1wb3J0IHsgSXRlbUNvbnRleHQsIGl0ZW1Db250ZXh0LCBpdGVtQ29udGV4dFZhcmlhYmxlcyB9IGZyb20gJy4vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcbmltcG9ydCBRdGlSZWdpc3RlclZhcmlhYmxlIGZyb20gJy4uL2ludGVybmFsL2V2ZW50cy9xdGktcmVnaXN0ZXItdmFyaWFibGUnO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFRoZSBxdGktYXNzZXNzbWVudC1pdGVtIGVsZW1lbnQgY29udGFpbnMgYWxsIHRoZSBvdGhlciBRVEkgMyBpdGVtIHN0cnVjdHVyZXMuXG4gKiBAZG9jdW1lbnRhdGlvbiBodHRwczovL3d3dy5pbXNnbG9iYWwub3JnL3NwZWMvcXRpL3YzcDAvaW1wbCNoLmRsdG5uajg3bDB5alxuICogQHN0YXR1cyBzdGFibGVcbiAqIEBzaW5jZSA0LjBcbiAqXG4gKiBAZGVwZW5kZW5jeSBxdGktZmVlZGJhY2tcbiAqIEBkZXBlbmRlbmN5IHF0aS1yZXNwb25zZXByb2Nlc3NpbmdcbiAqXG4gKiBAc2xvdCAtIFRoZSBkZWZhdWx0IHNsb3Qgd2hlcmUgYWxsIHRoZSBvdGhlciBRVEkgMyBpdGVtIHN0cnVjdHVyZXMgZ28uXG4gKlxuICogQGV2ZW50IHF0aS1pbnRlcmFjdGlvbi1jaGFuZ2VkIC0gRW1pdHRlZCB3aGVuIGFuIGludGVyYWN0aW9uIGlzIGNoYW5nZWQuXG4gKiBAZXZlbnQgcXRpLW91dGNvbWUtY2hhbmdlZCAtIEVtaXR0ZWQgd2hlbiBhbiBvdXRjb21lIGhhcyBjaGFuZ2VkLlxuICogQGV2ZW50IHF0aS1yZXNwb25zZS1wcm9jZXNzaW5nIC0gRW1pdHRlZCB3aGVuIHJlc3BvbnNlLXByb2Nlc3NpbmcgaXMgY2FsbGVkLlxuICpcbiAqL1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKVxuZXhwb3J0IGNsYXNzIFF0aUFzc2Vzc21lbnRJdGVtIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSB0aXRsZTogc3RyaW5nO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgaWRlbnRpZmllcjogc3RyaW5nID0gJyc7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBhZGFwdGl2ZTogJ3RydWUnIHwgJ2ZhbHNlJyA9ICdmYWxzZSc7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSB0aW1lRGVwZW5kZW50OiAndHJ1ZScgfCAnZmFsc2UnIHwgbnVsbCA9IG51bGw7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSBkaXNhYmxlZDogYm9vbGVhbjtcbiAgQHdhdGNoKCdkaXNhYmxlZCcsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgX2hhbmRsZURpc2FibGVkQ2hhbmdlID0gKF86IGJvb2xlYW4sIGRpc2FibGVkOiBib29sZWFuKSA9PiB7XG4gICAgdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5mb3JFYWNoKGNoID0+IChjaC5kaXNhYmxlZCA9IGRpc2FibGVkKSk7XG4gIH07XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSByZWFkb25seTogYm9vbGVhbjtcbiAgQHdhdGNoKCdyZWFkb25seScsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgX2hhbmRsZVJlYWRvbmx5Q2hhbmdlID0gKF86IGJvb2xlYW4sIHJlYWRvbmx5OiBib29sZWFuKSA9PlxuICAgIHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMuZm9yRWFjaChjaCA9PiAoY2gucmVhZG9ubHkgPSByZWFkb25seSkpO1xuXG4gIEBwcm92aWRlKHsgY29udGV4dDogaXRlbUNvbnRleHQgfSlcbiAgcHJpdmF0ZSBfY29udGV4dDogSXRlbUNvbnRleHQgPSB7XG4gICAgaWRlbnRpZmllcjogdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSxcbiAgICB2YXJpYWJsZXM6IGl0ZW1Db250ZXh0VmFyaWFibGVzXG4gIH07XG5cbiAgcHVibGljIGdldCB2YXJpYWJsZXMoKTogVmFyaWFibGVWYWx1ZTxzdHJpbmcgfCBzdHJpbmdbXSB8IG51bGw+W10ge1xuICAgIHJldHVybiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5tYXAodiA9PiAoe1xuICAgICAgaWRlbnRpZmllcjogdi5pZGVudGlmaWVyLFxuICAgICAgdmFsdWU6IHYudmFsdWUsXG4gICAgICB0eXBlOiB2LnR5cGUsXG4gICAgICAvLyBhZGQgZXh0ZXJuYWxzY29yZWQsIGEgZml4ZWQgcHJvcCB0byB0aGUgdGVzdCwgc28gdGhlIHRlc3Rjb250ZXh0IGNhbiByZWFkIGFuZCBkZWNpZGUgaG93IHRvIHNjb3JlIHRoaXMgaXRlbVxuICAgICAgLi4uKHYudHlwZSA9PT0gJ291dGNvbWUnICYmIHYuaWRlbnRpZmllciA9PT0gJ1NDT1JFJ1xuICAgICAgICA/IHsgZXh0ZXJuYWxTY29yZWQ6ICh2IGFzIE91dGNvbWVWYXJpYWJsZSkuZXh0ZXJuYWxTY29yZWQgfVxuICAgICAgICA6IHt9KVxuICAgIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdmFyaWFibGVzKHZhbHVlOiBWYXJpYWJsZVZhbHVlPHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbD5bXSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgdmFsdWUuc29tZSh2ID0+ICEoJ2lkZW50aWZpZXInIGluIHYpKSkge1xuICAgICAgY29uc29sZS53YXJuKCd2YXJpYWJsZXMgcHJvcGVydHkgc2hvdWxkIGJlIGFuIGFycmF5IG9mIFZhcmlhYmxlRGVjbGFyYXRpb24nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fY29udGV4dCA9IHtcbiAgICAgIC4uLnRoaXMuX2NvbnRleHQsXG4gICAgICB2YXJpYWJsZXM6IHRoaXMuX2NvbnRleHQudmFyaWFibGVzLm1hcCh2YXJpYWJsZSA9PiB7XG4gICAgICAgIGNvbnN0IG1hdGNoaW5nVmFsdWUgPSB2YWx1ZS5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSB2YXJpYWJsZS5pZGVudGlmaWVyKTtcbiAgICAgICAgaWYgKG1hdGNoaW5nVmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4geyAuLi52YXJpYWJsZSwgLi4ubWF0Y2hpbmdWYWx1ZSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YXJpYWJsZTtcbiAgICAgIH0pXG4gICAgfTtcblxuICAgIHRoaXMuX2NvbnRleHQudmFyaWFibGVzLmZvckVhY2godmFyaWFibGUgPT4ge1xuICAgICAgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdyZXNwb25zZScpIHtcbiAgICAgICAgY29uc3QgaW50ZXJhY3Rpb25FbGVtZW50ID0gdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5maW5kKFxuICAgICAgICAgIChlbDogSW50ZXJhY3Rpb24pID0+IGVsLnJlc3BvbnNlSWRlbnRpZmllciA9PT0gdmFyaWFibGUuaWRlbnRpZmllclxuICAgICAgICApO1xuICAgICAgICBpZiAoaW50ZXJhY3Rpb25FbGVtZW50KSB7XG4gICAgICAgICAgaW50ZXJhY3Rpb25FbGVtZW50LnZhbHVlID0gdmFyaWFibGUudmFsdWUgYXMgc3RyaW5nIHwgc3RyaW5nW107XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdvdXRjb21lJykge1xuICAgICAgICB0aGlzLl9mZWVkYmFja0VsZW1lbnRzLmZvckVhY2goZmUgPT4gZmUuY2hlY2tTaG93RmVlZGJhY2sodmFyaWFibGUuaWRlbnRpZmllcikpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdGlhbENvbnRleHQ6IFJlYWRvbmx5PEl0ZW1Db250ZXh0PiA9IHsgLi4udGhpcy5fY29udGV4dCwgdmFyaWFibGVzOiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcyB9O1xuICBwcml2YXRlIF9mZWVkYmFja0VsZW1lbnRzOiBRdGlGZWVkYmFja1tdID0gW107XG4gIHByaXZhdGUgX2ludGVyYWN0aW9uRWxlbWVudHM6IEludGVyYWN0aW9uW10gPSBbXTtcblxuICBhc3luYyBjb25uZWN0ZWRDYWxsYmFjaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGU7XG4gICAgdGhpcy5fZW1pdDx7IGRldGFpbDogUXRpQXNzZXNzbWVudEl0ZW0gfT4oJ3F0aS1hc3Nlc3NtZW50LWl0ZW0tY29ubmVjdGVkJywgdGhpcyk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgdXNlIHZhcmlhYmxlcyBwcm9wZXJ0eSBpbnN0ZWFkICovXG4gIHNldCByZXNwb25zZXMobXlSZXNwb25zZXM6IFJlc3BvbnNlSW50ZXJhY3Rpb25bXSkge1xuICAgIGlmIChteVJlc3BvbnNlcykge1xuICAgICAgZm9yIChjb25zdCByZXNwb25zZSBvZiBteVJlc3BvbnNlcykge1xuICAgICAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlID0gdGhpcy5nZXRSZXNwb25zZShyZXNwb25zZS5yZXNwb25zZUlkZW50aWZpZXIpO1xuICAgICAgICBpZiAocmVzcG9uc2VWYXJpYWJsZSkge1xuICAgICAgICAgIHRoaXMudXBkYXRlUmVzcG9uc2VWYXJpYWJsZShyZXNwb25zZS5yZXNwb25zZUlkZW50aWZpZXIsIHJlc3BvbnNlLnJlc3BvbnNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGludGVyYWN0aW9uOiBJbnRlcmFjdGlvbiB8IHVuZGVmaW5lZCA9IHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMuZmluZChcbiAgICAgICAgICBpID0+IGkuZ2V0QXR0cmlidXRlKCdyZXNwb25zZS1pZGVudGlmaWVyJykgPT09IHJlc3BvbnNlLnJlc3BvbnNlSWRlbnRpZmllclxuICAgICAgICApO1xuICAgICAgICBpZiAoaW50ZXJhY3Rpb24pIHtcbiAgICAgICAgICBpbnRlcmFjdGlvbi52YWx1ZSA9IHJlc3BvbnNlLnJlc3BvbnNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci12YXJpYWJsZScsIChlOiBRdGlSZWdpc3RlclZhcmlhYmxlKSA9PiB7XG4gICAgICB0aGlzLl9jb250ZXh0ID0geyAuLi50aGlzLl9jb250ZXh0LCB2YXJpYWJsZXM6IFsuLi50aGlzLl9jb250ZXh0LnZhcmlhYmxlcywgZS5kZXRhaWwudmFyaWFibGVdIH07XG4gICAgICB0aGlzLl9pbml0aWFsQ29udGV4dCA9IHRoaXMuX2NvbnRleHQ7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0pO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWZlZWRiYWNrJywgKGU6IEN1c3RvbUV2ZW50PFF0aUZlZWRiYWNrPikgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IGZlZWRiYWNrRWxlbWVudCA9IGUuZGV0YWlsO1xuICAgICAgdGhpcy5fZmVlZGJhY2tFbGVtZW50cy5wdXNoKGZlZWRiYWNrRWxlbWVudCk7XG4gICAgICBmZWVkYmFja0VsZW1lbnQuY2hlY2tTaG93RmVlZGJhY2soZmVlZGJhY2tFbGVtZW50Lm91dGNvbWVJZGVudGlmaWVyKTtcbiAgICB9KTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1pbnRlcmFjdGlvbicsIChlOiBDdXN0b21FdmVudDxudWxsPikgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMucHVzaChlLnRhcmdldCBhcyBJbnRlcmFjdGlvbik7XG4gICAgfSk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdlbmQtYXR0ZW1wdCcsIChlOiBDdXN0b21FdmVudDx7IHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nOyBjb3VudEF0dGVtcHQ6IGJvb2xlYW4gfT4pID0+IHtcbiAgICAgIGNvbnN0IHsgcmVzcG9uc2VJZGVudGlmaWVyLCBjb3VudEF0dGVtcHQgfSA9IGUuZGV0YWlsO1xuICAgICAgdGhpcy51cGRhdGVSZXNwb25zZVZhcmlhYmxlKHJlc3BvbnNlSWRlbnRpZmllciwgJ3RydWUnKTtcbiAgICAgIHRoaXMucHJvY2Vzc1Jlc3BvbnNlKGNvdW50QXR0ZW1wdCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAvLyB3b3JkdCBhYW5nZXJvZXBlbiB2YW51aXQgZGUgcHJvY2Vzc2luZ3RlbXBsYXRlXG4gICAgICAncXRpLXNldC1vdXRjb21lLXZhbHVlJyxcbiAgICAgIChlOiBDdXN0b21FdmVudDx7IG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB9PikgPT4ge1xuICAgICAgICBjb25zdCB7IG91dGNvbWVJZGVudGlmaWVyLCB2YWx1ZSB9ID0gZS5kZXRhaWw7XG4gICAgICAgIHRoaXMudXBkYXRlT3V0Y29tZVZhcmlhYmxlKG91dGNvbWVJZGVudGlmaWVyLCB2YWx1ZSk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywgdGhpcy5oYW5kbGVVcGRhdGVSZXNwb25zZVZhcmlhYmxlKTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93Q29ycmVjdFJlc3BvbnNlKHNob3c6IGJvb2xlYW4pIHtcbiAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlcyA9IHRoaXMuX2NvbnRleHQudmFyaWFibGVzLmZpbHRlcihcbiAgICAgICh2YXJpOiBSZXNwb25zZVZhcmlhYmxlIHwgT3V0Y29tZVZhcmlhYmxlKSA9PiAnY29ycmVjdFJlc3BvbnNlJyBpbiB2YXJpICYmIHZhcmkuY29ycmVjdFJlc3BvbnNlXG4gICAgKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgY29uc3QgcmVzcG9uc2VzID0gcmVzcG9uc2VWYXJpYWJsZXMubWFwKGNyID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc3BvbnNlSWRlbnRpZmllcjogY3IuaWRlbnRpZmllcixcbiAgICAgICAgcmVzcG9uc2U6IGNyLmNvcnJlY3RSZXNwb25zZVxuICAgICAgfTtcbiAgICB9KTtcbiAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIHJlc3BvbnNlcykge1xuICAgICAgY29uc3QgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uIHwgdW5kZWZpbmVkID0gdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5maW5kKFxuICAgICAgICBpID0+IGkuZ2V0QXR0cmlidXRlKCdyZXNwb25zZS1pZGVudGlmaWVyJykgPT09IHJlc3BvbnNlLnJlc3BvbnNlSWRlbnRpZmllclxuICAgICAgKTtcbiAgICAgIGlmIChpbnRlcmFjdGlvbikge1xuICAgICAgICBpbnRlcmFjdGlvbi5jb3JyZWN0UmVzcG9uc2UgPSBzaG93ID8gcmVzcG9uc2UucmVzcG9uc2UgOiAnJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcHJvY2Vzc1Jlc3BvbnNlKGNvdW50TnVtQXR0ZW1wdHM6IGJvb2xlYW4gPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVzcG9uc2VQcm9jZXNzb3IgPSB0aGlzLnF1ZXJ5U2VsZWN0b3I8UXRpUmVzcG9uc2VQcm9jZXNzaW5nPigncXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnKTtcbiAgICBpZiAoIXJlc3BvbnNlUHJvY2Vzc29yKSB7XG4gICAgICAvLyBjb25zb2xlLmluZm8oJ0NsaWVudCBzaWRlIHJlc3BvbnNlIHByb2Nlc3NpbmcgdGVtcGxhdGUgbm90IGF2YWlsYWJsZScpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghcmVzcG9uc2VQcm9jZXNzb3IucHJvY2Vzcykge1xuICAgICAgLy8gY29uc29sZS5pbmZvKCdDbGllbnQgc2lkZSByZXNwb25zZSB3ZWJjb21wb25lbnRzIG5vdCBhdmFpbGFibGUnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXNwb25zZVByb2Nlc3Nvci5wcm9jZXNzKCk7XG5cbiAgICBpZiAodGhpcy5hZGFwdGl2ZSA9PT0gJ2ZhbHNlJykge1xuICAgICAgLy8gaWYgYWRhcHRpdmUsIGNvbXBsZXRpb25TdGF0dXMgaXMgc2V0IGJ5IHRoZSBwcm9jZXNzaW5nIHRlbXBsYXRlXG4gICAgICB0aGlzLnVwZGF0ZU91dGNvbWVWYXJpYWJsZSgnY29tcGxldGlvblN0YXR1cycsIHRoaXMuX2dldENvbXBsZXRpb25TdGF0dXMoKSk7XG4gICAgfVxuXG4gICAgaWYgKGNvdW50TnVtQXR0ZW1wdHMpIHtcbiAgICAgIHRoaXMudXBkYXRlT3V0Y29tZVZhcmlhYmxlKFxuICAgICAgICAnbnVtQXR0ZW1wdHMnLFxuICAgICAgICAoK3RoaXMuX2NvbnRleHQudmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09ICdudW1BdHRlbXB0cycpPy52YWx1ZSArIDEpLnRvU3RyaW5nKClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5fZW1pdCgncXRpLXJlc3BvbnNlLXByb2Nlc3NlZCcpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIHJlc2V0UmVzcG9uc2VzKCkge1xuICAgIHRoaXMuX2NvbnRleHQgPSB0aGlzLl9pbml0aWFsQ29udGV4dDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSZXNwb25zZShpZGVudGlmaWVyOiBzdHJpbmcpOiBSZWFkb25seTxSZXNwb25zZVZhcmlhYmxlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFyaWFibGUoaWRlbnRpZmllcikgYXMgUmVzcG9uc2VWYXJpYWJsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRPdXRjb21lKGlkZW50aWZpZXI6IHN0cmluZyk6IFJlYWRvbmx5PE91dGNvbWVWYXJpYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLmdldFZhcmlhYmxlKGlkZW50aWZpZXIpIGFzIE91dGNvbWVWYXJpYWJsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWYXJpYWJsZShpZGVudGlmaWVyOiBzdHJpbmcpOiBSZWFkb25seTxWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbD4+IHtcbiAgICByZXR1cm4gdGhpcy5fY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikgfHwgbnVsbDtcbiAgfVxuXG4gIC8vIHNhdmluZyBwcml2YXRlcyBoZXJlOiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwcml2YXRlIGhhbmRsZVVwZGF0ZVJlc3BvbnNlVmFyaWFibGUoZXZlbnQ6IEN1c3RvbUV2ZW50PFJlc3BvbnNlSW50ZXJhY3Rpb24+KSB7XG4gICAgY29uc3QgeyByZXNwb25zZUlkZW50aWZpZXIsIHJlc3BvbnNlIH0gPSBldmVudC5kZXRhaWw7XG4gICAgdGhpcy51cGRhdGVSZXNwb25zZVZhcmlhYmxlKHJlc3BvbnNlSWRlbnRpZmllciwgcmVzcG9uc2UpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVJlc3BvbnNlVmFyaWFibGUoaWRlbnRpZmllcjogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9jb250ZXh0ID0ge1xuICAgICAgLi4udGhpcy5fY29udGV4dCxcbiAgICAgIHZhcmlhYmxlczogdGhpcy5fY29udGV4dC52YXJpYWJsZXMubWFwKHYgPT4gKHYuaWRlbnRpZmllciAhPT0gaWRlbnRpZmllciA/IHYgOiB7IC4uLnYsIHZhbHVlOiB2YWx1ZSB9KSlcbiAgICB9O1xuXG4gICAgdGhpcy5fZW1pdDxJbnRlcmFjdGlvbkNoYW5nZWREZXRhaWxzPigncXRpLWludGVyYWN0aW9uLWNoYW5nZWQnLCB7XG4gICAgICBpdGVtOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICByZXNwb25zZUlkZW50aWZpZXI6IGlkZW50aWZpZXIsXG4gICAgICByZXNwb25zZTogQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbLi4udmFsdWVdIDogdmFsdWVcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmFkYXB0aXZlID09PSAnZmFsc2UnKSB7XG4gICAgICAvLyBpZiBhZGFwYXRpdmUsIGNvbXBsZXRpb25TdGF0dXMgaXMgc2V0IGJ5IHRoZSBwcm9jZXNzaW5nIHRlbXBsYXRlXG4gICAgICB0aGlzLnVwZGF0ZU91dGNvbWVWYXJpYWJsZSgnY29tcGxldGlvblN0YXR1cycsIHRoaXMuX2dldENvbXBsZXRpb25TdGF0dXMoKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZU91dGNvbWVWYXJpYWJsZShpZGVudGlmaWVyOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG91dGNvbWVWYXJpYWJsZSA9IHRoaXMuZ2V0T3V0Y29tZShpZGVudGlmaWVyKTtcblxuICAgIGlmICghb3V0Y29tZVZhcmlhYmxlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYENhbiBub3Qgc2V0IHF0aS1vdXRjb21lLWlkZW50aWZpZXI6ICR7aWRlbnRpZmllcn0sIGl0IGlzIG5vdCBhdmFpbGFibGVgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jb250ZXh0ID0ge1xuICAgICAgLi4udGhpcy5fY29udGV4dCxcbiAgICAgIHZhcmlhYmxlczogdGhpcy5fY29udGV4dC52YXJpYWJsZXMubWFwKHYgPT4ge1xuICAgICAgICBpZiAodi5pZGVudGlmaWVyICE9PSBpZGVudGlmaWVyKSB7XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi52LFxuICAgICAgICAgIHZhbHVlOiBvdXRjb21lVmFyaWFibGUuY2FyZGluYWxpdHkgPT09ICdzaW5nbGUnID8gdmFsdWUgOiBbLi4udi52YWx1ZSwgdmFsdWUgYXMgc3RyaW5nXVxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICB9O1xuICAgIHRoaXMuX2ZlZWRiYWNrRWxlbWVudHMuZm9yRWFjaChmZSA9PiBmZS5jaGVja1Nob3dGZWVkYmFjayhpZGVudGlmaWVyKSk7XG5cbiAgICB0aGlzLl9lbWl0PE91dGNvbWVDaGFuZ2VkRGV0YWlscz4oJ3F0aS1vdXRjb21lLWNoYW5nZWQnLCB7XG4gICAgICBpdGVtOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICBvdXRjb21lSWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgIHZhbHVlOiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKT8udmFsdWVcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldENvbXBsZXRpb25TdGF0dXMoKTogJ2NvbXBsZXRlZCcgfCAnaW5jb21wbGV0ZScgfCAnbm90X2F0dGVtcHRlZCcgfCAndW5rbm93bicge1xuICAgIGlmICh0aGlzLl9pbnRlcmFjdGlvbkVsZW1lbnRzLmV2ZXJ5KGludGVyYWN0aW9uRWxlbWVudCA9PiBpbnRlcmFjdGlvbkVsZW1lbnQudmFsaWRhdGUoKSkpIHJldHVybiAnY29tcGxldGVkJztcbiAgICBpZiAodGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5zb21lKGludGVyYWN0aW9uRWxlbWVudCA9PiBpbnRlcmFjdGlvbkVsZW1lbnQudmFsaWRhdGUoKSkpIHJldHVybiAnaW5jb21wbGV0ZSc7XG4gICAgcmV0dXJuICdub3RfYXR0ZW1wdGVkJztcbiAgfVxuXG4gIHByaXZhdGUgX2VtaXQ8VD4obmFtZSwgZGV0YWlsID0gbnVsbCkge1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDxUPihuYW1lLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktYXNzZXNzbWVudC1pdGVtJzogUXRpQXNzZXNzbWVudEl0ZW07XG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuXG50eXBlIFVwZGF0ZUhhbmRsZXIgPSAocHJldj86IHVua25vd24sIG5leHQ/OiB1bmtub3duKSA9PiB2b2lkO1xuXG50eXBlIE5vblVuZGVmaW5lZDxBPiA9IEEgZXh0ZW5kcyB1bmRlZmluZWQgPyBuZXZlciA6IEE7XG5cbmV4cG9ydCB0eXBlIFVwZGF0ZUhhbmRsZXJGdW5jdGlvbktleXM8VCBleHRlbmRzIG9iamVjdD4gPSB7XG4gIFtLIGluIGtleW9mIFRdLT86IE5vblVuZGVmaW5lZDxUW0tdPiBleHRlbmRzIFVwZGF0ZUhhbmRsZXIgPyBLIDogbmV2ZXI7XG59W2tleW9mIFRdO1xuXG5pbnRlcmZhY2UgV2F0Y2hPcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIHRydWUsIHdpbGwgb25seSBzdGFydCB3YXRjaGluZyBhZnRlciB0aGUgaW5pdGlhbCB1cGRhdGUvcmVuZGVyXG4gICAqL1xuICB3YWl0VW50aWxGaXJzdFVwZGF0ZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUnVucyB3aGVuIG9ic2VydmVkIHByb3BlcnRpZXMgY2hhbmdlLCBlLmcuIEBwcm9wZXJ0eSBvciBAc3RhdGUsIGJ1dCBiZWZvcmUgdGhlIGNvbXBvbmVudCB1cGRhdGVzLiBUbyB3YWl0IGZvciBhblxuICogdXBkYXRlIHRvIGNvbXBsZXRlIGFmdGVyIGEgY2hhbmdlIG9jY3VycywgdXNlIGBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlYCBpbiB0aGUgaGFuZGxlci4gVG8gc3RhcnQgd2F0Y2hpbmcgYWZ0ZXIgdGhlXG4gKiBpbml0aWFsIHVwZGF0ZS9yZW5kZXIsIHVzZSBgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9YCBvciBgdGhpcy5oYXNVcGRhdGVkYCBpbiB0aGUgaGFuZGxlci5cbiAqXG4gKiBVc2FnZTpcbiAqXG4gKiBAd2F0Y2goJ3Byb3BOYW1lJylcbiAqIGhhbmRsZVByb3BDaGFuZ2Uob2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG4gKiAgIC4uLlxuICogfVxuICovXG5leHBvcnQgZnVuY3Rpb24gd2F0Y2gocHJvcGVydHlOYW1lOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3B0aW9ucz86IFdhdGNoT3B0aW9ucykge1xuICBjb25zdCByZXNvbHZlZE9wdGlvbnM6IFJlcXVpcmVkPFdhdGNoT3B0aW9ucz4gPSB7XG4gICAgd2FpdFVudGlsRmlyc3RVcGRhdGU6IGZhbHNlLFxuICAgIC4uLm9wdGlvbnNcbiAgfTtcbiAgcmV0dXJuIDxFbGVtQ2xhc3MgZXh0ZW5kcyBMaXRFbGVtZW50PihcbiAgICBwcm90bzogRWxlbUNsYXNzLFxuICAgIGRlY29yYXRlZEZuTmFtZTogVXBkYXRlSGFuZGxlckZ1bmN0aW9uS2V5czxFbGVtQ2xhc3M+IHwgYW55XG4gICkgPT4ge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSB1cGRhdGUgaXMgYSBwcm90ZWN0ZWQgcHJvcGVydHlcbiAgICBjb25zdCB7IHVwZGF0ZSB9ID0gcHJvdG87XG4gICAgY29uc3Qgd2F0Y2hlZFByb3BlcnRpZXMgPSBBcnJheS5pc0FycmF5KHByb3BlcnR5TmFtZSkgPyBwcm9wZXJ0eU5hbWUgOiBbcHJvcGVydHlOYW1lXTtcblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSB1cGRhdGUgaXMgYSBwcm90ZWN0ZWQgcHJvcGVydHlcbiAgICBwcm90by51cGRhdGUgPSBmdW5jdGlvbiAodGhpczogRWxlbUNsYXNzLCBjaGFuZ2VkUHJvcHM6IE1hcDxrZXlvZiBFbGVtQ2xhc3MsIEVsZW1DbGFzc1trZXlvZiBFbGVtQ2xhc3NdPikge1xuICAgICAgd2F0Y2hlZFByb3BlcnRpZXMuZm9yRWFjaChwcm9wZXJ0eSA9PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IHByb3BlcnR5IGFzIGtleW9mIEVsZW1DbGFzcztcbiAgICAgICAgaWYgKGNoYW5nZWRQcm9wcy5oYXMoa2V5KSkge1xuICAgICAgICAgIGNvbnN0IG9sZFZhbHVlID0gY2hhbmdlZFByb3BzLmdldChrZXkpO1xuICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpc1trZXldO1xuXG4gICAgICAgICAgaWYgKG9sZFZhbHVlICE9PSBuZXdWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKCFyZXNvbHZlZE9wdGlvbnMud2FpdFVudGlsRmlyc3RVcGRhdGUgfHwgdGhpcy5oYXNVcGRhdGVkKSB7XG4gICAgICAgICAgICAgICh0aGlzW2RlY29yYXRlZEZuTmFtZV0gYXMgdW5rbm93biBhcyBVcGRhdGVIYW5kbGVyKShvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHVwZGF0ZS5jYWxsKHRoaXMsIGNoYW5nZWRQcm9wcyk7XG4gICAgfTtcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IFZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1Db250ZXh0IHtcbiAgaHJlZj86IHN0cmluZztcbiAgaWRlbnRpZmllcjogc3RyaW5nO1xuICB2YXJpYWJsZXM6IFJlYWRvbmx5QXJyYXk8VmFyaWFibGVEZWNsYXJhdGlvbjxzdHJpbmcgfCBzdHJpbmdbXT4+O1xufVxuXG5leHBvcnQgY29uc3QgaXRlbUNvbnRleHRWYXJpYWJsZXMgPSBbXG4gIHtcbiAgICBpZGVudGlmaWVyOiAnY29tcGxldGlvblN0YXR1cycsXG4gICAgY2FyZGluYWxpdHk6ICdzaW5nbGUnLFxuICAgIGJhc2VUeXBlOiAnc3RyaW5nJyxcbiAgICB2YWx1ZTogJ3Vua25vd24nLFxuICAgIHR5cGU6ICdvdXRjb21lJ1xuICB9LFxuICB7XG4gICAgaWRlbnRpZmllcjogJ251bUF0dGVtcHRzJyxcbiAgICBjYXJkaW5hbGl0eTogJ3NpbmdsZScsXG4gICAgYmFzZVR5cGU6ICdpbnRlZ2VyJyxcbiAgICB2YWx1ZTogJzAnLFxuICAgIHR5cGU6ICdyZXNwb25zZSdcbiAgfVxuXSBhcyBWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdPltdO1xuXG5leHBvcnQgY29uc3QgaXRlbUNvbnRleHQgPSBjcmVhdGVDb250ZXh0PEl0ZW1Db250ZXh0PihTeW1ib2woJ2l0ZW0nKSk7XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHF0aVRyYW5zZm9ybUl0ZW0gfSBmcm9tICcuLi8uLi9xdGktdHJhbnNmb3JtZXJzJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgY3VzdG9tIGVsZW1lbnQgZm9yIHJlZmVyZW5jaW5nIGFuIGFzc2Vzc21lbnQgc3RpbXVsdXMuXG4gKi9cbkBjdXN0b21FbGVtZW50KCdxdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYnKVxuZXhwb3J0IGNsYXNzIFF0aUFzc2Vzc21lbnRTdGltdWx1c1JlZiBleHRlbmRzIExpdEVsZW1lbnQge1xuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHN0aW11bHVzLlxuICAgKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXIgPSAnJztcblxuICAvKipcbiAgICogVGhlIGhyZWYgb2YgdGhlIHN0aW11bHVzLlxuICAgKi9cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGhyZWYgPSAnJztcblxuICAvKipcbiAgICogTGlmZWN5Y2xlIG1ldGhvZCBjYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBjb25uZWN0ZWQgdG8gdGhlIERPTS5cbiAgICogTG9hZHMgYW5kIGFwcGVuZHMgdGhlIHN0aW11bHVzIGlmIHRoZSAncXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmLWNvbm5lY3RlZCcgZXZlbnQgaXMgbm90IHByZXZlbnRlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjb25uZWN0ZWRDYWxsYmFjaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoJ3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZi1jb25uZWN0ZWQnLCB7IGNhbmNlbGFibGU6IHRydWUsIGJ1YmJsZXM6IHRydWUgfSk7XG4gICAgY29uc3QgaXNQcmV2ZW50ZWQgPSB0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXG4gICAgaWYgKGlzUHJldmVudGVkKSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5jbG9zZXN0KCdxdGktYXNzZXNzbWVudC1pdGVtJyk7XG5cbiAgICAgIGNvbnN0IHN0aW11bHVzUmVmID0gaXRlbS5xdWVyeVNlbGVjdG9yKGBbZGF0YS1zdGltdWx1cy1pZHJlZj0ke3RoaXMuaWRlbnRpZmllcn1dYCk7XG4gICAgICBpZiAoc3RpbXVsdXNSZWYpIHtcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVTdGltdWx1c1JlZihzdGltdWx1c1JlZik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oYFN0aW11bHVzIHdpdGggZGF0YS1zdGltdWx1cy1pZHJlZiAke3RoaXMuaWRlbnRpZmllcn0gbm90IGZvdW5kYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIGFuZCBhcHBlbmRzIHRoZSBzdGltdWx1cyB0byB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuXG4gICAqIEBwYXJhbSBzdGltdWx1c1JlZiAtIFRoZSBlbGVtZW50IHRvIHdoaWNoIHRoZSBzdGltdWx1cyB3aWxsIGJlIGFwcGVuZGVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHVwZGF0ZVN0aW11bHVzUmVmKHN0aW11bHVzUmVmOiBFbGVtZW50KSB7XG4gICAgY29uc3QgcGF0aCA9IHRoaXMuaHJlZi5zdWJzdHJpbmcoMCwgdGhpcy5ocmVmLmxhc3RJbmRleE9mKCcvJykpO1xuICAgIGNvbnN0IHN0aW11bHVzID0gYXdhaXQgcXRpVHJhbnNmb3JtSXRlbSgpXG4gICAgICAubG9hZCh0aGlzLmhyZWYpXG4gICAgICAudGhlbihhcGkgPT4gYXBpLmh0bWxEb2MoKSk7XG4gICAgaWYgKHN0aW11bHVzKSB7XG4gICAgICBjb25zdCBlbGVtZW50cyA9IHN0aW11bHVzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zdGltdWx1cy1ib2R5LCBxdGktc3R5bGVzaGVldCcpO1xuICAgICAgc3RpbXVsdXNSZWYuaW5uZXJIVE1MID0gJyc7XG4gICAgICBzdGltdWx1c1JlZi5hcHBlbmQoLi4uZWxlbWVudHMpO1xuICAgIH1cbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYnOiBRdGlBc3Nlc3NtZW50U3RpbXVsdXNSZWY7XG4gIH1cbn1cbiIsICJjb25zdCB4bWwgPSBTdHJpbmcucmF3O1xuXG4vKiAgIDwhLS0gY29udmVydCBDREFUQSB0byBjb21tZW50cyAtLT5cbiAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD1cInRleHQoKVtjb250YWlucyguLCAnQ0RBVEEnKV1cIj5cbiAgPHhzbDpjb21tZW50PlxuICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PVwiLlwiLz5cbiAgPC94c2w6Y29tbWVudD5cbjwveHNsOnRlbXBsYXRlPlxuKi9cblxuLypcbiAgPCEtLSByZW1vdmUgeG1sIGNvbW1lbnRzIC0tPlxuICA8eHNsOnRlbXBsYXRlIG1hdGNoPVwiY29tbWVudCgpXCIgLz5cbiAgKi9cblxuY29uc3QgeG1sVG9IVE1MID0geG1sYDx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPVwiMS4wXCIgeG1sbnM6eHNsPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtXCI+XG48eHNsOm91dHB1dCBtZXRob2Q9XCJodG1sXCIgdmVyc2lvbj1cIjUuMFwiIGVuY29kaW5nPVwiVVRGLThcIiBpbmRlbnQ9XCJ5ZXNcIiAvPlxuICA8eHNsOnRlbXBsYXRlIG1hdGNoPVwiQCp8bm9kZSgpXCI+XG4gICAgPHhzbDpjb3B5PlxuICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PVwiQCp8bm9kZSgpXCIvPlxuICAgIDwveHNsOmNvcHk+XG4gIDwveHNsOnRlbXBsYXRlPlxuXG4gIDwhLS0gcmVtb3ZlIGV4aXN0aW5nIG5hbWVzcGFjZXMgLS0+XG4gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9XCIqXCI+XG4gICAgPCEtLSByZW1vdmUgZWxlbWVudCBwcmVmaXggLS0+XG4gICAgPHhzbDplbGVtZW50IG5hbWU9XCJ7bG9jYWwtbmFtZSgpfVwiPlxuICAgICAgPCEtLSBwcm9jZXNzIGF0dHJpYnV0ZXMgLS0+XG4gICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD1cIkAqXCI+XG4gICAgICAgIDwhLS0gcmVtb3ZlIGF0dHJpYnV0ZSBwcmVmaXggLS0+XG4gICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9XCJ7bG9jYWwtbmFtZSgpfVwiPlxuICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PVwiLlwiLz5cbiAgICAgICAgPC94c2w6YXR0cmlidXRlPlxuICAgICAgPC94c2w6Zm9yLWVhY2g+XG4gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPlxuICA8L3hzbDplbGVtZW50PlxuPC94c2w6dGVtcGxhdGU+XG48L3hzbDpzdHlsZXNoZWV0PmA7XG5cbi8vIEZ1bmN0aW9uIHRvIGV4dGVuZCBlbGVtZW50cyB3aXRoIGEgc3BlY2lmaWMgdGFnIG5hbWUgYnkgYWRkaW5nIGFuIGV4dGVuc2lvbiBzdWZmaXhcbmV4cG9ydCBmdW5jdGlvbiBleHRlbmRFbGVtZW50TmFtZSh4bWxGcmFnbWVudDogWE1MRG9jdW1lbnQsIHRhZ05hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcpIHtcbiAgeG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCh0YWdOYW1lKS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgIGNvbnN0IG5ld1RhZ05hbWUgPSBgJHt0YWdOYW1lfS0ke2V4dGVuc2lvbn1gO1xuICAgIGNvbnN0IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50V2l0aE5ld1RhZ05hbWUoZWxlbWVudCwgbmV3VGFnTmFtZSk7XG4gICAgZWxlbWVudC5yZXBsYWNlV2l0aChuZXdFbGVtZW50KTtcbiAgfSk7XG59XG5cbi8vIEZ1bmN0aW9uIHRvIGV4dGVuZCBhbnkgZWxlbWVudCB3aXRoIGEgc3BlY2lmaWMgY2xhc3MgcGF0dGVybiAoZS5nLiwgXCJleHRlbmQ6c3VmZml4XCIpXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kRWxlbWVudHNXaXRoQ2xhc3MoeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50LCBjbGFzc05hbWVQYXR0ZXJuOiBzdHJpbmcpIHtcbiAgeG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnKicpLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgY29uc3QgY2xhc3NMaXN0ID0gZWxlbWVudC5jbGFzc0xpc3Q7XG4gICAgaWYgKGNsYXNzTGlzdCkge1xuICAgICAgY2xhc3NMaXN0LmZvckVhY2goY2xhc3NOYW1lID0+IHtcbiAgICAgICAgaWYgKGNsYXNzTmFtZS5zdGFydHNXaXRoKGAke2NsYXNzTmFtZVBhdHRlcm59OmApKSB7XG4gICAgICAgICAgY29uc3Qgc3VmZml4ID0gY2xhc3NOYW1lLnNsaWNlKGAke2NsYXNzTmFtZVBhdHRlcm59OmAubGVuZ3RoKTtcbiAgICAgICAgICBjb25zdCBuZXdUYWdOYW1lID0gYCR7ZWxlbWVudC5ub2RlTmFtZX0tJHtzdWZmaXh9YDtcbiAgICAgICAgICBjb25zdCBuZXdFbGVtZW50ID0gY3JlYXRlRWxlbWVudFdpdGhOZXdUYWdOYW1lKGVsZW1lbnQsIG5ld1RhZ05hbWUpO1xuICAgICAgICAgIGVsZW1lbnQucmVwbGFjZVdpdGgobmV3RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgZWxlbWVudCB3aXRoIGEgbmV3IHRhZyBuYW1lIGFuZCBjb3B5IGF0dHJpYnV0ZXMgYW5kIGNoaWxkcmVuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50V2l0aE5ld1RhZ05hbWUoZWxlbWVudCwgbmV3VGFnTmFtZSkge1xuICBjb25zdCBuZXdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuZXdUYWdOYW1lKTtcbiAgLy8gQ29weSBhdHRyaWJ1dGVzXG4gIGZvciAoY29uc3QgYXR0ciBvZiBlbGVtZW50LmF0dHJpYnV0ZXMpIHtcbiAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpO1xuICB9XG4gIC8vIENvcHkgY2hpbGQgbm9kZXNcbiAgd2hpbGUgKGVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudC5maXJzdENoaWxkKTtcbiAgfVxuICByZXR1cm4gbmV3RWxlbWVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGl0ZW1zRnJvbVRlc3QoeG1sRnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpIHtcbiAgY29uc3QgaXRlbXM6IHsgaWRlbnRpZmllcjogc3RyaW5nOyBocmVmOiBzdHJpbmc7IGNhdGVnb3J5OiBzdHJpbmcgfVtdID0gW107XG4gIHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0tcmVmJykuZm9yRWFjaChlbCA9PiB7XG4gICAgY29uc3QgaWRlbnRpZmllciA9IGVsLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpO1xuICAgIGNvbnN0IGhyZWYgPSBlbC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTtcbiAgICBjb25zdCBjYXRlZ29yeSA9IGVsLmdldEF0dHJpYnV0ZSgnY2F0ZWdvcnknKTtcbiAgICBpdGVtcy5wdXNoKHsgaWRlbnRpZmllciwgaHJlZiwgY2F0ZWdvcnkgfSk7XG4gIH0pO1xuICByZXR1cm4gaXRlbXM7XG59XG5cbmxldCBjdXJyZW50UmVxdWVzdDogWE1MSHR0cFJlcXVlc3QgfCBudWxsID0gbnVsbDtcblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRYTUwodXJsLCBjYW5jZWxQcmV2aW91c1JlcXVlc3QgPSBmYWxzZSkge1xuICBpZiAoY2FuY2VsUHJldmlvdXNSZXF1ZXN0ICYmIGN1cnJlbnRSZXF1ZXN0ICE9PSBudWxsKSB7XG4gICAgY3VycmVudFJlcXVlc3QuYWJvcnQoKTsgLy8gQWJvcnQgdGhlIG9uZ29pbmcgcmVxdWVzdCBpZiB0aGVyZSBpcyBvbmVcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZTxYTUxEb2N1bWVudCB8IG51bGw+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICBjdXJyZW50UmVxdWVzdCA9IHhocjsgLy8gU3RvcmUgdGhlIGN1cnJlbnQgcmVxdWVzdFxuXG4gICAgeGhyLm9wZW4oJ0dFVCcsIHVybCwgdHJ1ZSk7XG4gICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdkb2N1bWVudCc7XG5cbiAgICB4aHIub25sb2FkID0gKCkgPT4ge1xuICAgICAgaWYgKHhoci5zdGF0dXMgPj0gMjAwICYmIHhoci5zdGF0dXMgPCAzMDApIHtcbiAgICAgICAgcmVzb2x2ZSh4aHIucmVzcG9uc2VYTUwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgeGhyLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICByZWplY3QoeGhyLnN0YXR1c1RleHQpO1xuICAgIH07XG5cbiAgICB4aHIuc2VuZCgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlWE1MKHhtbERvY3VtZW50OiBzdHJpbmcpIHtcbiAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICBjb25zdCB4bWxGcmFnbWVudCA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoeG1sRG9jdW1lbnQsICd0ZXh0L3htbCcpO1xuICByZXR1cm4geG1sRnJhZ21lbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0hUTUwoeG1sRnJhZ21lbnQ6IERvY3VtZW50KTogRG9jdW1lbnRGcmFnbWVudCB7XG4gIGNvbnN0IHByb2Nlc3NvciA9IG5ldyBYU0xUUHJvY2Vzc29yKCk7XG4gIGNvbnN0IHhzbHREb2N1bWVudCA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoeG1sVG9IVE1MLCAndGV4dC94bWwnKTtcbiAgcHJvY2Vzc29yLmltcG9ydFN0eWxlc2hlZXQoeHNsdERvY3VtZW50KTtcbiAgY29uc3QgaXRlbUhUTUxGcmFnbWVudCA9IHByb2Nlc3Nvci50cmFuc2Zvcm1Ub0ZyYWdtZW50KHhtbEZyYWdtZW50LCBkb2N1bWVudCk7XG4gIHJldHVybiBpdGVtSFRNTEZyYWdtZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0TG9jYXRpb24oeG1sRnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQsIGxvY2F0aW9uOiBzdHJpbmcpIHtcbiAgaWYgKCFsb2NhdGlvbi5lbmRzV2l0aCgnLycpKSB7XG4gICAgbG9jYXRpb24gKz0gJy8nO1xuICB9XG5cbiAgeG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnW3NyY10sW2hyZWZdLFtwcmltYXJ5LXBhdGhdJykuZm9yRWFjaChlbFdpdGhTcmMgPT4ge1xuICAgIGxldCBhdHRyOiAnc3JjJyB8ICdocmVmJyB8ICdwcmltYXJ5LXBhdGgnIHwgJycgPSAnJztcblxuICAgIGlmIChlbFdpdGhTcmMuZ2V0QXR0cmlidXRlKCdzcmMnKSkge1xuICAgICAgYXR0ciA9ICdzcmMnO1xuICAgIH1cbiAgICBpZiAoZWxXaXRoU3JjLmdldEF0dHJpYnV0ZSgnaHJlZicpKSB7XG4gICAgICBhdHRyID0gJ2hyZWYnO1xuICAgIH1cbiAgICBpZiAoZWxXaXRoU3JjLmdldEF0dHJpYnV0ZSgncHJpbWFyeS1wYXRoJykpIHtcbiAgICAgIGF0dHIgPSAncHJpbWFyeS1wYXRoJztcbiAgICB9XG4gICAgY29uc3QgYXR0clZhbHVlID0gZWxXaXRoU3JjLmdldEF0dHJpYnV0ZShhdHRyKT8udHJpbSgpO1xuXG4gICAgaWYgKCFhdHRyVmFsdWUuc3RhcnRzV2l0aCgnZGF0YTonKSAmJiAhYXR0clZhbHVlLnN0YXJ0c1dpdGgoJ2h0dHAnKSkge1xuICAgICAgY29uc3QgbmV3U3JjVmFsdWUgPSBsb2NhdGlvbiArIGVuY29kZVVSSShhdHRyVmFsdWUpO1xuICAgICAgZWxXaXRoU3JjLnNldEF0dHJpYnV0ZShhdHRyLCBuZXdTcmNWYWx1ZSk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRDREFUQXRvQ29tbWVudCh4bWxGcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCkge1xuICBjb25zdCBjZGF0YUVsZW1lbnRzID0geG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgncXRpLWN1c3RvbS1vcGVyYXRvcltjbGFzcz1cImpzLm9yZ1wiXSA+IHF0aS1iYXNlLXZhbHVlJyk7XG4gIGNkYXRhRWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICBjb25zdCBjb21tZW50VGV4dCA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoZWxlbWVudC50ZXh0Q29udGVudCk7XG4gICAgZWxlbWVudC5yZXBsYWNlQ2hpbGQoY29tbWVudFRleHQsIGVsZW1lbnQuZmlyc3RDaGlsZCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyaXBTdHlsZVNoZWV0cyh4bWxGcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCkge1xuICAvLyByZW1vdmUgcXRpLXN0eWxlc2hlZXQgdGFnXG4gIHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zdHlsZXNoZWV0JykuZm9yRWFjaChzdHlsZXNoZWV0ID0+IHN0eWxlc2hlZXQucmVtb3ZlKCkpO1xufVxuIiwgIi8qKlxuICogQnJvd3NlciBiYXNlZCBRVEktWE1MIHRvIEhUTUwgdHJhbnNmb3JtZXIuXG4gKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIG1ldGhvZHMgdG8gbG9hZCwgcGFyc2UsIHRyYW5zZm9ybSBhbmQgc2VyaWFsaXplIFFUSSBYTUwgaXRlbXMuXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2l0aCBtZXRob2RzIHRvIGxvYWQsIHBhcnNlLCB0cmFuc2Zvcm0gYW5kIHNlcmlhbGl6ZSBRVEkgWE1MIGl0ZW1zLlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHF0aVRyYW5zZm9ybWVyID0gcXRpVHJhbnNmb3JtSXRlbSgpO1xuICogYXdhaXQgcXRpVHJhbnNmb3JtZXIubG9hZCgncGF0aC90by94bWwvZmlsZS54bWwnKTtcbiAqIHF0aVRyYW5zZm9ybWVyLnBhdGgoJy9hc3Nlc3NtZW50SXRlbS9pdGVtQm9keScpO1xuICogY29uc3QgaHRtbCA9IHF0aVRyYW5zZm9ybWVyLmh0bWwoKTtcbiAqIGNvbnN0IHhtbCA9IHF0aVRyYW5zZm9ybWVyLnhtbCgpO1xuICogY29uc3QgaHRtbGRvYyA9IHF0aVRyYW5zZm9ybWVyLmh0bWxkb2MoKTtcbiAqIGNvbnN0IHhtbGRvYyA9IHF0aVRyYW5zZm9ybWVyLnhtbGRvYygpO1xuICpcbiAqIHF0aVRyYW5zZm9ybUl0ZW0oKS5wYXJzZShzdG9yeVhNTCkuaHRtbCgpXG4gKi9cblxuaW1wb3J0IHtcbiAgY29udmVydENEQVRBdG9Db21tZW50LFxuICBleHRlbmRFbGVtZW50TmFtZSxcbiAgZXh0ZW5kRWxlbWVudHNXaXRoQ2xhc3MsXG4gIGxvYWRYTUwsXG4gIHBhcnNlWE1MLFxuICBzZXRMb2NhdGlvbixcbiAgc3RyaXBTdHlsZVNoZWV0cyxcbiAgdG9IVE1MXG59IGZyb20gJy4vcXRpLXRyYW5zZm9ybWVycyc7XG5cbmV4cG9ydCB0eXBlIHRyYW5zZm9ybUl0ZW1BcGkgPSB7XG4gIGxvYWQ6ICh1cmk6IHN0cmluZywgY2FuY2VsUHJldmlvdXNSZXF1ZXN0PzogYm9vbGVhbikgPT4gUHJvbWlzZTx0cmFuc2Zvcm1JdGVtQXBpPjtcbiAgcGFyc2U6ICh4bWxTdHJpbmc6IHN0cmluZykgPT4gdHJhbnNmb3JtSXRlbUFwaTtcbiAgcGF0aDogKGxvY2F0aW9uOiBzdHJpbmcpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIGZuOiAoZm46ICh4bWxGcmFnbWVudDogWE1MRG9jdW1lbnQpID0+IHZvaWQpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIHBjaUhvb2tzOiAodXJpOiBzdHJpbmcpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIGV4dGVuZEVsZW1lbnROYW1lOiAoZWxlbWVudE5hbWU6IHN0cmluZywgZXh0ZW5kOiBzdHJpbmcpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIGV4dGVuZEVsZW1lbnRzV2l0aENsYXNzOiAocGFyYW0/OiBzdHJpbmcpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIGN1c3RvbUludGVyYWN0aW9uOiAoYmFzZVJlZjogc3RyaW5nLCBiYXNlSXRlbTogc3RyaW5nKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBjb252ZXJ0Q0RBVEF0b0NvbW1lbnQ6ICgpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIHN0cmlwU3R5bGVTaGVldHM6ICgpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIGh0bWw6ICgpID0+IHN0cmluZztcbiAgeG1sOiAoKSA9PiBzdHJpbmc7XG4gIGh0bWxEb2M6ICgpID0+IERvY3VtZW50RnJhZ21lbnQ7XG4gIHhtbERvYzogKCkgPT4gWE1MRG9jdW1lbnQ7XG59O1xuXG5leHBvcnQgY29uc3QgcXRpVHJhbnNmb3JtSXRlbSA9ICgpID0+IHtcbiAgbGV0IHhtbEZyYWdtZW50OiBYTUxEb2N1bWVudDtcblxuICBjb25zdCBhcGk6IHRyYW5zZm9ybUl0ZW1BcGkgPSB7XG4gICAgYXN5bmMgbG9hZCh1cmk6IHN0cmluZywgY2FuY2VsUHJldmlvdXNSZXF1ZXN0ID0gZmFsc2UpOiBQcm9taXNlPHR5cGVvZiBhcGk+IHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx0eXBlb2YgYXBpPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxvYWRYTUwodXJpLCBjYW5jZWxQcmV2aW91c1JlcXVlc3QpLnRoZW4oeG1sID0+IHtcbiAgICAgICAgICB4bWxGcmFnbWVudCA9IHhtbDtcbiAgICAgICAgICAvLyBzZXQgdGhlIGJhc2UgcGF0aCBmb3IgaW1hZ2VzIGFuZCBvdGhlciByZXNvdXJjZXMsXG4gICAgICAgICAgLy8geW91IHByb2JhYmx5IHdhbnQgdG8gc2V0IHRoZSBiYXNlIHBhdGggdG8gdGhlIGRvY3VtZW50IHJvb3QgZWxzZSB5b3UgY2FuIHVzZSB0aGUgcGF0aCBtZXRob2QgdG8gc2V0IGl0XG4gICAgICAgICAgYXBpLnBhdGgodXJpLnN1YnN0cmluZygwLCB1cmkubGFzdEluZGV4T2YoJy8nKSkpO1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKGFwaSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBwYXJzZSh4bWxTdHJpbmc6IHN0cmluZyk6IHR5cGVvZiBhcGkge1xuICAgICAgeG1sRnJhZ21lbnQgPSBwYXJzZVhNTCh4bWxTdHJpbmcpO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIHBhdGg6IChsb2NhdGlvbjogc3RyaW5nKTogdHlwZW9mIGFwaSA9PiB7XG4gICAgICBzZXRMb2NhdGlvbih4bWxGcmFnbWVudCwgbG9jYXRpb24pO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIGZuKGZuOiAoeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50KSA9PiB2b2lkKTogdHlwZW9mIGFwaSB7XG4gICAgICBmbih4bWxGcmFnbWVudCk7XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgcGNpSG9va3ModXJpOiBzdHJpbmcpOiB0eXBlb2YgYXBpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBbJ2hvb2snLCAnbW9kdWxlJ107XG4gICAgICBjb25zdCBkb2N1bWVudFBhdGggPSB1cmkuc3Vic3RyaW5nKDAsIHVyaS5sYXN0SW5kZXhPZignLycpKTtcbiAgICAgIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgY29uc3Qgc3JjQXR0cmlidXRlcyA9IHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1snICsgYXR0cmlidXRlICsgJ10nKTtcbiAgICAgICAgc3JjQXR0cmlidXRlcy5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgIGNvbnN0IHNyY1ZhbHVlID0gbm9kZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKSE7XG4gICAgICAgICAgaWYgKCFzcmNWYWx1ZS5zdGFydHNXaXRoKCdkYXRhOicpICYmICFzcmNWYWx1ZS5zdGFydHNXaXRoKCdodHRwJykpIHtcbiAgICAgICAgICAgIC8vIEp1c3QgcGFzdGUgdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIHNyYyBsb2NhdGlvbiBhZnRlciB0aGUgZG9jdW1lbnRyb290UGF0aFxuICAgICAgICAgICAgLy8gb2xkIHBjaXMgY2FuIGhhdmUgYSAuanMsIG5ldyBwY2kncyBkb24ndFxuICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoJ2Jhc2UtdXJsJywgdXJpKTtcbiAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgICAnbW9kdWxlJyxcbiAgICAgICAgICAgICAgZG9jdW1lbnRQYXRoICsgJy8nICsgZW5jb2RlVVJJKHNyY1ZhbHVlICsgKHNyY1ZhbHVlLmVuZHNXaXRoKCcuanMnKSA/ICcnIDogJy5qcycpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIGV4dGVuZEVsZW1lbnROYW1lOiAodGFnTmFtZTogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZyk6IHR5cGVvZiBhcGkgPT4ge1xuICAgICAgZXh0ZW5kRWxlbWVudE5hbWUoeG1sRnJhZ21lbnQsIHRhZ05hbWUsIGV4dGVuc2lvbik7XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgZXh0ZW5kRWxlbWVudHNXaXRoQ2xhc3M6IChwYXJhbTogc3RyaW5nID0gJ2V4dGVuZCcpOiB0eXBlb2YgYXBpID0+IHtcbiAgICAgIGV4dGVuZEVsZW1lbnRzV2l0aENsYXNzKHhtbEZyYWdtZW50LCBwYXJhbSk7XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgY3VzdG9tSW50ZXJhY3Rpb24oYmFzZVJlZjogc3RyaW5nLCBiYXNlSXRlbTogc3RyaW5nKTogdHlwZW9mIGFwaSB7XG4gICAgICBjb25zdCBxdGlDdXN0b21JbnRlcmFjdGlvbiA9IHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJ3F0aS1jdXN0b20taW50ZXJhY3Rpb24nKTtcbiAgICAgIGNvbnN0IHF0aUN1c3RvbUludGVyYWN0aW9uT2JqZWN0ID0gcXRpQ3VzdG9tSW50ZXJhY3Rpb24ucXVlcnlTZWxlY3Rvcignb2JqZWN0Jyk7XG5cbiAgICAgIHF0aUN1c3RvbUludGVyYWN0aW9uLnNldEF0dHJpYnV0ZSgnZGF0YS1iYXNlLXJlZicsIGJhc2VSZWYpO1xuICAgICAgcXRpQ3VzdG9tSW50ZXJhY3Rpb24uc2V0QXR0cmlidXRlKCdkYXRhLWJhc2UtaXRlbScsIGJhc2VSZWYgKyBiYXNlSXRlbSk7XG4gICAgICBxdGlDdXN0b21JbnRlcmFjdGlvbi5zZXRBdHRyaWJ1dGUoJ2RhdGEnLCBxdGlDdXN0b21JbnRlcmFjdGlvbk9iamVjdC5nZXRBdHRyaWJ1dGUoJ2RhdGEnKSk7XG4gICAgICBxdGlDdXN0b21JbnRlcmFjdGlvbi5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgcXRpQ3VzdG9tSW50ZXJhY3Rpb25PYmplY3QuZ2V0QXR0cmlidXRlKCd3aWR0aCcpKTtcbiAgICAgIHF0aUN1c3RvbUludGVyYWN0aW9uLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgcXRpQ3VzdG9tSW50ZXJhY3Rpb25PYmplY3QuZ2V0QXR0cmlidXRlKCdoZWlnaHQnKSk7XG5cbiAgICAgIHF0aUN1c3RvbUludGVyYWN0aW9uLnJlbW92ZUNoaWxkKHF0aUN1c3RvbUludGVyYWN0aW9uT2JqZWN0KTtcbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBjb252ZXJ0Q0RBVEF0b0NvbW1lbnQoKTogdHlwZW9mIGFwaSB7XG4gICAgICBjb252ZXJ0Q0RBVEF0b0NvbW1lbnQoeG1sRnJhZ21lbnQpO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIHN0cmlwU3R5bGVTaGVldHMoKTogdHlwZW9mIGFwaSB7XG4gICAgICBzdHJpcFN0eWxlU2hlZXRzKHhtbEZyYWdtZW50KTtcbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBodG1sKCkge1xuICAgICAgcmV0dXJuIG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcodG9IVE1MKHhtbEZyYWdtZW50KSk7XG4gICAgfSxcbiAgICB4bWwoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKHhtbEZyYWdtZW50KTtcbiAgICB9LFxuICAgIGh0bWxEb2MoKSB7XG4gICAgICByZXR1cm4gdG9IVE1MKHhtbEZyYWdtZW50KTtcbiAgICB9LFxuICAgIHhtbERvYygpOiBYTUxEb2N1bWVudCB7XG4gICAgICByZXR1cm4geG1sRnJhZ21lbnQ7IC8vIG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcoeG1sRnJhZ21lbnQpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGFwaTtcbn07XG4iLCAiaW1wb3J0IHsgQ29tcGxleEF0dHJpYnV0ZUNvbnZlcnRlciwgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vLi4vLi4vZGVjb3JhdG9ycy93YXRjaCc7XG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IGFic3RyYWN0IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hvaWNlSW50ZXJmYWNlIHtcbiAgaWRlbnRpZmllcjogc3RyaW5nO1xuICBkaXNhYmxlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHk6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydGVyIHRvIGhhbmRsZSBib29sZWFuIGF0dHJpYnV0ZXMgZm9yIEFSSUEgcHJvcGVydGllcyxcbiAqIGVuc3VyaW5nIHRoZXkgYXJlIHNldCBhcyAndHJ1ZScgb3IgJ2ZhbHNlJyBzdHJpbmdzLlxuICovXG5jb25zdCBhcmlhQm9vbGVhbkNvbnZlcnRlcjogQ29tcGxleEF0dHJpYnV0ZUNvbnZlcnRlcjxib29sZWFuLCBib29sZWFuPiA9IHtcbiAgdG9BdHRyaWJ1dGU6ICh2YWx1ZTogYm9vbGVhbikgPT4gKHZhbHVlID8gJ3RydWUnIDogJ2ZhbHNlJyksXG4gIGZyb21BdHRyaWJ1dGU6ICh2YWx1ZTogc3RyaW5nIHwgbnVsbCkgPT4gdmFsdWUgPT09ICd0cnVlJ1xufTtcblxuLyoqXG4gKiBBIG1peGluIHRoYXQgYWRkcyBjaG9pY2UgZnVuY3Rpb25hbGl0eSB0byBhIExpdEVsZW1lbnQtYmFzZWQgY2xhc3MuXG4gKiBJdCBkaXNwYXRjaGVzIGV2ZW50cyB3aXRoIGEgY3VzdG9tIGB0eXBlYCBhbmQgaGFuZGxlcyBzZWxlY3Rpb24gbG9naWMuXG4gKlxuICogQHBhcmFtIEJhc2UgLSBUaGUgYmFzZSBjbGFzcyB0byBleHRlbmQuXG4gKiBAcGFyYW0gdHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBjaG9pY2UsIHVzZWQgaW4gZXZlbnQgbmFtZXMuXG4gKiBAcmV0dXJucyBBIG5ldyBjbGFzcyBleHRlbmRpbmcgdGhlIGJhc2UgY2xhc3Mgd2l0aCBjaG9pY2UgZnVuY3Rpb25hbGl0eS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY3RpdmVFbGVtZW50TWl4aW5JbnRlcmZhY2Uge1xuICBpZGVudGlmaWVyOiBzdHJpbmc7XG4gIHRhYkluZGV4OiBudW1iZXI7XG4gIGRpc2FibGVkOiBib29sZWFuO1xuICByZWFkb25seTogYm9vbGVhbjtcbiAgaW50ZXJuYWxzOiBFbGVtZW50SW50ZXJuYWxzO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBBY3RpdmVFbGVtZW50TWl4aW48VCBleHRlbmRzIENvbnN0cnVjdG9yPExpdEVsZW1lbnQ+PihCYXNlOiBULCB0eXBlOiBzdHJpbmcpIHtcbiAgYWJzdHJhY3QgY2xhc3MgUXRpQ2hvaWNlIGV4dGVuZHMgQmFzZSB7XG4gICAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gICAgcHVibGljIGlkZW50aWZpZXIgPSAnJztcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSwgYXR0cmlidXRlOiAndGFiaW5kZXgnIH0pXG4gICAgcHVibGljIHRhYkluZGV4ID0gMDtcblxuICAgIEBwcm9wZXJ0eSh7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgcmVmbGVjdDogdHJ1ZSxcbiAgICAgIGF0dHJpYnV0ZTogJ2FyaWEtZGlzYWJsZWQnLFxuICAgICAgY29udmVydGVyOiBhcmlhQm9vbGVhbkNvbnZlcnRlclxuICAgIH0pXG4gICAgcHVibGljIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICBAcHJvcGVydHkoe1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIHJlZmxlY3Q6IHRydWUsXG4gICAgICBhdHRyaWJ1dGU6ICdhcmlhLXJlYWRvbmx5JyxcbiAgICAgIGNvbnZlcnRlcjogYXJpYUJvb2xlYW5Db252ZXJ0ZXJcbiAgICB9KVxuICAgIHB1YmxpYyByZWFkb25seSA9IGZhbHNlO1xuXG4gICAgcHVibGljIGludGVybmFsczogRWxlbWVudEludGVybmFscztcblxuICAgIEB3YXRjaCgnZGlzYWJsZWQnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gICAgaGFuZGxlRGlzYWJsZWRDaGFuZ2UoX29sZFZhbHVlOiBib29sZWFuLCBkaXNhYmxlZDogYm9vbGVhbikge1xuICAgICAgdGhpcy50YWJJbmRleCA9IGRpc2FibGVkID8gLTEgOiAwO1xuICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuYmx1cigpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICBzdXBlciguLi5hcmdzKTtcbiAgICAgIHRoaXMuaW50ZXJuYWxzID0gdGhpcy5hdHRhY2hJbnRlcm5hbHMoKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLl9vbktleVVwKTtcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkNsaWNrKTtcblxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoYHJlZ2lzdGVyLSR7dHlwZX1gLCB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjb21wb3NlZDogdHJ1ZVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5fb25LZXlVcCk7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25DbGljayk7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBDdXN0b21FdmVudChgdW5yZWdpc3Rlci0ke3R5cGV9YCwge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWVcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfb25LZXlVcChldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgaWYgKGV2ZW50LmFsdEtleSkgcmV0dXJuO1xuXG4gICAgICBpZiAoZXZlbnQuY29kZSA9PT0gJ1NwYWNlJykge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLl9hY3RpdmF0ZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX29uQ2xpY2soKSB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSByZXR1cm47XG4gICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICB0aGlzLl9hY3RpdmF0ZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2FjdGl2YXRlKCkge1xuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgcmV0dXJuO1xuXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBDdXN0b21FdmVudDx7IGlkZW50aWZpZXI6IHN0cmluZyB9PihgYWN0aXZhdGUtJHt0eXBlfWAsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgIGRldGFpbDogeyBpZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIgfVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFF0aUNob2ljZSBhcyBDb25zdHJ1Y3RvcjxBY3RpdmVFbGVtZW50TWl4aW5JbnRlcmZhY2U+ICYgVDtcbn1cbiIsICJpbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgc3R5bGVzIGZyb20gJy4vcXRpLWl0ZW0tYm9keS5zdHlsZXMnO1xuaW1wb3J0IHR5cGUgeyBDU1NSZXN1bHRHcm91cCB9IGZyb20gJ2xpdCc7XG5cbi8qKlxuICogQHN1bW1hcnkgVGhlIHF0aS1pdGVtLWJvZHkgbm9kZSBjb250YWlucyB0aGUgdGV4dCwgZ3JhcGhpY3MsIG1lZGlhIG9iamVjdHMgYW5kIGludGVyYWN0aW9ucyB0aGF0IGRlc2NyaWJlIHRoZSBpdGVtJ3MgY29udGVudCBhbmQgaW5mb3JtYXRpb24gYWJvdXQgaG93IGl0IGlzIHN0cnVjdHVyZWQuXG4gKiBAZG9jdW1lbnRhdGlvbiBodHRwczovL3d3dy5pbXNnbG9iYWwub3JnL3NwZWMvcXRpL3YzcDAvaW1wbCNoLnNwaHBvNmx1NnpxaVxuICogQHN0YXR1cyBzdGFibGVcbiAqIEBzaW5jZSA0LjBcbiAqXG4gKiBAc2xvdCAtIGl0ZW0gYm9keSBjb250ZW50LlxuICogQHNsb3QgcXRpLXJ1YnJpYy1ibG9jayAtIHRoZSBxdGkgcnVicmljIGJsb2NrIGlzIHBsYWNlZCBhYm92ZSB0aGUgaXRlbVxuICpcbiAqL1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1pdGVtLWJvZHknKVxuZXhwb3J0IGNsYXNzIFF0aUl0ZW1Cb2R5IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gc3R5bGVzO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdCBuYW1lPVwicXRpLXJ1YnJpYy1ibG9ja1wiPjwvc2xvdD48c2xvdD48L3Nsb3Q+YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktaXRlbS1ib2R5JzogUXRpSXRlbUJvZHk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuXG5leHBvcnQgZGVmYXVsdCBjc3NgXG4gIDpob3N0IHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgfVxuYDtcbiIsICJpbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5AY3VzdG9tRWxlbWVudCgncXRpLXByb21wdCcpXG5leHBvcnQgY2xhc3MgUXRpUHJvbXB0IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIC8vIGlmIHByb21wdHMgYXJlIGluIGludGVyYWN0aW9ucyB0aGV5IHNob3VsZCBoYXZlIGEgc2xvdCwgc28gdGhlIHByb21wdCBoYXMgdG8gZ28gdGhlcmVcbiAgICAvLyBpZiBwcm9tcHQgaXMgaW4gdGhlIGJvZHksIHRoZW4ganVzdCBkaXNwbGF5IHRoZSBwcm9tcHQgdGhlcmUuXG4gICAgLy8gQSBiZXR0ZXIgY2hlY2sgd291bGQgYmUgdGhlIGxhdHRlciwgYnV0IG5vdCBjYW4ndCBnZXQgdGhyb3VnaCB0aGUgc2hhZG93cm9vdCB0byBmaW5kIHRoZSBzbG90XG4gICAgY29uc3QgaW5JbnRlcmFjdGlvbiA9IHRoaXMucGFyZW50RWxlbWVudC50YWdOYW1lLmVuZHNXaXRoKCdJTlRFUkFDVElPTicpO1xuICAgIGlmIChpbkludGVyYWN0aW9uKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdwcm9tcHQnKTtcbiAgICB9XG4gICAgLy8gY29uc3QgcHJvbXB0U2xvdCA9IHRoaXMucGFyZW50RWxlbWVudC5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoXCJbbmFtZT0ncHJvbXB0J11cIik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXByb21wdCc6IFF0aVByb21wdDtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIFByb3BlcnR5VmFsdWVNYXAgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1zdHlsZXNoZWV0JylcbmV4cG9ydCBjbGFzcyBRdGlTdHlsZXNoZWV0IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHByaXZhdGUgc3R5bGVFbGVtZW50OiBIVE1MU3R5bGVFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJvdGVjdGVkIGZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVNYXA8YW55PiB8IE1hcDxQcm9wZXJ0eUtleSwgdW5rbm93bj4pOiB2b2lkIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzKTtcblxuICAgIGNvbnN0IGxpbmsgPSB0aGlzLmdldEF0dHJpYnV0ZSgnaHJlZicpO1xuXG4gICAgaWYgKGxpbmsgIT09IG51bGwpIHtcbiAgICAgIC8vIEZldGNoIHRoZSBzdHlsZXNoZWV0IGNvbnRlbnRcbiAgICAgIGZldGNoKGxpbmspXG4gICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLnRleHQoKSlcbiAgICAgICAgLnRoZW4oY3NzQ29udGVudCA9PiB7XG4gICAgICAgICAgLy8gTWluaWZ5IHRoZSBDU1MgY29udGVudCBieSByZW1vdmluZyB3aGl0ZXNwYWNlIGFuZCBjb21tZW50c1xuICAgICAgICAgIGNvbnN0IG1pbmlmaWVkQ3NzID0gdGhpcy5taW5pZnlDc3MoY3NzQ29udGVudCk7XG5cbiAgICAgICAgICAvLyBDcmVhdGUgYSA8c3R5bGU+IGVsZW1lbnQgd2l0aCBAc2NvcGUgc3Vycm91bmRpbmcgdGhlIG1pbmlmaWVkIENTU1xuICAgICAgICAgIHRoaXMuc3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgICB0aGlzLnN0eWxlRWxlbWVudC5tZWRpYSA9ICdzY3JlZW4nO1xuICAgICAgICAgIHRoaXMuc3R5bGVFbGVtZW50LnRleHRDb250ZW50ID0gYEBzY29wZSB7JHttaW5pZmllZENzc319YDtcblxuICAgICAgICAgIC8vIEFwcGVuZCB0aGUgc3R5bGUgZWxlbWVudCB0byB0aGUgcGFyZW50IGVsZW1lbnQgb2YgdGhpcyBjb21wb25lbnRcbiAgICAgICAgICBpZiAodGhpcy5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5zdHlsZUVsZW1lbnQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ05vIHBhcmVudCBlbGVtZW50IHRvIGFwcGVuZCB0aGUgc2NvcGVkIHN0eWxlc2hlZXQgdG8uJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHN0eWxlc2hlZXQ6JywgZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50ZXh0Q29udGVudCAhPT0gbnVsbCAmJiB0aGlzLnRleHRDb250ZW50LnRyaW0oKSAhPT0gJycpIHtcbiAgICAgIC8vIE1pbmlmeSB0aGUgaW5saW5lIENTUyBjb250ZW50XG4gICAgICBjb25zdCBtaW5pZmllZENzcyA9IHRoaXMubWluaWZ5Q3NzKHRoaXMudGV4dENvbnRlbnQpO1xuXG4gICAgICAvLyBEaXJlY3RseSBjcmVhdGUgYSA8c3R5bGU+IGVsZW1lbnQgd2l0aCB0aGUgQHNjb3BlIHN1cnJvdW5kaW5nIHRoZSBtaW5pZmllZCBpbmxpbmUgc3R5bGVzXG4gICAgICB0aGlzLnN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICB0aGlzLnN0eWxlRWxlbWVudC5tZWRpYSA9ICdzY3JlZW4nO1xuICAgICAgdGhpcy5zdHlsZUVsZW1lbnQudGV4dENvbnRlbnQgPSBgQHNjb3BlIHske21pbmlmaWVkQ3NzfX1gO1xuXG4gICAgICAvLyBBcHBlbmQgdGhlIHN0eWxlIGVsZW1lbnQgdG8gdGhlIHBhcmVudCBlbGVtZW50IG9mIHRoaXMgY29tcG9uZW50XG4gICAgICBpZiAodGhpcy5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgIHRoaXMucGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnN0eWxlRWxlbWVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ05vIHBhcmVudCBlbGVtZW50IHRvIGFwcGVuZCB0aGUgc2NvcGVkIHN0eWxlc2hlZXQgdG8uJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtaW5pZnlDc3MoY3NzQ29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBSZW1vdmUgY29tbWVudHMsIHdoaXRlc3BhY2UsIGFuZCBuZXdsaW5lIGNoYXJhY3RlcnNcbiAgICByZXR1cm4gY3NzQ29udGVudFxuICAgICAgLnJlcGxhY2UoL1xcL1xcKltcXHNcXFNdKj9cXCpcXC8vZywgJycpIC8vIFJlbW92ZSBjb21tZW50c1xuICAgICAgLnJlcGxhY2UoL1xccysvZywgJyAnKSAvLyBDb2xsYXBzZSB3aGl0ZXNwYWNlXG4gICAgICAucmVwbGFjZSgvXFxzKihbe306O10pXFxzKi9nLCAnJDEnKSAvLyBSZW1vdmUgc3BhY2VzIGFyb3VuZCB7fSwgOiwgO1xuICAgICAgLnRyaW0oKTsgLy8gVHJpbSBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2VcbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIGlmICh0aGlzLnN0eWxlRWxlbWVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5zdHlsZUVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdDb3VsZCBub3QgcmVtb3ZlIHN0eWxlc2hlZXQ6JywgZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1zdHlsZXNoZWV0JzogUXRpU3R5bGVzaGVldDtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNvbnN1bWUgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEJhc2VUeXBlLCBDYXJkaW5hbGl0eSB9IGZyb20gJy4uLy4uL2ludGVybmFsL2V4cHJlc3Npb24tcmVzdWx0JztcbmltcG9ydCB7IE91dGNvbWVWYXJpYWJsZSB9IGZyb20gJy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBJdGVtQ29udGV4dCwgaXRlbUNvbnRleHQgfSBmcm9tICcuLi8uLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0uY29udGV4dCc7XG5pbXBvcnQgeyBRdGlWYXJpYWJsZURlY2xhcmF0aW9uIH0gZnJvbSAnLi4vcXRpLXZhcmlhYmxlLWRlY2xhcmF0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1vdXRjb21lLWRlY2xhcmF0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlPdXRjb21lRGVjbGFyYXRpb24gZXh0ZW5kcyBRdGlWYXJpYWJsZURlY2xhcmF0aW9uIHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdiYXNlLXR5cGUnIH0pIGJhc2VUeXBlOiBCYXNlVHlwZTtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdleHRlcm5hbC1zY29yZWQnIH0pIGV4dGVybmFsU2NvcmVkOiAnaHVtYW4nIHwgJ2V4dGVybmFsTWFjaGluZScgfCBudWxsID0gbnVsbDtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXI6IHN0cmluZztcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGNhcmRpbmFsaXR5OiBDYXJkaW5hbGl0eTtcblxuICBAY29uc3VtZSh7IGNvbnRleHQ6IGl0ZW1Db250ZXh0LCBzdWJzY3JpYmU6IHRydWUgfSlcbiAgQHN0YXRlKClcbiAgcHVibGljIGl0ZW1Db250ZXh0PzogSXRlbUNvbnRleHQ7XG5cbiAgc3RhdGljIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaXRlbUNvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSB0aGlzLmlkZW50aWZpZXIpPy52YWx1ZTtcbiAgICByZXR1cm4gaHRtbGAke0pTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAyKX1gO1xuICB9XG5cbiAgZ2V0IGludGVycG9sYXRpb25UYWJsZSgpOiBNYXA8bnVtYmVyLCBudW1iZXI+IHwgbnVsbCB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3F0aS1pbnRlcnBvbGF0aW9uLXRhYmxlJyk7XG4gICAgaWYgKHRhYmxlKSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgdGFibGUucXVlcnlTZWxlY3RvckFsbCgncXRpLWludGVycG9sYXRpb24tdGFibGUtZW50cnknKSkge1xuICAgICAgICBpZiAoIWVudHJ5LmdldEF0dHJpYnV0ZSgnc291cmNlLXZhbHVlJykgJiYgZW50cnkuZ2V0QXR0cmlidXRlKCd0YXJnZXQtdmFsdWUnKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3NvdXJjZS12YWx1ZSBvciB0YXJnZXQtdmFsdWUgaXMgbWlzc2luZyBpbiBxdGktaW50ZXJwb2xhdGlvbi10YWJsZS1lbnRyeScpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvdXJjZVZhbHVlID0gcGFyc2VJbnQoZW50cnkuZ2V0QXR0cmlidXRlKCdzb3VyY2UtdmFsdWUnKSk7XG4gICAgICAgIGNvbnN0IHRhcmdldFZhbHVlID0gcGFyc2VJbnQoZW50cnkuZ2V0QXR0cmlidXRlKCd0YXJnZXQtdmFsdWUnKSk7XG4gICAgICAgIGlmIChpc05hTihzb3VyY2VWYWx1ZSkgfHwgaXNOYU4odGFyZ2V0VmFsdWUpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignc291cmNlLXZhbHVlIG9yIHRhcmdldC12YWx1ZSBpcyBub3QgYSBudW1iZXIgaW4gcXRpLWludGVycG9sYXRpb24tdGFibGUtZW50cnknKTtcbiAgICAgICAgfVxuICAgICAgICBlbnRyaWVzLnNldChzb3VyY2VWYWx1ZSwgdGFyZ2V0VmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVudHJpZXM7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgY29uc3Qgb3V0Y29tZVZhcmlhYmxlOiBPdXRjb21lVmFyaWFibGUgPSB7XG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICBjYXJkaW5hbGl0eTogdGhpcy5jYXJkaW5hbGl0eSxcbiAgICAgIGJhc2VUeXBlOiB0aGlzLmJhc2VUeXBlLFxuICAgICAgdHlwZTogJ291dGNvbWUnLFxuICAgICAgdmFsdWU6IG51bGwsXG4gICAgICBpbnRlcnBvbGF0aW9uVGFibGU6IHRoaXMuaW50ZXJwb2xhdGlvblRhYmxlLFxuICAgICAgZXh0ZXJuYWxTY29yZWQ6IHRoaXMuZXh0ZXJuYWxTY29yZWRcbiAgICB9O1xuICAgIG91dGNvbWVWYXJpYWJsZS52YWx1ZSA9IHRoaXMuZGVmYXVsdFZhbHVlcyhvdXRjb21lVmFyaWFibGUpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLXJlZ2lzdGVyLXZhcmlhYmxlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7IHZhcmlhYmxlOiBvdXRjb21lVmFyaWFibGUgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1vdXRjb21lLWRlY2xhcmF0aW9uJzogUXRpT3V0Y29tZURlY2xhcmF0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktdmFyaWFibGVkZWNsYXJhdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpVmFyaWFibGVEZWNsYXJhdGlvbiBleHRlbmRzIExpdEVsZW1lbnQge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVmYXVsdFZhbHVlcyh2YXJpYWJsZTogVmFyaWFibGVEZWNsYXJhdGlvbjxzdHJpbmcgfCBzdHJpbmdbXSB8IG51bGw+KSB7XG4gICAgY29uc3QgaHRtbFZhbHVlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktZGVmYXVsdC12YWx1ZSA+IHF0aS12YWx1ZScpKTtcblxuICAgIGlmIChodG1sVmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdFZhbHVlcyA9IGh0bWxWYWx1ZXMubWFwKG4gPT4gbi5pbm5lckhUTUwudHJpbSgpKTtcbiAgICBpZiAoZGVmYXVsdFZhbHVlcy5sZW5ndGggPiAxIHx8IHZhcmlhYmxlLmNhcmRpbmFsaXR5ID09PSAnbXVsdGlwbGUnIHx8IHZhcmlhYmxlLmNhcmRpbmFsaXR5ID09PSAnb3JkZXJlZCcpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVzO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdFZhbHVlc1swXTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktdmFyaWFibGVkZWNsYXJhdGlvbic6IFF0aVZhcmlhYmxlRGVjbGFyYXRpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjb25zdW1lIH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBCYXNlVHlwZSwgQ2FyZGluYWxpdHkgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC9leHByZXNzaW9uLXJlc3VsdCc7XG5pbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IEl0ZW1Db250ZXh0LCBpdGVtQ29udGV4dCB9IGZyb20gJy4uLy4uL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcbmltcG9ydCB7IFF0aU1hcHBpbmcgfSBmcm9tICcuLi8uLi9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbWFwcGluZy9xdGktbWFwcGluZyc7XG5pbXBvcnQgeyBRdGlWYXJpYWJsZURlY2xhcmF0aW9uIH0gZnJvbSAnLi4vcXRpLXZhcmlhYmxlLWRlY2xhcmF0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1yZXNwb25zZS1kZWNsYXJhdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpUmVzcG9uc2VEZWNsYXJhdGlvbiBleHRlbmRzIFF0aVZhcmlhYmxlRGVjbGFyYXRpb24ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2Jhc2UtdHlwZScgfSkgYmFzZVR5cGU6IEJhc2VUeXBlO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGNhcmRpbmFsaXR5OiBDYXJkaW5hbGl0eTtcblxuICBAY29uc3VtZSh7IGNvbnRleHQ6IGl0ZW1Db250ZXh0LCBzdWJzY3JpYmU6IHRydWUgfSlcbiAgQHN0YXRlKClcbiAgcHVibGljIGl0ZW1Db250ZXh0PzogSXRlbUNvbnRleHQ7XG5cbiAgc3RhdGljIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaXRlbUNvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSB0aGlzLmlkZW50aWZpZXIpPy52YWx1ZTtcbiAgICByZXR1cm4gaHRtbGAke0pTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAyKX1gO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlOiBSZXNwb25zZVZhcmlhYmxlID0ge1xuICAgICAgYmFzZVR5cGU6IHRoaXMuYmFzZVR5cGUsXG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICBjb3JyZWN0UmVzcG9uc2U6IHRoaXMuY29ycmVjdFJlc3BvbnNlLFxuICAgICAgY2FyZGluYWxpdHk6IHRoaXMuY2FyZGluYWxpdHkgfHwgJ3NpbmdsZScsXG4gICAgICBtYXBwaW5nOiB0aGlzLm1hcHBpbmcsXG4gICAgICB2YWx1ZTogbnVsbCxcbiAgICAgIHR5cGU6ICdyZXNwb25zZScsXG4gICAgICBjYW5kaWRhdGVSZXNwb25zZTogbnVsbFxuICAgIH07XG4gICAgcmVzcG9uc2VWYXJpYWJsZS52YWx1ZSA9IHRoaXMuZGVmYXVsdFZhbHVlcyhyZXNwb25zZVZhcmlhYmxlKTtcblxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLXJlZ2lzdGVyLXZhcmlhYmxlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7IHZhcmlhYmxlOiByZXNwb25zZVZhcmlhYmxlIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGNvcnJlY3RSZXNwb25zZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgbGV0IHJlc3VsdDogc3RyaW5nIHwgc3RyaW5nW107XG4gICAgY29uc3QgY29ycmVjdFJlc3BvbnNlID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktY29ycmVjdC1yZXNwb25zZScpO1xuICAgIGlmIChjb3JyZWN0UmVzcG9uc2UpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IGNvcnJlY3RSZXNwb25zZS5xdWVyeVNlbGVjdG9yQWxsKCdxdGktdmFsdWUnKTtcbiAgICAgIGlmICh0aGlzLmNhcmRpbmFsaXR5ID09PSAnc2luZ2xlJyAmJiB2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXN1bHQgPSB2YWx1ZXNbMF0udGV4dENvbnRlbnQ7XG4gICAgICAgIHZhbHVlc1swXS5yZW1vdmUoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScpIHtcbiAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWVzW2ldLnRleHRDb250ZW50KTtcbiAgICAgICAgICB2YWx1ZXNbaV0ucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IG1hcHBpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvcigncXRpLW1hcHBpbmcnKSBhcyBRdGlNYXBwaW5nO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1yZXNwb25zZS1kZWNsYXJhdGlvbic6IFF0aVJlc3BvbnNlRGVjbGFyYXRpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktY29tcGFuaW9uLW1hdGVyaWFscy1pbmZvJylcbmV4cG9ydCBjbGFzcyBRdGlDb21wYW5pb25NYXRlcmlhbHNJbmZvIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIC8vIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gIC8vICAgc2xvdCB7XG4gIC8vICAgICBkaXNwbGF5OiBoaWRkZW47XG4gIC8vICAgfVxuICAvLyBgO1xuICAvLyBvdmVycmlkZSByZW5kZXIoKSB7XG4gIC8vICAgcmV0dXJuIGh0bWxgIDxzbG90Pjwvc2xvdD4gYDtcbiAgLy8gfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktY29tcGFuaW9uLW1hdGVyaWFscy1pbmZvJzogUXRpQ29tcGFuaW9uTWF0ZXJpYWxzSW5mbztcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1jb250ZW50LWJvZHknKVxuZXhwb3J0IGNsYXNzIFF0aUNvbnRlbnRCb2R5IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxufVxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWNvbnRlbnQtYm9keSc6IFF0aUNvbnRlbnRCb2R5O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL3dhdGNoJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1ydWJyaWMtYmxvY2snKVxuZXhwb3J0IGNsYXNzIFF0aVJ1YnJpY0Jsb2NrIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBvdmVycmlkZSBpZDsgLy8gPVwicXRpQXNwZWN0SW5ob3VkUnVicmljQmxvY2tcIlxuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSB1c2U6ICdpbnN0cnVjdGlvbnMnIHwgJ3Njb3JpbmcnIHwgJ25hdmlnYXRpb24nOyAvLyAgPSBcInNjb3JpbmdcIlxuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSB2aWV3OiAnYXV0aG9yJyB8ICdjYW5kaWRhdGUnIHwgJ3Byb2N0b3InIHwgJ3Njb3JlcicgfCAndGVzdENvbnN0cnVjdG9yJyB8ICd0dXRvcic7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdjbGFzcycgfSkgY2xhc3NOYW1lcztcbiAgQHdhdGNoKCdjbGFzc05hbWVzJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBoYW5kbGVjbGFzc05hbWVzQ2hhbmdlKG9sZCwgZGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBjbGFzc05hbWVzID0gdGhpcy5jbGFzc05hbWVzLnNwbGl0KCcgJyk7XG4gICAgY2xhc3NOYW1lcy5mb3JFYWNoKChjbGFzc05hbWU6IHN0cmluZykgPT4ge1xuICAgICAgc3dpdGNoIChjbGFzc05hbWUpIHtcbiAgICAgICAgY2FzZSAncXRpLXJ1YnJpYy1kaXNjcmV0aW9uYXJ5LXBsYWNlbWVudCc6XG4gICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3Nsb3QnLCAncXRpLXJ1YnJpYy1ibG9jaycpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdxdGktcnVicmljLWlubGluZSc6XG4gICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3Nsb3QnLCAnJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIC8vIGJ5IGRlZmF1bHQgcHV0IHRoaXMgaW4gYSBzbG90IGluIHRoZSBpdGVtLWJvZHlcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdxdGktcnVicmljLWJsb2NrJyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXJ1YnJpYy1ibG9jayc6IFF0aVJ1YnJpY0Jsb2NrO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgUHJvcGVydHlWYWx1ZU1hcCwgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBRdGlGZWVkYmFjayB9IGZyb20gJy4uL3F0aS1mZWVkYmFjayc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZmVlZGJhY2stYmxvY2snKVxuZXhwb3J0IGNsYXNzIFF0aUZlZWRiYWNrQmxvY2sgZXh0ZW5kcyBRdGlGZWVkYmFjayB7XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICAgIC5vbiB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG4gICAgLm9mZiB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IHBhcnQ9XCJmZWVkYmFja1wiIGNsYXNzPVwiZmVlZGJhY2sgJHt0aGlzLnNob3dTdGF0dXN9XCI+PC9zbG90PiBgO1xuICB9XG5cbiAgcHJvdGVjdGVkIGZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVNYXA8YW55PiB8IE1hcDxQcm9wZXJ0eUtleSwgdW5rbm93bj4pOiB2b2lkIHtcbiAgICB0aGlzLmNoZWNrU2hvd0ZlZWRiYWNrKHRoaXMub3V0Y29tZUlkZW50aWZpZXIpO1xuICB9XG59XG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZmVlZGJhY2stYmxvY2snOiBRdGlGZWVkYmFja0Jsb2NrO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY29uc3VtZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IElzTnVsbE9yVW5kZWZpbmVkIH0gZnJvbSAnLi4vaW50ZXJuYWwvdXRpbHMnO1xuaW1wb3J0IHsgaXRlbUNvbnRleHQsIEl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUXRpRmVlZGJhY2sgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdzaG93LWhpZGUnIH0pXG4gIHByb3RlY3RlZCBzaG93SGlkZTogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnb3V0Y29tZS1pZGVudGlmaWVyJyB9KVxuICBwdWJsaWMgb3V0Y29tZUlkZW50aWZpZXI6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgcHJvdGVjdGVkIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogZmFsc2UgfSlcbiAgcHVibGljIHNob3dTdGF0dXM6IHN0cmluZztcblxuICBAY29uc3VtZSh7IGNvbnRleHQ6IGl0ZW1Db250ZXh0LCBzdWJzY3JpYmU6IHRydWUgfSlcbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfY29udGV4dD86IEl0ZW1Db250ZXh0O1xuXG4gIHB1YmxpYyBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDxRdGlGZWVkYmFjaz4oJ3F0aS1yZWdpc3Rlci1mZWVkYmFjaycsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogdGhpc1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGNoZWNrU2hvd0ZlZWRiYWNrKG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmcpIHsgICAgXG4gICAgY29uc3Qgb3V0Y29tZVZhcmlhYmxlID0gdGhpcy5fY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gb3V0Y29tZUlkZW50aWZpZXIpIHx8IG51bGw7O1xuXG4gICAgaWYgKHRoaXMub3V0Y29tZUlkZW50aWZpZXIgIT09IG91dGNvbWVJZGVudGlmaWVyIHx8ICFvdXRjb21lVmFyaWFibGUpIHJldHVybjtcbiAgICBsZXQgaXNGb3VuZCA9IGZhbHNlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KG91dGNvbWVWYXJpYWJsZS52YWx1ZSkpIHtcbiAgICAgIGlzRm91bmQgPSBvdXRjb21lVmFyaWFibGUudmFsdWUuaW5jbHVkZXModGhpcy5pZGVudGlmaWVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXNGb3VuZCA9XG4gICAgICAgICghSXNOdWxsT3JVbmRlZmluZWQodGhpcy5pZGVudGlmaWVyKSAmJlxuICAgICAgICAgICFJc051bGxPclVuZGVmaW5lZChvdXRjb21lVmFyaWFibGU/LnZhbHVlKSAmJlxuICAgICAgICAgIHRoaXMuaWRlbnRpZmllciA9PT0gb3V0Y29tZVZhcmlhYmxlLnZhbHVlKSB8fFxuICAgICAgICBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnNob3dGZWVkYmFjayhpc0ZvdW5kKTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd0ZlZWRiYWNrKHZhbHVlOiBib29sZWFuKSB7ICAgIFxuICAgIHRoaXMuc2hvd1N0YXR1cyA9ICh2YWx1ZSAmJiB0aGlzLnNob3dIaWRlID09PSAnc2hvdycpIHx8ICghdmFsdWUgJiYgdGhpcy5zaG93SGlkZSA9PT0gJ2hpZGUnKSA/ICdvbicgOiAnb2ZmJzsgICAgXG4gIH1cbn1cbiIsICJleHBvcnQgY29uc3QgZGVjaW1hbFNlcGFyYXRvciA9ICgpID0+IHtcbiAgcmV0dXJuIG5ldyBJbnRsLk51bWJlckZvcm1hdCgpLmZvcm1hdCgwLjEpLnJlcGxhY2UoL1xcZC9nLCAnJyk7XG59O1xuXG5leHBvcnQgY29uc3QgY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQgPSAobnVtYmVyOiBudW1iZXIgfCBzdHJpbmcpID0+IHtcbiAgLy8gY2hlY2sgaWYgdHlwZSBpcyBzdHJpbmdcbiAgaWYgKHR5cGVvZiBudW1iZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG51bWJlcjtcbiAgfVxuICBjb25zdCBkU2VwID0gZGVjaW1hbFNlcGFyYXRvcigpO1xuICBpZiAoZFNlcCA9PT0gJy4nKSB7XG4gICAgcmV0dXJuIG51bWJlci50b0xvY2FsZVN0cmluZygpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudW1iZXIudG9TdHJpbmcoKS5yZXBsYWNlKCcuJywgJycpLnJlcGxhY2UoZFNlcCwgJy4nKTtcbiAgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIElzTnVsbE9yVW5kZWZpbmVkKHZhbHVlOiB1bmtub3duKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRG91YmxlU2xhc2hlcyhzdHI6IHN0cmluZykge1xuICBjb25zdCBzaW5nbGVGb3J3YXJkU2xhc2hlcyA9IHN0clxuICAgIC5yZXBsYWNlKC8oW146XVxcLylcXC8rL2csICckMScpXG4gICAgLnJlcGxhY2UoL1xcL1xcLy9nLCAnLycpXG4gICAgLnJlcGxhY2UoJ2h0dHA6LycsICdodHRwOi8vJylcbiAgICAucmVwbGFjZSgnaHR0cHM6LycsICdodHRwczovLycpO1xuICByZXR1cm4gc2luZ2xlRm9yd2FyZFNsYXNoZXM7XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBRdGlGZWVkYmFjayB9IGZyb20gJy4uL3F0aS1mZWVkYmFjayc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZmVlZGJhY2staW5saW5lJylcbmV4cG9ydCBjbGFzcyBRdGlGZWVkYmFja0lubGluZSBleHRlbmRzIFF0aUZlZWRiYWNrIHtcbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IGNzc2BcbiAgICAub24ge1xuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIH1cbiAgICAub2ZmIHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlciA9ICgpID0+IGh0bWxgIDxzbG90IHBhcnQ9XCJmZWVkYmFja1wiIGNsYXNzPVwiJHt0aGlzLnNob3dTdGF0dXN9XCI+PC9zbG90PiBgO1xufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZmVlZGJhY2staW5saW5lJzogUXRpRmVlZGJhY2tJbmxpbmU7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFF0aUZlZWRiYWNrIH0gZnJvbSAnLi4vcXRpLWZlZWRiYWNrJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1tb2RhbC1mZWVkYmFjaycpXG5leHBvcnQgY2xhc3MgUXRpTW9kYWxGZWVkYmFjayBleHRlbmRzIFF0aUZlZWRiYWNrIHtcbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IGNzc2BcbiAgICAub24ge1xuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIH1cbiAgICAub2ZmIHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlciA9ICgpID0+IGh0bWxgIDxzbG90IHBhcnQ9XCJmZWVkYmFja1wiIGNsYXNzPVwiJHt0aGlzLnNob3dTdGF0dXN9XCI+PC9zbG90PiBgO1xufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktbW9kYWwtZmVlZGJhY2snOiBRdGlNb2RhbEZlZWRiYWNrO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGlmRGVmaW5lZCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL2lmLWRlZmluZWQuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4uLy4uLy4uL2RlY29yYXRvcnMvd2F0Y2gnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWV4dGVuZGVkLXRleHQtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUV4dGVuZGVkVGV4dEludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBAc3RhdGUoKVxuICBwcml2YXRlIF9yb3dzID0gNTtcblxuICAvKiogZXhwZWN0ZWQgbGVuZ3RoIGlzIG1hcHBlZCB0byB0aGUgcHJvcGVydHkgbWF4bGVuZ3RoIG9uIHRoZSB0ZXh0YXJlYSAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ2V4cGVjdGVkLWxlbmd0aCcgfSkgZXhwZWN0ZWRMZW5ndGg6IG51bWJlcjtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3BhdHRlcm4tbWFzaycgfSkgcGF0dGVybk1hc2s6IHN0cmluZztcblxuICAvKiogdGV4dCBhcHBlYXJpbmcgaW4gdGhlIGV4dGVuZGVkLXRleHQtbnRlcmFjdGlvbiBpZiBpdCBpcyBlbXB0eSAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3BsYWNlaG9sZGVyLXRleHQnIH0pIHBsYWNlaG9sZGVyVGV4dDogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnZGF0YS1wYXR0ZXJubWFzay1tZXNzYWdlJyB9KSBkYXRhUGF0dGVybm1hc2tNZXNzYWdlOiBzdHJpbmc7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfdmFsdWUgPSAnJztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2NsYXNzJyB9KSBjbGFzc05hbWVzO1xuICBAd2F0Y2goJ2NsYXNzTmFtZXMnKVxuICBoYW5kbGVjbGFzc05hbWVzQ2hhbmdlKG9sZCwgY2xhc3Nlczogc3RyaW5nKSB7XG4gICAgY29uc3QgY2xhc3NOYW1lcyA9IGNsYXNzZXMuc3BsaXQoJyAnKTtcbiAgICBsZXQgcm93c1NldCA9IGZhbHNlO1xuICAgIGNsYXNzTmFtZXMuZm9yRWFjaCgoY2xhc3NOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmIChjbGFzc05hbWUuc3RhcnRzV2l0aCgncXRpLWhlaWdodC1saW5lcy0nKSkge1xuICAgICAgICBjb25zdCBuclJvd3MgPSBjbGFzc05hbWUucmVwbGFjZSgncXRpLWhlaWdodC1saW5lcy0nLCAnJyk7XG4gICAgICAgIHRoaXMuX3Jvd3MgPSBwYXJzZUludChuclJvd3MpO1xuICAgICAgICByb3dzU2V0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBJZiBubyBxdGktaGVpZ2h0LWxpbmVzIGNsYXNzIGlzIHNldCwgY2FsY3VsYXRlIHJvd3MgYmFzZWQgb24gZXhwZWN0ZWRMZW5ndGhcbiAgICBpZiAoIXJvd3NTZXQgJiYgdGhpcy5leHBlY3RlZExlbmd0aCkge1xuICAgICAgY29uc3QgZXN0aW1hdGVkUm93cyA9IE1hdGguY2VpbCh0aGlzLmV4cGVjdGVkTGVuZ3RoIC8gNTApOyAvLyAgJzUwJyBiYXNlZCBvbiBhbiBlc3RpbWF0ZSBmb3IgY2hhcmFjdGVycyBwZXIgcm93XG4gICAgICB0aGlzLl9yb3dzID0gZXN0aW1hdGVkUm93cztcbiAgICB9XG4gIH1cblxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICBzZXQgdmFsdWUodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5fdmFsdWUgPSB2YWw7XG4gICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgZm9ybURhdGEuYXBwZW5kKHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLCB2YWwpO1xuICAgICAgdGhpcy5faW50ZXJuYWxzLnNldEZvcm1WYWx1ZShmb3JtRGF0YSk7XG4gICAgICB0aGlzLnZhbGlkYXRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSB2YWxpZGF0ZSgpIHtcbiAgICBjb25zdCB0ZXh0YXJlYSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpO1xuICAgIGlmICghdGV4dGFyZWEpIHJldHVybiBmYWxzZTtcblxuICAgIGlmICh0aGlzLnBhdHRlcm5NYXNrICYmIHRoaXMuZGF0YVBhdHRlcm5tYXNrTWVzc2FnZSkge1xuICAgICAgLy8gQ2xlYXIgYW55IGN1c3RvbSBlcnJvciBpbml0aWFsbHlcbiAgICAgIHRoaXMuX2ludGVybmFscy5zZXRWYWxpZGl0eSh7fSk7XG4gICAgICB0ZXh0YXJlYS5zZXRDdXN0b21WYWxpZGl0eSgnJyk7XG4gICAgICBjb25zdCBwYXR0ZXJuU291cmNlID1cbiAgICAgICAgdGhpcy5wYXR0ZXJuTWFzay5zdGFydHNXaXRoKCdeJykgJiYgdGhpcy5wYXR0ZXJuTWFzay5lbmRzV2l0aCgnJCcpID8gdGhpcy5wYXR0ZXJuTWFzayA6IGBeJHt0aGlzLnBhdHRlcm5NYXNrfSRgO1xuXG4gICAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cChwYXR0ZXJuU291cmNlKTtcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSB0ZXh0YXJlYS5jaGVja1ZhbGlkaXR5KCkgJiYgcGF0dGVybi50ZXN0KHRleHRhcmVhLnZhbHVlKTtcblxuICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgIC8vIFNldCBjdXN0b20gZXJyb3IgaWYgaW52YWxpZFxuICAgICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0VmFsaWRpdHkoeyBjdXN0b21FcnJvcjogdHJ1ZSB9LCB0aGlzLmRhdGFQYXR0ZXJubWFza01lc3NhZ2UpO1xuICAgICAgICB0ZXh0YXJlYS5zZXRDdXN0b21WYWxpZGl0eSh0aGlzLmRhdGFQYXR0ZXJubWFza01lc3NhZ2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpc1ZhbGlkID0gdGV4dGFyZWEuY2hlY2tWYWxpZGl0eSgpO1xuICAgICAgdGhpcy5faW50ZXJuYWxzLnNldFZhbGlkaXR5KGlzVmFsaWQgPyB7fSA6IHsgY3VzdG9tRXJyb3I6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl92YWx1ZSAhPT0gJycgJiYgdGV4dGFyZWEuY2hlY2tWYWxpZGl0eSgpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVwb3J0VmFsaWRpdHkoKSB7XG4gICAgY29uc3QgdGV4dGFyZWEgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigndGV4dGFyZWEnKTtcbiAgICBpZiAoIXRleHRhcmVhKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBSdW4gdGhlIHZhbGlkYXRlIGZ1bmN0aW9uIHRvIGVuc3VyZSB0aGUgY3VzdG9tIHZhbGlkaXR5IHN0YXRlIGlzIHVwIHRvIGRhdGVcbiAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy52YWxpZGF0ZSgpO1xuICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgdGV4dGFyZWEucmVwb3J0VmFsaWRpdHkoKTtcbiAgICB9XG4gICAgcmV0dXJuIGlzVmFsaWQ7XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgZ2V0IHN0eWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY3NzYFxuICAgICAgICAvKiBQSzogZGlzcGxheSBob3N0IGFzIGJsb2NrLCBlbHNlIGRlc2lnbiB3aWxsIGJlIGNvbGxhcHNlZCAqL1xuICAgICAgICA6aG9zdCB7XG4gICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIH1cbiAgICAgICAgdGV4dGFyZWEge1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAgIGJvcmRlcjogMDtcbiAgICAgICAgfVxuICAgICAgYFxuICAgIF07XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdFxuICAgICAgPjx0ZXh0YXJlYVxuICAgICAgICBwYXJ0PVwidGV4dGFyZWFcIlxuICAgICAgICBuYW1lPVwiJHt0aGlzLnJlc3BvbnNlSWRlbnRpZmllcn1cIlxuICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICBtYXhsZW5ndGg9XCIkezUwMDB9XCJcbiAgICAgICAgQGtleWRvd249XCIke2V2ZW50ID0+IGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfVwiXG4gICAgICAgIEBrZXl1cD1cIiR7dGhpcy50ZXh0Q2hhbmdlZH1cIlxuICAgICAgICBAY2hhbmdlPVwiJHt0aGlzLnRleHRDaGFuZ2VkfVwiXG4gICAgICAgIEBibHVyPVwiJHsoZXZlbnQ6IEZvY3VzRXZlbnQpID0+IHtcbiAgICAgICAgICB0aGlzLnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgICAgIH19XCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCIke2lmRGVmaW5lZCh0aGlzLnBsYWNlaG9sZGVyVGV4dCA/IHRoaXMucGxhY2Vob2xkZXJUZXh0IDogdW5kZWZpbmVkKX1cIlxuICAgICAgICByb3dzPVwiJHt0aGlzLl9yb3dzfVwiXG4gICAgICAgID9kaXNhYmxlZD1cIiR7dGhpcy5kaXNhYmxlZH1cIlxuICAgICAgICA/cmVhZG9ubHk9XCIke3RoaXMucmVhZG9ubHl9XCJcbiAgICAgICAgLnZhbHVlPSR7dGhpcy5fdmFsdWV9XG4gICAgICA+PC90ZXh0YXJlYT5gO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRleHRDaGFuZ2VkKGV2ZW50OiBFdmVudCkge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHJldHVybjtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIHRoaXMuc2V0RW1wdHlBdHRyaWJ1dGUoaW5wdXQudmFsdWUpO1xuICAgIGlmICh0aGlzLl92YWx1ZSAhPT0gaW5wdXQudmFsdWUpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBpbnB1dC52YWx1ZTtcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLnZhbGlkYXRlKCk7XG4gICAgICB0aGlzLnNhdmVSZXNwb25zZShpbnB1dC52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRFbXB0eUF0dHJpYnV0ZSh0ZXh0OiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnZW1wdHknLCB0ZXh0ID09PSAnJyA/ICd0cnVlJyA6ICdmYWxzZScpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uJzogUXRpRXh0ZW5kZWRUZXh0SW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IElJbnRlcmFjdGlvbiB9IGZyb20gJy4vaW50ZXJhY3Rpb24uaW50ZXJmYWNlJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEludGVyYWN0aW9uIGV4dGVuZHMgTGl0RWxlbWVudCBpbXBsZW1lbnRzIElJbnRlcmFjdGlvbiB7XG4gIHN0YXRpYyBmb3JtQXNzb2NpYXRlZCA9IHRydWU7IC8vIEVuYWJsZSBmb3JtIGFzc29jaWF0aW9uXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAncmVzcG9uc2UtaWRlbnRpZmllcicgfSkgcmVzcG9uc2VJZGVudGlmaWVyID0gJyc7XG4gIC8qKiBkaXNhYmxlZCBzaG91bGQgYmUgZXhwb3NlZCB0byB0aGUgYXR0cmlidXRlcyBhbmQgYWNjZXNzaWJsZSBhcyBwcm9wZXJ0eSAqL1xuICBAcHJvcGVydHkoeyByZWZsZWN0OiB0cnVlLCB0eXBlOiBCb29sZWFuIH0pIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgLyoqIHJlYWRvbmx5IHNob3VsZCBiZSBleHBvc2VkIHRvIHRoZSBhdHRyaWJ1dGVzIGFuZCBhY2Nlc3NpYmxlIGFzIHByb3BlcnR5ICovXG4gIEBwcm9wZXJ0eSh7IHJlZmxlY3Q6IHRydWUsIHR5cGU6IEJvb2xlYW4gfSkgcmVhZG9ubHkgPSBmYWxzZTtcblxuICBAc3RhdGUoKVxuICBwcm90ZWN0ZWQgX2NvcnJlY3RSZXNwb25zZTogc3RyaW5nIHwgc3RyaW5nW10gPSAnJztcbiAgcHJvdGVjdGVkIF9pbnRlcm5hbHM6IEVsZW1lbnRJbnRlcm5hbHM7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9pbnRlcm5hbHMgPSB0aGlzLmF0dGFjaEludGVybmFscygpO1xuICB9XG5cbiAgYWJzdHJhY3QgdmFsaWRhdGUoKTogYm9vbGVhbjtcblxuICBwdWJsaWMgcmVwb3J0VmFsaWRpdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ludGVybmFscy5yZXBvcnRWYWxpZGl0eSgpO1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSAnJztcbiAgfVxuXG4gIGFic3RyYWN0IGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgYWJzdHJhY3Qgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pO1xuXG4gIHB1YmxpYyBnZXQgY29ycmVjdFJlc3BvbnNlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fY29ycmVjdFJlc3BvbnNlO1xuICB9XG4gIHNldCBjb3JyZWN0UmVzcG9uc2UodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fY29ycmVjdFJlc3BvbnNlID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLXJlZ2lzdGVyLWludGVyYWN0aW9uJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgY2FuY2VsYWJsZTogZmFsc2VcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlUmVzcG9uc2UodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktaW50ZXJhY3Rpb24tcmVzcG9uc2UnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgcmVzcG9uc2VJZGVudGlmaWVyOiB0aGlzLnJlc3BvbnNlSWRlbnRpZmllcixcbiAgICAgICAgICByZXNwb25zZTogQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbLi4udmFsdWVdIDogdmFsdWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgQ1NTUmVzdWx0R3JvdXAsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgaWZEZWZpbmVkIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvaWYtZGVmaW5lZC5qcyc7XG5pbXBvcnQgeyBjcmVhdGVSZWYgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9yZWYuanMnO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi8uLi9kZWNvcmF0b3JzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uLnN0eWxlcyc7XG5AY3VzdG9tRWxlbWVudCgncXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aVRleHRFbnRyeUludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBzdGF0aWMgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlcztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ2V4cGVjdGVkLWxlbmd0aCcgfSkgZXhwZWN0ZWRMZW5ndGg6IG51bWJlcjtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3BhdHRlcm4tbWFzaycgfSkgcGF0dGVybk1hc2s6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3BsYWNlaG9sZGVyLXRleHQnIH0pIHBsYWNlaG9sZGVyVGV4dDogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnZGF0YS1wYXR0ZXJubWFzay1tZXNzYWdlJyB9KSBkYXRhUGF0dGVybm1hc2tNZXNzYWdlOiBzdHJpbmc7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfdmFsdWUgPSAnJztcblxuICBpbnB1dFJlZiA9IGNyZWF0ZVJlZjxIVE1MSW5wdXRFbGVtZW50PigpO1xuXG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHZhbDtcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICBmb3JtRGF0YS5hcHBlbmQodGhpcy5yZXNwb25zZUlkZW50aWZpZXIsIHZhbCk7XG4gICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0Rm9ybVZhbHVlKGZvcm1EYXRhKTtcbiAgICAgIHRoaXMudmFsaWRhdGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIHZhbGlkYXRlKCkge1xuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XG4gICAgaWYgKCFpbnB1dCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLnBhdHRlcm5NYXNrICYmIHRoaXMuZGF0YVBhdHRlcm5tYXNrTWVzc2FnZSkge1xuICAgICAgLy8gQ2xlYXIgYW55IGN1c3RvbSBlcnJvciBpZiB0aGUgaW5wdXQgaXMgdmFsaWRcbiAgICAgIHRoaXMuX2ludGVybmFscy5zZXRWYWxpZGl0eSh7fSk7XG4gICAgICBpbnB1dC5zZXRDdXN0b21WYWxpZGl0eSgnJyk7IC8vIENsZWFyIHRoZSBjdXN0b20gbWVzc2FnZVxuICAgICAgY29uc3QgaXNWYWxpZCA9IGlucHV0LmNoZWNrVmFsaWRpdHkoKTtcbiAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICAvLyBTZXQgY3VzdG9tIGVycm9yIGlmIGludmFsaWRcbiAgICAgICAgdGhpcy5faW50ZXJuYWxzLnNldFZhbGlkaXR5KHsgY3VzdG9tRXJyb3I6IHRydWUgfSwgdGhpcy5kYXRhUGF0dGVybm1hc2tNZXNzYWdlKTtcbiAgICAgICAgaW5wdXQuc2V0Q3VzdG9tVmFsaWRpdHkodGhpcy5kYXRhUGF0dGVybm1hc2tNZXNzYWdlKTsgLy8gU2V0IGN1c3RvbSBtZXNzYWdlIG9ubHkgaWYgaW52YWxpZFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpc1ZhbGlkID0gaW5wdXQuY2hlY2tWYWxpZGl0eSgpO1xuICAgICAgdGhpcy5faW50ZXJuYWxzLnNldFZhbGlkaXR5KGlzVmFsaWQgPyB7fSA6IHsgY3VzdG9tRXJyb3I6IGZhbHNlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdmFsdWUgIT09ICcnICYmIGlucHV0LmNoZWNrVmFsaWRpdHkoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxpbnB1dFxuICAgICAgICBwYXJ0PVwiaW5wdXRcIlxuICAgICAgICBuYW1lPVwiJHt0aGlzLnJlc3BvbnNlSWRlbnRpZmllcn1cIlxuICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICBAYmx1cj1cIiR7KGV2ZW50OiBGb2N1c0V2ZW50KSA9PiB7XG4gICAgICAgICAgdGhpcy5yZXBvcnRWYWxpZGl0eSgpO1xuICAgICAgICB9fVwiXG4gICAgICAgIEBrZXlkb3duPVwiJHtldmVudCA9PiBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1cIlxuICAgICAgICBAa2V5dXA9XCIke3RoaXMudGV4dENoYW5nZWR9XCJcbiAgICAgICAgQGNoYW5nZT1cIiR7dGhpcy50ZXh0Q2hhbmdlZH1cIlxuICAgICAgICB0eXBlPVwiJHt0aGlzLnBhdHRlcm5NYXNrID09ICdbMC05XSonID8gJ251bWJlcicgOiAndGV4dCd9XCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCIke2lmRGVmaW5lZCh0aGlzLnBsYWNlaG9sZGVyVGV4dCA/IHRoaXMucGxhY2Vob2xkZXJUZXh0IDogdW5kZWZpbmVkKX1cIlxuICAgICAgICAudmFsdWU9XCIke3RoaXMuX3ZhbHVlfVwiXG4gICAgICAgIHBhdHRlcm49XCIke2lmRGVmaW5lZCh0aGlzLnBhdHRlcm5NYXNrID8gdGhpcy5wYXR0ZXJuTWFzayA6IHVuZGVmaW5lZCl9XCJcbiAgICAgICAgbWF4bGVuZ3RoPSR7MTAwMH1cbiAgICAgICAgP2Rpc2FibGVkPVwiJHt0aGlzLmRpc2FibGVkfVwiXG4gICAgICAgID9yZWFkb25seT1cIiR7dGhpcy5yZWFkb25seX1cIlxuICAgICAgLz5cbiAgICAgIDxkaXYgcGFydD1cImNvcnJlY3RcIj4ke3RoaXMuX2NvcnJlY3RSZXNwb25zZX08L2Rpdj5cbiAgICBgO1xuICB9XG4gIHByb3RlY3RlZCB0ZXh0Q2hhbmdlZChldmVudDogRXZlbnQpIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSByZXR1cm47XG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICB0aGlzLnNldEVtcHR5QXR0cmlidXRlKGlucHV0LnZhbHVlKTtcbiAgICBpZiAodGhpcy5fdmFsdWUgIT09IGlucHV0LnZhbHVlKSB7XG4gICAgICB0aGlzLnZhbHVlID0gaW5wdXQudmFsdWU7XG4gICAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy52YWxpZGF0ZSgpO1xuICAgICAgdGhpcy5zYXZlUmVzcG9uc2UoaW5wdXQudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIHJlcG9ydFZhbGlkaXR5KCkge1xuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XG4gICAgaWYgKCFpbnB1dCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gUnVuIHRoZSB2YWxpZGF0ZSBmdW5jdGlvbiB0byBlbnN1cmUgdGhlIGN1c3RvbSB2YWxpZGl0eSBzdGF0ZSBpcyB1cCB0byBkYXRlXG4gICAgY29uc3QgaXNWYWxpZCA9IHRoaXMudmFsaWRhdGUoKTtcbiAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgIGlucHV0LnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgfVxuICAgIHJldHVybiBpc1ZhbGlkO1xuICB9XG5cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5fdmFsdWUgPSAnJztcbiAgfVxuXG4gIHByaXZhdGUgc2V0RW1wdHlBdHRyaWJ1dGUodGV4dDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2VtcHR5JywgdGV4dCA9PT0gJycgPyAndHJ1ZScgOiAnZmFsc2UnKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbic6IFF0aVRleHRFbnRyeUludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzIH0gZnJvbSAnbGl0JztcblxuZXhwb3J0IGRlZmF1bHQgY3NzYFxuICA6aG9zdCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB9XG4gIFtwYXJ0PSdjb3JyZWN0J10ge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTEpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMS4xcmVtO1xuICAgIG1pbi13aWR0aDogMS4xcmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0yKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDIuM3JlbTtcbiAgICBtaW4td2lkdGg6IDIuM3JlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMykgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAzLjNyZW07XG4gICAgbWluLXdpZHRoOiAzLjNyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTQpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogNC4ycmVtO1xuICAgIG1pbi13aWR0aDogNC4ycmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC02KSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDYuNnJlbTtcbiAgICBtaW4td2lkdGg6IDYuNnJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMTApIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogOHJlbTtcbiAgICBtaW4td2lkdGg6IDhyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTE1KSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDEycmVtO1xuICAgIG1pbi13aWR0aDogMTJyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTIwKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDE3cmVtO1xuICAgIG1pbi13aWR0aDogMTdyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTI1KSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDIwcmVtO1xuICAgIG1pbi13aWR0aDogMjByZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTMwKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDI0cmVtO1xuICAgIG1pbi13aWR0aDogMjRyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTM1KSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDI4cmVtO1xuICAgIG1pbi13aWR0aDogMjhyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTQwKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDMycmVtO1xuICAgIG1pbi13aWR0aDogMzJyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTQ1KSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDM2cmVtO1xuICAgIG1pbi13aWR0aDogMzZyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTUwKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDQwcmVtO1xuICAgIG1pbi13aWR0aDogNDByZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTcyKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDU3cmVtO1xuICAgIG1pbi13aWR0aDogNTdyZW07XG4gIH1cbmA7XG4iLCAiaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQ2hvaWNlc01peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvY2hvaWNlcy9jaG9pY2VzLm1peGluJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWhvdHRleHQtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUhvdHRleHRJbnRlcmFjdGlvbiBleHRlbmRzIENob2ljZXNNaXhpbihJbnRlcmFjdGlvbiwgJ3F0aS1ob3R0ZXh0Jykge1xuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdxdGktaG90dGV4dC1pbnRlcmFjdGlvbicsICcnKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlciA9ICgpID0+IGh0bWxgPHNsb3Q+PC9zbG90PmA7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ob3R0ZXh0LWludGVyYWN0aW9uJzogUXRpSG90dGV4dEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgcHJvcGVydHksIHF1ZXJ5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi8uLi8uLi9kZWNvcmF0b3JzL3dhdGNoJztcblxuaW1wb3J0IHsgQ2hvaWNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vYWN0aXZlLWVsZW1lbnQvYWN0aXZlLWVsZW1lbnQubWl4aW4nO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5pbXBvcnQgeyBJSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbi5pbnRlcmZhY2UnO1xuXG50eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5leHBvcnQgdHlwZSBDaG9pY2UgPSBIVE1MRWxlbWVudCAmIENob2ljZUludGVyZmFjZSAmIHsgaW50ZXJuYWxzOiBFbGVtZW50SW50ZXJuYWxzIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hvaWNlc0ludGVyZmFjZSBleHRlbmRzIElJbnRlcmFjdGlvbiB7XG4gIGNvcnJlY3RSZXNwb25zZTogc3RyaW5nIHwgc3RyaW5nW107XG59XG5cbmV4cG9ydCBjb25zdCBDaG9pY2VzTWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPEludGVyYWN0aW9uPj4oc3VwZXJDbGFzczogVCwgc2VsZWN0b3I6IHN0cmluZykgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBDaG9pY2VzTWl4aW5FbGVtZW50IGV4dGVuZHMgc3VwZXJDbGFzcyBpbXBsZW1lbnRzIENob2ljZXNJbnRlcmZhY2Uge1xuICAgIHByb3RlY3RlZCBfY2hvaWNlRWxlbWVudHM6IENob2ljZVtdID0gW107XG5cbiAgICBAcXVlcnkoJyN2YWxpZGF0aW9uTWVzc2FnZScpXG4gICAgcHJpdmF0ZSBfdmFsaWRhdGlvbk1lc3NhZ2VFbGVtZW50ITogSFRNTEVsZW1lbnQ7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ21pbi1jaG9pY2VzJyB9KVxuICAgIHB1YmxpYyBtaW5DaG9pY2VzID0gMDtcblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgYXR0cmlidXRlOiAnbWF4LWNob2ljZXMnIH0pXG4gICAgcHVibGljIG1heENob2ljZXMgPSAxO1xuXG4gICAgQHdhdGNoKCdtYXhDaG9pY2VzJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBfaGFuZGxlTWF4Q2hvaWNlc0NoYW5nZShfb2xkVmFsdWU6IG51bWJlciwgX25ld1ZhbHVlOiBudW1iZXIpIHtcbiAgICAgIHRoaXMuX2RldGVybWluZUlucHV0VHlwZSgpO1xuICAgIH1cblxuICAgIEB3YXRjaCgnZGlzYWJsZWQnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIF9oYW5kbGVEaXNhYmxlZENoYW5nZSA9IChfOiBib29sZWFuLCBkaXNhYmxlZDogYm9vbGVhbikgPT4ge1xuICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMuZm9yRWFjaChjaCA9PiAoY2guZGlzYWJsZWQgPSBkaXNhYmxlZCkpO1xuICAgIH07XG5cbiAgICBAd2F0Y2goJ3JlYWRvbmx5JywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBfaGFuZGxlUmVhZG9ubHlDaGFuZ2UgPSAoXzogYm9vbGVhbiwgcmVhZG9ubHk6IGJvb2xlYW4pID0+IHtcbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2hvaWNlID0+IChjaG9pY2UucmVhZG9ubHkgPSByZWFkb25seSkpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIF92YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gPSAnJztcblxuICAgIGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0aGlzLl92YWx1ZSkgPyB0aGlzLl92YWx1ZS5qb2luKCcsJykgOiB0aGlzLl92YWx1ZTtcbiAgICB9XG5cbiAgICBzZXQgdmFsdWUodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgICAgaWYgKHRoaXMubWF4Q2hvaWNlcyA+IDEgJiYgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWwuc3BsaXQoJywnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsO1xuICAgICAgfVxuICAgICAgLy8gQXNzdW1pbmcgdGhpcy52YWx1ZSBpcyBhbiBhcnJheSBvZiBzdHJpbmdzXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl92YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgdGhpcy5fdmFsdWUuZm9yRWFjaChyZXNwb25zZSA9PiB7XG4gICAgICAgICAgZm9ybURhdGEuYXBwZW5kKHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLCByZXNwb25zZSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0Rm9ybVZhbHVlKGZvcm1EYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGlzLnZhbHVlIGlzIG5vdCBhbiBhcnJheVxuICAgICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0Rm9ybVZhbHVlKHRoaXMuX3ZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3VwZGF0ZUNob2ljZVNlbGVjdGlvbigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY29ycmVjdFJlc3BvbnNlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICAgIHJldHVybiB0aGlzLl9jb3JyZWN0UmVzcG9uc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBjb3JyZWN0UmVzcG9uc2UodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgICB0aGlzLl9jb3JyZWN0UmVzcG9uc2UgPSB2YWx1ZTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlQXJyYXkgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2hvaWNlID0+IHtcbiAgICAgICAgY2hvaWNlLmludGVybmFscy5zdGF0ZXMuZGVsZXRlKCdjb3JyZWN0LXJlc3BvbnNlJyk7XG4gICAgICAgIGNob2ljZS5pbnRlcm5hbHMuc3RhdGVzLmRlbGV0ZSgnaW5jb3JyZWN0LXJlc3BvbnNlJyk7XG4gICAgICAgIGlmIChyZXNwb25zZUFycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBpZiAocmVzcG9uc2VBcnJheS5pbmNsdWRlcyhjaG9pY2UuaWRlbnRpZmllcikpIHtcbiAgICAgICAgICAgIGNob2ljZS5pbnRlcm5hbHMuc3RhdGVzLmFkZCgnY29ycmVjdC1yZXNwb25zZScpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjaG9pY2UuaW50ZXJuYWxzLnN0YXRlcy5hZGQoJ2luY29ycmVjdC1yZXNwb25zZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKGByZWdpc3Rlci0ke3NlbGVjdG9yfWAsIHRoaXMuX3JlZ2lzdGVyQ2hvaWNlRWxlbWVudCk7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoYHVucmVnaXN0ZXItJHtzZWxlY3Rvcn1gLCB0aGlzLl91bnJlZ2lzdGVyQ2hvaWNlRWxlbWVudCk7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoYGFjdGl2YXRlLSR7c2VsZWN0b3J9YCwgdGhpcy5fY2hvaWNlRWxlbWVudFNlbGVjdGVkSGFuZGxlcik7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGByZWdpc3Rlci0ke3NlbGVjdG9yfWAsIHRoaXMuX3JlZ2lzdGVyQ2hvaWNlRWxlbWVudCk7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYHVucmVnaXN0ZXItJHtzZWxlY3Rvcn1gLCB0aGlzLl91bnJlZ2lzdGVyQ2hvaWNlRWxlbWVudCk7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYGFjdGl2YXRlLSR7c2VsZWN0b3J9YCwgdGhpcy5fY2hvaWNlRWxlbWVudFNlbGVjdGVkSGFuZGxlcik7XG4gICAgfVxuXG4gICAgcHVibGljIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRDaG9pY2VzID0gdGhpcy5fY2hvaWNlRWxlbWVudHMuZmlsdGVyKGNob2ljZSA9PiB0aGlzLl9nZXRDaG9pY2VDaGVja2VkKGNob2ljZSkpO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRDb3VudCA9IHNlbGVjdGVkQ2hvaWNlcy5sZW5ndGg7XG4gICAgICBsZXQgaXNWYWxpZCA9IHRydWU7XG4gICAgICBsZXQgdmFsaWRpdHlNZXNzYWdlID0gJyc7XG4gICAgICBpZiAodGhpcy5tYXhDaG9pY2VzICE9PSAwICYmIHNlbGVjdGVkQ291bnQgPiB0aGlzLm1heENob2ljZXMpIHtcbiAgICAgICAgaXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICB2YWxpZGl0eU1lc3NhZ2UgPSB0aGlzLmRhdGFzZXQubWF4U2VsZWN0aW9uc01lc3NhZ2UgfHwgYFlvdSBjYW4gc2VsZWN0IGF0IG1vc3QgJHt0aGlzLm1heENob2ljZXN9IGNob2ljZXMuYDtcbiAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRDb3VudCA8IHRoaXMubWluQ2hvaWNlcykge1xuICAgICAgICBpc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgIHZhbGlkaXR5TWVzc2FnZSA9IHRoaXMuZGF0YXNldC5taW5TZWxlY3Rpb25zTWVzc2FnZSB8fCBgWW91IG11c3Qgc2VsZWN0IGF0IGxlYXN0ICR7dGhpcy5taW5DaG9pY2VzfSBjaG9pY2VzLmA7XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWxlY3RlZENob2ljZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0VmFsaWRpdHkoXG4gICAgICAgICAgaXNWYWxpZCA/IHt9IDogeyBjdXN0b21FcnJvcjogdHJ1ZSB9LFxuICAgICAgICAgIHZhbGlkaXR5TWVzc2FnZSxcbiAgICAgICAgICBzZWxlY3RlZENob2ljZXNbc2VsZWN0ZWRDb3VudCAtIDFdIHx8IHRoaXMuX2Nob2ljZUVsZW1lbnRzWzBdIHx8IHRoaXNcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVwb3J0VmFsaWRpdHkoKTtcbiAgICAgIHJldHVybiBpc1ZhbGlkO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIHJlcG9ydFZhbGlkaXR5KCkge1xuICAgICAgaWYgKHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlRWxlbWVudCkge1xuICAgICAgICBpZiAoIXRoaXMuX2ludGVybmFscy52YWxpZGl0eS52YWxpZCkge1xuICAgICAgICAgIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlRWxlbWVudC50ZXh0Q29udGVudCA9IHRoaXMuX2ludGVybmFscy52YWxpZGF0aW9uTWVzc2FnZTtcbiAgICAgICAgICB0aGlzLl92YWxpZGF0aW9uTWVzc2FnZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2VFbGVtZW50LnRleHRDb250ZW50ID0gJyc7XG4gICAgICAgICAgdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2VFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9pbnRlcm5hbHMudmFsaWRpdHkudmFsaWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVnaXN0ZXJDaG9pY2VFbGVtZW50KGV2ZW50OiBDdXN0b21FdmVudCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBjb25zdCBjaG9pY2VFbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIENob2ljZTtcbiAgICAgIGNob2ljZUVsZW1lbnQuZGlzYWJsZWQgPSB0aGlzLmRpc2FibGVkO1xuXG4gICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5wdXNoKGNob2ljZUVsZW1lbnQpO1xuICAgICAgdGhpcy5fc2V0SW5wdXRUeXBlKGNob2ljZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3VucmVnaXN0ZXJDaG9pY2VFbGVtZW50KGV2ZW50OiBDdXN0b21FdmVudCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBjb25zdCBjaG9pY2VFbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIENob2ljZTtcbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzID0gdGhpcy5fY2hvaWNlRWxlbWVudHMuZmlsdGVyKGNob2ljZSA9PiBjaG9pY2UgIT09IGNob2ljZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2RldGVybWluZUlucHV0VHlwZSgpIHtcbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2hvaWNlID0+IHtcbiAgICAgICAgdGhpcy5fc2V0SW5wdXRUeXBlKGNob2ljZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXRJbnB1dFR5cGUoY2hvaWNlRWxlbWVudDogQ2hvaWNlKSB7XG4gICAgICB0aGlzLl9pbnRlcm5hbHMuYXJpYUxhYmVsID0gdGhpcy5tYXhDaG9pY2VzID09PSAxID8gJ3JhZGlvLWdyb3VwJyA6ICdjaGVja2JveC1ncm91cCc7XG5cbiAgICAgIGNob2ljZUVsZW1lbnQuaW50ZXJuYWxzLnJvbGUgPSB0aGlzLm1heENob2ljZXMgPT09IDEgPyAncmFkaW8nIDogJ2NoZWNrYm94JztcbiAgICAgIGNob2ljZUVsZW1lbnQuaW50ZXJuYWxzLnN0YXRlcy5hZGQoY2hvaWNlRWxlbWVudC5pbnRlcm5hbHMucm9sZSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9jaG9pY2VFbGVtZW50U2VsZWN0ZWRIYW5kbGVyKGV2ZW50OiBDdXN0b21FdmVudDx7IGlkZW50aWZpZXI6IHN0cmluZyB9Pikge1xuICAgICAgdGhpcy5fdG9nZ2xlQ2hvaWNlQ2hlY2tlZChldmVudC50YXJnZXQgYXMgQ2hvaWNlKTtcbiAgICAgIGlmICh0aGlzLm1heENob2ljZXMgPT09IDEpIHtcbiAgICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMuZm9yRWFjaChjaG9pY2UgPT4ge1xuICAgICAgICAgIGlmIChjaG9pY2UuaWRlbnRpZmllciAhPT0gZXZlbnQuZGV0YWlsLmlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldENob2ljZUNoZWNrZWQoY2hvaWNlLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2hhbmRsZUNob2ljZVNlbGVjdGlvbigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NldENob2ljZUNoZWNrZWQoY2hvaWNlOiBDaG9pY2UsIGNoZWNrZWQ6IGJvb2xlYW4pIHtcbiAgICAgIGlmIChjaG9pY2UuaW50ZXJuYWxzPy5zdGF0ZXMpIHtcbiAgICAgICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgICAgICBjaG9pY2UuaW50ZXJuYWxzLnN0YXRlcy5hZGQoJy0tY2hlY2tlZCcpO1xuICAgICAgICAgIGNob2ljZS5pbnRlcm5hbHMuYXJpYUNoZWNrZWQgPSAndHJ1ZSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hvaWNlLmludGVybmFscy5zdGF0ZXMuZGVsZXRlKCctLWNoZWNrZWQnKTtcbiAgICAgICAgICBjaG9pY2UuaW50ZXJuYWxzLmFyaWFDaGVja2VkID0gJ2ZhbHNlJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2dldENob2ljZUNoZWNrZWQoY2hvaWNlOiBDaG9pY2UpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBjaG9pY2UuaW50ZXJuYWxzLnN0YXRlcy5oYXMoJy0tY2hlY2tlZCcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3RvZ2dsZUNob2ljZUNoZWNrZWQoY2hvaWNlOiBDaG9pY2UpIHtcbiAgICAgIGNvbnN0IGNoZWNrZWQgPSB0aGlzLl9nZXRDaG9pY2VDaGVja2VkKGNob2ljZSk7XG4gICAgICB0aGlzLl9zZXRDaG9pY2VDaGVja2VkKGNob2ljZSwgIWNoZWNrZWQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2hhbmRsZUNob2ljZVNlbGVjdGlvbigpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkQ2hvaWNlcyA9IHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZpbHRlcihjaG9pY2UgPT4gdGhpcy5fZ2V0Q2hvaWNlQ2hlY2tlZChjaG9pY2UpKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkSWRlbnRpZmllcnMgPSBzZWxlY3RlZENob2ljZXMubWFwKGNob2ljZSA9PiBjaG9pY2UuaWRlbnRpZmllcik7XG5cbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLm1heENob2ljZXMgPT09IDEgPyBzZWxlY3RlZElkZW50aWZpZXJzWzBdIHx8ICcnIDogc2VsZWN0ZWRJZGVudGlmaWVycztcbiAgICAgIHRoaXMudmFsaWRhdGUoKTtcbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMuX3ZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBzZWxlY3Rpb24gc3RhdGUgb2YgZWFjaCBjaG9pY2UgZWxlbWVudCBiYXNlZCBvbiB0aGUgY3VycmVudCByZXNwb25zZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIF91cGRhdGVDaG9pY2VTZWxlY3Rpb24oKSB7XG4gICAgICBjb25zdCByZXNwb25zZUFycmF5ID0gQXJyYXkuaXNBcnJheSh0aGlzLl92YWx1ZSkgPyB0aGlzLl92YWx1ZSA6IFt0aGlzLl92YWx1ZV07XG4gICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5mb3JFYWNoKGNob2ljZSA9PiB7XG4gICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSByZXNwb25zZUFycmF5LmluY2x1ZGVzKGNob2ljZS5pZGVudGlmaWVyKTtcbiAgICAgICAgdGhpcy5fc2V0Q2hvaWNlQ2hlY2tlZChjaG9pY2UsIGlzU2VsZWN0ZWQpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBDaG9pY2VzTWl4aW5FbGVtZW50IGFzIENvbnN0cnVjdG9yPENob2ljZXNJbnRlcmZhY2U+ICYgVDtcbn07XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHVuc2FmZUhUTUwgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy91bnNhZmUtaHRtbC5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuaW50ZXJmYWNlIE9wdGlvblR5cGUge1xuICB0ZXh0Q29udGVudDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBzZWxlY3RlZDogYm9vbGVhbjtcbn1cblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlJbmxpbmVDaG9pY2VJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgc3RhdGljIG92ZXJyaWRlIGdldCBzdHlsZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNzc2BcbiAgICAgICAgOmhvc3Qge1xuICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgfVxuICAgICAgICBzbG90IHtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIH1cbiAgICAgICAgW3JvbGU9J21lbnUnXSB7XG4gICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgIHotaW5kZXg6IDEwMDA7XG4gICAgICAgIH1cbiAgICAgICAgLmFuY2hvciB7XG4gICAgICAgICAgLyogYW5jaG9yLW5hbWU6IC0taW5mb2JveDsgKi9cbiAgICAgICAgICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICAucG9zaXRpb25lZEVsZW1lbnQge1xuICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICAvKiBwb3NpdGlvbi1hbmNob3I6IC0taW5mb2JveDsgKi9cbiAgICAgICAgICAvKiB0b3A6IGFuY2hvcihib3R0b20pOyAqL1xuICAgICAgICB9XG4gICAgICBgXG4gICAgXTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaW5wdXRXaWR0aENsYXNzID0gW1xuICAgICcnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtMicsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC0xJyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTMnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtNCcsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC02JyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTEwJyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTE1JyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTIwJyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTcyJ1xuICBdO1xuXG4gIEBzdGF0ZSgpIG9wdGlvbnM6IE9wdGlvblR5cGVbXSA9IFtdO1xuXG4gIEBzdGF0ZSgpIGNvcnJlY3RPcHRpb246IHN0cmluZyA9ICcnO1xuXG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2RhdGEtcHJvbXB0JywgdHlwZTogU3RyaW5nIH0pXG4gIGRhdGFQcm9tcHQ6IHN0cmluZyA9ICdzZWxlY3QnO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzZWxlY3QgcGFydD1cInNlbGVjdFwiIEBjaGFuZ2U9XCIke3RoaXMuY2hvaWNlU2VsZWN0ZWR9XCIgP2Rpc2FibGVkPVwiJHt0aGlzLmRpc2FibGVkfVwiID9yZWFkb25seT1cIiR7dGhpcy5yZWFkb25seX1cIj5cbiAgICAgICAgJHt0aGlzLm9wdGlvbnMubWFwKFxuICAgICAgICAgIG9wdGlvbiA9PiBodG1sYFxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIiR7b3B0aW9uLnZhbHVlfVwiID9zZWxlY3RlZD1cIiR7b3B0aW9uLnNlbGVjdGVkfVwiPiR7dW5zYWZlSFRNTChvcHRpb24udGV4dENvbnRlbnQpfTwvb3B0aW9uPlxuICAgICAgICAgIGBcbiAgICAgICAgKX1cbiAgICAgIDwvc2VsZWN0PlxuXG4gICAgICAke3Vuc2FmZUhUTUwodGhpcy5jb3JyZWN0T3B0aW9uKX1cbiAgICBgO1xuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ29uLWRyb3Bkb3duLXNlbGVjdGVkJywgdGhpcy5jaG9pY2VTZWxlY3RlZCk7XG4gICAgY29uc3QgY2hvaWNlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktaW5saW5lLWNob2ljZScpKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBbXG4gICAgICB7XG4gICAgICAgIHRleHRDb250ZW50OiB0aGlzLmRhdGFQcm9tcHQsXG4gICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlXG4gICAgICB9LFxuICAgICAgLi4uY2hvaWNlcy5tYXAoY2hvaWNlID0+ICh7XG4gICAgICAgIHRleHRDb250ZW50OiBjaG9pY2UuaW5uZXJIVE1MLFxuICAgICAgICB2YWx1ZTogY2hvaWNlLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpLFxuICAgICAgICBzZWxlY3RlZDogZmFsc2VcbiAgICAgIH0pKVxuICAgIF07XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ29uLWRyb3Bkb3duLXNlbGVjdGVkJywgdGhpcy5jaG9pY2VTZWxlY3RlZCk7XG4gIH1cblxuICBwdWJsaWMgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2VsZWN0ZWRPcHRpb24gPSB0aGlzLm9wdGlvbnMuZmluZChvcHRpb24gPT4gb3B0aW9uLnNlbGVjdGVkKTtcbiAgICByZXR1cm4gc2VsZWN0ZWRPcHRpb24gPyBzZWxlY3RlZE9wdGlvbi52YWx1ZSAhPT0gJycgOiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnMubWFwKChvcHRpb24sIGkpID0+ICh7IC4uLm9wdGlvbiwgc2VsZWN0ZWQ6IGkgPT09IDAgfSkpO1xuICB9XG5cbiAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5vcHRpb25zLm1hcChvcHRpb24gPT4ge1xuICAgICAgaWYgKHZhbHVlID09PSBvcHRpb24udmFsdWUpIHtcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcHRpb247XG4gICAgfSk7XG4gIH1cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5maW5kKG9wdGlvbiA9PiBvcHRpb24uc2VsZWN0ZWQpLnZhbHVlO1xuICB9XG5cbiAgc2V0IGNvcnJlY3RSZXNwb25zZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAodmFsdWUgPT09ICcnKSB7XG4gICAgICB0aGlzLmNvcnJlY3RPcHRpb24gPSAnJztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jb3JyZWN0T3B0aW9uID0gYDxzcGFuIHBhcnQ9XCJjb3JyZWN0LW9wdGlvblwiPiR7XG4gICAgICB0aGlzLm9wdGlvbnMuZmluZChvcHRpb24gPT4gdmFsdWUgPT09IG9wdGlvbi52YWx1ZSkudGV4dENvbnRlbnRcbiAgICB9PC9zcGFuPmA7XG4gIH1cblxuICBwdWJsaWMgY2hvaWNlU2VsZWN0ZWQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRPcHRpb25WYWx1ZSA9IChldmVudC50YXJnZXQgYXMgSFRNTFNlbGVjdEVsZW1lbnQpLnZhbHVlO1xuICAgIHRoaXMub3B0aW9ucyA9IHRoaXMub3B0aW9ucy5tYXAob3B0aW9uID0+ICh7IC4uLm9wdGlvbiwgc2VsZWN0ZWQ6IG9wdGlvbi52YWx1ZSA9PT0gc2VsZWN0ZWRPcHRpb25WYWx1ZSB9KSk7XG4gICAgdGhpcy5zYXZlUmVzcG9uc2Uoc2VsZWN0ZWRPcHRpb25WYWx1ZSk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24nOiBRdGlJbmxpbmVDaG9pY2VJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQ1NTUmVzdWx0R3JvdXAgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IENob2ljZXNJbnRlcmZhY2UsIENob2ljZXNNaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL2Nob2ljZXMvY2hvaWNlcy5taXhpbic7XG5pbXBvcnQgeyBTaHVmZmxlTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9zaHVmZmxlL3NodWZmbGUtbWl4aW4nO1xuaW1wb3J0IHsgVm9jYWJ1bGFyeU1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvdm9jYWJ1bGFyeS92b2NhYnVsYXJ5LW1peGluJztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi9xdGktY2hvaWNlLWludGVyYWN0aW9uLnN0eWxlcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuZXhwb3J0IHR5cGUgT3JpZW50YXRpb24gPSAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnIHwgdW5kZWZpbmVkO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWNob2ljZS1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpQ2hvaWNlSW50ZXJhY3Rpb25cbiAgZXh0ZW5kcyBWb2NhYnVsYXJ5TWl4aW4oXG4gICAgU2h1ZmZsZU1peGluKENob2ljZXNNaXhpbihJbnRlcmFjdGlvbiwgJ3F0aS1zaW1wbGUtY2hvaWNlJyksICdxdGktc2ltcGxlLWNob2ljZScpLFxuICAgICdxdGktc2ltcGxlLWNob2ljZSdcbiAgKVxuICBpbXBsZW1lbnRzIENob2ljZXNJbnRlcmZhY2VcbntcbiAgc3RhdGljIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBzdHlsZXM7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9pbnRlcm5hbHMucm9sZSA9ICdncm91cCc7XG4gIH1cblxuICAvKiogb3JpZW50YXRpb24gb2YgY2hvaWNlcyAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgcHVibGljIG9yaWVudGF0aW9uOiBPcmllbnRhdGlvbjtcblxuICByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PjxzbG90IHBhcnQ9XCJzbG90XCI+PC9zbG90PlxuICAgICAgPGRpdiByb2xlPVwiYWxlcnRcIiBpZD1cInZhbGlkYXRpb25NZXNzYWdlXCI+PC9kaXY+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktY2hvaWNlLWludGVyYWN0aW9uJzogUXRpQ2hvaWNlSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICIvKipcbiAqIE1peGluIHRoYXQgcHJvdmlkZXMgc2h1ZmZsaW5nIGZ1bmN0aW9uYWxpdHkgZm9yIGEgTGl0RWxlbWVudC5cbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIExpdEVsZW1lbnQgc3ViY2xhc3MuXG4gKiBAcGFyYW0ge1R9IHN1cGVyQ2xhc3MgLSBUaGUgc3VwZXJjbGFzcyB0byBleHRlbmQuXG4gKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBUaGUgQ1NTIHNlbGVjdG9yIGZvciB0aGUgZWxlbWVudHMgdG8gc2h1ZmZsZS5cbiAqIEByZXR1cm5zIHtDb25zdHJ1Y3RvcjxTaHVmZmxlSW50ZXJmYWNlPiAmIFR9IC0gVGhlIGV4dGVuZGVkIGNsYXNzIHdpdGggc2h1ZmZsaW5nIGZ1bmN0aW9uYWxpdHkuXG4gKlxuICogYWRkcyBhIHNodWZmbGUgcHJvcGVydHkgdG8gdGhlIGNsYXNzIHdpdGggYW4gYXR0cmlidXRlIGNvbnZlcnRlclxuICpcbiAqIHF0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uXG4gKiBxdGktY2hvaWNlLWludGVyYWN0aW9uXG4gKiBxdGktbWF0Y2gtaW50ZXJhY3Rpb25cbiAqL1xuaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG50eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5kZWNsYXJlIGNsYXNzIFNodWZmbGVJbnRlcmZhY2Uge31cbmV4cG9ydCBjb25zdCBTaHVmZmxlTWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPEludGVyYWN0aW9uPj4oc3VwZXJDbGFzczogVCwgc2VsZWN0b3I6IHN0cmluZykgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBTaHVmZmxlRWxlbWVudCBleHRlbmRzIHN1cGVyQ2xhc3Mge1xuICAgIHByaXZhdGUgX3NodWZmbGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8vIERlZmluZSB0aGUgcHJvcGVydHkgd2l0aCB0aGUgY3VzdG9tIGNvbnZlcnRlclxuICAgIEBwcm9wZXJ0eSh7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICByZWZsZWN0OiB0cnVlLFxuICAgICAgY29udmVydGVyOiBzdHJpbmdUb0Jvb2xlYW5Db252ZXJ0ZXJcbiAgICB9KVxuICAgIHNldCBzaHVmZmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuX3NodWZmbGU7XG4gICAgICB0aGlzLl9zaHVmZmxlID0gdmFsdWU7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fc2h1ZmZsZUNob2ljZXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3Jlc2V0U2h1ZmZsZUNob2ljZXMoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgnc2h1ZmZsZScsIG9sZFZhbHVlKTtcbiAgICB9XG5cbiAgICBnZXQgc2h1ZmZsZSgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLl9zaHVmZmxlO1xuICAgIH1cblxuICAgIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgIC8vIENhbGwgX3Jlc2V0U2h1ZmZsZUNob2ljZXMgaW5pdGlhbGx5IHRvIHNldCB0aGUgQ1NTIG9yZGVyIHRvIGluaXRpYWwuXG4gICAgICAvLyBJZiBzaHVmZmxlIGlzIHRydWUsIF9zaHVmZmxlQ2hvaWNlcyB3aWxsIGJlIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHZpYSB0aGUgc2V0dGVyLlxuICAgICAgaWYgKHRoaXMuc2h1ZmZsZSkge1xuICAgICAgICB0aGlzLl9zaHVmZmxlQ2hvaWNlcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcmVzZXRTaHVmZmxlQ2hvaWNlcygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3NodWZmbGVDaG9pY2VzKCkge1xuICAgICAgY29uc3QgY2hvaWNlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihzZWxlY3RvcikpO1xuICAgICAgY29uc3QgZml4ZWRFbGVtZW50czogQXJyYXk8eyBlbGVtZW50OiBIVE1MRWxlbWVudDsgaW5kZXg6IG51bWJlciB9PiA9IFtdO1xuICAgICAgY29uc3Qgbm9uRml4ZWRFbGVtZW50czogQXJyYXk8SFRNTEVsZW1lbnQ+ID0gW107XG5cbiAgICAgIC8vIFNlcGFyYXRlIGZpeGVkIGFuZCBub24tZml4ZWQgZWxlbWVudHNcbiAgICAgIGNob2ljZXMuZm9yRWFjaCgoY2hvaWNlLCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAoY2hvaWNlLmhhc0F0dHJpYnV0ZSgnZml4ZWQnKSkge1xuICAgICAgICAgIGZpeGVkRWxlbWVudHMucHVzaCh7IGVsZW1lbnQ6IGNob2ljZSwgaW5kZXg6IGluZGV4IH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5vbkZpeGVkRWxlbWVudHMucHVzaChjaG9pY2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gSWYgdGhlcmUgYXJlIDEgb3IgZmV3ZXIgbm9uLWZpeGVkIGVsZW1lbnRzLCB0aHJvdyBhbiBlcnJvciAobm8gc2h1ZmZsZSBwb3NzaWJsZSlcbiAgICAgIGlmIChub25GaXhlZEVsZW1lbnRzLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignU2h1ZmZsaW5nIGlzIG5vdCBwb3NzaWJsZSB3aXRoIGZld2VyIHRoYW4gMiBub24tZml4ZWQgZWxlbWVudHMuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGlzU2h1ZmZsZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IG1heEF0dGVtcHRzID0gMTA7IC8vIE1heCBhdHRlbXB0cyB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzXG4gICAgICBsZXQgYXR0ZW1wdCA9IDA7XG5cbiAgICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIG9yZGVyIGZvciBjb21wYXJpc29uXG4gICAgICBjb25zdCBvcmlnaW5hbE9yZGVyID0gWy4uLm5vbkZpeGVkRWxlbWVudHNdO1xuXG4gICAgICAvLyBTaHVmZmxlIHVudGlsIHRoZSByZXN1bHQgaXMgZGlmZmVyZW50IG9yIG1heEF0dGVtcHRzIGlzIHJlYWNoZWRcbiAgICAgIHdoaWxlICghaXNTaHVmZmxlZCAmJiBhdHRlbXB0IDwgbWF4QXR0ZW1wdHMpIHtcbiAgICAgICAgYXR0ZW1wdCsrO1xuXG4gICAgICAgIC8vIFNodWZmbGUgbm9uLWZpeGVkIGVsZW1lbnRzXG4gICAgICAgIGZvciAobGV0IGkgPSBub25GaXhlZEVsZW1lbnRzLmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICBjb25zdCBqID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGkgKyAxKSk7XG4gICAgICAgICAgW25vbkZpeGVkRWxlbWVudHNbaV0sIG5vbkZpeGVkRWxlbWVudHNbal1dID0gW25vbkZpeGVkRWxlbWVudHNbal0sIG5vbkZpeGVkRWxlbWVudHNbaV1dO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHNodWZmbGVkIHJlc3VsdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwgb3JkZXJcbiAgICAgICAgaXNTaHVmZmxlZCA9ICFub25GaXhlZEVsZW1lbnRzLmV2ZXJ5KChjaG9pY2UsIGluZGV4KSA9PiBjaG9pY2UgPT09IG9yaWdpbmFsT3JkZXJbaW5kZXhdKTtcblxuICAgICAgICBpZiAoaXNTaHVmZmxlZCkgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNTaHVmZmxlZCkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBzaHVmZmxlIHRoZSBjaG9pY2VzIGFmdGVyIG11bHRpcGxlIGF0dGVtcHRzLicpO1xuICAgICAgfVxuXG4gICAgICAvLyBBc3NpZ24gb3JkZXIgdG8gZWFjaCBlbGVtZW50XG4gICAgICBsZXQgb3JkZXIgPSAxO1xuICAgICAgY2hvaWNlcy5mb3JFYWNoKChjaG9pY2U6IEhUTUxFbGVtZW50LCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAoY2hvaWNlLmhhc0F0dHJpYnV0ZSgnZml4ZWQnKSkge1xuICAgICAgICAgIGNob2ljZS5zdHlsZS5zZXRQcm9wZXJ0eSgnb3JkZXInLCBTdHJpbmcob3JkZXIrKykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IG5vbkZpeGVkQ2hvaWNlID0gbm9uRml4ZWRFbGVtZW50cy5zaGlmdCgpO1xuICAgICAgICAgIG5vbkZpeGVkQ2hvaWNlIS5zdHlsZS5zZXRQcm9wZXJ0eSgnb3JkZXInLCBTdHJpbmcob3JkZXIrKykpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZXNldFNodWZmbGVDaG9pY2VzKCkge1xuICAgICAgY29uc3QgY2hvaWNlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLWNob2ljZScpKTtcbiAgICAgIGNob2ljZXMuZm9yRWFjaCgoY2hvaWNlLCBpbmRleCkgPT4ge1xuICAgICAgICBjaG9pY2Uuc3R5bGUuc2V0UHJvcGVydHkoJ29yZGVyJywgJ2luaXRpYWwnKTsgLy8gY2hvaWNlLnN0eWxlLm9yZGVyID0gJ2luaXRpYWwnO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBTaHVmZmxlRWxlbWVudCBhcyBDb25zdHJ1Y3RvcjxTaHVmZmxlSW50ZXJmYWNlPiAmIFQ7XG59O1xuXG5jb25zdCBzdHJpbmdUb0Jvb2xlYW5Db252ZXJ0ZXIgPSB7XG4gIGZyb21BdHRyaWJ1dGUodmFsdWU6IHN0cmluZyB8IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdmFsdWUgPT09ICd0cnVlJztcbiAgfSxcbiAgdG9BdHRyaWJ1dGUodmFsdWU6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIHJldHVybiB2YWx1ZSA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gIH1cbn07XG4iLCAiLyoqXG4gKiBNaXhpbiB0aGF0IHByb3ZpZGVzIHNodWZmbGluZyBmdW5jdGlvbmFsaXR5IGZvciBhIExpdEVsZW1lbnQuXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSB0eXBlIG9mIHRoZSBMaXRFbGVtZW50IHN1YmNsYXNzLlxuICogQHBhcmFtIHtUfSBzdXBlckNsYXNzIC0gVGhlIHN1cGVyY2xhc3MgdG8gZXh0ZW5kLlxuICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gVGhlIENTUyBzZWxlY3RvciBmb3IgdGhlIGVsZW1lbnRzIHRvIHNodWZmbGUuXG4gKiBAcmV0dXJucyB7Q29uc3RydWN0b3I8U2h1ZmZsZUludGVyZmFjZT4gJiBUfSAtIFRoZSBleHRlbmRlZCBjbGFzcyB3aXRoIHNodWZmbGluZyBmdW5jdGlvbmFsaXR5LlxuICpcbiAqIGFkZHMgYSBzaHVmZmxlIHByb3BlcnR5IHRvIHRoZSBjbGFzcyB3aXRoIGFuIGF0dHJpYnV0ZSBjb252ZXJ0ZXJcbiAqXG4gKiBxdGktaW5saW5lLWNob2ljZS1pbnRlcmFjdGlvblxuICogcXRpLWNob2ljZS1pbnRlcmFjdGlvblxuICogcXRpLW1hdGNoLWludGVyYWN0aW9uXG4gKi9cbmltcG9ydCB7IFByb3BlcnR5VmFsdWVzIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpU2ltcGxlQ2hvaWNlIH0gZnJvbSAnLi4vLi4vcXRpLXNpbXBsZS1jaG9pY2UnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IGFic3RyYWN0IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5cbnR5cGUgTGFiZWxUeXBlID0gJ3F0aS1sYWJlbHMtZGVjaW1hbCcgfCAncXRpLWxhYmVscy1sb3dlci1hbHBoYScgfCAncXRpLWxhYmVscy11cHBlci1hbHBoYSc7XG50eXBlIExhYmVsU3VmZml4VHlwZSA9ICdxdGktbGFiZWxzLXN1ZmZpeC1wZXJpb2QnIHwgJ3F0aS1sYWJlbHMtc3VmZml4LXBhcmVudGhlc2lzJztcblxuZGVjbGFyZSBjbGFzcyBWb2NhYnVsYXJ5SW50ZXJmYWNlIHt9XG5cbmV4cG9ydCBjb25zdCBWb2NhYnVsYXJ5TWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPEludGVyYWN0aW9uPj4oc3VwZXJDbGFzczogVCwgc2VsZWN0b3I6IHN0cmluZykgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBWb2NhYnVsYXJ5RWxlbWVudCBleHRlbmRzIHN1cGVyQ2xhc3Mge1xuICAgIHByaXZhdGUgX2NsYXNzZXM6IHN0cmluZ1tdID0gW107XG4gICAgcHJpdmF0ZSBfYWxsTGFiZWxzID0gWydxdGktbGFiZWxzLWRlY2ltYWwnLCAncXRpLWxhYmVscy1sb3dlci1hbHBoYScsICdxdGktbGFiZWxzLXVwcGVyLWFscGhhJ107XG4gICAgcHJpdmF0ZSBfYWxsTGFiZWxTdWZmaXhlcyA9IFsncXRpLWxhYmVscy1zdWZmaXgtcGVyaW9kJywgJ3F0aS1sYWJlbHMtc3VmZml4LXBhcmVudGhlc2lzJ10gYXMgTGFiZWxTdWZmaXhUeXBlW107XG4gICAgLy8gRGVmaW5lIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZSBjdXN0b20gY29udmVydGVyXG4gICAgQHByb3BlcnR5KHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIHJlZmxlY3Q6IHRydWVcbiAgICB9KVxuICAgIHNldCBjbGFzcyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5fY2xhc3Nlcy5qb2luKCcgJyk7XG4gICAgICB0aGlzLl9jbGFzc2VzID0gdmFsdWUuc3BsaXQoJyAnKTtcblxuICAgICAgdGhpcy5fYWRkTGFiZWxzKCk7XG4gICAgICAvLyB0aGlzLnJlcXVlc3RVcGRhdGUoJ2NsYXNzJywgb2xkVmFsdWUpO1xuICAgIH1cbiAgICBnZXQgY2xhc3MoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLl9jbGFzc2VzPy5qb2luKCcgJykgfHwgJyc7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlcyk6IHZvaWQge1xuICAgICAgc3VwZXIudXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpO1xuICAgICAgaWYgKF9jaGFuZ2VkUHJvcGVydGllcy5oYXMoJ3NodWZmbGUnKSkge1xuICAgICAgICB0aGlzLl9hZGRMYWJlbHMoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9hZGRMYWJlbHMoKSB7XG4gICAgICBjb25zdCBjbGFzc0NvbnRhaW5zTGFiZWwgPSB0aGlzLl9jbGFzc2VzLnNvbWUoXG4gICAgICAgIGNscyA9PiB0aGlzLl9hbGxMYWJlbHMuaW5jbHVkZXMoY2xzKSB8fCB0aGlzLl9hbGxMYWJlbFN1ZmZpeGVzLmluY2x1ZGVzKGNscyBhcyBMYWJlbFN1ZmZpeFR5cGUpXG4gICAgICApO1xuICAgICAgY29uc3QgaXNOdW1iZXIgPSB2YWx1ZSA9PiB7XG4gICAgICAgIHJldHVybiAhaXNOYU4oK3ZhbHVlKTtcbiAgICAgIH07XG4gICAgICBpZiAoY2xhc3NDb250YWluc0xhYmVsKSB7XG4gICAgICAgIGNvbnN0IGNob2ljZUVsZW1lbnRzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtY2hvaWNlJykpLm1hcChjID0+IGMgYXMgUXRpU2ltcGxlQ2hvaWNlKTtcbiAgICAgICAgY29uc3QgY2hvaWNlcyA9IGNob2ljZUVsZW1lbnRzXG4gICAgICAgICAgLm1hcCgoY2hvaWNlOiBIVE1MRWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7IGVsOiBjaG9pY2UsIG9yZGVyOiBpc051bWJlcihjaG9pY2Uuc3R5bGUub3JkZXIpID8gK2Nob2ljZS5zdHlsZS5vcmRlciA6IGluZGV4ICsgMSB9O1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEub3JkZXIgLSBiLm9yZGVyKVxuICAgICAgICAgIC5tYXAoY2hvaWNlID0+IGNob2ljZS5lbCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hvaWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIChjaG9pY2VzW2ldIGFzIFF0aVNpbXBsZUNob2ljZSkubWFya2VyID0gdGhpcy5fZ2V0TGFiZWwoaSArIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgX2dldExhYmVsKGluZGV4OiBudW1iZXIpIHtcbiAgICAgIGxldCBsYXN0TGFiZWwgPSB0aGlzLl9jbGFzc2VzLmZpbHRlcihjID0+IHRoaXMuX2FsbExhYmVscy5pbmNsdWRlcyhjKSkucG9wKCkgYXMgTGFiZWxUeXBlO1xuICAgICAgY29uc3QgbGFzdExhYmVsU3VmZml4ID0gdGhpcy5fY2xhc3Nlcy5maWx0ZXIoYyA9PiB0aGlzLl9hbGxMYWJlbFN1ZmZpeGVzLmluY2x1ZGVzKGMgYXMgTGFiZWxTdWZmaXhUeXBlKSkucG9wKCk7XG5cbiAgICAgIGlmICghbGFzdExhYmVsICYmIGxhc3RMYWJlbFN1ZmZpeCkge1xuICAgICAgICAvLyBhIHN1ZmZpeCB3aXRob3V0IGEgbGFiZWwgaXMgc3RyYW5nZSBzbyBhZGQgcXRpLWxhYmVscy11cHBlci1hbHBoYVxuICAgICAgICBsYXN0TGFiZWwgPSAncXRpLWxhYmVscy11cHBlci1hbHBoYSc7XG4gICAgICB9XG4gICAgICBsZXQgbGFiZWwgPSAnJztcbiAgICAgIHN3aXRjaCAobGFzdExhYmVsKSB7XG4gICAgICAgIGNhc2UgJ3F0aS1sYWJlbHMtZGVjaW1hbCc6XG4gICAgICAgICAgbGFiZWwgPSBgJHtpbmRleH1gO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdxdGktbGFiZWxzLWxvd2VyLWFscGhhJzpcbiAgICAgICAgICBsYWJlbCA9IGAke1N0cmluZy5mcm9tQ2hhckNvZGUoOTcgKyBpbmRleCAtIDEpfWA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3F0aS1sYWJlbHMtdXBwZXItYWxwaGEnOlxuICAgICAgICAgIGxhYmVsID0gYCR7U3RyaW5nLmZyb21DaGFyQ29kZSg2NSArIGluZGV4IC0gMSl9YDtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChsYXN0TGFiZWxTdWZmaXggPT09ICdxdGktbGFiZWxzLXN1ZmZpeC1wZXJpb2QnKSB7XG4gICAgICAgIGxhYmVsICs9ICcuJztcbiAgICAgIH0gZWxzZSBpZiAobGFzdExhYmVsU3VmZml4ID09PSAncXRpLWxhYmVscy1zdWZmaXgtcGFyZW50aGVzaXMnKSB7XG4gICAgICAgIGxhYmVsICs9IGApYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBsYWJlbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFZvY2FidWxhcnlFbGVtZW50IGFzIENvbnN0cnVjdG9yPFZvY2FidWxhcnlJbnRlcmZhY2U+ICYgVDtcbn07XG4iLCAiaW1wb3J0IHsgY3NzIH0gZnJvbSAnbGl0JztcblxuZXhwb3J0IGRlZmF1bHQgY3NzYFxuICBbcGFydD0nc2xvdCddIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgZ2FwOiB2YXIoLS1xdGktZ2FwLXNpemUpO1xuICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgfVxuXG4gIDo6c2xvdHRlZChxdGktc2ltcGxlLWNob2ljZSkge1xuICAgIGZsZXg6IDAgMFxuICAgICAgY2FsYygoMTAwJSAtICh2YXIoLS1xdGktZ2FwLXNpemUpICogdmFyKC0tY2hvaWNlLWludGVyYWN0aW9ucy1zdGFja2luZykpKSAvIHZhcigtLWNob2ljZS1pbnRlcmFjdGlvbnMtc3RhY2tpbmcpKSAhaW1wb3J0YW50O1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3ggIWltcG9ydGFudDtcbiAgfVxuXG4gIDpob3N0KC5xdGktY2hvaWNlcy1zdGFja2luZy0xKSBbcGFydD0nc2xvdCddIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIC0tY2hvaWNlLWludGVyYWN0aW9ucy1zdGFja2luZzogMTtcbiAgfVxuXG4gIDpob3N0KC5xdGktY2hvaWNlcy1zdGFja2luZy0yKSBbcGFydD0nc2xvdCddIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIC0tY2hvaWNlLWludGVyYWN0aW9ucy1zdGFja2luZzogMjtcbiAgfVxuICA6aG9zdCgucXRpLWNob2ljZXMtc3RhY2tpbmctMykgW3BhcnQ9J3Nsb3QnXSB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAtLWNob2ljZS1pbnRlcmFjdGlvbnMtc3RhY2tpbmc6IDM7XG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXN0YWNraW5nLTQpIFtwYXJ0PSdzbG90J10ge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgLS1jaG9pY2UtaW50ZXJhY3Rpb25zLXN0YWNraW5nOiA0O1xuICB9XG4gIDpob3N0KC5xdGktY2hvaWNlcy1zdGFja2luZy01KSBbcGFydD0nc2xvdCddIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIC0tY2hvaWNlLWludGVyYWN0aW9ucy1zdGFja2luZzogNTtcbiAgfVxuICA6aG9zdChbb3JpZW50YXRpb249J2hvcml6b250YWwnXSkgW3BhcnQ9J3Nsb3QnXSB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgfVxuYDtcbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFF0aVJ1bGUsIFF0aVJ1bGVCYXNlIH0gZnJvbSAnLi4nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLW91dGNvbWUtcHJvY2Vzc2luZycpXG5leHBvcnQgY2xhc3MgUXRpT3V0Y29tZVByb2Nlc3NpbmcgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIHB1YmxpYyBwcm9jZXNzKCkge1xuICAgIGNvbnN0IGxvZ2ljID0gbmV3IFF0aU91dGNvbWVQcm9jZXNzaW5nUHJvY2Vzc29yKCk7XG4gICAgY29uc3QgcnVsZXMgPSBbLi4udGhpcy5jaGlsZHJlbl0gYXMgUXRpUnVsZVtdO1xuICAgIGxvZ2ljLnByb2Nlc3MocnVsZXMpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1vdXRjb21lLXByb2Nlc3NpbmcnOiBRdGlPdXRjb21lUHJvY2Vzc2luZztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXRpT3V0Y29tZVByb2Nlc3NpbmdQcm9jZXNzb3Ige1xuICBwdWJsaWMgcHJvY2VzcyhydWxlczogUXRpUnVsZUJhc2VbXSkge1xuICAgIGZvciAoY29uc3QgcnVsZSBvZiBydWxlcykge1xuICAgICAgcnVsZS5wcm9jZXNzKCk7XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50LCBQcm9wZXJ0eVZhbHVlTWFwIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7IG1hcFJlc3BvbnNlLCBtYXBSZXNwb25zZVBvaW50LCBtYXRjaENvcnJlY3QgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC90ZW1wbGF0ZS1zdHJpbmdzJztcbmltcG9ydCB7IHR5cGUgUXRpUnVsZSB9IGZyb20gJy4uL3F0aS1ydWxlL3F0aS1ydWxlJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nJylcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFF0aVJlc3BvbnNlUHJvY2Vzc2luZyBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHVibGljIHByb2Nlc3MoKSB7XG4gICAgY29uc3QgcnVsZXMgPSBbLi4udGhpcy5jaGlsZHJlbl0gYXMgUXRpUnVsZVtdO1xuXG4gICAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzKSB7XG4gICAgICBydWxlLnByb2Nlc3MoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZU1hcDxhbnk+IHwgTWFwPFByb3BlcnR5S2V5LCB1bmtub3duPik6IHZvaWQge1xuICAgIGlmICh0aGlzLmdldEF0dHJpYnV0ZSgndGVtcGxhdGUnKSkge1xuICAgICAgY29uc3Qgc3BsaXR0ZWRUZW1wbGF0ZU5hbWUgPSB0aGlzLmdldEF0dHJpYnV0ZSgndGVtcGxhdGUnKSEuc3BsaXQoJy8nKTtcbiAgICAgIGNvbnN0IHRlbXBsYXRlTmFtZSA9IHNwbGl0dGVkVGVtcGxhdGVOYW1lW3NwbGl0dGVkVGVtcGxhdGVOYW1lLmxlbmd0aCAtIDFdLnJlcGxhY2UoJy54bWwnLCAnJyk7XG4gICAgICB0aGlzLmlubmVySFRNTCA9ICcnO1xuICAgICAgc3dpdGNoICh0ZW1wbGF0ZU5hbWUpIHtcbiAgICAgICAgY2FzZSAnbWFwX3Jlc3BvbnNlJzoge1xuICAgICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy5mcmFnbWVudEZyb21TdHJpbmcobWFwUmVzcG9uc2UpLmZpcnN0RWxlbWVudENoaWxkLmZpcnN0RWxlbWVudENoaWxkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdtYXBfcmVzcG9uc2VfcG9pbnQnOiB7XG4gICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLmZyYWdtZW50RnJvbVN0cmluZyhtYXBSZXNwb25zZVBvaW50KS5maXJzdEVsZW1lbnRDaGlsZC5maXJzdEVsZW1lbnRDaGlsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnbWF0Y2hfY29ycmVjdCc6XG4gICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLmZyYWdtZW50RnJvbVN0cmluZyhtYXRjaENvcnJlY3QpLmZpcnN0RWxlbWVudENoaWxkLmZpcnN0RWxlbWVudENoaWxkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZyYWdtZW50RnJvbVN0cmluZyhzdHJIVE1MOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoc3RySFRNTCk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnOiBRdGlSZXNwb25zZVByb2Nlc3Npbmc7XG4gIH1cbn1cbiIsICJleHBvcnQgY29uc3QgbWF0Y2hDb3JyZWN0ID0gYDxxdGktcmVzcG9uc2UtcHJvY2Vzc2luZz5cbiAgPHF0aS1yZXNwb25zZS1jb25kaXRpb24+XG4gICAgPHF0aS1yZXNwb25zZS1pZj5cbiAgICAgIDxxdGktbWF0Y2g+XG4gICAgICAgIDxxdGktdmFyaWFibGUgaWRlbnRpZmllcj1cIlJFU1BPTlNFXCI+PC9xdGktdmFyaWFibGU+XG4gICAgICAgIDxxdGktY29ycmVjdCBpZGVudGlmaWVyPVwiUkVTUE9OU0VcIj48L3F0aS1jb3JyZWN0PlxuICAgICAgPC9xdGktbWF0Y2g+XG4gICAgICA8cXRpLXNldC1vdXRjb21lLXZhbHVlIGlkZW50aWZpZXI9XCJTQ09SRVwiPlxuICAgICAgICA8cXRpLWJhc2UtdmFsdWUgYmFzZS10eXBlPVwiZmxvYXRcIj4xPC9xdGktYmFzZS12YWx1ZT5cbiAgICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICAgIDwvcXRpLXJlc3BvbnNlLWlmPlxuICAgIDxxdGktcmVzcG9uc2UtZWxzZT5cbiAgICAgIDxxdGktc2V0LW91dGNvbWUtdmFsdWUgaWRlbnRpZmllcj1cIlNDT1JFXCI+XG4gICAgICAgIDxxdGktYmFzZS12YWx1ZSBiYXNlLXR5cGU9XCJmbG9hdFwiPjA8L3F0aS1iYXNlLXZhbHVlPlxuICAgICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gICAgPC9xdGktcmVzcG9uc2UtZWxzZT5cbiAgPC9xdGktcmVzcG9uc2UtY29uZGl0aW9uPlxuPC9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZz5gO1xuXG5leHBvcnQgY29uc3QgbWFwUmVzcG9uc2UgPSBgPHF0aS1yZXNwb25zZS1wcm9jZXNzaW5nPlxuICA8cXRpLXJlc3BvbnNlLWNvbmRpdGlvbj5cbiAgICA8cXRpLXJlc3BvbnNlLWlmPlxuICAgICAgPHF0aS1pcy1udWxsPlxuICAgICAgICA8cXRpLXZhcmlhYmxlIGlkZW50aWZpZXI9XCJSRVNQT05TRVwiPjwvcXRpLXZhcmlhYmxlPlxuICAgICAgPC9xdGktaXMtbnVsbD5cbiAgICAgIDxxdGktc2V0LW91dGNvbWUtdmFsdWUgaWRlbnRpZmllcj1cIlNDT1JFXCI+XG4gICAgICAgIDxxdGktYmFzZS12YWx1ZSBiYXNlLXR5cGU9XCJmbG9hdFwiPjAuMDwvcXRpLWJhc2UtdmFsdWU+XG4gICAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAgICA8L3F0aS1yZXNwb25zZS1pZj5cbiAgICA8cXRpLXJlc3BvbnNlLWVsc2U+XG4gICAgICA8cXRpLXNldC1vdXRjb21lLXZhbHVlIGlkZW50aWZpZXI9XCJTQ09SRVwiPlxuICAgICAgICA8cXRpLW1hcC1yZXNwb25zZSBpZGVudGlmaWVyPVwiUkVTUE9OU0VcIj4gPC9xdGktbWFwLXJlc3BvbnNlPlxuICAgICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gICAgPC9xdGktcmVzcG9uc2UtZWxzZT5cbiAgPC9xdGktcmVzcG9uc2UtY29uZGl0aW9uPlxuPC9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZz5gO1xuXG5leHBvcnQgY29uc3QgbWFwUmVzcG9uc2VQb2ludCA9IGA8cXRpLXJlc3BvbnNlLXByb2Nlc3Npbmc+XG4gIDxxdGktcmVzcG9uc2UtY29uZGl0aW9uPlxuICAgIDxxdGktcmVzcG9uc2UtaWY+XG4gICAgICA8cXRpLWlzLW51bGw+XG4gICAgICAgIDxxdGktdmFyaWFibGUgaWRlbnRpZmllcj1cIlJFU1BPTlNFXCI+PC9xdGktdmFyaWFibGU+XG4gICAgICA8L3F0aS1pcy1udWxsPlxuICAgICAgPHF0aS1zZXQtb3V0Y29tZS12YWx1ZSBpZGVudGlmaWVyPVwiU0NPUkVcIj5cbiAgICAgICAgPHF0aS1iYXNlLXZhbHVlIGJhc2UtdHlwZT1cImZsb2F0XCI+MDwvcXRpLWJhc2UtdmFsdWU+XG4gICAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAgICA8L3F0aS1yZXNwb25zZS1pZj5cbiAgICA8cXRpLXJlc3BvbnNlLWVsc2U+XG4gICAgICA8cXRpLXNldC1vdXRjb21lLXZhbHVlIGlkZW50aWZpZXI9XCJTQ09SRVwiPlxuICAgICAgICA8cXRpLW1hcC1yZXNwb25zZS1wb2ludCBpZGVudGlmaWVyPVwiUkVTUE9OU0VcIj48L3F0aS1tYXAtcmVzcG9uc2UtcG9pbnQ+XG4gICAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAgICA8L3F0aS1yZXNwb25zZS1lbHNlPlxuICA8L3F0aS1yZXNwb25zZS1jb25kaXRpb24+XG48L3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nPmA7XG4iLCAiaW1wb3J0IHsgT3V0Y29tZVZhcmlhYmxlIH0gZnJvbSAnQGNpdG9sYWIvcXRpLWNvbXBvbmVudHMvcXRpLWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBjb252ZXJ0TnVtYmVyVG9Vbml2ZXJhbEZvcm1hdCB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3V0aWxzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi8uLi9xdGktZXhwcmVzc2lvbi9xdGktZXhwcmVzc2lvbic7XG5pbXBvcnQgeyBRdGlSdWxlIH0gZnJvbSAnLi4vcXRpLXJ1bGUnO1xuXG4vKipcbiAqIFRoZSBsb29rdXBPdXRjb21lVmFsdWUgcnVsZSBzZXRzIHRoZSB2YWx1ZSBvZiBhbiBvdXRjb21lIHZhcmlhYmxlIHRvIHRoZSB2YWx1ZSBvYnRhaW5lZFxuICogYnkgbG9va2luZyB1cCB0aGUgdmFsdWUgb2YgdGhlIGFzc29jaWF0ZWQgZXhwcmVzc2lvbiBpbiB0aGUgbG9va3VwVGFibGUgYXNzb2NpYXRlZFxuICogd2l0aCB0aGUgb3V0Y29tZSdzIGRlY2xhcmF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUXRpTG9va3VwT3V0Y29tZVZhbHVlIGV4dGVuZHMgUXRpUnVsZSB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgZ2V0IGNoaWxkRXhwcmVzc2lvbigpOiBRdGlFeHByZXNzaW9uPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmZpcnN0RWxlbWVudENoaWxkIGFzIFF0aUV4cHJlc3Npb248c3RyaW5nPjtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBwcm9jZXNzKCk6IG51bWJlciB7XG4gICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgY29uc3Qgb3V0Y29tZVZhcmlhYmxlID0gdGhpcy5jbG9zZXN0KCdxdGktYXNzZXNzbWVudC1pdGVtJykuZ2V0VmFyaWFibGUoaWRlbnRpZmllcikgYXMgT3V0Y29tZVZhcmlhYmxlO1xuICAgIGxldCB2YWx1ZTtcbiAgICBpZiAob3V0Y29tZVZhcmlhYmxlLmludGVycG9sYXRpb25UYWJsZSkge1xuICAgICAgdmFsdWUgPSBvdXRjb21lVmFyaWFibGUuaW50ZXJwb2xhdGlvblRhYmxlLmdldChwYXJzZUludCh0aGlzLmNoaWxkRXhwcmVzc2lvbi5jYWxjdWxhdGUoKSkpO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKCdsb29rdXBPdXRjb21lVmFsdWU6IHZhbHVlIGlzIG51bGwgb3IgdW5kZWZpbmVkJyk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50PHsgb3V0Y29tZUlkZW50aWZpZXI6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdIH0+KCdxdGktc2V0LW91dGNvbWUtdmFsdWUnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICBvdXRjb21lSWRlbnRpZmllcjogdGhpcy5pZGVudGlmaWVyLFxuICAgICAgICAgIHZhbHVlOiBjb252ZXJ0TnVtYmVyVG9Vbml2ZXJhbEZvcm1hdCh2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbG9va3VwLW91dGNvbWUtdmFsdWUnLCBRdGlMb29rdXBPdXRjb21lVmFsdWUpO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktbG9va3VwLW91dGNvbWUtdmFsdWUnOiBRdGlMb29rdXBPdXRjb21lVmFsdWU7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktcnVsZScpXG5leHBvcnQgY2xhc3MgUXRpUnVsZSBleHRlbmRzIExpdEVsZW1lbnQgaW1wbGVtZW50cyBRdGlSdWxlQmFzZSB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIHB1YmxpYyBwcm9jZXNzKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBRdGlSdWxlQmFzZSB7XG4gIHByb2Nlc3MoKTogYW55O1xufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcnVsZSc6IFF0aVJ1bGU7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi8uLi9xdGktZXhwcmVzc2lvbi9xdGktZXhwcmVzc2lvbic7XG5pbXBvcnQgeyBRdGlSdWxlIH0gZnJvbSAnLi4vcXRpLXJ1bGUnO1xuXG5leHBvcnQgY2xhc3MgUXRpUmVzcG9uc2VDb25kaXRpb24gZXh0ZW5kcyBRdGlSdWxlIHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIHByb2Nlc3MoKSB7XG4gICAgY29uc3QgYnJhbmNoZXMgPSBbLi4udGhpcy5jaGlsZHJlbl0gYXMgUXRpRXhwcmVzc2lvbjxhbnk+W107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJyYW5jaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBicmFuY2ggPSBicmFuY2hlc1tpXTtcblxuICAgICAgaWYgKGJyYW5jaC5jYWxjdWxhdGUoKSkge1xuICAgICAgICAoYnJhbmNoIGFzIHVua25vd24gYXMgUXRpUnVsZSkucHJvY2VzcygpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktcmVzcG9uc2UtY29uZGl0aW9uJywgUXRpUmVzcG9uc2VDb25kaXRpb24pO1xuIiwgImltcG9ydCB7IGNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0IH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdXRpbHMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiwgUXRpRXhwcmVzc2lvbkJhc2UgfSBmcm9tICcuLi8uLi9xdGktZXhwcmVzc2lvbi9xdGktZXhwcmVzc2lvbic7XG5pbXBvcnQgeyBRdGlSdWxlLCBRdGlSdWxlQmFzZSB9IGZyb20gJy4uL3F0aS1ydWxlJztcblxuZXhwb3J0IGNsYXNzIFF0aVNldE91dGNvbWVWYWx1ZSBleHRlbmRzIFF0aVJ1bGUge1xuICBwdWJsaWMgb3ZlcnJpZGUgcHJvY2VzcygpIHtcbiAgICBjb25zdCBvdXRjb21lSWRlbnRpZmllciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG5cbiAgICBjb25zdCBleHByZXNzaW9uID0gdGhpcy5maXJzdEVsZW1lbnRDaGlsZCBhcyBRdGlFeHByZXNzaW9uPHN0cmluZz47XG5cbiAgICBjb25zdCBydWxlID0gbmV3IFF0aVNldE91dGNvbWVWYWx1ZVJ1bGUoZXhwcmVzc2lvbik7XG4gICAgY29uc3QgdmFsdWUgPSBydWxlLnByb2Nlc3MoKTtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQ8eyBvdXRjb21lSWRlbnRpZmllcjogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfT4oJ3F0aS1zZXQtb3V0Y29tZS12YWx1ZScsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIG91dGNvbWVJZGVudGlmaWVyLFxuICAgICAgICAgIHZhbHVlOiBBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICAgICAgICAgPyB2YWx1ZS5tYXAoKHY6IHN0cmluZykgPT4gY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQodikpXG4gICAgICAgICAgICA6IGNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0KHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF0aVNldE91dGNvbWVWYWx1ZVJ1bGU8VD4gaW1wbGVtZW50cyBRdGlSdWxlQmFzZSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZXhwcmVzc2lvbjogUXRpRXhwcmVzc2lvbkJhc2U8VD4pIHt9XG5cbiAgcHJvY2VzcygpOiBhbnkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5leHByZXNzaW9uID8gdGhpcy5leHByZXNzaW9uLmNhbGN1bGF0ZSgpIDogbnVsbDtcblxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ3NldE91dGNvbWVWYWx1ZTogdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXNldC1vdXRjb21lLXZhbHVlJywgUXRpU2V0T3V0Y29tZVZhbHVlKTtcbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IFF0aVJ1bGUgfSBmcm9tICcuLi9xdGktcnVsZS9xdGktcnVsZSc7XG5cbmV4cG9ydCBjbGFzcyBRdGlSZXNwb25zZUVsc2UgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZSgpIHtcbiAgICBjb25zdCByZXN1bHQgPSB0cnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIGdldFN1YlJ1bGVzKCk6IFF0aVJ1bGVbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmNoaWxkcmVuXSBhcyBRdGlSdWxlW107XG4gIH1cblxuICBwdWJsaWMgcHJvY2VzcygpIHtcbiAgICBjb25zdCBzdWJSdWxlcyA9IHRoaXMuZ2V0U3ViUnVsZXMoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1YlJ1bGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBzdWJSdWxlID0gc3ViUnVsZXNbaV07XG4gICAgICBzdWJSdWxlLnByb2Nlc3MoKTtcbiAgICB9XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktcmVzcG9uc2UtZWxzZScsIFF0aVJlc3BvbnNlRWxzZSk7XG4iLCAiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBRdGlSZXNwb25zZUlmIH0gZnJvbSAnLi4vcXRpLXJlc3BvbnNlLWlmJztcblxuZXhwb3J0IGNsYXNzIFF0aVJlc3BvbnNlRWxzZUlmIGV4dGVuZHMgUXRpUmVzcG9uc2VJZiB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAke3N1cGVyLnJlbmRlcigpfWA7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktcmVzcG9uc2UtZWxzZS1pZicsIFF0aVJlc3BvbnNlRWxzZUlmKTtcbiIsICJpbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vLi4vcXRpLWV4cHJlc3Npb24vcXRpLWV4cHJlc3Npb24nO1xuaW1wb3J0IHsgUXRpUnVsZSB9IGZyb20gJy4uLy4uL3F0aS1ydWxlL3F0aS1ydWxlJztcbmltcG9ydCB7IFF0aVJlc3BvbnNlRWxzZSB9IGZyb20gJy4uL3F0aS1yZXNwb25zZS1lbHNlJztcblxuZXhwb3J0IGNsYXNzIFF0aVJlc3BvbnNlSWYgZXh0ZW5kcyBRdGlSZXNwb25zZUVsc2Uge1xuICBwdWJsaWMgb3ZlcnJpZGUgY2FsY3VsYXRlKCkge1xuICAgIGNvbnN0IGV4cHJlc3Npb24gPSB0aGlzLmZpcnN0RWxlbWVudENoaWxkIGFzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj47XG4gICAgY29uc3QgcmVzdWx0ID0gZXhwcmVzc2lvbi5jYWxjdWxhdGUoKSBhcyBib29sZWFuO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0U3ViUnVsZXMoKTogUXRpUnVsZVtdIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3VsdC5wdXNoKHRoaXMuY2hpbGRyZW5baV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXJlc3BvbnNlLWlmJywgUXRpUmVzcG9uc2VJZik7XG4iLCAiaW1wb3J0IHsgY29uc3VtZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlLCBWYXJpYWJsZURlY2xhcmF0aW9uIH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IGl0ZW1Db250ZXh0LCBJdGVtQ29udGV4dCB9IGZyb20gJy4uLy4uL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcbmltcG9ydCB7IFF0aU11bHRpcGxlIH0gZnJvbSAnLi9xdGktbXVsdGlwbGUvcXRpLW11bHRpcGxlJztcblxuZXhwb3J0IGludGVyZmFjZSBRdGlFeHByZXNzaW9uQmFzZTxUPiB7XG4gIC8vIGdldCBhc3Nlc3NtZW50SXRlbSgpOiBRdGlBc3Nlc3NtZW50SXRlbTtcblxuICAvLyBnZXRWYXJpYWJsZXMoKTogVmFyaWFibGVEZWNsYXJhdGlvbjxudW1iZXIgfCBzdHJpbmcgfCAobnVtYmVyIHwgc3RyaW5nKVtdIHwgbnVsbD5bXTtcbiAgY2FsY3VsYXRlKCk6IFJlYWRvbmx5PFQ+O1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUXRpRXhwcmVzc2lvbjxUPiBleHRlbmRzIExpdEVsZW1lbnQgaW1wbGVtZW50cyBRdGlFeHByZXNzaW9uQmFzZTxUPiB7XG4gIEBzdGF0ZSgpXG4gIHByb3RlY3RlZCByZXN1bHQ6IGFueTtcblxuICAvLyBoaWRlIHRoZSBzbG90IHdpdGggY3NzXG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgc2xvdCB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHByZT4ke0pTT04uc3RyaW5naWZ5KHRoaXMucmVzdWx0LCBudWxsLCAyKX08L3ByZT5cbiAgICAgIDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZSgpOiBSZWFkb25seTxUPiB7XG4gICAgdGhpcy5yZXN1bHQgPSB0aGlzLmdldFJlc3VsdCgpO1xuICAgIHJldHVybiB0aGlzLnJlc3VsdDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRSZXN1bHQoKTogUmVhZG9ubHk8VD4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICBAY29uc3VtZSh7IGNvbnRleHQ6IGl0ZW1Db250ZXh0LCBzdWJzY3JpYmU6IHRydWUgfSlcbiAgQHN0YXRlKClcbiAgcHJvdGVjdGVkIGNvbnRleHQ/OiBJdGVtQ29udGV4dDtcblxuICBnZXRWYXJpYWJsZXMgPSAoKTogVmFyaWFibGVEZWNsYXJhdGlvbjxudW1iZXIgfCBzdHJpbmcgfCAobnVtYmVyIHwgc3RyaW5nKVtdIHwgbnVsbD5bXSA9PlxuICAgIC8vIEZJWE1FOiBpZiB0aGlzIGl0c2VsZiBpcyBtdWx0aXBsZSwgdGhpcyB3aWxsIG5ldmVyIGVudGVyIHRoZSBxdGktbXVsdGlwbGUgc3dpdGNoXG4gICAgLy8gU2VlIHRoaXMgZXhhbXBsZSBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vMUVkVGVjaC9xdGktZXhhbXBsZXMvYmxvYi9tYXN0ZXIvcXRpdjMtZXhhbXBsZXMvcGFja2FnaW5nL2l0ZW1zL0V4YW1wbGUwNS1mZWVkYmFja0Jsb2NrLWFkYXB0aXZlLnhtbFxuXG4gICAgQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuKVxuICAgICAgLm1hcCgoZTogRWxlbWVudCkgPT4ge1xuICAgICAgICBzd2l0Y2ggKGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgY2FzZSAncXRpLWJhc2UtdmFsdWUnOiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBiYXNlVHlwZTogZS5nZXRBdHRyaWJ1dGUoJ2Jhc2UtdHlwZScpLFxuICAgICAgICAgICAgICB2YWx1ZTogZS50ZXh0Q29udGVudC50cmltKCksXG4gICAgICAgICAgICAgIGNhcmRpbmFsaXR5OiAnc2luZ2xlJ1xuICAgICAgICAgICAgfSBhcyBSZXNwb25zZVZhcmlhYmxlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdxdGktdmFyaWFibGUnOiB7XG4gICAgICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gZS5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSB8fCAnJztcbiAgICAgICAgICAgIGNvbnN0IHZhcmlhYmxlID0gdGhpcy5jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB8fCBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHZhcmlhYmxlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdxdGktbXVsdGlwbGUnOiB7XG4gICAgICAgICAgICBjb25zdCBtdWx0aXBsZSA9IGUgYXMgUXRpTXVsdGlwbGU7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBtdWx0aXBsZS5nZXRSZXN1bHQoKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGlkZW50aWZpZXI6ICcnLFxuICAgICAgICAgICAgICAgIGJhc2VUeXBlOiB2YWx1ZXNbMF0uYmFzZVR5cGUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlcy5tYXAodiA9PiB2LnZhbHVlKSxcbiAgICAgICAgICAgICAgICBjYXJkaW5hbGl0eTogJ211bHRpcGxlJyxcbiAgICAgICAgICAgICAgICB0eXBlOiAncmVzcG9uc2UnXG4gICAgICAgICAgICAgIH0gYXMgUmVzcG9uc2VWYXJpYWJsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdxdGktY29ycmVjdCc6IHtcbiAgICAgICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBlLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpIHx8ICcnO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VWYXJpYWJsZTogUmVzcG9uc2VWYXJpYWJsZSA9IHRoaXMuY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikgfHwgbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGJhc2VUeXBlOiByZXNwb25zZVZhcmlhYmxlLmJhc2VUeXBlLFxuICAgICAgICAgICAgICB2YWx1ZTogcmVzcG9uc2VWYXJpYWJsZS5jb3JyZWN0UmVzcG9uc2UsXG4gICAgICAgICAgICAgIGNhcmRpbmFsaXR5OiByZXNwb25zZVZhcmlhYmxlLmNhcmRpbmFsaXR5XG4gICAgICAgICAgICB9IGFzIFJlc3BvbnNlVmFyaWFibGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIC8vIGFkZGVkIGZvciB1c2Ugb2YgcXRpLWVxdWFsLXJvdW5kZWRcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSBlIGFzIFF0aUV4cHJlc3Npb248bnVtYmVyPjtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBleHByZXNzaW9uLmdldFJlc3VsdCgpO1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGJhc2VUeXBlOiAnaW50ZWdlcicsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgY2FyZGluYWxpdHk6ICdzaW5nbGUnXG4gICAgICAgICAgICAgIH0gYXMgUmVzcG9uc2VWYXJpYWJsZTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybignZGVmYXVsdCBub3Qgc3VmZmljaWVudCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmZpbHRlcih2ID0+IHYgIT09IG51bGwpO1xufVxuIiwgImltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgcHVibGljIGNhbGN1bGF0ZSgpOiBSZWFkb25seTxib29sZWFuPiB7XG4gICAgdGhpcy5yZXN1bHQgPSB0aGlzLmdldFJlc3VsdCgpO1xuICAgIHJldHVybiB0aGlzLnJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSZXN1bHQoKTogUmVhZG9ubHk8Ym9vbGVhbj4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBRdGlDb25kaXRpb25FeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbnR5cGUgQ29uc3RydWN0b3I8VD4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuZXhwb3J0IGNsYXNzIFF0aUFuZCBleHRlbmRzIHF0aUFuZE1peGluKFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxRdGlDb25kaXRpb25FeHByZXNzaW9uPikge1xuICBwdWJsaWMgY2FsY3VsYXRlKCkge1xuICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZUNoaWxkcmVuKEFycmF5LmZyb20odGhpcy5jaGlsZHJlbiBhcyB1bmtub3duIGFzIFF0aUV4cHJlc3Npb248YW55PltdKSk7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgTW9ja1F0aUV4cHJlc3Npb248VD4gPSB7IGNhbGN1bGF0ZTogKCkgPT4gVCB9O1xudHlwZSBNb2NrQ29uc3RydWN0b3IgPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiB7fTtcbmV4cG9ydCBmdW5jdGlvbiBxdGlBbmRNaXhpbjxUQmFzZSBleHRlbmRzIE1vY2tDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpIHtcbiAgcmV0dXJuIGNsYXNzIE1vY2tRdGlBbmQgZXh0ZW5kcyBCYXNlIHtcbiAgICBwdWJsaWMgY2FsY3VsYXRlQ2hpbGRyZW4oY2hpbGRyZW46IEFycmF5PE1vY2tRdGlFeHByZXNzaW9uPGFueT4+KSB7XG4gICAgICAvLyBjaGlsZHJlbiBjYW4gYmUgYSBtaXggb2YgcXRpLWV4cHJlc3Npb24gYW5kIHF0aS1jb25kaXRpb24tZXhwcmVzc2lvblxuICAgICAgY29uc3QgdmFsdWVzID0gY2hpbGRyZW4ubWFwKGMgPT4ge1xuICAgICAgICBjb25zdCBjb25kaXRpb24gPSBjIGFzIE1vY2tRdGlFeHByZXNzaW9uPGFueT47XG4gICAgICAgIGlmICghY29uZGl0aW9uLmNhbGN1bGF0ZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFbGVtZW50IGRvZXNuJ3QgaW1wbGVtZW50IFF0aUNvbmRpdGlvbkV4cHJlc3Npb25cIik7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSBjb25kaXRpb24uY2FsY3VsYXRlKCk7XG4gICAgICAgIGxldCB2YWwgPSBmYWxzZTtcbiAgICAgICAgLy8gY29udmVydCBzdHJpbmcgdmFsdWUgdG8gYm9vbGVhbiBhbmQgcmV0dXJuIG51bGwgaWYgbm90IHBvc3NpYmxlXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgaWYgKHZhbHVlID09PSAndHJ1ZScpIHtcbiAgICAgICAgICAgIHZhbCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gJ2ZhbHNlJykge1xuICAgICAgICAgICAgdmFsID0gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgdmFsIGluIHF0aS1vciwgZXhwZWN0ZWQgYm9vbGVhbicpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgdmFsID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB2YWx1ZXMuZXZlcnkoZSA9PiB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgZSA9PT0gJ2Jvb2xlYW4nICYmIGU7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG59XG4iLCAiaW1wb3J0IHsgUXRpQW5kIH0gZnJvbSAnLi9xdGktYW5kJztcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWFuZCcsIFF0aUFuZCk7XG5cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWFuZCc7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1hbmQnOiBRdGlBbmQ7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEJhc2VUeXBlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcbmV4cG9ydCBjbGFzcyBRdGlCYXNlVmFsdWUgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPHN0cmluZz4ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2Jhc2UtdHlwZScgfSkgYmFzZVR5cGU6IEJhc2VUeXBlID0gJ3N0cmluZyc7XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy50ZXh0Q29udGVudC50cmltKCk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWJhc2UtdmFsdWUnLCBRdGlCYXNlVmFsdWUpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1jb25kaXRpb24tZXhwcmVzc2lvbic7XG5cbi8vIFBLOiBGb3IgdGhlIGNvbnRhaW5zIHdlIGFzc3VtZSB0aGUgZXhwcmVzc2lvbnMgdG8gY2FsY3VsYXRlIGFyZSBhbGwgZGlyZWN0ZWRQYWlyc1xuLy8gSSBkb24ndCBrbm93IGl0IHRoaXMgaW4gUVRJIGlzIGFsd2F5cyB0aGUgY2FzZSBob3dldmVyP1xuZXhwb3J0IGNsYXNzIFF0aUNvbnRhaW5zIGV4dGVuZHMgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgZm9yIG90aGVyIHR5cGVzIHRoYW4gZGlyZWN0ZWRQYWlyXG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2RpcmVjdGVkUGFpcicgJiZcbiAgICAgICAgdmFsdWUyLmJhc2VUeXBlID09PSAnZGlyZWN0ZWRQYWlyJyAmJlxuICAgICAgICB2YWx1ZTEuY2FyZGluYWxpdHkgPT09ICdtdWx0aXBsZSdcbiAgICAgICkge1xuICAgICAgICBjb25zdCBwcm9qZWN0aW9uMSA9IHZhbHVlMS52YWx1ZSBhcyBzdHJpbmdbXTtcbiAgICAgICAgY29uc3QgcHJvamVjdGlvbjIgPSB2YWx1ZTIudmFsdWUgYXMgc3RyaW5nW107XG4gICAgICAgIGNvbnN0IGVudW1lcmFibGUgPSBwcm9qZWN0aW9uMS5maWx0ZXIoeCA9PiBwcm9qZWN0aW9uMi5pbmNsdWRlcyh4KSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZW51bWVyYWJsZS5sZW5ndGggPiAwO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdmFsdWUxLmJhc2VUeXBlID09PSAnZGlyZWN0ZWRQYWlyJyAmJlxuICAgICAgICB2YWx1ZTIuYmFzZVR5cGUgPT09ICdkaXJlY3RlZFBhaXInICYmXG4gICAgICAgIHZhbHVlMS5jYXJkaW5hbGl0eSA9PT0gJ3NpbmdsZSdcbiAgICAgICkge1xuICAgICAgICBjb25zdCBwcm9qZWN0aW9uMSA9IHZhbHVlMS52YWx1ZSBhcyBzdHJpbmc7XG4gICAgICAgIGNvbnN0IHByb2plY3Rpb24yID0gdmFsdWUyLnZhbHVlIGFzIHN0cmluZ1tdO1xuICAgICAgICByZXR1cm4gcHJvamVjdGlvbjIuaW5jbHVkZXMocHJvamVjdGlvbjEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAndW5zdXBwb3J0ZWQgYmFzZVR5cGUgb3IgY2FyZGluYWxpdHkgaW4gcXRpIGNvbnRhaW5zLCBvbmx5IGJhc2VUeXBlOiBkaXJlY3RlZFBhaXIgYW5kIGNhcmRpbmFsaXR5OiBtdWx0aXBsZSBpcyBzdXBwb3J0ZWQnXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aSBjb250YWlucycpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktY29udGFpbnMnLCBRdGlDb250YWlucyk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJ3NyYy9saWIvcXRpLWNvbXBvbmVudHMvaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlDb3JyZWN0IGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxzdHJpbmcgfCBzdHJpbmdbXT4ge1xuICBnZXQgaW50ZXJwcmV0YXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCdpbnRlcnByZXRhdGlvbicpIHx8ICcnO1xuICB9XG5cbiAgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpIHx8ICcnO1xuICAgIGNvbnN0IHJlc3BvbnNlVmFyaWFibGU6IFJlc3BvbnNlVmFyaWFibGUgPSB0aGlzLmNvbnRleHQudmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHx8IG51bGw7XG4gICAgaWYgKHJlc3BvbnNlVmFyaWFibGUuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnKSB7XG4gICAgICByZXR1cm4gcmVzcG9uc2VWYXJpYWJsZS5jb3JyZWN0UmVzcG9uc2UubGVuZ3RoID4gMCA/IHJlc3BvbnNlVmFyaWFibGUuY29ycmVjdFJlc3BvbnNlWzBdIDogJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByZXNwb25zZVZhcmlhYmxlLmNvcnJlY3RSZXNwb25zZTtcbiAgICB9XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktY29ycmVjdCcsIFF0aUNvcnJlY3QpO1xuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpRXF1YWxSb3VuZGVkIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSByb3VuZGluZ01vZGU6ICdkZWNpbWFsUGxhY2VzJyB8ICdzaWduaWZpY2FudEZpZ3VyZXMnID0gJ3NpZ25pZmljYW50RmlndXJlcyc7XG5cbiAgZ2V0IGZpZ3VyZXMoKSB7XG4gICAgY29uc3QgYXR0ciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdmaWd1cmVzJyk7XG4gICAgaWYgKCFhdHRyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdmaWd1cmVzIGF0dHJpYnV0ZSBpcyBtaXNzaW5nJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgZmlndXJlcyA9IHBhcnNlSW50KHRoaXMuZ2V0QXR0cmlidXRlKCdmaWd1cmVzJykgfHwgJzAnKTtcbiAgICBpZiAoaXNOYU4oZmlndXJlcykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZpZ3VyZXMgYXR0cmlidXRlIGlzIG5vdCBhIG51bWJlcicpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChmaWd1cmVzIDwgMCkge1xuICAgICAgY29uc29sZS5lcnJvcignZmlndXJlcyBhdHRyaWJ1dGUgaXMgbmVnYXRpdmUnKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoZmlndXJlcyA8IDEgJiYgdGhpcy5yb3VuZGluZ01vZGUgPT09ICdzaWduaWZpY2FudEZpZ3VyZXMnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdmaWd1cmVzIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gMSBmb3IgUm91bmRpbmdNb2RlIHNpZ25pZmljYW50RmlndXJlcycpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBmaWd1cmVzO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKHRoaXMucm91bmRpbmdNb2RlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB2YWx1ZTEuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnIHx8XG4gICAgICAgIHZhbHVlMi5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTEudmFsdWUpIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUyLnZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIGVxdWFsJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAodmFsdWVzWzBdLmJhc2VUeXBlKSB7XG4gICAgICAgIGNhc2UgJ2ludGVnZXInOlxuICAgICAgICBjYXNlICdmbG9hdCc6IHtcbiAgICAgICAgICBjb25zdCBmbG9hdDEgPSBwYXJzZUZsb2F0KHZhbHVlMS52YWx1ZSBhcyBzdHJpbmcpO1xuICAgICAgICAgIGNvbnN0IGZsb2F0MiA9IHBhcnNlRmxvYXQodmFsdWUyLnZhbHVlIGFzIHN0cmluZyk7XG5cbiAgICAgICAgICBpZiAoIWlzTmFOKGZsb2F0MSkgJiYgIWlzTmFOKGZsb2F0MikpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJvdW5kaW5nTW9kZSA9PT0gJ3NpZ25pZmljYW50RmlndXJlcycpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0MS50b1ByZWNpc2lvbih0aGlzLmZpZ3VyZXMpID09PSBmbG9hdDIudG9QcmVjaXNpb24odGhpcy5maWd1cmVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgTWF0aC5yb3VuZChmbG9hdDEgKiBNYXRoLnBvdygxMCwgdGhpcy5maWd1cmVzKSkgLyBNYXRoLnBvdygxMCwgdGhpcy5maWd1cmVzKSA9PT1cbiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKGZsb2F0MiAqIE1hdGgucG93KDEwLCB0aGlzLmZpZ3VyZXMpKSAvIE1hdGgucG93KDEwLCB0aGlzLmZpZ3VyZXMpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYHZhbHVlIGNhbm5vdCBiZSBjYXN0ZWQgdG8gbnVtZXJpYyB2YWx1ZSBpbiBlcXVhbFJvdW5kZWQgb3BlcmF0b3I6ICR7ZmxvYXQxfSwgJHtmbG9hdDJ9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGB2YWx1ZXMgb3RoZXIgdGhhbiBmbG9hdCBhbmQgaW50IGNhbm5vdCBiZSB1c2VkIGluIGVxdWFsUm91bmRlZCBvcGVyYXRvci5gKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdGktZXF1YWwtcm91bmRlZCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWVxdWFsLXJvdW5kZWQnLCBRdGlFcXVhbFJvdW5kZWQpO1xuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBTY29yaW5nSGVscGVyIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL3Njb3JpbmctaGVscGVyJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlFcXVhbCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgdG9sZXJhbmNlTW9kZTogJ2V4YWN0JyB8ICdyZWxhdGl2ZScgfCAnYWJzb2x1dGUnID0gJ2V4YWN0JztcblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAodGhpcy50b2xlcmFuY2VNb2RlICE9PSAnZXhhY3QnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3RvbGVyYW5jZU1vZGUgaXMgbm90IHN1cHBvcnRlZCB5ZXQnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB2YWx1ZTEuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnIHx8XG4gICAgICAgIHZhbHVlMi5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTEudmFsdWUpIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUyLnZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIGVxdWFsJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXModmFsdWUxLnZhbHVlIGFzIHN0cmluZywgdmFsdWUyLnZhbHVlIGFzIHN0cmluZywgdmFsdWUxLmJhc2VUeXBlKTtcbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpLWVxdWFsJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktZXF1YWwnLCBRdGlFcXVhbCk7XG4iLCAiaW1wb3J0IHsgQmFzZVR5cGUgfSBmcm9tICcuLi8uLic7XG5cbmV4cG9ydCBjbGFzcyBTY29yaW5nSGVscGVyIHtcbiAgcHVibGljIHN0YXRpYyBjb21wYXJlU2luZ2xlVmFsdWVzKHZhbHVlMTogUmVhZG9ubHk8c3RyaW5nPiwgdmFsdWUyOiBSZWFkb25seTxzdHJpbmc+LCBiYXNlVHlwZTogQmFzZVR5cGUpOiBib29sZWFuIHtcbiAgICBzd2l0Y2ggKGJhc2VUeXBlKSB7XG4gICAgICBjYXNlICdpZGVudGlmaWVyJzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIHJldHVybiB2YWx1ZTEgPT09IHZhbHVlMjtcbiAgICAgIGNhc2UgJ2ludGVnZXInOiB7XG4gICAgICAgIGNvbnN0IGludDEgPSBwYXJzZUludCh2YWx1ZTEsIDEwKTtcbiAgICAgICAgY29uc3QgaW50MiA9IHBhcnNlSW50KHZhbHVlMiwgMTApO1xuICAgICAgICBpZiAoIWlzTmFOKGludDEpICYmICFpc05hTihpbnQyKSkge1xuICAgICAgICAgIHJldHVybiBpbnQxID09PSBpbnQyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYENhbm5vdCBjb252ZXJ0ICR7dmFsdWUxfSBhbmQvb3IgJHt2YWx1ZTJ9IHRvIGludC5gKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Zsb2F0Jzoge1xuICAgICAgICBjb25zdCBmbG9hdDEgPSBwYXJzZUZsb2F0KHZhbHVlMSk7XG4gICAgICAgIGNvbnN0IGZsb2F0MiA9IHBhcnNlRmxvYXQodmFsdWUyKTtcbiAgICAgICAgaWYgKCFpc05hTihmbG9hdDEpICYmICFpc05hTihmbG9hdDIpKSB7XG4gICAgICAgICAgcmV0dXJuIGZsb2F0MSA9PT0gZmxvYXQyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYGNvdWxkbid0IGNvbnZlcnQgJHt2YWx1ZTF9IGFuZC9vciAke3ZhbHVlMn0gdG8gZmxvYXQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdwYWlyJzpcbiAgICAgIGNhc2UgJ2RpcmVjdGVkUGFpcic6IHtcbiAgICAgICAgY29uc3QgcGFpcjEgPSB2YWx1ZTEuc3BsaXQoJyAnKS5zb3J0KCk7XG4gICAgICAgIGNvbnN0IHBhaXIyID0gdmFsdWUyLnNwbGl0KCcgJykuc29ydCgpO1xuICAgICAgICBpZiAocGFpcjEubGVuZ3RoID09PSAyICYmIHBhaXIyLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIGlmIChiYXNlVHlwZSA9PT0gJ3BhaXInKSB7XG4gICAgICAgICAgICBwYWlyMS5zb3J0KCk7XG4gICAgICAgICAgICBwYWlyMi5zb3J0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBwYWlyMS5qb2luKCcgJykgPT09IHBhaXIyLmpvaW4oJyAnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBjb21wYXJlZCB0d28gcGFpciBidXQgb25lIG9mIHRoZSB2YWx1ZXMgZG9lcyBub3QgaGF2ZSAyIHZhbHVlczogMTogJHt2YWx1ZTF9IDI6ICR7dmFsdWUyfWApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aUd0IGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmICh2YWx1ZTEuYmFzZVR5cGUgPT09IHZhbHVlMi5iYXNlVHlwZSAmJiAodmFsdWUxLmJhc2VUeXBlID09PSAnaW50ZWdlcicgfHwgdmFsdWUxLmJhc2VUeXBlID09PSAnZmxvYXQnKSkge1xuICAgICAgICByZXR1cm4gK3ZhbHVlMS52YWx1ZSA+ICt2YWx1ZTIudmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGJhc2VUeXBlIG9yIGNhcmRpbmFsaXR5IGluIHF0aSBndCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWd0JywgUXRpR3QpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1jb25kaXRpb24tZXhwcmVzc2lvbic7XG5cbi8vIFBLOiBGb3IgdGhlIGNvbnRhaW5zIHdlIGFzc3VtZSB0aGUgZXhwcmVzc2lvbnMgdG8gY2FsY3VsYXRlIGFyZSBhbGwgZGlyZWN0ZWRQYWlyc1xuLy8gSSBkb24ndCBrbm93IGl0IHRoaXMgaW4gUVRJIGlzIGFsd2F5cyB0aGUgY2FzZSBob3dldmVyP1xuZXhwb3J0IGNsYXNzIFF0aUd0ZSBleHRlbmRzIFF0aUNvbmRpdGlvbkV4cHJlc3Npb24ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAodmFsdWUxLmJhc2VUeXBlID09PSB2YWx1ZTIuYmFzZVR5cGUgJiYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2ludGVnZXInIHx8IHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2Zsb2F0JykpIHtcbiAgICAgICAgcmV0dXJuICt2YWx1ZTEudmFsdWUgPj0gK3ZhbHVlMi52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgYmFzZVR5cGUgb3IgY2FyZGluYWxpdHkgaW4gcXRpIGd0ZScpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5sb2coJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0ZScpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWd0ZScsIFF0aUd0ZSk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG4vLyBQSzogRm9yIHRoZSBjb250YWlucyB3ZSBhc3N1bWUgdGhlIGV4cHJlc3Npb25zIHRvIGNhbGN1bGF0ZSBhcmUgYWxsIGRpcmVjdGVkUGFpcnNcbi8vIEkgZG9uJ3Qga25vdyBpdCB0aGlzIGluIFFUSSBpcyBhbHdheXMgdGhlIGNhc2UgaG93ZXZlcj9cbmV4cG9ydCBjbGFzcyBRdGlJc051bGwgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IHZhcmlhYmxlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgaWYgKCF2YXJpYWJsZXMpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZSA9IHZhcmlhYmxlc1swXS52YWx1ZTtcbiAgICAgIHJldHVybiB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gJyc7XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aSBOdWxsJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktaXMtbnVsbCcsIFF0aUlzTnVsbCk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpTHQgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gdmFsdWUyLmJhc2VUeXBlICYmICh2YWx1ZTEuYmFzZVR5cGUgPT09ICdpbnRlZ2VyJyB8fCB2YWx1ZTEuYmFzZVR5cGUgPT09ICdmbG9hdCcpKSB7XG4gICAgICAgIHJldHVybiArdmFsdWUxLnZhbHVlIDwgK3ZhbHVlMi52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgYmFzZVR5cGUgb3IgY2FyZGluYWxpdHkgaW4gcXRpIGx0Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIGx0Jyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbHQnLCBRdGlMdCk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlDb25kaXRpb25FeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uJztcblxuLy8gUEs6IEZvciB0aGUgY29udGFpbnMgd2UgYXNzdW1lIHRoZSBleHByZXNzaW9ucyB0byBjYWxjdWxhdGUgYXJlIGFsbCBkaXJlY3RlZFBhaXJzXG4vLyBJIGRvbid0IGtub3cgaXQgdGhpcyBpbiBRVEkgaXMgYWx3YXlzIHRoZSBjYXNlIGhvd2V2ZXI/XG5leHBvcnQgY2xhc3MgUXRpTHRlIGV4dGVuZHMgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmICh2YWx1ZTEuYmFzZVR5cGUgPT09IHZhbHVlMi5iYXNlVHlwZSAmJiAodmFsdWUxLmJhc2VUeXBlID09PSAnaW50ZWdlcicgfHwgdmFsdWUxLmJhc2VUeXBlID09PSAnZmxvYXQnKSkge1xuICAgICAgICByZXR1cm4gK3ZhbHVlMS52YWx1ZSA8PSArdmFsdWUyLnZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBiYXNlVHlwZSBvciBjYXJkaW5hbGl0eSBpbiBxdGkgbHRlJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmxvZygndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gbHRlJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbHRlJywgUXRpTHRlKTtcbiIsICJpbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICdzcmMvbGliL3F0aS1jb21wb25lbnRzL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBTY29yaW5nSGVscGVyIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL3Njb3JpbmctaGVscGVyJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlNYXBSZXNwb25zZSBleHRlbmRzIFF0aUV4cHJlc3Npb248bnVtYmVyPiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBudW1iZXIge1xuICAgIGNvbnN0IHJlc3BvbnNlOiBSZXNwb25zZVZhcmlhYmxlID0gdGhpcy5jb250ZXh0LnZhcmlhYmxlcy5maW5kKHIgPT4gci5pZGVudGlmaWVyID09PSB0aGlzLmlkZW50aWZpZXIpO1xuICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgIGNvbnNvbGUud2FybihgUmVzcG9uc2UgJHt0aGlzLmlkZW50aWZpZXJ9IGNhbiBub3QgYmUgZm91bmRgKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBtYXBwaW5nID0gcmVzcG9uc2UubWFwcGluZztcbiAgICBjb25zdCBjYW5kaWRhdGVSZXNwb25zZXMgPSAhQXJyYXkuaXNBcnJheShyZXNwb25zZS52YWx1ZSkgPyBbcmVzcG9uc2UudmFsdWVdIDogcmVzcG9uc2UudmFsdWU7XG4gICAgbGV0IHJlc3VsdCA9IDA7XG4gICAgZm9yIChjb25zdCBjYW5kaWRhdGVSZXNwb25zZSBvZiBjYW5kaWRhdGVSZXNwb25zZXMpIHtcbiAgICAgIGNvbnN0IG1hcHBlZFZhbHVlID0gbWFwcGluZy5tYXBFbnRyaWVzLmZpbmQoZW50cnkgPT4ge1xuICAgICAgICByZXR1cm4gU2NvcmluZ0hlbHBlci5jb21wYXJlU2luZ2xlVmFsdWVzKGVudHJ5Lm1hcEtleSwgY2FuZGlkYXRlUmVzcG9uc2UsIHJlc3BvbnNlLmJhc2VUeXBlKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKCEobWFwcGVkVmFsdWUgPT0gbnVsbCB8fCBtYXBwZWRWYWx1ZS5tYXBwZWRWYWx1ZSA9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIHJlc3VsdCArPSBtYXBwZWRWYWx1ZS5tYXBwZWRWYWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCArPSBtYXBwaW5nLmRlZmF1bHRWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG1hcHBpbmcubG93ZXJCb3VuZCAhPSBudWxsKSB7XG4gICAgICByZXN1bHQgPSBNYXRoLm1heChtYXBwaW5nLmxvd2VyQm91bmQsIHJlc3VsdCk7XG4gICAgfVxuICAgIGlmIChtYXBwaW5nLnVwcGVyQm91bmQgIT0gbnVsbCkge1xuICAgICAgcmVzdWx0ID0gTWF0aC5taW4obWFwcGluZy51cHBlckJvdW5kLCByZXN1bHQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW1hcC1yZXNwb25zZScsIFF0aU1hcFJlc3BvbnNlKTtcbiIsICJpbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuXG5leHBvcnQgY2xhc3MgUXRpTWFwcGluZyBleHRlbmRzIExpdEVsZW1lbnQge1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdkZWZhdWx0LXZhbHVlJywgdHlwZTogTnVtYmVyIH0pIGRlZmF1bHRWYWx1ZTogbnVtYmVyID0gMDtcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnbG93ZXItYm91bmQnLCB0eXBlOiBOdW1iZXIgfSkgbG93ZXJCb3VuZDogbnVtYmVyO1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICd1cHBlci1ib3VuZCcsIHR5cGU6IE51bWJlciB9KSB1cHBlckJvdW5kOiBudW1iZXI7XG5cbiAgcHVibGljIGdldCBtYXBFbnRyaWVzKCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLW1hcC1lbnRyeScpKS5tYXAoZWwgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbWFwS2V5OiBlbC5nZXRBdHRyaWJ1dGUoJ21hcC1rZXknKSxcbiAgICAgICAgbWFwcGVkVmFsdWU6ICtlbC5nZXRBdHRyaWJ1dGUoJ21hcHBlZC12YWx1ZScpXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW1hcHBpbmcnLCBRdGlNYXBwaW5nKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFNjb3JpbmdIZWxwZXIgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvc2NvcmluZy1oZWxwZXInO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aU1hdGNoIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIC8vUEsgOiBGSVhNRS5cbiAgLy8gVGhpcyB3YXMgYSBsaXR0bGUgZXhwZXJpbWVudCBpZiB3ZSBjb3VsZCBjYWxsIHRoZSBtYXRjaCBmdW5jdGlvbiBhcyBhIHN0YXRpYyBmdW5jdGlvbixcbiAgLy8gVGhpcyBjYW4gYmUgdXNlZCBmb3IgYWxsIGtpbmQgb2YgdGhpbmdzLCBidXQgbm93IGVzcGVjaWFsbHkgZm9yIHVzZSBpblxuICAvLyBxdGktcmVzcG9uc2UtY29uZGl0aW9uLXNjcmlwdFxuICAvLyBpbiB3aGljaCB3ZSBwYXNzIHRoZSBleHByZXNzaW9ucyBhcyBwdXJlIGZ1bmN0aW9ucywgYW5kIGhvcGUgZm9yIHRoZSBiZXN0LlxuICAvLyBTQURMWSwgdGhlIGdldFZhcmlhYmxlcyB0aHJvd3Mgcm9ldCBpbiBkZSBldGVuLi4gd2VldCBub2cgbmlldCBwcmVjaWVzIGhvZSBkZXplIHdlcmt0LlxuICAvLyBNYWFyIGlrIGdhIGVyaW4gZHVpa2VuLlxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZVRvTWFwID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgY29ycmVjdFZhbHVlSW5mbyA9IHZhbHVlc1sxXTtcbiAgICAgIHJldHVybiBRdGlNYXRjaC5tYXRjaCh2YWx1ZVRvTWFwLCBjb3JyZWN0VmFsdWVJbmZvKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBtYXRjaCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBtYXRjaCh2YWx1ZVRvTWFwOiBSZXNwb25zZVZhcmlhYmxlLCBjb3JyZWN0VmFsdWVJbmZvOiBSZXNwb25zZVZhcmlhYmxlKSB7XG4gICAgc3dpdGNoIChjb3JyZWN0VmFsdWVJbmZvLmNhcmRpbmFsaXR5KSB7XG4gICAgICBjYXNlICdzaW5nbGUnOiB7XG4gICAgICAgIGlmICh2YWx1ZVRvTWFwLnZhbHVlID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlVG9NYXAudmFsdWUpIHx8IEFycmF5LmlzQXJyYXkoY29ycmVjdFZhbHVlSW5mby52YWx1ZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBtYXRjaCcpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU2NvcmluZ0hlbHBlci5jb21wYXJlU2luZ2xlVmFsdWVzKFxuICAgICAgICAgIHZhbHVlVG9NYXAudmFsdWU/LnRvU3RyaW5nKCksXG4gICAgICAgICAgY29ycmVjdFZhbHVlSW5mby52YWx1ZS50b1N0cmluZygpLFxuICAgICAgICAgIGNvcnJlY3RWYWx1ZUluZm8uYmFzZVR5cGVcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnb3JkZXJlZCc6IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlVG9NYXAudmFsdWUpIHx8ICFBcnJheS5pc0FycmF5KGNvcnJlY3RWYWx1ZUluZm8udmFsdWUpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgbWF0Y2gnKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlVG9NYXAudmFsdWUubGVuZ3RoICE9PSBjb3JyZWN0VmFsdWVJbmZvLnZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlVG9NYXAudmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXMoXG4gICAgICAgICAgICBjb3JyZWN0VmFsdWVJbmZvLnZhbHVlW2ldLFxuICAgICAgICAgICAgdmFsdWVUb01hcC52YWx1ZVtpXSxcbiAgICAgICAgICAgIGNvcnJlY3RWYWx1ZUluZm8uYmFzZVR5cGVcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBjYXNlICdtdWx0aXBsZSc6IHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlVG9NYXAudmFsdWUpIHx8ICFBcnJheS5pc0FycmF5KGNvcnJlY3RWYWx1ZUluZm8udmFsdWUpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgbWF0Y2gnKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlVG9NYXAudmFsdWUubGVuZ3RoICE9PSBjb3JyZWN0VmFsdWVJbmZvLnZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYW5zd2VySW5kZXggPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGNvcnJlY3RBbnN3ZXIgb2YgY29ycmVjdFZhbHVlSW5mby52YWx1ZSkge1xuICAgICAgICAgIGxldCBtYXRjaGluZ1ZhbHVlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAgICAgICBjb25zdCBhcnIgPSBbLi4udmFsdWVUb01hcC52YWx1ZV07XG4gICAgICAgICAgZm9yIChjb25zdCBtdiBvZiBhcnIpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFNjb3JpbmdIZWxwZXIuY29tcGFyZVNpbmdsZVZhbHVlcyhjb3JyZWN0QW5zd2VyLCBtdiwgY29ycmVjdFZhbHVlSW5mby5iYXNlVHlwZSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgIG1hdGNoaW5nVmFsdWUgPSBtdjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChtYXRjaGluZ1ZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAoYXJyIGFzIHN0cmluZ1tdKS5zcGxpY2UoYXJyLmluZGV4T2YobWF0Y2hpbmdWYWx1ZSksIDEpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFuc3dlckluZGV4Kys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIG1hdGNoJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbWF0Y2gnLCBRdGlNYXRjaCk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpTWVtYmVyIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuIHwgbnVsbD4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuXG4gICAgaWYgKCEodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1RoZSBtZW1iZXIgb3BlcmF0b3IgdGFrZXMgdHdvIHN1Yi1leHByZXNzaW9ucycpO1xuICAgIH1cblxuICAgIGNvbnN0IFt2YWx1ZTEsIHZhbHVlMl0gPSB2YWx1ZXM7XG5cbiAgICBpZiAoISh2YWx1ZTEuYmFzZVR5cGUgPT09IHZhbHVlMi5iYXNlVHlwZSkpIHtcbiAgICAgIGNvbnNvbGUud2FybignV2hpY2ggbXVzdCBib3RoIGhhdmUgdGhlIHNhbWUgYmFzZS10eXBlJyk7XG4gICAgfVxuICAgIGlmICghKHZhbHVlMi5jYXJkaW5hbGl0eSA9PT0gJ211bHRpcGxlJyB8fCB2YWx1ZTIuY2FyZGluYWxpdHkgPT09ICdvcmRlcmVkJykpIHtcbiAgICAgIGNvbnNvbGUud2FybignYW5kIHRoZSBzZWNvbmQgbXVzdCBiZSBhIG11bHRpcGxlIG9yIG9yZGVyZWQgY29udGFpbmVyJyk7XG4gICAgfVxuICAgIGlmICh2YWx1ZTEuYmFzZVR5cGUgPT09ICdmbG9hdCcgfHwgdmFsdWUyLmJhc2VUeXBlID09PSAnZmxvYXQnKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1RoZSBtZW1iZXIgb3BlcmF0b3Igc2hvdWxkIG5vdCBiZSB1c2VkIG9uIHN1Yi1leHByZXNzaW9ucyB3aXRoIGEgYmFzZS10eXBlIG9mIGZsb2F0Jyk7XG4gICAgfVxuICAgIGlmICh2YWx1ZTEuYmFzZVR5cGUgPT09ICdkdXJhdGlvbicgfHwgdmFsdWUyLmJhc2VUeXBlID09PSAnZHVyYXRpb24nKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0l0IG11c3Qgbm90IGJlIHVzZWQgb24gc3ViLWV4cHJlc3Npb25zIHdpdGggYSBiYXNlLXR5cGUgb2YgZHVyYXRpb24nKTtcbiAgICB9XG5cbiAgICAvLyBJZiBlaXRoZXIgc3ViLWV4cHJlc3Npb24gaXMgTlVMTCB0aGVuIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdG9yIGlzIE5VTExcbiAgICBpZiAodmFsdWUxLnZhbHVlID09PSBudWxsIHx8IHZhbHVlMi52YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gVGhlIHJlc3VsdCBpcyBhIHNpbmdsZSBib29sZWFuIHdpdGggYSB2YWx1ZSBvZiAndHJ1ZScgaWYgdGhlIHZhbHVlIGdpdmVuIGJ5IHRoZSBmaXJzdCBzdWItZXhwcmVzc2lvbiBpcyBpbiB0aGUgY29udGFpbmVyIGRlZmluZWQgYnkgdGhlIHNlY29uZCBzdWItZXhwcmVzc2lvbi5cbiAgICBjb25zdCBwcm9qZWN0aW9uMSA9IHZhbHVlMS52YWx1ZSBhcyBzdHJpbmc7XG4gICAgY29uc3QgcHJvamVjdGlvbjIgPSB2YWx1ZTIudmFsdWUgYXMgc3RyaW5nW107XG4gICAgcmV0dXJuIHByb2plY3Rpb24yLmluY2x1ZGVzKHByb2plY3Rpb24xKTtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1tZW1iZXInLCBRdGlNZW1iZXIpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUsIFZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcbmV4cG9ydCBjbGFzcyBRdGlNdWx0aXBsZSBleHRlbmRzIFF0aUV4cHJlc3Npb248VmFyaWFibGVEZWNsYXJhdGlvbjxzdHJpbmcgfCBzdHJpbmdbXT5bXT4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IFJlc3BvbnNlVmFyaWFibGVbXSB7XG4gICAgY29uc3QgdmFyaWFibGVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgaWYgKHZhcmlhYmxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aSBtdWx0aXBsZScpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdmFyaWFibGUgb2YgdmFyaWFibGVzKSB7XG4gICAgICBpZiAodmFyaWFibGUuY2FyZGluYWxpdHkgIT09ICdtdWx0aXBsZScgJiYgdmFyaWFibGUuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIG11bHRpcGxlJyk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb25zdCB2YWx1ZXMgPSB2YXJpYWJsZXMubWFwKHYgPT4gdi52YWx1ZSk7XG4gICAgLy8gY29uc29sZS5sb2codmFyaWFibGVzKTtcbiAgICAvLyBjb25zdCBmbGF0dGVuZWRBcnJheSA9IHZhbHVlcy5yZWR1Y2UoKGFjYzogc3RyaW5nW10sIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkgPT4ge1xuICAgIC8vICAgcmV0dXJuIGFjYy5jb25jYXQoQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbLi4udmFsdWVdIDogdmFsdWUpO1xuICAgIC8vIH0sIFtdKTtcbiAgICAvLyByZXR1cm4gZmxhdHRlbmVkQXJyYXk7XG5cbiAgICByZXR1cm4gdmFyaWFibGVzO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW11bHRpcGxlJywgUXRpTXVsdGlwbGUpO1xuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aU5vdCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgJHtzdXBlci5yZW5kZXIoKX1gO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBjb25zdCBleHByZXNzaW9uID0gdGhpcy5maXJzdEVsZW1lbnRDaGlsZCBhcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+O1xuICAgIGNvbnN0IHJlc3VsdCA9IGV4cHJlc3Npb24uY2FsY3VsYXRlKCkgYXMgYm9vbGVhbjtcbiAgICByZXR1cm4gIXJlc3VsdDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1ub3QnLCBRdGlOb3QpO1xuIiwgImltcG9ydCB7IFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktY29uZGl0aW9uLWV4cHJlc3Npb24nO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aU9yIGV4dGVuZHMgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgLy8gY2hpbGRyZW4gY2FuIGJlIGEgbWl4IG9mIHF0aS1leHByZXNzaW9uIGFuZCBxdGktY29uZGl0aW9uLWV4cHJlc3Npb25cbiAgICBjb25zdCB2YWx1ZXMgPSBBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4pLm1hcChjID0+IHtcbiAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IGMgYXMgUXRpRXhwcmVzc2lvbjxhbnk+O1xuICAgICAgaWYgKCFjb25kaXRpb24uY2FsY3VsYXRlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFbGVtZW50IGRvZXNuJ3QgaW1wbGVtZW50IFF0aUNvbmRpdGlvbkV4cHJlc3Npb25cIik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSBjb25kaXRpb24uY2FsY3VsYXRlKCk7XG4gICAgICBsZXQgdmFsID0gZmFsc2U7XG4gICAgICAvLyBjb252ZXJ0IHN0cmluZyB2YWx1ZSB0byBib29sZWFuIGFuZCByZXR1cm4gbnVsbCBpZiBub3QgcG9zc2libGVcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgdmFsID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gJ2ZhbHNlJykge1xuICAgICAgICAgIHZhbCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgdmFsIGluIHF0aS1vciwgZXhwZWN0ZWQgYm9vbGVhbicpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICB2YWwgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbDtcbiAgICB9KTtcbiAgICByZXR1cm4gdmFsdWVzLnNvbWUoZSA9PiB7XG4gICAgICByZXR1cm4gdHlwZW9mIGUgPT09ICdib29sZWFuJyAmJiBlO1xuICAgIH0pO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW9yJywgUXRpT3IpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcbmV4cG9ydCBjbGFzcyBRdGlPcmRlcmVkIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxSZXNwb25zZVZhcmlhYmxlW10+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBSZXNwb25zZVZhcmlhYmxlW10ge1xuICAgIGNvbnN0IHZhcmlhYmxlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgIGlmICh2YXJpYWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdGkgbXVsdGlwbGUnKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHZhcmlhYmxlIG9mIHZhcmlhYmxlcykge1xuICAgICAgaWYgKHZhcmlhYmxlLmNhcmRpbmFsaXR5ICE9PSAnb3JkZXJlZCcgJiYgdmFyaWFibGUuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIG9yZGVyZWQnKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFyaWFibGVzO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW9yZGVyZWQnLCBRdGlPcmRlcmVkKTtcbiIsICJpbXBvcnQgeyBjb25zdW1lIH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5pbXBvcnQgeyBWYXJpYWJsZURlY2xhcmF0aW9uIH0gZnJvbSAnc3JjL2xpYi9xdGktY29tcG9uZW50cy9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgSXRlbUNvbnRleHQsIGl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vLi4vLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuXG5leHBvcnQgY2xhc3MgUXRpUHJpbnRlZFZhcmlhYmxlIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgQGNvbnN1bWUoeyBjb250ZXh0OiBpdGVtQ29udGV4dCwgc3Vic2NyaWJlOiB0cnVlIH0pXG4gIEBzdGF0ZSgpXG4gIHByb3RlY3RlZCBjb250ZXh0PzogSXRlbUNvbnRleHQ7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5jb250ZXh0Py52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gdGhpcy5pZGVudGlmaWVyKT8udmFsdWU7XG4gICAgcmV0dXJuIGh0bWxgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMil9YDtcbiAgfVxuXG4gIHB1YmxpYyBjYWxjdWxhdGUoKTogVmFyaWFibGVEZWNsYXJhdGlvbjxzdHJpbmcgfCBzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gdGhpcy5pZGVudGlmaWVyKSB8fCBudWxsO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktcHJpbnRlZC12YXJpYWJsZScsIFF0aVByaW50ZWRWYXJpYWJsZSk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpUHJvZHVjdCBleHRlbmRzIFF0aUV4cHJlc3Npb248bnVtYmVyPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgY29uc3QgcHJvZHVjdCA9IHZhbHVlcy5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBjdXJyZW50VmFsdWUpID0+IHtcbiAgICAgIGlmIChjdXJyZW50VmFsdWUuYmFzZVR5cGUgPT0gJ2Zsb2F0JyB8fCBjdXJyZW50VmFsdWUuYmFzZVR5cGUgPT0gJ2ludGVnZXInKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yICogcGFyc2VJbnQoY3VycmVudFZhbHVlLnZhbHVlLnRvU3RyaW5nKCkpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgY2FuIG5vdCBjb252ZXJ0IHRvIG51bWJlcmApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oYGhhcyBhbm90aGVyIGJhc2VUeXBlICR7Y3VycmVudFZhbHVlLmJhc2VUeXBlfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgIH0sIDEpO1xuICAgIHJldHVybiBwcm9kdWN0O1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXByb2R1Y3QnLCBRdGlQcm9kdWN0KTtcbiIsICJpbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgU2NvcmluZ0hlbHBlciB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9zY29yaW5nLWhlbHBlcic7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpU3RyaW5nTWF0Y2ggZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdjYXNlLXNlbnNpdGl2ZScgfSkgY2FzZVNlbnNpdGl2ZSA9ICd0cnVlJztcblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlMS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScgfHxcbiAgICAgICAgdmFsdWUyLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJyB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlMS52YWx1ZSkgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTIudmFsdWUpXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgc3RyaW5nLW1hdGNoJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHYxID0gdGhpcy5jYXNlU2Vuc2l0aXZlID09PSAndHJ1ZScgPyB2YWx1ZTEudmFsdWUgOiAodmFsdWUxLnZhbHVlIGFzIHN0cmluZykudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IHYyID0gdGhpcy5jYXNlU2Vuc2l0aXZlID09PSAndHJ1ZScgPyB2YWx1ZTIudmFsdWUgOiAodmFsdWUyLnZhbHVlIGFzIHN0cmluZykudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXModjEgYXMgc3RyaW5nLCB2MiBhcyBzdHJpbmcsIHZhbHVlMS5iYXNlVHlwZSk7XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aS1zdHJpbmctbWF0Y2gnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1zdHJpbmctbWF0Y2gnLCBRdGlTdHJpbmdNYXRjaCk7XG4iLCAiaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiwgUXRpRXhwcmVzc2lvbkJhc2UgfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlTdW0gZXh0ZW5kcyBRdGlFeHByZXNzaW9uPG51bWJlcj4ge1xuICBwcml2YXRlIF9leHByZXNzaW9uOiBRdGlTdW1FeHByZXNzaW9uO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2V4cHJlc3Npb24gPSBuZXcgUXRpU3VtRXhwcmVzc2lvbihBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4gYXMgdW5rbm93biBhcyBRdGlFeHByZXNzaW9uQmFzZTxudW1iZXI+W10pKTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgLy8gY2hpbGRyZW4gY2FuIGJlIGEgbWl4IG9mIHF0aS1leHByZXNzaW9uIGFuZCBxdGktY29uZGl0aW9uLWV4cHJlc3Npb25cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2V4cHJlc3Npb24uY2FsY3VsYXRlKCk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdGlTdW1FeHByZXNzaW9uIGltcGxlbWVudHMgUXRpRXhwcmVzc2lvbkJhc2U8bnVtYmVyPiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZXhwcmVzc2lvbnM6IFF0aUV4cHJlc3Npb25CYXNlPG51bWJlcj5bXSkge31cblxuICBwdWJsaWMgY2FsY3VsYXRlKCkge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZXhwcmVzc2lvbnMubWFwKGMgPT4ge1xuICAgICAgaWYgKCFjLmNhbGN1bGF0ZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRWxlbWVudCBkb2Vzbid0IGltcGxlbWVudCBRdGlDb25kaXRpb25FeHByZXNzaW9uXCIpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlID0gYy5jYWxjdWxhdGUoKTtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4odmFsdWUpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgdmFsdWUgaW4gcXRpLXN1bSwgZXhwZWN0ZWQgbnVtYmVyJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gTnVtYmVyKHZhbHVlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdmFsdWVzLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXN1bScsIFF0aVN1bSk7XG4iLCAiaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aVZhcmlhYmxlIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxzdHJpbmcgfCBzdHJpbmdbXT4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikudmFsdWVcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXZhcmlhYmxlJywgUXRpVmFyaWFibGUpO1xuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5pbXBvcnQgeyBJTVNwY2ksIE1vZHVsZVJlc29sdXRpb25Db25maWcsIFF0aVZhcmlhYmxlSlNPTiB9IGZyb20gJy4vaW50ZXJmYWNlJztcblxuZGVjbGFyZSBjb25zdCByZXF1aXJlanM6IGFueTtcbmRlY2xhcmUgY29uc3QgZGVmaW5lOiBhbnk7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlQb3J0YWJsZUN1c3RvbUludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBwcml2YXRlIGludGVydmFsSWQ6IGFueTtcbiAgcHJpdmF0ZSByYXdSZXNwb25zZTogc3RyaW5nO1xuXG4gIHByaXZhdGUgcGNpOiBJTVNwY2k8dW5rbm93bj47XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdtb2R1bGUnIH0pXG4gIG1vZHVsZTogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnY3VzdG9tLWludGVyYWN0aW9uLXR5cGUtaWRlbnRpZmllcicgfSlcbiAgY3VzdG9tSW50ZXJhY3Rpb25UeXBlSWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX2Vycm9yTWVzc2FnZTogc3RyaW5nID0gbnVsbDtcblxuICBwcml2YXRlIGNvbnZlcnRRdGlWYXJpYWJsZUpTT04oaW5wdXQ6IFF0aVZhcmlhYmxlSlNPTik6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICBmb3IgKGNvbnN0IHRvcExldmVsS2V5IGluIGlucHV0KSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICBpZiAoaW5wdXQuaGFzT3duUHJvcGVydHkodG9wTGV2ZWxLZXkpKSB7XG4gICAgICAgIGNvbnN0IG5lc3RlZE9iamVjdCA9IGlucHV0W3RvcExldmVsS2V5IGFzICdsaXN0JyB8ICdiYXNlJ107XG4gICAgICAgIGlmIChuZXN0ZWRPYmplY3QpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IG5lc3RlZEtleSBpbiBuZXN0ZWRPYmplY3QpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgICAgIGlmIChuZXN0ZWRPYmplY3QuaGFzT3duUHJvcGVydHkobmVzdGVkS2V5KSkge1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG5lc3RlZE9iamVjdFtuZXN0ZWRLZXkgYXMga2V5b2YgdHlwZW9mIG5lc3RlZE9iamVjdF07XG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5tYXAoU3RyaW5nKTsgLy8gQ29udmVydCBlYWNoIGVsZW1lbnQgaW4gdGhlIGFycmF5IHRvIHN0cmluZ1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTsgLy8gQ29udmVydCB0aGUgc2luZ2xlIHZhbHVlIHRvIHN0cmluZ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydENoZWNraW5nKCk6IHZvaWQge1xuICAgIC8vIGJlY2F1c2UgdGhlIHBjaSBkb2Vzbid0IGhhdmUgYSBtZXRob2QgdG8gY2hlY2sgZm9yIGNoYW5nZXMgd2UnbGwgdXNlIGFuIGludGVydmFsXG4gICAgLy8gdG8gY2hlY2sgaWYgdGhlIHJlc3BvbnNlIGhhcyBjaGFuZ2VkLiBJZiBjaGFuZ2VkIHdlJ2xsIHNhdmUgdGhlIHJlc3BvbnNlXG4gICAgdGhpcy5pbnRlcnZhbElkID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLnBjaS5nZXRSZXNwb25zZSgpO1xuICAgICAgY29uc3QgbmV3UmVzcG9uc2UgPSB0aGlzLnBjaS5nZXRSZXNwb25zZSgpO1xuICAgICAgY29uc3Qgc3RyaW5naWZpZWQgPSBKU09OLnN0cmluZ2lmeShyZXNwb25zZSk7XG4gICAgICBpZiAoc3RyaW5naWZpZWQgIT09IHRoaXMucmF3UmVzcG9uc2UpIHtcbiAgICAgICAgdGhpcy5yYXdSZXNwb25zZSA9IHN0cmluZ2lmaWVkO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuY29udmVydFF0aVZhcmlhYmxlSlNPTihuZXdSZXNwb25zZSk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodmFsdWUpO1xuICAgICAgfVxuICAgIH0sIDIwMCk7XG4gIH1cblxuICBwcml2YXRlIHN0b3BDaGVja2luZygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbnRlcnZhbElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbElkKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTsgLy8gRk9SIE5PV1xuICB9XG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgLy8gT25seSBzZXQgc3RhdGUgaXMgc3VwcG9ydGVkIGluIGEgUENJXG4gIH1cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5yYXdSZXNwb25zZTtcbiAgfVxuXG4gIGdldFRBT0NvbmZpZyhub2RlKSB7XG4gICAgY29uc3QgYSA9IG5vZGUucXVlcnlTZWxlY3RvckFsbCgncHJvcGVydGllcycpO1xuICAgIGxldCBjb25maWcgPSB7fTtcblxuICAgIGNvbnN0IGdldFByb3BlcnR5VmFsdWUgPSBlbCA9PiB7XG4gICAgICBjb25zdCBwcm9wZXJ0eSA9IHt9O1xuICAgICAgY29uc3Qga2V5ID0gZWwuZ2V0QXR0cmlidXRlKCdrZXknKTtcbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKGVsLmNoaWxkcmVuKTtcbiAgICAgICAgY29uc3QgYWxsS2V5ID0gY2hpbGRyZW4ubWFwKChjOiBIVE1MRWxlbWVudCkgPT4gYy5nZXRBdHRyaWJ1dGUoJ2tleScpKTtcbiAgICAgICAgY29uc3QgaXNBcnJheSA9IGFsbEtleS5sZW5ndGggPiAwICYmICFhbGxLZXkuZmluZChrID0+ICFOdW1iZXIuaXNJbnRlZ2VyKCtrKSk7XG4gICAgICAgIGlmIChpc0FycmF5KSB7XG4gICAgICAgICAgcHJvcGVydHlba2V5XSA9IGNoaWxkcmVuLm1hcChjID0+IGdldENoaWxkUHJvcGVydGllcyhjKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcGVydHlba2V5XSA9IGVsLnRleHRDb250ZW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvcGVydHk7XG4gICAgfTtcblxuICAgIGNvbnN0IGdldENoaWxkUHJvcGVydGllcyA9IChlbCk6IHt9IHwgdm9pZCA9PiB7XG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgbGV0IHByb3BlcnRpZXMgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBlbC5jaGlsZHJlbikge1xuICAgICAgICAgIHByb3BlcnRpZXMgPSB7IC4uLnByb3BlcnRpZXMsIC4uLmdldFByb3BlcnR5VmFsdWUoY2hpbGQpIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgcHJvcGVydGllcyBvZiBhKSB7XG4gICAgICBjb25zdCBrZXkgPSBwcm9wZXJ0aWVzLmdldEF0dHJpYnV0ZSgna2V5Jyk7XG4gICAgICBpZiAoIWtleSkge1xuICAgICAgICBjb25maWcgPSB7IC4uLmNvbmZpZywgLi4uZ2V0Q2hpbGRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZygnQ2FuIG5vdCBmaW5kIHF0aS1jdXN0b20taW50ZXJhY3Rpb24gY29uZmlnJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZWdpc3RlcihwY2k6IElNU3BjaTx1bmtub3duPikge1xuICAgIHRoaXMucGNpID0gcGNpO1xuXG4gICAgY29uc3QgdHlwZSA9IHRoaXMucGFyZW50RWxlbWVudC50YWdOYW1lID09PSAnUVRJLUNVU1RPTS1JTlRFUkFDVElPTicgPyAnVEFPJyA6ICdJTVMnO1xuICAgIGNvbnN0IGRvbTogSFRNTEVsZW1lbnQgPVxuICAgICAgdHlwZSA9PSAnSU1TJyA/IHRoaXMucXVlcnlTZWxlY3RvcigncXRpLWludGVyYWN0aW9uLW1hcmt1cCcpIDogdGhpcy5xdWVyeVNlbGVjdG9yKCdtYXJrdXAnKTtcbiAgICBkb20uY2xhc3NMaXN0LmFkZCgncXRpLWN1c3RvbUludGVyYWN0aW9uJyk7XG5cbiAgICBpZiAodHlwZSA9PSAnVEFPJyAmJiB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3Byb3BlcnRpZXMnKSkge1xuICAgICAgKHRoaXMucXVlcnlTZWxlY3RvcigncHJvcGVydGllcycpIGFzIEhUTUxFbGVtZW50KS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZzogYW55ID1cbiAgICAgIHR5cGUgPT0gJ0lNUydcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB0aGlzLmRhdGFzZXQsXG4gICAgICAgICAgICBvbnJlYWR5OiAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdvbnJlYWR5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA6IHRoaXMuZ2V0VEFPQ29uZmlnKHRoaXMpO1xuICAgIGlmICh0eXBlID09ICdJTVMnKSB7XG4gICAgICBwY2kuZ2V0SW5zdGFuY2UoZG9tLCBjb25maWcsIHVuZGVmaW5lZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIChwY2kgYXMgYW55KS5pbml0aWFsaXplKHRoaXMuY3VzdG9tSW50ZXJhY3Rpb25UeXBlSWRlbnRpZmllciwgZG9tLmZpcnN0RWxlbWVudENoaWxkLCBjb25maWcpO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PSAnVEFPJykge1xuICAgICAgY29uc3QgbGlua3MgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgnbGluaycpKS5tYXAoYWNjID0+IGFjYy5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSk7XG4gICAgICBsaW5rcy5mb3JFYWNoKGxpbmsgPT4ge1xuICAgICAgICBjb25zdCBzdHlsZXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgIHN0eWxlcy5yZWwgPSAnc3R5bGVzaGVldCc7XG4gICAgICAgIHN0eWxlcy50eXBlID0gJ3RleHQvY3NzJztcbiAgICAgICAgc3R5bGVzLm1lZGlhID0gJ3NjcmVlbic7XG4gICAgICAgIHN0eWxlcy5ocmVmID0gbGluaztcbiAgICAgICAgZG9tLmFwcGVuZENoaWxkKHN0eWxlcyk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5zdGFydENoZWNraW5nKCk7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgZGVmaW5lKCdxdGlDdXN0b21JbnRlcmFjdGlvbkNvbnRleHQnLCAoKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZWdpc3RlcjogY3R4QSA9PiB7XG4gICAgICAgICAgdGhpcy5yZWdpc3RlcihjdHhBKTtcbiAgICAgICAgfSxcbiAgICAgICAgbm90aWZ5UmVhZHk6ICgpID0+IHtcbiAgICAgICAgICAvKiBvbmx5IHVzZWQgaW4gdGhlIFRBTyB2ZXJzaW9uICovXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmJ1aWxkUmVxdWlyZUNvbmZpZygpO1xuICAgIGNvbnN0IHJlcXVpcmVQQ0kgPSByZXF1aXJlanMuY29uZmlnKGNvbmZpZyk7XG4gICAgcmVxdWlyZVBDSShbJ3JlcXVpcmUnXSwgcmVxdWlyZSA9PiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWR5bmFtaWMtcmVxdWlyZVxuICAgICAgcmVxdWlyZShbdGhpcy5tb2R1bGVdKTtcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgcmVxdWlyZWpzLnVuZGVmKHRoaXMuY3VzdG9tSW50ZXJhY3Rpb25UeXBlSWRlbnRpZmllcik7XG4gICAgLy8gQ2xlYXIgdGhlIG1vZHVsZXMgaW4gdGhlIGNvbnRleHRcbiAgICBjb25zdCBjb250ZXh0ID0gcmVxdWlyZWpzLnMuY29udGV4dHM7XG4gICAgZGVsZXRlIGNvbnRleHRbdGhpcy5jdXN0b21JbnRlcmFjdGlvblR5cGVJZGVudGlmaWVyXTtcbiAgICB0aGlzLnN0b3BDaGVja2luZygpO1xuICB9XG5cbiAgYnVpbGRSZXF1aXJlQ29uZmlnKCkge1xuICAgIC8vIFNldCBSZXF1aXJlSlMgcGF0aHMgYW5kIHNoaW0gY29uZmlndXJhdGlvbiBpZiBhdmFpbGFibGVcbiAgICBjb25zdCBjb25maWc6IE1vZHVsZVJlc29sdXRpb25Db25maWcgPSB7XG4gICAgICBjb250ZXh0OiB0aGlzLmN1c3RvbUludGVyYWN0aW9uVHlwZUlkZW50aWZpZXIsXG4gICAgICBjYXRjaEVycm9yOiB0cnVlLFxuICAgICAgcGF0aHM6IHdpbmRvd1sncmVxdWlyZVBhdGhzJ10gfHwge30sXG4gICAgICBzaGltOiB3aW5kb3dbJ3JlcXVpcmVTaGltJ10gfHwge31cbiAgICB9O1xuICAgIC8vIENoZWNrIGlmIFJlcXVpcmVKUyBpcyBhdmFpbGFibGUsIGlmIG5vdCwgc2V0IGFuIGVycm9yIG1lc3NhZ2VcbiAgICBpZiAoIWdsb2JhbFRoaXMucmVxdWlyZSkge1xuICAgICAgdGhpcy5fZXJyb3JNZXNzYWdlID0gYFJlcXVpcmVKUyBub3QgZm91bmQuIFBsZWFzZSBsb2FkIGl0IHZpYSBDRE46IGh0dHBzOi8vY2RuanMuY29tL2xpYnJhcmllcy9yZXF1aXJlLmpzYDtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBiYXNlVXJsID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2RhdGEtYmFzZS11cmwnKTtcbiAgICBjb25zdCBpbnRlcmFjdGlvbk1vZHVsZXMgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3F0aS1pbnRlcmFjdGlvbi1tb2R1bGVzJyk7XG5cbiAgICBpZiAoaW50ZXJhY3Rpb25Nb2R1bGVzKSB7XG4gICAgICBjb25zdCBtb2R1bGVzID0gaW50ZXJhY3Rpb25Nb2R1bGVzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1pbnRlcmFjdGlvbi1tb2R1bGUnKTtcbiAgICAgIGZvciAoY29uc3QgbW9kdWxlIG9mIG1vZHVsZXMpIHtcbiAgICAgICAgY29uc3QgbW9kdWxlSWQgPSBtb2R1bGUuZ2V0QXR0cmlidXRlKCdpZCcpO1xuICAgICAgICBjb25zdCBwcmltYXJ5UGF0aCA9IG1vZHVsZS5nZXRBdHRyaWJ1dGUoJ3ByaW1hcnktcGF0aCcpO1xuICAgICAgICBjb25zdCBmYWxsYmFja1BhdGggPSBtb2R1bGUuZ2V0QXR0cmlidXRlKCdmYWxsYmFjay1wYXRoJyk7XG5cbiAgICAgICAgaWYgKG1vZHVsZUlkICYmIHByaW1hcnlQYXRoKSB7XG4gICAgICAgICAgLy8gU2V0IHRoZSBwYXRocyB1c2luZyBSZXF1aXJlSlMncyBmYWxsYmFjayBhcnJheVxuICAgICAgICAgIGNvbnN0IHBhdGhzID0gZmFsbGJhY2tQYXRoXG4gICAgICAgICAgICA/IHRoaXMuY29tYmluZVJlcXVpcmVSZXNvbHZlUGF0aHMoXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRSZXNvbHZhYmxlUGF0aChwcmltYXJ5UGF0aCwgYmFzZVVybCksXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRSZXNvbHZhYmxlUGF0aChmYWxsYmFja1BhdGgsIGJhc2VVcmwpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogdGhpcy5nZXRSZXNvbHZhYmxlUGF0aChwcmltYXJ5UGF0aCwgYmFzZVVybCk7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdQYXRoID0gY29uZmlnLnBhdGhzW21vZHVsZUlkXSB8fCBbXTtcbiAgICAgICAgICBjb25maWcucGF0aHNbbW9kdWxlSWRdID0gdGhpcy5jb21iaW5lUmVxdWlyZVJlc29sdmVQYXRocyhleGlzdGluZ1BhdGgsIHBhdGhzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21iaW5lUmVxdWlyZVJlc29sdmVQYXRocyhwYXRoMTogc3RyaW5nIHwgc3RyaW5nW10sIHBhdGgyOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHBhdGgxQXJyYXkgPSBBcnJheS5pc0FycmF5KHBhdGgxKSA/IHBhdGgxIDogW3BhdGgxXTtcbiAgICBjb25zdCBwYXRoMkFycmF5ID0gQXJyYXkuaXNBcnJheShwYXRoMikgPyBwYXRoMiA6IFtwYXRoMl07XG4gICAgcmV0dXJuIHBhdGgxQXJyYXkuY29uY2F0KHBhdGgyQXJyYXkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVEb3VibGVTbGFzaGVzKHN0cjogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2luZ2xlRm9yd2FyZFNsYXNoZXMgPSBzdHJcbiAgICAgIC5yZXBsYWNlKC8oW146XVxcLylcXC8rL2csICckMScpXG4gICAgICAucmVwbGFjZSgvXFwvXFwvL2csICcvJylcbiAgICAgIC5yZXBsYWNlKCdodHRwOi8nLCAnaHR0cDovLycpXG4gICAgICAucmVwbGFjZSgnaHR0cHM6LycsICdodHRwczovLycpO1xuICAgIHJldHVybiBzaW5nbGVGb3J3YXJkU2xhc2hlcztcbiAgfVxuXG4gIGxvYWRDb25maWcgPSBhc3luYyAodXJsOiBzdHJpbmcsIGJhc2VVcmw/OiBzdHJpbmcpOiBQcm9taXNlPE1vZHVsZVJlc29sdXRpb25Db25maWc+ID0+IHtcbiAgICB1cmwgPSB0aGlzLnJlbW92ZURvdWJsZVNsYXNoZXModXJsKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVxdWlyZUNvbmZpZyA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICBpZiAocmVxdWlyZUNvbmZpZy5vaykge1xuICAgICAgICBjb25zdCBjb25maWcgPSBhd2FpdCByZXF1aXJlQ29uZmlnLmpzb24oKTtcbiAgICAgICAgY29uc3QgbW9kdWxlQ29uZyA9IGNvbmZpZyBhcyBNb2R1bGVSZXNvbHV0aW9uQ29uZmlnO1xuICAgICAgICBmb3IgKGNvbnN0IG1vZHVsZUlkIGluIG1vZHVsZUNvbmcucGF0aHMpIHtcbiAgICAgICAgICBpZiAoYmFzZVVybCkge1xuICAgICAgICAgICAgbW9kdWxlQ29uZy5wYXRoc1ttb2R1bGVJZF0gPSB0aGlzLmdldFJlc29sdmFibGVQYXRoKG1vZHVsZUNvbmcucGF0aHNbbW9kdWxlSWRdLCBiYXNlVXJsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1vZHVsZUNvbmc7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICBnZXRSZXNvbHZhYmxlUGF0aFN0cmluZyA9IChwYXRoOiBzdHJpbmcsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiB7XG4gICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFwuanMkLywgJycpO1xuICAgIHJldHVybiBwYXRoPy50b0xvY2FsZUxvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ2h0dHAnKSB8fCAhYmFzZVBhdGhcbiAgICAgID8gcGF0aFxuICAgICAgOiB0aGlzLnJlbW92ZURvdWJsZVNsYXNoZXMoYCR7YmFzZVBhdGh9LyR7cGF0aH1gKTtcbiAgfTtcblxuICBnZXRSZXNvbHZhYmxlUGF0aCA9IChwYXRoOiBzdHJpbmcgfCBzdHJpbmdbXSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShwYXRoKVxuICAgICAgPyBwYXRoLm1hcChwID0+IHRoaXMuZ2V0UmVzb2x2YWJsZVBhdGhTdHJpbmcocCwgYmFzZVBhdGgpKVxuICAgICAgOiB0aGlzLmdldFJlc29sdmFibGVQYXRoU3RyaW5nKHBhdGgsIGJhc2VQYXRoKTtcbiAgfTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PiR7dGhpcy5fZXJyb3JNZXNzYWdlICYmXG4gICAgICBodG1sYDxkaXYgc3R5bGU9XCJjb2xvcjpyZWRcIj5cbiAgICAgICAgPGgxPkVycm9yPC9oMT5cbiAgICAgICAgJHt0aGlzLl9lcnJvck1lc3NhZ2V9XG4gICAgICA8L2Rpdj5gfWA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXBvcnRhYmxlLWN1c3RvbS1pbnRlcmFjdGlvbic6IFF0aVBvcnRhYmxlQ3VzdG9tSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBDU1NSZXN1bHRHcm91cCwgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5cbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvZHJhZy1kcm9wJztcbmltcG9ydCB7IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2UgfSBmcm9tICcuLi9xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi9xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uLnN0eWxlcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbkBjdXN0b21FbGVtZW50KCdxdGktYXNzb2NpYXRlLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlBc3NvY2lhdGVJbnRlcmFjdGlvbiBleHRlbmRzIERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbihcbiAgSW50ZXJhY3Rpb24sXG4gICdxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJyxcbiAgdHJ1ZSxcbiAgJy5kbCdcbikge1xuICBAc3RhdGUoKSBwcml2YXRlIF9jaGlsZHJlbk1hcDogRWxlbWVudFtdID0gW107XG5cbiAgc3RhdGljIHN0eWxlczogQ1NTUmVzdWx0R3JvdXAgPSBzdHlsZXM7XG4gIC8vIGRyYWdEcm9wQXBpOiBUb3VjaERyYWdBbmREcm9wO1xuXG4gIHByaXZhdGUgX3JlZ2lzdGVyQ2hvaWNlSGFuZGxlcjogKGV2ZW50OiBDdXN0b21FdmVudCkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX3JlZ2lzdGVyQ2hvaWNlSGFuZGxlciA9IHRoaXMuX3JlZ2lzdGVyQ2hvaWNlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdyZWdpc3Rlci1xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJywgdGhpcy5fcmVnaXN0ZXJDaG9pY2VIYW5kbGVyKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlZ2lzdGVyQ2hvaWNlKGV2ZW50OiBDdXN0b21FdmVudCkge1xuICAgIGNvbnN0IGNob2ljZSA9IGV2ZW50LnRhcmdldCBhcyBRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlO1xuICAgIHRoaXMuX2NoaWxkcmVuTWFwLnB1c2goY2hvaWNlKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDxzbG90IG5hbWU9XCJxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlXCI+PC9zbG90PlxuICAgICAgPGRpdiBwYXJ0PVwiZHJvcC1jb250YWluZXJcIj5cbiAgICAgICAgJHt0aGlzLl9jaGlsZHJlbk1hcC5sZW5ndGggPiAwICYmXG4gICAgICAgIEFycmF5LmZyb20oQXJyYXkoTWF0aC5jZWlsKHRoaXMuX2NoaWxkcmVuTWFwLmxlbmd0aCAvIDIpKS5rZXlzKCkpLm1hcChcbiAgICAgICAgICAoXywgaW5kZXgpID0+XG4gICAgICAgICAgICBodG1sYDxkaXYgcGFydD1cImFzc29jaWFibGVzLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICA8ZGl2IG5hbWU9XCJsZWZ0JHtpbmRleH1cIiBwYXJ0PVwiZHJvcC1saXN0XCIgY2xhc3M9XCJkbFwiIGlkZW50aWZpZXI9XCJkcm9wbGlzdCR7aW5kZXh9X2xlZnRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBuYW1lPVwicmlnaHQke2luZGV4fVwiIHBhcnQ9XCJkcm9wLWxpc3RcIiBjbGFzcz1cImRsXCIgaWRlbnRpZmllcj1cImRyb3BsaXN0JHtpbmRleH1fcmlnaHRcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PmBcbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PmA7XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVnaXN0ZXItcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZScsIHRoaXMuX3JlZ2lzdGVyQ2hvaWNlSGFuZGxlcik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic6IFF0aUFzc29jaWF0ZUludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiZXhwb3J0IGNsYXNzIFRvdWNoRHJhZ0FuZERyb3Age1xuICBwcml2YXRlIHRvdWNoU3RhcnRUaW1lID0gMDsgLy8gVGltZXN0YW1wIG9mIHRoZSBmaXJzdCB0b3VjaFxuICBwcml2YXRlIHRvdWNoU3RhcnRQb2ludCA9IG51bGw7IC8vIFBvaW50IG9mIHRoZSBmaXJzdCB0b3VjaFxuICBwcml2YXRlIGxhc3RDbGlja1RpbWUgPSAwOyAvLyBUaW1lc3RhbXAgb2YgdGhlIHByZXZpb3VzIGNsaWNrXG4gIHByaXZhdGUgaXNEcmFnZ2FibGUgPSBmYWxzZTsgLy8gV2hldGhlciBhIGRyYWdnYWJsZSBlbGVtZW50IGlzIGFjdGl2ZVxuICBwcml2YXRlIGRyYWdTb3VyY2U6IEhUTUxFbGVtZW50ID0gbnVsbDsgLy8gVGhlIHNvdXJjZSBlbGVtZW50IGJlaW5nIGRyYWdnZWRcbiAgcHJpdmF0ZSBkcmFnQ2xvbmU6IEhUTUxFbGVtZW50ID0gbnVsbDsgLy8gQ2xvbmUgb2YgZHJhZyBzb3VyY2UgZm9yIHZpc3VhbCBmZWVkYmFja1xuICBwcml2YXRlIHRvdWNoRW5kVHJpZ2dlcmVkID0gZmFsc2U7IC8vIEZsYWcgZm9yIHRvdWNoRW5kIGV2ZW50XG4gIHByaXZhdGUgaXNEcmFnZ2luZyA9IGZhbHNlOyAvLyBXaGV0aGVyIGEgZHJhZyBvcGVyYXRpb24gaXMgb25nb2luZ1xuICBwcml2YXRlIGluaXRpYWxUcmFuc2Zvcm0gPSAnJzsgLy8gT3JpZ2luYWwgdHJhbnNmb3JtIHN0eWxlXG4gIHByaXZhdGUgaGFzRGlzcGF0Y2hlZERyYWdTdGFydCA9IGZhbHNlOyAvLyBGbGFnIHRvIGVuc3VyZSBkcmFnc3RhcnQgZXZlbnQgaXMgZGlzcGF0Y2hlZCBvbmNlXG4gIHByaXZhdGUgcm9vdE5vZGU6IE5vZGUgPSBudWxsOyAvLyBSb290IG5vZGUgZm9yIGJvdW5kYXJ5IGNhbGN1bGF0aW9uc1xuXG4gIHByaXZhdGUgZm9jdXNlZEVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gbnVsbDsgLy8gVG8ga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudGx5IGZvY3VzZWQgZHJhZ2dhYmxlIGVsZW1lbnRcbiAgcHJpdmF0ZSBmb2N1c2FibGVEcm9wWm9uZXM6IEhUTUxFbGVtZW50W10gPSBbXTsgLy8gQWxsIGRyb3B6b25lcyBmb3Iga2V5Ym9hcmQgbmF2aWdhdGlvblxuICBwcml2YXRlIGN1cnJlbnREcm9wWm9uZUluZGV4ID0gLTE7IC8vIEluZGV4IGZvciB0YWJiaW5nIHRocm91Z2ggZHJvcCB6b25lc1xuXG4gIHByaXZhdGUgZGF0YVRyYW5zZmVyID0ge1xuICAgIGRhdGE6IHt9LFxuICAgIHNldERhdGEodHlwZSwgdmFsKSB7XG4gICAgICB0aGlzLmRhdGFbdHlwZV0gPSB2YWw7XG4gICAgfSxcbiAgICBnZXREYXRhKHR5cGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFbdHlwZV07XG4gICAgfSxcbiAgICBlZmZlY3RBbGxvd2VkOiAnbW92ZSdcbiAgfTtcbiAgcHJpdmF0ZSBjbG9uZU9mZnNldCA9IHsgeDogMCwgeTogMCB9OyAvLyBPZmZzZXQgZm9yIHBvc2l0aW9uaW5nIHRoZSBkcmFnIGNsb25lXG5cbiAgcHJpdmF0ZSBsYXN0VGFyZ2V0ID0gbnVsbDsgLy8gTGFzdCB0b3VjaCB0YXJnZXRcbiAgcHJpdmF0ZSBjdXJyZW50RHJvcFRhcmdldCA9IG51bGw7IC8vIEN1cnJlbnQgZHJvcHBhYmxlIGVsZW1lbnRcbiAgcHJpdmF0ZSBhbGxvd0NsaWNrID0gdHJ1ZTsgLy8gRmxhZyB0byBhbGxvdyBvciBwcmV2ZW50IGNsaWNrXG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBUb3VjaERyYWdBbmREcm9wO1xuXG4gIGNvcHlTdHlsZXNGb3JEcmFnQ2xvbmUgPSB0cnVlO1xuICBkcmFnT25DbGlja0VuYWJsZWQgPSBmYWxzZTtcbiAgdXNlRHJhZ0Nsb25lID0gZmFsc2U7IC8vIFNldCB0byB0cnVlIHRvIGRyYWcgd2l0aCBhIGNsb25lOyBzZXQgdG8gZmFsc2UgdG8gZHJhZyB0aGUgb3JpZ2luYWwgZWxlbWVudFxuXG4gIHByaXZhdGUgcmVhZG9ubHkgTUlOX0RSQUdfRElTVEFOQ0UgPSA1OyAvLyBNaW5pbXVtIHBpeGVsIG1vdmVtZW50IHRvIHN0YXJ0IGRyYWdnaW5nXG4gIHByaXZhdGUgcmVhZG9ubHkgRFJBR19DTE9ORV9PUEFDSVRZID0gMTsgLy8gT3BhY2l0eSBvZiB0aGUgZHJhZyBjbG9uZSBlbGVtZW50XG4gIGluaXRpYWxUcmFuc2l0aW9uOiBzdHJpbmc7XG4gIC8vIGRyb3BwYWJsZXM6IEVsZW1lbnRbXTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAoVG91Y2hEcmFnQW5kRHJvcC5pbnN0YW5jZSkge1xuICAgICAgcmV0dXJuIFRvdWNoRHJhZ0FuZERyb3AuaW5zdGFuY2U7XG4gICAgfVxuICAgIFRvdWNoRHJhZ0FuZERyb3AuaW5zdGFuY2UgPSB0aGlzO1xuXG4gICAgLy8gQWRkIGV2ZW50IGxpc3RlbmVycyBmb3IgdG91Y2ggYW5kIG1vdXNlIGludGVyYWN0aW9uc1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMuaGFuZGxlVG91Y2hNb3ZlLmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5oYW5kbGVUb3VjaE1vdmUuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuaGFuZGxlVG91Y2hFbmQuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5oYW5kbGVUb3VjaEVuZC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgdGhpcy5oYW5kbGVUb3VjaENhbmNlbC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuaGFuZGxlS2V5RG93bi5iaW5kKHRoaXMpKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMuaGFuZGxlS2V5VXAuYmluZCh0aGlzKSk7XG4gIH1cblxuICBhZGREcmFnZ2FibGVFbGVtZW50cyhkcmFnZ2FibGVzOiBFbGVtZW50W10pIHtcbiAgICBkcmFnZ2FibGVzLmZvckVhY2goZWwgPT4ge1xuICAgICAgZWwuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICcwJyk7IC8vIE1ha2UgZHJhZ2dhYmxlIGVsZW1lbnRzIGZvY3VzYWJsZVxuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCAoKSA9PiAodGhpcy5mb2N1c2VkRWxlbWVudCA9IGVsIGFzIEhUTUxFbGVtZW50KSk7XG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4gKHRoaXMuZm9jdXNlZEVsZW1lbnQgPSBudWxsKSk7XG5cbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLmhhbmRsZVRvdWNoU3RhcnQuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuaGFuZGxlVG91Y2hTdGFydC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gYWRkRHJvcHBhYmxlRWxlbWVudHMoZHJvcHBhYmxlczogRWxlbWVudFtdKSB7XG4gIC8vICAgLy8gdGhpcy5kcm9wcGFibGVzID0gZHJvcHBhYmxlcztcbiAgLy8gICBkcm9wcGFibGVzLmZvckVhY2goZWwgPT4ge1xuICAvLyAgICAgZWwuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICcwJyk7IC8vIE1ha2UgZHJhZ2dhYmxlIGVsZW1lbnRzIGZvY3VzYWJsZVxuICAvLyAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCAoKSA9PiAodGhpcy5mb2N1c2VkRWxlbWVudCA9IGVsIGFzIEhUTUxFbGVtZW50KSk7XG4gIC8vICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4gKHRoaXMuZm9jdXNlZEVsZW1lbnQgPSBudWxsKSk7XG5cbiAgLy8gICAgIC8vIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLmhhbmRsZVRvdWNoU3RhcnQuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgLy8gICAgIC8vIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuaGFuZGxlVG91Y2hTdGFydC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAvLyAgIH0pO1xuICAvLyB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVUb3VjaFN0YXJ0KGUpIHtcbiAgICB0aGlzLnRvdWNoU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCB7IHgsIHkgfSA9IHRoaXMuZ2V0RXZlbnRDb29yZGluYXRlcyhlKTtcbiAgICB0aGlzLnRvdWNoU3RhcnRQb2ludCA9IHsgeCwgeSB9O1xuICAgIHRoaXMuZHJhZ1NvdXJjZSA9IGUuY3VycmVudFRhcmdldDtcbiAgICB0aGlzLmlzRHJhZ2dhYmxlID0gdHJ1ZTtcblxuICAgIC8vIEdldCB0aGUgcm9vdCBub2RlXG4gICAgdGhpcy5yb290Tm9kZSA9IHRoaXMuZHJhZ1NvdXJjZS5nZXRSb290Tm9kZSgpO1xuXG4gICAgaWYgKHRoaXMuZHJhZ09uQ2xpY2tFbmFibGVkKSB7XG4gICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5jcmVhdGVEcmFnQ2xvbmUoZSwgeyBjbGllbnRYOiB4LCBjbGllbnRZOiB5IH0pO1xuICAgIH1cblxuICAgIGlmICghdGhpcy51c2VEcmFnQ2xvbmUpIHtcbiAgICAgIC8vIFNhdmUgaW5pdGlhbCB0cmFuc2Zvcm1cbiAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmRyYWdTb3VyY2UpO1xuICAgICAgdGhpcy5pbml0aWFsVHJhbnNmb3JtID0gY29tcHV0ZWRTdHlsZS50cmFuc2Zvcm0gPT09ICdub25lJyA/ICcnIDogY29tcHV0ZWRTdHlsZS50cmFuc2Zvcm07XG5cbiAgICAgIC8vIFNhdmUgdGhlIG9yaWdpbmFsIHRyYW5zaXRpb24gc3R5bGVcbiAgICAgIHRoaXMuaW5pdGlhbFRyYW5zaXRpb24gPSBjb21wdXRlZFN0eWxlLnRyYW5zaXRpb24gfHwgJyc7XG5cbiAgICAgIC8vIERpc2FibGUgdHJhbnNpdGlvbnNcbiAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS50cmFuc2l0aW9uID0gJ25vbmUnO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgY2xvbmUgb2Zmc2V0XG4gICAgICBjb25zdCByZWN0ID0gdGhpcy5kcmFnU291cmNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdGhpcy5jbG9uZU9mZnNldC54ID0geCAtIHJlY3QubGVmdDtcbiAgICAgIHRoaXMuY2xvbmVPZmZzZXQueSA9IHkgLSByZWN0LnRvcDtcblxuICAgICAgLy8gU2V0IGhpZ2hlciB6LWluZGV4IHRvIGJyaW5nIGl0IG9uIHRvcFxuICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLnpJbmRleCA9ICc5OTk5JztcbiAgICAgIC8vIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnOyAvLyBTbyBpdCBkb2Vzbid0IGJsb2NrIGV2ZW50c1xuICAgICAgdGhpcy5kcmFnU291cmNlLmZvY3VzKCk7XG4gICAgfVxuXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVUb3VjaE1vdmUoZSkge1xuICAgIGlmICh0aGlzLmlzRHJhZ2dhYmxlICYmIHRoaXMuZHJhZ1NvdXJjZSkge1xuICAgICAgY29uc3QgeyB4LCB5IH0gPSB0aGlzLmdldEV2ZW50Q29vcmRpbmF0ZXMoZSk7XG4gICAgICBjb25zdCBjdXJyZW50VG91Y2ggPSB7IGNsaWVudFg6IHgsIGNsaWVudFk6IHkgfTtcblxuICAgICAgaWYgKHRoaXMuY2FsY3VsYXRlRHJhZ0Rpc3RhbmNlKGN1cnJlbnRUb3VjaCkgPj0gdGhpcy5NSU5fRFJBR19ESVNUQU5DRSkge1xuICAgICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJzsgLy8gU28gaXQgZG9lc24ndCBibG9jayBldmVudHNcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jcmVhdGVEcmFnQ2xvbmUoZSwgY3VycmVudFRvdWNoKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURyYWdDbG9uZShlLCBjdXJyZW50VG91Y2g6IHsgY2xpZW50WDogbnVtYmVyOyBjbGllbnRZOiBudW1iZXIgfSkge1xuICAgIGlmICghdGhpcy5pc0RyYWdnaW5nKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy51c2VEcmFnQ2xvbmUpIHtcbiAgICAgIC8vIEV4aXN0aW5nIGNvZGUgZm9yIGNyZWF0aW5nIGFuZCBoYW5kbGluZyB0aGUgZHJhZyBjbG9uZVxuICAgICAgaWYgKCF0aGlzLmRyYWdDbG9uZSkge1xuICAgICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUub3BhY2l0eSA9IHRoaXMuRFJBR19DTE9ORV9PUEFDSVRZLnRvU3RyaW5nKCk7XG4gICAgICAgIHRoaXMuZHJhZ0Nsb25lID0gdGhpcy5kcmFnU291cmNlLmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICBpZiAodGhpcy5jb3B5U3R5bGVzRm9yRHJhZ0Nsb25lKSB7XG4gICAgICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmRyYWdTb3VyY2UpO1xuICAgICAgICAgIGZvciAoY29uc3Qgc3R5bGUgb2YgY29tcHV0ZWRTdHlsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlW3N0eWxlXSA9IGNvbXB1dGVkU3R5bGVzLmdldFByb3BlcnR5VmFsdWUoc3R5bGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1vdmUgdGhlIGRyYWcgY2xvbmUgdG8gdGhlIHJvb3Qgbm9kZVxuICAgICAgICBpZiAodGhpcy5yb290Tm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICAgICAgICAvLyBBcHBlbmQgdG8gdGhlIGhvc3Qgb2YgdGhlIHNoYWRvdyByb290XG4gICAgICAgICAgdGhpcy5yb290Tm9kZS5ob3N0LmFwcGVuZENoaWxkKHRoaXMuZHJhZ0Nsb25lKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJvb3ROb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuZHJhZ0Nsb25lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlQ2xvbmVQb3NpdGlvbihjdXJyZW50VG91Y2gpO1xuICAgICAgICB0aGlzLnNldERyYWdDbG9uZVN0eWxlcyhjdXJyZW50VG91Y2gpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5kcmFnU291cmNlLCAnZHJhZ3N0YXJ0Jyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudXBkYXRlRHJhZ0Nsb25lUG9zaXRpb24oY3VycmVudFRvdWNoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSGFuZGxlIGRyYWdnaW5nIHRoZSBvcmlnaW5hbCBlbGVtZW50IHVzaW5nIENTUyB0cmFuc2Zvcm1zXG4gICAgICBpZiAodGhpcy50b3VjaFN0YXJ0UG9pbnQpIHtcbiAgICAgICAgY29uc3QgZGVsdGFYID0gY3VycmVudFRvdWNoLmNsaWVudFggLSB0aGlzLnRvdWNoU3RhcnRQb2ludC54O1xuICAgICAgICBjb25zdCBkZWx0YVkgPSBjdXJyZW50VG91Y2guY2xpZW50WSAtIHRoaXMudG91Y2hTdGFydFBvaW50Lnk7XG5cbiAgICAgICAgLy8gQXBwbHkgYm91bmRhcmllc1xuICAgICAgICAvLyBjb25zdCB7IGJvdW5kZWREZWx0YVgsIGJvdW5kZWREZWx0YVkgfSA9IHRoaXMuYXBwbHlUcmFuc2Zvcm1Cb3VuZGFyaWVzKGRlbHRhWCwgZGVsdGFZKTtcbiAgICAgICAgLy8gdGhpcy5kcmFnU291cmNlLnN0eWxlLnRyYW5zZm9ybSA9IGAke3RoaXMuaW5pdGlhbFRyYW5zZm9ybX0gdHJhbnNsYXRlKCR7Ym91bmRlZERlbHRhWH1weCwgJHtib3VuZGVkRGVsdGFZfXB4KWA7XG5cbiAgICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLnRyYW5zZm9ybSA9IGAke3RoaXMuaW5pdGlhbFRyYW5zZm9ybX0gdHJhbnNsYXRlKCR7ZGVsdGFYfXB4LCAke2RlbHRhWX1weClgO1xuXG4gICAgICAgIGlmICghdGhpcy5oYXNEaXNwYXRjaGVkRHJhZ1N0YXJ0KSB7XG4gICAgICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMuZHJhZ1NvdXJjZSwgJ2RyYWdzdGFydCcpO1xuICAgICAgICAgIHRoaXMuaGFzRGlzcGF0Y2hlZERyYWdTdGFydCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBkcm9wVGFyZ2V0ID0gdGhpcy5maW5kRHJvcFRhcmdldChlKTtcblxuICAgIGlmIChkcm9wVGFyZ2V0ICE9PSB0aGlzLmxhc3RUYXJnZXQpIHtcbiAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudChkcm9wVGFyZ2V0LCAnZHJhZ2VudGVyJyk7XG4gICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5sYXN0VGFyZ2V0LCAnZHJhZ2xlYXZlJyk7XG4gICAgICB0aGlzLmxhc3RUYXJnZXQgPSBkcm9wVGFyZ2V0O1xuICAgIH1cblxuICAgIHRoaXMuY3VycmVudERyb3BUYXJnZXQgPSBkcm9wVGFyZ2V0O1xuICAgIGlmICh0aGlzLmN1cnJlbnREcm9wVGFyZ2V0KSB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQoZHJvcFRhcmdldCwgJ2RyYWdvdmVyJyk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVRvdWNoRW5kKGUpIHtcbiAgICB0aGlzLnRvdWNoRW5kVHJpZ2dlcmVkID0gdHJ1ZTtcbiAgICB0aGlzLmlzRHJhZ2dhYmxlID0gZmFsc2U7XG4gICAgbGV0IGRyb3BGb3VuZCA9IGZhbHNlO1xuXG4gICAgLy8gY29uc29sZS5sb2coJ2Ryb3BGb3VuZCcsIGRyb3BGb3VuZCk7XG5cbiAgICBpZiAodGhpcy5jdXJyZW50RHJvcFRhcmdldCkge1xuICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMuY3VycmVudERyb3BUYXJnZXQsICdkcm9wJyk7XG4gICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5kcmFnU291cmNlLCAnZHJhZ2VuZCcpO1xuICAgICAgZHJvcEZvdW5kID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNEcmFnZ2luZykge1xuICAgICAgY29uc3QgZHJhZ0VuZEV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdkcmFnZW5kJywgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuICAgICAgZHJhZ0VuZEV2ZW50WydkYXRhVHJhbnNmZXInXSA9IHsgZHJvcEVmZmVjdDogJ25vbmUnIH07XG4gICAgICB0aGlzLmRyYWdTb3VyY2U/LmRpc3BhdGNoRXZlbnQoZHJhZ0VuZEV2ZW50KTtcbiAgICB9XG5cbiAgICB0aGlzLnJlc2V0RHJhZ1N0YXRlKGRyb3BGb3VuZCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVRvdWNoQ2FuY2VsKGUpIHtcbiAgICB0aGlzLnJlc2V0RHJhZ1N0YXRlKCk7XG4gIH1cblxuICBwcml2YXRlIGZpbmREcm9wVGFyZ2V0KGV2ZW50KSB7XG4gICAgY29uc3QgeyB4LCB5IH0gPSB0aGlzLmdldEV2ZW50Q29vcmRpbmF0ZXMoZXZlbnQpO1xuICAgIHJldHVybiB0aGlzLmdldERyb3BUYXJnZXRBdFBvaW50KGRvY3VtZW50LCB4LCB5KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RHJvcFRhcmdldEF0UG9pbnQocm9vdDogRG9jdW1lbnRPclNoYWRvd1Jvb3QsIHg6IG51bWJlciwgeTogbnVtYmVyLCBkZXB0aDogbnVtYmVyID0gMCk6IEVsZW1lbnQgfCBudWxsIHtcbiAgICAvLyBMaW1pdCB0aGUgcmVjdXJzaW9uIGRlcHRoXG4gICAgY29uc3QgTUFYX0RFUFRIID0gMjtcbiAgICBpZiAoZGVwdGggPiBNQVhfREVQVEgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSByb290LmVsZW1lbnRGcm9tUG9pbnQoeCwgeSkgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZHJvcHpvbmUnKSkge1xuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLy8gVHJhdmVyc2UgdXAgdGhlIERPTSB0cmVlIHRvIGZpbmQgYW4gYW5jZXN0b3Igd2l0aCAnZHJvcHpvbmUnIGF0dHJpYnV0ZVxuICAgIGxldCBjdXJyZW50RWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICB3aGlsZSAoY3VycmVudEVsZW1lbnQpIHtcbiAgICAgIGlmIChjdXJyZW50RWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Ryb3B6b25lJykpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRFbGVtZW50O1xuICAgICAgfVxuICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBlbGVtZW50IGhhcyBhIFNoYWRvdyBET00gYW5kIGRlcHRoIGxpbWl0IG5vdCByZWFjaGVkLCB0cmF2ZXJzZSBpdFxuICAgIGlmIChlbGVtZW50LnNoYWRvd1Jvb3QgJiYgZGVwdGggPCBNQVhfREVQVEgpIHtcbiAgICAgIGNvbnN0IHNoYWRvd0VsZW1lbnQgPSB0aGlzLmdldERyb3BUYXJnZXRBdFBvaW50KGVsZW1lbnQuc2hhZG93Um9vdCwgeCwgeSwgZGVwdGggKyAxKTtcbiAgICAgIGlmIChzaGFkb3dFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBzaGFkb3dFbGVtZW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE5vIGVsZW1lbnQgd2l0aCAnZHJvcHpvbmUnIGZvdW5kXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUtleURvd24oZTogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmICh0aGlzLmZvY3VzZWRFbGVtZW50KSB7XG4gICAgICBpZiAoZS5rZXkgPT09ICcgJyAmJiAhdGhpcy5pc0RyYWdnaW5nKSB7XG4gICAgICAgIC8vIFNwYWNlYmFyIHByZXNzZWQgdG8gc3RhcnQgZHJhZ2dpbmdcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmlzRHJhZ2dhYmxlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kcmFnU291cmNlID0gdGhpcy5mb2N1c2VkRWxlbWVudDtcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTtcblxuICAgICAgICAvLyBTdG9yZSB0aGUgZHJvcCB6b25lcyBmb3IgbmF2aWdhdGlvblxuICAgICAgICB0aGlzLmNvbGxlY3REcm9wWm9uZXMoKTtcblxuICAgICAgICAvLyBUcmlnZ2VyIGRyYWdzdGFydCBldmVudFxuICAgICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5kcmFnU291cmNlLCAnZHJhZ3N0YXJ0Jyk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnVGFiJyAmJiB0aGlzLmlzRHJhZ2dpbmcpIHtcbiAgICAgICAgLy8gVGFiIGtleSB0byBuYXZpZ2F0ZSB0aHJvdWdoIGRyb3Agem9uZXNcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLm1vdmVUb05leHREcm9wWm9uZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlS2V5VXAoZTogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmIChlLmtleSA9PT0gJyAnICYmIHRoaXMuaXNEcmFnZ2luZyAmJiB0aGlzLmN1cnJlbnREcm9wVGFyZ2V0KSB7XG4gICAgICAvLyBTcGFjZWJhciBwcmVzc2VkIGFnYWluIHRvIGRyb3AgdGhlIGVsZW1lbnRcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLmN1cnJlbnREcm9wVGFyZ2V0LCAnZHJvcCcpO1xuICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMuZHJhZ1NvdXJjZSwgJ2RyYWdlbmQnKTtcbiAgICAgIHRoaXMucmVzZXREcmFnU3RhdGUodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb2xsZWN0RHJvcFpvbmVzKCkge1xuICAgIC8vIENvbGxlY3QgYWxsIGVsZW1lbnRzIHdpdGggZHJvcHpvbmUgYXR0cmlidXRlXG4gICAgdGhpcy5mb2N1c2FibGVEcm9wWm9uZXMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkcm9wem9uZV0nKSkgYXMgSFRNTEVsZW1lbnRbXTsgLy8gQXJyYXkuZnJvbSh0aGlzLmRyb3BwYWJsZXMpO1xuICAgIHRoaXMuY3VycmVudERyb3Bab25lSW5kZXggPSAtMTsgLy8gUmVzZXQgbmF2aWdhdGlvbiBpbmRleFxuICB9XG5cbiAgcHJpdmF0ZSBtb3ZlVG9OZXh0RHJvcFpvbmUoKSB7XG4gICAgaWYgKHRoaXMuZm9jdXNhYmxlRHJvcFpvbmVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgLy8gVXBkYXRlIGluZGV4IGZvciB0aGUgbmV4dCBkcm9wIHpvbmVcbiAgICB0aGlzLmN1cnJlbnREcm9wWm9uZUluZGV4ID0gKHRoaXMuY3VycmVudERyb3Bab25lSW5kZXggKyAxKSAlIHRoaXMuZm9jdXNhYmxlRHJvcFpvbmVzLmxlbmd0aDtcblxuICAgIC8vIEZvY3VzIHRoZSBuZXh0IGRyb3Agem9uZVxuICAgIGNvbnN0IG5leHREcm9wWm9uZSA9IHRoaXMuZm9jdXNhYmxlRHJvcFpvbmVzW3RoaXMuY3VycmVudERyb3Bab25lSW5kZXhdO1xuICAgIG5leHREcm9wWm9uZS5mb2N1cygpO1xuXG4gICAgLy8gVXBkYXRlIGN1cnJlbnQgZHJvcCB0YXJnZXRcbiAgICB0aGlzLmN1cnJlbnREcm9wVGFyZ2V0ID0gbmV4dERyb3Bab25lO1xuXG4gICAgLy8gRGlzcGF0Y2ggZHJhZ2VudGVyIGV2ZW50XG4gICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KG5leHREcm9wWm9uZSwgJ2RyYWdlbnRlcicpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFdmVudENvb3JkaW5hdGVzKGV2ZW50LCBwYWdlID0gZmFsc2UpIHtcbiAgICBjb25zdCB0b3VjaCA9IGV2ZW50LnRvdWNoZXMgPyBldmVudC50b3VjaGVzWzBdIDogZXZlbnQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHBhZ2UgPyB0b3VjaC5wYWdlWCA6IHRvdWNoLmNsaWVudFgsXG4gICAgICB5OiBwYWdlID8gdG91Y2gucGFnZVkgOiB0b3VjaC5jbGllbnRZXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlQ2xvbmVQb3NpdGlvbih0b3VjaCkge1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLmRyYWdTb3VyY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdGhpcy5jbG9uZU9mZnNldC54ID0gdG91Y2guY2xpZW50WCAtIHJlY3QubGVmdDtcbiAgICB0aGlzLmNsb25lT2Zmc2V0LnkgPSB0b3VjaC5jbGllbnRZIC0gcmVjdC50b3A7XG4gIH1cblxuICBwcml2YXRlIHNldERyYWdDbG9uZVN0eWxlcyh0b3VjaCkge1xuICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcbiAgICB0aGlzLmRyYWdDbG9uZS5zdHlsZS50b3AgPSBgJHt0b3VjaC5jbGllbnRZIC0gdGhpcy5jbG9uZU9mZnNldC55fXB4YDtcbiAgICB0aGlzLmRyYWdDbG9uZS5zdHlsZS5sZWZ0ID0gYCR7dG91Y2guY2xpZW50WCAtIHRoaXMuY2xvbmVPZmZzZXQueH1weGA7XG4gICAgdGhpcy5kcmFnQ2xvbmUuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICB0aGlzLmRyYWdDbG9uZS5zdHlsZS56SW5kZXggPSAnOTk5OTk5JztcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRHJhZ0Nsb25lUG9zaXRpb24odG91Y2gpIHtcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMudG91Y2hFbmRUcmlnZ2VyZWQgfHwgIXRoaXMuZHJhZ0Nsb25lKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG5ld0xlZnQgPSB0b3VjaC5jbGllbnRYIC0gdGhpcy5jbG9uZU9mZnNldC54O1xuICAgICAgY29uc3QgbmV3VG9wID0gdG91Y2guY2xpZW50WSAtIHRoaXMuY2xvbmVPZmZzZXQueTtcblxuICAgICAgLy8gQXBwbHkgYm91bmRhcmllc1xuICAgICAgY29uc3QgeyBuZXdMZWZ0OiBib3VuZGVkTGVmdCwgbmV3VG9wOiBib3VuZGVkVG9wIH0gPSB0aGlzLmFwcGx5Qm91bmRhcmllcyhuZXdMZWZ0LCBuZXdUb3AsIHRoaXMuZHJhZ0Nsb25lKTtcblxuICAgICAgdGhpcy5kcmFnQ2xvbmUuc3R5bGUubGVmdCA9IGAke2JvdW5kZWRMZWZ0fXB4YDtcbiAgICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlLnRvcCA9IGAke2JvdW5kZWRUb3B9cHhgO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVRyYW5zZm9ybUJvdW5kYXJpZXMoZGVsdGFYOiBudW1iZXIsIGRlbHRhWTogbnVtYmVyKSB7XG4gICAgLy8gR2V0IHRoZSBib3VuZGFyaWVzIG9mIHRoZSByb290IG5vZGVcbiAgICBsZXQgYm91bmRhcnlSZWN0OiBET01SZWN0O1xuICAgIGlmICh0aGlzLnJvb3ROb2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgYm91bmRhcnlSZWN0ID0gdGhpcy5yb290Tm9kZS5ob3N0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5yb290Tm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7XG4gICAgICBib3VuZGFyeVJlY3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERlZmF1bHQgdG8gdmlld3BvcnRcbiAgICAgIGJvdW5kYXJ5UmVjdCA9IG5ldyBET01SZWN0KDAsIDAsIHdpbmRvdy5pbm5lcldpZHRoLCB3aW5kb3cuaW5uZXJIZWlnaHQpO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgZGltZW5zaW9ucyBhbmQgcG9zaXRpb24gb2YgdGhlIGVsZW1lbnRcbiAgICBjb25zdCBlbGVtZW50UmVjdCA9IHRoaXMuZHJhZ1NvdXJjZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBlbGVtZW50V2lkdGggPSBlbGVtZW50UmVjdC53aWR0aDtcbiAgICBjb25zdCBlbGVtZW50SGVpZ2h0ID0gZWxlbWVudFJlY3QuaGVpZ2h0O1xuXG4gICAgLy8gQ2FsY3VsYXRlIHBvdGVudGlhbCBuZXcgcG9zaXRpb25cbiAgICBjb25zdCBuZXdMZWZ0ID0gZWxlbWVudFJlY3QubGVmdCArIGRlbHRhWDtcbiAgICBjb25zdCBuZXdUb3AgPSBlbGVtZW50UmVjdC50b3AgKyBkZWx0YVk7XG5cbiAgICAvLyBMaW1pdCB0aGUgbmV3IHBvc2l0aW9uIHdpdGhpbiB0aGUgYm91bmRhcmllc1xuICAgIGNvbnN0IGJvdW5kZWRMZWZ0ID0gTWF0aC5tYXgoYm91bmRhcnlSZWN0LmxlZnQsIE1hdGgubWluKG5ld0xlZnQsIGJvdW5kYXJ5UmVjdC5yaWdodCAtIGVsZW1lbnRXaWR0aCkpO1xuICAgIGNvbnN0IGJvdW5kZWRUb3AgPSBNYXRoLm1heChib3VuZGFyeVJlY3QudG9wLCBNYXRoLm1pbihuZXdUb3AsIGJvdW5kYXJ5UmVjdC5ib3R0b20gLSBlbGVtZW50SGVpZ2h0KSk7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGJvdW5kZWQgZGVsdGEgdmFsdWVzXG4gICAgY29uc3QgYm91bmRlZERlbHRhWCA9IGJvdW5kZWRMZWZ0IC0gZWxlbWVudFJlY3QubGVmdDtcbiAgICBjb25zdCBib3VuZGVkRGVsdGFZID0gYm91bmRlZFRvcCAtIGVsZW1lbnRSZWN0LnRvcDtcblxuICAgIHJldHVybiB7IGJvdW5kZWREZWx0YVgsIGJvdW5kZWREZWx0YVkgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlCb3VuZGFyaWVzKG5ld0xlZnQ6IG51bWJlciwgbmV3VG9wOiBudW1iZXIsIGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICAgLy8gR2V0IHRoZSBib3VuZGFyaWVzIG9mIHRoZSByb290IG5vZGVcbiAgICBsZXQgYm91bmRhcnlSZWN0OiBET01SZWN0O1xuICAgIGlmICh0aGlzLnJvb3ROb2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgYm91bmRhcnlSZWN0ID0gdGhpcy5yb290Tm9kZS5ob3N0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5yb290Tm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7XG4gICAgICBib3VuZGFyeVJlY3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERlZmF1bHQgdG8gdmlld3BvcnRcbiAgICAgIGJvdW5kYXJ5UmVjdCA9IG5ldyBET01SZWN0KDAsIDAsIHdpbmRvdy5pbm5lcldpZHRoLCB3aW5kb3cuaW5uZXJIZWlnaHQpO1xuICAgIH1cblxuICAgIC8vIEdldCB0aGUgZGltZW5zaW9ucyBvZiB0aGUgZWxlbWVudFxuICAgIGNvbnN0IGVsZW1lbnRSZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBlbGVtZW50V2lkdGggPSBlbGVtZW50UmVjdC53aWR0aDtcbiAgICBjb25zdCBlbGVtZW50SGVpZ2h0ID0gZWxlbWVudFJlY3QuaGVpZ2h0O1xuXG4gICAgLy8gTGltaXQgdGhlIG5ld0xlZnQgYW5kIG5ld1RvcCB3aXRoaW4gdGhlIGJvdW5kYXJpZXNcbiAgICBjb25zdCBib3VuZGVkTGVmdCA9IE1hdGgubWF4KGJvdW5kYXJ5UmVjdC5sZWZ0LCBNYXRoLm1pbihuZXdMZWZ0LCBib3VuZGFyeVJlY3QucmlnaHQgLSBlbGVtZW50V2lkdGgpKTtcbiAgICBjb25zdCBib3VuZGVkVG9wID0gTWF0aC5tYXgoYm91bmRhcnlSZWN0LnRvcCwgTWF0aC5taW4obmV3VG9wLCBib3VuZGFyeVJlY3QuYm90dG9tIC0gZWxlbWVudEhlaWdodCkpO1xuXG4gICAgcmV0dXJuIHsgbmV3TGVmdDogYm91bmRlZExlZnQsIG5ld1RvcDogYm91bmRlZFRvcCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVEcmFnRGlzdGFuY2UodG91Y2gpOiBudW1iZXIge1xuICAgIGNvbnN0IHhEaXN0ID0gTWF0aC5hYnModG91Y2guY2xpZW50WCAtIHRoaXMudG91Y2hTdGFydFBvaW50LngpO1xuICAgIGNvbnN0IHlEaXN0ID0gTWF0aC5hYnModG91Y2guY2xpZW50WSAtIHRoaXMudG91Y2hTdGFydFBvaW50LnkpO1xuICAgIHJldHVybiB4RGlzdCArIHlEaXN0O1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNwYXRjaEN1c3RvbUV2ZW50KGVsZW1lbnQsIGV2ZW50VHlwZSwgYnViYmxlID0gdHJ1ZSkge1xuICAgIGlmICghZWxlbWVudCkgcmV0dXJuO1xuICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50VHlwZSwgeyBidWJibGVzOiBidWJibGUsIGNhbmNlbGFibGU6IHRydWUgfSk7XG4gICAgZXZlbnRbJ2RhdGFUcmFuc2ZlciddID0gdGhpcy5kYXRhVHJhbnNmZXI7XG4gICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXREcmFnU3RhdGUoZHJvcEZvdW5kOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy5pc0RyYWdnaW5nKSB7XG4gICAgICBpZiAodGhpcy51c2VEcmFnQ2xvbmUpIHtcbiAgICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLm9wYWNpdHkgPSAnMS4wJztcbiAgICAgICAgdGhpcy5kcmFnQ2xvbmU/LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5kcmFnQ2xvbmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmVzdG9yZSBvcmlnaW5hbCBzdHlsZXNcbiAgICAgICAgaWYgKCFkcm9wRm91bmQpIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKDAsIDApJztcbiAgICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLnpJbmRleCA9ICcnO1xuICAgICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUucG9pbnRlckV2ZW50cyA9ICcnO1xuICAgICAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCB0cmFuc2l0aW9uIHN0eWxlXG4gICAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS50cmFuc2l0aW9uID0gdGhpcy5pbml0aWFsVHJhbnNpdGlvbjtcblxuICAgICAgICAvLyBSZXNldCB0aGUgb3JpZ2luYWwgdHJhbnNpdGlvbiBwcm9wZXJ0eVxuICAgICAgICB0aGlzLmluaXRpYWxUcmFuc2l0aW9uID0gJyc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgdGhpcy5kcmFnU291cmNlID0gbnVsbDtcbiAgICB0aGlzLmRyYWdDbG9uZSA9IG51bGw7XG4gICAgdGhpcy5pc0RyYWdnYWJsZSA9IGZhbHNlO1xuICAgIHRoaXMudG91Y2hTdGFydFRpbWUgPSAwO1xuICAgIHRoaXMudG91Y2hTdGFydFBvaW50ID0gbnVsbDtcbiAgICB0aGlzLnRvdWNoRW5kVHJpZ2dlcmVkID0gZmFsc2U7XG4gICAgdGhpcy5kYXRhVHJhbnNmZXIgPSB7XG4gICAgICBkYXRhOiB7fSxcbiAgICAgIHNldERhdGEodHlwZSwgdmFsKSB7XG4gICAgICAgIHRoaXMuZGF0YVt0eXBlXSA9IHZhbDtcbiAgICAgIH0sXG4gICAgICBnZXREYXRhKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVt0eXBlXTtcbiAgICAgIH0sXG4gICAgICBlZmZlY3RBbGxvd2VkOiAnbW92ZSdcbiAgICB9O1xuICAgIHRoaXMuY2xvbmVPZmZzZXQgPSB7IHg6IDAsIHk6IDAgfTtcbiAgICB0aGlzLmxhc3RUYXJnZXQgPSBudWxsO1xuICAgIHRoaXMuY3VycmVudERyb3BUYXJnZXQgPSBudWxsO1xuICAgIHRoaXMuYWxsb3dDbGljayA9IHRydWU7XG4gICAgdGhpcy5pbml0aWFsVHJhbnNmb3JtID0gJyc7XG4gICAgdGhpcy5oYXNEaXNwYXRjaGVkRHJhZ1N0YXJ0ID0gZmFsc2U7XG5cbiAgICB0aGlzLnJvb3ROb2RlID0gbnVsbDtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gYWJzdHJhY3QgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxuZGVjbGFyZSBjbGFzcyBEcm9wcGFibGVzSW50ZXJmYWNlIHt9XG5cbmV4cG9ydCBjb25zdCBEcm9wcGFibGVzTWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPEludGVyYWN0aW9uPj4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4gIHVzZVNoYWRvd1Jvb3Q6IGJvb2xlYW4sXG4gIGRyb3BwYWJsZXNTZWxlY3Rvcjogc3RyaW5nXG4pID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgRHJvcHBhYmxlc0VsZW1lbnQgZXh0ZW5kcyBzdXBlckNsYXNzIHtcbiAgICBwcml2YXRlIG9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyO1xuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiwgcmVmbGVjdDogdHJ1ZSB9KSBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wcyk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuaXNNYXRjaFRhYnVsYXIoKSkgcmV0dXJuO1xuICAgICAgc3VwZXIuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wcyk7XG5cbiAgICAgIGNvbnN0IGRyb3BwYWJsZXMgPSB0aGlzLmdldERyb3BwYWJsZUVsZW1lbnRzKCk7XG4gICAgICB0aGlzLmluaXRpYWxpemVFdmVudEhhbmRsZXJzKCk7XG4gICAgICBkcm9wcGFibGVzLmZvckVhY2goZHJvcHBhYmxlID0+IHtcbiAgICAgICAgdGhpcy5wcmVwYXJlRHJvcHBhYmxlKGRyb3BwYWJsZSk7XG4gICAgICAgIHRoaXMub2JzZXJ2ZURyb3BwYWJsZUF0dHJpYnV0ZXMoZHJvcHBhYmxlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNNYXRjaFRhYnVsYXIoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5jbGFzc0xpc3QuY29udGFpbnMoJ3F0aS1tYXRjaC10YWJ1bGFyJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXREcm9wcGFibGVFbGVtZW50cygpOiBFbGVtZW50W10ge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgICAgIHVzZVNoYWRvd1Jvb3QgPyB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbChkcm9wcGFibGVzU2VsZWN0b3IpIDogdGhpcy5xdWVyeVNlbGVjdG9yQWxsKGRyb3BwYWJsZXNTZWxlY3RvcilcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0aWFsaXplRXZlbnRIYW5kbGVycygpOiB2b2lkIHtcbiAgICAgIHRoaXMuZHJhZ292ZXJIYW5kbGVyID0gdGhpcy5kcmFnb3ZlckhhbmRsZXIuYmluZCh0aGlzKTtcbiAgICAgIHRoaXMuZHJhZ2xlYXZlSGFuZGxlciA9IHRoaXMuZHJhZ2xlYXZlSGFuZGxlci5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy5kcmFnZW50ZXJIYW5kbGVyID0gdGhpcy5kcmFnZW50ZXJIYW5kbGVyLmJpbmQodGhpcyk7XG4gICAgICB0aGlzLmRyb3BIYW5kbGVyID0gdGhpcy5kcm9wSGFuZGxlci5iaW5kKHRoaXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcHJlcGFyZURyb3BwYWJsZShkcm9wcGFibGU6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGRyb3BwYWJsZS5zZXRBdHRyaWJ1dGUoJ2Ryb3B6b25lJywgJ21vdmUnKTtcbiAgICAgIGRyb3BwYWJsZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnbGVhdmUnLCB0aGlzLmRyYWdsZWF2ZUhhbmRsZXIpO1xuICAgICAgdGhpcy5hdHRhY2hFdmVudExpc3RlbmVycyhkcm9wcGFibGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb2JzZXJ2ZURyb3BwYWJsZUF0dHJpYnV0ZXMoZHJvcHBhYmxlOiBFbGVtZW50KTogdm9pZCB7XG4gICAgICB0aGlzLm9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIobXV0YXRpb25zID0+IHtcbiAgICAgICAgbXV0YXRpb25zLmZvckVhY2goKHsgYXR0cmlidXRlTmFtZSB9KSA9PiB7XG4gICAgICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUgPT09ICdkaXNhYmxlZCcpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlRHJvcHBhYmxlSGFuZGxlcnMoZHJvcHBhYmxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUoZHJvcHBhYmxlLCB7IGF0dHJpYnV0ZXM6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b2dnbGVEcm9wcGFibGVIYW5kbGVycyhkcm9wcGFibGU6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGNvbnN0IGRpc2FibGVkID0gZHJvcHBhYmxlLmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXJzKGRyb3BwYWJsZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmF0dGFjaEV2ZW50TGlzdGVuZXJzKGRyb3BwYWJsZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhdHRhY2hFdmVudExpc3RlbmVycyhkcm9wcGFibGU6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGRyb3BwYWJsZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMuZHJhZ292ZXJIYW5kbGVyKTtcbiAgICAgIGRyb3BwYWJsZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW50ZXInLCB0aGlzLmRyYWdlbnRlckhhbmRsZXIpO1xuICAgICAgZHJvcHBhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCB0aGlzLmRyb3BIYW5kbGVyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbW92ZUV2ZW50TGlzdGVuZXJzKGRyb3BwYWJsZTogRWxlbWVudCk6IHZvaWQge1xuICAgICAgZHJvcHBhYmxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5kcmFnb3ZlckhhbmRsZXIpO1xuICAgICAgZHJvcHBhYmxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIHRoaXMuZHJhZ2VudGVySGFuZGxlcik7XG4gICAgICBkcm9wcGFibGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMuZHJvcEhhbmRsZXIpO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuaXNNYXRjaFRhYnVsYXIoKSkgcmV0dXJuO1xuICAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgIHRoaXMub2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRyYWdlbnRlckhhbmRsZXIoZXY6IERyYWdFdmVudCk6IHZvaWQge1xuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRyYWdvdmVySGFuZGxlcihldjogRHJhZ0V2ZW50KTogYm9vbGVhbiB7XG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5hY3RpdmF0ZURyb3BwYWJsZShldi5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgIGV2LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gJ21vdmUnO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWN0aXZhdGVEcm9wcGFibGUoZHJvcHBhYmxlOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgICAgZHJvcHBhYmxlLnNldEF0dHJpYnV0ZSgnYWN0aXZlJywgJycpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZHJvcEhhbmRsZXIoZXY6IERyYWdFdmVudCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IGRyb3BwYWJsZSA9IGV2LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBjb25zdCBpZGVudGlmaWVyID0gZXYuZGF0YVRyYW5zZmVyLmdldERhdGEoJ3RleHQnKTtcbiAgICAgIGNvbnN0IGRyYWdnYWJsZSA9IHRoaXMuZmluZERyYWdnYWJsZShpZGVudGlmaWVyKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuaXNWYWxpZERyb3AoZHJvcHBhYmxlLCBkcmFnZ2FibGUpKTtcblxuICAgICAgaWYgKCFkcmFnZ2FibGUpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChkcmFnZ2FibGUgJiYgIXRoaXMuaXNWYWxpZERyb3AoZHJvcHBhYmxlLCBkcmFnZ2FibGUpKSB7XG4gICAgICAgIGRyYWdnYWJsZS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKDAsIDApJztcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLm1vdmVEcmFnZ2FibGVUb0Ryb3BwYWJsZShkcmFnZ2FibGUsIGRyb3BwYWJsZSk7XG4gICAgICB0aGlzLmRlYWN0aXZhdGVEcm9wcGFibGUoZHJvcHBhYmxlKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmREcmFnZ2FibGUoaWRlbnRpZmllcjogc3RyaW5nKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICAgIGlmICghaWRlbnRpZmllcikgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLnF1ZXJ5U2VsZWN0b3IoYFtpZGVudGlmaWVyPSR7aWRlbnRpZmllcn1dYCkgfHwgdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoYFtpZGVudGlmaWVyPSR7aWRlbnRpZmllcn1dYClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1ZhbGlkRHJvcChkcm9wcGFibGU6IEhUTUxFbGVtZW50LCBkcmFnZ2FibGU6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gZHJhZ2dhYmxlLnBhcmVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgIT09IGRyb3BwYWJsZS5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIG1vdmVEcmFnZ2FibGVUb0Ryb3BwYWJsZShkcmFnZ2FibGU6IEhUTUxFbGVtZW50LCBkcm9wcGFibGU6IEhUTUxFbGVtZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBtb3ZlRWxlbWVudCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgZHJhZ2dhYmxlLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoMCwgMCknO1xuICAgICAgICBkcm9wcGFibGUuYXBwZW5kQ2hpbGQoZHJhZ2dhYmxlKTtcblxuICAgICAgICAvLyBjaGVja01heEFzc29jaWF0aW9ucyBhbmQgc2F2ZVJlc3BvbnNlIGFyZSBkZWZpbmVkL292ZXJyaWRkZW4gaW4gYSBtaXhpblxuICAgICAgICB0aGlzWydjaGVja01heEFzc29jaWF0aW9ucyddKCk7XG4gICAgICAgIHRoaXNbJ3NhdmVSZXNwb25zZSddKG51bGwpOyAvL1xuICAgICAgfTtcblxuICAgICAgaWYgKCFkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKSB7XG4gICAgICAgIG1vdmVFbGVtZW50KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHJhbnNpdGlvbiA9IGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24obW92ZUVsZW1lbnQpO1xuICAgICAgYXdhaXQgdHJhbnNpdGlvbi5maW5pc2hlZDtcblxuICAgICAgLy8gdGhpc1snY2hlY2tNYXhBc3NvY2lhdGlvbnMnXSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVhY3RpdmF0ZURyb3BwYWJsZShkcm9wcGFibGU6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICBkcm9wcGFibGUucmVtb3ZlQXR0cmlidXRlKCdhY3RpdmUnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRyYWdsZWF2ZUhhbmRsZXIoZXY6IERyYWdFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuZGVhY3RpdmF0ZURyb3BwYWJsZShldi5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgIGV2LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gJ25vbmUnO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gRHJvcHBhYmxlc0VsZW1lbnQgYXMgQ29uc3RydWN0b3I8RHJvcHBhYmxlc0ludGVyZmFjZT4gJiBUO1xufTtcbiIsICIvLyBUSElTIElTIEEgTUlYSU4sIFRISVMgSVMgQSBNSVhJTlxuLy8gVVNFIExJS0UgVEhJU1xuLy8gYGBgY2xhc3MgRHJvcExpc3QgZXh0ZW5kcyBGbGlwcGFibGVzKExpdEVsZW1lbnQpIHtgYGBcbi8vIG1peGluIHdoaWNoIGFuaW1hdGVzIGNoaWxkcmVuIHdpdGggRkxJUFxuLy8gYSBjb21iaW5hdGlvbiBiZXR3ZWVuIHRoaXMgZGlyZWN0aXZlOlxuLy8gaHR0cHM6Ly9uZy1ydW4uY29tL2VkaXQvOU1HcjVkWVdBMjBBaUp0cHk1YXo/b3Blbj1hcHAlMkZhcHAuY29tcG9uZW50Lmh0bWxcbi8vIGFuZCBhIHR1dG9yaWFsIGhvdyB0byBtYWtlIGEgbWl4aW5cbi8vIGh0dHBzOi8vbGl0LmRldi9kb2NzL2NvbXBvc2l0aW9uL21peGlucy9cblxuaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gYWJzdHJhY3QgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxuZXhwb3J0IGRlY2xhcmUgY2xhc3MgRmxpcHBhYmxlc0ludGVyZmFjZSB7XG4gIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQ7XG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQ7XG59XG5cbi8vIGp1c3QgYSBjb252ZXJzaW9uIG9mIGEgYW5ndWxhciBGTElQIGRpcmVjdGl2ZSwgbWFkZSBhcyBhIE1peGluXG4vLyBodHRwczovL25nLXJ1bi5jb20vZWRpdC85TUdyNWRZV0EyMEFpSnRweTVhej9vcGVuPWFwcCUyRmFwcC5jb21wb25lbnQuaHRtbFxuZXhwb3J0IGNvbnN0IEZsaXBwYWJsZXNNaXhpbiA9IDxUIGV4dGVuZHMgQ29uc3RydWN0b3I8SW50ZXJhY3Rpb24+PihcbiAgc3VwZXJDbGFzczogVCxcbiAgZHJvcHBhYmxlc1NlbDogc3RyaW5nLFxuICBkcmFnZ2FibGVzU2VsOiBzdHJpbmdcbikgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBGbGlwcGFibGVzRWxlbWVudCBleHRlbmRzIHN1cGVyQ2xhc3Mge1xuICAgIC8vIHByaXZhdGUgc3RhdGUgPSBuZXcgTWFwPEVsZW1lbnQsIGFueT4oKTtcbiAgICAvLyBwcml2YXRlIG9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyO1xuICAgIC8vIGZsaXBwYWJsZXNTZWxlY3Rvcjogc3RyaW5nO1xuICAgIC8vIG92ZXJyaWRlIGFzeW5jIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpIHtcbiAgICAvLyAgIGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGU7IC8vIHBrOiB0aGlzIGlzIHRoZSBrZXkgdG8gY2FsY3VsYXRlIGNvcnJlY3QgcHJvcG9ydGlvbnNcbiAgICAvLyAgIGNvbnN0IGRyYWdnYWJsZXMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbChkcmFnZ2FibGVzU2VsKSk7XG4gICAgLy8gICBkcmFnZ2FibGVzLmZvckVhY2goKGVsZW0pID0+IHtcbiAgICAvLyAgICAgY29uc3QgeyBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQgfSA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgLy8gICAgIHRoaXMuc3RhdGUuc2V0KGVsZW0sIHsgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgIC8vICAgfSk7XG4gICAgLy8gICB0aGlzLm9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIodGhpcy5hbmltYXRlTWUpO1xuICAgIC8vICAgY29uc3QgZHJvcHBhYmxlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKGRyb3BwYWJsZXNTZWwpKTtcbiAgICAvLyAgIGRyb3BwYWJsZXMuZm9yRWFjaCgoZHJhZ2dhYmxlKSA9PiB7XG4gICAgLy8gICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZShkcmFnZ2FibGUsIHsgY2hpbGRMaXN0OiB0cnVlIH0pO1xuICAgIC8vICAgfSk7XG4gICAgLy8gICB0aGlzLm9ic2VydmVyLm9ic2VydmUodGhpcywgeyBjaGlsZExpc3Q6IHRydWUgfSk7XG4gICAgLy8gICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTtcbiAgICAvLyB9XG4gICAgLy8gcHJpdmF0ZSBhbmltYXRlTWUgPSAoKSA9PiB7XG4gICAgLy8gICB0aGlzLnN0YXRlLmZvckVhY2goKHZhbHVlLCBlbGVtKSA9PiB7XG4gICAgLy8gICAgIGNvbnN0IHsgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0IH0gPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIC8vICAgICBpZiAodGhpcy5zdGF0ZS5nZXQoZWxlbSkgPT0gbnVsbCkge1xuICAgIC8vICAgICAgIHRoaXMuc3RhdGUuc2V0KGVsZW0sIHsgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgIC8vICAgICB9XG4gICAgLy8gICAgIGNvbnN0IGNhY2hlID0gdGhpcy5zdGF0ZS5nZXQoZWxlbSk7XG4gICAgLy8gICAgIGNvbnN0IGRlbHRhWCA9IGNhY2hlLmxlZnQgLSBsZWZ0O1xuICAgIC8vICAgICBjb25zdCBkZWx0YVkgPSBjYWNoZS50b3AgLSB0b3A7XG4gICAgLy8gICAgIGNvbnN0IGRlbHRhVyA9IGNhY2hlLndpZHRoIC8gd2lkdGg7XG4gICAgLy8gICAgIGNvbnN0IGRlbHRhSCA9IGNhY2hlLmhlaWdodCAvIGhlaWdodDtcbiAgICAvLyAgICAgdGhpcy5zdGF0ZS5zZXQoZWxlbSwgeyBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgLy8gICAgIGNvbnN0IHsgZHVyYXRpb24sIGVhc2luZyB9ID0geyBkdXJhdGlvbjogMzUwLCBlYXNpbmc6ICdjdWJpYy1iZXppZXIoMC4yNiwgMC44NiwgMC40NCwgMC45ODUpJyB9O1xuICAgIC8vICAgICBlbGVtLmFuaW1hdGUoXG4gICAgLy8gICAgICAgW1xuICAgIC8vICAgICAgICAge1xuICAgIC8vICAgICAgICAgICB0cmFuc2Zvcm1PcmlnaW46ICd0b3AgbGVmdCcsXG4gICAgLy8gICAgICAgICAgIHRyYW5zZm9ybTogYFxuICAgIC8vIHRyYW5zbGF0ZSgke2RlbHRhWH1weCwgJHtkZWx0YVl9cHgpXG4gICAgLy8gc2NhbGUoJHtkZWx0YVd9LCAke2RlbHRhSH0pXG4gICAgLy8gYCxcbiAgICAvLyAgICAgICAgICAgLy8gd2lkdGg6IGNhY2hlLndpZHRoLFxuICAgIC8vICAgICAgICAgICAvLyBoZWlnaHQ6IGNhY2hlLmhlaWdodCsgJ3B4JyxcbiAgICAvLyAgICAgICAgICAgLy8gb3BhY2l0eTogY2FjaGUub3BhY2l0eSxcbiAgICAvLyAgICAgICAgIH0sXG4gICAgLy8gICAgICAgICB7XG4gICAgLy8gICAgICAgICAgIHRyYW5zZm9ybU9yaWdpbjogJ3RvcCBsZWZ0JyxcbiAgICAvLyAgICAgICAgICAgdHJhbnNmb3JtOiAnbm9uZScsXG4gICAgLy8gICAgICAgICB9LFxuICAgIC8vICAgICAgIF0sXG4gICAgLy8gICAgICAge1xuICAgIC8vICAgICAgICAgZHVyYXRpb24sXG4gICAgLy8gICAgICAgICBlYXNpbmcsXG4gICAgLy8gICAgICAgfVxuICAgIC8vICAgICApO1xuICAgIC8vICAgfSk7XG4gICAgLy8gfTtcbiAgICAvLyBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICAvLyAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgLy8gICB0aGlzLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAvLyB9XG4gIH1cbiAgcmV0dXJuIEZsaXBwYWJsZXNFbGVtZW50IGFzIENvbnN0cnVjdG9yPEZsaXBwYWJsZXNJbnRlcmZhY2U+ICYgVDtcbn07XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBJSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRHJvcHBhYmxlc01peGluIH0gZnJvbSAnLi9kcm9wcGFibGVzLW1peGluJztcbmltcG9ydCB7IEZsaXBwYWJsZXNNaXhpbiB9IGZyb20gJy4vZmxpcHBhYmxlcy1taXhpbic7XG5cbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgbGl2ZVF1ZXJ5IH0gZnJvbSAnLi4vLi4vLi4vLi4vZGVjb3JhdG9ycy9saXZlLXF1ZXJ5JztcbmltcG9ydCB7IFRvdWNoRHJhZ0FuZERyb3AgfSBmcm9tICcuL2RyYWctZHJvcC1hcGknO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IGFic3RyYWN0IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5cbmludGVyZmFjZSBJbnRlcmFjdGlvbkNvbmZpZ3VyYXRpb24ge1xuICBjb3B5U3R5bGVzRHJhZ0Nsb25lOiBib29sZWFuO1xuICBkcmFnQ2FuQmVQbGFjZWRCYWNrOiBib29sZWFuO1xuICBkcmFnT25DbGljazogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbiA9IDxUIGV4dGVuZHMgQ29uc3RydWN0b3I8SW50ZXJhY3Rpb24+PihcbiAgc3VwZXJDbGFzczogVCxcbiAgZHJhZ2dhYmxlc1NlbGVjdG9yOiBzdHJpbmcsXG4gIHVzZVNoYWRvd1Jvb3RGb3JEcm9wcGFibGVzOiBib29sZWFuLFxuICBkcm9wcGFibGVzU2VsZWN0b3I6IHN0cmluZ1xuKSA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIERyYWdEcm9wSW50ZXJhY3Rpb25FbGVtZW50IGV4dGVuZHMgRmxpcHBhYmxlc01peGluKFxuICAgIERyb3BwYWJsZXNNaXhpbihzdXBlckNsYXNzLCB1c2VTaGFkb3dSb290Rm9yRHJvcHBhYmxlcywgZHJvcHBhYmxlc1NlbGVjdG9yKSxcbiAgICBkcm9wcGFibGVzU2VsZWN0b3IsXG4gICAgZHJhZ2dhYmxlc1NlbGVjdG9yXG4gICkge1xuICAgIHByb3RlY3RlZCBkcmFnZ2FibGVzID0gbmV3IE1hcDxIVE1MRWxlbWVudCwgeyBwYXJlbnQ6IEhUTUxFbGVtZW50OyBpbmRleDogbnVtYmVyIH0+KCk7XG4gICAgcHJvdGVjdGVkIGRyb3BwYWJsZXM6IEhUTUxFbGVtZW50W10gPSBbXTtcbiAgICBkcmFnRHJvcEFwaTogVG91Y2hEcmFnQW5kRHJvcDtcblxuICAgIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogZmFsc2UsIHR5cGU6IE9iamVjdCB9KSBjb25maWd1cmF0aW9uOiBJbnRlcmFjdGlvbkNvbmZpZ3VyYXRpb24gPSB7XG4gICAgICBjb3B5U3R5bGVzRHJhZ0Nsb25lOiB0cnVlLFxuICAgICAgZHJhZ0NhbkJlUGxhY2VkQmFjazogdHJ1ZSxcbiAgICAgIGRyYWdPbkNsaWNrOiBmYWxzZVxuICAgIH07XG4gICAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlLCBhdHRyaWJ1dGU6ICdtaW4tYXNzb2NpYXRpb25zJyB9KSBtaW5Bc3NvY2lhdGlvbnMgPSAxO1xuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSwgYXR0cmlidXRlOiAnbWF4LWFzc29jaWF0aW9ucycgfSkgbWF4QXNzb2NpYXRpb25zID0gMTtcblxuICAgIEBsaXZlUXVlcnkoZHJhZ2dhYmxlc1NlbGVjdG9yKVxuICAgIGhhbmRsZURyYWdnYWJsZXNDaGFuZ2UoZHJhZ3NBZGRlZDogSFRNTEVsZW1lbnRbXSwgZHJhZ3NSZW1vdmVkOiBFbGVtZW50W10pIHtcbiAgICAgIGlmICh0aGlzLmlzTWF0Y2hUYWJ1bGFyKCkpIHJldHVybjtcbiAgICAgIGNvbnN0IG5ld0RyYWdnYWJsZXMgPSB0aGlzLmZpbHRlckV4aXN0aW5nRHJhZ2dhYmxlcyhkcmFnc0FkZGVkKTtcblxuICAgICAgaWYgKG5ld0RyYWdnYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmFkZE5ld0RyYWdnYWJsZXMobmV3RHJhZ2dhYmxlcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wcyk6IHZvaWQge1xuICAgICAgc3VwZXIuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wcyk7XG4gICAgICB0aGlzLmluaXRpYWxpemVEcm9wcGFibGVzKCk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5pbml0aWFsaXplRHJhZ0Ryb3BBcGkoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRpYWxpemVEcmFnRHJvcEFwaSgpIHtcbiAgICAgIHRoaXMuZHJhZ0Ryb3BBcGkgPSBuZXcgVG91Y2hEcmFnQW5kRHJvcCgpO1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8RHJhZ0Ryb3BJbnRlcmFjdGlvbkVsZW1lbnQ+KCdxdGktcmVnaXN0ZXItaW50ZXJhY3Rpb24nLCB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgICBkZXRhaWw6IHRoaXNcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc01hdGNoVGFidWxhcigpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLmNsYXNzTGlzdC5jb250YWlucygncXRpLW1hdGNoLXRhYnVsYXInKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbHRlckV4aXN0aW5nRHJhZ2dhYmxlcyhkcmFnZ2FibGVzOiBIVE1MRWxlbWVudFtdKTogSFRNTEVsZW1lbnRbXSB7XG4gICAgICByZXR1cm4gZHJhZ2dhYmxlcy5maWx0ZXIoZCA9PiAhdGhpcy5kcmFnZ2FibGVzLmhhcyhkKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGROZXdEcmFnZ2FibGVzKGRyYWdnYWJsZXM6IEhUTUxFbGVtZW50W10pOiB2b2lkIHtcbiAgICAgIHRoaXMuZHJhZ0Ryb3BBcGkuYWRkRHJhZ2dhYmxlRWxlbWVudHMoZHJhZ2dhYmxlcyk7XG4gICAgICBkcmFnZ2FibGVzLmZvckVhY2goZHJhZ2dhYmxlID0+IHRoaXMuc3RvcmVEcmFnZ2FibGUoZHJhZ2dhYmxlKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdG9yZURyYWdnYWJsZShkcmFnZ2FibGU6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICBjb25zdCBpbmRleCA9IEFycmF5LmZyb20oZHJhZ2dhYmxlLnBhcmVudE5vZGUuY2hpbGRyZW4pLmluZGV4T2YoZHJhZ2dhYmxlKTtcbiAgICAgIHRoaXMuZHJhZ2dhYmxlcy5zZXQoZHJhZ2dhYmxlLCB7XG4gICAgICAgIHBhcmVudDogZHJhZ2dhYmxlLnBhcmVudEVsZW1lbnQsXG4gICAgICAgIGluZGV4XG4gICAgICB9KTtcbiAgICAgIGRyYWdnYWJsZS5zdHlsZS52aWV3VHJhbnNpdGlvbk5hbWUgPSBgZHJhZy0ke2luZGV4fS0ke3RoaXMuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgfHwgY3J5cHRvLnJhbmRvbVVVSUQoKX1gO1xuICAgICAgZHJhZ2dhYmxlLnNldEF0dHJpYnV0ZSgncXRpLWRyYWdnYWJsZScsICd0cnVlJyk7XG4gICAgICBkcmFnZ2FibGUuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgdGhpcy5oYW5kbGVEcmFnU3RhcnQpO1xuICAgICAgZHJhZ2dhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbmQnLCB0aGlzLmhhbmRsZURyYWdFbmQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZURyb3BwYWJsZXMoKTogdm9pZCB7XG4gICAgICB0aGlzLmRyb3BwYWJsZXMgPSBBcnJheS5mcm9tKFxuICAgICAgICB1c2VTaGFkb3dSb290Rm9yRHJvcHBhYmxlc1xuICAgICAgICAgID8gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoZHJvcHBhYmxlc1NlbGVjdG9yKVxuICAgICAgICAgIDogdGhpcy5xdWVyeVNlbGVjdG9yQWxsKGRyb3BwYWJsZXNTZWxlY3RvcilcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVEcmFnU3RhcnQgPSAoZXY6IERyYWdFdmVudCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXYuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGV2LmRhdGFUcmFuc2Zlci5zZXREYXRhKCd0ZXh0JywgdGFyZ2V0LmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpKTtcbiAgICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RyYWdnaW5nJywgJycpO1xuICAgICAgdGhpcy5hY3RpdmF0ZURyb3BwYWJsZXMoKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBoYW5kbGVEcmFnRW5kID0gYXN5bmMgKGV2OiBEcmFnRXZlbnQpID0+IHtcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmRlYWN0aXZhdGVEcm9wcGFibGVzKCk7XG4gICAgICBjb25zdCBkcmFnZ2FibGUgPSBldi5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgZHJhZ2dhYmxlLnJlbW92ZUF0dHJpYnV0ZSgnZHJhZ2dpbmcnKTtcbiAgICAgIGNvbnN0IHdhc0Ryb3BwZWQgPSBhd2FpdCB0aGlzLndhc0Ryb3BwZWQoZXYpO1xuICAgICAgaWYgKCF3YXNEcm9wcGVkKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uZHJhZ0NhbkJlUGxhY2VkQmFjaykge1xuICAgICAgICAgIHRoaXMucmVzdG9yZUluaXRpYWxEcmFnZ2FibGVQb3NpdGlvbihkcmFnZ2FibGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHByaXZhdGUgYWN0aXZhdGVEcm9wcGFibGVzKCk6IHZvaWQge1xuICAgICAgdGhpcy5kcm9wcGFibGVzLmZvckVhY2goZCA9PiBkLnNldEF0dHJpYnV0ZSgnZW5hYmxlZCcsICcnKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZWFjdGl2YXRlRHJvcHBhYmxlcygpOiB2b2lkIHtcbiAgICAgIHRoaXMuZHJvcHBhYmxlcy5mb3JFYWNoKGQgPT4gZC5yZW1vdmVBdHRyaWJ1dGUoJ2VuYWJsZWQnKSk7XG4gICAgfVxuXG4gICAgLy8gTUg6IFRoaXMgbWV0aG9kIGlzIGp1c3QgdG8gbWFrZSBzdXJlIHRoaXMgY2FuIGJlIHRlc3RlZC5cbiAgICAvLyBiZWNhdXNlIEkgY2FuJ3QgZ2V0IHRoZSBkcm9wRWZmZWN0IHRvIGJlICdtb3ZlJyBpbiB0aGUgdGVzdFxuICAgIHByaXZhdGUgY2hlY2tGb3JNb3ZlVGVzdEl0ZW0gPSAoZXY6IERyYWdFdmVudCk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgICAgaWYgKCFldi5kYXRhVHJhbnNmZXIuaXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIGxldCBoYXNNb3ZlVGVzdEl0ZW0gPSBmYWxzZTtcblxuICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIGRhdGFUcmFuc2ZlciBpdGVtc1xuICAgICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmZyb20oZXYuZGF0YVRyYW5zZmVyLml0ZW1zKTtcbiAgICAgICAgY29uc3QgcGVuZGluZyA9IGl0ZW1zLmxlbmd0aDtcblxuICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gaXRlbXMsIHJlc29sdmUgaW1tZWRpYXRlbHlcbiAgICAgICAgaWYgKHBlbmRpbmcgPT09IDApIHtcbiAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgIGlmIChpdGVtLmtpbmQgPT09ICdzdHJpbmcnICYmIGl0ZW0udHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgICBpdGVtLmdldEFzU3RyaW5nKGRhdGEgPT4ge1xuICAgICAgICAgICAgICBpZiAoZGF0YSA9PT0gJ21vdmUtdGVzdCcpIHtcbiAgICAgICAgICAgICAgICBoYXNNb3ZlVGVzdEl0ZW0gPSB0cnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gUmVzb2x2ZSB0aGUgcHJvbWlzZSBhZnRlciBwcm9jZXNzaW5nIGFsbCBpdGVtc1xuICAgICAgICAgICAgICBpZiAocGVuZGluZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoaGFzTW92ZVRlc3RJdGVtKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBpdGVtIGlzIG5vdCAnc3RyaW5nJywgc3RpbGwgY291bnQgZG93biBwZW5kaW5nXG4gICAgICAgICAgICBpZiAocGVuZGluZyA9PT0gMCkge1xuICAgICAgICAgICAgICByZXNvbHZlKGhhc01vdmVUZXN0SXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGFzeW5jIHdhc0Ryb3BwZWQoZXY6IERyYWdFdmVudCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgY29uc3QgaGFzTW92ZVRlc3RJdGVtID0gYXdhaXQgdGhpcy5jaGVja0Zvck1vdmVUZXN0SXRlbShldik7XG4gICAgICByZXR1cm4gZXYuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgIT09ICdub25lJyB8fCBoYXNNb3ZlVGVzdEl0ZW07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3YXNNb3ZlZChldjogRHJhZ0V2ZW50KTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gZXYuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPT09ICdtb3ZlJztcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlc3RvcmVJbml0aWFsRHJhZ2dhYmxlUG9zaXRpb24oZHJhZ2dhYmxlOiBIVE1MRWxlbWVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3QgeyBwYXJlbnQsIGluZGV4IH0gPSB0aGlzLmRyYWdnYWJsZXMuZ2V0KGRyYWdnYWJsZSk7XG4gICAgICBjb25zdCB0YXJnZXRJbmRleCA9IE1hdGgubWluKGluZGV4LCBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoKTtcblxuICAgICAgY29uc3QgbW92ZURyYWdnYWJsZSA9IChkcmFnZ2FibGU6IEhUTUxFbGVtZW50LCBwYXJlbnQ6IEhUTUxFbGVtZW50LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldEluZGV4ID0gTWF0aC5taW4oaW5kZXgsIHBhcmVudC5jaGlsZHJlbi5sZW5ndGgpO1xuICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGRyYWdnYWJsZSwgcGFyZW50LmNoaWxkcmVuW3RhcmdldEluZGV4XSk7XG4gICAgICAgIGRyYWdnYWJsZS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKDAsIDApJztcbiAgICAgICAgdGhpcy5jaGVja01heEFzc29jaWF0aW9ucygpO1xuICAgICAgfTtcblxuICAgICAgLy8gRmFsbGJhY2sgaWYgdmlldyB0cmFuc2l0aW9ucyBhcmUgbm90IHN1cHBvcnRlZFxuICAgICAgaWYgKCFkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKSB7XG4gICAgICAgIG1vdmVEcmFnZ2FibGUoZHJhZ2dhYmxlLCBwYXJlbnQsIGluZGV4KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBVc2UgdmlldyB0cmFuc2l0aW9ucyBpZiBzdXBwb3J0ZWRcbiAgICAgIGNvbnN0IHRyYW5zaXRpb24gPSBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKCgpID0+IHtcbiAgICAgICAgZHJhZ2dhYmxlLnN0eWxlLnRyYW5zZm9ybSA9ICcnO1xuICAgICAgICBtb3ZlRHJhZ2dhYmxlKGRyYWdnYWJsZSwgcGFyZW50LCBpbmRleCk7XG4gICAgICB9KTtcbiAgICAgIC8vIHRyYW5zaXRpb24uZmluaXNoZWQudGhlbigoKSA9PiB7XG4gICAgICAvLyAgIGRyYWdnYWJsZS5zdHlsZS50cmFuc2l0aW9uID0gJyc7XG4gICAgICAvLyB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY2hlY2tNYXhBc3NvY2lhdGlvbnMoKTogdm9pZCB7XG4gICAgICB0aGlzLmRyb3BwYWJsZXMuZm9yRWFjaCgoZCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgbWF4TWF0Y2ggPSArKGQuZ2V0QXR0cmlidXRlKCdtYXRjaC1tYXgnKSB8fCAxKTtcbiAgICAgICAgY29uc3QgY3VycmVudEFzc29jaWF0aW9ucyA9IGQucXVlcnlTZWxlY3RvckFsbCgnW3F0aS1kcmFnZ2FibGU9XCJ0cnVlXCJdJykubGVuZ3RoO1xuICAgICAgICBjb25zdCBkaXNhYmxlRHJvcHBhYmxlID0gY3VycmVudEFzc29jaWF0aW9ucyA+PSBtYXhNYXRjaDtcbiAgICAgICAgaWYgKGRpc2FibGVEcm9wcGFibGUpIHtcbiAgICAgICAgICB0aGlzLmRpc2FibGVEcm9wcGFibGUoZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5lbmFibGVEcm9wcGFibGUoZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGlzYWJsZURyb3BwYWJsZShkcm9wcGFibGU6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGRyb3BwYWJsZS5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJycpO1xuICAgICAgZHJvcHBhYmxlLnJlbW92ZUF0dHJpYnV0ZSgnZHJvcHpvbmUnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVuYWJsZURyb3BwYWJsZShkcm9wcGFibGU6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGRyb3BwYWJsZS5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICBkcm9wcGFibGUuc2V0QXR0cmlidXRlKCdkcm9wem9uZScsICdtb3ZlJyk7XG4gICAgfVxuXG4gICAgZ2V0IHZhbHVlKCk6IHN0cmluZ1tdIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbGxlY3RSZXNwb25zZURhdGEoKTtcbiAgICB9XG5cbiAgICBzZXQgdmFsdWUodmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgICBpZiAodGhpcy5pc01hdGNoVGFidWxhcigpKSByZXR1cm47XG5cbiAgICAgIHRoaXMucmVzZXREcm9wcGFibGVzKCk7XG4gICAgICB2YWx1ZT8uZm9yRWFjaChlbnRyeSA9PiB0aGlzLnBsYWNlUmVzcG9uc2UoZW50cnkpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBsYWNlUmVzcG9uc2UocmVzcG9uc2U6IHN0cmluZyk6IHZvaWQge1xuICAgICAgY29uc3QgW2Ryb3BJZCwgLi4uZHJhZ0lkc10gPSByZXNwb25zZS5zcGxpdCgnICcpLnJldmVyc2UoKTtcbiAgICAgIGNvbnN0IGRyb3BwYWJsZSA9IHRoaXMuZmluZERyb3BwYWJsZUJ5SWQoZHJvcElkKTtcbiAgICAgIGRyYWdJZHMuZm9yRWFjaChkcmFnSWQgPT4gdGhpcy5wbGFjZURyYWdnYWJsZUluRHJvcHBhYmxlKGRyYWdJZCwgZHJvcHBhYmxlKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kRHJvcHBhYmxlQnlJZChpZGVudGlmaWVyOiBzdHJpbmcpOiBFbGVtZW50IHwgdW5kZWZpbmVkIHtcbiAgICAgIHJldHVybiB0aGlzLmRyb3BwYWJsZXMuZmluZChkcm9wID0+IGRyb3AuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgPT09IGlkZW50aWZpZXIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcGxhY2VEcmFnZ2FibGVJbkRyb3BwYWJsZShkcmFnSWQ6IHN0cmluZywgZHJvcHBhYmxlOiBFbGVtZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBkcmFnZ2FibGUgPSB0aGlzLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGBbaWRlbnRpZmllcj0ke2RyYWdJZH1dYCk7XG4gICAgICBpZiAoIWRyb3BwYWJsZSB8fCAhZHJhZ2dhYmxlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYENhbm5vdCBmaW5kIGRyYWdnYWJsZSBvciBkcm9wcGFibGUgd2l0aCB0aGUgZ2l2ZW4gaWRlbnRpZmllcjogJHtkcmFnSWR9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1vdmVFbGVtZW50ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBkcmFnZ2FibGUuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgwLCAwKSc7XG4gICAgICAgIGRyb3BwYWJsZS5hcHBlbmRDaGlsZChkcmFnZ2FibGUpO1xuICAgICAgICB0aGlzLmNoZWNrTWF4QXNzb2NpYXRpb25zKCk7XG4gICAgICB9O1xuXG4gICAgICBpZiAoIWRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgbW92ZUVsZW1lbnQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRyYW5zaXRpb24gPSBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKG1vdmVFbGVtZW50KTtcbiAgICAgICAgYXdhaXQgdHJhbnNpdGlvbi5maW5pc2hlZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IHZhbGlkQXNzb2NpYXRpb25zID0gdGhpcy5nZXRWYWxpZEFzc29jaWF0aW9ucygpO1xuICAgICAgcmV0dXJuIHRoaXMubWluQXNzb2NpYXRpb25zIDw9IDAgfHwgdGhpcy5taW5Bc3NvY2lhdGlvbnMgPD0gdmFsaWRBc3NvY2lhdGlvbnM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRWYWxpZEFzc29jaWF0aW9ucygpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIHRoaXMuZHJvcHBhYmxlcy5maWx0ZXIoZCA9PiBkLmNoaWxkRWxlbWVudENvdW50ID4gMCkubGVuZ3RoO1xuICAgIH1cblxuICAgIHB1YmxpYyBzYXZlUmVzcG9uc2UoKTogdm9pZCB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IHRoaXMuY29sbGVjdFJlc3BvbnNlRGF0YSgpO1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1pbnRlcmFjdGlvbi1yZXNwb25zZScsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgcmVzcG9uc2VJZGVudGlmaWVyOiB0aGlzLnJlc3BvbnNlSWRlbnRpZmllcixcbiAgICAgICAgICAgIHJlc3BvbnNlXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbGxlY3RSZXNwb25zZURhdGEoKTogc3RyaW5nW10ge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLmRyb3BwYWJsZXNcbiAgICAgICAgLm1hcChkcm9wcGFibGUgPT4ge1xuICAgICAgICAgIGNvbnN0IGRyYWdnYWJsZXNJbkRyb3BwYWJsZSA9IGRyb3BwYWJsZS5xdWVyeVNlbGVjdG9yQWxsKCdbcXRpLWRyYWdnYWJsZT1cInRydWVcIl0nKTtcbiAgICAgICAgICBjb25zdCBpZGVudGlmaWVycyA9IEFycmF5LmZyb20oZHJhZ2dhYmxlc0luRHJvcHBhYmxlKS5tYXAoZCA9PiBkLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpKTtcbiAgICAgICAgICBjb25zdCBkcm9wcGFibGVJZGVudGlmaWVyID0gZHJvcHBhYmxlLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpO1xuICAgICAgICAgIHJldHVybiBpZGVudGlmaWVycy5tYXAoaWQgPT4gYCR7aWR9ICR7ZHJvcHBhYmxlSWRlbnRpZmllcn1gKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmZsYXQoKTtcbiAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9XG5cbiAgICByZXNldChzYXZlID0gdHJ1ZSk6IHZvaWQge1xuICAgICAgdGhpcy5yZXNldERyb3BwYWJsZXMoKTtcbiAgICAgIGlmIChzYXZlKSB0aGlzLnNhdmVSZXNwb25zZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVzZXREcm9wcGFibGVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3QgbW92ZURyYWdnYWJsZSA9IChkcmFnZ2FibGU6IEhUTUxFbGVtZW50LCBwYXJlbnQ6IEhUTUxFbGVtZW50LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGRyYWdnYWJsZS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKDAsIDApJztcbiAgICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSBNYXRoLm1pbihpbmRleCwgcGFyZW50LmNoaWxkcmVuLmxlbmd0aCk7XG4gICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoZHJhZ2dhYmxlLCBwYXJlbnQuY2hpbGRyZW5bdGFyZ2V0SW5kZXhdKTtcbiAgICAgIH07XG5cbiAgICAgIGlmICghZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbikge1xuICAgICAgICAvLyBGYWxsYmFjayBpZiB2aWV3IHRyYW5zaXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkXG4gICAgICAgIHRoaXMuZHJhZ2dhYmxlcy5mb3JFYWNoKCh7IHBhcmVudCwgaW5kZXggfSwgZHJhZ2dhYmxlKSA9PiB7XG4gICAgICAgICAgbW92ZURyYWdnYWJsZShkcmFnZ2FibGUsIHBhcmVudCwgaW5kZXgpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBVc2UgdmlldyB0cmFuc2l0aW9ucyBpZiBzdXBwb3J0ZWRcbiAgICAgIGNvbnN0IHRyYW5zaXRpb24gPSBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKCgpID0+IHtcbiAgICAgICAgdGhpcy5kcmFnZ2FibGVzLmZvckVhY2goKHsgcGFyZW50LCBpbmRleCB9LCBkcmFnZ2FibGUpID0+IHtcbiAgICAgICAgICBtb3ZlRHJhZ2dhYmxlKGRyYWdnYWJsZSwgcGFyZW50LCBpbmRleCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHRyYW5zaXRpb24uZmluaXNoZWQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIERyYWdEcm9wSW50ZXJhY3Rpb25FbGVtZW50IGFzIENvbnN0cnVjdG9yPElJbnRlcmFjdGlvbj4gJiBUO1xufTtcbiIsICIvLyBAd2F0Y2ggZGVjb3JhdG9yXG4vL1xuLy8gUnVucyB3aGVuIGFuIG9ic2VydmVkIHByb3BlcnR5IGNoYW5nZXMsIGUuZy4gQHByb3BlcnR5IG9yIEBzdGF0ZSwgYnV0IGJlZm9yZSB0aGUgY29tcG9uZW50IHVwZGF0ZXMuXG4vL1xuLy8gVG8gd2FpdCBmb3IgYW4gdXBkYXRlIHRvIGNvbXBsZXRlIGFmdGVyIGEgY2hhbmdlIG9jY3VycywgdXNlIGBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlYCBpbiB0aGUgaGFuZGxlci4gVG8gc3RhcnRcbi8vIHdhdGNoaW5nIGFmdGVyIHRoZSBpbml0aWFsIHVwZGF0ZS9yZW5kZXIsIHVzZSBgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9YCBvciBgdGhpcy5oYXNVcGRhdGVkYCBpbiB0aGUgaGFuZGxlci5cbi8vXG4vLyBVc2FnZTpcbi8vXG4vLyAgQHdhdGNoKCdwcm9wTmFtZScpXG4vLyAgaGFuZGxlUHJvcENoYW5nZShvbGRWYWx1ZSwgbmV3VmFsdWUpIHtcbi8vICAgIC4uLlxuLy8gIH1cblxuaW1wb3J0IHR5cGUgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcblxudHlwZSBVcGRhdGVIYW5kbGVyID0gKHByZXY/OiB1bmtub3duLCBuZXh0PzogdW5rbm93bikgPT4gdm9pZDtcblxudHlwZSBOb25VbmRlZmluZWQ8QT4gPSBBIGV4dGVuZHMgdW5kZWZpbmVkID8gbmV2ZXIgOiBBO1xuXG50eXBlIFVwZGF0ZUhhbmRsZXJGdW5jdGlvbktleXM8VCBleHRlbmRzIG9iamVjdD4gPSB7XG4gIFtLIGluIGtleW9mIFRdLT86IE5vblVuZGVmaW5lZDxUW0tdPiBleHRlbmRzIFVwZGF0ZUhhbmRsZXIgPyBLIDogbmV2ZXI7XG59W2tleW9mIFRdO1xuXG5pbnRlcmZhY2UgTGl2ZVF1ZXJ5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJZiB0cnVlLCB3aWxsIG9ubHkgc3RhcnQgd2F0Y2hpbmcgYWZ0ZXIgdGhlIGluaXRpYWwgdXBkYXRlL3JlbmRlclxuICAgKi9cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpdmVRdWVyeShxdWVyeVNlbGVjdG9yOiBzdHJpbmcsIG9wdGlvbnM/OiBMaXZlUXVlcnlPcHRpb25zKSB7XG4gIGxldCBvYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlcjtcbiAgY29uc3QgcmVzb2x2ZWRPcHRpb25zOiBSZXF1aXJlZDxMaXZlUXVlcnlPcHRpb25zPiA9IHtcbiAgICAuLi5vcHRpb25zXG4gIH07XG4gIHJldHVybiA8RWxlbUNsYXNzIGV4dGVuZHMgTGl0RWxlbWVudD4oXG4gICAgcHJvdG86IEVsZW1DbGFzcyxcbiAgICBkZWNvcmF0ZWRGbk5hbWU6IFVwZGF0ZUhhbmRsZXJGdW5jdGlvbktleXM8RWxlbUNsYXNzPlxuICApOiB2b2lkID0+IHtcbiAgICBjb25zdCB7IGNvbm5lY3RlZENhbGxiYWNrLCBkaXNjb25uZWN0ZWRDYWxsYmFjayB9ID0gcHJvdG87XG5cbiAgICBwcm90by5jb25uZWN0ZWRDYWxsYmFjayA9IGZ1bmN0aW9uICh0aGlzOiBFbGVtQ2xhc3MpIHtcbiAgICAgIGNvbm5lY3RlZENhbGxiYWNrLmNhbGwodGhpcyk7XG4gICAgICBjb25zdCBjYWxsYmFjayA9IChtdXRhdGlvbkxpc3Q6IE11dGF0aW9uUmVjb3JkW10pID0+IHtcbiAgICAgICAgY29uc3QgZWxlbWVudHNUb1dhdGNoID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnlTZWxlY3RvcikpO1xuICAgICAgICBmb3IgKGNvbnN0IG11dGF0aW9uIG9mIG11dGF0aW9uTGlzdCkge1xuICAgICAgICAgIGNvbnN0IGFkZGVkTm9kZXMgPSBBcnJheS5mcm9tKG11dGF0aW9uLmFkZGVkTm9kZXMpLm1hcChlID0+IGUgYXMgRWxlbWVudCk7XG4gICAgICAgICAgY29uc3QgcmVtb3ZlZE5vZGVzID0gQXJyYXkuZnJvbShtdXRhdGlvbi5hZGRlZE5vZGVzKS5tYXAoZSA9PiBlIGFzIEVsZW1lbnQpO1xuICAgICAgICAgIGlmIChtdXRhdGlvbi50eXBlID09PSAnY2hpbGRMaXN0JyAmJiBhZGRlZE5vZGVzLmZpbmQobiA9PiBlbGVtZW50c1RvV2F0Y2guaW5jbHVkZXMobikpKSB7XG4gICAgICAgICAgICAodGhpc1tkZWNvcmF0ZWRGbk5hbWVdIGFzIHVua25vd24gYXMgVXBkYXRlSGFuZGxlcikoYWRkZWROb2RlcywgcmVtb3ZlZE5vZGVzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGNhbGxiYWNrKTtcbiAgICAgIG9ic2VydmVyLm9ic2VydmUodGhpcywgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7XG5cbiAgICAgIGNvbnN0IGVsZW1lbnRzQWRkZWQgPSB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnlTZWxlY3RvcikgPz8gW107XG4gICAgICAodGhpc1tkZWNvcmF0ZWRGbk5hbWVdIGFzIHVua25vd24gYXMgVXBkYXRlSGFuZGxlcikoQXJyYXkuZnJvbShlbGVtZW50c0FkZGVkKSwgW10pO1xuICAgIH07XG5cbiAgICBwcm90by5kaXNjb25uZWN0ZWRDYWxsYmFjayA9IGZ1bmN0aW9uICh0aGlzOiBFbGVtQ2xhc3MpIHtcbiAgICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrLmNhbGwodGhpcyk7XG4gICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfTtcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuXG5leHBvcnQgZGVmYXVsdCBjc3NgXG4gIDpob3N0IHtcbiAgICBkaXNwbGF5OiBibG9jazsgLyogbmVjZXNzYXJ5IHRvIGNhbGN1bGF0ZSBzY2FsaW5nIHBvc2l0aW9uICovXG4gIH1cbiAgc2xvdFtuYW1lPSdxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJ10ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC13cmFwOiB3cmFwO1xuICAgIGdhcDogMC41cmVtO1xuICB9XG5cbiAgOmhvc3Q6OnBhcnQoYXNzb2NpYWJsZXMtY29udGFpbmVyKSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KFxuICAgICAgMTgwZGVnLFxuICAgICAgcmdiKDAgMCAwIC8gMCUpIGNhbGMoNTAlIC0gMXB4KSxcbiAgICAgIHZhcigtLXF0aS1ib3JkZXItY29sb3ItZ3JheSkgY2FsYyg1MCUpLFxuICAgICAgcmdiKDAgMCAwIC8gMCUpIGNhbGMoNTAlICsgMXB4KVxuICAgICk7XG4gIH1cbmA7XG4iLCAiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB7IHJlbW92ZURvdWJsZVNsYXNoZXMgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC91dGlscyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktY3VzdG9tLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlDdXN0b21JbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgLy8gVGhpcyBjdXN0b20taW50ZXJhY3Rpb24gc3VwcG9ydCB0aGUgQ0VTIEFQSSB3aGljaCBpcyB1c2UgaW4gRkFDRVRcbiAgLy9cbiAgLy8gSXQgd29ya3MgbGlrZSB0aGlzOlxuICAvLyAxLiBUaGUgQ0kgbWFuaWZlc3QgaXMgZmV0Y2hlZFxuICAvLyAyLiBBbiBpZnJhbWUgaXMgY3JlYXRlZCBhbmQgdGhlIGZpcnN0IHN0eWxlIGFuZCBmaXJzdCBzY3JpcHQgZnJvbSB0aGUgbWFuaWZlc3QgYXJlIGxvYWRlZFxuICAvLyAzLiBUaGUgZmlyc3Qgc2NyaXB0IGlzIGJvb3RzdHJhcC5qcyB3aGljaCBhbHNvIGNyZWF0ZXMgYW4gaWZyYW1lIGFuZCBsb2FkcyB0aGUgZmlyc3QgbWVkaWEgZnJvbSB0aGUgbWFuaWZlc3RcbiAgLy8gNC4gQ29tbXVuaWNhdGlvbiBpcyBkb25lIHZpYSB0aGUgQ0VTIEFQSSBidXQgYmVjYXVzZSB0aGUgaWZyYW1lIGlzIG5vdCBhbGxvd2VkIHRvIGFjY2VzcyB0aGUgZ2xvYmFsIENFUyBvYmplY3Qgd2UgbmVlZCB0byB1c2Ugd2luZG93LnBvc3RNZXNzYWdlXG5cbiAgLy8gVG8gYWNoaWV2ZSB0aGlzIHdlIGNoYW5nZSB0aGUgcGFja2FnZSBieSByZXBsYWNpbmcgdGhlIGJvb3RzdHJhcC5qcyB3aXRoIG91ciBvd24gYW5kIGluamVjdCBhIHByb3h5IENFUyBBUEkgdGhhdCBjb21tdW5pY2F0ZXMgdmlhIHBvc3RNZXNzYWdlXG4gIC8vIEJlY2F1c2Ugd2UgYWxzbyB3YW50IHRvIHJ1biB0aGlzIGluIHN0b3J5Ym9vaywgd2UgY2Fubm90IHVzZSB3aW5kb3cudG9wIGJlY2F1c2UgdG8gc2VuZCBtZXNzYWdlcyB0aGVyZSwgYmVjYXVzZSBpbiBjYXNlIG9mIHN0b3J5Ym9vayB0aGF0IGlzIG5vdCB0aGUgdG9wIHdpbmRvdy5cbiAgLy8gU28gd2Ugc2VuZCBtZXNzYWdlcyB0byBhbGwgcGFyZW50IHdpbmRvd3NcbiAgcHJpdmF0ZSByYXdSZXNwb25zZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5oYW5kbGVQb3N0TWVzc2FnZSA9IHRoaXMuaGFuZGxlUG9zdE1lc3NhZ2UuYmluZCh0aGlzKTtcbiAgfVxuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnZGF0YScgfSlcbiAgZGF0YTogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnZGF0YS1iYXNlLWl0ZW0nIH0pXG4gIGJhc2VJdGVtVXJsOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdkYXRhLWJhc2UtcmVmJyB9KVxuICBiYXNlUmVmVXJsOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdpZCcgfSlcbiAgaWQ6IHN0cmluZztcblxuICBAc3RhdGUoKVxuICBwcml2YXRlIF9lcnJvck1lc3NhZ2U6IHN0cmluZyA9IG51bGw7XG4gIG1hbmlmZXN0OiB7XG4gICAgc2NyaXB0OiBzdHJpbmdbXTtcbiAgICBzdHlsZTogc3RyaW5nW107XG4gICAgbWVkaWE6IHN0cmluZ1tdO1xuICB9O1xuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICBjb25zdCB1cmlUb01hbmlmZXN0ID0gdGhpcy5kYXRhLnN0YXJ0c1dpdGgoJ2h0dHAnKVxuICAgICAgPyB0aGlzLmRhdGFcbiAgICAgIDogcmVtb3ZlRG91YmxlU2xhc2hlcyh0aGlzLmJhc2VJdGVtVXJsICsgJy8nICsgdGhpcy5kYXRhKTtcbiAgICAvLyBmZXRjaCB0aGUganNvbiBmaWxlIGxvY2F0ZWQgYXQgdGhlIGRhdGEgYXR0cmlidXRlXG4gICAgZmV0Y2godXJpVG9NYW5pZmVzdClcbiAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLmpzb24oKSlcbiAgICAgIC50aGVuKGRhdGEgPT4ge1xuICAgICAgICB0aGlzLm1hbmlmZXN0ID0gZGF0YTtcbiAgICAgICAgdGhpcy5zZXR1cENFUygpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICB0aGlzLl9lcnJvck1lc3NhZ2UgPSBlcnI7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIE1IOiBDaGFuZ2VkIHRoZSBkZWZhdWx0IGJvb3RzdHJhcC5qcyB0byB1c2UgdGhlIG5ldyBDRVMgQVBJXG4gIC8vIEJlY2F1c2UgdGhlIG9sZCBvbmUgdXNlcyB0aGUgZ2xvYmFsIENFUyBvYmplY3QgdGhhdCBpcyBub3QgYWxsb3dlZCB0byBiZSBhY2Nlc3NlZCB3aGVuIHRoZSBDSVxuICAvLyBpcyBlbWJlZGRlZCBpbiBhbiBpZnJhbWUgYW5kIGNvbWluZyBmcm9tIGFub3RoZXIgZG9tYWluXG4gIC8vIFRoZXJlZm9yIHdlIG5lZWQgdG8gdXNlIHRoZSBuZXcgQ0VTIEFQSSB0byBjb21tdW5pY2F0ZXMgdmlhIHRoZSBicm9hZGNhc3QgQVBJXG4gIHNldHVwQ0VTKCkge1xuICAgIGNvbnN0IGlmcmFtZSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCcjcGNpQ29udGFpbmVyJykgYXMgSFRNTElGcmFtZUVsZW1lbnQsXG4gICAgICBpZnJhbWVXaW4gPSBpZnJhbWUuY29udGVudFdpbmRvdyB8fCBpZnJhbWUsXG4gICAgICBpZnJhbWVEb2MgPSBpZnJhbWUuY29udGVudERvY3VtZW50O1xuXG4gICAgLy8gY29uc3QgY2hhbm5lbCA9IG5ldyBCcm9hZGNhc3RDaGFubmVsKCdjZXNfY2hhbm5lbCcpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5oYW5kbGVQb3N0TWVzc2FnZSk7XG4gICAgaWZyYW1lRG9jLm9wZW4oKTtcbiAgICBpZnJhbWVEb2Mud3JpdGUoYFxuICAgICAgPGh0bWw+XG4gICAgICAgIDxoZWFkPlxuICAgICAgICAgIDxsaW5rIGhyZWY9JyR7cmVtb3ZlRG91YmxlU2xhc2hlcyhgJHt0aGlzLmJhc2VSZWZVcmx9LyR7dGhpcy5tYW5pZmVzdC5zdHlsZVswXX1gKX0nIHJlbD1cInN0eWxlc2hlZXRcIiAvPlxuICAgICAgICAgIDxzY3JpcHQgc3JjPScke3JlbW92ZURvdWJsZVNsYXNoZXMoYCR7dGhpcy5iYXNlUmVmVXJsfS8ke3RoaXMubWFuaWZlc3Quc2NyaXB0WzBdfWApfSc+PC9zY3JpcHQ+XG4gICAgICAgIDwvaGVhZD5cbiAgICAgICAgPGJvZHk+PC9ib2R5PlxuICAgICAgPC9odG1sPlxuICAgICAgYCk7XG5cbiAgICBpZnJhbWVEb2MuY2xvc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SUZyYW1lcygpIHtcbiAgICBjb25zdCBpZnJhbWVzSW5TaGFkb3dSb290ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lmcmFtZScpO1xuICAgIGNvbnN0IGlmcmFtZSA9IHRoaXMucXVlcnlTZWxlY3RvckFsbCgnaWZyYW1lJyk7XG5cbiAgICBjb25zdCBvdXRlcklGcmFtZXMgPSBbLi4uaWZyYW1lc0luU2hhZG93Um9vdCwgLi4uaWZyYW1lXTtcbiAgICBmb3IgKGNvbnN0IGlmcmFtZSBvZiBvdXRlcklGcmFtZXMpIHtcbiAgICAgIGNvbnN0IGlmcmFtZVNyYyA9IGlmcmFtZS5zcmM7XG4gICAgICBjb25zdCBpc1NhbWVPcmlnaW4gPSBuZXcgVVJMKGlmcmFtZVNyYywgd2luZG93LmxvY2F0aW9uLmhyZWYpLm9yaWdpbiA9PT0gd2luZG93LmxvY2F0aW9uLm9yaWdpbjtcbiAgICAgIGlmIChpc1NhbWVPcmlnaW4pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBvdXRlckRvYyA9IGlmcmFtZS5jb250ZW50RG9jdW1lbnQgfHwgaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gICAgICAgICAgaWYgKG91dGVyRG9jKSB7XG4gICAgICAgICAgICB0aGlzLmdldElubmVySUZyYW1lcyhvdXRlckRvYywgb3V0ZXJJRnJhbWVzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBhY2Nlc3NpbmcgbmVzdGVkIGlmcmFtZTonLCBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBnZXQgb25seSB1bmlxdWUgaWZyYW1lc1xuICAgIG91dGVySUZyYW1lcy5mb3JFYWNoKChpZnJhbWUsIGluZGV4KSA9PiB7XG4gICAgICBpZiAob3V0ZXJJRnJhbWVzLmluZGV4T2YoaWZyYW1lKSAhPT0gaW5kZXgpIHtcbiAgICAgICAgb3V0ZXJJRnJhbWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG91dGVySUZyYW1lcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SW5uZXJJRnJhbWVzKGlmcmFtZURvY3VtZW50OiBEb2N1bWVudCwgaWZyYW1lcyA9IFtdKSB7XG4gICAgLy8gR2V0IGFsbCBpZnJhbWVzIGluIHRoZSBjdXJyZW50IGRvY3VtZW50XG4gICAgY29uc3QgY3VycmVudElmcmFtZXMgPSBpZnJhbWVEb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUnKTtcblxuICAgIGN1cnJlbnRJZnJhbWVzLmZvckVhY2goaWZyYW1lID0+IHtcbiAgICAgIC8vIEFkZCB0aGUgY3VycmVudCBpZnJhbWUgdG8gdGhlIGxpc3RcbiAgICAgIGlmcmFtZXMucHVzaChpZnJhbWUpO1xuXG4gICAgICAvLyBSZWN1cnNpdmVseSBnZXQgaWZyYW1lcyB3aXRoaW4gdGhlIGN1cnJlbnQgaWZyYW1lXG4gICAgICAvLyBDaGVjayBpZiB0aGUgaWZyYW1lIHNyYyBpcyBmcm9tIHRoZSBzYW1lIG9yaWdpblxuICAgICAgY29uc3QgaWZyYW1lU3JjID0gaWZyYW1lLnNyYztcbiAgICAgIGNvbnN0IGlzU2FtZU9yaWdpbiA9IG5ldyBVUkwoaWZyYW1lU3JjLCB3aW5kb3cubG9jYXRpb24uaHJlZikub3JpZ2luID09PSB3aW5kb3cubG9jYXRpb24ub3JpZ2luO1xuXG4gICAgICBpZiAoaXNTYW1lT3JpZ2luKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgbmVzdGVkRG9jID0gaWZyYW1lLmNvbnRlbnREb2N1bWVudCB8fCBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgICAgICAgICB0aGlzLmdldElubmVySUZyYW1lcyhuZXN0ZWREb2MsIGlmcmFtZXMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgYWNjZXNzaW5nIG5lc3RlZCBpZnJhbWU6JywgZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybignU2tpcHBlZCBjcm9zcy1vcmlnaW4gaWZyYW1lOicsIGlmcmFtZVNyYyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaWZyYW1lcztcbiAgfVxuXG4gIHByaXZhdGUgcG9zdFRvV2luZG93QW5kSWZyYW1lcyh0eXBlOiBzdHJpbmcsIGRhdGE6IGFueSkge1xuICAgIHdpbmRvdy5wb3N0TWVzc2FnZSh7IHR5cGUsIGRhdGEgfSwgJyonKTtcbiAgICBjb25zdCBpZnJhbWVzID0gdGhpcy5nZXRJRnJhbWVzKCk7XG4gICAgZm9yIChjb25zdCBpZnJhbWUgb2YgaWZyYW1lcykge1xuICAgICAgaWYgKGlmcmFtZS5jb250ZW50V2luZG93KSB7XG4gICAgICAgIGlmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKHsgdHlwZSwgZGF0YSB9LCAnKicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZVBvc3RNZXNzYWdlKGV2ZW50OiBNZXNzYWdlRXZlbnQpIHtcbiAgICBjb25zdCB7IHR5cGUsIGRhdGEgfSA9IGV2ZW50LmRhdGE7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdzZXRSZXNwb25zZSc6XG4gICAgICAgIHRoaXMucmF3UmVzcG9uc2UgPSBkYXRhO1xuICAgICAgICB0aGlzLnNhdmVSZXNwb25zZShkYXRhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdnZXRSZXNwb25zZSc6IHtcbiAgICAgICAgdGhpcy5wb3N0VG9XaW5kb3dBbmRJZnJhbWVzKCdyZXNwb25zZURhdGEnLCB0aGlzLnJhd1Jlc3BvbnNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdnZXRNZWRpYSc6IHtcbiAgICAgICAgY29uc3QgbWVkaWFEYXRhID0gdGhpcy5tYW5pZmVzdC5tZWRpYS5tYXAobWVkaWEgPT4ge1xuICAgICAgICAgIGNvbnN0IHVybCA9IG1lZGlhLnN0YXJ0c1dpdGgoJ2h0dHAnKSA/IG1lZGlhIDogcmVtb3ZlRG91YmxlU2xhc2hlcyh0aGlzLmJhc2VSZWZVcmwgKyAnLycgKyBtZWRpYSk7XG4gICAgICAgICAgcmV0dXJuIHVybDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucG9zdFRvV2luZG93QW5kSWZyYW1lcygnbWVkaWFEYXRhJywgbWVkaWFEYXRhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdzZXRTdGFnZUhlaWdodCc6XG4gICAgICAgIGNvbnNvbGUubG9nKCdzZXRTdGFnZUhlaWdodCBub3QgaW1wbGVtZW50ZWQnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmF3UmVzcG9uc2UgIT09ICcnO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5yYXdSZXNwb25zZTtcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLnJhd1Jlc3BvbnNlID0gdmFsO1xuICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLmhhbmRsZVBvc3RNZXNzYWdlKTtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxpZnJhbWVcbiAgICAgICAgd2lkdGg9JHt0aGlzLmdldEF0dHJpYnV0ZSgnd2lkdGgnKX1cbiAgICAgICAgaGVpZ2h0PSR7dGhpcy5nZXRBdHRyaWJ1dGUoJ2hlaWdodCcpfVxuICAgICAgICBmcmFtZWJvcmRlcj1cIjBcIlxuICAgICAgICB0aXRsZT1cInBjaUNvbnRhaW5lclwiXG4gICAgICAgIGlkPVwicGNpQ29udGFpbmVyXCJcbiAgICAgID5cbiAgICAgIDwvaWZyYW1lPlxuICAgICAgJHt0aGlzLl9lcnJvck1lc3NhZ2UgJiZcbiAgICAgIGh0bWxgPGRpdiBzdHlsZT1cImNvbG9yOnJlZFwiPlxuICAgICAgICA8aDE+RXJyb3I8L2gxPlxuICAgICAgICAke3RoaXMuX2Vycm9yTWVzc2FnZX1cbiAgICAgIDwvZGl2PmB9YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktY3VzdG9tLWludGVyYWN0aW9uJzogUXRpQ3VzdG9tSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5AY3VzdG9tRWxlbWVudCgncXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlFbmRBdHRlbXB0SW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnY291bnQtYXR0ZW1wdCcgfSlcbiAgcHVibGljIGNvdW50QXR0ZW1wdDogc3RyaW5nID0gJ3RydWUnO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICBwdWJsaWMgdGl0bGU6ICdlbmQgYXR0ZW1wdCc7XG5cbiAgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgLy8gbm90IGltcGxlbWVudGVkIGJ5IGRlc2lnblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICAvLyB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICAvLyBub3QgaW1wbGVtZW50ZWQgYnkgZGVzaWduXG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPGJ1dHRvbiA/ZGlzYWJsZWQ9JHt0aGlzLmRpc2FibGVkfSBwYXJ0PVwiYnV0dG9uXCIgQGNsaWNrPSR7dGhpcy5lbmRBdHRlbXB0fT4ke3RoaXMudGl0bGV9PC9idXR0b24+YDtcbiAgfVxuICBwdWJsaWMgZW5kQXR0ZW1wdChlOiBFdmVudCkge1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgnZW5kLWF0dGVtcHQnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHsgcmVzcG9uc2VJZGVudGlmaWVyOiB0aGlzLnJlc3BvbnNlSWRlbnRpZmllciwgY291bnRBdHRlbXB0OiB0aGlzLmNvdW50QXR0ZW1wdCA9PT0gJ3RydWUnIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZW5kLWF0dGVtcHQtaW50ZXJhY3Rpb24nOiBRdGlFbmRBdHRlbXB0SW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL2RyYWctZHJvcC9kcmFnLWRyb3AtaW50ZXJhY3Rpb24tbWl4aW4nO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlHYXBNYXRjaEludGVyYWN0aW9uIGV4dGVuZHMgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluKEludGVyYWN0aW9uLCAncXRpLWdhcC10ZXh0JywgZmFsc2UsICdxdGktZ2FwJykge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMC41cmVtO1xuICAgICAgfVxuXG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtdG9wKSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtYm90dG9tKSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTtcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1sZWZ0KSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtcmlnaHQpIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlO1xuICAgICAgfVxuICAgICAgLyogW3BhcnQ9J2Ryb3BzJ10gLCAqL1xuICAgICAgW3BhcnQ9J2RyYWdzJ10ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgICAgZmxleDogMTtcbiAgICAgICAgZ2FwOiAwLjVyZW07XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdCBuYW1lPVwicHJvbXB0XCI+IDwvc2xvdD48c2xvdCBwYXJ0PVwiZHJhZ3NcIiBuYW1lPVwicXRpLWdhcC10ZXh0XCI+PC9zbG90PiA8c2xvdCBwYXJ0PVwiZHJvcHNcIj48L3Nsb3Q+YDtcbiAgfVxuXG4gIHNldCBjb3JyZWN0UmVzcG9uc2UodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgbGV0IG1hdGNoZXM6IHsgdGV4dDogc3RyaW5nOyBnYXA6IHN0cmluZyB9W10gPSBbXTtcbiAgICBjb25zdCByZXNwb25zZSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuXG4gICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICBtYXRjaGVzID0gcmVzcG9uc2UubWFwKHggPT4ge1xuICAgICAgICBjb25zdCBzcGxpdCA9IHguc3BsaXQoJyAnKTtcbiAgICAgICAgcmV0dXJuIHsgdGV4dDogc3BsaXRbMF0sIGdhcDogc3BsaXRbMV0gfTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGdhcHMgPSB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1nYXAnKTtcbiAgICBnYXBzLmZvckVhY2goKGdhcCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBnYXAuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgICBjb25zdCB0ZXh0SWRlbnRpZmllciA9IG1hdGNoZXMuZmluZCh4ID0+IHguZ2FwID09PSBpZGVudGlmaWVyKT8udGV4dDtcbiAgICAgIGNvbnN0IHRleHQgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoYHF0aS1nYXAtdGV4dFtpZGVudGlmaWVyPVwiJHt0ZXh0SWRlbnRpZmllcn1cIl1gKT8udGV4dENvbnRlbnQudHJpbSgpO1xuICAgICAgaWYgKHRleHRJZGVudGlmaWVyICYmIHRleHQpIHtcbiAgICAgICAgaWYgKCFnYXAubmV4dEVsZW1lbnRTaWJsaW5nPy5jbGFzc0xpc3QuY29udGFpbnMoJ2NvcnJlY3Qtb3B0aW9uJykpIHtcbiAgICAgICAgICBjb25zdCB0ZXh0U3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgICB0ZXh0U3Bhbi5jbGFzc0xpc3QuYWRkKCdjb3JyZWN0LW9wdGlvbicpO1xuICAgICAgICAgIHRleHRTcGFuLnRleHRDb250ZW50ID0gdGV4dDtcbiAgICAgICAgICBnYXAuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIHRleHRTcGFuKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChnYXAubmV4dEVsZW1lbnRTaWJsaW5nPy5jbGFzc0xpc3QuY29udGFpbnMoJ2NvcnJlY3Qtb3B0aW9uJykpIHtcbiAgICAgICAgZ2FwLm5leHRFbGVtZW50U2libGluZy5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uJzogUXRpR2FwTWF0Y2hJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgc3ZnIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHF1ZXJ5LCBxdWVyeUFzc2lnbmVkRWxlbWVudHMsIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgaWZEZWZpbmVkIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvaWYtZGVmaW5lZC5qcyc7XG5pbXBvcnQgeyByZXBlYXQgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9yZXBlYXQuanMnO1xuaW1wb3J0IHsgcG9zaXRpb25Ib3RzcG90cyB9IGZyb20gJy4uL2ludGVybmFsL2hvdHNwb3RzL2hvdHNwb3QnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5pbXBvcnQgeyBRdGlIb3RzcG90Q2hvaWNlIH0gZnJvbSAnLi4vcXRpLWhvdHNwb3QtY2hvaWNlJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1ncmFwaGljLWFzc29jaWF0ZS1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpR3JhcGhpY0Fzc29jaWF0ZUludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBjaG9pY2VPcmRlcmluZzogYm9vbGVhbjtcbiAgaG90c3BvdHM7XG4gIHN0YXJ0UG9pbnQgPSBudWxsO1xuICBlbmRQb2ludCA9IG51bGw7XG4gIEBzdGF0ZSgpIF9saW5lcyA9IFtdO1xuICBAc3RhdGUoKSBzdGFydENvb3JkOiB7IHg6IGFueTsgeTogYW55IH07XG4gIEBzdGF0ZSgpIG1vdXNlQ29vcmQ6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfTtcbiAgQHF1ZXJ5KCdzdmcnKSBzdmdDb250YWluZXI7XG4gIEBxdWVyeUFzc2lnbmVkRWxlbWVudHMoeyBzZWxlY3RvcjogJ2ltZycgfSkgZ3JJbWFnZTtcblxuICAvLyB0YXJnZXQgdGhlIG1haW4gc2xvdCBtYWtlIGl0IHJlbGF0aXZlIGFuZCBmaXQgd2l0aCB0aGUgY29udGVuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgc2xvdDpub3QoW25hbWU9J3Byb21wdCddKSB7XG4gICAgICAgIC8vIHBvc2l0aW9uOiByZWxhdGl2ZTsgLyogcXRpLWhvdHNwb3QtY2hvaWNlIHJlbGF0aXZlIHRvIHRoZSBzbG90ICovXG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB3aWR0aDogZml0LWNvbnRlbnQ7IC8qIGhvdHNwb3RzIG5vdCBzdHJldGNoaW5nIGZ1cnRoZXIgaWYgaW1hZ2UgaXMgYXQgbWF4IHNpemUgKi9cbiAgICAgIH1cbiAgICAgIDo6c2xvdHRlZChpbWcpIHtcbiAgICAgICAgLyogaW1hZ2Ugbm90IHNlbGVjdGFibGUgYW55bW9yZSAqL1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICB9XG4gICAgICA6OnNsb3R0ZWQocXRpLWFzc29jaWFibGUtaG90c3BvdCkge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgICAgIH1cbiAgICAgIGxpbmUtY29udGFpbmVyIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIH1cbiAgICAgIHN2ZyB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgdG9wOiAwcHg7XG4gICAgICAgIGxlZnQ6IDBweDtcbiAgICAgIH1cbiAgICBgXG4gIF07XG4gIHN2ZzogU1ZHU1ZHRWxlbWVudDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWhvdHNwb3QnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG5cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5fbGluZXMgPSBbXTtcbiAgfVxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbGluZXMubGVuZ3RoID4gMDtcbiAgfVxuICBzZXQgdmFsdWUodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgIHRoaXMuX2xpbmVzID0gdmFsO1xuICAgIH1cbiAgfVxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9saW5lcztcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPGxpbmUtY29udGFpbmVyPlxuICAgICAgICA8c3ZnXG4gICAgICAgICAgd2lkdGg9JHtpZkRlZmluZWQodGhpcy5nckltYWdlWzBdPy53aWR0aCl9XG4gICAgICAgICAgaGVpZ2h0PSR7aWZEZWZpbmVkKHRoaXMuZ3JJbWFnZVswXT8uaGVpZ2h0KX1cbiAgICAgICAgICB2aWV3Ym94PVwiMCAwICR7dGhpcy5nckltYWdlWzBdPy53aWR0aH0gJHt0aGlzLmdySW1hZ2VbMF0/LmhlaWdodH1cIlxuICAgICAgICA+XG4gICAgICAgICAgJHtyZXBlYXQoXG4gICAgICAgICAgICB0aGlzLl9saW5lcyxcbiAgICAgICAgICAgIGxpbmUgPT4gbGluZSxcbiAgICAgICAgICAgIChsaW5lLCBpbmRleCkgPT4gc3ZnYFxuICAgICAgICAgICAgICA8bGluZVxuICAgICAgICAgICAgICAgIHBhcnQ9XCJsaW5lXCJcbiAgICAgICAgICAgICAgICB4MT0ke3BhcnNlSW50KHRoaXMucXVlcnlTZWxlY3RvcjxTVkdMaW5lRWxlbWVudD4oJ1tpZGVudGlmaWVyPScgKyBsaW5lLnNwbGl0KCcgJylbMF0gKyAnXScpLnN0eWxlLmxlZnQpfVxuICAgICAgICAgICAgICAgIHkxPSR7cGFyc2VJbnQodGhpcy5xdWVyeVNlbGVjdG9yPFNWR0xpbmVFbGVtZW50PignW2lkZW50aWZpZXI9JyArIGxpbmUuc3BsaXQoJyAnKVswXSArICddJykuc3R5bGUudG9wKX1cbiAgICAgICAgICAgICAgICB4Mj0ke3BhcnNlSW50KHRoaXMucXVlcnlTZWxlY3RvcjxTVkdMaW5lRWxlbWVudD4oJ1tpZGVudGlmaWVyPScgKyBsaW5lLnNwbGl0KCcgJylbMV0gKyAnXScpLnN0eWxlLmxlZnQpfVxuICAgICAgICAgICAgICAgIHkyPSR7cGFyc2VJbnQodGhpcy5xdWVyeVNlbGVjdG9yPFNWR0xpbmVFbGVtZW50PignW2lkZW50aWZpZXI9JyArIGxpbmUuc3BsaXQoJyAnKVsxXSArICddJykuc3R5bGUudG9wKX1cbiAgICAgICAgICAgICAgICBzdHJva2U9XCJyZWRcIlxuICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIlxuICAgICAgICAgICAgICAgIEBjbGljaz0keyhlOiBFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2xpbmVzID0gdGhpcy5fbGluZXMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleCk7XG4gICAgICAgICAgICAgICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLl9saW5lcyk7XG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIGBcbiAgICAgICAgICApfVxuICAgICAgICAgICR7dGhpcy5zdGFydFBvaW50ICYmXG4gICAgICAgICAgc3ZnYDxsaW5lXG4gICAgICAgICAgICBwYXJ0PVwicG9pbnRcIlxuICAgICAgICAgICAgeDE9JHt0aGlzLnN0YXJ0Q29vcmQueH1cbiAgICAgICAgICAgIHkxPSR7dGhpcy5zdGFydENvb3JkLnl9XG4gICAgICAgICAgICB4Mj0ke3RoaXMubW91c2VDb29yZC54fVxuICAgICAgICAgICAgeTI9JHt0aGlzLm1vdXNlQ29vcmQueX1cbiAgICAgICAgICAgIHN0cm9rZT1cInJlZFwiXG4gICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCJcbiAgICAgICAgICAvPmB9XG4gICAgICAgIDwvc3ZnPlxuICAgICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICA8L2xpbmUtY29udGFpbmVyPmA7XG4gIH1cblxuICBwcml2YXRlIHBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIoZTogQ3VzdG9tRXZlbnQ8UXRpSG90c3BvdENob2ljZT4pOiB2b2lkIHtcbiAgICBjb25zdCBpbWcgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpIGFzIEhUTUxJbWFnZUVsZW1lbnQ7XG4gICAgY29uc3QgaG90c3BvdCA9IGUudGFyZ2V0IGFzIFF0aUhvdHNwb3RDaG9pY2U7XG4gICAgY29uc3QgY29vcmRzID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ2Nvb3JkcycpO1xuICAgIGNvbnN0IHNoYXBlID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ3NoYXBlJyk7XG4gICAgY29uc3QgY29vcmRzTnVtYmVyID0gY29vcmRzLnNwbGl0KCcsJykubWFwKHMgPT4gcGFyc2VJbnQocykpO1xuICAgIHBvc2l0aW9uSG90c3BvdHMoc2hhcGUsIGNvb3Jkc051bWJlciwgaW1nLCBob3RzcG90KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGZpcnN0VXBkYXRlZChlKTogdm9pZCB7XG4gICAgc3VwZXIuZmlyc3RVcGRhdGVkKGUpO1xuXG4gICAgdGhpcy5ob3RzcG90cyA9IHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLWFzc29jaWFibGUtaG90c3BvdCcpO1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgZXZlbnQgPT4ge1xuICAgICAgdGhpcy5tb3VzZUNvb3JkID0ge1xuICAgICAgICB4OiBldmVudC5jbGllbnRYIC0gdGhpcy5nckltYWdlWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQsXG4gICAgICAgIHk6IGV2ZW50LmNsaWVudFkgLSB0aGlzLmdySW1hZ2VbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgdGhpcy5ob3RzcG90cy5mb3JFYWNoKGhvdHNwb3QgPT4ge1xuICAgICAgaG90c3BvdC5zdHlsZS5sZWZ0ID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ2Nvb3JkcycpLnNwbGl0KCcsJylbMF0gKyAncHgnO1xuICAgICAgaG90c3BvdC5zdHlsZS50b3AgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJykuc3BsaXQoJywnKVsxXSArICdweCc7XG5cbiAgICAgIGhvdHNwb3QuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldmVudCA9PiB7XG4gICAgICAgIGlmICghdGhpcy5zdGFydFBvaW50KSB7XG4gICAgICAgICAgdGhpcy5zdGFydFBvaW50ID0gZXZlbnQudGFyZ2V0O1xuXG4gICAgICAgICAgdGhpcy5zdGFydENvb3JkID0ge1xuICAgICAgICAgICAgeDogdGhpcy5zdGFydFBvaW50LmdldEF0dHJpYnV0ZSgnY29vcmRzJykuc3BsaXQoJywnKVswXSxcbiAgICAgICAgICAgIHk6IHRoaXMuc3RhcnRQb2ludC5nZXRBdHRyaWJ1dGUoJ2Nvb3JkcycpLnNwbGl0KCcsJylbMV1cbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmVuZFBvaW50KSB7XG4gICAgICAgICAgdGhpcy5lbmRQb2ludCA9IGV2ZW50LnRhcmdldDtcblxuICAgICAgICAgIHRoaXMuX2xpbmVzID0gW1xuICAgICAgICAgICAgLi4udGhpcy5fbGluZXMsXG4gICAgICAgICAgICB0aGlzLnN0YXJ0UG9pbnQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgKyAnICcgKyB0aGlzLmVuZFBvaW50LmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpXG4gICAgICAgICAgXTtcbiAgICAgICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLl9saW5lcyk7XG4gICAgICAgICAgdGhpcy5zdGFydFBvaW50ID0gbnVsbDtcbiAgICAgICAgICB0aGlzLmVuZFBvaW50ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1ob3RzcG90JywgdGhpcy5wb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZ3JhcGhpYy1hc3NvY2lhdGUtaW50ZXJhY3Rpb24nOiBRdGlHcmFwaGljQXNzb2NpYXRlSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBRdGlIb3RzcG90Q2hvaWNlIH0gZnJvbSAnLi4vLi4vcXRpLWhvdHNwb3QtY2hvaWNlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHBvc2l0aW9uSG90c3BvdHMoXG4gIHNoYXBlOiBzdHJpbmcsXG4gIGNvb3Jkc051bWJlcjogbnVtYmVyW10sXG4gIGltZzogSFRNTEltYWdlRWxlbWVudCxcbiAgaG90c3BvdDogUXRpSG90c3BvdENob2ljZVxuKSB7XG4gIHN3aXRjaCAoc2hhcGUpIHtcbiAgICBjYXNlICdjaXJjbGUnOlxuICAgICAge1xuICAgICAgICBjb25zdCBbY2VudGVyWCwgY2VudGVyWSwgcmFkaXVzXSA9IGNvb3Jkc051bWJlcjtcbiAgICAgICAgY29uc3QgY2VudGVyWFBlciA9IChjZW50ZXJYIC8gaW1nLndpZHRoKSAqIDEwMDtcbiAgICAgICAgY29uc3QgY2VudGVyWVBlciA9IChjZW50ZXJZIC8gaW1nLmhlaWdodCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IHJhZGl1c1BlciA9IChyYWRpdXMgLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSBjZW50ZXJYUGVyIC0gcmFkaXVzUGVyICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLnRvcCA9IGNlbnRlcllQZXIgLSByYWRpdXNQZXIgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUud2lkdGggPSBob3RzcG90LnN0eWxlLmhlaWdodCA9IDQgKiByYWRpdXNQZXIgKyAncHgnO1xuICAgICAgICBob3RzcG90LnN0eWxlLmJvcmRlclJhZGl1cyA9IGA5OTk5cHhgO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdyZWN0JzpcbiAgICAgIHtcbiAgICAgICAgY29uc3QgW2xlZnRYLCB0b3BZLCByaWdodFgsIGJvdHRvbVldID0gY29vcmRzTnVtYmVyO1xuICAgICAgICBjb25zdCBsZWZ0WFBlciA9IChsZWZ0WCAvIGltZy53aWR0aCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IHRvcFlQZXIgPSAodG9wWSAvIGltZy5oZWlnaHQpICogMTAwO1xuICAgICAgICBjb25zdCByaWdodFhQZXIgPSAocmlnaHRYIC8gaW1nLndpZHRoKSAqIDEwMDtcbiAgICAgICAgY29uc3QgYm90dG9tWVBlciA9IChib3R0b21ZIC8gaW1nLmhlaWdodCkgKiAxMDA7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUubGVmdCA9IGxlZnRYUGVyICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLnRvcCA9IHRvcFlQZXIgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUud2lkdGggPSByaWdodFhQZXIgLSBsZWZ0WFBlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS5oZWlnaHQgPSBib3R0b21ZUGVyIC0gdG9wWVBlciArICclJztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAncG9seSc6XG4gICAgICB7XG4gICAgICAgIC8vIGZyb20gYSxiLGMsZCxlLGYgPT4gW3t4OmEsIHk6Yn0se3g6YywgeTpkfSx7eDplLCB5OmZ9XVxuICAgICAgICBjb25zdCBwb2x5Y29vcmRzID0gY29vcmRzTnVtYmVyLnJlZHVjZSgoYWNjLCBjdXJyZW50VmFsdWUsIGN1cnJlbnRJbmRleCwgcG9seUMpID0+IHtcbiAgICAgICAgICBpZiAoY3VycmVudEluZGV4ICUgMiA9PT0gMSkge1xuICAgICAgICAgICAgY29uc3QgbGFzdFZhbCA9IGFjYy5wb3AoKTtcbiAgICAgICAgICAgIGFjY1thY2MubGVuZ3RoXSA9IHsgeDogbGFzdFZhbCwgeTogcG9seUNbY3VycmVudEluZGV4XSB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhY2MucHVzaChjdXJyZW50VmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCBbXSk7XG5cbiAgICAgICAgLy8gY2FsY3VsYXRlIGJvdW5kaW5nIGJveCBieSBmaW5kaW5nIHRoZSBtYXggYXggbWluIGNvb3JkaW5hdGVzIG9mIHggYW5kIHlcbiAgICAgICAgY29uc3QgbGVmdFggPSBNYXRoLm1pbiguLi5wb2x5Y29vcmRzLm1hcChwb2ludCA9PiBwb2ludC54KSk7XG4gICAgICAgIGNvbnN0IHJpZ2h0WCA9IE1hdGgubWF4KC4uLnBvbHljb29yZHMubWFwKHBvaW50ID0+IHBvaW50LngpKTtcbiAgICAgICAgY29uc3QgdG9wWSA9IE1hdGgubWluKC4uLnBvbHljb29yZHMubWFwKHBvaW50ID0+IHBvaW50LnkpKTtcbiAgICAgICAgY29uc3QgYm90dG9tWSA9IE1hdGgubWF4KC4uLnBvbHljb29yZHMubWFwKHBvaW50ID0+IHBvaW50LnkpKTtcblxuICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIHJlbGF0aXZlIGRpc3RhbmNlIGNhdXNlIHdlIHdhbnQgdG8gdXNlIHBlcmNlbnRhZ2VzXG4gICAgICAgIGNvbnN0IGxlZnRYUGVyID0gKGxlZnRYIC8gaW1nLndpZHRoKSAqIDEwMDtcbiAgICAgICAgY29uc3QgdG9wWVBlciA9ICh0b3BZIC8gaW1nLmhlaWdodCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IHJpZ2h0WFBlciA9IChyaWdodFggLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBjb25zdCBib3R0b21ZUGVyID0gKGJvdHRvbVkgLyBpbWcuaGVpZ2h0KSAqIDEwMDtcblxuICAgICAgICAvLyBzZXQgdGhlIGhvdHNwb3Qgb24geCx5IGFuZCBzZXQgdGhlIHdpZHRoIGFuZCBoZWlnaHQgaW4gcGVyY2VudGFnZXNcbiAgICAgICAgaG90c3BvdC5zdHlsZS5sZWZ0ID0gKGxlZnRYIC8gaW1nLndpZHRoKSAqIDEwMCArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS50b3AgPSAodG9wWSAvIGltZy5oZWlnaHQpICogMTAwICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLndpZHRoID0gcmlnaHRYUGVyIC0gbGVmdFhQZXIgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUuaGVpZ2h0ID0gYm90dG9tWVBlciAtIHRvcFlQZXIgKyAnJSc7XG5cbiAgICAgICAgLy8gYWxsIHRoZSBwb2x5Z29uIHBvaW50cyBzaG91bGQgYmUgY29ycmVjdGVkIGNhdXNlZCB0aGV5IGFyZSBmcm9tXG4gICAgICAgIC8vIGltYWdlIDAsMCBwb2ludCwgYW5kIHNob3VsZCBiZSBmcm9tIHRoZSBob3RzcG90IHBvaW50IHdoaWNoIGFscmVhZHlcbiAgICAgICAgLy8gaGFzIGJlZW4gb2Zmc2V0dGVkIGZyb20gdGhlIGltYWdlIGluIHRoZSBwcmV2aW91cyBmZXcgbGluZXMgb2YgY29kZVxuICAgICAgICAvLyBhbHNvIHRoZSBwb2ludHMgaGF2ZSBhIHJlbGF0aXZlIGRpc3RhbmNlIHRvIHRoZSBpbWFnZSwgYnV0IG5vdyBoYXZlXG4gICAgICAgIC8vIHRvIGhhdmUgYSByZWxhdGl2ZSBkaXN0YW5jZSBmcm9tIHRoZSB3aWR0aCBvZiB0aGUgaG90c3BvdFxuICAgICAgICBjb25zdCBwb2x5Z29uRGF0YSA9IHBvbHljb29yZHMubWFwKHBvaW50ID0+ICh7XG4gICAgICAgICAgeDogKChwb2ludC54IC0gbGVmdFgpIC8gKHJpZ2h0WCAtIGxlZnRYKSkgKiAxMDAsXG4gICAgICAgICAgeTogKChwb2ludC55IC0gdG9wWSkgLyAoYm90dG9tWSAtIHRvcFkpKSAqIDEwMFxuICAgICAgICB9KSk7XG5cbiAgICAgICAgLy8gY3JlYXRlIGNsaXAgcGF0aCBjb29yZGluYXRlIHN0eWxlIGluIHBlcmNlbnRhZ2VzXG4gICAgICAgIGNvbnN0IHBvbHlEID0gcG9seWdvbkRhdGEubWFwKHAgPT4gTWF0aC5yb3VuZChwLngpICsgJyUgJyArIE1hdGgucm91bmQocC55KSArICclJykuam9pbignLCcpO1xuXG4gICAgICAgIC8vIDUwJSAwJSwgMTAwJSA1MCUsIDUwJSAxMDAlLCAwJSA1MCVcbiAgICAgICAgaG90c3BvdC5zdHlsZS5jbGlwUGF0aCA9IGBwb2x5Z29uKCR7cG9seUR9KWA7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBicmVhaztcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvZHJhZy1kcm9wL2RyYWctZHJvcC1pbnRlcmFjdGlvbi1taXhpbic7XG5pbXBvcnQgeyBRdGlIb3RzcG90Q2hvaWNlIH0gZnJvbSAnLi4vcXRpLWhvdHNwb3QtY2hvaWNlJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlHcmFwaGljR2FwTWF0Y2hJbnRlcmFjdGlvbiBleHRlbmRzIERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbihcbiAgSW50ZXJhY3Rpb24sXG4gICdxdGktZ2FwLWltZycsXG4gIGZhbHNlLFxuICAncXRpLWFzc29jaWFibGUtaG90c3BvdCdcbikge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB9XG4gICAgc2xvdFtuYW1lPSdxdGktZ2FwLWltZyddIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBnYXA6IDFyZW07XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDxzbG90IG5hbWU9XCJxdGktZ2FwLWltZ1wiPjwvc2xvdD5gO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKGU6IEN1c3RvbUV2ZW50PG51bGw+KTogdm9pZCB7XG4gICAgY29uc3QgaW1nID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdpbWcnKSBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuICAgIGNvbnN0IGhvdHNwb3QgPSBlLnRhcmdldCBhcyBRdGlIb3RzcG90Q2hvaWNlO1xuICAgIGNvbnN0IGNvb3JkcyA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKTtcbiAgICBjb25zdCBzaGFwZSA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdzaGFwZScpO1xuICAgIGNvbnN0IGNvb3Jkc051bWJlciA9IGNvb3Jkcy5zcGxpdCgnLCcpLm1hcChzID0+IHBhcnNlSW50KHMpKTtcblxuICAgIC8vIHBvc2l0aW9uSG90c3BvdHMoc2hhcGUsIGNvb3Jkc051bWJlciwgaW1nLCBob3RzcG90KTtcbiAgICBzd2l0Y2ggKHNoYXBlKSB7XG4gICAgICBjYXNlICdjaXJjbGUnOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgW2NlbnRlclgsIGNlbnRlclksIHJhZGl1c10gPSBjb29yZHNOdW1iZXI7XG4gICAgICAgICAgaG90c3BvdC5zdHlsZS5sZWZ0ID0gY2VudGVyWCAtIHJhZGl1cyArICdweCc7XG4gICAgICAgICAgaG90c3BvdC5zdHlsZS50b3AgPSBjZW50ZXJZIC0gcmFkaXVzICsgJ3B4JztcbiAgICAgICAgICBob3RzcG90LnN0eWxlLndpZHRoID0gaG90c3BvdC5zdHlsZS5oZWlnaHQgPSAyICogcmFkaXVzICsgJ3B4JztcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAncmVjdCc6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBbbGVmdFgsIHRvcFksIHJpZ2h0WCwgYm90dG9tWV0gPSBjb29yZHNOdW1iZXI7XG4gICAgICAgICAgaG90c3BvdC5zdHlsZS5sZWZ0ID0gbGVmdFggKyAncHgnO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gdG9wWSArICdweCc7XG4gICAgICAgICAgaG90c3BvdC5zdHlsZS53aWR0aCA9IHJpZ2h0WCAtIGxlZnRYICsgJ3B4JztcbiAgICAgICAgICBob3RzcG90LnN0eWxlLmhlaWdodCA9IGJvdHRvbVkgLSB0b3BZICsgJ3B4JztcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1ob3RzcG90JywgdGhpcy5wb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKTtcbiAgfVxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWhvdHNwb3QnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ncmFwaGljLWdhcC1tYXRjaC1pbnRlcmFjdGlvbic6IFF0aUdyYXBoaWNHYXBNYXRjaEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IENob2ljZSwgQ2hvaWNlc01peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvY2hvaWNlcy9jaG9pY2VzLm1peGluJztcbmltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuXG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcG9zaXRpb25Ib3RzcG90cyB9IGZyb20gJy4uL2ludGVybmFsL2hvdHNwb3RzL2hvdHNwb3QnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbnR5cGUgSG90c3BvdENob2ljZSA9IENob2ljZSAmIHsgb3JkZXI6IG51bWJlciB9O1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdyYXBoaWMtb3JkZXItaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUdyYXBoaWNPcmRlckludGVyYWN0aW9uIGV4dGVuZHMgQ2hvaWNlc01peGluKEludGVyYWN0aW9uLCAncXRpLWhvdHNwb3QtY2hvaWNlJykge1xuICBjaG9pY2VPcmRlcmluZzogYm9vbGVhbjtcblxuICBwcm90ZWN0ZWQgX2Nob2ljZUVsZW1lbnRzOiBDaG9pY2VbXSA9IFtdO1xuXG4gIC8vIGRvIG5vdCBzZWxlY3QgKCBoaWdobGlnaHQgYmx1ZSwgdGhlIGltYWdlKVxuICAvLyB0YXJnZXQgdGhlIG1haW4gc2xvdCBtYWtlIGl0IHJlbGF0aXZlIGFuZCBmaXQgd2l0aCB0aGUgY29udGVuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgc2xvdDpub3QoW25hbWU9J3Byb21wdCddKSB7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsgLyogcXRpLWhvdHNwb3QtY2hvaWNlIHJlbGF0aXZlIHRvIHRoZSBzbG90ICovXG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB3aWR0aDogZml0LWNvbnRlbnQ7IC8qIGhvdHNwb3RzIG5vdCBzdHJldGNoaW5nIGZ1cnRoZXIgaWYgaW1hZ2UgaXMgYXQgbWF4IHNpemUgKi9cbiAgICAgIH1cbiAgICAgIDo6c2xvdHRlZChpbWcpIHtcbiAgICAgICAgLyogaW1hZ2Ugbm90IHNlbGVjdGFibGUgYW55bW9yZSAqL1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBwcm9tcHQgLS0+XG4gICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBpbWFnZSBhbmQgaG90c3BvdHMgLS0+XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0SG90c3BvdE9yZGVyKGU6IEN1c3RvbUV2ZW50PHsgaWRlbnRpZmllcjogc3RyaW5nOyBjaGVja2VkOiBib29sZWFuIH0+KTogdm9pZCB7XG4gICAgY29uc3QgeyBpZGVudGlmaWVyIH0gPSBlLmRldGFpbDtcblxuICAgIGNvbnN0IGhvdHNwb3QgPSB0aGlzLl9jaG9pY2VFbGVtZW50cy5maW5kKGVsID0+IGVsLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpID09PSBpZGVudGlmaWVyKSBhcyBIb3RzcG90Q2hvaWNlO1xuXG4gICAgY29uc3QgbWF4U2VsZWN0aW9uID0gdGhpcy5fY2hvaWNlRWxlbWVudHMubGVuZ3RoO1xuICAgIGlmICghdGhpcy5jaG9pY2VPcmRlcmluZykge1xuICAgICAgdGhpcy5jaG9pY2VPcmRlcmluZyA9IHRydWU7XG4gICAgICBpZiAoaG90c3BvdC5vcmRlciA9PSBudWxsKSB7XG4gICAgICAgIGlmICgodGhpcy5fY2hvaWNlRWxlbWVudHMgYXMgSG90c3BvdENob2ljZVtdKS5maWx0ZXIoaSA9PiBpLm9yZGVyID4gMCkubGVuZ3RoID49IG1heFNlbGVjdGlvbikge1xuICAgICAgICAgIHRoaXMuY2hvaWNlT3JkZXJpbmcgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm47IC8vIGRvbid0IGRvIGFueXRoaW5nIGlmIHVzZXIgYWxyZWFkeSBzZWxlY3RlZCA1IGltYWdlcy5cbiAgICAgICAgfVxuICAgICAgICBob3RzcG90Lm9yZGVyID0gKHRoaXMuX2Nob2ljZUVsZW1lbnRzIGFzIEhvdHNwb3RDaG9pY2VbXSkuZmlsdGVyKGkgPT4gISFpLm9yZGVyKS5sZW5ndGggKyAxO1xuICAgICAgICB0aGlzLmNob2ljZU9yZGVyaW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICh0aGlzLl9jaG9pY2VFbGVtZW50cyBhcyBIb3RzcG90Q2hvaWNlW10pLmZvckVhY2goaG90c3BvdCA9PiB7XG4gICAgICAgICAgaWYgKGhvdHNwb3Qub3JkZXIgPiBob3RzcG90Lm9yZGVyKSB7XG4gICAgICAgICAgICBob3RzcG90Lm9yZGVyLS07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBob3RzcG90O1xuICAgICAgICB9KTtcbiAgICAgICAgaG90c3BvdC5vcmRlciA9IG51bGw7XG4gICAgICB9XG4gICAgICB0aGlzLmNob2ljZU9yZGVyaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKGU6IEN1c3RvbUV2ZW50PFF0aUhvdHNwb3RDaG9pY2U+KTogdm9pZCB7XG4gICAgY29uc3QgaW1nID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdpbWcnKSBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuICAgIGNvbnN0IGhvdHNwb3QgPSBlLnRhcmdldCBhcyBRdGlIb3RzcG90Q2hvaWNlO1xuICAgIGNvbnN0IGNvb3JkcyA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKTtcbiAgICBjb25zdCBzaGFwZSA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdzaGFwZScpO1xuICAgIGNvbnN0IGNvb3Jkc051bWJlciA9IGNvb3Jkcy5zcGxpdCgnLCcpLm1hcChzID0+IHBhcnNlSW50KHMpKTtcblxuICAgIHBvc2l0aW9uSG90c3BvdHMoc2hhcGUsIGNvb3Jkc051bWJlciwgaW1nLCBob3RzcG90KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdhY3RpdmF0ZS1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnNldEhvdHNwb3RPcmRlcik7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdyZWdpc3Rlci1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdhY3RpdmF0ZS1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnNldEhvdHNwb3RPcmRlcik7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZWdpc3Rlci1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uJzogUXRpR3JhcGhpY09yZGVySW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IENob2ljZXNNaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL2Nob2ljZXMvY2hvaWNlcy5taXhpbic7XG5pbXBvcnQgeyBwb3NpdGlvbkhvdHNwb3RzIH0gZnJvbSAnLi4vaW50ZXJuYWwvaG90c3BvdHMvaG90c3BvdCc7XG5pbXBvcnQgeyBRdGlIb3RzcG90Q2hvaWNlIH0gZnJvbSAnLi4vcXRpLWhvdHNwb3QtY2hvaWNlJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWhvdHNwb3QtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUhvdHNwb3RJbnRlcmFjdGlvbiBleHRlbmRzIENob2ljZXNNaXhpbihJbnRlcmFjdGlvbiwgJ3F0aS1ob3RzcG90LWNob2ljZScpIHtcbiAgLy8gZG8gbm90IHNlbGVjdCAoIGhpZ2hsaWdodCBibHVlLCB0aGUgaW1hZ2UpXG4gIC8vIHRhcmdldCB0aGUgbWFpbiBzbG90IG1ha2UgaXQgcmVsYXRpdmUgYW5kIGZpdCB3aXRoIHRoZSBjb250ZW5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICBzbG90Om5vdChbbmFtZT0ncHJvbXB0J10pIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOyAvKiBxdGktaG90c3BvdC1jaG9pY2UgcmVsYXRpdmUgdG8gdGhlIHNsb3QgKi9cbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHdpZHRoOiBmaXQtY29udGVudDsgLyogaG90c3BvdHMgbm90IHN0cmV0Y2hpbmcgZnVydGhlciBpZiBpbWFnZSBpcyBhdCBtYXggc2l6ZSAqL1xuICAgICAgfVxuICAgICAgOjpzbG90dGVkKGltZykge1xuICAgICAgICAvKiBpbWFnZSBub3Qgc2VsZWN0YWJsZSBhbnltb3JlICovXG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgLyogd2lkdGg6MTAwJTsgKi9cbiAgICAgIH1cbiAgICBgXG4gIF07XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBwcm9tcHQgLS0+XG4gICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBpbWFnZSBhbmQgaG90c3BvdHMgLS0+XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgcG9zaXRpb25Ib3RzcG90T25SZWdpc3RlcihlOiBDdXN0b21FdmVudDxRdGlIb3RzcG90Q2hvaWNlPik6IHZvaWQge1xuICAgIGNvbnN0IGltZyA9IHRoaXMucXVlcnlTZWxlY3RvcignaW1nJykgYXMgSFRNTEltYWdlRWxlbWVudDtcbiAgICBjb25zdCBob3RzcG90ID0gZS50YXJnZXQgYXMgUXRpSG90c3BvdENob2ljZTtcbiAgICBjb25zdCBjb29yZHMgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJyk7XG4gICAgY29uc3Qgc2hhcGUgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnc2hhcGUnKTtcbiAgICBjb25zdCBjb29yZHNOdW1iZXIgPSBjb29yZHMuc3BsaXQoJywnKS5tYXAocyA9PiBwYXJzZUludChzKSk7XG5cbiAgICBwb3NpdGlvbkhvdHNwb3RzKHNoYXBlLCBjb29yZHNOdW1iZXIsIGltZywgaG90c3BvdCk7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncmVnaXN0ZXItcXRpLWhvdHNwb3QtY2hvaWNlJywgdGhpcy5wb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKTtcbiAgfVxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigndW5yZWdpc3Rlci1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ob3RzcG90LWludGVyYWN0aW9uJzogUXRpSG90c3BvdEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgQ1NTUmVzdWx0R3JvdXAsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvZHJhZy1kcm9wL2RyYWctZHJvcC1pbnRlcmFjdGlvbi1taXhpbic7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB1bnNhZmVIVE1MIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvdW5zYWZlLWh0bWwuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VJbnRlcmFjdGlvbiB9IGZyb20gJy4uLy4uL2ludGVybmFsL2V4cHJlc3Npb24tcmVzdWx0Jztcbi8vIGltcG9ydCB7IFRvdWNoRHJhZ0FuZERyb3AgfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AnO1xuaW1wb3J0ICcuLi9xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJztcbmltcG9ydCB7IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2UgfSBmcm9tICcuLi9xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24uc3R5bGVzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5pbnRlcmZhY2UgQ29sdW1uIHtcbiAgaWQ6IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUm93IHtcbiAgaWQ6IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xuICBpc0NoZWNrZWQ6IGJvb2xlYW47XG59XG5cbkBjdXN0b21FbGVtZW50KCdxdGktbWF0Y2gtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aU1hdGNoSW50ZXJhY3Rpb24gZXh0ZW5kcyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4oXG4gIEludGVyYWN0aW9uLFxuICAncXRpLXNpbXBsZS1tYXRjaC1zZXQ6Zmlyc3Qtb2YtdHlwZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJyxcbiAgZmFsc2UsXG4gICdxdGktc2ltcGxlLW1hdGNoLXNldDpsYXN0LW9mLXR5cGUgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSdcbikge1xuICBzdGF0aWMgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlcztcblxuICByb3dzOiBRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlW107XG4gIGNvbHM6IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2VbXTtcbiAgbGFzdENoZWNrZWRSYWRpbzogSFRNTElucHV0RWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIEBzdGF0ZSgpIF9yZXNwb25zZTogc3RyaW5nIHwgc3RyaW5nW10gPSBbXTtcbiAgLy8gZHJhZ0Ryb3BBcGk6IFRvdWNoRHJhZ0FuZERyb3A7XG4gIGdldCB2YWx1ZSgpOiBzdHJpbmdbXSB7XG4gICAgaWYgKCF0aGlzLmNsYXNzTGlzdC5jb250YWlucygncXRpLW1hdGNoLXRhYnVsYXInKSkgcmV0dXJuIHN1cGVyLnZhbHVlIGFzIHN0cmluZ1tdO1xuICAgIGVsc2UgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlIGFzIHN0cmluZ1tdO1xuICB9XG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZ1tdKSB7XG4gICAgaWYgKCF0aGlzLmNsYXNzTGlzdC5jb250YWlucygncXRpLW1hdGNoLXRhYnVsYXInKSkgc3VwZXIudmFsdWUgPSB2YWw7XG4gICAgZWxzZSB0aGlzLl9yZXNwb25zZSA9IHZhbDtcbiAgfVxuICBAc3RhdGUoKSBjb3JyZWN0T3B0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdyZXNwb25zZS1pZGVudGlmaWVyJyB9KSByZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZyA9ICcnO1xuXG4gIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgLy8gYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTtcbiAgICAvLyB0aGlzLmRyYWdEcm9wQXBpID0gbmV3IFRvdWNoRHJhZ0FuZERyb3AoKTtcbiAgICAvLyB0aGlzLmRyYWdEcm9wQXBpLmFkZERyYWdnYWJsZUVsZW1lbnRzKFxuICAgIC8vICAgdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLW1hdGNoLXNldDpmaXJzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuICAgIC8vICk7XG4gICAgLy8gdGhpcy5kcmFnRHJvcEFwaS5hZGREcm9wcGFibGVFbGVtZW50cyhcbiAgICAvLyAgIHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1tYXRjaC1zZXQ6bGFzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuICAgIC8vICk7XG4gICAgdGhpcy5yb3dzID0gQXJyYXkuZnJvbTxRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlPihcbiAgICAgIHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1tYXRjaC1zZXQ6Zmlyc3Qtb2YtdHlwZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJylcbiAgICApO1xuICAgIHRoaXMuY29scyA9IEFycmF5LmZyb208UXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZT4oXG4gICAgICB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtbWF0Y2gtc2V0Omxhc3Qtb2YtdHlwZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJylcbiAgICApO1xuXG4gICAgdGhpcy52YWx1ZSA9IFtdO1xuICB9XG5cbiAgaGFuZGxlUmFkaW9DbGljayA9IGUgPT4ge1xuICAgIGNvbnN0IHJhZGlvID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBpZiAodGhpcy5sYXN0Q2hlY2tlZFJhZGlvID09PSByYWRpbykge1xuICAgICAgcmFkaW8uY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5sYXN0Q2hlY2tlZFJhZGlvID0gbnVsbDtcbiAgICAgIHRoaXMuaGFuZGxlUmFkaW9DaGFuZ2UoZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubGFzdENoZWNrZWRSYWRpbyA9IHJhZGlvO1xuICAgIH1cbiAgfTtcblxuICBoYW5kbGVSYWRpb0NoYW5nZSA9IGUgPT4ge1xuICAgIGNvbnN0IGNoZWNrYm94ID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBjb25zdCB2YWx1ZSA9IGNoZWNrYm94LnZhbHVlO1xuICAgIGNvbnN0IG5hbWUgPSBjaGVja2JveC5uYW1lO1xuICAgIGNvbnN0IHR5cGUgPSBjaGVja2JveC50eXBlO1xuXG4gICAgaWYgKGNoZWNrYm94LmNoZWNrZWQpIHtcbiAgICAgIGlmICghdGhpcy52YWx1ZSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gW3ZhbHVlXTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy52YWx1ZS5pbmRleE9mKHZhbHVlKSA9PT0gLTEpIHtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5maWx0ZXIodiA9PiB2LmluZGV4T2YobmFtZSkgPT09IC0xKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlID0gWy4uLnRoaXMudmFsdWUsIHZhbHVlXTtcbiAgICAgIH1cbiAgICAgIHRoaXMubGFzdENoZWNrZWRSYWRpbyA9IGNoZWNrYm94O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5maWx0ZXIodiA9PiB2ICE9PSB2YWx1ZSk7XG4gICAgICB0aGlzLmxhc3RDaGVja2VkUmFkaW8gPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDxSZXNwb25zZUludGVyYWN0aW9uPigncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgcmVzcG9uc2VJZGVudGlmaWVyOiB0aGlzLnJlc3BvbnNlSWRlbnRpZmllcixcbiAgICAgICAgICByZXNwb25zZTogQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSA/IFsuLi50aGlzLnZhbHVlXSA6IHRoaXMudmFsdWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9O1xuXG4gIHNldCBjb3JyZWN0UmVzcG9uc2UocmVzcG9uc2VWYWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAocmVzcG9uc2VWYWx1ZSA9PT0gJycpIHtcbiAgICAgIHRoaXMuY29ycmVjdE9wdGlvbnMgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVzcG9uc2VWYWx1ZSkpIHtcbiAgICAgIHRoaXMuY29ycmVjdE9wdGlvbnMgPSByZXNwb25zZVZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICBpZiAoIXRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdxdGktbWF0Y2gtdGFidWxhcicpKSB7XG4gICAgICByZXR1cm4gaHRtbGA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PiA8c2xvdD48L3Nsb3Q+YDtcbiAgICB9XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPHRhYmxlPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgJHt0aGlzLmNvbHMubWFwKChjb2wsIGkpID0+IGh0bWxgPHRoIHBhcnQ9XCJyLWhlYWRlclwiPiR7dW5zYWZlSFRNTChjb2wuaW5uZXJIVE1MKX08L3RoPmApfVxuICAgICAgICA8L3RyPlxuXG4gICAgICAgICR7dGhpcy5yb3dzLm1hcChcbiAgICAgICAgICAocm93LCBySW5kZXgpID0+XG4gICAgICAgICAgICBodG1sYDx0cj5cbiAgICAgICAgICAgICAgPHRkIHBhcnQ9XCJjLWhlYWRlclwiPiR7dW5zYWZlSFRNTChyb3cuaW5uZXJIVE1MKX08L3RkPlxuICAgICAgICAgICAgICAke3RoaXMuY29scy5tYXAoKGNvbCwgY0luZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93SWQgPSByb3cuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sSWQgPSBjb2wuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBgJHtyb3dJZH0gJHtjb2xJZH1gO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSW5Sb3dDb3VudCA9IHRoaXMudmFsdWUuZmlsdGVyKHYgPT4gdi5zcGxpdCgnICcpWzBdID09PSByb3dJZCkubGVuZ3RoIHx8IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hlY2tlZCA9IHRoaXMudmFsdWUuaW5jbHVkZXModmFsdWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnQgPSBgcmIgJHtjaGVja2VkID8gJ3JiLWNoZWNrZWQnIDogJyd9ICR7dGhpcy5jb3JyZWN0T3B0aW9ucy5pbmNsdWRlcyh2YWx1ZSkgPyAncmItY29ycmVjdCcgOiAnJ31gO1xuICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgaWYgbWF0Y2ggbWF4IGlzIGdyZWF0ZXIgdGhhbiAxIGFuZCBtYXggaXMgcmVhY2hlZFxuICAgICAgICAgICAgICAgIGNvbnN0IGRpc2FibGUgPVxuICAgICAgICAgICAgICAgICAgdGhpcy5jb3JyZWN0T3B0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICA6IHJvdy5tYXRjaE1heCA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICA6IHNlbGVjdGVkSW5Sb3dDb3VudCA+PSByb3cubWF0Y2hNYXggJiYgIWNoZWNrZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGh0bWxgPHRkPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9JHtyb3cubWF0Y2hNYXggPT09IDEgPyAncmFkaW8nIDogYGNoZWNrYm94YH1cbiAgICAgICAgICAgICAgICAgICAgcGFydD0ke3BhcnR9XG4gICAgICAgICAgICAgICAgICAgIG5hbWU9JHtyb3dJZH1cbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9JHt2YWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgLmRpc2FibGVkPSR7ZGlzYWJsZX1cbiAgICAgICAgICAgICAgICAgICAgQGNoYW5nZT0ke2UgPT4gdGhpcy5oYW5kbGVSYWRpb0NoYW5nZShlKX1cbiAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7ZSA9PiAocm93Lm1hdGNoTWF4ID09PSAxID8gdGhpcy5oYW5kbGVSYWRpb0NsaWNrKGUpIDogbnVsbCl9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvdGQ+YDtcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICA8L3RyPmBcbiAgICAgICAgKX1cbiAgICAgIDwvdGFibGU+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktbWF0Y2gtaW50ZXJhY3Rpb24nOiBRdGlNYXRjaEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbi8qIFxucXRpLW1hdGNoLWludGVyYWN0aW9uXG5xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uXG4qL1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuLy8gdHNsaW50OmRpc2FibGU6IGluZGVudFxuZXhwb3J0IGNsYXNzIFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2UgZXh0ZW5kcyBBY3RpdmVFbGVtZW50TWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKSB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgICBzbG90IHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICAgIHNsb3RbbmFtZT0ncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSddIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgIH1cbiAgYDtcblxuICAvKiogdGhlIG1pbmltYWwgbnVtYmVyIG9mIHNlbGVjdGlvbnMgYSBjYW5kaWRhdGUgbXVzdCBtYWtlICovXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogTnVtYmVyLFxuICAgIGF0dHJpYnV0ZTogJ21hdGNoLW1pbidcbiAgfSlcbiAgcHVibGljIG1hdGNoTWluOiBudW1iZXIgPSAwO1xuXG4gIC8qKiB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2VsZWN0aW9ucyBhIGNhbmRpZGF0ZSBtdXN0IG1ha2UsIHRoZSBvdGhlciBvcHRpb25zIHdpbGwgYmUgZGlzYWJsZWQgd2hlbiBtYXggb3B0aW9ucyBpcyBjaGVja2VkICovXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogTnVtYmVyLFxuICAgIGF0dHJpYnV0ZTogJ21hdGNoLW1heCdcbiAgfSlcbiAgcHVibGljIG1hdGNoTWF4OiBudW1iZXIgPSAxO1xuXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogQm9vbGVhbixcbiAgICBhdHRyaWJ1dGU6ICdmaXhlZCdcbiAgfSlcbiAgcHVibGljIGZpeGVkID0gZmFsc2U7XG5cbiAgLy8gcGs6IFRoaXMgbmVlZHMgc29tZSBleHBsYW5hdGlvblxuICAvLyBpbiB0aGUgYXNzb2NpYXRlIGludGVyYWN0aW9uIHRoZXJlIGlzIGEgc3BlY2lhbCBzbG90IGZvciB0aGVzZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlc1xuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgncGFydCcsICdxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJyk7XG4gIH1cblxuICAvLyBwazogVGhpcyBuZWVkcyBzb21lIGV4cGxhbmF0aW9uXG4gIC8vIGluIHF0aS1tYXRjaC1pbnRlcmFjdGlvbiwgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSBpcyB1c2VkIHRvIGRlbm90ZSB0aGVcbiAgLy8gZHJhZ2dhYmxlLCBidXQgYWxzbyB0aGUgZHJvcHBhYmxlLiBXRUlSRC4uIGJ1dCBsZXRzIGRlYWwgd2l0aCBpdC5cbiAgLy8gU28gd2UgaGF2ZSBhIHNsb3QgZm9yIHdoZW5ldmVyIGFub3RoZXIgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSBpcyBkcm9wcGVkIGluIGhlcmUuXG4gIC8vIEFuZCB3ZSBoYXZlIHNsb3QgZm9yIGNvbnRlbnQgbGlrZSBpbiB0aGlzIGFzc29jaWF0ZSBpbnRlcmFjdGlvblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2xvdCBwYXJ0PVwic2xvdFwiPjwvc2xvdD5cbiAgICAgIDxzbG90IHBhcnQ9XCJkcm9wc2xvdFwiIG5hbWU9XCJxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlXCI+PC9zbG90PlxuICAgIGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSc6IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuLy8gaW1wb3J0IGNvbXBvbmVudFN0eWxlcyBmcm9tICcuLi8uLi91dGlsaXRpZXMvc3R5bGVzL2NvbXBvbmVudC5zdHlsZXMnO1xuXG4vKiAke2NvbXBvbmVudFN0eWxlc30gKi9cbmV4cG9ydCBkZWZhdWx0IGNzc2BcbiAgc2xvdCB7XG4gICAgLyogc2xvdCB3aGVyZSB0aGUgKi9cbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgZ2FwOiAwLjVyZW07XG4gICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IC8qIHByZXZlbnRzIHRoZSBkcmFnIGFuZCBkcm9wIGNvbnRhaW5lciBzbG90cyBoYXZpbmcgdGhlIHNhbWUgaGVpZ2h0ICovXG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXRvcCkgc2xvdCB7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgfVxuICA6aG9zdCgucXRpLWNob2ljZXMtYm90dG9tKSBzbG90IHtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7XG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLWxlZnQpIHNsb3Qge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXJpZ2h0KSBzbG90IHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7XG4gIH1cbiAgc2xvdFtuYW1lPSdwcm9tcHQnXSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gIH1cbiAgOjpzbG90dGVkKHF0aS1zaW1wbGUtbWF0Y2gtc2V0KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoZSBkcmFnIGFuZCBkcm9wIGNvbnRhaW5lciBzbG90cyBoYXZlIHRoZSBzYW1lIHdpZHRoICovXG4gICAgZmxleDogMTtcbiAgfVxuYDtcbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLW1lZGlhLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlNZWRpYUludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBwcml2YXRlIF92YWx1ZSA9IDA7XG4gIHJlc2V0KCkge1xuICAgIC8vIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyBtYXliZSBjaGVjayBpZiB0aGUgbWVkaWEgaGFzIGJlZW4gcGxheWVkP1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgaXNOdW1iZXIgPSAhaXNOYU4ocGFyc2VJbnQodmFsLnRvU3RyaW5nKCkpKTtcbiAgICBpZiAoaXNOdW1iZXIpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gcGFyc2VJbnQodmFsLnRvU3RyaW5nKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgZ2V0IHByb3BlcnRpZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLkludGVyYWN0aW9uLnByb3BlcnRpZXMsXG4gICAgICAuLi57XG4gICAgICAgIHN0ZXA6IHtcbiAgICAgICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICAgICAgYXR0cmlidXRlOiAnc3RlcCcsXG4gICAgICAgICAgZGVmYXVsdDogMTBcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW2Nzc2BgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIC8vIGdldCBhdWRpbywgdmlkZW8gb2Ygb2JqZWN0IHRhZy5cbiAgICBjb25zdCBtZWRpYU9iamVjdCA9IHRoaXMucXVlcnlTZWxlY3RvcignYXVkaW8nKSB8fCB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3ZpZGVvJykgfHwgdGhpcy5xdWVyeVNlbGVjdG9yKCdvYmplY3QnKTtcbiAgICBpZiAobWVkaWFPYmplY3QpIHtcbiAgICAgIC8vIGxpc3RlbiB0byBlbmRlZCBldmVudFxuICAgICAgbWVkaWFPYmplY3QuYWRkRXZlbnRMaXN0ZW5lcignZW5kZWQnLCAoKSA9PiB7XG4gICAgICAgIC8vIHNldCB2YWx1ZSB0byAwXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoaXMudmFsdWUgaXMgYSBudW1iZXJcbiAgICAgICAgdGhpcy5fdmFsdWUrKztcbiAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy52YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW1lZGlhLWludGVyYWN0aW9uJzogUXRpTWVkaWFJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB1bnNhZmVIVE1MIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvdW5zYWZlLWh0bWwuanMnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvZHJhZy1kcm9wL2RyYWctZHJvcC1pbnRlcmFjdGlvbi1taXhpbic7XG5pbXBvcnQgeyBTaHVmZmxlTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9zaHVmZmxlL3NodWZmbGUtbWl4aW4nOyAvLyBJbXBvcnQgdGhlIG1peGluXG5pbXBvcnQgeyBRdGlTaW1wbGVDaG9pY2UgfSBmcm9tICcuLi9xdGktc2ltcGxlLWNob2ljZSc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1vcmRlci1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpT3JkZXJJbnRlcmFjdGlvbiBleHRlbmRzIFNodWZmbGVNaXhpbihcbiAgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluKEludGVyYWN0aW9uLCBgcXRpLXNpbXBsZS1jaG9pY2VgLCB0cnVlLCAnZHJvcC1saXN0JyksXG4gICdxdGktc2ltcGxlLWNob2ljZSdcbikge1xuICBjaGlsZHJlbk1hcDogRWxlbWVudFtdO1xuXG4gIEBzdGF0ZSgpIG5yQ2hvaWNlczogbnVtYmVyID0gMDtcbiAgQHN0YXRlKCkgY29ycmVjdFJlc3BvbnNlczogc3RyaW5nW10gPSBbXTtcbiAgQHN0YXRlKCkgc2hvd0NvcnJlY3RSZXNwb25zZXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogb3JpZW50YXRpb24gb2YgY2hvaWNlcyAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgcHVibGljIG9yaWVudGF0aW9uOiAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnO1xuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgW3BhcnQ9J2RyYWdzJ10ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgICAgZmxleDogMTtcbiAgICAgIH1cblxuICAgICAgW3BhcnQ9J2Ryb3BzJ10ge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgICBncmlkLWF1dG8tZmxvdzogY29sdW1uO1xuICAgICAgICBncmlkLWF1dG8tY29sdW1uczogMWZyO1xuICAgICAgfVxuXG4gICAgICA6aG9zdChbb3JpZW50YXRpb249J2hvcml6b250YWwnXSkgW3BhcnQ9J2RyYWdzJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgfVxuICAgICAgOmhvc3QoW29yaWVudGF0aW9uPSdob3Jpem9udGFsJ10pIFtwYXJ0PSdkcm9wcyddIHtcbiAgICAgICAgZ3JpZC1hdXRvLWZsb3c6IGNvbHVtbjtcbiAgICAgIH1cbiAgICAgIDpob3N0KFtvcmllbnRhdGlvbj0ndmVydGljYWwnXSkgW3BhcnQ9J2RyYWdzJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgfVxuICAgICAgOmhvc3QoW29yaWVudGF0aW9uPSd2ZXJ0aWNhbCddKSBbcGFydD0nZHJvcHMnXSB7XG4gICAgICAgIGdyaWQtYXV0by1mbG93OiByb3c7XG4gICAgICB9XG5cbiAgICAgIFtwYXJ0PSdkcm9wLWxpc3QnXSB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgfVxuXG4gICAgICBbcGFydD0nY29udGFpbmVyJ10ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBnYXA6IDAuNXJlbTtcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy10b3ApIFtwYXJ0PSdjb250YWluZXInXSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtYm90dG9tKSBbcGFydD0nY29udGFpbmVyJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtbGVmdCkgW3BhcnQ9J2NvbnRhaW5lciddIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1yaWdodCkgW3BhcnQ9J2NvbnRhaW5lciddIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgY29uc3QgY2hvaWNlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLWNob2ljZScpKTtcbiAgICBpZiAodGhpcy5uckNob2ljZXMgPCBjaG9pY2VzLmxlbmd0aCkge1xuICAgICAgdGhpcy5uckNob2ljZXMgPSBjaG9pY2VzLmxlbmd0aDtcbiAgICB9XG5cbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInByb21wdFwiPiA8L3Nsb3Q+XG4gICAgICA8ZGl2IHBhcnQ9XCJjb250YWluZXJcIj5cbiAgICAgICAgPHNsb3QgcGFydD1cImRyYWdzXCI+IDwvc2xvdD5cbiAgICAgICAgPGRpdiBwYXJ0PVwiZHJvcHNcIj5cbiAgICAgICAgICAke0FycmF5LmZyb20oQXJyYXkodGhpcy5uckNob2ljZXMpKS5tYXAoXG4gICAgICAgICAgICAoXywgaSkgPT5cbiAgICAgICAgICAgICAgaHRtbGA8ZHJvcC1saXN0IHBhcnQ9XCJkcm9wLWxpc3RcIiBpZGVudGlmaWVyPVwiZHJvcGxpc3Qke2l9XCI+PC9kcm9wLWxpc3Q+JHt0aGlzLnNob3dDb3JyZWN0UmVzcG9uc2VzICYmXG4gICAgICAgICAgICAgICAgdGhpcy5jb3JyZWN0UmVzcG9uc2VzLmxlbmd0aCA+IGlcbiAgICAgICAgICAgICAgICAgID8gdW5zYWZlSFRNTChgPHNwYW4gcGFydD0nY29ycmVjdC1yZXNwb25zZSc+JHt0aGlzLmNvcnJlY3RSZXNwb25zZXNbaV19PC9zcGFuPmApXG4gICAgICAgICAgICAgICAgICA6ICcnfWBcbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG4gIH1cblxuICBzZXQgY29ycmVjdFJlc3BvbnNlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgIHRoaXMuc2hvd0NvcnJlY3RSZXNwb25zZXMgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb3JyZWN0UmVzcG9uc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgcmVzcG9uc2VzID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG5cbiAgICAgIHJlc3BvbnNlcy5mb3JFYWNoKChyZXNwb25zZSwgaW5kZXgpID0+IHtcbiAgICAgICAgbGV0IHNpbXBsZUNob2ljZSA9IHRoaXMucXVlcnlTZWxlY3RvcihgcXRpLXNpbXBsZS1jaG9pY2VbaWRlbnRpZmllcj1cIiR7cmVzcG9uc2V9XCJdYCk7XG4gICAgICAgIGlmICghc2ltcGxlQ2hvaWNlKSB7XG4gICAgICAgICAgc2ltcGxlQ2hvaWNlID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoYHF0aS1zaW1wbGUtY2hvaWNlW2lkZW50aWZpZXI9XCIke3Jlc3BvbnNlfVwiXWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGV4dCA9IHNpbXBsZUNob2ljZT8udGV4dENvbnRlbnQudHJpbSgpO1xuICAgICAgICB0aGlzLmNvcnJlY3RSZXNwb25zZXMgPSBbLi4udGhpcy5jb3JyZWN0UmVzcG9uc2VzLCB0ZXh0XTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd0NvcnJlY3RSZXNwb25zZXMgPSB0cnVlO1xuICB9XG5cbiAgLy8gc29tZSBpbnRlcmFjdGlvbnMgaGF2ZSBhIGRpZmZlcmVudCB3YXkgb2YgZ2V0dGluZyB0aGUgcmVzcG9uc2VcbiAgLy8gdGhpcyBpcyBjYWxsZWQgZnJvbSB0aGUgZHJhZyBhbmQgZHJvcCBtaXhpbiBjbGFzc1xuICAvLyB5b3UgaGF2ZSB0byBpbXBsZW1lbnQgeW91ciBvd24gZ2V0UmVzcG9uc2UgbWV0aG9kIGluIHRoZSBzdXBlcmNsYXNzXG4gIC8vIGNhdXNlIHRoZXkgYXJlIGRpZmZlcmVudCBmb3Igc29tZSBpbnRlcmFjdGlvbnMuXG4gIC8vIE1IOiBpcyB0aGlzIGZ1bmN0aW9uIGNhbGxlZD8gU2hvdWxkbid0IHdlIHVzZSBnZXRWYWx1ZT9cbiAgcHJvdGVjdGVkIGdldFJlc3BvbnNlKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBkcm9wcGFibGVzID0gQXJyYXkuZnJvbTxRdGlTaW1wbGVDaG9pY2U+KHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdkcm9wLWxpc3QnKSk7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGRyb3BwYWJsZXMubWFwKGRyb3BwYWJsZSA9PiB7XG4gICAgICBjb25zdCBkcmFnc0luRHJvcHBhYmxlID0gZHJvcHBhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ1txdGktZHJhZ2dhYmxlPVwidHJ1ZVwiXScpO1xuICAgICAgY29uc3QgaWRlbnRpZmllcnMgPSBBcnJheS5mcm9tKGRyYWdzSW5Ecm9wcGFibGUpLm1hcChkID0+IGQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykpO1xuICAgICAgcmV0dXJuIFsuLi5pZGVudGlmaWVyc10uam9pbignICcpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTtcbiAgICB0aGlzLmNoaWxkcmVuTWFwID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtY2hvaWNlJykpO1xuICAgIHRoaXMuY2hpbGRyZW5NYXAuZm9yRWFjaChlbCA9PiBlbC5zZXRBdHRyaWJ1dGUoJ3BhcnQnLCAncXRpLXNpbXBsZS1jaG9pY2UnKSk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW9yZGVyLWludGVyYWN0aW9uJzogUXRpT3JkZXJJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5cbmV4cG9ydCBjbGFzcyBRdGlTUG9zaXRpb25PYmplY3RJbnRlcmFjdGlvbiBleHRlbmRzIExpdEVsZW1lbnQge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICB9XG4gICAgICA6OnNsb3R0ZWQoaW1nKSB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgY3Vyc29yOiBtb3ZlO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgbGVmdDogNTAlO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gICAgICB9XG4gICAgYFxuICBdO1xufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24nLCBRdGlTUG9zaXRpb25PYmplY3RJbnRlcmFjdGlvbik7XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktcG9zaXRpb24tb2JqZWN0LXN0YWdlJylcbmV4cG9ydCBjbGFzcyBRdGlQb3NpdGlvbk9iamVjdFN0YWdlIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIGNob2ljZU9yZGVyaW5nOiBib29sZWFuO1xuICBzdGFydFg6IGFueTtcbiAgc3RhcnRZOiBhbnk7XG4gIGRyYWdFbGVtZW50OiBhbnk7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucmVtb3ZlTW92ZUxpc3RlbmVyID0gdGhpcy5yZW1vdmVNb3ZlTGlzdGVuZXIuYmluZCh0aGlzKTtcbiAgICB0aGlzLmRyYWdFbGVtZW50SGFuZGxlciA9IHRoaXMuZHJhZ0VsZW1lbnRIYW5kbGVyLmJpbmQodGhpcyk7XG4gIH1cblxuICAvLyBEZWZpbmUgYSBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIG1vdXNlbW92ZSBldmVudCBvbiB0aGUgZHJhZ2dhYmxlIGVsZW1lbnRcbiAgZHJhZ0VsZW1lbnRIYW5kbGVyKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgdGhlIG1vdXNlIGhhcyBtb3ZlZCBzaW5jZSB0aGUgbGFzdCBldmVudFxuICAgIGNvbnN0IGRlbHRhWCA9IGV2ZW50LmNsaWVudFggLSB0aGlzLnN0YXJ0WDtcbiAgICBjb25zdCBkZWx0YVkgPSBldmVudC5jbGllbnRZIC0gdGhpcy5zdGFydFk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkcmFnZ2FibGUgZWxlbWVudFxuICAgIHRoaXMuZHJhZ0VsZW1lbnQuc3R5bGUubGVmdCA9IHRoaXMuZHJhZ0VsZW1lbnQub2Zmc2V0TGVmdCArIGRlbHRhWCArICdweCc7XG4gICAgdGhpcy5kcmFnRWxlbWVudC5zdHlsZS50b3AgPSB0aGlzLmRyYWdFbGVtZW50Lm9mZnNldFRvcCArIGRlbHRhWSArICdweCc7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBtb3VzZVxuICAgIHRoaXMuc3RhcnRYID0gZXZlbnQuY2xpZW50WDtcbiAgICB0aGlzLnN0YXJ0WSA9IGV2ZW50LmNsaWVudFk7XG4gIH1cblxuICBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoYSk6IHZvaWQge1xuICAgIHN1cGVyLmZpcnN0VXBkYXRlZChhKTtcblxuICAgIC8vIEdldCB0aGUgZHJhZ2dhYmxlIGFuZCBkcm9wIHpvbmUgZWxlbWVudHNcbiAgICB0aGlzLmRyYWdFbGVtZW50ID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uPmltZycpO1xuICAgIC8vIGNvbnN0IGNhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FudmFzJyk7XG5cbiAgICAvLyBJbml0aWFsaXplIHZhcmlhYmxlcyBmb3IgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBkcmFnZ2FibGUgZWxlbWVudFxuICAgIHRoaXMuc3RhcnRYID0gMDtcbiAgICB0aGlzLnN0YXJ0WSA9IDA7XG5cbiAgICAvLyBBZGQgYSBtb3VzZWRvd24gZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGRyYWdnYWJsZSBlbGVtZW50XG4gICAgdGhpcy5kcmFnRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIC8vIFNhdmUgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBtb3VzZVxuICAgICAgdGhpcy5zdGFydFggPSBldmVudC5jbGllbnRYO1xuICAgICAgdGhpcy5zdGFydFkgPSBldmVudC5jbGllbnRZO1xuXG4gICAgICAvLyBBZGQgYSBtb3VzZW1vdmUgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGRvY3VtZW50XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmRyYWdFbGVtZW50SGFuZGxlciwgdHJ1ZSk7XG4gICAgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMucmVtb3ZlTW92ZUxpc3RlbmVyKTtcbiAgfVxuXG4gIHJlbW92ZU1vdmVMaXN0ZW5lcihldmVudCkge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuZHJhZ0VsZW1lbnRIYW5kbGVyLCB0cnVlKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5kcmFnRWxlbWVudEhhbmRsZXIpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLnJlbW92ZU1vdmVMaXN0ZW5lcik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXBvc2l0aW9uLW9iamVjdC1zdGFnZSc6IFF0aVBvc2l0aW9uT2JqZWN0U3RhZ2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcmVwZWF0IH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVwZWF0LmpzJztcbmltcG9ydCB7IHN0eWxlTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvc3R5bGUtbWFwLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpU2VsZWN0UG9pbnRJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgfVxuICAgICAgcG9pbnQtY29udGFpbmVyIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgQHByb3BlcnR5KHtcbiAgICB0eXBlOiBOdW1iZXIsXG4gICAgYXR0cmlidXRlOiAnbWF4LWNob2ljZXMnXG4gIH0pXG4gIHB1YmxpYyBtYXhDaG9pY2VzOiBudW1iZXIgPSBJbmZpbml0eTtcblxuICBAcHJvcGVydHkoe1xuICAgIHR5cGU6IE51bWJlcixcbiAgICBhdHRyaWJ1dGU6ICdtaW4tY2hvaWNlcydcbiAgfSlcbiAgcHVibGljIG1pbkNob2ljZXM6IG51bWJlciA9IDA7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfcG9pbnRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIFJlZmVyZW5jZSB0byB0aGUgaW1hZ2UgZWxlbWVudFxuICBwcml2YXRlIF9pbWdFbGVtZW50OiBIVE1MSW1hZ2VFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gRXh0cmFjdGVkIGNsaWNrIGhhbmRsZXIgbWV0aG9kXG4gIHByaXZhdGUgX29uSW1hZ2VDbGljayA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgIGlmICh0aGlzLl9wb2ludHMubGVuZ3RoIDwgdGhpcy5tYXhDaG9pY2VzKSB7XG4gICAgICBjb25zdCB4ID0gZXZlbnQub2Zmc2V0WDtcbiAgICAgIGNvbnN0IHkgPSBldmVudC5vZmZzZXRZO1xuXG4gICAgICB0aGlzLl9wb2ludHMgPSBbLi4udGhpcy5fcG9pbnRzLCBgJHt4fSAke3l9YF07XG4gICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLl9wb2ludHMpO1xuICAgIH1cbiAgfTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8cG9pbnQtY29udGFpbmVyPlxuICAgICAgICAke3JlcGVhdChcbiAgICAgICAgICB0aGlzLl9wb2ludHMsXG4gICAgICAgICAgcG9pbnQgPT4gcG9pbnQsXG4gICAgICAgICAgKHBvaW50LCBpbmRleCkgPT4gaHRtbGBcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgcGFydD1cInBvaW50XCJcbiAgICAgICAgICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlKC01MCUsIC01MCUpJyxcbiAgICAgICAgICAgICAgICBsZWZ0OiBgJHtwb2ludC5zcGxpdCgnICcpWzBdfXB4YCxcbiAgICAgICAgICAgICAgICB0b3A6IGAke3BvaW50LnNwbGl0KCcgJylbMV19cHhgXG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiUmVtb3ZlIHBvaW50IGF0ICR7cG9pbnR9XCJcbiAgICAgICAgICAgICAgQGNsaWNrPSR7KGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9wb2ludHMgPSB0aGlzLl9wb2ludHMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy5fcG9pbnRzKTtcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICBgXG4gICAgICAgICl9XG4gICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDwvcG9pbnQtY29udGFpbmVyPmA7XG4gIH1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl9wb2ludHMgPSBbXTtcbiAgfVxuXG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9wb2ludHMubGVuZ3RoID49IHRoaXMubWluQ2hvaWNlcyAmJiB0aGlzLl9wb2ludHMubGVuZ3RoIDw9IHRoaXMubWF4Q2hvaWNlcztcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fcG9pbnRzID0gQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsIDogW3ZhbF07XG4gIH1cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fcG9pbnRzO1xuICB9XG5cbiAgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKCk6IHZvaWQge1xuICAgIHRoaXMuX2ltZ0VsZW1lbnQgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpO1xuXG4gICAgaWYgKHRoaXMuX2ltZ0VsZW1lbnQpIHtcbiAgICAgIC8vIEF0dGFjaCB0aGUgY2xpY2sgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGltYWdlIGVsZW1lbnRcbiAgICAgIHRoaXMuX2ltZ0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkltYWdlQ2xpY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oJ05vIDxpbWc+IGVsZW1lbnQgZm91bmQgaW4gPHF0aS1zZWxlY3QtcG9pbnQtaW50ZXJhY3Rpb24+Jyk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGlmICh0aGlzLl9pbWdFbGVtZW50KSB7XG4gICAgICAvLyBSZW1vdmUgdGhlIGNsaWNrIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhlIGltYWdlIGVsZW1lbnRcbiAgICAgIHRoaXMuX2ltZ0VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkltYWdlQ2xpY2spO1xuICAgIH1cbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uJzogUXRpU2VsZWN0UG9pbnRJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgbm90aGluZyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgcXVlcnkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9ycy93YXRjaCc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuLyoqXG4gKiBAc3VtbWFyeSBUaGUgU2xpZGVySW50ZXJhY3Rpb24uVHlwZSAocXRpLXNsaWRlci1pbnRlcmFjdGlvbikgcHJlc2VudHMgdGhlIGNhbmRpZGF0ZSB3aXRoIGEgY29udHJvbCBmb3Igc2VsZWN0aW5nIGEgbnVtZXJpY2FsIHZhbHVlIGJldHdlZW4gYSBsb3dlciBhbmQgdXBwZXIgYm91bmQuXG4gKiBAZG9jdW1lbnRhdGlvbiBodHRwczovL3d3dy5pbXNnbG9iYWwub3JnL3NwZWMvcXRpL3YzcDAvaW1wbCNoLnM2MXhjcmo0cWN5alxuICogQHN0YXR1cyBzdGFibGVcbiAqIEBzaW5jZSA2LjBcbiAqXG4gKiBAZXZlbnQgcXRpLXJlZ2lzdGVyLWludGVyYWN0aW9uIC0gZW1pdHRlZCB3aGVuIHRoZSBpbnRlcmFjdGlvbiB3YW50cyB0byByZWdpc3RlciBpdHNlbGZcbiAqIEBldmVudCBxdGktaW50ZXJhY3Rpb24tcmVzcG9uc2UgLSBlbWl0dGVkIHdoZW4gdGhlIGludGVyYWN0aW9uIGNoYW5nZXNcbiAqXG4gKiBAY3NzcHJvcCAtLXNob3ctdmFsdWUgLSBzaG93cyB0aGUgY3VycmVudCB2YWx1ZSB3aGlsZSBzbGlkaW5nXG4gKiBAY3NzcHJvcCAtLXNob3ctdGlja3MgLSBzaG93cyB0aGUgdGlja3MgYWNjb3JkaW5nIHRvIHN0ZXBzXG4gKiBAY3NzcHJvcCAtLXNob3ctYm91bmRzIC0gc2hvd3MgdmFsdWUgZm9yIGxvd2VyIGFuZCB1cHBlciBib3VuZGFyeVxuICpcbiAqIEBjc3NwYXJ0IHNsaWRlciAtLSBzbGlkZXIgaW5sdWRpbmcsIGJvdW5kcyBhbmQgdGlja3MgYW5kIHZhbHVlLCB1c2UgaXQgZm9yIHBhZGRpbmdzIGFuZCBtYXJnaW5zXG4gKiBAY3NzcGFydCBib3VuZHMgLS0gZGl2IGZvciBib3VuZHMsIGNvbnRhaW5pbmcgdHdvIGRpdnMgZm9yIHdpdGggbWluLCBhbmQgbWF4IGJvdW5kcyB2YWx1ZVxuICogQGNzc3BhcnQgdGlja3MgLS0gZGl2IGZvciB0aWNrcywgdXNlIGxpbmVhaXIgZ3JhZGllbnQgYW5kIGV4cG9zZWQgY3NzIHZhcmlhYmxlcyBmb3Igc3R5bGluZ1xuICogQGNzc3BhcnQgcmFpbCAtLSBkaXYgZm9yIHJhaWwsIHN0eWxlIGFjY29yZGluZyB0byBuZWVkc1xuICogQGNzc3BhcnQga25vYiAtLSBkaXYsIHNob3VsZCBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZVxuICogQGNzc3BhcnQgdmFsdWUgLS0gZGl2LCBjb250YWluaW5nIHZhbHVlXG4gKlxuICogQHNsb3QgLSBUaGUgZGVmYXVsdCBzbG90IHdoZXJlIDxxdGktc2ltcGxlLWNob2ljZT4gbXVzdCBiZSBwbGFjZWQuXG4gKiBAc2xvdCBwcm9tcHQgLSBzbG90IHdoZXJlIHRoZSBwcm9tcHQgaXMgcGxhY2VkLlxuICovXG5cbkBjdXN0b21FbGVtZW50KCdxdGktc2xpZGVyLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlTbGlkZXJJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgcHJpdmF0ZSBfdmFsdWUgPSAwO1xuICBjc0xpdmU6IENTU1N0eWxlRGVjbGFyYXRpb247XG5cbiAgQHF1ZXJ5KCcja25vYicpXG4gIHByaXZhdGUgX2tub2I6IEhUTUxFbGVtZW50O1xuXG4gIEBxdWVyeSgnI3JhaWwnKVxuICBwcml2YXRlIF9yYWlsOiBIVE1MRWxlbWVudDtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6ICdzdGVwLWxhYmVsJyB9KSBzdGVwTGFiZWwgPSBmYWxzZTtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pIHJldmVyc2UgPSBmYWxzZTtcblxuICBwcml2YXRlIF9taW46IG51bWJlcjtcbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdsb3dlci1ib3VuZCcgfSkgc2V0IG1pbih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWluID0gdmFsdWU7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KCctLW1pbicsIGAke3RoaXMuX21pbn1gKTtcbiAgfVxuICBnZXQgbWluKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX21pbjtcbiAgfVxuXG4gIHByaXZhdGUgX21heDogbnVtYmVyO1xuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ3VwcGVyLWJvdW5kJyB9KSBzZXQgbWF4KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tYXggPSB2YWx1ZTtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KCctLW1heCcsIGAke3RoaXMuX21heH1gKTtcbiAgfVxuICBnZXQgbWF4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX21heDtcbiAgfVxuXG4gIHByaXZhdGUgX3N0ZXA6IG51bWJlcjtcbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdzdGVwJyB9KSBzZXQgc3RlcCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fc3RlcCA9IHZhbHVlO1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tc3RlcCcsIGAke3RoaXMuX3N0ZXB9YCk7XG4gIH1cbiAgZ2V0IHN0ZXAoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc3RlcDtcbiAgfVxuXG4gIEB3YXRjaCgnZGlzYWJsZWQnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gIF9oYW5kbGVEaXNhYmxlZENoYW5nZSA9IChvbGQsIGRpc2FibGVkKSA9PiB7fTtcblxuICBAd2F0Y2goJ3JlYWRvbmx5JywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBfaGFuZGxlUmVhZG9ubHlDaGFuZ2UgPSAob2xkLCByZWFkb25seSkgPT4ge307XG5cbiAgcmVzZXQoKSB7XG4gICAgLy8gdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgaXNOdW1iZXIgPSAhaXNOYU4ocGFyc2VJbnQodmFsLnRvU3RyaW5nKCkpKTtcbiAgICBpZiAoaXNOdW1iZXIpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gcGFyc2VJbnQodmFsLnRvU3RyaW5nKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICB9XG4gIH1cblxuICAvLyBzdGF0aWMgc2hhZG93Um9vdE9wdGlvbnM6IFNoYWRvd1Jvb3RJbml0ID0geyAuLi5MaXRFbGVtZW50LnNoYWRvd1Jvb3RPcHRpb25zLCBkZWxlZ2F0ZXNGb2N1czogdHJ1ZSwgbW9kZTogJ29wZW4nIH07XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICAvKiB0aGUgY29tcHV0ZWQgc3R5bGUgaXMgYSBsaXZlIHByb3BlcnR5LCB3ZSB1c2UgdGhpcyB0byBnZXQgY3NzIHZhcmlhYmxlc1xuICAgIHNlZSByZW5kZXIgdGVtcGxhdGUgKi9cbiAgICB0aGlzLmNzTGl2ZSA9IGdldENvbXB1dGVkU3R5bGUodGhpcyk7XG4gIH1cblxuICBzZXQgcmVzcG9uc2UobXlSZXNwb25zZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShteVJlc3BvbnNlKSkge1xuICAgICAgY29uc29sZS5lcnJvcignUXRpU2xpZGVySW50ZXJhY3Rpb246IHJlc3BvbnNlIGlzIGFuIGFycmF5LCBidXQgc2hvdWxkIGJlIGEgc2luZ2xlIHZhbHVlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VJbnQobXlSZXNwb25zZSk7XG4gICAgaWYgKE51bWJlci5pc05hTih2YWx1ZSkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1F0aVNsaWRlckludGVyYWN0aW9uOiByZXNwb25zZSBpcyBub3QgYSBudW1iZXInKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbY3NzYGBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICAvLyBjb252ZXJ0IHRoZSB2YWx1ZSwgd2hpY2ggaXMgdGhlIHJlYWwgc2xpZGVyIHZhbHVlIHRvIGEgcGVyY2VudGFnZSBmb3IgdGhlIGRvbS5cbiAgICBpZiAodGhpcy5fdmFsdWUgPCB0aGlzLm1pbikge1xuICAgICAgdGhpcy5fdmFsdWUgPSB0aGlzLm1pbjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3ZhbHVlID4gdGhpcy5tYXgpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5tYXg7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlUGVyY2VudGFnZSA9ICgodGhpcy5fdmFsdWUgLSB0aGlzLm1pbikgLyAodGhpcy5tYXggLSB0aGlzLm1pbikpICogMTAwO1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tdmFsdWUtcGVyY2VudGFnZScsIGAke3ZhbHVlUGVyY2VudGFnZX0lYCk7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVub3cnLCB0aGlzLnZhbHVlLnRvU3RyaW5nKCkpO1xuXG4gICAgcmV0dXJuIGh0bWxgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDxkaXYgaWQ9XCJzbGlkZXJcIiBwYXJ0PVwic2xpZGVyXCI+XG4gICAgICAgICR7dGhpcy5jc0xpdmUuZ2V0UHJvcGVydHlWYWx1ZSgnLS1zaG93LWJvdW5kcycpID09ICd0cnVlJ1xuICAgICAgICAgID8gaHRtbGA8ZGl2IGlkPVwiYm91bmRzXCIgcGFydD1cImJvdW5kc1wiPlxuICAgICAgICAgICAgICA8ZGl2PiR7dGhpcy5fbWlufTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2PiR7dGhpcy5fbWF4fTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+YFxuICAgICAgICAgIDogbm90aGluZ31cbiAgICAgICAgJHt0aGlzLmNzTGl2ZS5nZXRQcm9wZXJ0eVZhbHVlKCctLXNob3ctdGlja3MnKSA9PSAndHJ1ZScgPyBodG1sYDxkaXYgaWQ9XCJ0aWNrc1wiIHBhcnQ9XCJ0aWNrc1wiPjwvZGl2PmAgOiBub3RoaW5nfVxuICAgICAgICA8ZGl2IGlkPVwicmFpbFwiIHBhcnQ9XCJyYWlsXCIgQG1vdXNlZG93bj0ke3RoaXMuX29uTW91c2VEb3dufSBAdG91Y2hzdGFydD0ke3RoaXMuX29uVG91Y2hNb3ZlfT5cbiAgICAgICAgICA8ZGl2IGlkPVwia25vYlwiIHBhcnQ9XCJrbm9iXCI+XG4gICAgICAgICAgICAke3RoaXMuY3NMaXZlLmdldFByb3BlcnR5VmFsdWUoJy0tc2hvdy12YWx1ZScpID09ICd0cnVlJ1xuICAgICAgICAgICAgICA/IGh0bWxgPGRpdiBpZD1cInZhbHVlXCIgcGFydD1cInZhbHVlXCI+JHt0aGlzLnZhbHVlfTwvZGl2PmBcbiAgICAgICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuc3RlcCA9IDE7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgncm9sZScsICdzbGlkZXInKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uVG91Y2hNb3ZlKGV2ZW50KSB7XG4gICAgY29uc3QgaGFuZGxlVG91Y2hNb3ZlID0gZXZlbnQgPT4ge1xuICAgICAgY29uc3QgeyB4IH0gPSB0aGlzLmdldFBvc2l0aW9uRnJvbUV2ZW50KGV2ZW50KTtcbiAgICAgIGNvbnN0IGRpZmZYID0geCAtIHRoaXMuX3JhaWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgICAgdGhpcy5jYWxjdWxhdGVWYWx1ZShkaWZmWCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlVG91Y2hFbmQgPSAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBoYW5kbGVUb3VjaE1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBoYW5kbGVUb3VjaEVuZCk7XG5cbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMudmFsdWUudG9TdHJpbmcoKSk7XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIGhhbmRsZVRvdWNoTW92ZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBoYW5kbGVUb3VjaEVuZCk7XG5cbiAgICBjb25zdCB7IHggfSA9IHRoaXMuZ2V0UG9zaXRpb25Gcm9tRXZlbnQoZXZlbnQpO1xuICAgIGNvbnN0IGRpZmZYID0geCAtIHRoaXMuX3JhaWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgIHRoaXMuY2FsY3VsYXRlVmFsdWUoZGlmZlgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25Nb3VzZURvd24oZXZlbnQpIHtcbiAgICBjb25zdCBoYW5kbGVNb3VzZU1vdmUgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIC8vIGlmIHRoZSBxdGktc2xpZGVyLWludGVyYWN0aW9uIGhhcyBhbiBhYnNvbHV0ZSBsZWZ0IHBvc2l0aW9uIGFuZCBib2R5IGlzIHNjcm9sbGVkIGEgYml0LCB0YWtlIGFjY291bnQgZm9yIHRoYXRcbiAgICAgIGNvbnN0IGRpZmZYID0gZXZlbnQucGFnZVggLSB0aGlzLl9yYWlsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdDtcblxuICAgICAgdGhpcy5jYWxjdWxhdGVWYWx1ZShkaWZmWCk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZU1vdXNlVXAgPSAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGhhbmRsZU1vdXNlVXApO1xuXG4gICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLnZhbHVlLnRvU3RyaW5nKCkpO1xuICAgIH07XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBoYW5kbGVNb3VzZVVwKTtcblxuICAgIC8vIGlmIHRoZSBxdGktc2xpZGVyLWludGVyYWN0aW9uIGhhcyBhbiBhYnNvbHV0ZSBsZWZ0IHBvc2l0aW9uIGFuZCBib2R5IGlzIHNjcm9sbGVkIGEgYml0LCB0YWtlIGFjY291bnQgZm9yIHRoYXRcbiAgICBjb25zdCBkaWZmWCA9IGV2ZW50LnBhZ2VYIC0gdGhpcy5fcmFpbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7XG5cbiAgICB0aGlzLmNhbGN1bGF0ZVZhbHVlKGRpZmZYKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgLyoqIGNhbGN1bGF0ZVZhbHVlIGdldHMgeCBwb3NpdGlvbiBhbmQgY29tcGFyZXMgdGhpcyB3aXRoIHRoZSB0b3RhbCB3aWR0aCBpbiBwaXhlbHMgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVWYWx1ZShkaWZmWDogbnVtYmVyKSB7XG4gICAgY29uc3QgdmFsdWVOb3cgPSB0aGlzLm1pbiArICgodGhpcy5tYXggLSB0aGlzLm1pbikgKiBkaWZmWCkgLyB0aGlzLl9yYWlsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgIGNvbnN0IHJvdW5kZWRTdGVwVmFsdWUgPSB0aGlzLm1pbiArIE1hdGgucm91bmQoKHZhbHVlTm93IC0gdGhpcy5taW4pIC8gdGhpcy5fc3RlcCkgKiB0aGlzLl9zdGVwO1xuICAgIHRoaXMuX3ZhbHVlID0gcm91bmRlZFN0ZXBWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UG9zaXRpb25Gcm9tRXZlbnQoZTogYW55KToge1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gIH0ge1xuICAgIGxldCBfdG91Y2hNb3ZlO1xuICAgIGlmIChlLnR5cGUgPT0gJ3RvdWNoc3RhcnQnIHx8IGUudHlwZSA9PSAndG91Y2htb3ZlJyB8fCBlLnR5cGUgPT0gJ3RvdWNoZW5kJyB8fCBlLnR5cGUgPT0gJ3RvdWNoY2FuY2VsJykge1xuICAgICAgY29uc3QgZXZ0ID0gdHlwZW9mIGUub3JpZ2luYWxFdmVudCA9PT0gJ3VuZGVmaW5lZCcgPyBlIDogZS5vcmlnaW5hbEV2ZW50O1xuICAgICAgY29uc3QgdG91Y2ggPSBldnQudG91Y2hlc1swXSB8fCBldnQuY2hhbmdlZFRvdWNoZXNbMF07XG4gICAgICBfdG91Y2hNb3ZlID0ge1xuICAgICAgICB4OiB0b3VjaC5wYWdlWCxcbiAgICAgICAgeTogdG91Y2gucGFnZVlcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGUudHlwZSA9PSAnbW91c2Vkb3duJyB8fFxuICAgICAgZS50eXBlID09ICdtb3VzZXVwJyB8fFxuICAgICAgZS50eXBlID09ICdtb3VzZW1vdmUnIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNlb3ZlcicgfHxcbiAgICAgIGUudHlwZSA9PSAnbW91c2VvdXQnIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNlZW50ZXInIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNlbGVhdmUnXG4gICAgKSB7XG4gICAgICBfdG91Y2hNb3ZlID0ge1xuICAgICAgICB4OiBlLmNsaWVudFgsXG4gICAgICAgIHk6IGUuY2xpZW50WVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIF90b3VjaE1vdmU7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXNsaWRlci1pbnRlcmFjdGlvbic6IFF0aVNsaWRlckludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY29uc3VtZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQ2FsY3VsYXRlIH0gZnJvbSAnLi4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBJdGVtQ29udGV4dCwgaXRlbUNvbnRleHQgfSBmcm9tICcuLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0uY29udGV4dCc7XG5cbi8qKlxuICogaHR0cHM6Ly93d3cuaW1zZ2xvYmFsLm9yZy9zcGVjL3F0aS92M3AwL2ltcGwjaC5maTI5cThkdWJqZ3dcbiAqIDxxdGktY3VzdG9tLW9wZXJhdG9yIGNsYXNzPVwianMub3JnXCI+XG4gICAgICAgIDxxdGktYmFzZS12YWx1ZSBiYXNlLXR5cGU9XCJzdHJpbmdcIj48IVtDREFUQVtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjb250ZXh0LnZhcmlhYmxlcyk7XG4gICAgICAgICAgcmV0dXJuICdCJ1xuICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbicpLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICBdXT48L3F0aS1iYXNlLXZhbHVlPlxuICAgICAgPC9xdGktY3VzdG9tLW9wZXJhdG9yPlxuICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICovXG5AY3VzdG9tRWxlbWVudCgncXRpLWN1c3RvbS1vcGVyYXRvcicpXG5leHBvcnQgY2xhc3MgUXRpQ3VzdG9tT3BlcmF0b3IgZXh0ZW5kcyBMaXRFbGVtZW50IGltcGxlbWVudHMgQ2FsY3VsYXRlIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICBwcml2YXRlIG9wZXJhdG9yRnVuY3Rpb246IEZ1bmN0aW9uO1xuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwcml2YXRlIF9jb250ZXh0PzogSXRlbUNvbnRleHQ7XG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90IEBzbG90Y2hhbmdlPSR7dGhpcy5oYW5kbGVTbG90Q2hhbmdlfT48L3Nsb3Q+YDtcbiAgfVxuXG4gIGhhbmRsZVNsb3RDaGFuZ2UoZXZlbnQ6IEV2ZW50KSB7XG4gICAgLy8gZXhwZWN0aW5nIDxbIUNEQVRBWyAuLi4gXV0+IGlzIGNvbnZlcnRlZCBpbnRvIDwhLS0gLi4uIC0tPiB3aXRoIHF0aS10cmFuc2Zvcm06IGNEYXRhVG9Db21tZW50XG4gICAgY29uc3QgY29tbWVudE5vZGUgPSBBcnJheS5mcm9tKHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQ/LmNoaWxkTm9kZXMgPz8gW10pLmZpbmQoXG4gICAgICBub2RlID0+IG5vZGUubm9kZVR5cGUgPT09IE5vZGUuQ09NTUVOVF9OT0RFXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5vcGVyYXRvckZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKCdjb250ZXh0JywgJ2ZuJywgJ2l0ZW0nLCBjb21tZW50Tm9kZS50ZXh0Q29udGVudCA/PyAnJyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcignY3VzdG9tLW9wZXJhdG9yIGNvbnRhaW5zIGludmFsaWQgamF2YXNjcmlwdCBjb2RlJywgZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZSgpIHtcbiAgICBjb25zdCBmbiA9IHtcbiAgICAgIHZhcmlhYmxlOiAocmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmcpID0+XG4gICAgICAgIHRoaXMuX2NvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSByZXNwb25zZUlkZW50aWZpZXIpPy52YWx1ZSA/PyAnJyxcbiAgICAgIGNvcnJlY3Q6IChyZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZykgPT5cbiAgICAgICAgKHRoaXMuX2NvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSByZXNwb25zZUlkZW50aWZpZXIpIGFzIFJlc3BvbnNlVmFyaWFibGUpXG4gICAgICAgICAgPy5jb3JyZWN0UmVzcG9uc2UgPz8gJydcbiAgICB9O1xuICAgIGNvbnN0IGl0ZW0gPSB7XG4gICAgICBnZXRWYXJpYWJsZTogKHZhcmlhYmxlSWRlbnRpZmllcjogc3RyaW5nKSA9PlxuICAgICAgICB0aGlzLl9jb250ZXh0Py52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gdmFyaWFibGVJZGVudGlmaWVyKSxcbiAgICAgIHVwZGF0ZU91dGNvbWVWYXJpYWJsZTogKG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkgPT4ge1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50PHsgb3V0Y29tZUlkZW50aWZpZXI6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdIH0+KCdxdGktc2V0LW91dGNvbWUtdmFsdWUnLCB7XG4gICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgb3V0Y29tZUlkZW50aWZpZXIsXG4gICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICB1cGRhdGVSZXNwb25zZVZhcmlhYmxlOiAocmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmcsIHJlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXSkgPT4ge1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50PHsgcmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmc7IHJlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXSB9PigncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywge1xuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgIHJlc3BvbnNlSWRlbnRpZmllcixcbiAgICAgICAgICAgICAgcmVzcG9uc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5vcGVyYXRvckZ1bmN0aW9uKHRoaXMuX2NvbnRleHQsIGZuLCBpdGVtKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktY3VzdG9tLW9wZXJhdG9yJzogUXRpQ3VzdG9tT3BlcmF0b3I7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QnKVxuZXhwb3J0IGNsYXNzIFF0aUFzc29jaWFibGVIb3RzcG90IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLXJlZ2lzdGVyLWhvdHNwb3QnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicXRpLWdhcC1pbWdcIj48L3Nsb3Q+IGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWFzc29jaWFibGUtaG90c3BvdCc6IFF0aUFzc29jaWFibGVIb3RzcG90O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdhcCcpXG5leHBvcnQgY2xhc3MgUXRpR2FwIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUgfSkgdGFiaW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCA9IDA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicXRpLWdhcC10ZXh0XCI+PC9zbG90PmA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWdhcCc6IFF0aUdhcDtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1nYXAtaW1nJylcbmV4cG9ydCBjbGFzcyBRdGlHYXBJbWcgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSB9KSB0YWJpbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkID0gMDtcblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdxdGktZ2FwLWltZycpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1nYXAtaW1nJzogUXRpR2FwSW1nO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ2FwLXRleHQnKVxuZXhwb3J0IGNsYXNzIFF0aUdhcFRleHQgZXh0ZW5kcyBBY3RpdmVFbGVtZW50TWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1nYXAtdGV4dCcpIHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUgfSkgdGFiaW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCA9IDA7XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdxdGktZ2FwLXRleHQnKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZ2FwLXRleHQnOiBRdGlHYXBUZXh0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbi8vIHR5cGUgc2hhcGUgPSB7IHNoYXBlOiAncmVjdCcgfCAnY2lyY2xlJyB8ICdwb2x5JzsgY29vcmRzOiBudW1iZXJbXSB9O1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWhvdHNwb3QtY2hvaWNlJylcbmV4cG9ydCBjbGFzcyBRdGlIb3RzcG90Q2hvaWNlIGV4dGVuZHMgQWN0aXZlRWxlbWVudE1peGluKExpdEVsZW1lbnQsICdxdGktaG90c3BvdC1jaG9pY2UnKSB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbiAgYDtcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnYXJpYS1vcmRlcnZhbHVlJywgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlIH0pIG9yZGVyOiBudW1iZXI7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ob3RzcG90LWNob2ljZSc6IFF0aUhvdHNwb3RDaG9pY2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEFjdGl2ZUVsZW1lbnRNaXhpbiB9IGZyb20gJy4vaW50ZXJuYWwvYWN0aXZlLWVsZW1lbnQvYWN0aXZlLWVsZW1lbnQubWl4aW4nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWhvdHRleHQnKVxuZXhwb3J0IGNsYXNzIFF0aUhvdHRleHQgZXh0ZW5kcyBBY3RpdmVFbGVtZW50TWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1ob3R0ZXh0Jykge1xuICBzdGF0aWMgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxkaXYgcGFydD1cImNoXCI+PGRpdiBwYXJ0PVwiY2hhXCI+PC9kaXY+PC9kaXY+XG4gICAgICA8c2xvdD48L3Nsb3Q+IGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWhvdHRleHQnOiBRdGlIb3R0ZXh0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWlubGluZS1jaG9pY2UnKVxuZXhwb3J0IGNsYXNzIFF0aUlubGluZUNob2ljZSBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgb3ZlcnJpZGUgZ2V0IHN0eWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY3NzYFxuICAgICAgICA6aG9zdCB7XG4gICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICB9XG4gICAgICBgXG4gICAgXTtcbiAgfVxuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vblNlbGVjdElubGluZUNob2ljZSk7XG5cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1pbmxpbmUtY2hvaWNlLXJlZ2lzdGVyJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgY2FuY2VsYWJsZTogZmFsc2VcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vblNlbGVjdElubGluZUNob2ljZSk7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90Pjwvc2xvdD4gYDtcbiAgfVxuXG4gIHByaXZhdGUgX29uU2VsZWN0SW5saW5lQ2hvaWNlKCkge1xuICAgIC8vIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHJldHVybjtcblxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLWlubGluZS1jaG9pY2Utc2VsZWN0Jywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogeyBpZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1pbmxpbmUtY2hvaWNlJzogUXRpSW5saW5lQ2hvaWNlO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50LCBub3RoaW5nIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbi8qKlxuICogcXRpLW9yZGVyLWludGVyYWN0aW9uXG4gKiBxdGktY2hvaWNlLWludGVyYWN0aW9uXG4gKi9cbkBjdXN0b21FbGVtZW50KCdxdGktc2ltcGxlLWNob2ljZScpXG5leHBvcnQgY2xhc3MgUXRpU2ltcGxlQ2hvaWNlIGV4dGVuZHMgQWN0aXZlRWxlbWVudE1peGluKExpdEVsZW1lbnQsICdxdGktc2ltcGxlLWNob2ljZScpIHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgICBzbG90IHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgfVxuICAgIFtwYXJ0PSdjaCddIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICB9XG4gIGA7XG5cbiAgLy8gcHJvcGVydHkgbGFiZWxcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6IGZhbHNlIH0pXG4gIHB1YmxpYyBtYXJrZXI6IHN0cmluZztcblxuXG4gIGdldCBjaGVja2VkKCkge1xuICAgIHJldHVybiB0aGlzWydpbnRlcm5hbHMnXS5zdGF0ZXMuaGFzKCctLWNoZWNrZWQnKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8ZGl2IHBhcnQ9XCJjaFwiPlxuICAgICAgICA8ZGl2IHBhcnQ9XCJjaGFcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgJHt0aGlzLm1hcmtlciA/IGh0bWxgPGRpdiBpZD1cImxhYmVsXCI+JHt0aGlzLm1hcmtlcn08L2Rpdj5gIDogbm90aGluZ31cbiAgICAgIDxzbG90IHBhcnQ9XCJzbG90XCI+PC9zbG90PiBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1zaW1wbGUtY2hvaWNlJzogUXRpU2ltcGxlQ2hvaWNlO1xuICB9XG59XG4iLCAiLyogb25seSBleHBvcnRlZCB0byBvdmVycmlkZSBvciBleHRlbmQgZm9yIHNwZWNpZmljIHB1cnBvc2VzICovXG5leHBvcnQgKiBmcm9tICcuL2ludGVybmFsL2V2ZW50LXR5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJuYWwvZXZlbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuLyogb25seSBleHBvcnRlZCB0byBvdmVycmlkZSBvciBleHRlbmQgZm9yIHNwZWNpZmljIHB1cnBvc2VzICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbSc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZi9xdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvYWN0aXZlLWVsZW1lbnQvYWN0aXZlLWVsZW1lbnQubWl4aW4nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaXRlbS1ib2R5L3F0aS1pdGVtLWJvZHknO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktcHJvbXB0L3F0aS1wcm9tcHQnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktc3R5bGVzaGVldC9xdGktc3R5bGVzaGVldCc7XG4vKiBzdGFydCByZXNwb25zZSBhbmQgb3V0Y29tZSAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uL3F0aS1yZXNwb25zZS1kZWNsYXJhdGlvbic7XG4vKiBlbmQgcmVzcG9uc2UgYW5kIG91dGNvbWUgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWNvbXBhbmlvbi1tYXRlcmlhbHMtaW5mby9xdGktY29tcGFuaW9uLW1hdGVyaWFscy1pbmZvJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJ1YnJpYy1ibG9jay9xdGktY29udGVudC1ib2R5JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJ1YnJpYy1ibG9jay9xdGktcnVicmljLWJsb2NrJztcbi8qIHN0YXJ0IGZlZWRiYWNrICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1mZWVkYmFjay9xdGktZmVlZGJhY2stYmxvY2svcXRpLWZlZWRiYWNrLWJsb2NrJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjay1pbmxpbmUvcXRpLWZlZWRiYWNrLWlubGluZSc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1mZWVkYmFjay9xdGktbW9kYWwtZmVlZGJhY2svcXRpLW1vZGFsLWZlZWRiYWNrJztcbi8qIGVuZCBmZWVkYmFjayAqL1xuLyogc3RhcnQgdGV4dGVudHJ5aW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uJztcbi8qIGVuZCB0ZXh0ZW50cnlpbnRlcmFjdGlvbiAqL1xuLyogc3RhcnQgaG90dGV4dCAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24nO1xuLyogZW5kIGhvdHRleHQgKi9cbi8qIHN0YXJ0IGlubGluZWNob2ljZSAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24nO1xuLyogZW5kIGlubGluZWNob2ljZSAqL1xuLyogc3RhcnQgY2hvaWNlaW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbic7XG4vKiBlbmQgY2hvaWNlaW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLW91dGNvbWUtcHJvY2Vzc2luZy9xdGktb3V0Y29tZS1wcm9jZXNzaW5nJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnO1xuLyogc3RhcnQgY3VzdG9tIGludGVyYWN0aW9ucyAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXBvcnRhYmxlLWN1c3RvbS1pbnRlcmFjdGlvbi9xdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uJztcbi8qIGVuZCBjdXN0b20gaW50ZXJhY3Rpb25zICovXG4vKiBzdGFydCBvbmx5IHByZXZpZXcgaXRlbXMgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktY3VzdG9tLWludGVyYWN0aW9uL3F0aS1jdXN0b20taW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uL3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uL3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1tYXRjaC1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLW1lZGlhLWludGVyYWN0aW9uL3F0aS1tZWRpYS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktb3JkZXItaW50ZXJhY3Rpb24vcXRpLW9yZGVyLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3Qtc3RhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbi9xdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1zbGlkZXItaW50ZXJhY3Rpb24vcXRpLXNsaWRlci1pbnRlcmFjdGlvbic7XG4vKiBlbmQgb25seSBwcmV2aWV3IGl0ZW1zICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWN1c3RvbS1vcGVyYXRvci9xdGktY3VzdG9tLW9wZXJhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcCc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLWltZyc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLXRleHQnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHNwb3QtY2hvaWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ob3R0ZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1pbmxpbmUtY2hvaWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXNpbXBsZS1jaG9pY2UnO1xuXG5jb25zb2xlLmxvZyhcbiAgJyVjQ1x1MDBCRlRPJWNMYWIlYzogcXRpLWNvbXBvbmVudHMgbG9hZGVkJyxcbiAgJ2ZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOmdyZWVuJyxcbiAgJ2ZvbnQtZmFtaWx5OiBcIlBUIFNhbnNcIiwgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6Z3JlZW47IGZvbnQtc2l6ZTogc21hbGxlcjt2ZXJ0aWNhbC1hbGlnbjogc3ViJyxcbiAgJ2ZvbnQtd2VpZ2h0OnVuc2V0J1xuKTtcblxuLy8gY3NzIGZvciBmb250IHB0LXNhbnMgYW5kIHN1YnNjcmlwdCBhbmQgZ3JlZW5cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLFNBQVMsZUFBZTtBQUN4QixTQUFTLFlBQVksWUFBWTtBQUNqQyxTQUFTLGVBQWUsZ0JBQWdCOzs7QUMyQmpDLFNBQVMsTUFBTSxjQUFpQyxTQUF3QjtBQUM3RSxRQUFNLGtCQUEwQztBQUFBLElBQzlDLHNCQUFzQjtBQUFBLEtBQ25CO0FBRUwsU0FBTyxDQUNMLE9BQ0Esb0JBQ0c7QUFFSCxVQUFNLEVBQUUsT0FBTyxJQUFJO0FBQ25CLFVBQU0sb0JBQW9CLE1BQU0sUUFBUSxZQUFZLElBQUksZUFBZSxDQUFDLFlBQVk7QUFHcEYsVUFBTSxTQUFTLFNBQTJCLGNBQWdFO0FBQ3hHLHdCQUFr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IkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJ4bWwiLCAiTGl0RWxlbWVudCIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAicHJvcGVydHkiLCAiaHRtbCIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJjc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjb25zdW1lIiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAiaHRtbCIsICJjc3MiLCAicHJvcGVydHkiLCAiY29uc3VtZSIsICJzdGF0ZSIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJjc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgImNvbnN1bWUiLCAiTGl0RWxlbWVudCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJMaXRFbGVtZW50IiwgInByb3BlcnR5IiwgImNvbnN1bWUiLCAic3RhdGUiLCAiaHRtbCIsICJjc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiY3NzIiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgImNzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgInByb3BlcnR5IiwgInN0YXRlIiwgIkxpdEVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInN0YXRlIiwgImNzcyIsICJodG1sIiwgInN0YXRlIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInN0YXRlIiwgImlmRGVmaW5lZCIsICJjc3MiLCAiaHRtbCIsICJpZkRlZmluZWQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAiY3NzIiwgImh0bWwiLCAic3RhdGUiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAiY3NzIiwgImh0bWwiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImNzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiY3NzIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiaHRtbCIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJodG1sIiwgImh0bWwiLCAiY29uc3VtZSIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgInN0YXRlIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJjc3MiLCAic3RhdGUiLCAiY29uc3VtZSIsICJwcm9wZXJ0eSIsICJwcm9wZXJ0eSIsICJwcm9wZXJ0eSIsICJwcm9wZXJ0eSIsICJwcm9wZXJ0eSIsICJwcm9wZXJ0eSIsICJwcm9wZXJ0eSIsICJwcm9wZXJ0eSIsICJwcm9wZXJ0eSIsICJMaXRFbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAicHJvcGVydHkiLCAiaHRtbCIsICJodG1sIiwgImNvbnN1bWUiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgInByb3BlcnR5IiwgInN0YXRlIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJwcm9wZXJ0eSIsICJjb25zdW1lIiwgInN0YXRlIiwgInByb3BlcnR5IiwgInByb3BlcnR5IiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJwcm9wZXJ0eSIsICJyZXF1aXJlIiwgImh0bWwiLCAic3RhdGUiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAic3RhdGUiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAiZHJhZ2dhYmxlIiwgInBhcmVudCIsICJpbmRleCIsICJ0YXJnZXRJbmRleCIsICJwcm9wZXJ0eSIsICJjc3MiLCAiaHRtbCIsICJzdGF0ZSIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJpZnJhbWUiLCAiaHRtbCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJodG1sIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgImNzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicXVlcnkiLCAic3RhdGUiLCAiaWZEZWZpbmVkIiwgImh0bWwiLCAiaWZEZWZpbmVkIiwgImNzcyIsICJzdGF0ZSIsICJxdWVyeSIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJjc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiaG90c3BvdCIsICJjc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiY3NzIiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInN0YXRlIiwgInVuc2FmZUhUTUwiLCAiY3NzIiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJjc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJ1bnNhZmVIVE1MIiwgInN0YXRlIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgImNzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAidW5zYWZlSFRNTCIsICJodG1sIiwgInVuc2FmZUhUTUwiLCAiY3NzIiwgInN0YXRlIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImNzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAicmVwZWF0IiwgImh0bWwiLCAicmVwZWF0IiwgImNzcyIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAicXVlcnkiLCAiaHRtbCIsICJldmVudCIsICJ4IiwgImRpZmZYIiwgImNzcyIsICJxdWVyeSIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgImNvbnN1bWUiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAic3RhdGUiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImNvbnN1bWUiLCAic3RhdGUiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImNzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiY3NzIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJMaXRFbGVtZW50IiwgImNzcyIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiY3NzIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJMaXRFbGVtZW50IiwgImNzcyIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiY3NzIiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgIkxpdEVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgIm5vdGhpbmciLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAibm90aGluZyIsICJjc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCJdCn0K
|
|
6593
|
+
//# sourceMappingURL=index.js.map
|