@firestitch/report 18.7.0 → 18.8.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.
Files changed (64) hide show
  1. package/app/reports/components/component-kpi/component-kpi.component.d.ts +12 -3
  2. package/app/reports/components/component-kpi/components/sparkline/sparkline.component.d.ts +8 -0
  3. package/app/reports/components/component-list/component-list.component.d.ts +7 -1
  4. package/app/reports/components/component-note/component-note.component.d.ts +12 -0
  5. package/app/reports/components/report-canvas/report-canvas.component.d.ts +0 -9
  6. package/app/reports/components/report-component/report-component.component.d.ts +2 -11
  7. package/app/reports/data/report.data.d.ts +0 -2
  8. package/app/reports/dialogs/component-settings/component-settings.component.d.ts +34 -2
  9. package/app/reports/dialogs/report-settings/report-settings.component.d.ts +0 -1
  10. package/app/reports/enums/report-change-polarity.enum.d.ts +5 -0
  11. package/app/reports/enums/report-kpi-trend.enum.d.ts +5 -0
  12. package/app/reports/export/report-export-collector.service.d.ts +27 -1
  13. package/app/reports/export/report-pdf.service.d.ts +5 -0
  14. package/app/reports/export/report-pptx.service.d.ts +7 -0
  15. package/app/reports/format.d.ts +27 -1
  16. package/app/reports/interfaces/report-chat-viewer-filter.interface.d.ts +2 -0
  17. package/app/reports/interfaces/report.interface.d.ts +124 -4
  18. package/app/reports/kpi-card.d.ts +48 -0
  19. package/app/reports/layout.d.ts +0 -9
  20. package/app/reports/list-config.d.ts +8 -1
  21. package/app/reports/option-builder.d.ts +7 -0
  22. package/app/reports/output-notes.d.ts +14 -0
  23. package/app/reports/pipes/report-output.pipe.d.ts +10 -0
  24. package/app/reports/services/report-filter-state.service.d.ts +1 -0
  25. package/app/reports/theme/palette.d.ts +3 -0
  26. package/app/reports/theme/typography.d.ts +1 -0
  27. package/esm2022/app/reports/components/component-chart/component-chart.component.mjs +8 -4
  28. package/esm2022/app/reports/components/component-kpi/component-kpi.component.mjs +50 -17
  29. package/esm2022/app/reports/components/component-kpi/components/sparkline/sparkline.component.mjs +19 -0
  30. package/esm2022/app/reports/components/component-list/component-list.component.mjs +66 -6
  31. package/esm2022/app/reports/components/component-note/component-note.component.mjs +30 -0
  32. package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +7 -56
  33. package/esm2022/app/reports/components/report-component/report-component.component.mjs +21 -82
  34. package/esm2022/app/reports/data/report.data.mjs +5 -5
  35. package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +133 -13
  36. package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +4 -8
  37. package/esm2022/app/reports/enums/report-change-polarity.enum.mjs +11 -0
  38. package/esm2022/app/reports/enums/report-kpi-trend.enum.mjs +10 -0
  39. package/esm2022/app/reports/export/report-export-collector.service.mjs +101 -10
  40. package/esm2022/app/reports/export/report-pdf.service.mjs +249 -40
  41. package/esm2022/app/reports/export/report-pptx.service.mjs +312 -49
  42. package/esm2022/app/reports/format.mjs +423 -2
  43. package/esm2022/app/reports/interfaces/report-chat-viewer-filter.interface.mjs +1 -1
  44. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  45. package/esm2022/app/reports/kpi-card.mjs +174 -0
  46. package/esm2022/app/reports/layout.mjs +1 -46
  47. package/esm2022/app/reports/list-config.mjs +33 -1
  48. package/esm2022/app/reports/option-builder.mjs +624 -54
  49. package/esm2022/app/reports/output-notes.mjs +158 -0
  50. package/esm2022/app/reports/pipes/report-output.pipe.mjs +28 -0
  51. package/esm2022/app/reports/services/report-filter-state.service.mjs +40 -3
  52. package/esm2022/app/reports/theme/palette.mjs +17 -1
  53. package/esm2022/app/reports/theme/typography.mjs +5 -1
  54. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +2 -2
  55. package/esm2022/app/reports/views/report/report.component.mjs +3 -4
  56. package/esm2022/public_api.mjs +2 -1
  57. package/fesm2022/{firestitch-report-echarts-u5ImuZT5.mjs → firestitch-report-echarts-qCBE3LqM.mjs} +2 -2
  58. package/fesm2022/{firestitch-report-echarts-u5ImuZT5.mjs.map → firestitch-report-echarts-qCBE3LqM.mjs.map} +1 -1
  59. package/fesm2022/{firestitch-report-firestitch-report-Cz-kA_id.mjs → firestitch-report-firestitch-report-DbsWbE-j.mjs} +2574 -487
  60. package/fesm2022/firestitch-report-firestitch-report-DbsWbE-j.mjs.map +1 -0
  61. package/fesm2022/firestitch-report.mjs +1 -1
  62. package/package.json +1 -1
  63. package/public_api.d.ts +1 -0
  64. package/fesm2022/firestitch-report-firestitch-report-Cz-kA_id.mjs.map +0 -1
@@ -9,6 +9,25 @@ import { listHiddenColumns, listSortTerms } from '../list-config';
9
9
  import { dateBoundString, LIST_SEARCH_MAX_LENGTH } from '../report-filter-items';
10
10
  import { decodeColumnList, decodeFilterValue, decodeSort } from '../report-url-state';
11
11
  import * as i0 from "@angular/core";
12
+ // Every relative range name the server knows. A record rather than a list, so
13
+ // the build fails when ReportRelativeRange gains a name this misses.
14
+ const RELATIVE_RANGES = {
15
+ thisWeek: true,
16
+ lastWeek: true,
17
+ last7Days: true,
18
+ last30Days: true,
19
+ last3Months: true,
20
+ last6Months: true,
21
+ last12Months: true,
22
+ thisMonth: true,
23
+ thisQuarter: true,
24
+ thisYear: true,
25
+ yearToDate: true,
26
+ };
27
+ // Whether a stored preset name is one the server resolves (ReportRelativeRange).
28
+ function isRelativeRange(name) {
29
+ return Object.prototype.hasOwnProperty.call(RELATIVE_RANGES, name);
30
+ }
12
31
  // Whether two stored filter-group defaults are the same. Compared on the fields a
13
32
  // default can actually carry, so key order in the payload can't read as a change.
