@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
|
@@ -2,6 +2,7 @@ import { ItemType, getExcludeName } from '@firestitch/filter';
|
|
|
2
2
|
import { format, parseISO } from 'date-fns';
|
|
3
3
|
import { of } from 'rxjs';
|
|
4
4
|
import { catchError, map, shareReplay } from 'rxjs/operators';
|
|
5
|
+
import { followsGroupBy } from './group-by';
|
|
5
6
|
import { filterLineText, matchLineText } from './export/report-filter-lines';
|
|
6
7
|
import { DAY_SHORT, formatLocalDate, resolveFormatContext } from './format';
|
|
7
8
|
import { GRANULARITY_OPTIONS, } from './interfaces/report.interface';
|
|
@@ -342,11 +343,12 @@ export function listSearchItem(value) {
|
|
|
342
343
|
default: value ?? undefined,
|
|
343
344
|
};
|
|
344
345
|
}
|
|
345
|
-
// Whether the report has a
|
|
346
|
-
// x-axis
|
|
347
|
-
//
|
|
348
|
-
|
|
349
|
-
|
|
346
|
+
// Whether the report has a tile the group-by control can re-bucket: a chart
|
|
347
|
+
// on a time x-axis or a table over a time axis (followsGroupBy). A time axis
|
|
348
|
+
// is the whole qualification: the control changes its grain, and a category
|
|
349
|
+
// axis has no grain to change.
|
|
350
|
+
export function hasGroupByTile(report) {
|
|
351
|
+
return (report?.pages ?? []).some((page) => (page.components ?? []).some(followsGroupBy));
|
|
350
352
|
}
|
|
351
353
|
// The grains the report's group-by control offers, named for the viewer. WHICH
|
|
352
354
|
// of them comes from the report; how they read comes from GRANULARITY_OPTIONS.
|
|
@@ -377,7 +379,7 @@ export function groupByFilterItem(report, initial) {
|
|
|
377
379
|
// Only an EXPLICIT false hides the control. An absent block means a report
|
|
378
380
|
// served by a build that predates the control being stored, and every one of
|
|
379
381
|
// those had one — the backend resolves it the same way (ReportGroupBy).
|
|
380
|
-
if (groupBy?.enabled === false || !
|
|
382
|
+
if (groupBy?.enabled === false || !hasGroupByTile(report)) {
|
|
381
383
|
return null;
|
|
382
384
|
}
|
|
383
385
|
const values = groupByOptions(report);
|
|
@@ -492,4 +494,4 @@ function selectQueryValues(raw) {
|
|
|
492
494
|
}
|
|
493
495
|
return String(raw).split(',');
|
|
494
496
|
}
|
|
495
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWZpbHRlci1pdGVtcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9yZXBvcnQtZmlsdGVyLWl0ZW1zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsUUFBUSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWpGLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRTVDLE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHOUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUk1RSxPQUFPLEVBQytCLG1CQUFtQixHQUV4RCxNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUl6RCwyRUFBMkU7QUFDM0UsNEVBQTRFO0FBQzVFLHlFQUF5RTtBQUN6RSxNQUFNLFVBQVUsZUFBZSxDQUFDLEtBQXVDO0lBQ3JFLElBQUksS0FBSyxZQUFZLElBQUksRUFBRSxDQUFDO1FBQzFCLE9BQU8sTUFBTSxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsc0VBQXNFO0lBQ3RFLDhCQUE4QjtJQUM5QixPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUN4RCxDQUFDO0FBR0QsOEVBQThFO0FBQzlFLCtFQUErRTtB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Y2x1ZGVOYW1lIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZmlsdGVyJztcblxuaW1wb3J0IHsgZm9ybWF0LCBwYXJzZUlTTyB9IGZyb20gJ2RhdGUtZm5zJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCwgc2hhcmVSZXBsYXkgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuL2RhdGEvcmVwb3J0LmRhdGEnO1xuaW1wb3J0IHsgZmlsdGVyTGluZVRleHQsIG1hdGNoTGluZVRleHQgfSBmcm9tICcuL2V4cG9ydC9yZXBvcnQtZmlsdGVyLWxpbmVzJztcbmltcG9ydCB7IERBWV9TSE9SVCwgZm9ybWF0TG9jYWxEYXRlLCByZXNvbHZlRm9ybWF0Q29udGV4dCB9IGZyb20gJy4vZm9ybWF0JztcbmltcG9ydCB7IFJlcG9ydEZpbHRlck1hdGNoIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3JlcG9ydC1maWx0ZXItbWF0Y2gudHlwZSc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJPcHRpb25QYWlyIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3JlcG9ydC1maWx0ZXItb3B0aW9uLXBhaXIuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydFZpZXdlckZlYXR1cmUgfSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LXZpZXdlci1mZWF0dXJlLnR5cGUnO1xuaW1wb3J0IHtcbiAgQ2hhcnRHcmFudWxhcml0eSwgRmlsdGVyR3JvdXBWYWx1ZSwgR1JBTlVMQVJJVFlfT1BUSU9OUywgUmVwb3J0LCBSZXBvcnRGaWx0ZXJHcm91cCwgUmVwb3J0RmlsdGVyTGV2ZWwsXG4gIFJlcG9ydEZpbHRlck9wdGlvbiwgUmVwb3J0RmlsdGVyVHlwZSwgUmVwb3J0TG9jYWxlVGFnLFxufSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBvZmZlcnNFeGNsdWRlIH0gZnJvbSAnLi9yZXBvcnQtdmlld2VyLWZlYXR1cmVzJztcbmltcG9ydCB7IFJlcG9ydEZpbHRlck9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLW9wdGlvbnMuc2VydmljZSc7XG5cblxuLy8gQSBkYXRlLXJhbmdlIGJvdW5kYXJ5IGFzIHRoZSBwaWNrZWQgTE9DQUwgY2FsZW5kYXIgZGF5IChubyB0aW1lLCBubyB0eikuXG4vLyBEYXRlLXJhbmdlIGZpbHRlcnMgYXJlIGNhbGVuZGFyLWRheSBzZW1hbnRpY3MsIHNvIHRoZSBib3VuZGFyeSBtdXN0IGNhcnJ5XG4vLyBvbmx5IFktTS1EIOKAlCBuZXZlciBhIHRpbWV6b25lLWJlYXJpbmcgaW5zdGFudCB0aGUgYmFja2VuZCB3b3VsZCBzaGlmdC5cbmV4cG9ydCBmdW5jdGlvbiBkYXRlQm91bmRTdHJpbmcodmFsdWU6IERhdGUgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBmb3JtYXQodmFsdWUsICd5eXl5LU1NLWRkJyk7XG4gIH1cblxuICAvLyBBdXRob3JlZC9yZWxhdGl2ZSBkZWZhdWx0cyBhcnJpdmUgYXMgc3RyaW5ncyBhbHJlYWR5IGluIFktTS1EIGZvcm07XG4gIC8vIGtlZXAganVzdCB0aGUgZGF0ZSBwb3J0aW9uLlxuICByZXR1cm4gdmFsdWUgPyBTdHJpbmcodmFsdWUpLnNsaWNlKDAsIDEwKSA6IHVuZGVmaW5lZDtcbn1cblxuXG4vLyBBIGRhdGUtcmFuZ2UgYm91bmRhcnkgYXMgaXQgc2hvdWxkIFJFQUQgb24gYSBjb3ZlciBwYWdlIOKAlCB0aGUgc2FtZSBjYWxlbmRhclxuLy8gZGF5IGRhdGVCb3VuZFN0cmluZygpIGhhbmRzIHRoZSBzZXJ2ZXIsIHNvIGEgcHJpbnRlZCBwZXJpb2QgY2FuIG5ldmVyIG5hbWUgYVxuLy8gZGlmZmVyZW50IGRheSB0aGFuIHRoZSBudW1iZXJzIHVuZGVyIGl0IHdlcmUgZmlsdGVyZWQgYnkuIFJldHVybnMgbnVsbCB3aGVuXG4vLyB0aGVyZSBpcyBubyBib3VuZGFyeTsgdGhlIGNhbGxlciBzdXBwbGllcyBpdHMgb3duIHBsYWNlaG9sZGVyLlxuLy9cbi8vIFRoZSBwYXJzZSBoYXMgdG8gYmUgcGFyc2VJU08sIG5vdCBgbmV3IERhdGVgOiBgbmV3IERhdGUoJzIwMjYtMDUtMDEnKWAgaXMgVVRDXG4vLyBtaWRuaWdodCwgc28gZm9ybWF0dGluZyBpdCBhbnl3aGVyZSB3ZXN0IG9mIFVUQyBwcmludHMgQXByIDMwLiBwYXJzZUlTTyByZWFkc1xuLy8gYSBiYXJlIFktTS1EIGFzIExPQ0FMIG1pZG5pZ2h0LCB3aGljaCBubyBvZmZzZXQgY2FuIHNoaWZ0LlxuLy9cbi8vIFRoZSBkYXkgaXMgd3JpdHRlbiBpbiB0aGUgcmVwb3J0J3MgbG9jYWxlLCBhcyBpdHMgZGF0ZSBjZWxscyBhcmU6ICdKYW4gNSxcbi8vIDIwMjYnIGluIGVuLVVTLCAnNSBqYW52LiAyMDI2JyBpbiBmci1DQS5cbmV4cG9ydCBmdW5jdGlvbiBkYXRlQm91bmRMYWJlbCh2YWx1ZTogRGF0ZSB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGJvdW5kID0gZGF0ZUJvdW5kU3RyaW5nKHZhbHVlKTtcblxuICBpZiAoIWJvdW5kKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBkYXRlID0gcGFyc2VJU08oYm91bmQpO1xuXG4gIHJldHVybiBOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpID8gU3RyaW5nKHZhbHVlKSA6IGZvcm1hdExvY2FsRGF0ZShkYXRlLCBsb2NhbGUsIERBWV9TSE9SVCk7XG59XG5cblxuLy8gQSBzdG9yZWQgeXl5eS1NTS1kZCBib3VuZGFyeSBhcyBhIGxvY2FsIERhdGUgZm9yIGEgZGF0ZSBwaWNrZXIsIG9yIG51bGwuXG4vLyBwYXJzZUlTTyByZWFkcyBhIGJhcmUgWS1NLUQgYXMgTE9DQUwgbWlkbmlnaHQsIHNvIHRoZSBwaWNrZXIgc2hvd3MgdGhlIGRheVxuLy8gdGhhdCB3YXMgc3RvcmVkLCB3aGF0ZXZlciB0aGUgYnJvd3NlcidzIHpvbmUuXG5leHBvcnQgZnVuY3Rpb24gZGF0ZUZyb21Cb3VuZCh2YWx1ZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IERhdGUgfCBudWxsIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZGF0ZSA9IHBhcnNlSVNPKHZhbHVlLnNsaWNlKDAsIDEwKSk7XG5cbiAgcmV0dXJuIE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkgPyBudWxsIDogZGF0ZTtcbn1cblxuXG4vLyBBIHBpY2tlZCBEYXRlIGFzIGEgeXl5eS1NTS1kZCBib3VuZGFyeSBmb3Igc3RvcmFnZSwgb3IgbnVsbC4gVXNlcyB0aGUgbG9jYWxcbi8vIGNhbGVuZGFyIGRheSAoZm9ybWF0LCBub3QgdG9JU09TdHJpbmcpIHNvIHRoZSBib3VuZGFyeSBpcyB0aGUgZGF5IHRoYXQgd2FzXG4vLyBwaWNrZWQsIHJlZ2FyZGxlc3Mgb2YgdGhlIGJyb3dzZXIncyB6b25lLlxuZXhwb3J0IGZ1bmN0aW9uIGRhdGVUb0JvdW5kKHZhbHVlOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlICYmICFOdW1iZXIuaXNOYU4odmFsdWUuZ2V0VGltZSgpKVxuICAgID8gZm9ybWF0KHZhbHVlLCAneXl5eS1NTS1kZCcpXG4gICAgOiBudWxsO1xufVxuXG5cbi8vIEEgcmVsYXRpdmUgZGF0ZS1yYW5nZSBwcmVzZXQga2V5IGFzIGEgc2VudGVuY2UtY2FzZSBsYWJlbCwgZGVyaXZlZCBmcm9tIHRoZVxuLy8gY2FtZWxDYXNlIGtleSBpdHNlbGYgKCdsYXN0MTJNb250aHMnIHJlYWRzICdMYXN0IDEyIG1vbnRocycsICd0aGlzV2Vlaydcbi8vIHJlYWRzICdUaGlzIHdlZWsnKSwgc28gbm8gbGlzdCBvZiBwcmVzZXRzIGlzIG1pcnJvcmVkIGhlcmUgYW5kIGEga2V5IHRoZVxuLy8gc2VydmVyIGFkZHMgbGF0ZXIgc3RpbGwgcmVhZHMgc2Vuc2libHkuXG5leHBvcnQgZnVuY3Rpb24gcmVsYXRpdmVMYWJlbChyZWxhdGl2ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgd29yZHMgPSByZWxhdGl2ZVxuICAgIC5yZXBsYWNlKC8oW2Etel0pKFtBLVowLTldKS9nLCAnJDEgJDInKVxuICAgIC5yZXBsYWNlKC8oXFxkKShbQS1aXSkvZywgJyQxICQyJylcbiAgICAudG9Mb3dlckNhc2UoKTtcblxuICByZXR1cm4gd29yZHMuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3Jkcy5zbGljZSgxKTtcbn1cblxuXG4vLyBNYXBzIGEgcmVwb3J0IGZpbHRlciBHUk9VUCB0byBhbiBmcy1maWx0ZXIgY29uZmlnIGl0ZW0sIGFuZCByZWFkcyBmcy1maWx0ZXJcbi8vIHF1ZXJ5IHZhbHVlcyBiYWNrIGludG8gcGVyLWdyb3VwIEZpbHRlckdyb3VwVmFsdWVzLiBTaGFyZWQgYnkgdGhlIHJlcG9ydC1iYXJcbi8vIGZzLWZpbHRlciBhbmQgdGhlIHBlci1jb21wb25lbnQgZnMtZmlsdGVyIHNvIGJvdGggcmVuZGVyIHRocm91Z2ggdGhlIHNhbWVcbi8vIGxpYnJhcnkgYW5kIHdyaXRlIGludG8gUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIGlkZW50aWNhbGx5LiBJdGVtcyBhcmUgbmFtZWRcbi8vIGJ5IHRoZSBncm91cCdzIGlkIChncm91cEl0ZW1OYW1lKSwgc28gdGhlIHF1ZXJ5IGtleXMgbWFwIHN0cmFpZ2h0IGJhY2sgdG9cbi8vIHRoZSBncm91cC4gQSByZXBvcnQgbmV2ZXIgcHV0cyB0aGVzZSBrZXlzIGluIHRoZSBicm93c2VyIFVSTDogZnMtZmlsdGVyJ3Ncbi8vIG93biBxdWVyeS1wYXJhbSBzeW5jaW5nIGlzIG9mZiBpbiBldmVyeSByZXBvcnQgYmFyLlxuXG4vLyBUaGUgcXVlcnkga2V5IGZvciB0aGUgcmVwb3J0J3MgZ3JvdXAtYnkgY29udHJvbC4gRml4ZWQgcmF0aGVyIHRoYW4gZGVyaXZlZFxuLy8gZnJvbSBhbiBpZCBiZWNhdXNlIGEgcmVwb3J0IGhhcyBleGFjdGx5IG9uZSDigJQgYW5kIGl0IGlzIE5PVCBhIGZpbHRlciBncm91cCxcbi8vIHNvIGl0IGlzIHJlYWQgc3RyYWlnaHQgb2ZmIHRoZSBjaGFuZ2UgcXVlcnkgaW5zdGVhZCBvZiB0aHJvdWdoXG4vLyBncm91cFZhbHVlc0Zyb21RdWVyeS4gVGhlIGdyYWluIHRyYXZlbHMgdG8gdGhlIHNlcnZlciBhcyB0aGUgZGF0YSByZXF1ZXN0J3Ncbi8vIGBzdGF0ZS5mcmVxdWVuY3lgLlxuZXhwb3J0IGNvbnN0IEdST1VQX0JZX0lURU0gPSAnZ3JvdXBCeSc7XG5cbi8vIFRoZSB3b3JkIGJlZm9yZSBhIGdyb3VwJ3MgaWQgaW4gdGhlIG5hbWUgb2YgaXRzIGZzLWZpbHRlciBpdGVtIChmaWx0ZXIxMikuXG5jb25zdCBJVEVNX05BTUVfV09SRCA9ICdmaWx0ZXInO1xuXG4vLyBUaGUgZW5kcyBvZiBhbiBmcy1maWx0ZXIgcmFuZ2UgaXRlbTogUmFuZ2Ugd3JpdGVzIDxuYW1lPk1pbiBhbmQgPG5hbWU+TWF4LFxuLy8gRGF0ZVJhbmdlIDxuYW1lPkZyb20gYW5kIDxuYW1lPlRvLlxuZXhwb3J0IHR5cGUgSXRlbVJhbmdlRW5kID0gJ21pbicgfCAnbWF4JyB8ICdmcm9tJyB8ICd0byc7XG5cbi8vIFRoZSBxdWVyeSBrZXkgb2Ygb25lIGVuZCBvZiBhbiBmcy1maWx0ZXIgcmFuZ2UgaXRlbTogdGhlIGl0ZW0ncyBuYW1lIGFuZFxuLy8gdGhlIGVuZCB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgdXBwZXItY2FzZWQgKGZzLWZpbHRlcidzIGdldFJhbmdlTmFtZSksIHNvXG4vLyBmaWx0ZXIxMiBnaXZlcyBmaWx0ZXIxMk1pbiBhbmQgZmlsdGVyMTJGcm9tLlxuZXhwb3J0IGZ1bmN0aW9uIGl0ZW1SYW5nZU5hbWUobmFtZTogc3RyaW5nLCBlbmQ6IEl0ZW1SYW5nZUVuZCk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtuYW1lfSR7ZW5kLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpfSR7ZW5kLnNsaWNlKDEpfWA7XG59XG5cbi8vIFRoZSBuYW1lIG9mIGEgZ3JvdXAncyBmcy1maWx0ZXIgaXRlbTogJ2ZpbHRlcicgYW5kIHRoZSBncm91cCdzIGlkLiBUaGUgaWRcbi8vIG5ldmVyIGNoYW5nZXMsIHNvIG5laXRoZXIgYSBuZXcgbGFiZWwgbm9yIGEgbmV3IG5hbWUgbW92ZXMgYSBiYXIncyBrZXlzLFxuLy8gYW5kIG5vIGl0ZW0gbmFtZSBjYW4gdGFrZSBhbm90aGVyIGl0ZW0ncyAoZ3JvdXBCeSwgbWF0Y2gsIGxpc3RTZWFyY2gpLlxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwSXRlbU5hbWUoZ3JvdXA6IFBpY2s8UmVwb3J0RmlsdGVyR3JvdXAsICdpZCc+KTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke0lURU1fTkFNRV9XT1JEfSR7Z3JvdXAuaWR9YDtcbn1cblxuLy8gVGhlIGxhYmVsIGEgZ3JvdXAncyBjaGlwIHNob3dzOiBpdHMgb3duLCBlbHNlIGl0cyBmaXJzdCBtZW1iZXIncyBjb2x1bW4uXG5mdW5jdGlvbiBncm91cExhYmVsKGdyb3VwOiBQaWNrPFJlcG9ydEZpbHRlckdyb3VwLCAnbGFiZWwnIHwgJ2ZpbHRlcnMnPik6IHN0cmluZyB7XG4gIHJldHVybiBncm91cC5sYWJlbCB8fCBncm91cC5maWx0ZXJzPy5bMF0/LmZpbHRlckNvbHVtbiB8fCAnJztcbn1cblxuLy8gQSBzZWxlY3QgZ3JvdXAncyBkaXN0aW5jdCBvcHRpb25zLCBhcyB7IG5hbWUsIHZhbHVlIH0gcGFpcnMuIFRoZSBzZXJ2ZXIgc2VuZHNcbi8vIHsgdmFsdWUsIGxhYmVsIH06IHRoZSB2YWx1ZSBpcyB3aGF0IHRoZSBmaWx0ZXIgbWF0Y2hlcyBvbiAoYW4gZW50aXR5J3Mgc3RhYmxlXG4vLyBpZCkgYW5kIHRoZSBsYWJlbCBpcyB3aGF0IHRoZSB2aWV3ZXIgcmVhZHMg4oCUIHNvIGEgcmVuYW1lZCBlbnRpdHkga2VlcHMgaXRzIGlkXG4vLyBhbmQgc2ltcGx5IHNob3dzIGl0cyBuZXcgbmFtZSBoZXJlLiBPcHRpb25zIGNvbWUgZnJvbSB0aGUgZmlyc3QgbWVtYmVyIGZpbHRlclxuLy8gdGhhdCBkZWNsYXJlcyB0aGVtIOKAlCBtZW1iZXJzIGFyZSB0aGUgc2FtZSBkYXRhIHBvaW50LCBzbyBhbnkgbWVtYmVyJ3MgbGlzdFxuLy8gc2VydmVzIHRoZSBncm91cC4gVGhlIGxpc3QgaXMgZmV0Y2hlZCBvbmNlICh0aGUgc2VydmVyIGNhcHMgaXQpIGFuZCByZXBsYXllZFxuLy8gKHNoYXJlUmVwbGF5KSwgc28gcmVwZWF0ZWQgcmVhZHMgbmV2ZXIgcmVmZXRjaC4gVGhpcyBpcyB0aGUgZnVsbCBsaXN0LCBuZXZlclxuLy8gbmFycm93ZWQgYnkgb3RoZXIgZmlsdGVyczogdGhlIHJlcG9ydC1zZXR0aW5ncyBkZWZhdWx0IHBpY2tlciByZWFkcyBpdCAoYW5cbi8vIGF1dGhvciBzZXRzIGEgZGVmYXVsdCBhZ2FpbnN0IHRoZSB3aG9sZSBsaXN0KSwgYW5kIHNvIGRvZXMgdGhlIGV4cG9ydCdzXG4vLyBmaWx0ZXIgd29yZGluZyBmb3IgYSBwaWNrIHRoZSBiYXIgaGFzIG5vdCBuYW1lZC4gVGhlIGJhcnMgcmVhZFxuLy8gUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UgaW5zdGVhZC4gUmV0dXJucyBhbiBlbXB0eSBsaXN0IHdoZW4gbm8gbWVtYmVyXG4vLyBwcm92aWRlcyBvcHRpb25zLlxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRHcm91cE9wdGlvbnMoXG4gIGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgcmVwb3J0RGF0YTogUmVwb3J0RGF0YSxcbiAgcmVwb3J0SWQ6IG51bWJlcixcbik6IE9ic2VydmFibGU8UmVwb3J0RmlsdGVyT3B0aW9uUGFpcltdPiB7XG4gIGNvbnN0IG9wdGlvbkZpbHRlciA9IChncm91cC5maWx0ZXJzID8/IFtdKS5maW5kKChtZW1iZXIpID0+IG1lbWJlci5oYXNPcHRpb25zKTtcbiAgaWYgKCFvcHRpb25GaWx0ZXIpIHtcbiAgICByZXR1cm4gb2YoW10pO1xuICB9XG5cbiAgcmV0dXJuIHJlcG9ydERhdGEuZmlsdGVyT3B0aW9ucyhyZXBvcnRJZCwgb3B0aW9uRmlsdGVyLmlkKVxuICAgIC5waXBlKFxuICAgICAgbWFwKChvcHRpb25zOiBSZXBvcnRGaWx0ZXJPcHRpb25bXSkgPT4gKG9wdGlvbnMgPz8gW10pXG4gICAgICAgIC5tYXAoKG9wdGlvbikgPT4gKHsgbmFtZTogb3B0aW9uLmxhYmVsLCB2YWx1ZTogb3B0aW9uLnZhbHVlIH0pKSksXG4gICAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiBmYWxzZSB9KSxcbiAgICApO1xufVxuXG4vLyBTdG9yZWQgZmlsdGVyIHZhbHVlcyAoaWRzKSBwYWlyZWQgYmFjayB3aXRoIHRoZSBsYWJlbHMgdG8gc2hvdyBmb3IgdGhlbS5cbi8vIEEgc2F2ZWQgZGVmYXVsdCBob2xkcyBvbmx5IHZhbHVlcywgc28gdGhlIG5hbWVzIGhhdmUgdG8gYmUgcmVhZCBiYWNrIG9mZiB0aGVcbi8vIG9wdGlvbiBsaXN0IOKAlCB0aGF0IGluZGlyZWN0aW9uIGlzIGV4YWN0bHkgd2hhdCBzdXJ2aXZlcyBhIHJlbmFtZS4gYGxhYmVsYFxuLy8gbmFtZXMgYSB2YWx1ZSBmaXJzdDogYSBuYW1lIGFscmVhZHkgbGVhcm5lZCAoUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UubGFiZWwpXG4vLyBob2xkcyBmb3IgYSBwaWNrIGEgbmFycm93ZWQgbGlzdCBsZWF2ZXMgb3V0LCBhbmQgd2hlbiBpdCBuYW1lcyBldmVyeSB2YWx1ZVxuLy8gdGhlIGxpc3QgaXMgbm90IHJlYWQgYXQgYWxsLiBBIHZhbHVlIHdpdGggbm8gbmFtZSBhbmQgbm8gbWF0Y2hpbmcgb3B0aW9uXG4vLyAoaXRzIGVudGl0eSB3YXMgZGVsZXRlZCwgc28gaXQgaXMgbm8gbG9uZ2VyIGxpc3RlZCkgZmFsbHMgYmFjayB0byBzaG93aW5nXG4vLyB0aGUgcmF3IHZhbHVlIHJhdGhlciB0aGFuIGRyb3BwaW5nIHRoZSBjaGlwLCB3aGljaCB3b3VsZCBzaWxlbnRseSB3aWRlbiB0aGVcbi8vIGZpbHRlci5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlT3B0aW9uVmFsdWVzKFxuICBvcHRpb25zJDogT2JzZXJ2YWJsZTxSZXBvcnRGaWx0ZXJPcHRpb25QYWlyW10+LFxuICB2YWx1ZXM6IHVua25vd25bXSxcbiAgbGFiZWw6ICh2YWx1ZTogdW5rbm93bikgPT4gc3RyaW5nIHwgbnVsbCA9ICgpID0+IG51bGwsXG4pOiBPYnNlcnZhYmxlPFJlcG9ydEZpbHRlck9wdGlvblBhaXJbXT4ge1xuICBjb25zdCBuYW1lZCA9IChvcHRpb25zOiBSZXBvcnRGaWx0ZXJPcHRpb25QYWlyW10pID0+IHZhbHVlcy5tYXAoKHZhbHVlKSA9PiB7XG4gICAgY29uc3Qgb3B0aW9uID0gb3B0aW9ucy5maW5kKChjYW5kaWRhdGUpID0+IFN0cmluZyhjYW5kaWRhdGUudmFsdWUpID09PSBTdHJpbmcodmFsdWUpKTtcblxuICAgIHJldHVybiB7IG5hbWU6IGxhYmVsKHZhbHVlKSA/PyBvcHRpb24/Lm5hbWUgPz8gU3RyaW5nKHZhbHVlKSwgdmFsdWUgfTtcbiAgfSk7XG5cbiAgcmV0dXJuIHZhbHVlcy5ldmVyeSgodmFsdWUpID0+IGxhYmVsKHZhbHVlKSAhPT0gbnVsbClcbiAgICA/IG9mKG5hbWVkKFtdKSlcbiAgICA6IG9wdGlvbnMkLnBpcGUobWFwKG5hbWVkKSk7XG59XG5cbi8vIFJlYWRzIGEgZ3JvdXAncyBvcHRpb24gbGlzdDsgc2VlIGdyb3VwT3B0aW9uc1JlYWRlcigpLlxuZXhwb3J0IHR5cGUgR3JvdXBPcHRpb25zUmVhZGVyID0gKFxuICBncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsXG4gIHJlcG9ydElkOiBudW1iZXIsXG4pID0+IE9ic2VydmFibGU8eyBuYW1lOiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH1bXT47XG5cbi8vIEEgcmVhZGVyIG9mIGVhY2ggZ3JvdXAncyBvcHRpb24gbGlzdCAobG9hZEdyb3VwT3B0aW9ucykgdGhhdCBsb2FkcyBhIGdyb3VwJ3Ncbi8vIGxpc3Qgb25jZSBhbmQgaGFuZHMgZXZlcnkgbGF0ZXIgcmVhZCBvZiB0aGF0IGdyb3VwIHRoZSBzYW1lIHJlcGxheWVkXG4vLyByZXF1ZXN0LCBzbyBldmVyeXRoaW5nIHRoYXQgbmFtZXMgb25lIGdyb3VwJ3MgcGlja3Mg4oCUIHRoZSBjb3ZlcidzIGZpbHRlclxuLy8gbGluZSwgaXRzIHt7ZmlsdGVyLjxpZD59fSB0b2tlbiwgdGhlIG5leHQgcGljayDigJQgc2hhcmVzIG9uZSBmZXRjaC4gQSByZWFkXG4vLyB0aGF0IGZhaWxlZCBpcyBmZXRjaGVkIGFnYWluIGJ5IHRoZSBuZXh0IG9uZSAoc2hhcmVSZXBsYXkgZHJvcHMgYW4gZXJyb3IpLlxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwT3B0aW9uc1JlYWRlcihyZXBvcnREYXRhOiBSZXBvcnREYXRhKTogR3JvdXBPcHRpb25zUmVhZGVyIHtcbiAgY29uc3QgbG9hZGVkID0gbmV3IE1hcDxudW1iZXIsIE9ic2VydmFibGU8eyBuYW1lOiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH1bXT4+KCk7XG5cbiAgcmV0dXJuIChncm91cCwgcmVwb3J0SWQpID0+IHtcbiAgICBjb25zdCBvcHRpb25zJCA9IGxvYWRlZC5nZXQoZ3JvdXAuaWQpID8/IGxvYWRHcm91cE9wdGlvbnMoZ3JvdXAsIHJlcG9ydERhdGEsIHJlcG9ydElkKTtcbiAgICBsb2FkZWQuc2V0KGdyb3VwLmlkLCBvcHRpb25zJCk7XG5cbiAgICByZXR1cm4gb3B0aW9ucyQ7XG4gIH07XG59XG5cbi8vIFRoZSBuYW1lcyBvZiBhIHNlbGVjdCBncm91cCdzIHBpY2tzIChrZXB0IG9yIGxlZnQgb3V0KSwgYXMgaXRzIGNoaXBzIGluXG4vLyB0aGUgZmlsdGVyIGJhciBuYW1lIHRoZW0sIGZvciBhIHt7ZmlsdGVyLjxpZD59fSB0b2tlbjogYSBuYW1lIHRoZSBiYXInc1xuLy8gbGlzdHMgdGF1Z2h0IChgbGFiZWxgLCBSZXBvcnRGaWx0ZXJPcHRpb25zU2VydmljZS5sYWJlbCkgZmlyc3QsIGVsc2UgdGhlXG4vLyBncm91cCdzIG9wdGlvbiBsaXN0LiBudWxsIHdoZW4gdGhlIGxpc3QgY291bGQgbm90IGJlIHJlYWQ6IHRoZSB0b2tlbiB0aGVuXG4vLyByZWFkcyB0aGUgZW0gZGFzaCByYXRoZXIgdGhhbiBhIHJvdyBvZiBpZHMuXG5leHBvcnQgZnVuY3Rpb24gcGlja2VkT3B0aW9uTmFtZXMoXG4gIG9wdGlvbnMkOiBPYnNlcnZhYmxlPHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9W10+LFxuICB2YWx1ZXM6IHVua25vd25bXSxcbiAgbGFiZWw6ICh2YWx1ZTogdW5rbm93bikgPT4gc3RyaW5nIHwgbnVsbCA9ICgpID0+IG51bGwsXG4pOiBPYnNlcnZhYmxlPHN0cmluZ1tdIHwgbnVsbD4ge1xuICByZXR1cm4gcmVzb2x2ZU9wdGlvblZhbHVlcyhvcHRpb25zJCwgdmFsdWVzLCBsYWJlbClcbiAgICAucGlwZShcbiAgICAgIG1hcCgob3B0aW9ucyk6IHN0cmluZ1tdIHwgbnVsbCA9PiBvcHRpb25zLm1hcCgob3B0aW9uKSA9PiBvcHRpb24ubmFtZSkpLFxuICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSksXG4gICAgKTtcbn1cblxuLy8gQ2FzZS1pbnNlbnNpdGl2ZSBuYW1lIGZpbHRlciBhcHBsaWVkIHRvIGEgbG9hZGVkIG9wdGlvbiBsaXN0IOKAlCB0aGUgdHlwZWRcbi8vIGtleXdvcmQgaGFzIHRvIGJlIG1hdGNoZWQgaGVyZSBiZWNhdXNlIGZzLWF1dG9jb21wbGV0ZSByZW5kZXJzIHdoYXQgd2UgcmV0dXJuXG4vLyB2ZXJiYXRpbS5cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaE9wdGlvbnMoXG4gIG9wdGlvbnMkOiBPYnNlcnZhYmxlPFJlcG9ydEZpbHRlck9wdGlvblBhaXJbXT4sXG4gIGtleXdvcmQ/OiBzdHJpbmcsXG4pOiBPYnNlcnZhYmxlPFJlcG9ydEZpbHRlck9wdGlvblBhaXJbXT4ge1xuICBjb25zdCB0ZXJtID0gKGtleXdvcmQgPz8gJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gIHJldHVybiBvcHRpb25zJC5waXBlKG1hcCgob3B0aW9ucykgPT4gdGVybVxuICAgID8gb3B0aW9ucy5maWx0ZXIoKG9wdGlvbikgPT4gb3B0aW9uLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXJtKSlcbiAgICA6IG9wdGlvbnMpKTtcbn1cblxuLy8gVGhlIHBhbmVsIHJvdyBvZiBhIHNlbGVjdCB3aG9zZSBsaXN0IHRoZSBzZXJ2ZXIgY3V0IGF0IDUwMC5cbmV4cG9ydCBjb25zdCBPUFRJT05TX1RSVU5DQVRFRF9OT1RFID0gJ1Nob3dpbmcgdGhlIGZpcnN0IDUwMC4gVHlwZSB0byBuYXJyb3cuJztcblxuLy8gVGhlIHBhbmVsIHJvdyBvZiBhIHNlbGVjdCB3aG9zZSBsaXN0IGNvdWxkIG5vdCBiZSByZWFkLiBUaGUgbmV4dCBmb2N1cyBvclxuLy8ga2V5c3Ryb2tlIGFza3MgYWdhaW4uXG5leHBvcnQgY29uc3QgT1BUSU9OU19GQUlMRURfTk9URSA9ICdDb3VsZCBub3QgbG9hZCB0aGUgbGlzdC4nO1xuXG4vLyBCdWlsZCB0aGUgZnMtZmlsdGVyIGNvbmZpZyBpdGVtIGZvciBhIGdyb3VwLCBzZWVkaW5nIGl0cyBkZWZhdWx0IGZyb20gdGhlXG4vLyBjdXJyZW50IHNlc3Npb24gdmFsdWUgc28gYXV0aG9yZWQvcmVsYXRpdmUgZGVmYXVsdHMgc2hvdyBzZWxlY3RlZCBvbiBvcGVuLlxuLy8gQSBzZWxlY3QgbGlzdHMgd2hhdCBgb3B0aW9uc2Agb2ZmZXJzIGZvciBpdCBpbiBgcmVwb3J0YC4gYGZlYXR1cmVzYCBpcyB0aGVcbi8vIHJlcG9ydCdzIHZpZXdlckZlYXR1cmVzOiBhIHNlbGVjdCBvZmZlcnMgJ0V4Y2x1ZGUgdGhlc2UnIGJ5IHRoZSBydWxlIG9mXG4vLyBvZmZlcnNFeGNsdWRlICh0aGUgc2VydmVyIGxpc3RzIGV4Y2x1ZGVWYWx1ZXMgYW5kIG5vIG1lbWJlciBiaW5kcyBzZXZlcmFsXG4vLyBjb2x1bW5zKSwgYW5kIGEgbnVtYmVyIHJhbmdlIGlzIGEgbWluL21heCBjb250cm9sIG9ubHkgd2hlbiBpdCBsaXN0c1xuLy8gbnVtYmVyUmFuZ2UuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVySXRlbUZvckdyb3VwKFxuICBncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsXG4gIG9wdGlvbnM6IFJlcG9ydEZpbHRlck9wdGlvbnNTZXJ2aWNlLFxuICByZXBvcnQ6IFJlcG9ydCB8IG51bGwsXG4gIGluaXRpYWw/OiBGaWx0ZXJHcm91cFZhbHVlLFxuICBmZWF0dXJlczogcmVhZG9ubHkgUmVwb3J0Vmlld2VyRmVhdHVyZVtdID0gW10sXG4pOiBJRmlsdGVyQ29uZmlnSXRlbSB7XG4gIGNvbnN0IG5hbWUgPSBncm91cEl0ZW1OYW1lKGdyb3VwKTtcbiAgY29uc3QgbGFiZWwgPSBncm91cExhYmVsKGdyb3VwKTtcblxuICBzd2l0Y2ggKGdyb3VwLnR5cGUpIHtcbiAgICBjYXNlICdkYXRlUmFuZ2UnOlxuICAgICAgcmV0dXJuIGRhdGVSYW5nZUZpbHRlckl0ZW0obmFtZSwgbGFiZWwsIGluaXRpYWwpO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIHJldHVybiBzZWxlY3RGaWx0ZXJJdGVtKGdyb3VwLCBsYWJlbCwgb3B0aW9ucywgcmVwb3J0LCBpbml0aWFsLCBvZmZlcnNFeGNsdWRlKGdyb3VwLCBmZWF0dXJlcykpO1xuXG4gICAgY2FzZSAnbnVtYmVyUmFuZ2UnOlxuICAgICAgcmV0dXJuIGZlYXR1cmVzLmluY2x1ZGVzKCdudW1iZXJSYW5nZScpXG4gICAgICAgID8gbnVtYmVyUmFuZ2VGaWx0ZXJJdGVtKGdyb3VwLCBsYWJlbCwgcmVwb3J0LCBpbml0aWFsKVxuICAgICAgICA6IGtleXdvcmRGaWx0ZXJJdGVtKG5hbWUsIGxhYmVsLCBpbml0aWFsKTtcblxuICAgIGNhc2UgJ2tleXdvcmQnOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4ga2V5d29yZEZpbHRlckl0ZW0obmFtZSwgbGFiZWwsIGluaXRpYWwpO1xuICB9XG59XG5cbi8vIEEgZGF0ZSByYW5nZSBvcGVucyBvbiBpdHMgZGF5cywgYW5kIGl0cyBjaGlwIHNob3dzIHRoZW0uIEEgcHJlc2V0IHBpY2tlZCBpblxuLy8gdGhlIGRhdGUgcGlja2VyIG9ubHkgc2V0cyB0aGUgZGF5cy5cbmZ1bmN0aW9uIGRhdGVSYW5nZUZpbHRlckl0ZW0obmFtZTogc3RyaW5nLCBsYWJlbDogc3RyaW5nLCBpbml0aWFsPzogRmlsdGVyR3JvdXBWYWx1ZSk6IElGaWx0ZXJDb25maWdJdGVtIHtcbiAgY29uc3QgaGFzRGF5cyA9ICEhKGluaXRpYWw/LnN0YXJ0IHx8IGluaXRpYWw/LmVuZCk7XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lLFxuICAgIHR5cGU6IEl0ZW1UeXBlLkRhdGVSYW5nZSxcbiAgICBsYWJlbDogeyBmcm9tOiBgJHtsYWJlbH0gRnJvbWAsIHRvOiBgJHtsYWJlbH0gVG9gIH0sXG4gICAgZGVmYXVsdDogaGFzRGF5c1xuICAgICAgPyB7IGZyb206IGluaXRpYWwuc3RhcnQgPz8gdW5kZWZpbmVkLCB0bzogaW5pdGlhbC5lbmQgPz8gdW5kZWZpbmVkIH1cbiAgICAgIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vLyBBIHNlbGVjdCdzIHBpY2tzLCBrZXB0IG9yIGxlZnQgb3V0LiBXaXRoIGBleGNsdWRlYCB0aGUgbGlzdCBoYXMgdGhlXG4vLyAnRXhjbHVkZSB0aGVzZScgcm93LCBhbmQgYSB2YWx1ZSB0aGF0IGxlYXZlcyBvdXQgb3BlbnMgd2l0aCBpdCBvbi4gSXRzIGxpc3Rcbi8vIGlzIHJlYWQgb24gZm9jdXMgYW5kIG9uIGVhY2gga2V5c3Ryb2tlOiB0aGUgb3B0aW9ucyBzZXJ2aWNlIGZldGNoZXMgaXQgd2hlblxuLy8gdGhlIG90aGVyIGZpbHRlcnMgY2hhbmdlZCBzaW5jZSBhbmQgcmVwbGF5cyBpdCBvdGhlcndpc2UsIGFuZCB0eXBpbmdcbi8vIGZpbHRlcnMgaXQgaGVyZS4gQSBsaXN0IHRoZSBzZXJ2ZXIgY3V0LCBvciBvbmUgdGhhdCBjb3VsZCBub3QgYmUgcmVhZCxcbi8vIHNheXMgc28gaW4gYSBwYW5lbCByb3cuXG5mdW5jdGlvbiBzZWxlY3RGaWx0ZXJJdGVtKFxuICBncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsXG4gIGxhYmVsOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJlcG9ydEZpbHRlck9wdGlvbnNTZXJ2aWNlLFxuICByZXBvcnQ6IFJlcG9ydCB8IG51bGwsXG4gIGluaXRpYWw6IEZpbHRlckdyb3VwVmFsdWUgfCB1bmRlZmluZWQsXG4gIGV4Y2x1ZGU6IGJvb2xlYW4sXG4pOiBJRmlsdGVyQ29uZmlnSXRlbSB7XG4gIGNvbnN0IGV4Y2x1ZGluZyA9IGV4Y2x1ZGUgJiYgIWluaXRpYWw/LnZhbHVlcz8ubGVuZ3RoICYmICEhaW5pdGlhbD8uZXhjbHVkZVZhbHVlcz8ubGVuZ3RoO1xuICBjb25zdCBwaWNrcyA9IGV4Y2x1ZGluZyA/IGluaXRpYWwuZXhjbHVkZVZhbHVlcyA6IGluaXRpYWw/LnZhbHVlcztcbiAgY29uc3Qgb3B0aW9ucyQgPSBvcHRpb25zLm9wdGlvbnMoZ3JvdXAsIHJlcG9ydCk7XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBncm91cEl0ZW1OYW1lKGdyb3VwKSxcbiAgICB0eXBlOiBJdGVtVHlwZS5BdXRvQ29tcGxldGVDaGlwcyxcbiAgICBsYWJlbCxcbiAgICBmZXRjaE9uRm9jdXM6IHRydWUsXG4gICAgZXhjbHVkZTogZXhjbHVkZSA/IHt9IDogdW5kZWZpbmVkLFxuICAgIHZhbHVlczogKGtleXdvcmQ/OiBzdHJpbmcpID0+IG1hdGNoT3B0aW9ucyhvcHRpb25zJCwga2V5d29yZCksXG4gICAgcGFuZWxOb3RlOiAoKSA9PiBvcHRpb25zTm90ZShvcHRpb25zLCBncm91cC5pZCksXG4gICAgLy8gU3RvcmVkIHZhbHVlcyBhcmUgaWRzLCBzbyBhIGNoaXAgaXMgbmFtZWQgYnkgYSBuYW1lIGFscmVhZHkgbGVhcm5lZCBvclxuICAgIC8vIG9uY2UgdGhlIG9wdGlvbiBsaXN0IGhhcyBsb2FkZWQg4oCUIGhlbmNlIHRoZSBvYnNlcnZhYmxlIGZvcm0gb2YgYGRlZmF1bHRgLlxuICAgIGRlZmF1bHQ6IHBpY2tzPy5sZW5ndGhcbiAgICAgID8gKCkgPT4gcmVzb2x2ZU9wdGlvblZhbHVlcyhvcHRpb25zJCwgcGlja3MsICh2YWx1ZSkgPT4gb3B0aW9ucy5sYWJlbChncm91cC5pZCwgdmFsdWUpKVxuICAgICAgICAucGlwZShtYXAoKHNlbGVjdGVkKSA9PiAoZXhjbHVkaW5nID8geyBleGNsdWRlOiB0cnVlLCBzZWxlY3RlZCB9IDogc2VsZWN0ZWQpKSlcbiAgICAgIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vLyBUaGUgcGFuZWwgcm93IG9mIGEgc2VsZWN0J3MgbGF0ZXN0IGxpc3Q6IGEgZmFpbHVyZSBmaXJzdCwgdGhlbiBhIGN1dCBsaXN0LlxuZnVuY3Rpb24gb3B0aW9uc05vdGUob3B0aW9uczogUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UsIGdyb3VwSWQ6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICBpZiAob3B0aW9ucy5mYWlsZWQoZ3JvdXBJZCkpIHtcbiAgICByZXR1cm4gT1BUSU9OU19GQUlMRURfTk9URTtcbiAgfVxuXG4gIHJldHVybiBvcHRpb25zLnRydW5jYXRlZChncm91cElkKSA/IE9QVElPTlNfVFJVTkNBVEVEX05PVEUgOiBudWxsO1xufVxuXG4vLyBBIG51bWJlciByYW5nZSdzIGxvdyBhbmQgaGlnaCBlbmRzLCBlaXRoZXIgb25lIG9wZW4uIDAgaXMgYW4gZW5kIGxpa2UgYW55XG4vLyBvdGhlci4gSXRzIGNoaXAgcmVhZHMgYXMgdGhlIGV4cG9ydCBsaW5lcyBkbyAoJ0Ftb3VudDogMCBvciBtb3JlJyxcbi8vICdBbW91bnQ6IDAgdG8gMTAnKTogdGhlIGVuZHMgYXJlIHJlYWQgb2ZmIHRoZSBpdGVtJ3MgcXVlcnkgdGhlIHdheSB0aGVcbi8vIGJhcidzIGNoYW5nZSByZWFkcyB0aGVtLCBhbmQgd29yZGVkIGluIHRoZSByZXBvcnQncyBsb2NhbGUuXG5mdW5jdGlvbiBudW1iZXJSYW5nZUZpbHRlckl0ZW0oXG4gIGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgbGFiZWw6IHN0cmluZyxcbiAgcmVwb3J0OiBSZXBvcnQgfCBudWxsLFxuICBpbml0aWFsPzogRmlsdGVyR3JvdXBWYWx1ZSxcbik6IElGaWx0ZXJDb25maWdJdGVtIHtcbiAgY29uc3QgbmFtZSA9IGdyb3VwSXRlbU5hbWUoZ3JvdXApO1xuICBjb25zdCBtaW4gPSBpbml0aWFsPy5taW4gPz8gdW5kZWZpbmVkO1xuICBjb25zdCBtYXggPSBpbml0aWFsPy5tYXggPz8gdW5kZWZpbmVkO1xuICBjb25zdCBsb2NhbGUgPSByZXNvbHZlRm9ybWF0Q29udGV4dChyZXBvcnQgPz8ge30pLmxvY2FsZTtcblxuICByZXR1cm4ge1xuICAgIG5hbWUsXG4gICAgdHlwZTogSXRlbVR5cGUuUmFuZ2UsXG4gICAgbGFiZWwsXG4gICAgZGVmYXVsdDogbWluICE9PSB1bmRlZmluZWQgfHwgbWF4ICE9PSB1bmRlZmluZWQgPyB7IG1pbiwgbWF4IH0gOiB1bmRlZmluZWQsXG4gICAgY2hpcFRleHQ6IChpdGVtKSA9PiBmaWx0ZXJMaW5lVGV4dChcbiAgICAgIHsgbGFiZWwsIGxldmVsOiBncm91cC5sZXZlbCB9LFxuICAgICAgbnVtYmVyUmFuZ2VGcm9tUXVlcnkoaXRlbS5xdWVyeSwgbmFtZSksXG4gICAgICB7IGxvY2FsZSB9LFxuICAgICAgJ2NoaXAnLFxuICAgICksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGtleXdvcmRGaWx0ZXJJdGVtKG5hbWU6IHN0cmluZywgbGFiZWw6IHN0cmluZywgaW5pdGlhbD86IEZpbHRlckdyb3VwVmFsdWUpOiBJRmlsdGVyQ29uZmlnSXRlbSB7XG4gIHJldHVybiB7XG4gICAgbmFtZSxcbiAgICB0eXBlOiBJdGVtVHlwZS5LZXl3b3JkLFxuICAgIGxhYmVsLFxuICAgIGRlZmF1bHQ6IGluaXRpYWw/LnZhbHVlLFxuICB9O1xufVxuXG4vLyBUaGUgZ3JvdXBzIGEgbWF0Y2ggb2YgJ2FueScgY29tYmluZXM6IHJlcG9ydCBiYXIgZ3JvdXBzIChhIHBhZ2UgZ3JvdXAgb25cbi8vIGl0cyBvd24gcGFnZSBvbmx5KSB0aGF0IGEgdmlld2VyIHBpY2tzIHZhbHVlcywgdGV4dCBvciBhIG51bWJlciByYW5nZSBpbi5cbi8vIERhdGVzLCB0aWxlLW9ubHkgZ3JvdXBzIGFuZCB0aGUgY3Jvc3MtZmlsdGVyIGFsd2F5cyBuYXJyb3cgb24gdGhlaXIgb3duLlxuLy8gVGhlIHNlcnZlciBob2xkcyB0aGUgc2FtZSBydWxlIGFuZCBjaGVja3MgZXZlcnkgaWQgaXQgaXMgc2VudC5cbmNvbnN0IE1BVENIX0FOWV9MRVZFTFM6IHJlYWRvbmx5IFJlcG9ydEZpbHRlckxldmVsW10gPSBbJ3JlcG9ydCcsICdib3RoJywgJ3BhZ2UnXTtcbmNvbnN0IE1BVENIX0FOWV9UWVBFUzogcmVhZG9ubHkgUmVwb3J0RmlsdGVyVHlwZVtdID0gWydzZWxlY3QnLCAna2V5d29yZCcsICdudW1iZXJSYW5nZSddO1xuXG4vLyBXaGV0aGVyIGEgZ3JvdXAgam9pbnMgYSBtYXRjaCBvZiAnYW55JyBvbiBwYWdlIGBwYWdlSWRgLlxuZXhwb3J0IGZ1bmN0aW9uIGlzTWF0Y2hBbnlHcm91cChncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsIHBhZ2VJZDogbnVtYmVyIHwgbnVsbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gTUFUQ0hfQU5ZX0xFVkVMUy5pbmNsdWRlcyhncm91cC5sZXZlbClcbiAgICAmJiBNQVRDSF9BTllfVFlQRVMuaW5jbHVkZXMoZ3JvdXAudHlwZSlcbiAgICAmJiAoZ3JvdXAubGV2ZWwgIT09ICdwYWdlJyB8fCAoISFwYWdlSWQgJiYgZ3JvdXAucGFnZUlkID09PSBwYWdlSWQpKTtcbn1cblxuLy8gVGhlIHJlcG9ydCBiYXIncyBncm91cHMgaW4gdGhlaXIgc2F2ZWQgb3JkZXI6IHRoZSByZXBvcnQgYW5kIGJvdGggZ3JvdXBzLFxuLy8gYW5kIHRoZSBwYWdlIGdyb3VwcyBvZiB0aGUgcGFnZSBvbiBzY3JlZW4gKGBwYWdlSWRgKS5cbmV4cG9ydCBmdW5jdGlvbiByZXBvcnRCYXJHcm91cHMocmVwb3J0OiBSZXBvcnQgfCBudWxsLCBwYWdlSWQ6IG51bWJlciB8IG51bGwpOiBSZXBvcnRGaWx0ZXJHcm91cFtdIHtcbiAgcmV0dXJuIChyZXBvcnQ/LmZpbHRlckdyb3VwcyA/PyBbXSlcbiAgICAuZmlsdGVyKChncm91cCkgPT4gZ3JvdXAubGV2ZWwgPT09ICdyZXBvcnQnIHx8IGdyb3VwLmxldmVsID09PSAnYm90aCdcbiAgICAgIHx8IChncm91cC5sZXZlbCA9PT0gJ3BhZ2UnICYmICEhcGFnZUlkICYmIGdyb3VwLnBhZ2VJZCA9PT0gcGFnZUlkKSlcbiAgICAuc29ydCgoYSwgYikgPT4gYS5vcmRlciAtIGIub3JkZXIpO1xufVxuXG4vLyBXaGV0aGVyIHRoZSByZXBvcnQgaGFzIGEgZ3JvdXAgc2hvd24gb24gb25lIHBhZ2Ugb25seSwgc28gaXRzIHJlcG9ydCBiYXJcbi8vIGNoYW5nZXMgd2l0aCB0aGUgcGFnZSBvbiBzY3JlZW4uXG5leHBvcnQgZnVuY3Rpb24gaGFzUGFnZUdyb3VwKHJlcG9ydDogUmVwb3J0IHwgbnVsbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKHJlcG9ydD8uZmlsdGVyR3JvdXBzID8/IFtdKS5zb21lKChncm91cCkgPT4gZ3JvdXAubGV2ZWwgPT09ICdwYWdlJyk7XG59XG5cbi8vIFRoZSBxdWVyeSBrZXkgb2YgdGhlIHJlcG9ydCBiYXIncyBNYXRjaCBjb250cm9sLiBOb3QgYSBmaWx0ZXIgZ3JvdXA6IGl0XG4vLyBzYXlzIGhvdyB0aGUgZ3JvdXBzIGNvbWJpbmUsIHNvIGl0IGlzIHJlYWQgc3RyYWlnaHQgb2ZmIHRoZSBjaGFuZ2UgcXVlcnkuXG5leHBvcnQgY29uc3QgTUFUQ0hfSVRFTSA9ICdtYXRjaCc7XG5cbmNvbnN0IE1BVENIX09QVElPTlM6IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogUmVwb3J0RmlsdGVyTWF0Y2ggfVtdID0gW1xuICB7IG5hbWU6ICdBbGwgZmlsdGVycycsIHZhbHVlOiAnYWxsJyB9LFxuICB7IG5hbWU6ICdBbnkgZmlsdGVyJywgdmFsdWU6ICdhbnknIH0sXG5dO1xuXG4vLyBUaGUgcmVwb3J0IGJhcidzIE1hdGNoIGNvbnRyb2wsIGxhc3QgaW4gdGhlIGJhciwgb3IgbnVsbCB3aGVuIGl0IHdvdWxkIGRvXG4vLyBub3RoaW5nOiB0aGUgc2VydmVyIG11c3Qgc2VydmUgbWF0Y2hBbnksIGFuZCB0aGUgYmFyIG11c3QgaG9sZCB0d28gb3IgbW9yZVxuLy8gZ3JvdXBzIHRoYXQgY29tYmluZSAoYW4gJ2FueScgb3ZlciBvbmUgZ3JvdXAgaXMgdGhhdCBncm91cCkuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hGaWx0ZXJJdGVtKFxuICByZXBvcnQ6IFJlcG9ydCB8IG51bGwsXG4gIGdyb3VwczogUmVwb3J0RmlsdGVyR3JvdXBbXSxcbiAgcGFnZUlkOiBudW1iZXIgfCBudWxsLFxuICBtYXRjaDogUmVwb3J0RmlsdGVyTWF0Y2gsXG4pOiBJRmlsdGVyQ29uZmlnSXRlbSB8IG51bGwge1xuICBjb25zdCBlbGlnaWJsZSA9IGdyb3Vwcy5maWx0ZXIoKGdyb3VwKSA9PiBpc01hdGNoQW55R3JvdXAoZ3JvdXAsIHBhZ2VJZCkpO1xuXG4gIGlmICghcmVwb3J0Py52aWV3ZXJGZWF0dXJlcz8uaW5jbHVkZXMoJ21hdGNoQW55JykgfHwgZWxpZ2libGUubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBNQVRDSF9JVEVNLFxuICAgIHR5cGU6IEl0ZW1UeXBlLlNlbGVjdCxcbiAgICBsYWJlbDogJ01hdGNoJyxcbiAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgdmFsdWVzOiAoKSA9PiBNQVRDSF9PUFRJT05TLFxuICAgIGRlZmF1bHQ6IG1hdGNoLFxuICAgIC8vICdNYXRjaDogYW55IGZpbHRlcicgb3IgJ01hdGNoOiBhbGwgZmlsdGVycycsIGluIHRoZSBleHBvcnQgbGluZXMnIHdvcmRzLlxuICAgIGNoaXBUZXh0OiAoaXRlbSkgPT4gbWF0Y2hMaW5lVGV4dChtYXRjaEZyb21RdWVyeShpdGVtLnF1ZXJ5KSwgJ2NoaXAnKSxcbiAgfTtcbn1cblxuLy8gVGhlIG1hdGNoIGEgY2hhbmdlIHF1ZXJ5IG9mIGEgYmFyIHdpdGggdGhlIE1hdGNoIGNvbnRyb2wgYXNrcyBmb3IuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hGcm9tUXVlcnkocXVlcnk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVwb3J0RmlsdGVyTWF0Y2gge1xuICByZXR1cm4gcXVlcnk/LltNQVRDSF9JVEVNXSA9PT0gJ2FueScgPyAnYW55JyA6ICdhbGwnO1xufVxuXG4vLyBUaGUgcXVlcnkga2V5IG9mIGEgbGlzdCdzIHNlYXJjaCBib3ggaW4gaXRzIGNvbXBvbmVudCBoZWFkZXIuIEZpeGVkIHJhdGhlclxuLy8gdGhhbiBkZXJpdmVkIGZyb20gYW4gaWQgYmVjYXVzZSBhIGhlYWRlciBob2xkcyBhdCBtb3N0IG9uZSwgYW5kIGl0IGlzIE5PVCBhXG4vLyBmaWx0ZXIgZ3JvdXA6IGl0cyB0ZXh0IG5hcnJvd3MgdGhhdCBsaXN0IGFsb25lLCBzbyBpdCBpcyByZWFkIHN0cmFpZ2h0IG9mZlxuLy8gdGhlIGNoYW5nZSBxdWVyeSBhbmQgdHJhdmVscyBhcyB0aGUgbGlzdCdzIG93biBgc3RhdGUuc2VhcmNoYC5cbmV4cG9ydCBjb25zdCBMSVNUX1NFQVJDSF9JVEVNID0gJ2xpc3RTZWFyY2gnO1xuXG4vLyBUaGUgbG9uZ2VzdCBzZWFyY2ggdGhlIHNlcnZlciBhcHBsaWVzIChSZXBvcnRRdWVyeVJ1bm5lcjo6TUFYX1NFQVJDSF9MRU5HVEgpLlxuLy8gVGhlIHZpZXdlciBjdXRzIHRoZSB0ZXh0IHRvIGl0IHRvbywgc28gdGhlIHN0YXRlLCB0aGUgcmVxdWVzdCBhbmQgdGhlIGV4cG9ydFxuLy8gdGl0bGUgYWxsIGNhcnJ5IHRoZSB0ZXh0IHRoYXQgd2FzIGFjdHVhbGx5IHNlYXJjaGVkLlxuZXhwb3J0IGNvbnN0IExJU1RfU0VBUkNIX01BWF9MRU5HVEggPSAxMDA7XG5cbi8vIFRoZSBmcy1maWx0ZXIgY29uZmlnIGl0ZW0gZm9yIGEgbGlzdCdzIHNlYXJjaCBib3gsIHNlZWRlZCB3aXRoIHRoZSB0ZXh0IHRoZVxuLy8gdmlld2VyIGxhc3Qgc2VhcmNoZWQuIGZzLWZpbHRlciBzaG93cyBvbmUgc2VhcmNoIGJveCBwZXIgYmFyIChpdHMgbGFzdFxuLy8ga2V5d29yZCBpdGVtKSwgc28gdGhlIGNhbGxlciBhZGRzIHRoaXMgb25seSB0byBhIGhlYWRlciB3aXRoIG5vIGtleXdvcmRcbi8vIGdyb3VwIG9mIGl0cyBvd24uXG5leHBvcnQgZnVuY3Rpb24gbGlzdFNlYXJjaEl0ZW0odmFsdWU6IHN0cmluZyB8IG51bGwpOiBJRmlsdGVyQ29uZmlnSXRlbSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogSXRlbVR5cGUuS2V5d29yZCxcbiAgICBuYW1lOiBMSVNUX1NFQVJDSF9JVEVNLFxuICAgIGxhYmVsOiAnU2VhcmNoJyxcbiAgICBkZWZhdWx0OiB2YWx1ZSA/PyB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8vIFdoZXRoZXIgdGhlIHJlcG9ydCBoYXMgYSBjaGFydCB0aGUgZ3JvdXAtYnkgY29udHJvbCBjYW4gcmUtYnVja2V0LiBBIHRpbWVcbi8vIHgtYXhpcyBpcyB0aGUgd2hvbGUgcXVhbGlmaWNhdGlvbjogdGhlIGNvbnRyb2wgY2hhbmdlcyB0aGUgZ3JhaW4gb2YgdGhhdFxuLy8gYXhpcywgYW5kIGEgY2F0ZWdvcnkgYXhpcyBoYXMgbm8gZ3JhaW4gdG8gY2hhbmdlLlxuZXhwb3J0IGZ1bmN0aW9uIGhhc1RpbWVTZXJpZXNDaGFydChyZXBvcnQ6IFJlcG9ydCB8IG51bGwpOiBib29sZWFuIHtcbiAgcmV0dXJuIChyZXBvcnQ/LnBhZ2VzID8/IFtdKS5zb21lKChwYWdlKSA9PiAocGFnZS5jb21wb25lbnRzID8/IFtdKS5zb21lKChjb21wb25lbnQpID0+XG4gICAgY29tcG9uZW50LnR5cGUgPT09ICdjaGFydCcgJiYgY29tcG9uZW50LmNvbmZpZz8ueEF4aXM/LmtpbmQgPT09ICd0aW1lJykpO1xufVxuXG4vLyBUaGUgZ3JhaW5zIHRoZSByZXBvcnQncyBncm91cC1ieSBjb250cm9sIG9mZmVycywgbmFtZWQgZm9yIHRoZSB2aWV3ZXIuIFdISUNIXG4vLyBvZiB0aGVtIGNvbWVzIGZyb20gdGhlIHJlcG9ydDsgaG93IHRoZXkgcmVhZCBjb21lcyBmcm9tIEdSQU5VTEFSSVRZX09QVElPTlMuXG4vLyBBbiBlbXB0eSBzdG9yZWQgbGlzdCBtZWFucyBldmVyeSBncmFpbiDigJQgdGhlIHNhbWUgcnVsZSB0aGUgYmFja2VuZCBhcHBsaWVzLlxuZnVuY3Rpb24gZ3JvdXBCeU9wdGlvbnMocmVwb3J0OiBSZXBvcnQpOiB7IHZhbHVlOiBDaGFydEdyYW51bGFyaXR5OyBuYW1lOiBzdHJpbmcgfVtdIHtcbiAgY29uc3QgZ3JhbnVsYXJpdGllcyA9IHJlcG9ydC5jb25maWc/Lmdyb3VwQnk/LmdyYW51bGFyaXRpZXMgPz8gW107XG5cbiAgcmV0dXJuIGdyYW51bGFyaXRpZXMubGVuZ3RoXG4gICAgPyBHUkFOVUxBUklUWV9PUFRJT05TLmZpbHRlcigob3B0aW9uKSA9PiBncmFudWxhcml0aWVzLmluY2x1ZGVzKG9wdGlvbi52YWx1ZSkpXG4gICAgOiBHUkFOVUxBUklUWV9PUFRJT05TO1xufVxuXG4vLyBXaGV0aGVyIGEgZ3JhaW4gaXMgb25lIHRoZSByZXBvcnQncyBjb250cm9sIHN0aWxsIG9mZmVycy4gQSBncmFpbiBpdCBkb2Vzbid0XG4vLyBjYW5ub3Qgc3RheSBpbiBlZmZlY3Q6IHRoZSBhZ2VudCBjYW4gbmFycm93IHRoZSBsaXN0IGF0IGFueSB0aW1lLCBhbmQgYSBjaGFydFxuLy8gbGVmdCBidWNrZXRpbmcgYXQgYSBkcm9wcGVkIGdyYWluIGlzIG9uZSB0aGUgdmlld2VyIGNhbiBuZWl0aGVyIHNlZSBub3IgY2hhbmdlLlxuZXhwb3J0IGZ1bmN0aW9uIGlzR3JhbnVsYXJpdHlPZmZlcmVkKHJlcG9ydDogUmVwb3J0LCBncmFudWxhcml0eTogQ2hhcnRHcmFudWxhcml0eSB8IG51bGwpOiBib29sZWFuIHtcbiAgcmV0dXJuICFncmFudWxhcml0eSB8fCBncm91cEJ5T3B0aW9ucyhyZXBvcnQpLnNvbWUoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlID09PSBncmFudWxhcml0eSk7XG59XG5cbi8vIFRoZSBmcy1maWx0ZXIgY29uZmlnIGl0ZW0gZm9yIHRoZSByZXBvcnQncyBncm91cC1ieSBjb250cm9sLCBvciBudWxsIHdoZW4gdGhlXG4vLyByZXBvcnQgaGFzIG5vbmUgdG8gc2hvdy5cbi8vXG4vLyBJdCBsZWFkcyB0aGUgc2FtZSBiYXIgdGhlIGZpbHRlcnMgcmVuZGVyIGluLCBidXQgaXQgaXMgTk9UIG9uZTogYSBmaWx0ZXJcbi8vIG5hcnJvd3MgV0hJQ0ggcm93cyBhcmUgY291bnRlZCwgdGhpcyBjaGFuZ2VzIGhvdyB0aGUgc3Vydml2aW5nIHJvd3MgYXJlXG4vLyBCVUNLRVRFRCDigJQgYW5kIGl0IGNvbWVzIGZpcnN0IGJlY2F1c2UgdGhlIGdyYWluIGlzIHdoYXQgYSB2aWV3ZXIgc2V0dGxlc1xuLy8gYmVmb3JlIGRlY2lkaW5nIHdoaWNoIHJvd3MgdGhleSB3YW50LlxuLy8gUGlja2luZyBhIGdyYWluIHNldHMgYSBzZXNzaW9uLXdpZGUgb3ZlcnJpZGUgdGhhdCByaWRlcyBhbG9uZyBpbiBlYWNoIGNoYXJ0J3Ncbi8vIGRhdGEgcmVxdWVzdCwgc28gdGhlIGNoYXJ0cyB0aGVtc2VsdmVzIGFyZSBuZXZlciByZXdyaXR0ZW4uXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBCeUZpbHRlckl0ZW0oXG4gIHJlcG9ydDogUmVwb3J0LFxuICBpbml0aWFsPzogQ2hhcnRHcmFudWxhcml0eSB8IG51bGwsXG4pOiBJRmlsdGVyQ29uZmlnSXRlbSB8IG51bGwge1xuICBjb25zdCBncm91cEJ5ID0gcmVwb3J0LmNvbmZpZz8uZ3JvdXBCeTtcblxuICAvLyBPbmx5IGFuIEVYUExJQ0lUIGZhbHNlIGhpZGVzIHRoZSBjb250cm9sLiBBbiBhYnNlbnQgYmxvY2sgbWVhbnMgYSByZXBvcnRcbiAgLy8gc2VydmVkIGJ5IGEgYnVpbGQgdGhhdCBwcmVkYXRlcyB0aGUgY29udHJvbCBiZWluZyBzdG9yZWQsIGFuZCBldmVyeSBvbmUgb2ZcbiAgLy8gdGhvc2UgaGFkIG9uZSDigJQgdGhlIGJhY2tlbmQgcmVzb2x2ZXMgaXQgdGhlIHNhbWUgd2F5IChSZXBvcnRHcm91cEJ5KS5cbiAgaWYgKGdyb3VwQnk/LmVuYWJsZWQgPT09IGZhbHNlIHx8ICFoYXNUaW1lU2VyaWVzQ2hhcnQocmVwb3J0KSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgdmFsdWVzID0gZ3JvdXBCeU9wdGlvbnMocmVwb3J0KTtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6IEdST1VQX0JZX0lURU0sXG4gICAgdHlwZTogSXRlbVR5cGUuU2VsZWN0LFxuICAgIGxhYmVsOiBncm91cEJ5Py5sYWJlbCB8fCAnR3JvdXAgQnknLFxuICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICB2YWx1ZXM6ICgpID0+IHZhbHVlcyxcbiAgICBkZWZhdWx0OiBpc0dyYW51bGFyaXR5T2ZmZXJlZChyZXBvcnQsIGluaXRpYWwgPz8gbnVsbCkgPyAoaW5pdGlhbCA/PyB1bmRlZmluZWQpIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vLyBUaGUgZ3JvdXAtYnkgY29udHJvbCdzIGNvbnRyaWJ1dGlvbiB0byB0aGUgdG9vbGJhcidzIGZzLWZpbHRlciBrZXkuIGZzLWZpbHRlclxuLy8gcmVhZHMgaXRzIGNvbmZpZyBvbmNlIGF0IGluaXQsIGFuZCB0aGUgYWdlbnQgY2FuIGNoYW5nZSB0aGUgY29udHJvbCdzIGxhYmVsXG4vLyBvciB0aGUgZ3JhaW5zIGl0IG9mZmVycyDigJQgd2l0aG91dCB0aG9zZSBpbiB0aGUga2V5IHRoZSBiYXIga2VlcHMgcmVuZGVyaW5nXG4vLyB0aGUgY29udHJvbCBpdCB3YXMgY3JlYXRlZCB3aXRoIHVudGlsIGEgZnVsbCBwYWdlIHJlbG9hZC5cbmV4cG9ydCBmdW5jdGlvbiBncm91cEJ5U2lnbmF0dXJlKHJlcG9ydDogUmVwb3J0IHwgbnVsbCk6IHN0cmluZyB7XG4gIGlmICghcmVwb3J0IHx8ICFncm91cEJ5RmlsdGVySXRlbShyZXBvcnQpKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3QgZ3JvdXBCeSA9IHJlcG9ydC5jb25maWc/Lmdyb3VwQnk7XG5cbiAgcmV0dXJuIFsnZ3JvdXBCeScsIGdyb3VwQnk/LmxhYmVsID8/ICcnLCAoZ3JvdXBCeT8uZ3JhbnVsYXJpdGllcyA/PyBbXSkuam9pbignLCcpXS5qb2luKCc6Jyk7XG59XG5cbi8vIFJlYWQgYW4gZnMtZmlsdGVyIGNoYW5nZSBxdWVyeSBpbnRvIHBlci1ncm91cCB2YWx1ZXMuIFJldHVybnMgb25lIGVudHJ5IHBlclxuLy8gZ3JvdXAgd2l0aCB0aGUgdmFsdWUgdG8gc3RvcmUgKG9yIG51bGwgdG8gY2xlYXIpIOKAlCBjYWxsZXJzIGZlZWQgdGhlc2UgdG9cbi8vIFJlcG9ydEZpbHRlclN0YXRlU2VydmljZS5zZXRWYWx1ZS5cbmV4cG9ydCBmdW5jdGlvbiBncm91cFZhbHVlc0Zyb21RdWVyeShcbiAgcXVlcnk6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGdyb3VwczogUmVwb3J0RmlsdGVyR3JvdXBbXSxcbik6IHsgZ3JvdXBJZDogbnVtYmVyOyB2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwgfVtdIHtcbiAgcmV0dXJuIGdyb3Vwcy5tYXAoKGdyb3VwKSA9PiB7XG4gICAgY29uc3QgbmFtZSA9IGdyb3VwSXRlbU5hbWUoZ3JvdXApO1xuXG4gICAgc3dpdGNoIChncm91cC50eXBlKSB7XG4gICAgICBjYXNlICdkYXRlUmFuZ2UnOlxuICAgICAgICByZXR1cm4geyBncm91cElkOiBncm91cC5pZCwgdmFsdWU6IGRhdGVSYW5nZUZyb21RdWVyeShxdWVyeSwgbmFtZSkgfTtcblxuICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgcmV0dXJuIHsgZ3JvdXBJZDogZ3JvdXAuaWQsIHZhbHVlOiBzZWxlY3RGcm9tUXVlcnkocXVlcnksIG5hbWUpIH07XG5cbiAgICAgIGNhc2UgJ251bWJlclJhbmdlJzpcbiAgICAgICAgcmV0dXJuIHsgZ3JvdXBJZDogZ3JvdXAuaWQsIHZhbHVlOiBudW1iZXJSYW5nZUZyb21RdWVyeShxdWVyeSwgbmFtZSkgfTtcblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zdCBrZXl3b3JkID0gU3RyaW5nKHF1ZXJ5W25hbWVdID8/ICcnKS50cmltKCk7XG5cbiAgICAgICAgcmV0dXJuIHsgZ3JvdXBJZDogZ3JvdXAuaWQsIHZhbHVlOiBrZXl3b3JkID8geyB2YWx1ZToga2V5d29yZCB9IDogbnVsbCB9O1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbi8vIEEgZGF0ZSByYW5nZSdzIGRheXMgKDxuYW1lPkZyb20sIDxuYW1lPlRvKS5cbmZ1bmN0aW9uIGRhdGVSYW5nZUZyb21RdWVyeShxdWVyeTogUmVjb3JkPHN0cmluZywgYW55PiwgbmFtZTogc3RyaW5nKTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwge1xuICBjb25zdCBzdGFydCA9IHF1ZXJ5W2l0ZW1SYW5nZU5hbWUobmFtZSwgJ2Zyb20nKV07XG4gIGNvbnN0IGVuZCA9IHF1ZXJ5W2l0ZW1SYW5nZU5hbWUobmFtZSwgJ3RvJyldO1xuXG4gIGlmICghc3RhcnQgJiYgIWVuZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0IHx8IG51bGwsIGVuZDogZW5kIHx8IG51bGwgfTtcbn1cblxuLy8gQSBzZWxlY3QncyBwaWNrczoga2VwdCAoPG5hbWU+KSwgb3IgbGVmdCBvdXQgd2hpbGUgaXRzIGV4Y2x1ZGUgcm93IGlzIG9uXG4vLyAoZXhjbHVkZTxOYW1lPikuXG5mdW5jdGlvbiBzZWxlY3RGcm9tUXVlcnkocXVlcnk6IFJlY29yZDxzdHJpbmcsIGFueT4sIG5hbWU6IHN0cmluZyk6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHtcbiAgY29uc3QgZXhjbHVkZVZhbHVlcyA9IHNlbGVjdFF1ZXJ5VmFsdWVzKHF1ZXJ5W2dldEV4Y2x1ZGVOYW1lKG5hbWUpXSk7XG4gIGlmIChleGNsdWRlVmFsdWVzLmxlbmd0aCkge1xuICAgIHJldHVybiB7IGV4Y2x1ZGVWYWx1ZXMgfTtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlcyA9IHNlbGVjdFF1ZXJ5VmFsdWVzKHF1ZXJ5W25hbWVdKTtcblxuICByZXR1cm4gdmFsdWVzLmxlbmd0aCA/IHsgdmFsdWVzIH0gOiBudWxsO1xufVxuXG4vLyBBIG51bWJlciByYW5nZSdzIGVuZHMgKDxuYW1lPk1pbiwgPG5hbWU+TWF4KS4gQW4gZW5kIGxlZnQgZW1wdHkgaXMgb3Blbi5cbmZ1bmN0aW9uIG51bWJlclJhbmdlRnJvbVF1ZXJ5KHF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBuYW1lOiBzdHJpbmcpOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB7XG4gIGNvbnN0IG1pbiA9IHJhbmdlQm91bmQocXVlcnlbaXRlbVJhbmdlTmFtZShuYW1lLCAnbWluJyldKTtcbiAgY29uc3QgbWF4ID0gcmFuZ2VCb3VuZChxdWVyeVtpdGVtUmFuZ2VOYW1lKG5hbWUsICdtYXgnKV0pO1xuXG4gIGlmIChtaW4gPT09IG51bGwgJiYgbWF4ID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLihtaW4gIT09IG51bGwgPyB7IG1pbiB9IDoge30pLFxuICAgIC4uLihtYXggIT09IG51bGwgPyB7IG1heCB9IDoge30pLFxuICB9O1xufVxuXG4vLyBPbmUgZW5kIG9mIGEgbnVtYmVyIHJhbmdlIGFzIGZzLWZpbHRlcidzIFJhbmdlIHNlbmRzIGl0OiB0aGUgdGV4dCB0eXBlZCBpblxuLy8gaXRzIGlucHV0LiBOdW1iZXIoKSByZWFkcyBhbnkgbm9uLWVtcHR5IHRleHQsIHNvICcwJyBpcyB0aGUgZW5kIDA7IGVtcHR5IG9yXG4vLyB1bnJlYWRhYmxlIHRleHQgaXMgYW4gb3BlbiBlbmQuXG5mdW5jdGlvbiByYW5nZUJvdW5kKHJhdzogdW5rbm93bik6IG51bWJlciB8IG51bGwge1xuICBjb25zdCB0ZXh0ID0gdHlwZW9mIHJhdyA9PT0gJ251bWJlcicgPyBTdHJpbmcocmF3KSA6IFN0cmluZyhyYXcgPz8gJycpLnRyaW0oKTtcbiAgY29uc3QgbnVtYmVyID0gdGV4dCA9PT0gJycgPyBOYU4gOiBOdW1iZXIodGV4dCk7XG5cbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShudW1iZXIpID8gbnVtYmVyIDogbnVsbDtcbn1cblxuLy8gQSBncm91cCB2YWx1ZSBhcyB0ZXh0LCB0aGUgc2FtZSBmb3IgdGhlIHNhbWUgdmFsdWUgd2hhdGV2ZXIgaXRzIHNvdXJjZTpcbi8vIGRheXMgYXMgY2FsZW5kYXIgZGF5cywgcGlja3MgYW5kIGVuZHMgYXMgdGV4dCwga2V5d29yZCB0ZXh0IHRyaW1tZWQuIFRoZVxuLy8gdmFsdWUgYSB0aWxlIGhlYWRlciB3YXMgYnVpbHQgd2l0aCBpcyBrZXllZCBvbiBpdCwgc28gYSBoZWFkZXIgaXMgY3JlYXRlZFxuLy8gYWdhaW4gd2hlbiBhbm90aGVyIGJhciBjaGFuZ2VzIGEgZ3JvdXAgaXQgc2hvd3MuXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBWYWx1ZVNpZ25hdHVyZSh2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KFtcbiAgICBkYXRlQm91bmRTdHJpbmcodmFsdWUuc3RhcnQpID8/ICcnLFxuICAgIGRhdGVCb3VuZFN0cmluZyh2YWx1ZS5lbmQpID8/ICcnLFxuICAgICh2YWx1ZS52YWx1ZXMgPz8gW10pLm1hcChTdHJpbmcpLFxuICAgICh2YWx1ZS5leGNsdWRlVmFsdWVzID8/IFtdKS5tYXAoU3RyaW5nKSxcbiAgICAodmFsdWUudmFsdWUgPz8gJycpLnRyaW0oKSxcbiAgICB2YWx1ZS5taW4gPz8gJycsXG4gICAgdmFsdWUubWF4ID8/ICcnLFxuICBdKTtcbn1cblxuLy8gZnMtZmlsdGVyJ3MgQXV0b0NvbXBsZXRlQ2hpcHMgc2VyaWFsaXNlcyBhIG11bHRpLXNlbGVjdCBpbnRvIE9ORSBxdWVyeSB2YWx1ZTpcbi8vIHRoZSBzZWxlY3RlZCB2YWx1ZXMgam9pbmVkIGJ5IFwiLFwiIChpdHMgYHF1ZXJ5YCBnZXR0ZXIgZG9lcyBgLm1hcCh2YWx1ZSkuam9pbignLCcpYCkuXG4vLyBTbyBhIDIrIHNlbGVjdGlvbiBhcnJpdmVzIGFzIHRoZSBzdHJpbmcgXCJhLGJcIiwgbm90IGFuIGFycmF5IOKAlCBzcGxpdHRpbmcgb24gXCIsXCJcbi8vIHJldmVyc2VzIHRoYXQgZmFpdGhmdWxseS4gV2l0aG91dCB0aGlzLCBhIG11bHRpLXNlbGVjdCB3YXMgc2VudCBhcyB0aGUgc2luZ2xlXG4vLyB2YWx1ZSBbXCJhLGJcIl0sIHByb2R1Y2luZyBgY29sIElOICgnYSxiJylgIHNlcnZlci1zaWRlLCB3aGljaCBtYXRjaGVzIG5vdGhpbmcuXG5mdW5jdGlvbiBzZWxlY3RRdWVyeVZhbHVlcyhyYXc6IHVua25vd24pOiB1bmtub3duW10ge1xuICBpZiAoQXJyYXkuaXNBcnJheShyYXcpKSB7XG4gICAgcmV0dXJuIHJhdztcbiAgfVxuXG4gIGlmIChyYXcgPT09IG51bGwgfHwgcmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSAnJykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiBTdHJpbmcocmF3KS5zcGxpdCgnLCcpO1xufVxuIl19
|
|
497
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWZpbHRlci1pdGVtcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9yZXBvcnQtZmlsdGVyLWl0ZW1zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsUUFBUSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWpGLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRTVDLE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHOUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzdFLE9BQU8sRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBSTVFLE9BQU8sRUFDK0IsbUJBQW1CLEdBRXhELE1BQU0sK0JBQStCLENBQUM7QUFDdkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBSXpELDJFQUEyRTtBQUMzRSw0RUFBNEU7QUFDNUUseUVBQXlFO0FBQ3pFLE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBdUM7SUFDckUsSUFBSSxLQUFLLFlBQVksSUFBSSxFQUFFLENBQUM7UUFDMUIsT0FBTyxNQUFNLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxzRUFBc0U7SUFDdEUsOEJBQThCO0lBQzlCLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxD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QUssRUFBRSxDQUFDO1FBQ1gsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3BCLGVBQWUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRTtRQUNsQyxlQUFlLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUU7UUFDaEMsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7UUFDaEMsQ0FBQyxLQUFLLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7UUFDdkMsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRTtRQUMxQixLQUFLLENBQUMsR0FBRyxJQUFJLEVBQUU7UUFDZixLQUFLLENBQUMsR0FBRyxJQUFJLEVBQUU7S0FDaEIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELGdGQUFnRjtBQUNoRix1RkFBdUY7QUFDdkYsaUZBQWlGO0FBQ2pGLGdGQUFnRjtBQUNoRixnRkFBZ0Y7QUFDaEYsU0FBUyxpQkFBaUIsQ0FBQyxHQUFZO0lBQ3JDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssU0FBUyxJQUFJLEdBQUcsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUNwRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElGaWx0ZXJDb25maWdJdGVtLCBJdGVtVHlwZSwgZ2V0RXhjbHVkZU5hbWUgfSBmcm9tICdAZmlyZXN0aXRjaC9maWx0ZXInO1xuXG5pbXBvcnQgeyBmb3JtYXQsIHBhcnNlSVNPIH0gZnJvbSAnZGF0ZS1mbnMnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwLCBzaGFyZVJlcGxheSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgUmVwb3J0RGF0YSB9IGZyb20gJy4vZGF0YS9yZXBvcnQuZGF0YSc7XG5pbXBvcnQgeyBmb2xsb3dzR3JvdXBCeSB9IGZyb20gJy4vZ3JvdXAtYnknO1xuaW1wb3J0IHsgZmlsdGVyTGluZVRleHQsIG1hdGNoTGluZVRleHQgfSBmcm9tICcuL2V4cG9ydC9yZXBvcnQtZmlsdGVyLWxpbmVzJztcbmltcG9ydCB7IERBWV9TSE9SVCwgZm9ybWF0TG9jYWxEYXRlLCByZXNvbHZlRm9ybWF0Q29udGV4dCB9IGZyb20gJy4vZm9ybWF0JztcbmltcG9ydCB7IFJlcG9ydEZpbHRlck1hdGNoIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3JlcG9ydC1maWx0ZXItbWF0Y2gudHlwZSc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJPcHRpb25QYWlyIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3JlcG9ydC1maWx0ZXItb3B0aW9uLXBhaXIuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydFZpZXdlckZlYXR1cmUgfSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LXZpZXdlci1mZWF0dXJlLnR5cGUnO1xuaW1wb3J0IHtcbiAgQ2hhcnRHcmFudWxhcml0eSwgRmlsdGVyR3JvdXBWYWx1ZSwgR1JBTlVMQVJJVFlfT1BUSU9OUywgUmVwb3J0LCBSZXBvcnRGaWx0ZXJHcm91cCwgUmVwb3J0RmlsdGVyTGV2ZWwsXG4gIFJlcG9ydEZpbHRlck9wdGlvbiwgUmVwb3J0RmlsdGVyVHlwZSwgUmVwb3J0TG9jYWxlVGFnLFxufSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBvZmZlcnNFeGNsdWRlIH0gZnJvbSAnLi9yZXBvcnQtdmlld2VyLWZlYXR1cmVzJztcbmltcG9ydCB7IFJlcG9ydEZpbHRlck9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLW9wdGlvbnMuc2VydmljZSc7XG5cblxuLy8gQSBkYXRlLXJhbmdlIGJvdW5kYXJ5IGFzIHRoZSBwaWNrZWQgTE9DQUwgY2FsZW5kYXIgZGF5IChubyB0aW1lLCBubyB0eikuXG4vLyBEYXRlLXJhbmdlIGZpbHRlcnMgYXJlIGNhbGVuZGFyLWRheSBzZW1hbnRpY3MsIHNvIHRoZSBib3VuZGFyeSBtdXN0IGNhcnJ5XG4vLyBvbmx5IFktTS1EIOKAlCBuZXZlciBhIHRpbWV6b25lLWJlYXJpbmcgaW5zdGFudCB0aGUgYmFja2VuZCB3b3VsZCBzaGlmdC5cbmV4cG9ydCBmdW5jdGlvbiBkYXRlQm91bmRTdHJpbmcodmFsdWU6IERhdGUgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBmb3JtYXQodmFsdWUsICd5eXl5LU1NLWRkJyk7XG4gIH1cblxuICAvLyBBdXRob3JlZC9yZWxhdGl2ZSBkZWZhdWx0cyBhcnJpdmUgYXMgc3RyaW5ncyBhbHJlYWR5IGluIFktTS1EIGZvcm07XG4gIC8vIGtlZXAganVzdCB0aGUgZGF0ZSBwb3J0aW9uLlxuICByZXR1cm4gdmFsdWUgPyBTdHJpbmcodmFsdWUpLnNsaWNlKDAsIDEwKSA6IHVuZGVmaW5lZDtcbn1cblxuXG4vLyBBIGRhdGUtcmFuZ2UgYm91bmRhcnkgYXMgaXQgc2hvdWxkIFJFQUQgb24gYSBjb3ZlciBwYWdlIOKAlCB0aGUgc2FtZSBjYWxlbmRhclxuLy8gZGF5IGRhdGVCb3VuZFN0cmluZygpIGhhbmRzIHRoZSBzZXJ2ZXIsIHNvIGEgcHJpbnRlZCBwZXJpb2QgY2FuIG5ldmVyIG5hbWUgYVxuLy8gZGlmZmVyZW50IGRheSB0aGFuIHRoZSBudW1iZXJzIHVuZGVyIGl0IHdlcmUgZmlsdGVyZWQgYnkuIFJldHVybnMgbnVsbCB3aGVuXG4vLyB0aGVyZSBpcyBubyBib3VuZGFyeTsgdGhlIGNhbGxlciBzdXBwbGllcyBpdHMgb3duIHBsYWNlaG9sZGVyLlxuLy9cbi8vIFRoZSBwYXJzZSBoYXMgdG8gYmUgcGFyc2VJU08sIG5vdCBgbmV3IERhdGVgOiBgbmV3IERhdGUoJzIwMjYtMDUtMDEnKWAgaXMgVVRDXG4vLyBtaWRuaWdodCwgc28gZm9ybWF0dGluZyBpdCBhbnl3aGVyZSB3ZXN0IG9mIFVUQyBwcmludHMgQXByIDMwLiBwYXJzZUlTTyByZWFkc1xuLy8gYSBiYXJlIFktTS1EIGFzIExPQ0FMIG1pZG5pZ2h0LCB3aGljaCBubyBvZmZzZXQgY2FuIHNoaWZ0LlxuLy9cbi8vIFRoZSBkYXkgaXMgd3JpdHRlbiBpbiB0aGUgcmVwb3J0J3MgbG9jYWxlLCBhcyBpdHMgZGF0ZSBjZWxscyBhcmU6ICdKYW4gNSxcbi8vIDIwMjYnIGluIGVuLVVTLCAnNSBqYW52LiAyMDI2JyBpbiBmci1DQS5cbmV4cG9ydCBmdW5jdGlvbiBkYXRlQm91bmRMYWJlbCh2YWx1ZTogRGF0ZSB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGJvdW5kID0gZGF0ZUJvdW5kU3RyaW5nKHZhbHVlKTtcblxuICBpZiAoIWJvdW5kKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBkYXRlID0gcGFyc2VJU08oYm91bmQpO1xuXG4gIHJldHVybiBOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpID8gU3RyaW5nKHZhbHVlKSA6IGZvcm1hdExvY2FsRGF0ZShkYXRlLCBsb2NhbGUsIERBWV9TSE9SVCk7XG59XG5cblxuLy8gQSBzdG9yZWQgeXl5eS1NTS1kZCBib3VuZGFyeSBhcyBhIGxvY2FsIERhdGUgZm9yIGEgZGF0ZSBwaWNrZXIsIG9yIG51bGwuXG4vLyBwYXJzZUlTTyByZWFkcyBhIGJhcmUgWS1NLUQgYXMgTE9DQUwgbWlkbmlnaHQsIHNvIHRoZSBwaWNrZXIgc2hvd3MgdGhlIGRheVxuLy8gdGhhdCB3YXMgc3RvcmVkLCB3aGF0ZXZlciB0aGUgYnJvd3NlcidzIHpvbmUuXG5leHBvcnQgZnVuY3Rpb24gZGF0ZUZyb21Cb3VuZCh2YWx1ZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IERhdGUgfCBudWxsIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZGF0ZSA9IHBhcnNlSVNPKHZhbHVlLnNsaWNlKDAsIDEwKSk7XG5cbiAgcmV0dXJuIE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkgPyBudWxsIDogZGF0ZTtcbn1cblxuXG4vLyBBIHBpY2tlZCBEYXRlIGFzIGEgeXl5eS1NTS1kZCBib3VuZGFyeSBmb3Igc3RvcmFnZSwgb3IgbnVsbC4gVXNlcyB0aGUgbG9jYWxcbi8vIGNhbGVuZGFyIGRheSAoZm9ybWF0LCBub3QgdG9JU09TdHJpbmcpIHNvIHRoZSBib3VuZGFyeSBpcyB0aGUgZGF5IHRoYXQgd2FzXG4vLyBwaWNrZWQsIHJlZ2FyZGxlc3Mgb2YgdGhlIGJyb3dzZXIncyB6b25lLlxuZXhwb3J0IGZ1bmN0aW9uIGRhdGVUb0JvdW5kKHZhbHVlOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlICYmICFOdW1iZXIuaXNOYU4odmFsdWUuZ2V0VGltZSgpKVxuICAgID8gZm9ybWF0KHZhbHVlLCAneXl5eS1NTS1kZCcpXG4gICAgOiBudWxsO1xufVxuXG5cbi8vIEEgcmVsYXRpdmUgZGF0ZS1yYW5nZSBwcmVzZXQga2V5IGFzIGEgc2VudGVuY2UtY2FzZSBsYWJlbCwgZGVyaXZlZCBmcm9tIHRoZVxuLy8gY2FtZWxDYXNlIGtleSBpdHNlbGYgKCdsYXN0MTJNb250aHMnIHJlYWRzICdMYXN0IDEyIG1vbnRocycsICd0aGlzV2Vlaydcbi8vIHJlYWRzICdUaGlzIHdlZWsnKSwgc28gbm8gbGlzdCBvZiBwcmVzZXRzIGlzIG1pcnJvcmVkIGhlcmUgYW5kIGEga2V5IHRoZVxuLy8gc2VydmVyIGFkZHMgbGF0ZXIgc3RpbGwgcmVhZHMgc2Vuc2libHkuXG5leHBvcnQgZnVuY3Rpb24gcmVsYXRpdmVMYWJlbChyZWxhdGl2ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgd29yZHMgPSByZWxhdGl2ZVxuICAgIC5yZXBsYWNlKC8oW2Etel0pKFtBLVowLTldKS9nLCAnJDEgJDInKVxuICAgIC5yZXBsYWNlKC8oXFxkKShbQS1aXSkvZywgJyQxICQyJylcbiAgICAudG9Mb3dlckNhc2UoKTtcblxuICByZXR1cm4gd29yZHMuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3Jkcy5zbGljZSgxKTtcbn1cblxuXG4vLyBNYXBzIGEgcmVwb3J0IGZpbHRlciBHUk9VUCB0byBhbiBmcy1maWx0ZXIgY29uZmlnIGl0ZW0sIGFuZCByZWFkcyBmcy1maWx0ZXJcbi8vIHF1ZXJ5IHZhbHVlcyBiYWNrIGludG8gcGVyLWdyb3VwIEZpbHRlckdyb3VwVmFsdWVzLiBTaGFyZWQgYnkgdGhlIHJlcG9ydC1iYXJcbi8vIGZzLWZpbHRlciBhbmQgdGhlIHBlci1jb21wb25lbnQgZnMtZmlsdGVyIHNvIGJvdGggcmVuZGVyIHRocm91Z2ggdGhlIHNhbWVcbi8vIGxpYnJhcnkgYW5kIHdyaXRlIGludG8gUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIGlkZW50aWNhbGx5LiBJdGVtcyBhcmUgbmFtZWRcbi8vIGJ5IHRoZSBncm91cCdzIGlkIChncm91cEl0ZW1OYW1lKSwgc28gdGhlIHF1ZXJ5IGtleXMgbWFwIHN0cmFpZ2h0IGJhY2sgdG9cbi8vIHRoZSBncm91cC4gQSByZXBvcnQgbmV2ZXIgcHV0cyB0aGVzZSBrZXlzIGluIHRoZSBicm93c2VyIFVSTDogZnMtZmlsdGVyJ3Ncbi8vIG93biBxdWVyeS1wYXJhbSBzeW5jaW5nIGlzIG9mZiBpbiBldmVyeSByZXBvcnQgYmFyLlxuXG4vLyBUaGUgcXVlcnkga2V5IGZvciB0aGUgcmVwb3J0J3MgZ3JvdXAtYnkgY29udHJvbC4gRml4ZWQgcmF0aGVyIHRoYW4gZGVyaXZlZFxuLy8gZnJvbSBhbiBpZCBiZWNhdXNlIGEgcmVwb3J0IGhhcyBleGFjdGx5IG9uZSDigJQgYW5kIGl0IGlzIE5PVCBhIGZpbHRlciBncm91cCxcbi8vIHNvIGl0IGlzIHJlYWQgc3RyYWlnaHQgb2ZmIHRoZSBjaGFuZ2UgcXVlcnkgaW5zdGVhZCBvZiB0aHJvdWdoXG4vLyBncm91cFZhbHVlc0Zyb21RdWVyeS4gVGhlIGdyYWluIHRyYXZlbHMgdG8gdGhlIHNlcnZlciBhcyB0aGUgZGF0YSByZXF1ZXN0J3Ncbi8vIGBzdGF0ZS5mcmVxdWVuY3lgLlxuZXhwb3J0IGNvbnN0IEdST1VQX0JZX0lURU0gPSAnZ3JvdXBCeSc7XG5cbi8vIFRoZSB3b3JkIGJlZm9yZSBhIGdyb3VwJ3MgaWQgaW4gdGhlIG5hbWUgb2YgaXRzIGZzLWZpbHRlciBpdGVtIChmaWx0ZXIxMikuXG5jb25zdCBJVEVNX05BTUVfV09SRCA9ICdmaWx0ZXInO1xuXG4vLyBUaGUgZW5kcyBvZiBhbiBmcy1maWx0ZXIgcmFuZ2UgaXRlbTogUmFuZ2Ugd3JpdGVzIDxuYW1lPk1pbiBhbmQgPG5hbWU+TWF4LFxuLy8gRGF0ZVJhbmdlIDxuYW1lPkZyb20gYW5kIDxuYW1lPlRvLlxuZXhwb3J0IHR5cGUgSXRlbVJhbmdlRW5kID0gJ21pbicgfCAnbWF4JyB8ICdmcm9tJyB8ICd0byc7XG5cbi8vIFRoZSBxdWVyeSBrZXkgb2Ygb25lIGVuZCBvZiBhbiBmcy1maWx0ZXIgcmFuZ2UgaXRlbTogdGhlIGl0ZW0ncyBuYW1lIGFuZFxuLy8gdGhlIGVuZCB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgdXBwZXItY2FzZWQgKGZzLWZpbHRlcidzIGdldFJhbmdlTmFtZSksIHNvXG4vLyBmaWx0ZXIxMiBnaXZlcyBmaWx0ZXIxMk1pbiBhbmQgZmlsdGVyMTJGcm9tLlxuZXhwb3J0IGZ1bmN0aW9uIGl0ZW1SYW5nZU5hbWUobmFtZTogc3RyaW5nLCBlbmQ6IEl0ZW1SYW5nZUVuZCk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtuYW1lfSR7ZW5kLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpfSR7ZW5kLnNsaWNlKDEpfWA7XG59XG5cbi8vIFRoZSBuYW1lIG9mIGEgZ3JvdXAncyBmcy1maWx0ZXIgaXRlbTogJ2ZpbHRlcicgYW5kIHRoZSBncm91cCdzIGlkLiBUaGUgaWRcbi8vIG5ldmVyIGNoYW5nZXMsIHNvIG5laXRoZXIgYSBuZXcgbGFiZWwgbm9yIGEgbmV3IG5hbWUgbW92ZXMgYSBiYXIncyBrZXlzLFxuLy8gYW5kIG5vIGl0ZW0gbmFtZSBjYW4gdGFrZSBhbm90aGVyIGl0ZW0ncyAoZ3JvdXBCeSwgbWF0Y2gsIGxpc3RTZWFyY2gpLlxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwSXRlbU5hbWUoZ3JvdXA6IFBpY2s8UmVwb3J0RmlsdGVyR3JvdXAsICdpZCc+KTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke0lURU1fTkFNRV9XT1JEfSR7Z3JvdXAuaWR9YDtcbn1cblxuLy8gVGhlIGxhYmVsIGEgZ3JvdXAncyBjaGlwIHNob3dzOiBpdHMgb3duLCBlbHNlIGl0cyBmaXJzdCBtZW1iZXIncyBjb2x1bW4uXG5mdW5jdGlvbiBncm91cExhYmVsKGdyb3VwOiBQaWNrPFJlcG9ydEZpbHRlckdyb3VwLCAnbGFiZWwnIHwgJ2ZpbHRlcnMnPik6IHN0cmluZyB7XG4gIHJldHVybiBncm91cC5sYWJlbCB8fCBncm91cC5maWx0ZXJzPy5bMF0/LmZpbHRlckNvbHVtbiB8fCAnJztcbn1cblxuLy8gQSBzZWxlY3QgZ3JvdXAncyBkaXN0aW5jdCBvcHRpb25zLCBhcyB7IG5hbWUsIHZhbHVlIH0gcGFpcnMuIFRoZSBzZXJ2ZXIgc2VuZHNcbi8vIHsgdmFsdWUsIGxhYmVsIH06IHRoZSB2YWx1ZSBpcyB3aGF0IHRoZSBmaWx0ZXIgbWF0Y2hlcyBvbiAoYW4gZW50aXR5J3Mgc3RhYmxlXG4vLyBpZCkgYW5kIHRoZSBsYWJlbCBpcyB3aGF0IHRoZSB2aWV3ZXIgcmVhZHMg4oCUIHNvIGEgcmVuYW1lZCBlbnRpdHkga2VlcHMgaXRzIGlkXG4vLyBhbmQgc2ltcGx5IHNob3dzIGl0cyBuZXcgbmFtZSBoZXJlLiBPcHRpb25zIGNvbWUgZnJvbSB0aGUgZmlyc3QgbWVtYmVyIGZpbHRlclxuLy8gdGhhdCBkZWNsYXJlcyB0aGVtIOKAlCBtZW1iZXJzIGFyZSB0aGUgc2FtZSBkYXRhIHBvaW50LCBzbyBhbnkgbWVtYmVyJ3MgbGlzdFxuLy8gc2VydmVzIHRoZSBncm91cC4gVGhlIGxpc3QgaXMgZmV0Y2hlZCBvbmNlICh0aGUgc2VydmVyIGNhcHMgaXQpIGFuZCByZXBsYXllZFxuLy8gKHNoYXJlUmVwbGF5KSwgc28gcmVwZWF0ZWQgcmVhZHMgbmV2ZXIgcmVmZXRjaC4gVGhpcyBpcyB0aGUgZnVsbCBsaXN0LCBuZXZlclxuLy8gbmFycm93ZWQgYnkgb3RoZXIgZmlsdGVyczogdGhlIHJlcG9ydC1zZXR0aW5ncyBkZWZhdWx0IHBpY2tlciByZWFkcyBpdCAoYW5cbi8vIGF1dGhvciBzZXRzIGEgZGVmYXVsdCBhZ2FpbnN0IHRoZSB3aG9sZSBsaXN0KSwgYW5kIHNvIGRvZXMgdGhlIGV4cG9ydCdzXG4vLyBmaWx0ZXIgd29yZGluZyBmb3IgYSBwaWNrIHRoZSBiYXIgaGFzIG5vdCBuYW1lZC4gVGhlIGJhcnMgcmVhZFxuLy8gUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UgaW5zdGVhZC4gUmV0dXJucyBhbiBlbXB0eSBsaXN0IHdoZW4gbm8gbWVtYmVyXG4vLyBwcm92aWRlcyBvcHRpb25zLlxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRHcm91cE9wdGlvbnMoXG4gIGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgcmVwb3J0RGF0YTogUmVwb3J0RGF0YSxcbiAgcmVwb3J0SWQ6IG51bWJlcixcbik6IE9ic2VydmFibGU8UmVwb3J0RmlsdGVyT3B0aW9uUGFpcltdPiB7XG4gIGNvbnN0IG9wdGlvbkZpbHRlciA9IChncm91cC5maWx0ZXJzID8/IFtdKS5maW5kKChtZW1iZXIpID0+IG1lbWJlci5oYXNPcHRpb25zKTtcbiAgaWYgKCFvcHRpb25GaWx0ZXIpIHtcbiAgICByZXR1cm4gb2YoW10pO1xuICB9XG5cbiAgcmV0dXJuIHJlcG9ydERhdGEuZmlsdGVyT3B0aW9ucyhyZXBvcnRJZCwgb3B0aW9uRmlsdGVyLmlkKVxuICAgIC5waXBlKFxuICAgICAgbWFwKChvcHRpb25zOiBSZXBvcnRGaWx0ZXJPcHRpb25bXSkgPT4gKG9wdGlvbnMgPz8gW10pXG4gICAgICAgIC5tYXAoKG9wdGlvbikgPT4gKHsgbmFtZTogb3B0aW9uLmxhYmVsLCB2YWx1ZTogb3B0aW9uLnZhbHVlIH0pKSksXG4gICAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiBmYWxzZSB9KSxcbiAgICApO1xufVxuXG4vLyBTdG9yZWQgZmlsdGVyIHZhbHVlcyAoaWRzKSBwYWlyZWQgYmFjayB3aXRoIHRoZSBsYWJlbHMgdG8gc2hvdyBmb3IgdGhlbS5cbi8vIEEgc2F2ZWQgZGVmYXVsdCBob2xkcyBvbmx5IHZhbHVlcywgc28gdGhlIG5hbWVzIGhhdmUgdG8gYmUgcmVhZCBiYWNrIG9mZiB0aGVcbi8vIG9wdGlvbiBsaXN0IOKAlCB0aGF0IGluZGlyZWN0aW9uIGlzIGV4YWN0bHkgd2hhdCBzdXJ2aXZlcyBhIHJlbmFtZS4gYGxhYmVsYFxuLy8gbmFtZXMgYSB2YWx1ZSBmaXJzdDogYSBuYW1lIGFscmVhZHkgbGVhcm5lZCAoUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UubGFiZWwpXG4vLyBob2xkcyBmb3IgYSBwaWNrIGEgbmFycm93ZWQgbGlzdCBsZWF2ZXMgb3V0LCBhbmQgd2hlbiBpdCBuYW1lcyBldmVyeSB2YWx1ZVxuLy8gdGhlIGxpc3QgaXMgbm90IHJlYWQgYXQgYWxsLiBBIHZhbHVlIHdpdGggbm8gbmFtZSBhbmQgbm8gbWF0Y2hpbmcgb3B0aW9uXG4vLyAoaXRzIGVudGl0eSB3YXMgZGVsZXRlZCwgc28gaXQgaXMgbm8gbG9uZ2VyIGxpc3RlZCkgZmFsbHMgYmFjayB0byBzaG93aW5nXG4vLyB0aGUgcmF3IHZhbHVlIHJhdGhlciB0aGFuIGRyb3BwaW5nIHRoZSBjaGlwLCB3aGljaCB3b3VsZCBzaWxlbnRseSB3aWRlbiB0aGVcbi8vIGZpbHRlci5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlT3B0aW9uVmFsdWVzKFxuICBvcHRpb25zJDogT2JzZXJ2YWJsZTxSZXBvcnRGaWx0ZXJPcHRpb25QYWlyW10+LFxuICB2YWx1ZXM6IHVua25vd25bXSxcbiAgbGFiZWw6ICh2YWx1ZTogdW5rbm93bikgPT4gc3RyaW5nIHwgbnVsbCA9ICgpID0+IG51bGwsXG4pOiBPYnNlcnZhYmxlPFJlcG9ydEZpbHRlck9wdGlvblBhaXJbXT4ge1xuICBjb25zdCBuYW1lZCA9IChvcHRpb25zOiBSZXBvcnRGaWx0ZXJPcHRpb25QYWlyW10pID0+IHZhbHVlcy5tYXAoKHZhbHVlKSA9PiB7XG4gICAgY29uc3Qgb3B0aW9uID0gb3B0aW9ucy5maW5kKChjYW5kaWRhdGUpID0+IFN0cmluZyhjYW5kaWRhdGUudmFsdWUpID09PSBTdHJpbmcodmFsdWUpKTtcblxuICAgIHJldHVybiB7IG5hbWU6IGxhYmVsKHZhbHVlKSA/PyBvcHRpb24/Lm5hbWUgPz8gU3RyaW5nKHZhbHVlKSwgdmFsdWUgfTtcbiAgfSk7XG5cbiAgcmV0dXJuIHZhbHVlcy5ldmVyeSgodmFsdWUpID0+IGxhYmVsKHZhbHVlKSAhPT0gbnVsbClcbiAgICA/IG9mKG5hbWVkKFtdKSlcbiAgICA6IG9wdGlvbnMkLnBpcGUobWFwKG5hbWVkKSk7XG59XG5cbi8vIFJlYWRzIGEgZ3JvdXAncyBvcHRpb24gbGlzdDsgc2VlIGdyb3VwT3B0aW9uc1JlYWRlcigpLlxuZXhwb3J0IHR5cGUgR3JvdXBPcHRpb25zUmVhZGVyID0gKFxuICBncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsXG4gIHJlcG9ydElkOiBudW1iZXIsXG4pID0+IE9ic2VydmFibGU8eyBuYW1lOiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH1bXT47XG5cbi8vIEEgcmVhZGVyIG9mIGVhY2ggZ3JvdXAncyBvcHRpb24gbGlzdCAobG9hZEdyb3VwT3B0aW9ucykgdGhhdCBsb2FkcyBhIGdyb3VwJ3Ncbi8vIGxpc3Qgb25jZSBhbmQgaGFuZHMgZXZlcnkgbGF0ZXIgcmVhZCBvZiB0aGF0IGdyb3VwIHRoZSBzYW1lIHJlcGxheWVkXG4vLyByZXF1ZXN0LCBzbyBldmVyeXRoaW5nIHRoYXQgbmFtZXMgb25lIGdyb3VwJ3MgcGlja3Mg4oCUIHRoZSBjb3ZlcidzIGZpbHRlclxuLy8gbGluZSwgaXRzIHt7ZmlsdGVyLjxpZD59fSB0b2tlbiwgdGhlIG5leHQgcGljayDigJQgc2hhcmVzIG9uZSBmZXRjaC4gQSByZWFkXG4vLyB0aGF0IGZhaWxlZCBpcyBmZXRjaGVkIGFnYWluIGJ5IHRoZSBuZXh0IG9uZSAoc2hhcmVSZXBsYXkgZHJvcHMgYW4gZXJyb3IpLlxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwT3B0aW9uc1JlYWRlcihyZXBvcnREYXRhOiBSZXBvcnREYXRhKTogR3JvdXBPcHRpb25zUmVhZGVyIHtcbiAgY29uc3QgbG9hZGVkID0gbmV3IE1hcDxudW1iZXIsIE9ic2VydmFibGU8eyBuYW1lOiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH1bXT4+KCk7XG5cbiAgcmV0dXJuIChncm91cCwgcmVwb3J0SWQpID0+IHtcbiAgICBjb25zdCBvcHRpb25zJCA9IGxvYWRlZC5nZXQoZ3JvdXAuaWQpID8/IGxvYWRHcm91cE9wdGlvbnMoZ3JvdXAsIHJlcG9ydERhdGEsIHJlcG9ydElkKTtcbiAgICBsb2FkZWQuc2V0KGdyb3VwLmlkLCBvcHRpb25zJCk7XG5cbiAgICByZXR1cm4gb3B0aW9ucyQ7XG4gIH07XG59XG5cbi8vIFRoZSBuYW1lcyBvZiBhIHNlbGVjdCBncm91cCdzIHBpY2tzIChrZXB0IG9yIGxlZnQgb3V0KSwgYXMgaXRzIGNoaXBzIGluXG4vLyB0aGUgZmlsdGVyIGJhciBuYW1lIHRoZW0sIGZvciBhIHt7ZmlsdGVyLjxpZD59fSB0b2tlbjogYSBuYW1lIHRoZSBiYXInc1xuLy8gbGlzdHMgdGF1Z2h0IChgbGFiZWxgLCBSZXBvcnRGaWx0ZXJPcHRpb25zU2VydmljZS5sYWJlbCkgZmlyc3QsIGVsc2UgdGhlXG4vLyBncm91cCdzIG9wdGlvbiBsaXN0LiBudWxsIHdoZW4gdGhlIGxpc3QgY291bGQgbm90IGJlIHJlYWQ6IHRoZSB0b2tlbiB0aGVuXG4vLyByZWFkcyB0aGUgZW0gZGFzaCByYXRoZXIgdGhhbiBhIHJvdyBvZiBpZHMuXG5leHBvcnQgZnVuY3Rpb24gcGlja2VkT3B0aW9uTmFtZXMoXG4gIG9wdGlvbnMkOiBPYnNlcnZhYmxlPHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9W10+LFxuICB2YWx1ZXM6IHVua25vd25bXSxcbiAgbGFiZWw6ICh2YWx1ZTogdW5rbm93bikgPT4gc3RyaW5nIHwgbnVsbCA9ICgpID0+IG51bGwsXG4pOiBPYnNlcnZhYmxlPHN0cmluZ1tdIHwgbnVsbD4ge1xuICByZXR1cm4gcmVzb2x2ZU9wdGlvblZhbHVlcyhvcHRpb25zJCwgdmFsdWVzLCBsYWJlbClcbiAgICAucGlwZShcbiAgICAgIG1hcCgob3B0aW9ucyk6IHN0cmluZ1tdIHwgbnVsbCA9PiBvcHRpb25zLm1hcCgob3B0aW9uKSA9PiBvcHRpb24ubmFtZSkpLFxuICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSksXG4gICAgKTtcbn1cblxuLy8gQ2FzZS1pbnNlbnNpdGl2ZSBuYW1lIGZpbHRlciBhcHBsaWVkIHRvIGEgbG9hZGVkIG9wdGlvbiBsaXN0IOKAlCB0aGUgdHlwZWRcbi8vIGtleXdvcmQgaGFzIHRvIGJlIG1hdGNoZWQgaGVyZSBiZWNhdXNlIGZzLWF1dG9jb21wbGV0ZSByZW5kZXJzIHdoYXQgd2UgcmV0dXJuXG4vLyB2ZXJiYXRpbS5cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaE9wdGlvbnMoXG4gIG9wdGlvbnMkOiBPYnNlcnZhYmxlPFJlcG9ydEZpbHRlck9wdGlvblBhaXJbXT4sXG4gIGtleXdvcmQ/OiBzdHJpbmcsXG4pOiBPYnNlcnZhYmxlPFJlcG9ydEZpbHRlck9wdGlvblBhaXJbXT4ge1xuICBjb25zdCB0ZXJtID0gKGtleXdvcmQgPz8gJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gIHJldHVybiBvcHRpb25zJC5waXBlKG1hcCgob3B0aW9ucykgPT4gdGVybVxuICAgID8gb3B0aW9ucy5maWx0ZXIoKG9wdGlvbikgPT4gb3B0aW9uLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXJtKSlcbiAgICA6IG9wdGlvbnMpKTtcbn1cblxuLy8gVGhlIHBhbmVsIHJvdyBvZiBhIHNlbGVjdCB3aG9zZSBsaXN0IHRoZSBzZXJ2ZXIgY3V0IGF0IDUwMC5cbmV4cG9ydCBjb25zdCBPUFRJT05TX1RSVU5DQVRFRF9OT1RFID0gJ1Nob3dpbmcgdGhlIGZpcnN0IDUwMC4gVHlwZSB0byBuYXJyb3cuJztcblxuLy8gVGhlIHBhbmVsIHJvdyBvZiBhIHNlbGVjdCB3aG9zZSBsaXN0IGNvdWxkIG5vdCBiZSByZWFkLiBUaGUgbmV4dCBmb2N1cyBvclxuLy8ga2V5c3Ryb2tlIGFza3MgYWdhaW4uXG5leHBvcnQgY29uc3QgT1BUSU9OU19GQUlMRURfTk9URSA9ICdDb3VsZCBub3QgbG9hZCB0aGUgbGlzdC4nO1xuXG4vLyBCdWlsZCB0aGUgZnMtZmlsdGVyIGNvbmZpZyBpdGVtIGZvciBhIGdyb3VwLCBzZWVkaW5nIGl0cyBkZWZhdWx0IGZyb20gdGhlXG4vLyBjdXJyZW50IHNlc3Npb24gdmFsdWUgc28gYXV0aG9yZWQvcmVsYXRpdmUgZGVmYXVsdHMgc2hvdyBzZWxlY3RlZCBvbiBvcGVuLlxuLy8gQSBzZWxlY3QgbGlzdHMgd2hhdCBgb3B0aW9uc2Agb2ZmZXJzIGZvciBpdCBpbiBgcmVwb3J0YC4gYGZlYXR1cmVzYCBpcyB0aGVcbi8vIHJlcG9ydCdzIHZpZXdlckZlYXR1cmVzOiBhIHNlbGVjdCBvZmZlcnMgJ0V4Y2x1ZGUgdGhlc2UnIGJ5IHRoZSBydWxlIG9mXG4vLyBvZmZlcnNFeGNsdWRlICh0aGUgc2VydmVyIGxpc3RzIGV4Y2x1ZGVWYWx1ZXMgYW5kIG5vIG1lbWJlciBiaW5kcyBzZXZlcmFsXG4vLyBjb2x1bW5zKSwgYW5kIGEgbnVtYmVyIHJhbmdlIGlzIGEgbWluL21heCBjb250cm9sIG9ubHkgd2hlbiBpdCBsaXN0c1xuLy8gbnVtYmVyUmFuZ2UuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVySXRlbUZvckdyb3VwKFxuICBncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsXG4gIG9wdGlvbnM6IFJlcG9ydEZpbHRlck9wdGlvbnNTZXJ2aWNlLFxuICByZXBvcnQ6IFJlcG9ydCB8IG51bGwsXG4gIGluaXRpYWw/OiBGaWx0ZXJHcm91cFZhbHVlLFxuICBmZWF0dXJlczogcmVhZG9ubHkgUmVwb3J0Vmlld2VyRmVhdHVyZVtdID0gW10sXG4pOiBJRmlsdGVyQ29uZmlnSXRlbSB7XG4gIGNvbnN0IG5hbWUgPSBncm91cEl0ZW1OYW1lKGdyb3VwKTtcbiAgY29uc3QgbGFiZWwgPSBncm91cExhYmVsKGdyb3VwKTtcblxuICBzd2l0Y2ggKGdyb3VwLnR5cGUpIHtcbiAgICBjYXNlICdkYXRlUmFuZ2UnOlxuICAgICAgcmV0dXJuIGRhdGVSYW5nZUZpbHRlckl0ZW0obmFtZSwgbGFiZWwsIGluaXRpYWwpO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIHJldHVybiBzZWxlY3RGaWx0ZXJJdGVtKGdyb3VwLCBsYWJlbCwgb3B0aW9ucywgcmVwb3J0LCBpbml0aWFsLCBvZmZlcnNFeGNsdWRlKGdyb3VwLCBmZWF0dXJlcykpO1xuXG4gICAgY2FzZSAnbnVtYmVyUmFuZ2UnOlxuICAgICAgcmV0dXJuIGZlYXR1cmVzLmluY2x1ZGVzKCdudW1iZXJSYW5nZScpXG4gICAgICAgID8gbnVtYmVyUmFuZ2VGaWx0ZXJJdGVtKGdyb3VwLCBsYWJlbCwgcmVwb3J0LCBpbml0aWFsKVxuICAgICAgICA6IGtleXdvcmRGaWx0ZXJJdGVtKG5hbWUsIGxhYmVsLCBpbml0aWFsKTtcblxuICAgIGNhc2UgJ2tleXdvcmQnOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4ga2V5d29yZEZpbHRlckl0ZW0obmFtZSwgbGFiZWwsIGluaXRpYWwpO1xuICB9XG59XG5cbi8vIEEgZGF0ZSByYW5nZSBvcGVucyBvbiBpdHMgZGF5cywgYW5kIGl0cyBjaGlwIHNob3dzIHRoZW0uIEEgcHJlc2V0IHBpY2tlZCBpblxuLy8gdGhlIGRhdGUgcGlja2VyIG9ubHkgc2V0cyB0aGUgZGF5cy5cbmZ1bmN0aW9uIGRhdGVSYW5nZUZpbHRlckl0ZW0obmFtZTogc3RyaW5nLCBsYWJlbDogc3RyaW5nLCBpbml0aWFsPzogRmlsdGVyR3JvdXBWYWx1ZSk6IElGaWx0ZXJDb25maWdJdGVtIHtcbiAgY29uc3QgaGFzRGF5cyA9ICEhKGluaXRpYWw/LnN0YXJ0IHx8IGluaXRpYWw/LmVuZCk7XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lLFxuICAgIHR5cGU6IEl0ZW1UeXBlLkRhdGVSYW5nZSxcbiAgICBsYWJlbDogeyBmcm9tOiBgJHtsYWJlbH0gRnJvbWAsIHRvOiBgJHtsYWJlbH0gVG9gIH0sXG4gICAgZGVmYXVsdDogaGFzRGF5c1xuICAgICAgPyB7IGZyb206IGluaXRpYWwuc3RhcnQgPz8gdW5kZWZpbmVkLCB0bzogaW5pdGlhbC5lbmQgPz8gdW5kZWZpbmVkIH1cbiAgICAgIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vLyBBIHNlbGVjdCdzIHBpY2tzLCBrZXB0IG9yIGxlZnQgb3V0LiBXaXRoIGBleGNsdWRlYCB0aGUgbGlzdCBoYXMgdGhlXG4vLyAnRXhjbHVkZSB0aGVzZScgcm93LCBhbmQgYSB2YWx1ZSB0aGF0IGxlYXZlcyBvdXQgb3BlbnMgd2l0aCBpdCBvbi4gSXRzIGxpc3Rcbi8vIGlzIHJlYWQgb24gZm9jdXMgYW5kIG9uIGVhY2gga2V5c3Ryb2tlOiB0aGUgb3B0aW9ucyBzZXJ2aWNlIGZldGNoZXMgaXQgd2hlblxuLy8gdGhlIG90aGVyIGZpbHRlcnMgY2hhbmdlZCBzaW5jZSBhbmQgcmVwbGF5cyBpdCBvdGhlcndpc2UsIGFuZCB0eXBpbmdcbi8vIGZpbHRlcnMgaXQgaGVyZS4gQSBsaXN0IHRoZSBzZXJ2ZXIgY3V0LCBvciBvbmUgdGhhdCBjb3VsZCBub3QgYmUgcmVhZCxcbi8vIHNheXMgc28gaW4gYSBwYW5lbCByb3cuXG5mdW5jdGlvbiBzZWxlY3RGaWx0ZXJJdGVtKFxuICBncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsXG4gIGxhYmVsOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJlcG9ydEZpbHRlck9wdGlvbnNTZXJ2aWNlLFxuICByZXBvcnQ6IFJlcG9ydCB8IG51bGwsXG4gIGluaXRpYWw6IEZpbHRlckdyb3VwVmFsdWUgfCB1bmRlZmluZWQsXG4gIGV4Y2x1ZGU6IGJvb2xlYW4sXG4pOiBJRmlsdGVyQ29uZmlnSXRlbSB7XG4gIGNvbnN0IGV4Y2x1ZGluZyA9IGV4Y2x1ZGUgJiYgIWluaXRpYWw/LnZhbHVlcz8ubGVuZ3RoICYmICEhaW5pdGlhbD8uZXhjbHVkZVZhbHVlcz8ubGVuZ3RoO1xuICBjb25zdCBwaWNrcyA9IGV4Y2x1ZGluZyA/IGluaXRpYWwuZXhjbHVkZVZhbHVlcyA6IGluaXRpYWw/LnZhbHVlcztcbiAgY29uc3Qgb3B0aW9ucyQgPSBvcHRpb25zLm9wdGlvbnMoZ3JvdXAsIHJlcG9ydCk7XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBncm91cEl0ZW1OYW1lKGdyb3VwKSxcbiAgICB0eXBlOiBJdGVtVHlwZS5BdXRvQ29tcGxldGVDaGlwcyxcbiAgICBsYWJlbCxcbiAgICBmZXRjaE9uRm9jdXM6IHRydWUsXG4gICAgZXhjbHVkZTogZXhjbHVkZSA/IHt9IDogdW5kZWZpbmVkLFxuICAgIHZhbHVlczogKGtleXdvcmQ/OiBzdHJpbmcpID0+IG1hdGNoT3B0aW9ucyhvcHRpb25zJCwga2V5d29yZCksXG4gICAgcGFuZWxOb3RlOiAoKSA9PiBvcHRpb25zTm90ZShvcHRpb25zLCBncm91cC5pZCksXG4gICAgLy8gU3RvcmVkIHZhbHVlcyBhcmUgaWRzLCBzbyBhIGNoaXAgaXMgbmFtZWQgYnkgYSBuYW1lIGFscmVhZHkgbGVhcm5lZCBvclxuICAgIC8vIG9uY2UgdGhlIG9wdGlvbiBsaXN0IGhhcyBsb2FkZWQg4oCUIGhlbmNlIHRoZSBvYnNlcnZhYmxlIGZvcm0gb2YgYGRlZmF1bHRgLlxuICAgIGRlZmF1bHQ6IHBpY2tzPy5sZW5ndGhcbiAgICAgID8gKCkgPT4gcmVzb2x2ZU9wdGlvblZhbHVlcyhvcHRpb25zJCwgcGlja3MsICh2YWx1ZSkgPT4gb3B0aW9ucy5sYWJlbChncm91cC5pZCwgdmFsdWUpKVxuICAgICAgICAucGlwZShtYXAoKHNlbGVjdGVkKSA9PiAoZXhjbHVkaW5nID8geyBleGNsdWRlOiB0cnVlLCBzZWxlY3RlZCB9IDogc2VsZWN0ZWQpKSlcbiAgICAgIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vLyBUaGUgcGFuZWwgcm93IG9mIGEgc2VsZWN0J3MgbGF0ZXN0IGxpc3Q6IGEgZmFpbHVyZSBmaXJzdCwgdGhlbiBhIGN1dCBsaXN0LlxuZnVuY3Rpb24gb3B0aW9uc05vdGUob3B0aW9uczogUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UsIGdyb3VwSWQ6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICBpZiAob3B0aW9ucy5mYWlsZWQoZ3JvdXBJZCkpIHtcbiAgICByZXR1cm4gT1BUSU9OU19GQUlMRURfTk9URTtcbiAgfVxuXG4gIHJldHVybiBvcHRpb25zLnRydW5jYXRlZChncm91cElkKSA/IE9QVElPTlNfVFJVTkNBVEVEX05PVEUgOiBudWxsO1xufVxuXG4vLyBBIG51bWJlciByYW5nZSdzIGxvdyBhbmQgaGlnaCBlbmRzLCBlaXRoZXIgb25lIG9wZW4uIDAgaXMgYW4gZW5kIGxpa2UgYW55XG4vLyBvdGhlci4gSXRzIGNoaXAgcmVhZHMgYXMgdGhlIGV4cG9ydCBsaW5lcyBkbyAoJ0Ftb3VudDogMCBvciBtb3JlJyxcbi8vICdBbW91bnQ6IDAgdG8gMTAnKTogdGhlIGVuZHMgYXJlIHJlYWQgb2ZmIHRoZSBpdGVtJ3MgcXVlcnkgdGhlIHdheSB0aGVcbi8vIGJhcidzIGNoYW5nZSByZWFkcyB0aGVtLCBhbmQgd29yZGVkIGluIHRoZSByZXBvcnQncyBsb2NhbGUuXG5mdW5jdGlvbiBudW1iZXJSYW5nZUZpbHRlckl0ZW0oXG4gIGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgbGFiZWw6IHN0cmluZyxcbiAgcmVwb3J0OiBSZXBvcnQgfCBudWxsLFxuICBpbml0aWFsPzogRmlsdGVyR3JvdXBWYWx1ZSxcbik6IElGaWx0ZXJDb25maWdJdGVtIHtcbiAgY29uc3QgbmFtZSA9IGdyb3VwSXRlbU5hbWUoZ3JvdXApO1xuICBjb25zdCBtaW4gPSBpbml0aWFsPy5taW4gPz8gdW5kZWZpbmVkO1xuICBjb25zdCBtYXggPSBpbml0aWFsPy5tYXggPz8gdW5kZWZpbmVkO1xuICBjb25zdCBsb2NhbGUgPSByZXNvbHZlRm9ybWF0Q29udGV4dChyZXBvcnQgPz8ge30pLmxvY2FsZTtcblxuICByZXR1cm4ge1xuICAgIG5hbWUsXG4gICAgdHlwZTogSXRlbVR5cGUuUmFuZ2UsXG4gICAgbGFiZWwsXG4gICAgZGVmYXVsdDogbWluICE9PSB1bmRlZmluZWQgfHwgbWF4ICE9PSB1bmRlZmluZWQgPyB7IG1pbiwgbWF4IH0gOiB1bmRlZmluZWQsXG4gICAgY2hpcFRleHQ6IChpdGVtKSA9PiBmaWx0ZXJMaW5lVGV4dChcbiAgICAgIHsgbGFiZWwsIGxldmVsOiBncm91cC5sZXZlbCB9LFxuICAgICAgbnVtYmVyUmFuZ2VGcm9tUXVlcnkoaXRlbS5xdWVyeSwgbmFtZSksXG4gICAgICB7IGxvY2FsZSB9LFxuICAgICAgJ2NoaXAnLFxuICAgICksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGtleXdvcmRGaWx0ZXJJdGVtKG5hbWU6IHN0cmluZywgbGFiZWw6IHN0cmluZywgaW5pdGlhbD86IEZpbHRlckdyb3VwVmFsdWUpOiBJRmlsdGVyQ29uZmlnSXRlbSB7XG4gIHJldHVybiB7XG4gICAgbmFtZSxcbiAgICB0eXBlOiBJdGVtVHlwZS5LZXl3b3JkLFxuICAgIGxhYmVsLFxuICAgIGRlZmF1bHQ6IGluaXRpYWw/LnZhbHVlLFxuICB9O1xufVxuXG4vLyBUaGUgZ3JvdXBzIGEgbWF0Y2ggb2YgJ2FueScgY29tYmluZXM6IHJlcG9ydCBiYXIgZ3JvdXBzIChhIHBhZ2UgZ3JvdXAgb25cbi8vIGl0cyBvd24gcGFnZSBvbmx5KSB0aGF0IGEgdmlld2VyIHBpY2tzIHZhbHVlcywgdGV4dCBvciBhIG51bWJlciByYW5nZSBpbi5cbi8vIERhdGVzLCB0aWxlLW9ubHkgZ3JvdXBzIGFuZCB0aGUgY3Jvc3MtZmlsdGVyIGFsd2F5cyBuYXJyb3cgb24gdGhlaXIgb3duLlxuLy8gVGhlIHNlcnZlciBob2xkcyB0aGUgc2FtZSBydWxlIGFuZCBjaGVja3MgZXZlcnkgaWQgaXQgaXMgc2VudC5cbmNvbnN0IE1BVENIX0FOWV9MRVZFTFM6IHJlYWRvbmx5IFJlcG9ydEZpbHRlckxldmVsW10gPSBbJ3JlcG9ydCcsICdib3RoJywgJ3BhZ2UnXTtcbmNvbnN0IE1BVENIX0FOWV9UWVBFUzogcmVhZG9ubHkgUmVwb3J0RmlsdGVyVHlwZVtdID0gWydzZWxlY3QnLCAna2V5d29yZCcsICdudW1iZXJSYW5nZSddO1xuXG4vLyBXaGV0aGVyIGEgZ3JvdXAgam9pbnMgYSBtYXRjaCBvZiAnYW55JyBvbiBwYWdlIGBwYWdlSWRgLlxuZXhwb3J0IGZ1bmN0aW9uIGlzTWF0Y2hBbnlHcm91cChncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsIHBhZ2VJZDogbnVtYmVyIHwgbnVsbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gTUFUQ0hfQU5ZX0xFVkVMUy5pbmNsdWRlcyhncm91cC5sZXZlbClcbiAgICAmJiBNQVRDSF9BTllfVFlQRVMuaW5jbHVkZXMoZ3JvdXAudHlwZSlcbiAgICAmJiAoZ3JvdXAubGV2ZWwgIT09ICdwYWdlJyB8fCAoISFwYWdlSWQgJiYgZ3JvdXAucGFnZUlkID09PSBwYWdlSWQpKTtcbn1cblxuLy8gVGhlIHJlcG9ydCBiYXIncyBncm91cHMgaW4gdGhlaXIgc2F2ZWQgb3JkZXI6IHRoZSByZXBvcnQgYW5kIGJvdGggZ3JvdXBzLFxuLy8gYW5kIHRoZSBwYWdlIGdyb3VwcyBvZiB0aGUgcGFnZSBvbiBzY3JlZW4gKGBwYWdlSWRgKS5cbmV4cG9ydCBmdW5jdGlvbiByZXBvcnRCYXJHcm91cHMocmVwb3J0OiBSZXBvcnQgfCBudWxsLCBwYWdlSWQ6IG51bWJlciB8IG51bGwpOiBSZXBvcnRGaWx0ZXJHcm91cFtdIHtcbiAgcmV0dXJuIChyZXBvcnQ/LmZpbHRlckdyb3VwcyA/PyBbXSlcbiAgICAuZmlsdGVyKChncm91cCkgPT4gZ3JvdXAubGV2ZWwgPT09ICdyZXBvcnQnIHx8IGdyb3VwLmxldmVsID09PSAnYm90aCdcbiAgICAgIHx8IChncm91cC5sZXZlbCA9PT0gJ3BhZ2UnICYmICEhcGFnZUlkICYmIGdyb3VwLnBhZ2VJZCA9PT0gcGFnZUlkKSlcbiAgICAuc29ydCgoYSwgYikgPT4gYS5vcmRlciAtIGIub3JkZXIpO1xufVxuXG4vLyBXaGV0aGVyIHRoZSByZXBvcnQgaGFzIGEgZ3JvdXAgc2hvd24gb24gb25lIHBhZ2Ugb25seSwgc28gaXRzIHJlcG9ydCBiYXJcbi8vIGNoYW5nZXMgd2l0aCB0aGUgcGFnZSBvbiBzY3JlZW4uXG5leHBvcnQgZnVuY3Rpb24gaGFzUGFnZUdyb3VwKHJlcG9ydDogUmVwb3J0IHwgbnVsbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKHJlcG9ydD8uZmlsdGVyR3JvdXBzID8/IFtdKS5zb21lKChncm91cCkgPT4gZ3JvdXAubGV2ZWwgPT09ICdwYWdlJyk7XG59XG5cbi8vIFRoZSBxdWVyeSBrZXkgb2YgdGhlIHJlcG9ydCBiYXIncyBNYXRjaCBjb250cm9sLiBOb3QgYSBmaWx0ZXIgZ3JvdXA6IGl0XG4vLyBzYXlzIGhvdyB0aGUgZ3JvdXBzIGNvbWJpbmUsIHNvIGl0IGlzIHJlYWQgc3RyYWlnaHQgb2ZmIHRoZSBjaGFuZ2UgcXVlcnkuXG5leHBvcnQgY29uc3QgTUFUQ0hfSVRFTSA9ICdtYXRjaCc7XG5cbmNvbnN0IE1BVENIX09QVElPTlM6IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogUmVwb3J0RmlsdGVyTWF0Y2ggfVtdID0gW1xuICB7IG5hbWU6ICdBbGwgZmlsdGVycycsIHZhbHVlOiAnYWxsJyB9LFxuICB7IG5hbWU6ICdBbnkgZmlsdGVyJywgdmFsdWU6ICdhbnknIH0sXG5dO1xuXG4vLyBUaGUgcmVwb3J0IGJhcidzIE1hdGNoIGNvbnRyb2wsIGxhc3QgaW4gdGhlIGJhciwgb3IgbnVsbCB3aGVuIGl0IHdvdWxkIGRvXG4vLyBub3RoaW5nOiB0aGUgc2VydmVyIG11c3Qgc2VydmUgbWF0Y2hBbnksIGFuZCB0aGUgYmFyIG11c3QgaG9sZCB0d28gb3IgbW9yZVxuLy8gZ3JvdXBzIHRoYXQgY29tYmluZSAoYW4gJ2FueScgb3ZlciBvbmUgZ3JvdXAgaXMgdGhhdCBncm91cCkuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hGaWx0ZXJJdGVtKFxuICByZXBvcnQ6IFJlcG9ydCB8IG51bGwsXG4gIGdyb3VwczogUmVwb3J0RmlsdGVyR3JvdXBbXSxcbiAgcGFnZUlkOiBudW1iZXIgfCBudWxsLFxuICBtYXRjaDogUmVwb3J0RmlsdGVyTWF0Y2gsXG4pOiBJRmlsdGVyQ29uZmlnSXRlbSB8IG51bGwge1xuICBjb25zdCBlbGlnaWJsZSA9IGdyb3Vwcy5maWx0ZXIoKGdyb3VwKSA9PiBpc01hdGNoQW55R3JvdXAoZ3JvdXAsIHBhZ2VJZCkpO1xuXG4gIGlmICghcmVwb3J0Py52aWV3ZXJGZWF0dXJlcz8uaW5jbHVkZXMoJ21hdGNoQW55JykgfHwgZWxpZ2libGUubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBNQVRDSF9JVEVNLFxuICAgIHR5cGU6IEl0ZW1UeXBlLlNlbGVjdCxcbiAgICBsYWJlbDogJ01hdGNoJyxcbiAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgdmFsdWVzOiAoKSA9PiBNQVRDSF9PUFRJT05TLFxuICAgIGRlZmF1bHQ6IG1hdGNoLFxuICAgIC8vICdNYXRjaDogYW55IGZpbHRlcicgb3IgJ01hdGNoOiBhbGwgZmlsdGVycycsIGluIHRoZSBleHBvcnQgbGluZXMnIHdvcmRzLlxuICAgIGNoaXBUZXh0OiAoaXRlbSkgPT4gbWF0Y2hMaW5lVGV4dChtYXRjaEZyb21RdWVyeShpdGVtLnF1ZXJ5KSwgJ2NoaXAnKSxcbiAgfTtcbn1cblxuLy8gVGhlIG1hdGNoIGEgY2hhbmdlIHF1ZXJ5IG9mIGEgYmFyIHdpdGggdGhlIE1hdGNoIGNvbnRyb2wgYXNrcyBmb3IuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hGcm9tUXVlcnkocXVlcnk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVwb3J0RmlsdGVyTWF0Y2gge1xuICByZXR1cm4gcXVlcnk/LltNQVRDSF9JVEVNXSA9PT0gJ2FueScgPyAnYW55JyA6ICdhbGwnO1xufVxuXG4vLyBUaGUgcXVlcnkga2V5IG9mIGEgbGlzdCdzIHNlYXJjaCBib3ggaW4gaXRzIGNvbXBvbmVudCBoZWFkZXIuIEZpeGVkIHJhdGhlclxuLy8gdGhhbiBkZXJpdmVkIGZyb20gYW4gaWQgYmVjYXVzZSBhIGhlYWRlciBob2xkcyBhdCBtb3N0IG9uZSwgYW5kIGl0IGlzIE5PVCBhXG4vLyBmaWx0ZXIgZ3JvdXA6IGl0cyB0ZXh0IG5hcnJvd3MgdGhhdCBsaXN0IGFsb25lLCBzbyBpdCBpcyByZWFkIHN0cmFpZ2h0IG9mZlxuLy8gdGhlIGNoYW5nZSBxdWVyeSBhbmQgdHJhdmVscyBhcyB0aGUgbGlzdCdzIG93biBgc3RhdGUuc2VhcmNoYC5cbmV4cG9ydCBjb25zdCBMSVNUX1NFQVJDSF9JVEVNID0gJ2xpc3RTZWFyY2gnO1xuXG4vLyBUaGUgbG9uZ2VzdCBzZWFyY2ggdGhlIHNlcnZlciBhcHBsaWVzIChSZXBvcnRRdWVyeVJ1bm5lcjo6TUFYX1NFQVJDSF9MRU5HVEgpLlxuLy8gVGhlIHZpZXdlciBjdXRzIHRoZSB0ZXh0IHRvIGl0IHRvbywgc28gdGhlIHN0YXRlLCB0aGUgcmVxdWVzdCBhbmQgdGhlIGV4cG9ydFxuLy8gdGl0bGUgYWxsIGNhcnJ5IHRoZSB0ZXh0IHRoYXQgd2FzIGFjdHVhbGx5IHNlYXJjaGVkLlxuZXhwb3J0IGNvbnN0IExJU1RfU0VBUkNIX01BWF9MRU5HVEggPSAxMDA7XG5cbi8vIFRoZSBmcy1maWx0ZXIgY29uZmlnIGl0ZW0gZm9yIGEgbGlzdCdzIHNlYXJjaCBib3gsIHNlZWRlZCB3aXRoIHRoZSB0ZXh0IHRoZVxuLy8gdmlld2VyIGxhc3Qgc2VhcmNoZWQuIGZzLWZpbHRlciBzaG93cyBvbmUgc2VhcmNoIGJveCBwZXIgYmFyIChpdHMgbGFzdFxuLy8ga2V5d29yZCBpdGVtKSwgc28gdGhlIGNhbGxlciBhZGRzIHRoaXMgb25seSB0byBhIGhlYWRlciB3aXRoIG5vIGtleXdvcmRcbi8vIGdyb3VwIG9mIGl0cyBvd24uXG5leHBvcnQgZnVuY3Rpb24gbGlzdFNlYXJjaEl0ZW0odmFsdWU6IHN0cmluZyB8IG51bGwpOiBJRmlsdGVyQ29uZmlnSXRlbSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogSXRlbVR5cGUuS2V5d29yZCxcbiAgICBuYW1lOiBMSVNUX1NFQVJDSF9JVEVNLFxuICAgIGxhYmVsOiAnU2VhcmNoJyxcbiAgICBkZWZhdWx0OiB2YWx1ZSA/PyB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8vIFdoZXRoZXIgdGhlIHJlcG9ydCBoYXMgYSB0aWxlIHRoZSBncm91cC1ieSBjb250cm9sIGNhbiByZS1idWNrZXQ6IGEgY2hhcnRcbi8vIG9uIGEgdGltZSB4LWF4aXMgb3IgYSB0YWJsZSBvdmVyIGEgdGltZSBheGlzIChmb2xsb3dzR3JvdXBCeSkuIEEgdGltZSBheGlzXG4vLyBpcyB0aGUgd2hvbGUgcXVhbGlmaWNhdGlvbjogdGhlIGNvbnRyb2wgY2hhbmdlcyBpdHMgZ3JhaW4sIGFuZCBhIGNhdGVnb3J5XG4vLyBheGlzIGhhcyBubyBncmFpbiB0byBjaGFuZ2UuXG5leHBvcnQgZnVuY3Rpb24gaGFzR3JvdXBCeVRpbGUocmVwb3J0OiBSZXBvcnQgfCBudWxsKTogYm9vbGVhbiB7XG4gIHJldHVybiAocmVwb3J0Py5wYWdlcyA/PyBbXSkuc29tZSgocGFnZSkgPT4gKHBhZ2UuY29tcG9uZW50cyA/PyBbXSkuc29tZShmb2xsb3dzR3JvdXBCeSkpO1xufVxuXG4vLyBUaGUgZ3JhaW5zIHRoZSByZXBvcnQncyBncm91cC1ieSBjb250cm9sIG9mZmVycywgbmFtZWQgZm9yIHRoZSB2aWV3ZXIuIFdISUNIXG4vLyBvZiB0aGVtIGNvbWVzIGZyb20gdGhlIHJlcG9ydDsgaG93IHRoZXkgcmVhZCBjb21lcyBmcm9tIEdSQU5VTEFSSVRZX09QVElPTlMuXG4vLyBBbiBlbXB0eSBzdG9yZWQgbGlzdCBtZWFucyBldmVyeSBncmFpbiDigJQgdGhlIHNhbWUgcnVsZSB0aGUgYmFja2VuZCBhcHBsaWVzLlxuZnVuY3Rpb24gZ3JvdXBCeU9wdGlvbnMocmVwb3J0OiBSZXBvcnQpOiB7IHZhbHVlOiBDaGFydEdyYW51bGFyaXR5OyBuYW1lOiBzdHJpbmcgfVtdIHtcbiAgY29uc3QgZ3JhbnVsYXJpdGllcyA9IHJlcG9ydC5jb25maWc/Lmdyb3VwQnk/LmdyYW51bGFyaXRpZXMgPz8gW107XG5cbiAgcmV0dXJuIGdyYW51bGFyaXRpZXMubGVuZ3RoXG4gICAgPyBHUkFOVUxBUklUWV9PUFRJT05TLmZpbHRlcigob3B0aW9uKSA9PiBncmFudWxhcml0aWVzLmluY2x1ZGVzKG9wdGlvbi52YWx1ZSkpXG4gICAgOiBHUkFOVUxBUklUWV9PUFRJT05TO1xufVxuXG4vLyBXaGV0aGVyIGEgZ3JhaW4gaXMgb25lIHRoZSByZXBvcnQncyBjb250cm9sIHN0aWxsIG9mZmVycy4gQSBncmFpbiBpdCBkb2Vzbid0XG4vLyBjYW5ub3Qgc3RheSBpbiBlZmZlY3Q6IHRoZSBhZ2VudCBjYW4gbmFycm93IHRoZSBsaXN0IGF0IGFueSB0aW1lLCBhbmQgYSBjaGFydFxuLy8gbGVmdCBidWNrZXRpbmcgYXQgYSBkcm9wcGVkIGdyYWluIGlzIG9uZSB0aGUgdmlld2VyIGNhbiBuZWl0aGVyIHNlZSBub3IgY2hhbmdlLlxuZXhwb3J0IGZ1bmN0aW9uIGlzR3JhbnVsYXJpdHlPZmZlcmVkKHJlcG9ydDogUmVwb3J0LCBncmFudWxhcml0eTogQ2hhcnRHcmFudWxhcml0eSB8IG51bGwpOiBib29sZWFuIHtcbiAgcmV0dXJuICFncmFudWxhcml0eSB8fCBncm91cEJ5T3B0aW9ucyhyZXBvcnQpLnNvbWUoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlID09PSBncmFudWxhcml0eSk7XG59XG5cbi8vIFRoZSBmcy1maWx0ZXIgY29uZmlnIGl0ZW0gZm9yIHRoZSByZXBvcnQncyBncm91cC1ieSBjb250cm9sLCBvciBudWxsIHdoZW4gdGhlXG4vLyByZXBvcnQgaGFzIG5vbmUgdG8gc2hvdy5cbi8vXG4vLyBJdCBsZWFkcyB0aGUgc2FtZSBiYXIgdGhlIGZpbHRlcnMgcmVuZGVyIGluLCBidXQgaXQgaXMgTk9UIG9uZTogYSBmaWx0ZXJcbi8vIG5hcnJvd3MgV0hJQ0ggcm93cyBhcmUgY291bnRlZCwgdGhpcyBjaGFuZ2VzIGhvdyB0aGUgc3Vydml2aW5nIHJvd3MgYXJlXG4vLyBCVUNLRVRFRCDigJQgYW5kIGl0IGNvbWVzIGZpcnN0IGJlY2F1c2UgdGhlIGdyYWluIGlzIHdoYXQgYSB2aWV3ZXIgc2V0dGxlc1xuLy8gYmVmb3JlIGRlY2lkaW5nIHdoaWNoIHJvd3MgdGhleSB3YW50LlxuLy8gUGlja2luZyBhIGdyYWluIHNldHMgYSBzZXNzaW9uLXdpZGUgb3ZlcnJpZGUgdGhhdCByaWRlcyBhbG9uZyBpbiBlYWNoIGNoYXJ0J3Ncbi8vIGRhdGEgcmVxdWVzdCwgc28gdGhlIGNoYXJ0cyB0aGVtc2VsdmVzIGFyZSBuZXZlciByZXdyaXR0ZW4uXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBCeUZpbHRlckl0ZW0oXG4gIHJlcG9ydDogUmVwb3J0LFxuICBpbml0aWFsPzogQ2hhcnRHcmFudWxhcml0eSB8IG51bGwsXG4pOiBJRmlsdGVyQ29uZmlnSXRlbSB8IG51bGwge1xuICBjb25zdCBncm91cEJ5ID0gcmVwb3J0LmNvbmZpZz8uZ3JvdXBCeTtcblxuICAvLyBPbmx5IGFuIEVYUExJQ0lUIGZhbHNlIGhpZGVzIHRoZSBjb250cm9sLiBBbiBhYnNlbnQgYmxvY2sgbWVhbnMgYSByZXBvcnRcbiAgLy8gc2VydmVkIGJ5IGEgYnVpbGQgdGhhdCBwcmVkYXRlcyB0aGUgY29udHJvbCBiZWluZyBzdG9yZWQsIGFuZCBldmVyeSBvbmUgb2ZcbiAgLy8gdGhvc2UgaGFkIG9uZSDigJQgdGhlIGJhY2tlbmQgcmVzb2x2ZXMgaXQgdGhlIHNhbWUgd2F5IChSZXBvcnRHcm91cEJ5KS5cbiAgaWYgKGdyb3VwQnk/LmVuYWJsZWQgPT09IGZhbHNlIHx8ICFoYXNHcm91cEJ5VGlsZShyZXBvcnQpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB2YWx1ZXMgPSBncm91cEJ5T3B0aW9ucyhyZXBvcnQpO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogR1JPVVBfQllfSVRFTSxcbiAgICB0eXBlOiBJdGVtVHlwZS5TZWxlY3QsXG4gICAgbGFiZWw6IGdyb3VwQnk/LmxhYmVsIHx8ICdHcm91cCBCeScsXG4gICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgIHZhbHVlczogKCkgPT4gdmFsdWVzLFxuICAgIGRlZmF1bHQ6IGlzR3JhbnVsYXJpdHlPZmZlcmVkKHJlcG9ydCwgaW5pdGlhbCA/PyBudWxsKSA/IChpbml0aWFsID8/IHVuZGVmaW5lZCkgOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8vIFRoZSBncm91cC1ieSBjb250cm9sJ3MgY29udHJpYnV0aW9uIHRvIHRoZSB0b29sYmFyJ3MgZnMtZmlsdGVyIGtleS4gZnMtZmlsdGVyXG4vLyByZWFkcyBpdHMgY29uZmlnIG9uY2UgYXQgaW5pdCwgYW5kIHRoZSBhZ2VudCBjYW4gY2hhbmdlIHRoZSBjb250cm9sJ3MgbGFiZWxcbi8vIG9yIHRoZSBncmFpbnMgaXQgb2ZmZXJzIOKAlCB3aXRob3V0IHRob3NlIGluIHRoZSBrZXkgdGhlIGJhciBrZWVwcyByZW5kZXJpbmdcbi8vIHRoZSBjb250cm9sIGl0IHdhcyBjcmVhdGVkIHdpdGggdW50aWwgYSBmdWxsIHBhZ2UgcmVsb2FkLlxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwQnlTaWduYXR1cmUocmVwb3J0OiBSZXBvcnQgfCBudWxsKTogc3RyaW5nIHtcbiAgaWYgKCFyZXBvcnQgfHwgIWdyb3VwQnlGaWx0ZXJJdGVtKHJlcG9ydCkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBjb25zdCBncm91cEJ5ID0gcmVwb3J0LmNvbmZpZz8uZ3JvdXBCeTtcblxuICByZXR1cm4gWydncm91cEJ5JywgZ3JvdXBCeT8ubGFiZWwgPz8gJycsIChncm91cEJ5Py5ncmFudWxhcml0aWVzID8/IFtdKS5qb2luKCcsJyldLmpvaW4oJzonKTtcbn1cblxuLy8gUmVhZCBhbiBmcy1maWx0ZXIgY2hhbmdlIHF1ZXJ5IGludG8gcGVyLWdyb3VwIHZhbHVlcy4gUmV0dXJucyBvbmUgZW50cnkgcGVyXG4vLyBncm91cCB3aXRoIHRoZSB2YWx1ZSB0byBzdG9yZSAob3IgbnVsbCB0byBjbGVhcikg4oCUIGNhbGxlcnMgZmVlZCB0aGVzZSB0b1xuLy8gUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlLnNldFZhbHVlLlxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwVmFsdWVzRnJvbVF1ZXJ5KFxuICBxdWVyeTogUmVjb3JkPHN0cmluZywgYW55PixcbiAgZ3JvdXBzOiBSZXBvcnRGaWx0ZXJHcm91cFtdLFxuKTogeyBncm91cElkOiBudW1iZXI7IHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB9W10ge1xuICByZXR1cm4gZ3JvdXBzLm1hcCgoZ3JvdXApID0+IHtcbiAgICBjb25zdCBuYW1lID0gZ3JvdXBJdGVtTmFtZShncm91cCk7XG5cbiAgICBzd2l0Y2ggKGdyb3VwLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2RhdGVSYW5nZSc6XG4gICAgICAgIHJldHVybiB7IGdyb3VwSWQ6IGdyb3VwLmlkLCB2YWx1ZTogZGF0ZVJhbmdlRnJvbVF1ZXJ5KHF1ZXJ5LCBuYW1lKSB9O1xuXG4gICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICByZXR1cm4geyBncm91cElkOiBncm91cC5pZCwgdmFsdWU6IHNlbGVjdEZyb21RdWVyeShxdWVyeSwgbmFtZSkgfTtcblxuICAgICAgY2FzZSAnbnVtYmVyUmFuZ2UnOlxuICAgICAgICByZXR1cm4geyBncm91cElkOiBncm91cC5pZCwgdmFsdWU6IG51bWJlclJhbmdlRnJvbVF1ZXJ5KHF1ZXJ5LCBuYW1lKSB9O1xuXG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGNvbnN0IGtleXdvcmQgPSBTdHJpbmcocXVlcnlbbmFtZV0gPz8gJycpLnRyaW0oKTtcblxuICAgICAgICByZXR1cm4geyBncm91cElkOiBncm91cC5pZCwgdmFsdWU6IGtleXdvcmQgPyB7IHZhbHVlOiBrZXl3b3JkIH0gOiBudWxsIH07XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuLy8gQSBkYXRlIHJhbmdlJ3MgZGF5cyAoPG5hbWU+RnJvbSwgPG5hbWU+VG8pLlxuZnVuY3Rpb24gZGF0ZVJhbmdlRnJvbVF1ZXJ5KHF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBuYW1lOiBzdHJpbmcpOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB7XG4gIGNvbnN0IHN0YXJ0ID0gcXVlcnlbaXRlbVJhbmdlTmFtZShuYW1lLCAnZnJvbScpXTtcbiAgY29uc3QgZW5kID0gcXVlcnlbaXRlbVJhbmdlTmFtZShuYW1lLCAndG8nKV07XG5cbiAgaWYgKCFzdGFydCAmJiAhZW5kKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4geyBzdGFydDogc3RhcnQgfHwgbnVsbCwgZW5kOiBlbmQgfHwgbnVsbCB9O1xufVxuXG4vLyBBIHNlbGVjdCdzIHBpY2tzOiBrZXB0ICg8bmFtZT4pLCBvciBsZWZ0IG91dCB3aGlsZSBpdHMgZXhjbHVkZSByb3cgaXMgb25cbi8vIChleGNsdWRlPE5hbWU+KS5cbmZ1bmN0aW9uIHNlbGVjdEZyb21RdWVyeShxdWVyeTogUmVjb3JkPHN0cmluZywgYW55PiwgbmFtZTogc3RyaW5nKTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwge1xuICBjb25zdCBleGNsdWRlVmFsdWVzID0gc2VsZWN0UXVlcnlWYWx1ZXMocXVlcnlbZ2V0RXhjbHVkZU5hbWUobmFtZSldKTtcbiAgaWYgKGV4Y2x1ZGVWYWx1ZXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHsgZXhjbHVkZVZhbHVlcyB9O1xuICB9XG5cbiAgY29uc3QgdmFsdWVzID0gc2VsZWN0UXVlcnlWYWx1ZXMocXVlcnlbbmFtZV0pO1xuXG4gIHJldHVybiB2YWx1ZXMubGVuZ3RoID8geyB2YWx1ZXMgfSA6IG51bGw7XG59XG5cbi8vIEEgbnVtYmVyIHJhbmdlJ3MgZW5kcyAoPG5hbWU+TWluLCA8bmFtZT5NYXgpLiBBbiBlbmQgbGVmdCBlbXB0eSBpcyBvcGVuLlxuZnVuY3Rpb24gbnVtYmVyUmFuZ2VGcm9tUXVlcnkocXVlcnk6IFJlY29yZDxzdHJpbmcsIGFueT4sIG5hbWU6IHN0cmluZyk6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHtcbiAgY29uc3QgbWluID0gcmFuZ2VCb3VuZChxdWVyeVtpdGVtUmFuZ2VOYW1lKG5hbWUsICdtaW4nKV0pO1xuICBjb25zdCBtYXggPSByYW5nZUJvdW5kKHF1ZXJ5W2l0ZW1SYW5nZU5hbWUobmFtZSwgJ21heCcpXSk7XG5cbiAgaWYgKG1pbiA9PT0gbnVsbCAmJiBtYXggPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uKG1pbiAhPT0gbnVsbCA/IHsgbWluIH0gOiB7fSksXG4gICAgLi4uKG1heCAhPT0gbnVsbCA/IHsgbWF4IH0gOiB7fSksXG4gIH07XG59XG5cbi8vIE9uZSBlbmQgb2YgYSBudW1iZXIgcmFuZ2UgYXMgZnMtZmlsdGVyJ3MgUmFuZ2Ugc2VuZHMgaXQ6IHRoZSB0ZXh0IHR5cGVkIGluXG4vLyBpdHMgaW5wdXQuIE51bWJlcigpIHJlYWRzIGFueSBub24tZW1wdHkgdGV4dCwgc28gJzAnIGlzIHRoZSBlbmQgMDsgZW1wdHkgb3Jcbi8vIHVucmVhZGFibGUgdGV4dCBpcyBhbiBvcGVuIGVuZC5cbmZ1bmN0aW9uIHJhbmdlQm91bmQocmF3OiB1bmtub3duKTogbnVtYmVyIHwgbnVsbCB7XG4gIGNvbnN0IHRleHQgPSB0eXBlb2YgcmF3ID09PSAnbnVtYmVyJyA/IFN0cmluZyhyYXcpIDogU3RyaW5nKHJhdyA/PyAnJykudHJpbSgpO1xuICBjb25zdCBudW1iZXIgPSB0ZXh0ID09PSAnJyA/IE5hTiA6IE51bWJlcih0ZXh0KTtcblxuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKG51bWJlcikgPyBudW1iZXIgOiBudWxsO1xufVxuXG4vLyBBIGdyb3VwIHZhbHVlIGFzIHRleHQsIHRoZSBzYW1lIGZvciB0aGUgc2FtZSB2YWx1ZSB3aGF0ZXZlciBpdHMgc291cmNlOlxuLy8gZGF5cyBhcyBjYWxlbmRhciBkYXlzLCBwaWNrcyBhbmQgZW5kcyBhcyB0ZXh0LCBrZXl3b3JkIHRleHQgdHJpbW1lZC4gVGhlXG4vLyB2YWx1ZSBhIHRpbGUgaGVhZGVyIHdhcyBidWlsdCB3aXRoIGlzIGtleWVkIG9uIGl0LCBzbyBhIGhlYWRlciBpcyBjcmVhdGVkXG4vLyBhZ2FpbiB3aGVuIGFub3RoZXIgYmFyIGNoYW5nZXMgYSBncm91cCBpdCBzaG93cy5cbmV4cG9ydCBmdW5jdGlvbiBncm91cFZhbHVlU2lnbmF0dXJlKHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoW1xuICAgIGRhdGVCb3VuZFN0cmluZyh2YWx1ZS5zdGFydCkgPz8gJycsXG4gICAgZGF0ZUJvdW5kU3RyaW5nKHZhbHVlLmVuZCkgPz8gJycsXG4gICAgKHZhbHVlLnZhbHVlcyA/PyBbXSkubWFwKFN0cmluZyksXG4gICAgKHZhbHVlLmV4Y2x1ZGVWYWx1ZXMgPz8gW10pLm1hcChTdHJpbmcpLFxuICAgICh2YWx1ZS52YWx1ZSA/PyAnJykudHJpbSgpLFxuICAgIHZhbHVlLm1pbiA/PyAnJyxcbiAgICB2YWx1ZS5tYXggPz8gJycsXG4gIF0pO1xufVxuXG4vLyBmcy1maWx0ZXIncyBBdXRvQ29tcGxldGVDaGlwcyBzZXJpYWxpc2VzIGEgbXVsdGktc2VsZWN0IGludG8gT05FIHF1ZXJ5IHZhbHVlOlxuLy8gdGhlIHNlbGVjdGVkIHZhbHVlcyBqb2luZWQgYnkgXCIsXCIgKGl0cyBgcXVlcnlgIGdldHRlciBkb2VzIGAubWFwKHZhbHVlKS5qb2luKCcsJylgKS5cbi8vIFNvIGEgMisgc2VsZWN0aW9uIGFycml2ZXMgYXMgdGhlIHN0cmluZyBcImEsYlwiLCBub3QgYW4gYXJyYXkg4oCUIHNwbGl0dGluZyBvbiBcIixcIlxuLy8gcmV2ZXJzZXMgdGhhdCBmYWl0aGZ1bGx5LiBXaXRob3V0IHRoaXMsIGEgbXVsdGktc2VsZWN0IHdhcyBzZW50IGFzIHRoZSBzaW5nbGVcbi8vIHZhbHVlIFtcImEsYlwiXSwgcHJvZHVjaW5nIGBjb2wgSU4gKCdhLGInKWAgc2VydmVyLXNpZGUsIHdoaWNoIG1hdGNoZXMgbm90aGluZy5cbmZ1bmN0aW9uIHNlbGVjdFF1ZXJ5VmFsdWVzKHJhdzogdW5rbm93bik6IHVua25vd25bXSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHJhdykpIHtcbiAgICByZXR1cm4gcmF3O1xuICB9XG5cbiAgaWYgKHJhdyA9PT0gbnVsbCB8fCByYXcgPT09IHVuZGVmaW5lZCB8fCByYXcgPT09ICcnKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcmV0dXJuIFN0cmluZyhyYXcpLnNwbGl0KCcsJyk7XG59XG4iXX0=
|
|
@@ -1,7 +1,15 @@
|
|
|
1
|
-
// A table tile's layouts: the one its config authors,
|
|
2
|
-
//
|
|
3
|
-
import { canonicalGridLayout } from '@firestitch/grid';
|
|
1
|
+
// A table tile's layouts: the one its config authors, the canonical key two
|
|
2
|
+
// layouts are compared by, and a viewer's layout moved onto a new authored one.
|
|
3
|
+
import { GridGranularity, canonicalGridLayout, convertDateFilter, } from '@firestitch/grid';
|
|
4
4
|
const NO_LAYOUT = {};
|
|
5
|
+
// The report's grains by the grid's name for each.
|
|
6
|
+
export const GRID_GRANULARITIES = {
|
|
7
|
+
day: GridGranularity.Day,
|
|
8
|
+
week: GridGranularity.Week,
|
|
9
|
+
month: GridGranularity.Month,
|
|
10
|
+
quarter: GridGranularity.Quarter,
|
|
11
|
+
year: GridGranularity.Year,
|
|
12
|
+
};
|
|
5
13
|
// The layout a table tile's config authors, or none.
|
|
6
14
|
export function authoredGridLayout(component) {
|
|
7
15
|
return component.config?.layout ?? NO_LAYOUT;
|
|
@@ -11,4 +19,49 @@ export function authoredGridLayout(component) {
|
|
|
11
19
|
export function gridLayoutKey(layout) {
|
|
12
20
|
return JSON.stringify(canonicalGridLayout(layout));
|
|
13
21
|
}
|
|
14
|
-
|
|
22
|
+
// A viewer's layout moved onto the layout authored now, `base` being the key
|
|
23
|
+
// of the authored layout they started from: the new authored layout, with the
|
|
24
|
+
// viewer's own filters and sort (what `base` did not have) kept on the fields
|
|
25
|
+
// it still places. A field the viewer filters takes their filters in place of
|
|
26
|
+
// the authored ones, and a sort they changed replaces the authored sort.
|
|
27
|
+
export function rebasedGridLayout(session, base, authored) {
|
|
28
|
+
const started = JSON.parse(base);
|
|
29
|
+
const viewer = canonicalGridLayout(session);
|
|
30
|
+
const placed = new Set([
|
|
31
|
+
...(authored.rows ?? []),
|
|
32
|
+
...(authored.columns ?? []),
|
|
33
|
+
...(authored.values ?? []),
|
|
34
|
+
...(authored.details ?? []),
|
|
35
|
+
].map((placement) => placement.field));
|
|
36
|
+
const startedFilters = new Set((started.filters ?? []).map((filter) => JSON.stringify(filter)));
|
|
37
|
+
const filters = (viewer.filters ?? [])
|
|
38
|
+
.filter((filter) => placed.has(filter.field) && !startedFilters.has(JSON.stringify(filter)));
|
|
39
|
+
const filtered = new Set(filters.map((filter) => filter.field));
|
|
40
|
+
const sorted = JSON.stringify(viewer.sort ?? []) !== JSON.stringify(started.sort ?? []);
|
|
41
|
+
const sort = (viewer.sort ?? []).filter((term) => placed.has(term.field));
|
|
42
|
+
return canonicalGridLayout({
|
|
43
|
+
...authored,
|
|
44
|
+
filters: [...(authored.filters ?? []).filter((filter) => !filtered.has(filter.field)), ...filters],
|
|
45
|
+
sort: sorted && sort.length ? sort : authored.sort,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
// A table's layout once the grain `field` reads at moves to `granularity` (the
|
|
49
|
+
// report's group-by changed): its column filter on `field` converts to the
|
|
50
|
+
// same days at the new grain when its edges line up, and is taken out
|
|
51
|
+
// otherwise (convertDateFilter), so the read never sends a filter the field no
|
|
52
|
+
// longer offers. `cleared` names the filter taken out and the grain the table
|
|
53
|
+
// now groups by, as fs-grid's status line reads it. A layout with no filter on
|
|
54
|
+
// the field, or one already at the grain, comes back as it is.
|
|
55
|
+
export function grainedGridLayout(layout, field, granularity) {
|
|
56
|
+
const grain = GRID_GRANULARITIES[granularity];
|
|
57
|
+
const filter = (layout.filters ?? []).find((item) => item.field === field);
|
|
58
|
+
if (!filter || (filter.granularity ?? GridGranularity.Day) === grain) {
|
|
59
|
+
return { layout, cleared: null };
|
|
60
|
+
}
|
|
61
|
+
const converted = convertDateFilter(filter, grain);
|
|
62
|
+
const filters = (layout.filters ?? [])
|
|
63
|
+
.map((item) => (item === filter ? converted : item))
|
|
64
|
+
.filter((item) => !!item);
|
|
65
|
+
return { layout: { ...layout, filters }, cleared: converted ? null : { field, granularity: grain } };
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWdyaWQtbGF5b3V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL3JlcG9ydC1ncmlkLWxheW91dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw0RUFBNEU7QUFDNUUsZ0ZBQWdGO0FBQ2hGLE9BQU8sRUFDMEIsZUFBZSxFQUFjLG1CQUFtQixFQUFFLGlCQUFpQixHQUNuRyxNQUFNLGtCQUFrQixDQUFDO0FBSzFCLE1BQU0sU0FBUyxHQUFlLEVBQUUsQ0FBQztBQUVqQyxtREFBbUQ7QUFDbkQsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQThDO0lBQzNFLEdBQUcsRUFBRSxlQUFlLENBQUMsR0FBRztJQUN4QixJQUFJLEVBQUUsZUFBZSxDQUFDLElBQUk7SUFDMUIsS0FBSyxFQUFFLGVBQWUsQ0FBQyxLQUFLO0lBQzVCLE9BQU8sRUFBRSxlQUFlLENBQUMsT0FBTztJQUNoQyxJQUFJLEVBQUUsZUFBZSxDQUFDLElBQUk7Q0FDM0IsQ0FBQztBQUVGLHFEQUFxRDtBQUNyRCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsU0FBMEI7SUFDM0QsT0FBTyxTQUFTLENBQUMsTUFBTSxFQUFFLE1BQU0sSUFBSSxTQUFTLENBQUM7QUFDL0MsQ0FBQztBQUVELDBFQUEwRTtBQUMxRSwrREFBK0Q7QUFDL0QsTUFBTSxVQUFVLGFBQWEsQ0FBQyxNQUFrQjtJQUM5QyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUNyRCxDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLDhFQUE4RTtBQUM5RSw4RUFBOEU7QUFDOUUsOEVBQThFO0FBQzlFLHlFQUF5RTtBQUN6RSxNQUFNLFVBQVUsaUJBQWlCLENBQUMsT0FBbUIsRUFBRSxJQUFZLEVBQUUsUUFBb0I7SUFDdkYsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQWUsQ0FBQztJQUMvQyxNQUFNLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQztRQUNyQixHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7UUFDeEIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO1FBQzNCLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUMxQixHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7S0FDNUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hHLE1BQU0sT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7U0FDbkMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0YsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDaEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN4RixNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBRTFFLE9BQU8sbUJBQW1CLENBQUM7UUFDekIsR0FBRyxRQUFRO1FBQ1gsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFDbEcsSUFBSSxFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJO0tBQ25ELENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCwrRUFBK0U7QUFDL0UsMkVBQTJFO0FBQzNFLHNFQUFzRTtBQUN0RSwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSwrREFBK0Q7QUFDL0QsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixNQUFrQixFQUNsQixLQUFhLEVBQ2IsV0FBNkI7SUFFN0IsTUFBTSxLQUFLLEdBQUcsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDOUMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsQ0FBQztJQUMzRSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFBSSxlQUFlLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUM7UUFDckUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuRCxNQUFNLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO1NBQ25DLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ25ELE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBc0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVoRCxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsR0FBRyxNQUFNLEVBQUUsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztBQUN2RyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQSB0YWJsZSB0aWxlJ3MgbGF5b3V0czogdGhlIG9uZSBpdHMgY29uZmlnIGF1dGhvcnMsIHRoZSBjYW5vbmljYWwga2V5IHR3b1xuLy8gbGF5b3V0cyBhcmUgY29tcGFyZWQgYnksIGFuZCBhIHZpZXdlcidzIGxheW91dCBtb3ZlZCBvbnRvIGEgbmV3IGF1dGhvcmVkIG9uZS5cbmltcG9ydCB7XG4gIEdyaWRDbGVhcmVkRmlsdGVyLCBHcmlkRmlsdGVyLCBHcmlkR3JhbnVsYXJpdHksIEdyaWRMYXlvdXQsIGNhbm9uaWNhbEdyaWRMYXlvdXQsIGNvbnZlcnREYXRlRmlsdGVyLFxufSBmcm9tICdAZmlyZXN0aXRjaC9ncmlkJztcblxuaW1wb3J0IHsgQ2hhcnRHcmFudWxhcml0eSwgUmVwb3J0Q29tcG9uZW50IH0gZnJvbSAnLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuXG5cbmNvbnN0IE5PX0xBWU9VVDogR3JpZExheW91dCA9IHt9O1xuXG4vLyBUaGUgcmVwb3J0J3MgZ3JhaW5zIGJ5IHRoZSBncmlkJ3MgbmFtZSBmb3IgZWFjaC5cbmV4cG9ydCBjb25zdCBHUklEX0dSQU5VTEFSSVRJRVM6IFJlY29yZDxDaGFydEdyYW51bGFyaXR5LCBHcmlkR3JhbnVsYXJpdHk+ID0ge1xuICBkYXk6IEdyaWRHcmFudWxhcml0eS5EYXksXG4gIHdlZWs6IEdyaWRHcmFudWxhcml0eS5XZWVrLFxuICBtb250aDogR3JpZEdyYW51bGFyaXR5Lk1vbnRoLFxuICBxdWFydGVyOiBHcmlkR3JhbnVsYXJpdHkuUXVhcnRlcixcbiAgeWVhcjogR3JpZEdyYW51bGFyaXR5LlllYXIsXG59O1xuXG4vLyBUaGUgbGF5b3V0IGEgdGFibGUgdGlsZSdzIGNvbmZpZyBhdXRob3JzLCBvciBub25lLlxuZXhwb3J0IGZ1bmN0aW9uIGF1dGhvcmVkR3JpZExheW91dChjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IEdyaWRMYXlvdXQge1xuICByZXR1cm4gY29tcG9uZW50LmNvbmZpZz8ubGF5b3V0ID8/IE5PX0xBWU9VVDtcbn1cblxuLy8gQSBsYXlvdXQncyBjYW5vbmljYWwga2V5OiB0d28gbGF5b3V0cyB0aGF0IGRyYXcgdGhlIHNhbWUgdGFibGUgaGF2ZSB0aGVcbi8vIHNhbWUga2V5LCB3aGF0ZXZlciBvcmRlciBvciBkZWZhdWx0cyB0aGV5IHdlcmUgd3JpdHRlbiB3aXRoLlxuZXhwb3J0IGZ1bmN0aW9uIGdyaWRMYXlvdXRLZXkobGF5b3V0OiBHcmlkTGF5b3V0KTogc3RyaW5nIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGNhbm9uaWNhbEdyaWRMYXlvdXQobGF5b3V0KSk7XG59XG5cbi8vIEEgdmlld2VyJ3MgbGF5b3V0IG1vdmVkIG9udG8gdGhlIGxheW91dCBhdXRob3JlZCBub3csIGBiYXNlYCBiZWluZyB0aGUga2V5XG4vLyBvZiB0aGUgYXV0aG9yZWQgbGF5b3V0IHRoZXkgc3RhcnRlZCBmcm9tOiB0aGUgbmV3IGF1dGhvcmVkIGxheW91dCwgd2l0aCB0aGVcbi8vIHZpZXdlcidzIG93biBmaWx0ZXJzIGFuZCBzb3J0ICh3aGF0IGBiYXNlYCBkaWQgbm90IGhhdmUpIGtlcHQgb24gdGhlIGZpZWxkc1xuLy8gaXQgc3RpbGwgcGxhY2VzLiBBIGZpZWxkIHRoZSB2aWV3ZXIgZmlsdGVycyB0YWtlcyB0aGVpciBmaWx0ZXJzIGluIHBsYWNlIG9mXG4vLyB0aGUgYXV0aG9yZWQgb25lcywgYW5kIGEgc29ydCB0aGV5IGNoYW5nZWQgcmVwbGFjZXMgdGhlIGF1dGhvcmVkIHNvcnQuXG5leHBvcnQgZnVuY3Rpb24gcmViYXNlZEdyaWRMYXlvdXQoc2Vzc2lvbjogR3JpZExheW91dCwgYmFzZTogc3RyaW5nLCBhdXRob3JlZDogR3JpZExheW91dCk6IEdyaWRMYXlvdXQge1xuICBjb25zdCBzdGFydGVkID0gSlNPTi5wYXJzZShiYXNlKSBhcyBHcmlkTGF5b3V0O1xuICBjb25zdCB2aWV3ZXIgPSBjYW5vbmljYWxHcmlkTGF5b3V0KHNlc3Npb24pO1xuICBjb25zdCBwbGFjZWQgPSBuZXcgU2V0KFtcbiAgICAuLi4oYXV0aG9yZWQucm93cyA/PyBbXSksXG4gICAgLi4uKGF1dGhvcmVkLmNvbHVtbnMgPz8gW10pLFxuICAgIC4uLihhdXRob3JlZC52YWx1ZXMgPz8gW10pLFxuICAgIC4uLihhdXRob3JlZC5kZXRhaWxzID8/IFtdKSxcbiAgXS5tYXAoKHBsYWNlbWVudCkgPT4gcGxhY2VtZW50LmZpZWxkKSk7XG4gIGNvbnN0IHN0YXJ0ZWRGaWx0ZXJzID0gbmV3IFNldCgoc3RhcnRlZC5maWx0ZXJzID8/IFtdKS5tYXAoKGZpbHRlcikgPT4gSlNPTi5zdHJpbmdpZnkoZmlsdGVyKSkpO1xuICBjb25zdCBmaWx0ZXJzID0gKHZpZXdlci5maWx0ZXJzID8/IFtdKVxuICAgIC5maWx0ZXIoKGZpbHRlcikgPT4gcGxhY2VkLmhhcyhmaWx0ZXIuZmllbGQpICYmICFzdGFydGVkRmlsdGVycy5oYXMoSlNPTi5zdHJpbmdpZnkoZmlsdGVyKSkpO1xuICBjb25zdCBmaWx0ZXJlZCA9IG5ldyBTZXQoZmlsdGVycy5tYXAoKGZpbHRlcikgPT4gZmlsdGVyLmZpZWxkKSk7XG4gIGNvbnN0IHNvcnRlZCA9IEpTT04uc3RyaW5naWZ5KHZpZXdlci5zb3J0ID8/IFtdKSAhPT0gSlNPTi5zdHJpbmdpZnkoc3RhcnRlZC5zb3J0ID8/IFtdKTtcbiAgY29uc3Qgc29ydCA9ICh2aWV3ZXIuc29ydCA/PyBbXSkuZmlsdGVyKCh0ZXJtKSA9PiBwbGFjZWQuaGFzKHRlcm0uZmllbGQpKTtcblxuICByZXR1cm4gY2Fub25pY2FsR3JpZExheW91dCh7XG4gICAgLi4uYXV0aG9yZWQsXG4gICAgZmlsdGVyczogWy4uLihhdXRob3JlZC5maWx0ZXJzID8/IFtdKS5maWx0ZXIoKGZpbHRlcikgPT4gIWZpbHRlcmVkLmhhcyhmaWx0ZXIuZmllbGQpKSwgLi4uZmlsdGVyc10sXG4gICAgc29ydDogc29ydGVkICYmIHNvcnQubGVuZ3RoID8gc29ydCA6IGF1dGhvcmVkLnNvcnQsXG4gIH0pO1xufVxuXG4vLyBBIHRhYmxlJ3MgbGF5b3V0IG9uY2UgdGhlIGdyYWluIGBmaWVsZGAgcmVhZHMgYXQgbW92ZXMgdG8gYGdyYW51bGFyaXR5YCAodGhlXG4vLyByZXBvcnQncyBncm91cC1ieSBjaGFuZ2VkKTogaXRzIGNvbHVtbiBmaWx0ZXIgb24gYGZpZWxkYCBjb252ZXJ0cyB0byB0aGVcbi8vIHNhbWUgZGF5cyBhdCB0aGUgbmV3IGdyYWluIHdoZW4gaXRzIGVkZ2VzIGxpbmUgdXAsIGFuZCBpcyB0YWtlbiBvdXRcbi8vIG90aGVyd2lzZSAoY29udmVydERhdGVGaWx0ZXIpLCBzbyB0aGUgcmVhZCBuZXZlciBzZW5kcyBhIGZpbHRlciB0aGUgZmllbGQgbm9cbi8vIGxvbmdlciBvZmZlcnMuIGBjbGVhcmVkYCBuYW1lcyB0aGUgZmlsdGVyIHRha2VuIG91dCBhbmQgdGhlIGdyYWluIHRoZSB0YWJsZVxuLy8gbm93IGdyb3VwcyBieSwgYXMgZnMtZ3JpZCdzIHN0YXR1cyBsaW5lIHJlYWRzIGl0LiBBIGxheW91dCB3aXRoIG5vIGZpbHRlciBvblxuLy8gdGhlIGZpZWxkLCBvciBvbmUgYWxyZWFkeSBhdCB0aGUgZ3JhaW4sIGNvbWVzIGJhY2sgYXMgaXQgaXMuXG5leHBvcnQgZnVuY3Rpb24gZ3JhaW5lZEdyaWRMYXlvdXQoXG4gIGxheW91dDogR3JpZExheW91dCxcbiAgZmllbGQ6IHN0cmluZyxcbiAgZ3JhbnVsYXJpdHk6IENoYXJ0R3JhbnVsYXJpdHksXG4pOiB7IGxheW91dDogR3JpZExheW91dDsgY2xlYXJlZDogR3JpZENsZWFyZWRGaWx0ZXIgfCBudWxsIH0ge1xuICBjb25zdCBncmFpbiA9IEdSSURfR1JBTlVMQVJJVElFU1tncmFudWxhcml0eV07XG4gIGNvbnN0IGZpbHRlciA9IChsYXlvdXQuZmlsdGVycyA/PyBbXSkuZmluZCgoaXRlbSkgPT4gaXRlbS5maWVsZCA9PT0gZmllbGQpO1xuICBpZiAoIWZpbHRlciB8fCAoZmlsdGVyLmdyYW51bGFyaXR5ID8/IEdyaWRHcmFudWxhcml0eS5EYXkpID09PSBncmFpbikge1xuICAgIHJldHVybiB7IGxheW91dCwgY2xlYXJlZDogbnVsbCB9O1xuICB9XG5cbiAgY29uc3QgY29udmVydGVkID0gY29udmVydERhdGVGaWx0ZXIoZmlsdGVyLCBncmFpbik7XG4gIGNvbnN0IGZpbHRlcnMgPSAobGF5b3V0LmZpbHRlcnMgPz8gW10pXG4gICAgLm1hcCgoaXRlbSkgPT4gKGl0ZW0gPT09IGZpbHRlciA/IGNvbnZlcnRlZCA6IGl0ZW0pKVxuICAgIC5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIEdyaWRGaWx0ZXIgPT4gISFpdGVtKTtcblxuICByZXR1cm4geyBsYXlvdXQ6IHsgLi4ubGF5b3V0LCBmaWx0ZXJzIH0sIGNsZWFyZWQ6IGNvbnZlcnRlZCA/IG51bGwgOiB7IGZpZWxkLCBncmFudWxhcml0eTogZ3JhaW4gfSB9O1xufVxuIl19
|