@datagrok-libraries/bio 2.0.0 → 2.0.3
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/package.json +2 -2
- package/src/utils.d.ts +4 -0
- package/src/utils.d.ts.map +1 -0
- package/src/utils.js +15 -0
- package/src/viewers/web-logo.d.ts +3 -1
- package/src/viewers/web-logo.d.ts.map +1 -1
- package/src/viewers/web-logo.js +56 -34
package/package.json
CHANGED
|
@@ -5,13 +5,13 @@
|
|
|
5
5
|
},
|
|
6
6
|
"beta": true,
|
|
7
7
|
"friendlyName": "Datagrok bio library",
|
|
8
|
-
"version": "2.0.
|
|
8
|
+
"version": "2.0.3",
|
|
9
9
|
"description": "",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"@datagrok-libraries/utils": "^0.4.2",
|
|
12
12
|
"@types/wu": "latest",
|
|
13
13
|
"cash-dom": "latest",
|
|
14
|
-
"datagrok-api": "^1.
|
|
14
|
+
"datagrok-api": "^1.3.5",
|
|
15
15
|
"dayjs": "latest",
|
|
16
16
|
"rxjs": "^6.5.5",
|
|
17
17
|
"wu": "latest"
|
package/src/utils.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAEtC,eAAO,MAAM,SAAS,uBAAuB,CAAC;AAE9C,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAajE"}
|
package/src/utils.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const SEPARATOR = 'sequence-separator';
|
|
2
|
+
export function getColumnSeparator(col) {
|
|
3
|
+
const separator = col.tags[SEPARATOR];
|
|
4
|
+
if (separator)
|
|
5
|
+
return separator;
|
|
6
|
+
const defaultSeparators = ['.', '-', ' '];
|
|
7
|
+
const categories = col.categories;
|
|
8
|
+
const catLen = categories.length;
|
|
9
|
+
for (const potentialSeparator of defaultSeparators) {
|
|
10
|
+
if (categories.every((sequence) => sequence.includes(potentialSeparator) || sequence == ''))
|
|
11
|
+
return potentialSeparator;
|
|
12
|
+
}
|
|
13
|
+
return separator !== null && separator !== void 0 ? separator : '';
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsb0JBQW9CLENBQUM7QUFFOUMsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEdBQXNCO0lBQ3ZELE1BQU0sU0FBUyxHQUF1QixHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzFELElBQUksU0FBUztRQUNYLE9BQU8sU0FBUyxDQUFDO0lBRW5CLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzFDLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUM7SUFDbEMsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztJQUNqQyxLQUFLLE1BQU0sa0JBQWtCLElBQUksaUJBQWlCLEVBQUU7UUFDbEQsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBZ0IsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLFFBQVEsSUFBSSxFQUFFLENBQUM7WUFDakcsT0FBTyxrQkFBa0IsQ0FBQztLQUM3QjtJQUNELE9BQU8sU0FBUyxhQUFULFNBQVMsY0FBVCxTQUFTLEdBQUksRUFBRSxDQUFDO0FBQ3pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG5leHBvcnQgY29uc3QgU0VQQVJBVE9SID0gJ3NlcXVlbmNlLXNlcGFyYXRvcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb2x1bW5TZXBhcmF0b3IoY29sOiBERy5Db2x1bW48c3RyaW5nPik6IHN0cmluZyB7XG4gIGNvbnN0IHNlcGFyYXRvcjogc3RyaW5nIHwgdW5kZWZpbmVkID0gY29sLnRhZ3NbU0VQQVJBVE9SXTtcbiAgaWYgKHNlcGFyYXRvcilcbiAgICByZXR1cm4gc2VwYXJhdG9yO1xuXG4gIGNvbnN0IGRlZmF1bHRTZXBhcmF0b3JzID0gWycuJywgJy0nLCAnICddO1xuICBjb25zdCBjYXRlZ29yaWVzID0gY29sLmNhdGVnb3JpZXM7XG4gIGNvbnN0IGNhdExlbiA9IGNhdGVnb3JpZXMubGVuZ3RoO1xuICBmb3IgKGNvbnN0IHBvdGVudGlhbFNlcGFyYXRvciBvZiBkZWZhdWx0U2VwYXJhdG9ycykge1xuICAgIGlmIChjYXRlZ29yaWVzLmV2ZXJ5KChzZXF1ZW5jZTogc3RyaW5nKSA9PiBzZXF1ZW5jZS5pbmNsdWRlcyhwb3RlbnRpYWxTZXBhcmF0b3IpIHx8IHNlcXVlbmNlID09ICcnKSlcbiAgICAgIHJldHVybiBwb3RlbnRpYWxTZXBhcmF0b3I7XG4gIH1cbiAgcmV0dXJuIHNlcGFyYXRvciA/PyAnJztcbn1cbiJdfQ==
|
|
@@ -59,6 +59,7 @@ export declare class WebLogo extends DG.JsViewer {
|
|
|
59
59
|
verticalAlignment: string | null;
|
|
60
60
|
horizontalAlignment: string | null;
|
|
61
61
|
fitArea: boolean;
|
|
62
|
+
shrinkEmptyTail: boolean;
|
|
62
63
|
private positionNames;
|
|
63
64
|
private startPosition;
|
|
64
65
|
private endPosition;
|
|
@@ -70,6 +71,7 @@ export declare class WebLogo extends DG.JsViewer {
|
|
|
70
71
|
/** Assigns {@link seqCol} and {@link cp} based on {@link sequenceColumnName} and calls {@link render}().
|
|
71
72
|
*/
|
|
72
73
|
private updateSeqCol;
|
|
74
|
+
private updatePositions;
|
|
73
75
|
onPropertyChanged(property: DG.Property): void;
|
|
74
76
|
onTableAttached(): Promise<void>;
|
|
75
77
|
protected _nullSequence(fillerResidue?: string): string;
|
|
@@ -82,7 +84,7 @@ export declare class WebLogo extends DG.JsViewer {
|
|
|
82
84
|
* @return {SeqPalette} Palette corresponding to the alphabet of the sequences in the column
|
|
83
85
|
*/
|
|
84
86
|
static pickUpPalette(seqCol: DG.Column, minLength?: number): SeqPalette;
|
|
85
|
-
static getAlphabetFreqs(seqCol: DG.Column): MonomerFreqs;
|
|
87
|
+
static getAlphabetFreqs(seqCol: DG.Column, minLength?: number): MonomerFreqs;
|
|
86
88
|
static getAlphabetSimilarity(freq: MonomerFreqs, alphabet: Set<string>, gapSymbol?: string): number;
|
|
87
89
|
/** First try to find column with semType 'alignedSequence'.
|
|
88
90
|
* Next look for column with data alphabet corresponding to any of the known palettes.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-logo.d.ts","sourceRoot":"","sources":["web-logo.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAUtC,OAAO,EAAC,UAAU,EAAC,MAAM,iBAAiB,CAAC;AAE3C,OAAO,QAAQ,uBAAuB,CAAC;IACrC,UAAU,IAAI;QACZ,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;KACzC;CACF;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,iBAAiB;QACzB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,EAAE,CAAC,KAAK,CAAC;KAChD;CACF;AAED,aAAK,YAAY,GAAG;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAAC;AAW5C,qBAAa,mBAAmB;IAC9B;OACG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;OACG;IACH,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC;;CAMjB;AAED,qBAAa,YAAY;IACvB,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,IAAI,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAAA;KAAE,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;gBACS,IAAI,EAAE,MAAM;CAKzB;AAGD,qBAAa,OAAQ,SAAQ,EAAE,CAAC,QAAQ;IACtC,OAAc,WAAW,SAAiB;IAE1C,OAAO,CAAC,WAAW,CAAkB;IAGrC,SAAS,CAAC,EAAE,EAAE,UAAU,GAAG,IAAI,CAAQ;IAEvC,OAAO,CAAC,IAAI,CAAC,CAAiB;IAC9B,OAAO,CAAC,OAAO,CAAC,CAAc;IAC9B,OAAO,CAAC,MAAM,CAAC,CAAoB;IACnC,OAAO,CAAC,MAAM,CAAC,CAAiB;IAChC,OAAO,CAAC,YAAY,CAAqB;IAEzC,OAAO,CAAC,UAAU,CAAc;IAEhC,OAAO,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"web-logo.d.ts","sourceRoot":"","sources":["web-logo.ts"],"names":[],"mappings":"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"}
|
package/src/viewers/web-logo.js
CHANGED
|
@@ -68,7 +68,8 @@ export class WebLogo extends DG.JsViewer {
|
|
|
68
68
|
this.fixWidth = this.bool('fixWidth', false);
|
|
69
69
|
this.verticalAlignment = this.string('verticalAlignment', 'middle', { choices: ['top', 'middle', 'bottom'] });
|
|
70
70
|
this.horizontalAlignment = this.string('horizontalAlignment', 'center', { choices: ['left', 'center', 'right'] });
|
|
71
|
-
this.fitArea = this.bool('fitArea', true
|
|
71
|
+
this.fitArea = this.bool('fitArea', true);
|
|
72
|
+
this.shrinkEmptyTail = this.bool('shrinkEmptyTail', true);
|
|
72
73
|
}
|
|
73
74
|
/** For startPosition equals to endPosition Length is 1 */
|
|
74
75
|
get Length() {
|
|
@@ -111,8 +112,8 @@ export class WebLogo extends DG.JsViewer {
|
|
|
111
112
|
if (this.dataFrame && this.seqCol && monomer) {
|
|
112
113
|
ui.tooltip.showRowGroup(this.dataFrame, (iRow) => {
|
|
113
114
|
const seq = this.seqCol.get(iRow);
|
|
114
|
-
const
|
|
115
|
-
return
|
|
115
|
+
const seqM = seq ? WebLogo.splitSeqToMonomers(seq)[this.startPosition + jPos] : null;
|
|
116
|
+
return seqM === monomer && this.dataFrame.filter.get(iRow);
|
|
116
117
|
}, args.x + 16, args.y + 16);
|
|
117
118
|
}
|
|
118
119
|
else {
|
|
@@ -128,8 +129,8 @@ export class WebLogo extends DG.JsViewer {
|
|
|
128
129
|
if (this.dataFrame && this.seqCol && monomer) {
|
|
129
130
|
this.dataFrame.selection.init((iRow) => {
|
|
130
131
|
const seq = this.seqCol.get(iRow);
|
|
131
|
-
const
|
|
132
|
-
return
|
|
132
|
+
const seqM = seq ? WebLogo.splitSeqToMonomers(seq)[this.startPosition + jPos] : null;
|
|
133
|
+
return seqM === monomer && this.dataFrame.filter.get(iRow);
|
|
133
134
|
});
|
|
134
135
|
}
|
|
135
136
|
}));
|
|
@@ -155,27 +156,42 @@ export class WebLogo extends DG.JsViewer {
|
|
|
155
156
|
this.sequenceColumnName = this.seqCol ? this.seqCol.name : null;
|
|
156
157
|
}
|
|
157
158
|
if (this.seqCol) {
|
|
158
|
-
|
|
159
|
-
// Get position names from data column tag 'positionNames'
|
|
160
|
-
const positionNamesTxt = this.seqCol.getTag('positionNames');
|
|
161
|
-
// Fallback if 'positionNames' tag is not provided
|
|
162
|
-
this.positionNames = positionNamesTxt ? positionNamesTxt.split(', ').map((n) => n.trim()) :
|
|
163
|
-
[...Array(maxLength).keys()].map((jPos) => `${jPos + 1}`);
|
|
164
|
-
this.startPosition = this.startPositionName && this.positionNames ?
|
|
165
|
-
this.positionNames.indexOf(this.startPositionName) : 0;
|
|
166
|
-
this.endPosition = this.endPositionName && this.positionNames ?
|
|
167
|
-
this.positionNames.indexOf(this.endPositionName) : (maxLength - 1);
|
|
159
|
+
this.updatePositions();
|
|
168
160
|
this.cp = WebLogo.pickUpPalette(this.seqCol);
|
|
169
161
|
}
|
|
170
162
|
else {
|
|
171
|
-
this.cp = null;
|
|
172
163
|
this.positionNames = [];
|
|
173
164
|
this.startPosition = -1;
|
|
174
165
|
this.endPosition = -1;
|
|
166
|
+
this.cp = null;
|
|
175
167
|
}
|
|
176
168
|
}
|
|
177
169
|
this.render();
|
|
178
170
|
}
|
|
171
|
+
updatePositions() {
|
|
172
|
+
if (!this.seqCol)
|
|
173
|
+
return;
|
|
174
|
+
let categories;
|
|
175
|
+
if (this.shrinkEmptyTail) {
|
|
176
|
+
const indices = this.dataFrame.filter.getSelectedIndexes();
|
|
177
|
+
categories = Array.from(new Set(Array.from(Array(indices.length).keys()).map((i) => this.seqCol.get(indices[i]))));
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
categories = this.seqCol.categories;
|
|
181
|
+
}
|
|
182
|
+
const maxLength = categories.length > 0 ? Math.max(...categories.map((s) => s !== null ? WebLogo.splitSeqToMonomers(s).length : 0)) : 0;
|
|
183
|
+
// Get position names from data column tag 'positionNames'
|
|
184
|
+
const positionNamesTxt = this.seqCol.getTag('positionNames');
|
|
185
|
+
// Fallback if 'positionNames' tag is not provided
|
|
186
|
+
this.positionNames = positionNamesTxt ? positionNamesTxt.split(', ').map((n) => n.trim()) :
|
|
187
|
+
[...Array(maxLength).keys()].map((jPos) => `${jPos + 1}`);
|
|
188
|
+
this.startPosition = (this.startPositionName && this.positionNames &&
|
|
189
|
+
this.positionNames.includes(this.startPositionName)) ?
|
|
190
|
+
this.positionNames.indexOf(this.startPositionName) : 0;
|
|
191
|
+
this.endPosition = (this.endPositionName && this.positionNames &&
|
|
192
|
+
this.positionNames.includes(this.endPositionName)) ?
|
|
193
|
+
this.positionNames.indexOf(this.endPositionName) : (maxLength - 1);
|
|
194
|
+
}
|
|
179
195
|
onPropertyChanged(property) {
|
|
180
196
|
// console.debug(`WebLogo.onPropertyChanged( ${property.name} = '' })`);
|
|
181
197
|
super.onPropertyChanged(property);
|
|
@@ -214,6 +230,10 @@ export class WebLogo extends DG.JsViewer {
|
|
|
214
230
|
case 'fitArea':
|
|
215
231
|
this.render(true);
|
|
216
232
|
break;
|
|
233
|
+
case 'shrinkEmptyTail':
|
|
234
|
+
this.updatePositions();
|
|
235
|
+
this.render(true);
|
|
236
|
+
break;
|
|
217
237
|
}
|
|
218
238
|
}
|
|
219
239
|
onTableAttached() {
|
|
@@ -222,7 +242,10 @@ export class WebLogo extends DG.JsViewer {
|
|
|
222
242
|
this.updateSeqCol();
|
|
223
243
|
if (this.dataFrame !== void 0) {
|
|
224
244
|
this.subs.push(this.dataFrame.selection.onChanged.subscribe((_) => this.render()));
|
|
225
|
-
this.subs.push(this.dataFrame.filter.onChanged.subscribe((_) =>
|
|
245
|
+
this.subs.push(this.dataFrame.filter.onChanged.subscribe((_) => {
|
|
246
|
+
this.updatePositions();
|
|
247
|
+
this.render();
|
|
248
|
+
}));
|
|
226
249
|
}
|
|
227
250
|
yield this.init();
|
|
228
251
|
});
|
|
@@ -233,8 +256,7 @@ export class WebLogo extends DG.JsViewer {
|
|
|
233
256
|
return '';
|
|
234
257
|
}
|
|
235
258
|
_calculate() {
|
|
236
|
-
if (!this.canvas || !this.host || !this.seqCol || !this.dataFrame
|
|
237
|
-
this.startPosition === -1 || this.endPosition === -1)
|
|
259
|
+
if (!this.canvas || !this.host || !this.seqCol || !this.dataFrame)
|
|
238
260
|
return;
|
|
239
261
|
this.calcSize();
|
|
240
262
|
this.positions = new Array(this.Length);
|
|
@@ -310,21 +332,20 @@ export class WebLogo extends DG.JsViewer {
|
|
|
310
332
|
this.msgHost.style.display = 'none';
|
|
311
333
|
}
|
|
312
334
|
}
|
|
313
|
-
if (!this.canvas || !this.seqCol || !this.dataFrame || !this.cp
|
|
314
|
-
this.startPosition === -1 || this.endPosition === -1)
|
|
335
|
+
if (!this.canvas || !this.seqCol || !this.dataFrame || !this.cp)
|
|
315
336
|
return;
|
|
316
337
|
const g = this.canvas.getContext('2d');
|
|
317
338
|
if (!g)
|
|
318
339
|
return;
|
|
319
340
|
if (recalc)
|
|
320
341
|
this._calculate();
|
|
321
|
-
// let rowCount = this.rowsMasked;
|
|
322
|
-
// if (!this.considerNullSequences)
|
|
323
|
-
// rowCount -= this.rowsNull;
|
|
324
342
|
g.resetTransform();
|
|
325
343
|
g.fillStyle = 'white';
|
|
326
344
|
g.fillRect(0, 0, this.canvas.width, this.canvas.height);
|
|
327
345
|
g.textBaseline = this.textBaseline;
|
|
346
|
+
// Prevents division by zero on Length = 0
|
|
347
|
+
if (this.startPosition === -1 || this.endPosition === -1)
|
|
348
|
+
return;
|
|
328
349
|
//#region Plot positionNames
|
|
329
350
|
g.resetTransform();
|
|
330
351
|
g.fillStyle = 'black';
|
|
@@ -443,7 +464,7 @@ export class WebLogo extends DG.JsViewer {
|
|
|
443
464
|
res = NucleotidesPalettes.Chromatogram;
|
|
444
465
|
break;
|
|
445
466
|
}
|
|
446
|
-
const alphabetFreqs = WebLogo.getAlphabetFreqs(seqCol);
|
|
467
|
+
const alphabetFreqs = WebLogo.getAlphabetFreqs(seqCol, minLength);
|
|
447
468
|
const alphabetCandidates = [
|
|
448
469
|
[new Set(Object.keys(Nucleotides.Names)), NucleotidesPalettes.Chromatogram],
|
|
449
470
|
[new Set(Object.keys(Aminoacids.Names)), AminoacidsPalettes.GrokGroups],
|
|
@@ -451,7 +472,7 @@ export class WebLogo extends DG.JsViewer {
|
|
|
451
472
|
// Calculate likelihoods for alphabet_candidates
|
|
452
473
|
const alphabetCandidatesSim = alphabetCandidates.map((c) => WebLogo.getAlphabetSimilarity(alphabetFreqs, c[0]));
|
|
453
474
|
const maxCos = Math.max(...alphabetCandidatesSim);
|
|
454
|
-
if (maxCos > 0.
|
|
475
|
+
if (maxCos > 0.65)
|
|
455
476
|
res = alphabetCandidates[alphabetCandidatesSim.indexOf(maxCos)][1];
|
|
456
477
|
else
|
|
457
478
|
res = UnknownSeqPalettes.Color;
|
|
@@ -474,13 +495,16 @@ export class WebLogo extends DG.JsViewer {
|
|
|
474
495
|
// }
|
|
475
496
|
return res;
|
|
476
497
|
}
|
|
477
|
-
static getAlphabetFreqs(seqCol) {
|
|
498
|
+
static getAlphabetFreqs(seqCol, minLength = 0) {
|
|
478
499
|
const res = {};
|
|
479
500
|
for (const seq of seqCol.categories) {
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
501
|
+
const mSeq = WebLogo.splitSeqToMonomers(seq);
|
|
502
|
+
if (mSeq.length > minLength) {
|
|
503
|
+
for (const m of mSeq) {
|
|
504
|
+
if (!(m in res))
|
|
505
|
+
res[m] = 0;
|
|
506
|
+
res[m] += 1;
|
|
507
|
+
}
|
|
484
508
|
}
|
|
485
509
|
}
|
|
486
510
|
return res;
|
|
@@ -490,11 +514,9 @@ export class WebLogo extends DG.JsViewer {
|
|
|
490
514
|
keys.delete(gapSymbol);
|
|
491
515
|
const freqA = [];
|
|
492
516
|
const alphabetA = [];
|
|
493
|
-
let len = 0;
|
|
494
517
|
for (const m of keys) {
|
|
495
518
|
freqA.push(m in freq ? freq[m] : 0);
|
|
496
519
|
alphabetA.push(alphabet.has(m) ? 1 : 0);
|
|
497
|
-
len += 1;
|
|
498
520
|
}
|
|
499
521
|
/* There were a few ideas: chi-squared, pearson correlation (variance?), scalar product */
|
|
500
522
|
const freqV = new Vector(freqA);
|
|
@@ -551,4 +573,4 @@ WebLogo.aaSynonyms = {
|
|
|
551
573
|
'[MeG]': 'G',
|
|
552
574
|
'[MeF]': 'F',
|
|
553
575
|
};
|
|
554
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWxvZ28uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3ZWItbG9nby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFDQSxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFdEMsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3BCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxpREFBaUQsQ0FBQztBQUN2RSxPQUFPLEVBQUMsWUFBWSxFQUFFLGdCQUFnQixFQUFDLE1BQU0saURBQWlELENBQUM7QUFDL0YsT0FBTyxFQUFDLFVBQVUsRUFBRSxrQkFBa0IsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUMsV0FBVyxFQUFFLG1CQUFtQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEUsT0FBTyxFQUFDLGlCQUFpQixFQUFFLGtCQUFrQixFQUFDLE1BQU0sWUFBWSxDQUFDO0FBaUJqRSxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLEdBQUcsVUFBUyxLQUFpQjtJQUN4RSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUMxQyxPQUFPLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0UsQ0FBQyxDQUFDO0FBRUYsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLFVBQVMsQ0FBUyxFQUFFLENBQVM7SUFDeEQsT0FBTyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsR0FBRyxJ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QUNiLENBQUM7SUFJTSxNQUFNLENBQUMsa0JBQWtCLENBQUMsR0FBVztRQUMxQywrQkFBK0I7UUFDL0IsTUFBTSxHQUFHLEdBQWEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7WUFDNUUsSUFBSSxJQUFZLENBQUM7WUFDakIsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hCLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ2hCLElBQUksQ0FBQyxJQUFJLE9BQU8sQ0FBQyxVQUFVLEVBQUU7b0JBQzNCLElBQUksR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUM5QjtxQkFBTTtvQkFDTCxJQUFJLEdBQUcsRUFBRSxDQUFDO29CQUNWLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsNEJBQTRCLENBQUMsQ0FBQztpQkFDL0Q7YUFDRjtpQkFBTTtnQkFDTCxJQUFJLEdBQUcsQ0FBQyxDQUFDO2FBQ1Y7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRWIsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDOztBQXZtQmEsbUJBQVcsR0FBRyxhQUFhLENBQUM7QUFrbEIzQixlQUFPLEdBQUcscUJBQXFCLENBQUM7QUF1Qi9DLDhGQUE4RjtBQUMvRSxrQkFBVSxHQUErQjtJQUN0RCxTQUFTLEVBQUUsR0FBRztJQUNkLE9BQU8sRUFBRSxHQUFHO0lBQ1osT0FBTyxFQUFFLEdBQUc7SUFDWixPQUFPLEVBQUUsR0FBRztDQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIHVpIGZyb20gJ2RhdGFncm9rLWFwaS91aSc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuXG5pbXBvcnQgd3UgZnJvbSAnd3UnO1xuaW1wb3J0ICogYXMgcnhqcyBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtWZWN0b3J9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3R5cGUtZGVjbGFyYXRpb25zJztcbmltcG9ydCB7dmVjdG9yTGVuZ3RoLCB2ZWN0b3JEb3RQcm9kdWN0fSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy92ZWN0b3Itb3BlcmF0aW9ucyc7XG5pbXBvcnQge0FtaW5vYWNpZHMsIEFtaW5vYWNpZHNQYWxldHRlc30gZnJvbSAnLi4vYW1pbm9hY2lkcyc7XG5pbXBvcnQge051Y2xlb3RpZGVzLCBOdWNsZW90aWRlc1BhbGV0dGVzfSBmcm9tICcuLi9udWNsZW90aWRlcyc7XG5pbXBvcnQge1Vua25vd25TZXFQYWxldHRlLCBVbmtub3duU2VxUGFsZXR0ZXN9IGZyb20gJy4uL3Vua25vd24nO1xuaW1wb3J0IHtTZXFQYWxldHRlfSBmcm9tICcuLi9zZXEtcGFsZXR0ZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnZGF0YWdyb2stYXBpL3NyYy9ncmlkJyB7XG4gIGludGVyZmFjZSBSZWN0IHtcbiAgICBjb250YWlucyh4OiBudW1iZXIsIHk6IG51bWJlcik6IGJvb2xlYW47XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTENhbnZhc0VsZW1lbnQge1xuICAgIGdldEN1cnNvclBvc2l0aW9uKGV2ZW50OiBNb3VzZUV2ZW50KTogREcuUG9pbnQ7XG4gIH1cbn1cblxudHlwZSBNb25vbWVyRnJlcXMgPSB7IFttOiBzdHJpbmddOiBudW1iZXIgfTtcblxuSFRNTENhbnZhc0VsZW1lbnQucHJvdG90eXBlLmdldEN1cnNvclBvc2l0aW9uID0gZnVuY3Rpb24oZXZlbnQ6IE1vdXNlRXZlbnQpOiBERy5Qb2ludCB7XG4gIGNvbnN0IHJlY3QgPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICByZXR1cm4gbmV3IERHLlBvaW50KGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQsIGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcCk7XG59O1xuXG5ERy5SZWN0LnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uKHg6IG51bWJlciwgeTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiB0aGlzLmxlZnQgPD0geCAmJiB4IDw9IHRoaXMucmlnaHQgJiYgdGhpcy50b3AgPD0geSAmJiB5IDw9IHRoaXMuYm90dG9tO1xufTtcblxuZXhwb3J0IGNsYXNzIFBvc2l0aW9uTW9ub21lckluZm8ge1xuICAvKiogU2VxdWVuY2VzIGNvdW50IHdpdGggbW9ub21lciBpbiBwb3NpdGlvblxuICAgKi9cbiAgY291bnQ6IG51bWJlcjtcblxuICAvKiogUmVtZW1iZXIgc2NyZWVuIGNvb3JkcyByZWN0XG4gICAqL1xuICBib3VuZHM6IERHLlJlY3Q7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jb3VudCA9IDA7XG4gICAgdGhpcy5ib3VuZHMgPSBuZXcgREcuUmVjdCgwLCAwLCAwLCAwKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUG9zaXRpb25JbmZvIHtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgZnJlcTogeyBbbTogc3RyaW5nXTogUG9zaXRpb25Nb25vbWVySW5mbyB9O1xuICByb3dDb3VudDogbnVtYmVyO1xuXG4gIC8qKiBmcmVxID0ge30sIHJvd0NvdW50ID0gMFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHBvc2l0aW9uICgnMTExQScsICcxMTEuMScsIGV0YylcbiAgICovXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5mcmVxID0ge307XG4gICAgdGhpcy5yb3dDb3VudCA9IDA7XG4gIH1cbn1cblxuXG5leHBvcnQgY2xhc3MgV2ViTG9nbyBleHRlbmRzIERHLkpzVmlld2VyIHtcbiAgcHVibGljIHN0YXRpYyByZXNpZHVlc1NldCA9ICdudWNsZW90aWRlcyc7XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8vIHByaXZhdGUgcmVhZG9ubHkgY29sb3JTY2hlbWU6IENvbG9yU2NoZW1lID0gQ29sb3JTY2hlbWVzW051Y2xlb3RpZGVzV2ViTG9nby5yZXNpZHVlc1NldF07XG4gIHByb3RlY3RlZCBjcDogU2VxUGFsZXR0ZSB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgaG9zdD86IEhUTUxEaXZFbGVtZW50O1xuICBwcml2YXRlIG1zZ0hvc3Q/OiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBjYW52YXM/OiBIVE1MQ2FudmFzRWxlbWVudDtcbiAgcHJpdmF0ZSBzbGlkZXI/OiBERy5SYW5nZVNsaWRlcjtcbiAgcHJpdmF0ZSB0ZXh0QmFzZWxpbmU6IENhbnZhc1RleHRCYXNlbGluZTtcblxuICBwcml2YXRlIGF4aXNIZWlnaHQ6IG51bWJlciA9IDEyO1xuXG4gIHByaXZhdGUgc2VxQ29sOiBERy5Db2x1bW4gfCBudWxsID0gbnVsbDtcbiAgLy8gcHJpdmF0ZSBtYXhMZW5ndGg6IG51bWJlciA9IDEwMDtcbiAgcHJpdmF0ZSBwb3NpdGlvbnM6IFBvc2l0aW9uSW5mb1tdID0gW107XG5cbiAgcHJpdmF0ZSByb3dzTWFza2VkOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIHJvd3NOdWxsOiBudW1iZXIgPSAwO1xuXG4gIC8vIFZpZXdlcidzIHByb3BlcnRpZXMgKGxpa2VseSB0aGV5IHNob3VsZCBiZSBwdWJsaWMgc28gdGhhdCB0aGV5IGNhbiBiZSBzZXQgb3V0c2lkZSlcbiAgcHJpdmF0ZSBfcG9zaXRpb25XaWR0aDogbnVtYmVyO1xuICBwdWJsaWMgcG9zaXRpb25XaWR0aDogbnVtYmVyO1xuICBwdWJsaWMgbWluSGVpZ2h0OiBudW1iZXI7XG4gIHB1YmxpYyBtYXhIZWlnaHQ6IG51bWJlcjtcbiAgcHVibGljIGNvbnNpZGVyTnVsbFNlcXVlbmNlczogYm9vbGVhbjtcbiAgcHVibGljIHNlcXVlbmNlQ29sdW1uTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgcHVibGljIHN0YXJ0UG9zaXRpb25OYW1lOiBzdHJpbmcgfCBudWxsO1xuICBwdWJsaWMgZW5kUG9zaXRpb25OYW1lOiBzdHJpbmcgfCBudWxsO1xuICBwdWJsaWMgZml4V2lkdGg6IGJvb2xlYW47XG4gIHB1YmxpYyB2ZXJ0aWNhbEFsaWdubWVudDogc3RyaW5nIHwgbnVsbDtcbiAgcHVibGljIGhvcml6b250YWxBbGlnbm1lbnQ6IHN0cmluZyB8IG51bGw7XG4gIHB1YmxpYyBmaXRBcmVhOiBib29sZWFuO1xuXG4gIHByaXZhdGUgcG9zaXRpb25OYW1lczogc3RyaW5nW10gPSBbXTtcblxuICBwcml2YXRlIHN0YXJ0UG9zaXRpb246IG51bWJlciA9IC0xO1xuXG4gIHByaXZhdGUgZW5kUG9zaXRpb246IG51bWJlciA9IC0xO1xuXG4gIC8qKiBGb3Igc3RhcnRQb3NpdGlvbiBlcXVhbHMgdG8gZW5kUG9zaXRpb24gTGVuZ3RoIGlzIDEgKi9cbiAgcHJpdmF0ZSBnZXQgTGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRQb3NpdGlvbiA8PSB0aGlzLmVuZFBvc2l0aW9uID8gdGhpcy5lbmRQb3NpdGlvbiAtIHRoaXMuc3RhcnRQb3NpdGlvbiArIDEgOiAwO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMudGV4dEJhc2VsaW5lID0gJ3RvcCc7XG5cbiAgICB0aGlzLl9wb3NpdGlvbldpZHRoID0gdGhpcy5wb3NpdGlvbldpZHRoID0gdGhpcy5mbG9hdCgncG9zaXRpb25XaWR0aCcsIDE2LyosXG4gICAgICB7ZWRpdG9yOiAnc2xpZGVyJywgbWluOiA0LCBtYXg6IDY0LCBwb3N0Zml4OiAncHgnfSovKTtcbiAgICB0aGlzLm1pbkhlaWdodCA9IHRoaXMuZmxvYXQoJ21pbkhlaWdodCcsIDUwLyosXG4gICAgICB7ZWRpdG9yOiAnc2xpZGVyJywgbWluOiAyNSwgbWF4OiAyNTAsIHBvc3RmaXg6ICdweCd9Ki8pO1xuICAgIHRoaXMubWF4SGVpZ2h0ID0gdGhpcy5mbG9hdCgnbWF4SGVpZ2h0JywgMTAwLyosXG4gICAgICB7ZWRpdG9yOiAnc2xpZGVyJywgbWluOiAyNSwgbWF4OiA1MDAsIHBvc3RmaXg6ICdweCd9Ki8pO1xuXG4gICAgdGhpcy5jb25zaWRlck51bGxTZXF1ZW5jZXMgPSB0aGlzLmJvb2woJ2NvbnNpZGVyTnVsbFNlcXVlbmNlcycsIGZhbHNlKTtcbiAgICB0aGlzLnNlcXVlbmNlQ29sdW1uTmFtZSA9IHRoaXMuc3RyaW5nKCdzZXF1ZW5jZUNvbHVtbk5hbWUnLCBudWxsKTtcblxuICAgIHRoaXMuc3RhcnRQb3NpdGlvbk5hbWUgPSB0aGlzLnN0cmluZygnc3RhcnRQb3NpdGlvbk5hbWUnLCBudWxsKTtcbiAgICB0aGlzLmVuZFBvc2l0aW9uTmFtZSA9IHRoaXMuc3RyaW5nKCdlbmRQb3NpdGlvbk5hbWUnLCBudWxsKTtcblxuICAgIHRoaXMuZml4V2lkdGggPSB0aGlzLmJvb2woJ2ZpeFdpZHRoJywgZmFsc2UpO1xuXG4gICAgdGhpcy52ZXJ0aWNhbEFsaWdubWVudCA9IHRoaXMuc3RyaW5nKCd2ZXJ0aWNhbEFsaWdubWVudCcsICdtaWRkbGUnLFxuICAgICAge2Nob2ljZXM6IFsndG9wJywgJ21pZGRsZScsICdib3R0b20nXX0pO1xuICAgIHRoaXMuaG9yaXpvbnRhbEFsaWdubWVudCA9IHRoaXMuc3RyaW5nKCdob3Jpem9udGFsQWxpZ25tZW50JywgJ2NlbnRlcicsXG4gICAgICB7Y2hvaWNlczogWydsZWZ0JywgJ2NlbnRlcicsICdyaWdodCddfSk7XG4gICAgdGhpcy5maXRBcmVhID0gdGhpcy5ib29sKCdmaXRBcmVhJywgdHJ1ZSxcbiAgICAgIHt9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgY29uc29sZS5lcnJvcignV2ViTG9nbyBzZWNvbmQgaW5pdGlhbGl6YXRpb24hJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgdGhpcy5oZWxwVXJsID0gJy9oZWxwL3Zpc3VhbGl6ZS92aWV3ZXJzL3dlYi1sb2dvLm1kJztcblxuICAgIHRoaXMubXNnSG9zdCA9IHVpLmRpdignTm8gbWVzc2FnZScpO1xuICAgIHRoaXMubXNnSG9zdC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgdGhpcy5jYW52YXMgPSB1aS5jYW52YXMoKTtcbiAgICB0aGlzLmNhbnZhcy5zdHlsZS53aWR0aCA9ICcxMDAlJztcblxuICAgIHRoaXMuaG9zdCA9IHVpLmRpdihbdGhpcy5tc2dIb3N0LCB0aGlzLmNhbnZhc10pO1xuXG4gICAgLy8gdGhpcy5zbGlkZXIgPSB1aS5yYW5nZVNsaWRlcigwLCAyMCwgMiwgNSk7XG4gICAgLy8gdGhpcy5zbGlkZXIucm9vdC5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICAvLyB0aGlzLnNsaWRlci5yb290LnN0eWxlLmhlaWdodCA9ICcxMnB4JztcblxuICAgIGNvbnN0IGdldE1vbm9tZXIgPSAocDogREcuUG9pbnQpOiBbbnVtYmVyLCBzdHJpbmcgfCBudWxsLCBQb3NpdGlvbk1vbm9tZXJJbmZvIHwgbnVsbF0gPT4ge1xuICAgICAgY29uc3QgalBvcyA9IE1hdGguZmxvb3IocC54IC8gdGhpcy5fcG9zaXRpb25XaWR0aCk7XG4gICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMucG9zaXRpb25zW2pQb3NdO1xuXG4gICAgICBpZiAocG9zaXRpb24gPT09IHZvaWQgMClcbiAgICAgICAgcmV0dXJuIFtqUG9zLCBudWxsLCBudWxsXTtcblxuICAgICAgY29uc3QgbW9ub21lcjogc3RyaW5nIHwgdW5kZWZpbmVkID0gT2JqZWN0LmtleXMocG9zaXRpb24uZnJlcSlcbiAgICAgICAgLmZpbmQoKG0pID0+IHBvc2l0aW9uLmZyZXFbbV0uYm91bmRzLmNvbnRhaW5zKHAueCwgcC55KSk7XG4gICAgICBpZiAobW9ub21lciA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gW2pQb3MsIG51bGwsIG51bGxdO1xuXG4gICAgICByZXR1cm4gW2pQb3MsIG1vbm9tZXIsIHBvc2l0aW9uLmZyZXFbbW9ub21lcl1dO1xuICAgIH07XG5cbiAgICB0aGlzLmNhbnZhcy5vbm1vdXNlb3ZlciA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG5cbiAgICB9O1xuXG4gICAgdGhpcy5zdWJzLnB1c2gocnhqcy5mcm9tRXZlbnQ8TW91c2VFdmVudD4odGhpcy5jYW52YXMsICdtb3VzZW1vdmUnKS5zdWJzY3JpYmUoKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlmICghdGhpcy5jYW52YXMpXG4gICAgICAgIHJldHVybjtcblxuICAgICAgY29uc3QgYXJncyA9IGUgYXMgTW91c2VFdmVudDtcbiAgICAgIGNvbnN0IFtqUG9zLCBtb25vbWVyXSA9IGdldE1vbm9tZXIodGhpcy5jYW52YXMuZ2V0Q3Vyc29yUG9zaXRpb24oYXJncykpO1xuXG4gICAgICBpZiAodGhpcy5kYXRhRnJhbWUgJiYgdGhpcy5zZXFDb2wgJiYgbW9ub21lcikge1xuICAgICAgICB1aS50b29sdGlwLnNob3dSb3dHcm91cCh0aGlzLmRhdGFGcmFtZSwgKGlSb3cpID0+IHtcbiAgICAgICAgICBjb25zdCBzZXEgPSB0aGlzLnNlcUNvbCEuZ2V0KGlSb3cpO1xuICAgICAgICAgIGNvbnN0IG1TZXEgPSBzZXEgPyBXZWJMb2dvLnNwbGl0U2VxVG9Nb25vbWVycyhzZXEpW3RoaXMuc3RhcnRQb3NpdGlvbiArIGpQb3NdIDogbnVsbDtcbiAgICAgICAgICByZXR1cm4gbVNlcSA9PT0gbW9ub21lciAmJiB0aGlzLmRhdGFGcmFtZS5maWx0ZXIuZ2V0KGlSb3cpO1xuICAgICAgICB9LCBhcmdzLnggKyAxNiwgYXJncy55ICsgMTYpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdWkudG9vbHRpcC5oaWRlKCk7XG4gICAgICB9XG4gICAgfSkpO1xuXG4gICAgdGhpcy5zdWJzLnB1c2gocnhqcy5mcm9tRXZlbnQ8TW91c2VFdmVudD4odGhpcy5jYW52YXMsICdtb3VzZWRvd24nKS5zdWJzY3JpYmUoKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlmICghdGhpcy5jYW52YXMgfHwgZS5idXR0b24gIT0gMClcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjb25zdCBhcmdzID0gZSBhcyBNb3VzZUV2ZW50O1xuICAgICAgY29uc3QgW2pQb3MsIG1vbm9tZXJdID0gZ2V0TW9ub21lcih0aGlzLmNhbnZhcy5nZXRDdXJzb3JQb3NpdGlvbihhcmdzKSk7XG5cbiAgICAgIC8vIHByZXZlbnRzIGRlc2VsZWN0IGFsbCByb3dzIGlmIHdlIG1pc3MgbW9ub21lciBib3VuZHNcbiAgICAgIGlmICh0aGlzLmRhdGFGcmFtZSAmJiB0aGlzLnNlcUNvbCAmJiBtb25vbWVyKSB7XG4gICAgICAgIHRoaXMuZGF0YUZyYW1lLnNlbGVjdGlvbi5pbml0KChpUm93KSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2VxID0gdGhpcy5zZXFDb2whLmdldChpUm93KTtcbiAgICAgICAgICBjb25zdCBtU2VxID0gc2VxID8gV2ViTG9nby5zcGxpdFNlcVRvTW9ub21lcnMoc2VxKVt0aGlzLnN0YXJ0UG9zaXRpb24gKyBqUG9zXSA6IG51bGw7XG4gICAgICAgICAgcmV0dXJuIG1TZXEgPT09IG1vbm9tZXIgJiYgdGhpcy5kYXRhRnJhbWUuZmlsdGVyLmdldChpUm93KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSkpO1xuXG4gICAgdGhpcy5zdWJzLnB1c2godWkub25TaXplQ2hhbmdlZCh0aGlzLnJvb3QpLnN1YnNjcmliZSh0aGlzLnJvb3RPblNpemVDaGFuZ2VkLmJpbmQodGhpcykpKTtcblxuICAgIHRoaXMucm9vdC5hcHBlbmQodGhpcy5ob3N0KTtcbiAgICAvLyB0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5zbGlkZXIucm9vdCk7XG5cbiAgICB0aGlzLnJlbmRlcih0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgcm9vdE9uU2l6ZUNoYW5nZWQoYXJnczogYW55KSB7XG4gICAgdGhpcy5yZW5kZXIodHJ1ZSk7XG5cbiAgICAvLyBjb25zb2xlLmRlYnVnKGBXZWJMb2dvLm9uUm9vdFNpemVDaGFuZ2VkKCkgYCArXG4gICAgLy8gICBgcm9vdC53aWR0aD0ke3RoaXMucm9vdC5jbGllbnRXaWR0aH0sIHJvb3QuaGVpZ2h0PSR7dGhpcy5yb290LmNsaWVudEhlaWdodH0sIGAgK1xuICAgIC8vICAgYGNhbnZhcy53aWR0aD0ke3RoaXMuY2FudmFzLndpZHRofSwgY2FudmFzLmhlaWdodD0ke3RoaXMuY2FudmFzLmhlaWdodH0gLmApO1xuICB9XG5cbiAgLyoqIEFzc2lnbnMge0BsaW5rIHNlcUNvbH0gYW5kIHtAbGluayBjcH0gYmFzZWQgb24ge0BsaW5rIHNlcXVlbmNlQ29sdW1uTmFtZX0gYW5kIGNhbGxzIHtAbGluayByZW5kZXJ9KCkuXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVNlcUNvbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRhRnJhbWUpIHtcbiAgICAgIHRoaXMuc2VxQ29sID0gdGhpcy5zZXF1ZW5jZUNvbHVtbk5hbWUgPyB0aGlzLmRhdGFGcmFtZS5jb2wodGhpcy5zZXF1ZW5jZUNvbHVtbk5hbWUpIDogbnVsbDtcbiAgICAgIGlmICh0aGlzLnNlcUNvbCA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuc2VxQ29sID0gdGhpcy5waWNrVXBTZXFDb2wodGhpcy5kYXRhRnJhbWUpO1xuICAgICAgICB0aGlzLnNlcXVlbmNlQ29sdW1uTmFtZSA9IHRoaXMuc2VxQ29sID8gdGhpcy5zZXFDb2wubmFtZSA6IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zZXFDb2wpIHtcbiAgICAgICAgY29uc3QgbWF4TGVuZ3RoID0gTWF0aC5tYXgoLi4udGhpcy5zZXFDb2wuY2F0ZWdvcmllcy5tYXAoKHMpID0+IFdlYkxvZ28uc3BsaXRTZXFUb01vbm9tZXJzKHMpLmxlbmd0aCkpO1xuXG4gICAgICAgIC8vIEdldCBwb3NpdGlvbiBuYW1lcyBmcm9tIGRhdGEgY29sdW1uIHRhZyAncG9zaXRpb25OYW1lcydcbiAgICAgICAgY29uc3QgcG9zaXRpb25OYW1lc1R4dCA9IHRoaXMuc2VxQ29sLmdldFRhZygncG9zaXRpb25OYW1lcycpO1xuICAgICAgICAvLyBGYWxsYmFjayBpZiAncG9zaXRpb25OYW1lcycgdGFnIGlzIG5vdCBwcm92aWRlZFxuICAgICAgICB0aGlzLnBvc2l0aW9uTmFtZXMgPSBwb3NpdGlvbk5hbWVzVHh0ID8gcG9zaXRpb25OYW1lc1R4dC5zcGxpdCgnLCAnKS5tYXAoKG4pID0+IG4udHJpbSgpKSA6XG4gICAgICAgICAgWy4uLkFycmF5KG1heExlbmd0aCkua2V5cygpXS5tYXAoKGpQb3MpID0+IGAke2pQb3MgKyAxfWApO1xuXG4gICAgICAgIHRoaXMuc3RhcnRQb3NpdGlvbiA9IHRoaXMuc3RhcnRQb3NpdGlvbk5hbWUgJiYgdGhpcy5wb3NpdGlvbk5hbWVzID9cbiAgICAgICAgICB0aGlzLnBvc2l0aW9uTmFtZXMuaW5kZXhPZih0aGlzLnN0YXJ0UG9zaXRpb25OYW1lKSA6IDA7XG4gICAgICAgIHRoaXMuZW5kUG9zaXRpb24gPSB0aGlzLmVuZFBvc2l0aW9uTmFtZSAmJiB0aGlzLnBvc2l0aW9uTmFtZXMgP1xuICAgICAgICAgIHRoaXMucG9zaXRpb25OYW1lcy5pbmRleE9mKHRoaXMuZW5kUG9zaXRpb25OYW1lKSA6IChtYXhMZW5ndGggLSAxKTtcblxuICAgICAgICB0aGlzLmNwID0gV2ViTG9nby5waWNrVXBQYWxldHRlKHRoaXMuc2VxQ29sKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY3AgPSBudWxsO1xuICAgICAgICB0aGlzLnBvc2l0aW9uTmFtZXMgPSBbXTtcbiAgICAgICAgdGhpcy5zdGFydFBvc2l0aW9uID0gLTE7XG4gICAgICAgIHRoaXMuZW5kUG9zaXRpb24gPSAtMTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBvblByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eTogREcuUHJvcGVydHkpOiB2b2lkIHtcbiAgICAvLyBjb25zb2xlLmRlYnVnKGBXZWJMb2dvLm9uUHJvcGVydHlDaGFuZ2VkKCAke3Byb3BlcnR5Lm5hbWV9ID0gJycgfSlgKTtcbiAgICBzdXBlci5vblByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eSk7XG5cbiAgICBzd2l0Y2ggKHByb3BlcnR5Lm5hbWUpIHtcbiAgICBjYXNlICdjb25zaWRlck51bGxTZXF1ZW5jZXMnOlxuICAgICAgdGhpcy5yZW5kZXIodHJ1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzZXF1ZW5jZUNvbHVtbk5hbWUnOlxuICAgICAgdGhpcy51cGRhdGVTZXFDb2woKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3N0YXJ0UG9zaXRpb25OYW1lJzpcbiAgICAgIHRoaXMudXBkYXRlU2VxQ29sKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdlbmRQb3NpdGlvbk5hbWUnOlxuICAgICAgdGhpcy51cGRhdGVTZXFDb2woKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3Bvc2l0aW9uV2lkdGgnOlxuICAgICAgdGhpcy5fcG9zaXRpb25XaWR0aCA9IHRoaXMucG9zaXRpb25XaWR0aDtcbiAgICAgIHRoaXMucmVuZGVyKHRydWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbWluSGVpZ2h0JzpcbiAgICAgIHRoaXMucmVuZGVyKHRydWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbWF4SGVpZ2h0JzpcbiAgICAgIHRoaXMucmVuZGVyKHRydWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZml4V2lkdGgnOlxuICAgICAgdGhpcy5yZW5kZXIodHJ1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd2ZXJ0aWNhbEFsaWdubWVudCc6XG4gICAgICB0aGlzLnJlbmRlcih0cnVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2hvcml6b250YWxBbGlnbm1lbnQnOlxuICAgICAgdGhpcy5yZW5kZXIodHJ1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdmaXRBcmVhJzpcbiAgICAgIHRoaXMucmVuZGVyKHRydWUpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGFzeW5jIG9uVGFibGVBdHRhY2hlZCgpIHtcbiAgICAvLyBjb25zb2xlLmRlYnVnKGBXZWJMb2dvLm9uVGFibGVBdHRhY2hlZCggZGF0YUZyYW1lID0gJHt0aGlzLmRhdGFGcmFtZSA/ICdkYXRhJyA6ICdudWxsJ30gKWApO1xuICAgIHRoaXMudXBkYXRlU2VxQ29sKCk7XG5cbiAgICBpZiAodGhpcy5kYXRhRnJhbWUgIT09IHZvaWQgMCkge1xuICAgICAgdGhpcy5zdWJzLnB1c2godGhpcy5kYXRhRnJhbWUuc2VsZWN0aW9uLm9uQ2hhbmdlZC5zdWJzY3JpYmUoKF8pID0+IHRoaXMucmVuZGVyKCkpKTtcbiAgICAgIHRoaXMuc3Vicy5wdXNoKHRoaXMuZGF0YUZyYW1lLmZpbHRlci5vbkNoYW5nZWQuc3Vic2NyaWJlKChfKSA9PiB0aGlzLnJlbmRlcigpKSk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX251bGxTZXF1ZW5jZShmaWxsZXJSZXNpZHVlID0gJ1gnKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5jb25zaWRlck51bGxTZXF1ZW5jZXMpXG4gICAgICByZXR1cm4gbmV3IEFycmF5KHRoaXMuTGVuZ3RoKS5maWxsKGZpbGxlclJlc2lkdWUpLmpvaW4oJycpO1xuXG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9jYWxjdWxhdGUoKSB7XG4gICAgaWYgKCF0aGlzLmNhbnZhcyB8fCAhdGhpcy5ob3N0IHx8ICF0aGlzLnNlcUNvbCB8fCAhdGhpcy5kYXRhRnJhbWUgfHxcbiAgICAgIHRoaXMuc3RhcnRQb3NpdGlvbiA9PT0gLTEgfHwgdGhpcy5lbmRQb3NpdGlvbiA9PT0gLTEpXG4gICAgICByZXR1cm47XG5cbiAgICB0aGlzLmNhbGNTaXplKCk7XG5cbiAgICB0aGlzLnBvc2l0aW9ucyA9IG5ldyBBcnJheSh0aGlzLkxlbmd0aCk7XG4gICAgZm9yIChsZXQgalBvcyA9IDA7IGpQb3MgPCB0aGlzLkxlbmd0aDsgalBvcysrKSB7XG4gICAgICBjb25zdCBwb3NOYW1lOiBzdHJpbmcgPSB0aGlzLnBvc2l0aW9uTmFtZXNbdGhpcy5zdGFydFBvc2l0aW9uICsgalBvc107XG4gICAgICB0aGlzLnBvc2l0aW9uc1tqUG9zXSA9IG5ldyBQb3NpdGlvbkluZm8ocG9zTmFtZSk7XG4gICAgfVxuXG4gICAgLy8gMjAyMi0wNS0wNSBhc2thbGtpbiBpbnN0cnVjdGVkIHRvIHNob3cgV2ViTG9nbyBiYXNlZCBvbiBmaWx0ZXIgKG5vdCBzZWxlY3Rpb24pXG4gICAgY29uc3QgaW5kaWNlcyA9IHRoaXMuZGF0YUZyYW1lLmZpbHRlci5nZXRTZWxlY3RlZEluZGV4ZXMoKTtcbiAgICAvLyBjb25zdCBpbmRpY2VzID0gdGhpcy5kYXRhRnJhbWUuc2VsZWN0aW9uLnRydWVDb3VudCA+IDAgPyB0aGlzLmRhdGFGcmFtZS5zZWxlY3Rpb24uZ2V0U2VsZWN0ZWRJbmRleGVzKCkgOlxuICAgIC8vICAgdGhpcy5kYXRhRnJhbWUuZmlsdGVyLmdldFNlbGVjdGVkSW5kZXhlcygpO1xuXG4gICAgdGhpcy5yb3dzTWFza2VkID0gaW5kaWNlcy5sZW5ndGg7XG4gICAgdGhpcy5yb3dzTnVsbCA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IGkgb2YgaW5kaWNlcykge1xuICAgICAgbGV0IHM6IHN0cmluZyA9IDxzdHJpbmc+KHRoaXMuc2VxQ29sLmdldChpKSk7XG5cbiAgICAgIGlmICghcykge1xuICAgICAgICBzID0gdGhpcy5fbnVsbFNlcXVlbmNlKCk7XG4gICAgICAgICsrdGhpcy5yb3dzTnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VxTTogc3RyaW5nW10gPSBXZWJMb2dvLnNwbGl0U2VxVG9Nb25vbWVycyhzKTtcbiAgICAgIGZvciAobGV0IGpQb3MgPSAwOyBqUG9zIDwgdGhpcy5MZW5ndGg7IGpQb3MrKykge1xuICAgICAgICBjb25zdCBwbUluZm8gPSB0aGlzLnBvc2l0aW9uc1tqUG9zXS5mcmVxO1xuICAgICAgICBjb25zdCBtOiBzdHJpbmcgPSBzZXFNW3RoaXMuc3RhcnRQb3NpdGlvbiArIGpQb3NdIHx8ICctJztcbiAgICAgICAgaWYgKCEobSBpbiBwbUluZm8pKVxuICAgICAgICAgIHBtSW5mb1ttXSA9IG5ldyBQb3NpdGlvbk1vbm9tZXJJbmZvKCk7XG4gICAgICAgIHBtSW5mb1ttXS5jb3VudCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vI3JlZ2lvbiBQb2xpc2ggZnJlcSBjb3VudHNcbiAgICBmb3IgKGxldCBqUG9zID0gMDsgalBvcyA8IHRoaXMuTGVuZ3RoOyBqUG9zKyspIHtcbiAgICAgIC8vIGRlbGV0ZSB0aGlzLnBvc2l0aW9uc1tqUG9zXS5mcmVxWyctJ107XG5cbiAgICAgIHRoaXMucG9zaXRpb25zW2pQb3NdLnJvd0NvdW50ID0gMDtcbiAgICAgIGZvciAoY29uc3QgbSBpbiB0aGlzLnBvc2l0aW9uc1tqUG9zXS5mcmVxKVxuICAgICAgICB0aGlzLnBvc2l0aW9uc1tqUG9zXS5yb3dDb3VudCArPSB0aGlzLnBvc2l0aW9uc1tqUG9zXS5mcmVxW21dLmNvdW50O1xuICAgIH1cbiAgICAvLyNlbmRyZWdpb25cblxuICAgIGNvbnN0IG1heEhlaWdodCA9IHRoaXMuY2FudmFzLmhlaWdodCAtIHRoaXMuYXhpc0hlaWdodDtcbiAgICAvLyBjb25zb2xlLmRlYnVnKGBXZWJMb2dvLl9jYWxjdWxhdGUoKSBtYXhIZWlnaHQ9JHttYXhIZWlnaHR9LmApO1xuXG4gICAgLy8jcmVnaW9uIENhbGN1bGF0ZSBzY3JlZW5cbiAgICBmb3IgKGxldCBqUG9zID0gMDsgalBvcyA8IHRoaXMuTGVuZ3RoOyBqUG9zKyspIHtcbiAgICAgIGNvbnN0IGZyZXE6IHsgW2M6IHN0cmluZ106IFBvc2l0aW9uTW9ub21lckluZm8gfSA9IHRoaXMucG9zaXRpb25zW2pQb3NdLmZyZXE7XG4gICAgICBjb25zdCByb3dDb3VudCA9IHRoaXMucG9zaXRpb25zW2pQb3NdLnJvd0NvdW50O1xuXG4gICAgICBsZXQgeTogbnVtYmVyID0gdGhpcy5heGlzSGVpZ2h0O1xuXG4gICAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoZnJlcSkuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBpZiAoYVswXSAhPT0gJy0nICYmIGJbMF0gIT09ICctJylcbiAgICAgICAgICByZXR1cm4gYlsxXS5jb3VudCAtIGFbMV0uY291bnQ7XG4gICAgICAgIGVsc2UgaWYgKGFbMF0gPT09ICctJyAmJiBiWzBdID09PSAnLScpXG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIGVsc2UgaWYgKGFbMF0gPT09ICctJylcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIGVsc2UgLyogKGJbMF0gPT09ICctJykgKi9cbiAgICAgICAgICByZXR1cm4gKzE7XG4gICAgICB9KTtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBjb25zdCBwbUluZm86IFBvc2l0aW9uTW9ub21lckluZm8gPSBlbnRyeVsxXTtcbiAgICAgICAgLy8gY29uc3QgbTogc3RyaW5nID0gZW50cnlbMF07XG4gICAgICAgIGNvbnN0IGg6IG51bWJlciA9IG1heEhlaWdodCAqIHBtSW5mby5jb3VudCAvIHJvd0NvdW50O1xuXG4gICAgICAgIHBtSW5mby5ib3VuZHMgPSBuZXcgREcuUmVjdChqUG9zICogdGhpcy5fcG9zaXRpb25XaWR0aCwgeSwgdGhpcy5fcG9zaXRpb25XaWR0aCwgaCk7XG4gICAgICAgIHkgKz0gaDtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8jZW5kcmVnaW9uXG4gIH1cblxuICAvLyByZWZsZWN0IGNoYW5nZXMgbWFkZSB0byBmaWx0ZXIvc2VsZWN0aW9uXG4gIHJlbmRlcihyZWNhbGMgPSB0cnVlKSB7XG4gICAgaWYgKHRoaXMubXNnSG9zdCkge1xuICAgICAgaWYgKHRoaXMuc2VxQ29sICYmICF0aGlzLmNwKSB7XG4gICAgICAgIHRoaXMubXNnSG9zdCEuaW5uZXJUZXh0ID0gYFVua25vd24gcGFsZXR0ZSAoY29sdW1uIHNlbVR5cGU6ICcke3RoaXMuc2VxQ29sLnNlbVR5cGV9JykuYDtcbiAgICAgICAgdGhpcy5tc2dIb3N0IS5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1zZ0hvc3QhLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNhbnZhcyB8fCAhdGhpcy5zZXFDb2wgfHwgIXRoaXMuZGF0YUZyYW1lIHx8ICF0aGlzLmNwIHx8XG4gICAgICB0aGlzLnN0YXJ0UG9zaXRpb24gPT09IC0xIHx8IHRoaXMuZW5kUG9zaXRpb24gPT09IC0xKVxuICAgICAgcmV0dXJuO1xuXG4gICAgY29uc3QgZyA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgaWYgKCFnKSByZXR1cm47XG5cbiAgICBpZiAocmVjYWxjKVxuICAgICAgdGhpcy5fY2FsY3VsYXRlKCk7XG5cbiAgICAvLyBsZXQgcm93Q291bnQgPSB0aGlzLnJvd3NNYXNrZWQ7XG4gICAgLy8gaWYgKCF0aGlzLmNvbnNpZGVyTnVsbFNlcXVlbmNlcylcbiAgICAvLyAgIHJvd0NvdW50IC09IHRoaXMucm93c051bGw7XG5cbiAgICBnLnJlc2V0VHJhbnNmb3JtKCk7XG4gICAgZy5maWxsU3R5bGUgPSAnd2hpdGUnO1xuICAgIGcuZmlsbFJlY3QoMCwgMCwgdGhpcy5jYW52YXMud2lkdGgsIHRoaXMuY2FudmFzLmhlaWdodCk7XG4gICAgZy50ZXh0QmFzZWxpbmUgPSB0aGlzLnRleHRCYXNlbGluZTtcblxuICAgIC8vI3JlZ2lvbiBQbG90IHBvc2l0aW9uTmFtZXNcbiAgICBnLnJlc2V0VHJhbnNmb3JtKCk7XG4gICAgZy5maWxsU3R5bGUgPSAnYmxhY2snO1xuICAgIGcudGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgZy5mb250ID0gJzEwcHggUm9ib3RvLCBSb2JvdG8gTG9jYWwsIHNhbnMtc2VyaWYnO1xuICAgIGNvbnN0IHBvc05hbWVNYXhXaWR0aCA9IE1hdGgubWF4KC4uLnRoaXMucG9zaXRpb25zLm1hcCgocG9zKSA9PiBnLm1lYXN1cmVUZXh0KHBvcy5uYW1lKS53aWR0aCkpO1xuICAgIGNvbnN0IGhTY2FsZSA9IHBvc05hbWVNYXhXaWR0aCA8ICh0aGlzLl9wb3NpdGlvbldpZHRoIC0gMikgPyAxIDogKHRoaXMuX3Bvc2l0aW9uV2lkdGggLSAyKSAvIHBvc05hbWVNYXhXaWR0aDtcblxuICAgIGZvciAobGV0IGpQb3MgPSAwOyBqUG9zIDwgdGhpcy5MZW5ndGg7IGpQb3MrKykge1xuICAgICAgY29uc3QgcG9zOiBQb3NpdGlvbkluZm8gPSB0aGlzLnBvc2l0aW9uc1tqUG9zXTtcbiAgICAgIGcucmVzZXRUcmFuc2Zvcm0oKTtcbiAgICAgIGcuc2V0VHJhbnNmb3JtKFxuICAgICAgICBoU2NhbGUsIDAsIDAsIDEsXG4gICAgICAgIGpQb3MgKiB0aGlzLl9wb3NpdGlvbldpZHRoICsgdGhpcy5fcG9zaXRpb25XaWR0aCAvIDIsIDApO1xuICAgICAgZy5maWxsVGV4dChwb3MubmFtZSwgMCwgMCk7XG4gICAgfVxuICAgIC8vI2VuZHJlZ2lvbiBQbG90IHBvc2l0aW9uTmFtZXNcblxuICAgIGZvciAobGV0IGpQb3MgPSAwOyBqUG9zIDwgdGhpcy5MZW5ndGg7IGpQb3MrKykge1xuICAgICAgZm9yIChjb25zdCBbbW9ub21lciwgcG1JbmZvXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnBvc2l0aW9uc1tqUG9zXS5mcmVxKSkge1xuICAgICAgICBpZiAobW9ub21lciAhPT0gJy0nKSB7XG4gICAgICAgICAgY29uc3QgYiA9IHBtSW5mby5ib3VuZHM7XG5cbiAgICAgICAgICBjb25zdCBmb250U3R5bGUgPSAnMTZweCBSb2JvdG8sIFJvYm90byBMb2NhbCwgc2Fucy1zZXJpZic7XG4gICAgICAgICAgLy8gSGFja3MgdG8gc2NhbGUgdXBwZXJjYXNlIGNoYXJhY3RlcnMgdG8gdGFyZ2V0IHJlY3RhbmdsZVxuICAgICAgICAgIGNvbnN0IHVwcGVyY2FzZUxldHRlckFzY2VudCA9IDAuMjU7XG4gICAgICAgICAgY29uc3QgdXBwZXJjYXNlTGV0dGVySGVpZ2h0ID0gMTIuMjtcblxuICAgICAgICAgIGcucmVzZXRUcmFuc2Zvcm0oKTtcbiAgICAgICAgICBnLnN0cm9rZVN0eWxlID0gJ2xpZ2h0Z3JheSc7XG4gICAgICAgICAgZy5saW5lV2lkdGggPSAxO1xuICAgICAgICAgIGcucmVjdChiLmxlZnQsIGIudG9wLCBiLndpZHRoLCBiLmhlaWdodCk7XG4gICAgICAgICAgZy5maWxsU3R5bGUgPSB0aGlzLmNwLmdldChtb25vbWVyKSA/PyB0aGlzLmNwLmdldCgnb3RoZXInKTtcbiAgICAgICAgICBnLnRleHRBbGlnbiA9ICdsZWZ0JztcbiAgICAgICAgICBnLmZvbnQgPSBmb250U3R5bGU7XG4gICAgICAgICAgLy9nLmZpbGxSZWN0KGIubGVmdCwgYi50b3AsIGIud2lkdGgsIGIuaGVpZ2h0KTtcbiAgICAgICAgICBjb25zdCBtVG06IFRleHRNZXRyaWNzID0gZy5tZWFzdXJlVGV4dChtb25vbWVyKTtcblxuICAgICAgICAgIC8vIGlmIChtTS5hY3R1YWxCb3VuZGluZ0JveEFzY2VudCAhPSAwKVxuICAgICAgICAgIC8vICAgY29uc29sZS5kZWJ1ZyhgbTogJHttfSwgbU0uYWN0dWFsQm91bmRpbmdCb3hBc2NlbnQ6ICR7bU0uYWN0dWFsQm91bmRpbmdCb3hBc2NlbnR9YCk7XG5cbiAgICAgICAgICBnLnNldFRyYW5zZm9ybShcbiAgICAgICAgICAgIGIud2lkdGggLyBtVG0ud2lkdGgsIDAsIDAsIGIuaGVpZ2h0IC8gdXBwZXJjYXNlTGV0dGVySGVpZ2h0LFxuICAgICAgICAgICAgYi5sZWZ0LCBiLnRvcCk7XG4gICAgICAgICAgZy5maWxsVGV4dChtb25vbWVyLCAwLCAtdXBwZXJjYXNlTGV0dGVyQXNjZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2FsY1NpemUoKSB7XG4gICAgaWYgKCF0aGlzLmNhbnZhcyB8fCAhdGhpcy5ob3N0KVxuICAgICAgcmV0dXJuO1xuXG4gICAgbGV0IHdpZHRoOiBudW1iZXIgPSB0aGlzLkxlbmd0aCAqIHRoaXMucG9zaXRpb25XaWR0aDtcbiAgICBsZXQgaGVpZ2h0ID0gTWF0aC5taW4odGhpcy5tYXhIZWlnaHQsIE1hdGgubWF4KHRoaXMubWluSGVpZ2h0LCB0aGlzLnJvb3QuY2xpZW50SGVpZ2h0KSk7XG5cbiAgICBpZiAodGhpcy5maXRBcmVhKSB7XG4gICAgICBjb25zdCB4U2NhbGU6IG51bWJlciA9IHRoaXMucm9vdC5jbGllbnRIZWlnaHQgLyBoZWlnaHQ7XG4gICAgICBjb25zdCB5U2NhbGU6IG51bWJlciA9IHRoaXMucm9vdC5jbGllbnRXaWR0aCAvIHdpZHRoO1xuICAgICAgY29uc3Qgc2NhbGUgPSBNYXRoLm1heCgxLCBNYXRoLm1pbih4U2NhbGUsIHlTY2FsZSkpO1xuICAgICAgd2lkdGggPSB3aWR0aCAqIHNjYWxlO1xuICAgICAgaGVpZ2h0ID0gaGVpZ2h0ICogc2NhbGU7XG4gICAgICB0aGlzLl9wb3NpdGlvbldpZHRoID0gdGhpcy5wb3NpdGlvbldpZHRoICogc2NhbGU7XG4gICAgfVxuXG4gICAgdGhpcy5jYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLmNhbnZhcy5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcblxuICAgIC8vIGNvbnN0IGNhbnZhc0hlaWdodDogbnVtYmVyID0gd2lkdGggPiB0aGlzLnJvb3QuY2xpZW50V2lkdGggPyBoZWlnaHQgLSA4IDogaGVpZ2h0O1xuICAgIHRoaXMuaG9zdC5zdHlsZS5zZXRQcm9wZXJ0eSgnaGVpZ2h0JywgYCR7aGVpZ2h0fXB4YCk7XG4gICAgY29uc3QgY2FudmFzSGVpZ2h0OiBudW1iZXIgPSB0aGlzLmhvc3QuY2xpZW50SGVpZ2h0O1xuICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IGNhbnZhc0hlaWdodDtcbiAgICB0aGlzLmNhbnZhcy5zdHlsZS5zZXRQcm9wZXJ0eSgnaGVpZ2h0JywgYCR7Y2FudmFzSGVpZ2h0fXB4YCk7XG5cbiAgICAvLyBBZGp1c3QgaG9zdCBhbmQgcm9vdCB3aWR0aFxuICAgIGlmICh0aGlzLmZpeFdpZHRoKSB7XG4gICAgICAvLyBmdWxsIHdpZHRoIGZvciBjYW52YXMgaG9zdCBhbmQgcm9vdFxuICAgICAgdGhpcy5yb290LnN0eWxlLndpZHRoID0gdGhpcy5ob3N0LnN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgO1xuICAgICAgdGhpcy5yb290LnN0eWxlLmhlaWdodCAvKj0gdGhpcy5ob3N0LnN0eWxlLmhlaWdodCovID0gYCR7aGVpZ2h0fXB4YDtcbiAgICAgIHRoaXMuaG9zdC5zdHlsZS5zZXRQcm9wZXJ0eSgnb3ZlcmZsb3cnLCAnaGlkZGVuJywgJ2ltcG9ydGFudCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhbGxvdyBzY3JvbGwgY2FudmFzIGluIHJvb3RcbiAgICAgIHRoaXMucm9vdC5zdHlsZS53aWR0aCA9IHRoaXMuaG9zdC5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICAgIHRoaXMuaG9zdC5zdHlsZS5vdmVyZmxvd1ggPSAnYXV0byFpbXBvcnRhbnQnO1xuICAgICAgdGhpcy5ob3N0LnN0eWxlLnNldFByb3BlcnR5KCdvdmVyZmxvdycsIG51bGwpO1xuXG4gICAgICB0aGlzLmhvc3Quc3R5bGUuc2V0UHJvcGVydHkoJ3RleHQtYWxpZ24nLCB0aGlzLmhvcml6b250YWxBbGlnbm1lbnQpO1xuXG4gICAgICAvLyB2ZXJ0aWNhbCBhbGlnbm1lbnRcbiAgICAgIGxldCBob3N0VG9wTWFyZ2luID0gMDtcbiAgICAgIHN3aXRjaCAodGhpcy52ZXJ0aWNhbEFsaWdubWVudCkge1xuICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgaG9zdFRvcE1hcmdpbiA9IDA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbWlkZGxlJzpcbiAgICAgICAgaG9zdFRvcE1hcmdpbiA9IE1hdGgubWF4KDAsICh0aGlzLnJvb3QuY2xpZW50SGVpZ2h0IC0gaGVpZ2h0KSAvIDIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgIGhvc3RUb3BNYXJnaW4gPSBNYXRoLm1heCgwLCB0aGlzLnJvb3QuY2xpZW50SGVpZ2h0IC0gaGVpZ2h0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB0aGlzLmhvc3Quc3R5bGUuc2V0UHJvcGVydHkoJ21hcmdpbi10b3AnLCBgJHtob3N0VG9wTWFyZ2lufXB4YCwgJ2ltcG9ydGFudCcpO1xuXG4gICAgICBpZiAodGhpcy5yb290LmNsaWVudEhlaWdodCA8IGhlaWdodCkge1xuICAgICAgICB0aGlzLmhvc3Quc3R5bGUuc2V0UHJvcGVydHkoJ2hlaWdodCcsIGAke3RoaXMucm9vdC5jbGllbnRIZWlnaHR9cHhgKTtcbiAgICAgICAgdGhpcy5ob3N0LnN0eWxlLnNldFByb3BlcnR5KCdvdmVyZmxvdy15JywgbnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmhvc3Quc3R5bGUuc2V0UHJvcGVydHkoJ292ZXJmbG93LXknLCAnaGlkZGVuJywgJ2ltcG9ydGFudCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbnNvbGUuZGVidWcoXG4gICAgLy8gICBgdGhpcy5yb290LnN0eWxlLmhlaWdodCA9ICR7dGhpcy5yb290LnN0eWxlLmhlaWdodH1cXG5gICtcbiAgICAvLyAgIGB0aGlzLnJvb3QuY2xpZW50SGVpZ2h0ID0gJHt0aGlzLnJvb3QuY2xpZW50SGVpZ2h0fVxcbmAgK1xuICAgIC8vICAgYHRoaXMuaG9zdC5zdHlsZS5oZWlnaHQgPSAke3RoaXMuaG9zdC5zdHlsZS5oZWlnaHR9XFxuYCArXG4gICAgLy8gICBgdGhpcy5ob3N0LmNsaWVudEhlaWdodCA9ICR7dGhpcy5ob3N0LmNsaWVudEhlaWdodH1cXG5gICtcbiAgICAvLyAgICdcXG4nICtcbiAgICAvLyAgIGB0aGlzLmNhbnZhcy5oZWlnaHQgICAgICAgPSAke3RoaXMuY2FudmFzLmhlaWdodH1cXG5gICtcbiAgICAvLyAgIGB0aGlzLmNhbnZhcy5zdHlsZS5oZWlnaHQgPSAke3RoaXMuY2FudmFzLnN0eWxlLmhlaWdodH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RHLkNvbHVtbn0gc2VxQ29sIENvbHVtbiB0byBsb29rIGZvciBhIHBhbGV0dGVcbiAgICogQHBhcmFtIHtudW1iZXJ9ICBtaW5MZW5ndGggbWluaW11bSBsZW5ndGggb2Ygc2VxdWVuY2UgdG8gZGV0ZWN0IHBhbGV0dGUgKGVtcHR5IHN0cmluZ3MgYXJlIGFsbG93ZWQpXG4gICAqIEByZXR1cm4ge1NlcVBhbGV0dGV9IFBhbGV0dGUgY29ycmVzcG9uZGluZyB0byB0aGUgYWxwaGFiZXQgb2YgdGhlIHNlcXVlbmNlcyBpbiB0aGUgY29sdW1uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHBpY2tVcFBhbGV0dGUoc2VxQ29sOiBERy5Db2x1bW4sIG1pbkxlbmd0aDogbnVtYmVyID0gNSk6IFNlcVBhbGV0dGUge1xuICAgIGxldCByZXM6IFNlcVBhbGV0dGUgfCBudWxsID0gbnVsbDtcbiAgICBzd2l0Y2ggKHNlcUNvbC5zZW1UeXBlKSB7XG4gICAgY2FzZSBBbWlub2FjaWRzLlNlbVR5cGVNdWx0aXBsZUFsaWdubWVudDpcbiAgICAgIHJlcyA9IEFtaW5vYWNpZHNQYWxldHRlcy5Hcm9rR3JvdXBzO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBOdWNsZW90aWRlcy5TZW1UeXBlTXVsdGlwbGVBbGlnbm1lbnQ6XG4gICAgICByZXMgPSBOdWNsZW90aWRlc1BhbGV0dGVzLkNocm9tYXRvZ3JhbTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjb25zdCBhbHBoYWJldEZyZXFzOiBNb25vbWVyRnJlcXMgPSBXZWJMb2dvLmdldEFscGhhYmV0RnJlcXMoc2VxQ29sKTtcblxuICAgIGNvbnN0IGFscGhhYmV0Q2FuZGlkYXRlczogW1NldDxzdHJpbmc+LCBTZXFQYWxldHRlXVtdID0gW1xuICAgICAgW25ldyBTZXQoT2JqZWN0LmtleXMoTnVjbGVvdGlkZXMuTmFtZXMpKSwgTnVjbGVvdGlkZXNQYWxldHRlcy5DaHJvbWF0b2dyYW1dLFxuICAgICAgW25ldyBTZXQoT2JqZWN0LmtleXMoQW1pbm9hY2lkcy5OYW1lcykpLCBBbWlub2FjaWRzUGFsZXR0ZXMuR3Jva0dyb3Vwc10sXG4gICAgXTtcbiAgICAvLyBDYWxjdWxhdGUgbGlrZWxpaG9vZHMgZm9yIGFscGhhYmV0X2NhbmRpZGF0ZXNcbiAgICBjb25zdCBhbHBoYWJldENhbmRpZGF0ZXNTaW06IG51bWJlcltdID0gYWxwaGFiZXRDYW5kaWRhdGVzLm1hcChcbiAgICAgIChjKSA9PiBXZWJMb2dvLmdldEFscGhhYmV0U2ltaWxhcml0eShhbHBoYWJldEZyZXFzLCBjWzBdKSk7XG4gICAgY29uc3QgbWF4Q29zID0gTWF0aC5tYXgoLi4uYWxwaGFiZXRDYW5kaWRhdGVzU2ltKTtcbiAgICBpZiAobWF4Q29zID4gMC42KVxuICAgICAgcmVzID0gYWxwaGFiZXRDYW5kaWRhdGVzW2FscGhhYmV0Q2FuZGlkYXRlc1NpbS5pbmRleE9mKG1heENvcyldWzFdO1xuICAgIGVsc2VcbiAgICAgIHJlcyA9IFVua25vd25TZXFQYWxldHRlcy5Db2xvcjtcblxuICAgIC8vIGlmIChyZXMgPT09IG51bGwpIHtcbiAgICAvLyAgIC8vIFRoZSBhbHBoYWJldCBvZiBudWNsZW90aWRlcyBpcyBhIHNtYWxsZXIgc2V0LCBzbyB3ZSBjaGVjayBpdCBmaXJzdC5cbiAgICAvLyAgIGNvbnN0IGFscGhhYmV0ID0gey4uLk51Y2xlb3RpZGVzLk5hbWVzLCAuLi57Jy0nOiAnZ2FwJ319O1xuICAgIC8vICAgcmVzID0gREcuRGV0ZWN0b3Iuc2FtcGxlQ2F0ZWdvcmllcyhzZXFDb2wsIChzZXEpID0+IHtcbiAgICAvLyAgICAgcmV0dXJuICFzZXEgfHwgKHNlcS5sZW5ndGggPiBtaW5MZW5ndGggJiYgdGhpcy5zcGxpdFNlcVRvTW9ub21lcnMoc2VxKS5ldmVyeSgobikgPT4gbiBpbiBhbHBoYWJldCkpO1xuICAgIC8vICAgfSwgMSkgPyBOdWNsZW90aWRlc1BhbGV0dGVzLkNocm9tYXRvZ3JhbSA6IG51bGw7XG4gICAgLy8gfVxuICAgIC8vIGlmIChyZXMgPT09IG51bGwpIHtcbiAgICAvLyAgIC8vIEFuZCB0aGVuIGNoZWNrIGZvciBhbWlubyBhY2lkJ3MgYWxwaGFiZXQuXG4gICAgLy8gICBjb25zdCBhbHBoYWJldCA9IHsuLi5BbWlub2FjaWRzLk5hbWVzLCAuLi57Jy0nOiAnZ2FwJ319O1xuICAgIC8vICAgcmVzID0gREcuRGV0ZWN0b3Iuc2FtcGxlQ2F0ZWdvcmllcyhzZXFDb2wsIChzZXEpID0+IHtcbiAgICAvLyAgICAgcmV0dXJuICFzZXEgfHwgKHNlcS5sZW5ndGggPiBtaW5MZW5ndGggJiYgdGhpcy5zcGxpdFNlcVRvTW9ub21lcnMoc2VxKS5ldmVyeSgobikgPT4gbiBpbiBhbHBoYWJldCkpO1xuICAgIC8vICAgfSwgMSkgPyBBbWlub2FjaWRzUGFsZXR0ZXMuR3Jva0dyb3VwcyA6IG51bGw7XG4gICAgLy8gfVxuICAgIC8vIGlmIChyZXMgPT09IG51bGwpIHtcbiAgICAvLyAgIHJlcyA9IFVua25vd25TZXFQYWxldHRlcy5Db2xvcjtcbiAgICAvLyB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0QWxwaGFiZXRGcmVxcyhzZXFDb2w6IERHLkNvbHVtbik6IE1vbm9tZXJGcmVxcyB7XG4gICAgY29uc3QgcmVzOiBNb25vbWVyRnJlcXMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IHNlcSBvZiBzZXFDb2wuY2F0ZWdvcmllcykge1xuICAgICAgZm9yIChjb25zdCBtIG9mIFdlYkxvZ28uc3BsaXRTZXFUb01vbm9tZXJzKHNlcSkpIHtcbiAgICAgICAgaWYgKCEobSBpbiByZXMpKVxuICAgICAgICAgIHJlc1ttXSA9IDA7XG4gICAgICAgIHJlc1ttXSArPSAxO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBnZXRBbHBoYWJldFNpbWlsYXJpdHkoZnJlcTogTW9ub21lckZyZXFzLCBhbHBoYWJldDogU2V0PHN0cmluZz4sIGdhcFN5bWJvbDogc3RyaW5nID0gJy0nKTogbnVtYmVyIHtcbiAgICBjb25zdCBrZXlzID0gbmV3IFNldDxzdHJpbmc+KFsuLi5uZXcgU2V0KE9iamVjdC5rZXlzKGZyZXEpKSwgLi4uYWxwaGFiZXRdKTtcbiAgICBrZXlzLmRlbGV0ZShnYXBTeW1ib2wpO1xuXG4gICAgY29uc3QgZnJlcUE6IG51bWJlcltdID0gW107XG4gICAgY29uc3QgYWxwaGFiZXRBOiBudW1iZXJbXSA9IFtdO1xuICAgIGxldCBsZW46IG51bWJlciA9IDA7XG4gICAgZm9yIChjb25zdCBtIG9mIGtleXMpIHtcbiAgICAgIGZyZXFBLnB1c2gobSBpbiBmcmVxID8gZnJlcVttXSA6IDApO1xuICAgICAgYWxwaGFiZXRBLnB1c2goYWxwaGFiZXQuaGFzKG0pID8gMSA6IDApO1xuICAgICAgbGVuICs9IDE7XG4gICAgfVxuICAgIC8qIFRoZXJlIHdlcmUgYSBmZXcgaWRlYXM6IGNoaS1zcXVhcmVkLCBwZWFyc29uIGNvcnJlbGF0aW9uICh2YXJpYW5jZT8pLCBzY2FsYXIgcHJvZHVjdCAqL1xuICAgIGNvbnN0IGZyZXFWOiBWZWN0b3IgPSBuZXcgVmVjdG9yKGZyZXFBKTtcbiAgICBjb25zdCBhbHBoYWJldFY6IFZlY3RvciA9IG5ldyBWZWN0b3IoYWxwaGFiZXRBKTtcbiAgICBjb25zdCBjb3M6IG51bWJlciA9IHZlY3RvckRvdFByb2R1Y3QoZnJlcVYsIGFscGhhYmV0VikgLyAodmVjdG9yTGVuZ3RoKGZyZXFWKSAqIHZlY3Rvckxlbmd0aChhbHBoYWJldFYpKTtcbiAgICByZXR1cm4gY29zO1xuICB9XG5cbiAgLyoqIEZpcnN0IHRyeSB0byBmaW5kIGNvbHVtbiB3aXRoIHNlbVR5cGUgJ2FsaWduZWRTZXF1ZW5jZScuXG4gICAqIE5leHQgbG9vayBmb3IgY29sdW1uIHdpdGggZGF0YSBhbHBoYWJldCBjb3JyZXNwb25kaW5nIHRvIGFueSBvZiB0aGUga25vd24gcGFsZXR0ZXMuXG4gICAqIEBwYXJhbSB7REcuRGF0YUZyYW1lfSBkYXRhRnJhbWVcbiAgICogQHJldHVybiB7REcuQ29sdW1ufSBUaGUgY29sdW1uIHdlIHdlcmUgbG9va2luZyBmb3Igb3IgbnVsbFxuICAgKi9cbiAgcHJpdmF0ZSBwaWNrVXBTZXFDb2woZGF0YUZyYW1lOiBERy5EYXRhRnJhbWUpOiBERy5Db2x1bW4gfCBudWxsIHtcbiAgICBsZXQgcmVzOiBERy5Db2x1bW4gfCBudWxsID0gZGF0YUZyYW1lLmNvbHVtbnMuYnlTZW1UeXBlKCdhbGlnbmVkU2VxdWVuY2UnKTtcbiAgICBpZiAocmVzID09IG51bGwpIHtcbiAgICAgIGZvciAoY29uc3QgY29sIG9mIGRhdGFGcmFtZS5jb2x1bW5zKSB7XG4gICAgICAgIGNvbnN0IGNwID0gV2ViTG9nby5waWNrVXBQYWxldHRlKGNvbCBhcyBERy5Db2x1bW4sIDUpO1xuICAgICAgICBpZiAoY3AgIT09IG51bGwgJiYgIShjcCBpbnN0YW5jZW9mIFVua25vd25TZXFQYWxldHRlKSkge1xuICAgICAgICAgIHJlcyA9IGNvbDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc3BsaXRSZSA9IC9cXFsoXFx3KylcXF18KFxcdyl8KC0pL2c7XG5cbiAgcHVibGljIHN0YXRpYyBzcGxpdFNlcVRvTW9ub21lcnMoc2VxOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgLy8gVE9ETzogVXNlIHNlcXVlbmNlIHNlcGFyYXRvclxuICAgIGNvbnN0IHJlczogc3RyaW5nW10gPSB3dShzZXEudG9TdHJpbmcoKS5tYXRjaEFsbChXZWJMb2dvLnNwbGl0UmUpKS5tYXAoKG1hKSA9PiB7XG4gICAgICBsZXQgbVJlczogc3RyaW5nO1xuICAgICAgY29uc3QgbSA9IG1hWzBdO1xuICAgICAgaWYgKG0ubGVuZ3RoID4gMSkge1xuICAgICAgICBpZiAobSBpbiBXZWJMb2dvLmFhU3lub255bXMpIHtcbiAgICAgICAgICBtUmVzID0gV2ViTG9nby5hYVN5bm9ueW1zW21dO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1SZXMgPSAnJztcbiAgICAgICAgICBjb25zb2xlLmRlYnVnKGBMb25nIG1vbm9tZXIgJyR7bX0nIGhhcyBub3QgYSBzaG9ydCBzeW5vbnltLmApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtUmVzID0gbTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtUmVzO1xuICAgIH0pLnRvQXJyYXkoKTtcblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKiogT25seSBzb21lIG9mIHRoZSBzeW5vbnltcy4gVGhlc2Ugd2VyZSBvYnRhaW5lZCBmcm9tIHRoZSBjbHVzdGVyZWQgb2xpZ29wZXB0aWRlIGRhdGFzZXQuICovXG4gIHByaXZhdGUgc3RhdGljIGFhU3lub255bXM6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICdbTWVObGVdJzogJ0wnLCAvLyBObGUgLSBub3JsZXVjaW5lXG4gICAgJ1tNZUFdJzogJ0EnLFxuICAgICdbTWVHXSc6ICdHJyxcbiAgICAnW01lRl0nOiAnRicsXG4gIH07XG59XG4iXX0=
|
|
576
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWxvZ28uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3ZWItbG9nby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFDQSxPQUFPLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFdEMsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3BCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxpREFBaUQsQ0FBQztBQUN2RSxPQUFPLEVBQUMsWUFBWSxFQUFFLGdCQUFnQixFQUFDLE1BQU0saURBQWlELENBQUM7QUFDL0YsT0FBTyxFQUFDLFVBQVUsRUFBRSxrQkFBa0IsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUMsV0FBVyxFQUFFLG1CQUFtQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEUsT0FBTyxFQUFDLGlCQUFpQixFQUFFLGtCQUFrQixFQUFDLE1BQU0sWUFBWSxDQUFDO0FBaUJqRSxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLEdBQUcsVUFBUyxLQUFpQjtJQUN4RSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUMxQyxPQUFPLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0UsQ0FBQyxDQUFDO0FBRUYsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLFVBQVMsQ0FBUyxFQUFFLENBQVM7SUFDeEQsT0FBTyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsR0FBRyxJ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R0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUlNLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxHQUFXO1FBQzFDLCtCQUErQjtRQUMvQixNQUFNLEdBQUcsR0FBYSxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUM1RSxJQUFJLElBQVksQ0FBQztZQUNqQixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEIsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDaEIsSUFBSSxDQUFDLElBQUksT0FBTyxDQUFDLFVBQVUsRUFBRTtvQkFDM0IsSUFBSSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzlCO3FCQUFNO29CQUNMLElBQUksR0FBRyxFQUFFLENBQUM7b0JBQ1YsT0FBTyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO2lCQUMvRDthQUNGO2lCQUFNO2dCQUNMLElBQUksR0FBRyxDQUFDLENBQUM7YUFDVjtZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFYixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7O0FBL25CYSxtQkFBVyxHQUFHLGFBQWEsQ0FBQztBQTBtQjNCLGVBQU8sR0FBRyxxQkFBcUIsQ0FBQztBQXVCL0MsOEZBQThGO0FBQy9FLGtCQUFVLEdBQStCO0lBQ3RELFNBQVMsRUFBRSxHQUFHO0lBQ2QsT0FBTyxFQUFFLEdBQUc7SUFDWixPQUFPLEVBQUUsR0FBRztJQUNaLE9BQU8sRUFBRSxHQUFHO0NBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGdyb2sgZnJvbSAnZGF0YWdyb2stYXBpL2dyb2snO1xuaW1wb3J0ICogYXMgdWkgZnJvbSAnZGF0YWdyb2stYXBpL3VpJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5cbmltcG9ydCB3dSBmcm9tICd3dSc7XG5pbXBvcnQgKiBhcyByeGpzIGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge1ZlY3Rvcn0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy91dGlscy9zcmMvdHlwZS1kZWNsYXJhdGlvbnMnO1xuaW1wb3J0IHt2ZWN0b3JMZW5ndGgsIHZlY3RvckRvdFByb2R1Y3R9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvdXRpbHMvc3JjL3ZlY3Rvci1vcGVyYXRpb25zJztcbmltcG9ydCB7QW1pbm9hY2lkcywgQW1pbm9hY2lkc1BhbGV0dGVzfSBmcm9tICcuLi9hbWlub2FjaWRzJztcbmltcG9ydCB7TnVjbGVvdGlkZXMsIE51Y2xlb3RpZGVzUGFsZXR0ZXN9IGZyb20gJy4uL251Y2xlb3RpZGVzJztcbmltcG9ydCB7VW5rbm93blNlcVBhbGV0dGUsIFVua25vd25TZXFQYWxldHRlc30gZnJvbSAnLi4vdW5rbm93bic7XG5pbXBvcnQge1NlcVBhbGV0dGV9IGZyb20gJy4uL3NlcS1wYWxldHRlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICdkYXRhZ3Jvay1hcGkvc3JjL2dyaWQnIHtcbiAgaW50ZXJmYWNlIFJlY3Qge1xuICAgIGNvbnRhaW5zKHg6IG51bWJlciwgeTogbnVtYmVyKTogYm9vbGVhbjtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MQ2FudmFzRWxlbWVudCB7XG4gICAgZ2V0Q3Vyc29yUG9zaXRpb24oZXZlbnQ6IE1vdXNlRXZlbnQpOiBERy5Qb2ludDtcbiAgfVxufVxuXG50eXBlIE1vbm9tZXJGcmVxcyA9IHsgW206IHN0cmluZ106IG51bWJlciB9O1xuXG5IVE1MQ2FudmFzRWxlbWVudC5wcm90b3R5cGUuZ2V0Q3Vyc29yUG9zaXRpb24gPSBmdW5jdGlvbihldmVudDogTW91c2VFdmVudCk6IERHLlBvaW50IHtcbiAgY29uc3QgcmVjdCA9IHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHJldHVybiBuZXcgREcuUG9pbnQoZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCwgZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wKTtcbn07XG5cbkRHLlJlY3QucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24oeDogbnVtYmVyLCB5OiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRoaXMubGVmdCA8PSB4ICYmIHggPD0gdGhpcy5yaWdodCAmJiB0aGlzLnRvcCA8PSB5ICYmIHkgPD0gdGhpcy5ib3R0b207XG59O1xuXG5leHBvcnQgY2xhc3MgUG9zaXRpb25Nb25vbWVySW5mbyB7XG4gIC8qKiBTZXF1ZW5jZXMgY291bnQgd2l0aCBtb25vbWVyIGluIHBvc2l0aW9uXG4gICAqL1xuICBjb3VudDogbnVtYmVyO1xuXG4gIC8qKiBSZW1lbWJlciBzY3JlZW4gY29vcmRzIHJlY3RcbiAgICovXG4gIGJvdW5kczogREcuUmVjdDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNvdW50ID0gMDtcbiAgICB0aGlzLmJvdW5kcyA9IG5ldyBERy5SZWN0KDAsIDAsIDAsIDApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQb3NpdGlvbkluZm8ge1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICBmcmVxOiB7IFttOiBzdHJpbmddOiBQb3NpdGlvbk1vbm9tZXJJbmZvIH07XG4gIHJvd0NvdW50OiBudW1iZXI7XG5cbiAgLyoqIGZyZXEgPSB7fSwgcm93Q291bnQgPSAwXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgcG9zaXRpb24gKCcxMTFBJywgJzExMS4xJywgZXRjKVxuICAgKi9cbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmZyZXEgPSB7fTtcbiAgICB0aGlzLnJvd0NvdW50ID0gMDtcbiAgfVxufVxuXG5cbmV4cG9ydCBjbGFzcyBXZWJMb2dvIGV4dGVuZHMgREcuSnNWaWV3ZXIge1xuICBwdWJsaWMgc3RhdGljIHJlc2lkdWVzU2V0ID0gJ251Y2xlb3RpZGVzJztcblxuICBwcml2YXRlIGluaXRpYWxpemVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gcHJpdmF0ZSByZWFkb25seSBjb2xvclNjaGVtZTogQ29sb3JTY2hlbWUgPSBDb2xvclNjaGVtZXNbTnVjbGVvdGlkZXNXZWJMb2dvLnJlc2lkdWVzU2V0XTtcbiAgcHJvdGVjdGVkIGNwOiBTZXFQYWxldHRlIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBob3N0PzogSFRNTERpdkVsZW1lbnQ7XG4gIHByaXZhdGUgbXNnSG9zdD86IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIGNhbnZhcz86IEhUTUxDYW52YXNFbGVtZW50O1xuICBwcml2YXRlIHNsaWRlcj86IERHLlJhbmdlU2xpZGVyO1xuICBwcml2YXRlIHRleHRCYXNlbGluZTogQ2FudmFzVGV4dEJhc2VsaW5lO1xuXG4gIHByaXZhdGUgYXhpc0hlaWdodDogbnVtYmVyID0gMTI7XG5cbiAgcHJpdmF0ZSBzZXFDb2w6IERHLkNvbHVtbjxzdHJpbmc+IHwgbnVsbCA9IG51bGw7XG4gIC8vIHByaXZhdGUgbWF4TGVuZ3RoOiBudW1iZXIgPSAxMDA7XG4gIHByaXZhdGUgcG9zaXRpb25zOiBQb3NpdGlvbkluZm9bXSA9IFtdO1xuXG4gIHByaXZhdGUgcm93c01hc2tlZDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSByb3dzTnVsbDogbnVtYmVyID0gMDtcblxuICAvLyBWaWV3ZXIncyBwcm9wZXJ0aWVzIChsaWtlbHkgdGhleSBzaG91bGQgYmUgcHVibGljIHNvIHRoYXQgdGhleSBjYW4gYmUgc2V0IG91dHNpZGUpXG4gIHByaXZhdGUgX3Bvc2l0aW9uV2lkdGg6IG51bWJlcjtcbiAgcHVibGljIHBvc2l0aW9uV2lkdGg6IG51bWJlcjtcbiAgcHVibGljIG1pbkhlaWdodDogbnVtYmVyO1xuICBwdWJsaWMgbWF4SGVpZ2h0OiBudW1iZXI7XG4gIHB1YmxpYyBjb25zaWRlck51bGxTZXF1ZW5jZXM6IGJvb2xlYW47XG4gIHB1YmxpYyBzZXF1ZW5jZUNvbHVtbk5hbWU6IHN0cmluZyB8IG51bGw7XG4gIHB1YmxpYyBzdGFydFBvc2l0aW9uTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgcHVibGljIGVuZFBvc2l0aW9uTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgcHVibGljIGZpeFdpZHRoOiBib29sZWFuO1xuICBwdWJsaWMgdmVydGljYWxBbGlnbm1lbnQ6IHN0cmluZyB8IG51bGw7XG4gIHB1YmxpYyBob3Jpem9udGFsQWxpZ25tZW50OiBzdHJpbmcgfCBudWxsO1xuICBwdWJsaWMgZml0QXJlYTogYm9vbGVhbjtcbiAgcHVibGljIHNocmlua0VtcHR5VGFpbDogYm9vbGVhbjtcblxuICBwcml2YXRlIHBvc2l0aW9uTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgcHJpdmF0ZSBzdGFydFBvc2l0aW9uOiBudW1iZXIgPSAtMTtcblxuICBwcml2YXRlIGVuZFBvc2l0aW9uOiBudW1iZXIgPSAtMTtcblxuICAvKiogRm9yIHN0YXJ0UG9zaXRpb24gZXF1YWxzIHRvIGVuZFBvc2l0aW9uIExlbmd0aCBpcyAxICovXG4gIHByaXZhdGUgZ2V0IExlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnN0YXJ0UG9zaXRpb24gPD0gdGhpcy5lbmRQb3NpdGlvbiA/IHRoaXMuZW5kUG9zaXRpb24gLSB0aGlzLnN0YXJ0UG9zaXRpb24gKyAxIDogMDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLnRleHRCYXNlbGluZSA9ICd0b3AnO1xuXG4gICAgdGhpcy5fcG9zaXRpb25XaWR0aCA9IHRoaXMucG9zaXRpb25XaWR0aCA9IHRoaXMuZmxvYXQoJ3Bvc2l0aW9uV2lkdGgnLCAxNi8qLFxuICAgICAge2VkaXRvcjogJ3NsaWRlcicsIG1pbjogNCwgbWF4OiA2NCwgcG9zdGZpeDogJ3B4J30qLyk7XG4gICAgdGhpcy5taW5IZWlnaHQgPSB0aGlzLmZsb2F0KCdtaW5IZWlnaHQnLCA1MC8qLFxuICAgICAge2VkaXRvcjogJ3NsaWRlcicsIG1pbjogMjUsIG1heDogMjUwLCBwb3N0Zml4OiAncHgnfSovKTtcbiAgICB0aGlzLm1heEhlaWdodCA9IHRoaXMuZmxvYXQoJ21heEhlaWdodCcsIDEwMC8qLFxuICAgICAge2VkaXRvcjogJ3NsaWRlcicsIG1pbjogMjUsIG1heDogNTAwLCBwb3N0Zml4OiAncHgnfSovKTtcblxuICAgIHRoaXMuY29uc2lkZXJOdWxsU2VxdWVuY2VzID0gdGhpcy5ib29sKCdjb25zaWRlck51bGxTZXF1ZW5jZXMnLCBmYWxzZSk7XG4gICAgdGhpcy5zZXF1ZW5jZUNvbHVtbk5hbWUgPSB0aGlzLnN0cmluZygnc2VxdWVuY2VDb2x1bW5OYW1lJywgbnVsbCk7XG5cbiAgICB0aGlzLnN0YXJ0UG9zaXRpb25OYW1lID0gdGhpcy5zdHJpbmcoJ3N0YXJ0UG9zaXRpb25OYW1lJywgbnVsbCk7XG4gICAgdGhpcy5lbmRQb3NpdGlvbk5hbWUgPSB0aGlzLnN0cmluZygnZW5kUG9zaXRpb25OYW1lJywgbnVsbCk7XG5cbiAgICB0aGlzLmZpeFdpZHRoID0gdGhpcy5ib29sKCdmaXhXaWR0aCcsIGZhbHNlKTtcblxuICAgIHRoaXMudmVydGljYWxBbGlnbm1lbnQgPSB0aGlzLnN0cmluZygndmVydGljYWxBbGlnbm1lbnQnLCAnbWlkZGxlJyxcbiAgICAgIHtjaG9pY2VzOiBbJ3RvcCcsICdtaWRkbGUnLCAnYm90dG9tJ119KTtcbiAgICB0aGlzLmhvcml6b250YWxBbGlnbm1lbnQgPSB0aGlzLnN0cmluZygnaG9yaXpvbnRhbEFsaWdubWVudCcsICdjZW50ZXInLFxuICAgICAge2Nob2ljZXM6IFsnbGVmdCcsICdjZW50ZXInLCAncmlnaHQnXX0pO1xuICAgIHRoaXMuZml0QXJlYSA9IHRoaXMuYm9vbCgnZml0QXJlYScsIHRydWUpO1xuICAgIHRoaXMuc2hyaW5rRW1wdHlUYWlsID0gdGhpcy5ib29sKCdzaHJpbmtFbXB0eVRhaWwnLCB0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgY29uc29sZS5lcnJvcignV2ViTG9nbyBzZWNvbmQgaW5pdGlhbGl6YXRpb24hJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgdGhpcy5oZWxwVXJsID0gJy9oZWxwL3Zpc3VhbGl6ZS92aWV3ZXJzL3dlYi1sb2dvLm1kJztcblxuICAgIHRoaXMubXNnSG9zdCA9IHVpLmRpdignTm8gbWVzc2FnZScpO1xuICAgIHRoaXMubXNnSG9zdC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgdGhpcy5jYW52YXMgPSB1aS5jYW52YXMoKTtcbiAgICB0aGlzLmNhbnZhcy5zdHlsZS53aWR0aCA9ICcxMDAlJztcblxuICAgIHRoaXMuaG9zdCA9IHVpLmRpdihbdGhpcy5tc2dIb3N0LCB0aGlzLmNhbnZhc10pO1xuXG4gICAgLy8gdGhpcy5zbGlkZXIgPSB1aS5yYW5nZVNsaWRlcigwLCAyMCwgMiwgNSk7XG4gICAgLy8gdGhpcy5zbGlkZXIucm9vdC5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICAvLyB0aGlzLnNsaWRlci5yb290LnN0eWxlLmhlaWdodCA9ICcxMnB4JztcblxuICAgIGNvbnN0IGdldE1vbm9tZXIgPSAocDogREcuUG9pbnQpOiBbbnVtYmVyLCBzdHJpbmcgfCBudWxsLCBQb3NpdGlvbk1vbm9tZXJJbmZvIHwgbnVsbF0gPT4ge1xuICAgICAgY29uc3QgalBvcyA9IE1hdGguZmxvb3IocC54IC8gdGhpcy5fcG9zaXRpb25XaWR0aCk7XG4gICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMucG9zaXRpb25zW2pQb3NdO1xuXG4gICAgICBpZiAocG9zaXRpb24gPT09IHZvaWQgMClcbiAgICAgICAgcmV0dXJuIFtqUG9zLCBudWxsLCBudWxsXTtcblxuICAgICAgY29uc3QgbW9ub21lcjogc3RyaW5nIHwgdW5kZWZpbmVkID0gT2JqZWN0LmtleXMocG9zaXRpb24uZnJlcSlcbiAgICAgICAgLmZpbmQoKG0pID0+IHBvc2l0aW9uLmZyZXFbbV0uYm91bmRzLmNvbnRhaW5zKHAueCwgcC55KSk7XG4gICAgICBpZiAobW9ub21lciA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gW2pQb3MsIG51bGwsIG51bGxdO1xuXG4gICAgICByZXR1cm4gW2pQb3MsIG1vbm9tZXIsIHBvc2l0aW9uLmZyZXFbbW9ub21lcl1dO1xuICAgIH07XG5cbiAgICB0aGlzLmNhbnZhcy5vbm1vdXNlb3ZlciA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG5cbiAgICB9O1xuXG4gICAgdGhpcy5zdWJzLnB1c2gocnhqcy5mcm9tRXZlbnQ8TW91c2VFdmVudD4odGhpcy5jYW52YXMsICdtb3VzZW1vdmUnKS5zdWJzY3JpYmUoKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlmICghdGhpcy5jYW52YXMpXG4gICAgICAgIHJldHVybjtcblxuICAgICAgY29uc3QgYXJncyA9IGUgYXMgTW91c2VFdmVudDtcbiAgICAgIGNvbnN0IFtqUG9zLCBtb25vbWVyXSA9IGdldE1vbm9tZXIodGhpcy5jYW52YXMuZ2V0Q3Vyc29yUG9zaXRpb24oYXJncykpO1xuXG4gICAgICBpZiAodGhpcy5kYXRhRnJhbWUgJiYgdGhpcy5zZXFDb2wgJiYgbW9ub21lcikge1xuICAgICAgICB1aS50b29sdGlwLnNob3dSb3dHcm91cCh0aGlzLmRhdGFGcmFtZSwgKGlSb3cpID0+IHtcbiAgICAgICAgICBjb25zdCBzZXEgPSB0aGlzLnNlcUNvbCEuZ2V0KGlSb3cpO1xuICAgICAgICAgIGNvbnN0IHNlcU0gPSBzZXEgPyBXZWJMb2dvLnNwbGl0U2VxVG9Nb25vbWVycyhzZXEpW3RoaXMuc3RhcnRQb3NpdGlvbiArIGpQb3NdIDogbnVsbDtcbiAgICAgICAgICByZXR1cm4gc2VxTSA9PT0gbW9ub21lciAmJiB0aGlzLmRhdGFGcmFtZS5maWx0ZXIuZ2V0KGlSb3cpO1xuICAgICAgICB9LCBhcmdzLnggKyAxNiwgYXJncy55ICsgMTYpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdWkudG9vbHRpcC5oaWRlKCk7XG4gICAgICB9XG4gICAgfSkpO1xuXG4gICAgdGhpcy5zdWJzLnB1c2gocnhqcy5mcm9tRXZlbnQ8TW91c2VFdmVudD4odGhpcy5jYW52YXMsICdtb3VzZWRvd24nKS5zdWJzY3JpYmUoKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlmICghdGhpcy5jYW52YXMgfHwgZS5idXR0b24gIT0gMClcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjb25zdCBhcmdzID0gZSBhcyBNb3VzZUV2ZW50O1xuICAgICAgY29uc3QgW2pQb3MsIG1vbm9tZXJdID0gZ2V0TW9ub21lcih0aGlzLmNhbnZhcy5nZXRDdXJzb3JQb3NpdGlvbihhcmdzKSk7XG5cbiAgICAgIC8vIHByZXZlbnRzIGRlc2VsZWN0IGFsbCByb3dzIGlmIHdlIG1pc3MgbW9ub21lciBib3VuZHNcbiAgICAgIGlmICh0aGlzLmRhdGFGcmFtZSAmJiB0aGlzLnNlcUNvbCAmJiBtb25vbWVyKSB7XG4gICAgICAgIHRoaXMuZGF0YUZyYW1lLnNlbGVjdGlvbi5pbml0KChpUm93KSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2VxID0gdGhpcy5zZXFDb2whLmdldChpUm93KTtcbiAgICAgICAgICBjb25zdCBzZXFNID0gc2VxID8gV2ViTG9nby5zcGxpdFNlcVRvTW9ub21lcnMoc2VxKVt0aGlzLnN0YXJ0UG9zaXRpb24gKyBqUG9zXSA6IG51bGw7XG4gICAgICAgICAgcmV0dXJuIHNlcU0gPT09IG1vbm9tZXIgJiYgdGhpcy5kYXRhRnJhbWUuZmlsdGVyLmdldChpUm93KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSkpO1xuXG4gICAgdGhpcy5zdWJzLnB1c2godWkub25TaXplQ2hhbmdlZCh0aGlzLnJvb3QpLnN1YnNjcmliZSh0aGlzLnJvb3RPblNpemVDaGFuZ2VkLmJpbmQodGhpcykpKTtcblxuICAgIHRoaXMucm9vdC5hcHBlbmQodGhpcy5ob3N0KTtcbiAgICAvLyB0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5zbGlkZXIucm9vdCk7XG5cbiAgICB0aGlzLnJlbmRlcih0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgcm9vdE9uU2l6ZUNoYW5nZWQoYXJnczogYW55KSB7XG4gICAgdGhpcy5yZW5kZXIodHJ1ZSk7XG5cbiAgICAvLyBjb25zb2xlLmRlYnVnKGBXZWJMb2dvLm9uUm9vdFNpemVDaGFuZ2VkKCkgYCArXG4gICAgLy8gICBgcm9vdC53aWR0aD0ke3RoaXMucm9vdC5jbGllbnRXaWR0aH0sIHJvb3QuaGVpZ2h0PSR7dGhpcy5yb290LmNsaWVudEhlaWdodH0sIGAgK1xuICAgIC8vICAgYGNhbnZhcy53aWR0aD0ke3RoaXMuY2FudmFzLndpZHRofSwgY2FudmFzLmhlaWdodD0ke3RoaXMuY2FudmFzLmhlaWdodH0gLmApO1xuICB9XG5cbiAgLyoqIEFzc2lnbnMge0BsaW5rIHNlcUNvbH0gYW5kIHtAbGluayBjcH0gYmFzZWQgb24ge0BsaW5rIHNlcXVlbmNlQ29sdW1uTmFtZX0gYW5kIGNhbGxzIHtAbGluayByZW5kZXJ9KCkuXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVNlcUNvbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRhRnJhbWUpIHtcbiAgICAgIHRoaXMuc2VxQ29sID0gdGhpcy5zZXF1ZW5jZUNvbHVtbk5hbWUgPyB0aGlzLmRhdGFGcmFtZS5jb2wodGhpcy5zZXF1ZW5jZUNvbHVtbk5hbWUpIDogbnVsbDtcbiAgICAgIGlmICh0aGlzLnNlcUNvbCA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuc2VxQ29sID0gdGhpcy5waWNrVXBTZXFDb2wodGhpcy5kYXRhRnJhbWUpO1xuICAgICAgICB0aGlzLnNlcXVlbmNlQ29sdW1uTmFtZSA9IHRoaXMuc2VxQ29sID8gdGhpcy5zZXFDb2wubmFtZSA6IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zZXFDb2wpIHtcbiAgICAgICAgdGhpcy51cGRhdGVQb3NpdGlvbnMoKTtcbiAgICAgICAgdGhpcy5jcCA9IFdlYkxvZ28ucGlja1VwUGFsZXR0ZSh0aGlzLnNlcUNvbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBvc2l0aW9uTmFtZXMgPSBbXTtcbiAgICAgICAgdGhpcy5zdGFydFBvc2l0aW9uID0gLTE7XG4gICAgICAgIHRoaXMuZW5kUG9zaXRpb24gPSAtMTtcbiAgICAgICAgdGhpcy5jcCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVBvc2l0aW9ucygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VxQ29sKVxuICAgICAgcmV0dXJuO1xuXG4gICAgbGV0IGNhdGVnb3JpZXM6IChzdHJpbmcgfCBudWxsKSBbXTtcbiAgICBpZiAodGhpcy5zaHJpbmtFbXB0eVRhaWwpIHtcbiAgICAgIGNvbnN0IGluZGljZXM6IEludDMyQXJyYXkgPSB0aGlzLmRhdGFGcmFtZS5maWx0ZXIuZ2V0U2VsZWN0ZWRJbmRleGVzKCk7XG4gICAgICBjYXRlZ29yaWVzID0gQXJyYXkuZnJvbShuZXcgU2V0KFxuICAgICAgICBBcnJheS5mcm9tKEFycmF5KGluZGljZXMubGVuZ3RoKS5rZXlzKCkpLm1hcCgoaTogbnVtYmVyKSA9PiB0aGlzLnNlcUNvbCEuZ2V0KGluZGljZXNbaV0pKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYXRlZ29yaWVzID0gdGhpcy5zZXFDb2wuY2F0ZWdvcmllcztcbiAgICB9XG4gICAgY29uc3QgbWF4TGVuZ3RoID0gY2F0ZWdvcmllcy5sZW5ndGggPiAwID8gTWF0aC5tYXgoLi4uY2F0ZWdvcmllcy5tYXAoXG4gICAgICAocykgPT4gcyAhPT0gbnVsbCA/IFdlYkxvZ28uc3BsaXRTZXFUb01vbm9tZXJzKHMpLmxlbmd0aCA6IDApKSA6IDA7XG5cbiAgICAvLyBHZXQgcG9zaXRpb24gbmFtZXMgZnJvbSBkYXRhIGNvbHVtbiB0YWcgJ3Bvc2l0aW9uTmFtZXMnXG4gICAgY29uc3QgcG9zaXRpb25OYW1lc1R4dCA9IHRoaXMuc2VxQ29sLmdldFRhZygncG9zaXRpb25OYW1lcycpO1xuICAgIC8vIEZhbGxiYWNrIGlmICdwb3NpdGlvbk5hbWVzJyB0YWcgaXMgbm90IHByb3ZpZGVkXG4gICAgdGhpcy5wb3NpdGlvbk5hbWVzID0gcG9zaXRpb25OYW1lc1R4dCA/IHBvc2l0aW9uTmFtZXNUeHQuc3BsaXQoJywgJykubWFwKChuKSA9PiBuLnRyaW0oKSkgOlxuICAgICAgWy4uLkFycmF5KG1heExlbmd0aCkua2V5cygpXS5tYXAoKGpQb3MpID0+IGAke2pQb3MgKyAxfWApO1xuXG4gICAgdGhpcy5zdGFydFBvc2l0aW9uID0gKHRoaXMuc3RhcnRQb3NpdGlvbk5hbWUgJiYgdGhpcy5wb3NpdGlvbk5hbWVzICYmXG4gICAgICB0aGlzLnBvc2l0aW9uTmFtZXMuaW5jbHVkZXModGhpcy5zdGFydFBvc2l0aW9uTmFtZSkpID9cbiAgICAgIHRoaXMucG9zaXRpb25OYW1lcy5pbmRleE9mKHRoaXMuc3RhcnRQb3NpdGlvbk5hbWUpIDogMDtcbiAgICB0aGlzLmVuZFBvc2l0aW9uID0gKHRoaXMuZW5kUG9zaXRpb25OYW1lICYmIHRoaXMucG9zaXRpb25OYW1lcyAmJlxuICAgICAgdGhpcy5wb3NpdGlvbk5hbWVzLmluY2x1ZGVzKHRoaXMuZW5kUG9zaXRpb25OYW1lKSkgP1xuICAgICAgdGhpcy5wb3NpdGlvbk5hbWVzLmluZGV4T2YodGhpcy5lbmRQb3NpdGlvbk5hbWUpIDogKG1heExlbmd0aCAtIDEpO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9uUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5OiBERy5Qcm9wZXJ0eSk6IHZvaWQge1xuICAgIC8vIGNvbnNvbGUuZGVidWcoYFdlYkxvZ28ub25Qcm9wZXJ0eUNoYW5nZWQoICR7cHJvcGVydHkubmFtZX0gPSAnJyB9KWApO1xuICAgIHN1cGVyLm9uUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5KTtcblxuICAgIHN3aXRjaCAocHJvcGVydHkubmFtZSkge1xuICAgIGNhc2UgJ2NvbnNpZGVyTnVsbFNlcXVlbmNlcyc6XG4gICAgICB0aGlzLnJlbmRlcih0cnVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NlcXVlbmNlQ29sdW1uTmFtZSc6XG4gICAgICB0aGlzLnVwZGF0ZVNlcUNvbCgpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc3RhcnRQb3NpdGlvbk5hbWUnOlxuICAgICAgdGhpcy51cGRhdGVTZXFDb2woKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2VuZFBvc2l0aW9uTmFtZSc6XG4gICAgICB0aGlzLnVwZGF0ZVNlcUNvbCgpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncG9zaXRpb25XaWR0aCc6XG4gICAgICB0aGlzLl9wb3NpdGlvbldpZHRoID0gdGhpcy5wb3NpdGlvbldpZHRoO1xuICAgICAgdGhpcy5yZW5kZXIodHJ1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdtaW5IZWlnaHQnOlxuICAgICAgdGhpcy5yZW5kZXIodHJ1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdtYXhIZWlnaHQnOlxuICAgICAgdGhpcy5yZW5kZXIodHJ1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdmaXhXaWR0aCc6XG4gICAgICB0aGlzLnJlbmRlcih0cnVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3ZlcnRpY2FsQWxpZ25tZW50JzpcbiAgICAgIHRoaXMucmVuZGVyKHRydWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnaG9yaXpvbnRhbEFsaWdubWVudCc6XG4gICAgICB0aGlzLnJlbmRlcih0cnVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2ZpdEFyZWEnOlxuICAgICAgdGhpcy5yZW5kZXIodHJ1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzaHJpbmtFbXB0eVRhaWwnOlxuICAgICAgdGhpcy51cGRhdGVQb3NpdGlvbnMoKTtcbiAgICAgIHRoaXMucmVuZGVyKHRydWUpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGFzeW5jIG9uVGFibGVBdHRhY2hlZCgpIHtcbiAgICAvLyBjb25zb2xlLmRlYnVnKGBXZWJMb2dvLm9uVGFibGVBdHRhY2hlZCggZGF0YUZyYW1lID0gJHt0aGlzLmRhdGFGcmFtZSA/ICdkYXRhJyA6ICdudWxsJ30gKWApO1xuICAgIHRoaXMudXBkYXRlU2VxQ29sKCk7XG5cbiAgICBpZiAodGhpcy5kYXRhRnJhbWUgIT09IHZvaWQgMCkge1xuICAgICAgdGhpcy5zdWJzLnB1c2godGhpcy5kYXRhRnJhbWUuc2VsZWN0aW9uLm9uQ2hhbmdlZC5zdWJzY3JpYmUoKF8pID0+IHRoaXMucmVuZGVyKCkpKTtcbiAgICAgIHRoaXMuc3Vicy5wdXNoKHRoaXMuZGF0YUZyYW1lLmZpbHRlci5vbkNoYW5nZWQuc3Vic2NyaWJlKChfKSA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlUG9zaXRpb25zKCk7XG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX251bGxTZXF1ZW5jZShmaWxsZXJSZXNpZHVlID0gJ1gnKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5jb25zaWRlck51bGxTZXF1ZW5jZXMpXG4gICAgICByZXR1cm4gbmV3IEFycmF5KHRoaXMuTGVuZ3RoKS5maWxsKGZpbGxlclJlc2lkdWUpLmpvaW4oJycpO1xuXG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9jYWxjdWxhdGUoKSB7XG4gICAgaWYgKCF0aGlzLmNhbnZhcyB8fCAhdGhpcy5ob3N0IHx8ICF0aGlzLnNlcUNvbCB8fCAhdGhpcy5kYXRhRnJhbWUpXG4gICAgICByZXR1cm47XG5cbiAgICB0aGlzLmNhbGNTaXplKCk7XG5cbiAgICB0aGlzLnBvc2l0aW9ucyA9IG5ldyBBcnJheSh0aGlzLkxlbmd0aCk7XG4gICAgZm9yIChsZXQgalBvcyA9IDA7IGpQb3MgPCB0aGlzLkxlbmd0aDsgalBvcysrKSB7XG4gICAgICBjb25zdCBwb3NOYW1lOiBzdHJpbmcgPSB0aGlzLnBvc2l0aW9uTmFtZXNbdGhpcy5zdGFydFBvc2l0aW9uICsgalBvc107XG4gICAgICB0aGlzLnBvc2l0aW9uc1tqUG9zXSA9IG5ldyBQb3NpdGlvbkluZm8ocG9zTmFtZSk7XG4gICAgfVxuXG4gICAgLy8gMjAyMi0wNS0wNSBhc2thbGtpbiBpbnN0cnVjdGVkIHRvIHNob3cgV2ViTG9nbyBiYXNlZCBvbiBmaWx0ZXIgKG5vdCBzZWxlY3Rpb24pXG4gICAgY29uc3QgaW5kaWNlcyA9IHRoaXMuZGF0YUZyYW1lLmZpbHRlci5nZXRTZWxlY3RlZEluZGV4ZXMoKTtcbiAgICAvLyBjb25zdCBpbmRpY2VzID0gdGhpcy5kYXRhRnJhbWUuc2VsZWN0aW9uLnRydWVDb3VudCA+IDAgPyB0aGlzLmRhdGFGcmFtZS5zZWxlY3Rpb24uZ2V0U2VsZWN0ZWRJbmRleGVzKCkgOlxuICAgIC8vICAgdGhpcy5kYXRhRnJhbWUuZmlsdGVyLmdldFNlbGVjdGVkSW5kZXhlcygpO1xuXG4gICAgdGhpcy5yb3dzTWFza2VkID0gaW5kaWNlcy5sZW5ndGg7XG4gICAgdGhpcy5yb3dzTnVsbCA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IGkgb2YgaW5kaWNlcykge1xuICAgICAgbGV0IHM6IHN0cmluZyA9IDxzdHJpbmc+KHRoaXMuc2VxQ29sLmdldChpKSk7XG5cbiAgICAgIGlmICghcykge1xuICAgICAgICBzID0gdGhpcy5fbnVsbFNlcXVlbmNlKCk7XG4gICAgICAgICsrdGhpcy5yb3dzTnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VxTTogc3RyaW5nW10gPSBXZWJMb2dvLnNwbGl0U2VxVG9Nb25vbWVycyhzKTtcbiAgICAgIGZvciAobGV0IGpQb3MgPSAwOyBqUG9zIDwgdGhpcy5MZW5ndGg7IGpQb3MrKykge1xuICAgICAgICBjb25zdCBwbUluZm8gPSB0aGlzLnBvc2l0aW9uc1tqUG9zXS5mcmVxO1xuICAgICAgICBjb25zdCBtOiBzdHJpbmcgPSBzZXFNW3RoaXMuc3RhcnRQb3NpdGlvbiArIGpQb3NdIHx8ICctJztcbiAgICAgICAgaWYgKCEobSBpbiBwbUluZm8pKVxuICAgICAgICAgIHBtSW5mb1ttXSA9IG5ldyBQb3NpdGlvbk1vbm9tZXJJbmZvKCk7XG4gICAgICAgIHBtSW5mb1ttXS5jb3VudCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vI3JlZ2lvbiBQb2xpc2ggZnJlcSBjb3VudHNcbiAgICBmb3IgKGxldCBqUG9zID0gMDsgalBvcyA8IHRoaXMuTGVuZ3RoOyBqUG9zKyspIHtcbiAgICAgIC8vIGRlbGV0ZSB0aGlzLnBvc2l0aW9uc1tqUG9zXS5mcmVxWyctJ107XG5cbiAgICAgIHRoaXMucG9zaXRpb25zW2pQb3NdLnJvd0NvdW50ID0gMDtcbiAgICAgIGZvciAoY29uc3QgbSBpbiB0aGlzLnBvc2l0aW9uc1tqUG9zXS5mcmVxKVxuICAgICAgICB0aGlzLnBvc2l0aW9uc1tqUG9zXS5yb3dDb3VudCArPSB0aGlzLnBvc2l0aW9uc1tqUG9zXS5mcmVxW21dLmNvdW50O1xuICAgIH1cbiAgICAvLyNlbmRyZWdpb25cblxuICAgIGNvbnN0IG1heEhlaWdodCA9IHRoaXMuY2FudmFzLmhlaWdodCAtIHRoaXMuYXhpc0hlaWdodDtcbiAgICAvLyBjb25zb2xlLmRlYnVnKGBXZWJMb2dvLl9jYWxjdWxhdGUoKSBtYXhIZWlnaHQ9JHttYXhIZWlnaHR9LmApO1xuXG4gICAgLy8jcmVnaW9uIENhbGN1bGF0ZSBzY3JlZW5cbiAgICBmb3IgKGxldCBqUG9zID0gMDsgalBvcyA8IHRoaXMuTGVuZ3RoOyBqUG9zKyspIHtcbiAgICAgIGNvbnN0IGZyZXE6IHsgW2M6IHN0cmluZ106IFBvc2l0aW9uTW9ub21lckluZm8gfSA9IHRoaXMucG9zaXRpb25zW2pQb3NdLmZyZXE7XG4gICAgICBjb25zdCByb3dDb3VudCA9IHRoaXMucG9zaXRpb25zW2pQb3NdLnJvd0NvdW50O1xuXG4gICAgICBsZXQgeTogbnVtYmVyID0gdGhpcy5heGlzSGVpZ2h0O1xuXG4gICAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoZnJlcSkuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBpZiAoYVswXSAhPT0gJy0nICYmIGJbMF0gIT09ICctJylcbiAgICAgICAgICByZXR1cm4gYlsxXS5jb3VudCAtIGFbMV0uY291bnQ7XG4gICAgICAgIGVsc2UgaWYgKGFbMF0gPT09ICctJyAmJiBiWzBdID09PSAnLScpXG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIGVsc2UgaWYgKGFbMF0gPT09ICctJylcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIGVsc2UgLyogKGJbMF0gPT09ICctJykgKi9cbiAgICAgICAgICByZXR1cm4gKzE7XG4gICAgICB9KTtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBjb25zdCBwbUluZm86IFBvc2l0aW9uTW9ub21lckluZm8gPSBlbnRyeVsxXTtcbiAgICAgICAgLy8gY29uc3QgbTogc3RyaW5nID0gZW50cnlbMF07XG4gICAgICAgIGNvbnN0IGg6IG51bWJlciA9IG1heEhlaWdodCAqIHBtSW5mby5jb3VudCAvIHJvd0NvdW50O1xuXG4gICAgICAgIHBtSW5mby5ib3VuZHMgPSBuZXcgREcuUmVjdChqUG9zICogdGhpcy5fcG9zaXRpb25XaWR0aCwgeSwgdGhpcy5fcG9zaXRpb25XaWR0aCwgaCk7XG4gICAgICAgIHkgKz0gaDtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8jZW5kcmVnaW9uXG4gIH1cblxuICAvLyByZWZsZWN0IGNoYW5nZXMgbWFkZSB0byBmaWx0ZXIvc2VsZWN0aW9uXG4gIHJlbmRlcihyZWNhbGMgPSB0cnVlKSB7XG4gICAgaWYgKHRoaXMubXNnSG9zdCkge1xuICAgICAgaWYgKHRoaXMuc2VxQ29sICYmICF0aGlzLmNwKSB7XG4gICAgICAgIHRoaXMubXNnSG9zdCEuaW5uZXJUZXh0ID0gYFVua25vd24gcGFsZXR0ZSAoY29sdW1uIHNlbVR5cGU6ICcke3RoaXMuc2VxQ29sLnNlbVR5cGV9JykuYDtcbiAgICAgICAgdGhpcy5tc2dIb3N0IS5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1zZ0hvc3QhLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNhbnZhcyB8fCAhdGhpcy5zZXFDb2wgfHwgIXRoaXMuZGF0YUZyYW1lIHx8ICF0aGlzLmNwKVxuICAgICAgcmV0dXJuO1xuXG4gICAgY29uc3QgZyA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgaWYgKCFnKSByZXR1cm47XG5cbiAgICBpZiAocmVjYWxjKVxuICAgICAgdGhpcy5fY2FsY3VsYXRlKCk7XG5cbiAgICBnLnJlc2V0VHJhbnNmb3JtKCk7XG4gICAgZy5maWxsU3R5bGUgPSAnd2hpdGUnO1xuICAgIGcuZmlsbFJlY3QoMCwgMCwgdGhpcy5jYW52YXMud2lkdGgsIHRoaXMuY2FudmFzLmhlaWdodCk7XG4gICAgZy50ZXh0QmFzZWxpbmUgPSB0aGlzLnRleHRCYXNlbGluZTtcblxuICAgIC8vIFByZXZlbnRzIGRpdmlzaW9uIGJ5IHplcm8gb24gTGVuZ3RoID0gMFxuICAgIGlmICh0aGlzLnN0YXJ0UG9zaXRpb24gPT09IC0xIHx8IHRoaXMuZW5kUG9zaXRpb24gPT09IC0xKVxuICAgICAgcmV0dXJuO1xuXG4gICAgLy8jcmVnaW9uIFBsb3QgcG9zaXRpb25OYW1lc1xuICAgIGcucmVzZXRUcmFuc2Zvcm0oKTtcbiAgICBnLmZpbGxTdHlsZSA9ICdibGFjayc7XG4gICAgZy50ZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICBnLmZvbnQgPSAnMTBweCBSb2JvdG8sIFJvYm90byBMb2NhbCwgc2Fucy1zZXJpZic7XG4gICAgY29uc3QgcG9zTmFtZU1heFdpZHRoID0gTWF0aC5tYXgoLi4udGhpcy5wb3NpdGlvbnMubWFwKChwb3MpID0+IGcubWVhc3VyZVRleHQocG9zLm5hbWUpLndpZHRoKSk7XG4gICAgY29uc3QgaFNjYWxlID0gcG9zTmFtZU1heFdpZHRoIDwgKHRoaXMuX3Bvc2l0aW9uV2lkdGggLSAyKSA/IDEgOiAodGhpcy5fcG9zaXRpb25XaWR0aCAtIDIpIC8gcG9zTmFtZU1heFdpZHRoO1xuXG4gICAgZm9yIChsZXQgalBvcyA9IDA7IGpQb3MgPCB0aGlzLkxlbmd0aDsgalBvcysrKSB7XG4gICAgICBjb25zdCBwb3M6IFBvc2l0aW9uSW5mbyA9IHRoaXMucG9zaXRpb25zW2pQb3NdO1xuICAgICAgZy5yZXNldFRyYW5zZm9ybSgpO1xuICAgICAgZy5zZXRUcmFuc2Zvcm0oXG4gICAgICAgIGhTY2FsZSwgMCwgMCwgMSxcbiAgICAgICAgalBvcyAqIHRoaXMuX3Bvc2l0aW9uV2lkdGggKyB0aGlzLl9wb3NpdGlvbldpZHRoIC8gMiwgMCk7XG4gICAgICBnLmZpbGxUZXh0KHBvcy5uYW1lLCAwLCAwKTtcbiAgICB9XG4gICAgLy8jZW5kcmVnaW9uIFBsb3QgcG9zaXRpb25OYW1lc1xuXG4gICAgZm9yIChsZXQgalBvcyA9IDA7IGpQb3MgPCB0aGlzLkxlbmd0aDsgalBvcysrKSB7XG4gICAgICBmb3IgKGNvbnN0IFttb25vbWVyLCBwbUluZm9dIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMucG9zaXRpb25zW2pQb3NdLmZyZXEpKSB7XG4gICAgICAgIGlmIChtb25vbWVyICE9PSAnLScpIHtcbiAgICAgICAgICBjb25zdCBiID0gcG1JbmZvLmJvdW5kcztcblxuICAgICAgICAgIGNvbnN0IGZvbnRTdHlsZSA9ICcxNnB4IFJvYm90bywgUm9ib3RvIExvY2FsLCBzYW5zLXNlcmlmJztcbiAgICAgICAgICAvLyBIYWNrcyB0byBzY2FsZSB1cHBlcmNhc2UgY2hhcmFjdGVycyB0byB0YXJnZXQgcmVjdGFuZ2xlXG4gICAgICAgICAgY29uc3QgdXBwZXJjYXNlTGV0dGVyQXNjZW50ID0gMC4yNTtcbiAgICAgICAgICBjb25zdCB1cHBlcmNhc2VMZXR0ZXJIZWlnaHQgPSAxMi4yO1xuXG4gICAgICAgICAgZy5yZXNldFRyYW5zZm9ybSgpO1xuICAgICAgICAgIGcuc3Ryb2tlU3R5bGUgPSAnbGlnaHRncmF5JztcbiAgICAgICAgICBnLmxpbmVXaWR0aCA9IDE7XG4gICAgICAgICAgZy5yZWN0KGIubGVmdCwgYi50b3AsIGIud2lkdGgsIGIuaGVpZ2h0KTtcbiAgICAgICAgICBnLmZpbGxTdHlsZSA9IHRoaXMuY3AuZ2V0KG1vbm9tZXIpID8/IHRoaXMuY3AuZ2V0KCdvdGhlcicpO1xuICAgICAgICAgIGcudGV4dEFsaWduID0gJ2xlZnQnO1xuICAgICAgICAgIGcuZm9udCA9IGZvbnRTdHlsZTtcbiAgICAgICAgICAvL2cuZmlsbFJlY3QoYi5sZWZ0LCBiLnRvcCwgYi53aWR0aCwgYi5oZWlnaHQpO1xuICAgICAgICAgIGNvbnN0IG1UbTogVGV4dE1ldHJpY3MgPSBnLm1lYXN1cmVUZXh0KG1vbm9tZXIpO1xuXG4gICAgICAgICAgLy8gaWYgKG1NLmFjdHVhbEJvdW5kaW5nQm94QXNjZW50ICE9IDApXG4gICAgICAgICAgLy8gICBjb25zb2xlLmRlYnVnKGBtOiAke219LCBtTS5hY3R1YWxCb3VuZGluZ0JveEFzY2VudDogJHttTS5hY3R1YWxCb3VuZGluZ0JveEFzY2VudH1gKTtcblxuICAgICAgICAgIGcuc2V0VHJhbnNmb3JtKFxuICAgICAgICAgICAgYi53aWR0aCAvIG1UbS53aWR0aCwgMCwgMCwgYi5oZWlnaHQgLyB1cHBlcmNhc2VMZXR0ZXJIZWlnaHQsXG4gICAgICAgICAgICBiLmxlZnQsIGIudG9wKTtcbiAgICAgICAgICBnLmZpbGxUZXh0KG1vbm9tZXIsIDAsIC11cHBlcmNhc2VMZXR0ZXJBc2NlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjYWxjU2l6ZSgpIHtcbiAgICBpZiAoIXRoaXMuY2FudmFzIHx8ICF0aGlzLmhvc3QpXG4gICAgICByZXR1cm47XG5cbiAgICBsZXQgd2lkdGg6IG51bWJlciA9IHRoaXMuTGVuZ3RoICogdGhpcy5wb3NpdGlvbldpZHRoO1xuICAgIGxldCBoZWlnaHQgPSBNYXRoLm1pbih0aGlzLm1heEhlaWdodCwgTWF0aC5tYXgodGhpcy5taW5IZWlnaHQsIHRoaXMucm9vdC5jbGllbnRIZWlnaHQpKTtcblxuICAgIGlmICh0aGlzLmZpdEFyZWEpIHtcbiAgICAgIGNvbnN0IHhTY2FsZTogbnVtYmVyID0gdGhpcy5yb290LmNsaWVudEhlaWdodCAvIGhlaWdodDtcbiAgICAgIGNvbnN0IHlTY2FsZTogbnVtYmVyID0gdGhpcy5yb290LmNsaWVudFdpZHRoIC8gd2lkdGg7XG4gICAgICBjb25zdCBzY2FsZSA9IE1hdGgubWF4KDEsIE1hdGgubWluKHhTY2FsZSwgeVNjYWxlKSk7XG4gICAgICB3aWR0aCA9IHdpZHRoICogc2NhbGU7XG4gICAgICBoZWlnaHQgPSBoZWlnaHQgKiBzY2FsZTtcbiAgICAgIHRoaXMuX3Bvc2l0aW9uV2lkdGggPSB0aGlzLnBvc2l0aW9uV2lkdGggKiBzY2FsZTtcbiAgICB9XG5cbiAgICB0aGlzLmNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgIHRoaXMuY2FudmFzLnN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgO1xuXG4gICAgLy8gY29uc3QgY2FudmFzSGVpZ2h0OiBudW1iZXIgPSB3aWR0aCA+IHRoaXMucm9vdC5jbGllbnRXaWR0aCA/IGhlaWdodCAtIDggOiBoZWlnaHQ7XG4gICAgdGhpcy5ob3N0LnN0eWxlLnNldFByb3BlcnR5KCdoZWlnaHQnLCBgJHtoZWlnaHR9cHhgKTtcbiAgICBjb25zdCBjYW52YXNIZWlnaHQ6IG51bWJlciA9IHRoaXMuaG9zdC5jbGllbnRIZWlnaHQ7XG4gICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gY2FudmFzSGVpZ2h0O1xuICAgIHRoaXMuY2FudmFzLnN0eWxlLnNldFByb3BlcnR5KCdoZWlnaHQnLCBgJHtjYW52YXNIZWlnaHR9cHhgKTtcblxuICAgIC8vIEFkanVzdCBob3N0IGFuZCByb290IHdpZHRoXG4gICAgaWYgKHRoaXMuZml4V2lkdGgpIHtcbiAgICAgIC8vIGZ1bGwgd2lkdGggZm9yIGNhbnZhcyBob3N0IGFuZCByb290XG4gICAgICB0aGlzLnJvb3Quc3R5bGUud2lkdGggPSB0aGlzLmhvc3Quc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XG4gICAgICB0aGlzLnJvb3Quc3R5bGUuaGVpZ2h0IC8qPSB0aGlzLmhvc3Quc3R5bGUuaGVpZ2h0Ki8gPSBgJHtoZWlnaHR9cHhgO1xuICAgICAgdGhpcy5ob3N0LnN0eWxlLnNldFByb3BlcnR5KCdvdmVyZmxvdycsICdoaWRkZW4nLCAnaW1wb3J0YW50Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGFsbG93IHNjcm9sbCBjYW52YXMgaW4gcm9vdFxuICAgICAgdGhpcy5yb290LnN0eWxlLndpZHRoID0gdGhpcy5ob3N0LnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgICAgdGhpcy5ob3N0LnN0eWxlLm92ZXJmbG93WCA9ICdhdXRvIWltcG9ydGFudCc7XG4gICAgICB0aGlzLmhvc3Quc3R5bGUuc2V0UHJvcGVydHkoJ292ZXJmbG93JywgbnVsbCk7XG5cbiAgICAgIHRoaXMuaG9zdC5zdHlsZS5zZXRQcm9wZXJ0eSgndGV4dC1hbGlnbicsIHRoaXMuaG9yaXpvbnRhbEFsaWdubWVudCk7XG5cbiAgICAgIC8vIHZlcnRpY2FsIGFsaWdubWVudFxuICAgICAgbGV0IGhvc3RUb3BNYXJnaW4gPSAwO1xuICAgICAgc3dpdGNoICh0aGlzLnZlcnRpY2FsQWxpZ25tZW50KSB7XG4gICAgICBjYXNlICd0b3AnOlxuICAgICAgICBob3N0VG9wTWFyZ2luID0gMDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtaWRkbGUnOlxuICAgICAgICBob3N0VG9wTWFyZ2luID0gTWF0aC5tYXgoMCwgKHRoaXMucm9vdC5jbGllbnRIZWlnaHQgLSBoZWlnaHQpIC8gMik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgaG9zdFRvcE1hcmdpbiA9IE1hdGgubWF4KDAsIHRoaXMucm9vdC5jbGllbnRIZWlnaHQgLSBoZWlnaHQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHRoaXMuaG9zdC5zdHlsZS5zZXRQcm9wZXJ0eSgnbWFyZ2luLXRvcCcsIGAke2hvc3RUb3BNYXJnaW59cHhgLCAnaW1wb3J0YW50Jyk7XG5cbiAgICAgIGlmICh0aGlzLnJvb3QuY2xpZW50SGVpZ2h0IDwgaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuaG9zdC5zdHlsZS5zZXRQcm9wZXJ0eSgnaGVpZ2h0JywgYCR7dGhpcy5yb290LmNsaWVudEhlaWdodH1weGApO1xuICAgICAgICB0aGlzLmhvc3Quc3R5bGUuc2V0UHJvcGVydHkoJ292ZXJmbG93LXknLCBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaG9zdC5zdHlsZS5zZXRQcm9wZXJ0eSgnb3ZlcmZsb3cteScsICdoaWRkZW4nLCAnaW1wb3J0YW50Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29uc29sZS5kZWJ1ZyhcbiAgICAvLyAgIGB0aGlzLnJvb3Quc3R5bGUuaGVpZ2h0ID0gJHt0aGlzLnJvb3Quc3R5bGUuaGVpZ2h0fVxcbmAgK1xuICAgIC8vICAgYHRoaXMucm9vdC5jbGllbnRIZWlnaHQgPSAke3RoaXMucm9vdC5jbGllbnRIZWlnaHR9XFxuYCArXG4gICAgLy8gICBgdGhpcy5ob3N0LnN0eWxlLmhlaWdodCA9ICR7dGhpcy5ob3N0LnN0eWxlLmhlaWdodH1cXG5gICtcbiAgICAvLyAgIGB0aGlzLmhvc3QuY2xpZW50SGVpZ2h0ID0gJHt0aGlzLmhvc3QuY2xpZW50SGVpZ2h0fVxcbmAgK1xuICAgIC8vICAgJ1xcbicgK1xuICAgIC8vICAgYHRoaXMuY2FudmFzLmhlaWdodCAgICAgICA9ICR7dGhpcy5jYW52YXMuaGVpZ2h0fVxcbmAgK1xuICAgIC8vICAgYHRoaXMuY2FudmFzLnN0eWxlLmhlaWdodCA9ICR7dGhpcy5jYW52YXMuc3R5bGUuaGVpZ2h0fWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7REcuQ29sdW1ufSBzZXFDb2wgQ29sdW1uIHRvIGxvb2sgZm9yIGEgcGFsZXR0ZVxuICAgKiBAcGFyYW0ge251bWJlcn0gIG1pbkxlbmd0aCBtaW5pbXVtIGxlbmd0aCBvZiBzZXF1ZW5jZSB0byBkZXRlY3QgcGFsZXR0ZSAoZW1wdHkgc3RyaW5ncyBhcmUgYWxsb3dlZClcbiAgICogQHJldHVybiB7U2VxUGFsZXR0ZX0gUGFsZXR0ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBhbHBoYWJldCBvZiB0aGUgc2VxdWVuY2VzIGluIHRoZSBjb2x1bW5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcGlja1VwUGFsZXR0ZShzZXFDb2w6IERHLkNvbHVtbiwgbWluTGVuZ3RoOiBudW1iZXIgPSA1KTogU2VxUGFsZXR0ZSB7XG4gICAgbGV0IHJlczogU2VxUGFsZXR0ZSB8IG51bGwgPSBudWxsO1xuICAgIHN3aXRjaCAoc2VxQ29sLnNlbVR5cGUpIHtcbiAgICBjYXNlIEFtaW5vYWNpZHMuU2VtVHlwZU11bHRpcGxlQWxpZ25tZW50OlxuICAgICAgcmVzID0gQW1pbm9hY2lkc1BhbGV0dGVzLkdyb2tHcm91cHM7XG4gICAgICBicmVhaztcbiAgICBjYXNlIE51Y2xlb3RpZGVzLlNlbVR5cGVNdWx0aXBsZUFsaWdubWVudDpcbiAgICAgIHJlcyA9IE51Y2xlb3RpZGVzUGFsZXR0ZXMuQ2hyb21hdG9ncmFtO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNvbnN0IGFscGhhYmV0RnJlcXM6IE1vbm9tZXJGcmVxcyA9IFdlYkxvZ28uZ2V0QWxwaGFiZXRGcmVxcyhzZXFDb2wsIG1pbkxlbmd0aCk7XG5cbiAgICBjb25zdCBhbHBoYWJldENhbmRpZGF0ZXM6IFtTZXQ8c3RyaW5nPiwgU2VxUGFsZXR0ZV1bXSA9IFtcbiAgICAgIFtuZXcgU2V0KE9iamVjdC5rZXlzKE51Y2xlb3RpZGVzLk5hbWVzKSksIE51Y2xlb3RpZGVzUGFsZXR0ZXMuQ2hyb21hdG9ncmFtXSxcbiAgICAgIFtuZXcgU2V0KE9iamVjdC5rZXlzKEFtaW5vYWNpZHMuTmFtZXMpKSwgQW1pbm9hY2lkc1BhbGV0dGVzLkdyb2tHcm91cHNdLFxuICAgIF07XG4gICAgLy8gQ2FsY3VsYXRlIGxpa2VsaWhvb2RzIGZvciBhbHBoYWJldF9jYW5kaWRhdGVzXG4gICAgY29uc3QgYWxwaGFiZXRDYW5kaWRhdGVzU2ltOiBudW1iZXJbXSA9IGFscGhhYmV0Q2FuZGlkYXRlcy5tYXAoXG4gICAgICAoYykgPT4gV2ViTG9nby5nZXRBbHBoYWJldFNpbWlsYXJpdHkoYWxwaGFiZXRGcmVxcywgY1swXSkpO1xuICAgIGNvbnN0IG1heENvcyA9IE1hdGgubWF4KC4uLmFscGhhYmV0Q2FuZGlkYXRlc1NpbSk7XG4gICAgaWYgKG1heENvcyA+IDAuNjUpXG4gICAgICByZXMgPSBhbHBoYWJldENhbmRpZGF0ZXNbYWxwaGFiZXRDYW5kaWRhdGVzU2ltLmluZGV4T2YobWF4Q29zKV1bMV07XG4gICAgZWxzZVxuICAgICAgcmVzID0gVW5rbm93blNlcVBhbGV0dGVzLkNvbG9yO1xuXG4gICAgLy8gaWYgKHJlcyA9PT0gbnVsbCkge1xuICAgIC8vICAgLy8gVGhlIGFscGhhYmV0IG9mIG51Y2xlb3RpZGVzIGlzIGEgc21hbGxlciBzZXQsIHNvIHdlIGNoZWNrIGl0IGZpcnN0LlxuICAgIC8vICAgY29uc3QgYWxwaGFiZXQgPSB7Li4uTnVjbGVvdGlkZXMuTmFtZXMsIC4uLnsnLSc6ICdnYXAnfX07XG4gICAgLy8gICByZXMgPSBERy5EZXRlY3Rvci5zYW1wbGVDYXRlZ29yaWVzKHNlcUNvbCwgKHNlcSkgPT4ge1xuICAgIC8vICAgICByZXR1cm4gIXNlcSB8fCAoc2VxLmxlbmd0aCA+IG1pbkxlbmd0aCAmJiB0aGlzLnNwbGl0U2VxVG9Nb25vbWVycyhzZXEpLmV2ZXJ5KChuKSA9PiBuIGluIGFscGhhYmV0KSk7XG4gICAgLy8gICB9LCAxKSA/IE51Y2xlb3RpZGVzUGFsZXR0ZXMuQ2hyb21hdG9ncmFtIDogbnVsbDtcbiAgICAvLyB9XG4gICAgLy8gaWYgKHJlcyA9PT0gbnVsbCkge1xuICAgIC8vICAgLy8gQW5kIHRoZW4gY2hlY2sgZm9yIGFtaW5vIGFjaWQncyBhbHBoYWJldC5cbiAgICAvLyAgIGNvbnN0IGFscGhhYmV0ID0gey4uLkFtaW5vYWNpZHMuTmFtZXMsIC4uLnsnLSc6ICdnYXAnfX07XG4gICAgLy8gICByZXMgPSBERy5EZXRlY3Rvci5zYW1wbGVDYXRlZ29yaWVzKHNlcUNvbCwgKHNlcSkgPT4ge1xuICAgIC8vICAgICByZXR1cm4gIXNlcSB8fCAoc2VxLmxlbmd0aCA+IG1pbkxlbmd0aCAmJiB0aGlzLnNwbGl0U2VxVG9Nb25vbWVycyhzZXEpLmV2ZXJ5KChuKSA9PiBuIGluIGFscGhhYmV0KSk7XG4gICAgLy8gICB9LCAxKSA/IEFtaW5vYWNpZHNQYWxldHRlcy5Hcm9rR3JvdXBzIDogbnVsbDtcbiAgICAvLyB9XG4gICAgLy8gaWYgKHJlcyA9PT0gbnVsbCkge1xuICAgIC8vICAgcmVzID0gVW5rbm93blNlcVBhbGV0dGVzLkNvbG9yO1xuICAgIC8vIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBnZXRBbHBoYWJldEZyZXFzKHNlcUNvbDogREcuQ29sdW1uLCBtaW5MZW5ndGg6IG51bWJlciA9IDApOiBNb25vbWVyRnJlcXMge1xuICAgIGNvbnN0IHJlczogTW9ub21lckZyZXFzID0ge307XG4gICAgZm9yIChjb25zdCBzZXEgb2Ygc2VxQ29sLmNhdGVnb3JpZXMpIHtcbiAgICAgIGNvbnN0IG1TZXE6IHN0cmluZ1tdID0gV2ViTG9nby5zcGxpdFNlcVRvTW9ub21lcnMoc2VxKTtcbiAgICAgIGlmIChtU2VxLmxlbmd0aCA+IG1pbkxlbmd0aCkge1xuICAgICAgICBmb3IgKGNvbnN0IG0gb2YgbVNlcSkge1xuICAgICAgICAgIGlmICghKG0gaW4gcmVzKSlcbiAgICAgICAgICAgIHJlc1ttXSA9IDA7XG4gICAgICAgICAgcmVzW21dICs9IDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0QWxwaGFiZXRTaW1pbGFyaXR5KGZyZXE6IE1vbm9tZXJGcmVxcywgYWxwaGFiZXQ6IFNldDxzdHJpbmc+LCBnYXBTeW1ib2w6IHN0cmluZyA9ICctJyk6IG51bWJlciB7XG4gICAgY29uc3Qga2V5cyA9IG5ldyBTZXQ8c3RyaW5nPihbLi4ubmV3IFNldChPYmplY3Qua2V5cyhmcmVxKSksIC4uLmFscGhhYmV0XSk7XG4gICAga2V5cy5kZWxldGUoZ2FwU3ltYm9sKTtcblxuICAgIGNvbnN0IGZyZXFBOiBudW1iZXJbXSA9IFtdO1xuICAgIGNvbnN0IGFscGhhYmV0QTogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IG0gb2Yga2V5cykge1xuICAgICAgZnJlcUEucHVzaChtIGluIGZyZXEgPyBmcmVxW21dIDogMCk7XG4gICAgICBhbHBoYWJldEEucHVzaChhbHBoYWJldC5oYXMobSkgPyAxIDogMCk7XG4gICAgfVxuICAgIC8qIFRoZXJlIHdlcmUgYSBmZXcgaWRlYXM6IGNoaS1zcXVhcmVkLCBwZWFyc29uIGNvcnJlbGF0aW9uICh2YXJpYW5jZT8pLCBzY2FsYXIgcHJvZHVjdCAqL1xuICAgIGNvbnN0IGZyZXFWOiBWZWN0b3IgPSBuZXcgVmVjdG9yKGZyZXFBKTtcbiAgICBjb25zdCBhbHBoYWJldFY6IFZlY3RvciA9IG5ldyBWZWN0b3IoYWxwaGFiZXRBKTtcbiAgICBjb25zdCBjb3M6IG51bWJlciA9IHZlY3RvckRvdFByb2R1Y3QoZnJlcVYsIGFscGhhYmV0VikgLyAodmVjdG9yTGVuZ3RoKGZyZXFWKSAqIHZlY3Rvckxlbmd0aChhbHBoYWJldFYpKTtcbiAgICByZXR1cm4gY29zO1xuICB9XG5cbiAgLyoqIEZpcnN0IHRyeSB0byBmaW5kIGNvbHVtbiB3aXRoIHNlbVR5cGUgJ2FsaWduZWRTZXF1ZW5jZScuXG4gICAqIE5leHQgbG9vayBmb3IgY29sdW1uIHdpdGggZGF0YSBhbHBoYWJldCBjb3JyZXNwb25kaW5nIHRvIGFueSBvZiB0aGUga25vd24gcGFsZXR0ZXMuXG4gICAqIEBwYXJhbSB7REcuRGF0YUZyYW1lfSBkYXRhRnJhbWVcbiAgICogQHJldHVybiB7REcuQ29sdW1ufSBUaGUgY29sdW1uIHdlIHdlcmUgbG9va2luZyBmb3Igb3IgbnVsbFxuICAgKi9cbiAgcHJpdmF0ZSBwaWNrVXBTZXFDb2woZGF0YUZyYW1lOiBERy5EYXRhRnJhbWUpOiBERy5Db2x1bW4gfCBudWxsIHtcbiAgICBsZXQgcmVzOiBERy5Db2x1bW4gfCBudWxsID0gZGF0YUZyYW1lLmNvbHVtbnMuYnlTZW1UeXBlKCdhbGlnbmVkU2VxdWVuY2UnKTtcbiAgICBpZiAocmVzID09IG51bGwpIHtcbiAgICAgIGZvciAoY29uc3QgY29sIG9mIGRhdGFGcmFtZS5jb2x1bW5zKSB7XG4gICAgICAgIGNvbnN0IGNwID0gV2ViTG9nby5waWNrVXBQYWxldHRlKGNvbCBhcyBERy5Db2x1bW4sIDUpO1xuICAgICAgICBpZiAoY3AgIT09IG51bGwgJiYgIShjcCBpbnN0YW5jZW9mIFVua25vd25TZXFQYWxldHRlKSkge1xuICAgICAgICAgIHJlcyA9IGNvbDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc3BsaXRSZSA9IC9cXFsoXFx3KylcXF18KFxcdyl8KC0pL2c7XG5cbiAgcHVibGljIHN0YXRpYyBzcGxpdFNlcVRvTW9ub21lcnMoc2VxOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgLy8gVE9ETzogVXNlIHNlcXVlbmNlIHNlcGFyYXRvclxuICAgIGNvbnN0IHJlczogc3RyaW5nW10gPSB3dShzZXEudG9TdHJpbmcoKS5tYXRjaEFsbChXZWJMb2dvLnNwbGl0UmUpKS5tYXAoKG1hKSA9PiB7XG4gICAgICBsZXQgbVJlczogc3RyaW5nO1xuICAgICAgY29uc3QgbSA9IG1hWzBdO1xuICAgICAgaWYgKG0ubGVuZ3RoID4gMSkge1xuICAgICAgICBpZiAobSBpbiBXZWJMb2dvLmFhU3lub255bXMpIHtcbiAgICAgICAgICBtUmVzID0gV2ViTG9nby5hYVN5bm9ueW1zW21dO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1SZXMgPSAnJztcbiAgICAgICAgICBjb25zb2xlLmRlYnVnKGBMb25nIG1vbm9tZXIgJyR7bX0nIGhhcyBub3QgYSBzaG9ydCBzeW5vbnltLmApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtUmVzID0gbTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtUmVzO1xuICAgIH0pLnRvQXJyYXkoKTtcblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKiogT25seSBzb21lIG9mIHRoZSBzeW5vbnltcy4gVGhlc2Ugd2VyZSBvYnRhaW5lZCBmcm9tIHRoZSBjbHVzdGVyZWQgb2xpZ29wZXB0aWRlIGRhdGFzZXQuICovXG4gIHByaXZhdGUgc3RhdGljIGFhU3lub255bXM6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICdbTWVObGVdJzogJ0wnLCAvLyBObGUgLSBub3JsZXVjaW5lXG4gICAgJ1tNZUFdJzogJ0EnLFxuICAgICdbTWVHXSc6ICdHJyxcbiAgICAnW01lRl0nOiAnRicsXG4gIH07XG59XG4iXX0=
|