14
33
  export function sameDefault(a, b) {
@@ -443,16 +462,23 @@ export class ReportFilterStateService {
443
462
  }
444
463
  // A group value as the fields a request carries: date bounds as calendar
445
464
  // days, select values when any are picked, keyword text trimmed. Null when
446
- // all of them are empty. The preset name is URL state only, so it is left
447
- // behind.
465
+ // all of them are empty. A date range also names the relative range it
466
+ // still is (_livePreset), so the server knows which period the days cover;
467
+ // the days stay the window either way. Component data, the report and page
468
+ // exports and the chat's viewer filters all read their fields here, so all
469
+ // three carry it.
448
470
  _resolvedFields(value) {
449
471
  const fields = {};
472
+ const preset = this._livePreset(value);
450
473
  if (value.start) {
451
474
  fields.start = dateBoundString(value.start);
452
475
  }
453
476
  if (value.end) {
454
477
  fields.end = dateBoundString(value.end);
455
478
  }
479
+ if (preset) {
480
+ fields.preset = preset;
481
+ }
456
482
  if (value.values?.length) {
457
483
  fields.values = value.values;
458
484
  }
@@ -463,6 +489,17 @@ export class ReportFilterStateService {
463
489
  ? fields
464
490
  : null;
465
491
  }
492
+ // The relative range a date value still is: the preset name it carries,
493
+ // while its days are that range resolved today in the report's zone. A
494
+ // value whose days the viewer changed, or one seeded before midnight that
495
+ // is now a day behind, names none, and the server reads its days alone.
496
+ _livePreset(value) {
497
+ if (!value.preset || !isRelativeRange(value.preset)) {
498
+ return null;
499
+ }
500
+ const range = this._relativeRange(value.preset);
501
+ return range && sameDays(value, range) ? value.preset : null;
502
+ }
466
503
  // Seeds one group on (re)load; see init(). `previous` is the group as the
467
504
  // last load had it, or null when it is new.
468
505
  _seed(group, previous, timezoneChanged) {
@@ -739,4 +776,4 @@ export class ReportFilterStateService {
739
776
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportFilterStateService, decorators: [{
740
777
  type: Injectable
741
778
  }] });
742
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxJQUFJLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpELE9BQU8sRUFDTCxTQUFTLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUNqRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsR0FDN0IsTUFBTSxVQUFVLENBQUM7QUFFbEIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDcEUsT0FBTyxFQUNMLHNCQUFzQixFQUFFLFdBQVcsRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsR0FDakYsTUFBTSxXQUFXLENBQUM7QUFFbkIsT0FBTyxFQUlMLG1CQUFtQixHQVNwQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDOztBQUd0RixrRkFBa0Y7QUFDbEYsa0ZBQWtGO0FBQ2xGLE1BQU0sVUFBVSxXQUFXLENBQ3pCLENBQTRCLEVBQzVCLENBQTRCO0lBRTVCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVB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QUssWUFBWTtnQkFDZixPQUFPLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDL0M7Z0JBQ0UsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztJQUNILENBQUM7d0dBcnZCVSx3QkFBd0I7NEdBQXhCLHdCQUF3Qjs7NEZBQXhCLHdCQUF3QjtrQkFEcEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIGZpbHRlciBhcyByeEZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtcbiAgZW5kT2ZXZWVrLCBzdGFydE9mTW9udGgsIHN0YXJ0T2ZRdWFydGVyLCBzdGFydE9mV2Vlaywgc3RhcnRPZlllYXIsXG4gIHN1YkRheXMsIHN1Yk1vbnRocywgc3ViV2Vla3MsXG59IGZyb20gJ2RhdGUtZm5zJztcblxuaW1wb3J0IHsgUkVQT1JUX1dFRUtfU1RBUlRTX09OIH0gZnJvbSAnLi4vY29uc3RzL3JlcG9ydC13ZWVrLmNvbnN0JztcbmltcG9ydCB7XG4gIERFRkFVTFRfRk9STUFUX0NPTlRFWFQsIGdldFpvbmVkTm93LCByZXNvbHZlRm9ybWF0Q29udGV4dCwgcmVzb2x2ZVJlcG9ydFRpbWV6b25lLFxufSBmcm9tICcuLi9mb3JtYXQnO1xuaW1wb3J0IHsgUmVwb3J0Q2hhdFZpZXdlckZpbHRlciB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LWNoYXQtdmlld2VyLWZpbHRlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHtcbiAgQ2hhcnRHcmFudWxhcml0eSxcbiAgRmlsdGVyR3JvdXBEZWZhdWx0LFxuICBGaWx0ZXJHcm91cFZhbHVlLFxuICBHUkFOVUxBUklUWV9PUFRJT05TLFxuICBSZXBvcnQsXG4gIFJlcG9ydENvbXBvbmVudCxcbiAgUmVwb3J0RmlsdGVyR3JvdXAsXG4gIFJlcG9ydEZvcm1hdENvbnRleHQsXG4gIFJlcG9ydFNvcnQsXG4gIFJlcG9ydFVybFBhcmFtcyxcbiAgUmVwb3J0VXJsU25hcHNob3QsXG4gIFJlc29sdmVkRmlsdGVyVmFsdWUsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBsaXN0SGlkZGVuQ29sdW1ucywgbGlzdFNvcnRUZXJtcyB9IGZyb20gJy4uL2xpc3QtY29uZmlnJztcbmltcG9ydCB7IGRhdGVCb3VuZFN0cmluZywgTElTVF9TRUFSQ0hfTUFYX0xFTkdUSCB9IGZyb20gJy4uL3JlcG9ydC1maWx0ZXItaXRlbXMnO1xuaW1wb3J0IHsgZGVjb2RlQ29sdW1uTGlzdCwgZGVjb2RlRmlsdGVyVmFsdWUsIGRlY29kZVNvcnQgfSBmcm9tICcuLi9yZXBvcnQtdXJsLXN0YXRlJztcblxuXG4vLyBXaGV0aGVyIHR3byBzdG9yZWQgZmlsdGVyLWdyb3VwIGRlZmF1bHRzIGFyZSB0aGUgc2FtZS4gQ29tcGFyZWQgb24gdGhlIGZpZWxkcyBhXG4vLyBkZWZhdWx0IGNhbiBhY3R1YWxseSBjYXJyeSwgc28ga2V5IG9yZGVyIGluIHRoZSBwYXlsb2FkIGNhbid0IHJlYWQgYXMgYSBjaGFuZ2UuXG5leHBvcnQgZnVuY3Rpb24gc2FtZURlZmF1bHQoXG4gIGE6IEZpbHRlckdyb3VwRGVmYXVsdCB8IG51bGwsXG4gIGI6IEZpbHRlckdyb3VwRGVmYXVsdCB8IG51bGwsXG4pOiBib29sZWFuIHtcbiAgaWYgKCFhIHx8ICFiKSB7XG4gICAgcmV0dXJuICFhICYmICFiO1xuICB9XG5cbiAgcmV0dXJuIGEuc3RhcnQgPT09IGIuc3RhcnRcbiAgICAmJiBhLmVuZCA9PT0gYi5lbmRcbiAgICAmJiBhLnZhbHVlID09PSBiLnZhbHVlXG4gICAgJiYgYS5yZWxhdGl2ZSA9PT0gYi5yZWxhdGl2ZVxuICAgICYmIChhLnZhbHVlcyA/PyBbXSkubGVuZ3RoID09PSAoYi52YWx1ZXMgPz8gW10pLmxlbmd0aFxuICAgICYmIChhLnZhbHVlcyA/PyBbXSkuZXZlcnkoKHZhbHVlLCBpbmRleCkgPT4gdmFsdWUgPT09IChiLnZhbHVlcyA/PyBbXSlbaW5kZXhdKTtcbn1cblxuXG4vLyBXaGV0aGVyIHR3byBsaXN0IHNvcnRzIG9yZGVyIHRoZSByb3dzIHRoZSBzYW1lIHdheS4gTm8gZGlyZWN0aW9uIHJlYWRzIGFzXG4vLyBhc2NlbmRpbmcsIHRoZSB3YXkgdGhlIGxpc3QgYXBwbGllcyBpdC5cbmZ1bmN0aW9uIHNhbWVTb3J0KGE6IFJlcG9ydFNvcnQsIGI6IFJlcG9ydFNvcnQgfCBudWxsKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWJcbiAgICAmJiBhLmNvbHVtbiA9PT0gYi5jb2x1bW5cbiAgICAmJiAoYS5kaXJlY3Rpb24gPz8gJ2FzYycpID09PSAoYi5kaXJlY3Rpb24gPz8gJ2FzYycpO1xufVxuXG5cbi8vIFdoZXRoZXIgYSB2YWx1ZSByZWFkIG9mZiBhIGZpbHRlciBiYXIgaXMgdGhlIHZhbHVlIGFscmVhZHkgc3RvcmVkIGZvciBpdHNcbi8vIGdyb3VwOiB0aGUgc2FtZSBjYWxlbmRhciBkYXlzLCB0aGUgc2FtZSBzZWxlY3QgdmFsdWVzIGluIHRoZSBzYW1lIG9yZGVyIGFuZFxuLy8gdGhlIHNhbWUgdHJpbW1lZCB0ZXh0LiBBIGJhciByZS1yZWFkcyBldmVyeSBncm91cCBpdCBzaG93cyBvbiBhbnkgY2hhbmdlLCBzb1xuLy8gdGhpcyBpcyB3aGF0IHRlbGxzIHRoZSBncm91cCB0aGF0IGNoYW5nZWQgZnJvbSB0aGUgb25lcyB0aGF0IGRpZCBub3QuXG5leHBvcnQgZnVuY3Rpb24gc2FtZUZpbHRlclZhbHVlKFxuICBhOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgYjogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwgfCB1bmRlZmluZWQsXG4pOiBib29sZWFuIHtcbiAgaWYgKCFhIHx8ICFiKSB7XG4gICAgcmV0dXJuICFhICYmICFiO1xuICB9XG5cbiAgY29uc3QgdmFsdWVzID0gKHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlKSA9PiAodmFsdWUudmFsdWVzID8/IFtdKS5tYXAoU3RyaW5nKTtcblxuICByZXR1cm4gc2FtZURheXMoYSwgYilcbiAgICAmJiB2YWx1ZXMoYSkuam9pbignXFx1MDAwMCcpID09PSB2YWx1ZXMoYikuam9pbignXFx1MDAwMCcpXG4gICAgJiYgdmFsdWVzKGEpLmxlbmd0aCA9PT0gdmFsdWVzKGIpLmxlbmd0aFxuICAgICYmIChhLnZhbHVlID8/ICcnKS50cmltKCkgPT09IChiLnZhbHVlID8/ICcnKS50cmltKCk7XG59XG5cblxuLy8gVGhlIGdyb3VwcyBhIGJhciByZS1yZWFkIHRoYXQgaXQgbm93IHNob3dzIHdpdGggYSB2YWx1ZSBvdGhlciB0aGFuIHRoZSBvbmVcbi8vIGl0IGxhc3QgcmVwb3J0ZWQsIHJlY29yZGluZyBlYWNoIG5ldyB2YWx1ZSBpbiBgbGFzdFJlcG9ydGVkYC4gQSBiYXIgaXNcbi8vIGNvbXBhcmVkIHdpdGggaXRzZWxmLCBuZXZlciB3aXRoIHRoZSBzdG9yZWQgdmFsdWU6IGEgZ3JvdXAgc2hvd24gaW4gdHdvIGJhcnNcbi8vIChsZXZlbCAnYm90aCcpIGNhbiBiZSBjaGFuZ2VkIGluIHRoZSBvdGhlciBvbmUsIGFuZCB0aGlzIGJhciBpcyBub3Rcbi8vIHJlcGFpbnRlZCwgc28gaXRzIHN0YWxlIHZhbHVlIG11c3Qgbm90IGJlIHNldCBiYWNrIHdoZW4gdGhlIHZpZXdlciBjaGFuZ2VzXG4vLyBhbm90aGVyIG9mIGl0cyBpdGVtcyAodGhlIGxpc3Qgc2VhcmNoIGJveCwgc2F5KS5cbmV4cG9ydCBmdW5jdGlvbiBtb3ZlZEdyb3VwVmFsdWVzKFxuICBsYXN0UmVwb3J0ZWQ6IE1hcDxudW1iZXIsIEZpbHRlckdyb3VwVmFsdWUgfCBudWxsPixcbiAgcmVwb3J0ZWQ6IHsgZ3JvdXBJZDogbnVtYmVyOyB2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwgfVtdLFxuKTogeyBncm91cElkOiBudW1iZXI7IHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB9W10ge1xuICByZXR1cm4gcmVwb3J0ZWQuZmlsdGVyKCh7IGdyb3VwSWQsIHZhbHVlIH0pID0+IHtcbiAgICBpZiAoc2FtZUZpbHRlclZhbHVlKGxhc3RSZXBvcnRlZC5nZXQoZ3JvdXBJZCksIHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxhc3RSZXBvcnRlZC5zZXQoZ3JvdXBJZCwgdmFsdWUpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xufVxuXG5cbi8vIEEgbGlzdCdzIHNlYXJjaCB0ZXh0IGFzIHRoZSBzZXJ2ZXIgYXBwbGllcyBpdDogdHJpbW1lZCwgdGhlbiBjdXQgdG9cbi8vIExJU1RfU0VBUkNIX01BWF9MRU5HVEggY2hhcmFjdGVycyAoY29kZSBwb2ludHMsIGFzIHRoZSBzZXJ2ZXIgY291bnRzIHRoZW0pLlxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RTZWFyY2hUZXh0KHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBbLi4udGV4dC50cmltKCldLnNsaWNlKDAsIExJU1RfU0VBUkNIX01BWF9MRU5HVEgpLmpvaW4oJycpO1xufVxuXG5cbi8vIFdoZXRoZXIgdHdvIGxpc3RzIG9mIGNvbHVtbiBuYW1lcyBhcmUgdGhlIHNhbWUgbmFtZXMgaW4gdGhlIHNhbWUgb3JkZXIuXG5mdW5jdGlvbiBzYW1lTmFtZXMoYTogcmVhZG9ubHkgc3RyaW5nW10sIGI6IHJlYWRvbmx5IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIHJldHVybiBhLmxlbmd0aCA9PT0gYi5sZW5ndGggJiYgYS5ldmVyeSgobmFtZSwgaW5kZXgpID0+IG5hbWUgPT09IGJbaW5kZXhdKTtcbn1cblxuXG4vLyBXaGV0aGVyIHR3byBoaWRkZW4tY29sdW1uIG1hcHMgaGlkZSB0aGUgc2FtZSBjb2x1bW5zIG9uIHRoZSBzYW1lIGxpc3RzLlxuZnVuY3Rpb24gc2FtZUhpZGRlbihcbiAgYTogUmVhZG9ubHlNYXA8bnVtYmVyLCByZWFkb25seSBzdHJpbmdbXT4sXG4gIGI6IFJlYWRvbmx5TWFwPG51bWJlciwgcmVhZG9ubHkgc3RyaW5nW10+LFxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBhLnNpemUgPT09IGIuc2l6ZVxuICAgICYmIFsuLi5hXS5ldmVyeSgoW2NvbXBvbmVudElkLCBuYW1lc10pID0+IHNhbWVOYW1lcyhuYW1lcywgYi5nZXQoY29tcG9uZW50SWQpID8/IFtdKSk7XG59XG5cblxuLy8gV2hldGhlciB0d28gZGF0ZS1yYW5nZSB2YWx1ZXMgY292ZXIgdGhlIHNhbWUgY2FsZW5kYXIgZGF5cy5cbmZ1bmN0aW9uIHNhbWVEYXlzKGE6IEZpbHRlckdyb3VwVmFsdWUsIGI6IEZpbHRlckdyb3VwVmFsdWUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGRhdGVCb3VuZFN0cmluZyhhLnN0YXJ0KSA9PT0gZGF0ZUJvdW5kU3RyaW5nKGIuc3RhcnQpXG4gICAgJiYgZGF0ZUJvdW5kU3RyaW5nKGEuZW5kKSA9PT0gZGF0ZUJvdW5kU3RyaW5nKGIuZW5kKTtcbn1cblxuXG4vLyBBIHN0YWJsZSBzaWduYXR1cmUgZm9yIGEgZ3JvdXAncyBzdG9yZWQgZGVmYXVsdC4gVGhlIHJlcG9ydCB0b29sYmFyIGtleXMgaXRzXG4vLyBmcy1maWx0ZXIgb24gdGhpcywgYmVjYXVzZSBmcy1maWx0ZXIgcmVhZHMgaXRzIGNvbmZpZyBvbmNlIGF0IGluaXQg4oCUIHdpdGhvdXQgYVxuLy8ga2V5IGNoYW5nZSBpdCBrZWVwcyByZW5kZXJpbmcgdGhlIHZhbHVlcyBpdCB3YXMgY3JlYXRlZCB3aXRoIGV2ZW4gYWZ0ZXIgdGhlXG4vLyBjb25maWcgYmVoaW5kIGl0IGhhcyBiZWVuIHJlYnVpbHQuXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdFNpZ25hdHVyZShncm91cDogUmVwb3J0RmlsdGVyR3JvdXApOiBzdHJpbmcge1xuICBjb25zdCBncm91cERlZmF1bHQgPSBncm91cC5jb25maWc/LmRlZmF1bHQ7XG5cbiAgaWYgKCFncm91cERlZmF1bHQpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICByZXR1cm4gW1xuICAgIGdyb3VwRGVmYXVsdC5zdGFydCA/PyAnJyxcbiAgICBncm91cERlZmF1bHQuZW5kID8/ICcnLFxuICAgIGdyb3VwRGVmYXVsdC52YWx1ZSA/PyAnJyxcbiAgICBncm91cERlZmF1bHQucmVsYXRpdmUgPz8gJycsXG4gICAgKGdyb3VwRGVmYXVsdC52YWx1ZXMgPz8gW10pLmpvaW4oJywnKSxcbiAgXS5qb2luKCd+Jyk7XG59XG5cblxuLy8gVmlld2VyIGZpbHRlciBzdGF0ZSBmb3IgdGhlIG9wZW4gcmVwb3J0LiBGaWx0ZXIgVkFMVUVTIGFyZSBuZXZlciBzYXZlZCB0b1xuLy8gdGhlIHJlcG9ydCDigJQgdGhpcyBzZXJ2aWNlIGhvbGRzIHRoZW0gcGVyIGZpbHRlciBHUk9VUCAodGhlIHByb3BhZ2F0aW9uIHVuaXQpLFxuLy8gcmVzb2x2ZXMgdGhlbSBpbnRvIHBlci1jb21wb25lbnQgbWVtYmVyLWZpbHRlciB2YWx1ZXMgZm9yIGVhY2ggZGF0YSByZXF1ZXN0LFxuLy8gYW5kIG5vdGlmaWVzIHRoZSBjb21wb25lbnRzIHdob3NlIGdyb3VwcyBjaGFuZ2VkIHNvIG9ubHkgdGhleSByZWZldGNoLlxuLy9cbi8vIEl0IGlzIGFsc28gdGhlIG9uZSBzb3VyY2Ugb2YgdGhlIHZpZXdlciBzdGF0ZSB0aGUgcmVwb3J0IFVSTCBjYXJyaWVzIChncm91cFxuLy8gdmFsdWVzLCB0aGUgZ3JvdXAtYnkgZ3JhaW4sIGxpc3Qgc29ydHMsIHNlYXJjaGVzIGFuZCBoaWRkZW4gY29sdW1ucyk6XG4vLyB1cmxTbmFwc2hvdCgpIHNheXMgd2hhdCBkaWZmZXJzIGZyb20gdGhlIGF1dGhvcmVkIGRlZmF1bHRzLCBpbml0KCkgcmVzdG9yZXNcbi8vIGl0LCBhbmQgdXJsQ2hhbmdlcygpIHRlbGxzIHRoZSBob3N0J3Mgc2luZ2xlIFVSTCB3cml0ZXIgd2hlbiB0byB3cml0ZS5cbi8vXG4vLyBTZXNzaW9uLW9ubHksIG5ldmVyIGluIHRoZSBVUkw6IHBlci1maWx0ZXIgZW5hYmxlL2Rpc2FibGUgdG9nZ2xlcyBmcm9tIGFcbi8vIGNvbXBvbmVudCdzIGZpbHRlciBtZW51ICh0aGUgYGVuYWJsZWRgIGNvbHVtbiBpcyB0aGUgYXV0aG9yZWQgZGVmYXVsdDsgYVxuLy8gdmlld2VyJ3MgdG9nZ2xlIHNob3VsZG4ndCB3cml0ZSB0byB0aGUgcmVwb3J0KS5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2Uge1xuXG4gIC8vIFRoZSBvcGVuIHJlcG9ydCdzIGVmZmVjdGl2ZSB6b25lIChyZXNvbHZlUmVwb3J0VGltZXpvbmUpLiBSZWxhdGl2ZSBwcmVzZXRzXG4gIC8vIHJlc29sdmUgYWdhaW5zdCB0b2RheSBpbiBpdCwgYW5kIGRhdGUgY2VsbHMgcmVuZGVyIGluIGl0LlxuICBwdWJsaWMgcmVhZG9ubHkgdGltZXpvbmUgPSBzaWduYWw8c3RyaW5nPignVVRDJyk7XG5cbiAgLy8gSG93IHRoZSBvcGVuIHJlcG9ydCB3cml0ZXMgaXRzIG51bWJlcnMgYW5kIGRhdGVzIChyZXNvbHZlRm9ybWF0Q29udGV4dCk6XG4gIC8vIGl0cyBsb2NhbGUsIGl0cyBjdXJyZW5jeSBhbmQgd2hldGhlciBwZXJjZW50cyBhcnJpdmUgYXMgcmF0aW9zLiBFdmVyeSBLUEksXG4gIC8vIGNoYXJ0LCBkYXRlIGNlbGwgYW5kIGV4cG9ydCByZWFkcyBpdCBoZXJlLiBDb21wYXJlZCBieSB2YWx1ZSwgc28gYSByZWxvYWRcbiAgLy8gb2YgYW4gdW5jaGFuZ2VkIHJlcG9ydCByZS1yZW5kZXJzIG5vdGhpbmcuXG4gIHB1YmxpYyByZWFkb25seSBmb3JtYXRDb250ZXh0ID0gc2lnbmFsPFJlcG9ydEZvcm1hdENvbnRleHQ+KERFRkFVTFRfRk9STUFUX0NPTlRFWFQsIHtcbiAgICBlcXVhbDogKGEsIGIpID0+IGEubG9jYWxlID09PSBiLmxvY2FsZVxuICAgICAgJiYgYS5jdXJyZW5jeSA9PT0gYi5jdXJyZW5jeVxuICAgICAgJiYgYS5yYXRpb1BlcmNlbnQgPT09IGIucmF0aW9QZXJjZW50LFxuICB9KTtcblxuICAvLyBUaGUgY29uZmlnIGNvbHVtbnMgYSB2aWV3ZXIgaGlkIG9uIGVhY2ggcGxhaW4gbGlzdCAobGlzdEhpZGRlbkNvbHVtbnMpLFxuICAvLyBieSBjb21wb25lbnQgaWQ7IGEgbGlzdCBzaG93aW5nIGV2ZXJ5IGNvbHVtbiBoYXMgbm8gZW50cnkuIEEgc2lnbmFsLCBzbyBhXG4gIC8vIGxpc3QgaGlkZXMgYW5kIHNob3dzIGl0cyBjb2x1bW5zIGluIHBsYWNlOiB0aGUgcm93cyBkbyBub3QgY2hhbmdlLCBzb1xuICAvLyBub3RoaW5nIHJlZmV0Y2hlcy4gQ29tcGFyZWQgYnkgdmFsdWUsIHNvIGEgcmVsb2FkIHRoYXQga2VlcHMgZXZlcnkgY29sdW1uXG4gIC8vIHJlcGFpbnRzIG5vdGhpbmcuXG4gIHB1YmxpYyByZWFkb25seSBsaXN0SGlkZGVuID0gc2lnbmFsPFJlYWRvbmx5TWFwPG51bWJlciwgcmVhZG9ubHkgc3RyaW5nW10+PihuZXcgTWFwKCksIHtcbiAgICBlcXVhbDogc2FtZUhpZGRlbixcbiAgfSk7XG5cbiAgcHJpdmF0ZSBfdmFsdWVzID0gbmV3IE1hcDxudW1iZXIsIEZpbHRlckdyb3VwVmFsdWU+KCk7XG4gIHByaXZhdGUgX2dyb3VwcyA9IG5ldyBNYXA8bnVtYmVyLCBSZXBvcnRGaWx0ZXJHcm91cD4oKTtcbiAgcHJpdmF0ZSBfc2Vzc2lvbkRpc2FibGVkID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgLy8gR3JvdXBzIHRoYXQgaGF2ZSBhIGRlZmF1bHQgdGhlIHZpZXdlciBjbGVhcmVkLiBXaXRob3V0IHRoaXMgYSByZWxvYWQgb2YgdGhlXG4gIC8vIHJlcG9ydCAoYSBjaGF0IGVkaXQsIGEgZGlhbG9nKSB3b3VsZCBmaW5kIG5vIHZhbHVlIGZvciB0aGUgZ3JvdXAgYW5kIHNlZWRcbiAgLy8gaXRzIGRlZmF1bHQgc3RyYWlnaHQgYmFjay4gQSBjaGFuZ2UgdG8gdGhlIHN0b3JlZCBkZWZhdWx0IHJlbGVhc2VzIGl0LlxuICBwcml2YXRlIF9jbGVhcmVkID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgLy8gVGhlIHJlcG9ydCdzIGdyb3VwLWJ5IGNvbnRyb2w6IGEgc2luZ2xlIHJlcG9ydC13aWRlIGJ1Y2tldCBvdmVycmlkZSBmb3IgYWxsXG4gIC8vIHRpbWUtc2VyaWVzIGNoYXJ0cy4gVW5zZXQgPSBlYWNoIGNoYXJ0IHVzZXMgaXRzIGF1dGhvcmVkIGdyYW51bGFyaXR5LiBOZXZlclxuICAvLyBzYXZlZCB0byB0aGUgcmVwb3J0ICh0aGUgVVJMIGNhcnJpZXMgaXQpLCBhbmQgY2FycmllZCBpbiB0aGUgZGF0YSByZXF1ZXN0J3NcbiAgLy8gYHN0YXRlYCwgc28gaXQgcHJvcGFnYXRlcyB0aHJvdWdoIHRvIHRoZSBQREYvUG93ZXJQb2ludCBleHBvcnRzIHRvby4gTmFtZWRcbiAgLy8gZm9yIHRoZSBgZnJlcXVlbmN5YCB3aXJlIGtleSBpdCB0cmF2ZWxzIHVuZGVyLCBub3QgZm9yIHRoZSBjb250cm9sJ3MgbGFiZWwuXG4gIHByaXZhdGUgX2ZyZXF1ZW5jeTogQ2hhcnRHcmFudWxhcml0eSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9mcmVxdWVuY3lDaGFuZ2VkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLy8gRWFjaCBsaXN0J3Mgdmlld2VyLWNob3NlbiBzb3J0LCBieSBjb21wb25lbnQgaWQuIEhlbGQgaGVyZSByYXRoZXIgdGhhbiBvbmx5XG4gIC8vIGluIHRoZSBsaXN0J3MgRnNMaXN0IHNvIGl0IHN1cnZpdmVzIHRoZSBsaXN0IGJlaW5nIHJlY3JlYXRlZCAoYSBwYWdlIHN3aXRjaCxcbiAgLy8gYSByZWxvYWQgYWZ0ZXIgYW4gZWRpdCkgYW5kIHNvIGV2ZXJ5IGNvbnN1bWVyIG9mIHZpZXdlciBzdGF0ZSByZWFkcyBvbmUgcGxhY2UuXG4gIHByaXZhdGUgX2xpc3RTb3J0cyA9IG5ldyBNYXA8bnVtYmVyLCBSZXBvcnRTb3J0PigpO1xuXG4gIC8vIEVhY2ggbGlzdCdzIHNlYXJjaCBib3ggdGV4dCAobGlzdFNlYXJjaFRleHQpLCBieSBjb21wb25lbnQgaWQuIEEgbGlzdCB3aXRoXG4gIC8vIGFuIGVtcHR5IGJveCBoYXMgbm8gZW50cnkuIEhlbGQgaGVyZSBmb3IgdGhlIHNhbWUgcmVhc29ucyBhcyB0aGUgc29ydHMsIGFuZFxuICAvLyBiZWNhdXNlIHRoZSBib3ggbGl2ZXMgaW4gdGhlIGNvbXBvbmVudCBoZWFkZXIsIG5vdCBpbiB0aGUgbGlzdC5cbiAgcHJpdmF0ZSBfbGlzdFNlYXJjaGVzID0gbmV3IE1hcDxudW1iZXIsIHN0cmluZz4oKTtcblxuICAvLyBUaGUgb3BlbiByZXBvcnQncyBsaXN0cywgYnkgY29tcG9uZW50IGlkLCBzbyBhIGZpbHRlciB0b2dnbGUgY2FuIHRlbGxcbiAgLy8gd2hpY2ggb2YgdGhlbSBsb3NlIHRoZWlyIHNlYXJjaCBib3ggKGxpc3RTZWFyY2hhYmxlKS5cbiAgcHJpdmF0ZSBfbGlzdHMgPSBuZXcgTWFwPG51bWJlciwgUmVwb3J0Q29tcG9uZW50PigpO1xuXG4gIC8vIFdoZXRoZXIgdGhlIHNlcnZlciBhbnN3ZXJzIGEgbGlzdCBzZWFyY2guIExpc3Qgc2VhcmNoIGFuZCBlZmZlY3RpdmVMb2NhbGVcbiAgLy8gc2hpcCBpbiB0aGUgc2FtZSBmcmFtZXdvcmsgY2hhbmdlIHNldCwgc28gYSBzZXJ2ZXIgdGhhdCBzZW5kcyBub1xuICAvLyBlZmZlY3RpdmVMb2NhbGUgaGFzIG5laXRoZXIsIGFuZCBpdHMgbGlzdHMgc2hvdyBubyBzZWFyY2ggYm94LlxuICBwcml2YXRlIF9zZXJ2ZXJTZWFyY2hlcyA9IGZhbHNlO1xuXG4gIC8vIEVtaXRzIHRoZSBpZCBvZiB0aGUgbGlzdCB3aG9zZSBzZWFyY2ggdGV4dCBjaGFuZ2VkLlxuICBwcml2YXRlIF9saXN0U2VhcmNoQ2hhbmdlZCQgPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XG5cbiAgLy8gRW1pdHMgdGhlIGdyb3VwIGlkIHRoYXQgY2hhbmdlZDsgY29tcG9uZW50cyBsaXN0ZW4gZmlsdGVyZWQgdG8gdGhlaXIgb3duXG4gIC8vIGdyb3VwIGlkcy4gbnVsbCA9IGV2ZXJ5dGhpbmcgY2hhbmdlZCAocmUtaW5pdCkuXG4gIHByaXZhdGUgX2NoYW5nZWQkID0gbmV3IFN1YmplY3Q8bnVtYmVyIHwgbnVsbD4oKTtcblxuICAvLyBGaXJlcyB3aGVuZXZlciBhbnl0aGluZyB0aGUgVVJMIGNhcnJpZXMgbWF5IGhhdmUgY2hhbmdlZC5cbiAgcHJpdmF0ZSBfdXJsQ2hhbmdlZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8vIFNlZWQgZ3JvdXBzICsgdGhlaXIgZGVmYXVsdHMgd2hlbiBhIHJlcG9ydCBsb2Fkcy4gRXhpc3Rpbmcgc2Vzc2lvbiB2YWx1ZXNcbiAgLy8gZm9yIHN0aWxsLWV4aXN0aW5nIGdyb3VwcyBzdXJ2aXZlIGEgc3RydWN0dXJlIHJlLWZldGNoIChhIGNoYXQgZWRpdFxuICAvLyBzaG91bGRuJ3QgcmVzZXQgdGhlIHZpZXdlcidzIGZpbHRlcnMpLCBhbmQgc28gZG9lcyBhIGdyb3VwIHRoZSB2aWV3ZXJcbiAgLy8gY2xlYXJlZCDigJQgVU5MRVNTIHRoZSBncm91cCdzIHN0b3JlZCBkZWZhdWx0IGl0c2VsZiBjaGFuZ2VkLCB3aGljaCBvbmx5XG4gIC8vIGhhcHBlbnMgd2hlbiBhbiBvcGVyYXRvciBzYXZlZCBhIG5ldyBkZWZhdWx0IGluIHJlcG9ydCBzZXR0aW5ncyBvciB0aGVcbiAgLy8gYWdlbnQgc2V0IG9uZS4gVGhhdCBpcyBhbiBleHBsaWNpdCBpbnN0cnVjdGlvbiB0byByZS1zZWVkLCBzbyBpdCB3aW5zIG92ZXJcbiAgLy8gdGhlIHN1cnZpdmluZyBzZXNzaW9uIHZhbHVlOyB3aXRob3V0IGl0IHRoZSBiYXIga2VlcHMgc2hvd2luZyB3aGF0ZXZlciBpdFxuICAvLyB3YXMgZmlyc3Qgc2VlZGVkIHdpdGggdW50aWwgYSBmdWxsIHBhZ2UgcmVsb2FkLlxuICAvL1xuICAvLyBBIGNoYW5nZSBvZiB0aGUgcmVwb3J0J3Mgem9uZSBtb3ZlcyBcInRvZGF5XCIsIHNvIGEgdmFsdWUgc3RpbGwgY2FycnlpbmcgaXRzXG4gIC8vIGdyb3VwIGRlZmF1bHQncyBwcmVzZXQgbmFtZSBpcyByZXNvbHZlZCBhZ2FpbiBpbiB0aGUgbmV3IHpvbmUuIEEgdmFsdWUgdGhlXG4gIC8vIHZpZXdlciBwaWNrZWQsIG9yIG9uZSBjYXJyeWluZyBhbm90aGVyIHByZXNldCBuYW1lLCBpcyBrZXB0IGFzIGl0IGlzLlxuICAvL1xuICAvLyBgcmVzdG9yZWAgaXMgdGhlIHZpZXdlciBzdGF0ZSByZWFkIGZyb20gdGhlIFVSTC4gVGhlIGhvc3QgcGFzc2VzIGl0IG9ubHkgb25cbiAgLy8gdGhlIGZpcnN0IGxvYWQgb2YgYSByZXBvcnQ7IGEgcmVsb2FkIGFmdGVyIGEgY2hhdCBvciBkaWFsb2cgZWRpdCBwYXNzZXNcbiAgLy8gbnVsbCwgc28gdGhlIGluLW1lbW9yeSBzdGF0ZSB3aW5zLiBQYXJhbXMgdGhhdCBuYW1lIGEgZ3JvdXAsIGxpc3Qgb3IgY29sdW1uXG4gIC8vIHRoZSByZXBvcnQgbm8gbG9uZ2VyIGhhcywgb3IgdGhhdCBkbyBub3QgZGVjb2RlLCBhcmUgaWdub3JlZC5cbiAgcHVibGljIGluaXQocmVwb3J0OiBSZXBvcnQsIHJlc3RvcmU6IFJlcG9ydFVybFBhcmFtcyB8IG51bGwgPSBudWxsKTogdm9pZCB7XG4gICAgY29uc3QgcHJldmlvdXNUaW1lem9uZSA9IHRoaXMudGltZXpvbmUoKTtcblxuICAgIC8vIFNldCBmaXJzdDogdGhlIGRlZmF1bHRzIHNlZWRlZCBiZWxvdyByZXNvbHZlIHRoZWlyIHJlbGF0aXZlIHByZXNldHMgaW4gaXQuXG4gICAgdGhpcy50aW1lem9uZS5zZXQocmVzb2x2ZVJlcG9ydFRpbWV6b25lKHJlcG9ydCkpO1xuICAgIHRoaXMuZm9ybWF0Q29udGV4dC5zZXQocmVzb2x2ZUZvcm1hdENvbnRleHQocmVwb3J0KSk7XG4gICAgLy8gQmVmb3JlIGFueSBzZWFyY2ggcmVzdG9yZTogbGlzdFNlYXJjaGFibGUgcmVhZHMgaXQuXG4gICAgdGhpcy5fc2VydmVyU2VhcmNoZXMgPSByZXBvcnQuZWZmZWN0aXZlTG9jYWxlICE9PSB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCB0aW1lem9uZUNoYW5nZWQgPSBwcmV2aW91c1RpbWV6b25lICE9PSB0aGlzLnRpbWV6b25lKCk7XG4gICAgY29uc3QgcHJldmlvdXNHcm91cHMgPSB0aGlzLl9ncm91cHM7XG4gICAgdGhpcy5fZ3JvdXBzID0gbmV3IE1hcDxudW1iZXIsIFJlcG9ydEZpbHRlckdyb3VwPigpO1xuXG4gICAgZm9yIChjb25zdCBncm91cCBvZiByZXBvcnQuZmlsdGVyR3JvdXBzID8/IFtdKSB7XG4gICAgICB0aGlzLl9ncm91cHMuc2V0KGdyb3VwLmlkLCBncm91cCk7XG4gICAgICB0aGlzLl9zZWVkKGdyb3VwLCBwcmV2aW91c0dyb3Vwcy5nZXQoZ3JvdXAuaWQpID8/IG51bGwsIHRpbWV6b25lQ2hhbmdlZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fbGlzdHMgPSBuZXcgTWFwKHRoaXMuX2xpc3RDb21wb25lbnRzKHJlcG9ydCkubWFwKChjb21wb25lbnQpID0+IFtjb21wb25lbnQuaWQsIGNvbXBvbmVudF0pKTtcblxuICAgIGlmIChyZXN0b3JlKSB7XG4gICAgICB0aGlzLl9yZXN0b3JlKHJlcG9ydCwgcmVzdG9yZSk7XG4gICAgfVxuXG4gICAgdGhpcy5fcHJ1bmUocmVwb3J0KTtcblxuICAgIHRoaXMuX2NoYW5nZWQkLm5leHQobnVsbCk7XG4gICAgdGhpcy5fdXJsQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgcHVibGljIHZhbHVlKGdyb3VwSWQ6IG51bWJlcik6IEZpbHRlckdyb3VwVmFsdWUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZXMuZ2V0KGdyb3VwSWQpO1xuICB9XG5cbiAgLy8gQSBiYXIncyB2YWx1ZSBmb3IgYSBncm91cC4gQSBkYXRlIHJhbmdlIGtlZXBzIHRoZSBzdG9yZWQgcHJlc2V0IG5hbWUgb25seVxuICAvLyB3aGlsZSBpdHMgZGF5cyBhcmUgc3RpbGwgdGhlIHN0b3JlZCBkYXlzOiB0aGUgYmFycyByZS1zZXQgZXZlcnkgZ3JvdXAgdGhleVxuICAvLyBzaG93IHdoZW5ldmVyIGFueSBvbmUgb2YgdGhlbSBjaGFuZ2VzLCBhbmQgYW4gdW50b3VjaGVkIHJvbGxpbmcgcmFuZ2UgbXVzdFxuICAvLyBrZWVwIGl0cyBuYW1lIHJhdGhlciB0aGFuIHR1cm4gaW50byB0d28gZml4ZWQgZGF0ZXMuIEFueSBvdGhlciByYW5nZSwgYVxuICAvLyBwaWNrZXIgc2hvcnRjdXQgaW5jbHVkZWQsIGlzIHN0b3JlZCBhcyB0aGUgZml4ZWQgZGF0ZXMgaXQgc2hvd3MuXG4gIHB1YmxpYyBzZXRWYWx1ZShncm91cElkOiBudW1iZXIsIHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5fdmFsdWVzLmRlbGV0ZShncm91cElkKTtcblxuICAgICAgaWYgKHRoaXMuX2dyb3Vwcy5nZXQoZ3JvdXBJZCk/LmNvbmZpZz8uZGVmYXVsdCkge1xuICAgICAgICB0aGlzLl9jbGVhcmVkLmFkZChncm91cElkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdmFsdWVzLnNldChncm91cElkLCB0aGlzLl93aXRoUHJlc2V0KHRoaXMuX3ZhbHVlcy5nZXQoZ3JvdXBJZCksIHZhbHVlKSk7XG4gICAgICB0aGlzLl9jbGVhcmVkLmRlbGV0ZShncm91cElkKTtcbiAgICB9XG5cbiAgICB0aGlzLl9jaGFuZ2VkJC5uZXh0KGdyb3VwSWQpO1xuICAgIHRoaXMuX3VybENoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIEEgcmVsYXRpdmUgcHJlc2V0IG5hbWUgYXMgdG9kYXkncyByYW5nZSBpbiB0aGUgcmVwb3J0J3Mgem9uZSwgb3IgbnVsbCBmb3JcbiAgLy8gYSBuYW1lIGl0IGRvZXMgbm90IGtub3cuIFRoZSBVUkwgY29kZWMgZGVjb2RlcyBwcmVzZXQgbmFtZXMgdGhyb3VnaCB0aGlzLlxuICBwdWJsaWMgcmVzb2x2ZVJlbGF0aXZlKG5hbWU6IHN0cmluZyk6IHsgc3RhcnQ6IERhdGU7IGVuZDogRGF0ZSB9IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3JlbGF0aXZlUmFuZ2UobmFtZSk7XG4gIH1cblxuICAvLyBUaGUgYWN0aXZlIGdyb3VwLWJ5IGdyYWluLCBvciBudWxsIHdoZW4gdGhlIHZpZXdlciBoYXNuJ3QgY2hvc2VuIG9uZS5cbiAgcHVibGljIGZyZXF1ZW5jeSgpOiBDaGFydEdyYW51bGFyaXR5IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZyZXF1ZW5jeTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRGcmVxdWVuY3koZnJlcXVlbmN5OiBDaGFydEdyYW51bGFyaXR5IHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuX2ZyZXF1ZW5jeSA9IGZyZXF1ZW5jeTtcbiAgICB0aGlzLl9mcmVxdWVuY3lDaGFuZ2VkJC5uZXh0KCk7XG4gICAgdGhpcy5fdXJsQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gRmlyZXMgd2hlbmV2ZXIgdGhlIGdyb3VwLWJ5IGdyYWluIGNoYW5nZXMg4oCUIGV2ZXJ5IHRpbWUtc2VyaWVzIGNoYXJ0IGxpc3RlbnNcbiAgLy8gc28gaXQgcmVmZXRjaGVzIGFuZCByZS1idWNrZXRzICh0aGUgb3ZlcnJpZGUgaXNuJ3Qgc2NvcGVkIHRvIGFueSBmaWx0ZXJcbiAgLy8gZ3JvdXAsIHNvIGNoYW5nZXNGb3IoKSBjYW4ndCBjYXJyeSBpdCkuXG4gIHB1YmxpYyBmcmVxdWVuY3lDaGFuZ2VzKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9mcmVxdWVuY3lDaGFuZ2VkJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8vIFRoZSBzb3J0IHRoZSB2aWV3ZXIgbGFzdCBmZXRjaGVkIGEgbGlzdCB3aXRoLCBvciBudWxsIHdoZW4gaXQgaGFzbid0IHNvcnRlZFxuICAvLyAodGhlIGxpc3QgdGhlbiBmYWxscyBiYWNrIHRvIGl0cyBhdXRob3JlZCBzb3J0KS5cbiAgcHVibGljIGxpc3RTb3J0KGNvbXBvbmVudElkOiBudW1iZXIpOiBSZXBvcnRTb3J0IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2xpc3RTb3J0cy5nZXQoY29tcG9uZW50SWQpID8/IG51bGw7XG4gIH1cblxuICAvLyBSZWNvcmRzIGEgbGlzdCdzIHNvcnQgd2hlbiBpdCBpcyB0aGUgdmlld2VyJ3Mgb3duOiBhIHNvcnQgdGhhdCBpcyB0aGVcbiAgLy8gbGlzdCdzIGF1dGhvcmVkIGZpcnN0IHRlcm0gaXMgdGhlIGxpc3QncyBkZWZhdWx0LCBub3QgYSBjaG9pY2UsIHNvIGl0XG4gIC8vIGNsZWFycyB0aGUgZW50cnkgaW5zdGVhZCAodGhlIHJ1bGUgdGhlIFVSTCBzbmFwc2hvdCBhcHBsaWVzKS4gT3RoZXJ3aXNlIGFcbiAgLy8gbGlzdCdzIGZpcnN0IGZldGNoIHdvdWxkIHJlY29yZCBpdHMgc2VlZGVkIGF1dGhvcmVkIHRlcm0sIGFuZCBhIGxpc3QgdGhlXG4gIC8vIGFnZW50IHJlLXNvcnRzIGxhdGVyIGluIHRoZSBzZXNzaW9uIHdvdWxkIGtlZXAgc2VuZGluZyB0aGUgb2xkIHRlcm1cbiAgLy8gZmlyc3QuIERlbGliZXJhdGVseSBlbWl0cyBubyBjaGFuZ2U6IHRoZSBsaXN0IHNldHMgdGhpcyBmcm9tIHRoZSBmZXRjaFxuICAvLyB0aGF0IGFscmVhZHkgcmFuIHdpdGggdGhhdCBzb3J0LCBzbyBhIG5vdGlmaWNhdGlvbiB3b3VsZCBvbmx5IG1ha2UgaXRcbiAgLy8gcmVmZXRjaCB0aGUgc2FtZSByb3dzLiBPbmx5IHRoZSBVUkwgaGVhcnMgYWJvdXQgaXQuXG4gIHB1YmxpYyBzZXRMaXN0U29ydChjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCwgc29ydDogUmVwb3J0U29ydCB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoc29ydCAmJiAhc2FtZVNvcnQoc29ydCwgbGlzdFNvcnRUZXJtcyhjb21wb25lbnQuY29uZmlnKVswXSA/PyBudWxsKSkge1xuICAgICAgdGhpcy5fbGlzdFNvcnRzLnNldChjb21wb25lbnQuaWQsIHNvcnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9saXN0U29ydHMuZGVsZXRlKGNvbXBvbmVudC5pZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fdXJsQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gVGhlIHRleHQgYSBsaXN0IGlzIHNlYXJjaGVkIGJ5LCBvciBudWxsIHdoZW4gaXRzIHNlYXJjaCBib3ggaXMgZW1wdHkuXG4gIHB1YmxpYyBsaXN0U2VhcmNoKGNvbXBvbmVudElkOiBudW1iZXIpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbGlzdFNlYXJjaGVzLmdldChjb21wb25lbnRJZCkgPz8gbnVsbDtcbiAgfVxuXG4gIC8vIFdoZXRoZXIgYSBsaXN0IHNob3dzIHRoZSBzZWFyY2ggYm94IG92ZXIgaXRzIHRleHQgY29sdW1uczogaXQgZG9lcyB3aGVuIHRoZVxuICAvLyBzZXJ2ZXIgYW5zd2VycyBhIGxpc3Qgc2VhcmNoIChzZWUgX3NlcnZlclNlYXJjaGVzKSwgdW5sZXNzIG9uZSBvZiBpdHMgbGl2ZVxuICAvLyBmaWx0ZXJzIGJlbG9uZ3MgdG8gYSBrZXl3b3JkIGdyb3VwIGl0cyBoZWFkZXIgc2hvd3MuIEEgYmFyIHNob3dzIG9uZSBzZWFyY2hcbiAgLy8gYm94IChpdHMgbGFzdCBrZXl3b3JkIGl0ZW0pLCBhbmQgdGhhdCBvbmUgaXMgdGhlIGF1dGhvcidzLiBUaGUgaGVhZGVyLCB0aGVcbiAgLy8gVVJMIHJlc3RvcmUsIHRoZSBwcnVuaW5nLCB0aGUgZGF0YSByZXF1ZXN0IHN0YXRlIGFuZCB0aGUgZXhwb3J0cyBhbGwgcmVhZFxuICAvLyB0aGlzIG9uZSBydWxlLCBzbyBubyBzZWFyY2ggbmFycm93cyBhIGxpc3Qgd2hvc2Ugc2NyZWVuIGhhcyBubyBib3ggc2hvd2luZ1xuICAvLyBpdCwgYW5kIG5vIGV4cG9ydCB0aXRsZXMgYSBzZWFyY2ggdGhlIHNlcnZlciBkaWQgbm90IGFwcGx5LlxuICBwdWJsaWMgbGlzdFNlYXJjaGFibGUoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2VydmVyU2VhcmNoZXNcbiAgICAgICYmIGNvbXBvbmVudC50eXBlID09PSAnbGlzdCdcbiAgICAgICYmICEoY29tcG9uZW50LmZpbHRlcnMgPz8gW10pLnNvbWUoKGZpbHRlcikgPT4ge1xuICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuX2dyb3Vwcy5nZXQoZmlsdGVyLmZpbHRlckdyb3VwSWQpO1xuXG4gICAgICAgIHJldHVybiBmaWx0ZXIuZW5hYmxlZFxuICAgICAgICAgICYmICF0aGlzLl9zZXNzaW9uRGlzYWJsZWQuaGFzKGZpbHRlci5pZClcbiAgICAgICAgICAmJiBncm91cD8udHlwZSA9PT0gJ2tleXdvcmQnXG4gICAgICAgICAgJiYgKGdyb3VwLmxldmVsID09PSAnY29tcG9uZW50JyB8fCBncm91cC5sZXZlbCA9PT0gJ2JvdGgnKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gUmVjb3JkcyBhIGxpc3QncyBzZWFyY2ggYm94IHRleHQgKGxpc3RTZWFyY2hUZXh0KTsgYW4gZW1wdHkgYm94IGNsZWFyc1xuICAvLyBpdC4gVGhlIGhlYWRlciBjYWxscyB0aGlzIG9uIGV2ZXJ5IGNoYW5nZSBvZiBhbnkgb2YgaXRzIGl0ZW1zLCBzbyB0aGVcbiAgLy8gbGlzdCBhbmQgdGhlIFVSTCBoZWFyIGFib3V0IGl0IG9ubHkgd2hlbiB0aGUgc3RvcmVkIHRleHQgYWN0dWFsbHkgY2hhbmdlZC5cbiAgcHVibGljIHNldExpc3RTZWFyY2goY29tcG9uZW50SWQ6IG51bWJlciwgdGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qgc2VhcmNoID0gbGlzdFNlYXJjaFRleHQodGV4dCk7XG5cbiAgICBpZiAoc2VhcmNoID09PSAodGhpcy5fbGlzdFNlYXJjaGVzLmdldChjb21wb25lbnRJZCkgPz8gJycpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNlYXJjaCkge1xuICAgICAgdGhpcy5fbGlzdFNlYXJjaGVzLnNldChjb21wb25lbnRJZCwgc2VhcmNoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbGlzdFNlYXJjaGVzLmRlbGV0ZShjb21wb25lbnRJZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fbGlzdFNlYXJjaENoYW5nZWQkLm5leHQoY29tcG9uZW50SWQpO1xuICAgIHRoaXMuX3VybENoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIFRoZSBjb25maWcgY29sdW1uIG5hbWVzIGEgdmlld2VyIGhpZCBvbiBhIGxpc3Q7IG5vbmUgd2hlbiBpdCBzaG93cyB0aGVtIGFsbC5cbiAgcHVibGljIGhpZGRlbkNvbHVtbnMoY29tcG9uZW50SWQ6IG51bWJlcik6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5saXN0SGlkZGVuKCkuZ2V0KGNvbXBvbmVudElkKSA/PyBbXTtcbiAgfVxuXG4gIC8vIFJlY29yZHMgdGhlIGNvbHVtbnMgYSB2aWV3ZXIgaGlkIG9uIGEgbGlzdCwga2VwdCB0byBsaXN0SGlkZGVuQ29sdW1uczpcbiAgLy8gbmFtZXMgdGhlIGxpc3QgY2Fubm90IGhpZGUgYXJlIGRyb3BwZWQsIGFuZCBub25lIChvciBldmVyeSBjb2x1bW4pIGNsZWFyc1xuICAvLyB0aGUgZW50cnkuIE9ubHkgdGhlIFVSTCBoZWFycyBhYm91dCBpdCwgYW5kIG9ubHkgb24gYSByZWFsIGNoYW5nZS5cbiAgcHVibGljIHNldEhpZGRlbkNvbHVtbnMoY29tcG9uZW50SWQ6IG51bWJlciwgbmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgY29uc3QgaGlkZGVuID0gbGlzdEhpZGRlbkNvbHVtbnModGhpcy5fbGlzdHMuZ2V0KGNvbXBvbmVudElkKT8uY29uZmlnLCBuYW1lcyk7XG5cbiAgICBpZiAoc2FtZU5hbWVzKGhpZGRlbiwgdGhpcy5oaWRkZW5Db2x1bW5zKGNvbXBvbmVudElkKSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0ID0gbmV3IE1hcCh0aGlzLmxpc3RIaWRkZW4oKSk7XG5cbiAgICBpZiAoaGlkZGVuLmxlbmd0aCkge1xuICAgICAgbmV4dC5zZXQoY29tcG9uZW50SWQsIGhpZGRlbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHQuZGVsZXRlKGNvbXBvbmVudElkKTtcbiAgICB9XG5cbiAgICB0aGlzLmxpc3RIaWRkZW4uc2V0KG5leHQpO1xuICAgIHRoaXMuX3VybENoYW5nZWQkLm5leHQoKTtcbiAgfVxuXG4gIC8vIEZpcmVzIHdoZW5ldmVyIG9uZSBsaXN0J3Mgc2VhcmNoIHRleHQgY2hhbmdlcywgc28gdGhhdCBsaXN0IHJlZmV0Y2hlcy5cbiAgcHVibGljIGxpc3RTZWFyY2hDaGFuZ2VzKGNvbXBvbmVudElkOiBudW1iZXIpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fbGlzdFNlYXJjaENoYW5nZWQkLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAucGlwZShcbiAgICAgICAgcnhGaWx0ZXIoKGlkKSA9PiBpZCA9PT0gY29tcG9uZW50SWQpLFxuICAgICAgICBtYXAoKCkgPT4gdW5kZWZpbmVkKSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBGaXJlcyB3aGVuZXZlciB0aGUgdmlld2VyIHN0YXRlIHRoZSBVUkwgY2FycmllcyBtYXkgaGF2ZSBjaGFuZ2VkOiBhIGdyb3VwXG4gIC8vIHZhbHVlLCB0aGUgZ3JhaW4sIGEgbGlzdCBzb3J0LCBzZWFyY2ggb3IgaGlkZGVuIGNvbHVtbnMsIG9yIGEgKHJlKWxvYWQgb2ZcbiAgLy8gdGhlIHJlcG9ydC5cbiAgcHVibGljIHVybENoYW5nZXMoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3VybENoYW5nZWQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLy8gVGhlIHZpZXdlciBzdGF0ZSB0aGUgVVJMIHNob3VsZCBjYXJyeSBmb3IgYHJlcG9ydGA6IG9ubHkgd2hhdCBkaWZmZXJzIGZyb21cbiAgLy8gdGhlIGF1dGhvcmVkIGRlZmF1bHRzLCBzbyBhbiB1bnRvdWNoZWQgcmVwb3J0IGhhcyBhIGJhcmUgVVJMIGFuZCBrZWVwc1xuICAvLyBmb2xsb3dpbmcgaXRzIGRlZmF1bHRzIHdoZW4gdGhleSBjaGFuZ2UuIEEgZ3JvdXAgdGhlIHZpZXdlciBjbGVhcmVkIGlzXG4gIC8vIG51bGwuIEEgZGF0ZSByYW5nZSBpcyBjb21wYXJlZCBvbiBpdHMgZGF5cyBhZ2FpbnN0IGl0cyBkZWZhdWx0IHJlc29sdmVkXG4gIC8vIHRvZGF5LCBzbyBhIHZhbHVlIHRoYXQgaXMgdGhlIGRlZmF1bHQgdW5kZXIgYW5vdGhlciBwcmVzZXQgbmFtZSAodGhpc1llYXJcbiAgLy8gYWdhaW5zdCBhIHllYXJUb0RhdGUgZGVmYXVsdCkgaXMgc3RpbGwgdGhlIGRlZmF1bHQuXG4gIHB1YmxpYyB1cmxTbmFwc2hvdChyZXBvcnQ6IFJlcG9ydCk6IFJlcG9ydFVybFNuYXBzaG90IHtcbiAgICBjb25zdCBncm91cHMgPSBuZXcgTWFwPG51bWJlciwgRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGw+KCk7XG5cbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHRoaXMuX2dyb3Vwcy52YWx1ZXMoKSkge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLl92YWx1ZXMuZ2V0KGdyb3VwLmlkKTtcblxuICAgICAgaWYgKHRoaXMuX2NsZWFyZWQuaGFzKGdyb3VwLmlkKSkge1xuICAgICAgICBncm91cHMuc2V0KGdyb3VwLmlkLCBudWxsKTtcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUgJiYgIXRoaXMuX2lzRGVmYXVsdChncm91cCwgdmFsdWUpKSB7XG4gICAgICAgIGdyb3Vwcy5zZXQoZ3JvdXAuaWQsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBsaXN0U29ydHMgPSBuZXcgTWFwPG51bWJlciwgUmVwb3J0U29ydD4oKTtcbiAgICBjb25zdCBsaXN0U2VhcmNoZXMgPSBuZXcgTWFwPG51bWJlciwgc3RyaW5nPigpO1xuICAgIGNvbnN0IGxpc3RIaWRkZW4gPSBuZXcgTWFwPG51bWJlciwgc3RyaW5nW10+KCk7XG5cbiAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiB0aGlzLl9saXN0Q29tcG9uZW50cyhyZXBvcnQpKSB7XG4gICAgICBjb25zdCBzb3J0ID0gdGhpcy5fbGlzdFNvcnRzLmdldChjb21wb25lbnQuaWQpO1xuICAgICAgY29uc3Qgc2VhcmNoID0gdGhpcy5fbGlzdFNlYXJjaGVzLmdldChjb21wb25lbnQuaWQpO1xuICAgICAgY29uc3QgaGlkZGVuID0gdGhpcy5oaWRkZW5Db2x1bW5zKGNvbXBvbmVudC5pZCk7XG5cbiAgICAgIGlmIChzb3J0ICYmICFzYW1lU29ydChzb3J0LCBsaXN0U29ydFRlcm1zKGNvbXBvbmVudC5jb25maWcpWzBdID8/IG51bGwpKSB7XG4gICAgICAgIGxpc3RTb3J0cy5zZXQoY29tcG9uZW50LmlkLCBzb3J0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlYXJjaCkge1xuICAgICAgICBsaXN0U2VhcmNoZXMuc2V0KGNvbXBvbmVudC5pZCwgc2VhcmNoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGhpZGRlbi5sZW5ndGgpIHtcbiAgICAgICAgbGlzdEhpZGRlbi5zZXQoY29tcG9uZW50LmlkLCBbLi4uaGlkZGVuXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgZ3JvdXBzLCBsaXN0U29ydHMsIGxpc3RTZWFyY2hlcywgbGlzdEhpZGRlbiwgZnJlcXVlbmN5OiB0aGlzLl9mcmVxdWVuY3kgfTtcbiAgfVxuXG4gIHB1YmxpYyBpc0ZpbHRlckRpc2FibGVkKGZpbHRlcklkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbkRpc2FibGVkLmhhcyhmaWx0ZXJJZCk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlRmlsdGVyKGZpbHRlcklkOiBudW1iZXIsIGdyb3VwSWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zZXNzaW9uRGlzYWJsZWQuaGFzKGZpbHRlcklkKSkge1xuICAgICAgdGhpcy5fc2Vzc2lvbkRpc2FibGVkLmRlbGV0ZShmaWx0ZXJJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5hZGQoZmlsdGVySWQpO1xuICAgIH1cblxuICAgIC8vIFR1cm5pbmcgYSBrZXl3b3JkIGZpbHRlciBiYWNrIG9uIHRha2VzIGl0cyBsaXN0J3Mgc2VhcmNoIGJveCBhd2F5LCBhbmRcbiAgICAvLyB0aGUgc2VhcmNoIHdpdGggaXQuIFRoZSBsaXN0IHJlZmV0Y2hlcyBvbiB0aGUgZ3JvdXAgY2hhbmdlIGJlbG93LlxuICAgIHRoaXMuX2Ryb3BVbnNlYXJjaGFibGUoKTtcblxuICAgIHRoaXMuX2NoYW5nZWQkLm5leHQoZ3JvdXBJZCk7XG4gICAgdGhpcy5fdXJsQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gTm90aWZpY2F0aW9ucyByZWxldmFudCB0byBPTkUgY29tcG9uZW50OiBhbnkgY2hhbmdlIHRvIGEgZ3JvdXAgb25lIG9mIGl0c1xuICAvLyBmaWx0ZXJzIGJlbG9uZ3MgdG8gKG9yIGEgZnVsbCByZS1pbml0KS5cbiAgcHVibGljIGNoYW5nZXNGb3IoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBPYnNlcnZhYmxlPG51bWJlciB8IG51bGw+IHtcbiAgICBjb25zdCBncm91cElkcyA9IG5ldyBTZXQoKGNvbXBvbmVudC5maWx0ZXJzID8/IFtdKS5tYXAoKGZpbHRlcikgPT4gZmlsdGVyLmZpbHRlckdyb3VwSWQpKTtcblxuICAgIHJldHVybiB0aGlzLl9jaGFuZ2VkJC5hc09ic2VydmFibGUoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHJ4RmlsdGVyKChncm91cElkKSA9PiBncm91cElkID09PSBudWxsIHx8IGdyb3VwSWRzLmhhcyhncm91cElkKSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gVGhlIGdyb3VwIHZhbHVlcyByZXNvbHZlZCBpbnRvIHRoaXMgY29tcG9uZW50J3MgbWVtYmVyLWZpbHRlciB2YWx1ZXMg4oCUXG4gIC8vIHdoYXQgdGhlIGRhdGEgcmVxdWVzdCBjYXJyaWVzLiBEaXNhYmxlZCBmaWx0ZXJzIChhdXRob3JlZCBvciBzZXNzaW9uKSBhcmVcbiAgLy8gc2tpcHBlZCBlbnRpcmVseS5cbiAgcHVibGljIHJlc29sdmVGb3JDb21wb25lbnQoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBSZXNvbHZlZEZpbHRlclZhbHVlW10ge1xuICAgIGNvbnN0IHJlc29sdmVkOiBSZXNvbHZlZEZpbHRlclZhbHVlW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIGNvbXBvbmVudC5maWx0ZXJzID8/IFtdKSB7XG4gICAgICBpZiAoIWZpbHRlci5lbmFibGVkIHx8IHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5oYXMoZmlsdGVyLmlkKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLl92YWx1ZXMuZ2V0KGZpbHRlci5maWx0ZXJHcm91cElkKTtcbiAgICAgIGNvbnN0IGZpZWxkcyA9IHZhbHVlID8gdGhpcy5fcmVzb2x2ZWRGaWVsZHModmFsdWUpIDogbnVsbDtcblxuICAgICAgaWYgKGZpZWxkcykge1xuICAgICAgICByZXNvbHZlZC5wdXNoKHsgZmlsdGVySWQ6IGZpbHRlci5pZCwgLi4uZmllbGRzIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXNvbHZlZDtcbiAgfVxuXG4gIC8vIFdoYXQgdGhlIHZpZXdlciBoYXMgc2V0LCBvbmUgZW50cnkgcGVyIGZpbHRlciBncm91cCwgZm9yIHRoZSByZXBvcnQgY2hhdDpcbiAgLy8gdGhlIGFnZW50IHJlYWRzIGl0IHRvIGtub3cgd2hhdCBpcyBvbiBzY3JlZW4uIEdyb3VwIG9yZGVyLCBub3QgdGhlIG9yZGVyXG4gIC8vIHRoZSB2YWx1ZXMgd2VyZSBzZXQgaW4sIHNvIHRoZSBzYW1lIHN0YXRlIGFsd2F5cyByZWFkcyB0aGUgc2FtZS4gQSBncm91cFxuICAvLyB3aXRoIG5vdGhpbmcgaW4gaXQgaXMgbGVmdCBvdXQsIGFuZCBhIHNhdmVkIGRlZmF1bHQgY291bnRzIHVudGlsIHRoZVxuICAvLyB2aWV3ZXIgY2hhbmdlcyBpdC4gUGVyLWZpbHRlciB0b2dnbGVzIGFyZSBhIGNvbXBvbmVudCdzIG93biBidXNpbmVzcywgc29cbiAgLy8gdGhleSBhcmUgbm90IHBhcnQgb2YgaXQuXG4gIHB1YmxpYyB2aWV3ZXJGaWx0ZXJzKCk6IFJlcG9ydENoYXRWaWV3ZXJGaWx0ZXJbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLl92YWx1ZXMuZW50cmllcygpXVxuICAgICAgLnNvcnQoKFthXSwgW2JdKSA9PiBhIC0gYilcbiAgICAgIC5tYXAoKFtncm91cElkLCB2YWx1ZV0pID0+IHtcbiAgICAgICAgY29uc3QgZmllbGRzID0gdGhpcy5fcmVzb2x2ZWRGaWVsZHModmFsdWUpO1xuXG4gICAgICAgIHJldHVybiBmaWVsZHMgPyB7IGdyb3VwSWQsIC4uLmZpZWxkcyB9IDogbnVsbDtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChlbnRyeSk6IGVudHJ5IGlzIFJlcG9ydENoYXRWaWV3ZXJGaWx0ZXIgPT4gZW50cnkgIT09IG51bGwpO1xuICB9XG5cbiAgLy8gRXZlcnkgY29tcG9uZW50J3MgcmVzb2x2ZWQgdmFsdWVzIGluIG9uZSBhcnJheSDigJQgd2hhdCBhIHJlcG9ydC1sZXZlbCBleHBvcnRcbiAgLy8gY2FycmllcyBzbyBlYWNoIGZpbGUgaW4gdGhlIGFyY2hpdmUgaXMgZmlsdGVyZWQgZXhhY3RseSBhcyB0aGUgc2NyZWVuIGlzLlxuICAvLyBGaWx0ZXIgaWRzIGFyZSB1bmlxdWUgcGVyIGNvbXBvbmVudCwgc28gdGhlIGJhY2tlbmQgcGlja3MgZWFjaCBjb21wb25lbnQnc1xuICAvLyBvd24gb3V0IG9mIHRoZSBwaWxlLiBBIHBhZ2UgaWQgbmFycm93cyBpdCB0byB0aGF0IHBhZ2UuXG4gIHB1YmxpYyByZXNvbHZlRm9yUmVwb3J0KHJlcG9ydDogUmVwb3J0LCBwYWdlSWQ6IG51bWJlciB8IG51bGwgPSBudWxsKTogUmVzb2x2ZWRGaWx0ZXJWYWx1ZVtdIHtcbiAgICBjb25zdCBwYWdlcyA9IChyZXBvcnQucGFnZXMgPz8gW10pXG4gICAgICAuZmlsdGVyKChwYWdlKSA9PiAhcGFnZUlkIHx8IHBhZ2UuaWQgPT09IHBhZ2VJZCk7XG5cbiAgICByZXR1cm4gcGFnZXNcbiAgICAgIC5mbGF0TWFwKChwYWdlKSA9PiAocGFnZS5jb21wb25lbnRzID8/IFtdKVxuICAgICAgICAuZmxhdE1hcCgoY29tcG9uZW50KSA9PiB0aGlzLnJlc29sdmVGb3JDb21wb25lbnQoY29tcG9uZW50KSkpO1xuICB9XG5cbiAgLy8gQSBncm91cCB2YWx1ZSBhcyB0aGUgZmllbGRzIGEgcmVxdWVzdCBjYXJyaWVzOiBkYXRlIGJvdW5kcyBhcyBjYWxlbmRhclxuICAvLyBkYXlzLCBzZWxlY3QgdmFsdWVzIHdoZW4gYW55IGFyZSBwaWNrZWQsIGtleXdvcmQgdGV4dCB0cmltbWVkLiBOdWxsIHdoZW5cbiAgLy8gYWxsIG9mIHRoZW0gYXJlIGVtcHR5LiBUaGUgcHJlc2V0IG5hbWUgaXMgVVJMIHN0YXRlIG9ubHksIHNvIGl0IGlzIGxlZnRcbiAgLy8gYmVoaW5kLlxuICBwcml2YXRlIF9yZXNvbHZlZEZpZWxkcyh2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSk6IE9taXQ8UmVzb2x2ZWRGaWx0ZXJWYWx1ZSwgJ2ZpbHRlcklkJz4gfCBudWxsIHtcbiAgICBjb25zdCBmaWVsZHM6IE9taXQ8UmVzb2x2ZWRGaWx0ZXJWYWx1ZSwgJ2ZpbHRlcklkJz4gPSB7fTtcblxuICAgIGlmICh2YWx1ZS5zdGFydCkge1xuICAgICAgZmllbGRzLnN0YXJ0ID0gZGF0ZUJvdW5kU3RyaW5nKHZhbHVlLnN0YXJ0KTtcbiAgICB9XG4gICAgaWYgKHZhbHVlLmVuZCkge1xuICAgICAgZmllbGRzLmVuZCA9IGRhdGVCb3VuZFN0cmluZyh2YWx1ZS5lbmQpO1xuICAgIH1cbiAgICBpZiAodmFsdWUudmFsdWVzPy5sZW5ndGgpIHtcbiAgICAgIGZpZWxkcy52YWx1ZXMgPSB2YWx1ZS52YWx1ZXM7XG4gICAgfVxuICAgIGlmICh2YWx1ZS52YWx1ZT8udHJpbSgpKSB7XG4gICAgICBmaWVsZHMudmFsdWUgPSB2YWx1ZS52YWx1ZS50cmltKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpZWxkcy5zdGFydCB8fCBmaWVsZHMuZW5kIHx8IGZpZWxkcy52YWx1ZXMgfHwgZmllbGRzLnZhbHVlXG4gICAgICA/IGZpZWxkc1xuICAgICAgOiBudWxsO1xuICB9XG5cbiAgLy8gU2VlZHMgb25lIGdyb3VwIG9uIChyZSlsb2FkOyBzZWUgaW5pdCgpLiBgcHJldmlvdXNgIGlzIHRoZSBncm91cCBhcyB0aGVcbiAgLy8gbGFzdCBsb2FkIGhhZCBpdCwgb3IgbnVsbCB3aGVuIGl0IGlzIG5ldy5cbiAgcHJpdmF0ZSBfc2VlZChcbiAgICBncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsXG4gICAgcHJldmlvdXM6IFJlcG9ydEZpbHRlckdyb3VwIHwgbnVsbCxcbiAgICB0aW1lem9uZUNoYW5nZWQ6IGJvb2xlYW4sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRDaGFuZ2VkID0gIXNhbWVEZWZhdWx0KHByZXZpb3VzPy5jb25maWc/LmRlZmF1bHQgPz8gbnVsbCwgZ3JvdXAuY29uZmlnPy5kZWZhdWx0ID8/IG51bGwpO1xuXG4gICAgaWYgKGRlZmF1bHRDaGFuZ2VkKSB7XG4gICAgICB0aGlzLl9jbGVhcmVkLmRlbGV0ZShncm91cC5pZCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NsZWFyZWQuaGFzKGdyb3VwLmlkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fdmFsdWVzLmdldChncm91cC5pZCk7XG4gICAgY29uc3QgcHJlc2V0VG9SZXNvbHZlID0gdGltZXpvbmVDaGFuZ2VkXG4gICAgICAmJiAhIXZhbHVlPy5wcmVzZXRcbiAgICAgICYmIHZhbHVlLnByZXNldCA9PT0gZ3JvdXAuY29uZmlnPy5kZWZhdWx0Py5yZWxhdGl2ZTtcblxuICAgIGlmICh2YWx1ZSAmJiAhZGVmYXVsdENoYW5nZWQgJiYgIXByZXNldFRvUmVzb2x2ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMuX2RlZmF1bHRWYWx1ZShncm91cCk7XG5cbiAgICBpZiAoZGVmYXVsdFZhbHVlKSB7XG4gICAgICB0aGlzLl92YWx1ZXMuc2V0KGdyb3VwLmlkLCBkZWZhdWx0VmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoZGVmYXVsdENoYW5nZWQpIHtcbiAgICAgIC8vIFRoZSBkZWZhdWx0IHdhcyBjbGVhcmVkLCBzbyB0aGUgdmFsdWUgaXQgc2VlZGVkIGdvZXMgd2l0aCBpdC5cbiAgICAgIHRoaXMuX3ZhbHVlcy5kZWxldGUoZ3JvdXAuaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFwcGxpZXMgdGhlIHZpZXdlciBzdGF0ZSByZWFkIGZyb20gdGhlIFVSTCBvbiB0b3Agb2YgdGhlIHNlZWRlZCBkZWZhdWx0cy5cbiAgcHJpdmF0ZSBfcmVzdG9yZShyZXBvcnQ6IFJlcG9ydCwgcmVzdG9yZTogUmVwb3J0VXJsUGFyYW1zKTogdm9pZCB7XG4gICAgdGhpcy5fcmVzdG9yZUdyb3VwcyhyZXN0b3JlKTtcbiAgICB0aGlzLl9yZXN0b3JlTGlzdFNvcnRzKHJlcG9ydCwgcmVzdG9yZSk7XG4gICAgdGhpcy5fcmVzdG9yZUxpc3RTZWFyY2hlcyhyZXBvcnQsIHJlc3RvcmUpO1xuICAgIHRoaXMuX3Jlc3RvcmVMaXN0SGlkZGVuKHJlc3RvcmUpO1xuXG4gICAgLy8gVGhlIFVSTCBpcyB0aGUgd2hvbGUgdHJ1dGggb24gYSBmaXJzdCBsb2FkOiBubyBncmFpbiBpbiBpdCBtZWFucyB0aGVcbiAgICAvLyBhdXRob3JlZCBvbmVzLiBUaGUgaG9zdCBzdGlsbCBkcm9wcyBhIGdyYWluIHRoZSByZXBvcnQgZG9lcyBub3Qgb2ZmZXIuXG4gICAgdGhpcy5fZnJlcXVlbmN5ID0gR1JBTlVMQVJJVFlfT1BUSU9OU1xuICAgICAgLmZpbmQoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlID09PSByZXN0b3JlLmdyb3VwQnkpPy52YWx1ZSA/PyBudWxsO1xuICB9XG5cbiAgLy8gVGhlIFVSTCdzIGdyb3VwIHZhbHVlcy4gQW4gZW1wdHkgb25lIGlzIGFuIGV4cGxpY2l0IGNsZWFyIG9mIHRoZSBncm91cC5cbiAgcHJpdmF0ZSBfcmVzdG9yZUdyb3VwcyhyZXN0b3JlOiBSZXBvcnRVcmxQYXJhbXMpOiB2b2lkIHtcbiAgICByZXN0b3JlLmdyb3Vwcy5mb3JFYWNoKChyYXcsIGdyb3VwSWQpID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5fZ3JvdXBzLmdldChncm91cElkKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gZ3JvdXBcbiAgICAgICAgPyBkZWNvZGVGaWx0ZXJWYWx1ZShncm91cC50eXBlLCByYXcsIChuYW1lKSA9PiB0aGlzLnJlc29sdmVSZWxhdGl2ZShuYW1lKSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLl92YWx1ZXMuZGVsZXRlKGdyb3VwSWQpO1xuXG4gICAgICAgIGlmIChncm91cD8uY29uZmlnPy5kZWZhdWx0KSB7XG4gICAgICAgICAgdGhpcy5fY2xlYXJlZC5hZGQoZ3JvdXBJZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fdmFsdWVzLnNldChncm91cElkLCB2YWx1ZSk7XG4gICAgICAgIHRoaXMuX2NsZWFyZWQuZGVsZXRlKGdyb3VwSWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gVGhlIFVSTCdzIGxpc3Qgc29ydHMsIGVhY2gga2VwdCBvbmx5IGZvciBhIGxpc3QgdGhlIHJlcG9ydCBoYXMgYW5kIGFcbiAgLy8gY29sdW1uIHRoYXQgbGlzdCBjYW4gYmUgc29ydGVkIGJ5LlxuICBwcml2YXRlIF9yZXN0b3JlTGlzdFNvcnRzKHJlcG9ydDogUmVwb3J0LCByZXN0b3JlOiBSZXBvcnRVcmxQYXJhbXMpOiB2b2lkIHtcbiAgICBjb25zdCBsaXN0cyA9IG5ldyBNYXAodGhpcy5fbGlzdENvbXBvbmVudHMocmVwb3J0KS5tYXAoKGNvbXBvbmVudCkgPT4gW2NvbXBvbmVudC5pZCwgY29tcG9uZW50XSkpO1xuXG4gICAgcmVzdG9yZS5saXN0U29ydHMuZm9yRWFjaCgocmF3LCBjb21wb25lbnRJZCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gbGlzdHMuZ2V0KGNvbXBvbmVudElkKTtcbiAgICAgIGNvbnN0IHNvcnQgPSBkZWNvZGVTb3J0KHJhdyk7XG5cbiAgICAgIGlmIChjb21wb25lbnQgJiYgc29ydCAmJiB0aGlzLl9zb3J0YWJsZUNvbHVtbnMoY29tcG9uZW50KS5pbmNsdWRlcyhzb3J0LmNvbHVtbikpIHtcbiAgICAgICAgdGhpcy5fbGlzdFNvcnRzLnNldChjb21wb25lbnRJZCwgc29ydCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBUaGUgVVJMJ3MgbGlzdCBzZWFyY2hlcywgZWFjaCBrZXB0IG9ubHkgZm9yIGEgbGlzdCB0aGUgcmVwb3J0IGhhcyB0aGF0XG4gIC8vIHNob3dzIGEgc2VhcmNoIGJveCAobGlzdFNlYXJjaGFibGUpLiBUaGUgdGV4dCBpcyByZWFkIGFzIGxpc3RTZWFyY2hUZXh0LFxuICAvLyBhbmQgYW4gZW1wdHkgb25lIGlzIG5vIHNlYXJjaC5cbiAgcHJpdmF0ZSBfcmVzdG9yZUxpc3RTZWFyY2hlcyhyZXBvcnQ6IFJlcG9ydCwgcmVzdG9yZTogUmVwb3J0VXJsUGFyYW1zKTogdm9pZCB7XG4gICAgY29uc3QgbGlzdHMgPSBuZXcgTWFwKHRoaXMuX2xpc3RDb21wb25lbnRzKHJlcG9ydCkubWFwKChjb21wb25lbnQpID0+IFtjb21wb25lbnQuaWQsIGNvbXBvbmVudF0pKTtcblxuICAgIHJlc3RvcmUubGlzdFNlYXJjaGVzLmZvckVhY2goKHJhdywgY29tcG9uZW50SWQpID0+IHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGxpc3RzLmdldChjb21wb25lbnRJZCk7XG4gICAgICBjb25zdCBzZWFyY2ggPSBsaXN0U2VhcmNoVGV4dChyYXcpO1xuXG4gICAgICBpZiAoY29tcG9uZW50ICYmIHRoaXMubGlzdFNlYXJjaGFibGUoY29tcG9uZW50KSAmJiBzZWFyY2gpIHtcbiAgICAgICAgdGhpcy5fbGlzdFNlYXJjaGVzLnNldChjb21wb25lbnRJZCwgc2VhcmNoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIFRoZSBVUkwncyBoaWRkZW4gY29sdW1ucywgZWFjaCBsaXN0J3Mga2VwdCB0byBsaXN0SGlkZGVuQ29sdW1uczogb25seSB0aGVcbiAgLy8gY29uZmlndXJlZCBjb2x1bW5zIG9mIGEgcGxhaW4gbGlzdCB0aGUgcmVwb3J0IGhhcywgYW5kIG5vbmUgd2hlbiB0aGV5XG4gIC8vIHdvdWxkIGhpZGUgZXZlcnkgY29sdW1uLlxuICBwcml2YXRlIF9yZXN0b3JlTGlzdEhpZGRlbihyZXN0b3JlOiBSZXBvcnRVcmxQYXJhbXMpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gbmV3IE1hcCh0aGlzLmxpc3RIaWRkZW4oKSk7XG5cbiAgICByZXN0b3JlLmxpc3RIaWRkZW4uZm9yRWFjaCgocmF3LCBjb21wb25lbnRJZCkgPT4ge1xuICAgICAgY29uc3QgaGlkZGVuID0gbGlzdEhpZGRlbkNvbHVtbnModGhpcy5fbGlzdHMuZ2V0KGNvbXBvbmVudElkKT8uY29uZmlnLCBkZWNvZGVDb2x1bW5MaXN0KHJhdykpO1xuXG4gICAgICBpZiAoaGlkZGVuLmxlbmd0aCkge1xuICAgICAgICBuZXh0LnNldChjb21wb25lbnRJZCwgaGlkZGVuKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMubGlzdEhpZGRlbi5zZXQobmV4dCk7XG4gIH1cblxuICAvLyBEcm9wcyB0aGUgc2VhcmNoIG9mIGV2ZXJ5IGxpc3QgdGhhdCBubyBsb25nZXIgc2hvd3MgYSBzZWFyY2ggYm94OiBvbmVcbiAgLy8gdGhlIHJlcG9ydCBubyBsb25nZXIgaGFzLCBvciBvbmUgd2hvc2UgaGVhZGVyIG5vdyBoYXMgYSBrZXl3b3JkIGdyb3VwLlxuICBwcml2YXRlIF9kcm9wVW5zZWFyY2hhYmxlKCk6IHZvaWQge1xuICAgIHRoaXMuX2xpc3RTZWFyY2hlcy5mb3JFYWNoKChzZWFyY2gsIGNvbXBvbmVudElkKSA9PiB7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLl9saXN0cy5nZXQoY29tcG9uZW50SWQpO1xuXG4gICAgICBpZiAoIWNvbXBvbmVudCB8fCAhdGhpcy5saXN0U2VhcmNoYWJsZShjb21wb25lbnQpKSB7XG4gICAgICAgIHRoaXMuX2xpc3RTZWFyY2hlcy5kZWxldGUoY29tcG9uZW50SWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gRHJvcHMgc3RhdGUga2VwdCBmb3IgZ3JvdXBzLCBsaXN0cyBhbmQgZmlsdGVycyB0aGUgcmVwb3J0IG5vIGxvbmdlciBoYXMuXG4gIC8vIEEgbGlzdCBzb3J0IGFsc28gZ29lcyB3aGVuIGl0cyBjb2x1bW4gZG9lczogdGhlIGFnZW50IGNhbiByZW1vdmUgb3IgcmVuYW1lXG4gIC8vIGl0LCBhbmQgdGhlIHJlY3JlYXRlZCBsaXN0IHdvdWxkIHNlbmQgYSBjb2x1bW4gdGhlIHF1ZXJ5IGRvZXMgbm90IGtub3cuXG4gIC8vIEEgbGlzdCBzZWFyY2ggZ29lcyB3aXRoIGl0cyBsaXN0IChvciB3aGVuIHRoZSBjb21wb25lbnQgaXMgbm8gbG9uZ2VyIGFcbiAgLy8gbGlzdCksIGFuZCB3aGVuIHRoZSBsaXN0IGdhaW5zIGEga2V5d29yZCBncm91cCBhbmQgc28gbG9zZXMgaXRzIGJveC5cbiAgLy8gSGlkZGVuIGNvbHVtbnMga2VlcCBvbmx5IHRoZSBuYW1lcyB0aGVpciBsaXN0IHN0aWxsIGhhcyBhcyBjb2x1bW5zICh0aGVcbiAgLy8gYWdlbnQgY2FuIHJlbW92ZSBvciByZW5hbWUgb25lLCBvciB0dXJuIHRoZSBsaXN0IGludG8gYSBjcm9zcy10YWIpLCBhbmQgZ29cbiAgLy8gd2hlbiB3aGF0IGlzIGxlZnQgd291bGQgaGlkZSBldmVyeSBjb2x1bW4uXG4gIHByaXZhdGUgX3BydW5lKHJlcG9ydDogUmVwb3J0KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBncm91cElkIG9mIFsuLi50aGlzLl92YWx1ZXMua2V5cygpLCAuLi50aGlzLl9jbGVhcmVkXSkge1xuICAgICAgaWYgKCF0aGlzLl9ncm91cHMuaGFzKGdyb3VwSWQpKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlcy5kZWxldGUoZ3JvdXBJZCk7XG4gICAgICAgIHRoaXMuX2NsZWFyZWQuZGVsZXRlKGdyb3VwSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2xpc3RTb3J0cy5mb3JFYWNoKChzb3J0LCBjb21wb25lbnRJZCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5fbGlzdHMuZ2V0KGNvbXBvbmVudElkKTtcblxuICAgICAgaWYgKCFjb21wb25lbnQgfHwgIXRoaXMuX3NvcnRhYmxlQ29sdW1ucyhjb21wb25lbnQpLmluY2x1ZGVzKHNvcnQuY29sdW1uKSkge1xuICAgICAgICB0aGlzLl9saXN0U29ydHMuZGVsZXRlKGNvbXBvbmVudElkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGZpbHRlcklkcyA9IG5ldyBTZXQodGhpcy5fY29tcG9uZW50cyhyZXBvcnQpXG4gICAgICAuZmxhdE1hcCgoY29tcG9uZW50KSA9PiAoY29tcG9uZW50LmZpbHRlcnMgPz8gW10pLm1hcCgoZmlsdGVyKSA9PiBmaWx0ZXIuaWQpKSk7XG5cbiAgICB0aGlzLl9zZXNzaW9uRGlzYWJsZWQuZm9yRWFjaCgoZmlsdGVySWQpID0+IHtcbiAgICAgIGlmICghZmlsdGVySWRzLmhhcyhmaWx0ZXJJZCkpIHtcbiAgICAgICAgdGhpcy5fc2Vzc2lvbkRpc2FibGVkLmRlbGV0ZShmaWx0ZXJJZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLl9kcm9wVW5zZWFyY2hhYmxlKCk7XG5cbiAgICBjb25zdCBoaWRkZW4gPSBuZXcgTWFwPG51bWJlciwgcmVhZG9ubHkgc3RyaW5nW10+KCk7XG5cbiAgICB0aGlzLmxpc3RIaWRkZW4oKS5mb3JFYWNoKChuYW1lcywgY29tcG9uZW50SWQpID0+IHtcbiAgICAgIGNvbnN0IGtlcHQgPSBsaXN0SGlkZGVuQ29sdW1ucyh0aGlzLl9saXN0cy5nZXQoY29tcG9uZW50SWQpPy5jb25maWcsIG5hbWVzKTtcblxuICAgICAgaWYgKGtlcHQubGVuZ3RoKSB7XG4gICAgICAgIGhpZGRlbi5zZXQoY29tcG9uZW50SWQsIGtlcHQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5saXN0SGlkZGVuLnNldChoaWRkZW4pO1xuICB9XG5cbiAgLy8gVGhlIHZhbHVlIGEgYmFyIHNldHMsIGtlZXBpbmcgdGhlIHN0b3JlZCBwcmVzZXQgbmFtZSB3aGlsZSB0aGUgZGF5cyBhcmVcbiAgLy8gc3RpbGwgdGhlIHN0b3JlZCBkYXlzIChzZWUgc2V0VmFsdWUpLlxuICBwcml2YXRlIF93aXRoUHJlc2V0KHN0b3JlZDogRmlsdGVyR3JvdXBWYWx1ZSB8IHVuZGVmaW5lZCwgdmFsdWU6IEZpbHRlckdyb3VwVmFsdWUpOiBGaWx0ZXJHcm91cFZhbHVlIHtcbiAgICBjb25zdCBmaXhlZDogRmlsdGVyR3JvdXBWYWx1ZSA9IHsgLi4udmFsdWUgfTtcbiAgICBkZWxldGUgZml4ZWQucHJlc2V0O1xuXG4gICAgcmV0dXJuIHN0b3JlZD8ucHJlc2V0ICYmIHNhbWVEYXlzKHN0b3JlZCwgZml4ZWQpXG4gICAgICA/IHsgLi4uZml4ZWQsIHByZXNldDogc3RvcmVkLnByZXNldCB9XG4gICAgICA6IGZpeGVkO1xuICB9XG5cbiAgLy8gV2hldGhlciBhIHZhbHVlIGlzIHRoZSBncm91cCdzIGF1dGhvcmVkIGRlZmF1bHQsIGJ5IHR5cGU6IGEgZGF0ZSByYW5nZSBvblxuICAvLyBpdHMgZGF5cyAodGhlIGRlZmF1bHQgcmVzb2x2ZWQgdG9kYXkpLCBhIHNlbGVjdCBvbiBpdHMgdmFsdWVzIGluIGFueVxuICAvLyBvcmRlciwgYSBrZXl3b3JkIG9uIGl0cyB0ZXh0LlxuICBwcml2YXRlIF9pc0RlZmF1bHQoZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwLCB2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMuX2RlZmF1bHRWYWx1ZShncm91cCk7XG4gICAgaWYgKCFkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGdyb3VwLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2RhdGVSYW5nZSc6XG4gICAgICAgIC8vIEFuIHVudG91Y2hlZCByb2xsaW5nIGRlZmF1bHQgc3RpbGwgY2FycmllcyBpdHMgcHJlc2V0IG5hbWUuIEl0cyBkYXlzXG4gICAgICAgIC8vIHdlcmUgcmVzb2x2ZWQgd2hlbiBpdCB3YXMgc2VlZGVkLCBhbmQgYWZ0ZXIgbWlkbmlnaHQgdGhleSBubyBsb25nZXJcbiAgICAgICAgLy8gbWF0Y2ggdG9kYXkncywgYnV0IGl0IGlzIHN0aWxsIHRoZSBkZWZhdWx0IGFuZCBzdGF5cyBvdXQgb2YgdGhlIFVSTC5cbiAgICAgICAgaWYgKHZhbHVlLnByZXNldCAmJiB2YWx1ZS5wcmVzZXQgPT09IGdyb3VwLmNvbmZpZz8uZGVmYXVsdD8ucmVsYXRpdmUpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzYW1lRGF5cyh2YWx1ZSwgZGVmYXVsdFZhbHVlKTtcblxuICAgICAgY2FzZSAnc2VsZWN0Jzoge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSAodmFsdWUudmFsdWVzID8/IFtdKS5tYXAoU3RyaW5nKS5zb3J0KCk7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRzID0gKGRlZmF1bHRWYWx1ZS52YWx1ZXMgPz8gW10pLm1hcChTdHJpbmcpLnNvcnQoKTtcblxuICAgICAgICByZXR1cm4gdmFsdWVzLmxlbmd0aCA9PT0gZGVmYXVsdHMubGVuZ3RoXG4gICAgICAgICAgJiYgdmFsdWVzLmV2ZXJ5KChpdGVtLCBpbmRleCkgPT4gaXRlbSA9PT0gZGVmYXVsdHNbaW5kZXhdKTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICh2YWx1ZS52YWx1ZSA/PyAnJykudHJpbSgpID09PSAoZGVmYXVsdFZhbHVlLnZhbHVlID8/ICcnKS50cmltKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRXZlcnkgY29tcG9uZW50IG9mIHRoZSByZXBvcnQ6IGl0cyBwYWdlcycgYW5kIGl0cyBoZWFkZXIgYW5kIGZvb3RlcidzLlxuICBwcml2YXRlIF9jb21wb25lbnRzKHJlcG9ydDogUmVwb3J0KTogUmVwb3J0Q29tcG9uZW50W10ge1xuICAgIHJldHVybiBbXG4gICAgICAuLi4ocmVwb3J0LnBhZ2VzID8/IFtdKS5mbGF0TWFwKChwYWdlKSA9PiBwYWdlLmNvbXBvbmVudHMgPz8gW10pLFxuICAgICAgLi4uKHJlcG9ydC5tYXN0ZXI/LmNvbXBvbmVudHMgPz8gW10pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIF9saXN0Q29tcG9uZW50cyhyZXBvcnQ6IFJlcG9ydCk6IFJlcG9ydENvbXBvbmVudFtdIHtcbiAgICByZXR1cm4gdGhpcy5fY29tcG9uZW50cyhyZXBvcnQpXG4gICAgICAuZmlsdGVyKChjb21wb25lbnQpID0+IGNvbXBvbmVudC50eXBlID09PSAnbGlzdCcpO1xuICB9XG5cbiAgLy8gVGhlIGNvbHVtbnMgYSBsaXN0IGNhbiBiZSBzb3J0ZWQgYnk6IGV2ZXJ5IGF1dGhvcmVkIGNvbHVtbiwgb3IgYVxuICAvLyBjcm9zcy10YWIncyByb3cgY29sdW1uIG9ubHkgKGl0cyBwaXZvdCBjb2x1bW5zIGNvbWUgYW5kIGdvIHdpdGggdGhlIGRhdGEpLlxuICBwcml2YXRlIF9zb3J0YWJsZUNvbHVtbnMoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgY29uZmlnID0gY29tcG9uZW50LmNvbmZpZztcblxuICAgIGlmIChjb25maWc/LnBpdm90Qnk/LmNvbHVtbikge1xuICAgICAgcmV0dXJuIGNvbmZpZy5yb3dCeT8uY29sdW1uID8gW2NvbmZpZy5yb3dCeS5jb2x1bW5dIDogW107XG4gICAgfVxuXG4gICAgcmV0dXJuIChjb25maWc/LmNvbHVtbnMgPz8gW10pLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4uY29sdW1uKTtcbiAgfVxuXG4gIC8vIEEgZ3JvdXAncyBhdXRob3JlZCBkZWZhdWx0LCBtYXBwZWQgdG8gYSBzZXNzaW9uIHZhbHVlIGJ5IHR5cGUuIFJlbGF0aXZlXG4gIC8vIGRhdGUgcHJlc2V0cyByZXNvbHZlIGFnYWluc3QgXCJub3dcIiBlYWNoIHRpbWUgdGhlIHJlcG9ydCBvcGVucywgc28gYSBzYXZlZFxuICAvLyBcImxhc3QgMTIgbW9udGhzXCIgc3RheXMgcmVsYXRpdmUgYW5kIGNhcnJpZXMgaXRzIHByZXNldCBuYW1lOyBhIGZpeGVkXG4gIC8vIHJhbmdlLCBzZWxlY3QgdmFsdWVzIGFuZCBrZXl3b3JkIHRleHQgc2VlZCB2ZXJiYXRpbS5cbiAgcHJpdmF0ZSBfZGVmYXVsdFZhbHVlKGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCk6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHtcbiAgICBjb25zdCBncm91cERlZmF1bHQgPSBncm91cC5jb25maWc/LmRlZmF1bHQ7XG4gICAgaWYgKCFncm91cERlZmF1bHQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChncm91cERlZmF1bHQucmVsYXRpdmUpIHtcbiAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5fcmVsYXRpdmVSYW5nZShncm91cERlZmF1bHQucmVsYXRpdmUpO1xuXG4gICAgICByZXR1cm4gcmFuZ2UgPyB7IHN0YXJ0OiByYW5nZS5zdGFydCwgZW5kOiByYW5nZS5lbmQsIHByZXNldDogZ3JvdXBEZWZhdWx0LnJlbGF0aXZlIH0gOiBudWxsO1xuICAgIH1cblxuICAgIGlmIChncm91cERlZmF1bHQuc3RhcnQgfHwgZ3JvdXBEZWZhdWx0LmVuZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQ6IGdyb3VwRGVmYXVsdC5zdGFydCA/PyBudWxsLFxuICAgICAgICBlbmQ6IGdyb3VwRGVmYXVsdC5lbmQgPz8gbnVsbCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwRGVmYXVsdC52YWx1ZXM/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHsgdmFsdWVzOiBncm91cERlZmF1bHQudmFsdWVzIH07XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwRGVmYXVsdC52YWx1ZSkge1xuICAgICAgcmV0dXJuIHsgdmFsdWU6IGdyb3VwRGVmYXVsdC52YWx1ZSB9O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQSByZWxhdGl2ZSBwcmVzZXQgYXMgYSBjYWxlbmRhci1kYXkgcmFuZ2UuIFwiVG9kYXlcIiBpcyB0aGUgZGF5IGluIHRoZVxuICAvLyByZXBvcnQncyBlZmZlY3RpdmUgem9uZSwgbm90IHRoZSBicm93c2VyJ3MsIHNvIGV2ZXJ5IHZpZXdlciBzZWVkcyB0aGUgc2FtZVxuICAvLyByYW5nZS4gVGhlIHNlcnZlciB0d2luIGlzIFJlcG9ydFJlbGF0aXZlUmFuZ2VFbnVtIChmcmFtZXdvcmsvUmVwb3J0L0VudW0pLFxuICAvLyBhbmQgUmVwb3J0UmVsYXRpdmVSYW5nZUVudW1UZXN0IHBpbnMgdGhlIHRhYmxlIGJvdGggc2lkZXMgbXVzdCBwcm9kdWNlLlxuICBwcml2YXRlIF9yZWxhdGl2ZVJhbmdlKHJlbGF0aXZlOiBzdHJpbmcpOiB7IHN0YXJ0OiBEYXRlOyBlbmQ6IERhdGUgfSB8IG51bGwge1xuICAgIGNvbnN0IG5vdyA9IGdldFpvbmVkTm93KHRoaXMudGltZXpvbmUoKSk7XG5cbiAgICBzd2l0Y2ggKHJlbGF0aXZlKSB7XG4gICAgICAvLyBBIGNhbGVuZGFyIHdlZWssIE1vbmRheSB0byBTdW5kYXkgKFJFUE9SVF9XRUVLX1NUQVJUU19PTiwgdGhlIHNhbWUgd2Vla1xuICAgICAgLy8gdGhlIHNlcnZlcidzIHdlZWtseSBidWNrZXRzIHVzZSksIGluIHdob2xlIGRheXMg4oCUIG5vdCB0aGUgcm9sbGluZ1xuICAgICAgLy8gc2V2ZW4gZGF5cyBgbGFzdDdEYXlzYCBnaXZlcywgd2hpY2ggbmV2ZXIgbGluZXMgdXAgd2l0aCB0aGUgd2VlayBhXG4gICAgICAvLyBwYXJ0bmVyIGhhcyBhbHJlYWR5IGJlZW4gc2VudC4gYGxhc3RXZWVrYCBpcyB0aGUgb25lIGEgd2Vla2x5IHJlcG9ydFxuICAgICAgLy8gd2FudHM6IGl0IGVuZHMgb24gdGhlIHByZXZpb3VzIHdlZWsncyBTdW5kYXkgcmF0aGVyIHRoYW4gYXQgYG5vd2AsXG4gICAgICAvLyBiZWNhdXNlIHRoZSB3ZWVrIGl0IG5hbWVzIGhhcyBjbG9zZWQuIGB0aGlzV2Vla2AgZm9sbG93cyBldmVyeSBvdGhlclxuICAgICAgLy8gcHJlc2V0IGhlcmUgYW5kIHJ1bnMgdXAgdG8gbm93LCBzbyBpdCBpcyBkZWxpYmVyYXRlbHkgYSBwYXJ0LWZpbmlzaGVkXG4gICAgICAvLyB3ZWVrIChvbiBhIFN1bmRheSBpdCBpcyB0aGUgd2hvbGUgTW9uZGF5LXRvLVN1bmRheSB3ZWVrKS5cbiAgICAgIGNhc2UgJ3RoaXNXZWVrJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0T2ZXZWVrKG5vdywgeyB3ZWVrU3RhcnRzT246IFJFUE9SVF9XRUVLX1NUQVJUU19PTiB9KSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ2xhc3RXZWVrJzoge1xuICAgICAgICBjb25zdCBwcmV2aW91cyA9IHN1YldlZWtzKG5vdywgMSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdGFydDogc3RhcnRPZldlZWsocHJldmlvdXMsIHsgd2Vla1N0YXJ0c09uOiBSRVBPUlRfV0VFS19TVEFSVFNfT04gfSksXG4gICAgICAgICAgZW5kOiBlbmRPZldlZWsocHJldmlvdXMsIHsgd2Vla1N0YXJ0c09uOiBSRVBPUlRfV0VFS19TVEFSVFNfT04gfSksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjYXNlICdsYXN0N0RheXMnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3ViRGF5cyhub3csIDcpLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAnbGFzdDMwRGF5cyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJEYXlzKG5vdywgMzApLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAnbGFzdDNNb250aHMnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3ViTW9udGhzKG5vdywgMyksIGVuZDogbm93IH07XG4gICAgICBjYXNlICdsYXN0Nk1vbnRocyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJNb250aHMobm93LCA2KSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ2xhc3QxMk1vbnRocyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJNb250aHMobm93LCAxMiksIGVuZDogbm93IH07XG4gICAgICBjYXNlICd0aGlzTW9udGgnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3RhcnRPZk1vbnRoKG5vdyksIGVuZDogbm93IH07XG4gICAgICBjYXNlICd0aGlzUXVhcnRlcic6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydE9mUXVhcnRlcihub3cpLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAndGhpc1llYXInOlxuICAgICAgY2FzZSAneWVhclRvRGF0ZSc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydE9mWWVhcihub3cpLCBlbmQ6IG5vdyB9O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG59XG4iXX0=
779
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxJQUFJLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpELE9BQU8sRUFDTCxTQUFTLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUNqRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsR0FDN0IsTUFBTSxVQUFVLENBQUM7QUFFbEIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDcEUsT0FBTyxFQUNMLHNCQUFzQixFQUFFLFdBQVcsRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsR0FDakYsTUFBTSxXQUFXLENBQUM7QUFFbkIsT0FBTyxFQUlMLG1CQUFtQixHQVVwQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDOztBQUd0Riw4RUFBOEU7QUFDOUUscUVBQXFFO0FBQ3JFLE1BQU0sZUFBZSxHQUFzQztJQUN6RCxRQUFRLEVBQUUsSUFBSTtJQUNkLFFBQVEsRUFBRSxJQUFJO0lBQ2QsU0FBUyxFQUFFLElBQUk7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R0FBRyxFQUFFLENBQUM7WUFDbEQsS0FBSyxVQUFVLENBQUM7WUFDaEIsS0FBSyxZQUFZO2dCQUNmLE9BQU8sRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUMvQztnQkFDRSxPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDO0lBQ0gsQ0FBQzt3R0Exd0JVLHdCQUF3Qjs0R0FBeEIsd0JBQXdCOzs0RkFBeEIsd0JBQXdCO2tCQURwQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgZmlsdGVyIGFzIHJ4RmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge1xuICBlbmRPZldlZWssIHN0YXJ0T2ZNb250aCwgc3RhcnRPZlF1YXJ0ZXIsIHN0YXJ0T2ZXZWVrLCBzdGFydE9mWWVhcixcbiAgc3ViRGF5cywgc3ViTW9udGhzLCBzdWJXZWVrcyxcbn0gZnJvbSAnZGF0ZS1mbnMnO1xuXG5pbXBvcnQgeyBSRVBPUlRfV0VFS19TVEFSVFNfT04gfSBmcm9tICcuLi9jb25zdHMvcmVwb3J0LXdlZWsuY29uc3QnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9GT1JNQVRfQ09OVEVYVCwgZ2V0Wm9uZWROb3csIHJlc29sdmVGb3JtYXRDb250ZXh0LCByZXNvbHZlUmVwb3J0VGltZXpvbmUsXG59IGZyb20gJy4uL2Zvcm1hdCc7XG5pbXBvcnQgeyBSZXBvcnRDaGF0Vmlld2VyRmlsdGVyIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtY2hhdC12aWV3ZXItZmlsdGVyLmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBDaGFydEdyYW51bGFyaXR5LFxuICBGaWx0ZXJHcm91cERlZmF1bHQsXG4gIEZpbHRlckdyb3VwVmFsdWUsXG4gIEdSQU5VTEFSSVRZX09QVElPTlMsXG4gIFJlcG9ydCxcbiAgUmVwb3J0Q29tcG9uZW50LFxuICBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgUmVwb3J0Rm9ybWF0Q29udGV4dCxcbiAgUmVwb3J0UmVsYXRpdmVSYW5nZSxcbiAgUmVwb3J0U29ydCxcbiAgUmVwb3J0VXJsUGFyYW1zLFxuICBSZXBvcnRVcmxTbmFwc2hvdCxcbiAgUmVzb2x2ZWRGaWx0ZXJWYWx1ZSxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IGxpc3RIaWRkZW5Db2x1bW5zLCBsaXN0U29ydFRlcm1zIH0gZnJvbSAnLi4vbGlzdC1jb25maWcnO1xuaW1wb3J0IHsgZGF0ZUJvdW5kU3RyaW5nLCBMSVNUX1NFQVJDSF9NQVhfTEVOR1RIIH0gZnJvbSAnLi4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XG5pbXBvcnQgeyBkZWNvZGVDb2x1bW5MaXN0LCBkZWNvZGVGaWx0ZXJWYWx1ZSwgZGVjb2RlU29ydCB9IGZyb20gJy4uL3JlcG9ydC11cmwtc3RhdGUnO1xuXG5cbi8vIEV2ZXJ5IHJlbGF0aXZlIHJhbmdlIG5hbWUgdGhlIHNlcnZlciBrbm93cy4gQSByZWNvcmQgcmF0aGVyIHRoYW4gYSBsaXN0LCBzb1xuLy8gdGhlIGJ1aWxkIGZhaWxzIHdoZW4gUmVwb3J0UmVsYXRpdmVSYW5nZSBnYWlucyBhIG5hbWUgdGhpcyBtaXNzZXMuXG5jb25zdCBSRUxBVElWRV9SQU5HRVM6IFJlY29yZDxSZXBvcnRSZWxhdGl2ZVJhbmdlLCB0cnVlPiA9IHtcbiAgdGhpc1dlZWs6IHRydWUsXG4gIGxhc3RXZWVrOiB0cnVlLFxuICBsYXN0N0RheXM6IHRydWUsXG4gIGxhc3QzMERheXM6IHRydWUsXG4gIGxhc3QzTW9udGhzOiB0cnVlLFxuICBsYXN0Nk1vbnRoczogdHJ1ZSxcbiAgbGFzdDEyTW9udGhzOiB0cnVlLFxuICB0aGlzTW9udGg6IHRydWUsXG4gIHRoaXNRdWFydGVyOiB0cnVlLFxuICB0aGlzWWVhcjogdHJ1ZSxcbiAgeWVhclRvRGF0ZTogdHJ1ZSxcbn07XG5cblxuLy8gV2hldGhlciBhIHN0b3JlZCBwcmVzZXQgbmFtZSBpcyBvbmUgdGhlIHNlcnZlciByZXNvbHZlcyAoUmVwb3J0UmVsYXRpdmVSYW5nZSkuXG5mdW5jdGlvbiBpc1JlbGF0aXZlUmFuZ2UobmFtZTogc3RyaW5nKTogbmFtZSBpcyBSZXBvcnRSZWxhdGl2ZVJhbmdlIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChSRUxBVElWRV9SQU5HRVMsIG5hbWUpO1xufVxuXG5cbi8vIFdoZXRoZXIgdHdvIHN0b3JlZCBmaWx0ZXItZ3JvdXAgZGVmYXVsdHMgYXJlIHRoZSBzYW1lLiBDb21wYXJlZCBvbiB0aGUgZmllbGRzIGFcbi8vIGRlZmF1bHQgY2FuIGFjdHVhbGx5IGNhcnJ5LCBzbyBrZXkgb3JkZXIgaW4gdGhlIHBheWxvYWQgY2FuJ3QgcmVhZCBhcyBhIGNoYW5nZS5cbmV4cG9ydCBmdW5jdGlvbiBzYW1lRGVmYXVsdChcbiAgYTogRmlsdGVyR3JvdXBEZWZhdWx0IHwgbnVsbCxcbiAgYjogRmlsdGVyR3JvdXBEZWZhdWx0IHwgbnVsbCxcbik6IGJvb2xlYW4ge1xuICBpZiAoIWEgfHwgIWIpIHtcbiAgICByZXR1cm4gIWEgJiYgIWI7XG4gIH1cblxuICByZXR1cm4gYS5zdGFydCA9PT0gYi5zdGFydFxuICAgICYmIGEuZW5kID09PSBiLmVuZFxuICAgICYmIGEudmFsdWUgPT09IGIudmFsdWVcbiAgICAmJiBhLnJlbGF0aXZlID09PSBiLnJlbGF0aXZlXG4gICAgJiYgKGEudmFsdWVzID8/IFtdKS5sZW5ndGggPT09IChiLnZhbHVlcyA/PyBbXSkubGVuZ3RoXG4gICAgJiYgKGEudmFsdWVzID8/IFtdKS5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiB2YWx1ZSA9PT0gKGIudmFsdWVzID8/IFtdKVtpbmRleF0pO1xufVxuXG5cbi8vIFdoZXRoZXIgdHdvIGxpc3Qgc29ydHMgb3JkZXIgdGhlIHJvd3MgdGhlIHNhbWUgd2F5LiBObyBkaXJlY3Rpb24gcmVhZHMgYXNcbi8vIGFzY2VuZGluZywgdGhlIHdheSB0aGUgbGlzdCBhcHBsaWVzIGl0LlxuZnVuY3Rpb24gc2FtZVNvcnQoYTogUmVwb3J0U29ydCwgYjogUmVwb3J0U29ydCB8IG51bGwpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhYlxuICAgICYmIGEuY29sdW1uID09PSBiLmNvbHVtblxuICAgICYmIChhLmRpcmVjdGlvbiA/PyAnYXNjJykgPT09IChiLmRpcmVjdGlvbiA/PyAnYXNjJyk7XG59XG5cblxuLy8gV2hldGhlciBhIHZhbHVlIHJlYWQgb2ZmIGEgZmlsdGVyIGJhciBpcyB0aGUgdmFsdWUgYWxyZWFkeSBzdG9yZWQgZm9yIGl0c1xuLy8gZ3JvdXA6IHRoZSBzYW1lIGNhbGVuZGFyIGRheXMsIHRoZSBzYW1lIHNlbGVjdCB2YWx1ZXMgaW4gdGhlIHNhbWUgb3JkZXIgYW5kXG4vLyB0aGUgc2FtZSB0cmltbWVkIHRleHQuIEEgYmFyIHJlLXJlYWRzIGV2ZXJ5IGdyb3VwIGl0IHNob3dzIG9uIGFueSBjaGFuZ2UsIHNvXG4vLyB0aGlzIGlzIHdoYXQgdGVsbHMgdGhlIGdyb3VwIHRoYXQgY2hhbmdlZCBmcm9tIHRoZSBvbmVzIHRoYXQgZGlkIG5vdC5cbmV4cG9ydCBmdW5jdGlvbiBzYW1lRmlsdGVyVmFsdWUoXG4gIGE6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBiOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbik6IGJvb2xlYW4ge1xuICBpZiAoIWEgfHwgIWIpIHtcbiAgICByZXR1cm4gIWEgJiYgIWI7XG4gIH1cblxuICBjb25zdCB2YWx1ZXMgPSAodmFsdWU6IEZpbHRlckdyb3VwVmFsdWUpID0+ICh2YWx1ZS52YWx1ZXMgPz8gW10pLm1hcChTdHJpbmcpO1xuXG4gIHJldHVybiBzYW1lRGF5cyhhLCBiKVxuICAgICYmIHZhbHVlcyhhKS5qb2luKCdcXHUwMDAwJykgPT09IHZhbHVlcyhiKS5qb2luKCdcXHUwMDAwJylcbiAgICAmJiB2YWx1ZXMoYSkubGVuZ3RoID09PSB2YWx1ZXMoYikubGVuZ3RoXG4gICAgJiYgKGEudmFsdWUgPz8gJycpLnRyaW0oKSA9PT0gKGIudmFsdWUgPz8gJycpLnRyaW0oKTtcbn1cblxuXG4vLyBUaGUgZ3JvdXBzIGEgYmFyIHJlLXJlYWQgdGhhdCBpdCBub3cgc2hvd3Mgd2l0aCBhIHZhbHVlIG90aGVyIHRoYW4gdGhlIG9uZVxuLy8gaXQgbGFzdCByZXBvcnRlZCwgcmVjb3JkaW5nIGVhY2ggbmV3IHZhbHVlIGluIGBsYXN0UmVwb3J0ZWRgLiBBIGJhciBpc1xuLy8gY29tcGFyZWQgd2l0aCBpdHNlbGYsIG5ldmVyIHdpdGggdGhlIHN0b3JlZCB2YWx1ZTogYSBncm91cCBzaG93biBpbiB0d28gYmFyc1xuLy8gKGxldmVsICdib3RoJykgY2FuIGJlIGNoYW5nZWQgaW4gdGhlIG90aGVyIG9uZSwgYW5kIHRoaXMgYmFyIGlzIG5vdFxuLy8gcmVwYWludGVkLCBzbyBpdHMgc3RhbGUgdmFsdWUgbXVzdCBub3QgYmUgc2V0IGJhY2sgd2hlbiB0aGUgdmlld2VyIGNoYW5nZXNcbi8vIGFub3RoZXIgb2YgaXRzIGl0ZW1zICh0aGUgbGlzdCBzZWFyY2ggYm94LCBzYXkpLlxuZXhwb3J0IGZ1bmN0aW9uIG1vdmVkR3JvdXBWYWx1ZXMoXG4gIGxhc3RSZXBvcnRlZDogTWFwPG51bWJlciwgRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGw+LFxuICByZXBvcnRlZDogeyBncm91cElkOiBudW1iZXI7IHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB9W10sXG4pOiB7IGdyb3VwSWQ6IG51bWJlcjsgdmFsdWU6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIH1bXSB7XG4gIHJldHVybiByZXBvcnRlZC5maWx0ZXIoKHsgZ3JvdXBJZCwgdmFsdWUgfSkgPT4ge1xuICAgIGlmIChzYW1lRmlsdGVyVmFsdWUobGFzdFJlcG9ydGVkLmdldChncm91cElkKSwgdmFsdWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbGFzdFJlcG9ydGVkLnNldChncm91cElkLCB2YWx1ZSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cblxuLy8gQSBsaXN0J3Mgc2VhcmNoIHRleHQgYXMgdGhlIHNlcnZlciBhcHBsaWVzIGl0OiB0cmltbWVkLCB0aGVuIGN1dCB0b1xuLy8gTElTVF9TRUFSQ0hfTUFYX0xFTkdUSCBjaGFyYWN0ZXJzIChjb2RlIHBvaW50cywgYXMgdGhlIHNlcnZlciBjb3VudHMgdGhlbSkuXG5leHBvcnQgZnVuY3Rpb24gbGlzdFNlYXJjaFRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIFsuLi50ZXh0LnRyaW0oKV0uc2xpY2UoMCwgTElTVF9TRUFSQ0hfTUFYX0xFTkdUSCkuam9pbignJyk7XG59XG5cblxuLy8gV2hldGhlciB0d28gbGlzdHMgb2YgY29sdW1uIG5hbWVzIGFyZSB0aGUgc2FtZSBuYW1lcyBpbiB0aGUgc2FtZSBvcmRlci5cbmZ1bmN0aW9uIHNhbWVOYW1lcyhhOiByZWFkb25seSBzdHJpbmdbXSwgYjogcmVhZG9ubHkgc3RyaW5nW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIGEubGVuZ3RoID09PSBiLmxlbmd0aCAmJiBhLmV2ZXJ5KChuYW1lLCBpbmRleCkgPT4gbmFtZSA9PT0gYltpbmRleF0pO1xufVxuXG5cbi8vIFdoZXRoZXIgdHdvIGhpZGRlbi1jb2x1bW4gbWFwcyBoaWRlIHRoZSBzYW1lIGNvbHVtbnMgb24gdGhlIHNhbWUgbGlzdHMuXG5mdW5jdGlvbiBzYW1lSGlkZGVuKFxuICBhOiBSZWFkb25seU1hcDxudW1iZXIsIHJlYWRvbmx5IHN0cmluZ1tdPixcbiAgYjogUmVhZG9ubHlNYXA8bnVtYmVyLCByZWFkb25seSBzdHJpbmdbXT4sXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIGEuc2l6ZSA9PT0gYi5zaXplXG4gICAgJiYgWy4uLmFdLmV2ZXJ5KChbY29tcG9uZW50SWQsIG5hbWVzXSkgPT4gc2FtZU5hbWVzKG5hbWVzLCBiLmdldChjb21wb25lbnRJZCkgPz8gW10pKTtcbn1cblxuXG4vLyBXaGV0aGVyIHR3byBkYXRlLXJhbmdlIHZhbHVlcyBjb3ZlciB0aGUgc2FtZSBjYWxlbmRhciBkYXlzLlxuZnVuY3Rpb24gc2FtZURheXMoYTogRmlsdGVyR3JvdXBWYWx1ZSwgYjogRmlsdGVyR3JvdXBWYWx1ZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZGF0ZUJvdW5kU3RyaW5nKGEuc3RhcnQpID09PSBkYXRlQm91bmRTdHJpbmcoYi5zdGFydClcbiAgICAmJiBkYXRlQm91bmRTdHJpbmcoYS5lbmQpID09PSBkYXRlQm91bmRTdHJpbmcoYi5lbmQpO1xufVxuXG5cbi8vIEEgc3RhYmxlIHNpZ25hdHVyZSBmb3IgYSBncm91cCdzIHN0b3JlZCBkZWZhdWx0LiBUaGUgcmVwb3J0IHRvb2xiYXIga2V5cyBpdHNcbi8vIGZzLWZpbHRlciBvbiB0aGlzLCBiZWNhdXNlIGZzLWZpbHRlciByZWFkcyBpdHMgY29uZmlnIG9uY2UgYXQgaW5pdCDigJQgd2l0aG91dCBhXG4vLyBrZXkgY2hhbmdlIGl0IGtlZXBzIHJlbmRlcmluZyB0aGUgdmFsdWVzIGl0IHdhcyBjcmVhdGVkIHdpdGggZXZlbiBhZnRlciB0aGVcbi8vIGNvbmZpZyBiZWhpbmQgaXQgaGFzIGJlZW4gcmVidWlsdC5cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0U2lnbmF0dXJlKGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCk6IHN0cmluZyB7XG4gIGNvbnN0IGdyb3VwRGVmYXVsdCA9IGdyb3VwLmNvbmZpZz8uZGVmYXVsdDtcblxuICBpZiAoIWdyb3VwRGVmYXVsdCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHJldHVybiBbXG4gICAgZ3JvdXBEZWZhdWx0LnN0YXJ0ID8/ICcnLFxuICAgIGdyb3VwRGVmYXVsdC5lbmQgPz8gJycsXG4gICAgZ3JvdXBEZWZhdWx0LnZhbHVlID8/ICcnLFxuICAgIGdyb3VwRGVmYXVsdC5yZWxhdGl2ZSA/PyAnJyxcbiAgICAoZ3JvdXBEZWZhdWx0LnZhbHVlcyA/PyBbXSkuam9pbignLCcpLFxuICBdLmpvaW4oJ34nKTtcbn1cblxuXG4vLyBWaWV3ZXIgZmlsdGVyIHN0YXRlIGZvciB0aGUgb3BlbiByZXBvcnQuIEZpbHRlciBWQUxVRVMgYXJlIG5ldmVyIHNhdmVkIHRvXG4vLyB0aGUgcmVwb3J0IOKAlCB0aGlzIHNlcnZpY2UgaG9sZHMgdGhlbSBwZXIgZmlsdGVyIEdST1VQICh0aGUgcHJvcGFnYXRpb24gdW5pdCksXG4vLyByZXNvbHZlcyB0aGVtIGludG8gcGVyLWNvbXBvbmVudCBtZW1iZXItZmlsdGVyIHZhbHVlcyBmb3IgZWFjaCBkYXRhIHJlcXVlc3QsXG4vLyBhbmQgbm90aWZpZXMgdGhlIGNvbXBvbmVudHMgd2hvc2UgZ3JvdXBzIGNoYW5nZWQgc28gb25seSB0aGV5IHJlZmV0Y2guXG4vL1xuLy8gSXQgaXMgYWxzbyB0aGUgb25lIHNvdXJjZSBvZiB0aGUgdmlld2VyIHN0YXRlIHRoZSByZXBvcnQgVVJMIGNhcnJpZXMgKGdyb3VwXG4vLyB2YWx1ZXMsIHRoZSBncm91cC1ieSBncmFpbiwgbGlzdCBzb3J0cywgc2VhcmNoZXMgYW5kIGhpZGRlbiBjb2x1bW5zKTpcbi8vIHVybFNuYXBzaG90KCkgc2F5cyB3aGF0IGRpZmZlcnMgZnJvbSB0aGUgYXV0aG9yZWQgZGVmYXVsdHMsIGluaXQoKSByZXN0b3Jlc1xuLy8gaXQsIGFuZCB1cmxDaGFuZ2VzKCkgdGVsbHMgdGhlIGhvc3QncyBzaW5nbGUgVVJMIHdyaXRlciB3aGVuIHRvIHdyaXRlLlxuLy9cbi8vIFNlc3Npb24tb25seSwgbmV2ZXIgaW4gdGhlIFVSTDogcGVyLWZpbHRlciBlbmFibGUvZGlzYWJsZSB0b2dnbGVzIGZyb20gYVxuLy8gY29tcG9uZW50J3MgZmlsdGVyIG1lbnUgKHRoZSBgZW5hYmxlZGAgY29sdW1uIGlzIHRoZSBhdXRob3JlZCBkZWZhdWx0OyBhXG4vLyB2aWV3ZXIncyB0b2dnbGUgc2hvdWxkbid0IHdyaXRlIHRvIHRoZSByZXBvcnQpLlxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSB7XG5cbiAgLy8gVGhlIG9wZW4gcmVwb3J0J3MgZWZmZWN0aXZlIHpvbmUgKHJlc29sdmVSZXBvcnRUaW1lem9uZSkuIFJlbGF0aXZlIHByZXNldHNcbiAgLy8gcmVzb2x2ZSBhZ2FpbnN0IHRvZGF5IGluIGl0LCBhbmQgZGF0ZSBjZWxscyByZW5kZXIgaW4gaXQuXG4gIHB1YmxpYyByZWFkb25seSB0aW1lem9uZSA9IHNpZ25hbDxzdHJpbmc+KCdVVEMnKTtcblxuICAvLyBIb3cgdGhlIG9wZW4gcmVwb3J0IHdyaXRlcyBpdHMgbnVtYmVycyBhbmQgZGF0ZXMgKHJlc29sdmVGb3JtYXRDb250ZXh0KTpcbiAgLy8gaXRzIGxvY2FsZSwgaXRzIGN1cnJlbmN5IGFuZCB3aGV0aGVyIHBlcmNlbnRzIGFycml2ZSBhcyByYXRpb3MuIEV2ZXJ5IEtQSSxcbiAgLy8gY2hhcnQsIGRhdGUgY2VsbCBhbmQgZXhwb3J0IHJlYWRzIGl0IGhlcmUuIENvbXBhcmVkIGJ5IHZhbHVlLCBzbyBhIHJlbG9hZFxuICAvLyBvZiBhbiB1bmNoYW5nZWQgcmVwb3J0IHJlLXJlbmRlcnMgbm90aGluZy5cbiAgcHVibGljIHJlYWRvbmx5IGZvcm1hdENvbnRleHQgPSBzaWduYWw8UmVwb3J0Rm9ybWF0Q29udGV4dD4oREVGQVVMVF9GT1JNQVRfQ09OVEVYVCwge1xuICAgIGVxdWFsOiAoYSwgYikgPT4gYS5sb2NhbGUgPT09IGIubG9jYWxlXG4gICAgICAmJiBhLmN1cnJlbmN5ID09PSBiLmN1cnJlbmN5XG4gICAgICAmJiBhLnJhdGlvUGVyY2VudCA9PT0gYi5yYXRpb1BlcmNlbnQsXG4gIH0pO1xuXG4gIC8vIFRoZSBjb25maWcgY29sdW1ucyBhIHZpZXdlciBoaWQgb24gZWFjaCBwbGFpbiBsaXN0IChsaXN0SGlkZGVuQ29sdW1ucyksXG4gIC8vIGJ5IGNvbXBvbmVudCBpZDsgYSBsaXN0IHNob3dpbmcgZXZlcnkgY29sdW1uIGhhcyBubyBlbnRyeS4gQSBzaWduYWwsIHNvIGFcbiAgLy8gbGlzdCBoaWRlcyBhbmQgc2hvd3MgaXRzIGNvbHVtbnMgaW4gcGxhY2U6IHRoZSByb3dzIGRvIG5vdCBjaGFuZ2UsIHNvXG4gIC8vIG5vdGhpbmcgcmVmZXRjaGVzLiBDb21wYXJlZCBieSB2YWx1ZSwgc28gYSByZWxvYWQgdGhhdCBrZWVwcyBldmVyeSBjb2x1bW5cbiAgLy8gcmVwYWludHMgbm90aGluZy5cbiAgcHVibGljIHJlYWRvbmx5IGxpc3RIaWRkZW4gPSBzaWduYWw8UmVhZG9ubHlNYXA8bnVtYmVyLCByZWFkb25seSBzdHJpbmdbXT4+KG5ldyBNYXAoKSwge1xuICAgIGVxdWFsOiBzYW1lSGlkZGVuLFxuICB9KTtcblxuICBwcml2YXRlIF92YWx1ZXMgPSBuZXcgTWFwPG51bWJlciwgRmlsdGVyR3JvdXBWYWx1ZT4oKTtcbiAgcHJpdmF0ZSBfZ3JvdXBzID0gbmV3IE1hcDxudW1iZXIsIFJlcG9ydEZpbHRlckdyb3VwPigpO1xuICBwcml2YXRlIF9zZXNzaW9uRGlzYWJsZWQgPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICAvLyBHcm91cHMgdGhhdCBoYXZlIGEgZGVmYXVsdCB0aGUgdmlld2VyIGNsZWFyZWQuIFdpdGhvdXQgdGhpcyBhIHJlbG9hZCBvZiB0aGVcbiAgLy8gcmVwb3J0IChhIGNoYXQgZWRpdCwgYSBkaWFsb2cpIHdvdWxkIGZpbmQgbm8gdmFsdWUgZm9yIHRoZSBncm91cCBhbmQgc2VlZFxuICAvLyBpdHMgZGVmYXVsdCBzdHJhaWdodCBiYWNrLiBBIGNoYW5nZSB0byB0aGUgc3RvcmVkIGRlZmF1bHQgcmVsZWFzZXMgaXQuXG4gIHByaXZhdGUgX2NsZWFyZWQgPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICAvLyBUaGUgcmVwb3J0J3MgZ3JvdXAtYnkgY29udHJvbDogYSBzaW5nbGUgcmVwb3J0LXdpZGUgYnVja2V0IG92ZXJyaWRlIGZvciBhbGxcbiAgLy8gdGltZS1zZXJpZXMgY2hhcnRzLiBVbnNldCA9IGVhY2ggY2hhcnQgdXNlcyBpdHMgYXV0aG9yZWQgZ3JhbnVsYXJpdHkuIE5ldmVyXG4gIC8vIHNhdmVkIHRvIHRoZSByZXBvcnQgKHRoZSBVUkwgY2FycmllcyBpdCksIGFuZCBjYXJyaWVkIGluIHRoZSBkYXRhIHJlcXVlc3Qnc1xuICAvLyBgc3RhdGVgLCBzbyBpdCBwcm9wYWdhdGVzIHRocm91Z2ggdG8gdGhlIFBERi9Qb3dlclBvaW50IGV4cG9ydHMgdG9vLiBOYW1lZFxuICAvLyBmb3IgdGhlIGBmcmVxdWVuY3lgIHdpcmUga2V5IGl0IHRyYXZlbHMgdW5kZXIsIG5vdCBmb3IgdGhlIGNvbnRyb2wncyBsYWJlbC5cbiAgcHJpdmF0ZSBfZnJlcXVlbmN5OiBDaGFydEdyYW51bGFyaXR5IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX2ZyZXF1ZW5jeUNoYW5nZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvLyBFYWNoIGxpc3QncyB2aWV3ZXItY2hvc2VuIHNvcnQsIGJ5IGNvbXBvbmVudCBpZC4gSGVsZCBoZXJlIHJhdGhlciB0aGFuIG9ubHlcbiAgLy8gaW4gdGhlIGxpc3QncyBGc0xpc3Qgc28gaXQgc3Vydml2ZXMgdGhlIGxpc3QgYmVpbmcgcmVjcmVhdGVkIChhIHBhZ2Ugc3dpdGNoLFxuICAvLyBhIHJlbG9hZCBhZnRlciBhbiBlZGl0KSBhbmQgc28gZXZlcnkgY29uc3VtZXIgb2Ygdmlld2VyIHN0YXRlIHJlYWRzIG9uZSBwbGFjZS5cbiAgcHJpdmF0ZSBfbGlzdFNvcnRzID0gbmV3IE1hcDxudW1iZXIsIFJlcG9ydFNvcnQ+KCk7XG5cbiAgLy8gRWFjaCBsaXN0J3Mgc2VhcmNoIGJveCB0ZXh0IChsaXN0U2VhcmNoVGV4dCksIGJ5IGNvbXBvbmVudCBpZC4gQSBsaXN0IHdpdGhcbiAgLy8gYW4gZW1wdHkgYm94IGhhcyBubyBlbnRyeS4gSGVsZCBoZXJlIGZvciB0aGUgc2FtZSByZWFzb25zIGFzIHRoZSBzb3J0cywgYW5kXG4gIC8vIGJlY2F1c2UgdGhlIGJveCBsaXZlcyBpbiB0aGUgY29tcG9uZW50IGhlYWRlciwgbm90IGluIHRoZSBsaXN0LlxuICBwcml2YXRlIF9saXN0U2VhcmNoZXMgPSBuZXcgTWFwPG51bWJlciwgc3RyaW5nPigpO1xuXG4gIC8vIFRoZSBvcGVuIHJlcG9ydCdzIGxpc3RzLCBieSBjb21wb25lbnQgaWQsIHNvIGEgZmlsdGVyIHRvZ2dsZSBjYW4gdGVsbFxuICAvLyB3aGljaCBvZiB0aGVtIGxvc2UgdGhlaXIgc2VhcmNoIGJveCAobGlzdFNlYXJjaGFibGUpLlxuICBwcml2YXRlIF9saXN0cyA9IG5ldyBNYXA8bnVtYmVyLCBSZXBvcnRDb21wb25lbnQ+KCk7XG5cbiAgLy8gV2hldGhlciB0aGUgc2VydmVyIGFuc3dlcnMgYSBsaXN0IHNlYXJjaC4gTGlzdCBzZWFyY2ggYW5kIGVmZmVjdGl2ZUxvY2FsZVxuICAvLyBzaGlwIGluIHRoZSBzYW1lIGZyYW1ld29yayBjaGFuZ2Ugc2V0LCBzbyBhIHNlcnZlciB0aGF0IHNlbmRzIG5vXG4gIC8vIGVmZmVjdGl2ZUxvY2FsZSBoYXMgbmVpdGhlciwgYW5kIGl0cyBsaXN0cyBzaG93IG5vIHNlYXJjaCBib3guXG4gIHByaXZhdGUgX3NlcnZlclNlYXJjaGVzID0gZmFsc2U7XG5cbiAgLy8gRW1pdHMgdGhlIGlkIG9mIHRoZSBsaXN0IHdob3NlIHNlYXJjaCB0ZXh0IGNoYW5nZWQuXG4gIHByaXZhdGUgX2xpc3RTZWFyY2hDaGFuZ2VkJCA9IG5ldyBTdWJqZWN0PG51bWJlcj4oKTtcblxuICAvLyBFbWl0cyB0aGUgZ3JvdXAgaWQgdGhhdCBjaGFuZ2VkOyBjb21wb25lbnRzIGxpc3RlbiBmaWx0ZXJlZCB0byB0aGVpciBvd25cbiAgLy8gZ3JvdXAgaWRzLiBudWxsID0gZXZlcnl0aGluZyBjaGFuZ2VkIChyZS1pbml0KS5cbiAgcHJpdmF0ZSBfY2hhbmdlZCQgPSBuZXcgU3ViamVjdDxudW1iZXIgfCBudWxsPigpO1xuXG4gIC8vIEZpcmVzIHdoZW5ldmVyIGFueXRoaW5nIHRoZSBVUkwgY2FycmllcyBtYXkgaGF2ZSBjaGFuZ2VkLlxuICBwcml2YXRlIF91cmxDaGFuZ2VkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLy8gU2VlZCBncm91cHMgKyB0aGVpciBkZWZhdWx0cyB3aGVuIGEgcmVwb3J0IGxvYWRzLiBFeGlzdGluZyBzZXNzaW9uIHZhbHVlc1xuICAvLyBmb3Igc3RpbGwtZXhpc3RpbmcgZ3JvdXBzIHN1cnZpdmUgYSBzdHJ1Y3R1cmUgcmUtZmV0Y2ggKGEgY2hhdCBlZGl0XG4gIC8vIHNob3VsZG4ndCByZXNldCB0aGUgdmlld2VyJ3MgZmlsdGVycyksIGFuZCBzbyBkb2VzIGEgZ3JvdXAgdGhlIHZpZXdlclxuICAvLyBjbGVhcmVkIOKAlCBVTkxFU1MgdGhlIGdyb3VwJ3Mgc3RvcmVkIGRlZmF1bHQgaXRzZWxmIGNoYW5nZWQsIHdoaWNoIG9ubHlcbiAgLy8gaGFwcGVucyB3aGVuIGFuIG9wZXJhdG9yIHNhdmVkIGEgbmV3IGRlZmF1bHQgaW4gcmVwb3J0IHNldHRpbmdzIG9yIHRoZVxuICAvLyBhZ2VudCBzZXQgb25lLiBUaGF0IGlzIGFuIGV4cGxpY2l0IGluc3RydWN0aW9uIHRvIHJlLXNlZWQsIHNvIGl0IHdpbnMgb3ZlclxuICAvLyB0aGUgc3Vydml2aW5nIHNlc3Npb24gdmFsdWU7IHdpdGhvdXQgaXQgdGhlIGJhciBrZWVwcyBzaG93aW5nIHdoYXRldmVyIGl0XG4gIC8vIHdhcyBmaXJzdCBzZWVkZWQgd2l0aCB1bnRpbCBhIGZ1bGwgcGFnZSByZWxvYWQuXG4gIC8vXG4gIC8vIEEgY2hhbmdlIG9mIHRoZSByZXBvcnQncyB6b25lIG1vdmVzIFwidG9kYXlcIiwgc28gYSB2YWx1ZSBzdGlsbCBjYXJyeWluZyBpdHNcbiAgLy8gZ3JvdXAgZGVmYXVsdCdzIHByZXNldCBuYW1lIGlzIHJlc29sdmVkIGFnYWluIGluIHRoZSBuZXcgem9uZS4gQSB2YWx1ZSB0aGVcbiAgLy8gdmlld2VyIHBpY2tlZCwgb3Igb25lIGNhcnJ5aW5nIGFub3RoZXIgcHJlc2V0IG5hbWUsIGlzIGtlcHQgYXMgaXQgaXMuXG4gIC8vXG4gIC8vIGByZXN0b3JlYCBpcyB0aGUgdmlld2VyIHN0YXRlIHJlYWQgZnJvbSB0aGUgVVJMLiBUaGUgaG9zdCBwYXNzZXMgaXQgb25seSBvblxuICAvLyB0aGUgZmlyc3QgbG9hZCBvZiBhIHJlcG9ydDsgYSByZWxvYWQgYWZ0ZXIgYSBjaGF0IG9yIGRpYWxvZyBlZGl0IHBhc3Nlc1xuICAvLyBudWxsLCBzbyB0aGUgaW4tbWVtb3J5IHN0YXRlIHdpbnMuIFBhcmFtcyB0aGF0IG5hbWUgYSBncm91cCwgbGlzdCBvciBjb2x1bW5cbiAgLy8gdGhlIHJlcG9ydCBubyBsb25nZXIgaGFzLCBvciB0aGF0IGRvIG5vdCBkZWNvZGUsIGFyZSBpZ25vcmVkLlxuICBwdWJsaWMgaW5pdChyZXBvcnQ6IFJlcG9ydCwgcmVzdG9yZTogUmVwb3J0VXJsUGFyYW1zIHwgbnVsbCA9IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2aW91c1RpbWV6b25lID0gdGhpcy50aW1lem9uZSgpO1xuXG4gICAgLy8gU2V0IGZpcnN0OiB0aGUgZGVmYXVsdHMgc2VlZGVkIGJlbG93IHJlc29sdmUgdGhlaXIgcmVsYXRpdmUgcHJlc2V0cyBpbiBpdC5cbiAgICB0aGlzLnRpbWV6b25lLnNldChyZXNvbHZlUmVwb3J0VGltZXpvbmUocmVwb3J0KSk7XG4gICAgdGhpcy5mb3JtYXRDb250ZXh0LnNldChyZXNvbHZlRm9ybWF0Q29udGV4dChyZXBvcnQpKTtcbiAgICAvLyBCZWZvcmUgYW55IHNlYXJjaCByZXN0b3JlOiBsaXN0U2VhcmNoYWJsZSByZWFkcyBpdC5cbiAgICB0aGlzLl9zZXJ2ZXJTZWFyY2hlcyA9IHJlcG9ydC5lZmZlY3RpdmVMb2NhbGUgIT09IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHRpbWV6b25lQ2hhbmdlZCA9IHByZXZpb3VzVGltZXpvbmUgIT09IHRoaXMudGltZXpvbmUoKTtcbiAgICBjb25zdCBwcmV2aW91c0dyb3VwcyA9IHRoaXMuX2dyb3VwcztcbiAgICB0aGlzLl9ncm91cHMgPSBuZXcgTWFwPG51bWJlciwgUmVwb3J0RmlsdGVyR3JvdXA+KCk7XG5cbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHJlcG9ydC5maWx0ZXJHcm91cHMgPz8gW10pIHtcbiAgICAgIHRoaXMuX2dyb3Vwcy5zZXQoZ3JvdXAuaWQsIGdyb3VwKTtcbiAgICAgIHRoaXMuX3NlZWQoZ3JvdXAsIHByZXZpb3VzR3JvdXBzLmdldChncm91cC5pZCkgPz8gbnVsbCwgdGltZXpvbmVDaGFuZ2VkKTtcbiAgICB9XG5cbiAgICB0aGlzLl9saXN0cyA9IG5ldyBNYXAodGhpcy5fbGlzdENvbXBvbmVudHMocmVwb3J0KS5tYXAoKGNvbXBvbmVudCkgPT4gW2NvbXBvbmVudC5pZCwgY29tcG9uZW50XSkpO1xuXG4gICAgaWYgKHJlc3RvcmUpIHtcbiAgICAgIHRoaXMuX3Jlc3RvcmUocmVwb3J0LCByZXN0b3JlKTtcbiAgICB9XG5cbiAgICB0aGlzLl9wcnVuZShyZXBvcnQpO1xuXG4gICAgdGhpcy5fY2hhbmdlZCQubmV4dChudWxsKTtcbiAgICB0aGlzLl91cmxDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICBwdWJsaWMgdmFsdWUoZ3JvdXBJZDogbnVtYmVyKTogRmlsdGVyR3JvdXBWYWx1ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlcy5nZXQoZ3JvdXBJZCk7XG4gIH1cblxuICAvLyBBIGJhcidzIHZhbHVlIGZvciBhIGdyb3VwLiBBIGRhdGUgcmFuZ2Uga2VlcHMgdGhlIHN0b3JlZCBwcmVzZXQgbmFtZSBvbmx5XG4gIC8vIHdoaWxlIGl0cyBkYXlzIGFyZSBzdGlsbCB0aGUgc3RvcmVkIGRheXM6IHRoZSBiYXJzIHJlLXNldCBldmVyeSBncm91cCB0aGV5XG4gIC8vIHNob3cgd2hlbmV2ZXIgYW55IG9uZSBvZiB0aGVtIGNoYW5nZXMsIGFuZCBhbiB1bnRvdWNoZWQgcm9sbGluZyByYW5nZSBtdXN0XG4gIC8vIGtlZXAgaXRzIG5hbWUgcmF0aGVyIHRoYW4gdHVybiBpbnRvIHR3byBmaXhlZCBkYXRlcy4gQW55IG90aGVyIHJhbmdlLCBhXG4gIC8vIHBpY2tlciBzaG9ydGN1dCBpbmNsdWRlZCwgaXMgc3RvcmVkIGFzIHRoZSBmaXhlZCBkYXRlcyBpdCBzaG93cy5cbiAgcHVibGljIHNldFZhbHVlKGdyb3VwSWQ6IG51bWJlciwgdmFsdWU6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICB0aGlzLl92YWx1ZXMuZGVsZXRlKGdyb3VwSWQpO1xuXG4gICAgICBpZiAodGhpcy5fZ3JvdXBzLmdldChncm91cElkKT8uY29uZmlnPy5kZWZhdWx0KSB7XG4gICAgICAgIHRoaXMuX2NsZWFyZWQuYWRkKGdyb3VwSWQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl92YWx1ZXMuc2V0KGdyb3VwSWQsIHRoaXMuX3dpdGhQcmVzZXQodGhpcy5fdmFsdWVzLmdldChncm91cElkKSwgdmFsdWUpKTtcbiAgICAgIHRoaXMuX2NsZWFyZWQuZGVsZXRlKGdyb3VwSWQpO1xuICAgIH1cblxuICAgIHRoaXMuX2NoYW5nZWQkLm5leHQoZ3JvdXBJZCk7XG4gICAgdGhpcy5fdXJsQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gQSByZWxhdGl2ZSBwcmVzZXQgbmFtZSBhcyB0b2RheSdzIHJhbmdlIGluIHRoZSByZXBvcnQncyB6b25lLCBvciBudWxsIGZvclxuICAvLyBhIG5hbWUgaXQgZG9lcyBub3Qga25vdy4gVGhlIFVSTCBjb2RlYyBkZWNvZGVzIHByZXNldCBuYW1lcyB0aHJvdWdoIHRoaXMuXG4gIHB1YmxpYyByZXNvbHZlUmVsYXRpdmUobmFtZTogc3RyaW5nKTogeyBzdGFydDogRGF0ZTsgZW5kOiBEYXRlIH0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcmVsYXRpdmVSYW5nZShuYW1lKTtcbiAgfVxuXG4gIC8vIFRoZSBhY3RpdmUgZ3JvdXAtYnkgZ3JhaW4sIG9yIG51bGwgd2hlbiB0aGUgdmlld2VyIGhhc24ndCBjaG9zZW4gb25lLlxuICBwdWJsaWMgZnJlcXVlbmN5KCk6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZnJlcXVlbmN5O1xuICB9XG5cbiAgcHVibGljIHNldEZyZXF1ZW5jeShmcmVxdWVuY3k6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5fZnJlcXVlbmN5ID0gZnJlcXVlbmN5O1xuICAgIHRoaXMuX2ZyZXF1ZW5jeUNoYW5nZWQkLm5leHQoKTtcbiAgICB0aGlzLl91cmxDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBGaXJlcyB3aGVuZXZlciB0aGUgZ3JvdXAtYnkgZ3JhaW4gY2hhbmdlcyDigJQgZXZlcnkgdGltZS1zZXJpZXMgY2hhcnQgbGlzdGVuc1xuICAvLyBzbyBpdCByZWZldGNoZXMgYW5kIHJlLWJ1Y2tldHMgKHRoZSBvdmVycmlkZSBpc24ndCBzY29wZWQgdG8gYW55IGZpbHRlclxuICAvLyBncm91cCwgc28gY2hhbmdlc0ZvcigpIGNhbid0IGNhcnJ5IGl0KS5cbiAgcHVibGljIGZyZXF1ZW5jeUNoYW5nZXMoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZyZXF1ZW5jeUNoYW5nZWQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLy8gVGhlIHNvcnQgdGhlIHZpZXdlciBsYXN0IGZldGNoZWQgYSBsaXN0IHdpdGgsIG9yIG51bGwgd2hlbiBpdCBoYXNuJ3Qgc29ydGVkXG4gIC8vICh0aGUgbGlzdCB0aGVuIGZhbGxzIGJhY2sgdG8gaXRzIGF1dGhvcmVkIHNvcnQpLlxuICBwdWJsaWMgbGlzdFNvcnQoY29tcG9uZW50SWQ6IG51bWJlcik6IFJlcG9ydFNvcnQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbGlzdFNvcnRzLmdldChjb21wb25lbnRJZCkgPz8gbnVsbDtcbiAgfVxuXG4gIC8vIFJlY29yZHMgYSBsaXN0J3Mgc29ydCB3aGVuIGl0IGlzIHRoZSB2aWV3ZXIncyBvd246IGEgc29ydCB0aGF0IGlzIHRoZVxuICAvLyBsaXN0J3MgYXV0aG9yZWQgZmlyc3QgdGVybSBpcyB0aGUgbGlzdCdzIGRlZmF1bHQsIG5vdCBhIGNob2ljZSwgc28gaXRcbiAgLy8gY2xlYXJzIHRoZSBlbnRyeSBpbnN0ZWFkICh0aGUgcnVsZSB0aGUgVVJMIHNuYXBzaG90IGFwcGxpZXMpLiBPdGhlcndpc2UgYVxuICAvLyBsaXN0J3MgZmlyc3QgZmV0Y2ggd291bGQgcmVjb3JkIGl0cyBzZWVkZWQgYXV0aG9yZWQgdGVybSwgYW5kIGEgbGlzdCB0aGVcbiAgLy8gYWdlbnQgcmUtc29ydHMgbGF0ZXIgaW4gdGhlIHNlc3Npb24gd291bGQga2VlcCBzZW5kaW5nIHRoZSBvbGQgdGVybVxuICAvLyBmaXJzdC4gRGVsaWJlcmF0ZWx5IGVtaXRzIG5vIGNoYW5nZTogdGhlIGxpc3Qgc2V0cyB0aGlzIGZyb20gdGhlIGZldGNoXG4gIC8vIHRoYXQgYWxyZWFkeSByYW4gd2l0aCB0aGF0IHNvcnQsIHNvIGEgbm90aWZpY2F0aW9uIHdvdWxkIG9ubHkgbWFrZSBpdFxuICAvLyByZWZldGNoIHRoZSBzYW1lIHJvd3MuIE9ubHkgdGhlIFVSTCBoZWFycyBhYm91dCBpdC5cbiAgcHVibGljIHNldExpc3RTb3J0KGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LCBzb3J0OiBSZXBvcnRTb3J0IHwgbnVsbCk6IHZvaWQge1xuICAgIGlmIChzb3J0ICYmICFzYW1lU29ydChzb3J0LCBsaXN0U29ydFRlcm1zKGNvbXBvbmVudC5jb25maWcpWzBdID8/IG51bGwpKSB7XG4gICAgICB0aGlzLl9saXN0U29ydHMuc2V0KGNvbXBvbmVudC5pZCwgc29ydCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xpc3RTb3J0cy5kZWxldGUoY29tcG9uZW50LmlkKTtcbiAgICB9XG5cbiAgICB0aGlzLl91cmxDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBUaGUgdGV4dCBhIGxpc3QgaXMgc2VhcmNoZWQgYnksIG9yIG51bGwgd2hlbiBpdHMgc2VhcmNoIGJveCBpcyBlbXB0eS5cbiAgcHVibGljIGxpc3RTZWFyY2goY29tcG9uZW50SWQ6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9saXN0U2VhcmNoZXMuZ2V0KGNvbXBvbmVudElkKSA/PyBudWxsO1xuICB9XG5cbiAgLy8gV2hldGhlciBhIGxpc3Qgc2hvd3MgdGhlIHNlYXJjaCBib3ggb3ZlciBpdHMgdGV4dCBjb2x1bW5zOiBpdCBkb2VzIHdoZW4gdGhlXG4gIC8vIHNlcnZlciBhbnN3ZXJzIGEgbGlzdCBzZWFyY2ggKHNlZSBfc2VydmVyU2VhcmNoZXMpLCB1bmxlc3Mgb25lIG9mIGl0cyBsaXZlXG4gIC8vIGZpbHRlcnMgYmVsb25ncyB0byBhIGtleXdvcmQgZ3JvdXAgaXRzIGhlYWRlciBzaG93cy4gQSBiYXIgc2hvd3Mgb25lIHNlYXJjaFxuICAvLyBib3ggKGl0cyBsYXN0IGtleXdvcmQgaXRlbSksIGFuZCB0aGF0IG9uZSBpcyB0aGUgYXV0aG9yJ3MuIFRoZSBoZWFkZXIsIHRoZVxuICAvLyBVUkwgcmVzdG9yZSwgdGhlIHBydW5pbmcsIHRoZSBkYXRhIHJlcXVlc3Qgc3RhdGUgYW5kIHRoZSBleHBvcnRzIGFsbCByZWFkXG4gIC8vIHRoaXMgb25lIHJ1bGUsIHNvIG5vIHNlYXJjaCBuYXJyb3dzIGEgbGlzdCB3aG9zZSBzY3JlZW4gaGFzIG5vIGJveCBzaG93aW5nXG4gIC8vIGl0LCBhbmQgbm8gZXhwb3J0IHRpdGxlcyBhIHNlYXJjaCB0aGUgc2VydmVyIGRpZCBub3QgYXBwbHkuXG4gIHB1YmxpYyBsaXN0U2VhcmNoYWJsZShjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZXJ2ZXJTZWFyY2hlc1xuICAgICAgJiYgY29tcG9uZW50LnR5cGUgPT09ICdsaXN0J1xuICAgICAgJiYgIShjb21wb25lbnQuZmlsdGVycyA/PyBbXSkuc29tZSgoZmlsdGVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5fZ3JvdXBzLmdldChmaWx0ZXIuZmlsdGVyR3JvdXBJZCk7XG5cbiAgICAgICAgcmV0dXJuIGZpbHRlci5lbmFibGVkXG4gICAgICAgICAgJiYgIXRoaXMuX3Nlc3Npb25EaXNhYmxlZC5oYXMoZmlsdGVyLmlkKVxuICAgICAgICAgICYmIGdyb3VwPy50eXBlID09PSAna2V5d29yZCdcbiAgICAgICAgICAmJiAoZ3JvdXAubGV2ZWwgPT09ICdjb21wb25lbnQnIHx8IGdyb3VwLmxldmVsID09PSAnYm90aCcpO1xuICAgICAgfSk7XG4gIH1cblxuICAvLyBSZWNvcmRzIGEgbGlzdCdzIHNlYXJjaCBib3ggdGV4dCAobGlzdFNlYXJjaFRleHQpOyBhbiBlbXB0eSBib3ggY2xlYXJzXG4gIC8vIGl0LiBUaGUgaGVhZGVyIGNhbGxzIHRoaXMgb24gZXZlcnkgY2hhbmdlIG9mIGFueSBvZiBpdHMgaXRlbXMsIHNvIHRoZVxuICAvLyBsaXN0IGFuZCB0aGUgVVJMIGhlYXIgYWJvdXQgaXQgb25seSB3aGVuIHRoZSBzdG9yZWQgdGV4dCBhY3R1YWxseSBjaGFuZ2VkLlxuICBwdWJsaWMgc2V0TGlzdFNlYXJjaChjb21wb25lbnRJZDogbnVtYmVyLCB0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBzZWFyY2ggPSBsaXN0U2VhcmNoVGV4dCh0ZXh0KTtcblxuICAgIGlmIChzZWFyY2ggPT09ICh0aGlzLl9saXN0U2VhcmNoZXMuZ2V0KGNvbXBvbmVudElkKSA/PyAnJykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2VhcmNoKSB7XG4gICAgICB0aGlzLl9saXN0U2VhcmNoZXMuc2V0KGNvbXBvbmVudElkLCBzZWFyY2gpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9saXN0U2VhcmNoZXMuZGVsZXRlKGNvbXBvbmVudElkKTtcbiAgICB9XG5cbiAgICB0aGlzLl9saXN0U2VhcmNoQ2hhbmdlZCQubmV4dChjb21wb25lbnRJZCk7XG4gICAgdGhpcy5fdXJsQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gVGhlIGNvbmZpZyBjb2x1bW4gbmFtZXMgYSB2aWV3ZXIgaGlkIG9uIGEgbGlzdDsgbm9uZSB3aGVuIGl0IHNob3dzIHRoZW0gYWxsLlxuICBwdWJsaWMgaGlkZGVuQ29sdW1ucyhjb21wb25lbnRJZDogbnVtYmVyKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmxpc3RIaWRkZW4oKS5nZXQoY29tcG9uZW50SWQpID8/IFtdO1xuICB9XG5cbiAgLy8gUmVjb3JkcyB0aGUgY29sdW1ucyBhIHZpZXdlciBoaWQgb24gYSBsaXN0LCBrZXB0IHRvIGxpc3RIaWRkZW5Db2x1bW5zOlxuICAvLyBuYW1lcyB0aGUgbGlzdCBjYW5ub3QgaGlkZSBhcmUgZHJvcHBlZCwgYW5kIG5vbmUgKG9yIGV2ZXJ5IGNvbHVtbikgY2xlYXJzXG4gIC8vIHRoZSBlbnRyeS4gT25seSB0aGUgVVJMIGhlYXJzIGFib3V0IGl0LCBhbmQgb25seSBvbiBhIHJlYWwgY2hhbmdlLlxuICBwdWJsaWMgc2V0SGlkZGVuQ29sdW1ucyhjb21wb25lbnRJZDogbnVtYmVyLCBuYW1lczogcmVhZG9ubHkgc3RyaW5nW10pOiB2b2lkIHtcbiAgICBjb25zdCBoaWRkZW4gPSBsaXN0SGlkZGVuQ29sdW1ucyh0aGlzLl9saXN0cy5nZXQoY29tcG9uZW50SWQpPy5jb25maWcsIG5hbWVzKTtcblxuICAgIGlmIChzYW1lTmFtZXMoaGlkZGVuLCB0aGlzLmhpZGRlbkNvbHVtbnMoY29tcG9uZW50SWQpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5leHQgPSBuZXcgTWFwKHRoaXMubGlzdEhpZGRlbigpKTtcblxuICAgIGlmIChoaWRkZW4ubGVuZ3RoKSB7XG4gICAgICBuZXh0LnNldChjb21wb25lbnRJZCwgaGlkZGVuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dC5kZWxldGUoY29tcG9uZW50SWQpO1xuICAgIH1cblxuICAgIHRoaXMubGlzdEhpZGRlbi5zZXQobmV4dCk7XG4gICAgdGhpcy5fdXJsQ2hhbmdlZCQubmV4dCgpO1xuICB9XG5cbiAgLy8gRmlyZXMgd2hlbmV2ZXIgb25lIGxpc3QncyBzZWFyY2ggdGV4dCBjaGFuZ2VzLCBzbyB0aGF0IGxpc3QgcmVmZXRjaGVzLlxuICBwdWJsaWMgbGlzdFNlYXJjaENoYW5nZXMoY29tcG9uZW50SWQ6IG51bWJlcik6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9saXN0U2VhcmNoQ2hhbmdlZCQuYXNPYnNlcnZhYmxlKClcbiAgICAgIC5waXBlKFxuICAgICAgICByeEZpbHRlcigoaWQpID0+IGlkID09PSBjb21wb25lbnRJZCksXG4gICAgICAgIG1hcCgoKSA9PiB1bmRlZmluZWQpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIEZpcmVzIHdoZW5ldmVyIHRoZSB2aWV3ZXIgc3RhdGUgdGhlIFVSTCBjYXJyaWVzIG1heSBoYXZlIGNoYW5nZWQ6IGEgZ3JvdXBcbiAgLy8gdmFsdWUsIHRoZSBncmFpbiwgYSBsaXN0IHNvcnQsIHNlYXJjaCBvciBoaWRkZW4gY29sdW1ucywgb3IgYSAocmUpbG9hZCBvZlxuICAvLyB0aGUgcmVwb3J0LlxuICBwdWJsaWMgdXJsQ2hhbmdlcygpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fdXJsQ2hhbmdlZCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvLyBUaGUgdmlld2VyIHN0YXRlIHRoZSBVUkwgc2hvdWxkIGNhcnJ5IGZvciBgcmVwb3J0YDogb25seSB3aGF0IGRpZmZlcnMgZnJvbVxuICAvLyB0aGUgYXV0aG9yZWQgZGVmYXVsdHMsIHNvIGFuIHVudG91Y2hlZCByZXBvcnQgaGFzIGEgYmFyZSBVUkwgYW5kIGtlZXBzXG4gIC8vIGZvbGxvd2luZyBpdHMgZGVmYXVsdHMgd2hlbiB0aGV5IGNoYW5nZS4gQSBncm91cCB0aGUgdmlld2VyIGNsZWFyZWQgaXNcbiAgLy8gbnVsbC4gQSBkYXRlIHJhbmdlIGlzIGNvbXBhcmVkIG9uIGl0cyBkYXlzIGFnYWluc3QgaXRzIGRlZmF1bHQgcmVzb2x2ZWRcbiAgLy8gdG9kYXksIHNvIGEgdmFsdWUgdGhhdCBpcyB0aGUgZGVmYXVsdCB1bmRlciBhbm90aGVyIHByZXNldCBuYW1lICh0aGlzWWVhclxuICAvLyBhZ2FpbnN0IGEgeWVhclRvRGF0ZSBkZWZhdWx0KSBpcyBzdGlsbCB0aGUgZGVmYXVsdC5cbiAgcHVibGljIHVybFNuYXBzaG90KHJlcG9ydDogUmVwb3J0KTogUmVwb3J0VXJsU25hcHNob3Qge1xuICAgIGNvbnN0IGdyb3VwcyA9IG5ldyBNYXA8bnVtYmVyLCBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbD4oKTtcblxuICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgdGhpcy5fZ3JvdXBzLnZhbHVlcygpKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX3ZhbHVlcy5nZXQoZ3JvdXAuaWQpO1xuXG4gICAgICBpZiAodGhpcy5fY2xlYXJlZC5oYXMoZ3JvdXAuaWQpKSB7XG4gICAgICAgIGdyb3Vwcy5zZXQoZ3JvdXAuaWQsIG51bGwpO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSAmJiAhdGhpcy5faXNEZWZhdWx0KGdyb3VwLCB2YWx1ZSkpIHtcbiAgICAgICAgZ3JvdXBzLnNldChncm91cC5pZCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGxpc3RTb3J0cyA9IG5ldyBNYXA8bnVtYmVyLCBSZXBvcnRTb3J0PigpO1xuICAgIGNvbnN0IGxpc3RTZWFyY2hlcyA9IG5ldyBNYXA8bnVtYmVyLCBzdHJpbmc+KCk7XG4gICAgY29uc3QgbGlzdEhpZGRlbiA9IG5ldyBNYXA8bnVtYmVyLCBzdHJpbmdbXT4oKTtcblxuICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIHRoaXMuX2xpc3RDb21wb25lbnRzKHJlcG9ydCkpIHtcbiAgICAgIGNvbnN0IHNvcnQgPSB0aGlzLl9saXN0U29ydHMuZ2V0KGNvbXBvbmVudC5pZCk7XG4gICAgICBjb25zdCBzZWFyY2ggPSB0aGlzLl9saXN0U2VhcmNoZXMuZ2V0KGNvbXBvbmVudC5pZCk7XG4gICAgICBjb25zdCBoaWRkZW4gPSB0aGlzLmhpZGRlbkNvbHVtbnMoY29tcG9uZW50LmlkKTtcblxuICAgICAgaWYgKHNvcnQgJiYgIXNhbWVTb3J0KHNvcnQsIGxpc3RTb3J0VGVybXMoY29tcG9uZW50LmNvbmZpZylbMF0gPz8gbnVsbCkpIHtcbiAgICAgICAgbGlzdFNvcnRzLnNldChjb21wb25lbnQuaWQsIHNvcnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2VhcmNoKSB7XG4gICAgICAgIGxpc3RTZWFyY2hlcy5zZXQoY29tcG9uZW50LmlkLCBzZWFyY2gpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGlkZGVuLmxlbmd0aCkge1xuICAgICAgICBsaXN0SGlkZGVuLnNldChjb21wb25lbnQuaWQsIFsuLi5oaWRkZW5dKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBncm91cHMsIGxpc3RTb3J0cywgbGlzdFNlYXJjaGVzLCBsaXN0SGlkZGVuLCBmcmVxdWVuY3k6IHRoaXMuX2ZyZXF1ZW5jeSB9O1xuICB9XG5cbiAgcHVibGljIGlzRmlsdGVyRGlzYWJsZWQoZmlsdGVySWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZXNzaW9uRGlzYWJsZWQuaGFzKGZpbHRlcklkKTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVGaWx0ZXIoZmlsdGVySWQ6IG51bWJlciwgZ3JvdXBJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3Nlc3Npb25EaXNhYmxlZC5oYXMoZmlsdGVySWQpKSB7XG4gICAgICB0aGlzLl9zZXNzaW9uRGlzYWJsZWQuZGVsZXRlKGZpbHRlcklkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc2Vzc2lvbkRpc2FibGVkLmFkZChmaWx0ZXJJZCk7XG4gICAgfVxuXG4gICAgLy8gVHVybmluZyBhIGtleXdvcmQgZmlsdGVyIGJhY2sgb24gdGFrZXMgaXRzIGxpc3QncyBzZWFyY2ggYm94IGF3YXksIGFuZFxuICAgIC8vIHRoZSBzZWFyY2ggd2l0aCBpdC4gVGhlIGxpc3QgcmVmZXRjaGVzIG9uIHRoZSBncm91cCBjaGFuZ2UgYmVsb3cuXG4gICAgdGhpcy5fZHJvcFVuc2VhcmNoYWJsZSgpO1xuXG4gICAgdGhpcy5fY2hhbmdlZCQubmV4dChncm91cElkKTtcbiAgICB0aGlzLl91cmxDaGFuZ2VkJC5uZXh0KCk7XG4gIH1cblxuICAvLyBOb3RpZmljYXRpb25zIHJlbGV2YW50IHRvIE9ORSBjb21wb25lbnQ6IGFueSBjaGFuZ2UgdG8gYSBncm91cCBvbmUgb2YgaXRzXG4gIC8vIGZpbHRlcnMgYmVsb25ncyB0byAob3IgYSBmdWxsIHJlLWluaXQpLlxuICBwdWJsaWMgY2hhbmdlc0Zvcihjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IE9ic2VydmFibGU8bnVtYmVyIHwgbnVsbD4ge1xuICAgIGNvbnN0IGdyb3VwSWRzID0gbmV3IFNldCgoY29tcG9uZW50LmZpbHRlcnMgPz8gW10pLm1hcCgoZmlsdGVyKSA9PiBmaWx0ZXIuZmlsdGVyR3JvdXBJZCkpO1xuXG4gICAgcmV0dXJuIHRoaXMuX2NoYW5nZWQkLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAucGlwZShcbiAgICAgICAgcnhGaWx0ZXIoKGdyb3VwSWQpID0+IGdyb3VwSWQgPT09IG51bGwgfHwgZ3JvdXBJZHMuaGFzKGdyb3VwSWQpKSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBUaGUgZ3JvdXAgdmFsdWVzIHJlc29sdmVkIGludG8gdGhpcyBjb21wb25lbnQncyBtZW1iZXItZmlsdGVyIHZhbHVlcyDigJRcbiAgLy8gd2hhdCB0aGUgZGF0YSByZXF1ZXN0IGNhcnJpZXMuIERpc2FibGVkIGZpbHRlcnMgKGF1dGhvcmVkIG9yIHNlc3Npb24pIGFyZVxuICAvLyBza2lwcGVkIGVudGlyZWx5LlxuICBwdWJsaWMgcmVzb2x2ZUZvckNvbXBvbmVudChjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IFJlc29sdmVkRmlsdGVyVmFsdWVbXSB7XG4gICAgY29uc3QgcmVzb2x2ZWQ6IFJlc29sdmVkRmlsdGVyVmFsdWVbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBmaWx0ZXIgb2YgY29tcG9uZW50LmZpbHRlcnMgPz8gW10pIHtcbiAgICAgIGlmICghZmlsdGVyLmVuYWJsZWQgfHwgdGhpcy5fc2Vzc2lvbkRpc2FibGVkLmhhcyhmaWx0ZXIuaWQpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX3ZhbHVlcy5nZXQoZmlsdGVyLmZpbHRlckdyb3VwSWQpO1xuICAgICAgY29uc3QgZmllbGRzID0gdmFsdWUgPyB0aGlzLl9yZXNvbHZlZEZpZWxkcyh2YWx1ZSkgOiBudWxsO1xuXG4gICAgICBpZiAoZmllbGRzKSB7XG4gICAgICAgIHJlc29sdmVkLnB1c2goeyBmaWx0ZXJJZDogZmlsdGVyLmlkLCAuLi5maWVsZHMgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc29sdmVkO1xuICB9XG5cbiAgLy8gV2hhdCB0aGUgdmlld2VyIGhhcyBzZXQsIG9uZSBlbnRyeSBwZXIgZmlsdGVyIGdyb3VwLCBmb3IgdGhlIHJlcG9ydCBjaGF0OlxuICAvLyB0aGUgYWdlbnQgcmVhZHMgaXQgdG8ga25vdyB3aGF0IGlzIG9uIHNjcmVlbi4gR3JvdXAgb3JkZXIsIG5vdCB0aGUgb3JkZXJcbiAgLy8gdGhlIHZhbHVlcyB3ZXJlIHNldCBpbiwgc28gdGhlIHNhbWUgc3RhdGUgYWx3YXlzIHJlYWRzIHRoZSBzYW1lLiBBIGdyb3VwXG4gIC8vIHdpdGggbm90aGluZyBpbiBpdCBpcyBsZWZ0IG91dCwgYW5kIGEgc2F2ZWQgZGVmYXVsdCBjb3VudHMgdW50aWwgdGhlXG4gIC8vIHZpZXdlciBjaGFuZ2VzIGl0LiBQZXItZmlsdGVyIHRvZ2dsZXMgYXJlIGEgY29tcG9uZW50J3Mgb3duIGJ1c2luZXNzLCBzb1xuICAvLyB0aGV5IGFyZSBub3QgcGFydCBvZiBpdC5cbiAgcHVibGljIHZpZXdlckZpbHRlcnMoKTogUmVwb3J0Q2hhdFZpZXdlckZpbHRlcltdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuX3ZhbHVlcy5lbnRyaWVzKCldXG4gICAgICAuc29ydCgoW2FdLCBbYl0pID0+IGEgLSBiKVxuICAgICAgLm1hcCgoW2dyb3VwSWQsIHZhbHVlXSkgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZHMgPSB0aGlzLl9yZXNvbHZlZEZpZWxkcyh2YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIGZpZWxkcyA/IHsgZ3JvdXBJZCwgLi4uZmllbGRzIH0gOiBudWxsO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgUmVwb3J0Q2hhdFZpZXdlckZpbHRlciA9PiBlbnRyeSAhPT0gbnVsbCk7XG4gIH1cblxuICAvLyBFdmVyeSBjb21wb25lbnQncyByZXNvbHZlZCB2YWx1ZXMgaW4gb25lIGFycmF5IOKAlCB3aGF0IGEgcmVwb3J0LWxldmVsIGV4cG9ydFxuICAvLyBjYXJyaWVzIHNvIGVhY2ggZmlsZSBpbiB0aGUgYXJjaGl2ZSBpcyBmaWx0ZXJlZCBleGFjdGx5IGFzIHRoZSBzY3JlZW4gaXMuXG4gIC8vIEZpbHRlciBpZHMgYXJlIHVuaXF1ZSBwZXIgY29tcG9uZW50LCBzbyB0aGUgYmFja2VuZCBwaWNrcyBlYWNoIGNvbXBvbmVudCdzXG4gIC8vIG93biBvdXQgb2YgdGhlIHBpbGUuIEEgcGFnZSBpZCBuYXJyb3dzIGl0IHRvIHRoYXQgcGFnZS5cbiAgcHVibGljIHJlc29sdmVGb3JSZXBvcnQocmVwb3J0OiBSZXBvcnQsIHBhZ2VJZDogbnVtYmVyIHwgbnVsbCA9IG51bGwpOiBSZXNvbHZlZEZpbHRlclZhbHVlW10ge1xuICAgIGNvbnN0IHBhZ2VzID0gKHJlcG9ydC5wYWdlcyA/PyBbXSlcbiAgICAgIC5maWx0ZXIoKHBhZ2UpID0+ICFwYWdlSWQgfHwgcGFnZS5pZCA9PT0gcGFnZUlkKTtcblxuICAgIHJldHVybiBwYWdlc1xuICAgICAgLmZsYXRNYXAoKHBhZ2UpID0+IChwYWdlLmNvbXBvbmVudHMgPz8gW10pXG4gICAgICAgIC5mbGF0TWFwKChjb21wb25lbnQpID0+IHRoaXMucmVzb2x2ZUZvckNvbXBvbmVudChjb21wb25lbnQpKSk7XG4gIH1cblxuICAvLyBBIGdyb3VwIHZhbHVlIGFzIHRoZSBmaWVsZHMgYSByZXF1ZXN0IGNhcnJpZXM6IGRhdGUgYm91bmRzIGFzIGNhbGVuZGFyXG4gIC8vIGRheXMsIHNlbGVjdCB2YWx1ZXMgd2hlbiBhbnkgYXJlIHBpY2tlZCwga2V5d29yZCB0ZXh0IHRyaW1tZWQuIE51bGwgd2hlblxuICAvLyBhbGwgb2YgdGhlbSBhcmUgZW1wdHkuIEEgZGF0ZSByYW5nZSBhbHNvIG5hbWVzIHRoZSByZWxhdGl2ZSByYW5nZSBpdFxuICAvLyBzdGlsbCBpcyAoX2xpdmVQcmVzZXQpLCBzbyB0aGUgc2VydmVyIGtub3dzIHdoaWNoIHBlcmlvZCB0aGUgZGF5cyBjb3ZlcjtcbiAgLy8gdGhlIGRheXMgc3RheSB0aGUgd2luZG93IGVpdGhlciB3YXkuIENvbXBvbmVudCBkYXRhLCB0aGUgcmVwb3J0IGFuZCBwYWdlXG4gIC8vIGV4cG9ydHMgYW5kIHRoZSBjaGF0J3Mgdmlld2VyIGZpbHRlcnMgYWxsIHJlYWQgdGhlaXIgZmllbGRzIGhlcmUsIHNvIGFsbFxuICAvLyB0aHJlZSBjYXJyeSBpdC5cbiAgcHJpdmF0ZSBfcmVzb2x2ZWRGaWVsZHModmFsdWU6IEZpbHRlckdyb3VwVmFsdWUpOiBPbWl0PFJlc29sdmVkRmlsdGVyVmFsdWUsICdmaWx0ZXJJZCc+IHwgbnVsbCB7XG4gICAgY29uc3QgZmllbGRzOiBPbWl0PFJlc29sdmVkRmlsdGVyVmFsdWUsICdmaWx0ZXJJZCc+ID0ge307XG4gICAgY29uc3QgcHJlc2V0ID0gdGhpcy5fbGl2ZVByZXNldCh2YWx1ZSk7XG5cbiAgICBpZiAodmFsdWUuc3RhcnQpIHtcbiAgICAgIGZpZWxkcy5zdGFydCA9IGRhdGVCb3VuZFN0cmluZyh2YWx1ZS5zdGFydCk7XG4gICAgfVxuICAgIGlmICh2YWx1ZS5lbmQpIHtcbiAgICAgIGZpZWxkcy5lbmQgPSBkYXRlQm91bmRTdHJpbmcodmFsdWUuZW5kKTtcbiAgICB9XG4gICAgaWYgKHByZXNldCkge1xuICAgICAgZmllbGRzLnByZXNldCA9IHByZXNldDtcbiAgICB9XG4gICAgaWYgKHZhbHVlLnZhbHVlcz8ubGVuZ3RoKSB7XG4gICAgICBmaWVsZHMudmFsdWVzID0gdmFsdWUudmFsdWVzO1xuICAgIH1cbiAgICBpZiAodmFsdWUudmFsdWU/LnRyaW0oKSkge1xuICAgICAgZmllbGRzLnZhbHVlID0gdmFsdWUudmFsdWUudHJpbSgpO1xuICAgIH1cblxuICAgIHJldHVybiBmaWVsZHMuc3RhcnQgfHwgZmllbGRzLmVuZCB8fCBmaWVsZHMudmFsdWVzIHx8IGZpZWxkcy52YWx1ZVxuICAgICAgPyBmaWVsZHNcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIC8vIFRoZSByZWxhdGl2ZSByYW5nZSBhIGRhdGUgdmFsdWUgc3RpbGwgaXM6IHRoZSBwcmVzZXQgbmFtZSBpdCBjYXJyaWVzLFxuICAvLyB3aGlsZSBpdHMgZGF5cyBhcmUgdGhhdCByYW5nZSByZXNvbHZlZCB0b2RheSBpbiB0aGUgcmVwb3J0J3Mgem9uZS4gQVxuICAvLyB2YWx1ZSB3aG9zZSBkYXlzIHRoZSB2aWV3ZXIgY2hhbmdlZCwgb3Igb25lIHNlZWRlZCBiZWZvcmUgbWlkbmlnaHQgdGhhdFxuICAvLyBpcyBub3cgYSBkYXkgYmVoaW5kLCBuYW1lcyBub25lLCBhbmQgdGhlIHNlcnZlciByZWFkcyBpdHMgZGF5cyBhbG9uZS5cbiAgcHJpdmF0ZSBfbGl2ZVByZXNldCh2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSk6IFJlcG9ydFJlbGF0aXZlUmFuZ2UgfCBudWxsIHtcbiAgICBpZiAoIXZhbHVlLnByZXNldCB8fCAhaXNSZWxhdGl2ZVJhbmdlKHZhbHVlLnByZXNldCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHJhbmdlID0gdGhpcy5fcmVsYXRpdmVSYW5nZSh2YWx1ZS5wcmVzZXQpO1xuXG4gICAgcmV0dXJuIHJhbmdlICYmIHNhbWVEYXlzKHZhbHVlLCByYW5nZSkgPyB2YWx1ZS5wcmVzZXQgOiBudWxsO1xuICB9XG5cbiAgLy8gU2VlZHMgb25lIGdyb3VwIG9uIChyZSlsb2FkOyBzZWUgaW5pdCgpLiBgcHJldmlvdXNgIGlzIHRoZSBncm91cCBhcyB0aGVcbiAgLy8gbGFzdCBsb2FkIGhhZCBpdCwgb3IgbnVsbCB3aGVuIGl0IGlzIG5ldy5cbiAgcHJpdmF0ZSBfc2VlZChcbiAgICBncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsXG4gICAgcHJldmlvdXM6IFJlcG9ydEZpbHRlckdyb3VwIHwgbnVsbCxcbiAgICB0aW1lem9uZUNoYW5nZWQ6IGJvb2xlYW4sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRDaGFuZ2VkID0gIXNhbWVEZWZhdWx0KHByZXZpb3VzPy5jb25maWc/LmRlZmF1bHQgPz8gbnVsbCwgZ3JvdXAuY29uZmlnPy5kZWZhdWx0ID8/IG51bGwpO1xuXG4gICAgaWYgKGRlZmF1bHRDaGFuZ2VkKSB7XG4gICAgICB0aGlzLl9jbGVhcmVkLmRlbGV0ZShncm91cC5pZCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NsZWFyZWQuaGFzKGdyb3VwLmlkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fdmFsdWVzLmdldChncm91cC5pZCk7XG4gICAgY29uc3QgcHJlc2V0VG9SZXNvbHZlID0gdGltZXpvbmVDaGFuZ2VkXG4gICAgICAmJiAhIXZhbHVlPy5wcmVzZXRcbiAgICAgICYmIHZhbHVlLnByZXNldCA9PT0gZ3JvdXAuY29uZmlnPy5kZWZhdWx0Py5yZWxhdGl2ZTtcblxuICAgIGlmICh2YWx1ZSAmJiAhZGVmYXVsdENoYW5nZWQgJiYgIXByZXNldFRvUmVzb2x2ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMuX2RlZmF1bHRWYWx1ZShncm91cCk7XG5cbiAgICBpZiAoZGVmYXVsdFZhbHVlKSB7XG4gICAgICB0aGlzLl92YWx1ZXMuc2V0KGdyb3VwLmlkLCBkZWZhdWx0VmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoZGVmYXVsdENoYW5nZWQpIHtcbiAgICAgIC8vIFRoZSBkZWZhdWx0IHdhcyBjbGVhcmVkLCBzbyB0aGUgdmFsdWUgaXQgc2VlZGVkIGdvZXMgd2l0aCBpdC5cbiAgICAgIHRoaXMuX3ZhbHVlcy5kZWxldGUoZ3JvdXAuaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFwcGxpZXMgdGhlIHZpZXdlciBzdGF0ZSByZWFkIGZyb20gdGhlIFVSTCBvbiB0b3Agb2YgdGhlIHNlZWRlZCBkZWZhdWx0cy5cbiAgcHJpdmF0ZSBfcmVzdG9yZShyZXBvcnQ6IFJlcG9ydCwgcmVzdG9yZTogUmVwb3J0VXJsUGFyYW1zKTogdm9pZCB7XG4gICAgdGhpcy5fcmVzdG9yZUdyb3VwcyhyZXN0b3JlKTtcbiAgICB0aGlzLl9yZXN0b3JlTGlzdFNvcnRzKHJlcG9ydCwgcmVzdG9yZSk7XG4gICAgdGhpcy5fcmVzdG9yZUxpc3RTZWFyY2hlcyhyZXBvcnQsIHJlc3RvcmUpO1xuICAgIHRoaXMuX3Jlc3RvcmVMaXN0SGlkZGVuKHJlc3RvcmUpO1xuXG4gICAgLy8gVGhlIFVSTCBpcyB0aGUgd2hvbGUgdHJ1dGggb24gYSBmaXJzdCBsb2FkOiBubyBncmFpbiBpbiBpdCBtZWFucyB0aGVcbiAgICAvLyBhdXRob3JlZCBvbmVzLiBUaGUgaG9zdCBzdGlsbCBkcm9wcyBhIGdyYWluIHRoZSByZXBvcnQgZG9lcyBub3Qgb2ZmZXIuXG4gICAgdGhpcy5fZnJlcXVlbmN5ID0gR1JBTlVMQVJJVFlfT1BUSU9OU1xuICAgICAgLmZpbmQoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlID09PSByZXN0b3JlLmdyb3VwQnkpPy52YWx1ZSA/PyBudWxsO1xuICB9XG5cbiAgLy8gVGhlIFVSTCdzIGdyb3VwIHZhbHVlcy4gQW4gZW1wdHkgb25lIGlzIGFuIGV4cGxpY2l0IGNsZWFyIG9mIHRoZSBncm91cC5cbiAgcHJpdmF0ZSBfcmVzdG9yZUdyb3VwcyhyZXN0b3JlOiBSZXBvcnRVcmxQYXJhbXMpOiB2b2lkIHtcbiAgICByZXN0b3JlLmdyb3Vwcy5mb3JFYWNoKChyYXcsIGdyb3VwSWQpID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5fZ3JvdXBzLmdldChncm91cElkKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gZ3JvdXBcbiAgICAgICAgPyBkZWNvZGVGaWx0ZXJWYWx1ZShncm91cC50eXBlLCByYXcsIChuYW1lKSA9PiB0aGlzLnJlc29sdmVSZWxhdGl2ZShuYW1lKSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLl92YWx1ZXMuZGVsZXRlKGdyb3VwSWQpO1xuXG4gICAgICAgIGlmIChncm91cD8uY29uZmlnPy5kZWZhdWx0KSB7XG4gICAgICAgICAgdGhpcy5fY2xlYXJlZC5hZGQoZ3JvdXBJZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fdmFsdWVzLnNldChncm91cElkLCB2YWx1ZSk7XG4gICAgICAgIHRoaXMuX2NsZWFyZWQuZGVsZXRlKGdyb3VwSWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gVGhlIFVSTCdzIGxpc3Qgc29ydHMsIGVhY2gga2VwdCBvbmx5IGZvciBhIGxpc3QgdGhlIHJlcG9ydCBoYXMgYW5kIGFcbiAgLy8gY29sdW1uIHRoYXQgbGlzdCBjYW4gYmUgc29ydGVkIGJ5LlxuICBwcml2YXRlIF9yZXN0b3JlTGlzdFNvcnRzKHJlcG9ydDogUmVwb3J0LCByZXN0b3JlOiBSZXBvcnRVcmxQYXJhbXMpOiB2b2lkIHtcbiAgICBjb25zdCBsaXN0cyA9IG5ldyBNYXAodGhpcy5fbGlzdENvbXBvbmVudHMocmVwb3J0KS5tYXAoKGNvbXBvbmVudCkgPT4gW2NvbXBvbmVudC5pZCwgY29tcG9uZW50XSkpO1xuXG4gICAgcmVzdG9yZS5saXN0U29ydHMuZm9yRWFjaCgocmF3LCBjb21wb25lbnRJZCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gbGlzdHMuZ2V0KGNvbXBvbmVudElkKTtcbiAgICAgIGNvbnN0IHNvcnQgPSBkZWNvZGVTb3J0KHJhdyk7XG5cbiAgICAgIGlmIChjb21wb25lbnQgJiYgc29ydCAmJiB0aGlzLl9zb3J0YWJsZUNvbHVtbnMoY29tcG9uZW50KS5pbmNsdWRlcyhzb3J0LmNvbHVtbikpIHtcbiAgICAgICAgdGhpcy5fbGlzdFNvcnRzLnNldChjb21wb25lbnRJZCwgc29ydCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBUaGUgVVJMJ3MgbGlzdCBzZWFyY2hlcywgZWFjaCBrZXB0IG9ubHkgZm9yIGEgbGlzdCB0aGUgcmVwb3J0IGhhcyB0aGF0XG4gIC8vIHNob3dzIGEgc2VhcmNoIGJveCAobGlzdFNlYXJjaGFibGUpLiBUaGUgdGV4dCBpcyByZWFkIGFzIGxpc3RTZWFyY2hUZXh0LFxuICAvLyBhbmQgYW4gZW1wdHkgb25lIGlzIG5vIHNlYXJjaC5cbiAgcHJpdmF0ZSBfcmVzdG9yZUxpc3RTZWFyY2hlcyhyZXBvcnQ6IFJlcG9ydCwgcmVzdG9yZTogUmVwb3J0VXJsUGFyYW1zKTogdm9pZCB7XG4gICAgY29uc3QgbGlzdHMgPSBuZXcgTWFwKHRoaXMuX2xpc3RDb21wb25lbnRzKHJlcG9ydCkubWFwKChjb21wb25lbnQpID0+IFtjb21wb25lbnQuaWQsIGNvbXBvbmVudF0pKTtcblxuICAgIHJlc3RvcmUubGlzdFNlYXJjaGVzLmZvckVhY2goKHJhdywgY29tcG9uZW50SWQpID0+IHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGxpc3RzLmdldChjb21wb25lbnRJZCk7XG4gICAgICBjb25zdCBzZWFyY2ggPSBsaXN0U2VhcmNoVGV4dChyYXcpO1xuXG4gICAgICBpZiAoY29tcG9uZW50ICYmIHRoaXMubGlzdFNlYXJjaGFibGUoY29tcG9uZW50KSAmJiBzZWFyY2gpIHtcbiAgICAgICAgdGhpcy5fbGlzdFNlYXJjaGVzLnNldChjb21wb25lbnRJZCwgc2VhcmNoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIFRoZSBVUkwncyBoaWRkZW4gY29sdW1ucywgZWFjaCBsaXN0J3Mga2VwdCB0byBsaXN0SGlkZGVuQ29sdW1uczogb25seSB0aGVcbiAgLy8gY29uZmlndXJlZCBjb2x1bW5zIG9mIGEgcGxhaW4gbGlzdCB0aGUgcmVwb3J0IGhhcywgYW5kIG5vbmUgd2hlbiB0aGV5XG4gIC8vIHdvdWxkIGhpZGUgZXZlcnkgY29sdW1uLlxuICBwcml2YXRlIF9yZXN0b3JlTGlzdEhpZGRlbihyZXN0b3JlOiBSZXBvcnRVcmxQYXJhbXMpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gbmV3IE1hcCh0aGlzLmxpc3RIaWRkZW4oKSk7XG5cbiAgICByZXN0b3JlLmxpc3RIaWRkZW4uZm9yRWFjaCgocmF3LCBjb21wb25lbnRJZCkgPT4ge1xuICAgICAgY29uc3QgaGlkZGVuID0gbGlzdEhpZGRlbkNvbHVtbnModGhpcy5fbGlzdHMuZ2V0KGNvbXBvbmVudElkKT8uY29uZmlnLCBkZWNvZGVDb2x1bW5MaXN0KHJhdykpO1xuXG4gICAgICBpZiAoaGlkZGVuLmxlbmd0aCkge1xuICAgICAgICBuZXh0LnNldChjb21wb25lbnRJZCwgaGlkZGVuKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMubGlzdEhpZGRlbi5zZXQobmV4dCk7XG4gIH1cblxuICAvLyBEcm9wcyB0aGUgc2VhcmNoIG9mIGV2ZXJ5IGxpc3QgdGhhdCBubyBsb25nZXIgc2hvd3MgYSBzZWFyY2ggYm94OiBvbmVcbiAgLy8gdGhlIHJlcG9ydCBubyBsb25nZXIgaGFzLCBvciBvbmUgd2hvc2UgaGVhZGVyIG5vdyBoYXMgYSBrZXl3b3JkIGdyb3VwLlxuICBwcml2YXRlIF9kcm9wVW5zZWFyY2hhYmxlKCk6IHZvaWQge1xuICAgIHRoaXMuX2xpc3RTZWFyY2hlcy5mb3JFYWNoKChzZWFyY2gsIGNvbXBvbmVudElkKSA9PiB7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLl9saXN0cy5nZXQoY29tcG9uZW50SWQpO1xuXG4gICAgICBpZiAoIWNvbXBvbmVudCB8fCAhdGhpcy5saXN0U2VhcmNoYWJsZShjb21wb25lbnQpKSB7XG4gICAgICAgIHRoaXMuX2xpc3RTZWFyY2hlcy5kZWxldGUoY29tcG9uZW50SWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gRHJvcHMgc3RhdGUga2VwdCBmb3IgZ3JvdXBzLCBsaXN0cyBhbmQgZmlsdGVycyB0aGUgcmVwb3J0IG5vIGxvbmdlciBoYXMuXG4gIC8vIEEgbGlzdCBzb3J0IGFsc28gZ29lcyB3aGVuIGl0cyBjb2x1bW4gZG9lczogdGhlIGFnZW50IGNhbiByZW1vdmUgb3IgcmVuYW1lXG4gIC8vIGl0LCBhbmQgdGhlIHJlY3JlYXRlZCBsaXN0IHdvdWxkIHNlbmQgYSBjb2x1bW4gdGhlIHF1ZXJ5IGRvZXMgbm90IGtub3cuXG4gIC8vIEEgbGlzdCBzZWFyY2ggZ29lcyB3aXRoIGl0cyBsaXN0IChvciB3aGVuIHRoZSBjb21wb25lbnQgaXMgbm8gbG9uZ2VyIGFcbiAgLy8gbGlzdCksIGFuZCB3aGVuIHRoZSBsaXN0IGdhaW5zIGEga2V5d29yZCBncm91cCBhbmQgc28gbG9zZXMgaXRzIGJveC5cbiAgLy8gSGlkZGVuIGNvbHVtbnMga2VlcCBvbmx5IHRoZSBuYW1lcyB0aGVpciBsaXN0IHN0aWxsIGhhcyBhcyBjb2x1bW5zICh0aGVcbiAgLy8gYWdlbnQgY2FuIHJlbW92ZSBvciByZW5hbWUgb25lLCBvciB0dXJuIHRoZSBsaXN0IGludG8gYSBjcm9zcy10YWIpLCBhbmQgZ29cbiAgLy8gd2hlbiB3aGF0IGlzIGxlZnQgd291bGQgaGlkZSBldmVyeSBjb2x1bW4uXG4gIHByaXZhdGUgX3BydW5lKHJlcG9ydDogUmVwb3J0KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBncm91cElkIG9mIFsuLi50aGlzLl92YWx1ZXMua2V5cygpLCAuLi50aGlzLl9jbGVhcmVkXSkge1xuICAgICAgaWYgKCF0aGlzLl9ncm91cHMuaGFzKGdyb3VwSWQpKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlcy5kZWxldGUoZ3JvdXBJZCk7XG4gICAgICAgIHRoaXMuX2NsZWFyZWQuZGVsZXRlKGdyb3VwSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2xpc3RTb3J0cy5mb3JFYWNoKChzb3J0LCBjb21wb25lbnRJZCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5fbGlzdHMuZ2V0KGNvbXBvbmVudElkKTtcblxuICAgICAgaWYgKCFjb21wb25lbnQgfHwgIXRoaXMuX3NvcnRhYmxlQ29sdW1ucyhjb21wb25lbnQpLmluY2x1ZGVzKHNvcnQuY29sdW1uKSkge1xuICAgICAgICB0aGlzLl9saXN0U29ydHMuZGVsZXRlKGNvbXBvbmVudElkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IGZpbHRlcklkcyA9IG5ldyBTZXQodGhpcy5fY29tcG9uZW50cyhyZXBvcnQpXG4gICAgICAuZmxhdE1hcCgoY29tcG9uZW50KSA9PiAoY29tcG9uZW50LmZpbHRlcnMgPz8gW10pLm1hcCgoZmlsdGVyKSA9PiBmaWx0ZXIuaWQpKSk7XG5cbiAgICB0aGlzLl9zZXNzaW9uRGlzYWJsZWQuZm9yRWFjaCgoZmlsdGVySWQpID0+IHtcbiAgICAgIGlmICghZmlsdGVySWRzLmhhcyhmaWx0ZXJJZCkpIHtcbiAgICAgICAgdGhpcy5fc2Vzc2lvbkRpc2FibGVkLmRlbGV0ZShmaWx0ZXJJZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLl9kcm9wVW5zZWFyY2hhYmxlKCk7XG5cbiAgICBjb25zdCBoaWRkZW4gPSBuZXcgTWFwPG51bWJlciwgcmVhZG9ubHkgc3RyaW5nW10+KCk7XG5cbiAgICB0aGlzLmxpc3RIaWRkZW4oKS5mb3JFYWNoKChuYW1lcywgY29tcG9uZW50SWQpID0+IHtcbiAgICAgIGNvbnN0IGtlcHQgPSBsaXN0SGlkZGVuQ29sdW1ucyh0aGlzLl9saXN0cy5nZXQoY29tcG9uZW50SWQpPy5jb25maWcsIG5hbWVzKTtcblxuICAgICAgaWYgKGtlcHQubGVuZ3RoKSB7XG4gICAgICAgIGhpZGRlbi5zZXQoY29tcG9uZW50SWQsIGtlcHQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5saXN0SGlkZGVuLnNldChoaWRkZW4pO1xuICB9XG5cbiAgLy8gVGhlIHZhbHVlIGEgYmFyIHNldHMsIGtlZXBpbmcgdGhlIHN0b3JlZCBwcmVzZXQgbmFtZSB3aGlsZSB0aGUgZGF5cyBhcmVcbiAgLy8gc3RpbGwgdGhlIHN0b3JlZCBkYXlzIChzZWUgc2V0VmFsdWUpLlxuICBwcml2YXRlIF93aXRoUHJlc2V0KHN0b3JlZDogRmlsdGVyR3JvdXBWYWx1ZSB8IHVuZGVmaW5lZCwgdmFsdWU6IEZpbHRlckdyb3VwVmFsdWUpOiBGaWx0ZXJHcm91cFZhbHVlIHtcbiAgICBjb25zdCBmaXhlZDogRmlsdGVyR3JvdXBWYWx1ZSA9IHsgLi4udmFsdWUgfTtcbiAgICBkZWxldGUgZml4ZWQucHJlc2V0O1xuXG4gICAgcmV0dXJuIHN0b3JlZD8ucHJlc2V0ICYmIHNhbWVEYXlzKHN0b3JlZCwgZml4ZWQpXG4gICAgICA/IHsgLi4uZml4ZWQsIHByZXNldDogc3RvcmVkLnByZXNldCB9XG4gICAgICA6IGZpeGVkO1xuICB9XG5cbiAgLy8gV2hldGhlciBhIHZhbHVlIGlzIHRoZSBncm91cCdzIGF1dGhvcmVkIGRlZmF1bHQsIGJ5IHR5cGU6IGEgZGF0ZSByYW5nZSBvblxuICAvLyBpdHMgZGF5cyAodGhlIGRlZmF1bHQgcmVzb2x2ZWQgdG9kYXkpLCBhIHNlbGVjdCBvbiBpdHMgdmFsdWVzIGluIGFueVxuICAvLyBvcmRlciwgYSBrZXl3b3JkIG9uIGl0cyB0ZXh0LlxuICBwcml2YXRlIF9pc0RlZmF1bHQoZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwLCB2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMuX2RlZmF1bHRWYWx1ZShncm91cCk7XG4gICAgaWYgKCFkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGdyb3VwLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2RhdGVSYW5nZSc6XG4gICAgICAgIC8vIEFuIHVudG91Y2hlZCByb2xsaW5nIGRlZmF1bHQgc3RpbGwgY2FycmllcyBpdHMgcHJlc2V0IG5hbWUuIEl0cyBkYXlzXG4gICAgICAgIC8vIHdlcmUgcmVzb2x2ZWQgd2hlbiBpdCB3YXMgc2VlZGVkLCBhbmQgYWZ0ZXIgbWlkbmlnaHQgdGhleSBubyBsb25nZXJcbiAgICAgICAgLy8gbWF0Y2ggdG9kYXkncywgYnV0IGl0IGlzIHN0aWxsIHRoZSBkZWZhdWx0IGFuZCBzdGF5cyBvdXQgb2YgdGhlIFVSTC5cbiAgICAgICAgaWYgKHZhbHVlLnByZXNldCAmJiB2YWx1ZS5wcmVzZXQgPT09IGdyb3VwLmNvbmZpZz8uZGVmYXVsdD8ucmVsYXRpdmUpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzYW1lRGF5cyh2YWx1ZSwgZGVmYXVsdFZhbHVlKTtcblxuICAgICAgY2FzZSAnc2VsZWN0Jzoge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSAodmFsdWUudmFsdWVzID8/IFtdKS5tYXAoU3RyaW5nKS5zb3J0KCk7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRzID0gKGRlZmF1bHRWYWx1ZS52YWx1ZXMgPz8gW10pLm1hcChTdHJpbmcpLnNvcnQoKTtcblxuICAgICAgICByZXR1cm4gdmFsdWVzLmxlbmd0aCA9PT0gZGVmYXVsdHMubGVuZ3RoXG4gICAgICAgICAgJiYgdmFsdWVzLmV2ZXJ5KChpdGVtLCBpbmRleCkgPT4gaXRlbSA9PT0gZGVmYXVsdHNbaW5kZXhdKTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICh2YWx1ZS52YWx1ZSA/PyAnJykudHJpbSgpID09PSAoZGVmYXVsdFZhbHVlLnZhbHVlID8/ICcnKS50cmltKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRXZlcnkgY29tcG9uZW50IG9mIHRoZSByZXBvcnQ6IGl0cyBwYWdlcycgYW5kIGl0cyBoZWFkZXIgYW5kIGZvb3RlcidzLlxuICBwcml2YXRlIF9jb21wb25lbnRzKHJlcG9ydDogUmVwb3J0KTogUmVwb3J0Q29tcG9uZW50W10ge1xuICAgIHJldHVybiBbXG4gICAgICAuLi4ocmVwb3J0LnBhZ2VzID8/IFtdKS5mbGF0TWFwKChwYWdlKSA9PiBwYWdlLmNvbXBvbmVudHMgPz8gW10pLFxuICAgICAgLi4uKHJlcG9ydC5tYXN0ZXI/LmNvbXBvbmVudHMgPz8gW10pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIF9saXN0Q29tcG9uZW50cyhyZXBvcnQ6IFJlcG9ydCk6IFJlcG9ydENvbXBvbmVudFtdIHtcbiAgICByZXR1cm4gdGhpcy5fY29tcG9uZW50cyhyZXBvcnQpXG4gICAgICAuZmlsdGVyKChjb21wb25lbnQpID0+IGNvbXBvbmVudC50eXBlID09PSAnbGlzdCcpO1xuICB9XG5cbiAgLy8gVGhlIGNvbHVtbnMgYSBsaXN0IGNhbiBiZSBzb3J0ZWQgYnk6IGV2ZXJ5IGF1dGhvcmVkIGNvbHVtbiwgb3IgYVxuICAvLyBjcm9zcy10YWIncyByb3cgY29sdW1uIG9ubHkgKGl0cyBwaXZvdCBjb2x1bW5zIGNvbWUgYW5kIGdvIHdpdGggdGhlIGRhdGEpLlxuICBwcml2YXRlIF9zb3J0YWJsZUNvbHVtbnMoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgY29uZmlnID0gY29tcG9uZW50LmNvbmZpZztcblxuICAgIGlmIChjb25maWc/LnBpdm90Qnk/LmNvbHVtbikge1xuICAgICAgcmV0dXJuIGNvbmZpZy5yb3dCeT8uY29sdW1uID8gW2NvbmZpZy5yb3dCeS5jb2x1bW5dIDogW107XG4gICAgfVxuXG4gICAgcmV0dXJuIChjb25maWc/LmNvbHVtbnMgPz8gW10pLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4uY29sdW1uKTtcbiAgfVxuXG4gIC8vIEEgZ3JvdXAncyBhdXRob3JlZCBkZWZhdWx0LCBtYXBwZWQgdG8gYSBzZXNzaW9uIHZhbHVlIGJ5IHR5cGUuIFJlbGF0aXZlXG4gIC8vIGRhdGUgcHJlc2V0cyByZXNvbHZlIGFnYWluc3QgXCJub3dcIiBlYWNoIHRpbWUgdGhlIHJlcG9ydCBvcGVucywgc28gYSBzYXZlZFxuICAvLyBcImxhc3QgMTIgbW9udGhzXCIgc3RheXMgcmVsYXRpdmUgYW5kIGNhcnJpZXMgaXRzIHByZXNldCBuYW1lOyBhIGZpeGVkXG4gIC8vIHJhbmdlLCBzZWxlY3QgdmFsdWVzIGFuZCBrZXl3b3JkIHRleHQgc2VlZCB2ZXJiYXRpbS5cbiAgcHJpdmF0ZSBfZGVmYXVsdFZhbHVlKGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCk6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHtcbiAgICBjb25zdCBncm91cERlZmF1bHQgPSBncm91cC5jb25maWc/LmRlZmF1bHQ7XG4gICAgaWYgKCFncm91cERlZmF1bHQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChncm91cERlZmF1bHQucmVsYXRpdmUpIHtcbiAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5fcmVsYXRpdmVSYW5nZShncm91cERlZmF1bHQucmVsYXRpdmUpO1xuXG4gICAgICByZXR1cm4gcmFuZ2UgPyB7IHN0YXJ0OiByYW5nZS5zdGFydCwgZW5kOiByYW5nZS5lbmQsIHByZXNldDogZ3JvdXBEZWZhdWx0LnJlbGF0aXZlIH0gOiBudWxsO1xuICAgIH1cblxuICAgIGlmIChncm91cERlZmF1bHQuc3RhcnQgfHwgZ3JvdXBEZWZhdWx0LmVuZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQ6IGdyb3VwRGVmYXVsdC5zdGFydCA/PyBudWxsLFxuICAgICAgICBlbmQ6IGdyb3VwRGVmYXVsdC5lbmQgPz8gbnVsbCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwRGVmYXVsdC52YWx1ZXM/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHsgdmFsdWVzOiBncm91cERlZmF1bHQudmFsdWVzIH07XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwRGVmYXVsdC52YWx1ZSkge1xuICAgICAgcmV0dXJuIHsgdmFsdWU6IGdyb3VwRGVmYXVsdC52YWx1ZSB9O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQSByZWxhdGl2ZSBwcmVzZXQgYXMgYSBjYWxlbmRhci1kYXkgcmFuZ2UuIFwiVG9kYXlcIiBpcyB0aGUgZGF5IGluIHRoZVxuICAvLyByZXBvcnQncyBlZmZlY3RpdmUgem9uZSwgbm90IHRoZSBicm93c2VyJ3MsIHNvIGV2ZXJ5IHZpZXdlciBzZWVkcyB0aGUgc2FtZVxuICAvLyByYW5nZS4gVGhlIHNlcnZlciB0d2luIGlzIFJlcG9ydFJlbGF0aXZlUmFuZ2VFbnVtIChmcmFtZXdvcmsvUmVwb3J0L0VudW0pLFxuICAvLyBhbmQgUmVwb3J0UmVsYXRpdmVSYW5nZUVudW1UZXN0IHBpbnMgdGhlIHRhYmxlIGJvdGggc2lkZXMgbXVzdCBwcm9kdWNlLlxuICBwcml2YXRlIF9yZWxhdGl2ZVJhbmdlKHJlbGF0aXZlOiBzdHJpbmcpOiB7IHN0YXJ0OiBEYXRlOyBlbmQ6IERhdGUgfSB8IG51bGwge1xuICAgIGNvbnN0IG5vdyA9IGdldFpvbmVkTm93KHRoaXMudGltZXpvbmUoKSk7XG5cbiAgICBzd2l0Y2ggKHJlbGF0aXZlKSB7XG4gICAgICAvLyBBIGNhbGVuZGFyIHdlZWssIE1vbmRheSB0byBTdW5kYXkgKFJFUE9SVF9XRUVLX1NUQVJUU19PTiwgdGhlIHNhbWUgd2Vla1xuICAgICAgLy8gdGhlIHNlcnZlcidzIHdlZWtseSBidWNrZXRzIHVzZSksIGluIHdob2xlIGRheXMg4oCUIG5vdCB0aGUgcm9sbGluZ1xuICAgICAgLy8gc2V2ZW4gZGF5cyBgbGFzdDdEYXlzYCBnaXZlcywgd2hpY2ggbmV2ZXIgbGluZXMgdXAgd2l0aCB0aGUgd2VlayBhXG4gICAgICAvLyBwYXJ0bmVyIGhhcyBhbHJlYWR5IGJlZW4gc2VudC4gYGxhc3RXZWVrYCBpcyB0aGUgb25lIGEgd2Vla2x5IHJlcG9ydFxuICAgICAgLy8gd2FudHM6IGl0IGVuZHMgb24gdGhlIHByZXZpb3VzIHdlZWsncyBTdW5kYXkgcmF0aGVyIHRoYW4gYXQgYG5vd2AsXG4gICAgICAvLyBiZWNhdXNlIHRoZSB3ZWVrIGl0IG5hbWVzIGhhcyBjbG9zZWQuIGB0aGlzV2Vla2AgZm9sbG93cyBldmVyeSBvdGhlclxuICAgICAgLy8gcHJlc2V0IGhlcmUgYW5kIHJ1bnMgdXAgdG8gbm93LCBzbyBpdCBpcyBkZWxpYmVyYXRlbHkgYSBwYXJ0LWZpbmlzaGVkXG4gICAgICAvLyB3ZWVrIChvbiBhIFN1bmRheSBpdCBpcyB0aGUgd2hvbGUgTW9uZGF5LXRvLVN1bmRheSB3ZWVrKS5cbiAgICAgIGNhc2UgJ3RoaXNXZWVrJzpcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0T2ZXZWVrKG5vdywgeyB3ZWVrU3RhcnRzT246IFJFUE9SVF9XRUVLX1NUQVJUU19PTiB9KSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ2xhc3RXZWVrJzoge1xuICAgICAgICBjb25zdCBwcmV2aW91cyA9IHN1YldlZWtzKG5vdywgMSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdGFydDogc3RhcnRPZldlZWsocHJldmlvdXMsIHsgd2Vla1N0YXJ0c09uOiBSRVBPUlRfV0VFS19TVEFSVFNfT04gfSksXG4gICAgICAgICAgZW5kOiBlbmRPZldlZWsocHJldmlvdXMsIHsgd2Vla1N0YXJ0c09uOiBSRVBPUlRfV0VFS19TVEFSVFNfT04gfSksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjYXNlICdsYXN0N0RheXMnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3ViRGF5cyhub3csIDcpLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAnbGFzdDMwRGF5cyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJEYXlzKG5vdywgMzApLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAnbGFzdDNNb250aHMnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3ViTW9udGhzKG5vdywgMyksIGVuZDogbm93IH07XG4gICAgICBjYXNlICdsYXN0Nk1vbnRocyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJNb250aHMobm93LCA2KSwgZW5kOiBub3cgfTtcbiAgICAgIGNhc2UgJ2xhc3QxMk1vbnRocyc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdWJNb250aHMobm93LCAxMiksIGVuZDogbm93IH07XG4gICAgICBjYXNlICd0aGlzTW9udGgnOlxuICAgICAgICByZXR1cm4geyBzdGFydDogc3RhcnRPZk1vbnRoKG5vdyksIGVuZDogbm93IH07XG4gICAgICBjYXNlICd0aGlzUXVhcnRlcic6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydE9mUXVhcnRlcihub3cpLCBlbmQ6IG5vdyB9O1xuICAgICAgY2FzZSAndGhpc1llYXInOlxuICAgICAgY2FzZSAneWVhclRvRGF0ZSc6XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydE9mWWVhcihub3cpLCBlbmQ6IG5vdyB9O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -1,3 +1,4 @@
1
+ import { ReportChangePolarity } from '../enums/report-change-polarity.enum';
1
2
  import { ReportChartColor } from '../enums/report-chart-color.enum';
2
3
  // The report chart palette — one definition shared by the ECharts theme (on
3
4
  // screen), the PowerPoint export's native chart colors, and the PDF export,
@@ -33,4 +34,19 @@ export const REPORT_WATERFALL_COLORS = {
33
34
  fall: REPORT_CHART_COLORS[1],
34
35
  total: REPORT_CHART_COLORS[9],
35
36
  };
36
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFsZXR0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy90aGVtZS9wYWxldHRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBSXBFLDRFQUE0RTtBQUM1RSw0RUFBNEU7QUFDNUUsbURBQW1EO0FBQ25ELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHO0lBQ2pDLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRO0lBQ2hELFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRO0NBQ2pELENBQUM7QUFFRiw0QkFBNEI7QUFDNUIsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUM7QUFFdkYsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBcUM7SUFDMUUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDL0MsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDakQsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDOUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDL0MsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDaEQsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDakQsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDakQsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDL0MsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDaEQsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7Q0FDaEQsQ0FBQztBQUVGLDZFQUE2RTtBQUM3RSwyREFBMkQ7QUFDM0QsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsUUFBUSxDQUFDO0FBRS9DLDJFQUEyRTtBQUMzRSwyRUFBMkU7QUFDM0Usa0VBQWtFO0FBQ2xFLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFzQztJQUN4RSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO0lBQzVCLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDNUIsS0FBSyxFQUFFLG1CQUFtQixDQUFDLENBQUMsQ0FBQztDQUM5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVwb3J0Q2hhcnRDb2xvciB9IGZyb20gJy4uL2VudW1zL3JlcG9ydC1jaGFydC1jb2xvci5lbnVtJztcbmltcG9ydCB7IFdhdGVyZmFsbFN0ZXBLaW5kIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcblxuXG4vLyBUaGUgcmVwb3J0IGNoYXJ0IHBhbGV0dGUg4oCUIG9uZSBkZWZpbml0aW9uIHNoYXJlZCBieSB0aGUgRUNoYXJ0cyB0aGVtZSAob25cbi8vIHNjcmVlbiksIHRoZSBQb3dlclBvaW50IGV4cG9ydCdzIG5hdGl2ZSBjaGFydCBjb2xvcnMsIGFuZCB0aGUgUERGIGV4cG9ydCxcbi8vIHNvIGEgc2VyaWVzIGtlZXBzIGl0cyBjb2xvciBhY3Jvc3MgZXZlcnkgbWVkaXVtLlxuZXhwb3J0IGNvbnN0IFJFUE9SVF9DSEFSVF9DT0xPUlMgPSBbXG4gICc0ZTc5YTcnLCAnZjI4ZTJiJywgJ2UxNTc1OScsICc3NmI3YjInLCAnNTlhMTRmJyxcbiAgJ2VkYzk0OCcsICdiMDdhYTEnLCAnZmY5ZGE3JywgJzljNzU1ZicsICdiYWIwYWMnLFxuXTtcblxuLy8gQ1NTLWhleCBmb3JtIGZvciBFQ2hhcnRzLlxuZXhwb3J0IGNvbnN0IFJFUE9SVF9DSEFSVF9DT0xPUlNfQ1NTID0gUkVQT1JUX0NIQVJUX0NPTE9SUy5tYXAoKGNvbG9yKSA9PiBgIyR7Y29sb3J9YCk7XG5cbi8vIEEgbWVhc3VyZSdzIG5hbWVkIGNvbG9yIGlzIHRoZSBwYWxldHRlIGVudHJ5IGF0IHRoZSBuYW1lJ3MgcG9zaXRpb24sIHNvIGFcbi8vIG1lYXN1cmUgY29sb3JlZCBibHVlIGxvb2tzIGV4YWN0bHkgbGlrZSB0aGUgZmlyc3Qgc2VyaWVzIGxlZnQgdG8gdGhlIHRoZW1lLlxuZXhwb3J0IGNvbnN0IFJFUE9SVF9DSEFSVF9DT0xPUl9CWV9OQU1FOiBSZWNvcmQ8UmVwb3J0Q2hhcnRDb2xvciwgc3RyaW5nPiA9IHtcbiAgW1JlcG9ydENoYXJ0Q29sb3IuQmx1ZV06IFJFUE9SVF9DSEFSVF9DT0xPUlNbMF0sXG4gIFtSZXBvcnRDaGFydENvbG9yLk9yYW5nZV06IFJFUE9SVF9DSEFSVF9DT0xPUlNbMV0sXG4gIFtSZXBvcnRDaGFydENvbG9yLlJlZF06IFJFUE9SVF9DSEFSVF9DT0xPUlNbMl0sXG4gIFtSZXBvcnRDaGFydENvbG9yLlRlYWxdOiBSRVBPUlRfQ0hBUlRfQ09MT1JTWzNdLFxuICBbUmVwb3J0Q2hhcnRDb2xvci5HcmVlbl06IFJFUE9SVF9DSEFSVF9DT0xPUlNbNF0sXG4gIFtSZXBvcnRDaGFydENvbG9yLlllbGxvd106IFJFUE9SVF9DSEFSVF9DT0xPUlNbNV0sXG4gIFtSZXBvcnRDaGFydENvbG9yLlB1cnBsZV06IFJFUE9SVF9DSEFSVF9DT0xPUlNbNl0sXG4gIFtSZXBvcnRDaGFydENvbG9yLlBpbmtdOiBSRVBPUlRfQ0hBUlRfQ09MT1JTWzddLFxuICBbUmVwb3J0Q2hhcnRDb2xvci5Ccm93bl06IFJFUE9SVF9DSEFSVF9DT0xPUlNbOF0sXG4gIFtSZXBvcnRDaGFydENvbG9yLkdyYXldOiBSRVBPUlRfQ0hBUlRfQ09MT1JTWzldLFxufTtcblxuLy8gUmVmZXJlbmNlIGxpbmVzIGFuZCBiYW5kcyBhcmUgZHJhd24gaW4gb25lIG5ldXRyYWwgc2xhdGUsIGFwYXJ0IGZyb20gZXZlcnlcbi8vIHNlcmllcyBjb2xvciwgc28gYSB0YXJnZXQgbmV2ZXIgcmVhZHMgYXMgYW5vdGhlciBzZXJpZXMuXG5leHBvcnQgY29uc3QgUkVQT1JUX1JFRkVSRU5DRV9DT0xPUiA9ICc1MjYwNmQnO1xuXG4vLyBBIHdhdGVyZmFsbCBjb2xvcnMgZWFjaCBiYXIgYnkgd2hhdCBpdCBkb2VzIHRvIHRoZSBydW5uaW5nIHRvdGFsLCBpbiB0aGVcbi8vIG9yZGVyIEV4Y2VsIGFuZCBQb3dlclBvaW50IHVzZSBieSBkZWZhdWx0OiBhIHJpc2UgdGFrZXMgdGhlIGZpcnN0IHNlcmllc1xuLy8gY29sb3IsIGEgZmFsbCB0aGUgc2Vjb25kLCBhbmQgdGhlIGNsb3NpbmcgdG90YWwgYSBuZXV0cmFsIGdyYXkuXG5leHBvcnQgY29uc3QgUkVQT1JUX1dBVEVSRkFMTF9DT0xPUlM6IFJlY29yZDxXYXRlcmZhbGxTdGVwS2luZCwgc3RyaW5nPiA9IHtcbiAgcmlzZTogUkVQT1JUX0NIQVJUX0NPTE9SU1swXSxcbiAgZmFsbDogUkVQT1JUX0NIQVJUX0NPTE9SU1sxXSxcbiAgdG90YWw6IFJFUE9SVF9DSEFSVF9DT0xPUlNbOV0sXG59O1xuIl19
37
+ // A KPI's change is colored by what it means rather than by its sign: green
38
+ // when it is good news, red when it is bad news, slate when it is neither (a
39
+ // flat change, or a value whose increaseIs is neutral). The same three colors
40
+ // draw a target's progress (green once met). The card exposes each as a CSS
41
+ // variable a host page can override: --report-kpi-good-color,
42
+ // --report-kpi-bad-color and --report-kpi-neutral-color, set on any element
43
+ // around the report.
44
+ export const REPORT_KPI_CHANGE_COLORS = {
45
+ [ReportChangePolarity.Good]: REPORT_CHART_COLORS[4],
46
+ [ReportChangePolarity.Bad]: REPORT_CHART_COLORS[2],
47
+ [ReportChangePolarity.Neutral]: '7b8794',
48
+ };
49
+ // A KPI's sparkline takes the first series color, as a one-measure chart of
50
+ // the same values would (--report-kpi-sparkline-color overrides it).
51
+ export const REPORT_KPI_SPARKLINE_COLOR = REPORT_CHART_COLORS[0];
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFsZXR0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy90aGVtZS9wYWxldHRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBSXBFLDRFQUE0RTtBQUM1RSw0RUFBNEU7QUFDNUUsbURBQW1EO0FBQ25ELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHO0lBQ2pDLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRO0lBQ2hELFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRO0NBQ2pELENBQUM7QUFFRiw0QkFBNEI7QUFDNUIsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUM7QUFFdkYsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBcUM7SUFDMUUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDL0MsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDakQsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDOUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDL0MsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDaEQsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDakQsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDakQsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDL0MsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDaEQsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7Q0FDaEQsQ0FBQztBQUVGLDZFQUE2RTtBQUM3RSwyREFBMkQ7QUFDM0QsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsUUFBUSxDQUFDO0FBRS9DLDJFQUEyRTtBQUMzRSwyRUFBMkU7QUFDM0Usa0VBQWtFO0FBQ2xFLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFzQztJQUN4RSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO0lBQzVCLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDNUIsS0FBSyxFQUFFLG1CQUFtQixDQUFDLENBQUMsQ0FBQztDQUM5QixDQUFDO0FBRUYsNEVBQTRFO0FBQzVFLDZFQUE2RTtBQUM3RSw4RUFBOEU7QUFDOUUsNEVBQTRFO0FBQzVFLDhEQUE4RDtBQUM5RCw0RUFBNEU7QUFDNUUscUJBQXFCO0FBQ3JCLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUF5QztJQUM1RSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFLG1CQUFtQixDQUFDLENBQUMsQ0FBQztJQUNuRCxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLENBQUMsQ0FBQztJQUNsRCxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVE7Q0FDekMsQ0FBQztBQUVGLDRFQUE0RTtBQUM1RSxxRUFBcUU7QUFDckUsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXBvcnRDaGFuZ2VQb2xhcml0eSB9IGZyb20gJy4uL2VudW1zL3JlcG9ydC1jaGFuZ2UtcG9sYXJpdHkuZW51bSc7XG5pbXBvcnQgeyBSZXBvcnRDaGFydENvbG9yIH0gZnJvbSAnLi4vZW51bXMvcmVwb3J0LWNoYXJ0LWNvbG9yLmVudW0nO1xuaW1wb3J0IHsgV2F0ZXJmYWxsU3RlcEtpbmQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuXG5cbi8vIFRoZSByZXBvcnQgY2hhcnQgcGFsZXR0ZSDigJQgb25lIGRlZmluaXRpb24gc2hhcmVkIGJ5IHRoZSBFQ2hhcnRzIHRoZW1lIChvblxuLy8gc2NyZWVuKSwgdGhlIFBvd2VyUG9pbnQgZXhwb3J0J3MgbmF0aXZlIGNoYXJ0IGNvbG9ycywgYW5kIHRoZSBQREYgZXhwb3J0LFxuLy8gc28gYSBzZXJpZXMga2VlcHMgaXRzIGNvbG9yIGFjcm9zcyBldmVyeSBtZWRpdW0uXG5leHBvcnQgY29uc3QgUkVQT1JUX0NIQVJUX0NPTE9SUyA9IFtcbiAgJzRlNzlhNycsICdmMjhlMmInLCAnZTE1NzU5JywgJzc2YjdiMicsICc1OWExNGYnLFxuICAnZWRjOTQ4JywgJ2IwN2FhMScsICdmZjlkYTcnLCAnOWM3NTVmJywgJ2JhYjBhYycsXG5dO1xuXG4vLyBDU1MtaGV4IGZvcm0gZm9yIEVDaGFydHMuXG5leHBvcnQgY29uc3QgUkVQT1JUX0NIQVJUX0NPTE9SU19DU1MgPSBSRVBPUlRfQ0hBUlRfQ09MT1JTLm1hcCgoY29sb3IpID0+IGAjJHtjb2xvcn1gKTtcblxuLy8gQSBtZWFzdXJlJ3MgbmFtZWQgY29sb3IgaXMgdGhlIHBhbGV0dGUgZW50cnkgYXQgdGhlIG5hbWUncyBwb3NpdGlvbiwgc28gYVxuLy8gbWVhc3VyZSBjb2xvcmVkIGJsdWUgbG9va3MgZXhhY3RseSBsaWtlIHRoZSBmaXJzdCBzZXJpZXMgbGVmdCB0byB0aGUgdGhlbWUuXG5leHBvcnQgY29uc3QgUkVQT1JUX0NIQVJUX0NPTE9SX0JZX05BTUU6IFJlY29yZDxSZXBvcnRDaGFydENvbG9yLCBzdHJpbmc+ID0ge1xuICBbUmVwb3J0Q2hhcnRDb2xvci5CbHVlXTogUkVQT1JUX0NIQVJUX0NPTE9SU1swXSxcbiAgW1JlcG9ydENoYXJ0Q29sb3IuT3JhbmdlXTogUkVQT1JUX0NIQVJUX0NPTE9SU1sxXSxcbiAgW1JlcG9ydENoYXJ0Q29sb3IuUmVkXTogUkVQT1JUX0NIQVJUX0NPTE9SU1syXSxcbiAgW1JlcG9ydENoYXJ0Q29sb3IuVGVhbF06IFJFUE9SVF9DSEFSVF9DT0xPUlNbM10sXG4gIFtSZXBvcnRDaGFydENvbG9yLkdyZWVuXTogUkVQT1JUX0NIQVJUX0NPTE9SU1s0XSxcbiAgW1JlcG9ydENoYXJ0Q29sb3IuWWVsbG93XTogUkVQT1JUX0NIQVJUX0NPTE9SU1s1XSxcbiAgW1JlcG9ydENoYXJ0Q29sb3IuUHVycGxlXTogUkVQT1JUX0NIQVJUX0NPTE9SU1s2XSxcbiAgW1JlcG9ydENoYXJ0Q29sb3IuUGlua106IFJFUE9SVF9DSEFSVF9DT0xPUlNbN10sXG4gIFtSZXBvcnRDaGFydENvbG9yLkJyb3duXTogUkVQT1JUX0NIQVJUX0NPTE9SU1s4XSxcbiAgW1JlcG9ydENoYXJ0Q29sb3IuR3JheV06IFJFUE9SVF9DSEFSVF9DT0xPUlNbOV0sXG59O1xuXG4vLyBSZWZlcmVuY2UgbGluZXMgYW5kIGJhbmRzIGFyZSBkcmF3biBpbiBvbmUgbmV1dHJhbCBzbGF0ZSwgYXBhcnQgZnJvbSBldmVyeVxuLy8gc2VyaWVzIGNvbG9yLCBzbyBhIHRhcmdldCBuZXZlciByZWFkcyBhcyBhbm90aGVyIHNlcmllcy5cbmV4cG9ydCBjb25zdCBSRVBPUlRfUkVGRVJFTkNFX0NPTE9SID0gJzUyNjA2ZCc7XG5cbi8vIEEgd2F0ZXJmYWxsIGNvbG9ycyBlYWNoIGJhciBieSB3aGF0IGl0IGRvZXMgdG8gdGhlIHJ1bm5pbmcgdG90YWwsIGluIHRoZVxuLy8gb3JkZXIgRXhjZWwgYW5kIFBvd2VyUG9pbnQgdXNlIGJ5IGRlZmF1bHQ6IGEgcmlzZSB0YWtlcyB0aGUgZmlyc3Qgc2VyaWVzXG4vLyBjb2xvciwgYSBmYWxsIHRoZSBzZWNvbmQsIGFuZCB0aGUgY2xvc2luZyB0b3RhbCBhIG5ldXRyYWwgZ3JheS5cbmV4cG9ydCBjb25zdCBSRVBPUlRfV0FURVJGQUxMX0NPTE9SUzogUmVjb3JkPFdhdGVyZmFsbFN0ZXBLaW5kLCBzdHJpbmc+ID0ge1xuICByaXNlOiBSRVBPUlRfQ0hBUlRfQ09MT1JTWzBdLFxuICBmYWxsOiBSRVBPUlRfQ0hBUlRfQ09MT1JTWzFdLFxuICB0b3RhbDogUkVQT1JUX0NIQVJUX0NPTE9SU1s5XSxcbn07XG5cbi8vIEEgS1BJJ3MgY2hhbmdlIGlzIGNvbG9yZWQgYnkgd2hhdCBpdCBtZWFucyByYXRoZXIgdGhhbiBieSBpdHMgc2lnbjogZ3JlZW5cbi8vIHdoZW4gaXQgaXMgZ29vZCBuZXdzLCByZWQgd2hlbiBpdCBpcyBiYWQgbmV3cywgc2xhdGUgd2hlbiBpdCBpcyBuZWl0aGVyIChhXG4vLyBmbGF0IGNoYW5nZSwgb3IgYSB2YWx1ZSB3aG9zZSBpbmNyZWFzZUlzIGlzIG5ldXRyYWwpLiBUaGUgc2FtZSB0aHJlZSBjb2xvcnNcbi8vIGRyYXcgYSB0YXJnZXQncyBwcm9ncmVzcyAoZ3JlZW4gb25jZSBtZXQpLiBUaGUgY2FyZCBleHBvc2VzIGVhY2ggYXMgYSBDU1Ncbi8vIHZhcmlhYmxlIGEgaG9zdCBwYWdlIGNhbiBvdmVycmlkZTogLS1yZXBvcnQta3BpLWdvb2QtY29sb3IsXG4vLyAtLXJlcG9ydC1rcGktYmFkLWNvbG9yIGFuZCAtLXJlcG9ydC1rcGktbmV1dHJhbC1jb2xvciwgc2V0IG9uIGFueSBlbGVtZW50XG4vLyBhcm91bmQgdGhlIHJlcG9ydC5cbmV4cG9ydCBjb25zdCBSRVBPUlRfS1BJX0NIQU5HRV9DT0xPUlM6IFJlY29yZDxSZXBvcnRDaGFuZ2VQb2xhcml0eSwgc3RyaW5nPiA9IHtcbiAgW1JlcG9ydENoYW5nZVBvbGFyaXR5Lkdvb2RdOiBSRVBPUlRfQ0hBUlRfQ09MT1JTWzRdLFxuICBbUmVwb3J0Q2hhbmdlUG9sYXJpdHkuQmFkXTogUkVQT1JUX0NIQVJUX0NPTE9SU1syXSxcbiAgW1JlcG9ydENoYW5nZVBvbGFyaXR5Lk5ldXRyYWxdOiAnN2I4Nzk0Jyxcbn07XG5cbi8vIEEgS1BJJ3Mgc3BhcmtsaW5lIHRha2VzIHRoZSBmaXJzdCBzZXJpZXMgY29sb3IsIGFzIGEgb25lLW1lYXN1cmUgY2hhcnQgb2Zcbi8vIHRoZSBzYW1lIHZhbHVlcyB3b3VsZCAoLS1yZXBvcnQta3BpLXNwYXJrbGluZS1jb2xvciBvdmVycmlkZXMgaXQpLlxuZXhwb3J0IGNvbnN0IFJFUE9SVF9LUElfU1BBUktMSU5FX0NPTE9SID0gUkVQT1JUX0NIQVJUX0NPTE9SU1swXTtcbiJdfQ==
@@ -6,4 +6,8 @@ export const REPORT_AXIS_LABEL_FONT_SIZE = 11;
6
6
  // The size a chart's data labels (the values printed beside its points) are
7
7
  // drawn in: a step under the axis labels, so they never outweigh the axes.
8
8
  export const REPORT_DATA_LABEL_FONT_SIZE = 10;
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwb2dyYXBoeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy90aGVtZS90eXBvZ3JhcGh5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGdGQUFnRjtBQUNoRiw4RUFBOEU7QUFDOUUsa0RBQWtEO0FBQ2xELE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLHNDQUFzQyxDQUFDO0FBQy9FLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLEVBQUUsQ0FBQztBQUM5Qyw0RUFBNEU7QUFDNUUsMkVBQTJFO0FBQzNFLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRoZSByZXBvcnQgY2hhcnRzJyB0eXBlZmFjZSBhbmQgYXhpcy1sYWJlbCBzaXplLiBUaGUgRUNoYXJ0cyB0aGVtZSBkcmF3cyB3aXRoXG4vLyB0aGVtLCBhbmQgdGhlIG9wdGlvbiBidWlsZGVyIG1lYXN1cmVzIGF4aXMgbGFiZWxzIHdpdGggdGhlbSwgc28gdGhlIHJvb20gaXRcbi8vIGxlYXZlcyBhcm91bmQgdGhlIGxhYmVscyBtYXRjaGVzIHdoYXQgaXMgZHJhd24uXG5leHBvcnQgY29uc3QgUkVQT1JUX0NIQVJUX0ZPTlRfRkFNSUxZID0gJ1JvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmJztcbmV4cG9ydCBjb25zdCBSRVBPUlRfQVhJU19MQUJFTF9GT05UX1NJWkUgPSAxMTtcbi8vIFRoZSBzaXplIGEgY2hhcnQncyBkYXRhIGxhYmVscyAodGhlIHZhbHVlcyBwcmludGVkIGJlc2lkZSBpdHMgcG9pbnRzKSBhcmVcbi8vIGRyYXduIGluOiBhIHN0ZXAgdW5kZXIgdGhlIGF4aXMgbGFiZWxzLCBzbyB0aGV5IG5ldmVyIG91dHdlaWdoIHRoZSBheGVzLlxuZXhwb3J0IGNvbnN0IFJFUE9SVF9EQVRBX0xBQkVMX0ZPTlRfU0laRSA9IDEwO1xuIl19
9
+ // The size, in pixels, a KPI card's value is drawn in on screen: the one large
10
+ // number on the tile. Its label, change and other lines take the FsStyle
11
+ // .small text or the body size.
12
+ export const REPORT_KPI_VALUE_FONT_SIZE = 34;
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwb2dyYXBoeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy90aGVtZS90eXBvZ3JhcGh5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGdGQUFnRjtBQUNoRiw4RUFBOEU7QUFDOUUsa0RBQWtEO0FBQ2xELE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLHNDQUFzQyxDQUFDO0FBQy9FLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLEVBQUUsQ0FBQztBQUM5Qyw0RUFBNEU7QUFDNUUsMkVBQTJFO0FBQzNFLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLEVBQUUsQ0FBQztBQUM5QywrRUFBK0U7QUFDL0UseUVBQXlFO0FBQ3pFLGdDQUFnQztBQUNoQyxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGUgcmVwb3J0IGNoYXJ0cycgdHlwZWZhY2UgYW5kIGF4aXMtbGFiZWwgc2l6ZS4gVGhlIEVDaGFydHMgdGhlbWUgZHJhd3Mgd2l0aFxuLy8gdGhlbSwgYW5kIHRoZSBvcHRpb24gYnVpbGRlciBtZWFzdXJlcyBheGlzIGxhYmVscyB3aXRoIHRoZW0sIHNvIHRoZSByb29tIGl0XG4vLyBsZWF2ZXMgYXJvdW5kIHRoZSBsYWJlbHMgbWF0Y2hlcyB3aGF0IGlzIGRyYXduLlxuZXhwb3J0IGNvbnN0IFJFUE9SVF9DSEFSVF9GT05UX0ZBTUlMWSA9ICdSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZic7XG5leHBvcnQgY29uc3QgUkVQT1JUX0FYSVNfTEFCRUxfRk9OVF9TSVpFID0gMTE7XG4vLyBUaGUgc2l6ZSBhIGNoYXJ0J3MgZGF0YSBsYWJlbHMgKHRoZSB2YWx1ZXMgcHJpbnRlZCBiZXNpZGUgaXRzIHBvaW50cykgYXJlXG4vLyBkcmF3biBpbjogYSBzdGVwIHVuZGVyIHRoZSBheGlzIGxhYmVscywgc28gdGhleSBuZXZlciBvdXR3ZWlnaCB0aGUgYXhlcy5cbmV4cG9ydCBjb25zdCBSRVBPUlRfREFUQV9MQUJFTF9GT05UX1NJWkUgPSAxMDtcbi8vIFRoZSBzaXplLCBpbiBwaXhlbHMsIGEgS1BJIGNhcmQncyB2YWx1ZSBpcyBkcmF3biBpbiBvbiBzY3JlZW46IHRoZSBvbmUgbGFyZ2Vcbi8vIG51bWJlciBvbiB0aGUgdGlsZS4gSXRzIGxhYmVsLCBjaGFuZ2UgYW5kIG90aGVyIGxpbmVzIHRha2UgdGhlIEZzU3R5bGVcbi8vIC5zbWFsbCB0ZXh0IG9yIHRoZSBib2R5IHNpemUuXG5leHBvcnQgY29uc3QgUkVQT1JUX0tQSV9WQUxVRV9GT05UX1NJWkUgPSAzNDtcbiJdfQ==