@firestitch/report 18.21.3 → 18.21.5
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/app/reports/components/component-list/component-list.component.d.ts +3 -0
- package/app/reports/export/report-export-collector.service.d.ts +2 -9
- package/app/reports/export/report-export.service.d.ts +0 -1
- package/app/reports/export/report-pdf.service.d.ts +0 -1
- package/app/reports/export/report-pptx.service.d.ts +0 -3
- package/app/reports/export/report-text-layout.service.d.ts +0 -4
- package/app/reports/interfaces/report-value-label.interface.d.ts +4 -0
- package/app/reports/interfaces/report.interface.d.ts +2 -0
- package/app/reports/option-builder.d.ts +1 -0
- package/app/reports/value-labels.d.ts +2 -0
- package/esm2022/app/reports/components/component-list/component-list.component.mjs +11 -3
- package/esm2022/app/reports/components/component-text/component-text.component.mjs +3 -3
- package/esm2022/app/reports/export/report-export-collector.service.mjs +21 -22
- package/esm2022/app/reports/export/report-export.service.mjs +7 -34
- package/esm2022/app/reports/export/report-pdf.service.mjs +21 -40
- package/esm2022/app/reports/export/report-pptx.service.mjs +68 -117
- package/esm2022/app/reports/export/report-text-layout.service.mjs +5 -20
- package/esm2022/app/reports/interfaces/report-value-label.interface.mjs +2 -0
- package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
- package/esm2022/app/reports/mark-click.mjs +9 -6
- package/esm2022/app/reports/option-builder.mjs +60 -10
- package/esm2022/app/reports/value-labels.mjs +26 -0
- package/esm2022/public_api.mjs +2 -1
- package/fesm2022/{firestitch-report-echarts-CUVOSBvJ.mjs → firestitch-report-echarts-D7WNr0Z4.mjs} +2 -2
- package/fesm2022/{firestitch-report-echarts-CUVOSBvJ.mjs.map → firestitch-report-echarts-D7WNr0Z4.mjs.map} +1 -1
- package/fesm2022/{firestitch-report-firestitch-report-CfvBTMrG.mjs → firestitch-report-firestitch-report-DWP3aywv.mjs} +218 -245
- package/fesm2022/firestitch-report-firestitch-report-DWP3aywv.mjs.map +1 -0
- package/fesm2022/firestitch-report.mjs +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +1 -0
- package/fesm2022/firestitch-report-firestitch-report-CfvBTMrG.mjs.map +0 -1
|
@@ -8,7 +8,7 @@ import { DEFAULT_TEXT_COLOR, DEFAULT_TEXT_SIZE, TEXT_TABLE_BORDER_COLOR, TEXT_TA
|
|
|
8
8
|
import { REPORT_KPI_CHANGE_COLORS, REPORT_KPI_SPARKLINE_COLOR, REPORT_KPI_TRACK_COLOR, REPORT_MUTED_TEXT_COLOR, } from '../theme/palette';
|
|
9
9
|
import { isDrawn } from '../values';
|
|
10
10
|
import { renderChartImage } from './offscreen-chart';
|
|
11
|
-
import { HEADER_FOOTER_NAME, coverLines, emptyLabel, exportCell, exportNoteLines, exportTitle, exportWindowsLine, isEmptyTile, kpiCardHasExtras, kpiExportHeight, kpiExportParts, listColumns, listHeadings, listTotalsRow, moreRowsNotice, scaledKpiHeights,
|
|
11
|
+
import { HEADER_FOOTER_NAME, coverLines, emptyLabel, exportCell, exportNoteLines, exportTitle, exportWindowsLine, isEmptyTile, kpiCardHasExtras, kpiExportHeight, kpiExportParts, listColumns, listHeadings, listTotalsRow, moreRowsNotice, scaledKpiHeights, textSnippet, } from './report-export-collector.service';
|
|
12
12
|
import { gridExportTable } from './report-grid-export';
|
|
13
13
|
import { ReportTextLayoutService } from './report-text-layout.service';
|
|
14
14
|
import * as i0 from "@angular/core";
|
|
@@ -81,9 +81,6 @@ const TEXT_LINE_HEIGHT = 1.25;
|
|
|
81
81
|
// How far a list item's text sits from the block's edge, points; the marker
|
|
82
82
|
// hangs in that space.
|
|
83
83
|
const LIST_INDENT = 16;
|
|
84
|
-
// What the export's overflow gate says the PDF does with a text block that does
|
|
85
|
-
// not fit its box.
|
|
86
|
-
const PDF_OVERFLOW_NOTE = 'The PDF cuts it off at the bottom of its box.';
|
|
87
84
|
// How far a table's group label steps in per level, points.
|
|
88
85
|
const GRID_INDENT = 8;
|
|
89
86
|
// Builds the PDF client-side with jspdf. The report's unit is inches and PDFs
|
|
@@ -103,14 +100,12 @@ const GRID_INDENT = 8;
|
|
|
103
100
|
// without end trying to place it.
|
|
104
101
|
//
|
|
105
102
|
// A component that fails to draw is marked in its box and the file goes on
|
|
106
|
-
// (_guarded); build() hands back the ones that did
|
|
107
|
-
// cut.
|
|
103
|
+
// (_guarded); build() hands back the ones that did.
|
|
108
104
|
//
|
|
109
105
|
// A text block's tables are drawn by autoTable too, from the line its words
|
|
110
106
|
// reach, in the column widths the canvas gives them (ReportTextLayoutService).
|
|
111
|
-
// A text block is cut at the bottom of its box
|
|
112
|
-
//
|
|
113
|
-
// can ask about them before it saves.
|
|
107
|
+
// A text block is never cut at the bottom of its box: what runs past it draws
|
|
108
|
+
// on below, as on the canvas, down to the page's edge.
|
|
114
109
|
export class ReportPdfService {
|
|
115
110
|
_textLayout = inject(ReportTextLayoutService);
|
|
116
111
|
async build(collected) {
|
|
@@ -133,8 +128,6 @@ export class ReportPdfService {
|
|
|
133
128
|
}
|
|
134
129
|
}
|
|
135
130
|
return {
|
|
136
|
-
overflows: [...context.textOverflows.values()],
|
|
137
|
-
overflowNote: PDF_OVERFLOW_NOTE,
|
|
138
131
|
undrawn: [...context.undrawn.values()],
|
|
139
132
|
save: () => {
|
|
140
133
|
context.doc.save(`${this._slug(collected.report.name)}.pdf`);
|
|
@@ -162,7 +155,6 @@ export class ReportPdfService {
|
|
|
162
155
|
masterValues: this._pdfValues(collected.masterValues),
|
|
163
156
|
filterFields: collected.filterFields,
|
|
164
157
|
masterFilters: layerFilterFields(collected.filterFields, report.filterGroups ?? [], null),
|
|
165
|
-
textOverflows: new Map(),
|
|
166
158
|
undrawn: new Map(),
|
|
167
159
|
};
|
|
168
160
|
}
|
|
@@ -180,8 +172,8 @@ export class ReportPdfService {
|
|
|
180
172
|
if (item.component.type !== 'text') {
|
|
181
173
|
await this._renderComponent(context, collectedPage.page, item, tokens, overflows);
|
|
182
174
|
}
|
|
183
|
-
else
|
|
184
|
-
this.
|
|
175
|
+
else {
|
|
176
|
+
await this._renderText(context, item.component, pageTokens);
|
|
185
177
|
}
|
|
186
178
|
});
|
|
187
179
|
}
|
|
@@ -212,7 +204,7 @@ export class ReportPdfService {
|
|
|
212
204
|
componentId: component.id,
|
|
213
205
|
page,
|
|
214
206
|
name: component.type === 'text'
|
|
215
|
-
?
|
|
207
|
+
? textSnippet(component, tokens)
|
|
216
208
|
: exportTitle(component, tokens),
|
|
217
209
|
});
|
|
218
210
|
}
|
|
@@ -239,20 +231,10 @@ export class ReportPdfService {
|
|
|
239
231
|
const masterTokens = { ...tokens, values: context.masterValues, filters: context.masterFilters };
|
|
240
232
|
for (const component of (context.report.master?.components ?? []).filter(isDrawn)) {
|
|
241
233
|
await this._guarded(context, component, HEADER_FOOTER_NAME, masterTokens, true, async () => {
|
|
242
|
-
|
|
243
|
-
this._recordOverflow(context, component, HEADER_FOOTER_NAME, masterTokens);
|
|
244
|
-
}
|
|
234
|
+
await this._renderText(context, component, masterTokens);
|
|
245
235
|
});
|
|
246
236
|
}
|
|
247
237
|
}
|
|
248
|
-
// Lists a text block that was cut, under the page the export's overflow gate
|
|
249
|
-
// names it by. A block cut again on a later page (a header or footer) keeps
|
|
250
|
-
// the first entry.
|
|
251
|
-
_recordOverflow(context, component, page, tokens) {
|
|
252
|
-
if (!context.textOverflows.has(component.id)) {
|
|
253
|
-
context.textOverflows.set(component.id, textOverflow(component, page, tokens));
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
238
|
_titlePage(doc, collected, pageW, pageH) {
|
|
257
239
|
doc.setFont('helvetica', 'bold');
|
|
258
240
|
doc.setFontSize(28);
|
|
@@ -267,11 +249,11 @@ export class ReportPdfService {
|
|
|
267
249
|
// words between its tables are drawn line by line (_drawParagraphs) and each
|
|
268
250
|
// table by autoTable from the line the words above it reach
|
|
269
251
|
// (_drawTextTable). Only a block with a table is measured, for the edges
|
|
270
|
-
// and column widths the canvas gives its tables.
|
|
271
|
-
// the block's height
|
|
272
|
-
//
|
|
252
|
+
// and column widths the canvas gives its tables. Words and table rows that
|
|
253
|
+
// run past the block's height draw on below it, as on the canvas; only the
|
|
254
|
+
// page's edge stops them.
|
|
273
255
|
async _renderText(context, component, tokens) {
|
|
274
|
-
const box = this._textBox(component);
|
|
256
|
+
const box = this._textBox(component, context.pageH);
|
|
275
257
|
const blocks = textBlocks(component.config?.html ?? '', tokens);
|
|
276
258
|
const layout = blocks.some((block) => block.kind === 'table')
|
|
277
259
|
? await this._textLayout.measure(component, tokens)
|
|
@@ -287,23 +269,22 @@ export class ReportPdfService {
|
|
|
287
269
|
? this._drawParagraphs(context.doc, block.paragraphs, box, cursorY)
|
|
288
270
|
: this._drawTextTable(context, block.table, layout?.tables[tableIndex++] ?? null, box, onMargin ? cursorY : cursorY + TEXT_TABLE_MARGIN);
|
|
289
271
|
if (drawn.cut) {
|
|
290
|
-
return
|
|
272
|
+
return;
|
|
291
273
|
}
|
|
292
274
|
cursorY = drawn.cursorY;
|
|
293
275
|
onMargin = block.kind === 'table' || (onMargin && !block.paragraphs.length);
|
|
294
276
|
}
|
|
295
|
-
return false;
|
|
296
277
|
}
|
|
297
278
|
// Where a text block's words go: inside its padding, each edge 1/8" unless
|
|
298
|
-
// set.
|
|
299
|
-
_textBox(component) {
|
|
279
|
+
// set, down to the bottom of the page (pageH).
|
|
280
|
+
_textBox(component, pageH) {
|
|
300
281
|
const padding = component.config?.padding;
|
|
301
282
|
const inset = (value) => (value ?? DEFAULT_COMPONENT_PADDING) * PT;
|
|
302
283
|
return {
|
|
303
284
|
left: component.x * PT + inset(padding?.left),
|
|
304
285
|
top: component.y * PT + inset(padding?.top),
|
|
305
286
|
width: component.w * PT - inset(padding?.left) - inset(padding?.right),
|
|
306
|
-
bottom:
|
|
287
|
+
bottom: pageH,
|
|
307
288
|
};
|
|
308
289
|
}
|
|
309
290
|
// Paragraphs drawn line by line from cursorY down: each one's runs are broken
|
|
@@ -367,9 +348,9 @@ export class ReportPdfService {
|
|
|
367
348
|
// evenly. A row is as tall as its cells' words wrapped as _drawParagraphs
|
|
368
349
|
// wraps them, and the words are drawn into each cell once autoTable has
|
|
369
350
|
// drawn its grid lines and fill (_drawTextCell), so they keep their runs'
|
|
370
|
-
// fonts and colors. Only the rows the box
|
|
371
|
-
//
|
|
372
|
-
// TEXT_TABLE_MARGIN under it.
|
|
351
|
+
// fonts and colors. Only the rows that fit above the box's bottom, the
|
|
352
|
+
// page's edge, are drawn, and a table that loses any, or runs past its page
|
|
353
|
+
// anyway, is cut. The cursor it leaves is TEXT_TABLE_MARGIN under it.
|
|
373
354
|
_drawTextTable(context, table, layout, box, top) {
|
|
374
355
|
if (top >= box.bottom) {
|
|
375
356
|
return { cursorY: top, cut: true };
|
|
@@ -737,7 +718,7 @@ export class ReportPdfService {
|
|
|
737
718
|
// totals row (null without one). The columns the viewer hid are left out.
|
|
738
719
|
_tableCells(context, component, data, hiddenColumns) {
|
|
739
720
|
const columns = listColumns(component, data, context.formatContext.locale, hiddenColumns);
|
|
740
|
-
const cells = data.rows.map((row) => columns.map((column) => this._pdfText(exportCell(row[column.column], column, context.timezone, context.formatContext, row))));
|
|
721
|
+
const cells = data.rows.map((row) => columns.map((column) => this._pdfText(exportCell(row[column.column], column, context.timezone, context.formatContext, row, data.valueLabels))));
|
|
741
722
|
const foot = listTotalsRow(data, columns, context.timezone, context.formatContext);
|
|
742
723
|
return {
|
|
743
724
|
cells,
|
|
@@ -1153,4 +1134,4 @@ export class ReportPdfService {
|
|
|
1153
1134
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportPdfService, decorators: [{
|
|
1154
1135
|
type: Injectable
|
|
1155
1136
|
}] });
|
|
1156
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXBkZi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2V4cG9ydC9yZXBvcnQtcGRmLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQVVsRCxPQUFPLEVBQzJDLFdBQVcsRUFBRSxvQkFBb0IsR0FDbEYsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RELE9BQU8sRUFDTCxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSx1QkFBdUIsRUFBRSx1QkFBdUIsRUFBRSx1QkFBdUIsRUFDaEgsaUJBQWlCLEVBQ2pCLFVBQVUsR0FDWCxNQUFNLFNBQVMsQ0FBQztBQUNqQixPQUFPLEVBQ0wsd0JBQXdCLEVBQUUsMEJBQTBCLEVBQUUsc0JBQXNCLEVBQUUsdUJBQXVCLEdBQ3RHLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRCxPQUFPLEVBQzRELGtCQUFrQixFQUNqRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFDbEgsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQzNHLGdCQUFn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OUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEUsSUFBSSxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbEIsR0FBRyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QixHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDakMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxRQUFRLEVBQUUsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDdEYsQ0FBQztRQUNELElBQUksR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2YsR0FBRyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QixHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDakMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxRQUFRLEVBQUUsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDcEYsQ0FBQztRQUVELElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2IsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2xGLENBQUM7SUFDSCxDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLG1EQUFt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MEU7SUFDMUUsNEVBQTRFO0lBQ3BFLFVBQVUsQ0FBQyxNQUFpQztRQUNsRCxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDckUsR0FBRztZQUNILEtBQUssQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO1NBQ2pGLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVPLEtBQUssQ0FBQyxJQUFZO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxRQUFRLENBQUM7SUFDNUYsQ0FBQzt3R0EveUNVLGdCQUFnQjs0R0FBaEIsZ0JBQWdCOzs0RkFBaEIsZ0JBQWdCO2tCQUQ1QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFJlcG9ydEtwaVRyZW5kIH0gZnJvbSAnLi4vZW51bXMvcmVwb3J0LWtwaS10cmVuZC5lbnVtJztcbmltcG9ydCB7IGxheWVyRmlsdGVyRmllbGRzIH0gZnJvbSAnLi4vZmlsdGVyLXRleHQnO1xuaW1wb3J0IHsgcmVzb2x2ZVJlcG9ydFRpbWV6b25lIH0gZnJvbSAnLi4vZm9ybWF0JztcbmltcG9ydCB7XG4gIENvbXBvbmVudERhdGEsXG4gIEtwaUNvbmZpZyxcbiAgUmVwb3J0LFxuICBSZXBvcnRDb21wb25lbnQsXG4gIFJlcG9ydEZvcm1hdENvbnRleHQsXG4gIFJlcG9ydEhlYWRlckZvb3RlcixcbiAgUmVwb3J0UGFnZSxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIEtwaUNhcmREZWx0YSwgS3BpQ2FyZFRhcmdldCwgS3BpU3BhcmtsaW5lUG9pbnQsIGtwaUNhcmRWaWV3LCBrcGlTcGFya2xpbmVHZW9tZXRyeSxcbn0gZnJvbSAnLi4va3BpLWNhcmQnO1xuaW1wb3J0IHsgREVGQVVMVF9DT01QT05FTlRfUEFERElORyB9IGZyb20gJy4uL2xheW91dCc7XG5pbXBvcnQge1xuICBERUZBVUxUX1RFWFRfQ09MT1IsIERFRkFVTFRfVEVYVF9TSVpFLCBURVhUX1RBQkxFX0JPUkRFUl9DT0xPUiwgVEVYVF9UQUJMRV9CT1JERVJfV0lEVEgsIFRFWFRfVEFCTEVfQ0VMTF9QQURESU5HLFxuICBURVhUX1RBQkxFX01BUkdJTiwgVGV4dEZpbHRlckZpZWxkLCBUZXh0UGFyYWdyYXBoLCBUZXh0UnVuLCBUZXh0VGFibGUsIFRleHRUYWJsZUNlbGwsIFRleHRUb2tlbkNvbnRleHQsIFRleHRWYWx1ZSxcbiAgdGV4dEJsb2Nrcyxcbn0gZnJvbSAnLi4vdGV4dCc7XG5pbXBvcnQge1xuICBSRVBPUlRfS1BJX0NIQU5HRV9DT0xPUlMsIFJFUE9SVF9LUElfU1BBUktMSU5FX0NPTE9SLCBSRVBPUlRfS1BJX1RSQUNLX0NPTE9SLCBSRVBPUlRfTVVURURfVEVYVF9DT0xPUixcbn0gZnJvbSAnLi4vdGhlbWUvcGFsZXR0ZSc7XG5pbXBvcnQgeyBpc0RyYXduIH0gZnJvbSAnLi4vdmFsdWVzJztcbmltcG9ydCB7IHJlbmRlckNoYXJ0SW1hZ2UgfSBmcm9tICcuL29mZnNjcmVlbi1jaGFydCc7XG5pbXBvcnQge1xuICBCdWlsdEV4cG9ydCwgQ29sbGVjdGVkQ29tcG9uZW50LCBDb2xsZWN0ZWRQYWdlLCBDb2xsZWN0ZWRSZXBvcnQsIEhFQURFUl9GT09URVJfTkFNRSwgS3BpRXhwb3J0SGVpZ2h0cywgVGV4dE92ZXJmbG93LFxuICBVbmRyYXduQ29tcG9uZW50LCBjb3ZlckxpbmVzLCBlbXB0eUxhYmVsLCBleHBvcnRDZWxsLCBleHBvcnROb3RlTGluZXMsIGV4cG9ydFRpdGxlLCBleHBvcnRXaW5kb3dzTGluZSwgaXNFbXB0eVRpbGUsXG4gIGtwaUNhcmRIYXNFeHRyYXMsIGtwaUV4cG9ydEhlaWdodCwga3BpRXhwb3J0UGFydHMsIGxpc3RDb2x1bW5zLCBsaXN0SGVhZGluZ3MsIGxpc3RUb3RhbHNSb3csIG1vcmVSb3dzTm90aWNlLFxuICBzY2FsZWRLcGlIZWlnaHRzLCB0ZXh0T3ZlcmZsb3csXG59IGZyb20gJy4vcmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBHcmlkRXhwb3J0Q2VsbCwgZ3JpZEV4cG9ydFRhYmxlIH0gZnJvbSAnLi9yZXBvcnQtZ3JpZC1leHBvcnQnO1xuaW1wb3J0IHsgUmVwb3J0VGV4dExheW91dFNlcnZpY2UsIFRleHRUYWJsZUxheW91dCB9IGZyb20gJy4vcmVwb3J0LXRleHQtbGF5b3V0LnNlcnZpY2UnO1xuXG5cbi8vIEluY2hlcyDihpIgcG9pbnRzICh0aGUgUERGIHVuaXQpLlxuY29uc3QgUFQgPSA3MjtcblxuLy8gQ29tcG9uZW50IHRpdGxlIHN0cmlwIGhlaWdodCwgcG9pbnRzLlxuY29uc3QgVElUTEVfSCA9IDE4O1xuXG4vLyBUaGUgc21hbGwgcHJpbnQgYSBjb21wb25lbnQgbWF5IGNhcnJ5LCBwb2ludHM6IHRoZSBkYXlzIGl0IHJlYWRzIHVuZGVyIGl0c1xuLy8gdGl0bGUgKGEgc3VidGl0bGUgbGluZSksIGl0cyBub3RlcyBhdCB0aGUgZm9vdCBvZiBpdHMgYm94IChhIGxpbmUgZWFjaCksIGFuZFxuLy8gdGhlIGxpbmVzIG9mIGEgS1BJIGNhcmQgdW5kZXIgaXRzIHZhbHVlLiBBIGNoYXJ0J3Mgb3IgYSBsaXN0J3Mgbm90ZXMgZ2l2ZVxuLy8gd2F5IGJlZm9yZSBpdHMgYm9keSB3b3VsZCBzaHJpbmsgdW5kZXIgTUlOX0JPRFlfSC5cbmNvbnN0IFNNQUxMX1NJWkUgPSA3LjU7XG5jb25zdCBTVUJUSVRMRV9IID0gMTE7XG5jb25zdCBOT1RFX0xJTkVfSCA9IDEwO1xuY29uc3QgTUlOX0JPRFlfSCA9IDQwO1xuY29uc3QgTVVURURfQ09MT1IgPSBgIyR7UkVQT1JUX01VVEVEX1RFWFRfQ09MT1J9YDtcblxuLy8gQSBLUEkgY2FyZCdzIHBhcnRzLCB0b3AgdG8gYm90dG9tLCBwb2ludHMgKGtwaUV4cG9ydFBhcnRzIHNoZWRzIHRoZVxuLy8gc3BhcmtsaW5lLCB0aGVuIHRoZSB0YXJnZXQsIHRoZW4gdGhlIG5vdGVzIG9uIGEgc2hvcnQgdGlsZSkuIFRoZSB2YWx1ZSdzXG4vLyBiYXNlbGluZSBzaXRzIEtQSV9WQUxVRV9CQVNFTElORSB1bmRlciBpdHMgdG9wLlxuY29uc3QgS1BJX0hFSUdIVFM6IEtwaUV4cG9ydEhlaWdodHMgPSB7XG4gIHZhbHVlOiAzMCxcbiAgbGFiZWw6IDEzLFxuICBkZWx0YTogMTMsXG4gIHdpbmRvdzogTk9URV9MSU5FX0gsXG4gIHRhcmdldDogTk9URV9MSU5FX0ggKyA2LFxuICBzcGFya2xpbmU6IDI4LFxuICBub3RlOiBOT1RFX0xJTkVfSCxcbn07XG5jb25zdCBLUElfVkFMVUVfQkFTRUxJTkUgPSAyMztcbmNvbnN0IEtQSV9ERUxUQV9TSVpFID0gOTtcbi8vIFRoZSBkZWx0YSdzIHRyaWFuZ2xlOiBpdHMgc2lkZSwgYW5kIHRoZSBnYXAgYmVmb3JlIHRoZSBjaGFuZ2UuXG5jb25zdCBLUElfQVJST1cgPSA2O1xuY29uc3QgS1BJX0FSUk9XX0dBUCA9IDM7XG4vLyBUaGUgdGFyZ2V0J3MgcHJvZ3Jlc3MgYmFyLCBhbmQgdGhlIHRyYWNrIGl0IGZpbGxzLlxuY29uc3QgS1BJX0JBUl9XID0gMTIwO1xuY29uc3QgS1BJX0JBUl9IID0gMztcbmNvbnN0IEtQSV9UUkFDS19DT0xPUiA9IGAjJHtSRVBPUlRfS1BJX1RSQUNLX0NPTE9SfWA7XG4vLyBUaGUgc3BhcmtsaW5lJ3Mgd2lkZXN0IGJveCwgaXRzIHRvcCBhbmQgYm90dG9tIGluc2V0LCBhbmQgaXRzIGRvdHMnIHJhZGl1cy5cbmNvbnN0IEtQSV9TUEFSS0xJTkVfVyA9IDE0MDtcbmNvbnN0IEtQSV9TUEFSS0xJTkVfSU5TRVQgPSAzO1xuY29uc3QgS1BJX0RPVF9SID0gMS41O1xuXG4vLyBSb3dzIGZldGNoZWQgZm9yIGEgbGlzdCdzIFBERiB0YWJsZS4gQSB0YWJsZSB0aGF0IG91dGdyb3dzIGl0cyBib3hcbi8vIGNvbnRpbnVlcyBvbnRvIHBhZ2VzIG9mIGl0cyBvd24sIHNvIHRoaXMgaXMgaG93IGZhciBpdCBtYXkgcnVuOiBhYm91dCAxMi0xNVxuLy8gY29udGludWF0aW9uIHBhZ2VzIG9uIGEgbGV0dGVyIHBhZ2UsIGFuZCBhIHRlbnRoIG9mIHRoZSBzZXJ2ZXIncyA1MDAwLXJvd1xuLy8gY2VpbGluZy4gQSBsb25nZXIgcmVzdWx0IGVuZHMgaW4gYSBtb3JlUm93c05vdGljZSgpIHJvdy5cbmV4cG9ydCBjb25zdCBQREZfTElTVF9ST1dTID0gNTAwO1xuXG4vLyBIb3cgZmFyIGEgY29udGludWF0aW9uIHRhYmxlIHNpdHMgaW5zaWRlIHRoZSBoZWFkZXIgYW5kIGZvb3RlciBiYW5kcyxcbi8vIHBvaW50cy4gQSBwYWdlIHdpdGggbm8gYmFuZCAob3Igd2l0aCB0aGUgbWFzdGVyIGhpZGRlbikga2VlcHNcbi8vIE5PX0JBTkRfTUFSR0lOIGZyb20gdGhhdCBlZGdlIGluc3RlYWQuXG5jb25zdCBDT05USU5VQVRJT05fR0FQID0gMC4yNSAqIFBUO1xuY29uc3QgTk9fQkFORF9NQVJHSU4gPSAwLjUgKiBQVDtcbmNvbnN0IE5PX0JBTkRTOiBSZXBvcnRIZWFkZXJGb290ZXIgPSB7IGhlYWRlckhlaWdodDogMCwgZm9vdGVySGVpZ2h0OiAwIH07XG5cbi8vIFRoZSBsYXN0IHJvdyBvZiBhIGxpc3QgYm94IHdob3NlIHJvd3MgY2Fycnkgb24gcGFzdCBpdC5cbmNvbnN0IENPTlRJTlVFRF9OT1RJQ0UgPSAnQ29udGludWVkIG9uIHRoZSBmb2xsb3dpbmcgcGFnZXMnO1xuXG4vLyBUaGUgbGFzdCByb3cgb2YgYSBsaXN0IGJveCB3aG9zZSByb3dzIGhhdmUgbm93aGVyZSB0byBnbzogaXRzIGhlYWRpbmcgYW5kXG4vLyB0b3RhbHMgcm93LCB3cmFwcGVkIHRhbGwgaW4gbmFycm93IGNvbHVtbnMsIGxlYXZlIGEgY29udGludWF0aW9uIHBhZ2Ugbm9cbi8vIHJvb20gZm9yIGEgcm93LlxuY29uc3QgTk9fUk9PTV9OT1RJQ0UgPSAnTm90IGVub3VnaCByb29tIGZvciB0aGlzIHRhYmxlIOKAlCBlbmxhcmdlIHRoZSB0aWxlJztcblxuLy8gQSBsaXN0J3Mgb3IgYSB0YWJsZSB0aWxlJ3MgdGFibGU6IGl0cyBmb250IHNpemUgYW5kIGNlbGwgcGFkZGluZywgcG9pbnRzLlxuY29uc3QgVEFCTEVfRk9OVF9TSVpFID0gODtcbmNvbnN0IFRBQkxFX0NFTExfUEFERElORyA9IDM7XG5cbi8vIFdoYXQgYSBjb21wb25lbnQncyBib3ggc2F5cyB3aGVuIGl0IGNvdWxkIG5vdCBiZSBkcmF3bi5cbmNvbnN0IFVORFJBV05fTk9URSA9ICdDb3VsZCBub3QgYmUgZHJhd24nO1xuXG4vLyBUaHJvd24gZnJvbSBhdXRvVGFibGUncyBwYWdlIGhvb2sgdG8gc3RvcCBhbiBvbi1wYWdlIHRhYmxlIGF0IHRoZSBmaXJzdCBwYWdlXG4vLyBpdCB3b3VsZCBhZGQgKF9kcmF3VGFibGUpLlxuY29uc3QgU1RSQVlfUEFHRSA9IG5ldyBFcnJvcignVGhlIHRhYmxlIHJhbiBwYXN0IGl0cyBwYWdlJyk7XG5cbi8vIEEgdGV4dCBsaW5lJ3MgaGVpZ2h0IGFzIGEgbXVsdGlwbGUgb2YgaXRzIGxhcmdlc3QgZm9udCBzaXplIOKAlCB0aGUgY2FudmFzXG4vLyBzdHlsZXNoZWV0J3MgbGluZS1oZWlnaHQsIHNvIGEgYmxvY2sgd3JhcHMgYW5kIHN0YWNrcyB0aGUgc2FtZSB3YXkuXG5jb25zdCBURVhUX0xJTkVfSEVJR0hUID0gMS4yNTtcblxuLy8gSG93IGZhciBhIGxpc3QgaXRlbSdzIHRleHQgc2l0cyBmcm9tIHRoZSBibG9jaydzIGVkZ2UsIHBvaW50czsgdGhlIG1hcmtlclxuLy8gaGFuZ3MgaW4gdGhhdCBzcGFjZS5cbmNvbnN0IExJU1RfSU5ERU5UID0gMTY7XG5cbi8vIFdoYXQgdGhlIGV4cG9ydCdzIG92ZXJmbG93IGdhdGUgc2F5cyB0aGUgUERGIGRvZXMgd2l0aCBhIHRleHQgYmxvY2sgdGhhdCBkb2VzXG4vLyBub3QgZml0IGl0cyBib3guXG5jb25zdCBQREZfT1ZFUkZMT1dfTk9URSA9ICdUaGUgUERGIGN1dHMgaXQgb2ZmIGF0IHRoZSBib3R0b20gb2YgaXRzIGJveC4nO1xuXG4vLyBXaGF0IGV2ZXJ5IGRyYXdpbmcgc3RlcCBvZiBvbmUgZXhwb3J0IHNoYXJlcywgYnVpbHQgb25jZSBpbiBidWlsZCgpLlxuLy8gU2l6ZXMgYXJlIHBvaW50cy5cbmludGVyZmFjZSBQZGZFeHBvcnRDb250ZXh0IHtcbiAgZG9jOiBhbnk7XG4gIGF1dG9UYWJsZTogYW55O1xuICAvLyBMYXlzIGEgdGFibGUgb3V0IHdpdGhvdXQgZHJhd2luZyBpdCwgZm9yIG1lYXN1cmluZyB3aGF0IGZpdHMuXG4gIGNyZWF0ZVRhYmxlOiBhbnk7XG4gIGpzUERGOiBhbnk7XG4gIHJlcG9ydDogUmVwb3J0O1xuICB0aW1lem9uZTogc3RyaW5nO1xuICBmb3JtYXRDb250ZXh0OiBSZXBvcnRGb3JtYXRDb250ZXh0O1xuICBwYWdlVzogbnVtYmVyO1xuICBwYWdlSDogbnVtYmVyO1xuICBvcmllbnRhdGlvbjogJ2xhbmRzY2FwZScgfCAncG9ydHJhaXQnO1xuICAvLyBXaGF0IHRoZSBoZWFkZXIgYW5kIGZvb3RlcidzIHZhbHVlIHRva2VucyBmaWxsIHdpdGgsIHRoZSBzYW1lIG9uIGV2ZXJ5XG4gIC8vIHBhZ2UsIGNvbnRpbnVhdGlvbiBwYWdlcyBpbmNsdWRlZCAoX3BkZlZhbHVlcykuXG4gIG1hc3RlclZhbHVlczogUmVjb3JkPHN0cmluZywgVGV4dFZhbHVlPjtcbiAgLy8gV2hhdCB0aGUge3tmaWx0ZXIuPGlkPn19IHRva2VucyBmaWxsIHdpdGgsIGV2ZXJ5IGdyb3VwJ3MsIHRoZSBzYW1lIG9uXG4gIC8vIGV2ZXJ5IHBhZ2U7IGEgcGFnZSByZWFkcyBpdHMgb3duIChsYXllckZpbHRlckZpZWxkcykuXG4gIGZpbHRlckZpZWxkczogUmVjb3JkPG51bWJlciwgVGV4dEZpbHRlckZpZWxkPjtcbiAgLy8gVGhlIG9uZXMgdGhlIGhlYWRlciBhbmQgZm9vdGVyIHJlYWQ6IG5vIHBhZ2UgZmlsdGVyJ3MuXG4gIG1hc3RlckZpbHRlcnM6IFJlY29yZDxudW1iZXIsIFRleHRGaWx0ZXJGaWVsZD47XG4gIC8vIFRoZSB0ZXh0IGJsb2NrcyBjdXQgb2ZmIGF0IHRoZSBib3R0b20gb2YgdGhlaXIgYm94LCBieSBjb21wb25lbnQgaWQsIHNvIGFcbiAgLy8gaGVhZGVyIG9yIGZvb3RlciBibG9jayBjdXQgb24gZXZlcnkgcGFnZSBpcyBsaXN0ZWQgb25jZS5cbiAgdGV4dE92ZXJmbG93czogTWFwPG51bWJlciwgVGV4dE92ZXJmbG93PjtcbiAgLy8gVGhlIGNvbXBvbmVudHMgdGhhdCBjb3VsZCBub3QgYmUgZHJhd24gKF9ndWFyZGVkKSwgYnkgY29tcG9uZW50IGlkLlxuICB1bmRyYXduOiBNYXA8bnVtYmVyLCBVbmRyYXduQ29tcG9uZW50Pjtcbn1cblxuLy8gQSB3b3JkIG9mIGEgd3JhcHBlZCBsaW5lIChfd3JhcCk6IGl0cyBydW4sIGl0cyB0ZXh0IHdpdGggYW55IHRyYWlsaW5nIHNwYWNlLFxuLy8gaXRzIGZvbnQgc2l6ZSBhbmQgaXRzIHdpZHRoLCBwb2ludHMuXG5pbnRlcmZhY2UgUGRmV29yZCB7XG4gIHJ1bjogVGV4dFJ1bjtcbiAgdGV4dDogc3RyaW5nO1xuICBzaXplOiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG59XG5cbi8vIFdoZXJlIGEgdGV4dCBibG9jaydzIHdvcmRzIGFyZSBkcmF3biwgcG9pbnRzOiB0aGUgbGVmdCBlZGdlIGFuZCB3aWR0aCB0aGV5XG4vLyB3cmFwIHRvLCB0aGUgdG9wIG9mIHRoZSBmaXJzdCBsaW5lLCBhbmQgdGhlIGJvdHRvbSBubyBsaW5lIG1heSBydW4gcGFzdC4gQVxuLy8gdGV4dCB0YWJsZSdzIGNlbGwgZHJhd3MgaXRzIHdvcmRzIHRoZSBzYW1lIHdheSwgaW5zaWRlIGl0cyBwYWRkaW5nLlxuaW50ZXJmYWNlIFBkZlRleHRCb3gge1xuICBsZWZ0OiBudW1iZXI7XG4gIHRvcDogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xuICBib3R0b206IG51bWJlcjtcbn1cblxuLy8gV2hlcmUgdGhlIG5leHQgcGFydCBvZiBhIHRleHQgYmxvY2sgc3RhcnRzLCBhbmQgd2hldGhlciB0aGUgcGFydCBqdXN0IGRyYXduXG4vLyB3YXMgY3V0IG9mZiBhdCB0aGUgYm90dG9tIG9mIGl0cyBib3guXG5pbnRlcmZhY2UgUGRmVGV4dEN1cnNvciB7XG4gIGN1cnNvclk6IG51bWJlcjtcbiAgY3V0OiBib29sZWFuO1xufVxuXG4vLyBBIHRleHQgdGFibGUncyBjZWxsIGFzIGF1dG9UYWJsZSB0YWtlcyBpdC4gSXQgcHJpbnRzIG5vIHRleHQgb2YgaXRzIG93bjogdGhlXG4vLyBjZWxsJ3Mgd29yZHMgKHRleHRDZWxsKSBhcmUgZHJhd24gaW50byBpdCBvbmNlIGl0cyBncmlkIGxpbmVzIGFuZCBmaWxsIGFyZVxuLy8gKF9kcmF3VGV4dENlbGwpLlxuaW50ZXJmYWNlIFBkZlRleHRDZWxsSW5wdXQge1xuICBjb250ZW50OiBzdHJpbmc7XG4gIGNvbFNwYW46IG51bWJlcjtcbiAgcm93U3BhbjogbnVtYmVyO1xuICB0ZXh0Q2VsbDogVGV4dFRhYmxlQ2VsbDtcbiAgc3R5bGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLy8gRml4ZWQgY29sdW1uIHdpZHRocywgYnkgY29sdW1uIGluZGV4LCBpbiBwb2ludHMsIGFuZCB0aGUgcmlnaHQgYWxpZ25tZW50IG9mXG4vLyBhIGNvbHVtbiBvZiBmb3JtYXR0ZWQgbnVtYmVycy5cbnR5cGUgUGRmQ29sdW1uU3R5bGVzID0gUmVjb3JkPG51bWJlciwgeyBjZWxsV2lkdGg6IG51bWJlcjsgaGFsaWduPzogJ3JpZ2h0JyB9PjtcblxuLy8gV2hhdCBfbWVhc3VyZSByZWFkcyBvZmYgYSBsaXN0J3MgbGFpZC1vdXQgdGFibGU6IGhvdyBtYW55IGJvZHkgcm93cyBpdHMgYm94XG4vLyBob2xkcywgdGhlIGNvbHVtbiB3aWR0aHMgZXZlcnkgcGFnZSBvZiBpdCBpcyBkcmF3biB3aXRoLCBhbmQgaG93IHRhbGwgYVxuLy8gcGFnZSdzIHRhYmxlIHNwYWNlIG11c3QgYmUgZm9yIGF1dG9UYWJsZSB0byBkcmF3IGEgcm93IGF0IGFsbDogdGhlIGhlYWRpbmcsXG4vLyB0aGUgdG90YWxzIHJvdyBhbmQgb25lIGxpbmUgb2YgYSByb3csIHBvaW50cy5cbmludGVyZmFjZSBQZGZUYWJsZU1lYXN1cmUge1xuICBmaXQ6IG51bWJlcjtcbiAgY29sdW1uU3R5bGVzOiBQZGZDb2x1bW5TdHlsZXM7XG4gIG1pbkhlaWdodDogbnVtYmVyO1xufVxuXG4vLyBBIHRhYmxlIGJvZHkgY2VsbDogcGxhaW4gdGV4dCwgb3IgYSBub3RpY2Ugcm93J3Mgb25lIGNlbGwgc3Bhbm5pbmcgZXZlcnlcbi8vIGNvbHVtbi5cbnR5cGUgUGRmVGFibGVDZWxsID0gc3RyaW5nIHwgeyBjb250ZW50OiBzdHJpbmc7IGNvbFNwYW4/OiBudW1iZXI7IHJvd1NwYW4/OiBudW1iZXI7IHN0eWxlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH07XG5cbi8vIEhvdyBmYXIgYSB0YWJsZSdzIGdyb3VwIGxhYmVsIHN0ZXBzIGluIHBlciBsZXZlbCwgcG9pbnRzLlxuY29uc3QgR1JJRF9JTkRFTlQgPSA4O1xuXG4vLyBXaGF0IGEgbGlzdCdzIG9yIGEgdGFibGUgdGlsZSdzIHRhYmxlIGRyYXdzOiBpdHMgaGVhZGluZyByb3dzLCBpdHMgYm9keVxuLy8gcm93cywgd2hpY2ggY29sdW1ucyBob2xkIGZvcm1hdHRlZCBudW1iZXJzLCBpdHMgdG90YWxzIHJvdyBhbmQgaG93IG1hbnlcbi8vIHJvd3MgaXRzIGZldGNoIGxlZnQgb3V0LlxuaW50ZXJmYWNlIFBkZlRhYmxlUGFydHMge1xuICBoZWFkOiBQZGZUYWJsZUNlbGxbXVtdO1xuICBjZWxsczogUGRmVGFibGVDZWxsW11bXTtcbiAgbnVtZXJpYzogYm9vbGVhbltdO1xuICBmb290OiBzdHJpbmdbXSB8IG51bGw7XG4gIG9taXR0ZWQ6IG51bWJlcjtcbn1cblxuLy8gVGhlIHJvd3Mgb2YgYSBsaXN0IHRoYXQgZGlkIG5vdCBmaXQgaXRzIGJveCwgY2FycmllZCBvbnRvIGNvbnRpbnVhdGlvblxuLy8gcGFnZXMgYWZ0ZXIgaXRzIHJlcG9ydCBwYWdlLiB4IGFuZCB3IGFyZSB0aGUgYm94J3MsIGluIHBvaW50cywgYW5kIHRoZVxuLy8gY29sdW1uIHdpZHRocyBhbmQgYWxpZ25tZW50cyBhcmUgdGhlIG9uZXMgdGhlIG9uLXBhZ2UgdGFibGUgd2FzIGRyYXduIHdpdGgsXG4vLyBzbyB0aGUgdGFibGUgcmVhZHMgYXMgb25lIGFjcm9zcyBwYWdlcy5cbmludGVyZmFjZSBQZGZUYWJsZU92ZXJmbG93IHtcbiAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQ7XG4gIC8vIFRoZSB0ZXh0IHRoZSBsaXN0IHdhcyBzZWFyY2hlZCBieSwgZm9yIHRoZSBjb250aW51YXRpb24gdGl0bGUuXG4gIHNlYXJjaD86IHN0cmluZztcbiAgLy8gVGhlIGNydW1icyBvZiBpdHMgZHJpbGwgcGF0aCwgZm9yIHRoZSBjb250aW51YXRpb24gdGl0bGUuXG4gIGNydW1icz86IHN0cmluZ1tdO1xuICAvLyBBIHRhYmxlIHdob3NlIGNvbHVtbiBmaWx0ZXJzIG5hcnJvd2VkIGl0LCBmb3IgdGhlIGNvbnRpbnVhdGlvbiB0aXRsZS5cbiAgZmlsdGVyZWQ/OiBib29sZWFuO1xuICAvLyBIZWFkaW5nIHJvd3MsIHRvcCBmaXJzdDsgYSBsaXN0IGhhcyBvbmUuXG4gIGhlYWQ6IFBkZlRhYmxlQ2VsbFtdW107XG4gIG51bWVyaWM6IGJvb2xlYW5bXTtcbiAgcm93czogUGRmVGFibGVDZWxsW11bXTtcbiAgb21pdHRlZDogbnVtYmVyO1xuICAvLyBUaGUgbGlzdCdzIHRvdGFscyByb3csIHdoaWNoIGNsb3NlcyB0aGUgbGFzdCBjb250aW51YXRpb24gcGFnZS5cbiAgZm9vdDogc3RyaW5nW10gfCBudWxsO1xuICB4OiBudW1iZXI7XG4gIHc6IG51bWJlcjtcbiAgY29sdW1uU3R5bGVzOiBQZGZDb2x1bW5TdHlsZXM7XG59XG5cbi8vIEJ1aWxkcyB0aGUgUERGIGNsaWVudC1zaWRlIHdpdGgganNwZGYuIFRoZSByZXBvcnQncyB1bml0IGlzIGluY2hlcyBhbmQgUERGc1xuLy8gYXJlIHBvaW50cyBhdCBleGFjdGx5IDcyL2luY2gsIHNvIGVhY2ggcmVwb3J0IHBhZ2UgYmVjb21lcyBvbmUgUERGIHBhZ2Ugb2Zcbi8vIHRoZSBleGFjdCBwaHlzaWNhbCBzaXplIGFuZCBjb21wb25lbnRzIGxhbmQgYXQgdGhlaXIgcHJlY2lzZSBwb3NpdGlvbnMuXG4vLyBDaGFydHMgYXJlIHJlbmRlcmVkIHRocm91Z2ggYW4gb2Zmc2NyZWVuIEVDaGFydHMgaW5zdGFuY2UgYXQgM8OXIHBpeGVsXG4vLyByYXRpbyDigJQgcGl4ZWwtaWRlbnRpY2FsIHRvIHRoZSBzY3JlZW4sIGNyaXNwIGF0IHByaW50IHNpemUg4oCUIGFuZCB0YWJsZXMgYXJlXG4vLyBkcmF3biB3aXRoIGpzcGRmLWF1dG90YWJsZS4gQm90aCBsaWJyYXJpZXMgbG9hZCBsYXppbHkgaW50byB0aGVpciBvd24gY2h1bmtzLlxuLy9cbi8vIEEgbGlzdCB0YWJsZSBpcyBmaXR0ZWQgdG8gaXRzIGJveCBieSBsYXlpbmcgaXQgb3V0IGZpcnN0LCBuZXZlciBieSBhXG4vLyByb3ctaGVpZ2h0IGVzdGltYXRlLCBzbyBpdCBjYW5ub3Qgc3BpbGwgcGFzdCB0aGUgYm94LiBUaGUgcm93cyB0aGF0IGRvIG5vdFxuLy8gZml0IGNvbnRpbnVlIG9uIHBhZ2VzIG9mIHRoZWlyIG93biBhZnRlciB0aGUgcmVwb3J0IHBhZ2UsIHVuZGVyIHRoZSBzYW1lXG4vLyBoZWFkZXIvZm9vdGVyIGFuZCB3aXRoIHRoZSBzYW1lIGNvbHVtbiB3aWR0aHMsIHVwIHRvIFBERl9MSVNUX1JPV1M7IGFcbi8vIGxvbmdlciByZXN1bHQgZW5kcyBpbiBhIHJvdyBwb2ludGluZyB0byB0aGUgY29tcG9uZW50J3MgQ1NWIGV4cG9ydC4gQVxuLy8gdGFibGUgd2hvc2UgaGVhZGluZyBhbmQgdG90YWxzIHJvdyBsZWF2ZSBhIGNvbnRpbnVhdGlvbiBwYWdlIG5vIHJvb20gZm9yIGFcbi8vIHJvdyBzdG9wcyBhdCBpdHMgYm94IHdpdGggYSBub3RpY2UgaW5zdGVhZDogYXV0b1RhYmxlIHdvdWxkIGFkZCBwYWdlc1xuLy8gd2l0aG91dCBlbmQgdHJ5aW5nIHRvIHBsYWNlIGl0LlxuLy9cbi8vIEEgY29tcG9uZW50IHRoYXQgZmFpbHMgdG8gZHJhdyBpcyBtYXJrZWQgaW4gaXRzIGJveCBhbmQgdGhlIGZpbGUgZ29lcyBvblxuLy8gKF9ndWFyZGVkKTsgYnVpbGQoKSBoYW5kcyBiYWNrIHRoZSBvbmVzIHRoYXQgZGlkLCBhcyBpdCBkb2VzIHRoZSB0ZXh0IGl0XG4vLyBjdXQuXG4vL1xuLy8gQSB0ZXh0IGJsb2NrJ3MgdGFibGVzIGFyZSBkcmF3biBieSBhdXRvVGFibGUgdG9vLCBmcm9tIHRoZSBsaW5lIGl0cyB3b3Jkc1xuLy8gcmVhY2gsIGluIHRoZSBjb2x1bW4gd2lkdGhzIHRoZSBjYW52YXMgZ2l2ZXMgdGhlbSAoUmVwb3J0VGV4dExheW91dFNlcnZpY2UpLlxuLy8gQSB0ZXh0IGJsb2NrIGlzIGN1dCBhdCB0aGUgYm90dG9tIG9mIGl0cyBib3gsIGFzIHRoZSBjYW52YXMgY2xpcHMgaXQsIGFuZFxuLy8gYnVpbGQoKSBoYW5kcyB0aGUgZmlsZSBiYWNrIHVuc2F2ZWQgd2l0aCB0aGUgYmxvY2tzIGl0IGN1dCwgc28gdGhlIGV4cG9ydFxuLy8gY2FuIGFzayBhYm91dCB0aGVtIGJlZm9yZSBpdCBzYXZlcy5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBSZXBvcnRQZGZTZXJ2aWNlIHtcblxuICBwcml2YXRlIHJlYWRvbmx5IF90ZXh0TGF5b3V0ID0gaW5qZWN0KFJlcG9ydFRleHRMYXlvdXRTZXJ2aWNlKTtcblxuICBwdWJsaWMgYXN5bmMgYnVpbGQoY29sbGVjdGVkOiBDb2xsZWN0ZWRSZXBvcnQpOiBQcm9taXNlPEJ1aWx0RXhwb3J0PiB7XG4gICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHRoaXMuX2NvbnRleHQoY29sbGVjdGVkKTtcblxuICAgIHRoaXMuX3RpdGxlUGFnZShjb250ZXh0LmRvYywgY29sbGVjdGVkLCBjb250ZXh0LnBhZ2VXLCBjb250ZXh0LnBhZ2VIKTtcblxuICAgIC8vIFRoZSBwaHlzaWNhbCBwYWdlIG51bWJlciB7e3BhZ2UubnVtYmVyfX0gcHJpbnRzOiByZXBvcnQgcGFnZXMgYW5kXG4gICAgLy8gdGhlaXIgY29udGludWF0aW9uIHBhZ2VzIGFsaWtlLCB0aGUgdGl0bGUgcGFnZSBub3QgY291bnRlZC5cbiAgICBsZXQgcGFnZU51bWJlciA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgY29sbGVjdGVkUGFnZV0gb2YgY29sbGVjdGVkLnBhZ2VzLmVudHJpZXMoKSkge1xuICAgICAgY29uc3Qgb3ZlcmZsb3dzOiBQZGZUYWJsZU92ZXJmbG93W10gPSBbXTtcbiAgICAgIHBhZ2VOdW1iZXIgKz0gMTtcblxuICAgICAgYXdhaXQgdGhpcy5fcmVuZGVyUGFnZShjb250ZXh0LCBjb2xsZWN0ZWRQYWdlLCBpbmRleCwgcGFnZU51bWJlciwgb3ZlcmZsb3dzKTtcblxuICAgICAgLy8gRWFjaCBjb250aW51YXRpb24gYXBwZW5kcyBpdHMgcGFnZXMgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQsIHNvXG4gICAgICAvLyB0d28gbGlzdHMgdGhhdCBvdmVyZmxvd2VkIG9uIG9uZSBwYWdlIGZvbGxvdyBpdCBiYWNrIHRvIGJhY2suXG4gICAgICBmb3IgKGNvbnN0IG92ZXJmbG93IG9mIG92ZXJmbG93cykge1xuICAgICAgICBjb25zdCB0b2tlbnMgPSB0aGlzLl90b2tlbnMoY29udGV4dCwgY29sbGVjdGVkUGFnZS5wYWdlLCBpbmRleCwgcGFnZU51bWJlciArIDEpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuX2d1YXJkZWQoY29udGV4dCwgb3ZlcmZsb3cuY29tcG9uZW50LCB0b2tlbnMucGFnZU5hbWUsIHRva2VucywgZmFsc2UsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBwYWdlTnVtYmVyID0gYXdhaXQgdGhpcy5fcmVuZGVyQ29udGludWF0aW9uKGNvbnRleHQsIGNvbGxlY3RlZFBhZ2UucGFnZSwgaW5kZXgsIHBhZ2VOdW1iZXIsIG92ZXJmbG93KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG92ZXJmbG93czogWy4uLmNvbnRleHQudGV4dE92ZXJmbG93cy52YWx1ZXMoKV0sXG4gICAgICBvdmVyZmxvd05vdGU6IFBERl9PVkVSRkxPV19OT1RFLFxuICAgICAgdW5kcmF3bjogWy4uLmNvbnRleHQudW5kcmF3bi52YWx1ZXMoKV0sXG4gICAgICBzYXZlOiAoKSA9PiB7XG4gICAgICAgIGNvbnRleHQuZG9jLnNhdmUoYCR7dGhpcy5fc2x1Zyhjb2xsZWN0ZWQucmVwb3J0Lm5hbWUpfS5wZGZgKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2NvbnRleHQoY29sbGVjdGVkOiBDb2xsZWN0ZWRSZXBvcnQpOiBQcm9taXNlPFBkZkV4cG9ydENvbnRleHQ+IHtcbiAgICBjb25zdCByZXBvcnQgPSBjb2xsZWN0ZWQucmVwb3J0O1xuICAgIGNvbnN0IHsganNQREYgfSA9IGF3YWl0IGltcG9ydCgnanNwZGYnKTtcbiAgICBjb25zdCB7IGRlZmF1bHQ6IGF1dG9UYWJsZSwgX19jcmVhdGVUYWJsZTogY3JlYXRlVGFibGUgfSA9IGF3YWl0IGltcG9ydCgnanNwZGYtYXV0b3RhYmxlJyk7XG5cbiAgICBjb25zdCBwYWdlVyA9IHJlcG9ydC5wYWdlV2lkdGggKiBQVDtcbiAgICBjb25zdCBwYWdlSCA9IHJlcG9ydC5wYWdlSGVpZ2h0ICogUFQ7XG4gICAgY29uc3Qgb3JpZW50YXRpb24gPSBwYWdlVyA+PSBwYWdlSCA/ICdsYW5kc2NhcGUnIDogJ3BvcnRyYWl0JztcblxuICAgIHJldHVybiB7XG4gICAgICBkb2M6IG5ldyBqc1BERih7IG9yaWVudGF0aW9uLCB1bml0OiAncHQnLCBmb3JtYXQ6IFtwYWdlVywgcGFnZUhdIH0pLFxuICAgICAgYXV0b1RhYmxlLFxuICAgICAgY3JlYXRlVGFibGUsXG4gICAgICBqc1BERixcbiAgICAgIHJlcG9ydCxcbiAgICAgIHRpbWV6b25lOiByZXNvbHZlUmVwb3J0VGltZXpvbmUocmVwb3J0KSxcbiAgICAgIGZvcm1hdENvbnRleHQ6IGNvbGxlY3RlZC5mb3JtYXRDb250ZXh0LFxuICAgICAgcGFnZVcsXG4gICAgICBwYWdlSCxcbiAgICAgIG9yaWVudGF0aW9uLFxuICAgICAgbWFzdGVyVmFsdWVzOiB0aGlzLl9wZGZWYWx1ZXMoY29sbGVjdGVkLm1hc3RlclZhbHVlcyksXG4gICAgICBmaWx0ZXJGaWVsZHM6IGNvbGxlY3RlZC5maWx0ZXJGaWVsZHMsXG4gICAgICBtYXN0ZXJGaWx0ZXJzOiBsYXllckZpbHRlckZpZWxkcyhjb2xsZWN0ZWQuZmlsdGVyRmllbGRzLCByZXBvcnQuZmlsdGVyR3JvdXBzID8/IFtdLCBudWxsKSxcbiAgICAgIHRleHRPdmVyZmxvd3M6IG5ldyBNYXAoKSxcbiAgICAgIHVuZHJhd246IG5ldyBNYXAoKSxcbiAgICB9O1xuICB9XG5cbiAgLy8gT25lIHJlcG9ydCBwYWdlOiB0aGUgaGVhZGVyIGFuZCBmb290ZXIgZmlyc3QsIHVuZGVyIHRoZSBwYWdlJ3Mgb3duXG4gIC8vIGNvbXBvbmVudHMuIEEgbGlzdCB0aGF0IG91dGdyb3dzIGl0cyBib3ggbGVhdmVzIGl0cyByZW1haW5pbmcgcm93cyBpblxuICAvLyBvdmVyZmxvd3MuIFRoZSBwYWdlJ3MgdGV4dCBmaWxscyBpdHMgdmFsdWUgdG9rZW5zIHdpdGggdGhlIHBhZ2UncyB2YWx1ZXMuXG4gIHByaXZhdGUgYXN5bmMgX3JlbmRlclBhZ2UoXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBjb2xsZWN0ZWRQYWdlOiBDb2xsZWN0ZWRQYWdlLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgcGFnZU51bWJlcjogbnVtYmVyLFxuICAgIG92ZXJmbG93czogUGRmVGFibGVPdmVyZmxvd1tdLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGRvYyB9ID0gY29udGV4dDtcbiAgICBjb25zdCB0b2tlbnMgPSB0aGlzLl90b2tlbnMoY29udGV4dCwgY29sbGVjdGVkUGFnZS5wYWdlLCBpbmRleCwgcGFnZU51bWJlcik7XG4gICAgY29uc3QgcGFnZVRva2VucyA9IHsgLi4udG9rZW5zLCB2YWx1ZXM6IHRoaXMuX3BkZlZhbHVlcyhjb2xsZWN0ZWRQYWdlLnZhbHVlcykgfTtcblxuICAgIGRvYy5hZGRQYWdlKFtjb250ZXh0LnBhZ2VXLCBjb250ZXh0LnBhZ2VIXSwgY29udGV4dC5vcmllbnRhdGlvbik7XG4gICAgYXdhaXQgdGhpcy5fcmVuZGVyTWFzdGVyKGNvbnRleHQsIGNvbGxlY3RlZFBhZ2UucGFnZSwgdG9rZW5zKTtcblxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBjb2xsZWN0ZWRQYWdlLmNvbXBvbmVudHMpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2d1YXJkZWQoY29udGV4dCwgaXRlbS5jb21wb25lbnQsIHRva2Vucy5wYWdlTmFtZSwgcGFnZVRva2VucywgdHJ1ZSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5jb21wb25lbnQudHlwZSAhPT0gJ3RleHQnKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fcmVuZGVyQ29tcG9uZW50KGNvbnRleHQsIGNvbGxlY3RlZFBhZ2UucGFnZSwgaXRlbSwgdG9rZW5zLCBvdmVyZmxvd3MpO1xuICAgICAgICB9IGVsc2UgaWYgKGF3YWl0IHRoaXMuX3JlbmRlclRleHQoY29udGV4dCwgaXRlbS5jb21wb25lbnQsIHBhZ2VUb2tlbnMpKSB7XG4gICAgICAgICAgdGhpcy5fcmVjb3JkT3ZlcmZsb3coY29udGV4dCwgaXRlbS5jb21wb25lbnQsIHRva2Vucy5wYWdlTmFtZSwgcGFnZVRva2Vucyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIERyYXdzIG9uZSBjb21wb25lbnQsIG9yIG9uZSBsaXN0J3MgY29udGludWF0aW9uIHBhZ2VzLCBzbyB0aGF0IHdoYXRldmVyXG4gIC8vIGdvZXMgd3Jvbmcgc3RheXMgd2l0aCBpdDogYSBkcmF3IHRoYXQgdGhyb3dzIGxvc2VzIHRoZSBwYWdlcyBpdCBhZGRlZCwgaXRzXG4gIC8vIGJveCBvbiB0aGUgcGFnZSAoYm94ZWQpIGlzIGJsYW5rZWQgdW5kZXIgVU5EUkFXTl9OT1RFLCBhbmQgdGhlIGV4cG9ydCdzXG4gIC8vIGdhdGUgbmFtZXMgaXQgdW5kZXIgcGFnZS4gT25lIGNvbXBvbmVudCBjYW4gdGhlbiBuZXZlciBzdG9wIHRoZSBmaWxlLlxuICBwcml2YXRlIGFzeW5jIF9ndWFyZGVkKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsXG4gICAgcGFnZTogc3RyaW5nLFxuICAgIHRva2VuczogVGV4dFRva2VuQ29udGV4dCxcbiAgICBib3hlZDogYm9vbGVhbixcbiAgICBkcmF3OiAoKSA9PiBQcm9taXNlPHZvaWQ+LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGRvYyB9ID0gY29udGV4dDtcbiAgICBjb25zdCBjdXJyZW50ID0gZG9jLmdldEN1cnJlbnRQYWdlSW5mbygpLnBhZ2VOdW1iZXI7XG4gICAgY29uc3QgcGFnZXMgPSBkb2MuZ2V0TnVtYmVyT2ZQYWdlcygpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGRyYXcoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gVGhlIGZpbGUgb25seSBzYXlzIHRoZSBib3ggY291bGQgbm90IGJlIGRyYXduOyB0aGUgY29uc29sZSBrZWVwcyB3aHkuXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcblxuICAgICAgd2hpbGUgKGRvYy5nZXROdW1iZXJPZlBhZ2VzKCkgPiBwYWdlcykge1xuICAgICAgICBkb2MuZGVsZXRlUGFnZShkb2MuZ2V0TnVtYmVyT2ZQYWdlcygpKTtcbiAgICAgIH1cblxuICAgICAgZG9jLnNldFBhZ2UoY3VycmVudCk7XG5cbiAgICAgIGlmIChib3hlZCkge1xuICAgICAgICB0aGlzLl91bmRyYXduQm94KGRvYywgY29tcG9uZW50KTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFjb250ZXh0LnVuZHJhd24uaGFzKGNvbXBvbmVudC5pZCkpIHtcbiAgICAgICAgY29udGV4dC51bmRyYXduLnNldChjb21wb25lbnQuaWQsIHtcbiAgICAgICAgICBjb21wb25lbnRJZDogY29tcG9uZW50LmlkLFxuICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgbmFtZTogY29tcG9uZW50LnR5cGUgPT09ICd0ZXh0J1xuICAgICAgICAgICAgPyB0ZXh0T3ZlcmZsb3coY29tcG9uZW50LCBwYWdlLCB0b2tlbnMpLnNuaXBwZXRcbiAgICAgICAgICAgIDogZXhwb3J0VGl0bGUoY29tcG9uZW50LCB0b2tlbnMpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBBIGNvbXBvbmVudCdzIGJveCBibGFua2VkIHVuZGVyIFVORFJBV05fTk9URSwgb3ZlciB3aGF0ZXZlciBvZiBpdCB3YXNcbiAgLy8gZHJhd24gYmVmb3JlIGl0IGZhaWxlZC5cbiAgcHJpdmF0ZSBfdW5kcmF3bkJveChkb2M6IGFueSwgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiB2b2lkIHtcbiAgICBjb25zdCB4ID0gY29tcG9uZW50LnggKiBQVDtcbiAgICBjb25zdCB5ID0gY29tcG9uZW50LnkgKiBQVDtcbiAgICBjb25zdCB3ID0gY29tcG9uZW50LncgKiBQVDtcbiAgICBjb25zdCBoID0gY29tcG9uZW50LmggKiBQVDtcblxuICAgIGRvYy5zZXRGaWxsQ29sb3IoJyNmZmZmZmYnKTtcbiAgICBkb2MucmVjdCh4LCB5LCB3LCBoLCAnRicpO1xuICAgIHRoaXMuX2JveE5vdGUoZG9jLCBVTkRSQVdOX05PVEUsIHgsIHksIHcsIGgpO1xuICB9XG5cbiAgLy8gVGhlIGhlYWRlciBhbmQgZm9vdGVyLCB0aGVpciB2YWx1ZSB0b2tlbnMgZmlsbGVkIHdpdGggdGhlIG1hc3RlcidzIHZhbHVlc1xuICAvLyB3aGljaGV2ZXIgcGFnZSB0aGV5IHNpdCBvbjogYSByZXBvcnQgcGFnZSBvciBhIGNvbnRpbnVhdGlvbiBwYWdlLiBUaGV5XG4gIC8vIHJlYWQgbm8gcGFnZSBmaWx0ZXI6IGl0cyB0b2tlbiBwcmludHMgdGhlIGVtIGRhc2ggdGhlcmUuXG4gIHByaXZhdGUgYXN5bmMgX3JlbmRlck1hc3Rlcihjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LCBwYWdlOiBSZXBvcnRQYWdlLCB0b2tlbnM6IFRleHRUb2tlbkNvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocGFnZS5tYXN0ZXJIaWRkZW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtYXN0ZXJUb2tlbnMgPSB7IC4uLnRva2VucywgdmFsdWVzOiBjb250ZXh0Lm1hc3RlclZhbHVlcywgZmlsdGVyczogY29udGV4dC5tYXN0ZXJGaWx0ZXJzIH07XG5cbiAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiAoY29udGV4dC5yZXBvcnQubWFzdGVyPy5jb21wb25lbnRzID8/IFtdKS5maWx0ZXIoaXNEcmF3bikpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2d1YXJkZWQoY29udGV4dCwgY29tcG9uZW50LCBIRUFERVJfRk9PVEVSX05BTUUsIG1hc3RlclRva2VucywgdHJ1ZSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoYXdhaXQgdGhpcy5fcmVuZGVyVGV4dChjb250ZXh0LCBjb21wb25lbnQsIG1hc3RlclRva2VucykpIHtcbiAgICAgICAgICB0aGlzLl9yZWNvcmRPdmVyZmxvdyhjb250ZXh0LCBjb21wb25lbnQsIEhFQURFUl9GT09URVJfTkFNRSwgbWFzdGVyVG9rZW5zKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gTGlzdHMgYSB0ZXh0IGJsb2NrIHRoYXQgd2FzIGN1dCwgdW5kZXIgdGhlIHBhZ2UgdGhlIGV4cG9ydCdzIG92ZXJmbG93IGdhdGVcbiAgLy8gbmFtZXMgaXQgYnkuIEEgYmxvY2sgY3V0IGFnYWluIG9uIGEgbGF0ZXIgcGFnZSAoYSBoZWFkZXIgb3IgZm9vdGVyKSBrZWVwc1xuICAvLyB0aGUgZmlyc3QgZW50cnkuXG4gIHByaXZhdGUgX3JlY29yZE92ZXJmbG93KFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsXG4gICAgcGFnZTogc3RyaW5nLFxuICAgIHRva2VuczogVGV4dFRva2VuQ29udGV4dCxcbiAgKTogdm9pZCB7XG4gICAgaWYgKCFjb250ZXh0LnRleHRPdmVyZmxvd3MuaGFzKGNvbXBvbmVudC5pZCkpIHtcbiAgICAgIGNvbnRleHQudGV4dE92ZXJmbG93cy5zZXQoY29tcG9uZW50LmlkLCB0ZXh0T3ZlcmZsb3coY29tcG9uZW50LCBwYWdlLCB0b2tlbnMpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF90aXRsZVBhZ2UoZG9jOiBhbnksIGNvbGxlY3RlZDogQ29sbGVjdGVkUmVwb3J0LCBwYWdlVzogbnVtYmVyLCBwYWdlSDogbnVtYmVyKTogdm9pZCB7XG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XG4gICAgZG9jLnNldEZvbnRTaXplKDI4KTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKCcjMWYyOTMzJyk7XG4gICAgZG9jLnRleHQoY29sbGVjdGVkLnJlcG9ydC5uYW1lLCA0MCwgcGFnZUggKiAwLjM1KTtcblxuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnbm9ybWFsJyk7XG4gICAgZG9jLnNldEZvbnRTaXplKDExKTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKCcjNTI2MDZkJyk7XG5cbiAgICBkb2MudGV4dChjb3ZlckxpbmVzKGNvbGxlY3RlZCkubWFwKChsaW5lKSA9PiB0aGlzLl9wZGZUZXh0KGxpbmUpKSwgNDAsIHBhZ2VIICogMC4zNSArIDI2KTtcbiAgfVxuXG4gIC8vIEEgdGV4dCBibG9jaywgbGFpZCBvdXQgYnkgaGFuZDoganNQREYgZHJhd3Mgc3RyaW5ncywgbm90IHJpY2ggdGV4dCwgc28gdGhlXG4gIC8vIHdvcmRzIGJldHdlZW4gaXRzIHRhYmxlcyBhcmUgZHJhd24gbGluZSBieSBsaW5lIChfZHJhd1BhcmFncmFwaHMpIGFuZCBlYWNoXG4gIC8vIHRhYmxlIGJ5IGF1dG9UYWJsZSBmcm9tIHRoZSBsaW5lIHRoZSB3b3JkcyBhYm92ZSBpdCByZWFjaFxuICAvLyAoX2RyYXdUZXh0VGFibGUpLiBPbmx5IGEgYmxvY2sgd2l0aCBhIHRhYmxlIGlzIG1lYXN1cmVkLCBmb3IgdGhlIGVkZ2VzXG4gIC8vIGFuZCBjb2x1bW4gd2lkdGhzIHRoZSBjYW52YXMgZ2l2ZXMgaXRzIHRhYmxlcy4gV2hhdGV2ZXIgcnVucyBwYXN0XG4gIC8vIHRoZSBibG9jaydzIGhlaWdodCBpcyBsZWZ0IG9mZiDigJQgdGhlIGNhbnZhcyBjbGlwcyB0aGUgYmxvY2sgdGhlcmUgdG9vLlxuICAvLyBSZXR1cm5zIHdoZXRoZXIgYW55dGhpbmcgd2FzLlxuICBwcml2YXRlIGFzeW5jIF9yZW5kZXJUZXh0KFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsXG4gICAgdG9rZW5zOiBUZXh0VG9rZW5Db250ZXh0LFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBib3ggPSB0aGlzLl90ZXh0Qm94KGNvbXBvbmVudCk7XG4gICAgY29uc3QgYmxvY2tzID0gdGV4dEJsb2Nrcyhjb21wb25lbnQuY29uZmlnPy5odG1sID8/ICcnLCB0b2tlbnMpO1xuICAgIGNvbnN0IGxheW91dCA9IGJsb2Nrcy5zb21lKChibG9jaykgPT4gYmxvY2sua2luZCA9PT0gJ3RhYmxlJylcbiAgICAgID8gYXdhaXQgdGhpcy5fdGV4dExheW91dC5tZWFzdXJlKGNvbXBvbmVudCwgdG9rZW5zKVxuICAgICAgOiBudWxsO1xuICAgIGxldCBjdXJzb3JZID0gYm94LnRvcDtcbiAgICBsZXQgdGFibGVJbmRleCA9IDA7XG4gICAgLy8gVGhlIGN1cnNvciBzaXRzIG9uIGEgdGFibGUncyBib3R0b20gbWFyZ2luLCBub3RoaW5nIGRyYXduIHNpbmNlOiB0aGVcbiAgICAvLyBuZXh0IHRhYmxlJ3MgdG9wIG1hcmdpbiBpcyB0aGUgc2FtZSBzcGFjZSwgYXMgdHdvIGJsb2NrIG1hcmdpbnMgdGhhdFxuICAgIC8vIG1lZXQgY29sbGFwc2UgaW50byBvbmUgb24gdGhlIGNhbnZhcy5cbiAgICBsZXQgb25NYXJnaW4gPSBmYWxzZTtcblxuICAgIGZvciAoY29uc3QgYmxvY2sgb2YgYmxvY2tzKSB7XG4gICAgICBjb25zdCBkcmF3biA9IGJsb2NrLmtpbmQgPT09ICd0ZXh0J1xuICAgICAgICA/IHRoaXMuX2RyYXdQYXJhZ3JhcGhzKGNvbnRleHQuZG9jLCBibG9jay5wYXJhZ3JhcGhzLCBib3gsIGN1cnNvclkpXG4gICAgICAgIDogdGhpcy5fZHJhd1RleHRUYWJsZShcbiAgICAgICAgICBjb250ZXh0LCBibG9jay50YWJsZSwgbGF5b3V0Py50YWJsZXNbdGFibGVJbmRleCsrXSA/PyBudWxsLCBib3gsXG4gICAgICAgICAgb25NYXJnaW4gPyBjdXJzb3JZIDogY3Vyc29yWSArIFRFWFRfVEFCTEVfTUFSR0lOLFxuICAgICAgICApO1xuXG4gICAgICBpZiAoZHJhd24uY3V0KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBjdXJzb3JZID0gZHJhd24uY3Vyc29yWTtcbiAgICAgIG9uTWFyZ2luID0gYmxvY2sua2luZCA9PT0gJ3RhYmxlJyB8fCAob25NYXJnaW4gJiYgIWJsb2NrLnBhcmFncmFwaHMubGVuZ3RoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBXaGVyZSBhIHRleHQgYmxvY2sncyB3b3JkcyBnbzogaW5zaWRlIGl0cyBwYWRkaW5nLCBlYWNoIGVkZ2UgMS84XCIgdW5sZXNzXG4gIC8vIHNldC5cbiAgcHJpdmF0ZSBfdGV4dEJveChjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IFBkZlRleHRCb3gge1xuICAgIGNvbnN0IHBhZGRpbmcgPSBjb21wb25lbnQuY29uZmlnPy5wYWRkaW5nO1xuICAgIGNvbnN0IGluc2V0ID0gKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpID0+ICh2YWx1ZSA/PyBERUZBVUxUX0NPTVBPTkVOVF9QQURESU5HKSAqIFBUO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxlZnQ6IGNvbXBvbmVudC54ICogUFQgKyBpbnNldChwYWRkaW5nPy5sZWZ0KSxcbiAgICAgIHRvcDogY29tcG9uZW50LnkgKiBQVCArIGluc2V0KHBhZGRpbmc/LnRvcCksXG4gICAgICB3aWR0aDogY29tcG9uZW50LncgKiBQVCAtIGluc2V0KHBhZGRpbmc/LmxlZnQpIC0gaW5zZXQocGFkZGluZz8ucmlnaHQpLFxuICAgICAgYm90dG9tOiAoY29tcG9uZW50LnkgKyBjb21wb25lbnQuaCkgKiBQVCAtIGluc2V0KHBhZGRpbmc/LmJvdHRvbSksXG4gICAgfTtcbiAgfVxuXG4gIC8vIFBhcmFncmFwaHMgZHJhd24gbGluZSBieSBsaW5lIGZyb20gY3Vyc29yWSBkb3duOiBlYWNoIG9uZSdzIHJ1bnMgYXJlIGJyb2tlblxuICAvLyBpbnRvIHdvcmRzLCB3cmFwcGVkIHRvIHRoZSBib3gncyB3aWR0aCBhbmQgZHJhd24gd29yZCBieSB3b3JkIGluIHRoZWlyIG93blxuICAvLyBmb250LCBzaXplIGFuZCBjb2xvciwgYSBsaXN0IGl0ZW0ncyBtYXJrZXIgaHVuZyBpbiBpdHMgaW5kZW50LiBUaGUgZmlyc3RcbiAgLy8gbGluZSB0aGF0IHdvdWxkIHJ1biBwYXN0IHRoZSBib3gncyBib3R0b20gZW5kcyB0aGUgZHJhd2luZywgY3V0LlxuICBwcml2YXRlIF9kcmF3UGFyYWdyYXBocyhkb2M6IGFueSwgcGFyYWdyYXBoczogVGV4dFBhcmFncmFwaFtdLCBib3g6IFBkZlRleHRCb3gsIGN1cnNvclk6IG51bWJlcik6IFBkZlRleHRDdXJzb3Ige1xuICAgIGxldCB5ID0gY3Vyc29yWTtcbiAgICBsZXQgbGlzdE51bWJlciA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IHBhcmFncmFwaCBvZiBwYXJhZ3JhcGhzKSB7XG4gICAgICBsaXN0TnVtYmVyID0gcGFyYWdyYXBoLmJ1bGxldCA9PT0gJ251bWJlcicgPyBsaXN0TnVtYmVyICsgMSA6IDA7XG4gICAgICBjb25zdCBpbmRlbnQgPSBwYXJhZ3JhcGguYnVsbGV0ID8gTElTVF9JTkRFTlQgOiAwO1xuICAgICAgY29uc3QgbGluZXMgPSB0aGlzLl93cmFwKGRvYywgcGFyYWdyYXBoLCBib3gud2lkdGggLSBpbmRlbnQpO1xuXG4gICAgICBmb3IgKGNvbnN0IFtsaW5lSW5kZXgsIGxpbmVdIG9mIGxpbmVzLmVudHJpZXMoKSkge1xuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5fbGluZVNpemUocGFyYWdyYXBoLCBsaW5lKTtcbiAgICAgICAgaWYgKHkgKyBzaXplICogVEVYVF9MSU5FX0hFSUdIVCA+IGJveC5ib3R0b20gKyAwLjUpIHtcbiAgICAgICAgICByZXR1cm4geyBjdXJzb3JZOiB5LCBjdXQ6IHRydWUgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaW5lSW5kZXggPT09IDAgJiYgcGFyYWdyYXBoLmJ1bGxldCkge1xuICAgICAgICAgIHRoaXMuX2ZvbnQoZG9jLCBsaW5lWzBdPy5ydW4gPz8geyB0ZXh0OiAnJyB9LCBzaXplKTtcbiAgICAgICAgICBkb2MudGV4dChwYXJhZ3JhcGguYnVsbGV0ID09PSAnbnVtYmVyJyA/IGAke2xpc3ROdW1iZXJ9LmAgOiAn4oCiJywgYm94LmxlZnQsIHkgKyBzaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2RyYXdMaW5lKGRvYywgbGluZSwgcGFyYWdyYXBoLmFsaWduLCBib3gubGVmdCArIGluZGVudCwgYm94LndpZHRoIC0gaW5kZW50LCB5ICsgc2l6ZSk7XG4gICAgICAgIHkgKz0gc2l6ZSAqIFRFWFRfTElORV9IRUlHSFQ7XG4gICAgICB9XG5cbiAgICAgIC8vIEFuIGVtcHR5IHBhcmFncmFwaCBpcyBzdGlsbCBhIGxpbmUuXG4gICAgICBpZiAoIWxpbmVzLmxlbmd0aCkge1xuICAgICAgICB5ICs9IERFRkFVTFRfVEVYVF9TSVpFICogVEVYVF9MSU5FX0hFSUdIVDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBjdXJzb3JZOiB5LCBjdXQ6IGZhbHNlIH07XG4gIH1cblxuICAvLyBIb3cgZmFyIF9kcmF3UGFyYWdyYXBocyB0YWtlcyBpdHMgY3Vyc29yIGRvd24gZHJhd2luZyB0aGUgcGFyYWdyYXBocyB3aG9sZVxuICAvLyBhdCBhIHdpZHRoLlxuICBwcml2YXRlIF9wYXJhZ3JhcGhzSGVpZ2h0KGRvYzogYW55LCBwYXJhZ3JhcGhzOiBUZXh0UGFyYWdyYXBoW10sIHdpZHRoOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBwYXJhZ3JhcGhzLnJlZHVjZSgoaGVpZ2h0LCBwYXJhZ3JhcGgpID0+IHtcbiAgICAgIGNvbnN0IGxpbmVzID0gdGhpcy5fd3JhcChkb2MsIHBhcmFncmFwaCwgd2lkdGggLSAocGFyYWdyYXBoLmJ1bGxldCA/IExJU1RfSU5ERU5UIDogMCkpO1xuXG4gICAgICByZXR1cm4gaGVpZ2h0ICsgKGxpbmVzLmxlbmd0aFxuICAgICAgICA/IGxpbmVzLnJlZHVjZSgoc3VtLCBsaW5lKSA9PiBzdW0gKyB0aGlzLl9saW5lU2l6ZShwYXJhZ3JhcGgsIGxpbmUpICogVEVYVF9MSU5FX0hFSUdIVCwgMClcbiAgICAgICAgOiBERUZBVUxUX1RFWFRfU0laRSAqIFRFWFRfTElORV9IRUlHSFQpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLy8gQSBsaW5lJ3MgZm9udCBzaXplOiBpdHMgbGFyZ2VzdCB3b3JkJ3MsIGFuZCBuZXZlciB1bmRlciBpdHMgcGFyYWdyYXBoJ3NcbiAgLy8gZmlyc3QgcnVuJ3MuXG4gIHByaXZhdGUgX2xpbmVTaXplKHBhcmFncmFwaDogVGV4dFBhcmFncmFwaCwgbGluZTogUGRmV29yZFtdKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoLi4ubGluZS5tYXAoKHdvcmQpID0+IHdvcmQuc2l6ZSksIHBhcmFncmFwaC5ydW5zWzBdPy5mb250U2l6ZSA/PyBERUZBVUxUX1RFWFRfU0laRSk7XG4gIH1cblxuICAvLyBPbmUgd3JhcHBlZCBsaW5lIG9uIGl0cyBiYXNlbGluZSwgYWxpZ25lZCB3aXRoaW4gdGhlIHdpZHRoIGZyb20gbGVmdC5cbiAgcHJpdmF0ZSBfZHJhd0xpbmUoXG4gICAgZG9jOiBhbnksXG4gICAgbGluZTogUGRmV29yZFtdLFxuICAgIGFsaWduOiBUZXh0UGFyYWdyYXBoWydhbGlnbiddLFxuICAgIGxlZnQ6IG51bWJlciwgd2lkdGg6IG51bWJlciwgYmFzZWxpbmU6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgbGluZVdpZHRoID0gbGluZS5yZWR1Y2UoKHN1bSwgd29yZCkgPT4gc3VtICsgd29yZC53aWR0aCwgMCk7XG4gICAgbGV0IHggPSBsZWZ0ICsgdGhpcy5fYWxpZ25PZmZzZXQoYWxpZ24sIHdpZHRoLCBsaW5lV2lkdGgpO1xuXG4gICAgZm9yIChjb25zdCB3b3JkIG9mIGxpbmUpIHtcbiAgICAgIHRoaXMuX2RyYXdXb3JkKGRvYywgd29yZCwgeCwgYmFzZWxpbmUpO1xuICAgICAgeCArPSB3b3JkLndpZHRoO1xuICAgIH1cbiAgfVxuXG4gIC8vIEEgdGFibGUgaW4gYSB0ZXh0IGJsb2NrLCBkcmF3biBieSBhdXRvVGFibGUgZnJvbSB0b3AgKF9yZW5kZXJUZXh0IHB1dHMgaXRcbiAgLy8gVEVYVF9UQUJMRV9NQVJHSU4gdW5kZXIgdGhlIGxpbmUgdGhlIHdvcmRzIGFib3ZlIGl0IHJlYWNoKSwgaW4gdGhlIG9uZVxuICAvLyBsb29rIGV2ZXJ5IHJlbmRlcmVyIGRyYXdzIChURVhUX1RBQkxFXyogaW4gdGV4dC50cykuIEl0cyBsZWZ0IGVkZ2UsIHdpZHRoXG4gIC8vIGFuZCBjb2x1bW4gd2lkdGhzIGFyZSB0aGUgY2FudmFzJ3MgKGxheW91dCksIGVsc2UgdGhlIGJveCdzIHdpZHRoIHNwbGl0XG4gIC8vIGV2ZW5seS4gQSByb3cgaXMgYXMgdGFsbCBhcyBpdHMgY2VsbHMnIHdvcmRzIHdyYXBwZWQgYXMgX2RyYXdQYXJhZ3JhcGhzXG4gIC8vIHdyYXBzIHRoZW0sIGFuZCB0aGUgd29yZHMgYXJlIGRyYXduIGludG8gZWFjaCBjZWxsIG9uY2UgYXV0b1RhYmxlIGhhc1xuICAvLyBkcmF3biBpdHMgZ3JpZCBsaW5lcyBhbmQgZmlsbCAoX2RyYXdUZXh0Q2VsbCksIHNvIHRoZXkga2VlcCB0aGVpciBydW5zJ1xuICAvLyBmb250cyBhbmQgY29sb3JzLiBPbmx5IHRoZSByb3dzIHRoZSBib3ggaG9sZHMgYXJlIGRyYXduLCBhbmQgYSB0YWJsZSB0aGF0XG4gIC8vIGxvc2VzIGFueSwgb3IgcnVucyBwYXN0IGl0cyBwYWdlIGFueXdheSwgaXMgY3V0LiBUaGUgY3Vyc29yIGl0IGxlYXZlcyBpc1xuICAvLyBURVhUX1RBQkxFX01BUkdJTiB1bmRlciBpdC5cbiAgcHJpdmF0ZSBfZHJhd1RleHRUYWJsZShcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIHRhYmxlOiBUZXh0VGFibGUsXG4gICAgbGF5b3V0OiBUZXh0VGFibGVMYXlvdXQgfCBudWxsLFxuICAgIGJveDogUGRmVGV4dEJveCxcbiAgICB0b3A6IG51bWJlcixcbiAgKTogUGRmVGV4dEN1cnNvciB7XG4gICAgaWYgKHRvcCA+PSBib3guYm90dG9tKSB7XG4gICAgICByZXR1cm4geyBjdXJzb3JZOiB0b3AsIGN1dDogdHJ1ZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IGxlZnQgPSBib3gubGVmdCArIChsYXlvdXQ/LmxlZnQgPz8gMCkgKiBQVDtcbiAgICBjb25zdCB3aWR0aCA9IGxheW91dCA/IGxheW91dC53aWR0aCAqIFBUIDogYm94LndpZHRoO1xuICAgIGNvbnN0IGNvbHVtbldpZHRocyA9IGxheW91dD8uY29sdW1uV2lkdGhzLmxlbmd0aCA9PT0gdGFibGUuY29sdW1uc1xuICAgICAgPyBsYXlvdXQuY29sdW1uV2lkdGhzLm1hcCgoY29sdW1uV2lkdGgpID0+IGNvbHVtbldpZHRoICogUFQpXG4gICAgICA6IEFycmF5LmZyb20oeyBsZW5ndGg6IHRhYmxlLmNvbHVtbnMgfSwgKCkgPT4gd2lkdGggLyB0YWJsZS5jb2x1bW5zKTtcbiAgICBjb25zdCBib2R5ID0gdGFibGUucm93cy5tYXAoKHJvdykgPT4gcm93LmNlbGxzLm1hcCgoY2VsbCkgPT4gdGhpcy5fdGV4dENlbGxJbnB1dChjb250ZXh0LmRvYywgY2VsbCwgY29sdW1uV2lkdGhzKSkpO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl90ZXh0VGFibGVPcHRpb25zKGNvbnRleHQsIGNvbHVtbldpZHRocywgbGVmdCwgdG9wLCB3aWR0aCwgYm94LmJvdHRvbSk7XG4gICAgY29uc3QgZml0ID0gdGhpcy5fdGV4dFRhYmxlRml0KGNvbnRleHQsIHsgLi4ub3B0aW9ucywgYm9keSB9LCB0b3AsIGJveC5ib3R0b20pO1xuICAgIGNvbnN0IHdob2xlID0gIWZpdCB8fCB0aGlzLl9kcmF3VGFibGUoY29udGV4dCwgeyAuLi5vcHRpb25zLCBib2R5OiB0aGlzLl9rZXB0Um93cyhib2R5LCBmaXQpIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnNvclk6IGZpdCAmJiB3aG9sZSA/IGNvbnRleHQuZG9jLmxhc3RBdXRvVGFibGUuZmluYWxZICsgVEVYVF9UQUJMRV9NQVJHSU4gOiB0b3AsXG4gICAgICBjdXQ6ICF3aG9sZSB8fCBmaXQgPCB0YWJsZS5yb3dzLmxlbmd0aCxcbiAgICB9O1xuICB9XG5cbiAgLy8gQSB0ZXh0IHRhYmxlJ3MgY2VsbCBhcyBhdXRvVGFibGUgdGFrZXMgaXQ6IGl0cyBzcGFucyBhbmQgZmlsbCBhbmQsIHdoZW4gaXRcbiAgLy8gaXMgb25lIHJvdyB0YWxsLCB0aGUgaGVpZ2h0IGl0cyB3b3JkcyBuZWVkIGF0IHRoZSB3aWR0aCBpdCBzcGFucy4gQSBjZWxsXG4gIC8vIHRoYXQgc3BhbnMgcm93cyBzaGFyZXMgdGhlaXJzLlxuICBwcml2YXRlIF90ZXh0Q2VsbElucHV0KGRvYzogYW55LCBjZWxsOiBUZXh0VGFibGVDZWxsLCBjb2x1bW5XaWR0aHM6IG51bWJlcltdKTogUGRmVGV4dENlbGxJbnB1dCB7XG4gICAgY29uc3QgcGFkZGluZyA9IFRFWFRfVEFCTEVfQ0VMTF9QQURESU5HO1xuICAgIGNvbnN0IHdpZHRoID0gY29sdW1uV2lkdGhzXG4gICAgICAuc2xpY2UoY2VsbC5jb2x1bW4sIGNlbGwuY29sdW1uICsgY2VsbC5jb2xTcGFuKVxuICAgICAgLnJlZHVjZSgoc3VtLCBjb2x1bW5XaWR0aCkgPT4gc3VtICsgY29sdW1uV2lkdGgsIDApIC0gMiAqIHBhZGRpbmcuaG9yaXpvbnRhbDtcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiAnJyxcbiAgICAgIGNvbFNwYW46IGNlbGwuY29sU3BhbixcbiAgICAgIHJvd1NwYW46IGNlbGwucm93U3BhbixcbiAgICAgIHRleHRDZWxsOiBjZWxsLFxuICAgICAgc3R5bGVzOiB7XG4gICAgICAgIC4uLihjZWxsLmZpbGwgPyB7IGZpbGxDb2xvcjogY2VsbC5maWxsIH0gOiB7fSksXG4gICAgICAgIC4uLihjZWxsLnJvd1NwYW4gPT09IDFcbiAgICAgICAgICA/IHsgbWluQ2VsbEhlaWdodDogdGhpcy5fcGFyYWdyYXBoc0hlaWdodChkb2MsIGNlbGwucGFyYWdyYXBocywgd2lkdGgpICsgMiAqIHBhZGRpbmcudmVydGljYWwgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLy8gVGhlIGF1dG9UYWJsZSBvcHRpb25zIGEgdGV4dCB0YWJsZSdzIGRyeSBydW4gYW5kIGl0cyBkcmF3IHNoYXJlLiBFdmVyeVxuICAvLyBjb2x1bW4gaXMgbGlzdGVkIGFuZCBmaXhlZCBhdCBpdHMgd2lkdGg6IGF1dG9UYWJsZSB3b3VsZCBvdGhlcndpc2UgY291bnRcbiAgLy8gdGhlIGNvbHVtbnMgb2YgdGhlIGZpcnN0IHJvdywgd2hpY2ggbWF5IGJlIG5hcnJvd2VyIHRoYW4gdGhlIGdyaWQuIEEgcm93XG4gIC8vIGlzIG5ldmVyIHNwbGl0IGF0IHRoZSBib3gncyBib3R0b206IGl0IGZpdHMgd2hvbGUgb3IgbW92ZXMgcGFzdCBpdC4gYm90dG9tXG4gIC8vIGlzIHRoZSBib3gncy5cbiAgcHJpdmF0ZSBfdGV4dFRhYmxlT3B0aW9ucyhcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGNvbHVtbldpZHRoczogbnVtYmVyW10sXG4gICAgbGVmdDogbnVtYmVyLCB0b3A6IG51bWJlciwgd2lkdGg6IG51bWJlciwgYm90dG9tOiBudW1iZXIsXG4gICk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBjb25zdCBwYWRkaW5nID0gVEVYVF9UQUJMRV9DRUxMX1BBRERJTkc7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGhlbWU6ICdwbGFpbicsXG4gICAgICBjb2x1bW5zOiBjb2x1bW5XaWR0aHMubWFwKChfLCBpbmRleCkgPT4gKHsgZGF0YUtleTogaW5kZXggfSkpLFxuICAgICAgc3RhcnRZOiB0b3AsXG4gICAgICBtYXJnaW46IHsgbGVmdCwgcmlnaHQ6IGNvbnRleHQucGFnZVcgLSBsZWZ0IC0gd2lkdGgsIGJvdHRvbTogY29udGV4dC5wYWdlSCAtIGJvdHRvbSB9LFxuICAgICAgdGFibGVXaWR0aDogd2lkdGgsXG4gICAgICBjb2x1bW5TdHlsZXM6IE9iamVjdC5mcm9tRW50cmllcyhjb2x1bW5XaWR0aHMubWFwKChjZWxsV2lkdGgsIGluZGV4KSA9PiBbaW5kZXgsIHsgY2VsbFdpZHRoIH1dKSksXG4gICAgICByb3dQYWdlQnJlYWs6ICdhdm9pZCcsXG4gICAgICBzdHlsZXM6IHtcbiAgICAgICAgZm9udDogJ2hlbHZldGljYScsXG4gICAgICAgIGZvbnRTdHlsZTogJ25vcm1hbCcsXG4gICAgICAgIGZvbnRTaXplOiBERUZBVUxUX1RFWFRfU0laRSxcbiAgICAgICAgY2VsbFBhZGRpbmc6IHtcbiAgICAgICAgICB0b3A6IHBhZGRpbmcudmVydGljYWwsIHJpZ2h0OiBwYWRkaW5nLmhvcml6b250YWwsIGJvdHRvbTogcGFkZGluZy52ZXJ0aWNhbCwgbGVmdDogcGFkZGluZy5ob3Jpem9udGFsLFxuICAgICAgICB9LFxuICAgICAgICBsaW5lQ29sb3I6IFRFWFRfVEFCTEVfQk9SREVSX0NPTE9SLFxuICAgICAgICBsaW5lV2lkdGg6IFRFWFRfVEFCTEVfQk9SREVSX1dJRFRILFxuICAgICAgICB2YWxpZ246ICdtaWRkbGUnLFxuICAgICAgICB0ZXh0Q29sb3I6IERFRkFVTFRfVEVYVF9DT0xPUixcbiAgICAgIH0sXG4gICAgICBkaWREcmF3Q2VsbDogKGhvb2s6IGFueSkgPT4gdGhpcy5fZHJhd1RleHRDZWxsKGhvb2spLFxuICAgIH07XG4gIH1cblxuICAvLyBIb3cgbWFueSBvZiBhIHRleHQgdGFibGUncyByb3dzIGl0cyBib3gsIGZyb20gdG9wIHRvIGJvdHRvbSwgaG9sZHMgd2hvbGU6XG4gIC8vIHRoZSB0YWJsZSBsYWlkIG91dCBhcyBfbWVhc3VyZSBsYXlzIG91dCBhIGxpc3Qncy5cbiAgcHJpdmF0ZSBfdGV4dFRhYmxlRml0KGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCB0b3A6IG51bWJlciwgYm90dG9tOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9maXR0aW5nUm93cyhjb250ZXh0LmNyZWF0ZVRhYmxlKHRoaXMuX3NjcmF0Y2hEb2N1bWVudChjb250ZXh0KSwgb3B0aW9ucyksIHRvcCwgYm90dG9tLCAwKTtcbiAgfVxuXG4gIC8vIFRoZSBmaXJzdCBgZml0YCByb3dzLCBhIGNlbGwgdGhhdCBzcGFucyBkb3duIHBhc3QgdGhlIGxhc3Qgb2YgdGhlbSBjdXRcbiAgLy8gdGhlcmUuXG4gIHByaXZhdGUgX2tlcHRSb3dzKGJvZHk6IFBkZlRleHRDZWxsSW5wdXRbXVtdLCBmaXQ6IG51bWJlcik6IFBkZlRleHRDZWxsSW5wdXRbXVtdIHtcbiAgICByZXR1cm4gYm9keS5zbGljZSgwLCBmaXQpLm1hcCgocm93KSA9PiByb3cubWFwKChpbnB1dCkgPT4ge1xuICAgICAgY29uc3Qgcm93U3BhbiA9IE1hdGgubWluKGlucHV0LnJvd1NwYW4sIGZpdCAtIGlucHV0LnRleHRDZWxsLnJvdyk7XG5cbiAgICAgIHJldHVybiByb3dTcGFuID09PSBpbnB1dC5yb3dTcGFuID8gaW5wdXQgOiB7IC4uLmlucHV0LCByb3dTcGFuIH07XG4gICAgfSkpO1xuICB9XG5cbiAgLy8gQSB0ZXh0IHRhYmxlIGNlbGwncyB3b3JkcywgZHJhd24gb25jZSBhdXRvVGFibGUgaGFzIGRyYXduIHRoZSBjZWxsOiBpbnNpZGVcbiAgLy8gaXRzIHBhZGRpbmcsIHdyYXBwZWQgdG8gaXRzIHdpZHRoIGFuZCBwbGFjZWQgYnkgaXRzIHZlcnRpY2FsIGFsaWdubWVudCwgdGhlXG4gIC8vIG1pZGRsZSB1bmxlc3Mgc2V0LiBMaW5lcyBwYXN0IHRoZSBjZWxsIGFyZSBsZWZ0IG9mZi5cbiAgcHJpdmF0ZSBfZHJhd1RleHRDZWxsKGhvb2s6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IGNlbGw6IFRleHRUYWJsZUNlbGwgfCB1bmRlZmluZWQgPSBob29rLmNlbGwucmF3Py50ZXh0Q2VsbDtcbiAgICBpZiAoIWNlbGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfSA9IGhvb2suY2VsbDtcbiAgICBjb25zdCBib3g6IFBkZlRleHRCb3ggPSB7XG4gICAgICBsZWZ0OiB4ICsgaG9vay5jZWxsLnBhZGRpbmcoJ2xlZnQnKSxcbiAgICAgIHRvcDogeSArIGhvb2suY2VsbC5wYWRkaW5nKCd0b3AnKSxcbiAgICAgIHdpZHRoOiB3aWR0aCAtIGhvb2suY2VsbC5wYWRkaW5nKCdob3Jpem9udGFsJyksXG4gICAgICBib3R0b206IHkgKyBoZWlnaHQgLSBob29rLmNlbGwucGFkZGluZygnYm90dG9tJyksXG4gICAgfTtcbiAgICBjb25zdCBzcGFyZSA9IE1hdGgubWF4KDAsIGJveC5ib3R0b20gLSBib3gudG9wIC0gdGhpcy5fcGFyYWdyYXBoc0hlaWdodChob29rLmRvYywgY2VsbC5wYXJhZ3JhcGhzLCBib3gud2lkdGgpKTtcbiAgICBjb25zdCBvZmZzZXQgPSBjZWxsLnZhbGlnbiA9PT0gJ3RvcCcgPyAwIDogKGNlbGwudmFsaWduID09PSAnYm90dG9tJyA/IHNwYXJlIDogc3BhcmUgLyAyKTtcblxuICAgIHRoaXMuX2RyYXdQYXJhZ3JhcGhzKGhvb2suZG9jLCBjZWxsLnBhcmFncmFwaHMsIGJveCwgYm94LnRvcCArIG9mZnNldCk7XG4gIH1cblxuICAvLyBCcmVhayBhIHBhcmFncmFwaCdzIHJ1bnMgaW50byBsaW5lcyBvZiBtZWFzdXJlZCB3b3JkcyB0aGF0IGZpdCB0aGUgd2lkdGguXG4gIC8vIEEgd29yZCBrZWVwcyBpdHMgdHJhaWxpbmcgc3BhY2Ugc28gc3BhY2luZyBzdXJ2aXZlcyBydW4gYm91bmRhcmllcy4gQVxuICAvLyBuby1icmVhayBzcGFjZSBpcyBwYXJ0IG9mIGl0cyB3b3JkLCBuZXZlciBhIGJyZWFrIGJldHdlZW4gdHdvOiBhIG51bWJlclxuICAvLyBncm91cGVkIHdpdGggb25lIChmci1DQSdzIHRob3VzYW5kcywgb3IgYSBuYXJyb3cgc3BhY2UgX3BkZlRleHQgdHVybmVkXG4gIC8vIGludG8gb25lKSBzdGF5cyBvbiBvbmUgbGluZS5cbiAgcHJpdmF0ZSBfd3JhcChkb2M6IGFueSwgcGFyYWdyYXBoOiBUZXh0UGFyYWdyYXBoLCB3aWR0aDogbnVtYmVyKTogUGRmV29yZFtdW10ge1xuICAgIGNvbnN0IGxpbmVzOiBQZGZXb3JkW11bXSA9IFtdO1xuICAgIGxldCBsaW5lOiBQZGZXb3JkW10gPSBbXTtcbiAgICBsZXQgbGluZVdpZHRoID0gMDtcblxuICAgIGZvciAoY29uc3QgcnVuIG9mIHBhcmFncmFwaC5ydW5zKSB7XG4gICAgICBjb25zdCBzaXplID0gcnVuLmZvbnRTaXplID8/IERFRkFVTFRfVEVYVF9TSVpFO1xuICAgICAgdGhpcy5fZm9udChkb2MsIHJ1biwgc2l6ZSk7XG5cbiAgICAgIGZvciAoY29uc3QgdGV4dCBvZiBydW4udGV4dC5tYXRjaCgvKD86W15cXHNdfFxcdTAwYTApK1teXFxTXFx1MDBhMF0qfFteXFxTXFx1MDBhMF0rL2cpID8/IFtdKSB7XG4gICAgICAgIGNvbnN0IHdvcmRXaWR0aCA9IGRvYy5nZXRUZXh0V2lkdGgodGV4dCk7XG5cbiAgICAgICAgaWYgKGxpbmUubGVuZ3RoICYmIGxpbmVXaWR0aCArIHdvcmRXaWR0aCAtIHRoaXMuX3RyYWlsaW5nU3BhY2UoZG9jLCB0ZXh0KSA+IHdpZHRoKSB7XG4gICAgICAgICAgbGluZXMucHVzaChsaW5lKTtcbiAgICAgICAgICBsaW5lID0gW107XG4gICAgICAgICAgbGluZVdpZHRoID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxpbmUucHVzaCh7IHJ1biwgdGV4dCwgc2l6ZSwgd2lkdGg6IHdvcmRXaWR0aCB9KTtcbiAgICAgICAgbGluZVdpZHRoICs9IHdvcmRXaWR0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobGluZS5sZW5ndGgpIHtcbiAgICAgIGxpbmVzLnB1c2gobGluZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBfZHJhd1dvcmQoZG9jOiBhbnksIHdvcmQ6IFBkZldvcmQsIHg6IG51bWJlciwgYmFzZWxpbmU6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHJ1biA9IHdvcmQucnVuO1xuXG4gICAgaWYgKHJ1bi5oaWdobGlnaHQpIHtcbiAgICAgIGRvYy5zZXRGaWxsQ29sb3IocnVuLmhpZ2hsaWdodCk7XG4gICAgICBkb2MucmVjdCh4LCBiYXNlbGluZSAtIHdvcmQuc2l6ZSAqIDAuOSwgd29yZC53aWR0aCwgd29yZC5zaXplICogMS4xNSwgJ0YnKTtcbiAgICB9XG5cbiAgICB0aGlzLl9mb250KGRvYywgcnVuLCB3b3JkLnNpemUpO1xuICAgIGRvYy50ZXh0KHdvcmQudGV4dCwgeCwgYmFzZWxpbmUpO1xuXG4gICAgY29uc3QgY29sb3IgPSBydW4uY29sb3IgPz8gREVGQVVMVF9URVhUX0NPTE9SO1xuICAgIGNvbnN0IGlua1dpZHRoID0gd29yZC53aWR0aCAtIHRoaXMuX3RyYWlsaW5nU3BhY2UoZG9jLCB3b3JkLnRleHQpO1xuICAgIGlmIChydW4udW5kZXJsaW5lKSB7XG4gICAgICBkb2Muc2V0RHJhd0NvbG9yKGNvbG9yKTtcbiAgICAgIGRvYy5zZXRMaW5lV2lkdGgod29yZC5zaXplIC8gMTYpO1xuICAgICAgZG9jLmxpbmUoeCwgYmFzZWxpbmUgKyB3b3JkLnNpemUgKiAwLjEyLCB4ICsgaW5rV2lkdGgsIGJhc2VsaW5lICsgd29yZC5zaXplICogMC4xMik7XG4gICAgfVxuICAgIGlmIChydW4uc3RyaWtlKSB7XG4gICAgICBkb2Muc2V0RHJhd0NvbG9yKGNvbG9yKTtcbiAgICAgIGRvYy5zZXRMaW5lV2lkdGgod29yZC5zaXplIC8gMTYpO1xuICAgICAgZG9jLmxpbmUoeCwgYmFzZWxpbmUgLSB3b3JkLnNpemUgKiAwLjMsIHggKyBpbmtXaWR0aCwgYmFzZWxpbmUgLSB3b3JkLnNpemUgKiAwLjMpO1xuICAgIH1cblxuICAgIGlmIChydW4ubGluaykge1xuICAgICAgZG9jLmxpbmsoeCwgYmFzZWxpbmUgLSB3b3JkLnNpemUsIGlua1dpZHRoLCB3b3JkLnNpemUgKiAxLjIsIHsgdXJsOiBydW4ubGluayB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBqc1BERidzIHN0YW5kYXJkIGZvbnRzIGFyZSBIZWx2ZXRpY2EsIFRpbWVzIGFuZCBDb3VyaWVyOyBhIGJsb2NrJ3MgZmFjZSBpc1xuICAvLyBtYXBwZWQgb250byB3aGljaGV2ZXIgb2YgdGhlIHRocmVlIGl0IHJlc2VtYmxlcy5cbiAgcHJpdmF0ZSBfZm9udChkb2M6IGFueSwgcnVuOiBUZXh0UnVuLCBzaXplOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBmYWNlID0gKHJ1bi5mb250RmFjZSA/PyAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBmYW1pbHkgPSAvY291cmllcnxtb25vLy50ZXN0KGZhY2UpXG4gICAgICA/ICdjb3VyaWVyJ1xuICAgICAgOiAoL3RpbWVzfGdlb3JnaWF8c2VyaWYvLnRlc3QoZmFjZSkgJiYgIWZhY2UuaW5jbHVkZXMoJ3NhbnMnKSA/ICd0aW1lcycgOiAnaGVsdmV0aWNhJyk7XG4gICAgY29uc3Qgc3R5bGUgPSBydW4uYm9sZCAmJiBydW4uaXRhbGljXG4gICAgICA/ICdib2xkaXRhbGljJ1xuICAgICAgOiAocnVuLmJvbGQgPyAnYm9sZCcgOiAocnVuLml0YWxpYyA/ICdpdGFsaWMnIDogJ25vcm1hbCcpKTtcblxuICAgIGRvYy5zZXRGb250KGZhbWlseSwgc3R5bGUpO1xuICAgIGRvYy5zZXRGb250U2l6ZShzaXplKTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKHJ1bi5jb2xvciA/PyBERUZBVUxUX1RFWFRfQ09MT1IpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdHJhaWxpbmdTcGFjZShkb2M6IGFueSwgdGV4dDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCB0cmFpbGluZyA9IHRleHQubGVuZ3RoIC0gdGV4dC50cmltRW5kKCkubGVuZ3RoO1xuXG4gICAgcmV0dXJuIHRyYWlsaW5nID8gZG9jLmdldFRleHRXaWR0aCgnICcpICogdHJhaWxpbmcgOiAwO1xuICB9XG5cbiAgcHJpdmF0ZSBfYWxpZ25PZmZzZXQoYWxpZ246IFRleHRQYXJhZ3JhcGhbJ2FsaWduJ10sIHdpZHRoOiBudW1iZXIsIGxpbmVXaWR0aDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBzd2l0Y2ggKGFsaWduKSB7XG4gICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgKHdpZHRoIC0gbGluZVdpZHRoKSAvIDIpO1xuICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgd2lkdGggLSBsaW5lV2lkdGgpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9XG5cbiAgLy8gV2hhdCB0aGUgdG9rZW5zIG9mIGEgdGV4dCBibG9jayBhbmQgb2YgYSB0aWxlJ3MgdGl0bGUgZmlsbCB3aXRoIG9uIHRoaXNcbiAgLy8gcGFnZS4gVGhlIG51bWJlciBpcyB0aGUgcGh5c2ljYWwgcGFnZSBhbW9uZyB0aGUgcmVwb3J0J3MgcGFnZXMsXG4gIC8vIGNvbnRpbnVhdGlvbiBwYWdlcyBpbmNsdWRlZCDigJQgdGhlIHRpdGxlIHBhZ2UgaXMgbm90IGEgcmVwb3J0IHBhZ2UuIFRoZVxuICAvLyBuYW1lIHN0YXlzIHRoZSByZXBvcnQgcGFnZSdzLCBzbyBhIGNvbnRpbnVhdGlvbiBwYWdlIGlzIG5hbWVkIGZvciB0aGVcbiAgLy8gcGFnZSBpdHMgdGFibGUgc3RhcnRlZCBvbi4gVGhlIGZpbHRlcnMgYXJlIHRoZSByZXBvcnQncyBhbmQgdGhlIHBhZ2Unc1xuICAvLyBvd24gcGFnZSBmaWx0ZXJzIChsYXllckZpbHRlckZpZWxkcykuXG4gIHByaXZhdGUgX3Rva2Vucyhjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LCBwYWdlOiBSZXBvcnRQYWdlLCBpbmRleDogbnVtYmVyLCBwYWdlTnVtYmVyOiBudW1iZXIpOiBUZXh0VG9rZW5Db250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFnZU51bWJlcixcbiAgICAgIHBhZ2VOYW1lOiBwYWdlLm5hbWUgfHwgYFBhZ2UgJHtpbmRleCArIDF9YCxcbiAgICAgIHJlcG9ydE5hbWU6IGNvbnRleHQucmVwb3J0Lm5hbWUsXG4gICAgICBmaWx0ZXJzOiBsYXllckZpbHRlckZpZWxkcyhjb250ZXh0LmZpbHRlckZpZWxkcywgY29udGV4dC5yZXBvcnQuZmlsdGVyR3JvdXBzID8/IFtdLCBwYWdlLmlkKSxcbiAgICB9O1xuICB9XG5cbiAgLy8gQSB0aWxlIG9uIGl0cyByZXBvcnQgcGFnZSwgaXRzIHRpdGxlJ3MgdG9rZW5zIGZpbGxlZCB3aXRoIHRoYXQgcGFnZSdzLlxuICBwcml2YXRlIGFzeW5jIF9yZW5kZXJDb21wb25lbnQoXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBwYWdlOiBSZXBvcnRQYWdlLFxuICAgIGl0ZW06IENvbGxlY3RlZENvbXBvbmVudCxcbiAgICB0b2tlbnM6IFRleHRUb2tlbkNvbnRleHQsXG4gICAgb3ZlcmZsb3dzOiBQZGZUYWJsZU92ZXJmbG93W10sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZG9jIH0gPSBjb250ZXh0O1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IGl0ZW0uY29tcG9uZW50O1xuICAgIC8vIEdlb21ldHJ5IGlzIHN0b3JlZCBpbiBpbmNoZXM7IHRoZSBQREYgZHJhd3MgaW4gcG9pbnRzLlxuICAgIGNvbnN0IHggPSBjb21wb25lbnQueCAqIFBUO1xuICAgIGNvbnN0IHkgPSBjb21wb25lbnQueSAqIFBUO1xuICAgIGNvbnN0IHcgPSBjb21wb25lbnQudyAqIFBUO1xuICAgIGNvbnN0IGggPSBjb21wb25lbnQuaCAqIFBUO1xuXG4gICAgY29uc3QgdGl0bGUgPSBleHBvcnRUaXRsZShjb21wb25lbnQsIHRva2VucywgaXRlbS5zZWFyY2gsIGl0ZW0uY3J1bWJzLCBpdGVtLmZpbHRlcmVkKTtcbiAgICBpZiAodGl0bGUpIHtcbiAgICAgIHRoaXMuX2NvbXBvbmVudFRpdGxlKGRvYywgdGl0bGUsIHgsIHksIHcpO1xuICAgIH1cblxuICAgIC8vIEEgY2hhcnQgb3IgbGlzdCB0aGF0IGNvbXBhcmVzIG9yIGhhcyBhIHRpbWVmcmFtZSBuYW1lcyBpdHMgZGF5cyB1bmRlclxuICAgIC8vIHRoZSB0aXRsZSwgYW5kIGl0cyBub3RlcyBzaXQgYXQgdGhlIGZvb3Qgb2YgaXRzIGJveDsgYSBLUEkgY2FyZCBkcmF3c1xuICAgIC8vIGJvdGggaXRzZWxmLiBOZWl0aGVyIHRha2VzIHJvb20gZnJvbSBhIGNvbXBvbmVudCB3aXRob3V0IHRob3NlIGtleXMuXG4gICAgY29uc3QgbG9jYWxlID0gY29udGV4dC5mb3JtYXRDb250ZXh0LmxvY2FsZTtcbiAgICBjb25zdCBzdWJ0aXRsZSA9IHRoaXMuX3BkZlRleHQoZXhwb3J0V2luZG93c0xpbmUoaXRlbSwgY29udGV4dC50aW1lem9uZSwgbG9jYWxlKSk7XG4gICAgY29uc3Qgbm90ZXMgPSBjb21wb25lbnQudHlwZSA9PT0gJ2twaScgPyBbXSA6IGV4cG9ydE5vdGVMaW5lcyhpdGVtLCBjb250ZXh0LnRpbWV6b25lLCBsb2NhbGUpO1xuICAgIGNvbnN0IHRvcCA9IHkgKyBUSVRMRV9IICsgKHN1YnRpdGxlID8gU1VCVElUTEVfSCA6IDApO1xuICAgIGNvbnN0IHJvb20gPSBNYXRoLm1heCgyMCwgeSArIGggLSB0b3ApO1xuICAgIGNvbnN0IGtlcHQgPSBub3Rlcy5zbGljZSgwLCBNYXRoLm1heCgwLCBNYXRoLmZsb29yKChyb29tIC0gTUlOX0JPRFlfSCkgLyBOT1RFX0xJTkVfSCkpKTtcblxuICAgIGlmIChzdWJ0aXRsZSkge1xuICAgICAgdGhpcy5fc21hbGxMaW5lKGRvYywgc3VidGl0bGUsIHgsIHkgKyBUSVRMRV9ILCB3LCAnbGVmdCcsICdub3JtYWwnKTtcbiAgICB9XG5cbiAgICBjb25zdCBib2R5WSA9IHRvcDtcbiAgICBjb25zdCBib2R5SCA9IE1hdGgubWF4KDIwLCByb29tIC0ga2VwdC5sZW5ndGggKiBOT1RFX0xJTkVfSCk7XG5cbiAgICBrZXB0LmZvckVhY2goKGxpbmUsIGluZGV4KSA9PiB7XG4gICAgICB0aGlzLl9zbWFsbExpbmUoZG9jLCB0aGlzLl9wZGZUZXh0KGxpbmUpLCB4LCBib2R5WSArIGJvZHlIICsgaW5kZXggKiBOT1RFX0xJTkVfSCwgdywgJ2xlZnQnLCAnaXRhbGljJyk7XG4gICAgfSk7XG5cbiAgICBpZiAoIWl0ZW0uZGF0YSB8fCBpc0VtcHR5VGlsZShpdGVtKSkge1xuICAgICAgdGhpcy5fYm94Tm90ZShkb2MsIGVtcHR5TGFiZWwoaXRlbSksIHgsIGJvZHlZLCB3LCBib2R5SCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGNvbXBvbmVudC50eXBlKSB7XG4gICAgICBjYXNlICdjaGFydCc6IHtcbiAgICAgICAgY29uc3QgaW1hZ2UgPSBhd2FpdCByZW5kZXJDaGFydEltYWdlKGNvbXBvbmVudCwgaXRlbS5kYXRhLCB3LCBib2R5SCwgY29udGV4dC5mb3JtYXRDb250ZXh0KTtcbiAgICAgICAgZG9jLmFkZEltYWdlKGltYWdlLCAnUE5HJywgeCwgYm9keVksIHcsIGJvZHlIKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdsaXN0JzpcbiAgICAgIGNhc2UgJ2dyaWQnOlxuICAgICAgICB0aGlzLl9yZW5kZXJUYWJsZShjb250ZXh0LCBwYWdlLCBpdGVtLCB4LCBib2R5WSwgdywgYm9keUgsIG92ZXJmbG93cyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAna3BpJzpcbiAgICAgICAgdGhpcy5fcmVuZGVyS3BpKGNvbnRleHQsIGl0ZW0sIHgsIGJvZHlZLCB3LCBib2R5SCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vIE9uZSBsaW5lIG9mIHNtYWxsIGdyZXkgcHJpbnQsIGN1dCB0byB0aGUgd2lkdGggd2l0aCBhbiBlbGxpcHNpczogYVxuICAvLyBzdWJ0aXRsZSwgYSBub3RlIG9yIGEgbGluZSBvZiBhIEtQSSBjYXJkLiB5IGlzIHRoZSBsaW5lJ3MgdG9wOyB0aGUgbGluZSBpc1xuICAvLyBOT1RFX0xJTkVfSCB0YWxsLCB0aW1lcyB0aGUgc2NhbGUgYSBzaG9ydCBLUEkgdGlsZSBzaHJpbmtzIGl0cyBsaW5lcyBieS5cbiAgcHJpdmF0ZSBfc21hbGxMaW5lKFxuICAgIGRvYzogYW55LFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyLFxuICAgIGFsaWduOiAnbGVmdCcgfCAnY2VudGVyJyxcbiAgICBzdHlsZTogJ25vcm1hbCcgfCAnaXRhbGljJyxcbiAgICBzY2FsZSA9IDEsXG4gICk6IHZvaWQge1xuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCBzdHlsZSk7XG4gICAgZG9jLnNldEZvbnRTaXplKFNNQUxMX1NJWkUgKiBzY2FsZSk7XG4gICAgZG9jLnNldFRleHRDb2xvcihNVVRFRF9DT0xPUik7XG4gICAgZG9jLnRleHQodGhpcy5fZml0KGRvYywgdGV4dCwgdyksIGFsaWduID09PSAnY2VudGVyJyA/IHggKyB3IC8gMiA6IHgsIHkgKyBTTUFMTF9TSVpFICogc2NhbGUsIHsgYWxpZ24gfSk7XG4gIH1cblxuICAvLyBUaGUgdGV4dCwgZWxsaXBzaXplZCB0byB0aGUgd2lkdGggaW4gdGhlIGRvYydzIGN1cnJlbnQgZm9udC5cbiAgcHJpdmF0ZSBfZml0KGRvYzogYW55LCB0ZXh0OiBzdHJpbmcsIHdpZHRoOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmIChkb2MuZ2V0VGV4dFdpZHRoKHRleHQpIDw9IHdpZHRoKSB7XG4gICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG5cbiAgICBsZXQgY3V0ID0gdGV4dDtcbiAgICB3aGlsZSAoY3V0Lmxlbmd0aCA+IDEgJiYgZG9jLmdldFRleHRXaWR0aChgJHtjdXR94oCmYCkgPiB3aWR0aCkge1xuICAgICAgY3V0ID0gY3V0LnNsaWNlKDAsIC0xKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7Y3V0LnRyaW1FbmQoKX3igKZgO1xuICB9XG5cbiAgLy8gVGhlIGJvbGQgc3RyaXAgb3ZlciBhIGNvbXBvbmVudCwgYW5kIG92ZXIgZWFjaCBvZiBpdHMgY29udGludWF0aW9uIHBhZ2VzLlxuICAvLyBBIGRyaWxsZWQgdGl0bGUncyBjcnVtYnMgYXJlIHdyaXR0ZW4gaW4gdGhlIHJlcG9ydCdzIGxvY2FsZSwgc28gdGhlIHRpdGxlXG4gIC8vIGdvZXMgdGhyb3VnaCBfcGRmVGV4dCBsaWtlIGFueSBmb3JtYXR0ZWQgdGV4dCAodGhlIOKAuiBiZXR3ZWVuIGNydW1icyBpc1xuICAvLyBXaW5BbnNpIGFuZCBzdGF5cykuXG4gIHByaXZhdGUgX2NvbXBvbmVudFRpdGxlKGRvYzogYW55LCB0aXRsZTogc3RyaW5nLCB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyKTogdm9pZCB7XG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XG4gICAgZG9jLnNldEZvbnRTaXplKDkpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoJyMxZjI5MzMnKTtcbiAgICBkb2MudGV4dCh0aGlzLl9wZGZUZXh0KHRpdGxlKSwgeCwgeSArIDEwLCB7IG1heFdpZHRoOiB3IH0pO1xuICB9XG5cbiAgLy8gQW4gaXRhbGljIGdyZXkgbGluZSBjZW50ZXJlZCBpbiBhIGNvbXBvbmVudCdzIGJvZHksIGZvciBhIGJvZHkgdGhhdCBob2xkc1xuICAvLyBzb21ldGhpbmcgb3RoZXIgdGhhbiBpdHMgY29udGVudC4gQSBsaW5lIHdpZGVyIHRoYW4gdGhlIGJvZHkgd3JhcHMuXG4gIHByaXZhdGUgX2JveE5vdGUoZG9jOiBhbnksIHRleHQ6IHN0cmluZywgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyKTogdm9pZCB7XG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdpdGFsaWMnKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoOSk7XG4gICAgZG9jLnNldFRleHRDb2xvcihNVVRFRF9DT0xPUik7XG4gICAgZG9jLnRleHQodGV4dCwgeCArIHcgLyAyLCB5ICsgaCAvIDIsIHsgYWxpZ246ICdjZW50ZXInLCBtYXhXaWR0aDogdyB9KTtcbiAgfVxuXG4gIC8vIEEgbGlzdCdzIG9uLXBhZ2UgdGFibGUuIEFsbCBvZiBpdHMgZmV0Y2hlZCByb3dzIGFyZSBsYWlkIG91dCBvbmNlIHRvIGxlYXJuXG4gIC8vIGhvdyBtYW55IHRoZSBib3ggaG9sZHM7IHdoZW4gdGhleSBkbyBub3QgYWxsIGZpdCwgdGhlIGJveCdzIGxhc3Qgcm93IHNheXNcbiAgLy8gdGhlIHRhYmxlIGNvbnRpbnVlcyBhbmQgdGhlIHJlc3QgZ28gdG8gb3ZlcmZsb3dzIGZvciBjb250aW51YXRpb24gcGFnZXMuXG4gIC8vIEEgYm94IHRvbyBzaG9ydCBmb3IgZXZlbiB0aGUgaGVhZCBjYXJyaWVzIHRoZSBub3RpY2UgYXMgYSBsaW5lIGluc3RlYWQuXG4gIC8vIEEgdGFibGUgd2hvc2UgaGVhZGluZyBhbmQgdG90YWxzIHJvdyBsZWF2ZSBhIGNvbnRpbnVhdGlvbiBwYWdlIG5vIHJvb20gZm9yXG4gIC8vIGEgcm93IHN0b3BzIGF0IGl0cyBib3gsIGl0cyBub3RpY2Ugc2F5aW5nIHNvLiBBIHRvdGFscyByb3cgY2xvc2VzIHRoZVxuICAvLyB0YWJsZSBvbmNlOiBpbiB0aGUgYm94IHdoZW4gZXZlcnkgcm93IGZpdHMgaXQsIGVsc2UgYWZ0ZXIgdGhlIGxhc3RcbiAgLy8gY29udGludWF0aW9uIHJvdy4gUG9pbnRzIHRocm91Z2hvdXQuXG4gIHByaXZhdGUgX3JlbmRlclRhYmxlKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgcGFnZTogUmVwb3J0UGFnZSxcbiAgICBpdGVtOiBDb2xsZWN0ZWRDb21wb25lbnQsXG4gICAgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyLFxuICAgIG92ZXJmbG93czogUGRmVGFibGVPdmVyZmxvd1tdLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCB7IGNvbXBvbmVudCwgc2VhcmNoLCBmaWx0ZXJlZCB9ID0gaXRlbTtcbiAgICBjb25zdCB7IGhlYWQsIGNlbGxzLCBudW1lcmljLCBmb290LCBvbWl0dGVkIH0gPSBpdGVtLnRhYmxlID8gdGhpcy5fZ3JpZENlbGxzKGl0ZW0pIDogdGhpcy5fbGlzdENlbGxzKGNvbnRleHQsIGl0ZW0pO1xuICAgIGNvbnN0IGJvdHRvbSA9IGNvbnRleHQucGFnZUggLSAoeSArIGgpO1xuICAgIGNvbnN0IHsgZml0LCBjb2x1bW5TdHlsZXMsIG1pbkhlaWdodCB9ID0gdGhpcy5fbWVhc3VyZShjb250ZXh0LCBoZWFkLCBjZWxscywgbnVtZXJpYywgZm9vdCwgeCwgeSwgdywgYm90dG9tKTtcblxuICAgIGlmIChmaXQgPT09IGNlbGxzLmxlbmd0aCAmJiBvbWl0dGVkID09PSAwKSB7XG4gICAgICB0aGlzLl9kcmF3VGFibGUoXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIHRoaXMuX3RhYmxlT3B0aW9ucyhjb250ZXh0LCBoZWFkLCBudW1lcmljLCBjZWxscywgeCwgeSwgdywgYm90dG9tLCBjb2x1bW5TdHlsZXMsIGZvb3QpLFxuICAgICAgKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGF1dG9UYWJsZSBuZWVkcyByb29tIGZvciBhIHJvdyB1bmRlciB0aGUgaGVhZGluZyBvbiBldmVyeSBwYWdlIGl0IGFkZHMsXG4gICAgLy8gb3IgaXQgYWRkcyBwYWdlcyB1bnRpbCB0aGUgYnJvd3NlcidzIHN0YWNrIHJ1bnMgb3V0LlxuICAgIGNvbnN0IGNvbnRpbnVlcyA9IG1pbkhlaWdodCA8IHRoaXMuX2NvbnRpbnVhdGlvblJvb20oY29udGV4dCwgcGFnZSk7XG4gICAgY29uc3Qgbm90aWNlID0gY29udGludWVzID8gQ09OVElOVUVEX05PVElDRSA6IE5PX1JPT01fTk9USUNFO1xuXG4gICAgLy8gVGhlIG5vdGljZSB0YWtlcyB0aGUgcGxhY2Ugb2YgdGhlIGxhc3Qgcm93IHRoYXQgZml0LCBzbyB0aGF0IHJvdyBtb3Zlc1xuICAgIC8vIHRvIHRoZSBjb250aW51YXRpb24uIG9taXR0ZWQgPiAwIG1lYW5zIGEgZnVsbCBQREZfTElTVF9ST1dTIGZldGNoLCB3aGljaFxuICAgIC8vIG5ldmVyIGZpdHMgb25lIGJveCwgc28gdGhlIENTViBub3RpY2UgYWx3YXlzIGxhbmRzIG9uIGEgY29udGludWF0aW9uXG4gICAgLy8gcGFnZS5cbiAgICBjb25zdCBrZXB0ID0gTWF0aC5tYXgoMCwgZml0IC0gMSk7XG5cbiAgICBpZiAoZml0ID49IDEpIHtcbiAgICAgIGNvbnN0IGJvZHkgPSBbLi4uY2VsbHMuc2xpY2UoMCwga2VwdCksIHRoaXMuX25vdGljZVJvdyhub3RpY2UsIG51bWVyaWMubGVuZ3RoLCB0cnVlKV07XG4gICAgICB0aGlzLl9kcmF3VGFibGUoY29udGV4dCwgdGhpcy5fdGFibGVPcHRpb25zKGNvbnRleHQsIGhlYWQsIG51bWVyaWMsIGJvZHksIHgsIHksIHcsIGJvdHRvbSwgY29sdW1uU3R5bGVzKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2JveE5vdGUoY29udGV4dC5kb2MsIG5vdGljZSwgeCwgeSwgdywgaCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRpbnVlcykge1xuICAgICAgb3ZlcmZsb3dzLnB1c2goe1xuICAgICAgICBjb21wb25lbnQsIHNlYXJjaCwgY3J1bWJzOiBpdGVtLmNydW1icywgZmlsdGVyZWQsIGhlYWQsIG51bWVyaWMsIHJvd3M6IGNlbGxzLnNsaWNlKGtlcHQpLCBvbWl0dGVkLCBmb290LCB4LCB3LFxuICAgICAgICBjb2x1bW5TdHlsZXMsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBBIGxpc3QncyBoZWFkaW5nLCByb3dzLCB0b3RhbHMgcm93IGFuZCB0aGUgcm93cyBwYXN0IGl0cyBmZXRjaC5cbiAgcHJpdmF0ZSBfbGlzdENlbGxzKGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsIGl0ZW06IENvbGxlY3RlZENvbXBvbmVudCk6IFBkZlRhYmxlUGFydHMge1xuICAgIGNvbnN0IHsgY29tcG9uZW50LCBoaWRkZW5Db2x1bW5zIH0gPSBpdGVtO1xuICAgIGNvbnN0IGRhdGEgPSBpdGVtLmRhdGEgYXMgQ29tcG9uZW50RGF0YTtcbiAgICBjb25zdCBoZWFkID0gW2xpc3RIZWFkaW5ncyhjb21wb25lbnQsIGRhdGEsIGNvbnRleHQuZm9ybWF0Q29udGV4dC5sb2NhbGUsIGhpZGRlbkNvbHVtbnMpLm1hcCgoaGVhZGluZykgPT4gdGhpcy5fcGRmVGV4dChoZWFkaW5nKSldO1xuICAgIGNvbnN0IHsgY2VsbHMsIG51bWVyaWMsIGZvb3QgfSA9IHRoaXMuX3RhYmxlQ2VsbHMoY29udGV4dCwgY29tcG9uZW50LCBkYXRhLCBoaWRkZW5Db2x1bW5zKTtcblxuICAgIHJldHVybiB7IGhlYWQsIGNlbGxzLCBudW1lcmljLCBmb290LCBvbWl0dGVkOiBNYXRoLm1heCgwLCAoZGF0YS5wYWdpbmc/LnRvdGFsID8/IGNlbGxzLmxlbmd0aCkgLSBjZWxscy5sZW5ndGgpIH07XG4gIH1cblxuICAvLyBBIHRhYmxlIHRpbGUncyBoZWFkaW5nIHJvd3MgKHNwYW5uZWQgYXMgdGhlIHNjcmVlbidzIGhlYWRlciksIGl0cyBsaW5lc1xuICAvLyAoZ3JvdXBzIGFuZCB0b3RhbHMgYm9sZCwgYSBncm91cCdzIGxhYmVsIHN0ZXBwZWQgaW4gYnkgaXRzIGRlcHRoKSBhbmQgaXRzXG4gIC8vIHRvdGFsIHJvdywgYXMgZ3JpZEV4cG9ydFRhYmxlKCkgbGF5cyB0aGVtIG91dCwgYW5kIHRoZSBsaW5lcyBwYXN0IGl0cyBjYXAuXG4gIHByaXZhdGUgX2dyaWRDZWxscyhpdGVtOiBDb2xsZWN0ZWRDb21wb25lbnQpOiBQZGZUYWJsZVBhcnRzIHtcbiAgICBjb25zdCB0YWJsZSA9IGdyaWRFeHBvcnRUYWJsZShpdGVtLnRhYmxlISk7XG4gICAgY29uc3QgY2VsbCA9IChleHBvcnRlZDogR3JpZEV4cG9ydENlbGwpOiBQZGZUYWJsZUNlbGwgPT4gKHtcbiAgICAgIGNvbnRlbnQ6IHRoaXMuX3BkZlRleHQoZXhwb3J0ZWQudGV4dCksXG4gICAgICBjb2xTcGFuOiBleHBvcnRlZC5jb2xTcGFuLFxuICAgICAgcm93U3BhbjogZXhwb3J0ZWQucm93U3BhbixcbiAgICAgIHN0eWxlczoge1xuICAgICAgICAuLi4oZXhwb3J0ZWQuYm9sZCA/IHsgZm9udFN0eWxlOiAnYm9sZCcgfSA6IHt9KSxcbiAgICAgICAgLi4uKGV4cG9ydGVkLnNoYWRlID8geyBmaWxsQ29sb3I6IGV4cG9ydGVkLnNoYWRlLmJhY2tncm91bmQsIHRleHRDb2xvcjogZXhwb3J0ZWQuc2hhZGUuZm9yZWdyb3VuZCB9IDoge30pLFxuICAgICAgICAuLi4oZXhwb3J0ZWQuaW5kZW50XG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICBjZWxsUGFkZGluZzoge1xuICAgICAgICAgICAgICB0b3A6IFRBQkxFX0NFTExfUEFERElORyxcbiAgICAgICAgICAgICAgcmlnaHQ6IFRBQkxFX0NFTExfUEFERElORyxcbiAgICAgICAgICAgICAgYm90dG9tOiBUQUJMRV9DRUxMX1BBRERJTkcsXG4gICAgICAgICAgICAgIGxlZnQ6IFRBQkxFX0NFTExfUEFERElORyArIGV4cG9ydGVkLmluZGVudCAqIEdSSURfSU5ERU5ULFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGhlYWQ6IHRhYmxlLmhlYWQubWFwKChyb3cpID0+IHJvdy5tYXAoY2VsbCkpLFxuICAgICAgY2VsbHM6IHRhYmxlLmJvZHkubWFwKChyb3cpID0+IHJvdy5tYXAoY2VsbCkpLFxuICAgICAgbnVtZXJpYzogdGFibGUubnVtZXJpYyxcbiAgICAgIGZvb3Q6IHRhYmxlLmZvb3QgPyB0YWJsZS5mb290Lm1hcCgoZXhwb3J0ZWQpID0+IHRoaXMuX3BkZlRleHQoZXhwb3J0ZWQudGV4dCkpIDogbnVsbCxcbiAgICAgIG9taXR0ZWQ6IHRhYmxlLm1vcmVSb3dzLFxuICAgIH07XG4gIH1cblxuICAvLyBFYWNoIGZldGNoZWQgcm93IGFzIHRoZSBzdHJpbmdzIGl0cyB0YWJsZSBjZWxscyBwcmludCwgaW4gdGhlIHJlcG9ydCdzXG4gIC8vIHpvbmUsIGxvY2FsZSBhbmQgY3VycmVuY3ksIHdoaWNoIGNvbHVtbnMgaG9sZCBmb3JtYXR0ZWQgbnVtYmVycywgYW5kIHRoZVxuICAvLyB0b3RhbHMgcm93IChudWxsIHdpdGhvdXQgb25lKS4gVGhlIGNvbHVtbnMgdGhlIHZpZXdlciBoaWQgYXJlIGxlZnQgb3V0LlxuICBwcml2YXRlIF90YWJsZUNlbGxzKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsXG4gICAgZGF0YTogQ29tcG9uZW50RGF0YSxcbiAgICBoaWRkZW5Db2x1bW5zOiByZWFkb25seSBzdHJpbmdbXSxcbiAgKTogeyBjZWxsczogc3RyaW5nW11bXTsgbnVtZXJpYzogYm9vbGVhbltdOyBmb290OiBzdHJpbmdbXSB8IG51bGwgfSB7XG4gICAgY29uc3QgY29sdW1ucyA9IGxpc3RDb2x1bW5zKGNvbXBvbmVudCwgZGF0YSwgY29udGV4dC5mb3JtYXRDb250ZXh0LmxvY2FsZSwgaGlkZGVuQ29sdW1ucyk7XG4gICAgY29uc3QgY2VsbHMgPSBkYXRhLnJvd3MubWFwKChyb3cpID0+IGNvbHVtbnMubWFwKChjb2x1bW4pID0+IHRoaXMuX3BkZlRleHQoXG4gICAgICBleHBvcnRDZWxsKHJvd1tjb2x1bW4uY29sdW1uXSwgY29sdW1uLCBjb250ZXh0LnRpbWV6b25lLCBjb250ZXh0LmZvcm1hdENvbnRleHQsIHJvdyksXG4gICAgKSkpO1xuICAgIGNvbnN0IGZvb3QgPSBsaXN0VG90YWxzUm93KGRhdGEsIGNvbHVtbnMsIGNvbnRleHQudGltZXpvbmUsIGNvbnRleHQuZm9ybWF0Q29udGV4dCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY2VsbHMsXG4gICAgICBudW1lcmljOiBjb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubnVtZXJpYyksXG4gICAgICBmb290OiBmb290ID8gZm9vdC5tYXAoKGNlbGwpID0+IHRoaXMuX3BkZlRleHQoY2VsbCkpIDogbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgLy8gVGhlIGF1dG9UYWJsZSBvcHRpb25zIGV2ZXJ5IGxpc3QgdGFibGUgc2hhcmVzOiB0aGUgZHJ5IHJ1biwgdGhlIG9uLXBhZ2VcbiAgLy8gZHJhdyBhbmQgdGhlIGNvbnRpbnVhdGlvbiBwYWdlcywgc28gdGhlIHRocmVlIGxheSBhIHRhYmxlIG91dCBhbGlrZS4gVGhlXG4gIC8vIGZvbnQgaXMgbmFtZWQgcmF0aGVyIHRoYW4gaW5oZXJpdGVkLCBzaW5jZSB0aGUgZG9jIGNhcnJpZXMgd2hhdGV2ZXIgdGhlXG4gIC8vIGxhc3QgdGV4dCBkcmF3biBsZWZ0IHNldC4gYm90dG9tIGlzIHRoZSBtYXJnaW4gdW5kZXIgdGhlIHRhYmxlLCBwb2ludHMuXG4gIC8vXG4gIC8vIEEgY29sdW1uIG9mIGZvcm1hdHRlZCBudW1iZXJzIGlzIHJpZ2h0LWFsaWduZWQsIGl0cyBoZWFkaW5nIGFuZCB0b3RhbFxuICAvLyB0b286IHRoZSBib2R5IHRocm91Z2ggY29sdW1uU3R5bGVzLCB3aGljaCBhdXRvVGFibGUgYXBwbGllcyB0byBib2R5IGNlbGxzXG4gIC8vIG9ubHksIGFuZCB0aGUgaGVhZGluZyBhbmQgdG90YWwgdGhyb3VnaCB0aGUgZGlkUGFyc2VDZWxsIGhvb2ssIG9uIGV2ZXJ5XG4gIC8vIHBhZ2UgdGhlIGhlYWRpbmcgcmVwZWF0cy4gQSB0b3RhbHMgcm93IChmb290KSBwcmludHMgb25jZSwgdW5kZXIgdGhlXG4gIC8vIHRhYmxlJ3MgbGFzdCByb3csIGJvbGQgb24gdGhlIGJvcmRlciBncmF5LlxuICBwcml2YXRlIF90YWJsZU9wdGlvbnMoXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBoZWFkOiBQZGZUYWJsZUNlbGxbXVtdLFxuICAgIG51bWVyaWM6IGJvb2xlYW5bXSxcbiAgICBib2R5OiBQZGZUYWJsZUNlbGxbXVtdLFxuICAgIHg6IG51bWJlciwgc3RhcnRZOiBudW1iZXIsIHc6IG51bWJlciwgYm90dG9tOiBudW1iZXIsXG4gICAgY29sdW1uU3R5bGVzPzogUGRmQ29sdW1uU3R5bGVzLFxuICAgIGZvb3Q/OiBzdHJpbmdbXSB8IG51bGwsXG4gICk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4ge1xuICAgICAgdGhlbWU6ICdncmlkJyxcbiAgICAgIGhlYWQsXG4gICAgICBib2R5LFxuICAgICAgc3RhcnRZLFxuICAgICAgbWFyZ2luOiB7IGxlZnQ6IHgsIHJpZ2h0OiBjb250ZXh0LnBhZ2VXIC0geCAtIHcsIGJvdHRvbSB9LFxuICAgICAgdGFibGVXaWR0aDogdyxcbiAgICAgIHJvd1BhZ2VCcmVhazogJ2F2b2lkJyxcbiAgICAgIHN0eWxlczoge1xuICAgICAgICBmb250OiAnaGVsdmV0aWNhJyxcbiAgICAgICAgZm9udFN0eWxlOiAnbm9ybWFsJyxcbiAgICAgICAgZm9udFNpemU6IFRBQkxFX0ZPTlRfU0laRSxcbiAgICAgICAgY2VsbFBhZGRpbmc6IFRBQkxFX0NFTExfUEFERElORyxcbiAgICAgICAgdGV4dENvbG9yOiAnIzFmMjkzMycsXG4gICAgICB9LFxuICAgICAgaGVhZFN0eWxlczogeyBmaWxsQ29sb3I6ICcjNGU3OWE3JywgdGV4dENvbG9yOiAnI2ZmZmZmZicsIGZvbnRTdHlsZTogJ2JvbGQnIH0sXG4gICAgICBhbHRlcm5hdGVSb3dTdHlsZXM6IHsgZmlsbENvbG9yOiAnI2Y1ZjdmYScgfSxcbiAgICAgIC4uLihjb2x1bW5TdHlsZXMgPyB7IGNvbHVtblN0eWxlcyB9IDoge30pLFxuICAgICAgLi4uKGZvb3RcbiAgICAgICAgPyB7XG4gICAgICAgICAgZm9vdDogW2Zvb3RdLFxuICAgICAgICAgIHNob3dGb290OiAnbGFzdFBhZ2UnLFxuICAgICAgICAgIGZvb3RTdHlsZXM6IHsgZmlsbENvbG9yOiAnI2U0ZTdlYicsIHRleHRDb2xvcjogJyMxZjI5MzMnLCBmb250U3R5bGU6ICdib2xkJyB9LFxuICAgICAgICB9XG4gICAgICAgIDoge30pLFxuICAgICAgZGlkUGFyc2VDZWxsOiAoaG9vazogYW55KSA9PiB7XG4gICAgICAgIGlmICgoaG9vay5zZWN0aW9uID09PSAnaGVhZCcgfHwgaG9vay5zZWN0aW9uID09PSAnZm9vdCcpICYmIG51bWVyaWNbaG9vay5jb2x1bW4uaW5kZXhdKSB7XG4gICAgICAgICAgaG9vay5jZWxsLnN0eWxlcy5oYWxpZ24gPSAncmlnaHQnO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvLyBBIG5vdGljZSBhcyBhIHRhYmxlIHJvdzogb25lIGl0YWxpYyBncmV5IGNlbGwgc3Bhbm5pbmcgZXZlcnkgY29sdW1uLiBBXG4gIC8vIHNpbmdsZS1saW5lIG5vdGljZSBpcyBlbGxpcHNpemVkIGF0IHRoZSBib3gncyB3aWR0aCBhbmQga2VlcHMgdGhlIGRhdGFcbiAgLy8gY2VsbHMnIGZvbnQgc2l6ZSBhbmQgcGFkZGluZywgc28gaXQgaXMgbmV2ZXIgdGFsbGVyIHRoYW4gdGhlIGRhdGEgcm93XG4gIC8vIHdob3NlIHBsYWNlIGl0IHRha2VzLlxuICBwcml2YXRlIF9ub3RpY2VSb3codGV4dDogc3RyaW5nLCBzcGFuOiBudW1iZXIsIHNpbmdsZUxpbmU6IGJvb2xlYW4pOiBQZGZUYWJsZUNlbGxbXSB7XG4gICAgcmV0dXJuIFt7XG4gICAgICBjb250ZW50OiB0ZXh0LFxuICAgICAgY29sU3Bhbjogc3BhbixcbiAgICAgIC8vIExlZnQtYWxpZ25lZCB3aGF0ZXZlciB0aGUgZmlyc3QgY29sdW1uIGlzOiBhIHNwYW5uZWQgY2VsbCBvdGhlcndpc2VcbiAgICAgIC8vIHRha2VzIGNvbHVtblN0eWxlc1swXSwgcmlnaHQtYWxpZ25lZCB3aGVuIHRoYXQgY29sdW1uIGlzIG51bWVyaWMuXG4gICAgICBzdHlsZXM6IHtcbiAgICAgICAgZm9udFN0eWxlOiAnaXRhbGljJyxcbiAgICAgICAgdGV4dENvbG9yOiBNVVRFRF9DT0xPUixcbiAgICAgICAgaGFsaWduOiAnbGVmdCcsXG4gICAgICAgIC4uLihzaW5nbGVMaW5lID8geyBvdmVyZmxvdzogJ2VsbGlwc2l6ZScgfSA6IHt9KSxcbiAgICAgIH0sXG4gICAgfV07XG4gIH1cblxuICAvLyBMYXlzIGV2ZXJ5IGZldGNoZWQgcm93IG91dCBvbmNlIG9uIGEgc2NyYXRjaCBkb2N1bWVudCBvZiB0aGUgc2FtZSBwYWdlXG4gIC8vIHNpemUsIHdpdGggdGhlIG9wdGlvbnMgdGhlIHJlYWwgZHJhdyB1c2VzLCBhbmQgcmVhZHMgYmFjayBob3cgbWFueSBib2R5XG4gIC8vIHJvd3MgdGhlIGJveCBob2xkcyAoZml0KSwgdGhlIGNvbHVtbiB3aWR0aHMgYXV0b1RhYmxlIGNob3NlLCB3aXRoIGVhY2hcbiAgLy8gbnVtZXJpYyBjb2x1bW4ncyByaWdodCBhbGlnbm1lbnQgbWVyZ2VkIGluLCBzbyB0aGUgb24tcGFnZSB0YWJsZSBhbmQgaXRzXG4gIC8vIGNvbnRpbnVhdGlvbiBwYWdlcyBjYXJyeSBib3RoLCBhbmQgdGhlIGxlYXN0IHJvb20gYSBwYWdlIG11c3QgZ2l2ZSB0aGVcbiAgLy8gdGFibGUgKG1pbkhlaWdodCkuIFRoZSB0b3RhbHMgcm93IGlzIGxhaWQgb3V0IHRvbywgc28gdGhlIHdpZHRocyBob2xkIGl0LFxuICAvLyBhbmQgYSB0YWJsZSB3aG9zZSByb3dzIGZpdCB0aGUgYm94IGJ1dCB3aG9zZSB0b3RhbHMgcm93IGRvZXMgbm90IG1vdmVzXG4gIC8vIGl0cyBsYXN0IHJvdyBvbi4gZml0IDAgbWVhbnMgbm90IGV2ZW4gb25lIGJvZHkgcm93IGZpdHMgdW5kZXIgdGhlIGhlYWQuXG4gIC8vIFRoZSB0YWJsZSBpcyBsYWlkIG91dCwgbmV2ZXIgZHJhd246IGRyYXduLCBhdXRvVGFibGUgcGFnZXMgaXQsIGFuZCBhIHRhYmxlXG4gIC8vIHdpdGggbm8gcm9vbSBmb3IgYSByb3cgb24gYSBwYWdlIHBhZ2VzIHdpdGhvdXQgZW5kLlxuICBwcml2YXRlIF9tZWFzdXJlKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgaGVhZDogUGRmVGFibGVDZWxsW11bXSxcbiAgICBjZWxsczogUGRmVGFibGVDZWxsW11bXSxcbiAgICBudW1lcmljOiBib29sZWFuW10sXG4gICAgZm9vdDogc3RyaW5nW10gfCBudWxsLFxuICAgIHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsIGJvdHRvbTogbnVtYmVyLFxuICApOiBQZGZUYWJsZU1lYXN1cmUge1xuICAgIGNvbnN0IHNjcmF0Y2ggPSB0aGlzLl9zY3JhdGNoRG9jdW1lbnQoY29udGV4dCk7XG4gICAgY29uc3QgdGFibGUgPSBjb250ZXh0LmNyZWF0ZVRhYmxlKFxuICAgICAgc2NyYXRjaCxcbiAgICAgIHRoaXMuX3RhYmxlT3B0aW9ucyhjb250ZXh0LCBoZWFkLCBudW1lcmljLCBjZWxscywgeCwgeSwgdywgYm90dG9tLCB1bmRlZmluZWQsIGZvb3QpLFxuICAgICk7XG4gICAgY29uc3QgY29sdW1uczogeyB3aWR0aDogbnVtYmVyIH1bXSA9IHRhYmxlLmNvbHVtbnM7XG4gICAgY29uc3QgY29sdW1uU3R5bGVzOiBQZGZDb2x1bW5TdHlsZXMgPSB7fTtcbiAgICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbiwgaW5kZXgpID0+IHtcbiAgICAgIGNvbHVtblN0eWxlc1tpbmRleF0gPSBudW1lcmljW2luZGV4XVxuICAgICAgICA/IHsgY2VsbFdpZHRoOiBjb2x1bW4ud2lkdGgsIGhhbGlnbjogJ3JpZ2h0JyB9XG4gICAgICAgIDogeyBjZWxsV2lkdGg6IGNvbHVtbi53aWR0aCB9O1xuICAgIH0pO1xuXG4gICAgY29uc3QgaGVhZEhlaWdodCA9IHRhYmxlLmdldEhlYWRIZWlnaHQodGFibGUuY29sdW1ucyk7XG4gICAgY29uc3QgZm9vdEhlaWdodCA9IHRhYmxlLmdldEZvb3RIZWlnaHQodGFibGUuY29sdW1ucyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZml0OiB0aGlzLl9maXR0aW5nUm93cyh0YWJsZSwgeSArIGhlYWRIZWlnaHQsIGNvbnRleHQucGFnZUggLSBib3R0b20sIGZvb3RIZWlnaHQpLFxuICAgICAgY29sdW1uU3R5bGVzLFxuICAgICAgLy8gT25lIGxpbmUgb2YgYSByb3c6IHRoZSBsaW5lIGF1dG9UYWJsZSBtdXN0IHBsYWNlIG9uIGEgcGFnZSBiZWZvcmUgaXRcbiAgICAgIC8vIG1vdmVzIG9uLCBhdCB0aGUgdGFibGUncyBmb250IHNpemUgYW5kIHBhZGRpbmcuXG4gICAgICBtaW5IZWlnaHQ6IGhlYWRIZWlnaHQgKyBmb290SGVpZ2h0ICsgVEFCTEVfRk9OVF9TSVpFICogc2NyYXRjaC5nZXRMaW5lSGVpZ2h0RmFjdG9yKCkgKyAyICogVEFCTEVfQ0VMTF9QQURESU5HLFxuICAgIH07XG4gIH1cblxuICAvLyBIb3cgbWFueSBvZiBhIGxhaWQtb3V0IHRhYmxlJ3MgYm9keSByb3dzIGZpdCB3aG9sZSBiZXR3ZWVuIHRvcCBhbmRcbiAgLy8gYm90dG9tLCBhcyBhdXRvVGFibGUgZGVjaWRlcyBpdDogYSByb3cgZml0cyB3aGVuIGl0cyB0YWxsZXN0IGNlbGwgKG9uZSB0aGF0XG4gIC8vIHNwYW5zIHJvd3MgY291bnRzIGFsbCBvZiB0aGVtKSBlbmRzIGJ5IGJvdHRvbSwgdGhlIGxhc3Qgcm93J3MgYnkgdGhlIHRvcFxuICAvLyBvZiB0aGUgdG90YWxzIHJvdyAoZm9vdEhlaWdodCkgdW5kZXIgaXQsIGFuZCB0aGUgbmV4dCByb3cgc3RhcnRzIHdoZXJlIGl0XG4gIC8vIGVuZHMuXG4gIHByaXZhdGUgX2ZpdHRpbmdSb3dzKHRhYmxlOiBhbnksIHRvcDogbnVtYmVyLCBib3R0b206IG51bWJlciwgZm9vdEhlaWdodDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBsZXQgY3Vyc29yID0gdG9wO1xuICAgIGxldCBmaXQgPSAwO1xuXG4gICAgZm9yIChjb25zdCBbaW5kZXgsIHJvd10gb2YgdGFibGUuYm9keS5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IGxpbWl0ID0gaW5kZXggPT09IHRhYmxlLmJvZHkubGVuZ3RoIC0gMSA/IGJvdHRvbSAtIGZvb3RIZWlnaHQgOiBib3R0b207XG4gICAgICBpZiAoY3Vyc29yICsgcm93LmdldE1heENlbGxIZWlnaHQodGFibGUuY29sdW1ucykgPiBsaW1pdCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY3Vyc29yICs9IHJvdy5oZWlnaHQ7XG4gICAgICBmaXQgKz0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gZml0O1xuICB9XG5cbiAgLy8gQSBibGFuayBkb2N1bWVudCBvZiB0aGUgZXhwb3J0J3MgcGFnZSBzaXplLCBmb3IgbGF5aW5nIGEgdGFibGUgb3V0IHRvIHNlZVxuICAvLyB3aGF0IGZpdHMgYmVmb3JlIHRoZSByZWFsIG9uZSBpcyBkcmF3biBvbi5cbiAgcHJpdmF0ZSBfc2NyYXRjaERvY3VtZW50KGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQpOiBhbnkge1xuICAgIHJldHVybiBuZXcgY29udGV4dC5qc1BERih7XG4gICAgICB1bml0OiAncHQnLFxuICAgICAgZm9ybWF0OiBbY29udGV4dC5wYWdlVywgY29udGV4dC5wYWdlSF0sXG4gICAgICBvcmllbnRhdGlvbjogY29udGV4dC5vcmllbnRhdGlvbixcbiAgICB9KTtcbiAgfVxuXG4gIC8vIERyYXdzIGFuIG9uLXBhZ2UgdGFibGUgKGEgbGlzdCdzLCBvciBhIHRleHQgYmxvY2sncykgb24gaXRzIHBhZ2UgYWxvbmUuXG4gIC8vIFRoYXQgaXMgYWxsIGl0IHNob3VsZCBuZWVkOiB0aGUgbWVhc3VyZWQgZml0LCB0aGUgaWRlbnRpY2FsIGNvbHVtbiB3aWR0aHNcbiAgLy8gYW5kIGEgc2luZ2xlLWxpbmUgbm90aWNlIGtlZXAgdGhlIHRhYmxlIGluc2lkZSBpdHMgYm94LiBTaG91bGQgYXV0b1RhYmxlXG4gIC8vIHN0YXJ0IGFub3RoZXIgcGFnZSBhbnl3YXksIHRoZSB0YWJsZSBzdG9wcyB0aGVyZSBhbmQgdGhlIHBhZ2UgZ29lcywgc28gYVxuICAvLyBzdHJheSBwYWdlIGNhbiBuZXZlciBjYXRjaCB0aGUgcmVwb3J0IHBhZ2UncyByZW1haW5pbmcgY29tcG9uZW50cywgbm9yIGFcbiAgLy8gdGFibGUgd2l0aCBubyByb29tIGZvciBhIHJvdyBhZGQgcGFnZXMgd2l0aG91dCBlbmQuIFJldHVybnMgd2hldGhlciB0aGVcbiAgLy8gdGFibGUgd2FzIGRyYXduIHdob2xlLlxuICBwcml2YXRlIF9kcmF3VGFibGUoY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCwgb3B0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBib29sZWFuIHtcbiAgICBjb25zdCB7IGRvYyB9ID0gY29udGV4dDtcbiAgICBjb25zdCBwYWdlID0gZG9jLmdldEN1cnJlbnRQYWdlSW5mbygpLnBhZ2VOdW1iZXI7XG4gICAgY29uc3QgcGFnZXMgPSBkb2MuZ2V0TnVtYmVyT2ZQYWdlcygpO1xuICAgIGxldCB3aG9sZSA9IHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgY29udGV4dC5hdXRvVGFibGUoZG9jLCB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIC8vIEZpcmVzIGFzIHRoZSB0YWJsZSBzdGFydHMgaXRzIG93biBwYWdlLCBhbmQgYWdhaW4gb24gZWFjaCBwYWdlIGl0XG4gICAgICAgIC8vIG1vdmVzIHRvIChhbiBleGlzdGluZyBwYWdlLCBzdWNoIGFzIGEgY29udGludWF0aW9uIHBhZ2UgdW5kZXIgYVxuICAgICAgICAvLyBoZWFkZXIsIGFzIHdlbGwgYXMgYSBuZXcgb25lKS5cbiAgICAgICAgd2lsbERyYXdQYWdlOiAoKSA9PiB7XG4gICAgICAgICAgaWYgKGRvYy5nZXRDdXJyZW50UGFnZUluZm8oKS5wYWdlTnVtYmVyICE9PSBwYWdlKSB7XG4gICAgICAgICAgICB0aHJvdyBTVFJBWV9QQUdFO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgIT09IFNUUkFZX1BBR0UpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIHdob2xlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgd2hpbGUgKGRvYy5nZXROdW1iZXJPZlBhZ2VzKCkgPiBwYWdlcykge1xuICAgICAgZG9jLmRlbGV0ZVBhZ2UoZG9jLmdldE51bWJlck9mUGFnZXMoKSk7XG4gICAgfVxuXG4gICAgZG9jLnNldFBhZ2UocGFnZSk7XG5cbiAgICByZXR1cm4gd2hvbGU7XG4gIH1cblxuICAvLyBUaGUgcm93cyBvZiBvbmUgbGlzdCB0aGF0IGRpZCBub3QgZml0IGl0cyBib3gsIG9uIHBhZ2VzIGFwcGVuZGVkIGFmdGVyXG4gIC8vIHRoZSByZXBvcnQgcGFnZSwgZWFjaCB3aXRoIHRoZSBwYWdlJ3MgaGVhZGVyIGFuZCBmb290ZXIsIHRoZSB0YWJsZSdzXG4gIC8vIHRpdGxlIGFuZCBpdHMgaGVhZCBhZ2FpbiwgdGhlIHRpdGxlJ3MgdG9rZW5zIGZpbGxlZCB3aXRoIHRoZSBwaHlzaWNhbFxuICAvLyBwYWdlIGl0IGlzIGRyYXduIG9uLiBUaGUgdGFibGUgc2l0cyBDT05USU5VQVRJT05fR0FQIGluc2lkZSB0aGUgYmFuZHMuXG4gIC8vIFJldHVybnMgdGhlIHBoeXNpY2FsIHBhZ2UgY291bnRlciBhZnRlciB0aGVzZSBwYWdlcy5cbiAgcHJpdmF0ZSBhc3luYyBfcmVuZGVyQ29udGludWF0aW9uKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgcGFnZTogUmVwb3J0UGFnZSxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIHBhZ2VOdW1iZXI6IG51bWJlcixcbiAgICBvdmVyZmxvdzogUGRmVGFibGVPdmVyZmxvdyxcbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB7IGRvYyB9ID0gY29udGV4dDtcbiAgICBjb25zdCB7IHRvcCwgYm90dG9tIH0gPSB0aGlzLl9jb250aW51YXRpb25NYXJnaW5zKGNvbnRleHQsIHBhZ2UpO1xuICAgIGNvbnN0IHsgeCwgdyB9ID0gb3ZlcmZsb3c7XG4gICAgY29uc3QgYm9keTogUGRmVGFibGVDZWxsW11bXSA9IG92ZXJmbG93Lm9taXR0ZWQgPiAwXG4gICAgICA/IFsuLi5vdmVyZmxvdy5yb3dzLCB0aGlzLl9ub3RpY2VSb3cobW9yZVJvd3NOb3RpY2Uob3ZlcmZsb3cub21pdHRlZCksIG92ZXJmbG93Lm51bWVyaWMubGVuZ3RoLCBmYWxzZSldXG4gICAgICA6IG92ZXJmbG93LnJvd3M7XG4gICAgLy8gVGhlIGRvY3VtZW50J3MgcGFnZXMgdGhlIHRhYmxlIGRyYXdzIG9uLCBpbiBvcmRlci5cbiAgICBjb25zdCBwYWdlczogbnVtYmVyW10gPSBbXTtcblxuICAgIGRvYy5hZGRQYWdlKFtjb250ZXh0LnBhZ2VXLCBjb250ZXh0LnBhZ2VIXSwgY29udGV4dC5vcmllbnRhdGlvbik7XG4gICAgY29udGV4dC5hdXRvVGFibGUoZG9jLCB7XG4gICAgICAuLi50aGlzLl90YWJsZU9wdGlvbnMoXG4gICAgICAgIGNvbnRleHQsIG92ZXJmbG93LmhlYWQsIG92ZXJmbG93Lm51bWVyaWMsIGJvZHksIHgsIHRvcCArIFRJVExFX0gsIHcsIGJvdHRvbSwgb3ZlcmZsb3cuY29sdW1uU3R5bGVzLFxuICAgICAgICBvdmVyZmxvdy5mb290LFxuICAgICAgKSxcbiAgICAgIG1hcmdpbjogeyB0b3A6IHRvcCArIFRJVExFX0gsIGJvdHRvbSwgbGVmdDogeCwgcmlnaHQ6IGNvbnRleHQucGFnZVcgLSB4IC0gdyB9LFxuICAgICAgc2hvd0hlYWQ6ICdldmVyeVBhZ2UnLFxuICAgICAgLy8gRmlyZXMgb24gZXZlcnkgcGFnZSB0aGUgdGFibGUgZHJhd3Mgb24sIHRoZSBmaXJzdCBpbmNsdWRlZC5cbiAgICAgIHdpbGxEcmF3UGFnZTogKCkgPT4ge1xuICAgICAgICBwYWdlcy5wdXNoKGRvYy5nZXRDdXJyZW50UGFnZUluZm8oKS5wYWdlTnVtYmVyKTtcbiAgICAgICAgY29uc3QgdG9rZW5zID0gdGhpcy5fdG9rZW5zKGNvbnRleHQsIHBhZ2UsIGluZGV4LCBwYWdlTnVtYmVyICsgcGFnZXMubGVuZ3RoKTtcbiAgICAgICAgdGhpcy5fY29tcG9uZW50VGl0bGUoXG4gICAgICAgICAgZG9jLFxuICAgICAgICAgIHRoaXMuX2NvbnRpbnVlZFRpdGxlKG92ZXJmbG93LmNvbXBvbmVudCwgdG9rZW5zLCBvdmVyZmxvdy5zZWFyY2gsIG92ZXJmbG93LmNydW1icywgb3ZlcmZsb3cuZmlsdGVyZWQpLFxuICAgICAgICAgIHgsXG4gICAgICAgICAgdG9wLFxuICAgICAgICAgIHcsXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgYXdhaXQgdGhpcy5fcmVuZGVyQ29udGludWF0aW9uTWFzdGVycyhjb250ZXh0LCBwYWdlLCBpbmRleCwgcGFnZU51bWJlciwgcGFnZXMpO1xuXG4gICAgcmV0dXJuIHBhZ2VOdW1iZXIgKyBwYWdlcy5sZW5ndGg7XG4gIH1cblxuICAvLyBUaGUgaGVhZGVyIGFuZCBmb290ZXIgb2YgZWFjaCBjb250aW51YXRpb24gcGFnZSwgbnVtYmVyZWQgb24gZnJvbVxuICAvLyBwYWdlTnVtYmVyLiBUaGV5IGdvIG9uIG9uY2UgdGhlIHRhYmxlIGlzIGRyYXduLCBzaW5jZSBhIHRleHQgYmxvY2sgd2l0aCBhXG4gIC8vIHRhYmxlIGlzIG1lYXN1cmVkIGJlZm9yZSBpdCBpcyBkcmF3biwgd2hpY2ggYXV0b1RhYmxlJ3MgcGFnZSBob29rIGNhbm5vdFxuICAvLyB3YWl0IGZvcjsgdGhleSBzaXQgaW4gdGhlIGJhbmRzLCBjbGVhciBvZiB0aGUgdGFibGUuXG4gIHByaXZhdGUgYXN5bmMgX3JlbmRlckNvbnRpbnVhdGlvbk1hc3RlcnMoXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBwYWdlOiBSZXBvcnRQYWdlLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgcGFnZU51bWJlcjogbnVtYmVyLFxuICAgIHBhZ2VzOiBudW1iZXJbXSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBkb2MgfSA9IGNvbnRleHQ7XG5cbiAgICBmb3IgKGNvbnN0IFtvZmZzZXQsIGRvY3VtZW50UGFnZV0gb2YgcGFnZXMuZW50cmllcygpKSB7XG4gICAgICBkb2Muc2V0UGFnZShkb2N1bWVudFBhZ2UpO1xuICAgICAgYXdhaXQgdGhpcy5fcmVuZGVyTWFzdGVyKGNvbnRleHQsIHBhZ2UsIHRoaXMuX3Rva2Vucyhjb250ZXh0LCBwYWdlLCBpbmRleCwgcGFnZU51bWJlciArIG9mZnNldCArIDEpKTtcbiAgICB9XG5cbiAgICBkb2Muc2V0UGFnZShkb2MuZ2V0TnVtYmVyT2ZQYWdlcygpKTtcbiAgfVxuXG4gIC8vIFRoZSBtYXJnaW5zIGEgY29udGludWF0aW9uIHRhYmxlIGtlZXBzIGZyb20gdGhlIHRvcCBhbmQgYm90dG9tIG9mIGl0c1xuICAvLyBwYWdlcywgdW5kZXIgaXRzIHRpdGxlJ3Mgc3RyaXAgYXQgdGhlIHRvcC5cbiAgcHJpdmF0ZSBfY29udGludWF0aW9uTWFyZ2lucyhjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LCBwYWdlOiBSZXBvcnRQYWdlKTogeyB0b3A6IG51bWJlcjsgYm90dG9tOiBudW1iZXIgfSB7XG4gICAgY29uc3QgYmFuZHMgPSBwYWdlLm1hc3RlckhpZGRlbiA/IE5PX0JBTkRTIDogY29udGV4dC5yZXBvcnQuY29uZmlnPy5oZWFkZXJGb290ZXIgPz8gTk9fQkFORFM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdG9wOiB0aGlzLl9jb250aW51YXRpb25NYXJnaW4oYmFuZHMuaGVhZGVySGVpZ2h0KSxcbiAgICAgIGJvdHRvbTogdGhpcy5fY29udGludWF0aW9uTWFyZ2luKGJhbmRzLmZvb3RlckhlaWdodCksXG4gICAgfTtcbiAgfVxuXG4gIC8vIFRoZSBoZWlnaHQgYSBjb250aW51YXRpb24gcGFnZSBnaXZlcyBpdHMgdGFibGU6IGJldHdlZW4gaXRzIG1hcmdpbnMsIHVuZGVyXG4gIC8vIHRoZSB0aXRsZS5cbiAgcHJpdmF0ZSBfY29udGludWF0aW9uUm9vbShjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LCBwYWdlOiBSZXBvcnRQYWdlKTogbnVtYmVyIHtcbiAgICBjb25zdCB7IHRvcCwgYm90dG9tIH0gPSB0aGlzLl9jb250aW51YXRpb25NYXJnaW5zKGNvbnRleHQsIHBhZ2UpO1xuXG4gICAgcmV0dXJuIGNvbnRleHQucGFnZUggLSB0b3AgLSBUSVRMRV9IIC0gYm90dG9tO1xuICB9XG5cbiAgLy8gVGhlIG1hcmdpbiBhIGNvbnRpbnVhdGlvbiB0YWJsZSBrZWVwcyBmcm9tIG9uZSBlZGdlOiBpbnNpZGUgdGhlIGJhbmQgd2hlblxuICAvLyB0aGUgcGFnZSBoYXMgb25lLlxuICBwcml2YXRlIF9jb250aW51YXRpb25NYXJnaW4oYmFuZDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gYmFuZCA/IGJhbmQgKiBQVCArIENPTlRJTlVBVElPTl9HQVAgOiBOT19CQU5EX01BUkdJTjtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbnRpbnVlZFRpdGxlKFxuICAgIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LFxuICAgIHRva2VuczogVGV4dFRva2VuQ29udGV4dCxcbiAgICBzZWFyY2g/OiBzdHJpbmcsXG4gICAgY3J1bWJzPzogc3RyaW5nW10sXG4gICAgZmlsdGVyZWQ/OiBib29sZWFuLFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IHRpdGxlID0gZXhwb3J0VGl0bGUoY29tcG9uZW50LCB0b2tlbnMsIHNlYXJjaCwgY3J1bWJzLCBmaWx0ZXJlZCk7XG5cbiAgICByZXR1cm4gdGl0bGUgPyBgJHt0aXRsZX0gKGNvbnRpbnVlZClgIDogJ0NvbnRpbnVlZCc7XG4gIH1cblxuICAvLyBBIEtQSSB0aWxlOiB0aGUgY2FyZCB0aGUgc2NyZWVuIGRyYXdzIChrcGktY2FyZC50cyBkZWNpZGVzIGV2ZXJ5IGxpbmUpLFxuICAvLyBzdGFja2VkIGFuZCBjZW50ZXJlZCBpbiB0aGUgYm9keS4gQSBjYXJkIHdpdGggb25seSBpdHMgdmFsdWUgYW5kIGxhYmVsXG4gIC8vIGtlZXBzIHRoZSB0aWxlJ3MgbG9uZy1zdGFuZGluZyBsYXlvdXQuXG4gIHByaXZhdGUgX3JlbmRlcktwaShcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGl0ZW06IENvbGxlY3RlZENvbXBvbmVudCxcbiAgICB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyLCBoOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHsgZG9jIH0gPSBjb250ZXh0O1xuICAgIGNvbnN0IGNvbmZpZyA9IGl0ZW0uY29tcG9uZW50LmNvbmZpZyBhcyBLcGlDb25maWc7XG4gICAgY29uc3QgdmlldyA9IGtwaUNhcmRWaWV3KGNvbmZpZywgaXRlbS5kYXRhLCB7IGZvcm1hdDogY29udGV4dC5mb3JtYXRDb250ZXh0LCB0aW1lem9uZTogY29udGV4dC50aW1lem9uZSB9KTtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX3BkZlRleHQodmlldy52YWx1ZSk7XG4gICAgY29uc3Qgbm90ZXMgPSBleHBvcnROb3RlTGluZXMoaXRlbSwgY29udGV4dC50aW1lem9uZSwgY29udGV4dC5mb3JtYXRDb250ZXh0LmxvY2FsZSk7XG5cbiAgICBpZiAoIWtwaUNhcmRIYXNFeHRyYXModmlldywgbm90ZXMpKSB7XG4gICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcbiAgICAgIGRvYy5zZXRGb250U2l6ZSgyNik7XG4gICAgICBkb2Muc2V0VGV4dENvbG9yKCcjMWYyOTMzJyk7XG4gICAgICBkb2MudGV4dCh2YWx1ZSwgeCArIHcgLyAyLCB5ICsgaCAvIDIsIHsgYWxpZ246ICdjZW50ZXInIH0pO1xuXG4gICAgICBpZiAodmlldy5sYWJlbCkge1xuICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ25vcm1hbCcpO1xuICAgICAgICBkb2Muc2V0Rm9udFNpemUoOSk7XG4gICAgICAgIGRvYy5zZXRUZXh0Q29sb3IoTVVURURfQ09MT1IpO1xuICAgICAgICBkb2MudGV4dCh2aWV3LmxhYmVsLCB4ICsgdyAvIDIsIHkgKyBoIC8gMiArIDE2LCB7IGFsaWduOiAnY2VudGVyJyB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEEgdGlsZSB0b28gc2hvcnQgZm9yIHRoZSBjYXJkJ3MgbGluZXMgc2hyaW5rcyB0aGVtIGFsbCBhbGlrZS5cbiAgICBjb25zdCBwYXJ0cyA9IGtwaUV4cG9ydFBhcnRzKHZpZXcsIG5vdGVzLCBoLCBLUElfSEVJR0hUUyk7XG4gICAgY29uc3QgaGVpZ2h0cyA9IHNjYWxlZEtwaUhlaWdodHMoS1BJX0hFSUdIVFMsIHBhcnRzLnNjYWxlKTtcbiAgICBsZXQgdG9wID0geSArIE1hdGgubWF4KDAsIChoIC0ga3BpRXhwb3J0SGVpZ2h0KHZpZXcsIHBhcnRzLCBoZWlnaHRzKSkgLyAyKTtcblxuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSgyNiAqIHBhcnRzLnNjYWxlKTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKCcjMWYyOTMzJyk7XG4gICAgZG9jLnRleHQodmFsdWUsIHggKyB3IC8gMiwgdG9wICsgS1BJX1ZBTFVFX0JBU0VMSU5FICogcGFydHMuc2NhbGUsIHsgYWxpZ246ICdjZW50ZXInIH0pO1xuICAgIHRvcCArPSBoZWlnaHRzLnZhbHVlO1xuXG4gICAgaWYgKHZpZXcubGFiZWwpIHtcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnbm9ybWFsJyk7XG4gICAgICBkb2Muc2V0Rm9udFNpemUoOSAqIHBhcnRzLnNjYWxlKTtcbiAgICAgIGRvYy5zZXRUZXh0Q29sb3IoTVVURURfQ09MT1IpO1xuICAgICAgZG9jLnRleHQodGhpcy5fZml0KGRvYywgdGhpcy5fcGRmVGV4dCh2aWV3LmxhYmVsKSwgdyksIHggKyB3IC8gMiwgdG9wICsgOSAqIHBhcnRzLnNjYWxlLCB7IGFsaWduOiAnY2VudGVyJyB9KTtcbiAgICAgIHRvcCArPSBoZWlnaHRzLmxhYmVsO1xuICAgIH1cblxuICAgIGlmIChwYXJ0cy5kZWx0YSAmJiB2aWV3LmRlbHRhKSB7XG4gICAgICB0aGlzLl9rcGlEZWx0YShkb2MsIHZpZXcuZGVsdGEsIHgsIHRvcCwgdywgcGFydHMuc2NhbGUpO1xuICAgICAgdG9wICs9IGhlaWdodHMuZGVsdGE7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzLndpbmRvdykge1xuICAgICAgdGhpcy5fc21hbGxMaW5lKGRvYywgdGhpcy5fcGRmVGV4dCh2aWV3LndpbmRvdyksIHgsIHRvcCwgdywgJ2NlbnRlcicsICdub3JtYWwnLCBwYXJ0cy5zY2FsZSk7XG4gICAgICB0b3AgKz0gaGVpZ2h0cy53aW5kb3c7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzLnRhcmdldCAmJiB2aWV3LnRhcmdldCkge1xuICAgICAgdGhpcy5fa3BpVGFyZ2V0KGRvYywgdmlldy50YXJnZXQsIHgsIHRvcCwgdyk7XG4gICAgICB0b3AgKz0gaGVpZ2h0cy50YXJnZXQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzLnNwYXJrbGluZSAmJiB2aWV3LnNwYXJrbGluZSkge1xuICAgICAgdGhpcy5fa3BpU3BhcmtsaW5lKGRvYywgdmlldy5zcGFya2xpbmUudmFsdWVzLCB2aWV3LnNwYXJrbGluZS5wYXJ0aWFsLCB4LCB0b3AsIHcpO1xuICAgICAgdG9wICs9IGhlaWdodHMuc3BhcmtsaW5lO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgbGluZSBvZiBwYXJ0cy5ub3Rlcykge1xuICAgICAgdGhpcy5fc21hbGxMaW5lKGRvYywgdGhpcy5fcGRmVGV4dChsaW5lKSwgeCwgdG9wLCB3LCAnY2VudGVyJywgJ2l0YWxpYycpO1xuICAgICAgdG9wICs9IGhlaWdodHMubm90ZTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgZGVsdGEgcm93LCBjZW50ZXJlZCBhcyBvbmUgZ3JvdXA6IGEgdHJpYW5nbGUgcG9pbnRpbmcgdGhlIHdheSB0aGVcbiAgLy8gdmFsdWUgbW92ZWQgKG5vbmUgd2hlbiB0aGUgc2hvd24gY2hhbmdlIHJvdW5kcyB0byB6ZXJvKSBhbmQgdGhlIGNoYW5nZSBpblxuICAvLyB0aGUgY29sb3Igb2Ygd2hhdCBpdCBtZWFucywgdGhlbiB3aGF0IGl0IGlzIGNvbXBhcmVkIHdpdGggaW4gZ3JleS5cbiAgcHJpdmF0ZSBfa3BpRGVsdGEoZG9jOiBhbnksIGRlbHRhOiBLcGlDYXJkRGVsdGEsIHg6IG51bWJlciwgdG9wOiBudW1iZXIsIHc6IG51bWJlciwgc2NhbGUgPSAxKTogdm9pZCB7XG4gICAgY29uc3QgY29sb3IgPSBgIyR7UkVQT1JUX0tQSV9DSEFOR0VfQ09MT1JTW2RlbHRhLnRvbmVdfWA7XG4gICAgY29uc3QgY2hhbmdlID0gdGhpcy5fcGRmVGV4dChkZWx0YS50ZXh0KTtcbiAgICBjb25zdCBzaXplID0gS1BJX0RFTFRBX1NJWkUgKiBzY2FsZTtcbiAgICBjb25zdCBzaWRlID0gS1BJX0FSUk9XICogc2NhbGU7XG4gICAgY29uc3QgYXJyb3cgPSBkZWx0YS50cmVuZCA9PT0gUmVwb3J0S3BpVHJlbmQuRmxhdCA/IDAgOiBzaWRlICsgS1BJX0FSUk9XX0dBUCAqIHNjYWxlO1xuXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XG4gICAgZG9jLnNldEZvbnRTaXplKHNpemUpO1xuICAgIGNvbnN0IGNoYW5nZVdpZHRoID0gZG9jLmdldFRleHRXaWR0aChjaGFuZ2UpO1xuXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdub3JtYWwnKTtcbiAgICBjb25zdCBjb21wYXJlZCA9IGRlbHRhLmNvbXBhcmVkXG4gICAgICA/IHRoaXMuX2ZpdChkb2MsIGAgJHt0aGlzLl9wZGZUZXh0KGRlbHRhLmNvbXBhcmVkKX1gLCBNYXRoLm1heCgwLCB3IC0gYXJyb3cgLSBjaGFuZ2VXaWR0aCkpXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IHdpZHRoID0gYXJyb3cgKyBjaGFuZ2VXaWR0aCArIChjb21wYXJlZCA/IGRvYy5nZXRUZXh0V2lkdGgoY29tcGFyZWQpIDogMCk7XG4gICAgY29uc3QgYmFzZWxpbmUgPSB0b3AgKyBzaXplO1xuICAgIGxldCBsZWZ0ID0geCArIE1hdGgubWF4KDAsICh3IC0gd2lkdGgpIC8gMik7XG5cbiAgICBpZiAoYXJyb3cpIHtcbiAgICAgIGNvbnN0IHVwID0gZGVsdGEudHJlbmQgPT09IFJlcG9ydEtwaVRyZW5kLlVwO1xuICAgICAgY29uc3QgdGlwID0gdXAgPyBiYXNlbGluZSAtIHNpZGUgOiBiYXNlbGluZTtcbiAgICAgIGNvbnN0IGJhc2UgPSB1cCA/IGJhc2VsaW5lIDogYmFzZWxpbmUgLSBzaWRlO1xuXG4gICAgICBkb2Muc2V0RmlsbENvbG9yKGNvbG9yKTtcbiAgICAgIGRvYy50cmlhbmdsZShsZWZ0LCBiYXNlLCBsZWZ0ICsgc2lkZSwgYmFzZSwgbGVmdCArIHNpZGUgLyAyLCB0aXAsICdGJyk7XG4gICAgICBsZWZ0ICs9IGFycm93O1xuICAgIH1cblxuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoY29sb3IpO1xuICAgIGRvYy50ZXh0KGNoYW5nZSwgbGVmdCwgYmFzZWxpbmUpO1xuXG4gICAgaWYgKGNvbXBhcmVkKSB7XG4gICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ25vcm1hbCcpO1xuICAgICAgZG9jLnNldFRleHRDb2xvcihNVVRFRF9DT0xPUik7XG4gICAgICBkb2MudGV4dChjb21wYXJlZCwgbGVmdCArIGNoYW5nZVdpZHRoLCBiYXNlbGluZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIHRhcmdldCBsaW5lICgnR29hbDogJDEsMDAwIMK3IDU2JSBvZiB0YXJnZXQnKSBhbmQsIHdoZW4gdGhlIHNlcnZlciBzZW50XG4gIC8vIHRoZSBwcm9ncmVzcywgYSBiYXIgZmlsbGVkIHRoYXQgZmFyOiBncmVlbiBvbmNlIHRoZSB0YXJnZXQgaXMgbWV0LlxuICBwcml2YXRlIF9rcGlUYXJnZXQoZG9jOiBhbnksIHRhcmdldDogS3BpQ2FyZFRhcmdldCwgeDogbnVtYmVyLCB0b3A6IG51bWJlciwgdzogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgdGV4dCA9IHRhcmdldC5wcm9ncmVzcyA/IGAke3RhcmdldC50ZXh0fSDCtyAke3RhcmdldC5wcm9ncmVzc31gIDogdGFyZ2V0LnRleHQ7XG5cbiAgICB0aGlzLl9zbWFsbExpbmUoZG9jLCB0aGlzLl9wZGZUZXh0KHRleHQpLCB4LCB0b3AsIHcsICdjZW50ZXInLCAnbm9ybWFsJyk7XG5cbiAgICBpZiAodGFyZ2V0LmZpbGwgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBiYXJXID0gTWF0aC5taW4odyAqIDAuNiwgS1BJX0JBUl9XKTtcbiAgICBjb25zdCBiYXJYID0geCArICh3IC0gYmFyVykgLyAyO1xuICAgIGNvbnN0IGJhclkgPSB0b3AgKyBOT1RFX0xJTkVfSCArIDE7XG5cbiAgICBkb2Muc2V0RmlsbENvbG9yKEtQSV9UUkFDS19DT0xPUik7XG4gICAgZG9jLnJlY3QoYmFyWCwgYmFyWSwgYmFyVywgS1BJX0JBUl9ILCAnRicpO1xuXG4gICAgaWYgKHRhcmdldC5maWxsID4gMCkge1xuICAgICAgZG9jLnNldEZpbGxDb2xvcihgIyR7UkVQT1JUX0tQSV9DSEFOR0VfQ09MT1JTW3RhcmdldC50b25lXX1gKTtcbiAgICAgIGRvYy5yZWN0KGJhclgsIGJhclksIGJhclcgKiB0YXJnZXQuZmlsbCwgS1BJX0JBUl9ILCAnRicpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRoZSBzcGFya2xpbmUgaW4gYSBib3ggdW5kZXIgdGhlIGNhcmQncyBsaW5lcywgYXMgdGhlIHNjcmVlbiBkcmF3cyBpdFxuICAvLyAoa3BpU3BhcmtsaW5lR2VvbWV0cnksIGEgMC0xMDAgYm94KTogYSB2ZWN0b3IgbGluZSBwZXIgcnVuIG9mIHZhbHVlcywgYVxuICAvLyBkb3QgZm9yIGEgbG9uZSB2YWx1ZSwgYW5kIHRoZSBsYXN0IHBvaW50J3MgbWFya2VyLCBob2xsb3cgd2hpbGUgaXRzIHBlcmlvZFxuICAvLyBpcyBwYXJ0aWFsLlxuICBwcml2YXRlIF9rcGlTcGFya2xpbmUoXG4gICAgZG9jOiBhbnksXG4gICAgdmFsdWVzOiAobnVtYmVyIHwgbnVsbClbXSxcbiAgICBwYXJ0aWFsOiBib29sZWFuLFxuICAgIHg6IG51bWJlciwgdG9wOiBudW1iZXIsIHc6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZ2VvbWV0cnkgPSBrcGlTcGFya2xpbmVHZW9tZXRyeSh2YWx1ZXMsIHBhcnRpYWwpO1xuICAgIGNvbnN0IGJveFcgPSBNYXRoLm1pbih3ICogMC43LCBLUElfU1BBUktMSU5FX1cpO1xuICAgIGNvbnN0IGJveEggPSBLUElfSEVJR0hUUy5zcGFya2xpbmUgLSAyICogS1BJX1NQQVJLTElORV9JTlNFVDtcbiAgICBjb25zdCBsZWZ0ID0geCArICh3IC0gYm94VykgLyAyO1xuICAgIGNvbnN0IGF0ID0gKHBvaW50OiBLcGlTcGFya2xpbmVQb2ludCkgPT4gKHtcbiAgICAgIHg6IGxlZnQgKyBwb2ludC54ICogYm94VyAvIDEwMCxcbiAgICAgIHk6IHRvcCArIEtQSV9TUEFSS0xJTkVfSU5TRVQgKyBwb2ludC55ICogYm94SCAvIDEwMCxcbiAgICB9KTtcbiAgICBjb25zdCBjb2xvciA9IGAjJHtSRVBPUlRfS1BJX1NQQVJLTElORV9DT0xPUn1gO1xuXG4gICAgZG9jLnNldERyYXdDb2xvcihjb2xvcik7XG4gICAgZG9jLnNldEZpbGxDb2xvcihjb2xvcik7XG4gICAgZG9jLnNldExpbmVXaWR0aCgxKTtcblxuICAgIGZvciAoY29uc3QgbGluZSBvZiBnZW9tZXRyeS5saW5lcykge1xuICAgICAgY29uc3QgcG9pbnRzID0gbGluZS5zcGxpdCgnICcpLm1hcCgocGFpcikgPT4ge1xuICAgICAgICBjb25zdCBbcHgsIHB5XSA9IHBhaXIuc3BsaXQoJywnKS5tYXAoTnVtYmVyKTtcblxuICAgICAgICByZXR1cm4gYXQoeyB4OiBweCwgeTogcHkgfSk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHN0ZXBzID0gcG9pbnRzLnNsaWNlKDEpLm1hcCgocG9pbnQsIGluZGV4KSA9PiBbcG9pbnQueCAtIHBvaW50c1tpbmRleF0ueCwgcG9pbnQueSAtIHBvaW50c1tpbmRleF0ueV0pO1xuXG4gICAgICBkb2MubGluZXMoc3RlcHMsIHBvaW50c1swXS54LCBwb2ludHNbMF0ueSwgWzEsIDFdLCAnUycsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGRvdCBvZiBnZW9tZXRyeS5kb3RzKSB7XG4gICAgICBjb25zdCBwb2ludCA9IGF0KGRvdCk7XG4gICAgICBkb2MuY2lyY2xlKHBvaW50LngsIHBvaW50LnksIEtQSV9ET1RfUiwgJ0YnKTtcbiAgICB9XG5cbiAgICBpZiAoZ2VvbWV0cnkubGFzdCkge1xuICAgICAgY29uc3QgcG9pbnQgPSBhdChnZW9tZXRyeS5sYXN0KTtcblxuICAgICAgaWYgKGdlb21ldHJ5Lmxhc3QuaG9sbG93KSB7XG4gICAgICAgIGRvYy5zZXRGaWxsQ29sb3IoJyNmZmZmZmYnKTtcbiAgICAgICAgZG9jLmNpcmNsZShwb2ludC54LCBwb2ludC55LCBLUElfRE9UX1IsICdGRCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9jLmNpcmNsZShwb2ludC54LCBwb2ludC55LCBLUElfRE9UX1IsICdGJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQSBmb3JtYXR0ZWQgdmFsdWUgYXMganNQREYgY2FuIGRyYXcgaXQuIEl0cyBzdGFuZGFyZCBmb250cyB3cml0ZSB0ZXh0IGluXG4gIC8vIFdpbkFuc2ksIHdoaWNoIGhhcyB0aGUgbm8tYnJlYWsgc3BhY2UgKFUrMDBBMCwgZnItQ0EncyBkaWdpdCBncm91cGluZykgYnV0XG4gIC8vIG5vdCB0aGUgbmFycm93IG9uZSAoVSsyMDJGLCB3aGljaCBvdGhlciBsb2NhbGVzIGdyb3VwIGFuZCBzcGFjZSB3aXRoKSwgdGhlXG4gIC8vIHRoaW4gYW5kIGhhaXIgc3BhY2VzIChVKzIwMDksIFUrMjAwQSwgd2hpY2ggSW50bCBwdXRzIGFyb3VuZCBhIGRhdGVcbiAgLy8gcmFuZ2UncyBkYXNoOiAnU2VwIDEg4oCTIDMwLCAyMDI2JyksIHRoZSBtaW51cyBzaWduIChVKzIyMTIsIHNvbWUgbG9jYWxlcydcbiAgLy8gbmVnYXRpdmUgc2lnbikgb3IgYSByYW5rIGNoYW5nZSdzIHRyaWFuZ2xlczogZWFjaCB3b3VsZCBwcmludCBhcyBzdHJheVxuICAvLyBnbHlwaHMuIFRoZSBuYXJyb3cgc3BhY2UgYmVjb21lcyBhIG5vLWJyZWFrIHNwYWNlLCBzbyBhIG51bWJlciBzdGlsbCBuZXZlclxuICAvLyB3cmFwcyBhY3Jvc3MgYSBsaW5lOyB0aGUgdGhpbiBhbmQgaGFpciBzcGFjZXMgYSBwbGFpbiBzcGFjZTsgdGhlIG1pbnVzXG4gIC8vIHNpZ24gYSBoeXBoZW47IGFuZCBhIHJhbmsncyByaXNlIGEgcGx1cyBzaWduIGFuZCBpdHMgZmFsbCBhIGh5cGhlblxuICAvLyAoJ+KWsiAyJyByZWFkcyAnKzInKS5cbiAgcHJpdmF0ZSBfcGRmVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0ZXh0XG4gICAgICAucmVwbGFjZSgvXFx1MjAyRi9nLCAnXFx1MDBBMCcpXG4gICAgICAucmVwbGFjZSgvW1xcdTIwMDlcXHUyMDBBXS9nLCAnICcpXG4gICAgICAucmVwbGFjZSgvXFx1MjIxMi9nLCAnLScpXG4gICAgICAucmVwbGFjZSgvXFx1MjVCMlxccz8vZywgJysnKVxuICAgICAgLnJlcGxhY2UoL1xcdTI1QkNcXHM/L2csICctJyk7XG4gIH1cblxuICAvLyBBIGxheWVyJ3MgdmFsdWVzIHdpdGggZWFjaCBudW1iZXIgYXMganNQREYgY2FuIGRyYXcgaXQgKF9wZGZUZXh0KSwgc28gYVxuICAvLyB2YWx1ZSBncm91cGVkIHdpdGggbmFycm93IHNwYWNlcyByZWFkcywgYW5kIHdyYXBzLCBsaWtlIGFueSBvdGhlciBudW1iZXIuXG4gIHByaXZhdGUgX3BkZlZhbHVlcyh2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIFRleHRWYWx1ZT4pOiBSZWNvcmQ8c3RyaW5nLCBUZXh0VmFsdWU+IHtcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHZhbHVlcykubWFwKChba2V5LCB2YWx1ZV0pID0+IFtcbiAgICAgIGtleSxcbiAgICAgIHZhbHVlLnRleHQgPT09IHVuZGVmaW5lZCA/IHZhbHVlIDogeyAuLi52YWx1ZSwgdGV4dDogdGhpcy5fcGRmVGV4dCh2YWx1ZS50ZXh0KSB9LFxuICAgIF0pKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NsdWcobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1teYS16MC05XSsvZywgJy0nKS5yZXBsYWNlKC9eLSt8LSskL2csICcnKSB8fCAncmVwb3J0JztcbiAgfVxufVxuIl19
|
|
1137
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXBkZi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2V4cG9ydC9yZXBvcnQtcGRmLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQVVsRCxPQUFPLEVBQzJDLFdBQVcsRUFBRSxvQkFBb0IsR0FDbEYsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RELE9BQU8sRUFDTCxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSx1QkFBdUIsRUFBRSx1QkFBdUIsRUFBRSx1QkFBdUIsRUFDaEgsaUJBQWlCLEVBQ2pCLFVBQVUsR0FDWCxNQUFNLFNBQVMsQ0FBQztBQUNqQixPQUFPLEVBQ0wsd0JBQXdCLEVBQUUsMEJBQTBCLEVBQUUsc0JBQXNCLEVBQUUsdUJBQXVCLEdBQ3RHLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRCxPQUFPLEVBQzRELGtCQUFrQixFQUNqRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFDbEgsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQzNHLGdCQUFn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QzthQUMvQixPQUFPLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQzthQUN2QixPQUFPLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQzthQUMxQixPQUFPLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCwwRUFBMEU7SUFDMUUsNEVBQTRFO0lBQ3BFLFVBQVUsQ0FBQyxNQUFpQztRQUNsRCxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDckUsR0FBRztZQUNILEtBQUssQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO1NBQ2pGLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVPLEtBQUssQ0FBQyxJQUFZO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxRQUFRLENBQUM7SUFDNUYsQ0FBQzt3R0ExeENVLGdCQUFnQjs0R0FBaEIsZ0JBQWdCOzs0RkFBaEIsZ0JBQWdCO2tCQUQ1QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFJlcG9ydEtwaVRyZW5kIH0gZnJvbSAnLi4vZW51bXMvcmVwb3J0LWtwaS10cmVuZC5lbnVtJztcbmltcG9ydCB7IGxheWVyRmlsdGVyRmllbGRzIH0gZnJvbSAnLi4vZmlsdGVyLXRleHQnO1xuaW1wb3J0IHsgcmVzb2x2ZVJlcG9ydFRpbWV6b25lIH0gZnJvbSAnLi4vZm9ybWF0JztcbmltcG9ydCB7XG4gIENvbXBvbmVudERhdGEsXG4gIEtwaUNvbmZpZyxcbiAgUmVwb3J0LFxuICBSZXBvcnRDb21wb25lbnQsXG4gIFJlcG9ydEZvcm1hdENvbnRleHQsXG4gIFJlcG9ydEhlYWRlckZvb3RlcixcbiAgUmVwb3J0UGFnZSxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIEtwaUNhcmREZWx0YSwgS3BpQ2FyZFRhcmdldCwgS3BpU3BhcmtsaW5lUG9pbnQsIGtwaUNhcmRWaWV3LCBrcGlTcGFya2xpbmVHZW9tZXRyeSxcbn0gZnJvbSAnLi4va3BpLWNhcmQnO1xuaW1wb3J0IHsgREVGQVVMVF9DT01QT05FTlRfUEFERElORyB9IGZyb20gJy4uL2xheW91dCc7XG5pbXBvcnQge1xuICBERUZBVUxUX1RFWFRfQ09MT1IsIERFRkFVTFRfVEVYVF9TSVpFLCBURVhUX1RBQkxFX0JPUkRFUl9DT0xPUiwgVEVYVF9UQUJMRV9CT1JERVJfV0lEVEgsIFRFWFRfVEFCTEVfQ0VMTF9QQURESU5HLFxuICBURVhUX1RBQkxFX01BUkdJTiwgVGV4dEZpbHRlckZpZWxkLCBUZXh0UGFyYWdyYXBoLCBUZXh0UnVuLCBUZXh0VGFibGUsIFRleHRUYWJsZUNlbGwsIFRleHRUb2tlbkNvbnRleHQsIFRleHRWYWx1ZSxcbiAgdGV4dEJsb2Nrcyxcbn0gZnJvbSAnLi4vdGV4dCc7XG5pbXBvcnQge1xuICBSRVBPUlRfS1BJX0NIQU5HRV9DT0xPUlMsIFJFUE9SVF9LUElfU1BBUktMSU5FX0NPTE9SLCBSRVBPUlRfS1BJX1RSQUNLX0NPTE9SLCBSRVBPUlRfTVVURURfVEVYVF9DT0xPUixcbn0gZnJvbSAnLi4vdGhlbWUvcGFsZXR0ZSc7XG5pbXBvcnQgeyBpc0RyYXduIH0gZnJvbSAnLi4vdmFsdWVzJztcbmltcG9ydCB7IHJlbmRlckNoYXJ0SW1hZ2UgfSBmcm9tICcuL29mZnNjcmVlbi1jaGFydCc7XG5pbXBvcnQge1xuICBCdWlsdEV4cG9ydCwgQ29sbGVjdGVkQ29tcG9uZW50LCBDb2xsZWN0ZWRQYWdlLCBDb2xsZWN0ZWRSZXBvcnQsIEhFQURFUl9GT09URVJfTkFNRSwgS3BpRXhwb3J0SGVpZ2h0cyxcbiAgVW5kcmF3bkNvbXBvbmVudCwgY292ZXJMaW5lcywgZW1wdHlMYWJlbCwgZXhwb3J0Q2VsbCwgZXhwb3J0Tm90ZUxpbmVzLCBleHBvcnRUaXRsZSwgZXhwb3J0V2luZG93c0xpbmUsIGlzRW1wdHlUaWxlLFxuICBrcGlDYXJkSGFzRXh0cmFzLCBrcGlFeHBvcnRIZWlnaHQsIGtwaUV4cG9ydFBhcnRzLCBsaXN0Q29sdW1ucywgbGlzdEhlYWRpbmdzLCBsaXN0VG90YWxzUm93LCBtb3JlUm93c05vdGljZSxcbiAgc2NhbGVkS3BpSGVpZ2h0cywgdGV4dFNuaXBwZXQsXG59IGZyb20gJy4vcmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBHcmlkRXhwb3J0Q2VsbCwgZ3JpZEV4cG9ydFRhYmxlIH0gZnJvbSAnLi9yZXBvcnQtZ3JpZC1leHBvcnQnO1xuaW1wb3J0IHsgUmVwb3J0VGV4dExheW91dFNlcnZpY2UsIFRleHRUYWJsZUxheW91dCB9IGZyb20gJy4vcmVwb3J0LXRleHQtbGF5b3V0LnNlcnZpY2UnO1xuXG5cbi8vIEluY2hlcyDihpIgcG9pbnRzICh0aGUgUERGIHVuaXQpLlxuY29uc3QgUFQgPSA3MjtcblxuLy8gQ29tcG9uZW50IHRpdGxlIHN0cmlwIGhlaWdodCwgcG9pbnRzLlxuY29uc3QgVElUTEVfSCA9IDE4O1xuXG4vLyBUaGUgc21hbGwgcHJpbnQgYSBjb21wb25lbnQgbWF5IGNhcnJ5LCBwb2ludHM6IHRoZSBkYXlzIGl0IHJlYWRzIHVuZGVyIGl0c1xuLy8gdGl0bGUgKGEgc3VidGl0bGUgbGluZSksIGl0cyBub3RlcyBhdCB0aGUgZm9vdCBvZiBpdHMgYm94IChhIGxpbmUgZWFjaCksIGFuZFxuLy8gdGhlIGxpbmVzIG9mIGEgS1BJIGNhcmQgdW5kZXIgaXRzIHZhbHVlLiBBIGNoYXJ0J3Mgb3IgYSBsaXN0J3Mgbm90ZXMgZ2l2ZVxuLy8gd2F5IGJlZm9yZSBpdHMgYm9keSB3b3VsZCBzaHJpbmsgdW5kZXIgTUlOX0JPRFlfSC5cbmNvbnN0IFNNQUxMX1NJWkUgPSA3LjU7XG5jb25zdCBTVUJUSVRMRV9IID0gMTE7XG5jb25zdCBOT1RFX0xJTkVfSCA9IDEwO1xuY29uc3QgTUlOX0JPRFlfSCA9IDQwO1xuY29uc3QgTVVURURfQ09MT1IgPSBgIyR7UkVQT1JUX01VVEVEX1RFWFRfQ09MT1J9YDtcblxuLy8gQSBLUEkgY2FyZCdzIHBhcnRzLCB0b3AgdG8gYm90dG9tLCBwb2ludHMgKGtwaUV4cG9ydFBhcnRzIHNoZWRzIHRoZVxuLy8gc3BhcmtsaW5lLCB0aGVuIHRoZSB0YXJnZXQsIHRoZW4gdGhlIG5vdGVzIG9uIGEgc2hvcnQgdGlsZSkuIFRoZSB2YWx1ZSdzXG4vLyBiYXNlbGluZSBzaXRzIEtQSV9WQUxVRV9CQVNFTElORSB1bmRlciBpdHMgdG9wLlxuY29uc3QgS1BJX0hFSUdIVFM6IEtwaUV4cG9ydEhlaWdodHMgPSB7XG4gIHZhbHVlOiAzMCxcbiAgbGFiZWw6IDEzLFxuICBkZWx0YTogMTMsXG4gIHdpbmRvdzogTk9URV9MSU5FX0gsXG4gIHRhcmdldDogTk9URV9MSU5FX0ggKyA2LFxuICBzcGFya2xpbmU6IDI4LFxuICBub3RlOiBOT1RFX0xJTkVfSCxcbn07XG5jb25zdCBLUElfVkFMVUVfQkFTRUxJTkUgPSAyMztcbmNvbnN0IEtQSV9ERUxUQV9TSVpFID0gOTtcbi8vIFRoZSBkZWx0YSdzIHRyaWFuZ2xlOiBpdHMgc2lkZSwgYW5kIHRoZSBnYXAgYmVmb3JlIHRoZSBjaGFuZ2UuXG5jb25zdCBLUElfQVJST1cgPSA2O1xuY29uc3QgS1BJX0FSUk9XX0dBUCA9IDM7XG4vLyBUaGUgdGFyZ2V0J3MgcHJvZ3Jlc3MgYmFyLCBhbmQgdGhlIHRyYWNrIGl0IGZpbGxzLlxuY29uc3QgS1BJX0JBUl9XID0gMTIwO1xuY29uc3QgS1BJX0JBUl9IID0gMztcbmNvbnN0IEtQSV9UUkFDS19DT0xPUiA9IGAjJHtSRVBPUlRfS1BJX1RSQUNLX0NPTE9SfWA7XG4vLyBUaGUgc3BhcmtsaW5lJ3Mgd2lkZXN0IGJveCwgaXRzIHRvcCBhbmQgYm90dG9tIGluc2V0LCBhbmQgaXRzIGRvdHMnIHJhZGl1cy5cbmNvbnN0IEtQSV9TUEFSS0xJTkVfVyA9IDE0MDtcbmNvbnN0IEtQSV9TUEFSS0xJTkVfSU5TRVQgPSAzO1xuY29uc3QgS1BJX0RPVF9SID0gMS41O1xuXG4vLyBSb3dzIGZldGNoZWQgZm9yIGEgbGlzdCdzIFBERiB0YWJsZS4gQSB0YWJsZSB0aGF0IG91dGdyb3dzIGl0cyBib3hcbi8vIGNvbnRpbnVlcyBvbnRvIHBhZ2VzIG9mIGl0cyBvd24sIHNvIHRoaXMgaXMgaG93IGZhciBpdCBtYXkgcnVuOiBhYm91dCAxMi0xNVxuLy8gY29udGludWF0aW9uIHBhZ2VzIG9uIGEgbGV0dGVyIHBhZ2UsIGFuZCBhIHRlbnRoIG9mIHRoZSBzZXJ2ZXIncyA1MDAwLXJvd1xuLy8gY2VpbGluZy4gQSBsb25nZXIgcmVzdWx0IGVuZHMgaW4gYSBtb3JlUm93c05vdGljZSgpIHJvdy5cbmV4cG9ydCBjb25zdCBQREZfTElTVF9ST1dTID0gNTAwO1xuXG4vLyBIb3cgZmFyIGEgY29udGludWF0aW9uIHRhYmxlIHNpdHMgaW5zaWRlIHRoZSBoZWFkZXIgYW5kIGZvb3RlciBiYW5kcyxcbi8vIHBvaW50cy4gQSBwYWdlIHdpdGggbm8gYmFuZCAob3Igd2l0aCB0aGUgbWFzdGVyIGhpZGRlbikga2VlcHNcbi8vIE5PX0JBTkRfTUFSR0lOIGZyb20gdGhhdCBlZGdlIGluc3RlYWQuXG5jb25zdCBDT05USU5VQVRJT05fR0FQID0gMC4yNSAqIFBUO1xuY29uc3QgTk9fQkFORF9NQVJHSU4gPSAwLjUgKiBQVDtcbmNvbnN0IE5PX0JBTkRTOiBSZXBvcnRIZWFkZXJGb290ZXIgPSB7IGhlYWRlckhlaWdodDogMCwgZm9vdGVySGVpZ2h0OiAwIH07XG5cbi8vIFRoZSBsYXN0IHJvdyBvZiBhIGxpc3QgYm94IHdob3NlIHJvd3MgY2Fycnkgb24gcGFzdCBpdC5cbmNvbnN0IENPTlRJTlVFRF9OT1RJQ0UgPSAnQ29udGludWVkIG9uIHRoZSBmb2xsb3dpbmcgcGFnZXMnO1xuXG4vLyBUaGUgbGFzdCByb3cgb2YgYSBsaXN0IGJveCB3aG9zZSByb3dzIGhhdmUgbm93aGVyZSB0byBnbzogaXRzIGhlYWRpbmcgYW5kXG4vLyB0b3RhbHMgcm93LCB3cmFwcGVkIHRhbGwgaW4gbmFycm93IGNvbHVtbnMsIGxlYXZlIGEgY29udGludWF0aW9uIHBhZ2Ugbm9cbi8vIHJvb20gZm9yIGEgcm93LlxuY29uc3QgTk9fUk9PTV9OT1RJQ0UgPSAnTm90IGVub3VnaCByb29tIGZvciB0aGlzIHRhYmxlIOKAlCBlbmxhcmdlIHRoZSB0aWxlJztcblxuLy8gQSBsaXN0J3Mgb3IgYSB0YWJsZSB0aWxlJ3MgdGFibGU6IGl0cyBmb250IHNpemUgYW5kIGNlbGwgcGFkZGluZywgcG9pbnRzLlxuY29uc3QgVEFCTEVfRk9OVF9TSVpFID0gODtcbmNvbnN0IFRBQkxFX0NFTExfUEFERElORyA9IDM7XG5cbi8vIFdoYXQgYSBjb21wb25lbnQncyBib3ggc2F5cyB3aGVuIGl0IGNvdWxkIG5vdCBiZSBkcmF3bi5cbmNvbnN0IFVORFJBV05fTk9URSA9ICdDb3VsZCBub3QgYmUgZHJhd24nO1xuXG4vLyBUaHJvd24gZnJvbSBhdXRvVGFibGUncyBwYWdlIGhvb2sgdG8gc3RvcCBhbiBvbi1wYWdlIHRhYmxlIGF0IHRoZSBmaXJzdCBwYWdlXG4vLyBpdCB3b3VsZCBhZGQgKF9kcmF3VGFibGUpLlxuY29uc3QgU1RSQVlfUEFHRSA9IG5ldyBFcnJvcignVGhlIHRhYmxlIHJhbiBwYXN0IGl0cyBwYWdlJyk7XG5cbi8vIEEgdGV4dCBsaW5lJ3MgaGVpZ2h0IGFzIGEgbXVsdGlwbGUgb2YgaXRzIGxhcmdlc3QgZm9udCBzaXplIOKAlCB0aGUgY2FudmFzXG4vLyBzdHlsZXNoZWV0J3MgbGluZS1oZWlnaHQsIHNvIGEgYmxvY2sgd3JhcHMgYW5kIHN0YWNrcyB0aGUgc2FtZSB3YXkuXG5jb25zdCBURVhUX0xJTkVfSEVJR0hUID0gMS4yNTtcblxuLy8gSG93IGZhciBhIGxpc3QgaXRlbSdzIHRleHQgc2l0cyBmcm9tIHRoZSBibG9jaydzIGVkZ2UsIHBvaW50czsgdGhlIG1hcmtlclxuLy8gaGFuZ3MgaW4gdGhhdCBzcGFjZS5cbmNvbnN0IExJU1RfSU5ERU5UID0gMTY7XG5cbi8vIFdoYXQgZXZlcnkgZHJhd2luZyBzdGVwIG9mIG9uZSBleHBvcnQgc2hhcmVzLCBidWlsdCBvbmNlIGluIGJ1aWxkKCkuXG4vLyBTaXplcyBhcmUgcG9pbnRzLlxuaW50ZXJmYWNlIFBkZkV4cG9ydENvbnRleHQge1xuICBkb2M6IGFueTtcbiAgYXV0b1RhYmxlOiBhbnk7XG4gIC8vIExheXMgYSB0YWJsZSBvdXQgd2l0aG91dCBkcmF3aW5nIGl0LCBmb3IgbWVhc3VyaW5nIHdoYXQgZml0cy5cbiAgY3JlYXRlVGFibGU6IGFueTtcbiAganNQREY6IGFueTtcbiAgcmVwb3J0OiBSZXBvcnQ7XG4gIHRpbWV6b25lOiBzdHJpbmc7XG4gIGZvcm1hdENvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQ7XG4gIHBhZ2VXOiBudW1iZXI7XG4gIHBhZ2VIOiBudW1iZXI7XG4gIG9yaWVudGF0aW9uOiAnbGFuZHNjYXBlJyB8ICdwb3J0cmFpdCc7XG4gIC8vIFdoYXQgdGhlIGhlYWRlciBhbmQgZm9vdGVyJ3MgdmFsdWUgdG9rZW5zIGZpbGwgd2l0aCwgdGhlIHNhbWUgb24gZXZlcnlcbiAgLy8gcGFnZSwgY29udGludWF0aW9uIHBhZ2VzIGluY2x1ZGVkIChfcGRmVmFsdWVzKS5cbiAgbWFzdGVyVmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBUZXh0VmFsdWU+O1xuICAvLyBXaGF0IHRoZSB7e2ZpbHRlci48aWQ+fX0gdG9rZW5zIGZpbGwgd2l0aCwgZXZlcnkgZ3JvdXAncywgdGhlIHNhbWUgb25cbiAgLy8gZXZlcnkgcGFnZTsgYSBwYWdlIHJlYWRzIGl0cyBvd24gKGxheWVyRmlsdGVyRmllbGRzKS5cbiAgZmlsdGVyRmllbGRzOiBSZWNvcmQ8bnVtYmVyLCBUZXh0RmlsdGVyRmllbGQ+O1xuICAvLyBUaGUgb25lcyB0aGUgaGVhZGVyIGFuZCBmb290ZXIgcmVhZDogbm8gcGFnZSBmaWx0ZXIncy5cbiAgbWFzdGVyRmlsdGVyczogUmVjb3JkPG51bWJlciwgVGV4dEZpbHRlckZpZWxkPjtcbiAgLy8gVGhlIGNvbXBvbmVudHMgdGhhdCBjb3VsZCBub3QgYmUgZHJhd24gKF9ndWFyZGVkKSwgYnkgY29tcG9uZW50IGlkLlxuICB1bmRyYXduOiBNYXA8bnVtYmVyLCBVbmRyYXduQ29tcG9uZW50Pjtcbn1cblxuLy8gQSB3b3JkIG9mIGEgd3JhcHBlZCBsaW5lIChfd3JhcCk6IGl0cyBydW4sIGl0cyB0ZXh0IHdpdGggYW55IHRyYWlsaW5nIHNwYWNlLFxuLy8gaXRzIGZvbnQgc2l6ZSBhbmQgaXRzIHdpZHRoLCBwb2ludHMuXG5pbnRlcmZhY2UgUGRmV29yZCB7XG4gIHJ1bjogVGV4dFJ1bjtcbiAgdGV4dDogc3RyaW5nO1xuICBzaXplOiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG59XG5cbi8vIFdoZXJlIGEgdGV4dCBibG9jaydzIHdvcmRzIGFyZSBkcmF3biwgcG9pbnRzOiB0aGUgbGVmdCBlZGdlIGFuZCB3aWR0aCB0aGV5XG4vLyB3cmFwIHRvLCB0aGUgdG9wIG9mIHRoZSBmaXJzdCBsaW5lLCBhbmQgdGhlIGJvdHRvbSBubyBsaW5lIG1heSBydW4gcGFzdCAoZm9yXG4vLyBhIGJsb2NrLCB0aGUgcGFnZSdzKS4gQSB0ZXh0IHRhYmxlJ3MgY2VsbCBkcmF3cyBpdHMgd29yZHMgdGhlIHNhbWUgd2F5LFxuLy8gaW5zaWRlIGl0cyBwYWRkaW5nLlxuaW50ZXJmYWNlIFBkZlRleHRCb3gge1xuICBsZWZ0OiBudW1iZXI7XG4gIHRvcDogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xuICBib3R0b206IG51bWJlcjtcbn1cblxuLy8gV2hlcmUgdGhlIG5leHQgcGFydCBvZiBhIHRleHQgYmxvY2sgc3RhcnRzLCBhbmQgd2hldGhlciB0aGUgcGFydCBqdXN0IGRyYXduXG4vLyByYW4gb3V0IG9mIHJvb20gYXQgdGhlIGJvdHRvbSBvZiBpdHMgYm94LlxuaW50ZXJmYWNlIFBkZlRleHRDdXJzb3Ige1xuICBjdXJzb3JZOiBudW1iZXI7XG4gIGN1dDogYm9vbGVhbjtcbn1cblxuLy8gQSB0ZXh0IHRhYmxlJ3MgY2VsbCBhcyBhdXRvVGFibGUgdGFrZXMgaXQuIEl0IHByaW50cyBubyB0ZXh0IG9mIGl0cyBvd246IHRoZVxuLy8gY2VsbCdzIHdvcmRzICh0ZXh0Q2VsbCkgYXJlIGRyYXduIGludG8gaXQgb25jZSBpdHMgZ3JpZCBsaW5lcyBhbmQgZmlsbCBhcmVcbi8vIChfZHJhd1RleHRDZWxsKS5cbmludGVyZmFjZSBQZGZUZXh0Q2VsbElucHV0IHtcbiAgY29udGVudDogc3RyaW5nO1xuICBjb2xTcGFuOiBudW1iZXI7XG4gIHJvd1NwYW46IG51bWJlcjtcbiAgdGV4dENlbGw6IFRleHRUYWJsZUNlbGw7XG4gIHN0eWxlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8vIEZpeGVkIGNvbHVtbiB3aWR0aHMsIGJ5IGNvbHVtbiBpbmRleCwgaW4gcG9pbnRzLCBhbmQgdGhlIHJpZ2h0IGFsaWdubWVudCBvZlxuLy8gYSBjb2x1bW4gb2YgZm9ybWF0dGVkIG51bWJlcnMuXG50eXBlIFBkZkNvbHVtblN0eWxlcyA9IFJlY29yZDxudW1iZXIsIHsgY2VsbFdpZHRoOiBudW1iZXI7IGhhbGlnbj86ICdyaWdodCcgfT47XG5cbi8vIFdoYXQgX21lYXN1cmUgcmVhZHMgb2ZmIGEgbGlzdCdzIGxhaWQtb3V0IHRhYmxlOiBob3cgbWFueSBib2R5IHJvd3MgaXRzIGJveFxuLy8gaG9sZHMsIHRoZSBjb2x1bW4gd2lkdGhzIGV2ZXJ5IHBhZ2Ugb2YgaXQgaXMgZHJhd24gd2l0aCwgYW5kIGhvdyB0YWxsIGFcbi8vIHBhZ2UncyB0YWJsZSBzcGFjZSBtdXN0IGJlIGZvciBhdXRvVGFibGUgdG8gZHJhdyBhIHJvdyBhdCBhbGw6IHRoZSBoZWFkaW5nLFxuLy8gdGhlIHRvdGFscyByb3cgYW5kIG9uZSBsaW5lIG9mIGEgcm93LCBwb2ludHMuXG5pbnRlcmZhY2UgUGRmVGFibGVNZWFzdXJlIHtcbiAgZml0OiBudW1iZXI7XG4gIGNvbHVtblN0eWxlczogUGRmQ29sdW1uU3R5bGVzO1xuICBtaW5IZWlnaHQ6IG51bWJlcjtcbn1cblxuLy8gQSB0YWJsZSBib2R5IGNlbGw6IHBsYWluIHRleHQsIG9yIGEgbm90aWNlIHJvdydzIG9uZSBjZWxsIHNwYW5uaW5nIGV2ZXJ5XG4vLyBjb2x1bW4uXG50eXBlIFBkZlRhYmxlQ2VsbCA9IHN0cmluZyB8IHsgY29udGVudDogc3RyaW5nOyBjb2xTcGFuPzogbnVtYmVyOyByb3dTcGFuPzogbnVtYmVyOyBzdHlsZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9O1xuXG4vLyBIb3cgZmFyIGEgdGFibGUncyBncm91cCBsYWJlbCBzdGVwcyBpbiBwZXIgbGV2ZWwsIHBvaW50cy5cbmNvbnN0IEdSSURfSU5ERU5UID0gODtcblxuLy8gV2hhdCBhIGxpc3QncyBvciBhIHRhYmxlIHRpbGUncyB0YWJsZSBkcmF3czogaXRzIGhlYWRpbmcgcm93cywgaXRzIGJvZHlcbi8vIHJvd3MsIHdoaWNoIGNvbHVtbnMgaG9sZCBmb3JtYXR0ZWQgbnVtYmVycywgaXRzIHRvdGFscyByb3cgYW5kIGhvdyBtYW55XG4vLyByb3dzIGl0cyBmZXRjaCBsZWZ0IG91dC5cbmludGVyZmFjZSBQZGZUYWJsZVBhcnRzIHtcbiAgaGVhZDogUGRmVGFibGVDZWxsW11bXTtcbiAgY2VsbHM6IFBkZlRhYmxlQ2VsbFtdW107XG4gIG51bWVyaWM6IGJvb2xlYW5bXTtcbiAgZm9vdDogc3RyaW5nW10gfCBudWxsO1xuICBvbWl0dGVkOiBudW1iZXI7XG59XG5cbi8vIFRoZSByb3dzIG9mIGEgbGlzdCB0aGF0IGRpZCBub3QgZml0IGl0cyBib3gsIGNhcnJpZWQgb250byBjb250aW51YXRpb25cbi8vIHBhZ2VzIGFmdGVyIGl0cyByZXBvcnQgcGFnZS4geCBhbmQgdyBhcmUgdGhlIGJveCdzLCBpbiBwb2ludHMsIGFuZCB0aGVcbi8vIGNvbHVtbiB3aWR0aHMgYW5kIGFsaWdubWVudHMgYXJlIHRoZSBvbmVzIHRoZSBvbi1wYWdlIHRhYmxlIHdhcyBkcmF3biB3aXRoLFxuLy8gc28gdGhlIHRhYmxlIHJlYWRzIGFzIG9uZSBhY3Jvc3MgcGFnZXMuXG5pbnRlcmZhY2UgUGRmVGFibGVPdmVyZmxvdyB7XG4gIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50O1xuICAvLyBUaGUgdGV4dCB0aGUgbGlzdCB3YXMgc2VhcmNoZWQgYnksIGZvciB0aGUgY29udGludWF0aW9uIHRpdGxlLlxuICBzZWFyY2g/OiBzdHJpbmc7XG4gIC8vIFRoZSBjcnVtYnMgb2YgaXRzIGRyaWxsIHBhdGgsIGZvciB0aGUgY29udGludWF0aW9uIHRpdGxlLlxuICBjcnVtYnM/OiBzdHJpbmdbXTtcbiAgLy8gQSB0YWJsZSB3aG9zZSBjb2x1bW4gZmlsdGVycyBuYXJyb3dlZCBpdCwgZm9yIHRoZSBjb250aW51YXRpb24gdGl0bGUuXG4gIGZpbHRlcmVkPzogYm9vbGVhbjtcbiAgLy8gSGVhZGluZyByb3dzLCB0b3AgZmlyc3Q7IGEgbGlzdCBoYXMgb25lLlxuICBoZWFkOiBQZGZUYWJsZUNlbGxbXVtdO1xuICBudW1lcmljOiBib29sZWFuW107XG4gIHJvd3M6IFBkZlRhYmxlQ2VsbFtdW107XG4gIG9taXR0ZWQ6IG51bWJlcjtcbiAgLy8gVGhlIGxpc3QncyB0b3RhbHMgcm93LCB3aGljaCBjbG9zZXMgdGhlIGxhc3QgY29udGludWF0aW9uIHBhZ2UuXG4gIGZvb3Q6IHN0cmluZ1tdIHwgbnVsbDtcbiAgeDogbnVtYmVyO1xuICB3OiBudW1iZXI7XG4gIGNvbHVtblN0eWxlczogUGRmQ29sdW1uU3R5bGVzO1xufVxuXG4vLyBCdWlsZHMgdGhlIFBERiBjbGllbnQtc2lkZSB3aXRoIGpzcGRmLiBUaGUgcmVwb3J0J3MgdW5pdCBpcyBpbmNoZXMgYW5kIFBERnNcbi8vIGFyZSBwb2ludHMgYXQgZXhhY3RseSA3Mi9pbmNoLCBzbyBlYWNoIHJlcG9ydCBwYWdlIGJlY29tZXMgb25lIFBERiBwYWdlIG9mXG4vLyB0aGUgZXhhY3QgcGh5c2ljYWwgc2l6ZSBhbmQgY29tcG9uZW50cyBsYW5kIGF0IHRoZWlyIHByZWNpc2UgcG9zaXRpb25zLlxuLy8gQ2hhcnRzIGFyZSByZW5kZXJlZCB0aHJvdWdoIGFuIG9mZnNjcmVlbiBFQ2hhcnRzIGluc3RhbmNlIGF0IDPDlyBwaXhlbFxuLy8gcmF0aW8g4oCUIHBpeGVsLWlkZW50aWNhbCB0byB0aGUgc2NyZWVuLCBjcmlzcCBhdCBwcmludCBzaXplIOKAlCBhbmQgdGFibGVzIGFyZVxuLy8gZHJhd24gd2l0aCBqc3BkZi1hdXRvdGFibGUuIEJvdGggbGlicmFyaWVzIGxvYWQgbGF6aWx5IGludG8gdGhlaXIgb3duIGNodW5rcy5cbi8vXG4vLyBBIGxpc3QgdGFibGUgaXMgZml0dGVkIHRvIGl0cyBib3ggYnkgbGF5aW5nIGl0IG91dCBmaXJzdCwgbmV2ZXIgYnkgYVxuLy8gcm93LWhlaWdodCBlc3RpbWF0ZSwgc28gaXQgY2Fubm90IHNwaWxsIHBhc3QgdGhlIGJveC4gVGhlIHJvd3MgdGhhdCBkbyBub3Rcbi8vIGZpdCBjb250aW51ZSBvbiBwYWdlcyBvZiB0aGVpciBvd24gYWZ0ZXIgdGhlIHJlcG9ydCBwYWdlLCB1bmRlciB0aGUgc2FtZVxuLy8gaGVhZGVyL2Zvb3RlciBhbmQgd2l0aCB0aGUgc2FtZSBjb2x1bW4gd2lkdGhzLCB1cCB0byBQREZfTElTVF9ST1dTOyBhXG4vLyBsb25nZXIgcmVzdWx0IGVuZHMgaW4gYSByb3cgcG9pbnRpbmcgdG8gdGhlIGNvbXBvbmVudCdzIENTViBleHBvcnQuIEFcbi8vIHRhYmxlIHdob3NlIGhlYWRpbmcgYW5kIHRvdGFscyByb3cgbGVhdmUgYSBjb250aW51YXRpb24gcGFnZSBubyByb29tIGZvciBhXG4vLyByb3cgc3RvcHMgYXQgaXRzIGJveCB3aXRoIGEgbm90aWNlIGluc3RlYWQ6IGF1dG9UYWJsZSB3b3VsZCBhZGQgcGFnZXNcbi8vIHdpdGhvdXQgZW5kIHRyeWluZyB0byBwbGFjZSBpdC5cbi8vXG4vLyBBIGNvbXBvbmVudCB0aGF0IGZhaWxzIHRvIGRyYXcgaXMgbWFya2VkIGluIGl0cyBib3ggYW5kIHRoZSBmaWxlIGdvZXMgb25cbi8vIChfZ3VhcmRlZCk7IGJ1aWxkKCkgaGFuZHMgYmFjayB0aGUgb25lcyB0aGF0IGRpZC5cbi8vXG4vLyBBIHRleHQgYmxvY2sncyB0YWJsZXMgYXJlIGRyYXduIGJ5IGF1dG9UYWJsZSB0b28sIGZyb20gdGhlIGxpbmUgaXRzIHdvcmRzXG4vLyByZWFjaCwgaW4gdGhlIGNvbHVtbiB3aWR0aHMgdGhlIGNhbnZhcyBnaXZlcyB0aGVtIChSZXBvcnRUZXh0TGF5b3V0U2VydmljZSkuXG4vLyBBIHRleHQgYmxvY2sgaXMgbmV2ZXIgY3V0IGF0IHRoZSBib3R0b20gb2YgaXRzIGJveDogd2hhdCBydW5zIHBhc3QgaXQgZHJhd3Ncbi8vIG9uIGJlbG93LCBhcyBvbiB0aGUgY2FudmFzLCBkb3duIHRvIHRoZSBwYWdlJ3MgZWRnZS5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBSZXBvcnRQZGZTZXJ2aWNlIHtcblxuICBwcml2YXRlIHJlYWRvbmx5IF90ZXh0TGF5b3V0ID0gaW5qZWN0KFJlcG9ydFRleHRMYXlvdXRTZXJ2aWNlKTtcblxuICBwdWJsaWMgYXN5bmMgYnVpbGQoY29sbGVjdGVkOiBDb2xsZWN0ZWRSZXBvcnQpOiBQcm9taXNlPEJ1aWx0RXhwb3J0PiB7XG4gICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHRoaXMuX2NvbnRleHQoY29sbGVjdGVkKTtcblxuICAgIHRoaXMuX3RpdGxlUGFnZShjb250ZXh0LmRvYywgY29sbGVjdGVkLCBjb250ZXh0LnBhZ2VXLCBjb250ZXh0LnBhZ2VIKTtcblxuICAgIC8vIFRoZSBwaHlzaWNhbCBwYWdlIG51bWJlciB7e3BhZ2UubnVtYmVyfX0gcHJpbnRzOiByZXBvcnQgcGFnZXMgYW5kXG4gICAgLy8gdGhlaXIgY29udGludWF0aW9uIHBhZ2VzIGFsaWtlLCB0aGUgdGl0bGUgcGFnZSBub3QgY291bnRlZC5cbiAgICBsZXQgcGFnZU51bWJlciA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgY29sbGVjdGVkUGFnZV0gb2YgY29sbGVjdGVkLnBhZ2VzLmVudHJpZXMoKSkge1xuICAgICAgY29uc3Qgb3ZlcmZsb3dzOiBQZGZUYWJsZU92ZXJmbG93W10gPSBbXTtcbiAgICAgIHBhZ2VOdW1iZXIgKz0gMTtcblxuICAgICAgYXdhaXQgdGhpcy5fcmVuZGVyUGFnZShjb250ZXh0LCBjb2xsZWN0ZWRQYWdlLCBpbmRleCwgcGFnZU51bWJlciwgb3ZlcmZsb3dzKTtcblxuICAgICAgLy8gRWFjaCBjb250aW51YXRpb24gYXBwZW5kcyBpdHMgcGFnZXMgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQsIHNvXG4gICAgICAvLyB0d28gbGlzdHMgdGhhdCBvdmVyZmxvd2VkIG9uIG9uZSBwYWdlIGZvbGxvdyBpdCBiYWNrIHRvIGJhY2suXG4gICAgICBmb3IgKGNvbnN0IG92ZXJmbG93IG9mIG92ZXJmbG93cykge1xuICAgICAgICBjb25zdCB0b2tlbnMgPSB0aGlzLl90b2tlbnMoY29udGV4dCwgY29sbGVjdGVkUGFnZS5wYWdlLCBpbmRleCwgcGFnZU51bWJlciArIDEpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuX2d1YXJkZWQoY29udGV4dCwgb3ZlcmZsb3cuY29tcG9uZW50LCB0b2tlbnMucGFnZU5hbWUsIHRva2VucywgZmFsc2UsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBwYWdlTnVtYmVyID0gYXdhaXQgdGhpcy5fcmVuZGVyQ29udGludWF0aW9uKGNvbnRleHQsIGNvbGxlY3RlZFBhZ2UucGFnZSwgaW5kZXgsIHBhZ2VOdW1iZXIsIG92ZXJmbG93KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHVuZHJhd246IFsuLi5jb250ZXh0LnVuZHJhd24udmFsdWVzKCldLFxuICAgICAgc2F2ZTogKCkgPT4ge1xuICAgICAgICBjb250ZXh0LmRvYy5zYXZlKGAke3RoaXMuX3NsdWcoY29sbGVjdGVkLnJlcG9ydC5uYW1lKX0ucGRmYCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9jb250ZXh0KGNvbGxlY3RlZDogQ29sbGVjdGVkUmVwb3J0KTogUHJvbWlzZTxQZGZFeHBvcnRDb250ZXh0PiB7XG4gICAgY29uc3QgcmVwb3J0ID0gY29sbGVjdGVkLnJlcG9ydDtcbiAgICBjb25zdCB7IGpzUERGIH0gPSBhd2FpdCBpbXBvcnQoJ2pzcGRmJyk7XG4gICAgY29uc3QgeyBkZWZhdWx0OiBhdXRvVGFibGUsIF9fY3JlYXRlVGFibGU6IGNyZWF0ZVRhYmxlIH0gPSBhd2FpdCBpbXBvcnQoJ2pzcGRmLWF1dG90YWJsZScpO1xuXG4gICAgY29uc3QgcGFnZVcgPSByZXBvcnQucGFnZVdpZHRoICogUFQ7XG4gICAgY29uc3QgcGFnZUggPSByZXBvcnQucGFnZUhlaWdodCAqIFBUO1xuICAgIGNvbnN0IG9yaWVudGF0aW9uID0gcGFnZVcgPj0gcGFnZUggPyAnbGFuZHNjYXBlJyA6ICdwb3J0cmFpdCc7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZG9jOiBuZXcganNQREYoeyBvcmllbnRhdGlvbiwgdW5pdDogJ3B0JywgZm9ybWF0OiBbcGFnZVcsIHBhZ2VIXSB9KSxcbiAgICAgIGF1dG9UYWJsZSxcbiAgICAgIGNyZWF0ZVRhYmxlLFxuICAgICAganNQREYsXG4gICAgICByZXBvcnQsXG4gICAgICB0aW1lem9uZTogcmVzb2x2ZVJlcG9ydFRpbWV6b25lKHJlcG9ydCksXG4gICAgICBmb3JtYXRDb250ZXh0OiBjb2xsZWN0ZWQuZm9ybWF0Q29udGV4dCxcbiAgICAgIHBhZ2VXLFxuICAgICAgcGFnZUgsXG4gICAgICBvcmllbnRhdGlvbixcbiAgICAgIG1hc3RlclZhbHVlczogdGhpcy5fcGRmVmFsdWVzKGNvbGxlY3RlZC5tYXN0ZXJWYWx1ZXMpLFxuICAgICAgZmlsdGVyRmllbGRzOiBjb2xsZWN0ZWQuZmlsdGVyRmllbGRzLFxuICAgICAgbWFzdGVyRmlsdGVyczogbGF5ZXJGaWx0ZXJGaWVsZHMoY29sbGVjdGVkLmZpbHRlckZpZWxkcywgcmVwb3J0LmZpbHRlckdyb3VwcyA/PyBbXSwgbnVsbCksXG4gICAgICB1bmRyYXduOiBuZXcgTWFwKCksXG4gICAgfTtcbiAgfVxuXG4gIC8vIE9uZSByZXBvcnQgcGFnZTogdGhlIGhlYWRlciBhbmQgZm9vdGVyIGZpcnN0LCB1bmRlciB0aGUgcGFnZSdzIG93blxuICAvLyBjb21wb25lbnRzLiBBIGxpc3QgdGhhdCBvdXRncm93cyBpdHMgYm94IGxlYXZlcyBpdHMgcmVtYWluaW5nIHJvd3MgaW5cbiAgLy8gb3ZlcmZsb3dzLiBUaGUgcGFnZSdzIHRleHQgZmlsbHMgaXRzIHZhbHVlIHRva2VucyB3aXRoIHRoZSBwYWdlJ3MgdmFsdWVzLlxuICBwcml2YXRlIGFzeW5jIF9yZW5kZXJQYWdlKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgY29sbGVjdGVkUGFnZTogQ29sbGVjdGVkUGFnZSxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIHBhZ2VOdW1iZXI6IG51bWJlcixcbiAgICBvdmVyZmxvd3M6IFBkZlRhYmxlT3ZlcmZsb3dbXSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBkb2MgfSA9IGNvbnRleHQ7XG4gICAgY29uc3QgdG9rZW5zID0gdGhpcy5fdG9rZW5zKGNvbnRleHQsIGNvbGxlY3RlZFBhZ2UucGFnZSwgaW5kZXgsIHBhZ2VOdW1iZXIpO1xuICAgIGNvbnN0IHBhZ2VUb2tlbnMgPSB7IC4uLnRva2VucywgdmFsdWVzOiB0aGlzLl9wZGZWYWx1ZXMoY29sbGVjdGVkUGFnZS52YWx1ZXMpIH07XG5cbiAgICBkb2MuYWRkUGFnZShbY29udGV4dC5wYWdlVywgY29udGV4dC5wYWdlSF0sIGNvbnRleHQub3JpZW50YXRpb24pO1xuICAgIGF3YWl0IHRoaXMuX3JlbmRlck1hc3Rlcihjb250ZXh0LCBjb2xsZWN0ZWRQYWdlLnBhZ2UsIHRva2Vucyk7XG5cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgY29sbGVjdGVkUGFnZS5jb21wb25lbnRzKSB7XG4gICAgICBhd2FpdCB0aGlzLl9ndWFyZGVkKGNvbnRleHQsIGl0ZW0uY29tcG9uZW50LCB0b2tlbnMucGFnZU5hbWUsIHBhZ2VUb2tlbnMsIHRydWUsIGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKGl0ZW0uY29tcG9uZW50LnR5cGUgIT09ICd0ZXh0Jykge1xuICAgICAgICAgIGF3YWl0IHRoaXMuX3JlbmRlckNvbXBvbmVudChjb250ZXh0LCBjb2xsZWN0ZWRQYWdlLnBhZ2UsIGl0ZW0sIHRva2Vucywgb3ZlcmZsb3dzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLl9yZW5kZXJUZXh0KGNvbnRleHQsIGl0ZW0uY29tcG9uZW50LCBwYWdlVG9rZW5zKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gRHJhd3Mgb25lIGNvbXBvbmVudCwgb3Igb25lIGxpc3QncyBjb250aW51YXRpb24gcGFnZXMsIHNvIHRoYXQgd2hhdGV2ZXJcbiAgLy8gZ29lcyB3cm9uZyBzdGF5cyB3aXRoIGl0OiBhIGRyYXcgdGhhdCB0aHJvd3MgbG9zZXMgdGhlIHBhZ2VzIGl0IGFkZGVkLCBpdHNcbiAgLy8gYm94IG9uIHRoZSBwYWdlIChib3hlZCkgaXMgYmxhbmtlZCB1bmRlciBVTkRSQVdOX05PVEUsIGFuZCB0aGUgZXhwb3J0J3NcbiAgLy8gZ2F0ZSBuYW1lcyBpdCB1bmRlciBwYWdlLiBPbmUgY29tcG9uZW50IGNhbiB0aGVuIG5ldmVyIHN0b3AgdGhlIGZpbGUuXG4gIHByaXZhdGUgYXN5bmMgX2d1YXJkZWQoXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCxcbiAgICBwYWdlOiBzdHJpbmcsXG4gICAgdG9rZW5zOiBUZXh0VG9rZW5Db250ZXh0LFxuICAgIGJveGVkOiBib29sZWFuLFxuICAgIGRyYXc6ICgpID0+IFByb21pc2U8dm9pZD4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZG9jIH0gPSBjb250ZXh0O1xuICAgIGNvbnN0IGN1cnJlbnQgPSBkb2MuZ2V0Q3VycmVudFBhZ2VJbmZvKCkucGFnZU51bWJlcjtcbiAgICBjb25zdCBwYWdlcyA9IGRvYy5nZXROdW1iZXJPZlBhZ2VzKCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZHJhdygpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBUaGUgZmlsZSBvbmx5IHNheXMgdGhlIGJveCBjb3VsZCBub3QgYmUgZHJhd247IHRoZSBjb25zb2xlIGtlZXBzIHdoeS5cbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuXG4gICAgICB3aGlsZSAoZG9jLmdldE51bWJlck9mUGFnZXMoKSA+IHBhZ2VzKSB7XG4gICAgICAgIGRvYy5kZWxldGVQYWdlKGRvYy5nZXROdW1iZXJPZlBhZ2VzKCkpO1xuICAgICAgfVxuXG4gICAgICBkb2Muc2V0UGFnZShjdXJyZW50KTtcblxuICAgICAgaWYgKGJveGVkKSB7XG4gICAgICAgIHRoaXMuX3VuZHJhd25Cb3goZG9jLCBjb21wb25lbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWNvbnRleHQudW5kcmF3bi5oYXMoY29tcG9uZW50LmlkKSkge1xuICAgICAgICBjb250ZXh0LnVuZHJhd24uc2V0KGNvbXBvbmVudC5pZCwge1xuICAgICAgICAgIGNvbXBvbmVudElkOiBjb21wb25lbnQuaWQsXG4gICAgICAgICAgcGFnZSxcbiAgICAgICAgICBuYW1lOiBjb21wb25lbnQudHlwZSA9PT0gJ3RleHQnXG4gICAgICAgICAgICA/IHRleHRTbmlwcGV0KGNvbXBvbmVudCwgdG9rZW5zKVxuICAgICAgICAgICAgOiBleHBvcnRUaXRsZShjb21wb25lbnQsIHRva2VucyksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEEgY29tcG9uZW50J3MgYm94IGJsYW5rZWQgdW5kZXIgVU5EUkFXTl9OT1RFLCBvdmVyIHdoYXRldmVyIG9mIGl0IHdhc1xuICAvLyBkcmF3biBiZWZvcmUgaXQgZmFpbGVkLlxuICBwcml2YXRlIF91bmRyYXduQm94KGRvYzogYW55LCBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHggPSBjb21wb25lbnQueCAqIFBUO1xuICAgIGNvbnN0IHkgPSBjb21wb25lbnQueSAqIFBUO1xuICAgIGNvbnN0IHcgPSBjb21wb25lbnQudyAqIFBUO1xuICAgIGNvbnN0IGggPSBjb21wb25lbnQuaCAqIFBUO1xuXG4gICAgZG9jLnNldEZpbGxDb2xvcignI2ZmZmZmZicpO1xuICAgIGRvYy5yZWN0KHgsIHksIHcsIGgsICdGJyk7XG4gICAgdGhpcy5fYm94Tm90ZShkb2MsIFVORFJBV05fTk9URSwgeCwgeSwgdywgaCk7XG4gIH1cblxuICAvLyBUaGUgaGVhZGVyIGFuZCBmb290ZXIsIHRoZWlyIHZhbHVlIHRva2VucyBmaWxsZWQgd2l0aCB0aGUgbWFzdGVyJ3MgdmFsdWVzXG4gIC8vIHdoaWNoZXZlciBwYWdlIHRoZXkgc2l0IG9uOiBhIHJlcG9ydCBwYWdlIG9yIGEgY29udGludWF0aW9uIHBhZ2UuIFRoZXlcbiAgLy8gcmVhZCBubyBwYWdlIGZpbHRlcjogaXRzIHRva2VuIHByaW50cyB0aGUgZW0gZGFzaCB0aGVyZS5cbiAgcHJpdmF0ZSBhc3luYyBfcmVuZGVyTWFzdGVyKGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsIHBhZ2U6IFJlcG9ydFBhZ2UsIHRva2VuczogVGV4dFRva2VuQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChwYWdlLm1hc3RlckhpZGRlbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1hc3RlclRva2VucyA9IHsgLi4udG9rZW5zLCB2YWx1ZXM6IGNvbnRleHQubWFzdGVyVmFsdWVzLCBmaWx0ZXJzOiBjb250ZXh0Lm1hc3RlckZpbHRlcnMgfTtcblxuICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIChjb250ZXh0LnJlcG9ydC5tYXN0ZXI/LmNvbXBvbmVudHMgPz8gW10pLmZpbHRlcihpc0RyYXduKSkge1xuICAgICAgYXdhaXQgdGhpcy5fZ3VhcmRlZChjb250ZXh0LCBjb21wb25lbnQsIEhFQURFUl9GT09URVJfTkFNRSwgbWFzdGVyVG9rZW5zLCB0cnVlLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuX3JlbmRlclRleHQoY29udGV4dCwgY29tcG9uZW50LCBtYXN0ZXJUb2tlbnMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdGl0bGVQYWdlKGRvYzogYW55LCBjb2xsZWN0ZWQ6IENvbGxlY3RlZFJlcG9ydCwgcGFnZVc6IG51bWJlciwgcGFnZUg6IG51bWJlcik6IHZvaWQge1xuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSgyOCk7XG4gICAgZG9jLnNldFRleHRDb2xvcignIzFmMjkzMycpO1xuICAgIGRvYy50ZXh0KGNvbGxlY3RlZC5yZXBvcnQubmFtZSwgNDAsIHBhZ2VIICogMC4zNSk7XG5cbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ25vcm1hbCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSgxMSk7XG4gICAgZG9jLnNldFRleHRDb2xvcignIzUyNjA2ZCcpO1xuXG4gICAgZG9jLnRleHQoY292ZXJMaW5lcyhjb2xsZWN0ZWQpLm1hcCgobGluZSkgPT4gdGhpcy5fcGRmVGV4dChsaW5lKSksIDQwLCBwYWdlSCAqIDAuMzUgKyAyNik7XG4gIH1cblxuICAvLyBBIHRleHQgYmxvY2ssIGxhaWQgb3V0IGJ5IGhhbmQ6IGpzUERGIGRyYXdzIHN0cmluZ3MsIG5vdCByaWNoIHRleHQsIHNvIHRoZVxuICAvLyB3b3JkcyBiZXR3ZWVuIGl0cyB0YWJsZXMgYXJlIGRyYXduIGxpbmUgYnkgbGluZSAoX2RyYXdQYXJhZ3JhcGhzKSBhbmQgZWFjaFxuICAvLyB0YWJsZSBieSBhdXRvVGFibGUgZnJvbSB0aGUgbGluZSB0aGUgd29yZHMgYWJvdmUgaXQgcmVhY2hcbiAgLy8gKF9kcmF3VGV4dFRhYmxlKS4gT25seSBhIGJsb2NrIHdpdGggYSB0YWJsZSBpcyBtZWFzdXJlZCwgZm9yIHRoZSBlZGdlc1xuICAvLyBhbmQgY29sdW1uIHdpZHRocyB0aGUgY2FudmFzIGdpdmVzIGl0cyB0YWJsZXMuIFdvcmRzIGFuZCB0YWJsZSByb3dzIHRoYXRcbiAgLy8gcnVuIHBhc3QgdGhlIGJsb2NrJ3MgaGVpZ2h0IGRyYXcgb24gYmVsb3cgaXQsIGFzIG9uIHRoZSBjYW52YXM7IG9ubHkgdGhlXG4gIC8vIHBhZ2UncyBlZGdlIHN0b3BzIHRoZW0uXG4gIHByaXZhdGUgYXN5bmMgX3JlbmRlclRleHQoXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCxcbiAgICB0b2tlbnM6IFRleHRUb2tlbkNvbnRleHQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGJveCA9IHRoaXMuX3RleHRCb3goY29tcG9uZW50LCBjb250ZXh0LnBhZ2VIKTtcbiAgICBjb25zdCBibG9ja3MgPSB0ZXh0QmxvY2tzKGNvbXBvbmVudC5jb25maWc/Lmh0bWwgPz8gJycsIHRva2Vucyk7XG4gICAgY29uc3QgbGF5b3V0ID0gYmxvY2tzLnNvbWUoKGJsb2NrKSA9PiBibG9jay5raW5kID09PSAndGFibGUnKVxuICAgICAgPyBhd2FpdCB0aGlzLl90ZXh0TGF5b3V0Lm1lYXN1cmUoY29tcG9uZW50LCB0b2tlbnMpXG4gICAgICA6IG51bGw7XG4gICAgbGV0IGN1cnNvclkgPSBib3gudG9wO1xuICAgIGxldCB0YWJsZUluZGV4ID0gMDtcbiAgICAvLyBUaGUgY3Vyc29yIHNpdHMgb24gYSB0YWJsZSdzIGJvdHRvbSBtYXJnaW4sIG5vdGhpbmcgZHJhd24gc2luY2U6IHRoZVxuICAgIC8vIG5leHQgdGFibGUncyB0b3AgbWFyZ2luIGlzIHRoZSBzYW1lIHNwYWNlLCBhcyB0d28gYmxvY2sgbWFyZ2lucyB0aGF0XG4gICAgLy8gbWVldCBjb2xsYXBzZSBpbnRvIG9uZSBvbiB0aGUgY2FudmFzLlxuICAgIGxldCBvbk1hcmdpbiA9IGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBibG9jayBvZiBibG9ja3MpIHtcbiAgICAgIGNvbnN0IGRyYXduID0gYmxvY2sua2luZCA9PT0gJ3RleHQnXG4gICAgICAgID8gdGhpcy5fZHJhd1BhcmFncmFwaHMoY29udGV4dC5kb2MsIGJsb2NrLnBhcmFncmFwaHMsIGJveCwgY3Vyc29yWSlcbiAgICAgICAgOiB0aGlzLl9kcmF3VGV4dFRhYmxlKFxuICAgICAgICAgIGNvbnRleHQsIGJsb2NrLnRhYmxlLCBsYXlvdXQ/LnRhYmxlc1t0YWJsZUluZGV4KytdID8/IG51bGwsIGJveCxcbiAgICAgICAgICBvbk1hcmdpbiA/IGN1cnNvclkgOiBjdXJzb3JZICsgVEVYVF9UQUJMRV9NQVJHSU4sXG4gICAgICAgICk7XG5cbiAgICAgIGlmIChkcmF3bi5jdXQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjdXJzb3JZID0gZHJhd24uY3Vyc29yWTtcbiAgICAgIG9uTWFyZ2luID0gYmxvY2sua2luZCA9PT0gJ3RhYmxlJyB8fCAob25NYXJnaW4gJiYgIWJsb2NrLnBhcmFncmFwaHMubGVuZ3RoKTtcbiAgICB9XG4gIH1cblxuICAvLyBXaGVyZSBhIHRleHQgYmxvY2sncyB3b3JkcyBnbzogaW5zaWRlIGl0cyBwYWRkaW5nLCBlYWNoIGVkZ2UgMS84XCIgdW5sZXNzXG4gIC8vIHNldCwgZG93biB0byB0aGUgYm90dG9tIG9mIHRoZSBwYWdlIChwYWdlSCkuXG4gIHByaXZhdGUgX3RleHRCb3goY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsIHBhZ2VIOiBudW1iZXIpOiBQZGZUZXh0Qm94IHtcbiAgICBjb25zdCBwYWRkaW5nID0gY29tcG9uZW50LmNvbmZpZz8ucGFkZGluZztcbiAgICBjb25zdCBpbnNldCA9ICh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSA9PiAodmFsdWUgPz8gREVGQVVMVF9DT01QT05FTlRfUEFERElORykgKiBQVDtcblxuICAgIHJldHVybiB7XG4gICAgICBsZWZ0OiBjb21wb25lbnQueCAqIFBUICsgaW5zZXQocGFkZGluZz8ubGVmdCksXG4gICAgICB0b3A6IGNvbXBvbmVudC55ICogUFQgKyBpbnNldChwYWRkaW5nPy50b3ApLFxuICAgICAgd2lkdGg6IGNvbXBvbmVudC53ICogUFQgLSBpbnNldChwYWRkaW5nPy5sZWZ0KSAtIGluc2V0KHBhZGRpbmc/LnJpZ2h0KSxcbiAgICAgIGJvdHRvbTogcGFnZUgsXG4gICAgfTtcbiAgfVxuXG4gIC8vIFBhcmFncmFwaHMgZHJhd24gbGluZSBieSBsaW5lIGZyb20gY3Vyc29yWSBkb3duOiBlYWNoIG9uZSdzIHJ1bnMgYXJlIGJyb2tlblxuICAvLyBpbnRvIHdvcmRzLCB3cmFwcGVkIHRvIHRoZSBib3gncyB3aWR0aCBhbmQgZHJhd24gd29yZCBieSB3b3JkIGluIHRoZWlyIG93blxuICAvLyBmb250LCBzaXplIGFuZCBjb2xvciwgYSBsaXN0IGl0ZW0ncyBtYXJrZXIgaHVuZyBpbiBpdHMgaW5kZW50LiBUaGUgZmlyc3RcbiAgLy8gbGluZSB0aGF0IHdvdWxkIHJ1biBwYXN0IHRoZSBib3gncyBib3R0b20gZW5kcyB0aGUgZHJhd2luZywgY3V0LlxuICBwcml2YXRlIF9kcmF3UGFyYWdyYXBocyhkb2M6IGFueSwgcGFyYWdyYXBoczogVGV4dFBhcmFncmFwaFtdLCBib3g6IFBkZlRleHRCb3gsIGN1cnNvclk6IG51bWJlcik6IFBkZlRleHRDdXJzb3Ige1xuICAgIGxldCB5ID0gY3Vyc29yWTtcbiAgICBsZXQgbGlzdE51bWJlciA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IHBhcmFncmFwaCBvZiBwYXJhZ3JhcGhzKSB7XG4gICAgICBsaXN0TnVtYmVyID0gcGFyYWdyYXBoLmJ1bGxldCA9PT0gJ251bWJlcicgPyBsaXN0TnVtYmVyICsgMSA6IDA7XG4gICAgICBjb25zdCBpbmRlbnQgPSBwYXJhZ3JhcGguYnVsbGV0ID8gTElTVF9JTkRFTlQgOiAwO1xuICAgICAgY29uc3QgbGluZXMgPSB0aGlzLl93cmFwKGRvYywgcGFyYWdyYXBoLCBib3gud2lkdGggLSBpbmRlbnQpO1xuXG4gICAgICBmb3IgKGNvbnN0IFtsaW5lSW5kZXgsIGxpbmVdIG9mIGxpbmVzLmVudHJpZXMoKSkge1xuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5fbGluZVNpemUocGFyYWdyYXBoLCBsaW5lKTtcbiAgICAgICAgaWYgKHkgKyBzaXplICogVEVYVF9MSU5FX0hFSUdIVCA+IGJveC5ib3R0b20gKyAwLjUpIHtcbiAgICAgICAgICByZXR1cm4geyBjdXJzb3JZOiB5LCBjdXQ6IHRydWUgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaW5lSW5kZXggPT09IDAgJiYgcGFyYWdyYXBoLmJ1bGxldCkge1xuICAgICAgICAgIHRoaXMuX2ZvbnQoZG9jLCBsaW5lWzBdPy5ydW4gPz8geyB0ZXh0OiAnJyB9LCBzaXplKTtcbiAgICAgICAgICBkb2MudGV4dChwYXJhZ3JhcGguYnVsbGV0ID09PSAnbnVtYmVyJyA/IGAke2xpc3ROdW1iZXJ9LmAgOiAn4oCiJywgYm94LmxlZnQsIHkgKyBzaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2RyYXdMaW5lKGRvYywgbGluZSwgcGFyYWdyYXBoLmFsaWduLCBib3gubGVmdCArIGluZGVudCwgYm94LndpZHRoIC0gaW5kZW50LCB5ICsgc2l6ZSk7XG4gICAgICAgIHkgKz0gc2l6ZSAqIFRFWFRfTElORV9IRUlHSFQ7XG4gICAgICB9XG5cbiAgICAgIC8vIEFuIGVtcHR5IHBhcmFncmFwaCBpcyBzdGlsbCBhIGxpbmUuXG4gICAgICBpZiAoIWxpbmVzLmxlbmd0aCkge1xuICAgICAgICB5ICs9IERFRkFVTFRfVEVYVF9TSVpFICogVEVYVF9MSU5FX0hFSUdIVDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBjdXJzb3JZOiB5LCBjdXQ6IGZhbHNlIH07XG4gIH1cblxuICAvLyBIb3cgZmFyIF9kcmF3UGFyYWdyYXBocyB0YWtlcyBpdHMgY3Vyc29yIGRvd24gZHJhd2luZyB0aGUgcGFyYWdyYXBocyB3aG9sZVxuICAvLyBhdCBhIHdpZHRoLlxuICBwcml2YXRlIF9wYXJhZ3JhcGhzSGVpZ2h0KGRvYzogYW55LCBwYXJhZ3JhcGhzOiBUZXh0UGFyYWdyYXBoW10sIHdpZHRoOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBwYXJhZ3JhcGhzLnJlZHVjZSgoaGVpZ2h0LCBwYXJhZ3JhcGgpID0+IHtcbiAgICAgIGNvbnN0IGxpbmVzID0gdGhpcy5fd3JhcChkb2MsIHBhcmFncmFwaCwgd2lkdGggLSAocGFyYWdyYXBoLmJ1bGxldCA/IExJU1RfSU5ERU5UIDogMCkpO1xuXG4gICAgICByZXR1cm4gaGVpZ2h0ICsgKGxpbmVzLmxlbmd0aFxuICAgICAgICA/IGxpbmVzLnJlZHVjZSgoc3VtLCBsaW5lKSA9PiBzdW0gKyB0aGlzLl9saW5lU2l6ZShwYXJhZ3JhcGgsIGxpbmUpICogVEVYVF9MSU5FX0hFSUdIVCwgMClcbiAgICAgICAgOiBERUZBVUxUX1RFWFRfU0laRSAqIFRFWFRfTElORV9IRUlHSFQpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLy8gQSBsaW5lJ3MgZm9udCBzaXplOiBpdHMgbGFyZ2VzdCB3b3JkJ3MsIGFuZCBuZXZlciB1bmRlciBpdHMgcGFyYWdyYXBoJ3NcbiAgLy8gZmlyc3QgcnVuJ3MuXG4gIHByaXZhdGUgX2xpbmVTaXplKHBhcmFncmFwaDogVGV4dFBhcmFncmFwaCwgbGluZTogUGRmV29yZFtdKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoLi4ubGluZS5tYXAoKHdvcmQpID0+IHdvcmQuc2l6ZSksIHBhcmFncmFwaC5ydW5zWzBdPy5mb250U2l6ZSA/PyBERUZBVUxUX1RFWFRfU0laRSk7XG4gIH1cblxuICAvLyBPbmUgd3JhcHBlZCBsaW5lIG9uIGl0cyBiYXNlbGluZSwgYWxpZ25lZCB3aXRoaW4gdGhlIHdpZHRoIGZyb20gbGVmdC5cbiAgcHJpdmF0ZSBfZHJhd0xpbmUoXG4gICAgZG9jOiBhbnksXG4gICAgbGluZTogUGRmV29yZFtdLFxuICAgIGFsaWduOiBUZXh0UGFyYWdyYXBoWydhbGlnbiddLFxuICAgIGxlZnQ6IG51bWJlciwgd2lkdGg6IG51bWJlciwgYmFzZWxpbmU6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgbGluZVdpZHRoID0gbGluZS5yZWR1Y2UoKHN1bSwgd29yZCkgPT4gc3VtICsgd29yZC53aWR0aCwgMCk7XG4gICAgbGV0IHggPSBsZWZ0ICsgdGhpcy5fYWxpZ25PZmZzZXQoYWxpZ24sIHdpZHRoLCBsaW5lV2lkdGgpO1xuXG4gICAgZm9yIChjb25zdCB3b3JkIG9mIGxpbmUpIHtcbiAgICAgIHRoaXMuX2RyYXdXb3JkKGRvYywgd29yZCwgeCwgYmFzZWxpbmUpO1xuICAgICAgeCArPSB3b3JkLndpZHRoO1xuICAgIH1cbiAgfVxuXG4gIC8vIEEgdGFibGUgaW4gYSB0ZXh0IGJsb2NrLCBkcmF3biBieSBhdXRvVGFibGUgZnJvbSB0b3AgKF9yZW5kZXJUZXh0IHB1dHMgaXRcbiAgLy8gVEVYVF9UQUJMRV9NQVJHSU4gdW5kZXIgdGhlIGxpbmUgdGhlIHdvcmRzIGFib3ZlIGl0IHJlYWNoKSwgaW4gdGhlIG9uZVxuICAvLyBsb29rIGV2ZXJ5IHJlbmRlcmVyIGRyYXdzIChURVhUX1RBQkxFXyogaW4gdGV4dC50cykuIEl0cyBsZWZ0IGVkZ2UsIHdpZHRoXG4gIC8vIGFuZCBjb2x1bW4gd2lkdGhzIGFyZSB0aGUgY2FudmFzJ3MgKGxheW91dCksIGVsc2UgdGhlIGJveCdzIHdpZHRoIHNwbGl0XG4gIC8vIGV2ZW5seS4gQSByb3cgaXMgYXMgdGFsbCBhcyBpdHMgY2VsbHMnIHdvcmRzIHdyYXBwZWQgYXMgX2RyYXdQYXJhZ3JhcGhzXG4gIC8vIHdyYXBzIHRoZW0sIGFuZCB0aGUgd29yZHMgYXJlIGRyYXduIGludG8gZWFjaCBjZWxsIG9uY2UgYXV0b1RhYmxlIGhhc1xuICAvLyBkcmF3biBpdHMgZ3JpZCBsaW5lcyBhbmQgZmlsbCAoX2RyYXdUZXh0Q2VsbCksIHNvIHRoZXkga2VlcCB0aGVpciBydW5zJ1xuICAvLyBmb250cyBhbmQgY29sb3JzLiBPbmx5IHRoZSByb3dzIHRoYXQgZml0IGFib3ZlIHRoZSBib3gncyBib3R0b20sIHRoZVxuICAvLyBwYWdlJ3MgZWRnZSwgYXJlIGRyYXduLCBhbmQgYSB0YWJsZSB0aGF0IGxvc2VzIGFueSwgb3IgcnVucyBwYXN0IGl0cyBwYWdlXG4gIC8vIGFueXdheSwgaXMgY3V0LiBUaGUgY3Vyc29yIGl0IGxlYXZlcyBpcyBURVhUX1RBQkxFX01BUkdJTiB1bmRlciBpdC5cbiAgcHJpdmF0ZSBfZHJhd1RleHRUYWJsZShcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIHRhYmxlOiBUZXh0VGFibGUsXG4gICAgbGF5b3V0OiBUZXh0VGFibGVMYXlvdXQgfCBudWxsLFxuICAgIGJveDogUGRmVGV4dEJveCxcbiAgICB0b3A6IG51bWJlcixcbiAgKTogUGRmVGV4dEN1cnNvciB7XG4gICAgaWYgKHRvcCA+PSBib3guYm90dG9tKSB7XG4gICAgICByZXR1cm4geyBjdXJzb3JZOiB0b3AsIGN1dDogdHJ1ZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IGxlZnQgPSBib3gubGVmdCArIChsYXlvdXQ/LmxlZnQgPz8gMCkgKiBQVDtcbiAgICBjb25zdCB3aWR0aCA9IGxheW91dCA/IGxheW91dC53aWR0aCAqIFBUIDogYm94LndpZHRoO1xuICAgIGNvbnN0IGNvbHVtbldpZHRocyA9IGxheW91dD8uY29sdW1uV2lkdGhzLmxlbmd0aCA9PT0gdGFibGUuY29sdW1uc1xuICAgICAgPyBsYXlvdXQuY29sdW1uV2lkdGhzLm1hcCgoY29sdW1uV2lkdGgpID0+IGNvbHVtbldpZHRoICogUFQpXG4gICAgICA6IEFycmF5LmZyb20oeyBsZW5ndGg6IHRhYmxlLmNvbHVtbnMgfSwgKCkgPT4gd2lkdGggLyB0YWJsZS5jb2x1bW5zKTtcbiAgICBjb25zdCBib2R5ID0gdGFibGUucm93cy5tYXAoKHJvdykgPT4gcm93LmNlbGxzLm1hcCgoY2VsbCkgPT4gdGhpcy5fdGV4dENlbGxJbnB1dChjb250ZXh0LmRvYywgY2VsbCwgY29sdW1uV2lkdGhzKSkpO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl90ZXh0VGFibGVPcHRpb25zKGNvbnRleHQsIGNvbHVtbldpZHRocywgbGVmdCwgdG9wLCB3aWR0aCwgYm94LmJvdHRvbSk7XG4gICAgY29uc3QgZml0ID0gdGhpcy5fdGV4dFRhYmxlRml0KGNvbnRleHQsIHsgLi4ub3B0aW9ucywgYm9keSB9LCB0b3AsIGJveC5ib3R0b20pO1xuICAgIGNvbnN0IHdob2xlID0gIWZpdCB8fCB0aGlzLl9kcmF3VGFibGUoY29udGV4dCwgeyAuLi5vcHRpb25zLCBib2R5OiB0aGlzLl9rZXB0Um93cyhib2R5LCBmaXQpIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnNvclk6IGZpdCAmJiB3aG9sZSA/IGNvbnRleHQuZG9jLmxhc3RBdXRvVGFibGUuZmluYWxZICsgVEVYVF9UQUJMRV9NQVJHSU4gOiB0b3AsXG4gICAgICBjdXQ6ICF3aG9sZSB8fCBmaXQgPCB0YWJsZS5yb3dzLmxlbmd0aCxcbiAgICB9O1xuICB9XG5cbiAgLy8gQSB0ZXh0IHRhYmxlJ3MgY2VsbCBhcyBhdXRvVGFibGUgdGFrZXMgaXQ6IGl0cyBzcGFucyBhbmQgZmlsbCBhbmQsIHdoZW4gaXRcbiAgLy8gaXMgb25lIHJvdyB0YWxsLCB0aGUgaGVpZ2h0IGl0cyB3b3JkcyBuZWVkIGF0IHRoZSB3aWR0aCBpdCBzcGFucy4gQSBjZWxsXG4gIC8vIHRoYXQgc3BhbnMgcm93cyBzaGFyZXMgdGhlaXJzLlxuICBwcml2YXRlIF90ZXh0Q2VsbElucHV0KGRvYzogYW55LCBjZWxsOiBUZXh0VGFibGVDZWxsLCBjb2x1bW5XaWR0aHM6IG51bWJlcltdKTogUGRmVGV4dENlbGxJbnB1dCB7XG4gICAgY29uc3QgcGFkZGluZyA9IFRFWFRfVEFCTEVfQ0VMTF9QQURESU5HO1xuICAgIGNvbnN0IHdpZHRoID0gY29sdW1uV2lkdGhzXG4gICAgICAuc2xpY2UoY2VsbC5jb2x1bW4sIGNlbGwuY29sdW1uICsgY2VsbC5jb2xTcGFuKVxuICAgICAgLnJlZHVjZSgoc3VtLCBjb2x1bW5XaWR0aCkgPT4gc3VtICsgY29sdW1uV2lkdGgsIDApIC0gMiAqIHBhZGRpbmcuaG9yaXpvbnRhbDtcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiAnJyxcbiAgICAgIGNvbFNwYW46IGNlbGwuY29sU3BhbixcbiAgICAgIHJvd1NwYW46IGNlbGwucm93U3BhbixcbiAgICAgIHRleHRDZWxsOiBjZWxsLFxuICAgICAgc3R5bGVzOiB7XG4gICAgICAgIC4uLihjZWxsLmZpbGwgPyB7IGZpbGxDb2xvcjogY2VsbC5maWxsIH0gOiB7fSksXG4gICAgICAgIC4uLihjZWxsLnJvd1NwYW4gPT09IDFcbiAgICAgICAgICA/IHsgbWluQ2VsbEhlaWdodDogdGhpcy5fcGFyYWdyYXBoc0hlaWdodChkb2MsIGNlbGwucGFyYWdyYXBocywgd2lkdGgpICsgMiAqIHBhZGRpbmcudmVydGljYWwgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLy8gVGhlIGF1dG9UYWJsZSBvcHRpb25zIGEgdGV4dCB0YWJsZSdzIGRyeSBydW4gYW5kIGl0cyBkcmF3IHNoYXJlLiBFdmVyeVxuICAvLyBjb2x1bW4gaXMgbGlzdGVkIGFuZCBmaXhlZCBhdCBpdHMgd2lkdGg6IGF1dG9UYWJsZSB3b3VsZCBvdGhlcndpc2UgY291bnRcbiAgLy8gdGhlIGNvbHVtbnMgb2YgdGhlIGZpcnN0IHJvdywgd2hpY2ggbWF5IGJlIG5hcnJvd2VyIHRoYW4gdGhlIGdyaWQuIEEgcm93XG4gIC8vIGlzIG5ldmVyIHNwbGl0IGF0IHRoZSBib3gncyBib3R0b206IGl0IGZpdHMgd2hvbGUgb3IgbW92ZXMgcGFzdCBpdC4gYm90dG9tXG4gIC8vIGlzIHRoZSBib3gncy5cbiAgcHJpdmF0ZSBfdGV4dFRhYmxlT3B0aW9ucyhcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGNvbHVtbldpZHRoczogbnVtYmVyW10sXG4gICAgbGVmdDogbnVtYmVyLCB0b3A6IG51bWJlciwgd2lkdGg6IG51bWJlciwgYm90dG9tOiBudW1iZXIsXG4gICk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBjb25zdCBwYWRkaW5nID0gVEVYVF9UQUJMRV9DRUxMX1BBRERJTkc7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGhlbWU6ICdwbGFpbicsXG4gICAgICBjb2x1bW5zOiBjb2x1bW5XaWR0aHMubWFwKChfLCBpbmRleCkgPT4gKHsgZGF0YUtleTogaW5kZXggfSkpLFxuICAgICAgc3RhcnRZOiB0b3AsXG4gICAgICBtYXJnaW46IHsgbGVmdCwgcmlnaHQ6IGNvbnRleHQucGFnZVcgLSBsZWZ0IC0gd2lkdGgsIGJvdHRvbTogY29udGV4dC5wYWdlSCAtIGJvdHRvbSB9LFxuICAgICAgdGFibGVXaWR0aDogd2lkdGgsXG4gICAgICBjb2x1bW5TdHlsZXM6IE9iamVjdC5mcm9tRW50cmllcyhjb2x1bW5XaWR0aHMubWFwKChjZWxsV2lkdGgsIGluZGV4KSA9PiBbaW5kZXgsIHsgY2VsbFdpZHRoIH1dKSksXG4gICAgICByb3dQYWdlQnJlYWs6ICdhdm9pZCcsXG4gICAgICBzdHlsZXM6IHtcbiAgICAgICAgZm9udDogJ2hlbHZldGljYScsXG4gICAgICAgIGZvbnRTdHlsZTogJ25vcm1hbCcsXG4gICAgICAgIGZvbnRTaXplOiBERUZBVUxUX1RFWFRfU0laRSxcbiAgICAgICAgY2VsbFBhZGRpbmc6IHtcbiAgICAgICAgICB0b3A6IHBhZGRpbmcudmVydGljYWwsIHJpZ2h0OiBwYWRkaW5nLmhvcml6b250YWwsIGJvdHRvbTogcGFkZGluZy52ZXJ0aWNhbCwgbGVmdDogcGFkZGluZy5ob3Jpem9udGFsLFxuICAgICAgICB9LFxuICAgICAgICBsaW5lQ29sb3I6IFRFWFRfVEFCTEVfQk9SREVSX0NPTE9SLFxuICAgICAgICBsaW5lV2lkdGg6IFRFWFRfVEFCTEVfQk9SREVSX1dJRFRILFxuICAgICAgICB2YWxpZ246ICdtaWRkbGUnLFxuICAgICAgICB0ZXh0Q29sb3I6IERFRkFVTFRfVEVYVF9DT0xPUixcbiAgICAgIH0sXG4gICAgICBkaWREcmF3Q2VsbDogKGhvb2s6IGFueSkgPT4gdGhpcy5fZHJhd1RleHRDZWxsKGhvb2spLFxuICAgIH07XG4gIH1cblxuICAvLyBIb3cgbWFueSBvZiBhIHRleHQgdGFibGUncyByb3dzIGl0cyBib3gsIGZyb20gdG9wIHRvIGJvdHRvbSwgaG9sZHMgd2hvbGU6XG4gIC8vIHRoZSB0YWJsZSBsYWlkIG91dCBhcyBfbWVhc3VyZSBsYXlzIG91dCBhIGxpc3Qncy5cbiAgcHJpdmF0ZSBfdGV4dFRhYmxlRml0KGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCB0b3A6IG51bWJlciwgYm90dG9tOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9maXR0aW5nUm93cyhjb250ZXh0LmNyZWF0ZVRhYmxlKHRoaXMuX3NjcmF0Y2hEb2N1bWVudChjb250ZXh0KSwgb3B0aW9ucyksIHRvcCwgYm90dG9tLCAwKTtcbiAgfVxuXG4gIC8vIFRoZSBmaXJzdCBgZml0YCByb3dzLCBhIGNlbGwgdGhhdCBzcGFucyBkb3duIHBhc3QgdGhlIGxhc3Qgb2YgdGhlbSBjdXRcbiAgLy8gdGhlcmUuXG4gIHByaXZhdGUgX2tlcHRSb3dzKGJvZHk6IFBkZlRleHRDZWxsSW5wdXRbXVtdLCBmaXQ6IG51bWJlcik6IFBkZlRleHRDZWxsSW5wdXRbXVtdIHtcbiAgICByZXR1cm4gYm9keS5zbGljZSgwLCBmaXQpLm1hcCgocm93KSA9PiByb3cubWFwKChpbnB1dCkgPT4ge1xuICAgICAgY29uc3Qgcm93U3BhbiA9IE1hdGgubWluKGlucHV0LnJvd1NwYW4sIGZpdCAtIGlucHV0LnRleHRDZWxsLnJvdyk7XG5cbiAgICAgIHJldHVybiByb3dTcGFuID09PSBpbnB1dC5yb3dTcGFuID8gaW5wdXQgOiB7IC4uLmlucHV0LCByb3dTcGFuIH07XG4gICAgfSkpO1xuICB9XG5cbiAgLy8gQSB0ZXh0IHRhYmxlIGNlbGwncyB3b3JkcywgZHJhd24gb25jZSBhdXRvVGFibGUgaGFzIGRyYXduIHRoZSBjZWxsOiBpbnNpZGVcbiAgLy8gaXRzIHBhZGRpbmcsIHdyYXBwZWQgdG8gaXRzIHdpZHRoIGFuZCBwbGFjZWQgYnkgaXRzIHZlcnRpY2FsIGFsaWdubWVudCwgdGhlXG4gIC8vIG1pZGRsZSB1bmxlc3Mgc2V0LiBMaW5lcyBwYXN0IHRoZSBjZWxsIGFyZSBsZWZ0IG9mZi5cbiAgcHJpdmF0ZSBfZHJhd1RleHRDZWxsKGhvb2s6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IGNlbGw6IFRleHRUYWJsZUNlbGwgfCB1bmRlZmluZWQgPSBob29rLmNlbGwucmF3Py50ZXh0Q2VsbDtcbiAgICBpZiAoIWNlbGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfSA9IGhvb2suY2VsbDtcbiAgICBjb25zdCBib3g6IFBkZlRleHRCb3ggPSB7XG4gICAgICBsZWZ0OiB4ICsgaG9vay5jZWxsLnBhZGRpbmcoJ2xlZnQnKSxcbiAgICAgIHRvcDogeSArIGhvb2suY2VsbC5wYWRkaW5nKCd0b3AnKSxcbiAgICAgIHdpZHRoOiB3aWR0aCAtIGhvb2suY2VsbC5wYWRkaW5nKCdob3Jpem9udGFsJyksXG4gICAgICBib3R0b206IHkgKyBoZWlnaHQgLSBob29rLmNlbGwucGFkZGluZygnYm90dG9tJyksXG4gICAgfTtcbiAgICBjb25zdCBzcGFyZSA9IE1hdGgubWF4KDAsIGJveC5ib3R0b20gLSBib3gudG9wIC0gdGhpcy5fcGFyYWdyYXBoc0hlaWdodChob29rLmRvYywgY2VsbC5wYXJhZ3JhcGhzLCBib3gud2lkdGgpKTtcbiAgICBjb25zdCBvZmZzZXQgPSBjZWxsLnZhbGlnbiA9PT0gJ3RvcCcgPyAwIDogKGNlbGwudmFsaWduID09PSAnYm90dG9tJyA/IHNwYXJlIDogc3BhcmUgLyAyKTtcblxuICAgIHRoaXMuX2RyYXdQYXJhZ3JhcGhzKGhvb2suZG9jLCBjZWxsLnBhcmFncmFwaHMsIGJveCwgYm94LnRvcCArIG9mZnNldCk7XG4gIH1cblxuICAvLyBCcmVhayBhIHBhcmFncmFwaCdzIHJ1bnMgaW50byBsaW5lcyBvZiBtZWFzdXJlZCB3b3JkcyB0aGF0IGZpdCB0aGUgd2lkdGguXG4gIC8vIEEgd29yZCBrZWVwcyBpdHMgdHJhaWxpbmcgc3BhY2Ugc28gc3BhY2luZyBzdXJ2aXZlcyBydW4gYm91bmRhcmllcy4gQVxuICAvLyBuby1icmVhayBzcGFjZSBpcyBwYXJ0IG9mIGl0cyB3b3JkLCBuZXZlciBhIGJyZWFrIGJldHdlZW4gdHdvOiBhIG51bWJlclxuICAvLyBncm91cGVkIHdpdGggb25lIChmci1DQSdzIHRob3VzYW5kcywgb3IgYSBuYXJyb3cgc3BhY2UgX3BkZlRleHQgdHVybmVkXG4gIC8vIGludG8gb25lKSBzdGF5cyBvbiBvbmUgbGluZS5cbiAgcHJpdmF0ZSBfd3JhcChkb2M6IGFueSwgcGFyYWdyYXBoOiBUZXh0UGFyYWdyYXBoLCB3aWR0aDogbnVtYmVyKTogUGRmV29yZFtdW10ge1xuICAgIGNvbnN0IGxpbmVzOiBQZGZXb3JkW11bXSA9IFtdO1xuICAgIGxldCBsaW5lOiBQZGZXb3JkW10gPSBbXTtcbiAgICBsZXQgbGluZVdpZHRoID0gMDtcblxuICAgIGZvciAoY29uc3QgcnVuIG9mIHBhcmFncmFwaC5ydW5zKSB7XG4gICAgICBjb25zdCBzaXplID0gcnVuLmZvbnRTaXplID8/IERFRkFVTFRfVEVYVF9TSVpFO1xuICAgICAgdGhpcy5fZm9udChkb2MsIHJ1biwgc2l6ZSk7XG5cbiAgICAgIGZvciAoY29uc3QgdGV4dCBvZiBydW4udGV4dC5tYXRjaCgvKD86W15cXHNdfFxcdTAwYTApK1teXFxTXFx1MDBhMF0qfFteXFxTXFx1MDBhMF0rL2cpID8/IFtdKSB7XG4gICAgICAgIGNvbnN0IHdvcmRXaWR0aCA9IGRvYy5nZXRUZXh0V2lkdGgodGV4dCk7XG5cbiAgICAgICAgaWYgKGxpbmUubGVuZ3RoICYmIGxpbmVXaWR0aCArIHdvcmRXaWR0aCAtIHRoaXMuX3RyYWlsaW5nU3BhY2UoZG9jLCB0ZXh0KSA+IHdpZHRoKSB7XG4gICAgICAgICAgbGluZXMucHVzaChsaW5lKTtcbiAgICAgICAgICBsaW5lID0gW107XG4gICAgICAgICAgbGluZVdpZHRoID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxpbmUucHVzaCh7IHJ1biwgdGV4dCwgc2l6ZSwgd2lkdGg6IHdvcmRXaWR0aCB9KTtcbiAgICAgICAgbGluZVdpZHRoICs9IHdvcmRXaWR0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobGluZS5sZW5ndGgpIHtcbiAgICAgIGxpbmVzLnB1c2gobGluZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBfZHJhd1dvcmQoZG9jOiBhbnksIHdvcmQ6IFBkZldvcmQsIHg6IG51bWJlciwgYmFzZWxpbmU6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHJ1biA9IHdvcmQucnVuO1xuXG4gICAgaWYgKHJ1bi5oaWdobGlnaHQpIHtcbiAgICAgIGRvYy5zZXRGaWxsQ29sb3IocnVuLmhpZ2hsaWdodCk7XG4gICAgICBkb2MucmVjdCh4LCBiYXNlbGluZSAtIHdvcmQuc2l6ZSAqIDAuOSwgd29yZC53aWR0aCwgd29yZC5zaXplICogMS4xNSwgJ0YnKTtcbiAgICB9XG5cbiAgICB0aGlzLl9mb250KGRvYywgcnVuLCB3b3JkLnNpemUpO1xuICAgIGRvYy50ZXh0KHdvcmQudGV4dCwgeCwgYmFzZWxpbmUpO1xuXG4gICAgY29uc3QgY29sb3IgPSBydW4uY29sb3IgPz8gREVGQVVMVF9URVhUX0NPTE9SO1xuICAgIGNvbnN0IGlua1dpZHRoID0gd29yZC53aWR0aCAtIHRoaXMuX3RyYWlsaW5nU3BhY2UoZG9jLCB3b3JkLnRleHQpO1xuICAgIGlmIChydW4udW5kZXJsaW5lKSB7XG4gICAgICBkb2Muc2V0RHJhd0NvbG9yKGNvbG9yKTtcbiAgICAgIGRvYy5zZXRMaW5lV2lkdGgod29yZC5zaXplIC8gMTYpO1xuICAgICAgZG9jLmxpbmUoeCwgYmFzZWxpbmUgKyB3b3JkLnNpemUgKiAwLjEyLCB4ICsgaW5rV2lkdGgsIGJhc2VsaW5lICsgd29yZC5zaXplICogMC4xMik7XG4gICAgfVxuICAgIGlmIChydW4uc3RyaWtlKSB7XG4gICAgICBkb2Muc2V0RHJhd0NvbG9yKGNvbG9yKTtcbiAgICAgIGRvYy5zZXRMaW5lV2lkdGgod29yZC5zaXplIC8gMTYpO1xuICAgICAgZG9jLmxpbmUoeCwgYmFzZWxpbmUgLSB3b3JkLnNpemUgKiAwLjMsIHggKyBpbmtXaWR0aCwgYmFzZWxpbmUgLSB3b3JkLnNpemUgKiAwLjMpO1xuICAgIH1cblxuICAgIGlmIChydW4ubGluaykge1xuICAgICAgZG9jLmxpbmsoeCwgYmFzZWxpbmUgLSB3b3JkLnNpemUsIGlua1dpZHRoLCB3b3JkLnNpemUgKiAxLjIsIHsgdXJsOiBydW4ubGluayB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBqc1BERidzIHN0YW5kYXJkIGZvbnRzIGFyZSBIZWx2ZXRpY2EsIFRpbWVzIGFuZCBDb3VyaWVyOyBhIGJsb2NrJ3MgZmFjZSBpc1xuICAvLyBtYXBwZWQgb250byB3aGljaGV2ZXIgb2YgdGhlIHRocmVlIGl0IHJlc2VtYmxlcy5cbiAgcHJpdmF0ZSBfZm9udChkb2M6IGFueSwgcnVuOiBUZXh0UnVuLCBzaXplOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBmYWNlID0gKHJ1bi5mb250RmFjZSA/PyAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBmYW1pbHkgPSAvY291cmllcnxtb25vLy50ZXN0KGZhY2UpXG4gICAgICA/ICdjb3VyaWVyJ1xuICAgICAgOiAoL3RpbWVzfGdlb3JnaWF8c2VyaWYvLnRlc3QoZmFjZSkgJiYgIWZhY2UuaW5jbHVkZXMoJ3NhbnMnKSA/ICd0aW1lcycgOiAnaGVsdmV0aWNhJyk7XG4gICAgY29uc3Qgc3R5bGUgPSBydW4uYm9sZCAmJiBydW4uaXRhbGljXG4gICAgICA/ICdib2xkaXRhbGljJ1xuICAgICAgOiAocnVuLmJvbGQgPyAnYm9sZCcgOiAocnVuLml0YWxpYyA/ICdpdGFsaWMnIDogJ25vcm1hbCcpKTtcblxuICAgIGRvYy5zZXRGb250KGZhbWlseSwgc3R5bGUpO1xuICAgIGRvYy5zZXRGb250U2l6ZShzaXplKTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKHJ1bi5jb2xvciA/PyBERUZBVUxUX1RFWFRfQ09MT1IpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdHJhaWxpbmdTcGFjZShkb2M6IGFueSwgdGV4dDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCB0cmFpbGluZyA9IHRleHQubGVuZ3RoIC0gdGV4dC50cmltRW5kKCkubGVuZ3RoO1xuXG4gICAgcmV0dXJuIHRyYWlsaW5nID8gZG9jLmdldFRleHRXaWR0aCgnICcpICogdHJhaWxpbmcgOiAwO1xuICB9XG5cbiAgcHJpdmF0ZSBfYWxpZ25PZmZzZXQoYWxpZ246IFRleHRQYXJhZ3JhcGhbJ2FsaWduJ10sIHdpZHRoOiBudW1iZXIsIGxpbmVXaWR0aDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBzd2l0Y2ggKGFsaWduKSB7XG4gICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgKHdpZHRoIC0gbGluZVdpZHRoKSAvIDIpO1xuICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgd2lkdGggLSBsaW5lV2lkdGgpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9XG5cbiAgLy8gV2hhdCB0aGUgdG9rZW5zIG9mIGEgdGV4dCBibG9jayBhbmQgb2YgYSB0aWxlJ3MgdGl0bGUgZmlsbCB3aXRoIG9uIHRoaXNcbiAgLy8gcGFnZS4gVGhlIG51bWJlciBpcyB0aGUgcGh5c2ljYWwgcGFnZSBhbW9uZyB0aGUgcmVwb3J0J3MgcGFnZXMsXG4gIC8vIGNvbnRpbnVhdGlvbiBwYWdlcyBpbmNsdWRlZCDigJQgdGhlIHRpdGxlIHBhZ2UgaXMgbm90IGEgcmVwb3J0IHBhZ2UuIFRoZVxuICAvLyBuYW1lIHN0YXlzIHRoZSByZXBvcnQgcGFnZSdzLCBzbyBhIGNvbnRpbnVhdGlvbiBwYWdlIGlzIG5hbWVkIGZvciB0aGVcbiAgLy8gcGFnZSBpdHMgdGFibGUgc3RhcnRlZCBvbi4gVGhlIGZpbHRlcnMgYXJlIHRoZSByZXBvcnQncyBhbmQgdGhlIHBhZ2Unc1xuICAvLyBvd24gcGFnZSBmaWx0ZXJzIChsYXllckZpbHRlckZpZWxkcykuXG4gIHByaXZhdGUgX3Rva2Vucyhjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LCBwYWdlOiBSZXBvcnRQYWdlLCBpbmRleDogbnVtYmVyLCBwYWdlTnVtYmVyOiBudW1iZXIpOiBUZXh0VG9rZW5Db250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFnZU51bWJlcixcbiAgICAgIHBhZ2VOYW1lOiBwYWdlLm5hbWUgfHwgYFBhZ2UgJHtpbmRleCArIDF9YCxcbiAgICAgIHJlcG9ydE5hbWU6IGNvbnRleHQucmVwb3J0Lm5hbWUsXG4gICAgICBmaWx0ZXJzOiBsYXllckZpbHRlckZpZWxkcyhjb250ZXh0LmZpbHRlckZpZWxkcywgY29udGV4dC5yZXBvcnQuZmlsdGVyR3JvdXBzID8/IFtdLCBwYWdlLmlkKSxcbiAgICB9O1xuICB9XG5cbiAgLy8gQSB0aWxlIG9uIGl0cyByZXBvcnQgcGFnZSwgaXRzIHRpdGxlJ3MgdG9rZW5zIGZpbGxlZCB3aXRoIHRoYXQgcGFnZSdzLlxuICBwcml2YXRlIGFzeW5jIF9yZW5kZXJDb21wb25lbnQoXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBwYWdlOiBSZXBvcnRQYWdlLFxuICAgIGl0ZW06IENvbGxlY3RlZENvbXBvbmVudCxcbiAgICB0b2tlbnM6IFRleHRUb2tlbkNvbnRleHQsXG4gICAgb3ZlcmZsb3dzOiBQZGZUYWJsZU92ZXJmbG93W10sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZG9jIH0gPSBjb250ZXh0O1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IGl0ZW0uY29tcG9uZW50O1xuICAgIC8vIEdlb21ldHJ5IGlzIHN0b3JlZCBpbiBpbmNoZXM7IHRoZSBQREYgZHJhd3MgaW4gcG9pbnRzLlxuICAgIGNvbnN0IHggPSBjb21wb25lbnQueCAqIFBUO1xuICAgIGNvbnN0IHkgPSBjb21wb25lbnQueSAqIFBUO1xuICAgIGNvbnN0IHcgPSBjb21wb25lbnQudyAqIFBUO1xuICAgIGNvbnN0IGggPSBjb21wb25lbnQuaCAqIFBUO1xuXG4gICAgY29uc3QgdGl0bGUgPSBleHBvcnRUaXRsZShjb21wb25lbnQsIHRva2VucywgaXRlbS5zZWFyY2gsIGl0ZW0uY3J1bWJzLCBpdGVtLmZpbHRlcmVkKTtcbiAgICBpZiAodGl0bGUpIHtcbiAgICAgIHRoaXMuX2NvbXBvbmVudFRpdGxlKGRvYywgdGl0bGUsIHgsIHksIHcpO1xuICAgIH1cblxuICAgIC8vIEEgY2hhcnQgb3IgbGlzdCB0aGF0IGNvbXBhcmVzIG9yIGhhcyBhIHRpbWVmcmFtZSBuYW1lcyBpdHMgZGF5cyB1bmRlclxuICAgIC8vIHRoZSB0aXRsZSwgYW5kIGl0cyBub3RlcyBzaXQgYXQgdGhlIGZvb3Qgb2YgaXRzIGJveDsgYSBLUEkgY2FyZCBkcmF3c1xuICAgIC8vIGJvdGggaXRzZWxmLiBOZWl0aGVyIHRha2VzIHJvb20gZnJvbSBhIGNvbXBvbmVudCB3aXRob3V0IHRob3NlIGtleXMuXG4gICAgY29uc3QgbG9jYWxlID0gY29udGV4dC5mb3JtYXRDb250ZXh0LmxvY2FsZTtcbiAgICBjb25zdCBzdWJ0aXRsZSA9IHRoaXMuX3BkZlRleHQoZXhwb3J0V2luZG93c0xpbmUoaXRlbSwgY29udGV4dC50aW1lem9uZSwgbG9jYWxlKSk7XG4gICAgY29uc3Qgbm90ZXMgPSBjb21wb25lbnQudHlwZSA9PT0gJ2twaScgPyBbXSA6IGV4cG9ydE5vdGVMaW5lcyhpdGVtLCBjb250ZXh0LnRpbWV6b25lLCBsb2NhbGUpO1xuICAgIGNvbnN0IHRvcCA9IHkgKyBUSVRMRV9IICsgKHN1YnRpdGxlID8gU1VCVElUTEVfSCA6IDApO1xuICAgIGNvbnN0IHJvb20gPSBNYXRoLm1heCgyMCwgeSArIGggLSB0b3ApO1xuICAgIGNvbnN0IGtlcHQgPSBub3Rlcy5zbGljZSgwLCBNYXRoLm1heCgwLCBNYXRoLmZsb29yKChyb29tIC0gTUlOX0JPRFlfSCkgLyBOT1RFX0xJTkVfSCkpKTtcblxuICAgIGlmIChzdWJ0aXRsZSkge1xuICAgICAgdGhpcy5fc21hbGxMaW5lKGRvYywgc3VidGl0bGUsIHgsIHkgKyBUSVRMRV9ILCB3LCAnbGVmdCcsICdub3JtYWwnKTtcbiAgICB9XG5cbiAgICBjb25zdCBib2R5WSA9IHRvcDtcbiAgICBjb25zdCBib2R5SCA9IE1hdGgubWF4KDIwLCByb29tIC0ga2VwdC5sZW5ndGggKiBOT1RFX0xJTkVfSCk7XG5cbiAgICBrZXB0LmZvckVhY2goKGxpbmUsIGluZGV4KSA9PiB7XG4gICAgICB0aGlzLl9zbWFsbExpbmUoZG9jLCB0aGlzLl9wZGZUZXh0KGxpbmUpLCB4LCBib2R5WSArIGJvZHlIICsgaW5kZXggKiBOT1RFX0xJTkVfSCwgdywgJ2xlZnQnLCAnaXRhbGljJyk7XG4gICAgfSk7XG5cbiAgICBpZiAoIWl0ZW0uZGF0YSB8fCBpc0VtcHR5VGlsZShpdGVtKSkge1xuICAgICAgdGhpcy5fYm94Tm90ZShkb2MsIGVtcHR5TGFiZWwoaXRlbSksIHgsIGJvZHlZLCB3LCBib2R5SCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGNvbXBvbmVudC50eXBlKSB7XG4gICAgICBjYXNlICdjaGFydCc6IHtcbiAgICAgICAgY29uc3QgaW1hZ2UgPSBhd2FpdCByZW5kZXJDaGFydEltYWdlKGNvbXBvbmVudCwgaXRlbS5kYXRhLCB3LCBib2R5SCwgY29udGV4dC5mb3JtYXRDb250ZXh0KTtcbiAgICAgICAgZG9jLmFkZEltYWdlKGltYWdlLCAnUE5HJywgeCwgYm9keVksIHcsIGJvZHlIKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdsaXN0JzpcbiAgICAgIGNhc2UgJ2dyaWQnOlxuICAgICAgICB0aGlzLl9yZW5kZXJUYWJsZShjb250ZXh0LCBwYWdlLCBpdGVtLCB4LCBib2R5WSwgdywgYm9keUgsIG92ZXJmbG93cyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAna3BpJzpcbiAgICAgICAgdGhpcy5fcmVuZGVyS3BpKGNvbnRleHQsIGl0ZW0sIHgsIGJvZHlZLCB3LCBib2R5SCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vIE9uZSBsaW5lIG9mIHNtYWxsIGdyZXkgcHJpbnQsIGN1dCB0byB0aGUgd2lkdGggd2l0aCBhbiBlbGxpcHNpczogYVxuICAvLyBzdWJ0aXRsZSwgYSBub3RlIG9yIGEgbGluZSBvZiBhIEtQSSBjYXJkLiB5IGlzIHRoZSBsaW5lJ3MgdG9wOyB0aGUgbGluZSBpc1xuICAvLyBOT1RFX0xJTkVfSCB0YWxsLCB0aW1lcyB0aGUgc2NhbGUgYSBzaG9ydCBLUEkgdGlsZSBzaHJpbmtzIGl0cyBsaW5lcyBieS5cbiAgcHJpdmF0ZSBfc21hbGxMaW5lKFxuICAgIGRvYzogYW55LFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyLFxuICAgIGFsaWduOiAnbGVmdCcgfCAnY2VudGVyJyxcbiAgICBzdHlsZTogJ25vcm1hbCcgfCAnaXRhbGljJyxcbiAgICBzY2FsZSA9IDEsXG4gICk6IHZvaWQge1xuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCBzdHlsZSk7XG4gICAgZG9jLnNldEZvbnRTaXplKFNNQUxMX1NJWkUgKiBzY2FsZSk7XG4gICAgZG9jLnNldFRleHRDb2xvcihNVVRFRF9DT0xPUik7XG4gICAgZG9jLnRleHQodGhpcy5fZml0KGRvYywgdGV4dCwgdyksIGFsaWduID09PSAnY2VudGVyJyA/IHggKyB3IC8gMiA6IHgsIHkgKyBTTUFMTF9TSVpFICogc2NhbGUsIHsgYWxpZ24gfSk7XG4gIH1cblxuICAvLyBUaGUgdGV4dCwgZWxsaXBzaXplZCB0byB0aGUgd2lkdGggaW4gdGhlIGRvYydzIGN1cnJlbnQgZm9udC5cbiAgcHJpdmF0ZSBfZml0KGRvYzogYW55LCB0ZXh0OiBzdHJpbmcsIHdpZHRoOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmIChkb2MuZ2V0VGV4dFdpZHRoKHRleHQpIDw9IHdpZHRoKSB7XG4gICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG5cbiAgICBsZXQgY3V0ID0gdGV4dDtcbiAgICB3aGlsZSAoY3V0Lmxlbmd0aCA+IDEgJiYgZG9jLmdldFRleHRXaWR0aChgJHtjdXR94oCmYCkgPiB3aWR0aCkge1xuICAgICAgY3V0ID0gY3V0LnNsaWNlKDAsIC0xKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7Y3V0LnRyaW1FbmQoKX3igKZgO1xuICB9XG5cbiAgLy8gVGhlIGJvbGQgc3RyaXAgb3ZlciBhIGNvbXBvbmVudCwgYW5kIG92ZXIgZWFjaCBvZiBpdHMgY29udGludWF0aW9uIHBhZ2VzLlxuICAvLyBBIGRyaWxsZWQgdGl0bGUncyBjcnVtYnMgYXJlIHdyaXR0ZW4gaW4gdGhlIHJlcG9ydCdzIGxvY2FsZSwgc28gdGhlIHRpdGxlXG4gIC8vIGdvZXMgdGhyb3VnaCBfcGRmVGV4dCBsaWtlIGFueSBmb3JtYXR0ZWQgdGV4dCAodGhlIOKAuiBiZXR3ZWVuIGNydW1icyBpc1xuICAvLyBXaW5BbnNpIGFuZCBzdGF5cykuXG4gIHByaXZhdGUgX2NvbXBvbmVudFRpdGxlKGRvYzogYW55LCB0aXRsZTogc3RyaW5nLCB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyKTogdm9pZCB7XG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XG4gICAgZG9jLnNldEZvbnRTaXplKDkpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoJyMxZjI5MzMnKTtcbiAgICBkb2MudGV4dCh0aGlzLl9wZGZUZXh0KHRpdGxlKSwgeCwgeSArIDEwLCB7IG1heFdpZHRoOiB3IH0pO1xuICB9XG5cbiAgLy8gQW4gaXRhbGljIGdyZXkgbGluZSBjZW50ZXJlZCBpbiBhIGNvbXBvbmVudCdzIGJvZHksIGZvciBhIGJvZHkgdGhhdCBob2xkc1xuICAvLyBzb21ldGhpbmcgb3RoZXIgdGhhbiBpdHMgY29udGVudC4gQSBsaW5lIHdpZGVyIHRoYW4gdGhlIGJvZHkgd3JhcHMuXG4gIHByaXZhdGUgX2JveE5vdGUoZG9jOiBhbnksIHRleHQ6IHN0cmluZywgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyKTogdm9pZCB7XG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdpdGFsaWMnKTtcbiAgICBkb2Muc2V0Rm9udFNpemUoOSk7XG4gICAgZG9jLnNldFRleHRDb2xvcihNVVRFRF9DT0xPUik7XG4gICAgZG9jLnRleHQodGV4dCwgeCArIHcgLyAyLCB5ICsgaCAvIDIsIHsgYWxpZ246ICdjZW50ZXInLCBtYXhXaWR0aDogdyB9KTtcbiAgfVxuXG4gIC8vIEEgbGlzdCdzIG9uLXBhZ2UgdGFibGUuIEFsbCBvZiBpdHMgZmV0Y2hlZCByb3dzIGFyZSBsYWlkIG91dCBvbmNlIHRvIGxlYXJuXG4gIC8vIGhvdyBtYW55IHRoZSBib3ggaG9sZHM7IHdoZW4gdGhleSBkbyBub3QgYWxsIGZpdCwgdGhlIGJveCdzIGxhc3Qgcm93IHNheXNcbiAgLy8gdGhlIHRhYmxlIGNvbnRpbnVlcyBhbmQgdGhlIHJlc3QgZ28gdG8gb3ZlcmZsb3dzIGZvciBjb250aW51YXRpb24gcGFnZXMuXG4gIC8vIEEgYm94IHRvbyBzaG9ydCBmb3IgZXZlbiB0aGUgaGVhZCBjYXJyaWVzIHRoZSBub3RpY2UgYXMgYSBsaW5lIGluc3RlYWQuXG4gIC8vIEEgdGFibGUgd2hvc2UgaGVhZGluZyBhbmQgdG90YWxzIHJvdyBsZWF2ZSBhIGNvbnRpbnVhdGlvbiBwYWdlIG5vIHJvb20gZm9yXG4gIC8vIGEgcm93IHN0b3BzIGF0IGl0cyBib3gsIGl0cyBub3RpY2Ugc2F5aW5nIHNvLiBBIHRvdGFscyByb3cgY2xvc2VzIHRoZVxuICAvLyB0YWJsZSBvbmNlOiBpbiB0aGUgYm94IHdoZW4gZXZlcnkgcm93IGZpdHMgaXQsIGVsc2UgYWZ0ZXIgdGhlIGxhc3RcbiAgLy8gY29udGludWF0aW9uIHJvdy4gUG9pbnRzIHRocm91Z2hvdXQuXG4gIHByaXZhdGUgX3JlbmRlclRhYmxlKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgcGFnZTogUmVwb3J0UGFnZSxcbiAgICBpdGVtOiBDb2xsZWN0ZWRDb21wb25lbnQsXG4gICAgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyLFxuICAgIG92ZXJmbG93czogUGRmVGFibGVPdmVyZmxvd1tdLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCB7IGNvbXBvbmVudCwgc2VhcmNoLCBmaWx0ZXJlZCB9ID0gaXRlbTtcbiAgICBjb25zdCB7IGhlYWQsIGNlbGxzLCBudW1lcmljLCBmb290LCBvbWl0dGVkIH0gPSBpdGVtLnRhYmxlID8gdGhpcy5fZ3JpZENlbGxzKGl0ZW0pIDogdGhpcy5fbGlzdENlbGxzKGNvbnRleHQsIGl0ZW0pO1xuICAgIGNvbnN0IGJvdHRvbSA9IGNvbnRleHQucGFnZUggLSAoeSArIGgpO1xuICAgIGNvbnN0IHsgZml0LCBjb2x1bW5TdHlsZXMsIG1pbkhlaWdodCB9ID0gdGhpcy5fbWVhc3VyZShjb250ZXh0LCBoZWFkLCBjZWxscywgbnVtZXJpYywgZm9vdCwgeCwgeSwgdywgYm90dG9tKTtcblxuICAgIGlmIChmaXQgPT09IGNlbGxzLmxlbmd0aCAmJiBvbWl0dGVkID09PSAwKSB7XG4gICAgICB0aGlzLl9kcmF3VGFibGUoXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIHRoaXMuX3RhYmxlT3B0aW9ucyhjb250ZXh0LCBoZWFkLCBudW1lcmljLCBjZWxscywgeCwgeSwgdywgYm90dG9tLCBjb2x1bW5TdHlsZXMsIGZvb3QpLFxuICAgICAgKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGF1dG9UYWJsZSBuZWVkcyByb29tIGZvciBhIHJvdyB1bmRlciB0aGUgaGVhZGluZyBvbiBldmVyeSBwYWdlIGl0IGFkZHMsXG4gICAgLy8gb3IgaXQgYWRkcyBwYWdlcyB1bnRpbCB0aGUgYnJvd3NlcidzIHN0YWNrIHJ1bnMgb3V0LlxuICAgIGNvbnN0IGNvbnRpbnVlcyA9IG1pbkhlaWdodCA8IHRoaXMuX2NvbnRpbnVhdGlvblJvb20oY29udGV4dCwgcGFnZSk7XG4gICAgY29uc3Qgbm90aWNlID0gY29udGludWVzID8gQ09OVElOVUVEX05PVElDRSA6IE5PX1JPT01fTk9USUNFO1xuXG4gICAgLy8gVGhlIG5vdGljZSB0YWtlcyB0aGUgcGxhY2Ugb2YgdGhlIGxhc3Qgcm93IHRoYXQgZml0LCBzbyB0aGF0IHJvdyBtb3Zlc1xuICAgIC8vIHRvIHRoZSBjb250aW51YXRpb24uIG9taXR0ZWQgPiAwIG1lYW5zIGEgZnVsbCBQREZfTElTVF9ST1dTIGZldGNoLCB3aGljaFxuICAgIC8vIG5ldmVyIGZpdHMgb25lIGJveCwgc28gdGhlIENTViBub3RpY2UgYWx3YXlzIGxhbmRzIG9uIGEgY29udGludWF0aW9uXG4gICAgLy8gcGFnZS5cbiAgICBjb25zdCBrZXB0ID0gTWF0aC5tYXgoMCwgZml0IC0gMSk7XG5cbiAgICBpZiAoZml0ID49IDEpIHtcbiAgICAgIGNvbnN0IGJvZHkgPSBbLi4uY2VsbHMuc2xpY2UoMCwga2VwdCksIHRoaXMuX25vdGljZVJvdyhub3RpY2UsIG51bWVyaWMubGVuZ3RoLCB0cnVlKV07XG4gICAgICB0aGlzLl9kcmF3VGFibGUoY29udGV4dCwgdGhpcy5fdGFibGVPcHRpb25zKGNvbnRleHQsIGhlYWQsIG51bWVyaWMsIGJvZHksIHgsIHksIHcsIGJvdHRvbSwgY29sdW1uU3R5bGVzKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2JveE5vdGUoY29udGV4dC5kb2MsIG5vdGljZSwgeCwgeSwgdywgaCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRpbnVlcykge1xuICAgICAgb3ZlcmZsb3dzLnB1c2goe1xuICAgICAgICBjb21wb25lbnQsIHNlYXJjaCwgY3J1bWJzOiBpdGVtLmNydW1icywgZmlsdGVyZWQsIGhlYWQsIG51bWVyaWMsIHJvd3M6IGNlbGxzLnNsaWNlKGtlcHQpLCBvbWl0dGVkLCBmb290LCB4LCB3LFxuICAgICAgICBjb2x1bW5TdHlsZXMsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBBIGxpc3QncyBoZWFkaW5nLCByb3dzLCB0b3RhbHMgcm93IGFuZCB0aGUgcm93cyBwYXN0IGl0cyBmZXRjaC5cbiAgcHJpdmF0ZSBfbGlzdENlbGxzKGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsIGl0ZW06IENvbGxlY3RlZENvbXBvbmVudCk6IFBkZlRhYmxlUGFydHMge1xuICAgIGNvbnN0IHsgY29tcG9uZW50LCBoaWRkZW5Db2x1bW5zIH0gPSBpdGVtO1xuICAgIGNvbnN0IGRhdGEgPSBpdGVtLmRhdGEgYXMgQ29tcG9uZW50RGF0YTtcbiAgICBjb25zdCBoZWFkID0gW2xpc3RIZWFkaW5ncyhjb21wb25lbnQsIGRhdGEsIGNvbnRleHQuZm9ybWF0Q29udGV4dC5sb2NhbGUsIGhpZGRlbkNvbHVtbnMpLm1hcCgoaGVhZGluZykgPT4gdGhpcy5fcGRmVGV4dChoZWFkaW5nKSldO1xuICAgIGNvbnN0IHsgY2VsbHMsIG51bWVyaWMsIGZvb3QgfSA9IHRoaXMuX3RhYmxlQ2VsbHMoY29udGV4dCwgY29tcG9uZW50LCBkYXRhLCBoaWRkZW5Db2x1bW5zKTtcblxuICAgIHJldHVybiB7IGhlYWQsIGNlbGxzLCBudW1lcmljLCBmb290LCBvbWl0dGVkOiBNYXRoLm1heCgwLCAoZGF0YS5wYWdpbmc/LnRvdGFsID8/IGNlbGxzLmxlbmd0aCkgLSBjZWxscy5sZW5ndGgpIH07XG4gIH1cblxuICAvLyBBIHRhYmxlIHRpbGUncyBoZWFkaW5nIHJvd3MgKHNwYW5uZWQgYXMgdGhlIHNjcmVlbidzIGhlYWRlciksIGl0cyBsaW5lc1xuICAvLyAoZ3JvdXBzIGFuZCB0b3RhbHMgYm9sZCwgYSBncm91cCdzIGxhYmVsIHN0ZXBwZWQgaW4gYnkgaXRzIGRlcHRoKSBhbmQgaXRzXG4gIC8vIHRvdGFsIHJvdywgYXMgZ3JpZEV4cG9ydFRhYmxlKCkgbGF5cyB0aGVtIG91dCwgYW5kIHRoZSBsaW5lcyBwYXN0IGl0cyBjYXAuXG4gIHByaXZhdGUgX2dyaWRDZWxscyhpdGVtOiBDb2xsZWN0ZWRDb21wb25lbnQpOiBQZGZUYWJsZVBhcnRzIHtcbiAgICBjb25zdCB0YWJsZSA9IGdyaWRFeHBvcnRUYWJsZShpdGVtLnRhYmxlISk7XG4gICAgY29uc3QgY2VsbCA9IChleHBvcnRlZDogR3JpZEV4cG9ydENlbGwpOiBQZGZUYWJsZUNlbGwgPT4gKHtcbiAgICAgIGNvbnRlbnQ6IHRoaXMuX3BkZlRleHQoZXhwb3J0ZWQudGV4dCksXG4gICAgICBjb2xTcGFuOiBleHBvcnRlZC5jb2xTcGFuLFxuICAgICAgcm93U3BhbjogZXhwb3J0ZWQucm93U3BhbixcbiAgICAgIHN0eWxlczoge1xuICAgICAgICAuLi4oZXhwb3J0ZWQuYm9sZCA/IHsgZm9udFN0eWxlOiAnYm9sZCcgfSA6IHt9KSxcbiAgICAgICAgLi4uKGV4cG9ydGVkLnNoYWRlID8geyBmaWxsQ29sb3I6IGV4cG9ydGVkLnNoYWRlLmJhY2tncm91bmQsIHRleHRDb2xvcjogZXhwb3J0ZWQuc2hhZGUuZm9yZWdyb3VuZCB9IDoge30pLFxuICAgICAgICAuLi4oZXhwb3J0ZWQuaW5kZW50XG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICBjZWxsUGFkZGluZzoge1xuICAgICAgICAgICAgICB0b3A6IFRBQkxFX0NFTExfUEFERElORyxcbiAgICAgICAgICAgICAgcmlnaHQ6IFRBQkxFX0NFTExfUEFERElORyxcbiAgICAgICAgICAgICAgYm90dG9tOiBUQUJMRV9DRUxMX1BBRERJTkcsXG4gICAgICAgICAgICAgIGxlZnQ6IFRBQkxFX0NFTExfUEFERElORyArIGV4cG9ydGVkLmluZGVudCAqIEdSSURfSU5ERU5ULFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGhlYWQ6IHRhYmxlLmhlYWQubWFwKChyb3cpID0+IHJvdy5tYXAoY2VsbCkpLFxuICAgICAgY2VsbHM6IHRhYmxlLmJvZHkubWFwKChyb3cpID0+IHJvdy5tYXAoY2VsbCkpLFxuICAgICAgbnVtZXJpYzogdGFibGUubnVtZXJpYyxcbiAgICAgIGZvb3Q6IHRhYmxlLmZvb3QgPyB0YWJsZS5mb290Lm1hcCgoZXhwb3J0ZWQpID0+IHRoaXMuX3BkZlRleHQoZXhwb3J0ZWQudGV4dCkpIDogbnVsbCxcbiAgICAgIG9taXR0ZWQ6IHRhYmxlLm1vcmVSb3dzLFxuICAgIH07XG4gIH1cblxuICAvLyBFYWNoIGZldGNoZWQgcm93IGFzIHRoZSBzdHJpbmdzIGl0cyB0YWJsZSBjZWxscyBwcmludCwgaW4gdGhlIHJlcG9ydCdzXG4gIC8vIHpvbmUsIGxvY2FsZSBhbmQgY3VycmVuY3ksIHdoaWNoIGNvbHVtbnMgaG9sZCBmb3JtYXR0ZWQgbnVtYmVycywgYW5kIHRoZVxuICAvLyB0b3RhbHMgcm93IChudWxsIHdpdGhvdXQgb25lKS4gVGhlIGNvbHVtbnMgdGhlIHZpZXdlciBoaWQgYXJlIGxlZnQgb3V0LlxuICBwcml2YXRlIF90YWJsZUNlbGxzKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsXG4gICAgZGF0YTogQ29tcG9uZW50RGF0YSxcbiAgICBoaWRkZW5Db2x1bW5zOiByZWFkb25seSBzdHJpbmdbXSxcbiAgKTogeyBjZWxsczogc3RyaW5nW11bXTsgbnVtZXJpYzogYm9vbGVhbltdOyBmb290OiBzdHJpbmdbXSB8IG51bGwgfSB7XG4gICAgY29uc3QgY29sdW1ucyA9IGxpc3RDb2x1bW5zKGNvbXBvbmVudCwgZGF0YSwgY29udGV4dC5mb3JtYXRDb250ZXh0LmxvY2FsZSwgaGlkZGVuQ29sdW1ucyk7XG4gICAgY29uc3QgY2VsbHMgPSBkYXRhLnJvd3MubWFwKChyb3cpID0+IGNvbHVtbnMubWFwKChjb2x1bW4pID0+IHRoaXMuX3BkZlRleHQoXG4gICAgICBleHBvcnRDZWxsKHJvd1tjb2x1bW4uY29sdW1uXSwgY29sdW1uLCBjb250ZXh0LnRpbWV6b25lLCBjb250ZXh0LmZvcm1hdENvbnRleHQsIHJvdywgZGF0YS52YWx1ZUxhYmVscyksXG4gICAgKSkpO1xuICAgIGNvbnN0IGZvb3QgPSBsaXN0VG90YWxzUm93KGRhdGEsIGNvbHVtbnMsIGNvbnRleHQudGltZXpvbmUsIGNvbnRleHQuZm9ybWF0Q29udGV4dCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY2VsbHMsXG4gICAgICBudW1lcmljOiBjb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubnVtZXJpYyksXG4gICAgICBmb290OiBmb290ID8gZm9vdC5tYXAoKGNlbGwpID0+IHRoaXMuX3BkZlRleHQoY2VsbCkpIDogbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgLy8gVGhlIGF1dG9UYWJsZSBvcHRpb25zIGV2ZXJ5IGxpc3QgdGFibGUgc2hhcmVzOiB0aGUgZHJ5IHJ1biwgdGhlIG9uLXBhZ2VcbiAgLy8gZHJhdyBhbmQgdGhlIGNvbnRpbnVhdGlvbiBwYWdlcywgc28gdGhlIHRocmVlIGxheSBhIHRhYmxlIG91dCBhbGlrZS4gVGhlXG4gIC8vIGZvbnQgaXMgbmFtZWQgcmF0aGVyIHRoYW4gaW5oZXJpdGVkLCBzaW5jZSB0aGUgZG9jIGNhcnJpZXMgd2hhdGV2ZXIgdGhlXG4gIC8vIGxhc3QgdGV4dCBkcmF3biBsZWZ0IHNldC4gYm90dG9tIGlzIHRoZSBtYXJnaW4gdW5kZXIgdGhlIHRhYmxlLCBwb2ludHMuXG4gIC8vXG4gIC8vIEEgY29sdW1uIG9mIGZvcm1hdHRlZCBudW1iZXJzIGlzIHJpZ2h0LWFsaWduZWQsIGl0cyBoZWFkaW5nIGFuZCB0b3RhbFxuICAvLyB0b286IHRoZSBib2R5IHRocm91Z2ggY29sdW1uU3R5bGVzLCB3aGljaCBhdXRvVGFibGUgYXBwbGllcyB0byBib2R5IGNlbGxzXG4gIC8vIG9ubHksIGFuZCB0aGUgaGVhZGluZyBhbmQgdG90YWwgdGhyb3VnaCB0aGUgZGlkUGFyc2VDZWxsIGhvb2ssIG9uIGV2ZXJ5XG4gIC8vIHBhZ2UgdGhlIGhlYWRpbmcgcmVwZWF0cy4gQSB0b3RhbHMgcm93IChmb290KSBwcmludHMgb25jZSwgdW5kZXIgdGhlXG4gIC8vIHRhYmxlJ3MgbGFzdCByb3csIGJvbGQgb24gdGhlIGJvcmRlciBncmF5LlxuICBwcml2YXRlIF90YWJsZU9wdGlvbnMoXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBoZWFkOiBQZGZUYWJsZUNlbGxbXVtdLFxuICAgIG51bWVyaWM6IGJvb2xlYW5bXSxcbiAgICBib2R5OiBQZGZUYWJsZUNlbGxbXVtdLFxuICAgIHg6IG51bWJlciwgc3RhcnRZOiBudW1iZXIsIHc6IG51bWJlciwgYm90dG9tOiBudW1iZXIsXG4gICAgY29sdW1uU3R5bGVzPzogUGRmQ29sdW1uU3R5bGVzLFxuICAgIGZvb3Q/OiBzdHJpbmdbXSB8IG51bGwsXG4gICk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4ge1xuICAgICAgdGhlbWU6ICdncmlkJyxcbiAgICAgIGhlYWQsXG4gICAgICBib2R5LFxuICAgICAgc3RhcnRZLFxuICAgICAgbWFyZ2luOiB7IGxlZnQ6IHgsIHJpZ2h0OiBjb250ZXh0LnBhZ2VXIC0geCAtIHcsIGJvdHRvbSB9LFxuICAgICAgdGFibGVXaWR0aDogdyxcbiAgICAgIHJvd1BhZ2VCcmVhazogJ2F2b2lkJyxcbiAgICAgIHN0eWxlczoge1xuICAgICAgICBmb250OiAnaGVsdmV0aWNhJyxcbiAgICAgICAgZm9udFN0eWxlOiAnbm9ybWFsJyxcbiAgICAgICAgZm9udFNpemU6IFRBQkxFX0ZPTlRfU0laRSxcbiAgICAgICAgY2VsbFBhZGRpbmc6IFRBQkxFX0NFTExfUEFERElORyxcbiAgICAgICAgdGV4dENvbG9yOiAnIzFmMjkzMycsXG4gICAgICB9LFxuICAgICAgaGVhZFN0eWxlczogeyBmaWxsQ29sb3I6ICcjNGU3OWE3JywgdGV4dENvbG9yOiAnI2ZmZmZmZicsIGZvbnRTdHlsZTogJ2JvbGQnIH0sXG4gICAgICBhbHRlcm5hdGVSb3dTdHlsZXM6IHsgZmlsbENvbG9yOiAnI2Y1ZjdmYScgfSxcbiAgICAgIC4uLihjb2x1bW5TdHlsZXMgPyB7IGNvbHVtblN0eWxlcyB9IDoge30pLFxuICAgICAgLi4uKGZvb3RcbiAgICAgICAgPyB7XG4gICAgICAgICAgZm9vdDogW2Zvb3RdLFxuICAgICAgICAgIHNob3dGb290OiAnbGFzdFBhZ2UnLFxuICAgICAgICAgIGZvb3RTdHlsZXM6IHsgZmlsbENvbG9yOiAnI2U0ZTdlYicsIHRleHRDb2xvcjogJyMxZjI5MzMnLCBmb250U3R5bGU6ICdib2xkJyB9LFxuICAgICAgICB9XG4gICAgICAgIDoge30pLFxuICAgICAgZGlkUGFyc2VDZWxsOiAoaG9vazogYW55KSA9PiB7XG4gICAgICAgIGlmICgoaG9vay5zZWN0aW9uID09PSAnaGVhZCcgfHwgaG9vay5zZWN0aW9uID09PSAnZm9vdCcpICYmIG51bWVyaWNbaG9vay5jb2x1bW4uaW5kZXhdKSB7XG4gICAgICAgICAgaG9vay5jZWxsLnN0eWxlcy5oYWxpZ24gPSAncmlnaHQnO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvLyBBIG5vdGljZSBhcyBhIHRhYmxlIHJvdzogb25lIGl0YWxpYyBncmV5IGNlbGwgc3Bhbm5pbmcgZXZlcnkgY29sdW1uLiBBXG4gIC8vIHNpbmdsZS1saW5lIG5vdGljZSBpcyBlbGxpcHNpemVkIGF0IHRoZSBib3gncyB3aWR0aCBhbmQga2VlcHMgdGhlIGRhdGFcbiAgLy8gY2VsbHMnIGZvbnQgc2l6ZSBhbmQgcGFkZGluZywgc28gaXQgaXMgbmV2ZXIgdGFsbGVyIHRoYW4gdGhlIGRhdGEgcm93XG4gIC8vIHdob3NlIHBsYWNlIGl0IHRha2VzLlxuICBwcml2YXRlIF9ub3RpY2VSb3codGV4dDogc3RyaW5nLCBzcGFuOiBudW1iZXIsIHNpbmdsZUxpbmU6IGJvb2xlYW4pOiBQZGZUYWJsZUNlbGxbXSB7XG4gICAgcmV0dXJuIFt7XG4gICAgICBjb250ZW50OiB0ZXh0LFxuICAgICAgY29sU3Bhbjogc3BhbixcbiAgICAgIC8vIExlZnQtYWxpZ25lZCB3aGF0ZXZlciB0aGUgZmlyc3QgY29sdW1uIGlzOiBhIHNwYW5uZWQgY2VsbCBvdGhlcndpc2VcbiAgICAgIC8vIHRha2VzIGNvbHVtblN0eWxlc1swXSwgcmlnaHQtYWxpZ25lZCB3aGVuIHRoYXQgY29sdW1uIGlzIG51bWVyaWMuXG4gICAgICBzdHlsZXM6IHtcbiAgICAgICAgZm9udFN0eWxlOiAnaXRhbGljJyxcbiAgICAgICAgdGV4dENvbG9yOiBNVVRFRF9DT0xPUixcbiAgICAgICAgaGFsaWduOiAnbGVmdCcsXG4gICAgICAgIC4uLihzaW5nbGVMaW5lID8geyBvdmVyZmxvdzogJ2VsbGlwc2l6ZScgfSA6IHt9KSxcbiAgICAgIH0sXG4gICAgfV07XG4gIH1cblxuICAvLyBMYXlzIGV2ZXJ5IGZldGNoZWQgcm93IG91dCBvbmNlIG9uIGEgc2NyYXRjaCBkb2N1bWVudCBvZiB0aGUgc2FtZSBwYWdlXG4gIC8vIHNpemUsIHdpdGggdGhlIG9wdGlvbnMgdGhlIHJlYWwgZHJhdyB1c2VzLCBhbmQgcmVhZHMgYmFjayBob3cgbWFueSBib2R5XG4gIC8vIHJvd3MgdGhlIGJveCBob2xkcyAoZml0KSwgdGhlIGNvbHVtbiB3aWR0aHMgYXV0b1RhYmxlIGNob3NlLCB3aXRoIGVhY2hcbiAgLy8gbnVtZXJpYyBjb2x1bW4ncyByaWdodCBhbGlnbm1lbnQgbWVyZ2VkIGluLCBzbyB0aGUgb24tcGFnZSB0YWJsZSBhbmQgaXRzXG4gIC8vIGNvbnRpbnVhdGlvbiBwYWdlcyBjYXJyeSBib3RoLCBhbmQgdGhlIGxlYXN0IHJvb20gYSBwYWdlIG11c3QgZ2l2ZSB0aGVcbiAgLy8gdGFibGUgKG1pbkhlaWdodCkuIFRoZSB0b3RhbHMgcm93IGlzIGxhaWQgb3V0IHRvbywgc28gdGhlIHdpZHRocyBob2xkIGl0LFxuICAvLyBhbmQgYSB0YWJsZSB3aG9zZSByb3dzIGZpdCB0aGUgYm94IGJ1dCB3aG9zZSB0b3RhbHMgcm93IGRvZXMgbm90IG1vdmVzXG4gIC8vIGl0cyBsYXN0IHJvdyBvbi4gZml0IDAgbWVhbnMgbm90IGV2ZW4gb25lIGJvZHkgcm93IGZpdHMgdW5kZXIgdGhlIGhlYWQuXG4gIC8vIFRoZSB0YWJsZSBpcyBsYWlkIG91dCwgbmV2ZXIgZHJhd246IGRyYXduLCBhdXRvVGFibGUgcGFnZXMgaXQsIGFuZCBhIHRhYmxlXG4gIC8vIHdpdGggbm8gcm9vbSBmb3IgYSByb3cgb24gYSBwYWdlIHBhZ2VzIHdpdGhvdXQgZW5kLlxuICBwcml2YXRlIF9tZWFzdXJlKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgaGVhZDogUGRmVGFibGVDZWxsW11bXSxcbiAgICBjZWxsczogUGRmVGFibGVDZWxsW11bXSxcbiAgICBudW1lcmljOiBib29sZWFuW10sXG4gICAgZm9vdDogc3RyaW5nW10gfCBudWxsLFxuICAgIHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsIGJvdHRvbTogbnVtYmVyLFxuICApOiBQZGZUYWJsZU1lYXN1cmUge1xuICAgIGNvbnN0IHNjcmF0Y2ggPSB0aGlzLl9zY3JhdGNoRG9jdW1lbnQoY29udGV4dCk7XG4gICAgY29uc3QgdGFibGUgPSBjb250ZXh0LmNyZWF0ZVRhYmxlKFxuICAgICAgc2NyYXRjaCxcbiAgICAgIHRoaXMuX3RhYmxlT3B0aW9ucyhjb250ZXh0LCBoZWFkLCBudW1lcmljLCBjZWxscywgeCwgeSwgdywgYm90dG9tLCB1bmRlZmluZWQsIGZvb3QpLFxuICAgICk7XG4gICAgY29uc3QgY29sdW1uczogeyB3aWR0aDogbnVtYmVyIH1bXSA9IHRhYmxlLmNvbHVtbnM7XG4gICAgY29uc3QgY29sdW1uU3R5bGVzOiBQZGZDb2x1bW5TdHlsZXMgPSB7fTtcbiAgICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbiwgaW5kZXgpID0+IHtcbiAgICAgIGNvbHVtblN0eWxlc1tpbmRleF0gPSBudW1lcmljW2luZGV4XVxuICAgICAgICA/IHsgY2VsbFdpZHRoOiBjb2x1bW4ud2lkdGgsIGhhbGlnbjogJ3JpZ2h0JyB9XG4gICAgICAgIDogeyBjZWxsV2lkdGg6IGNvbHVtbi53aWR0aCB9O1xuICAgIH0pO1xuXG4gICAgY29uc3QgaGVhZEhlaWdodCA9IHRhYmxlLmdldEhlYWRIZWlnaHQodGFibGUuY29sdW1ucyk7XG4gICAgY29uc3QgZm9vdEhlaWdodCA9IHRhYmxlLmdldEZvb3RIZWlnaHQodGFibGUuY29sdW1ucyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZml0OiB0aGlzLl9maXR0aW5nUm93cyh0YWJsZSwgeSArIGhlYWRIZWlnaHQsIGNvbnRleHQucGFnZUggLSBib3R0b20sIGZvb3RIZWlnaHQpLFxuICAgICAgY29sdW1uU3R5bGVzLFxuICAgICAgLy8gT25lIGxpbmUgb2YgYSByb3c6IHRoZSBsaW5lIGF1dG9UYWJsZSBtdXN0IHBsYWNlIG9uIGEgcGFnZSBiZWZvcmUgaXRcbiAgICAgIC8vIG1vdmVzIG9uLCBhdCB0aGUgdGFibGUncyBmb250IHNpemUgYW5kIHBhZGRpbmcuXG4gICAgICBtaW5IZWlnaHQ6IGhlYWRIZWlnaHQgKyBmb290SGVpZ2h0ICsgVEFCTEVfRk9OVF9TSVpFICogc2NyYXRjaC5nZXRMaW5lSGVpZ2h0RmFjdG9yKCkgKyAyICogVEFCTEVfQ0VMTF9QQURESU5HLFxuICAgIH07XG4gIH1cblxuICAvLyBIb3cgbWFueSBvZiBhIGxhaWQtb3V0IHRhYmxlJ3MgYm9keSByb3dzIGZpdCB3aG9sZSBiZXR3ZWVuIHRvcCBhbmRcbiAgLy8gYm90dG9tLCBhcyBhdXRvVGFibGUgZGVjaWRlcyBpdDogYSByb3cgZml0cyB3aGVuIGl0cyB0YWxsZXN0IGNlbGwgKG9uZSB0aGF0XG4gIC8vIHNwYW5zIHJvd3MgY291bnRzIGFsbCBvZiB0aGVtKSBlbmRzIGJ5IGJvdHRvbSwgdGhlIGxhc3Qgcm93J3MgYnkgdGhlIHRvcFxuICAvLyBvZiB0aGUgdG90YWxzIHJvdyAoZm9vdEhlaWdodCkgdW5kZXIgaXQsIGFuZCB0aGUgbmV4dCByb3cgc3RhcnRzIHdoZXJlIGl0XG4gIC8vIGVuZHMuXG4gIHByaXZhdGUgX2ZpdHRpbmdSb3dzKHRhYmxlOiBhbnksIHRvcDogbnVtYmVyLCBib3R0b206IG51bWJlciwgZm9vdEhlaWdodDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBsZXQgY3Vyc29yID0gdG9wO1xuICAgIGxldCBmaXQgPSAwO1xuXG4gICAgZm9yIChjb25zdCBbaW5kZXgsIHJvd10gb2YgdGFibGUuYm9keS5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IGxpbWl0ID0gaW5kZXggPT09IHRhYmxlLmJvZHkubGVuZ3RoIC0gMSA/IGJvdHRvbSAtIGZvb3RIZWlnaHQgOiBib3R0b207XG4gICAgICBpZiAoY3Vyc29yICsgcm93LmdldE1heENlbGxIZWlnaHQodGFibGUuY29sdW1ucykgPiBsaW1pdCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY3Vyc29yICs9IHJvdy5oZWlnaHQ7XG4gICAgICBmaXQgKz0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gZml0O1xuICB9XG5cbiAgLy8gQSBibGFuayBkb2N1bWVudCBvZiB0aGUgZXhwb3J0J3MgcGFnZSBzaXplLCBmb3IgbGF5aW5nIGEgdGFibGUgb3V0IHRvIHNlZVxuICAvLyB3aGF0IGZpdHMgYmVmb3JlIHRoZSByZWFsIG9uZSBpcyBkcmF3biBvbi5cbiAgcHJpdmF0ZSBfc2NyYXRjaERvY3VtZW50KGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQpOiBhbnkge1xuICAgIHJldHVybiBuZXcgY29udGV4dC5qc1BERih7XG4gICAgICB1bml0OiAncHQnLFxuICAgICAgZm9ybWF0OiBbY29udGV4dC5wYWdlVywgY29udGV4dC5wYWdlSF0sXG4gICAgICBvcmllbnRhdGlvbjogY29udGV4dC5vcmllbnRhdGlvbixcbiAgICB9KTtcbiAgfVxuXG4gIC8vIERyYXdzIGFuIG9uLXBhZ2UgdGFibGUgKGEgbGlzdCdzLCBvciBhIHRleHQgYmxvY2sncykgb24gaXRzIHBhZ2UgYWxvbmUuXG4gIC8vIFRoYXQgaXMgYWxsIGl0IHNob3VsZCBuZWVkOiB0aGUgbWVhc3VyZWQgZml0LCB0aGUgaWRlbnRpY2FsIGNvbHVtbiB3aWR0aHNcbiAgLy8gYW5kIGEgc2luZ2xlLWxpbmUgbm90aWNlIGtlZXAgdGhlIHRhYmxlIGluc2lkZSBpdHMgYm94LiBTaG91bGQgYXV0b1RhYmxlXG4gIC8vIHN0YXJ0IGFub3RoZXIgcGFnZSBhbnl3YXksIHRoZSB0YWJsZSBzdG9wcyB0aGVyZSBhbmQgdGhlIHBhZ2UgZ29lcywgc28gYVxuICAvLyBzdHJheSBwYWdlIGNhbiBuZXZlciBjYXRjaCB0aGUgcmVwb3J0IHBhZ2UncyByZW1haW5pbmcgY29tcG9uZW50cywgbm9yIGFcbiAgLy8gdGFibGUgd2l0aCBubyByb29tIGZvciBhIHJvdyBhZGQgcGFnZXMgd2l0aG91dCBlbmQuIFJldHVybnMgd2hldGhlciB0aGVcbiAgLy8gdGFibGUgd2FzIGRyYXduIHdob2xlLlxuICBwcml2YXRlIF9kcmF3VGFibGUoY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCwgb3B0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBib29sZWFuIHtcbiAgICBjb25zdCB7IGRvYyB9ID0gY29udGV4dDtcbiAgICBjb25zdCBwYWdlID0gZG9jLmdldEN1cnJlbnRQYWdlSW5mbygpLnBhZ2VOdW1iZXI7XG4gICAgY29uc3QgcGFnZXMgPSBkb2MuZ2V0TnVtYmVyT2ZQYWdlcygpO1xuICAgIGxldCB3aG9sZSA9IHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgY29udGV4dC5hdXRvVGFibGUoZG9jLCB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIC8vIEZpcmVzIGFzIHRoZSB0YWJsZSBzdGFydHMgaXRzIG93biBwYWdlLCBhbmQgYWdhaW4gb24gZWFjaCBwYWdlIGl0XG4gICAgICAgIC8vIG1vdmVzIHRvIChhbiBleGlzdGluZyBwYWdlLCBzdWNoIGFzIGEgY29udGludWF0aW9uIHBhZ2UgdW5kZXIgYVxuICAgICAgICAvLyBoZWFkZXIsIGFzIHdlbGwgYXMgYSBuZXcgb25lKS5cbiAgICAgICAgd2lsbERyYXdQYWdlOiAoKSA9PiB7XG4gICAgICAgICAgaWYgKGRvYy5nZXRDdXJyZW50UGFnZUluZm8oKS5wYWdlTnVtYmVyICE9PSBwYWdlKSB7XG4gICAgICAgICAgICB0aHJvdyBTVFJBWV9QQUdFO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgIT09IFNUUkFZX1BBR0UpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIHdob2xlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgd2hpbGUgKGRvYy5nZXROdW1iZXJPZlBhZ2VzKCkgPiBwYWdlcykge1xuICAgICAgZG9jLmRlbGV0ZVBhZ2UoZG9jLmdldE51bWJlck9mUGFnZXMoKSk7XG4gICAgfVxuXG4gICAgZG9jLnNldFBhZ2UocGFnZSk7XG5cbiAgICByZXR1cm4gd2hvbGU7XG4gIH1cblxuICAvLyBUaGUgcm93cyBvZiBvbmUgbGlzdCB0aGF0IGRpZCBub3QgZml0IGl0cyBib3gsIG9uIHBhZ2VzIGFwcGVuZGVkIGFmdGVyXG4gIC8vIHRoZSByZXBvcnQgcGFnZSwgZWFjaCB3aXRoIHRoZSBwYWdlJ3MgaGVhZGVyIGFuZCBmb290ZXIsIHRoZSB0YWJsZSdzXG4gIC8vIHRpdGxlIGFuZCBpdHMgaGVhZCBhZ2FpbiwgdGhlIHRpdGxlJ3MgdG9rZW5zIGZpbGxlZCB3aXRoIHRoZSBwaHlzaWNhbFxuICAvLyBwYWdlIGl0IGlzIGRyYXduIG9uLiBUaGUgdGFibGUgc2l0cyBDT05USU5VQVRJT05fR0FQIGluc2lkZSB0aGUgYmFuZHMuXG4gIC8vIFJldHVybnMgdGhlIHBoeXNpY2FsIHBhZ2UgY291bnRlciBhZnRlciB0aGVzZSBwYWdlcy5cbiAgcHJpdmF0ZSBhc3luYyBfcmVuZGVyQ29udGludWF0aW9uKFxuICAgIGNvbnRleHQ6IFBkZkV4cG9ydENvbnRleHQsXG4gICAgcGFnZTogUmVwb3J0UGFnZSxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIHBhZ2VOdW1iZXI6IG51bWJlcixcbiAgICBvdmVyZmxvdzogUGRmVGFibGVPdmVyZmxvdyxcbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB7IGRvYyB9ID0gY29udGV4dDtcbiAgICBjb25zdCB7IHRvcCwgYm90dG9tIH0gPSB0aGlzLl9jb250aW51YXRpb25NYXJnaW5zKGNvbnRleHQsIHBhZ2UpO1xuICAgIGNvbnN0IHsgeCwgdyB9ID0gb3ZlcmZsb3c7XG4gICAgY29uc3QgYm9keTogUGRmVGFibGVDZWxsW11bXSA9IG92ZXJmbG93Lm9taXR0ZWQgPiAwXG4gICAgICA/IFsuLi5vdmVyZmxvdy5yb3dzLCB0aGlzLl9ub3RpY2VSb3cobW9yZVJvd3NOb3RpY2Uob3ZlcmZsb3cub21pdHRlZCksIG92ZXJmbG93Lm51bWVyaWMubGVuZ3RoLCBmYWxzZSldXG4gICAgICA6IG92ZXJmbG93LnJvd3M7XG4gICAgLy8gVGhlIGRvY3VtZW50J3MgcGFnZXMgdGhlIHRhYmxlIGRyYXdzIG9uLCBpbiBvcmRlci5cbiAgICBjb25zdCBwYWdlczogbnVtYmVyW10gPSBbXTtcblxuICAgIGRvYy5hZGRQYWdlKFtjb250ZXh0LnBhZ2VXLCBjb250ZXh0LnBhZ2VIXSwgY29udGV4dC5vcmllbnRhdGlvbik7XG4gICAgY29udGV4dC5hdXRvVGFibGUoZG9jLCB7XG4gICAgICAuLi50aGlzLl90YWJsZU9wdGlvbnMoXG4gICAgICAgIGNvbnRleHQsIG92ZXJmbG93LmhlYWQsIG92ZXJmbG93Lm51bWVyaWMsIGJvZHksIHgsIHRvcCArIFRJVExFX0gsIHcsIGJvdHRvbSwgb3ZlcmZsb3cuY29sdW1uU3R5bGVzLFxuICAgICAgICBvdmVyZmxvdy5mb290LFxuICAgICAgKSxcbiAgICAgIG1hcmdpbjogeyB0b3A6IHRvcCArIFRJVExFX0gsIGJvdHRvbSwgbGVmdDogeCwgcmlnaHQ6IGNvbnRleHQucGFnZVcgLSB4IC0gdyB9LFxuICAgICAgc2hvd0hlYWQ6ICdldmVyeVBhZ2UnLFxuICAgICAgLy8gRmlyZXMgb24gZXZlcnkgcGFnZSB0aGUgdGFibGUgZHJhd3Mgb24sIHRoZSBmaXJzdCBpbmNsdWRlZC5cbiAgICAgIHdpbGxEcmF3UGFnZTogKCkgPT4ge1xuICAgICAgICBwYWdlcy5wdXNoKGRvYy5nZXRDdXJyZW50UGFnZUluZm8oKS5wYWdlTnVtYmVyKTtcbiAgICAgICAgY29uc3QgdG9rZW5zID0gdGhpcy5fdG9rZW5zKGNvbnRleHQsIHBhZ2UsIGluZGV4LCBwYWdlTnVtYmVyICsgcGFnZXMubGVuZ3RoKTtcbiAgICAgICAgdGhpcy5fY29tcG9uZW50VGl0bGUoXG4gICAgICAgICAgZG9jLFxuICAgICAgICAgIHRoaXMuX2NvbnRpbnVlZFRpdGxlKG92ZXJmbG93LmNvbXBvbmVudCwgdG9rZW5zLCBvdmVyZmxvdy5zZWFyY2gsIG92ZXJmbG93LmNydW1icywgb3ZlcmZsb3cuZmlsdGVyZWQpLFxuICAgICAgICAgIHgsXG4gICAgICAgICAgdG9wLFxuICAgICAgICAgIHcsXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgYXdhaXQgdGhpcy5fcmVuZGVyQ29udGludWF0aW9uTWFzdGVycyhjb250ZXh0LCBwYWdlLCBpbmRleCwgcGFnZU51bWJlciwgcGFnZXMpO1xuXG4gICAgcmV0dXJuIHBhZ2VOdW1iZXIgKyBwYWdlcy5sZW5ndGg7XG4gIH1cblxuICAvLyBUaGUgaGVhZGVyIGFuZCBmb290ZXIgb2YgZWFjaCBjb250aW51YXRpb24gcGFnZSwgbnVtYmVyZWQgb24gZnJvbVxuICAvLyBwYWdlTnVtYmVyLiBUaGV5IGdvIG9uIG9uY2UgdGhlIHRhYmxlIGlzIGRyYXduLCBzaW5jZSBhIHRleHQgYmxvY2sgd2l0aCBhXG4gIC8vIHRhYmxlIGlzIG1lYXN1cmVkIGJlZm9yZSBpdCBpcyBkcmF3biwgd2hpY2ggYXV0b1RhYmxlJ3MgcGFnZSBob29rIGNhbm5vdFxuICAvLyB3YWl0IGZvcjsgdGhleSBzaXQgaW4gdGhlIGJhbmRzLCBjbGVhciBvZiB0aGUgdGFibGUuXG4gIHByaXZhdGUgYXN5bmMgX3JlbmRlckNvbnRpbnVhdGlvbk1hc3RlcnMoXG4gICAgY29udGV4dDogUGRmRXhwb3J0Q29udGV4dCxcbiAgICBwYWdlOiBSZXBvcnRQYWdlLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgcGFnZU51bWJlcjogbnVtYmVyLFxuICAgIHBhZ2VzOiBudW1iZXJbXSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBkb2MgfSA9IGNvbnRleHQ7XG5cbiAgICBmb3IgKGNvbnN0IFtvZmZzZXQsIGRvY3VtZW50UGFnZV0gb2YgcGFnZXMuZW50cmllcygpKSB7XG4gICAgICBkb2Muc2V0UGFnZShkb2N1bWVudFBhZ2UpO1xuICAgICAgYXdhaXQgdGhpcy5fcmVuZGVyTWFzdGVyKGNvbnRleHQsIHBhZ2UsIHRoaXMuX3Rva2Vucyhjb250ZXh0LCBwYWdlLCBpbmRleCwgcGFnZU51bWJlciArIG9mZnNldCArIDEpKTtcbiAgICB9XG5cbiAgICBkb2Muc2V0UGFnZShkb2MuZ2V0TnVtYmVyT2ZQYWdlcygpKTtcbiAgfVxuXG4gIC8vIFRoZSBtYXJnaW5zIGEgY29udGludWF0aW9uIHRhYmxlIGtlZXBzIGZyb20gdGhlIHRvcCBhbmQgYm90dG9tIG9mIGl0c1xuICAvLyBwYWdlcywgdW5kZXIgaXRzIHRpdGxlJ3Mgc3RyaXAgYXQgdGhlIHRvcC5cbiAgcHJpdmF0ZSBfY29udGludWF0aW9uTWFyZ2lucyhjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LCBwYWdlOiBSZXBvcnRQYWdlKTogeyB0b3A6IG51bWJlcjsgYm90dG9tOiBudW1iZXIgfSB7XG4gICAgY29uc3QgYmFuZHMgPSBwYWdlLm1hc3RlckhpZGRlbiA/IE5PX0JBTkRTIDogY29udGV4dC5yZXBvcnQuY29uZmlnPy5oZWFkZXJGb290ZXIgPz8gTk9fQkFORFM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdG9wOiB0aGlzLl9jb250aW51YXRpb25NYXJnaW4oYmFuZHMuaGVhZGVySGVpZ2h0KSxcbiAgICAgIGJvdHRvbTogdGhpcy5fY29udGludWF0aW9uTWFyZ2luKGJhbmRzLmZvb3RlckhlaWdodCksXG4gICAgfTtcbiAgfVxuXG4gIC8vIFRoZSBoZWlnaHQgYSBjb250aW51YXRpb24gcGFnZSBnaXZlcyBpdHMgdGFibGU6IGJldHdlZW4gaXRzIG1hcmdpbnMsIHVuZGVyXG4gIC8vIHRoZSB0aXRsZS5cbiAgcHJpdmF0ZSBfY29udGludWF0aW9uUm9vbShjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LCBwYWdlOiBSZXBvcnRQYWdlKTogbnVtYmVyIHtcbiAgICBjb25zdCB7IHRvcCwgYm90dG9tIH0gPSB0aGlzLl9jb250aW51YXRpb25NYXJnaW5zKGNvbnRleHQsIHBhZ2UpO1xuXG4gICAgcmV0dXJuIGNvbnRleHQucGFnZUggLSB0b3AgLSBUSVRMRV9IIC0gYm90dG9tO1xuICB9XG5cbiAgLy8gVGhlIG1hcmdpbiBhIGNvbnRpbnVhdGlvbiB0YWJsZSBrZWVwcyBmcm9tIG9uZSBlZGdlOiBpbnNpZGUgdGhlIGJhbmQgd2hlblxuICAvLyB0aGUgcGFnZSBoYXMgb25lLlxuICBwcml2YXRlIF9jb250aW51YXRpb25NYXJnaW4oYmFuZDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gYmFuZCA/IGJhbmQgKiBQVCArIENPTlRJTlVBVElPTl9HQVAgOiBOT19CQU5EX01BUkdJTjtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbnRpbnVlZFRpdGxlKFxuICAgIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LFxuICAgIHRva2VuczogVGV4dFRva2VuQ29udGV4dCxcbiAgICBzZWFyY2g/OiBzdHJpbmcsXG4gICAgY3J1bWJzPzogc3RyaW5nW10sXG4gICAgZmlsdGVyZWQ/OiBib29sZWFuLFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IHRpdGxlID0gZXhwb3J0VGl0bGUoY29tcG9uZW50LCB0b2tlbnMsIHNlYXJjaCwgY3J1bWJzLCBmaWx0ZXJlZCk7XG5cbiAgICByZXR1cm4gdGl0bGUgPyBgJHt0aXRsZX0gKGNvbnRpbnVlZClgIDogJ0NvbnRpbnVlZCc7XG4gIH1cblxuICAvLyBBIEtQSSB0aWxlOiB0aGUgY2FyZCB0aGUgc2NyZWVuIGRyYXdzIChrcGktY2FyZC50cyBkZWNpZGVzIGV2ZXJ5IGxpbmUpLFxuICAvLyBzdGFja2VkIGFuZCBjZW50ZXJlZCBpbiB0aGUgYm9keS4gQSBjYXJkIHdpdGggb25seSBpdHMgdmFsdWUgYW5kIGxhYmVsXG4gIC8vIGtlZXBzIHRoZSB0aWxlJ3MgbG9uZy1zdGFuZGluZyBsYXlvdXQuXG4gIHByaXZhdGUgX3JlbmRlcktwaShcbiAgICBjb250ZXh0OiBQZGZFeHBvcnRDb250ZXh0LFxuICAgIGl0ZW06IENvbGxlY3RlZENvbXBvbmVudCxcbiAgICB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyLCBoOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHsgZG9jIH0gPSBjb250ZXh0O1xuICAgIGNvbnN0IGNvbmZpZyA9IGl0ZW0uY29tcG9uZW50LmNvbmZpZyBhcyBLcGlDb25maWc7XG4gICAgY29uc3QgdmlldyA9IGtwaUNhcmRWaWV3KGNvbmZpZywgaXRlbS5kYXRhLCB7IGZvcm1hdDogY29udGV4dC5mb3JtYXRDb250ZXh0LCB0aW1lem9uZTogY29udGV4dC50aW1lem9uZSB9KTtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX3BkZlRleHQodmlldy52YWx1ZSk7XG4gICAgY29uc3Qgbm90ZXMgPSBleHBvcnROb3RlTGluZXMoaXRlbSwgY29udGV4dC50aW1lem9uZSwgY29udGV4dC5mb3JtYXRDb250ZXh0LmxvY2FsZSk7XG5cbiAgICBpZiAoIWtwaUNhcmRIYXNFeHRyYXModmlldywgbm90ZXMpKSB7XG4gICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcbiAgICAgIGRvYy5zZXRGb250U2l6ZSgyNik7XG4gICAgICBkb2Muc2V0VGV4dENvbG9yKCcjMWYyOTMzJyk7XG4gICAgICBkb2MudGV4dCh2YWx1ZSwgeCArIHcgLyAyLCB5ICsgaCAvIDIsIHsgYWxpZ246ICdjZW50ZXInIH0pO1xuXG4gICAgICBpZiAodmlldy5sYWJlbCkge1xuICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ25vcm1hbCcpO1xuICAgICAgICBkb2Muc2V0Rm9udFNpemUoOSk7XG4gICAgICAgIGRvYy5zZXRUZXh0Q29sb3IoTVVURURfQ09MT1IpO1xuICAgICAgICBkb2MudGV4dCh2aWV3LmxhYmVsLCB4ICsgdyAvIDIsIHkgKyBoIC8gMiArIDE2LCB7IGFsaWduOiAnY2VudGVyJyB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEEgdGlsZSB0b28gc2hvcnQgZm9yIHRoZSBjYXJkJ3MgbGluZXMgc2hyaW5rcyB0aGVtIGFsbCBhbGlrZS5cbiAgICBjb25zdCBwYXJ0cyA9IGtwaUV4cG9ydFBhcnRzKHZpZXcsIG5vdGVzLCBoLCBLUElfSEVJR0hUUyk7XG4gICAgY29uc3QgaGVpZ2h0cyA9IHNjYWxlZEtwaUhlaWdodHMoS1BJX0hFSUdIVFMsIHBhcnRzLnNjYWxlKTtcbiAgICBsZXQgdG9wID0geSArIE1hdGgubWF4KDAsIChoIC0ga3BpRXhwb3J0SGVpZ2h0KHZpZXcsIHBhcnRzLCBoZWlnaHRzKSkgLyAyKTtcblxuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRGb250U2l6ZSgyNiAqIHBhcnRzLnNjYWxlKTtcbiAgICBkb2Muc2V0VGV4dENvbG9yKCcjMWYyOTMzJyk7XG4gICAgZG9jLnRleHQodmFsdWUsIHggKyB3IC8gMiwgdG9wICsgS1BJX1ZBTFVFX0JBU0VMSU5FICogcGFydHMuc2NhbGUsIHsgYWxpZ246ICdjZW50ZXInIH0pO1xuICAgIHRvcCArPSBoZWlnaHRzLnZhbHVlO1xuXG4gICAgaWYgKHZpZXcubGFiZWwpIHtcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnbm9ybWFsJyk7XG4gICAgICBkb2Muc2V0Rm9udFNpemUoOSAqIHBhcnRzLnNjYWxlKTtcbiAgICAgIGRvYy5zZXRUZXh0Q29sb3IoTVVURURfQ09MT1IpO1xuICAgICAgZG9jLnRleHQodGhpcy5fZml0KGRvYywgdGhpcy5fcGRmVGV4dCh2aWV3LmxhYmVsKSwgdyksIHggKyB3IC8gMiwgdG9wICsgOSAqIHBhcnRzLnNjYWxlLCB7IGFsaWduOiAnY2VudGVyJyB9KTtcbiAgICAgIHRvcCArPSBoZWlnaHRzLmxhYmVsO1xuICAgIH1cblxuICAgIGlmIChwYXJ0cy5kZWx0YSAmJiB2aWV3LmRlbHRhKSB7XG4gICAgICB0aGlzLl9rcGlEZWx0YShkb2MsIHZpZXcuZGVsdGEsIHgsIHRvcCwgdywgcGFydHMuc2NhbGUpO1xuICAgICAgdG9wICs9IGhlaWdodHMuZGVsdGE7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzLndpbmRvdykge1xuICAgICAgdGhpcy5fc21hbGxMaW5lKGRvYywgdGhpcy5fcGRmVGV4dCh2aWV3LndpbmRvdyksIHgsIHRvcCwgdywgJ2NlbnRlcicsICdub3JtYWwnLCBwYXJ0cy5zY2FsZSk7XG4gICAgICB0b3AgKz0gaGVpZ2h0cy53aW5kb3c7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzLnRhcmdldCAmJiB2aWV3LnRhcmdldCkge1xuICAgICAgdGhpcy5fa3BpVGFyZ2V0KGRvYywgdmlldy50YXJnZXQsIHgsIHRvcCwgdyk7XG4gICAgICB0b3AgKz0gaGVpZ2h0cy50YXJnZXQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcnRzLnNwYXJrbGluZSAmJiB2aWV3LnNwYXJrbGluZSkge1xuICAgICAgdGhpcy5fa3BpU3BhcmtsaW5lKGRvYywgdmlldy5zcGFya2xpbmUudmFsdWVzLCB2aWV3LnNwYXJrbGluZS5wYXJ0aWFsLCB4LCB0b3AsIHcpO1xuICAgICAgdG9wICs9IGhlaWdodHMuc3BhcmtsaW5lO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgbGluZSBvZiBwYXJ0cy5ub3Rlcykge1xuICAgICAgdGhpcy5fc21hbGxMaW5lKGRvYywgdGhpcy5fcGRmVGV4dChsaW5lKSwgeCwgdG9wLCB3LCAnY2VudGVyJywgJ2l0YWxpYycpO1xuICAgICAgdG9wICs9IGhlaWdodHMubm90ZTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgZGVsdGEgcm93LCBjZW50ZXJlZCBhcyBvbmUgZ3JvdXA6IGEgdHJpYW5nbGUgcG9pbnRpbmcgdGhlIHdheSB0aGVcbiAgLy8gdmFsdWUgbW92ZWQgKG5vbmUgd2hlbiB0aGUgc2hvd24gY2hhbmdlIHJvdW5kcyB0byB6ZXJvKSBhbmQgdGhlIGNoYW5nZSBpblxuICAvLyB0aGUgY29sb3Igb2Ygd2hhdCBpdCBtZWFucywgdGhlbiB3aGF0IGl0IGlzIGNvbXBhcmVkIHdpdGggaW4gZ3JleS5cbiAgcHJpdmF0ZSBfa3BpRGVsdGEoZG9jOiBhbnksIGRlbHRhOiBLcGlDYXJkRGVsdGEsIHg6IG51bWJlciwgdG9wOiBudW1iZXIsIHc6IG51bWJlciwgc2NhbGUgPSAxKTogdm9pZCB7XG4gICAgY29uc3QgY29sb3IgPSBgIyR7UkVQT1JUX0tQSV9DSEFOR0VfQ09MT1JTW2RlbHRhLnRvbmVdfWA7XG4gICAgY29uc3QgY2hhbmdlID0gdGhpcy5fcGRmVGV4dChkZWx0YS50ZXh0KTtcbiAgICBjb25zdCBzaXplID0gS1BJX0RFTFRBX1NJWkUgKiBzY2FsZTtcbiAgICBjb25zdCBzaWRlID0gS1BJX0FSUk9XICogc2NhbGU7XG4gICAgY29uc3QgYXJyb3cgPSBkZWx0YS50cmVuZCA9PT0gUmVwb3J0S3BpVHJlbmQuRmxhdCA/IDAgOiBzaWRlICsgS1BJX0FSUk9XX0dBUCAqIHNjYWxlO1xuXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XG4gICAgZG9jLnNldEZvbnRTaXplKHNpemUpO1xuICAgIGNvbnN0IGNoYW5nZVdpZHRoID0gZG9jLmdldFRleHRXaWR0aChjaGFuZ2UpO1xuXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdub3JtYWwnKTtcbiAgICBjb25zdCBjb21wYXJlZCA9IGRlbHRhLmNvbXBhcmVkXG4gICAgICA/IHRoaXMuX2ZpdChkb2MsIGAgJHt0aGlzLl9wZGZUZXh0KGRlbHRhLmNvbXBhcmVkKX1gLCBNYXRoLm1heCgwLCB3IC0gYXJyb3cgLSBjaGFuZ2VXaWR0aCkpXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IHdpZHRoID0gYXJyb3cgKyBjaGFuZ2VXaWR0aCArIChjb21wYXJlZCA/IGRvYy5nZXRUZXh0V2lkdGgoY29tcGFyZWQpIDogMCk7XG4gICAgY29uc3QgYmFzZWxpbmUgPSB0b3AgKyBzaXplO1xuICAgIGxldCBsZWZ0ID0geCArIE1hdGgubWF4KDAsICh3IC0gd2lkdGgpIC8gMik7XG5cbiAgICBpZiAoYXJyb3cpIHtcbiAgICAgIGNvbnN0IHVwID0gZGVsdGEudHJlbmQgPT09IFJlcG9ydEtwaVRyZW5kLlVwO1xuICAgICAgY29uc3QgdGlwID0gdXAgPyBiYXNlbGluZSAtIHNpZGUgOiBiYXNlbGluZTtcbiAgICAgIGNvbnN0IGJhc2UgPSB1cCA/IGJhc2VsaW5lIDogYmFzZWxpbmUgLSBzaWRlO1xuXG4gICAgICBkb2Muc2V0RmlsbENvbG9yKGNvbG9yKTtcbiAgICAgIGRvYy50cmlhbmdsZShsZWZ0LCBiYXNlLCBsZWZ0ICsgc2lkZSwgYmFzZSwgbGVmdCArIHNpZGUgLyAyLCB0aXAsICdGJyk7XG4gICAgICBsZWZ0ICs9IGFycm93O1xuICAgIH1cblxuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xuICAgIGRvYy5zZXRUZXh0Q29sb3IoY29sb3IpO1xuICAgIGRvYy50ZXh0KGNoYW5nZSwgbGVmdCwgYmFzZWxpbmUpO1xuXG4gICAgaWYgKGNvbXBhcmVkKSB7XG4gICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ25vcm1hbCcpO1xuICAgICAgZG9jLnNldFRleHRDb2xvcihNVVRFRF9DT0xPUik7XG4gICAgICBkb2MudGV4dChjb21wYXJlZCwgbGVmdCArIGNoYW5nZVdpZHRoLCBiYXNlbGluZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIHRhcmdldCBsaW5lICgnR29hbDogJDEsMDAwIMK3IDU2JSBvZiB0YXJnZXQnKSBhbmQsIHdoZW4gdGhlIHNlcnZlciBzZW50XG4gIC8vIHRoZSBwcm9ncmVzcywgYSBiYXIgZmlsbGVkIHRoYXQgZmFyOiBncmVlbiBvbmNlIHRoZSB0YXJnZXQgaXMgbWV0LlxuICBwcml2YXRlIF9rcGlUYXJnZXQoZG9jOiBhbnksIHRhcmdldDogS3BpQ2FyZFRhcmdldCwgeDogbnVtYmVyLCB0b3A6IG51bWJlciwgdzogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgdGV4dCA9IHRhcmdldC5wcm9ncmVzcyA/IGAke3RhcmdldC50ZXh0fSDCtyAke3RhcmdldC5wcm9ncmVzc31gIDogdGFyZ2V0LnRleHQ7XG5cbiAgICB0aGlzLl9zbWFsbExpbmUoZG9jLCB0aGlzLl9wZGZUZXh0KHRleHQpLCB4LCB0b3AsIHcsICdjZW50ZXInLCAnbm9ybWFsJyk7XG5cbiAgICBpZiAodGFyZ2V0LmZpbGwgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBiYXJXID0gTWF0aC5taW4odyAqIDAuNiwgS1BJX0JBUl9XKTtcbiAgICBjb25zdCBiYXJYID0geCArICh3IC0gYmFyVykgLyAyO1xuICAgIGNvbnN0IGJhclkgPSB0b3AgKyBOT1RFX0xJTkVfSCArIDE7XG5cbiAgICBkb2Muc2V0RmlsbENvbG9yKEtQSV9UUkFDS19DT0xPUik7XG4gICAgZG9jLnJlY3QoYmFyWCwgYmFyWSwgYmFyVywgS1BJX0JBUl9ILCAnRicpO1xuXG4gICAgaWYgKHRhcmdldC5maWxsID4gMCkge1xuICAgICAgZG9jLnNldEZpbGxDb2xvcihgIyR7UkVQT1JUX0tQSV9DSEFOR0VfQ09MT1JTW3RhcmdldC50b25lXX1gKTtcbiAgICAgIGRvYy5yZWN0KGJhclgsIGJhclksIGJhclcgKiB0YXJnZXQuZmlsbCwgS1BJX0JBUl9ILCAnRicpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRoZSBzcGFya2xpbmUgaW4gYSBib3ggdW5kZXIgdGhlIGNhcmQncyBsaW5lcywgYXMgdGhlIHNjcmVlbiBkcmF3cyBpdFxuICAvLyAoa3BpU3BhcmtsaW5lR2VvbWV0cnksIGEgMC0xMDAgYm94KTogYSB2ZWN0b3IgbGluZSBwZXIgcnVuIG9mIHZhbHVlcywgYVxuICAvLyBkb3QgZm9yIGEgbG9uZSB2YWx1ZSwgYW5kIHRoZSBsYXN0IHBvaW50J3MgbWFya2VyLCBob2xsb3cgd2hpbGUgaXRzIHBlcmlvZFxuICAvLyBpcyBwYXJ0aWFsLlxuICBwcml2YXRlIF9rcGlTcGFya2xpbmUoXG4gICAgZG9jOiBhbnksXG4gICAgdmFsdWVzOiAobnVtYmVyIHwgbnVsbClbXSxcbiAgICBwYXJ0aWFsOiBib29sZWFuLFxuICAgIHg6IG51bWJlciwgdG9wOiBudW1iZXIsIHc6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZ2VvbWV0cnkgPSBrcGlTcGFya2xpbmVHZW9tZXRyeSh2YWx1ZXMsIHBhcnRpYWwpO1xuICAgIGNvbnN0IGJveFcgPSBNYXRoLm1pbih3ICogMC43LCBLUElfU1BBUktMSU5FX1cpO1xuICAgIGNvbnN0IGJveEggPSBLUElfSEVJR0hUUy5zcGFya2xpbmUgLSAyICogS1BJX1NQQVJLTElORV9JTlNFVDtcbiAgICBjb25zdCBsZWZ0ID0geCArICh3IC0gYm94VykgLyAyO1xuICAgIGNvbnN0IGF0ID0gKHBvaW50OiBLcGlTcGFya2xpbmVQb2ludCkgPT4gKHtcbiAgICAgIHg6IGxlZnQgKyBwb2ludC54ICogYm94VyAvIDEwMCxcbiAgICAgIHk6IHRvcCArIEtQSV9TUEFSS0xJTkVfSU5TRVQgKyBwb2ludC55ICogYm94SCAvIDEwMCxcbiAgICB9KTtcbiAgICBjb25zdCBjb2xvciA9IGAjJHtSRVBPUlRfS1BJX1NQQVJLTElORV9DT0xPUn1gO1xuXG4gICAgZG9jLnNldERyYXdDb2xvcihjb2xvcik7XG4gICAgZG9jLnNldEZpbGxDb2xvcihjb2xvcik7XG4gICAgZG9jLnNldExpbmVXaWR0aCgxKTtcblxuICAgIGZvciAoY29uc3QgbGluZSBvZiBnZW9tZXRyeS5saW5lcykge1xuICAgICAgY29uc3QgcG9pbnRzID0gbGluZS5zcGxpdCgnICcpLm1hcCgocGFpcikgPT4ge1xuICAgICAgICBjb25zdCBbcHgsIHB5XSA9IHBhaXIuc3BsaXQoJywnKS5tYXAoTnVtYmVyKTtcblxuICAgICAgICByZXR1cm4gYXQoeyB4OiBweCwgeTogcHkgfSk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHN0ZXBzID0gcG9pbnRzLnNsaWNlKDEpLm1hcCgocG9pbnQsIGluZGV4KSA9PiBbcG9pbnQueCAtIHBvaW50c1tpbmRleF0ueCwgcG9pbnQueSAtIHBvaW50c1tpbmRleF0ueV0pO1xuXG4gICAgICBkb2MubGluZXMoc3RlcHMsIHBvaW50c1swXS54LCBwb2ludHNbMF0ueSwgWzEsIDFdLCAnUycsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGRvdCBvZiBnZW9tZXRyeS5kb3RzKSB7XG4gICAgICBjb25zdCBwb2ludCA9IGF0KGRvdCk7XG4gICAgICBkb2MuY2lyY2xlKHBvaW50LngsIHBvaW50LnksIEtQSV9ET1RfUiwgJ0YnKTtcbiAgICB9XG5cbiAgICBpZiAoZ2VvbWV0cnkubGFzdCkge1xuICAgICAgY29uc3QgcG9pbnQgPSBhdChnZW9tZXRyeS5sYXN0KTtcblxuICAgICAgaWYgKGdlb21ldHJ5Lmxhc3QuaG9sbG93KSB7XG4gICAgICAgIGRvYy5zZXRGaWxsQ29sb3IoJyNmZmZmZmYnKTtcbiAgICAgICAgZG9jLmNpcmNsZShwb2ludC54LCBwb2ludC55LCBLUElfRE9UX1IsICdGRCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9jLmNpcmNsZShwb2ludC54LCBwb2ludC55LCBLUElfRE9UX1IsICdGJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQSBmb3JtYXR0ZWQgdmFsdWUgYXMganNQREYgY2FuIGRyYXcgaXQuIEl0cyBzdGFuZGFyZCBmb250cyB3cml0ZSB0ZXh0IGluXG4gIC8vIFdpbkFuc2ksIHdoaWNoIGhhcyB0aGUgbm8tYnJlYWsgc3BhY2UgKFUrMDBBMCwgZnItQ0EncyBkaWdpdCBncm91cGluZykgYnV0XG4gIC8vIG5vdCB0aGUgbmFycm93IG9uZSAoVSsyMDJGLCB3aGljaCBvdGhlciBsb2NhbGVzIGdyb3VwIGFuZCBzcGFjZSB3aXRoKSwgdGhlXG4gIC8vIHRoaW4gYW5kIGhhaXIgc3BhY2VzIChVKzIwMDksIFUrMjAwQSwgd2hpY2ggSW50bCBwdXRzIGFyb3VuZCBhIGRhdGVcbiAgLy8gcmFuZ2UncyBkYXNoOiAnU2VwIDEg4oCTIDMwLCAyMDI2JyksIHRoZSBtaW51cyBzaWduIChVKzIyMTIsIHNvbWUgbG9jYWxlcydcbiAgLy8gbmVnYXRpdmUgc2lnbikgb3IgYSByYW5rIGNoYW5nZSdzIHRyaWFuZ2xlczogZWFjaCB3b3VsZCBwcmludCBhcyBzdHJheVxuICAvLyBnbHlwaHMuIFRoZSBuYXJyb3cgc3BhY2UgYmVjb21lcyBhIG5vLWJyZWFrIHNwYWNlLCBzbyBhIG51bWJlciBzdGlsbCBuZXZlclxuICAvLyB3cmFwcyBhY3Jvc3MgYSBsaW5lOyB0aGUgdGhpbiBhbmQgaGFpciBzcGFjZXMgYSBwbGFpbiBzcGFjZTsgdGhlIG1pbnVzXG4gIC8vIHNpZ24gYSBoeXBoZW47IGFuZCBhIHJhbmsncyByaXNlIGEgcGx1cyBzaWduIGFuZCBpdHMgZmFsbCBhIGh5cGhlblxuICAvLyAoJ+KWsiAyJyByZWFkcyAnKzInKS5cbiAgcHJpdmF0ZSBfcGRmVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0ZXh0XG4gICAgICAucmVwbGFjZSgvXFx1MjAyRi9nLCAnXFx1MDBBMCcpXG4gICAgICAucmVwbGFjZSgvW1xcdTIwMDlcXHUyMDBBXS9nLCAnICcpXG4gICAgICAucmVwbGFjZSgvXFx1MjIxMi9nLCAnLScpXG4gICAgICAucmVwbGFjZSgvXFx1MjVCMlxccz8vZywgJysnKVxuICAgICAgLnJlcGxhY2UoL1xcdTI1QkNcXHM/L2csICctJyk7XG4gIH1cblxuICAvLyBBIGxheWVyJ3MgdmFsdWVzIHdpdGggZWFjaCBudW1iZXIgYXMganNQREYgY2FuIGRyYXcgaXQgKF9wZGZUZXh0KSwgc28gYVxuICAvLyB2YWx1ZSBncm91cGVkIHdpdGggbmFycm93IHNwYWNlcyByZWFkcywgYW5kIHdyYXBzLCBsaWtlIGFueSBvdGhlciBudW1iZXIuXG4gIHByaXZhdGUgX3BkZlZhbHVlcyh2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIFRleHRWYWx1ZT4pOiBSZWNvcmQ8c3RyaW5nLCBUZXh0VmFsdWU+IHtcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHZhbHVlcykubWFwKChba2V5LCB2YWx1ZV0pID0+IFtcbiAgICAgIGtleSxcbiAgICAgIHZhbHVlLnRleHQgPT09IHVuZGVmaW5lZCA/IHZhbHVlIDogeyAuLi52YWx1ZSwgdGV4dDogdGhpcy5fcGRmVGV4dCh2YWx1ZS50ZXh0KSB9LFxuICAgIF0pKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NsdWcobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1teYS16MC05XSsvZywgJy0nKS5yZXBsYWNlKC9eLSt8LSskL2csICcnKSB8fCAncmVwb3J0JztcbiAgfVxufVxuIl19
|