@firestitch/report 18.12.0 → 18.13.0
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-grid/component-grid.component.d.ts +5 -1
- package/app/reports/components/component-grid/report-grid-cell.pipe.d.ts +11 -0
- package/app/reports/components/report-component/report-component.component.d.ts +0 -1
- package/app/reports/export/report-export-collector.service.d.ts +8 -1
- package/app/reports/export/report-filter-lines.d.ts +2 -0
- package/app/reports/export/report-grid-export.d.ts +20 -0
- package/app/reports/export/report-pdf.service.d.ts +2 -0
- package/app/reports/export/report-pptx.service.d.ts +1 -0
- package/app/reports/group-by.d.ts +3 -0
- package/app/reports/interfaces/report-export-snapshot.interface.d.ts +2 -0
- package/app/reports/interfaces/report.interface.d.ts +7 -0
- package/app/reports/report-filter-items.d.ts +1 -1
- package/app/reports/report-grid-layout.d.ts +8 -2
- package/app/reports/services/report-filter-state.service.d.ts +8 -1
- package/app/reports/tile-data-state.d.ts +2 -2
- package/esm2022/app/reports/components/component-grid/component-grid.component.mjs +34 -7
- package/esm2022/app/reports/components/component-grid/report-grid-cell.pipe.mjs +41 -0
- package/esm2022/app/reports/components/report-component/report-component.component.mjs +15 -19
- package/esm2022/app/reports/data/report.data.mjs +3 -3
- package/esm2022/app/reports/export/report-export-collector.service.mjs +72 -7
- package/esm2022/app/reports/export/report-filter-lines.mjs +68 -1
- package/esm2022/app/reports/export/report-grid-export.mjs +48 -0
- package/esm2022/app/reports/export/report-pdf.service.mjs +47 -17
- package/esm2022/app/reports/export/report-pptx.service.mjs +48 -4
- package/esm2022/app/reports/group-by.mjs +13 -0
- package/esm2022/app/reports/interfaces/report-export-snapshot.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
- package/esm2022/app/reports/report-filter-items.mjs +9 -7
- package/esm2022/app/reports/report-grid-layout.mjs +57 -4
- package/esm2022/app/reports/services/report-filter-state.service.mjs +124 -38
- package/esm2022/app/reports/tile-data-state.mjs +12 -17
- package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +2 -2
- package/esm2022/app/reports/views/report/report.component.mjs +2 -2
- package/fesm2022/{firestitch-report-echarts-CoaGXKET.mjs → firestitch-report-echarts-EecIloKo.mjs} +2 -2
- package/fesm2022/{firestitch-report-echarts-CoaGXKET.mjs.map → firestitch-report-echarts-EecIloKo.mjs.map} +1 -1
- package/fesm2022/{firestitch-report-firestitch-report-CHPA7sla.mjs → firestitch-report-firestitch-report-DbdLxQSE.mjs} +566 -116
- package/fesm2022/firestitch-report-firestitch-report-DbdLxQSE.mjs.map +1 -0
- package/fesm2022/firestitch-report.mjs +1 -1
- package/package.json +2 -2
- package/fesm2022/firestitch-report-firestitch-report-CHPA7sla.mjs.map +0 -1
|
@@ -24,7 +24,7 @@ import { groupValueSignature } from '../../report-filter-items';
|
|
|
24
24
|
import { offeredViewerFeatures } from '../../report-viewer-features';
|
|
25
25
|
import { ReportFilterOptionsService } from '../../services/report-filter-options.service';
|
|
26
26
|
import { movedGroupValues, ReportFilterStateService } from '../../services/report-filter-state.service';
|
|
27
|
-
import {
|
|
27
|
+
import { followsGroupBy } from '../../group-by';
|
|
28
28
|
import { tileLoads } from '../../tile-loads';
|
|
29
29
|
import { ComponentChartComponent } from '../component-chart/component-chart.component';
|
|
30
30
|
import { ComponentGridComponent } from '../component-grid/component-grid.component';
|
|
@@ -198,9 +198,9 @@ export class ReportComponentComponent {
|
|
|
198
198
|
this._filterState.changesFor(this.component)
|
|
199
199
|
.pipe(takeUntilDestroyed(this._destroyRef))
|
|
200
200
|
.subscribe(() => this._refresh$.next());
|
|
201
|
-
// A group-by change re-buckets every
|
|
202
|
-
// to a filter group, so it rides its own stream.
|
|
203
|
-
if (this.
|
|
201
|
+
// A group-by change re-buckets every tile that follows it; it isn't
|
|
202
|
+
// scoped to a filter group, so it rides its own stream.
|
|
203
|
+
if (followsGroupBy(this.component)) {
|
|
204
204
|
this._filterState.frequencyChanges()
|
|
205
205
|
.pipe(takeUntilDestroyed(this._destroyRef))
|
|
206
206
|
.subscribe(() => {
|
|
@@ -390,17 +390,18 @@ export class ReportComponentComponent {
|
|
|
390
390
|
}
|
|
391
391
|
}
|
|
392
392
|
// The CSV is what the screen shows, so it carries the tile's interaction
|
|
393
|
-
// state (tileDataState): the group-by grain for a
|
|
393
|
+
// state (tileDataState): the group-by grain for a tile that follows it, a
|
|
394
394
|
// chart's drill path, the viewer's header sort, search and hidden columns
|
|
395
395
|
// for a list (a searched list exports only the rows the search leaves, and
|
|
396
396
|
// the hidden columns stay out of the file), and the groups that match
|
|
397
|
-
// 'any';
|
|
398
|
-
//
|
|
399
|
-
//
|
|
400
|
-
// for the whole result.
|
|
397
|
+
// 'any'; a table's layout as the viewer changed it; and its title as the
|
|
398
|
+
// header reads it (shownTitle), which the server names the file after. A
|
|
399
|
+
// note the server returns (the file was cut) is shown before the download
|
|
400
|
+
// starts, so a short file never passes for the whole result.
|
|
401
401
|
exportCsv() {
|
|
402
402
|
const filters = this._filterState.resolveForComponent(this.component);
|
|
403
|
-
const
|
|
403
|
+
const layout = this.component.type === 'grid' ? this._filterState.gridSessionLayout(this.component) : null;
|
|
404
|
+
const state = { ...this._filterState.tileState(this.component), ...(layout ? { layout } : {}) };
|
|
404
405
|
const title = this.shownTitle;
|
|
405
406
|
this._process.download(`Exporting ${title || 'component'}`, this._reportData.exportComponent(this.reportId, this.component.id, filters, state, title)
|
|
406
407
|
.pipe(tap(({ notes }) => notes?.length && this._message.warning(notes.join(' '))), map(({ url }) => url)));
|
|
@@ -653,11 +654,6 @@ export class ReportComponentComponent {
|
|
|
653
654
|
h: this.component.h,
|
|
654
655
|
});
|
|
655
656
|
}
|
|
656
|
-
// A chart on a time x-axis — the only component the report's group-by control
|
|
657
|
-
// applies to (isTimeSeriesChart, the browser-side mirror of the server's rule).
|
|
658
|
-
get _isTimeSeries() {
|
|
659
|
-
return isTimeSeriesChart(this.component);
|
|
660
|
-
}
|
|
661
657
|
// Auto height (box fits its content) vs fixed (use `h` exactly). Derived from
|
|
662
658
|
// type, server-side: KPI tiles are auto; charts and lists are fixed — charts
|
|
663
659
|
// fit the box and never overflow, lists scroll inside it.
|
|
@@ -704,9 +700,9 @@ export class ReportComponentComponent {
|
|
|
704
700
|
this.error.set(null);
|
|
705
701
|
const filters = this._filterState.resolveForComponent(this.component);
|
|
706
702
|
// The tile's interaction state, the one its CSV and every export carry
|
|
707
|
-
// (tileDataState): a
|
|
708
|
-
// one) so the backend re-buckets, a chart's drill
|
|
709
|
-
// that match 'any'.
|
|
703
|
+
// (tileDataState): the grain of a tile that follows the group-by (when
|
|
704
|
+
// the viewer picked one) so the backend re-buckets, a chart's drill
|
|
705
|
+
// path, and the groups that match 'any'.
|
|
710
706
|
const state = this._filterState.tileState(this.component);
|
|
711
707
|
return this._reportData.componentData(this.reportId, this.component.id, filters, state);
|
|
712
708
|
}
|
|
@@ -814,4 +810,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
814
810
|
type: HostBinding,
|
|
815
811
|
args: ['class.height-auto']
|
|
816
812
|
}] } });
|
|
817
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWNvbXBvbmVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvY29tcG9uZW50cy9yZXBvcnQtY29tcG9uZW50L3JlcG9ydC1jb21wb25lbnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvcmVwb3J0LWNvbXBvbmVudC9yZXBvcnQtY29tcG9uZW50LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFDMUQsWUFBWSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFxQixNQUFNLEVBQWlCLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUMvRyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEdBQ2pDLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV2RCxPQUFPLEVBQWdCLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRCxPQUFP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QWM7c0JBRHBCLFNBQVM7dUJBQUMsdUJBQXVCO2dCQWdFM0IsUUFBUTtzQkFEZCxTQUFTO3VCQUFDLFVBQVU7Z0JBSWQsVUFBVTtzQkFEaEIsU0FBUzt1QkFBQyxZQUFZO2dCQWduQlosVUFBVTtzQkFEcEIsV0FBVzt1QkFBQyxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBEZXN0cm95UmVmLCBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nLCBJbnB1dCwgTmdab25lLCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQsIGNvbXB1dGVkLCBpbmplY3QsXG4gIGlucHV0LCBvdXRwdXQsIHNpZ25hbCwgdmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuXG5pbXBvcnQgeyBNYXRJY29uQnV0dG9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRJY29uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRQcm9ncmVzc1NwaW5uZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1zcGlubmVyJztcbmltcG9ydCB7IE1hdFRvb2x0aXAgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcblxuaW1wb3J0IHsgRmlsdGVyQ29uZmlnLCBGc0ZpbHRlck1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2ZpbHRlcic7XG5pbXBvcnQgeyBGc01lbnVDb21wb25lbnQsIEZzTWVudU1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21lbnUnO1xuaW1wb3J0IHsgRnNNZXNzYWdlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbWVzc2FnZSc7XG5pbXBvcnQgeyBGc1Byb2Nlc3MgfSBmcm9tICdAZmlyZXN0aXRjaC9wcm9jZXNzJztcbmltcG9ydCB7IEZzUHJvbXB0IH0gZnJvbSAnQGZpcmVzdGl0Y2gvcHJvbXB0JztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgZmlsdGVyIGFzIHJ4RmlsdGVyLCBtYXAsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcblxuaW1wb3J0IHsgb3BlbkF0UG9pbnQgfSBmcm9tICcuLi8uLi9hbmNob3ItYXQtcG9pbnQnO1xuaW1wb3J0IHsgUmVwb3J0RGF0YSB9IGZyb20gJy4uLy4uL2RhdGEvcmVwb3J0LmRhdGEnO1xuaW1wb3J0IHsgTGlzdENvbHVtbnNDb21wb25lbnQsIExpc3RDb2x1bW5zRGlhbG9nRGF0YSB9IGZyb20gJy4uLy4uL2RpYWxvZ3MvbGlzdC1jb2x1bW5zL2xpc3QtY29sdW1ucy5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgRFJJTExfQ1JVTUJfU0VQQVJBVE9SLCBEUklMTF9SRVNFVF9NRVNTQUdFLCBhZG9wdGVkRHJpbGxQYXRoLCBkcmlsbENydW1iTGFiZWxzLCBkcmlsbE91dHNpZGVNZXNzYWdlLFxuICBkcmlsbFJlc2V0Tm90ZWQsXG59IGZyb20gJy4uLy4uL2RyaWxsLWNydW1icyc7XG5pbXBvcnQge1xuICBDb21wb25lbnREYXRhLFxuICBDb21wb25lbnRTZXR0aW5ncyxcbiAgRmlsdGVyR3JvdXBWYWx1ZSxcbiAgS3BpQ29uZmlnLFxuICBSZXBvcnRDb21wb25lbnQgYXMgUmVwb3J0Q29tcG9uZW50TW9kZWwsXG4gIFJlcG9ydENvbXBvbmVudFR5cGUsXG4gIFJlcG9ydEZpbHRlckdyb3VwLFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0TWFya0FjdGlvbiB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LW1hcmstYWN0aW9uLnR5cGUnO1xuaW1wb3J0IHsgUmVwb3J0TWFya0NsaWNrIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQtbWFyay1jbGljay5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVGlsZUxvYWRSZXN1bHQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3RpbGUtbG9hZC1yZXN1bHQuaW50ZXJmYWNlJztcbmltcG9ydCB7IGtwaUNhcmRTZXR0aW5ncywgc2FtZUtwaUNhcmRTZXR0aW5ncyB9IGZyb20gJy4uLy4uL2twaS1jYXJkJztcbmltcG9ydCB7IGNvbXBvbmVudFBhZGRpbmdDc3MgfSBmcm9tICcuLi8uLi9sYXlvdXQnO1xuaW1wb3J0IHsgbGlzdEhpZGVhYmxlQ29sdW1ucyB9IGZyb20gJy4uLy4uL2xpc3QtY29uZmlnJztcbmltcG9ydCB7XG4gIE1BUktfQUNUSU9OX0xBQkVMUywgZGVjaWRlTWFya0NsaWNrLCBkcmlsbERvd25QYXRoLCBtYXJrQWN0aW9ucywgdGlsZU1hcmtBY3Rpb25zLFxufSBmcm9tICcuLi8uLi9tYXJrLWNsaWNrJztcbmltcG9ydCB7XG4gIExJU1RfU0VBUkNIX0lURU0sIGZpbHRlckl0ZW1Gb3JHcm91cCwgZ3JvdXBWYWx1ZXNGcm9tUXVlcnksIGxpc3RTZWFyY2hJdGVtLFxufSBmcm9tICcuLi8uLi9yZXBvcnQtZmlsdGVyLWl0ZW1zJztcbmltcG9ydCB7IGdyb3VwVmFsdWVTaWduYXR1cmUgfSBmcm9tICcuLi8uLi9yZXBvcnQtZmlsdGVyLWl0ZW1zJztcbmltcG9ydCB7IG9mZmVyZWRWaWV3ZXJGZWF0dXJlcyB9IGZyb20gJy4uLy4uL3JlcG9ydC12aWV3ZXItZmVhdHVyZXMnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLW9wdGlvbnMuc2VydmljZSc7XG5pbXBvcnQgeyBtb3ZlZEdyb3VwVmFsdWVzLCBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgaXNUaW1lU2VyaWVzQ2hhcnQgfSBmcm9tICcuLi8uLi90aWxlLWRhdGEtc3RhdGUnO1xuaW1wb3J0IHsgdGlsZUxvYWRzIH0gZnJvbSAnLi4vLi4vdGlsZS1sb2Fkcyc7XG5pbXBvcnQgeyBDb21wb25lbnRDaGFydENvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudC1jaGFydC9jb21wb25lbnQtY2hhcnQuY29tcG9uZW50JztcbmltcG9ydCB7IENvbXBvbmVudEdyaWRDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnQtZ3JpZC9jb21wb25lbnQtZ3JpZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29tcG9uZW50S3BpQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50LWtwaS9jb21wb25lbnQta3BpLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb21wb25lbnRMaXN0Q29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50LWxpc3QvY29tcG9uZW50LWxpc3QuY29tcG9uZW50JztcbmltcG9ydCB7IENvbXBvbmVudFRleHRDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnQtdGV4dC9jb21wb25lbnQtdGV4dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGV4dFRva2VuQ29udGV4dCwgZmlsbFRpdGxlVG9rZW5zIH0gZnJvbSAnLi4vLi4vdGV4dCc7XG5pbXBvcnQgeyBOT19WQUxVRV9LRVlTLCBpc0RyYXduLCB2YWx1ZUtleXMgfSBmcm9tICcuLi8uLi92YWx1ZXMnO1xuaW1wb3J0IHsgQ2FudmFzU25hcHBlciwgUFhfUEVSX0lOQ0ggfSBmcm9tICcuLi9yZXBvcnQtY2FudmFzL3JlcG9ydC1jYW52YXMuY29tcG9uZW50JztcblxuXG4vLyBSZXNpemUgaGFuZGxlcywgbmFtZWQgYnkgY29tcGFzcyBkaXJlY3Rpb24uXG5jb25zdCBIQU5ETEVTID0gWydudycsICduJywgJ25lJywgJ2UnLCAnc2UnLCAncycsICdzdycsICd3J10gYXMgY29uc3Q7XG50eXBlIEhhbmRsZSA9IHR5cGVvZiBIQU5ETEVTW251bWJlcl07XG5cbmNvbnN0IE1JTl9XID0gMC42OyAvLyBpbmNoZXNcbmNvbnN0IE1JTl9IID0gMC40OyAvLyBpbmNoZXNcblxuLy8gVGhlIHRpbGVzIHRoYXQgcmVhZCB0aGVpciBvd24gcm93czogYSBsaXN0IHRocm91Z2ggRnNMaXN0IHBhZ2luZywgYSBncmlkXG4vLyB0aHJvdWdoIGZzLWdyaWQncyBzb3VyY2UuIFRoaXMgY29tcG9uZW50IGxvYWRzIGV2ZXJ5IG90aGVyIHRpbGUncyBkYXRhLlxuY29uc3QgU0VMRl9SRUFESU5HX1RZUEVTOiByZWFkb25seSBSZXBvcnRDb21wb25lbnRUeXBlW10gPSBbJ2xpc3QnLCAnZ3JpZCddO1xuXG4vLyBUd28gcHJlc3NlcyBvbiBhIHRleHQgYmxvY2sgdGhpcyBjbG9zZSB0b2dldGhlciBvcGVuIGl0cyBlZGl0b3IuIERldGVjdGVkXG4vLyBoZXJlIHJhdGhlciB0aGFuIHdpdGggYSBkYmxjbGljayBsaXN0ZW5lciBiZWNhdXNlIHRoZSBkcmFnIGxvb3AgY2xhaW1zIHRoZVxuLy8gcG9pbnRlciBvbiBldmVyeSBwcmVzcywgYW5kIGEgYnJvd3NlciBpcyBub3Qgb2JsaWdlZCB0byBkZWxpdmVyIGRibGNsaWNrXG4vLyB0aHJvdWdoIGEgY2FwdHVyZWQsIGRlZmF1bHQtcHJldmVudGVkIHBvaW50ZXIuXG5jb25zdCBET1VCTEVfUFJFU1NfTVMgPSA0MDA7XG5cbi8vIE9uZSBjb21wb25lbnQgb24gdGhlIHBhZ2U6IHRpdGxlIGJhciwgdGhlIHR5cGUtc3BlY2lmaWMgYm9keSAoY2hhcnQgfCBsaXN0XG4vLyB8IGtwaSksIGEgbWVudSAoc2V0dGluZ3MsIGZpbHRlciB0b2dnbGVzLCBleHBvcnQpIOKAlCBhbmQgdGhlIGVkaXRpbmdcbi8vIGludGVyYWN0aW9uczogY2xpY2sgc2VsZWN0czsgdGhlIHNlbGVjdGlvbiBmcmFtZSBzaG93cyA4IHJlc2l6ZSBoYW5kbGVzO1xuLy8gZHJhZ2dpbmcgdGhlIGJvZHkgbW92ZXMgd2l0aCBzbWFydCBhbGlnbm1lbnQgZ3VpZGVzICh2aWEgdGhlIGNhbnZhc1xuLy8gc25hcHBlcik7IGV2ZXJ5dGhpbmcgd29ya3MgYXQgYW55IHpvb20gKHBpeGVsIGRlbHRhcyDDtyB6b29twrc5NiDihpIgaW5jaGVzKS5cbi8vXG4vLyBDaGFydHMgYW5kIEtQSXMgZmV0Y2ggdGhlaXIgb3duIGRhdGEgaGVyZTsgbGlzdHMgZmV0Y2ggaW5zaWRlXG4vLyBDb21wb25lbnRMaXN0Q29tcG9uZW50IHRocm91Z2ggRnNMaXN0IHBhZ2luZywgYW5kIGdyaWRzIGluc2lkZVxuLy8gQ29tcG9uZW50R3JpZENvbXBvbmVudCB0aHJvdWdoIGZzLWdyaWQncyBzb3VyY2UuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcmVwb3J0LWNvbXBvbmVudCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9yZXBvcnQtY29tcG9uZW50LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcmVwb3J0LWNvbXBvbmVudC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIE1hdEljb24sXG4gICAgTWF0SWNvbkJ1dHRvbixcbiAgICBNYXRQcm9ncmVzc1NwaW5uZXIsXG4gICAgTWF0VG9vbHRpcCxcbiAgICBGc0ZpbHRlck1vZHVsZSxcbiAgICBGc01lbnVNb2R1bGUsXG4gICAgQ29tcG9uZW50Q2hhcnRDb21wb25lbnQsXG4gICAgQ29tcG9uZW50R3JpZENvbXBvbmVudCxcbiAgICBDb21wb25lbnRLcGlDb21wb25lbnQsXG4gICAgQ29tcG9uZW50TGlzdENvbXBvbmVudCxcbiAgICBDb21wb25lbnRUZXh0Q29tcG9uZW50LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBSZXBvcnRDb21wb25lbnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG5cbiAgQElucHV0KCkgcHVibGljIHJlcG9ydElkOiBudW1iZXI7XG4gIEBJbnB1dCgpIHB1YmxpYyBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudE1vZGVsO1xuICBASW5wdXQoKSBwdWJsaWMgZ3JvdXBzOiBNYXA8bnVtYmVyLCBSZXBvcnRGaWx0ZXJHcm91cD47XG4gIEBJbnB1dCgpIHB1YmxpYyBlZGl0TW9kZSA9IGZhbHNlO1xuICAvLyBUaGUgY2FudmFzIHpvb20g4oCUIGNvbnZlcnRzIG9uLXNjcmVlbiBwaXhlbCBkZWx0YXMgYmFjayB0byBpbmNoZXMuXG4gIEBJbnB1dCgpIHB1YmxpYyB6b29tID0gMTtcbiAgQElucHV0KCkgcHVibGljIHNuYXBwZXI6IENhbnZhc1NuYXBwZXIgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgcHVibGljIHNlbGVjdGVkID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIHB1YmxpYyBzZWxlY3RDb21wb25lbnQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBwb3NpdGlvbkNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgY29tcG9uZW50SWQ6IG51bWJlciB9ICYgUmVjb3JkPHN0cmluZywgbnVtYmVyPj4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBvcGVuU2V0dGluZ3MgPSBuZXcgRXZlbnRFbWl0dGVyPFJlcG9ydENvbXBvbmVudE1vZGVsPigpO1xuXG4gIC8vIFdoYXQgdGhlIHt7dG9rZW5zfX0gb2YgYSB0ZXh0IGJsb2NrLCBhbmQgb2YgYW55IGNvbXBvbmVudCdzIHRpdGxlLCBmaWxsXG4gIC8vIHdpdGggd2hlcmUgaXQgaXMgZHJhd246IGl0cyBwYWdlJ3MsIG9yIHRoZSBtYXN0ZXIncyBmb3IgYSBoZWFkZXIgb3JcbiAgLy8gZm9vdGVyIGNvbXBvbmVudC5cbiAgcHVibGljIHJlYWRvbmx5IHRva2VucyA9IGlucHV0PFRleHRUb2tlbkNvbnRleHQ+KHsgcGFnZU51bWJlcjogMSwgcGFnZU5hbWU6ICcnLCByZXBvcnROYW1lOiAnJyB9KTtcblxuICAvLyBUaGUgdmFsdWUga2V5cyB0aGUgb3RoZXIgdGV4dCBibG9ja3Mgb2YgYSB0ZXh0J3MgbGF5ZXIgc2hvdywgcmVhZCBieSB0aGVcbiAgLy8gY2FudmFzIHdoZW4gdGhlIHRleHQncyBlZGl0b3IgYXNrcy5cbiAgcHVibGljIHJlYWRvbmx5IHZhbHVlS2V5c0Vsc2V3aGVyZSA9IGlucHV0PCgodGV4dDogUmVwb3J0Q29tcG9uZW50TW9kZWwpID0+IFJlYWRvbmx5U2V0PHN0cmluZz4pIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gQSB0ZXh0IGJsb2NrIHdhcyBkZWxldGVkIGZyb20gaXRzIG1lbnUg4oCUIHRoZSBjYW52YXMgZHJvcHMgaXQuXG4gIHB1YmxpYyByZWFkb25seSByZW1vdmVkID0gb3V0cHV0PG51bWJlcj4oKTtcblxuICAvLyBBIHZhbHVlJ3Mgc2V0dGluZ3Mgd2VyZSBhc2tlZCBmb3IgZnJvbSBpdHMgY2hpcCBpbiB0aGUgdGV4dCwgYnkgdGhlXG4gIC8vIHZhbHVlJ3Mga2V5LiBUaGUgY2FudmFzIG9wZW5zIHRoZW0uXG4gIHB1YmxpYyByZWFkb25seSB2YWx1ZVNldHRpbmdzID0gb3V0cHV0PHN0cmluZz4oKTtcblxuICAvLyBUaGUgdGV4dCdzIGh0bWwgd2FzIHNhdmVkLiBFbWl0dGVkIG9uIHRoZSByZXNwb25zZSwgc28gdGhlIHNlcnZlciBhbHJlYWR5XG4gIC8vIGhvbGRzIHRoZSBodG1sIHdoZW4gdGhlIGNhbnZhcyByZWFkcyB0aGUgdmFsdWVzIGl0IHNob3dzLlxuICBwdWJsaWMgcmVhZG9ubHkgdGV4dFNhdmVkID0gb3V0cHV0PHN0cmluZz4oKTtcblxuICAvLyBEZWxldGluZyB0aGUgdGV4dCBhbHNvIGRlbGV0ZWQgdGhlIHZhbHVlcyBubyBvdGhlciB0ZXh0IG9uIGl0cyBwYWdlIHJlYWRzLFxuICAvLyBieSBpZC4gVGhlIGNhbnZhcyBoYXMgdGhlIHJlcG9ydCByZWxvYWRlZC5cbiAgcHVibGljIHJlYWRvbmx5IHZhbHVlc1JlbW92ZWQgPSBvdXRwdXQ8bnVtYmVyW10+KCk7XG5cbiAgLy8gVGhlIHRleHQgYmxvY2sncyBlZGl0b3IgaXMgb3BlbiAoZG91YmxlLXByZXNzIGluIGVkaXQgbW9kZSkuIENsb3NlZCBieSBmb2N1c1xuICAvLyBsZWF2aW5nIHRoZSBibG9jaywgYnkgZGVzZWxlY3RpbmcgaXQsIG9yIGJ5IGxlYXZpbmcgZWRpdCBtb2RlIOKAlCBlYWNoIG9mXG4gIC8vIHdoaWNoIHNhdmVzLlxuICBwdWJsaWMgcmVhZG9ubHkgdGV4dEVkaXRpbmcgPSBzaWduYWwoZmFsc2UpO1xuICAvLyBBIHRleHQgYmxvY2sncyBodG1sIGFzIGxhc3Qgc2F2ZWQgaGVyZTsgbnVsbCB1bnRpbCB0aGVuLCBzbyB0aGUgYmxvY2tcbiAgLy8gc2hvd3MgaXRzIHN0b3JlZCBodG1sLlxuICBwdWJsaWMgcmVhZG9ubHkgdGV4dEh0bWwgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gV2hhdCB0aGUgb3RoZXIgdGV4dCBibG9ja3Mgb2YgdGhpcyB0ZXh0J3MgbGF5ZXIgc2hvdywgZm9yIGl0cyBlZGl0b3Inc1xuICAvLyBub3RpY2UuIFN0YWJsZSwgc28gdGhlIHRleHQgYmxvY2sncyBpbnB1dCBuZXZlciBjaGFuZ2VzOyBpdCBhc2tzIHdoZW4gYW5cbiAgLy8gZWRpdCB0YWtlcyBhIHZhbHVlJ3MgbGFzdCBjaGlwIG91dC5cbiAgcHVibGljIHJlYWRvbmx5IHNob3duRWxzZXdoZXJlID0gKCk6IFJlYWRvbmx5U2V0PHN0cmluZz4gPT5cbiAgICB0aGlzLnZhbHVlS2V5c0Vsc2V3aGVyZSgpPy4odGhpcy5jb21wb25lbnQpID8/IE5PX1ZBTFVFX0tFWVM7XG5cbiAgQFZpZXdDaGlsZChDb21wb25lbnRDaGFydENvbXBvbmVudClcbiAgcHVibGljIGNoYXJ0Q29tcG9uZW50OiBDb21wb25lbnRDaGFydENvbXBvbmVudDtcblxuICAvLyBSZXNpemUgaGFuZGxlcyBieSB0eXBlOiBhIGZpeGVkLWhlaWdodCBjb21wb25lbnQgKGNoYXJ0L2xpc3QpXG4gIC8vIGdldHMgYWxsIGVpZ2h0IChyZXNpemUgd2lkdGggQU5EIGhlaWdodCk7IGFuIGF1dG8taGVpZ2h0IG9uZSAoa3BpKSBnZXRzXG4gIC8vIG9ubHkgdGhlIHNpZGUgaGFuZGxlcyBzaW5jZSBpdHMgaGVpZ2h0IGZpdHMgaXRzIGNvbnRlbnQgYW5kIGNhbid0IGJlIHNldC5cbiAgcHVibGljIGdldCByZXNpemVIYW5kbGVzKCk6IHJlYWRvbmx5IEhhbmRsZVtdIHtcbiAgICByZXR1cm4gdGhpcy5faGVpZ2h0QXV0byA/IFsnZScsICd3J10gOiBIQU5ETEVTO1xuICB9XG5cbiAgLy8gVGhlIGNvbXBvbmVudCdzIGhlYWRlciBJUyBhbiBmcy1maWx0ZXI6IGhlYWRpbmcgdGVtcGxhdGUgPSBpdHMgdGl0bGUgKGFuZFxuICAvLyB0aGUgZHJhZyBoYW5kbGUpLCBhY3Rpb25zID0gdGhlIFNldHRpbmdzIC8gZmlsdGVyLXRvZ2dsZXMgLyBFeHBvcnQgbWVudSxcbiAgLy8gaXRlbXMgPSBpdHMgY29tcG9uZW50LWxldmVsIGZpbHRlciBncm91cHMsIGZvciBldmVyeSBjb21wb25lbnQgdHlwZSwgbGlzdHNcbiAgLy8gaW5jbHVkZWQsIHBsdXMgYSBsaXN0J3Mgc2VhcmNoIGJveC4gUmVidWlsdCB3aGVuIGEgZmlsdGVyIHRvZ2dsZSBjaGFuZ2VzIHdoaWNoIGdyb3VwcyBzaG93LFxuICAvLyBhbmQgd2hlbiB0aGUgc2V0dGluZ3MgZGlhbG9nIGNoYW5nZXMgdGhlIHRpdGxlIG9yIHBhZGRpbmc6IHNldHRpbmcgaXRcbiAgLy8gcmVwYWludHMgdGhlIGhlYWRlciBhbmQgYm9keS5cbiAgcHVibGljIHJlYWRvbmx5IGZpbHRlckNvbmZpZyA9IHNpZ25hbDxGaWx0ZXJDb25maWcgfCBudWxsPihudWxsKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgZGF0YSA9IHNpZ25hbDxDb21wb25lbnREYXRhIHwgbnVsbD4obnVsbCk7XG4gIC8vIEEgbG9hZCBzaG93cyBhIHNwaW5uZXIgY2VudHJlZCBvbiB0aGUgdGlsZS4gYGxvYWRpbmdgIGlzIHRoZSBmaXJzdCBsb2FkLFxuICAvLyB3aXRoIG5vdGhpbmcgdG8gc2hvdyB5ZXQ7IGEgcmVmZXRjaCBrZWVwcyB0aGUgZGF0YSBvbiBzY3JlZW4sIGRpbW1lZFxuICAvLyB1bmRlciB0aGUgc3Bpbm5lciAoYHJlZnJlc2hpbmdgKS4gVGhlIHRpdGxlIGlzIG5ldmVyIGRpbW1lZC5cbiAgcHVibGljIHJlYWRvbmx5IGxvYWRpbmcgPSBzaWduYWwoZmFsc2UpO1xuICBwdWJsaWMgcmVhZG9ubHkgcmVmcmVzaGluZyA9IHNpZ25hbChmYWxzZSk7XG4gIHB1YmxpYyByZWFkb25seSBlcnJvciA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAvLyBXaGljaCBvZiBhIGNoYXJ0J3MgbGVnZW5kIGVudHJpZXMgYXJlIG9uLCBieSBzZXJpZXMgbmFtZS4gSGVsZCBoZXJlIGFuZFxuICAvLyBoYW5kZWQgdG8gZWFjaCBvcHRpb24gdGhlIGNoYXJ0IGJ1aWxkczogbmd4LWVjaGFydHMgc2V0cyBhbiBvcHRpb24gd2l0aFxuICAvLyBub3RNZXJnZSwgd2hpY2ggd291bGQgb3RoZXJ3aXNlIHR1cm4gZXZlcnkgZW50cnkgYmFjayBvbiBhdCBlYWNoIHJlZmV0Y2guXG4gIHB1YmxpYyByZWFkb25seSBsZWdlbmRTZWxlY3RlZCA9IHNpZ25hbDxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj4+KHt9KTtcblxuICAvLyBBIGxpc3QgaXMgZHJhd24gYWdhaW4gd2hlbiBhIHJlc2V0IG1vdmVzIGl0cyBzb3J0OiBGc0xpc3QgcmVhZHMgaXRzIHNvcnRcbiAgLy8gb25seSB3aGVuIGl0IGlzIGNyZWF0ZWQuIEV2ZXJ5IG90aGVyIHJlc2V0IHJlbG9hZHMgaXQgaW4gcGxhY2UuXG4gIHB1YmxpYyByZWFkb25seSBsaXN0UmVzZXRLZXkgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9maWx0ZXJTdGF0ZS5saXN0U29ydFJlc2V0cygpLmdldCh0aGlzLmNvbXBvbmVudD8uaWQpID8/IDApO1xuXG4gIC8vIFdoYXQgYSBjbGljayBvbiB0aGlzIHRpbGUncyBtYXJrcyBtYXkgZG8gb24gaXRzIGxhc3QgYW5zd2VyOiB0aGUgY2hhcnRcbiAgLy8gc2hvd3MgYSBoYW5kIGFuZCBhIHRvb2x0aXAgaGludCBmb3IgdGhlbS4gKFdoaWxlIHRoZSBsYXlvdXQgaXMgZWRpdGVkIGFcbiAgLy8gdmVpbCBjb3ZlcnMgdGhlIGJvZHksIHNvIG5vIG1hcmsgaXMgaG92ZXJlZCBvciBjbGlja2VkLilcbiAgcHVibGljIHJlYWRvbmx5IHRpbGVBY3Rpb25zID0gY29tcHV0ZWQ8UmVwb3J0TWFya0FjdGlvbltdPigoKSA9PiB0aWxlTWFya0FjdGlvbnMoe1xuICAgIGRhdGE6IHRoaXMuZGF0YSgpLFxuICAgIGZlYXR1cmVzOiB0aGlzLl9vZmZlcmVkRmVhdHVyZXMoKSxcbiAgfSkpO1xuXG4gIC8vIFRoZSBhY3Rpb25zIHRoZSBtYXJrIG1lbnUgbGlzdHMgZm9yIHRoZSBjbGljayBpdCB3YXMgb3BlbmVkIG9uLlxuICBwdWJsaWMgcmVhZG9ubHkgbWFya01lbnVBY3Rpb25zID0gc2lnbmFsPFJlcG9ydE1hcmtBY3Rpb25bXT4oW10pO1xuICBwdWJsaWMgcmVhZG9ubHkgbWFya0FjdGlvbkxhYmVscyA9IE1BUktfQUNUSU9OX0xBQkVMUztcblxuICAvLyBUaGUgYnJlYWRjcnVtYiBhZnRlciB0aGUgdGl0bGUgd2hpbGUgdGhlIGNoYXJ0IGlzIGRyaWxsZWQgKCcyMDI2JywgJ1EzJyksXG4gIC8vIG9uZSBsYWJlbCBwZXIgc3RlcCBvZiBpdHMgcGF0aCwgaW4gdGhlIHJlcG9ydCdzIGxvY2FsZS4gRW1wdHkgYXQgdGhlIHRvcFxuICAvLyBhbmQgd2hpbGUgdGhlIHZpZXdlciBpcyBub3Qgb2ZmZXJlZCBkcmlsbDogYSBwYXRoIGFuIG9sZGVyIHNlcnZlciBuZXZlclxuICAvLyBhcHBsaWVzIGlzIGtlcHQgaW4gdGhlIHN0YXRlLCBidXQgbm90IHNob3duLlxuICBwdWJsaWMgcmVhZG9ubHkgZHJpbGxDcnVtYnMgPSBjb21wdXRlZDxzdHJpbmdbXT4oKCkgPT4gKHRoaXMuX29mZmVyZWRGZWF0dXJlcygpLmluY2x1ZGVzKCdkcmlsbCcpXG4gICAgPyBkcmlsbENydW1iTGFiZWxzKHRoaXMuX2ZpbHRlclN0YXRlLmRyaWxsKHRoaXMuY29tcG9uZW50Py5pZCksIHRoaXMuX2ZpbHRlclN0YXRlLmZvcm1hdENvbnRleHQoKSlcbiAgICA6IFtdKSk7XG4gIHB1YmxpYyByZWFkb25seSBkcmlsbFNlcGFyYXRvciA9IERSSUxMX0NSVU1CX1NFUEFSQVRPUjtcblxuICAvLyBXaGF0IGFuIGVtcHR5IHRpbGUgc2F5czogdGhlIGRyaWxsZWQgcGVyaW9kIGl0IHJlYWRzIG5vIGRheSBvZiwgZWxzZVxuICAvLyAnTm8gZGF0YScuXG4gIHB1YmxpYyByZWFkb25seSBlbXB0eU1lc3NhZ2UgPSBjb21wdXRlZCgoKSA9PiBkcmlsbE91dHNpZGVNZXNzYWdlKFxuICAgIHRoaXMuZGF0YSgpPy5kcmlsbCxcbiAgICB0aGlzLl9maWx0ZXJTdGF0ZS5mb3JtYXRDb250ZXh0KCksXG4gICkgPz8gJ05vIGRhdGEnKTtcblxuICBAVmlld0NoaWxkKCdtYXJrTWVudScpXG4gIHB1YmxpYyBtYXJrTWVudTogRnNNZW51Q29tcG9uZW50O1xuXG4gIEBWaWV3Q2hpbGQoJ21hcmtBbmNob3InKVxuICBwdWJsaWMgbWFya0FuY2hvcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfdGV4dCA9IHZpZXdDaGlsZChDb21wb25lbnRUZXh0Q29tcG9uZW50KTtcbiAgcHJpdmF0ZSBfcmVmcmVzaCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAvLyBUaGUgc3RhdGUgdmVyc2lvbiB0aGUgaGVhZGVyIHdhcyBsYXN0IGJ1aWx0IGZvciAoZmlsdGVyS2V5KS5cbiAgcHJpdmF0ZSByZWFkb25seSBfaGVhZGVyVmVyc2lvbiA9IHNpZ25hbCgwKTtcbiAgLy8gVGhlIGhlYWRlciBncm91cHMnIHZhbHVlcyBhcyB0aGUgaGVhZGVyIGxhc3Qgc2hvd2VkIHRoZW06IGFzIGl0IHdhc1xuICAvLyBidWlsdCwgdGhlbiBhcyBpdHMgb3duIGJhciByZXBvcnRlZCBlYWNoIGNoYW5nZS4gZmlsdGVyS2V5IGNhcnJpZXMgdGhlaXJcbiAgLy8gc2lnbmF0dXJlIGFzIGJ1aWx0LlxuICBwcml2YXRlIF9zaG93biA9IG5ldyBNYXA8bnVtYmVyLCBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbD4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfaGVhZGVyVmFsdWVzID0gc2lnbmFsKCcnKTtcbiAgcHJpdmF0ZSBfcmVwb3J0RGF0YSA9IGluamVjdChSZXBvcnREYXRhKTtcbiAgcHJpdmF0ZSBfZmlsdGVyU3RhdGUgPSBpbmplY3QoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfZmlsdGVyT3B0aW9ucyA9IGluamVjdChSZXBvcnRGaWx0ZXJPcHRpb25zU2VydmljZSk7XG4gIHByaXZhdGUgX3Byb2Nlc3MgPSBpbmplY3QoRnNQcm9jZXNzKTtcbiAgcHJpdmF0ZSBfbWVzc2FnZSA9IGluamVjdChGc01lc3NhZ2UpO1xuICBwcml2YXRlIF9wcm9tcHQgPSBpbmplY3QoRnNQcm9tcHQpO1xuICBwcml2YXRlIF9kaWFsb2cgPSBpbmplY3QoTWF0RGlhbG9nKTtcbiAgcHJpdmF0ZSBfbGFzdFByZXNzID0gMDtcbiAgcHJpdmF0ZSBfZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgcHJpdmF0ZSBfem9uZSA9IGluamVjdChOZ1pvbmUpO1xuICBwcml2YXRlIF9ob3N0OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PiA9IGluamVjdChFbGVtZW50UmVmKTtcbiAgLy8gVGhlIGZlYXR1cmVzIGEgbWFyayBhY3Rpb24gbmVlZHM6IHNlcnZlZCBieSB0aGUgcmVwb3J0J3Mgc2VydmVyIGFuZFxuICAvLyBpbXBsZW1lbnRlZCBieSB0aGlzIHZpZXdlci5cbiAgcHJpdmF0ZSByZWFkb25seSBfb2ZmZXJlZEZlYXR1cmVzID0gY29tcHV0ZWQoKCkgPT4gb2ZmZXJlZFZpZXdlckZlYXR1cmVzKHRoaXMuX2ZpbHRlclN0YXRlLnZpZXdlckZlYXR1cmVzKCkpKTtcbiAgLy8gVGhlIG1hcmsgYSBmaXJzdCB0YXAgcHJldmlld2VkIChkZWNpZGVNYXJrQ2xpY2spLCBhbmQgdGhlIGNsaWNrIHRoZSBtYXJrXG4gIC8vIG1lbnUgaXMgb3BlbiBmb3IuXG4gIHByaXZhdGUgX3RvdWNoZWRNYXJrOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfbWVudUNsaWNrOiBSZXBvcnRNYXJrQ2xpY2sgfCBudWxsID0gbnVsbDtcbiAgLy8gVGhlIGdyb3VwLWJ5IG1vdmVkIHNpbmNlIHRoZSBsYXN0IGFuc3dlcjogYSBwYXRoIHRoZSBzZXJ2ZXIgdGhlbiBkcm9wc1xuICAvLyBiZWNhdXNlIGl0IG5vIGxvbmdlciBzdGFydHMgYXQgdGhlIGNoYXJ0J3MgdG9wIGlzIG5vdCBuZXdzIHRvIHRoZSB2aWV3ZXIuXG4gIHByaXZhdGUgX2dyYWluTW92ZWQgPSBmYWxzZTtcblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fYnVpbGRGaWx0ZXJDb25maWcoKTtcblxuICAgIGlmICghdGhpcy5pc1RleHQpIHtcbiAgICAgIHRoaXMuX3JlYnVpbGRIZWFkZXJPbk5ld1N0YXRlKCk7XG4gICAgfVxuXG4gICAgLy8gTGlzdHMgZmV0Y2ggdGhyb3VnaCBGc0xpc3QgYW5kIGdyaWRzIHRocm91Z2ggZnMtZ3JpZCdzIHNvdXJjZSAoZWFjaFxuICAgIC8vIHJlYWRzIGl0cyBvd24gcm93cyk7IHRleHQgaGFzIG5vdGhpbmcgdG8gZmV0Y2gsIGFuZCBhIHZhbHVlIGlzIG5ldmVyXG4gICAgLy8gZHJhd24gKGl0IHJlYWRzIGluc2lkZSB0ZXh0KS5cbiAgICBpZiAoIVNFTEZfUkVBRElOR19UWVBFUy5pbmNsdWRlcyh0aGlzLmNvbXBvbmVudC50eXBlKSAmJiAhdGhpcy5pc1RleHQgJiYgaXNEcmF3bih0aGlzLmNvbXBvbmVudCkpIHtcbiAgICAgIC8vIE9uZSBsb2FkIHN0cmVhbSAodGlsZUxvYWRzKTogdGhlIGZpcnN0IGxvYWQgYXQgb25jZSwgdGhlbiBvbmUgcGVyXG4gICAgICAvLyBzZXR0bGVkIHN3ZWVwIG9mIGNoYW5nZXMsIGVhY2ggY2FuY2VsbGluZyB0aGUgb25lIGluIGZsaWdodCwgYW5kIGFuXG4gICAgICAvLyBhbnN3ZXIgc2VudCBiZWZvcmUgYSByZXNldCBpcyBkcm9wcGVkLlxuICAgICAgdGlsZUxvYWRzKHRoaXMuX3JlZnJlc2gkLCAoKSA9PiB0aGlzLl9sb2FkKCksICgpID0+IHRoaXMuX2ZpbHRlclN0YXRlLnN0YXRlVmVyc2lvbigpKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YXAoKHJlc3VsdCkgPT4gdGhpcy5fbG9hZGVkKHJlc3VsdCkpLFxuICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLmNoYW5nZXNGb3IodGhpcy5jb21wb25lbnQpXG4gICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9yZWZyZXNoJC5uZXh0KCkpO1xuXG4gICAgICAvLyBBIGdyb3VwLWJ5IGNoYW5nZSByZS1idWNrZXRzIGV2ZXJ5IHRpbWUtc2VyaWVzIGNoYXJ0OyBpdCBpc24ndCBzY29wZWRcbiAgICAgIC8vIHRvIGEgZmlsdGVyIGdyb3VwLCBzbyBpdCByaWRlcyBpdHMgb3duIHN0cmVhbS5cbiAgICAgIGlmICh0aGlzLl9pc1RpbWVTZXJpZXMpIHtcbiAgICAgICAgdGhpcy5fZmlsdGVyU3RhdGUuZnJlcXVlbmN5Q2hhbmdlcygpXG4gICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fZ3JhaW5Nb3ZlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9yZWZyZXNoJC5uZXh0KCk7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEEgZHJpbGwgbW92ZXMgdGhpcyBjaGFydCBhbG9uZS5cbiAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLmRyaWxsQ2hhbmdlcyh0aGlzLmNvbXBvbmVudC5pZClcbiAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuX3JlZnJlc2gkLm5leHQoKSk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIHJlcG9ydCByZWxvYWRzIChlLmcuIGFmdGVyIHRoZSBzZXR0aW5ncyBkaWFsb2cgYWRkcy9tb3ZlcyBhIGZpbHRlcilcbiAgLy8gaGFuZCB0aGlzIGluc3RhbmNlIGZyZXNoIGBjb21wb25lbnRgL2Bncm91cHNgIGlucHV0cyB3aXRob3V0IHJlLXJ1bm5pbmdcbiAgLy8gbmdPbkluaXQuIFJlYnVpbGQgdGhlIGhlYWRlciBjb25maWcgc28gdGhlIGlubGluZSBjb21wb25lbnQtZmlsdGVyIHN0cmlwXG4gIC8vIHJlZmxlY3RzIHRoZSBuZXcgZmlsdGVyczsgdGhlIHRlbXBsYXRlIHJlY3JlYXRlcyB0aGUgZnMtZmlsdGVyIHZpYVxuICAvLyBgZmlsdGVyS2V5YCBzbyBpdCBhY3R1YWxseSByZS1yZWFkcyB0aGlzIGNvbmZpZy5cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvLyBDbGlja2luZyBhd2F5IChkZXNlbGVjdCkgb3IgbGVhdmluZyBlZGl0IG1vZGUgY2xvc2VzIGFuIG9wZW4gdGV4dCBlZGl0b3IsXG4gICAgLy8gd2hpY2ggaXMgd2hhdCBzYXZlcyBpdC5cbiAgICBpZiAoKGNoYW5nZXMuc2VsZWN0ZWQgJiYgIXRoaXMuc2VsZWN0ZWQpIHx8IChjaGFuZ2VzLmVkaXRNb2RlICYmICF0aGlzLmVkaXRNb2RlKSkge1xuICAgICAgdGhpcy50ZXh0RWRpdGluZy5zZXQoZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIEEgbmV3IGNvbXBvbmVudCBvYmplY3QgY2FycmllcyBpdHMgb3duIHN0b3JlZCBodG1sLlxuICAgIGlmIChjaGFuZ2VzLmNvbXBvbmVudCAmJiAhY2hhbmdlcy5jb21wb25lbnQuZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMudGV4dEh0bWwuc2V0KG51bGwpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlcnNDaGFuZ2VkID0gKGNoYW5nZXMuY29tcG9uZW50ICYmICFjaGFuZ2VzLmNvbXBvbmVudC5maXJzdENoYW5nZSlcbiAgICAgIHx8IChjaGFuZ2VzLmdyb3VwcyAmJiAhY2hhbmdlcy5ncm91cHMuZmlyc3RDaGFuZ2UpO1xuXG4gICAgaWYgKGZpbHRlcnNDaGFuZ2VkKSB7XG4gICAgICB0aGlzLl9idWlsZEZpbHRlckNvbmZpZygpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGZzLWZpbHRlciByZWFkcyBpdHMgY29uZmlnIG9ubHkgb25jZSBhdCBpbml0LCBzbyB0aGUgaGVhZGVyIGlzIGtleWVkIG9uIHdoYXRcbiAgLy8gaXQgcmVuZGVycyB0aGF0IG5vIHNpZ25hbCBjYXJyaWVzOiB0aGUgc2V0IG9mIGNvbXBvbmVudC1sZXZlbCBmaWx0ZXIgZ3JvdXBzXG4gIC8vIEFORCB0aGUgc3RvcmVkIHRpdGxlLCB3aGljaCBsaXZlcyBpbiBmcy1maWx0ZXIncyBoZWFkaW5nIHRlbXBsYXRlLiBmcy1maWx0ZXJcbiAgLy8gaXMgT25QdXNoIGFuZCB0aGUgaGVhZGluZyBpcyByZW5kZXJlZCBpbnNpZGUgSVRTIHZpZXcsIHNvIG1hcmtpbmcgdGhpc1xuICAvLyBjb21wb25lbnQgZG9lcyBub3QgcmVwYWludCBhIG5ldyB0aXRsZSDigJQgcmVjcmVhdGluZyB0aGUgYmxvY2sgZG9lcywgb25jZSBhXG4gIC8vIHNldHRpbmdzIHNhdmUgaGFzIHJlYnVpbHQgdGhlIGNvbmZpZy4gV2hhdCBmaWxscyB0aGUgdGl0bGUncyB0b2tlbnMgaXNcbiAgLy8gYW5vdGhlciBtYXR0ZXI6IHNlZSBzaG93blRpdGxlLiBUaGUga2V5IGFsc28gY2FycmllcyB0aGUgc3RhdGUgdmVyc2lvblxuICAvLyB0aGUgaGVhZGVyIHdhcyBidWlsdCBmb3IsIHNvIGFuIGFwcGxpZWQgdmlldywgd2hpY2ggcmVwbGFjZXMgZXZlcnkgdmFsdWVcbiAgLy8gYXQgb25jZSwgcmVjcmVhdGVzIGl0IHdpdGggdGhlIG5ldyB2YWx1ZXMuIEFuZCBpdCBjYXJyaWVzIHRoZSB2YWx1ZXMgdGhlXG4gIC8vIGhlYWRlciB3YXMgYnVpbHQgd2l0aDogYSBncm91cCBzaG93biBoZXJlIGFuZCBpbiB0aGUgcmVwb3J0IGJhciAobGV2ZWxcbiAgLy8gJ2JvdGgnKSB0aGF0IHRoZSByZXBvcnQgYmFyIGNoYW5nZXMgaXMgYnVpbHQgYWdhaW4gaGVyZSwgc28gdGhlIGhlYWRlclxuICAvLyBuZXZlciBzaG93cyAnV2VzdCcgd2hpbGUgdGhlIGRhdGEgbGVhdmVzIFdlc3Qgb3V0LlxuICBwdWJsaWMgZ2V0IGZpbHRlcktleSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBbXG4gICAgICB0aGlzLl9oZWFkZXJWZXJzaW9uKCksXG4gICAgICB0aGlzLmNvbXBvbmVudC50aXRsZSxcbiAgICAgIC4uLnRoaXMuY29tcG9uZW50RmlsdGVyR3JvdXBzLm1hcCgoZ3JvdXApID0+IGAke2dyb3VwLmlkfToke2dyb3VwLmxldmVsfWApLFxuICAgICAgdGhpcy5faGVhZGVyVmFsdWVzKCksXG4gICAgXS5qb2luKCd8Jyk7XG4gIH1cblxuICAvLyBUaGUgdGl0bGUgYXMgdGhlIHZpZXdlciByZWFkcyBpdDogaXRzIHBhZ2UsIHJlcG9ydCBhbmQgZmlsdGVyIGZpZWxkcyBmaWxsZWRcbiAgLy8gd2l0aCB0aGUgdG9rZW5zIG9mIHRoZSBsYXllciBpdCBpcyBkcmF3biBvbiAoJ1NpZ24tdXBzIOKAlCBTZXB0ZW1iZXIgMjAyNicpLlxuICAvLyBUaGUgaGVhZGVyIHJlYWRzIGl0LCBhbmQgdGhlIENTViBleHBvcnQgbmFtZXMgaXRzIGZpbGUgYWZ0ZXIgaXQuIFRoZVxuICAvLyB0b2tlbnMgYXJlIGEgc2lnbmFsLCByZWFkIGluc2lkZSBmcy1maWx0ZXIncyBoZWFkaW5nLCBzbyBhIGZpbHRlciBjaGFuZ2VcbiAgLy8gcmVwYWludHMgdGhlIHRpdGxlIGluIHBsYWNlIHJhdGhlciB0aGFuIHRocm91Z2ggZmlsdGVyS2V5OiBhIHJlY3JlYXRlZFxuICAvLyBoZWFkZXIgd291bGQgbG9zZSB3aGF0IHRoZSB2aWV3ZXIgaXMgZG9pbmcgaW4gaXRzIG93biBmaWx0ZXJzIChhIHBpY2tcbiAgLy8gbGFuZGluZywgYSBoYWxmLXR5cGVkIGtleXdvcmQsIGFuIG9wZW4gcGlja2VyKSwgYW5kIGVhY2ggZmlsdGVyIGluIGl0XG4gIC8vIHdvdWxkIHNob3cgdGhlIHZhbHVlIGl0IHdhcyBidWlsdCB3aXRoLlxuICBwdWJsaWMgZ2V0IHNob3duVGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZmlsbFRpdGxlVG9rZW5zKHRoaXMuY29tcG9uZW50LnRpdGxlLCB0aGlzLnRva2VucygpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNUZXh0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudC50eXBlID09PSAndGV4dCc7XG4gIH1cblxuICAvLyBPcGVuIHRoZSB0ZXh0IGVkaXRvciBpbiBwbGFjZS5cbiAgcHVibGljIGVkaXRUZXh0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lZGl0TW9kZSB8fCAhdGhpcy5pc1RleHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdENvbXBvbmVudC5lbWl0KHRoaXMuY29tcG9uZW50LmlkKTtcbiAgICB0aGlzLnRleHRFZGl0aW5nLnNldCh0cnVlKTtcbiAgfVxuXG4gIC8vIFRha2UgYSBkZWxldGVkIHZhbHVlJ3MgY2hpcHMgb3V0IG9mIHRoZSB0ZXh0J3Mgb3BlbiBlZGl0b3IuXG4gIHB1YmxpYyByZW1vdmVWYWx1ZShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX3RleHQoKT8ucmVtb3ZlVmFsdWUoa2V5KTtcbiAgfVxuXG4gIC8vIFRoZSBlZGl0b3IgY2xvc2VkIHdpdGggY2hhbmdlZCBodG1sLiBLZXB0IGxvY2FsbHkgYXQgb25jZSBzbyB0aGUgYmxvY2tcbiAgLy8gcmUtcmVuZGVycyB3aGF0IHdhcyB0eXBlZCwgdGhlbiByZXBsYWNlZCBieSB3aGF0IHRoZSBzZXJ2ZXIgc3RvcmVkOiBpdFxuICAvLyByZWJ1aWxkcyB0aGUgaHRtbCBmcm9tIGl0cyBhbGxvd2xpc3QgYW5kIGRyb3BzIGFueSB2YWx1ZSB0b2tlbiBpdHMgcGFnZSBoYXNcbiAgLy8gbm8gdmFsdWUgZm9yLCBzbyB0aGUgYmxvY2sgbmV2ZXIgaG9sZHMgYSB0b2tlbiB0aGUgc2VydmVyIGRvZXNuJ3QuXG4gIHB1YmxpYyBvblRleHRTYXZlZChodG1sOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXRUZXh0SHRtbChodG1sKTtcbiAgICB0aGlzLl9yZXBvcnREYXRhLnVwZGF0ZUNvbXBvbmVudCh0aGlzLnJlcG9ydElkLCB0aGlzLmNvbXBvbmVudC5pZCwgeyBodG1sIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4gKHR5cGVvZiByZXNwb25zZT8uY29uZmlnPy5odG1sID09PSAnc3RyaW5nJyA/IHJlc3BvbnNlLmNvbmZpZy5odG1sIGFzIHN0cmluZyA6IGh0bWwpKSxcbiAgICAgICAgdGFwKChzdG9yZWQpID0+IHtcbiAgICAgICAgICB0aGlzLl9zZXRUZXh0SHRtbChzdG9yZWQpO1xuICAgICAgICAgIHRoaXMudGV4dFNhdmVkLmVtaXQoc3RvcmVkKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8vIFRoZSBzZXJ2ZXIgZGVsZXRlcyB0aGUgdGV4dCBhbmQgdGhlbiBldmVyeSB2YWx1ZSBvbiBpdHMgcGFnZSB0aGF0IG5vIG90aGVyXG4gIC8vIHRleHQgc2hvd3MsIGFuZCBhbnN3ZXJzIHdpdGggdGhlaXIgaWRzLlxuICBwdWJsaWMgZGVsZXRlVGV4dCgpOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZXNOb3RlID0gdmFsdWVLZXlzKHRoaXMuY29tcG9uZW50LmNvbmZpZz8uaHRtbCkubGVuZ3RoXG4gICAgICA/ICcgVmFsdWVzIG5vIG90aGVyIHRleHQgb24gdGhpcyBwYWdlIHVzZXMgYXJlIGRlbGV0ZWQgd2l0aCBpdC4nXG4gICAgICA6ICcnO1xuXG4gICAgdGhpcy5fcHJvbXB0LmNvbmZpcm0oe1xuICAgICAgdGl0bGU6ICdDb25maXJtJyxcbiAgICAgIHRlbXBsYXRlOiBgQXJlIHlvdSBzdXJlIHlvdSB3b3VsZCBsaWtlIHRvIGRlbGV0ZSB0aGlzIHRleHQ/JHt2YWx1ZXNOb3RlfWAsXG4gICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5fcmVwb3J0RGF0YS5kZWxldGVDb21wb25lbnQodGhpcy5yZXBvcnRJZCwgdGhpcy5jb21wb25lbnQuaWQpKSxcbiAgICAgICAgdGFwKChyZXNwb25zZTogeyByZW1vdmVkVmFsdWVzPzogbnVtYmVyW10gfSkgPT4ge1xuICAgICAgICAgIGlmIChyZXNwb25zZT8ucmVtb3ZlZFZhbHVlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlc1JlbW92ZWQuZW1pdChyZXNwb25zZS5yZW1vdmVkVmFsdWVzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5yZW1vdmVkLmVtaXQodGhpcy5jb21wb25lbnQuaWQpO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCB0cnVuY2F0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5kYXRhKCk/LnRydW5jYXRlZDtcbiAgfVxuXG4gIC8vIENvbnRlbnQgcGFkZGluZyAodGhlIGNhbnZhcyB6b29tIHNjYWxlcyB0aGUgcGFnZSBhcyBhIHdob2xlKS4gRWFjaCBlZGdlXG4gIC8vIGRlZmF1bHRzIHRvIDEvOFwiLlxuICBwdWJsaWMgZ2V0IGJvZHlQYWRkaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNvbXBvbmVudFBhZGRpbmdDc3ModGhpcy5jb21wb25lbnQpO1xuICB9XG5cbiAgLy8gVGhlIGNvbXBvbmVudC1sZXZlbCBmaWx0ZXIgZ3JvdXBzIHRoYXQgc2hvdWxkIHJlbmRlciBhcyBhbiBpbmxpbmUgY29udHJvbFxuICAvLyBzdHJpcCBvbiBUSElTIGNvbXBvbmVudDogYSBncm91cCBpcyBpbmNsdWRlZCB3aGVuIGl0J3MgbGV2ZWw9Y29tcG9uZW50IGFuZFxuICAvLyBoYXMgYW4gZW5hYmxlZCwgc2Vzc2lvbi1vbiBmaWx0ZXIgaGVyZS4gUmVwb3J0LWxldmVsIGdyb3VwcyBsaXZlIGluIHRoZVxuICAvLyB0b3AgYmFyIGluc3RlYWQuIExpc3RzIHVzZSB0aGlzIHN0cmlwIGxpa2UgY2hhcnRzIGRvOiBhIHZhbHVlIHNldCBoZXJlIGlzXG4gIC8vIHRoZSBncm91cCdzIHZhbHVlLCBzbyBpdCByZWFjaGVzIGV2ZXJ5IGNvbXBvbmVudCBpbiB0aGUgZ3JvdXAuXG4gIHB1YmxpYyBnZXQgY29tcG9uZW50RmlsdGVyR3JvdXBzKCk6IFJlcG9ydEZpbHRlckdyb3VwW10ge1xuICAgIGlmICghdGhpcy5ncm91cHMpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBncm91cElkcyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIHRoaXMuY29tcG9uZW50LmZpbHRlcnMgPz8gW10pIHtcbiAgICAgIGlmICghZmlsdGVyLmVuYWJsZWQgfHwgdGhpcy5fZmlsdGVyU3RhdGUuaXNGaWx0ZXJEaXNhYmxlZChmaWx0ZXIuaWQpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLmdyb3Vwcy5nZXQoZmlsdGVyLmZpbHRlckdyb3VwSWQpO1xuICAgICAgaWYgKGdyb3VwICYmIChncm91cC5sZXZlbCA9PT0gJ2NvbXBvbmVudCcgfHwgZ3JvdXAubGV2ZWwgPT09ICdib3RoJykpIHtcbiAgICAgICAgZ3JvdXBJZHMuYWRkKGdyb3VwLmlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gWy4uLmdyb3VwSWRzXS5tYXAoKGlkKSA9PiB0aGlzLmdyb3Vwcy5nZXQoaWQpKS5maWx0ZXIoQm9vbGVhbik7XG4gIH1cblxuICBwdWJsaWMgc2V0dGluZ3MoKTogdm9pZCB7XG4gICAgdGhpcy5vcGVuU2V0dGluZ3MuZW1pdCh0aGlzLmNvbXBvbmVudCk7XG4gIH1cblxuICAvLyBXaGV0aGVyIHRoZSBtZW51IG9mZmVycyBDb2x1bW5zOiBhIHBsYWluIGxpc3Qgd2l0aCBtb3JlIHRoYW4gb25lXG4gIC8vIGNvbmZpZ3VyZWQgY29sdW1uLiBBIGNyb3NzLXRhYidzIGNvbHVtbnMgY29tZSBhbmQgZ28gd2l0aCB0aGUgZGF0YS5cbiAgcHVibGljIGdldCBoaWRlc0NvbHVtbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50LnR5cGUgPT09ICdsaXN0JyAmJiBsaXN0SGlkZWFibGVDb2x1bW5zKHRoaXMuY29tcG9uZW50LmNvbmZpZykubGVuZ3RoID4gMTtcbiAgfVxuXG4gIC8vIFdoaWNoIG9mIGEgcGxhaW4gbGlzdCdzIGNvbHVtbnMgc2hvdy4gVGhlIGNob2ljZSBpcyB0aGUgdmlld2VyJ3MgKGtlcHQgaW5cbiAgLy8gdGhlIHJlcG9ydCdzIHN0YXRlLCBuZXZlciBzYXZlZCB0byB0aGUgcmVwb3J0KSwgYW5kIHRoZVxuICAvLyBsaXN0IGhpZGVzIHRoZSBjb2x1bW5zIGluIHBsYWNlLCB3aXRoIG5vIHJlZmV0Y2guXG4gIHB1YmxpYyBjaG9vc2VDb2x1bW5zKCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbHVtbnMgPSAodGhpcy5jb21wb25lbnQuY29uZmlnPy5jb2x1bW5zID8/IFtdKVxuICAgICAgLm1hcCgoY29sdW1uKSA9PiAoeyBjb2x1bW46IGNvbHVtbi5jb2x1bW4sIGxhYmVsOiBjb2x1bW4ubGFiZWwgfHwgY29sdW1uLmNvbHVtbiB9KSk7XG5cbiAgICB0aGlzLl9kaWFsb2cub3BlbjxMaXN0Q29sdW1uc0NvbXBvbmVudCwgTGlzdENvbHVtbnNEaWFsb2dEYXRhLCBzdHJpbmdbXT4oTGlzdENvbHVtbnNDb21wb25lbnQsIHtcbiAgICAgIGRhdGE6IHsgY29sdW1ucywgaGlkZGVuOiBbLi4udGhpcy5fZmlsdGVyU3RhdGUuaGlkZGVuQ29sdW1ucyh0aGlzLmNvbXBvbmVudC5pZCldIH0sXG4gICAgICB3aWR0aDogJzQwMHB4JyxcbiAgICAgIG1heFdpZHRoOiAnOTV2dycsXG4gICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgIH0pXG4gICAgICAuYWZ0ZXJDbG9zZWQoKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoaGlkZGVuKSA9PiB7XG4gICAgICAgIC8vIENhbmNlbCBjbG9zZXMgd2l0aCBub3RoaW5nLCB3aGljaCBjaGFuZ2VzIG5vdGhpbmcuXG4gICAgICAgIGlmIChoaWRkZW4pIHtcbiAgICAgICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRIaWRkZW5Db2x1bW5zKHRoaXMuY29tcG9uZW50LmlkLCBoaWRkZW4pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIFByZXNlbnRhdGlvbiBzZXR0aW5ncyBzYXZlZCBmcm9tIHRoZSBzZXR0aW5ncyBkaWFsb2cuIFRpdGxlIGFuZCBwYWRkaW5nIGFyZVxuICAvLyBub3QgcGFydCBvZiB0aGUgcXVlcnksIHNvIHRoZSBkYXRhIGFscmVhZHkgZmV0Y2hlZCBzdGlsbCBzdGFuZHMg4oCUIHRoaXMgb25seVxuICAvLyByZXBhaW50cy4gVGhlIGhlYWRlciBjb25maWcgaXMgcmVidWlsdCBiZWNhdXNlIGBmaWx0ZXJLZXlgIGNoYW5nZXMgd2l0aCB0aGVcbiAgLy8gdGl0bGUgYW5kIHJlY3JlYXRlcyB0aGUgZnMtZmlsdGVyIGJsb2NrIGFyb3VuZCBpdDsgc2V0dGluZyB0aGUgY29uZmlnIHNpZ25hbFxuICAvLyBpcyBhbHNvIHdoYXQgcmVwYWludHMgdGhlIG5ldyBwYWRkaW5nLiBUaGUgY2hhcnQgZm9sbG93cyBpdHMgYm94IG9uIGl0cyBvd25cbiAgLy8gKG5neC1lY2hhcnRzIG9ic2VydmVzIHRoZSBob3N0KSwgc28gbm90aGluZyBpcyB0b2xkIHRvIHJlc2l6ZS4gQSBLUEkncyBjYXJkXG4gIC8vIGtleXMgYXJlIGRpZmZlcmVudDogc2V0dGluZ3Mua3BpIGNhcnJpZXMgdGhlIGtleXMgdGhlIHNlcnZlciBzYXZlZCAobmV2ZXJcbiAgLy8gdGhlIG9uZXMgdGhlIGRpYWxvZyBzZW50KSwgYW5kIHRoZSBzZXJ2ZXIgc2VuZHMgdGhlIHRhcmdldCdzIHByb2dyZXNzIGFuZFxuICAvLyB0aGUgc3BhcmtsaW5lJ3MgcG9pbnRzIHdpdGggdGhlIGRhdGEsIHNvIGEgY2hhbmdlIHRvIHRoZW0gcmVsb2FkcyBpdC5cbiAgcHVibGljIGFwcGx5U2V0dGluZ3Moc2V0dGluZ3M6IENvbXBvbmVudFNldHRpbmdzKTogdm9pZCB7XG4gICAgY29uc3QgY2FyZENoYW5nZWQgPSAhIXNldHRpbmdzLmtwaVxuICAgICAgJiYgIXNhbWVLcGlDYXJkU2V0dGluZ3Moc2V0dGluZ3Mua3BpLCBrcGlDYXJkU2V0dGluZ3ModGhpcy5jb21wb25lbnQuY29uZmlnIGFzIEtwaUNvbmZpZykpO1xuXG4gICAgdGhpcy5jb21wb25lbnQudGl0bGUgPSBzZXR0aW5ncy50aXRsZTtcbiAgICB0aGlzLmNvbXBvbmVudC5jb25maWcgPSB7IC4uLnRoaXMuY29tcG9uZW50LmNvbmZpZywgcGFkZGluZzogc2V0dGluZ3MucGFkZGluZywgLi4uKHNldHRpbmdzLmtwaSA/PyB7fSkgfTtcblxuICAgIHRoaXMuX2J1aWxkRmlsdGVyQ29uZmlnKCk7XG5cbiAgICBpZiAoY2FyZENoYW5nZWQpIHtcbiAgICAgIHRoaXMuX3JlZnJlc2gkLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgQ1NWIGlzIHdoYXQgdGhlIHNjcmVlbiBzaG93cywgc28gaXQgY2FycmllcyB0aGUgdGlsZSdzIGludGVyYWN0aW9uXG4gIC8vIHN0YXRlICh0aWxlRGF0YVN0YXRlKTogdGhlIGdyb3VwLWJ5IGdyYWluIGZvciBhIHRpbWUtc2VyaWVzIGNoYXJ0LCBhXG4gIC8vIGNoYXJ0J3MgZHJpbGwgcGF0aCwgdGhlIHZpZXdlcidzIGhlYWRlciBzb3J0LCBzZWFyY2ggYW5kIGhpZGRlbiBjb2x1bW5zXG4gIC8vIGZvciBhIGxpc3QgKGEgc2VhcmNoZWQgbGlzdCBleHBvcnRzIG9ubHkgdGhlIHJvd3MgdGhlIHNlYXJjaCBsZWF2ZXMsIGFuZFxuICAvLyB0aGUgaGlkZGVuIGNvbHVtbnMgc3RheSBvdXQgb2YgdGhlIGZpbGUpLCBhbmQgdGhlIGdyb3VwcyB0aGF0IG1hdGNoXG4gIC8vICdhbnknOyBhbmQgaXRzIHRpdGxlIGFzIHRoZSBoZWFkZXIgcmVhZHMgaXQgKHNob3duVGl0bGUpLCB3aGljaCB0aGVcbiAgLy8gc2VydmVyIG5hbWVzIHRoZSBmaWxlIGFmdGVyLiBBIG5vdGUgdGhlIHNlcnZlciByZXR1cm5zICh0aGUgZmlsZSB3YXNcbiAgLy8gY3V0KSBpcyBzaG93biBiZWZvcmUgdGhlIGRvd25sb2FkIHN0YXJ0cywgc28gYSBzaG9ydCBmaWxlIG5ldmVyIHBhc3Nlc1xuICAvLyBmb3IgdGhlIHdob2xlIHJlc3VsdC5cbiAgcHVibGljIGV4cG9ydENzdigpOiB2b2lkIHtcbiAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5fZmlsdGVyU3RhdGUucmVzb2x2ZUZvckNvbXBvbmVudCh0aGlzLmNvbXBvbmVudCk7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9maWx0ZXJTdGF0ZS50aWxlU3RhdGUodGhpcy5jb21wb25lbnQpO1xuICAgIGNvbnN0IHRpdGxlID0gdGhpcy5zaG93blRpdGxlO1xuXG4gICAgdGhpcy5fcHJvY2Vzcy5kb3dubG9hZChcbiAgICAgIGBFeHBvcnRpbmcgJHt0aXRsZSB8fCAnY29tcG9uZW50J31gLFxuICAgICAgdGhpcy5fcmVwb3J0RGF0YS5leHBvcnRDb21wb25lbnQodGhpcy5yZXBvcnRJZCwgdGhpcy5jb21wb25lbnQuaWQsIGZpbHRlcnMsIHN0YXRlLCB0aXRsZSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFwKCh7IG5vdGVzIH0pID0+IG5vdGVzPy5sZW5ndGggJiYgdGhpcy5fbWVzc2FnZS53YXJuaW5nKG5vdGVzLmpvaW4oJyAnKSkpLFxuICAgICAgICAgIG1hcCgoeyB1cmwgfSkgPT4gdXJsKSxcbiAgICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgLy8gVGhlIG9uZSBjbGljayBoYW5kbGVyIChCMTAuMik6IGV2ZXJ5IGNsaWNrIG9uIGEgbWFyayBvZiB0aGlzIHRpbGUsIGFcbiAgLy8gY2hhcnQncyBvciBhIEtQSSdzIHZhbHVlLCBjb21lcyBoZXJlLCBzbyBpdHMgYWN0aW9ucyBuZXZlciBjb21wZXRlLiBUaGVcbiAgLy8gcnVsZSAoZGVjaWRlTWFya0NsaWNrKSBkb2VzIG5vdGhpbmcgd2l0aG91dCBhbiBhY3Rpb24sIGxldHMgYSBmaXJzdCB0YXBcbiAgLy8gc2hvdyB0aGUgdG9vbHRpcCwgcnVucyBhIGxvbmUgYWN0aW9uIGF0IG9uY2UsIGFuZCBvcGVucyB0aGUgbWFyayBtZW51IGF0XG4gIC8vIHRoZSBjbGljayBmb3IgdHdvIG9yIG1vcmUuIE5vdCB3aGlsZSB0aGUgbGF5b3V0IGlzIGVkaXRlZC5cbiAgcHVibGljIG9uTWFya0NsaWNrKGNsaWNrOiBSZXBvcnRNYXJrQ2xpY2spOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lZGl0TW9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGlvbnMgPSBtYXJrQWN0aW9ucyhjbGljaywgeyBkYXRhOiB0aGlzLmRhdGEoKSwgZmVhdHVyZXM6IHRoaXMuX29mZmVyZWRGZWF0dXJlcygpIH0pO1xuICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlTWFya0NsaWNrKGNsaWNrLCBhY3Rpb25zLCB0aGlzLl90b3VjaGVkTWFyayk7XG4gICAgdGhpcy5fdG91Y2hlZE1hcmsgPSBkZWNpc2lvbi50b3VjaGVkO1xuXG4gICAgaWYgKGRlY2lzaW9uLm91dGNvbWUgPT09ICdydW4nKSB7XG4gICAgICB0aGlzLl9ydW5NYXJrQWN0aW9uKGRlY2lzaW9uLmFjdGlvbnNbMF0sIGNsaWNrKTtcbiAgICB9IGVsc2UgaWYgKGRlY2lzaW9uLm91dGNvbWUgPT09ICdtZW51Jykge1xuICAgICAgdGhpcy5fb3Blbk1hcmtNZW51KGRlY2lzaW9uLmFjdGlvbnMsIGNsaWNrKTtcbiAgICB9XG4gIH1cblxuICAvLyBBIGNsaWNrIG9yIGEgdGFwIG9uIHRoZSBjaGFydCB0aGF0IGhpdCBubyBtYXJrOiBhIHRhcCBoZWxkIGZvciBpdHNcbiAgLy8gc2Vjb25kIHRhcCBpcyBsZXQgZ28sIHNvIHRhcHBpbmcgdGhhdCBtYXJrIGFnYWluIHNob3dzIGl0cyB0b29sdGlwIGZpcnN0LlxuICBwdWJsaWMgb25NYXJrTWlzcygpOiB2b2lkIHtcbiAgICB0aGlzLl90b3VjaGVkTWFyayA9IG51bGw7XG4gIH1cblxuICAvLyBBIHJvdyBvZiB0aGUgbWFyayBtZW51OiBydW5zIGl0cyBhY3Rpb24gZm9yIHRoZSBjbGljayB0aGUgbWVudSBvcGVuZWQgb24uXG4gIHB1YmxpYyBydW5NYXJrQWN0aW9uKGFjdGlvbjogUmVwb3J0TWFya0FjdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IGNsaWNrID0gdGhpcy5fbWVudUNsaWNrO1xuICAgIHRoaXMuX21lbnVDbGljayA9IG51bGw7XG5cbiAgICBpZiAoY2xpY2spIHtcbiAgICAgIHRoaXMuX3J1bk1hcmtBY3Rpb24oYWN0aW9uLCBjbGljayk7XG4gICAgfVxuICB9XG5cbiAgLy8gQmFjayB1cCB0aGUgZHJpbGwgcGF0aCB0byBpdHMgZmlyc3QgYGRlcHRoYCBzdGVwczogMCBpcyB0aGUgY2hhcnQncyB0b3BcbiAgLy8gKHRoZSB0aXRsZSdzIGNydW1iIGFuZCBCYWNrIHRvIHRvcCksIGFuZCBhIGNydW1iIGdvZXMgYmFjayB0byB0aGUgcGVyaW9kXG4gIC8vIGl0IG5hbWVzLiBUaGUgY2hhcnQgcmVhZHMgYWdhaW4gKGRyaWxsQ2hhbmdlcykuXG4gIHB1YmxpYyBkcmlsbFRvKGRlcHRoOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lZGl0TW9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2ZpbHRlclN0YXRlLnNldERyaWxsKHRoaXMuY29tcG9uZW50LmlkLCB0aGlzLl9maWx0ZXJTdGF0ZS5kcmlsbCh0aGlzLmNvbXBvbmVudC5pZCkuc2xpY2UoMCwgZGVwdGgpKTtcbiAgfVxuXG4gIC8vIE9uZSBsZXZlbCB1cDogdGhlIHBlcmlvZCB0aGUgY2hhcnQgaXMgZHJpbGxlZCBpbnRvIGlzIGxlZnQuXG4gIHB1YmxpYyBkcmlsbFVwKCk6IHZvaWQge1xuICAgIHRoaXMuZHJpbGxUbyhNYXRoLm1heCgwLCB0aGlzLl9maWx0ZXJTdGF0ZS5kcmlsbCh0aGlzLmNvbXBvbmVudC5pZCkubGVuZ3RoIC0gMSkpO1xuICB9XG5cbiAgLy8gQW55IGludGVyYWN0aW9uIGluc2lkZSBhIGNvbXBvbmVudCBtdXN0IG5ldmVyIHN0YXJ0IGEgY2FudmFzIHBhbiAodGhlXG4gIC8vIHpvb20tcGFuIGhvc3QgbGlzdGVucyBmb3IgbW91c2Vkb3duL3RvdWNoc3RhcnQgYXQgdGhlIGNvbnRhaW5lciBsZXZlbCkuXG4gIHB1YmxpYyBzdG9wQ2FudmFzUGFuKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgcHVibGljIG9uQ29tcG9uZW50UG9pbnRlckRvd24oZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmVkaXRNb2RlICYmICF0aGlzLnNlbGVjdGVkKSB7XG4gICAgICB0aGlzLnNlbGVjdENvbXBvbmVudC5lbWl0KHRoaXMuY29tcG9uZW50LmlkKTtcbiAgICB9XG4gIH1cblxuICAvLyAtLS0tLSBlZGl0LW1vZGUgZ2VzdHVyZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgcHVibGljIG9uRHJhZ1N0YXJ0KGV2ZW50OiBQb2ludGVyRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZWRpdE1vZGUgfHwgdGhpcy50ZXh0RWRpdGluZygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQSBzZWNvbmQgcHJlc3Mgb24gYSB0ZXh0IGJsb2NrIG9wZW5zIGl0cyBlZGl0b3IgaW5zdGVhZCBvZiBkcmFnZ2luZy5cbiAgICBpZiAodGhpcy5pc1RleHQpIHtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBpc0RvdWJsZVByZXNzID0gbm93IC0gdGhpcy5fbGFzdFByZXNzIDwgRE9VQkxFX1BSRVNTX01TO1xuICAgICAgdGhpcy5fbGFzdFByZXNzID0gbm93O1xuXG4gICAgICBpZiAoaXNEb3VibGVQcmVzcykge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5lZGl0VGV4dCgpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdENvbXBvbmVudC5lbWl0KHRoaXMuY29tcG9uZW50LmlkKTtcblxuICAgIHRoaXMuX3RyYWNrKGV2ZW50LCAoZGVsdGFYLCBkZWx0YVkpID0+IHtcbiAgICAgIGxldCB4ID0gTWF0aC5tYXgoMCwgdGhpcy5fb3JpZ2luLnggKyB0aGlzLl9pbmNoZXMoZGVsdGFYKSk7XG4gICAgICBsZXQgeSA9IE1hdGgubWF4KDAsIHRoaXMuX29yaWdpbi55ICsgdGhpcy5faW5jaGVzKGRlbHRhWSkpO1xuXG4gICAgICBpZiAodGhpcy5zbmFwcGVyKSB7XG4gICAgICAgICh7IHgsIHkgfSA9IHRoaXMuc25hcHBlci5zbmFwTW92ZSh0aGlzLmNvbXBvbmVudCwgeCwgeSkpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNvbXBvbmVudC54ID0geDtcbiAgICAgIHRoaXMuY29tcG9uZW50LnkgPSB5O1xuICAgICAgdGhpcy5fYXBwbHlHZW9tZXRyeSgpO1xuICAgIH0sICgpID0+IHRoaXMuX2VtaXRHZW9tZXRyeSgpKTtcbiAgfVxuXG4gIHB1YmxpYyBvblJlc2l6ZVN0YXJ0KGV2ZW50OiBQb2ludGVyRXZlbnQsIGhhbmRsZTogSGFuZGxlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVkaXRNb2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RDb21wb25lbnQuZW1pdCh0aGlzLmNvbXBvbmVudC5pZCk7XG5cbiAgICB0aGlzLl90cmFjayhldmVudCwgKGRlbHRhWCwgZGVsdGFZKSA9PiB7XG4gICAgICBjb25zdCBkeCA9IHRoaXMuX2luY2hlcyhkZWx0YVgpO1xuICAgICAgY29uc3QgZHkgPSB0aGlzLl9pbmNoZXMoZGVsdGFZKTtcbiAgICAgIGxldCB7IHgsIHksIHcsIGggfSA9IHRoaXMuX29yaWdpbjtcblxuICAgICAgaWYgKGhhbmRsZS5pbmNsdWRlcygnZScpKSB7XG4gICAgICAgIHcgPSBNYXRoLm1heChNSU5fVywgdGhpcy5fb3JpZ2luLncgKyBkeCk7XG4gICAgICB9XG4gICAgICBpZiAoaGFuZGxlLmluY2x1ZGVzKCdzJykpIHtcbiAgICAgICAgaCA9IE1hdGgubWF4KE1JTl9ILCB0aGlzLl9vcmlnaW4uaCArIGR5KTtcbiAgICAgIH1cbiAgICAgIGlmIChoYW5kbGUuaW5jbHVkZXMoJ3cnKSkge1xuICAgICAgICBjb25zdCBjbGFtcGVkID0gTWF0aC5taW4oZHgsIHRoaXMuX29yaWdpbi53IC0gTUlOX1cpO1xuICAgICAgICB4ID0gdGhpcy5fb3JpZ2luLnggKyBjbGFtcGVkO1xuICAgICAgICB3ID0gdGhpcy5fb3JpZ2luLncgLSBjbGFtcGVkO1xuICAgICAgfVxuICAgICAgaWYgKGhhbmRsZS5pbmNsdWRlcygnbicpKSB7XG4gICAgICAgIGNvbnN0IGNsYW1wZWQgPSBNYXRoLm1pbihkeSwgdGhpcy5fb3JpZ2luLmggLSBNSU5fSCk7XG4gICAgICAgIHkgPSB0aGlzLl9vcmlnaW4ueSArIGNsYW1wZWQ7XG4gICAgICAgIGggPSB0aGlzLl9vcmlnaW4uaCAtIGNsYW1wZWQ7XG4gICAgICB9XG5cbiAgICAgIGxldCBnZW9tZXRyeSA9IHsgeCwgeSwgdywgaCB9O1xuICAgICAgaWYgKHRoaXMuc25hcHBlcikge1xuICAgICAgICBnZW9tZXRyeSA9IHRoaXMuc25hcHBlci5zbmFwUmVzaXplKHRoaXMuY29tcG9uZW50LCBnZW9tZXRyeSwgaGFuZGxlKTtcbiAgICAgIH1cblxuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLmNvbXBvbmVudCwgZ2VvbWV0cnkpO1xuICAgICAgdGhpcy5fYXBwbHlHZW9tZXRyeSgpO1xuICAgICAgdGhpcy5jaGFydENvbXBvbmVudD8ucmVzaXplKCk7XG4gICAgfSwgKCkgPT4gdGhpcy5fZW1pdEdlb21ldHJ5KCkpO1xuICB9XG5cbiAgLy8gKFJlKWJ1aWxkIHRoZSBoZWFkZXIgZnMtZmlsdGVyIGNvbmZpZzogaGVhZGluZyB0ZW1wbGF0ZSByZW5kZXJzIHRoZSB0aXRsZVxuICAvLyBhbmQgaXRlbXMgYXJlIHRoaXMgY29tcG9uZW50J3MgY29tcG9uZW50LWxldmVsIGZpbHRlciBncm91cHMuIFRoZSBhY3Rpb25zXG4gIC8vIG1lbnUgKFNldHRpbmdzIC8gRXhwb3J0IENTVikgaXMgTk9UIGhlcmUg4oCUIGl0J3MgYSBzdGFuZGFsb25lIGtlYmFiIGZsb2F0ZWRcbiAgLy8gdG9wLXJpZ2h0IGluIHRoZSB0ZW1wbGF0ZSwgc28gaXRzIGJ1dHRvbiBoZWlnaHQgbm8gbG9uZ2VyIGRyaXZlcyB0aGUgaGVhZGVyXG4gIC8vIHJvdydzIGhlaWdodCAod2hpY2ggd291bGQgb3RoZXJ3aXNlIGluZmxhdGUgdGhlIGhlYWRpbmcgYnkgfjQwcHgpLlxuICAvL1xuICAvLyBBIGxpc3QgYWxzbyBnZXRzIGEgc2VhcmNoIGJveCBvdmVyIGl0cyB0ZXh0IGNvbHVtbnMsIHVubGVzcyBpdHMgaGVhZGVyXG4gIC8vIHNob3dzIGEga2V5d29yZCBncm91cCAoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlLmxpc3RTZWFyY2hhYmxlLCB3aGljaCBhbHNvXG4gIC8vIGRyb3BzIGEgc2VhcmNoIGtlcHQgZnJvbSBiZWZvcmUgc3VjaCBhIGdyb3VwIGFwcGVhcmVkKS5cbiAgLy9cbiAgLy8gYHJlcG9ydGVkYCBpcyB3aGF0IHRoaXMgaGVhZGVyIGxhc3QgcmVwb3J0ZWQgZm9yIGVhY2ggb2YgaXRzIGdyb3VwcyxcbiAgLy8gc3RhcnRpbmcgZnJvbSB0aGUgdmFsdWVzIGl0IGlzIGJ1aWx0IHdpdGguIEEgY2hhbmdlIHNldHMgb25seSB0aGUgZ3JvdXBzXG4gIC8vIHdob3NlIGhlYWRlciB2YWx1ZSBtb3ZlZCAobW92ZWRHcm91cFZhbHVlcyk6IGZzLWZpbHRlciByZXBvcnRzIGV2ZXJ5IGl0ZW1cbiAgLy8gb24gYW55IGNoYW5nZSwgYW5kIGEgZ3JvdXAgc2hvd24gaW4gdGhlIHJlcG9ydCBiYXIgdG9vIG1heSBoYXZlIGNoYW5nZWRcbiAgLy8gdGhlcmUgc2luY2UsIHdpdGhvdXQgdGhpcyBoZWFkZXIgYmVpbmcgcmVwYWludGVkLlxuICBwcml2YXRlIF9zZXRUZXh0SHRtbChodG1sOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNvbXBvbmVudC5jb25maWcgPSB7IC4uLnRoaXMuY29tcG9uZW50LmNvbmZpZywgaHRtbCB9O1xuICAgIHRoaXMudGV4dEh0bWwuc2V0KGh0bWwpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYnVpbGRGaWx0ZXJDb25maWcoKTogdm9pZCB7XG4gICAgY29uc3QgZ3JvdXBzID0gdGhpcy5jb21wb25lbnRGaWx0ZXJHcm91cHM7XG4gICAgY29uc3QgbGlzdFNlYXJjaCA9IHRoaXMuX2ZpbHRlclN0YXRlLmxpc3RTZWFyY2hhYmxlKHRoaXMuY29tcG9uZW50KTtcbiAgICBjb25zdCByZXBvcnRlZCA9IG5ldyBNYXAoZ3JvdXBzLm1hcCgoZ3JvdXApID0+IFtncm91cC5pZCwgdGhpcy5fZmlsdGVyU3RhdGUudmFsdWUoZ3JvdXAuaWQpID8/IG51bGxdKSk7XG4gICAgY29uc3QgZmVhdHVyZXMgPSB0aGlzLl9maWx0ZXJTdGF0ZS52aWV3ZXJGZWF0dXJlcygpO1xuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMuX2ZpbHRlclN0YXRlLnJlcG9ydCgpO1xuXG4gICAgdGhpcy5fc2hvd24gPSByZXBvcnRlZDtcbiAgICB0aGlzLl9oZWFkZXJWYWx1ZXMuc2V0KFsuLi5yZXBvcnRlZC52YWx1ZXMoKV0ubWFwKGdyb3VwVmFsdWVTaWduYXR1cmUpLmpvaW4oJ3wnKSk7XG4gICAgdGhpcy5faGVhZGVyVmVyc2lvbi5zZXQodGhpcy5fZmlsdGVyU3RhdGUuc3RhdGVWZXJzaW9uKCkpO1xuICAgIHRoaXMuZmlsdGVyQ29uZmlnLnNldCh7XG4gICAgICAvLyBmcy1maWx0ZXIgbmV2ZXIgdG91Y2hlcyB0aGUgVVJMIG9yIHBlcnNpc3RzIGZpbHRlciBzdGF0ZTogYSByZXBvcnRcbiAgICAgIC8vIGtlZXBzIG5vIHN0YXRlIGluIHRoZSBVUkwuIFRoZSB2YWx1ZXMgYXJlIG93bmVkIGJ5XG4gICAgICAvLyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UuXG4gICAgICBxdWVyeVBhcmFtOiBmYWxzZSxcbiAgICAgIHBlcnNpc3Q6IGZhbHNlLFxuICAgICAgaXRlbXM6IFtcbiAgICAgICAgLi4uZ3JvdXBzLm1hcCgoZ3JvdXApID0+XG4gICAgICAgICAgZmlsdGVySXRlbUZvckdyb3VwKGdyb3VwLCB0aGlzLl9maWx0ZXJPcHRpb25zLCByZXBvcnQsIHRoaXMuX2ZpbHRlclN0YXRlLnZhbHVlKGdyb3VwLmlkKSwgZmVhdHVyZXMpKSxcbiAgICAgICAgLi4uKGxpc3RTZWFyY2ggPyBbbGlzdFNlYXJjaEl0ZW0odGhpcy5fZmlsdGVyU3RhdGUubGlzdFNlYXJjaCh0aGlzLmNvbXBvbmVudC5pZCkpXSA6IFtdKSxcbiAgICAgIF0sXG4gICAgICAvLyBUeXBpbmcgaW4gdGhlIHNlYXJjaCBib3ggbXVzdCBub3QgcmVmZXRjaCB0aHJvdWdoIHRoZSBncm91cHMsIG5vciBzZXRcbiAgICAgIC8vIGEgc3RhbGUgZ3JvdXAgdmFsdWUgYmFjaywgYW5kIGEgZ3JvdXAgY2hhbmdlIG11c3Qgbm90IHJlZmV0Y2ggdGhyb3VnaFxuICAgICAgLy8gdGhlIHNlYXJjaC5cbiAgICAgIGNoYW5nZTogKHF1ZXJ5KSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IGdyb3VwVmFsdWVzRnJvbVF1ZXJ5KHF1ZXJ5ID8/IHt9LCB0aGlzLmNvbXBvbmVudEZpbHRlckdyb3Vwcyk7XG5cbiAgICAgICAgZm9yIChjb25zdCB7IGdyb3VwSWQsIHZhbHVlIH0gb2YgbW92ZWRHcm91cFZhbHVlcyhyZXBvcnRlZCwgdmFsdWVzKSkge1xuICAgICAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLnNldFZhbHVlKGdyb3VwSWQsIHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaXN0U2VhcmNoKSB7XG4gICAgICAgICAgdGhpcy5fZmlsdGVyU3RhdGUuc2V0TGlzdFNlYXJjaCh0aGlzLmNvbXBvbmVudC5pZCwgU3RyaW5nKHF1ZXJ5Py5bTElTVF9TRUFSQ0hfSVRFTV0gPz8gJycpKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vICdDbGVhciBmaWx0ZXJzJyBwdXRzIHRoaXMgaGVhZGVyJ3Mgb3duIGdyb3VwcyBiYWNrIG9uIHRoZWlyIGF1dGhvcmVkXG4gICAgICAvLyBkZWZhdWx0cy4gZnMtZmlsdGVyIHJlcG9ydHMgaXRzIG93biBjbGVhcmVkIGl0ZW1zIChjaGFuZ2UpIGp1c3RcbiAgICAgIC8vIGJlZm9yZSB0aGlzLCBzbyB0aGUgcmVzZXQgd2lucy5cbiAgICAgIGNsZWFyOiAoKSA9PiB0aGlzLl9maWx0ZXJTdGF0ZS5yZXNldEdyb3Vwc1RvRGVmYXVsdHMoZ3JvdXBzLm1hcCgoZ3JvdXApID0+IGdyb3VwLmlkKSksXG4gICAgICAvLyBUaGUgY2hpcCBzaG93cyBleGFjdGx5IHdoaWxlIG9uZSBvZiB0aG9zZSBncm91cHMgZGlmZmVycyBmcm9tIHdoYXRcbiAgICAgIC8vIHRoYXQgY2xlYXIgcHV0cyBiYWNrIChncm91cHNEaWZmZXJGcm9tRGVmYXVsdHMpLiBmcy1maWx0ZXIncyBvd24gcnVsZVxuICAgICAgLy8gY29tcGFyZXMgdGhlIGl0ZW1zIHdpdGggdGhlIHZhbHVlcyB0aGlzIGhlYWRlciB3YXMgYnVpbHQgd2l0aCwgd2hpY2hcbiAgICAgIC8vIG1heSBiZSB0aGUgdmlld2VyJ3Mgb3duIHBpY2tzLCBhbmQgd291bGQgb2ZmZXIgYSBjbGVhciB0aGF0IGNoYW5nZXNcbiAgICAgIC8vIG5vdGhpbmcuXG4gICAgICBjbGVhclZpc2libGU6ICgpID0+IHRoaXMuX2ZpbHRlclN0YXRlLmdyb3Vwc0RpZmZlckZyb21EZWZhdWx0cyhncm91cHMubWFwKChncm91cCkgPT4gZ3JvdXAuaWQpKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIHJlc2V0VG9EZWZhdWx0cygpIG1vdmVzIHRoZSBzdGF0ZSB2ZXJzaW9uIGFuZCBhbm5vdW5jZXMgYSBmdWxsIGNoYW5nZVxuICAvLyAobnVsbCkuIFRoZSBoZWFkZXIgaXMgYnVpbHQgYWdhaW4gZm9yIHRoZSBuZXcgdmVyc2lvbiwgYW5kXG4gIC8vIGZpbHRlcktleSwgd2hpY2ggY2FycmllcyBpdCwgcmVjcmVhdGVzIHRoZSBibG9jazogZnMtZmlsdGVyIHJlYWRzIGl0c1xuICAvLyBjb25maWcgb25jZS4gQW55IG90aGVyIGZ1bGwgY2hhbmdlIChhIHJlbG9hZCwgdGhlIG1hdGNoKSBsZWF2ZXMgaXQgYmUuXG4gIC8vIEEgY2hhbmdlIHRvIG9uZSBncm91cCB0aGUgaGVhZGVyIHNob3dzIHdpdGggYW5vdGhlciB2YWx1ZSAoYW5vdGhlciBiYXJcbiAgLy8gc2V0IGl0KSBidWlsZHMgaXQgYWdhaW4gdG9vLlxuICBwcml2YXRlIF9yZWJ1aWxkSGVhZGVyT25OZXdTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9maWx0ZXJTdGF0ZS5jaGFuZ2VzRm9yKHRoaXMuY29tcG9uZW50KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHJ4RmlsdGVyKChncm91cElkKSA9PiAoZ3JvdXBJZCA9PT0gbnVsbFxuICAgICAgICAgID8gdGhpcy5fZmlsdGVyU3RhdGUuc3RhdGVWZXJzaW9uKCkgIT09IHRoaXMuX2hlYWRlclZlcnNpb24oKVxuICAgICAgICAgIDogdGhpcy5fc2hvd3NPdGhlclZhbHVlKGdyb3VwSWQpKSksXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLl9idWlsZEZpbHRlckNvbmZpZygpKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLy8gV2hldGhlciB0aGUgaGVhZGVyIHNob3dzIGEgZ3JvdXAgd2l0aCBhIHZhbHVlIG90aGVyIHRoYW4gdGhlIG9uZSBzdG9yZWRcbiAgLy8gZm9yIGl0LiBBIGNoYW5nZSB0aGUgaGVhZGVyJ3Mgb3duIGJhciBtYWRlIGlzIHdoYXQgaXQgc2hvd3MgYWxyZWFkeS5cbiAgcHJpdmF0ZSBfc2hvd3NPdGhlclZhbHVlKGdyb3VwSWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zaG93bi5oYXMoZ3JvdXBJZClcbiAgICAgICYmIGdyb3VwVmFsdWVTaWduYXR1cmUodGhpcy5fc2hvd24uZ2V0KGdyb3VwSWQpKSAhPT0gZ3JvdXBWYWx1ZVNpZ25hdHVyZSh0aGlzLl9maWx0ZXJTdGF0ZS52YWx1ZShncm91cElkKSk7XG4gIH1cblxuICBwcml2YXRlIF9vcmlnaW4gPSB7IHg6IDAsIHk6IDAsIHc6IDAsIGg6IDAgfTtcblxuICAvLyBQb2ludGVyLWNhcHR1cmUgZ2VzdHVyZSBsb29wOiBydW5zIG91dHNpZGUgQW5ndWxhciwgcmVwYWludHMgaW1wZXJhdGl2ZWx5LFxuICAvLyBhbmQgZmluaXNoZXMgYmFjayBpbnNpZGUgQW5ndWxhciAoc2VsZWN0aW9uL3BlcnNpc3RlbmNlKS5cbiAgcHJpdmF0ZSBfdHJhY2soXG4gICAgZXZlbnQ6IFBvaW50ZXJFdmVudCxcbiAgICBvbk1vdmU6IChkZWx0YVg6IG51bWJlciwgZGVsdGFZOiBudW1iZXIpID0+IHZvaWQsXG4gICAgb25FbmQ6ICgpID0+IHZvaWQsXG4gICk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBjb25zdCBoYW5kbGUgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaGFuZGxlLnNldFBvaW50ZXJDYXB0dXJlKGV2ZW50LnBvaW50ZXJJZCk7XG5cbiAgICB0aGlzLl9vcmlnaW4gPSB7XG4gICAgICB4OiB0aGlzLmNvbXBvbmVudC54LFxuICAgICAgeTogdGhpcy5jb21wb25lbnQueSxcbiAgICAgIHc6IHRoaXMuY29tcG9uZW50LncsXG4gICAgICBoOiB0aGlzLmNvbXBvbmVudC5oLFxuICAgIH07XG4gICAgY29uc3Qgc3RhcnRYID0gZXZlbnQuY2xpZW50WDtcbiAgICBjb25zdCBzdGFydFkgPSBldmVudC5jbGllbnRZO1xuXG4gICAgdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBjb25zdCBtb3ZlID0gKGU6IFBvaW50ZXJFdmVudCkgPT4gb25Nb3ZlKGUuY2xpZW50WCAtIHN0YXJ0WCwgZS5jbGllbnRZIC0gc3RhcnRZKTtcbiAgICAgIGNvbnN0IGVuZCA9ICgpID0+IHtcbiAgICAgICAgaGFuZGxlLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShldmVudC5wb2ludGVySWQpO1xuICAgICAgICBoYW5kbGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBtb3ZlKTtcbiAgICAgICAgaGFuZGxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIGVuZCk7XG4gICAgICAgIGhhbmRsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyY2FuY2VsJywgZW5kKTtcblxuICAgICAgICB0aGlzLl96b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zbmFwcGVyPy5jbGVhcigpO1xuICAgICAgICAgIG9uRW5kKCk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgaGFuZGxlLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgbW92ZSk7XG4gICAgICBoYW5kbGUuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgZW5kKTtcbiAgICAgIGhhbmRsZS5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyY2FuY2VsJywgZW5kKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2VtaXRHZW9tZXRyeSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbXBvbmVudC54ID0gdGhpcy5fcm91bmQodGhpcy5jb21wb25lbnQueCk7XG4gICAgdGhpcy5jb21wb25lbnQueSA9IHRoaXMuX3JvdW5kKHRoaXMuY29tcG9uZW50LnkpO1xuICAgIHRoaXMuY29tcG9uZW50LncgPSB0aGlzLl9yb3VuZChNYXRoLm1heChNSU5fVywgdGhpcy5jb21wb25lbnQudykpO1xuICAgIHRoaXMuY29tcG9uZW50LmggPSB0aGlzLl9yb3VuZChNYXRoLm1heChNSU5fSCwgdGhpcy5jb21wb25lbnQuaCkpO1xuICAgIHRoaXMuX2FwcGx5R2VvbWV0cnkoKTtcbiAgICB0aGlzLmNoYXJ0Q29tcG9uZW50Py5yZXNpemUoKTtcblxuICAgIHRoaXMucG9zaXRpb25DaGFuZ2VkLmVtaXQoe1xuICAgICAgY29tcG9uZW50SWQ6IHRoaXMuY29tcG9uZW50LmlkLFxuICAgICAgeDogdGhpcy5jb21wb25lbnQueCxcbiAgICAgIHk6IHRoaXMuY29tcG9uZW50LnksXG4gICAgICB3OiB0aGlzLmNvbXBvbmVudC53LFxuICAgICAgaDogdGhpcy5jb21wb25lbnQuaCxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEEgY2hhcnQgb24gYSB0aW1lIHgtYXhpcyDigJQgdGhlIG9ubHkgY29tcG9uZW50IHRoZSByZXBvcnQncyBncm91cC1ieSBjb250cm9sXG4gIC8vIGFwcGxpZXMgdG8gKGlzVGltZVNlcmllc0NoYXJ0LCB0aGUgYnJvd3Nlci1zaWRlIG1pcnJvciBvZiB0aGUgc2VydmVyJ3MgcnVsZSkuXG4gIHByaXZhdGUgZ2V0IF9pc1RpbWVTZXJpZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzVGltZVNlcmllc0NoYXJ0KHRoaXMuY29tcG9uZW50KTtcbiAgfVxuXG4gIC8vIEF1dG8gaGVpZ2h0IChib3ggZml0cyBpdHMgY29udGVudCkgdnMgZml4ZWQgKHVzZSBgaGAgZXhhY3RseSkuIERlcml2ZWQgZnJvbVxuICAvLyB0eXBlLCBzZXJ2ZXItc2lkZTogS1BJIHRpbGVzIGFyZSBhdXRvOyBjaGFydHMgYW5kIGxpc3RzIGFyZSBmaXhlZCDigJQgY2hhcnRzXG4gIC8vIGZpdCB0aGUgYm94IGFuZCBuZXZlciBvdmVyZmxvdywgbGlzdHMgc2Nyb2xsIGluc2lkZSBpdC5cbiAgcHJpdmF0ZSBnZXQgX2hlaWdodEF1dG8oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50LmF1dG9IZWlnaHQgIT09IGZhbHNlO1xuICB9XG5cbiAgLy8gRHJpdmVzIHRoZSBhdXRvLW9ubHkgQ1NTIGRlZmF1bHQgKGVtcHR5LXN0YXRlIGJhc2VsaW5lKSBzbyBpdCBuZXZlciBhcHBsaWVzXG4gIC8vIHRvIGEgZml4ZWQtaGVpZ2h0IGNvbXBvbmVudC5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5oZWlnaHQtYXV0bycpXG4gIHB1YmxpYyBnZXQgaGVpZ2h0QXV0bygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faGVpZ2h0QXV0bztcbiAgfVxuXG4gIC8vIFNjcmVlbiBwaXhlbHMg4oaSIGluY2hlcyBhdCB0aGUgY3VycmVudCB6b29tLlxuICBwcml2YXRlIF9pbmNoZXMocGl4ZWxzOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBwaXhlbHMgLyAodGhpcy56b29tICogUFhfUEVSX0lOQ0gpO1xuICB9XG5cbiAgLy8gQ2xlYW4gcGVyc2lzdGVkIHZhbHVlczogaHVuZHJlZHRocyBvZiBhbiBpbmNoLlxuICBwcml2YXRlIF9yb3VuZCh2YWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZCh2YWx1ZSAqIDEwMCkgLyAxMDA7XG4gIH1cblxuICAvLyBUaGUgY2FudmFzIHBvc2l0aW9ucyB0aGUgaG9zdCB2aWEgW3N0eWxlXTsgbWlkLWdlc3R1cmUgd2Ugc2V0IGl0IGRpcmVjdGx5XG4gIC8vIHNvIE9uUHVzaCBuZXZlciByZS1yZW5kZXJzIGluIHRoZSBtb3ZlIGxvb3AuXG4gIHByaXZhdGUgX2FwcGx5R2VvbWV0cnkoKTogdm9pZCB7XG4gICAgY29uc3Qgc3R5bGUgPSB0aGlzLl9ob3N0Lm5hdGl2ZUVsZW1lbnQuc3R5bGU7XG4gICAgc3R5bGUubGVmdCA9IGAke3RoaXMuY29tcG9uZW50LnggKiBQWF9QRVJfSU5DSH1weGA7XG4gICAgc3R5bGUudG9wID0gYCR7dGhpcy5jb21wb25lbnQueSAqIFBYX1BFUl9JTkNIfXB4YDtcbiAgICBzdHlsZS53aWR0aCA9IGAke3RoaXMuY29tcG9uZW50LncgKiBQWF9QRVJfSU5DSH1weGA7XG5cbiAgICAvLyBBdXRvIChrcGkpOiBubyBmaXhlZCBoZWlnaHQg4oCUIHRoZSBib3ggc2l6ZXMgdG8gaXRzIGNvbnRlbnQuIEZpeGVkXG4gICAgLy8gKGNoYXJ0L2xpc3QpOiBgaGAgaXMgdGhlIGV4YWN0IGhlaWdodC4gTWlycm9ycyB0aGUgY2FudmFzIFtzdHlsZV0gYmluZGluZ1xuICAgIC8vIHNvIHRoZSBtaWQtZ2VzdHVyZSBwYWludCBtYXRjaGVzIHRoZSBwb3N0LWdlc3R1cmUgcmUtcmVuZGVyLlxuICAgIGlmICh0aGlzLl9oZWlnaHRBdXRvKSB7XG4gICAgICBzdHlsZS5oZWlnaHQgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgc3R5bGUuaGVpZ2h0ID0gYCR7dGhpcy5jb21wb25lbnQuaCAqIFBYX1BFUl9JTkNIfXB4YDtcbiAgICB9XG4gIH1cblxuICAvLyAtLS0tLSBkYXRhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvLyBPbmUgcmVxdWVzdCBvZiB0aGUgbG9hZCBzdHJlYW0gKHRpbGVMb2FkcyksIGJ1aWx0IGZyb20gdGhlIHN0YXRlIG5vdy4gVGhlXG4gIC8vIHNwaW5uZXIgc2hvd3MgZWl0aGVyIHdheTsgYSB0aWxlIHdpdGggZGF0YSBvbiBzY3JlZW4ga2VlcHMgaXQsIGRpbW1lZC5cbiAgcHJpdmF0ZSBfbG9hZCgpOiBPYnNlcnZhYmxlPENvbXBvbmVudERhdGE+IHtcbiAgICBjb25zdCBmaXJzdCA9ICF0aGlzLmRhdGEoKTtcblxuICAgIHRoaXMubG9hZGluZy5zZXQoZmlyc3QpO1xuICAgIHRoaXMucmVmcmVzaGluZy5zZXQoIWZpcnN0KTtcbiAgICB0aGlzLmVycm9yLnNldChudWxsKTtcblxuICAgIGNvbnN0IGZpbHRlcnMgPSB0aGlzLl9maWx0ZXJTdGF0ZS5yZXNvbHZlRm9yQ29tcG9uZW50KHRoaXMuY29tcG9uZW50KTtcbiAgICAvLyBUaGUgdGlsZSdzIGludGVyYWN0aW9uIHN0YXRlLCB0aGUgb25lIGl0cyBDU1YgYW5kIGV2ZXJ5IGV4cG9ydCBjYXJyeVxuICAgIC8vICh0aWxlRGF0YVN0YXRlKTogYSB0aW1lLXNlcmllcyBjaGFydCdzIGdyYWluICh3aGVuIHRoZSB2aWV3ZXIgcGlja2VkXG4gICAgLy8gb25lKSBzbyB0aGUgYmFja2VuZCByZS1idWNrZXRzLCBhIGNoYXJ0J3MgZHJpbGwgcGF0aCwgYW5kIHRoZSBncm91cHNcbiAgICAvLyB0aGF0IG1hdGNoICdhbnknLlxuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fZmlsdGVyU3RhdGUudGlsZVN0YXRlKHRoaXMuY29tcG9uZW50KTtcblxuICAgIHJldHVybiB0aGlzLl9yZXBvcnREYXRhLmNvbXBvbmVudERhdGEodGhpcy5yZXBvcnRJZCwgdGhpcy5jb21wb25lbnQuaWQsIGZpbHRlcnMsIHN0YXRlKTtcbiAgfVxuXG4gIC8vIEEgZmFpbGVkIGxvYWQgY2xlYXJzIHRoZSBkYXRhIHdpdGggaXRzIG1lc3NhZ2UsIHNvIHRoZSBuZXh0IGxvYWQgc3RhcnRzXG4gIC8vIGZyb20gYW4gZW1wdHkgdGlsZSBhbmQgbmV2ZXIgc2hvd3MgdGhlIGRhdGEgdGhlIGZhaWx1cmUgcmVwbGFjZWQuIEFcbiAgLy8gY2hhcnQncyBhbnN3ZXIgZ2l2ZXMgaXRzIGRyaWxsIHBhdGguXG4gIHByaXZhdGUgX2xvYWRlZChyZXN1bHQ6IFRpbGVMb2FkUmVzdWx0PENvbXBvbmVudERhdGE+KTogdm9pZCB7XG4gICAgdGhpcy5kYXRhLnNldChyZXN1bHQuZGF0YSk7XG4gICAgdGhpcy5lcnJvci5zZXQocmVzdWx0LmVycm9yKTtcbiAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICB0aGlzLnJlZnJlc2hpbmcuc2V0KGZhbHNlKTtcblxuICAgIGlmIChyZXN1bHQuZXJyb3IgPT09IG51bGwgJiYgcmVzdWx0LmRhdGEpIHtcbiAgICAgIHRoaXMuX2Fkb3B0RHJpbGwocmVzdWx0LmRhdGEpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEEgY2hhcnQgdGFrZXMgdGhlIGRyaWxsIHBhdGggaXRzIGFuc3dlciBhcHBsaWVkIChhZG9wdGVkRHJpbGxQYXRoKSB3aGlsZVxuICAvLyB0aGUgdmlld2VyIGlzIG9mZmVyZWQgZHJpbGw7IGFuIG9sZGVyIHNlcnZlciBhcHBsaWVzIG5vbmUsIGFuZCB0aGUgcGF0aFxuICAvLyBzdGF5cyBpbiB0aGUgc3RhdGUuIFdoZW4gdGhlIHBhdGggaXQgc2VudCB3YXMgY3V0LCB0aGUgdmlld2VyIGlzIHRvbGRcbiAgLy8gb25jZSAoZHJpbGxSZXNldE5vdGVkKTogdGhlIHNob3J0ZXIgcGF0aCBpcyB3aGF0IHRoZSBjaGFydCByZWFkcyBmcm9tXG4gIC8vIG5vdyBvbiwgc28gdGhlIHNlcnZlciBjdXRzIG5vdGhpbmcgYWdhaW4uXG4gIHByaXZhdGUgX2Fkb3B0RHJpbGwoZGF0YTogQ29tcG9uZW50RGF0YSk6IHZvaWQge1xuICAgIGNvbnN0IGdyYWluTW92ZWQgPSB0aGlzLl9ncmFpbk1vdmVkO1xuICAgIHRoaXMuX2dyYWluTW92ZWQgPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLmNvbXBvbmVudC50eXBlICE9PSAnY2hhcnQnIHx8ICF0aGlzLl9vZmZlcmVkRmVhdHVyZXMoKS5pbmNsdWRlcygnZHJpbGwnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9maWx0ZXJTdGF0ZS5hZG9wdERyaWxsKHRoaXMuY29tcG9uZW50LmlkLCBhZG9wdGVkRHJpbGxQYXRoKGRhdGEuZHJpbGwpKVxuICAgICAgJiYgZHJpbGxSZXNldE5vdGVkKGRhdGEuZHJpbGwsIGdyYWluTW92ZWQpKSB7XG4gICAgICB0aGlzLl9tZXNzYWdlLndhcm5pbmcoRFJJTExfUkVTRVRfTUVTU0FHRSk7XG4gICAgfVxuICB9XG5cbiAgLy8gLS0tLS0gbWFyayBjbGlja3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgcHJpdmF0ZSBfcnVuTWFya0FjdGlvbihhY3Rpb246IFJlcG9ydE1hcmtBY3Rpb24sIGNsaWNrOiBSZXBvcnRNYXJrQ2xpY2spOiB2b2lkIHtcbiAgICBpZiAoYWN0aW9uID09PSAnZHJpbGwnKSB7XG4gICAgICB0aGlzLl9kcmlsbERvd24oY2xpY2spO1xuICAgIH1cbiAgfVxuXG4gIC8vIERyaWxsIGRvd246IHRoZSBjaGFydCdzIHBhdGggZ29lcyBvbmUgbGV2ZWwgYmVsb3cgdGhlIHBlcmlvZCBjbGlja2VkLFxuICAvLyBhbmQgdGhlIGNoYXJ0IHJlYWRzIGFnYWluIChkcmlsbENoYW5nZXMpLlxuICBwcml2YXRlIF9kcmlsbERvd24oY2xpY2s6IFJlcG9ydE1hcmtDbGljayk6IHZvaWQge1xuICAgIGNvbnN0IHBhdGggPSBkcmlsbERvd25QYXRoKHRoaXMuZGF0YSgpPy5kcmlsbCwgY2xpY2spO1xuXG4gICAgaWYgKHBhdGgpIHtcbiAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLnNldERyaWxsKHRoaXMuY29tcG9uZW50LmlkLCBwYXRoKTtcbiAgICB9XG4gIH1cblxuICAvLyBMaXN0cyB0aGUgY2xpY2sncyBhY3Rpb25zIGluIHRoZSBtYXJrIG1lbnUgYW5kIG9wZW5zIGl0IGF0IHRoZSBjbGljayxcbiAgLy8gdGhyb3VnaCB0aGUgemVyby1zaXplIGFuY2hvciAob3BlbkF0UG9pbnQpLlxuICBwcml2YXRlIF9vcGVuTWFya01lbnUoYWN0aW9uczogUmVwb3J0TWFya0FjdGlvbltdLCBjbGljazogUmVwb3J0TWFya0NsaWNrKTogdm9pZCB7XG4gICAgY29uc3QgYW5jaG9yID0gdGhpcy5tYXJrQW5jaG9yPy5uYXRpdmVFbGVtZW50O1xuXG4gICAgaWYgKCFhbmNob3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9tZW51Q2xpY2sgPSBjbGljaztcbiAgICB0aGlzLm1hcmtNZW51QWN0aW9ucy5zZXQoYWN0aW9ucyk7XG4gICAgb3BlbkF0UG9pbnQoYW5jaG9yLCBjbGljay5wb2ludGVyLCB0aGlzLnpvb20sICgpID0+IHRoaXMubWFya01lbnU/Lm9wZW5NZW51KG51bGwpKTtcbiAgfVxufVxuIiwiPGRpdlxuICAgIGNsYXNzPVwiY29tcG9uZW50LWJveFwiXG4gICAgW2NsYXNzLmVkaXRpbmddPVwiZWRpdE1vZGVcIlxuICAgIFtjbGFzcy50ZXh0XT1cImlzVGV4dFwiXG4gICAgW2NsYXNzLnNlbGVjdGVkXT1cInNlbGVjdGVkXCJcbiAgICBbY2xhc3MucmVmcmVzaGluZ109XCJyZWZyZXNoaW5nKClcIlxuICAgIFtzdHlsZS5wYWRkaW5nXT1cImJvZHlQYWRkaW5nXCJcbiAgICAocG9pbnRlcmRvd24pPVwib25Db21wb25lbnRQb2ludGVyRG93bigkZXZlbnQpXCJcbiAgICAobW91c2Vkb3duKT1cInN0b3BDYW52YXNQYW4oJGV2ZW50KVwiXG4gICAgKHRvdWNoc3RhcnQpPVwic3RvcENhbnZhc1BhbigkZXZlbnQpXCI+XG4gIDwhLS0gVGhlIGhlYWRlciBpcyBhbiBmcy1maWx0ZXI6IGhlYWRpbmcgdGVtcGxhdGUgPSB0aXRsZSAoYW5kIHRoZSBlZGl0LW1vZGVcbiAgICAgICBkcmFnIGhhbmRsZSksIGFjdGlvbnMgPSB0aGUgbWVudSwgaXRlbXMgPSBjb21wb25lbnQtbGV2ZWwgZmlsdGVyIGdyb3VwcyxcbiAgICAgICB0aGUgc2FtZSBzdHJpcCBmb3IgZXZlcnkgdHlwZSAobGlzdHMgaW5jbHVkZWQpLiBmcy1maWx0ZXIgcmVhZHMgaXRzXG4gICAgICAgY29uZmlnIG9uY2UsIHNvIHRoZSBibG9jayBpcyBrZXllZCBvbiB0aGUgY29tcG9uZW50LWZpbHRlciBzZXQgdG8gYmVcbiAgICAgICByZWNyZWF0ZWQgd2hlbiBpdCBjaGFuZ2VzLiBUaGUgdGl0bGUgc2hvd3MgaXRzIHRva2VucyBmaWxsZWQsIGFuZCBhXG4gICAgICAgZmlsdGVyIGNoYW5nZSByZXBhaW50cyBpdCBpbiBwbGFjZSAoc2hvd25UaXRsZSkuIC0tPlxuICA8IS0tIEEgdGV4dCBibG9jayBoYXMgbm8gdGl0bGUgYmFyIOKAlCBpdCBJUyBpdHMgd29yZHMsIGxpa2UgYSB0ZXh0IGJveCBvbiBhXG4gICAgICAgc2xpZGUg4oCUIHNvIGl0IGdldHMgbmVpdGhlciB0aGUgaGVhZGVyIG5vciB0aGUgZGF0YSBhY3Rpb25zLiAtLT5cbiAgQGZvciAoa2V5IG9mIGlzVGV4dCA/IFtdIDogW2ZpbHRlcktleV07IHRyYWNrIGtleSkge1xuICAgIDxmcy1maWx0ZXJcbiAgICAgICAgY2xhc3M9XCJjb21wb25lbnQtZmlsdGVyXCJcbiAgICAgICAgW2NvbmZpZ109XCJmaWx0ZXJDb25maWcoKVwiPlxuICAgICAgPG5nLXRlbXBsYXRlIGZzRmlsdGVySGVhZGluZz5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJjb21wb25lbnQtdGl0bGVcIlxuICAgICAgICAgICAgKHBvaW50ZXJkb3duKT1cIm9uRHJhZ1N0YXJ0KCRldmVudClcIj5cbiAgICAgICAgICA8IS0tIFdoaWxlIHRoZSBjaGFydCBpcyBkcmlsbGVkIHRoZSB0aXRsZSBsZWFkcyBpdHMgYnJlYWRjcnVtYjpcbiAgICAgICAgICAgICAgICdUaXRsZSDigLogMjAyNiDigLogUTMnLCB0aGUgdGl0bGUgYXMgdGhlIHZpZXdlciByZWFkcyBpdFxuICAgICAgICAgICAgICAgKHNob3duVGl0bGUpLiBUaGUgdGl0bGUgZ29lcyBiYWNrIHRvIHRoZSB0b3AgYW5kIGVhY2hcbiAgICAgICAgICAgICAgIGNydW1iIHRvIHRoZSBwZXJpb2QgaXQgbmFtZXM7IHRoZSBsYXN0IGlzIHdoZXJlIHRoZSBjaGFydCBpcy5cbiAgICAgICAgICAgICAgIEEgbG9uZyBwYXRoIGlzIGN1dCBhdCBpdHMgbGVmdCBlbmQsIHNvIHRoZSBjcnVtYnMgbmVhcmVzdCB0aGVcbiAgICAgICAgICAgICAgIGNoYXJ0IHN0YXkgaW4gdmlldy4gV2hpbGUgdGhlIGxheW91dCBpcyBlZGl0ZWQgdGhlIGNydW1icyBhcmVcbiAgICAgICAgICAgICAgIHBsYWluIHRleHQgKHRoZSBzdHlsZXNoZWV0OyBkcmlsbFRvIGRvZXMgbm90aGluZyB0aGVuKS4gLS0+XG4gICAgICAgICAgQGlmIChkcmlsbENydW1icygpLmxlbmd0aCkge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkcmlsbC1wYXRoXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGRpcj1cImx0clwiPlxuICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHJpbGwtY3J1bWJcIlxuICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZHJpbGxUbygwKVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImRyaWxsVG8oMClcIj5cbiAgICAgICAgICAgICAgICAgIHt7IHNob3duVGl0bGUgfX1cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgQGZvciAobGFiZWwgb2YgZHJpbGxDcnVtYnMoKTsgdHJhY2sgJGluZGV4OyBsZXQgbGFzdCA9ICRsYXN0KSB7XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRyaWxsLXNlcGFyYXRvclwiPnt7IGRyaWxsU2VwYXJhdG9yIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgQGlmIChsYXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRyaWxsLWNydW1iXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZHJpbGxUbygkaW5kZXggKyAxKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJkcmlsbFRvKCRpbmRleCArIDEpXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgbGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAge3sgc2hvd25UaXRsZSB9fVxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKHRydW5jYXRlZCkge1xuICAgICAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0cnVuY2F0ZWQtaWNvblwiXG4gICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIlNob3dpbmcgYSB0cnVuY2F0ZWQgcmVzdWx0IOKAlCByZWZpbmUgdGhlIGZpbHRlcnMgdG8gc2VlIGV2ZXJ5dGhpbmcuXCI+XG4gICAgICAgICAgICAgIHdhcm5pbmdfYW1iZXJcbiAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9mcy1maWx0ZXI+XG4gIH1cbiAgPCEtLSBUaGUgYWN0aW9ucyBtZW51IGlzIGZsb2F0ZWQgdG9wLXJpZ2h0IChhYnNvbHV0ZSkgcmF0aGVyIHRoYW4gbGl2aW5nIGluXG4gICAgICAgZnMtZmlsdGVyJ3MgYWN0aW9ucyBzbG90LCBzbyBpdHMgfjQwcHggYnV0dG9uIGhlaWdodCBubyBsb25nZXIgZHJpdmVzIHRoZVxuICAgICAgIGhlYWRlciByb3cncyBoZWlnaHQuIEl0IG92ZXJsYXlzIHRoZSBib3ggY29ybmVyOyB0aGUgaGVhZGluZyByZXNlcnZlc1xuICAgICAgIHJpZ2h0IHBhZGRpbmcgc28gYSBsb25nIHRpdGxlIGVsbGlwc2lzZXMgYmVmb3JlIGl0LiAtLT5cbiAgQGlmICghaXNUZXh0IHx8IChlZGl0TW9kZSAmJiAhdGV4dEVkaXRpbmcoKSkpIHtcbiAgICA8YnV0dG9uXG4gICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICBjbGFzcz1cImNvbXBvbmVudC1tZW51XCJcbiAgICAgICAgW2ZzTWVudVRyaWdnZXJGb3JdPVwibWVudVwiXG4gICAgICAgIChwb2ludGVyZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAobW91c2Vkb3duKT1cInN0b3BDYW52YXNQYW4oJGV2ZW50KVwiPlxuICAgICAgPG1hdC1pY29uPm1vcmVfdmVydDwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gICAgPCEtLSBCZXNpZGUgaXRzIHRyaWdnZXIsIGluc2lkZSB0aGUgc2FtZSBibG9jazogYW4gZnMtbWVudSB0aGF0IGZpbmRzIG5vXG4gICAgICAgICB0cmlnZ2VyIG9mIGl0cyBvd24gZHJhd3Mgb25lLiAtLT5cbiAgICA8ZnMtbWVudSAjbWVudT5cbiAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgIGZzLW1lbnUtaXRlbVxuICAgICAgICAgIFtoaWRkZW5dPVwiIWlzVGV4dFwiXG4gICAgICAgICAgKGNsaWNrKT1cImVkaXRUZXh0KClcIj5cbiAgICAgICAgPG1hdC1pY29uPmVkaXQ8L21hdC1pY29uPlxuICAgICAgICA8c3Bhbj5FZGl0IHRleHQ8L3NwYW4+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgZnMtbWVudS1pdGVtXG4gICAgICAgICAgW2hpZGRlbl09XCIhaXNUZXh0XCJcbiAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlVGV4dCgpXCI+XG4gICAgICAgIDxtYXQtaWNvbj5kZWxldGU8L21hdC1pY29uPlxuICAgICAgICA8c3Bhbj5EZWxldGU8L3NwYW4+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgZnMtbWVudS1pdGVtXG4gICAgICAgICAgW2hpZGRlbl09XCIhZHJpbGxDcnVtYnMoKS5sZW5ndGggfHwgZWRpdE1vZGVcIlxuICAgICAgICAgIChjbGljayk9XCJkcmlsbFVwKClcIj5cbiAgICAgICAgPG1hdC1pY29uPmFycm93X3Vwd2FyZDwvbWF0LWljb24+XG4gICAgICAgIDxzcGFuPkRyaWxsIHVwPC9zcGFuPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgIGZzLW1lbnUtaXRlbVxuICAgICAgICAgIFtoaWRkZW5dPVwiIWRyaWxsQ3J1bWJzKCkubGVuZ3RoIHx8IGVkaXRNb2RlXCJcbiAgICAgICAgICAoY2xpY2spPVwiZHJpbGxUbygwKVwiPlxuICAgICAgICA8bWF0LWljb24+dmVydGljYWxfYWxpZ25fdG9wPC9tYXQtaWNvbj5cbiAgICAgICAgPHNwYW4+QmFjayB0byB0b3A8L3NwYW4+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgZnMtbWVudS1pdGVtXG4gICAgICAgICAgW2hpZGRlbl09XCJpc1RleHRcIlxuICAgICAgICAgIChjbGljayk9XCJzZXR0aW5ncygpXCI+XG4gICAgICAgIDxtYXQtaWNvbj50dW5lPC9tYXQtaWNvbj5cbiAgICAgICAgPHNwYW4+U2V0dGluZ3M8L3NwYW4+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgZnMtbWVudS1pdGVtXG4gICAgICAgICAgW2hpZGRlbl09XCJpc1RleHRcIlxuICAgICAgICAgIChjbGljayk9XCJleHBvcnRDc3YoKVwiPlxuICAgICAgICA8bWF0LWljb24+ZG93bmxvYWQ8L21hdC1pY29uPlxuICAgICAgICA8c3Bhbj5FeHBvcnQgQ1NWPC9zcGFuPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgIGZzLW1lbnUtaXRlbVxuICAgICAgICAgIFtoaWRkZW5dPVwiIWhpZGVzQ29sdW1uc1wiXG4gICAgICAgICAgKGNsaWNrKT1cImNob29zZUNvbHVtbnMoKVwiPlxuICAgICAgICA8bWF0LWljb24+dmlld19jb2x1bW48L21hdC1pY29uPlxuICAgICAgICA8c3Bhbj5Db2x1bW5zPC9zcGFuPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2ZzLW1lbnU+XG4gIH1cbiAgPGRpdiBjbGFzcz1cImNvbXBvbmVudC1ib2R5XCI+XG4gICAgQGlmIChpc1RleHQpIHtcbiAgICAgIDxhcHAtcmVwb3J0LWNvbXBvbmVudC10ZXh0XG4gICAgICAgIFtodG1sXT1cInRleHRIdG1sKCkgPz8gY29tcG9uZW50LmNvbmZpZz8uaHRtbCA/PyAnJ1wiXG4gICAgICAgIFt0b2tlbnNdPVwidG9rZW5zKClcIlxuICAgICAgICBbZWRpdGluZ109XCJ0ZXh0RWRpdGluZygpXCJcbiAgICAgICAgW3Nob3duRWxzZXdoZXJlXT1cInNob3duRWxzZXdoZXJlXCJcbiAgICAgICAgKHNhdmVkKT1cIm9uVGV4dFNhdmVkKCRldmVudClcIlxuICAgICAgICAoZWRpdEVuZGVkKT1cInRleHRFZGl0aW5nLnNldChmYWxzZSlcIlxuICAgICAgICAodmFsdWVTZXR0aW5ncyk9XCJ2YWx1ZVNldHRpbmdzLmVtaXQoJGV2ZW50KVwiPlxuICAgICAgPC9hcHAtcmVwb3J0LWNvbXBvbmVudC10ZXh0PlxuICAgIH0gQGVsc2UgaWYgKGNvbXBvbmVudC50eXBlID09PSAnbGlzdCcpIHtcbiAgICAgIEBmb3IgKGtleSBvZiBbbGlzdFJlc2V0S2V5KCldOyB0cmFjayBrZXkpIHtcbiAgICAgICAgPGFwcC1yZXBvcnQtY29tcG9uZW50LWxpc3RcbiAgICAgICAgICBbcmVwb3J0SWRdPVwicmVwb3J0SWRcIlxuICAgICAgICAgIFtjb21wb25lbnRdPVwiY29tcG9uZW50XCI+XG4gICAgICAgIDwvYXBwLXJlcG9ydC1jb21wb25lbnQtbGlzdD5cbiAgICAgIH1cbiAgICB9IEBlbHNlIGlmIChjb21wb25lbnQudHlwZSA9PT0gJ2dyaWQnKSB7XG4gICAgICA8YXBwLXJlcG9ydC1jb21wb25lbnQtZ3JpZFxuICAgICAgICBbcmVwb3J0SWRdPVwicmVwb3J0SWRcIlxuICAgICAgICBbY29tcG9uZW50XT1cImNvbXBvbmVudFwiPlxuICAgICAgPC9hcHAtcmVwb3J0LWNvbXBvbmVudC1ncmlkPlxuICAgIH0gQGVsc2UgaWYgKGxvYWRpbmcoKSkge1xuICAgICAgPCEtLSBIb2xkcyB0aGUgdGlsZSdzIGhlaWdodCBmb3IgdGhlIHNwaW5uZXIgb24gdGhlIGZpcnN0IGxvYWQuIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbXBvbmVudC1zdGF0ZVwiPjwvZGl2PlxuICAgIH0gQGVsc2UgaWYgKGVycm9yKCkpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJjb21wb25lbnQtc3RhdGUgZXJyb3JcIj5cbiAgICAgICAge3sgZXJyb3IoKSB9fVxuICAgICAgPC9kaXY+XG4gICAgfSBAZWxzZSBpZiAoIWRhdGEoKT8ucm93cz8ubGVuZ3RoKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiY29tcG9uZW50LXN0YXRlXCI+XG4gICAgICAgIHt7IGVtcHR5TWVzc2FnZSgpIH19XG4gICAgICA8L2Rpdj5cbiAgICB9IEBlbHNlIGlmIChjb21wb25lbnQudHlwZSA9PT0gJ2twaScpIHtcbiAgICAgIDxhcHAtcmVwb3J0LWNvbXBvbmVudC1rcGlcbiAgICAgICAgW2NvbXBvbmVudF09XCJjb21wb25lbnRcIlxuICAgICAgICBbZGF0YV09XCJkYXRhKClcIlxuICAgICAgICAobWFya0NsaWNrKT1cIm9uTWFya0NsaWNrKCRldmVudClcIj5cbiAgICAgIDwvYXBwLXJlcG9ydC1jb21wb25lbnQta3BpPlxuICAgIH0gQGVsc2Uge1xuICAgICAgPGFwcC1yZXBvcnQtY29tcG9uZW50LWNoYXJ0XG4gICAgICAgIFtjb21wb25lbnRdPVwiY29tcG9uZW50XCJcbiAgICAgICAgW2RhdGFdPVwiZGF0YSgpXCJcbiAgICAgICAgW2FjdGlvbnNdPVwidGlsZUFjdGlvbnMoKVwiXG4gICAgICAgIFsobGVnZW5kU2VsZWN0ZWQpXT1cImxlZ2VuZFNlbGVjdGVkXCJcbiAgICAgICAgKG1hcmtDbGljayk9XCJvbk1hcmtDbGljaygkZXZlbnQpXCJcbiAgICAgICAgKG1hcmtNaXNzKT1cIm9uTWFya01pc3MoKVwiPlxuICAgICAgPC9hcHAtcmVwb3J0LWNvbXBvbmVudC1jaGFydD5cbiAgICB9XG4gICAgPCEtLSBJbiBlZGl0IG1vZGUgYSB0cmFuc3BhcmVudCB2ZWlsIG92ZXIgdGhlIGJvZHkgbWFrZXMgdGhlIFdIT0xFXG4gICAgICAgICBjb21wb25lbnQgZHJhZ2dhYmxlIChpbmR1c3RyeSBzdGFuZGFyZDogeW91IGdyYWIgdGhlIG9iamVjdCwgbm90IGp1c3RcbiAgICAgICAgIGl0cyB0aXRsZSBiYXIpIGFuZCBrZWVwcyBpbm5lciB3aWRnZXRzIGZyb20gc3dhbGxvd2luZyB0aGUgZ2VzdHVyZS4gLS0+XG4gICAgQGlmIChlZGl0TW9kZSAmJiAhdGV4dEVkaXRpbmcoKSkge1xuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImRyYWctdmVpbFwiXG4gICAgICAgIChwb2ludGVyZG93bik9XCJvbkRyYWdTdGFydCgkZXZlbnQpXCI+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuICA8IS0tIEEgbG9hZDogYSBzcGlubmVyIGNlbnRyZWQgb24gdGhlIHdob2xlIHRpbGUuIE9uIGEgcmVmZXRjaCB0aGUgYm9keSBhbmRcbiAgICAgICB0aGUgbWVudSBhcmUgZGltbWVkIHVuZGVyIGl0ICgucmVmcmVzaGluZyk7IHRoZSB0aXRsZSBpcyBub3QuIC0tPlxuICBAaWYgKGxvYWRpbmcoKSB8fCByZWZyZXNoaW5nKCkpIHtcbiAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXJcbiAgICAgIGNsYXNzPVwibG9hZC1zcGlubmVyXCJcbiAgICAgIGFyaWEtbGFiZWw9XCJMb2FkaW5nIGRhdGFcIlxuICAgICAgbW9kZT1cImluZGV0ZXJtaW5hdGVcIlxuICAgICAgW2RpYW1ldGVyXT1cIjE1XCI+XG4gICAgPC9tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcj5cbiAgfVxuPC9kaXY+XG48IS0tIFRoZSBtYXJrIG1lbnUsIGZvciBhIGNsaWNrIHdob3NlIG1hcmsgb2ZmZXJzIHR3byBvciBtb3JlIGFjdGlvbnMuIEl0XG4gICAgIG9wZW5zIGF0IHRoZSBjbGljazogaXRzIHRyaWdnZXIgaXMgYSB6ZXJvLXNpemUgYW5jaG9yIHRoYXRcbiAgICAgYW5jaG9yLWF0LXBvaW50LnRzIG1vdmVzIHRoZXJlIGZpcnN0LiAtLT5cbkBpZiAoIWlzVGV4dCAmJiAhZWRpdE1vZGUpIHtcbiAgPHNwYW5cbiAgICAjbWFya0FuY2hvclxuICAgIFtzdHlsZS5wb3NpdGlvbl09XCInYWJzb2x1dGUnXCJcbiAgICBbZnNNZW51VHJpZ2dlckZvcl09XCJtYXJrTWVudVwiPlxuICA8L3NwYW4+XG4gIDxmcy1tZW51ICNtYXJrTWVudT5cbiAgICBAZm9yIChhY3Rpb24gb2YgbWFya01lbnVBY3Rpb25zKCk7IHRyYWNrIGFjdGlvbikge1xuICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgZnMtbWVudS1pdGVtXG4gICAgICAgICAgKGNsaWNrKT1cInJ1bk1hcmtBY3Rpb24oYWN0aW9uKVwiPlxuICAgICAgICB7eyBtYXJrQWN0aW9uTGFiZWxzW2FjdGlvbl0gfX1cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgfVxuICA8L2ZzLW1lbnU+XG59XG48IS0tIEhhbmRsZXMgbGl2ZSBPVVRTSURFIHRoZSBjbGlwcGVkIGJveCBzbyB0aGV5IHN0cmFkZGxlIGl0cyBlZGdlcy4gLS0+XG5AaWYgKGVkaXRNb2RlICYmIHNlbGVjdGVkKSB7XG4gIEBmb3IgKGhhbmRsZSBvZiByZXNpemVIYW5kbGVzOyB0cmFjayBoYW5kbGUpIHtcbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImhhbmRsZSBoYW5kbGUte3sgaGFuZGxlIH19XCJcbiAgICAgIChtb3VzZWRvd24pPVwic3RvcENhbnZhc1BhbigkZXZlbnQpXCJcbiAgICAgIChwb2ludGVyZG93bik9XCJvblJlc2l6ZVN0YXJ0KCRldmVudCwgaGFuZGxlKVwiPlxuICAgIDwvZGl2PlxuICB9XG59Il19
|
|
813
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWNvbXBvbmVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvY29tcG9uZW50cy9yZXBvcnQtY29tcG9uZW50L3JlcG9ydC1jb21wb25lbnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvcmVwb3J0LWNvbXBvbmVudC9yZXBvcnQtY29tcG9uZW50LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFDMUQsWUFBWSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFxQixNQUFNLEVBQWlCLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUMvRyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEdBQ2pDLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV2RCxPQUFPLEVBQWdCLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRCxPQUFP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QUFLO2dCQUVVLElBQUk7c0JBQW5CLEtBQUs7Z0JBQ1UsT0FBTztzQkFBdEIsS0FBSztnQkFDVSxRQUFRO3NCQUF2QixLQUFLO2dCQUVXLGVBQWU7c0JBQS9CLE1BQU07Z0JBQ1UsZUFBZTtzQkFBL0IsTUFBTTtnQkFDVSxZQUFZO3NCQUE1QixNQUFNO2dCQXlDQSxjQUFjO3NCQURwQixTQUFTO3VCQUFDLHVCQUF1QjtnQkFnRTNCLFFBQVE7c0JBRGQsU0FBUzt1QkFBQyxVQUFVO2dCQUlkLFVBQVU7c0JBRGhCLFNBQVM7dUJBQUMsWUFBWTtnQkEybUJaLFVBQVU7c0JBRHBCLFdBQVc7dUJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRGVzdHJveVJlZiwgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLCBIb3N0QmluZGluZywgSW5wdXQsIE5nWm9uZSwgT25DaGFuZ2VzLCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkLCBjb21wdXRlZCwgaW5qZWN0LFxuICBpbnB1dCwgb3V0cHV0LCBzaWduYWwsIHZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cblxuaW1wb3J0IHsgTWF0SWNvbkJ1dHRvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgTWF0SWNvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0UHJvZ3Jlc3NTcGlubmVyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3Mtc3Bpbm5lcic7XG5pbXBvcnQgeyBNYXRUb29sdGlwIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5cbmltcG9ydCB7IEZpbHRlckNvbmZpZywgRnNGaWx0ZXJNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9maWx0ZXInO1xuaW1wb3J0IHsgRnNNZW51Q29tcG9uZW50LCBGc01lbnVNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9tZW51JztcbmltcG9ydCB7IEZzTWVzc2FnZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21lc3NhZ2UnO1xuaW1wb3J0IHsgRnNQcm9jZXNzIH0gZnJvbSAnQGZpcmVzdGl0Y2gvcHJvY2Vzcyc7XG5pbXBvcnQgeyBGc1Byb21wdCB9IGZyb20gJ0BmaXJlc3RpdGNoL3Byb21wdCc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIGZpbHRlciBhcyByeEZpbHRlciwgbWFwLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5cbmltcG9ydCB7IG9wZW5BdFBvaW50IH0gZnJvbSAnLi4vLi4vYW5jaG9yLWF0LXBvaW50JztcbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuLi8uLi9kYXRhL3JlcG9ydC5kYXRhJztcbmltcG9ydCB7IExpc3RDb2x1bW5zQ29tcG9uZW50LCBMaXN0Q29sdW1uc0RpYWxvZ0RhdGEgfSBmcm9tICcuLi8uLi9kaWFsb2dzL2xpc3QtY29sdW1ucy9saXN0LWNvbHVtbnMuY29tcG9uZW50JztcbmltcG9ydCB7XG4gIERSSUxMX0NSVU1CX1NFUEFSQVRPUiwgRFJJTExfUkVTRVRfTUVTU0FHRSwgYWRvcHRlZERyaWxsUGF0aCwgZHJpbGxDcnVtYkxhYmVscywgZHJpbGxPdXRzaWRlTWVzc2FnZSxcbiAgZHJpbGxSZXNldE5vdGVkLFxufSBmcm9tICcuLi8uLi9kcmlsbC1jcnVtYnMnO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50RGF0YSxcbiAgQ29tcG9uZW50U2V0dGluZ3MsXG4gIEZpbHRlckdyb3VwVmFsdWUsXG4gIEtwaUNvbmZpZyxcbiAgUmVwb3J0Q29tcG9uZW50IGFzIFJlcG9ydENvbXBvbmVudE1vZGVsLFxuICBSZXBvcnRDb21wb25lbnRUeXBlLFxuICBSZXBvcnRGaWx0ZXJHcm91cCxcbn0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydE1hcmtBY3Rpb24gfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC1tYXJrLWFjdGlvbi50eXBlJztcbmltcG9ydCB7IFJlcG9ydE1hcmtDbGljayB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LW1hcmstY2xpY2suaW50ZXJmYWNlJztcbmltcG9ydCB7IFRpbGVMb2FkUmVzdWx0IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy90aWxlLWxvYWQtcmVzdWx0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBrcGlDYXJkU2V0dGluZ3MsIHNhbWVLcGlDYXJkU2V0dGluZ3MgfSBmcm9tICcuLi8uLi9rcGktY2FyZCc7XG5pbXBvcnQgeyBjb21wb25lbnRQYWRkaW5nQ3NzIH0gZnJvbSAnLi4vLi4vbGF5b3V0JztcbmltcG9ydCB7IGxpc3RIaWRlYWJsZUNvbHVtbnMgfSBmcm9tICcuLi8uLi9saXN0LWNvbmZpZyc7XG5pbXBvcnQge1xuICBNQVJLX0FDVElPTl9MQUJFTFMsIGRlY2lkZU1hcmtDbGljaywgZHJpbGxEb3duUGF0aCwgbWFya0FjdGlvbnMsIHRpbGVNYXJrQWN0aW9ucyxcbn0gZnJvbSAnLi4vLi4vbWFyay1jbGljayc7XG5pbXBvcnQge1xuICBMSVNUX1NFQVJDSF9JVEVNLCBmaWx0ZXJJdGVtRm9yR3JvdXAsIGdyb3VwVmFsdWVzRnJvbVF1ZXJ5LCBsaXN0U2VhcmNoSXRlbSxcbn0gZnJvbSAnLi4vLi4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XG5pbXBvcnQgeyBncm91cFZhbHVlU2lnbmF0dXJlIH0gZnJvbSAnLi4vLi4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XG5pbXBvcnQgeyBvZmZlcmVkVmlld2VyRmVhdHVyZXMgfSBmcm9tICcuLi8uLi9yZXBvcnQtdmlld2VyLWZlYXR1cmVzJztcbmltcG9ydCB7IFJlcG9ydEZpbHRlck9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVwb3J0LWZpbHRlci1vcHRpb25zLnNlcnZpY2UnO1xuaW1wb3J0IHsgbW92ZWRHcm91cFZhbHVlcywgUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IGZvbGxvd3NHcm91cEJ5IH0gZnJvbSAnLi4vLi4vZ3JvdXAtYnknO1xuaW1wb3J0IHsgdGlsZUxvYWRzIH0gZnJvbSAnLi4vLi4vdGlsZS1sb2Fkcyc7XG5pbXBvcnQgeyBDb21wb25lbnRDaGFydENvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudC1jaGFydC9jb21wb25lbnQtY2hhcnQuY29tcG9uZW50JztcbmltcG9ydCB7IENvbXBvbmVudEdyaWRDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnQtZ3JpZC9jb21wb25lbnQtZ3JpZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29tcG9uZW50S3BpQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50LWtwaS9jb21wb25lbnQta3BpLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb21wb25lbnRMaXN0Q29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50LWxpc3QvY29tcG9uZW50LWxpc3QuY29tcG9uZW50JztcbmltcG9ydCB7IENvbXBvbmVudFRleHRDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnQtdGV4dC9jb21wb25lbnQtdGV4dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGV4dFRva2VuQ29udGV4dCwgZmlsbFRpdGxlVG9rZW5zIH0gZnJvbSAnLi4vLi4vdGV4dCc7XG5pbXBvcnQgeyBOT19WQUxVRV9LRVlTLCBpc0RyYXduLCB2YWx1ZUtleXMgfSBmcm9tICcuLi8uLi92YWx1ZXMnO1xuaW1wb3J0IHsgQ2FudmFzU25hcHBlciwgUFhfUEVSX0lOQ0ggfSBmcm9tICcuLi9yZXBvcnQtY2FudmFzL3JlcG9ydC1jYW52YXMuY29tcG9uZW50JztcblxuXG4vLyBSZXNpemUgaGFuZGxlcywgbmFtZWQgYnkgY29tcGFzcyBkaXJlY3Rpb24uXG5jb25zdCBIQU5ETEVTID0gWydudycsICduJywgJ25lJywgJ2UnLCAnc2UnLCAncycsICdzdycsICd3J10gYXMgY29uc3Q7XG50eXBlIEhhbmRsZSA9IHR5cGVvZiBIQU5ETEVTW251bWJlcl07XG5cbmNvbnN0IE1JTl9XID0gMC42OyAvLyBpbmNoZXNcbmNvbnN0IE1JTl9IID0gMC40OyAvLyBpbmNoZXNcblxuLy8gVGhlIHRpbGVzIHRoYXQgcmVhZCB0aGVpciBvd24gcm93czogYSBsaXN0IHRocm91Z2ggRnNMaXN0IHBhZ2luZywgYSBncmlkXG4vLyB0aHJvdWdoIGZzLWdyaWQncyBzb3VyY2UuIFRoaXMgY29tcG9uZW50IGxvYWRzIGV2ZXJ5IG90aGVyIHRpbGUncyBkYXRhLlxuY29uc3QgU0VMRl9SRUFESU5HX1RZUEVTOiByZWFkb25seSBSZXBvcnRDb21wb25lbnRUeXBlW10gPSBbJ2xpc3QnLCAnZ3JpZCddO1xuXG4vLyBUd28gcHJlc3NlcyBvbiBhIHRleHQgYmxvY2sgdGhpcyBjbG9zZSB0b2dldGhlciBvcGVuIGl0cyBlZGl0b3IuIERldGVjdGVkXG4vLyBoZXJlIHJhdGhlciB0aGFuIHdpdGggYSBkYmxjbGljayBsaXN0ZW5lciBiZWNhdXNlIHRoZSBkcmFnIGxvb3AgY2xhaW1zIHRoZVxuLy8gcG9pbnRlciBvbiBldmVyeSBwcmVzcywgYW5kIGEgYnJvd3NlciBpcyBub3Qgb2JsaWdlZCB0byBkZWxpdmVyIGRibGNsaWNrXG4vLyB0aHJvdWdoIGEgY2FwdHVyZWQsIGRlZmF1bHQtcHJldmVudGVkIHBvaW50ZXIuXG5jb25zdCBET1VCTEVfUFJFU1NfTVMgPSA0MDA7XG5cbi8vIE9uZSBjb21wb25lbnQgb24gdGhlIHBhZ2U6IHRpdGxlIGJhciwgdGhlIHR5cGUtc3BlY2lmaWMgYm9keSAoY2hhcnQgfCBsaXN0XG4vLyB8IGtwaSksIGEgbWVudSAoc2V0dGluZ3MsIGZpbHRlciB0b2dnbGVzLCBleHBvcnQpIOKAlCBhbmQgdGhlIGVkaXRpbmdcbi8vIGludGVyYWN0aW9uczogY2xpY2sgc2VsZWN0czsgdGhlIHNlbGVjdGlvbiBmcmFtZSBzaG93cyA4IHJlc2l6ZSBoYW5kbGVzO1xuLy8gZHJhZ2dpbmcgdGhlIGJvZHkgbW92ZXMgd2l0aCBzbWFydCBhbGlnbm1lbnQgZ3VpZGVzICh2aWEgdGhlIGNhbnZhc1xuLy8gc25hcHBlcik7IGV2ZXJ5dGhpbmcgd29ya3MgYXQgYW55IHpvb20gKHBpeGVsIGRlbHRhcyDDtyB6b29twrc5NiDihpIgaW5jaGVzKS5cbi8vXG4vLyBDaGFydHMgYW5kIEtQSXMgZmV0Y2ggdGhlaXIgb3duIGRhdGEgaGVyZTsgbGlzdHMgZmV0Y2ggaW5zaWRlXG4vLyBDb21wb25lbnRMaXN0Q29tcG9uZW50IHRocm91Z2ggRnNMaXN0IHBhZ2luZywgYW5kIGdyaWRzIGluc2lkZVxuLy8gQ29tcG9uZW50R3JpZENvbXBvbmVudCB0aHJvdWdoIGZzLWdyaWQncyBzb3VyY2UuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcmVwb3J0LWNvbXBvbmVudCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9yZXBvcnQtY29tcG9uZW50LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcmVwb3J0LWNvbXBvbmVudC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIE1hdEljb24sXG4gICAgTWF0SWNvbkJ1dHRvbixcbiAgICBNYXRQcm9ncmVzc1NwaW5uZXIsXG4gICAgTWF0VG9vbHRpcCxcbiAgICBGc0ZpbHRlck1vZHVsZSxcbiAgICBGc01lbnVNb2R1bGUsXG4gICAgQ29tcG9uZW50Q2hhcnRDb21wb25lbnQsXG4gICAgQ29tcG9uZW50R3JpZENvbXBvbmVudCxcbiAgICBDb21wb25lbnRLcGlDb21wb25lbnQsXG4gICAgQ29tcG9uZW50TGlzdENvbXBvbmVudCxcbiAgICBDb21wb25lbnRUZXh0Q29tcG9uZW50LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBSZXBvcnRDb21wb25lbnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG5cbiAgQElucHV0KCkgcHVibGljIHJlcG9ydElkOiBudW1iZXI7XG4gIEBJbnB1dCgpIHB1YmxpYyBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudE1vZGVsO1xuICBASW5wdXQoKSBwdWJsaWMgZ3JvdXBzOiBNYXA8bnVtYmVyLCBSZXBvcnRGaWx0ZXJHcm91cD47XG4gIEBJbnB1dCgpIHB1YmxpYyBlZGl0TW9kZSA9IGZhbHNlO1xuICAvLyBUaGUgY2FudmFzIHpvb20g4oCUIGNvbnZlcnRzIG9uLXNjcmVlbiBwaXhlbCBkZWx0YXMgYmFjayB0byBpbmNoZXMuXG4gIEBJbnB1dCgpIHB1YmxpYyB6b29tID0gMTtcbiAgQElucHV0KCkgcHVibGljIHNuYXBwZXI6IENhbnZhc1NuYXBwZXIgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgcHVibGljIHNlbGVjdGVkID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIHB1YmxpYyBzZWxlY3RDb21wb25lbnQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBwb3NpdGlvbkNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgY29tcG9uZW50SWQ6IG51bWJlciB9ICYgUmVjb3JkPHN0cmluZywgbnVtYmVyPj4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBvcGVuU2V0dGluZ3MgPSBuZXcgRXZlbnRFbWl0dGVyPFJlcG9ydENvbXBvbmVudE1vZGVsPigpO1xuXG4gIC8vIFdoYXQgdGhlIHt7dG9rZW5zfX0gb2YgYSB0ZXh0IGJsb2NrLCBhbmQgb2YgYW55IGNvbXBvbmVudCdzIHRpdGxlLCBmaWxsXG4gIC8vIHdpdGggd2hlcmUgaXQgaXMgZHJhd246IGl0cyBwYWdlJ3MsIG9yIHRoZSBtYXN0ZXIncyBmb3IgYSBoZWFkZXIgb3JcbiAgLy8gZm9vdGVyIGNvbXBvbmVudC5cbiAgcHVibGljIHJlYWRvbmx5IHRva2VucyA9IGlucHV0PFRleHRUb2tlbkNvbnRleHQ+KHsgcGFnZU51bWJlcjogMSwgcGFnZU5hbWU6ICcnLCByZXBvcnROYW1lOiAnJyB9KTtcblxuICAvLyBUaGUgdmFsdWUga2V5cyB0aGUgb3RoZXIgdGV4dCBibG9ja3Mgb2YgYSB0ZXh0J3MgbGF5ZXIgc2hvdywgcmVhZCBieSB0aGVcbiAgLy8gY2FudmFzIHdoZW4gdGhlIHRleHQncyBlZGl0b3IgYXNrcy5cbiAgcHVibGljIHJlYWRvbmx5IHZhbHVlS2V5c0Vsc2V3aGVyZSA9IGlucHV0PCgodGV4dDogUmVwb3J0Q29tcG9uZW50TW9kZWwpID0+IFJlYWRvbmx5U2V0PHN0cmluZz4pIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gQSB0ZXh0IGJsb2NrIHdhcyBkZWxldGVkIGZyb20gaXRzIG1lbnUg4oCUIHRoZSBjYW52YXMgZHJvcHMgaXQuXG4gIHB1YmxpYyByZWFkb25seSByZW1vdmVkID0gb3V0cHV0PG51bWJlcj4oKTtcblxuICAvLyBBIHZhbHVlJ3Mgc2V0dGluZ3Mgd2VyZSBhc2tlZCBmb3IgZnJvbSBpdHMgY2hpcCBpbiB0aGUgdGV4dCwgYnkgdGhlXG4gIC8vIHZhbHVlJ3Mga2V5LiBUaGUgY2FudmFzIG9wZW5zIHRoZW0uXG4gIHB1YmxpYyByZWFkb25seSB2YWx1ZVNldHRpbmdzID0gb3V0cHV0PHN0cmluZz4oKTtcblxuICAvLyBUaGUgdGV4dCdzIGh0bWwgd2FzIHNhdmVkLiBFbWl0dGVkIG9uIHRoZSByZXNwb25zZSwgc28gdGhlIHNlcnZlciBhbHJlYWR5XG4gIC8vIGhvbGRzIHRoZSBodG1sIHdoZW4gdGhlIGNhbnZhcyByZWFkcyB0aGUgdmFsdWVzIGl0IHNob3dzLlxuICBwdWJsaWMgcmVhZG9ubHkgdGV4dFNhdmVkID0gb3V0cHV0PHN0cmluZz4oKTtcblxuICAvLyBEZWxldGluZyB0aGUgdGV4dCBhbHNvIGRlbGV0ZWQgdGhlIHZhbHVlcyBubyBvdGhlciB0ZXh0IG9uIGl0cyBwYWdlIHJlYWRzLFxuICAvLyBieSBpZC4gVGhlIGNhbnZhcyBoYXMgdGhlIHJlcG9ydCByZWxvYWRlZC5cbiAgcHVibGljIHJlYWRvbmx5IHZhbHVlc1JlbW92ZWQgPSBvdXRwdXQ8bnVtYmVyW10+KCk7XG5cbiAgLy8gVGhlIHRleHQgYmxvY2sncyBlZGl0b3IgaXMgb3BlbiAoZG91YmxlLXByZXNzIGluIGVkaXQgbW9kZSkuIENsb3NlZCBieSBmb2N1c1xuICAvLyBsZWF2aW5nIHRoZSBibG9jaywgYnkgZGVzZWxlY3RpbmcgaXQsIG9yIGJ5IGxlYXZpbmcgZWRpdCBtb2RlIOKAlCBlYWNoIG9mXG4gIC8vIHdoaWNoIHNhdmVzLlxuICBwdWJsaWMgcmVhZG9ubHkgdGV4dEVkaXRpbmcgPSBzaWduYWwoZmFsc2UpO1xuICAvLyBBIHRleHQgYmxvY2sncyBodG1sIGFzIGxhc3Qgc2F2ZWQgaGVyZTsgbnVsbCB1bnRpbCB0aGVuLCBzbyB0aGUgYmxvY2tcbiAgLy8gc2hvd3MgaXRzIHN0b3JlZCBodG1sLlxuICBwdWJsaWMgcmVhZG9ubHkgdGV4dEh0bWwgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gV2hhdCB0aGUgb3RoZXIgdGV4dCBibG9ja3Mgb2YgdGhpcyB0ZXh0J3MgbGF5ZXIgc2hvdywgZm9yIGl0cyBlZGl0b3Inc1xuICAvLyBub3RpY2UuIFN0YWJsZSwgc28gdGhlIHRleHQgYmxvY2sncyBpbnB1dCBuZXZlciBjaGFuZ2VzOyBpdCBhc2tzIHdoZW4gYW5cbiAgLy8gZWRpdCB0YWtlcyBhIHZhbHVlJ3MgbGFzdCBjaGlwIG91dC5cbiAgcHVibGljIHJlYWRvbmx5IHNob3duRWxzZXdoZXJlID0gKCk6IFJlYWRvbmx5U2V0PHN0cmluZz4gPT5cbiAgICB0aGlzLnZhbHVlS2V5c0Vsc2V3aGVyZSgpPy4odGhpcy5jb21wb25lbnQpID8/IE5PX1ZBTFVFX0tFWVM7XG5cbiAgQFZpZXdDaGlsZChDb21wb25lbnRDaGFydENvbXBvbmVudClcbiAgcHVibGljIGNoYXJ0Q29tcG9uZW50OiBDb21wb25lbnRDaGFydENvbXBvbmVudDtcblxuICAvLyBSZXNpemUgaGFuZGxlcyBieSB0eXBlOiBhIGZpeGVkLWhlaWdodCBjb21wb25lbnQgKGNoYXJ0L2xpc3QpXG4gIC8vIGdldHMgYWxsIGVpZ2h0IChyZXNpemUgd2lkdGggQU5EIGhlaWdodCk7IGFuIGF1dG8taGVpZ2h0IG9uZSAoa3BpKSBnZXRzXG4gIC8vIG9ubHkgdGhlIHNpZGUgaGFuZGxlcyBzaW5jZSBpdHMgaGVpZ2h0IGZpdHMgaXRzIGNvbnRlbnQgYW5kIGNhbid0IGJlIHNldC5cbiAgcHVibGljIGdldCByZXNpemVIYW5kbGVzKCk6IHJlYWRvbmx5IEhhbmRsZVtdIHtcbiAgICByZXR1cm4gdGhpcy5faGVpZ2h0QXV0byA/IFsnZScsICd3J10gOiBIQU5ETEVTO1xuICB9XG5cbiAgLy8gVGhlIGNvbXBvbmVudCdzIGhlYWRlciBJUyBhbiBmcy1maWx0ZXI6IGhlYWRpbmcgdGVtcGxhdGUgPSBpdHMgdGl0bGUgKGFuZFxuICAvLyB0aGUgZHJhZyBoYW5kbGUpLCBhY3Rpb25zID0gdGhlIFNldHRpbmdzIC8gZmlsdGVyLXRvZ2dsZXMgLyBFeHBvcnQgbWVudSxcbiAgLy8gaXRlbXMgPSBpdHMgY29tcG9uZW50LWxldmVsIGZpbHRlciBncm91cHMsIGZvciBldmVyeSBjb21wb25lbnQgdHlwZSwgbGlzdHNcbiAgLy8gaW5jbHVkZWQsIHBsdXMgYSBsaXN0J3Mgc2VhcmNoIGJveC4gUmVidWlsdCB3aGVuIGEgZmlsdGVyIHRvZ2dsZSBjaGFuZ2VzIHdoaWNoIGdyb3VwcyBzaG93LFxuICAvLyBhbmQgd2hlbiB0aGUgc2V0dGluZ3MgZGlhbG9nIGNoYW5nZXMgdGhlIHRpdGxlIG9yIHBhZGRpbmc6IHNldHRpbmcgaXRcbiAgLy8gcmVwYWludHMgdGhlIGhlYWRlciBhbmQgYm9keS5cbiAgcHVibGljIHJlYWRvbmx5IGZpbHRlckNvbmZpZyA9IHNpZ25hbDxGaWx0ZXJDb25maWcgfCBudWxsPihudWxsKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgZGF0YSA9IHNpZ25hbDxDb21wb25lbnREYXRhIHwgbnVsbD4obnVsbCk7XG4gIC8vIEEgbG9hZCBzaG93cyBhIHNwaW5uZXIgY2VudHJlZCBvbiB0aGUgdGlsZS4gYGxvYWRpbmdgIGlzIHRoZSBmaXJzdCBsb2FkLFxuICAvLyB3aXRoIG5vdGhpbmcgdG8gc2hvdyB5ZXQ7IGEgcmVmZXRjaCBrZWVwcyB0aGUgZGF0YSBvbiBzY3JlZW4sIGRpbW1lZFxuICAvLyB1bmRlciB0aGUgc3Bpbm5lciAoYHJlZnJlc2hpbmdgKS4gVGhlIHRpdGxlIGlzIG5ldmVyIGRpbW1lZC5cbiAgcHVibGljIHJlYWRvbmx5IGxvYWRpbmcgPSBzaWduYWwoZmFsc2UpO1xuICBwdWJsaWMgcmVhZG9ubHkgcmVmcmVzaGluZyA9IHNpZ25hbChmYWxzZSk7XG4gIHB1YmxpYyByZWFkb25seSBlcnJvciA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAvLyBXaGljaCBvZiBhIGNoYXJ0J3MgbGVnZW5kIGVudHJpZXMgYXJlIG9uLCBieSBzZXJpZXMgbmFtZS4gSGVsZCBoZXJlIGFuZFxuICAvLyBoYW5kZWQgdG8gZWFjaCBvcHRpb24gdGhlIGNoYXJ0IGJ1aWxkczogbmd4LWVjaGFydHMgc2V0cyBhbiBvcHRpb24gd2l0aFxuICAvLyBub3RNZXJnZSwgd2hpY2ggd291bGQgb3RoZXJ3aXNlIHR1cm4gZXZlcnkgZW50cnkgYmFjayBvbiBhdCBlYWNoIHJlZmV0Y2guXG4gIHB1YmxpYyByZWFkb25seSBsZWdlbmRTZWxlY3RlZCA9IHNpZ25hbDxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj4+KHt9KTtcblxuICAvLyBBIGxpc3QgaXMgZHJhd24gYWdhaW4gd2hlbiBhIHJlc2V0IG1vdmVzIGl0cyBzb3J0OiBGc0xpc3QgcmVhZHMgaXRzIHNvcnRcbiAgLy8gb25seSB3aGVuIGl0IGlzIGNyZWF0ZWQuIEV2ZXJ5IG90aGVyIHJlc2V0IHJlbG9hZHMgaXQgaW4gcGxhY2UuXG4gIHB1YmxpYyByZWFkb25seSBsaXN0UmVzZXRLZXkgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9maWx0ZXJTdGF0ZS5saXN0U29ydFJlc2V0cygpLmdldCh0aGlzLmNvbXBvbmVudD8uaWQpID8/IDApO1xuXG4gIC8vIFdoYXQgYSBjbGljayBvbiB0aGlzIHRpbGUncyBtYXJrcyBtYXkgZG8gb24gaXRzIGxhc3QgYW5zd2VyOiB0aGUgY2hhcnRcbiAgLy8gc2hvd3MgYSBoYW5kIGFuZCBhIHRvb2x0aXAgaGludCBmb3IgdGhlbS4gKFdoaWxlIHRoZSBsYXlvdXQgaXMgZWRpdGVkIGFcbiAgLy8gdmVpbCBjb3ZlcnMgdGhlIGJvZHksIHNvIG5vIG1hcmsgaXMgaG92ZXJlZCBvciBjbGlja2VkLilcbiAgcHVibGljIHJlYWRvbmx5IHRpbGVBY3Rpb25zID0gY29tcHV0ZWQ8UmVwb3J0TWFya0FjdGlvbltdPigoKSA9PiB0aWxlTWFya0FjdGlvbnMoe1xuICAgIGRhdGE6IHRoaXMuZGF0YSgpLFxuICAgIGZlYXR1cmVzOiB0aGlzLl9vZmZlcmVkRmVhdHVyZXMoKSxcbiAgfSkpO1xuXG4gIC8vIFRoZSBhY3Rpb25zIHRoZSBtYXJrIG1lbnUgbGlzdHMgZm9yIHRoZSBjbGljayBpdCB3YXMgb3BlbmVkIG9uLlxuICBwdWJsaWMgcmVhZG9ubHkgbWFya01lbnVBY3Rpb25zID0gc2lnbmFsPFJlcG9ydE1hcmtBY3Rpb25bXT4oW10pO1xuICBwdWJsaWMgcmVhZG9ubHkgbWFya0FjdGlvbkxhYmVscyA9IE1BUktfQUNUSU9OX0xBQkVMUztcblxuICAvLyBUaGUgYnJlYWRjcnVtYiBhZnRlciB0aGUgdGl0bGUgd2hpbGUgdGhlIGNoYXJ0IGlzIGRyaWxsZWQgKCcyMDI2JywgJ1EzJyksXG4gIC8vIG9uZSBsYWJlbCBwZXIgc3RlcCBvZiBpdHMgcGF0aCwgaW4gdGhlIHJlcG9ydCdzIGxvY2FsZS4gRW1wdHkgYXQgdGhlIHRvcFxuICAvLyBhbmQgd2hpbGUgdGhlIHZpZXdlciBpcyBub3Qgb2ZmZXJlZCBkcmlsbDogYSBwYXRoIGFuIG9sZGVyIHNlcnZlciBuZXZlclxuICAvLyBhcHBsaWVzIGlzIGtlcHQgaW4gdGhlIHN0YXRlLCBidXQgbm90IHNob3duLlxuICBwdWJsaWMgcmVhZG9ubHkgZHJpbGxDcnVtYnMgPSBjb21wdXRlZDxzdHJpbmdbXT4oKCkgPT4gKHRoaXMuX29mZmVyZWRGZWF0dXJlcygpLmluY2x1ZGVzKCdkcmlsbCcpXG4gICAgPyBkcmlsbENydW1iTGFiZWxzKHRoaXMuX2ZpbHRlclN0YXRlLmRyaWxsKHRoaXMuY29tcG9uZW50Py5pZCksIHRoaXMuX2ZpbHRlclN0YXRlLmZvcm1hdENvbnRleHQoKSlcbiAgICA6IFtdKSk7XG4gIHB1YmxpYyByZWFkb25seSBkcmlsbFNlcGFyYXRvciA9IERSSUxMX0NSVU1CX1NFUEFSQVRPUjtcblxuICAvLyBXaGF0IGFuIGVtcHR5IHRpbGUgc2F5czogdGhlIGRyaWxsZWQgcGVyaW9kIGl0IHJlYWRzIG5vIGRheSBvZiwgZWxzZVxuICAvLyAnTm8gZGF0YScuXG4gIHB1YmxpYyByZWFkb25seSBlbXB0eU1lc3NhZ2UgPSBjb21wdXRlZCgoKSA9PiBkcmlsbE91dHNpZGVNZXNzYWdlKFxuICAgIHRoaXMuZGF0YSgpPy5kcmlsbCxcbiAgICB0aGlzLl9maWx0ZXJTdGF0ZS5mb3JtYXRDb250ZXh0KCksXG4gICkgPz8gJ05vIGRhdGEnKTtcblxuICBAVmlld0NoaWxkKCdtYXJrTWVudScpXG4gIHB1YmxpYyBtYXJrTWVudTogRnNNZW51Q29tcG9uZW50O1xuXG4gIEBWaWV3Q2hpbGQoJ21hcmtBbmNob3InKVxuICBwdWJsaWMgbWFya0FuY2hvcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfdGV4dCA9IHZpZXdDaGlsZChDb21wb25lbnRUZXh0Q29tcG9uZW50KTtcbiAgcHJpdmF0ZSBfcmVmcmVzaCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAvLyBUaGUgc3RhdGUgdmVyc2lvbiB0aGUgaGVhZGVyIHdhcyBsYXN0IGJ1aWx0IGZvciAoZmlsdGVyS2V5KS5cbiAgcHJpdmF0ZSByZWFkb25seSBfaGVhZGVyVmVyc2lvbiA9IHNpZ25hbCgwKTtcbiAgLy8gVGhlIGhlYWRlciBncm91cHMnIHZhbHVlcyBhcyB0aGUgaGVhZGVyIGxhc3Qgc2hvd2VkIHRoZW06IGFzIGl0IHdhc1xuICAvLyBidWlsdCwgdGhlbiBhcyBpdHMgb3duIGJhciByZXBvcnRlZCBlYWNoIGNoYW5nZS4gZmlsdGVyS2V5IGNhcnJpZXMgdGhlaXJcbiAgLy8gc2lnbmF0dXJlIGFzIGJ1aWx0LlxuICBwcml2YXRlIF9zaG93biA9IG5ldyBNYXA8bnVtYmVyLCBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbD4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfaGVhZGVyVmFsdWVzID0gc2lnbmFsKCcnKTtcbiAgcHJpdmF0ZSBfcmVwb3J0RGF0YSA9IGluamVjdChSZXBvcnREYXRhKTtcbiAgcHJpdmF0ZSBfZmlsdGVyU3RhdGUgPSBpbmplY3QoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfZmlsdGVyT3B0aW9ucyA9IGluamVjdChSZXBvcnRGaWx0ZXJPcHRpb25zU2VydmljZSk7XG4gIHByaXZhdGUgX3Byb2Nlc3MgPSBpbmplY3QoRnNQcm9jZXNzKTtcbiAgcHJpdmF0ZSBfbWVzc2FnZSA9IGluamVjdChGc01lc3NhZ2UpO1xuICBwcml2YXRlIF9wcm9tcHQgPSBpbmplY3QoRnNQcm9tcHQpO1xuICBwcml2YXRlIF9kaWFsb2cgPSBpbmplY3QoTWF0RGlhbG9nKTtcbiAgcHJpdmF0ZSBfbGFzdFByZXNzID0gMDtcbiAgcHJpdmF0ZSBfZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgcHJpdmF0ZSBfem9uZSA9IGluamVjdChOZ1pvbmUpO1xuICBwcml2YXRlIF9ob3N0OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PiA9IGluamVjdChFbGVtZW50UmVmKTtcbiAgLy8gVGhlIGZlYXR1cmVzIGEgbWFyayBhY3Rpb24gbmVlZHM6IHNlcnZlZCBieSB0aGUgcmVwb3J0J3Mgc2VydmVyIGFuZFxuICAvLyBpbXBsZW1lbnRlZCBieSB0aGlzIHZpZXdlci5cbiAgcHJpdmF0ZSByZWFkb25seSBfb2ZmZXJlZEZlYXR1cmVzID0gY29tcHV0ZWQoKCkgPT4gb2ZmZXJlZFZpZXdlckZlYXR1cmVzKHRoaXMuX2ZpbHRlclN0YXRlLnZpZXdlckZlYXR1cmVzKCkpKTtcbiAgLy8gVGhlIG1hcmsgYSBmaXJzdCB0YXAgcHJldmlld2VkIChkZWNpZGVNYXJrQ2xpY2spLCBhbmQgdGhlIGNsaWNrIHRoZSBtYXJrXG4gIC8vIG1lbnUgaXMgb3BlbiBmb3IuXG4gIHByaXZhdGUgX3RvdWNoZWRNYXJrOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfbWVudUNsaWNrOiBSZXBvcnRNYXJrQ2xpY2sgfCBudWxsID0gbnVsbDtcbiAgLy8gVGhlIGdyb3VwLWJ5IG1vdmVkIHNpbmNlIHRoZSBsYXN0IGFuc3dlcjogYSBwYXRoIHRoZSBzZXJ2ZXIgdGhlbiBkcm9wc1xuICAvLyBiZWNhdXNlIGl0IG5vIGxvbmdlciBzdGFydHMgYXQgdGhlIGNoYXJ0J3MgdG9wIGlzIG5vdCBuZXdzIHRvIHRoZSB2aWV3ZXIuXG4gIHByaXZhdGUgX2dyYWluTW92ZWQgPSBmYWxzZTtcblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fYnVpbGRGaWx0ZXJDb25maWcoKTtcblxuICAgIGlmICghdGhpcy5pc1RleHQpIHtcbiAgICAgIHRoaXMuX3JlYnVpbGRIZWFkZXJPbk5ld1N0YXRlKCk7XG4gICAgfVxuXG4gICAgLy8gTGlzdHMgZmV0Y2ggdGhyb3VnaCBGc0xpc3QgYW5kIGdyaWRzIHRocm91Z2ggZnMtZ3JpZCdzIHNvdXJjZSAoZWFjaFxuICAgIC8vIHJlYWRzIGl0cyBvd24gcm93cyk7IHRleHQgaGFzIG5vdGhpbmcgdG8gZmV0Y2gsIGFuZCBhIHZhbHVlIGlzIG5ldmVyXG4gICAgLy8gZHJhd24gKGl0IHJlYWRzIGluc2lkZSB0ZXh0KS5cbiAgICBpZiAoIVNFTEZfUkVBRElOR19UWVBFUy5pbmNsdWRlcyh0aGlzLmNvbXBvbmVudC50eXBlKSAmJiAhdGhpcy5pc1RleHQgJiYgaXNEcmF3bih0aGlzLmNvbXBvbmVudCkpIHtcbiAgICAgIC8vIE9uZSBsb2FkIHN0cmVhbSAodGlsZUxvYWRzKTogdGhlIGZpcnN0IGxvYWQgYXQgb25jZSwgdGhlbiBvbmUgcGVyXG4gICAgICAvLyBzZXR0bGVkIHN3ZWVwIG9mIGNoYW5nZXMsIGVhY2ggY2FuY2VsbGluZyB0aGUgb25lIGluIGZsaWdodCwgYW5kIGFuXG4gICAgICAvLyBhbnN3ZXIgc2VudCBiZWZvcmUgYSByZXNldCBpcyBkcm9wcGVkLlxuICAgICAgdGlsZUxvYWRzKHRoaXMuX3JlZnJlc2gkLCAoKSA9PiB0aGlzLl9sb2FkKCksICgpID0+IHRoaXMuX2ZpbHRlclN0YXRlLnN0YXRlVmVyc2lvbigpKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YXAoKHJlc3VsdCkgPT4gdGhpcy5fbG9hZGVkKHJlc3VsdCkpLFxuICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLmNoYW5nZXNGb3IodGhpcy5jb21wb25lbnQpXG4gICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9yZWZyZXNoJC5uZXh0KCkpO1xuXG4gICAgICAvLyBBIGdyb3VwLWJ5IGNoYW5nZSByZS1idWNrZXRzIGV2ZXJ5IHRpbGUgdGhhdCBmb2xsb3dzIGl0OyBpdCBpc24ndFxuICAgICAgLy8gc2NvcGVkIHRvIGEgZmlsdGVyIGdyb3VwLCBzbyBpdCByaWRlcyBpdHMgb3duIHN0cmVhbS5cbiAgICAgIGlmIChmb2xsb3dzR3JvdXBCeSh0aGlzLmNvbXBvbmVudCkpIHtcbiAgICAgICAgdGhpcy5fZmlsdGVyU3RhdGUuZnJlcXVlbmN5Q2hhbmdlcygpXG4gICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fZ3JhaW5Nb3ZlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9yZWZyZXNoJC5uZXh0KCk7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEEgZHJpbGwgbW92ZXMgdGhpcyBjaGFydCBhbG9uZS5cbiAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLmRyaWxsQ2hhbmdlcyh0aGlzLmNvbXBvbmVudC5pZClcbiAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuX3JlZnJlc2gkLm5leHQoKSk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIHJlcG9ydCByZWxvYWRzIChlLmcuIGFmdGVyIHRoZSBzZXR0aW5ncyBkaWFsb2cgYWRkcy9tb3ZlcyBhIGZpbHRlcilcbiAgLy8gaGFuZCB0aGlzIGluc3RhbmNlIGZyZXNoIGBjb21wb25lbnRgL2Bncm91cHNgIGlucHV0cyB3aXRob3V0IHJlLXJ1bm5pbmdcbiAgLy8gbmdPbkluaXQuIFJlYnVpbGQgdGhlIGhlYWRlciBjb25maWcgc28gdGhlIGlubGluZSBjb21wb25lbnQtZmlsdGVyIHN0cmlwXG4gIC8vIHJlZmxlY3RzIHRoZSBuZXcgZmlsdGVyczsgdGhlIHRlbXBsYXRlIHJlY3JlYXRlcyB0aGUgZnMtZmlsdGVyIHZpYVxuICAvLyBgZmlsdGVyS2V5YCBzbyBpdCBhY3R1YWxseSByZS1yZWFkcyB0aGlzIGNvbmZpZy5cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAvLyBDbGlja2luZyBhd2F5IChkZXNlbGVjdCkgb3IgbGVhdmluZyBlZGl0IG1vZGUgY2xvc2VzIGFuIG9wZW4gdGV4dCBlZGl0b3IsXG4gICAgLy8gd2hpY2ggaXMgd2hhdCBzYXZlcyBpdC5cbiAgICBpZiAoKGNoYW5nZXMuc2VsZWN0ZWQgJiYgIXRoaXMuc2VsZWN0ZWQpIHx8IChjaGFuZ2VzLmVkaXRNb2RlICYmICF0aGlzLmVkaXRNb2RlKSkge1xuICAgICAgdGhpcy50ZXh0RWRpdGluZy5zZXQoZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIEEgbmV3IGNvbXBvbmVudCBvYmplY3QgY2FycmllcyBpdHMgb3duIHN0b3JlZCBodG1sLlxuICAgIGlmIChjaGFuZ2VzLmNvbXBvbmVudCAmJiAhY2hhbmdlcy5jb21wb25lbnQuZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMudGV4dEh0bWwuc2V0KG51bGwpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlcnNDaGFuZ2VkID0gKGNoYW5nZXMuY29tcG9uZW50ICYmICFjaGFuZ2VzLmNvbXBvbmVudC5maXJzdENoYW5nZSlcbiAgICAgIHx8IChjaGFuZ2VzLmdyb3VwcyAmJiAhY2hhbmdlcy5ncm91cHMuZmlyc3RDaGFuZ2UpO1xuXG4gICAgaWYgKGZpbHRlcnNDaGFuZ2VkKSB7XG4gICAgICB0aGlzLl9idWlsZEZpbHRlckNvbmZpZygpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGZzLWZpbHRlciByZWFkcyBpdHMgY29uZmlnIG9ubHkgb25jZSBhdCBpbml0LCBzbyB0aGUgaGVhZGVyIGlzIGtleWVkIG9uIHdoYXRcbiAgLy8gaXQgcmVuZGVycyB0aGF0IG5vIHNpZ25hbCBjYXJyaWVzOiB0aGUgc2V0IG9mIGNvbXBvbmVudC1sZXZlbCBmaWx0ZXIgZ3JvdXBzXG4gIC8vIEFORCB0aGUgc3RvcmVkIHRpdGxlLCB3aGljaCBsaXZlcyBpbiBmcy1maWx0ZXIncyBoZWFkaW5nIHRlbXBsYXRlLiBmcy1maWx0ZXJcbiAgLy8gaXMgT25QdXNoIGFuZCB0aGUgaGVhZGluZyBpcyByZW5kZXJlZCBpbnNpZGUgSVRTIHZpZXcsIHNvIG1hcmtpbmcgdGhpc1xuICAvLyBjb21wb25lbnQgZG9lcyBub3QgcmVwYWludCBhIG5ldyB0aXRsZSDigJQgcmVjcmVhdGluZyB0aGUgYmxvY2sgZG9lcywgb25jZSBhXG4gIC8vIHNldHRpbmdzIHNhdmUgaGFzIHJlYnVpbHQgdGhlIGNvbmZpZy4gV2hhdCBmaWxscyB0aGUgdGl0bGUncyB0b2tlbnMgaXNcbiAgLy8gYW5vdGhlciBtYXR0ZXI6IHNlZSBzaG93blRpdGxlLiBUaGUga2V5IGFsc28gY2FycmllcyB0aGUgc3RhdGUgdmVyc2lvblxuICAvLyB0aGUgaGVhZGVyIHdhcyBidWlsdCBmb3IsIHNvIGFuIGFwcGxpZWQgdmlldywgd2hpY2ggcmVwbGFjZXMgZXZlcnkgdmFsdWVcbiAgLy8gYXQgb25jZSwgcmVjcmVhdGVzIGl0IHdpdGggdGhlIG5ldyB2YWx1ZXMuIEFuZCBpdCBjYXJyaWVzIHRoZSB2YWx1ZXMgdGhlXG4gIC8vIGhlYWRlciB3YXMgYnVpbHQgd2l0aDogYSBncm91cCBzaG93biBoZXJlIGFuZCBpbiB0aGUgcmVwb3J0IGJhciAobGV2ZWxcbiAgLy8gJ2JvdGgnKSB0aGF0IHRoZSByZXBvcnQgYmFyIGNoYW5nZXMgaXMgYnVpbHQgYWdhaW4gaGVyZSwgc28gdGhlIGhlYWRlclxuICAvLyBuZXZlciBzaG93cyAnV2VzdCcgd2hpbGUgdGhlIGRhdGEgbGVhdmVzIFdlc3Qgb3V0LlxuICBwdWJsaWMgZ2V0IGZpbHRlcktleSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBbXG4gICAgICB0aGlzLl9oZWFkZXJWZXJzaW9uKCksXG4gICAgICB0aGlzLmNvbXBvbmVudC50aXRsZSxcbiAgICAgIC4uLnRoaXMuY29tcG9uZW50RmlsdGVyR3JvdXBzLm1hcCgoZ3JvdXApID0+IGAke2dyb3VwLmlkfToke2dyb3VwLmxldmVsfWApLFxuICAgICAgdGhpcy5faGVhZGVyVmFsdWVzKCksXG4gICAgXS5qb2luKCd8Jyk7XG4gIH1cblxuICAvLyBUaGUgdGl0bGUgYXMgdGhlIHZpZXdlciByZWFkcyBpdDogaXRzIHBhZ2UsIHJlcG9ydCBhbmQgZmlsdGVyIGZpZWxkcyBmaWxsZWRcbiAgLy8gd2l0aCB0aGUgdG9rZW5zIG9mIHRoZSBsYXllciBpdCBpcyBkcmF3biBvbiAoJ1NpZ24tdXBzIOKAlCBTZXB0ZW1iZXIgMjAyNicpLlxuICAvLyBUaGUgaGVhZGVyIHJlYWRzIGl0LCBhbmQgdGhlIENTViBleHBvcnQgbmFtZXMgaXRzIGZpbGUgYWZ0ZXIgaXQuIFRoZVxuICAvLyB0b2tlbnMgYXJlIGEgc2lnbmFsLCByZWFkIGluc2lkZSBmcy1maWx0ZXIncyBoZWFkaW5nLCBzbyBhIGZpbHRlciBjaGFuZ2VcbiAgLy8gcmVwYWludHMgdGhlIHRpdGxlIGluIHBsYWNlIHJhdGhlciB0aGFuIHRocm91Z2ggZmlsdGVyS2V5OiBhIHJlY3JlYXRlZFxuICAvLyBoZWFkZXIgd291bGQgbG9zZSB3aGF0IHRoZSB2aWV3ZXIgaXMgZG9pbmcgaW4gaXRzIG93biBmaWx0ZXJzIChhIHBpY2tcbiAgLy8gbGFuZGluZywgYSBoYWxmLXR5cGVkIGtleXdvcmQsIGFuIG9wZW4gcGlja2VyKSwgYW5kIGVhY2ggZmlsdGVyIGluIGl0XG4gIC8vIHdvdWxkIHNob3cgdGhlIHZhbHVlIGl0IHdhcyBidWlsdCB3aXRoLlxuICBwdWJsaWMgZ2V0IHNob3duVGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZmlsbFRpdGxlVG9rZW5zKHRoaXMuY29tcG9uZW50LnRpdGxlLCB0aGlzLnRva2VucygpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNUZXh0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudC50eXBlID09PSAndGV4dCc7XG4gIH1cblxuICAvLyBPcGVuIHRoZSB0ZXh0IGVkaXRvciBpbiBwbGFjZS5cbiAgcHVibGljIGVkaXRUZXh0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lZGl0TW9kZSB8fCAhdGhpcy5pc1RleHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdENvbXBvbmVudC5lbWl0KHRoaXMuY29tcG9uZW50LmlkKTtcbiAgICB0aGlzLnRleHRFZGl0aW5nLnNldCh0cnVlKTtcbiAgfVxuXG4gIC8vIFRha2UgYSBkZWxldGVkIHZhbHVlJ3MgY2hpcHMgb3V0IG9mIHRoZSB0ZXh0J3Mgb3BlbiBlZGl0b3IuXG4gIHB1YmxpYyByZW1vdmVWYWx1ZShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX3RleHQoKT8ucmVtb3ZlVmFsdWUoa2V5KTtcbiAgfVxuXG4gIC8vIFRoZSBlZGl0b3IgY2xvc2VkIHdpdGggY2hhbmdlZCBodG1sLiBLZXB0IGxvY2FsbHkgYXQgb25jZSBzbyB0aGUgYmxvY2tcbiAgLy8gcmUtcmVuZGVycyB3aGF0IHdhcyB0eXBlZCwgdGhlbiByZXBsYWNlZCBieSB3aGF0IHRoZSBzZXJ2ZXIgc3RvcmVkOiBpdFxuICAvLyByZWJ1aWxkcyB0aGUgaHRtbCBmcm9tIGl0cyBhbGxvd2xpc3QgYW5kIGRyb3BzIGFueSB2YWx1ZSB0b2tlbiBpdHMgcGFnZSBoYXNcbiAgLy8gbm8gdmFsdWUgZm9yLCBzbyB0aGUgYmxvY2sgbmV2ZXIgaG9sZHMgYSB0b2tlbiB0aGUgc2VydmVyIGRvZXNuJ3QuXG4gIHB1YmxpYyBvblRleHRTYXZlZChodG1sOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXRUZXh0SHRtbChodG1sKTtcbiAgICB0aGlzLl9yZXBvcnREYXRhLnVwZGF0ZUNvbXBvbmVudCh0aGlzLnJlcG9ydElkLCB0aGlzLmNvbXBvbmVudC5pZCwgeyBodG1sIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4gKHR5cGVvZiByZXNwb25zZT8uY29uZmlnPy5odG1sID09PSAnc3RyaW5nJyA/IHJlc3BvbnNlLmNvbmZpZy5odG1sIGFzIHN0cmluZyA6IGh0bWwpKSxcbiAgICAgICAgdGFwKChzdG9yZWQpID0+IHtcbiAgICAgICAgICB0aGlzLl9zZXRUZXh0SHRtbChzdG9yZWQpO1xuICAgICAgICAgIHRoaXMudGV4dFNhdmVkLmVtaXQoc3RvcmVkKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8vIFRoZSBzZXJ2ZXIgZGVsZXRlcyB0aGUgdGV4dCBhbmQgdGhlbiBldmVyeSB2YWx1ZSBvbiBpdHMgcGFnZSB0aGF0IG5vIG90aGVyXG4gIC8vIHRleHQgc2hvd3MsIGFuZCBhbnN3ZXJzIHdpdGggdGhlaXIgaWRzLlxuICBwdWJsaWMgZGVsZXRlVGV4dCgpOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZXNOb3RlID0gdmFsdWVLZXlzKHRoaXMuY29tcG9uZW50LmNvbmZpZz8uaHRtbCkubGVuZ3RoXG4gICAgICA/ICcgVmFsdWVzIG5vIG90aGVyIHRleHQgb24gdGhpcyBwYWdlIHVzZXMgYXJlIGRlbGV0ZWQgd2l0aCBpdC4nXG4gICAgICA6ICcnO1xuXG4gICAgdGhpcy5fcHJvbXB0LmNvbmZpcm0oe1xuICAgICAgdGl0bGU6ICdDb25maXJtJyxcbiAgICAgIHRlbXBsYXRlOiBgQXJlIHlvdSBzdXJlIHlvdSB3b3VsZCBsaWtlIHRvIGRlbGV0ZSB0aGlzIHRleHQ/JHt2YWx1ZXNOb3RlfWAsXG4gICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5fcmVwb3J0RGF0YS5kZWxldGVDb21wb25lbnQodGhpcy5yZXBvcnRJZCwgdGhpcy5jb21wb25lbnQuaWQpKSxcbiAgICAgICAgdGFwKChyZXNwb25zZTogeyByZW1vdmVkVmFsdWVzPzogbnVtYmVyW10gfSkgPT4ge1xuICAgICAgICAgIGlmIChyZXNwb25zZT8ucmVtb3ZlZFZhbHVlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlc1JlbW92ZWQuZW1pdChyZXNwb25zZS5yZW1vdmVkVmFsdWVzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5yZW1vdmVkLmVtaXQodGhpcy5jb21wb25lbnQuaWQpO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCB0cnVuY2F0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5kYXRhKCk/LnRydW5jYXRlZDtcbiAgfVxuXG4gIC8vIENvbnRlbnQgcGFkZGluZyAodGhlIGNhbnZhcyB6b29tIHNjYWxlcyB0aGUgcGFnZSBhcyBhIHdob2xlKS4gRWFjaCBlZGdlXG4gIC8vIGRlZmF1bHRzIHRvIDEvOFwiLlxuICBwdWJsaWMgZ2V0IGJvZHlQYWRkaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNvbXBvbmVudFBhZGRpbmdDc3ModGhpcy5jb21wb25lbnQpO1xuICB9XG5cbiAgLy8gVGhlIGNvbXBvbmVudC1sZXZlbCBmaWx0ZXIgZ3JvdXBzIHRoYXQgc2hvdWxkIHJlbmRlciBhcyBhbiBpbmxpbmUgY29udHJvbFxuICAvLyBzdHJpcCBvbiBUSElTIGNvbXBvbmVudDogYSBncm91cCBpcyBpbmNsdWRlZCB3aGVuIGl0J3MgbGV2ZWw9Y29tcG9uZW50IGFuZFxuICAvLyBoYXMgYW4gZW5hYmxlZCwgc2Vzc2lvbi1vbiBmaWx0ZXIgaGVyZS4gUmVwb3J0LWxldmVsIGdyb3VwcyBsaXZlIGluIHRoZVxuICAvLyB0b3AgYmFyIGluc3RlYWQuIExpc3RzIHVzZSB0aGlzIHN0cmlwIGxpa2UgY2hhcnRzIGRvOiBhIHZhbHVlIHNldCBoZXJlIGlzXG4gIC8vIHRoZSBncm91cCdzIHZhbHVlLCBzbyBpdCByZWFjaGVzIGV2ZXJ5IGNvbXBvbmVudCBpbiB0aGUgZ3JvdXAuXG4gIHB1YmxpYyBnZXQgY29tcG9uZW50RmlsdGVyR3JvdXBzKCk6IFJlcG9ydEZpbHRlckdyb3VwW10ge1xuICAgIGlmICghdGhpcy5ncm91cHMpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBncm91cElkcyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIHRoaXMuY29tcG9uZW50LmZpbHRlcnMgPz8gW10pIHtcbiAgICAgIGlmICghZmlsdGVyLmVuYWJsZWQgfHwgdGhpcy5fZmlsdGVyU3RhdGUuaXNGaWx0ZXJEaXNhYmxlZChmaWx0ZXIuaWQpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLmdyb3Vwcy5nZXQoZmlsdGVyLmZpbHRlckdyb3VwSWQpO1xuICAgICAgaWYgKGdyb3VwICYmIChncm91cC5sZXZlbCA9PT0gJ2NvbXBvbmVudCcgfHwgZ3JvdXAubGV2ZWwgPT09ICdib3RoJykpIHtcbiAgICAgICAgZ3JvdXBJZHMuYWRkKGdyb3VwLmlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gWy4uLmdyb3VwSWRzXS5tYXAoKGlkKSA9PiB0aGlzLmdyb3Vwcy5nZXQoaWQpKS5maWx0ZXIoQm9vbGVhbik7XG4gIH1cblxuICBwdWJsaWMgc2V0dGluZ3MoKTogdm9pZCB7XG4gICAgdGhpcy5vcGVuU2V0dGluZ3MuZW1pdCh0aGlzLmNvbXBvbmVudCk7XG4gIH1cblxuICAvLyBXaGV0aGVyIHRoZSBtZW51IG9mZmVycyBDb2x1bW5zOiBhIHBsYWluIGxpc3Qgd2l0aCBtb3JlIHRoYW4gb25lXG4gIC8vIGNvbmZpZ3VyZWQgY29sdW1uLiBBIGNyb3NzLXRhYidzIGNvbHVtbnMgY29tZSBhbmQgZ28gd2l0aCB0aGUgZGF0YS5cbiAgcHVibGljIGdldCBoaWRlc0NvbHVtbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50LnR5cGUgPT09ICdsaXN0JyAmJiBsaXN0SGlkZWFibGVDb2x1bW5zKHRoaXMuY29tcG9uZW50LmNvbmZpZykubGVuZ3RoID4gMTtcbiAgfVxuXG4gIC8vIFdoaWNoIG9mIGEgcGxhaW4gbGlzdCdzIGNvbHVtbnMgc2hvdy4gVGhlIGNob2ljZSBpcyB0aGUgdmlld2VyJ3MgKGtlcHQgaW5cbiAgLy8gdGhlIHJlcG9ydCdzIHN0YXRlLCBuZXZlciBzYXZlZCB0byB0aGUgcmVwb3J0KSwgYW5kIHRoZVxuICAvLyBsaXN0IGhpZGVzIHRoZSBjb2x1bW5zIGluIHBsYWNlLCB3aXRoIG5vIHJlZmV0Y2guXG4gIHB1YmxpYyBjaG9vc2VDb2x1bW5zKCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbHVtbnMgPSAodGhpcy5jb21wb25lbnQuY29uZmlnPy5jb2x1bW5zID8/IFtdKVxuICAgICAgLm1hcCgoY29sdW1uKSA9PiAoeyBjb2x1bW46IGNvbHVtbi5jb2x1bW4sIGxhYmVsOiBjb2x1bW4ubGFiZWwgfHwgY29sdW1uLmNvbHVtbiB9KSk7XG5cbiAgICB0aGlzLl9kaWFsb2cub3BlbjxMaXN0Q29sdW1uc0NvbXBvbmVudCwgTGlzdENvbHVtbnNEaWFsb2dEYXRhLCBzdHJpbmdbXT4oTGlzdENvbHVtbnNDb21wb25lbnQsIHtcbiAgICAgIGRhdGE6IHsgY29sdW1ucywgaGlkZGVuOiBbLi4udGhpcy5fZmlsdGVyU3RhdGUuaGlkZGVuQ29sdW1ucyh0aGlzLmNvbXBvbmVudC5pZCldIH0sXG4gICAgICB3aWR0aDogJzQwMHB4JyxcbiAgICAgIG1heFdpZHRoOiAnOTV2dycsXG4gICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgIH0pXG4gICAgICAuYWZ0ZXJDbG9zZWQoKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoaGlkZGVuKSA9PiB7XG4gICAgICAgIC8vIENhbmNlbCBjbG9zZXMgd2l0aCBub3RoaW5nLCB3aGljaCBjaGFuZ2VzIG5vdGhpbmcuXG4gICAgICAgIGlmIChoaWRkZW4pIHtcbiAgICAgICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRIaWRkZW5Db2x1bW5zKHRoaXMuY29tcG9uZW50LmlkLCBoaWRkZW4pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIFByZXNlbnRhdGlvbiBzZXR0aW5ncyBzYXZlZCBmcm9tIHRoZSBzZXR0aW5ncyBkaWFsb2cuIFRpdGxlIGFuZCBwYWRkaW5nIGFyZVxuICAvLyBub3QgcGFydCBvZiB0aGUgcXVlcnksIHNvIHRoZSBkYXRhIGFscmVhZHkgZmV0Y2hlZCBzdGlsbCBzdGFuZHMg4oCUIHRoaXMgb25seVxuICAvLyByZXBhaW50cy4gVGhlIGhlYWRlciBjb25maWcgaXMgcmVidWlsdCBiZWNhdXNlIGBmaWx0ZXJLZXlgIGNoYW5nZXMgd2l0aCB0aGVcbiAgLy8gdGl0bGUgYW5kIHJlY3JlYXRlcyB0aGUgZnMtZmlsdGVyIGJsb2NrIGFyb3VuZCBpdDsgc2V0dGluZyB0aGUgY29uZmlnIHNpZ25hbFxuICAvLyBpcyBhbHNvIHdoYXQgcmVwYWludHMgdGhlIG5ldyBwYWRkaW5nLiBUaGUgY2hhcnQgZm9sbG93cyBpdHMgYm94IG9uIGl0cyBvd25cbiAgLy8gKG5neC1lY2hhcnRzIG9ic2VydmVzIHRoZSBob3N0KSwgc28gbm90aGluZyBpcyB0b2xkIHRvIHJlc2l6ZS4gQSBLUEkncyBjYXJkXG4gIC8vIGtleXMgYXJlIGRpZmZlcmVudDogc2V0dGluZ3Mua3BpIGNhcnJpZXMgdGhlIGtleXMgdGhlIHNlcnZlciBzYXZlZCAobmV2ZXJcbiAgLy8gdGhlIG9uZXMgdGhlIGRpYWxvZyBzZW50KSwgYW5kIHRoZSBzZXJ2ZXIgc2VuZHMgdGhlIHRhcmdldCdzIHByb2dyZXNzIGFuZFxuICAvLyB0aGUgc3BhcmtsaW5lJ3MgcG9pbnRzIHdpdGggdGhlIGRhdGEsIHNvIGEgY2hhbmdlIHRvIHRoZW0gcmVsb2FkcyBpdC5cbiAgcHVibGljIGFwcGx5U2V0dGluZ3Moc2V0dGluZ3M6IENvbXBvbmVudFNldHRpbmdzKTogdm9pZCB7XG4gICAgY29uc3QgY2FyZENoYW5nZWQgPSAhIXNldHRpbmdzLmtwaVxuICAgICAgJiYgIXNhbWVLcGlDYXJkU2V0dGluZ3Moc2V0dGluZ3Mua3BpLCBrcGlDYXJkU2V0dGluZ3ModGhpcy5jb21wb25lbnQuY29uZmlnIGFzIEtwaUNvbmZpZykpO1xuXG4gICAgdGhpcy5jb21wb25lbnQudGl0bGUgPSBzZXR0aW5ncy50aXRsZTtcbiAgICB0aGlzLmNvbXBvbmVudC5jb25maWcgPSB7IC4uLnRoaXMuY29tcG9uZW50LmNvbmZpZywgcGFkZGluZzogc2V0dGluZ3MucGFkZGluZywgLi4uKHNldHRpbmdzLmtwaSA/PyB7fSkgfTtcblxuICAgIHRoaXMuX2J1aWxkRmlsdGVyQ29uZmlnKCk7XG5cbiAgICBpZiAoY2FyZENoYW5nZWQpIHtcbiAgICAgIHRoaXMuX3JlZnJlc2gkLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgQ1NWIGlzIHdoYXQgdGhlIHNjcmVlbiBzaG93cywgc28gaXQgY2FycmllcyB0aGUgdGlsZSdzIGludGVyYWN0aW9uXG4gIC8vIHN0YXRlICh0aWxlRGF0YVN0YXRlKTogdGhlIGdyb3VwLWJ5IGdyYWluIGZvciBhIHRpbGUgdGhhdCBmb2xsb3dzIGl0LCBhXG4gIC8vIGNoYXJ0J3MgZHJpbGwgcGF0aCwgdGhlIHZpZXdlcidzIGhlYWRlciBzb3J0LCBzZWFyY2ggYW5kIGhpZGRlbiBjb2x1bW5zXG4gIC8vIGZvciBhIGxpc3QgKGEgc2VhcmNoZWQgbGlzdCBleHBvcnRzIG9ubHkgdGhlIHJvd3MgdGhlIHNlYXJjaCBsZWF2ZXMsIGFuZFxuICAvLyB0aGUgaGlkZGVuIGNvbHVtbnMgc3RheSBvdXQgb2YgdGhlIGZpbGUpLCBhbmQgdGhlIGdyb3VwcyB0aGF0IG1hdGNoXG4gIC8vICdhbnknOyBhIHRhYmxlJ3MgbGF5b3V0IGFzIHRoZSB2aWV3ZXIgY2hhbmdlZCBpdDsgYW5kIGl0cyB0aXRsZSBhcyB0aGVcbiAgLy8gaGVhZGVyIHJlYWRzIGl0IChzaG93blRpdGxlKSwgd2hpY2ggdGhlIHNlcnZlciBuYW1lcyB0aGUgZmlsZSBhZnRlci4gQVxuICAvLyBub3RlIHRoZSBzZXJ2ZXIgcmV0dXJucyAodGhlIGZpbGUgd2FzIGN1dCkgaXMgc2hvd24gYmVmb3JlIHRoZSBkb3dubG9hZFxuICAvLyBzdGFydHMsIHNvIGEgc2hvcnQgZmlsZSBuZXZlciBwYXNzZXMgZm9yIHRoZSB3aG9sZSByZXN1bHQuXG4gIHB1YmxpYyBleHBvcnRDc3YoKTogdm9pZCB7XG4gICAgY29uc3QgZmlsdGVycyA9IHRoaXMuX2ZpbHRlclN0YXRlLnJlc29sdmVGb3JDb21wb25lbnQodGhpcy5jb21wb25lbnQpO1xuICAgIGNvbnN0IGxheW91dCA9IHRoaXMuY29tcG9uZW50LnR5cGUgPT09ICdncmlkJyA/IHRoaXMuX2ZpbHRlclN0YXRlLmdyaWRTZXNzaW9uTGF5b3V0KHRoaXMuY29tcG9uZW50KSA6IG51bGw7XG4gICAgY29uc3Qgc3RhdGUgPSB7IC4uLnRoaXMuX2ZpbHRlclN0YXRlLnRpbGVTdGF0ZSh0aGlzLmNvbXBvbmVudCksIC4uLihsYXlvdXQgPyB7IGxheW91dCB9IDoge30pIH07XG4gICAgY29uc3QgdGl0bGUgPSB0aGlzLnNob3duVGl0bGU7XG5cbiAgICB0aGlzLl9wcm9jZXNzLmRvd25sb2FkKFxuICAgICAgYEV4cG9ydGluZyAke3RpdGxlIHx8ICdjb21wb25lbnQnfWAsXG4gICAgICB0aGlzLl9yZXBvcnREYXRhLmV4cG9ydENvbXBvbmVudCh0aGlzLnJlcG9ydElkLCB0aGlzLmNvbXBvbmVudC5pZCwgZmlsdGVycywgc3RhdGUsIHRpdGxlKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YXAoKHsgbm90ZXMgfSkgPT4gbm90ZXM/Lmxlbmd0aCAmJiB0aGlzLl9tZXNzYWdlLndhcm5pbmcobm90ZXMuam9pbignICcpKSksXG4gICAgICAgICAgbWFwKCh7IHVybCB9KSA9PiB1cmwpLFxuICAgICAgICApLFxuICAgICk7XG4gIH1cblxuICAvLyBUaGUgb25lIGNsaWNrIGhhbmRsZXIgKEIxMC4yKTogZXZlcnkgY2xpY2sgb24gYSBtYXJrIG9mIHRoaXMgdGlsZSwgYVxuICAvLyBjaGFydCdzIG9yIGEgS1BJJ3MgdmFsdWUsIGNvbWVzIGhlcmUsIHNvIGl0cyBhY3Rpb25zIG5ldmVyIGNvbXBldGUuIFRoZVxuICAvLyBydWxlIChkZWNpZGVNYXJrQ2xpY2spIGRvZXMgbm90aGluZyB3aXRob3V0IGFuIGFjdGlvbiwgbGV0cyBhIGZpcnN0IHRhcFxuICAvLyBzaG93IHRoZSB0b29sdGlwLCBydW5zIGEgbG9uZSBhY3Rpb24gYXQgb25jZSwgYW5kIG9wZW5zIHRoZSBtYXJrIG1lbnUgYXRcbiAgLy8gdGhlIGNsaWNrIGZvciB0d28gb3IgbW9yZS4gTm90IHdoaWxlIHRoZSBsYXlvdXQgaXMgZWRpdGVkLlxuICBwdWJsaWMgb25NYXJrQ2xpY2soY2xpY2s6IFJlcG9ydE1hcmtDbGljayk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVkaXRNb2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYWN0aW9ucyA9IG1hcmtBY3Rpb25zKGNsaWNrLCB7IGRhdGE6IHRoaXMuZGF0YSgpLCBmZWF0dXJlczogdGhpcy5fb2ZmZXJlZEZlYXR1cmVzKCkgfSk7XG4gICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVNYXJrQ2xpY2soY2xpY2ssIGFjdGlvbnMsIHRoaXMuX3RvdWNoZWRNYXJrKTtcbiAgICB0aGlzLl90b3VjaGVkTWFyayA9IGRlY2lzaW9uLnRvdWNoZWQ7XG5cbiAgICBpZiAoZGVjaXNpb24ub3V0Y29tZSA9PT0gJ3J1bicpIHtcbiAgICAgIHRoaXMuX3J1bk1hcmtBY3Rpb24oZGVjaXNpb24uYWN0aW9uc1swXSwgY2xpY2spO1xuICAgIH0gZWxzZSBpZiAoZGVjaXNpb24ub3V0Y29tZSA9PT0gJ21lbnUnKSB7XG4gICAgICB0aGlzLl9vcGVuTWFya01lbnUoZGVjaXNpb24uYWN0aW9ucywgY2xpY2spO1xuICAgIH1cbiAgfVxuXG4gIC8vIEEgY2xpY2sgb3IgYSB0YXAgb24gdGhlIGNoYXJ0IHRoYXQgaGl0IG5vIG1hcms6IGEgdGFwIGhlbGQgZm9yIGl0c1xuICAvLyBzZWNvbmQgdGFwIGlzIGxldCBnbywgc28gdGFwcGluZyB0aGF0IG1hcmsgYWdhaW4gc2hvd3MgaXRzIHRvb2x0aXAgZmlyc3QuXG4gIHB1YmxpYyBvbk1hcmtNaXNzKCk6IHZvaWQge1xuICAgIHRoaXMuX3RvdWNoZWRNYXJrID0gbnVsbDtcbiAgfVxuXG4gIC8vIEEgcm93IG9mIHRoZSBtYXJrIG1lbnU6IHJ1bnMgaXRzIGFjdGlvbiBmb3IgdGhlIGNsaWNrIHRoZSBtZW51IG9wZW5lZCBvbi5cbiAgcHVibGljIHJ1bk1hcmtBY3Rpb24oYWN0aW9uOiBSZXBvcnRNYXJrQWN0aW9uKTogdm9pZCB7XG4gICAgY29uc3QgY2xpY2sgPSB0aGlzLl9tZW51Q2xpY2s7XG4gICAgdGhpcy5fbWVudUNsaWNrID0gbnVsbDtcblxuICAgIGlmIChjbGljaykge1xuICAgICAgdGhpcy5fcnVuTWFya0FjdGlvbihhY3Rpb24sIGNsaWNrKTtcbiAgICB9XG4gIH1cblxuICAvLyBCYWNrIHVwIHRoZSBkcmlsbCBwYXRoIHRvIGl0cyBmaXJzdCBgZGVwdGhgIHN0ZXBzOiAwIGlzIHRoZSBjaGFydCdzIHRvcFxuICAvLyAodGhlIHRpdGxlJ3MgY3J1bWIgYW5kIEJhY2sgdG8gdG9wKSwgYW5kIGEgY3J1bWIgZ29lcyBiYWNrIHRvIHRoZSBwZXJpb2RcbiAgLy8gaXQgbmFtZXMuIFRoZSBjaGFydCByZWFkcyBhZ2FpbiAoZHJpbGxDaGFuZ2VzKS5cbiAgcHVibGljIGRyaWxsVG8oZGVwdGg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmVkaXRNb2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fZmlsdGVyU3RhdGUuc2V0RHJpbGwodGhpcy5jb21wb25lbnQuaWQsIHRoaXMuX2ZpbHRlclN0YXRlLmRyaWxsKHRoaXMuY29tcG9uZW50LmlkKS5zbGljZSgwLCBkZXB0aCkpO1xuICB9XG5cbiAgLy8gT25lIGxldmVsIHVwOiB0aGUgcGVyaW9kIHRoZSBjaGFydCBpcyBkcmlsbGVkIGludG8gaXMgbGVmdC5cbiAgcHVibGljIGRyaWxsVXAoKTogdm9pZCB7XG4gICAgdGhpcy5kcmlsbFRvKE1hdGgubWF4KDAsIHRoaXMuX2ZpbHRlclN0YXRlLmRyaWxsKHRoaXMuY29tcG9uZW50LmlkKS5sZW5ndGggLSAxKSk7XG4gIH1cblxuICAvLyBBbnkgaW50ZXJhY3Rpb24gaW5zaWRlIGEgY29tcG9uZW50IG11c3QgbmV2ZXIgc3RhcnQgYSBjYW52YXMgcGFuICh0aGVcbiAgLy8gem9vbS1wYW4gaG9zdCBsaXN0ZW5zIGZvciBtb3VzZWRvd24vdG91Y2hzdGFydCBhdCB0aGUgY29udGFpbmVyIGxldmVsKS5cbiAgcHVibGljIHN0b3BDYW52YXNQYW4oZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICBwdWJsaWMgb25Db21wb25lbnRQb2ludGVyRG93bihldmVudDogUG9pbnRlckV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuZWRpdE1vZGUgJiYgIXRoaXMuc2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0Q29tcG9uZW50LmVtaXQodGhpcy5jb21wb25lbnQuaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIC0tLS0tIGVkaXQtbW9kZSBnZXN0dXJlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwdWJsaWMgb25EcmFnU3RhcnQoZXZlbnQ6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lZGl0TW9kZSB8fCB0aGlzLnRleHRFZGl0aW5nKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBIHNlY29uZCBwcmVzcyBvbiBhIHRleHQgYmxvY2sgb3BlbnMgaXRzIGVkaXRvciBpbnN0ZWFkIG9mIGRyYWdnaW5nLlxuICAgIGlmICh0aGlzLmlzVGV4dCkge1xuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IGlzRG91YmxlUHJlc3MgPSBub3cgLSB0aGlzLl9sYXN0UHJlc3MgPCBET1VCTEVfUFJFU1NfTVM7XG4gICAgICB0aGlzLl9sYXN0UHJlc3MgPSBub3c7XG5cbiAgICAgIGlmIChpc0RvdWJsZVByZXNzKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLmVkaXRUZXh0KCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0Q29tcG9uZW50LmVtaXQodGhpcy5jb21wb25lbnQuaWQpO1xuXG4gICAgdGhpcy5fdHJhY2soZXZlbnQsIChkZWx0YVgsIGRlbHRhWSkgPT4ge1xuICAgICAgbGV0IHggPSBNYXRoLm1heCgwLCB0aGlzLl9vcmlnaW4ueCArIHRoaXMuX2luY2hlcyhkZWx0YVgpKTtcbiAgICAgIGxldCB5ID0gTWF0aC5tYXgoMCwgdGhpcy5fb3JpZ2luLnkgKyB0aGlzLl9pbmNoZXMoZGVsdGFZKSk7XG5cbiAgICAgIGlmICh0aGlzLnNuYXBwZXIpIHtcbiAgICAgICAgKHsgeCwgeSB9ID0gdGhpcy5zbmFwcGVyLnNuYXBNb3ZlKHRoaXMuY29tcG9uZW50LCB4LCB5KSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY29tcG9uZW50LnggPSB4O1xuICAgICAgdGhpcy5jb21wb25lbnQueSA9IHk7XG4gICAgICB0aGlzLl9hcHBseUdlb21ldHJ5KCk7XG4gICAgfSwgKCkgPT4gdGhpcy5fZW1pdEdlb21ldHJ5KCkpO1xuICB9XG5cbiAgcHVibGljIG9uUmVzaXplU3RhcnQoZXZlbnQ6IFBvaW50ZXJFdmVudCwgaGFuZGxlOiBIYW5kbGUpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZWRpdE1vZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdENvbXBvbmVudC5lbWl0KHRoaXMuY29tcG9uZW50LmlkKTtcblxuICAgIHRoaXMuX3RyYWNrKGV2ZW50LCAoZGVsdGFYLCBkZWx0YVkpID0+IHtcbiAgICAgIGNvbnN0IGR4ID0gdGhpcy5faW5jaGVzKGRlbHRhWCk7XG4gICAgICBjb25zdCBkeSA9IHRoaXMuX2luY2hlcyhkZWx0YVkpO1xuICAgICAgbGV0IHsgeCwgeSwgdywgaCB9ID0gdGhpcy5fb3JpZ2luO1xuXG4gICAgICBpZiAoaGFuZGxlLmluY2x1ZGVzKCdlJykpIHtcbiAgICAgICAgdyA9IE1hdGgubWF4KE1JTl9XLCB0aGlzLl9vcmlnaW4udyArIGR4KTtcbiAgICAgIH1cbiAgICAgIGlmIChoYW5kbGUuaW5jbHVkZXMoJ3MnKSkge1xuICAgICAgICBoID0gTWF0aC5tYXgoTUlOX0gsIHRoaXMuX29yaWdpbi5oICsgZHkpO1xuICAgICAgfVxuICAgICAgaWYgKGhhbmRsZS5pbmNsdWRlcygndycpKSB7XG4gICAgICAgIGNvbnN0IGNsYW1wZWQgPSBNYXRoLm1pbihkeCwgdGhpcy5fb3JpZ2luLncgLSBNSU5fVyk7XG4gICAgICAgIHggPSB0aGlzLl9vcmlnaW4ueCArIGNsYW1wZWQ7XG4gICAgICAgIHcgPSB0aGlzLl9vcmlnaW4udyAtIGNsYW1wZWQ7XG4gICAgICB9XG4gICAgICBpZiAoaGFuZGxlLmluY2x1ZGVzKCduJykpIHtcbiAgICAgICAgY29uc3QgY2xhbXBlZCA9IE1hdGgubWluKGR5LCB0aGlzLl9vcmlnaW4uaCAtIE1JTl9IKTtcbiAgICAgICAgeSA9IHRoaXMuX29yaWdpbi55ICsgY2xhbXBlZDtcbiAgICAgICAgaCA9IHRoaXMuX29yaWdpbi5oIC0gY2xhbXBlZDtcbiAgICAgIH1cblxuICAgICAgbGV0IGdlb21ldHJ5ID0geyB4LCB5LCB3LCBoIH07XG4gICAgICBpZiAodGhpcy5zbmFwcGVyKSB7XG4gICAgICAgIGdlb21ldHJ5ID0gdGhpcy5zbmFwcGVyLnNuYXBSZXNpemUodGhpcy5jb21wb25lbnQsIGdlb21ldHJ5LCBoYW5kbGUpO1xuICAgICAgfVxuXG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMuY29tcG9uZW50LCBnZW9tZXRyeSk7XG4gICAgICB0aGlzLl9hcHBseUdlb21ldHJ5KCk7XG4gICAgICB0aGlzLmNoYXJ0Q29tcG9uZW50Py5yZXNpemUoKTtcbiAgICB9LCAoKSA9PiB0aGlzLl9lbWl0R2VvbWV0cnkoKSk7XG4gIH1cblxuICAvLyAoUmUpYnVpbGQgdGhlIGhlYWRlciBmcy1maWx0ZXIgY29uZmlnOiBoZWFkaW5nIHRlbXBsYXRlIHJlbmRlcnMgdGhlIHRpdGxlXG4gIC8vIGFuZCBpdGVtcyBhcmUgdGhpcyBjb21wb25lbnQncyBjb21wb25lbnQtbGV2ZWwgZmlsdGVyIGdyb3Vwcy4gVGhlIGFjdGlvbnNcbiAgLy8gbWVudSAoU2V0dGluZ3MgLyBFeHBvcnQgQ1NWKSBpcyBOT1QgaGVyZSDigJQgaXQncyBhIHN0YW5kYWxvbmUga2ViYWIgZmxvYXRlZFxuICAvLyB0b3AtcmlnaHQgaW4gdGhlIHRlbXBsYXRlLCBzbyBpdHMgYnV0dG9uIGhlaWdodCBubyBsb25nZXIgZHJpdmVzIHRoZSBoZWFkZXJcbiAgLy8gcm93J3MgaGVpZ2h0ICh3aGljaCB3b3VsZCBvdGhlcndpc2UgaW5mbGF0ZSB0aGUgaGVhZGluZyBieSB+NDBweCkuXG4gIC8vXG4gIC8vIEEgbGlzdCBhbHNvIGdldHMgYSBzZWFyY2ggYm94IG92ZXIgaXRzIHRleHQgY29sdW1ucywgdW5sZXNzIGl0cyBoZWFkZXJcbiAgLy8gc2hvd3MgYSBrZXl3b3JkIGdyb3VwIChSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UubGlzdFNlYXJjaGFibGUsIHdoaWNoIGFsc29cbiAgLy8gZHJvcHMgYSBzZWFyY2gga2VwdCBmcm9tIGJlZm9yZSBzdWNoIGEgZ3JvdXAgYXBwZWFyZWQpLlxuICAvL1xuICAvLyBgcmVwb3J0ZWRgIGlzIHdoYXQgdGhpcyBoZWFkZXIgbGFzdCByZXBvcnRlZCBmb3IgZWFjaCBvZiBpdHMgZ3JvdXBzLFxuICAvLyBzdGFydGluZyBmcm9tIHRoZSB2YWx1ZXMgaXQgaXMgYnVpbHQgd2l0aC4gQSBjaGFuZ2Ugc2V0cyBvbmx5IHRoZSBncm91cHNcbiAgLy8gd2hvc2UgaGVhZGVyIHZhbHVlIG1vdmVkIChtb3ZlZEdyb3VwVmFsdWVzKTogZnMtZmlsdGVyIHJlcG9ydHMgZXZlcnkgaXRlbVxuICAvLyBvbiBhbnkgY2hhbmdlLCBhbmQgYSBncm91cCBzaG93biBpbiB0aGUgcmVwb3J0IGJhciB0b28gbWF5IGhhdmUgY2hhbmdlZFxuICAvLyB0aGVyZSBzaW5jZSwgd2l0aG91dCB0aGlzIGhlYWRlciBiZWluZyByZXBhaW50ZWQuXG4gIHByaXZhdGUgX3NldFRleHRIdG1sKGh0bWw6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY29tcG9uZW50LmNvbmZpZyA9IHsgLi4udGhpcy5jb21wb25lbnQuY29uZmlnLCBodG1sIH07XG4gICAgdGhpcy50ZXh0SHRtbC5zZXQoaHRtbCk7XG4gIH1cblxuICBwcml2YXRlIF9idWlsZEZpbHRlckNvbmZpZygpOiB2b2lkIHtcbiAgICBjb25zdCBncm91cHMgPSB0aGlzLmNvbXBvbmVudEZpbHRlckdyb3VwcztcbiAgICBjb25zdCBsaXN0U2VhcmNoID0gdGhpcy5fZmlsdGVyU3RhdGUubGlzdFNlYXJjaGFibGUodGhpcy5jb21wb25lbnQpO1xuICAgIGNvbnN0IHJlcG9ydGVkID0gbmV3IE1hcChncm91cHMubWFwKChncm91cCkgPT4gW2dyb3VwLmlkLCB0aGlzLl9maWx0ZXJTdGF0ZS52YWx1ZShncm91cC5pZCkgPz8gbnVsbF0pKTtcbiAgICBjb25zdCBmZWF0dXJlcyA9IHRoaXMuX2ZpbHRlclN0YXRlLnZpZXdlckZlYXR1cmVzKCk7XG4gICAgY29uc3QgcmVwb3J0ID0gdGhpcy5fZmlsdGVyU3RhdGUucmVwb3J0KCk7XG5cbiAgICB0aGlzLl9zaG93biA9IHJlcG9ydGVkO1xuICAgIHRoaXMuX2hlYWRlclZhbHVlcy5zZXQoWy4uLnJlcG9ydGVkLnZhbHVlcygpXS5tYXAoZ3JvdXBWYWx1ZVNpZ25hdHVyZSkuam9pbignfCcpKTtcbiAgICB0aGlzLl9oZWFkZXJWZXJzaW9uLnNldCh0aGlzLl9maWx0ZXJTdGF0ZS5zdGF0ZVZlcnNpb24oKSk7XG4gICAgdGhpcy5maWx0ZXJDb25maWcuc2V0KHtcbiAgICAgIC8vIGZzLWZpbHRlciBuZXZlciB0b3VjaGVzIHRoZSBVUkwgb3IgcGVyc2lzdHMgZmlsdGVyIHN0YXRlOiBhIHJlcG9ydFxuICAgICAgLy8ga2VlcHMgbm8gc3RhdGUgaW4gdGhlIFVSTC4gVGhlIHZhbHVlcyBhcmUgb3duZWQgYnlcbiAgICAgIC8vIFJlcG9ydEZpbHRlclN0YXRlU2VydmljZS5cbiAgICAgIHF1ZXJ5UGFyYW06IGZhbHNlLFxuICAgICAgcGVyc2lzdDogZmFsc2UsXG4gICAgICBpdGVtczogW1xuICAgICAgICAuLi5ncm91cHMubWFwKChncm91cCkgPT5cbiAgICAgICAgICBmaWx0ZXJJdGVtRm9yR3JvdXAoZ3JvdXAsIHRoaXMuX2ZpbHRlck9wdGlvbnMsIHJlcG9ydCwgdGhpcy5fZmlsdGVyU3RhdGUudmFsdWUoZ3JvdXAuaWQpLCBmZWF0dXJlcykpLFxuICAgICAgICAuLi4obGlzdFNlYXJjaCA/IFtsaXN0U2VhcmNoSXRlbSh0aGlzLl9maWx0ZXJTdGF0ZS5saXN0U2VhcmNoKHRoaXMuY29tcG9uZW50LmlkKSldIDogW10pLFxuICAgICAgXSxcbiAgICAgIC8vIFR5cGluZyBpbiB0aGUgc2VhcmNoIGJveCBtdXN0IG5vdCByZWZldGNoIHRocm91Z2ggdGhlIGdyb3Vwcywgbm9yIHNldFxuICAgICAgLy8gYSBzdGFsZSBncm91cCB2YWx1ZSBiYWNrLCBhbmQgYSBncm91cCBjaGFuZ2UgbXVzdCBub3QgcmVmZXRjaCB0aHJvdWdoXG4gICAgICAvLyB0aGUgc2VhcmNoLlxuICAgICAgY2hhbmdlOiAocXVlcnkpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gZ3JvdXBWYWx1ZXNGcm9tUXVlcnkocXVlcnkgPz8ge30sIHRoaXMuY29tcG9uZW50RmlsdGVyR3JvdXBzKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHsgZ3JvdXBJZCwgdmFsdWUgfSBvZiBtb3ZlZEdyb3VwVmFsdWVzKHJlcG9ydGVkLCB2YWx1ZXMpKSB7XG4gICAgICAgICAgdGhpcy5fZmlsdGVyU3RhdGUuc2V0VmFsdWUoZ3JvdXBJZCwgdmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxpc3RTZWFyY2gpIHtcbiAgICAgICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRMaXN0U2VhcmNoKHRoaXMuY29tcG9uZW50LmlkLCBTdHJpbmcocXVlcnk/LltMSVNUX1NFQVJDSF9JVEVNXSA/PyAnJykpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gJ0NsZWFyIGZpbHRlcnMnIHB1dHMgdGhpcyBoZWFkZXIncyBvd24gZ3JvdXBzIGJhY2sgb24gdGhlaXIgYXV0aG9yZWRcbiAgICAgIC8vIGRlZmF1bHRzLiBmcy1maWx0ZXIgcmVwb3J0cyBpdHMgb3duIGNsZWFyZWQgaXRlbXMgKGNoYW5nZSkganVzdFxuICAgICAgLy8gYmVmb3JlIHRoaXMsIHNvIHRoZSByZXNldCB3aW5zLlxuICAgICAgY2xlYXI6ICgpID0+IHRoaXMuX2ZpbHRlclN0YXRlLnJlc2V0R3JvdXBzVG9EZWZhdWx0cyhncm91cHMubWFwKChncm91cCkgPT4gZ3JvdXAuaWQpKSxcbiAgICAgIC8vIFRoZSBjaGlwIHNob3dzIGV4YWN0bHkgd2hpbGUgb25lIG9mIHRob3NlIGdyb3VwcyBkaWZmZXJzIGZyb20gd2hhdFxuICAgICAgLy8gdGhhdCBjbGVhciBwdXRzIGJhY2sgKGdyb3Vwc0RpZmZlckZyb21EZWZhdWx0cykuIGZzLWZpbHRlcidzIG93biBydWxlXG4gICAgICAvLyBjb21wYXJlcyB0aGUgaXRlbXMgd2l0aCB0aGUgdmFsdWVzIHRoaXMgaGVhZGVyIHdhcyBidWlsdCB3aXRoLCB3aGljaFxuICAgICAgLy8gbWF5IGJlIHRoZSB2aWV3ZXIncyBvd24gcGlja3MsIGFuZCB3b3VsZCBvZmZlciBhIGNsZWFyIHRoYXQgY2hhbmdlc1xuICAgICAgLy8gbm90aGluZy5cbiAgICAgIGNsZWFyVmlzaWJsZTogKCkgPT4gdGhpcy5fZmlsdGVyU3RhdGUuZ3JvdXBzRGlmZmVyRnJvbURlZmF1bHRzKGdyb3Vwcy5tYXAoKGdyb3VwKSA9PiBncm91cC5pZCkpLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gcmVzZXRUb0RlZmF1bHRzKCkgbW92ZXMgdGhlIHN0YXRlIHZlcnNpb24gYW5kIGFubm91bmNlcyBhIGZ1bGwgY2hhbmdlXG4gIC8vIChudWxsKS4gVGhlIGhlYWRlciBpcyBidWlsdCBhZ2FpbiBmb3IgdGhlIG5ldyB2ZXJzaW9uLCBhbmRcbiAgLy8gZmlsdGVyS2V5LCB3aGljaCBjYXJyaWVzIGl0LCByZWNyZWF0ZXMgdGhlIGJsb2NrOiBmcy1maWx0ZXIgcmVhZHMgaXRzXG4gIC8vIGNvbmZpZyBvbmNlLiBBbnkgb3RoZXIgZnVsbCBjaGFuZ2UgKGEgcmVsb2FkLCB0aGUgbWF0Y2gpIGxlYXZlcyBpdCBiZS5cbiAgLy8gQSBjaGFuZ2UgdG8gb25lIGdyb3VwIHRoZSBoZWFkZXIgc2hvd3Mgd2l0aCBhbm90aGVyIHZhbHVlIChhbm90aGVyIGJhclxuICAvLyBzZXQgaXQpIGJ1aWxkcyBpdCBhZ2FpbiB0b28uXG4gIHByaXZhdGUgX3JlYnVpbGRIZWFkZXJPbk5ld1N0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuX2ZpbHRlclN0YXRlLmNoYW5nZXNGb3IodGhpcy5jb21wb25lbnQpXG4gICAgICAucGlwZShcbiAgICAgICAgcnhGaWx0ZXIoKGdyb3VwSWQpID0+IChncm91cElkID09PSBudWxsXG4gICAgICAgICAgPyB0aGlzLl9maWx0ZXJTdGF0ZS5zdGF0ZVZlcnNpb24oKSAhPT0gdGhpcy5faGVhZGVyVmVyc2lvbigpXG4gICAgICAgICAgOiB0aGlzLl9zaG93c090aGVyVmFsdWUoZ3JvdXBJZCkpKSxcbiAgICAgICAgdGFwKCgpID0+IHRoaXMuX2J1aWxkRmlsdGVyQ29uZmlnKCkpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvLyBXaGV0aGVyIHRoZSBoZWFkZXIgc2hvd3MgYSBncm91cCB3aXRoIGEgdmFsdWUgb3RoZXIgdGhhbiB0aGUgb25lIHN0b3JlZFxuICAvLyBmb3IgaXQuIEEgY2hhbmdlIHRoZSBoZWFkZXIncyBvd24gYmFyIG1hZGUgaXMgd2hhdCBpdCBzaG93cyBhbHJlYWR5LlxuICBwcml2YXRlIF9zaG93c090aGVyVmFsdWUoZ3JvdXBJZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3Nob3duLmhhcyhncm91cElkKVxuICAgICAgJiYgZ3JvdXBWYWx1ZVNpZ25hdHVyZSh0aGlzLl9zaG93bi5nZXQoZ3JvdXBJZCkpICE9PSBncm91cFZhbHVlU2lnbmF0dXJlKHRoaXMuX2ZpbHRlclN0YXRlLnZhbHVlKGdyb3VwSWQpKTtcbiAgfVxuXG4gIHByaXZhdGUgX29yaWdpbiA9IHsgeDogMCwgeTogMCwgdzogMCwgaDogMCB9O1xuXG4gIC8vIFBvaW50ZXItY2FwdHVyZSBnZXN0dXJlIGxvb3A6IHJ1bnMgb3V0c2lkZSBBbmd1bGFyLCByZXBhaW50cyBpbXBlcmF0aXZlbHksXG4gIC8vIGFuZCBmaW5pc2hlcyBiYWNrIGluc2lkZSBBbmd1bGFyIChzZWxlY3Rpb24vcGVyc2lzdGVuY2UpLlxuICBwcml2YXRlIF90cmFjayhcbiAgICBldmVudDogUG9pbnRlckV2ZW50LFxuICAgIG9uTW92ZTogKGRlbHRhWDogbnVtYmVyLCBkZWx0YVk6IG51bWJlcikgPT4gdm9pZCxcbiAgICBvbkVuZDogKCkgPT4gdm9pZCxcbiAgKTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIGNvbnN0IGhhbmRsZSA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBoYW5kbGUuc2V0UG9pbnRlckNhcHR1cmUoZXZlbnQucG9pbnRlcklkKTtcblxuICAgIHRoaXMuX29yaWdpbiA9IHtcbiAgICAgIHg6IHRoaXMuY29tcG9uZW50LngsXG4gICAgICB5OiB0aGlzLmNvbXBvbmVudC55LFxuICAgICAgdzogdGhpcy5jb21wb25lbnQudyxcbiAgICAgIGg6IHRoaXMuY29tcG9uZW50LmgsXG4gICAgfTtcbiAgICBjb25zdCBzdGFydFggPSBldmVudC5jbGllbnRYO1xuICAgIGNvbnN0IHN0YXJ0WSA9IGV2ZW50LmNsaWVudFk7XG5cbiAgICB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGNvbnN0IG1vdmUgPSAoZTogUG9pbnRlckV2ZW50KSA9PiBvbk1vdmUoZS5jbGllbnRYIC0gc3RhcnRYLCBlLmNsaWVudFkgLSBzdGFydFkpO1xuICAgICAgY29uc3QgZW5kID0gKCkgPT4ge1xuICAgICAgICBoYW5kbGUucmVsZWFzZVBvaW50ZXJDYXB0dXJlKGV2ZW50LnBvaW50ZXJJZCk7XG4gICAgICAgIGhhbmRsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIG1vdmUpO1xuICAgICAgICBoYW5kbGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgZW5kKTtcbiAgICAgICAgaGFuZGxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLCBlbmQpO1xuXG4gICAgICAgIHRoaXMuX3pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnNuYXBwZXI/LmNsZWFyKCk7XG4gICAgICAgICAgb25FbmQoKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBoYW5kbGUuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBtb3ZlKTtcbiAgICAgIGhhbmRsZS5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCBlbmQpO1xuICAgICAgaGFuZGxlLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJjYW5jZWwnLCBlbmQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZW1pdEdlb21ldHJ5KCk6IHZvaWQge1xuICAgIHRoaXMuY29tcG9uZW50LnggPSB0aGlzLl9yb3VuZCh0aGlzLmNvbXBvbmVudC54KTtcbiAgICB0aGlzLmNvbXBvbmVudC55ID0gdGhpcy5fcm91bmQodGhpcy5jb21wb25lbnQueSk7XG4gICAgdGhpcy5jb21wb25lbnQudyA9IHRoaXMuX3JvdW5kKE1hdGgubWF4KE1JTl9XLCB0aGlzLmNvbXBvbmVudC53KSk7XG4gICAgdGhpcy5jb21wb25lbnQuaCA9IHRoaXMuX3JvdW5kKE1hdGgubWF4KE1JTl9ILCB0aGlzLmNvbXBvbmVudC5oKSk7XG4gICAgdGhpcy5fYXBwbHlHZW9tZXRyeSgpO1xuICAgIHRoaXMuY2hhcnRDb21wb25lbnQ/LnJlc2l6ZSgpO1xuXG4gICAgdGhpcy5wb3NpdGlvbkNoYW5nZWQuZW1pdCh7XG4gICAgICBjb21wb25lbnRJZDogdGhpcy5jb21wb25lbnQuaWQsXG4gICAgICB4OiB0aGlzLmNvbXBvbmVudC54LFxuICAgICAgeTogdGhpcy5jb21wb25lbnQueSxcbiAgICAgIHc6IHRoaXMuY29tcG9uZW50LncsXG4gICAgICBoOiB0aGlzLmNvbXBvbmVudC5oLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gQXV0byBoZWlnaHQgKGJveCBmaXRzIGl0cyBjb250ZW50KSB2cyBmaXhlZCAodXNlIGBoYCBleGFjdGx5KS4gRGVyaXZlZCBmcm9tXG4gIC8vIHR5cGUsIHNlcnZlci1zaWRlOiBLUEkgdGlsZXMgYXJlIGF1dG87IGNoYXJ0cyBhbmQgbGlzdHMgYXJlIGZpeGVkIOKAlCBjaGFydHNcbiAgLy8gZml0IHRoZSBib3ggYW5kIG5ldmVyIG92ZXJmbG93LCBsaXN0cyBzY3JvbGwgaW5zaWRlIGl0LlxuICBwcml2YXRlIGdldCBfaGVpZ2h0QXV0bygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnQuYXV0b0hlaWdodCAhPT0gZmFsc2U7XG4gIH1cblxuICAvLyBEcml2ZXMgdGhlIGF1dG8tb25seSBDU1MgZGVmYXVsdCAoZW1wdHktc3RhdGUgYmFzZWxpbmUpIHNvIGl0IG5ldmVyIGFwcGxpZXNcbiAgLy8gdG8gYSBmaXhlZC1oZWlnaHQgY29tcG9uZW50LlxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmhlaWdodC1hdXRvJylcbiAgcHVibGljIGdldCBoZWlnaHRBdXRvKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9oZWlnaHRBdXRvO1xuICB9XG5cbiAgLy8gU2NyZWVuIHBpeGVscyDihpIgaW5jaGVzIGF0IHRoZSBjdXJyZW50IHpvb20uXG4gIHByaXZhdGUgX2luY2hlcyhwaXhlbHM6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHBpeGVscyAvICh0aGlzLnpvb20gKiBQWF9QRVJfSU5DSCk7XG4gIH1cblxuICAvLyBDbGVhbiBwZXJzaXN0ZWQgdmFsdWVzOiBodW5kcmVkdGhzIG9mIGFuIGluY2guXG4gIHByaXZhdGUgX3JvdW5kKHZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlICogMTAwKSAvIDEwMDtcbiAgfVxuXG4gIC8vIFRoZSBjYW52YXMgcG9zaXRpb25zIHRoZSBob3N0IHZpYSBbc3R5bGVdOyBtaWQtZ2VzdHVyZSB3ZSBzZXQgaXQgZGlyZWN0bHlcbiAgLy8gc28gT25QdXNoIG5ldmVyIHJlLXJlbmRlcnMgaW4gdGhlIG1vdmUgbG9vcC5cbiAgcHJpdmF0ZSBfYXBwbHlHZW9tZXRyeSgpOiB2b2lkIHtcbiAgICBjb25zdCBzdHlsZSA9IHRoaXMuX2hvc3QubmF0aXZlRWxlbWVudC5zdHlsZTtcbiAgICBzdHlsZS5sZWZ0ID0gYCR7dGhpcy5jb21wb25lbnQueCAqIFBYX1BFUl9JTkNIfXB4YDtcbiAgICBzdHlsZS50b3AgPSBgJHt0aGlzLmNvbXBvbmVudC55ICogUFhfUEVSX0lOQ0h9cHhgO1xuICAgIHN0eWxlLndpZHRoID0gYCR7dGhpcy5jb21wb25lbnQudyAqIFBYX1BFUl9JTkNIfXB4YDtcblxuICAgIC8vIEF1dG8gKGtwaSk6IG5vIGZpeGVkIGhlaWdodCDigJQgdGhlIGJveCBzaXplcyB0byBpdHMgY29udGVudC4gRml4ZWRcbiAgICAvLyAoY2hhcnQvbGlzdCk6IGBoYCBpcyB0aGUgZXhhY3QgaGVpZ2h0LiBNaXJyb3JzIHRoZSBjYW52YXMgW3N0eWxlXSBiaW5kaW5nXG4gICAgLy8gc28gdGhlIG1pZC1nZXN0dXJlIHBhaW50IG1hdGNoZXMgdGhlIHBvc3QtZ2VzdHVyZSByZS1yZW5kZXIuXG4gICAgaWYgKHRoaXMuX2hlaWdodEF1dG8pIHtcbiAgICAgIHN0eWxlLmhlaWdodCA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHlsZS5oZWlnaHQgPSBgJHt0aGlzLmNvbXBvbmVudC5oICogUFhfUEVSX0lOQ0h9cHhgO1xuICAgIH1cbiAgfVxuXG4gIC8vIC0tLS0tIGRhdGEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8vIE9uZSByZXF1ZXN0IG9mIHRoZSBsb2FkIHN0cmVhbSAodGlsZUxvYWRzKSwgYnVpbHQgZnJvbSB0aGUgc3RhdGUgbm93LiBUaGVcbiAgLy8gc3Bpbm5lciBzaG93cyBlaXRoZXIgd2F5OyBhIHRpbGUgd2l0aCBkYXRhIG9uIHNjcmVlbiBrZWVwcyBpdCwgZGltbWVkLlxuICBwcml2YXRlIF9sb2FkKCk6IE9ic2VydmFibGU8Q29tcG9uZW50RGF0YT4ge1xuICAgIGNvbnN0IGZpcnN0ID0gIXRoaXMuZGF0YSgpO1xuXG4gICAgdGhpcy5sb2FkaW5nLnNldChmaXJzdCk7XG4gICAgdGhpcy5yZWZyZXNoaW5nLnNldCghZmlyc3QpO1xuICAgIHRoaXMuZXJyb3Iuc2V0KG51bGwpO1xuXG4gICAgY29uc3QgZmlsdGVycyA9IHRoaXMuX2ZpbHRlclN0YXRlLnJlc29sdmVGb3JDb21wb25lbnQodGhpcy5jb21wb25lbnQpO1xuICAgIC8vIFRoZSB0aWxlJ3MgaW50ZXJhY3Rpb24gc3RhdGUsIHRoZSBvbmUgaXRzIENTViBhbmQgZXZlcnkgZXhwb3J0IGNhcnJ5XG4gICAgLy8gKHRpbGVEYXRhU3RhdGUpOiB0aGUgZ3JhaW4gb2YgYSB0aWxlIHRoYXQgZm9sbG93cyB0aGUgZ3JvdXAtYnkgKHdoZW5cbiAgICAvLyB0aGUgdmlld2VyIHBpY2tlZCBvbmUpIHNvIHRoZSBiYWNrZW5kIHJlLWJ1Y2tldHMsIGEgY2hhcnQncyBkcmlsbFxuICAgIC8vIHBhdGgsIGFuZCB0aGUgZ3JvdXBzIHRoYXQgbWF0Y2ggJ2FueScuXG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9maWx0ZXJTdGF0ZS50aWxlU3RhdGUodGhpcy5jb21wb25lbnQpO1xuXG4gICAgcmV0dXJuIHRoaXMuX3JlcG9ydERhdGEuY29tcG9uZW50RGF0YSh0aGlzLnJlcG9ydElkLCB0aGlzLmNvbXBvbmVudC5pZCwgZmlsdGVycywgc3RhdGUpO1xuICB9XG5cbiAgLy8gQSBmYWlsZWQgbG9hZCBjbGVhcnMgdGhlIGRhdGEgd2l0aCBpdHMgbWVzc2FnZSwgc28gdGhlIG5leHQgbG9hZCBzdGFydHNcbiAgLy8gZnJvbSBhbiBlbXB0eSB0aWxlIGFuZCBuZXZlciBzaG93cyB0aGUgZGF0YSB0aGUgZmFpbHVyZSByZXBsYWNlZC4gQVxuICAvLyBjaGFydCdzIGFuc3dlciBnaXZlcyBpdHMgZHJpbGwgcGF0aC5cbiAgcHJpdmF0ZSBfbG9hZGVkKHJlc3VsdDogVGlsZUxvYWRSZXN1bHQ8Q29tcG9uZW50RGF0YT4pOiB2b2lkIHtcbiAgICB0aGlzLmRhdGEuc2V0KHJlc3VsdC5kYXRhKTtcbiAgICB0aGlzLmVycm9yLnNldChyZXN1bHQuZXJyb3IpO1xuICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgIHRoaXMucmVmcmVzaGluZy5zZXQoZmFsc2UpO1xuXG4gICAgaWYgKHJlc3VsdC5lcnJvciA9PT0gbnVsbCAmJiByZXN1bHQuZGF0YSkge1xuICAgICAgdGhpcy5fYWRvcHREcmlsbChyZXN1bHQuZGF0YSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQSBjaGFydCB0YWtlcyB0aGUgZHJpbGwgcGF0aCBpdHMgYW5zd2VyIGFwcGxpZWQgKGFkb3B0ZWREcmlsbFBhdGgpIHdoaWxlXG4gIC8vIHRoZSB2aWV3ZXIgaXMgb2ZmZXJlZCBkcmlsbDsgYW4gb2xkZXIgc2VydmVyIGFwcGxpZXMgbm9uZSwgYW5kIHRoZSBwYXRoXG4gIC8vIHN0YXlzIGluIHRoZSBzdGF0ZS4gV2hlbiB0aGUgcGF0aCBpdCBzZW50IHdhcyBjdXQsIHRoZSB2aWV3ZXIgaXMgdG9sZFxuICAvLyBvbmNlIChkcmlsbFJlc2V0Tm90ZWQpOiB0aGUgc2hvcnRlciBwYXRoIGlzIHdoYXQgdGhlIGNoYXJ0IHJlYWRzIGZyb21cbiAgLy8gbm93IG9uLCBzbyB0aGUgc2VydmVyIGN1dHMgbm90aGluZyBhZ2Fpbi5cbiAgcHJpdmF0ZSBfYWRvcHREcmlsbChkYXRhOiBDb21wb25lbnREYXRhKTogdm9pZCB7XG4gICAgY29uc3QgZ3JhaW5Nb3ZlZCA9IHRoaXMuX2dyYWluTW92ZWQ7XG4gICAgdGhpcy5fZ3JhaW5Nb3ZlZCA9IGZhbHNlO1xuXG4gICAgaWYgKHRoaXMuY29tcG9uZW50LnR5cGUgIT09ICdjaGFydCcgfHwgIXRoaXMuX29mZmVyZWRGZWF0dXJlcygpLmluY2x1ZGVzKCdkcmlsbCcpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2ZpbHRlclN0YXRlLmFkb3B0RHJpbGwodGhpcy5jb21wb25lbnQuaWQsIGFkb3B0ZWREcmlsbFBhdGgoZGF0YS5kcmlsbCkpXG4gICAgICAmJiBkcmlsbFJlc2V0Tm90ZWQoZGF0YS5kcmlsbCwgZ3JhaW5Nb3ZlZCkpIHtcbiAgICAgIHRoaXMuX21lc3NhZ2Uud2FybmluZyhEUklMTF9SRVNFVF9NRVNTQUdFKTtcbiAgICB9XG4gIH1cblxuICAvLyAtLS0tLSBtYXJrIGNsaWNrcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwcml2YXRlIF9ydW5NYXJrQWN0aW9uKGFjdGlvbjogUmVwb3J0TWFya0FjdGlvbiwgY2xpY2s6IFJlcG9ydE1hcmtDbGljayk6IHZvaWQge1xuICAgIGlmIChhY3Rpb24gPT09ICdkcmlsbCcpIHtcbiAgICAgIHRoaXMuX2RyaWxsRG93bihjbGljayk7XG4gICAgfVxuICB9XG5cbiAgLy8gRHJpbGwgZG93bjogdGhlIGNoYXJ0J3MgcGF0aCBnb2VzIG9uZSBsZXZlbCBiZWxvdyB0aGUgcGVyaW9kIGNsaWNrZWQsXG4gIC8vIGFuZCB0aGUgY2hhcnQgcmVhZHMgYWdhaW4gKGRyaWxsQ2hhbmdlcykuXG4gIHByaXZhdGUgX2RyaWxsRG93bihjbGljazogUmVwb3J0TWFya0NsaWNrKTogdm9pZCB7XG4gICAgY29uc3QgcGF0aCA9IGRyaWxsRG93blBhdGgodGhpcy5kYXRhKCk/LmRyaWxsLCBjbGljayk7XG5cbiAgICBpZiAocGF0aCkge1xuICAgICAgdGhpcy5fZmlsdGVyU3RhdGUuc2V0RHJpbGwodGhpcy5jb21wb25lbnQuaWQsIHBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIExpc3RzIHRoZSBjbGljaydzIGFjdGlvbnMgaW4gdGhlIG1hcmsgbWVudSBhbmQgb3BlbnMgaXQgYXQgdGhlIGNsaWNrLFxuICAvLyB0aHJvdWdoIHRoZSB6ZXJvLXNpemUgYW5jaG9yIChvcGVuQXRQb2ludCkuXG4gIHByaXZhdGUgX29wZW5NYXJrTWVudShhY3Rpb25zOiBSZXBvcnRNYXJrQWN0aW9uW10sIGNsaWNrOiBSZXBvcnRNYXJrQ2xpY2spOiB2b2lkIHtcbiAgICBjb25zdCBhbmNob3IgPSB0aGlzLm1hcmtBbmNob3I/Lm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBpZiAoIWFuY2hvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX21lbnVDbGljayA9IGNsaWNrO1xuICAgIHRoaXMubWFya01lbnVBY3Rpb25zLnNldChhY3Rpb25zKTtcbiAgICBvcGVuQXRQb2ludChhbmNob3IsIGNsaWNrLnBvaW50ZXIsIHRoaXMuem9vbSwgKCkgPT4gdGhpcy5tYXJrTWVudT8ub3Blbk1lbnUobnVsbCkpO1xuICB9XG59XG4iLCI8ZGl2XG4gICAgY2xhc3M9XCJjb21wb25lbnQtYm94XCJcbiAgICBbY2xhc3MuZWRpdGluZ109XCJlZGl0TW9kZVwiXG4gICAgW2NsYXNzLnRleHRdPVwiaXNUZXh0XCJcbiAgICBbY2xhc3Muc2VsZWN0ZWRdPVwic2VsZWN0ZWRcIlxuICAgIFtjbGFzcy5yZWZyZXNoaW5nXT1cInJlZnJlc2hpbmcoKVwiXG4gICAgW3N0eWxlLnBhZGRpbmddPVwiYm9keVBhZGRpbmdcIlxuICAgIChwb2ludGVyZG93bik9XCJvbkNvbXBvbmVudFBvaW50ZXJEb3duKCRldmVudClcIlxuICAgIChtb3VzZWRvd24pPVwic3RvcENhbnZhc1BhbigkZXZlbnQpXCJcbiAgICAodG91Y2hzdGFydCk9XCJzdG9wQ2FudmFzUGFuKCRldmVudClcIj5cbiAgPCEtLSBUaGUgaGVhZGVyIGlzIGFuIGZzLWZpbHRlcjogaGVhZGluZyB0ZW1wbGF0ZSA9IHRpdGxlIChhbmQgdGhlIGVkaXQtbW9kZVxuICAgICAgIGRyYWcgaGFuZGxlKSwgYWN0aW9ucyA9IHRoZSBtZW51LCBpdGVtcyA9IGNvbXBvbmVudC1sZXZlbCBmaWx0ZXIgZ3JvdXBzLFxuICAgICAgIHRoZSBzYW1lIHN0cmlwIGZvciBldmVyeSB0eXBlIChsaXN0cyBpbmNsdWRlZCkuIGZzLWZpbHRlciByZWFkcyBpdHNcbiAgICAgICBjb25maWcgb25jZSwgc28gdGhlIGJsb2NrIGlzIGtleWVkIG9uIHRoZSBjb21wb25lbnQtZmlsdGVyIHNldCB0byBiZVxuICAgICAgIHJlY3JlYXRlZCB3aGVuIGl0IGNoYW5nZXMuIFRoZSB0aXRsZSBzaG93cyBpdHMgdG9rZW5zIGZpbGxlZCwgYW5kIGFcbiAgICAgICBmaWx0ZXIgY2hhbmdlIHJlcGFpbnRzIGl0IGluIHBsYWNlIChzaG93blRpdGxlKS4gLS0+XG4gIDwhLS0gQSB0ZXh0IGJsb2NrIGhhcyBubyB0aXRsZSBiYXIg4oCUIGl0IElTIGl0cyB3b3JkcywgbGlrZSBhIHRleHQgYm94IG9uIGFcbiAgICAgICBzbGlkZSDigJQgc28gaXQgZ2V0cyBuZWl0aGVyIHRoZSBoZWFkZXIgbm9yIHRoZSBkYXRhIGFjdGlvbnMuIC0tPlxuICBAZm9yIChrZXkgb2YgaXNUZXh0ID8gW10gOiBbZmlsdGVyS2V5XTsgdHJhY2sga2V5KSB7XG4gICAgPGZzLWZpbHRlclxuICAgICAgICBjbGFzcz1cImNvbXBvbmVudC1maWx0ZXJcIlxuICAgICAgICBbY29uZmlnXT1cImZpbHRlckNvbmZpZygpXCI+XG4gICAgICA8bmctdGVtcGxhdGUgZnNGaWx0ZXJIZWFkaW5nPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImNvbXBvbmVudC10aXRsZVwiXG4gICAgICAgICAgICAocG9pbnRlcmRvd24pPVwib25EcmFnU3RhcnQoJGV2ZW50KVwiPlxuICAgICAgICAgIDwhLS0gV2hpbGUgdGhlIGNoYXJ0IGlzIGRyaWxsZWQgdGhlIHRpdGxlIGxlYWRzIGl0cyBicmVhZGNydW1iOlxuICAgICAgICAgICAgICAgJ1RpdGxlIOKAuiAyMDI2IOKAuiBRMycsIHRoZSB0aXRsZSBhcyB0aGUgdmlld2VyIHJlYWRzIGl0XG4gICAgICAgICAgICAgICAoc2hvd25UaXRsZSkuIFRoZSB0aXRsZSBnb2VzIGJhY2sgdG8gdGhlIHRvcCBhbmQgZWFjaFxuICAgICAgICAgICAgICAgY3J1bWIgdG8gdGhlIHBlcmlvZCBpdCBuYW1lczsgdGhlIGxhc3QgaXMgd2hlcmUgdGhlIGNoYXJ0IGlzLlxuICAgICAgICAgICAgICAgQSBsb25nIHBhdGggaXMgY3V0IGF0IGl0cyBsZWZ0IGVuZCwgc28gdGhlIGNydW1icyBuZWFyZXN0IHRoZVxuICAgICAgICAgICAgICAgY2hhcnQgc3RheSBpbiB2aWV3LiBXaGlsZSB0aGUgbGF5b3V0IGlzIGVkaXRlZCB0aGUgY3J1bWJzIGFyZVxuICAgICAgICAgICAgICAgcGxhaW4gdGV4dCAodGhlIHN0eWxlc2hlZXQ7IGRyaWxsVG8gZG9lcyBub3RoaW5nIHRoZW4pLiAtLT5cbiAgICAgICAgICBAaWYgKGRyaWxsQ3J1bWJzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRyaWxsLXBhdGhcIj5cbiAgICAgICAgICAgICAgPHNwYW4gZGlyPVwibHRyXCI+XG4gICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkcmlsbC1jcnVtYlwiXG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkcmlsbFRvKDApXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiZHJpbGxUbygwKVwiPlxuICAgICAgICAgICAgICAgICAge3sgc2hvd25UaXRsZSB9fVxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICBAZm9yIChsYWJlbCBvZiBkcmlsbENydW1icygpOyB0cmFjayAkaW5kZXg7IGxldCBsYXN0ID0gJGxhc3QpIHtcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHJpbGwtc2VwYXJhdG9yXCI+e3sgZHJpbGxTZXBhcmF0b3IgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICBAaWYgKGxhc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgbGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHJpbGwtY3J1bWJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkcmlsbFRvKCRpbmRleCArIDEpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImRyaWxsVG8oJGluZGV4ICsgMSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBsYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICB7eyBzaG93blRpdGxlIH19XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAodHJ1bmNhdGVkKSB7XG4gICAgICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAgICAgICBjbGFzcz1cInRydW5jYXRlZC1pY29uXCJcbiAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiU2hvd2luZyBhIHRydW5jYXRlZCByZXN1bHQg4oCUIHJlZmluZSB0aGUgZmlsdGVycyB0byBzZWUgZXZlcnl0aGluZy5cIj5cbiAgICAgICAgICAgICAgd2FybmluZ19hbWJlclxuICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2ZzLWZpbHRlcj5cbiAgfVxuICA8IS0tIFRoZSBhY3Rpb25zIG1lbnUgaXMgZmxvYXRlZCB0b3AtcmlnaHQgKGFic29sdXRlKSByYXRoZXIgdGhhbiBsaXZpbmcgaW5cbiAgICAgICBmcy1maWx0ZXIncyBhY3Rpb25zIHNsb3QsIHNvIGl0cyB+NDBweCBidXR0b24gaGVpZ2h0IG5vIGxvbmdlciBkcml2ZXMgdGhlXG4gICAgICAgaGVhZGVyIHJvdydzIGhlaWdodC4gSXQgb3ZlcmxheXMgdGhlIGJveCBjb3JuZXI7IHRoZSBoZWFkaW5nIHJlc2VydmVzXG4gICAgICAgcmlnaHQgcGFkZGluZyBzbyBhIGxvbmcgdGl0bGUgZWxsaXBzaXNlcyBiZWZvcmUgaXQuIC0tPlxuICBAaWYgKCFpc1RleHQgfHwgKGVkaXRNb2RlICYmICF0ZXh0RWRpdGluZygpKSkge1xuICAgIDxidXR0b25cbiAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgIGNsYXNzPVwiY29tcG9uZW50LW1lbnVcIlxuICAgICAgICBbZnNNZW51VHJpZ2dlckZvcl09XCJtZW51XCJcbiAgICAgICAgKHBvaW50ZXJkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgIChtb3VzZWRvd24pPVwic3RvcENhbnZhc1BhbigkZXZlbnQpXCI+XG4gICAgICA8bWF0LWljb24+bW9yZV92ZXJ0PC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8IS0tIEJlc2lkZSBpdHMgdHJpZ2dlciwgaW5zaWRlIHRoZSBzYW1lIGJsb2NrOiBhbiBmcy1tZW51IHRoYXQgZmluZHMgbm9cbiAgICAgICAgIHRyaWdnZXIgb2YgaXRzIG93biBkcmF3cyBvbmUuIC0tPlxuICAgIDxmcy1tZW51ICNtZW51PlxuICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgZnMtbWVudS1pdGVtXG4gICAgICAgICAgW2hpZGRlbl09XCIhaXNUZXh0XCJcbiAgICAgICAgICAoY2xpY2spPVwiZWRpdFRleHQoKVwiPlxuICAgICAgICA8bWF0LWljb24+ZWRpdDwvbWF0LWljb24+XG4gICAgICAgIDxzcGFuPkVkaXQgdGV4dDwvc3Bhbj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICBmcy1tZW51LWl0ZW1cbiAgICAgICAgICBbaGlkZGVuXT1cIiFpc1RleHRcIlxuICAgICAgICAgIChjbGljayk9XCJkZWxldGVUZXh0KClcIj5cbiAgICAgICAgPG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+XG4gICAgICAgIDxzcGFuPkRlbGV0ZTwvc3Bhbj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICBmcy1tZW51LWl0ZW1cbiAgICAgICAgICBbaGlkZGVuXT1cIiFkcmlsbENydW1icygpLmxlbmd0aCB8fCBlZGl0TW9kZVwiXG4gICAgICAgICAgKGNsaWNrKT1cImRyaWxsVXAoKVwiPlxuICAgICAgICA8bWF0LWljb24+YXJyb3dfdXB3YXJkPC9tYXQtaWNvbj5cbiAgICAgICAgPHNwYW4+RHJpbGwgdXA8L3NwYW4+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgZnMtbWVudS1pdGVtXG4gICAgICAgICAgW2hpZGRlbl09XCIhZHJpbGxDcnVtYnMoKS5sZW5ndGggfHwgZWRpdE1vZGVcIlxuICAgICAgICAgIChjbGljayk9XCJkcmlsbFRvKDApXCI+XG4gICAgICAgIDxtYXQtaWNvbj52ZXJ0aWNhbF9hbGlnbl90b3A8L21hdC1pY29uPlxuICAgICAgICA8c3Bhbj5CYWNrIHRvIHRvcDwvc3Bhbj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICBmcy1tZW51LWl0ZW1cbiAgICAgICAgICBbaGlkZGVuXT1cImlzVGV4dFwiXG4gICAgICAgICAgKGNsaWNrKT1cInNldHRpbmdzKClcIj5cbiAgICAgICAgPG1hdC1pY29uPnR1bmU8L21hdC1pY29uPlxuICAgICAgICA8c3Bhbj5TZXR0aW5nczwvc3Bhbj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICBmcy1tZW51LWl0ZW1cbiAgICAgICAgICBbaGlkZGVuXT1cImlzVGV4dFwiXG4gICAgICAgICAgKGNsaWNrKT1cImV4cG9ydENzdigpXCI+XG4gICAgICAgIDxtYXQtaWNvbj5kb3dubG9hZDwvbWF0LWljb24+XG4gICAgICAgIDxzcGFuPkV4cG9ydCBDU1Y8L3NwYW4+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgZnMtbWVudS1pdGVtXG4gICAgICAgICAgW2hpZGRlbl09XCIhaGlkZXNDb2x1bW5zXCJcbiAgICAgICAgICAoY2xpY2spPVwiY2hvb3NlQ29sdW1ucygpXCI+XG4gICAgICAgIDxtYXQtaWNvbj52aWV3X2NvbHVtbjwvbWF0LWljb24+XG4gICAgICAgIDxzcGFuPkNvbHVtbnM8L3NwYW4+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvZnMtbWVudT5cbiAgfVxuICA8ZGl2IGNsYXNzPVwiY29tcG9uZW50LWJvZHlcIj5cbiAgICBAaWYgKGlzVGV4dCkge1xuICAgICAgPGFwcC1yZXBvcnQtY29tcG9uZW50LXRleHRcbiAgICAgICAgW2h0bWxdPVwidGV4dEh0bWwoKSA/PyBjb21wb25lbnQuY29uZmlnPy5odG1sID8/ICcnXCJcbiAgICAgICAgW3Rva2Vuc109XCJ0b2tlbnMoKVwiXG4gICAgICAgIFtlZGl0aW5nXT1cInRleHRFZGl0aW5nKClcIlxuICAgICAgICBbc2hvd25FbHNld2hlcmVdPVwic2hvd25FbHNld2hlcmVcIlxuICAgICAgICAoc2F2ZWQpPVwib25UZXh0U2F2ZWQoJGV2ZW50KVwiXG4gICAgICAgIChlZGl0RW5kZWQpPVwidGV4dEVkaXRpbmcuc2V0KGZhbHNlKVwiXG4gICAgICAgICh2YWx1ZVNldHRpbmdzKT1cInZhbHVlU2V0dGluZ3MuZW1pdCgkZXZlbnQpXCI+XG4gICAgICA8L2FwcC1yZXBvcnQtY29tcG9uZW50LXRleHQ+XG4gICAgfSBAZWxzZSBpZiAoY29tcG9uZW50LnR5cGUgPT09ICdsaXN0Jykge1xuICAgICAgQGZvciAoa2V5IG9mIFtsaXN0UmVzZXRLZXkoKV07IHRyYWNrIGtleSkge1xuICAgICAgICA8YXBwLXJlcG9ydC1jb21wb25lbnQtbGlzdFxuICAgICAgICAgIFtyZXBvcnRJZF09XCJyZXBvcnRJZFwiXG4gICAgICAgICAgW2NvbXBvbmVudF09XCJjb21wb25lbnRcIj5cbiAgICAgICAgPC9hcHAtcmVwb3J0LWNvbXBvbmVudC1saXN0PlxuICAgICAgfVxuICAgIH0gQGVsc2UgaWYgKGNvbXBvbmVudC50eXBlID09PSAnZ3JpZCcpIHtcbiAgICAgIDxhcHAtcmVwb3J0LWNvbXBvbmVudC1ncmlkXG4gICAgICAgIFtyZXBvcnRJZF09XCJyZXBvcnRJZFwiXG4gICAgICAgIFtjb21wb25lbnRdPVwiY29tcG9uZW50XCI+XG4gICAgICA8L2FwcC1yZXBvcnQtY29tcG9uZW50LWdyaWQ+XG4gICAgfSBAZWxzZSBpZiAobG9hZGluZygpKSB7XG4gICAgICA8IS0tIEhvbGRzIHRoZSB0aWxlJ3MgaGVpZ2h0IGZvciB0aGUgc3Bpbm5lciBvbiB0aGUgZmlyc3QgbG9hZC4gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29tcG9uZW50LXN0YXRlXCI+PC9kaXY+XG4gICAgfSBAZWxzZSBpZiAoZXJyb3IoKSkge1xuICAgICAgPGRpdiBjbGFzcz1cImNvbXBvbmVudC1zdGF0ZSBlcnJvclwiPlxuICAgICAgICB7eyBlcnJvcigpIH19XG4gICAgICA8L2Rpdj5cbiAgICB9IEBlbHNlIGlmICghZGF0YSgpPy5yb3dzPy5sZW5ndGgpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJjb21wb25lbnQtc3RhdGVcIj5cbiAgICAgICAge3sgZW1wdHlNZXNzYWdlKCkgfX1cbiAgICAgIDwvZGl2PlxuICAgIH0gQGVsc2UgaWYgKGNvbXBvbmVudC50eXBlID09PSAna3BpJykge1xuICAgICAgPGFwcC1yZXBvcnQtY29tcG9uZW50LWtwaVxuICAgICAgICBbY29tcG9uZW50XT1cImNvbXBvbmVudFwiXG4gICAgICAgIFtkYXRhXT1cImRhdGEoKVwiXG4gICAgICAgIChtYXJrQ2xpY2spPVwib25NYXJrQ2xpY2soJGV2ZW50KVwiPlxuICAgICAgPC9hcHAtcmVwb3J0LWNvbXBvbmVudC1rcGk+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8YXBwLXJlcG9ydC1jb21wb25lbnQtY2hhcnRcbiAgICAgICAgW2NvbXBvbmVudF09XCJjb21wb25lbnRcIlxuICAgICAgICBbZGF0YV09XCJkYXRhKClcIlxuICAgICAgICBbYWN0aW9uc109XCJ0aWxlQWN0aW9ucygpXCJcbiAgICAgICAgWyhsZWdlbmRTZWxlY3RlZCldPVwibGVnZW5kU2VsZWN0ZWRcIlxuICAgICAgICAobWFya0NsaWNrKT1cIm9uTWFya0NsaWNrKCRldmVudClcIlxuICAgICAgICAobWFya01pc3MpPVwib25NYXJrTWlzcygpXCI+XG4gICAgICA8L2FwcC1yZXBvcnQtY29tcG9uZW50LWNoYXJ0PlxuICAgIH1cbiAgICA8IS0tIEluIGVkaXQgbW9kZSBhIHRyYW5zcGFyZW50IHZlaWwgb3ZlciB0aGUgYm9keSBtYWtlcyB0aGUgV0hPTEVcbiAgICAgICAgIGNvbXBvbmVudCBkcmFnZ2FibGUgKGluZHVzdHJ5IHN0YW5kYXJkOiB5b3UgZ3JhYiB0aGUgb2JqZWN0LCBub3QganVzdFxuICAgICAgICAgaXRzIHRpdGxlIGJhcikgYW5kIGtlZXBzIGlubmVyIHdpZGdldHMgZnJvbSBzd2FsbG93aW5nIHRoZSBnZXN0dXJlLiAtLT5cbiAgICBAaWYgKGVkaXRNb2RlICYmICF0ZXh0RWRpdGluZygpKSB7XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZHJhZy12ZWlsXCJcbiAgICAgICAgKHBvaW50ZXJkb3duKT1cIm9uRHJhZ1N0YXJ0KCRldmVudClcIj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG4gIDwhLS0gQSBsb2FkOiBhIHNwaW5uZXIgY2VudHJlZCBvbiB0aGUgd2hvbGUgdGlsZS4gT24gYSByZWZldGNoIHRoZSBib2R5IGFuZFxuICAgICAgIHRoZSBtZW51IGFyZSBkaW1tZWQgdW5kZXIgaXQgKC5yZWZyZXNoaW5nKTsgdGhlIHRpdGxlIGlzIG5vdC4gLS0+XG4gIEBpZiAobG9hZGluZygpIHx8IHJlZnJlc2hpbmcoKSkge1xuICAgIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lclxuICAgICAgY2xhc3M9XCJsb2FkLXNwaW5uZXJcIlxuICAgICAgYXJpYS1sYWJlbD1cIkxvYWRpbmcgZGF0YVwiXG4gICAgICBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiXG4gICAgICBbZGlhbWV0ZXJdPVwiMTVcIj5cbiAgICA8L21hdC1wcm9ncmVzcy1zcGlubmVyPlxuICB9XG48L2Rpdj5cbjwhLS0gVGhlIG1hcmsgbWVudSwgZm9yIGEgY2xpY2sgd2hvc2UgbWFyayBvZmZlcnMgdHdvIG9yIG1vcmUgYWN0aW9ucy4gSXRcbiAgICAgb3BlbnMgYXQgdGhlIGNsaWNrOiBpdHMgdHJpZ2dlciBpcyBhIHplcm8tc2l6ZSBhbmNob3IgdGhhdFxuICAgICBhbmNob3ItYXQtcG9pbnQudHMgbW92ZXMgdGhlcmUgZmlyc3QuIC0tPlxuQGlmICghaXNUZXh0ICYmICFlZGl0TW9kZSkge1xuICA8c3BhblxuICAgICNtYXJrQW5jaG9yXG4gICAgW3N0eWxlLnBvc2l0aW9uXT1cIidhYnNvbHV0ZSdcIlxuICAgIFtmc01lbnVUcmlnZ2VyRm9yXT1cIm1hcmtNZW51XCI+XG4gIDwvc3Bhbj5cbiAgPGZzLW1lbnUgI21hcmtNZW51PlxuICAgIEBmb3IgKGFjdGlvbiBvZiBtYXJrTWVudUFjdGlvbnMoKTsgdHJhY2sgYWN0aW9uKSB7XG4gICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICBmcy1tZW51LWl0ZW1cbiAgICAgICAgICAoY2xpY2spPVwicnVuTWFya0FjdGlvbihhY3Rpb24pXCI+XG4gICAgICAgIHt7IG1hcmtBY3Rpb25MYWJlbHNbYWN0aW9uXSB9fVxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICB9XG4gIDwvZnMtbWVudT5cbn1cbjwhLS0gSGFuZGxlcyBsaXZlIE9VVFNJREUgdGhlIGNsaXBwZWQgYm94IHNvIHRoZXkgc3RyYWRkbGUgaXRzIGVkZ2VzLiAtLT5cbkBpZiAoZWRpdE1vZGUgJiYgc2VsZWN0ZWQpIHtcbiAgQGZvciAoaGFuZGxlIG9mIHJlc2l6ZUhhbmRsZXM7IHRyYWNrIGhhbmRsZSkge1xuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiaGFuZGxlIGhhbmRsZS17eyBoYW5kbGUgfX1cIlxuICAgICAgKG1vdXNlZG93bik9XCJzdG9wQ2FudmFzUGFuKCRldmVudClcIlxuICAgICAgKHBvaW50ZXJkb3duKT1cIm9uUmVzaXplU3RhcnQoJGV2ZW50LCBoYW5kbGUpXCI+XG4gICAgPC9kaXY+XG4gIH1cbn0iXX0=
|