@firestitch/report 18.5.0 → 18.6.1

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 (63) hide show
  1. package/app/reports/components/component-kpi/component-kpi.component.d.ts +2 -1
  2. package/app/reports/components/component-list/component-list.component.d.ts +3 -7
  3. package/app/reports/components/report-canvas/report-canvas.component.d.ts +5 -4
  4. package/app/reports/components/report-component/report-component.component.d.ts +7 -6
  5. package/app/reports/components/timezone-select/timezone-select.component.d.ts +4 -6
  6. package/app/reports/consts/report-week.const.d.ts +2 -0
  7. package/app/reports/data/report-ai-chat.data.d.ts +12 -0
  8. package/app/reports/data/report.data.d.ts +3 -3
  9. package/app/reports/dialogs/component-settings/component-settings.component.d.ts +6 -6
  10. package/app/reports/dialogs/report-settings/report-settings.component.d.ts +5 -0
  11. package/app/reports/export/report-export-collector.service.d.ts +14 -2
  12. package/app/reports/export/report-pdf.service.d.ts +14 -1
  13. package/app/reports/export/report-pptx.service.d.ts +2 -1
  14. package/app/reports/format.d.ts +8 -1
  15. package/app/reports/interfaces/report-chat-viewer-filter.interface.d.ts +7 -0
  16. package/app/reports/interfaces/report-chat-viewer-state.interface.d.ts +7 -0
  17. package/app/reports/interfaces/report.interface.d.ts +18 -2
  18. package/app/reports/option-builder.d.ts +2 -1
  19. package/app/reports/pipes/report-date.pipe.d.ts +7 -0
  20. package/app/reports/report-filter-items.d.ts +5 -0
  21. package/app/reports/report-url-state.d.ts +15 -0
  22. package/app/reports/services/report-filter-state.service.d.ts +27 -2
  23. package/app/reports/theme/typography.d.ts +2 -0
  24. package/app/reports/views/report/fs-ai-report.component.d.ts +16 -8
  25. package/app/reports/views/report/report.component.d.ts +6 -6
  26. package/esm2022/app/reports/components/component-kpi/component-kpi.component.mjs +7 -4
  27. package/esm2022/app/reports/components/component-list/component-list.component.mjs +34 -131
  28. package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +57 -44
  29. package/esm2022/app/reports/components/report-component/report-component.component.mjs +57 -35
  30. package/esm2022/app/reports/components/timezone-select/timezone-select.component.mjs +23 -23
  31. package/esm2022/app/reports/consts/report-week.const.mjs +7 -0
  32. package/esm2022/app/reports/data/report-ai-chat.data.mjs +25 -0
  33. package/esm2022/app/reports/data/report.data.mjs +22 -9
  34. package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +25 -26
  35. package/esm2022/app/reports/dialogs/global-settings/global-settings.component.mjs +2 -2
  36. package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +38 -13
  37. package/esm2022/app/reports/export/report-export-collector.service.mjs +95 -29
  38. package/esm2022/app/reports/export/report-export.service.mjs +11 -8
  39. package/esm2022/app/reports/export/report-pdf.service.mjs +245 -84
  40. package/esm2022/app/reports/export/report-pptx.service.mjs +64 -48
  41. package/esm2022/app/reports/format.mjs +126 -9
  42. package/esm2022/app/reports/interfaces/report-chat-viewer-filter.interface.mjs +2 -0
  43. package/esm2022/app/reports/interfaces/report-chat-viewer-state.interface.mjs +2 -0
  44. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  45. package/esm2022/app/reports/option-builder.mjs +146 -15
  46. package/esm2022/app/reports/pipes/report-date.pipe.mjs +21 -0
  47. package/esm2022/app/reports/report-filter-items.mjs +42 -10
  48. package/esm2022/app/reports/report-url-state.mjs +148 -0
  49. package/esm2022/app/reports/services/report-filter-state.service.mjs +339 -64
  50. package/esm2022/app/reports/theme/echarts.mjs +6 -5
  51. package/esm2022/app/reports/theme/typography.mjs +6 -0
  52. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +198 -90
  53. package/esm2022/app/reports/views/report/report.component.mjs +68 -62
  54. package/fesm2022/{firestitch-report-echarts-CtKYuRcT.mjs → firestitch-report-echarts-Djtmaxj1.mjs} +6 -6
  55. package/fesm2022/firestitch-report-echarts-Djtmaxj1.mjs.map +1 -0
  56. package/fesm2022/{firestitch-report-firestitch-report-Df1IXrEs.mjs → firestitch-report-firestitch-report-D3zseBZc.mjs} +1781 -738
  57. package/fesm2022/firestitch-report-firestitch-report-D3zseBZc.mjs.map +1 -0
  58. package/fesm2022/firestitch-report.mjs +1 -1
  59. package/package.json +1 -1
  60. package/app/reports/dialogs/report-settings/report-settings-default.d.ts +0 -2
  61. package/esm2022/app/reports/dialogs/report-settings/report-settings-default.mjs +0 -22
  62. package/fesm2022/firestitch-report-echarts-CtKYuRcT.mjs.map +0 -1
  63. package/fesm2022/firestitch-report-firestitch-report-Df1IXrEs.mjs.map +0 -1
@@ -30,21 +30,53 @@ export function dateBoundLabel(value) {
30
30
  const date = parseISO(bound);
31
31
  return Number.isNaN(date.getTime()) ? String(value) : format(date, 'MMM d, yyyy');
32
32
  }
33
+ // A stored yyyy-MM-dd boundary as a local Date for a date picker, or null.
34
+ // parseISO reads a bare Y-M-D as LOCAL midnight, so the picker shows the day
35
+ // that was stored, whatever the browser's zone.
36
+ export function dateFromBound(value) {
37
+ if (!value) {
38
+ return null;
39
+ }
40
+ const date = parseISO(value.slice(0, 10));
41
+ return Number.isNaN(date.getTime()) ? null : date;
42
+ }
43
+ // A picked Date as a yyyy-MM-dd boundary for storage, or null. Uses the local
44
+ // calendar day (format, not toISOString) so the boundary is the day that was
45
+ // picked, regardless of the browser's zone.
46
+ export function dateToBound(value) {
47
+ return value instanceof Date && !Number.isNaN(value.getTime())
48
+ ? format(value, 'yyyy-MM-dd')
49
+ : null;
50
+ }
51
+ // A relative date-range preset key as a sentence-case label, derived from the
52
+ // camelCase key itself ('last12Months' reads 'Last 12 months', 'thisWeek'
53
+ // reads 'This week'), so no list of presets is mirrored here and a key the
54
+ // server adds later still reads sensibly.
55
+ export function relativeLabel(relative) {
56
+ const words = relative
57
+ .replace(/([a-z])([A-Z0-9])/g, '$1 $2')
58
+ .replace(/(\d)([A-Z])/g, '$1 $2')
59
+ .toLowerCase();
60
+ return words.charAt(0).toUpperCase() + words.slice(1);
61
+ }
33
62
  // Maps a report filter GROUP to an fs-filter config item, and reads fs-filter
34
63
  // query values back into per-group FilterGroupValues. Shared by the report-bar
35
64
  // fs-filter and the per-component fs-filter so both render through the same
36
65
  // library and write into ReportFilterStateService identically. Items are named
37
66
  // `g<groupId>` so the query keys map straight back to the group.
38
- //
39
- // (Lists keep their own filters in FsList and name items `f<filterId>`; this is
40
- // the group-keyed path for charts/KPIs and the report bar.)
41
- // The query key fs-filter uses for a group's item(s).
42
- const itemName = (group) => `g${group.id}`;
67
+ // The prefix of a group's item name, and of its key in the report URL.
68
+ export const GROUP_PARAM_PREFIX = 'g';
69
+ // The query key fs-filter uses for a group's item(s), and the report URL's key
70
+ // for the group's value (report-url-state.ts). One naming for both.
71
+ export function groupItemName(group) {
72
+ return `${GROUP_PARAM_PREFIX}${group.id}`;
73
+ }
43
74
  // The query key for the report's group-by control. Fixed rather than derived
44
75
  // from an id because a report has exactly one — and it is NOT a filter group,
45
76
  // so it is read straight off the change query instead of through
46
- // groupValuesFromQuery. Client-side only: the grain travels to the server as
47
- // the data request's `state.frequency`.
77
+ // groupValuesFromQuery. It is also the report URL's key for the grain
78
+ // (report-url-state.ts). The grain travels to the server as the data
79
+ // request's `state.frequency`.
48
80
  export const GROUP_BY_ITEM = 'groupBy';
49
81
  // A select group's distinct options, as { name, value } pairs. The server sends
50
82
  // { value, label }: the value is what the filter matches on (an entity's stable
@@ -88,7 +120,7 @@ export function matchOptions(options$, keyword) {
88
120
  // Build the fs-filter config item for a group, seeding its default from the
89
121
  // current session value so authored/relative defaults show selected on open.
90
122
  export function filterItemForGroup(group, reportData, reportId, initial) {
91
- const name = itemName(group);
123
+ const name = groupItemName(group);
92
124
  const label = group.label || group.filters?.[0]?.filterColumn || '';
93
125
  switch (group.type) {
94
126
  case 'dateRange':
@@ -191,7 +223,7 @@ export function groupBySignature(report) {
191
223
  // ReportFilterStateService.setValue.
192
224
  export function groupValuesFromQuery(query, groups) {
193
225
  return groups.map((group) => {
194
- const name = itemName(group);
226
+ const name = groupItemName(group);
195
227
  if (group.type === 'dateRange') {
196
228
  const start = query[`${name}From`];
197
229
  const end = query[`${name}To`];
@@ -222,4 +254,4 @@ function selectQueryValues(raw) {
222
254
  }
223
255
  return String(raw).split(',');
224
256
  }
225
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWZpbHRlci1pdGVtcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9yZXBvcnQtZmlsdGVyLWl0ZW1zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFakUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFNUMsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR2xELE9BQU8sRUFDK0IsbUJBQW1CLEdBQ3hELE1BQU0sK0JBQStCLENBQUM7QUFHdkMsMkVBQTJFO0FBQzNFLDRFQUE0RTtBQUM1RSx5RUFBeUU7QUFDekUsTUFBTSxVQUFVLGVBQWUsQ0FBQyxLQUF1QztJQUNyRSxJQUFJLEtBQUssWUFBWSxJQUFJLEVBQUUsQ0FBQztRQUMxQixPQUFPLE1BQU0sQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELHNFQUFzRTtJQUN0RSw4QkFBOEI7SUFDOUIsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDeEQsQ0FBQztBQUdELDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLGlFQUFpRTtBQUNqRSxFQUFFO0FBQ0YsZ0ZBQWdGO0FBQ2hGLGdGQUFnRjtBQUNoRiw2REFBNkQ7QUFDN0QsTUFBTSxVQUFVLGNBQWMsQ0FBQyxLQUF1QztJQUNwRSxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFckMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTdCLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQ3BGLENBQUM7QUFHRCw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSwrRUFBK0U7QUFDL0UsaUVBQWlFO0FBQ2pFLEVBQUU7QUFDRixnRkFBZ0Y7QUFDaEYsNERBQTREO0FBRTVELHNEQUFzRDtBQUN0RCxNQUFNLFFBQVEsR0FBRyxDQUFDLEtBQXdCLEVBQVUsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDO0FBRXRFLDZFQUE2RTtBQUM3RSw4RUFBOEU7QUFDOUUsaUVBQWlFO0FBQ2pFLDZFQUE2RTtBQUM3RSx3Q0FBd0M7QUFDeEMsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQztBQUV2QyxnRkFBZ0Y7QUFDaEYsZ0ZBQWdGO0FBQ2hGLGdGQUFnRjtBQUNoRixnRkFBZ0Y7QUFDaEYsNkVBQTZFO0FBQzdFLCtFQUErRTtBQUMvRSwyRUFBMkU7QUFDM0UsZ0ZBQWdGO0FBQ2hGLHlEQUF5RDtBQUN6RCxNQUFNLFVBQVUsZ0JBQWdCLENBQzlCLEtBQXdCLEVBQ3hCLFVBQXNCLEVBQ3RCLFFBQWdCO0lBRWhCLE1BQU0sWUFBWSxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMvRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbEIsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEIsQ0FBQztJQUVELE9BQU8sVUFBVSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLEVBQUUsQ0FBQztTQUN2RCxJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsT0FBNkIsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO1NBQ25ELEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQ2xFLFdBQVcsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQ2hELENBQUM7QUFDTixDQUFDO0FBRUQsMkVBQTJFO0FBQzNFLCtFQUErRTtBQUMvRSxpRkFBaUY7QUFDakYsK0VBQStFO0FBQy9FLDJFQUEyRTtBQUMzRSw2QkFBNkI7QUFDN0IsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxRQUF3RCxFQUN4RCxNQUFpQjtJQUVqQixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDekQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUV0RixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ3hELENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFRCwyRUFBMkU7QUFDM0UsZ0ZBQWdGO0FBQ2hGLFlBQVk7QUFDWixNQUFNLFVBQVUsWUFBWSxDQUMxQixRQUF3RCxFQUN4RCxPQUFnQjtJQUVoQixNQUFNLElBQUksR0FBRyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUVsRCxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJO1FBQ3hDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0RSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUNoQixDQUFDO0FBRUQsNEVBQTRFO0FBQzVFLDZFQUE2RTtBQUM3RSxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLEtBQXdCLEVBQ3hCLFVBQXNCLEVBQ3RCLFFBQWdCLEVBQ2hCLE9BQTBCO0lBRTFCLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLElBQUksRUFBRSxDQUFDO0lBRXBFLFFBQVEsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25CLEtBQUssV0FBVztZQUNkLE9BQU87Z0JBQ0wsSUFBSTtnQkFDSixJQUFJLEVBQUUsUUFBUSxDQUFDLFNBQVM7Z0JBQ3hCLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLEtBQUssT0FBTyxFQUFFLEVBQUUsRUFBRSxHQUFHLEtBQUssS0FBSyxFQUFFO2dCQUNuRCxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxJQUFJLE9BQU8sRUFBRSxHQUFHLENBQUM7b0JBQ3ZDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsS0FBSyxJQUFJLFNBQVMsRUFBRSxFQUFFLEVBQUUsT0FBTyxDQUFDLEdBQUcsSUFBSSxTQUFTLEVBQUU7b0JBQ3BFLENBQUMsQ0FBQyxTQUFTO2FBQ2QsQ0FBQztRQUVKLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNkLGdFQUFnRTtZQUNoRSxNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQy9ELE1BQU0sTUFBTSxHQUFHLE9BQU8sRUFBRSxNQUFNLENBQUM7WUFFL0IsT0FBTztnQkFDTCxJQUFJO2dCQUNKLElBQUksRUFBRSxRQUFRLENBQUMsaUJBQWlCO2dCQUNoQyxLQUFLO2dCQUNMLFlBQVksRUFBRSxJQUFJO2dCQUNsQixNQUFNLEVBQUUsQ0FBQyxPQUFnQixFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQztnQkFDN0Qsd0VBQXdFO2dCQUN4RSw0REFBNEQ7Z0JBQzVELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTTtvQkFDckIsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUM7b0JBQzdDLENBQUMsQ0FBQyxTQUFTO2FBQ2QsQ0FBQztRQUNKLENBQUM7UUFFRCxLQUFLLFNBQVMsQ0FBQztRQUNmO1lBQ0UsT0FBTztnQkFDTCxJQUFJO2dCQUNKLElBQUksRUFBRSxRQUFRLENBQUMsT0FBTztnQkFDdEIsS0FBSztnQkFDTCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUs7YUFDeEIsQ0FBQztJQUNOLENBQUM7QUFDSCxDQUFDO0FBRUQsNEVBQTRFO0FBQzVFLDJFQUEyRTtBQUMzRSxvREFBb0Q7QUFDcEQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLE1BQXFCO0lBQ3RELE9BQU8sQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQ3JGLFNBQVMsQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQzdFLENBQUM7QUFFRCwrRUFBK0U7QUFDL0UsK0VBQStFO0FBQy9FLDhFQUE4RTtBQUM5RSxTQUFTLGNBQWMsQ0FBQyxNQUFjO0lBQ3BDLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLGFBQWEsSUFBSSxFQUFFLENBQUM7SUFFbEUsT0FBTyxhQUFhLENBQUMsTUFBTTtRQUN6QixDQUFDLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5RSxDQUFDLENBQUMsbUJBQW1CLENBQUM7QUFDMUIsQ0FBQztBQUVELCtFQUErRTtBQUMvRSxnRkFBZ0Y7QUFDaEYsa0ZBQWtGO0FBQ2xGLE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxNQUFjLEVBQUUsV0FBb0M7SUFDdkYsT0FBTyxDQUFDLFdBQVcsSUFBSSxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLFdBQVcsQ0FBQyxDQUFDO0FBQy9GLENBQUM7QUFFRCxnRkFBZ0Y7QUFDaEYsMkJBQTJCO0FBQzNCLEVBQUU7QUFDRiwyRUFBMkU7QUFDM0UsMEVBQTBFO0FBQzFFLDJFQUEyRTtBQUMzRSx3Q0FBd0M7QUFDeEMsZ0ZBQWdGO0FBQ2hGLDhEQUE4RDtBQUM5RCxNQUFNLFVBQVUsaUJBQWlCLENBQy9CLE1BQWMsRUFDZCxPQUFpQztJQUVqQyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQztJQUV2QywyRUFBMkU7SUFDM0UsNkVBQTZFO0lBQzdFLHdFQUF3RTtJQUN4RSxJQUFJLE9BQU8sRUFBRSxPQUFPLEtBQUssS0FBSyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUM5RCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFdEMsT0FBTztRQUNMLElBQUksRUFBRSxhQUFhO1FBQ25CLElBQUksRUFBRSxRQUFRLENBQUMsTUFBTTtRQUNyQixLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssSUFBSSxVQUFVO1FBQ25DLFFBQVEsRUFBRSxLQUFLO1FBQ2YsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU07UUFDcEIsT0FBTyxFQUFFLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO0tBQzVGLENBQUM7QUFDSixDQUFDO0FBRUQsZ0ZBQWdGO0FBQ2hGLDhFQUE4RTtBQUM5RSw2RUFBNkU7QUFDN0UsNERBQTREO0FBQzVELE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxNQUFxQjtJQUNwRCxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUMxQyxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQztJQUV2QyxPQUFPLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLElBQUksRUFBRSxFQUFFLENBQUMsT0FBTyxFQUFFLGFBQWEsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDL0YsQ0FBQztBQUVELDhFQUE4RTtBQUM5RSwyRUFBMkU7QUFDM0UscUNBQXFDO0FBQ3JDLE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsS0FBMEIsRUFDMUIsTUFBMkI7SUFFM0IsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDMUIsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTdCLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUMvQixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxDQUFDO1lBQ25DLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7WUFFL0IsT0FBTztnQkFDTCxPQUFPLEVBQUUsS0FBSyxDQUFDLEVBQUU7Z0JBQ2pCLEtBQUssRUFBRSxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxJQUFJLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJO2FBQzFFLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzVCLE1BQU0sTUFBTSxHQUFHLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBRTlDLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDekUsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFakQsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMzRSxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxnRkFBZ0Y7QUFDaEYsdUZBQXVGO0FBQ3ZGLGlGQUFpRjtBQUNqRixnRkFBZ0Y7QUFDaEYsZ0ZBQWdGO0FBQ2hGLFNBQVMsaUJBQWlCLENBQUMsR0FBWTtJQUNyQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN2QixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRCxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDcEQsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJRmlsdGVyQ29uZmlnSXRlbSwgSXRlbVR5cGUgfSBmcm9tICdAZmlyZXN0aXRjaC9maWx0ZXInO1xuXG5pbXBvcnQgeyBmb3JtYXQsIHBhcnNlSVNPIH0gZnJvbSAnZGF0ZS1mbnMnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBzaGFyZVJlcGxheSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgUmVwb3J0RGF0YSB9IGZyb20gJy4vZGF0YS9yZXBvcnQuZGF0YSc7XG5pbXBvcnQge1xuICBDaGFydEdyYW51bGFyaXR5LCBGaWx0ZXJHcm91cFZhbHVlLCBHUkFOVUxBUklUWV9PUFRJT05TLCBSZXBvcnQsIFJlcG9ydEZpbHRlckdyb3VwLCBSZXBvcnRGaWx0ZXJPcHRpb24sXG59IGZyb20gJy4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcblxuXG4vLyBBIGRhdGUtcmFuZ2UgYm91bmRhcnkgYXMgdGhlIHBpY2tlZCBMT0NBTCBjYWxlbmRhciBkYXkgKG5vIHRpbWUsIG5vIHR6KS5cbi8vIERhdGUtcmFuZ2UgZmlsdGVycyBhcmUgY2FsZW5kYXItZGF5IHNlbWFudGljcywgc28gdGhlIGJvdW5kYXJ5IG11c3QgY2Fycnlcbi8vIG9ubHkgWS1NLUQg4oCUIG5ldmVyIGEgdGltZXpvbmUtYmVhcmluZyBpbnN0YW50IHRoZSBiYWNrZW5kIHdvdWxkIHNoaWZ0LlxuZXhwb3J0IGZ1bmN0aW9uIGRhdGVCb3VuZFN0cmluZyh2YWx1ZTogRGF0ZSB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuIGZvcm1hdCh2YWx1ZSwgJ3l5eXktTU0tZGQnKTtcbiAgfVxuXG4gIC8vIEF1dGhvcmVkL3JlbGF0aXZlIGRlZmF1bHRzIGFycml2ZSBhcyBzdHJpbmdzIGFscmVhZHkgaW4gWS1NLUQgZm9ybTtcbiAgLy8ga2VlcCBqdXN0IHRoZSBkYXRlIHBvcnRpb24uXG4gIHJldHVybiB2YWx1ZSA/IFN0cmluZyh2YWx1ZSkuc2xpY2UoMCwgMTApIDogdW5kZWZpbmVkO1xufVxuXG5cbi8vIEEgZGF0ZS1yYW5nZSBib3VuZGFyeSBhcyBpdCBzaG91bGQgUkVBRCBvbiBhIGNvdmVyIHBhZ2Ug4oCUIHRoZSBzYW1lIGNhbGVuZGFyXG4vLyBkYXkgZGF0ZUJvdW5kU3RyaW5nKCkgaGFuZHMgdGhlIHNlcnZlciwgc28gYSBwcmludGVkIHBlcmlvZCBjYW4gbmV2ZXIgbmFtZSBhXG4vLyBkaWZmZXJlbnQgZGF5IHRoYW4gdGhlIG51bWJlcnMgdW5kZXIgaXQgd2VyZSBmaWx0ZXJlZCBieS4gUmV0dXJucyBudWxsIHdoZW5cbi8vIHRoZXJlIGlzIG5vIGJvdW5kYXJ5OyB0aGUgY2FsbGVyIHN1cHBsaWVzIGl0cyBvd24gcGxhY2Vob2xkZXIuXG4vL1xuLy8gVGhlIHBhcnNlIGhhcyB0byBiZSBwYXJzZUlTTywgbm90IGBuZXcgRGF0ZWA6IGBuZXcgRGF0ZSgnMjAyNi0wNS0wMScpYCBpcyBVVENcbi8vIG1pZG5pZ2h0LCBzbyBmb3JtYXR0aW5nIGl0IGFueXdoZXJlIHdlc3Qgb2YgVVRDIHByaW50cyBBcHIgMzAuIHBhcnNlSVNPIHJlYWRzXG4vLyBhIGJhcmUgWS1NLUQgYXMgTE9DQUwgbWlkbmlnaHQsIHdoaWNoIG5vIG9mZnNldCBjYW4gc2hpZnQuXG5leHBvcnQgZnVuY3Rpb24gZGF0ZUJvdW5kTGFiZWwodmFsdWU6IERhdGUgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGJvdW5kID0gZGF0ZUJvdW5kU3RyaW5nKHZhbHVlKTtcblxuICBpZiAoIWJvdW5kKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBkYXRlID0gcGFyc2VJU08oYm91bmQpO1xuXG4gIHJldHVybiBOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpID8gU3RyaW5nKHZhbHVlKSA6IGZvcm1hdChkYXRlLCAnTU1NIGQsIHl5eXknKTtcbn1cblxuXG4vLyBNYXBzIGEgcmVwb3J0IGZpbHRlciBHUk9VUCB0byBhbiBmcy1maWx0ZXIgY29uZmlnIGl0ZW0sIGFuZCByZWFkcyBmcy1maWx0ZXJcbi8vIHF1ZXJ5IHZhbHVlcyBiYWNrIGludG8gcGVyLWdyb3VwIEZpbHRlckdyb3VwVmFsdWVzLiBTaGFyZWQgYnkgdGhlIHJlcG9ydC1iYXJcbi8vIGZzLWZpbHRlciBhbmQgdGhlIHBlci1jb21wb25lbnQgZnMtZmlsdGVyIHNvIGJvdGggcmVuZGVyIHRocm91Z2ggdGhlIHNhbWVcbi8vIGxpYnJhcnkgYW5kIHdyaXRlIGludG8gUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIGlkZW50aWNhbGx5LiBJdGVtcyBhcmUgbmFtZWRcbi8vIGBnPGdyb3VwSWQ+YCBzbyB0aGUgcXVlcnkga2V5cyBtYXAgc3RyYWlnaHQgYmFjayB0byB0aGUgZ3JvdXAuXG4vL1xuLy8gKExpc3RzIGtlZXAgdGhlaXIgb3duIGZpbHRlcnMgaW4gRnNMaXN0IGFuZCBuYW1lIGl0ZW1zIGBmPGZpbHRlcklkPmA7IHRoaXMgaXNcbi8vIHRoZSBncm91cC1rZXllZCBwYXRoIGZvciBjaGFydHMvS1BJcyBhbmQgdGhlIHJlcG9ydCBiYXIuKVxuXG4vLyBUaGUgcXVlcnkga2V5IGZzLWZpbHRlciB1c2VzIGZvciBhIGdyb3VwJ3MgaXRlbShzKS5cbmNvbnN0IGl0ZW1OYW1lID0gKGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCk6IHN0cmluZyA9PiBgZyR7Z3JvdXAuaWR9YDtcblxuLy8gVGhlIHF1ZXJ5IGtleSBmb3IgdGhlIHJlcG9ydCdzIGdyb3VwLWJ5IGNvbnRyb2wuIEZpeGVkIHJhdGhlciB0aGFuIGRlcml2ZWRcbi8vIGZyb20gYW4gaWQgYmVjYXVzZSBhIHJlcG9ydCBoYXMgZXhhY3RseSBvbmUg4oCUIGFuZCBpdCBpcyBOT1QgYSBmaWx0ZXIgZ3JvdXAsXG4vLyBzbyBpdCBpcyByZWFkIHN0cmFpZ2h0IG9mZiB0aGUgY2hhbmdlIHF1ZXJ5IGluc3RlYWQgb2YgdGhyb3VnaFxuLy8gZ3JvdXBWYWx1ZXNGcm9tUXVlcnkuIENsaWVudC1zaWRlIG9ubHk6IHRoZSBncmFpbiB0cmF2ZWxzIHRvIHRoZSBzZXJ2ZXIgYXNcbi8vIHRoZSBkYXRhIHJlcXVlc3QncyBgc3RhdGUuZnJlcXVlbmN5YC5cbmV4cG9ydCBjb25zdCBHUk9VUF9CWV9JVEVNID0gJ2dyb3VwQnknO1xuXG4vLyBBIHNlbGVjdCBncm91cCdzIGRpc3RpbmN0IG9wdGlvbnMsIGFzIHsgbmFtZSwgdmFsdWUgfSBwYWlycy4gVGhlIHNlcnZlciBzZW5kc1xuLy8geyB2YWx1ZSwgbGFiZWwgfTogdGhlIHZhbHVlIGlzIHdoYXQgdGhlIGZpbHRlciBtYXRjaGVzIG9uIChhbiBlbnRpdHkncyBzdGFibGVcbi8vIGlkKSBhbmQgdGhlIGxhYmVsIGlzIHdoYXQgdGhlIHZpZXdlciByZWFkcyDigJQgc28gYSByZW5hbWVkIGVudGl0eSBrZWVwcyBpdHMgaWRcbi8vIGFuZCBzaW1wbHkgc2hvd3MgaXRzIG5ldyBuYW1lIGhlcmUuIE9wdGlvbnMgY29tZSBmcm9tIHRoZSBmaXJzdCBtZW1iZXIgZmlsdGVyXG4vLyB0aGF0IGRlY2xhcmVzIHRoZW0g4oCUIG1lbWJlcnMgYXJlIHRoZSBzYW1lIGRhdGEgcG9pbnQsIHNvIGFueSBtZW1iZXIncyBsaXN0XG4vLyBzZXJ2ZXMgdGhlIGdyb3VwLiBUaGUgbGlzdCBpcyBmZXRjaGVkIG9uY2UgKHRoZSBzZXJ2ZXIgY2FwcyBpdCkgYW5kIHJlcGxheWVkXG4vLyAoc2hhcmVSZXBsYXkpLCBzbyByZXBlYXRlZCByZWFkcyBuZXZlciByZWZldGNoLiBTaGFyZWQgYnkgdGhlIHJlcG9ydC1iYXJcbi8vIHNlbGVjdCBjb250cm9sIGFuZCB0aGUgcmVwb3J0LXNldHRpbmdzIGRlZmF1bHQgcGlja2VyIHNvIHRoZSB0d28gbmV2ZXIgZHJpZnQuXG4vLyBSZXR1cm5zIGFuIGVtcHR5IGxpc3Qgd2hlbiBubyBtZW1iZXIgcHJvdmlkZXMgb3B0aW9ucy5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkR3JvdXBPcHRpb25zKFxuICBncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsXG4gIHJlcG9ydERhdGE6IFJlcG9ydERhdGEsXG4gIHJlcG9ydElkOiBudW1iZXIsXG4pOiBPYnNlcnZhYmxlPHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9W10+IHtcbiAgY29uc3Qgb3B0aW9uRmlsdGVyID0gKGdyb3VwLmZpbHRlcnMgPz8gW10pLmZpbmQoKG1lbWJlcikgPT4gbWVtYmVyLmhhc09wdGlvbnMpO1xuICBpZiAoIW9wdGlvbkZpbHRlcikge1xuICAgIHJldHVybiBvZihbXSk7XG4gIH1cblxuICByZXR1cm4gcmVwb3J0RGF0YS5maWx0ZXJPcHRpb25zKHJlcG9ydElkLCBvcHRpb25GaWx0ZXIuaWQpXG4gICAgLnBpcGUoXG4gICAgICBtYXAoKG9wdGlvbnM6IFJlcG9ydEZpbHRlck9wdGlvbltdKSA9PiAob3B0aW9ucyA/PyBbXSlcbiAgICAgICAgLm1hcCgob3B0aW9uKSA9PiAoeyBuYW1lOiBvcHRpb24ubGFiZWwsIHZhbHVlOiBvcHRpb24udmFsdWUgfSkpKSxcbiAgICAgIHNoYXJlUmVwbGF5KHsgYnVmZmVyU2l6ZTogMSwgcmVmQ291bnQ6IGZhbHNlIH0pLFxuICAgICk7XG59XG5cbi8vIFN0b3JlZCBmaWx0ZXIgdmFsdWVzIChpZHMpIHBhaXJlZCBiYWNrIHdpdGggdGhlIGxhYmVscyB0byBzaG93IGZvciB0aGVtLlxuLy8gQSBzYXZlZCBkZWZhdWx0IGhvbGRzIG9ubHkgdmFsdWVzLCBzbyB0aGUgbmFtZXMgaGF2ZSB0byBiZSByZWFkIGJhY2sgb2ZmIHRoZVxuLy8gb3B0aW9uIGxpc3Qg4oCUIHRoYXQgaW5kaXJlY3Rpb24gaXMgZXhhY3RseSB3aGF0IHN1cnZpdmVzIGEgcmVuYW1lLiBBIHZhbHVlIHdpdGhcbi8vIG5vIG1hdGNoaW5nIG9wdGlvbiAoaXRzIGVudGl0eSB3YXMgZGVsZXRlZCwgc28gaXQgaXMgbm8gbG9uZ2VyIGxpc3RlZCkgZmFsbHNcbi8vIGJhY2sgdG8gc2hvd2luZyB0aGUgcmF3IHZhbHVlIHJhdGhlciB0aGFuIGRyb3BwaW5nIHRoZSBjaGlwLCB3aGljaCB3b3VsZFxuLy8gc2lsZW50bHkgd2lkZW4gdGhlIGZpbHRlci5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlT3B0aW9uVmFsdWVzKFxuICBvcHRpb25zJDogT2JzZXJ2YWJsZTx7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfVtdPixcbiAgdmFsdWVzOiB1bmtub3duW10sXG4pOiBPYnNlcnZhYmxlPHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9W10+IHtcbiAgcmV0dXJuIG9wdGlvbnMkLnBpcGUobWFwKChvcHRpb25zKSA9PiB2YWx1ZXMubWFwKCh2YWx1ZSkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbiA9IG9wdGlvbnMuZmluZCgoY2FuZGlkYXRlKSA9PiBTdHJpbmcoY2FuZGlkYXRlLnZhbHVlKSA9PT0gU3RyaW5nKHZhbHVlKSk7XG5cbiAgICByZXR1cm4geyBuYW1lOiBvcHRpb24/Lm5hbWUgPz8gU3RyaW5nKHZhbHVlKSwgdmFsdWUgfTtcbiAgfSkpKTtcbn1cblxuLy8gQ2FzZS1pbnNlbnNpdGl2ZSBuYW1lIGZpbHRlciBhcHBsaWVkIHRvIGEgbG9hZGVkIG9wdGlvbiBsaXN0IOKAlCB0aGUgdHlwZWRcbi8vIGtleXdvcmQgaGFzIHRvIGJlIG1hdGNoZWQgaGVyZSBiZWNhdXNlIGZzLWF1dG9jb21wbGV0ZSByZW5kZXJzIHdoYXQgd2UgcmV0dXJuXG4vLyB2ZXJiYXRpbS5cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaE9wdGlvbnMoXG4gIG9wdGlvbnMkOiBPYnNlcnZhYmxlPHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9W10+LFxuICBrZXl3b3JkPzogc3RyaW5nLFxuKTogT2JzZXJ2YWJsZTx7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfVtdPiB7XG4gIGNvbnN0IHRlcm0gPSAoa2V5d29yZCA/PyAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG5cbiAgcmV0dXJuIG9wdGlvbnMkLnBpcGUobWFwKChvcHRpb25zKSA9PiB0ZXJtXG4gICAgPyBvcHRpb25zLmZpbHRlcigob3B0aW9uKSA9PiBvcHRpb24ubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRlcm0pKVxuICAgIDogb3B0aW9ucykpO1xufVxuXG4vLyBCdWlsZCB0aGUgZnMtZmlsdGVyIGNvbmZpZyBpdGVtIGZvciBhIGdyb3VwLCBzZWVkaW5nIGl0cyBkZWZhdWx0IGZyb20gdGhlXG4vLyBjdXJyZW50IHNlc3Npb24gdmFsdWUgc28gYXV0aG9yZWQvcmVsYXRpdmUgZGVmYXVsdHMgc2hvdyBzZWxlY3RlZCBvbiBvcGVuLlxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlckl0ZW1Gb3JHcm91cChcbiAgZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwLFxuICByZXBvcnREYXRhOiBSZXBvcnREYXRhLFxuICByZXBvcnRJZDogbnVtYmVyLFxuICBpbml0aWFsPzogRmlsdGVyR3JvdXBWYWx1ZSxcbik6IElGaWx0ZXJDb25maWdJdGVtIHtcbiAgY29uc3QgbmFtZSA9IGl0ZW1OYW1lKGdyb3VwKTtcbiAgY29uc3QgbGFiZWwgPSBncm91cC5sYWJlbCB8fCBncm91cC5maWx0ZXJzPy5bMF0/LmZpbHRlckNvbHVtbiB8fCAnJztcblxuICBzd2l0Y2ggKGdyb3VwLnR5cGUpIHtcbiAgICBjYXNlICdkYXRlUmFuZ2UnOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgdHlwZTogSXRlbVR5cGUuRGF0ZVJhbmdlLFxuICAgICAgICBsYWJlbDogeyBmcm9tOiBgJHtsYWJlbH0gRnJvbWAsIHRvOiBgJHtsYWJlbH0gVG9gIH0sXG4gICAgICAgIGRlZmF1bHQ6IChpbml0aWFsPy5zdGFydCB8fCBpbml0aWFsPy5lbmQpXG4gICAgICAgICAgPyB7IGZyb206IGluaXRpYWwuc3RhcnQgPz8gdW5kZWZpbmVkLCB0bzogaW5pdGlhbC5lbmQgPz8gdW5kZWZpbmVkIH1cbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIH07XG5cbiAgICBjYXNlICdzZWxlY3QnOiB7XG4gICAgICAvLyBPbmUgc2hhcmVkLCByZXBsYXllZCBvcHRpb24gc3RyZWFtIHNvIHR5cGluZyBuZXZlciByZWZldGNoZXMuXG4gICAgICBjb25zdCBvcHRpb25zJCA9IGxvYWRHcm91cE9wdGlvbnMoZ3JvdXAsIHJlcG9ydERhdGEsIHJlcG9ydElkKTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IGluaXRpYWw/LnZhbHVlcztcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgdHlwZTogSXRlbVR5cGUuQXV0b0NvbXBsZXRlQ2hpcHMsXG4gICAgICAgIGxhYmVsLFxuICAgICAgICBmZXRjaE9uRm9jdXM6IHRydWUsXG4gICAgICAgIHZhbHVlczogKGtleXdvcmQ/OiBzdHJpbmcpID0+IG1hdGNoT3B0aW9ucyhvcHRpb25zJCwga2V5d29yZCksXG4gICAgICAgIC8vIFN0b3JlZCB2YWx1ZXMgYXJlIGlkcywgc28gdGhlIGNoaXBzIGNhbiBvbmx5IGJlIG5hbWVkIG9uY2UgdGhlIG9wdGlvblxuICAgICAgICAvLyBsaXN0IGhhcyBsb2FkZWQg4oCUIGhlbmNlIHRoZSBvYnNlcnZhYmxlIGZvcm0gb2YgYGRlZmF1bHRgLlxuICAgICAgICBkZWZhdWx0OiB2YWx1ZXM/Lmxlbmd0aFxuICAgICAgICAgID8gKCkgPT4gcmVzb2x2ZU9wdGlvblZhbHVlcyhvcHRpb25zJCwgdmFsdWVzKVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjYXNlICdrZXl3b3JkJzpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgdHlwZTogSXRlbVR5cGUuS2V5d29yZCxcbiAgICAgICAgbGFiZWwsXG4gICAgICAgIGRlZmF1bHQ6IGluaXRpYWw/LnZhbHVlLFxuICAgICAgfTtcbiAgfVxufVxuXG4vLyBXaGV0aGVyIHRoZSByZXBvcnQgaGFzIGEgY2hhcnQgdGhlIGdyb3VwLWJ5IGNvbnRyb2wgY2FuIHJlLWJ1Y2tldC4gQSB0aW1lXG4vLyB4LWF4aXMgaXMgdGhlIHdob2xlIHF1YWxpZmljYXRpb246IHRoZSBjb250cm9sIGNoYW5nZXMgdGhlIGdyYWluIG9mIHRoYXRcbi8vIGF4aXMsIGFuZCBhIGNhdGVnb3J5IGF4aXMgaGFzIG5vIGdyYWluIHRvIGNoYW5nZS5cbmV4cG9ydCBmdW5jdGlvbiBoYXNUaW1lU2VyaWVzQ2hhcnQocmVwb3J0OiBSZXBvcnQgfCBudWxsKTogYm9vbGVhbiB7XG4gIHJldHVybiAocmVwb3J0Py5wYWdlcyA/PyBbXSkuc29tZSgocGFnZSkgPT4gKHBhZ2UuY29tcG9uZW50cyA/PyBbXSkuc29tZSgoY29tcG9uZW50KSA9PlxuICAgIGNvbXBvbmVudC50eXBlID09PSAnY2hhcnQnICYmIGNvbXBvbmVudC5jb25maWc/LnhBeGlzPy5raW5kID09PSAndGltZScpKTtcbn1cblxuLy8gVGhlIGdyYWlucyB0aGUgcmVwb3J0J3MgZ3JvdXAtYnkgY29udHJvbCBvZmZlcnMsIG5hbWVkIGZvciB0aGUgdmlld2VyLiBXSElDSFxuLy8gb2YgdGhlbSBjb21lcyBmcm9tIHRoZSByZXBvcnQ7IGhvdyB0aGV5IHJlYWQgY29tZXMgZnJvbSBHUkFOVUxBUklUWV9PUFRJT05TLlxuLy8gQW4gZW1wdHkgc3RvcmVkIGxpc3QgbWVhbnMgZXZlcnkgZ3JhaW4g4oCUIHRoZSBzYW1lIHJ1bGUgdGhlIGJhY2tlbmQgYXBwbGllcy5cbmZ1bmN0aW9uIGdyb3VwQnlPcHRpb25zKHJlcG9ydDogUmVwb3J0KTogeyB2YWx1ZTogQ2hhcnRHcmFudWxhcml0eTsgbmFtZTogc3RyaW5nIH1bXSB7XG4gIGNvbnN0IGdyYW51bGFyaXRpZXMgPSByZXBvcnQuY29uZmlnPy5ncm91cEJ5Py5ncmFudWxhcml0aWVzID8/IFtdO1xuXG4gIHJldHVybiBncmFudWxhcml0aWVzLmxlbmd0aFxuICAgID8gR1JBTlVMQVJJVFlfT1BUSU9OUy5maWx0ZXIoKG9wdGlvbikgPT4gZ3JhbnVsYXJpdGllcy5pbmNsdWRlcyhvcHRpb24udmFsdWUpKVxuICAgIDogR1JBTlVMQVJJVFlfT1BUSU9OUztcbn1cblxuLy8gV2hldGhlciBhIGdyYWluIGlzIG9uZSB0aGUgcmVwb3J0J3MgY29udHJvbCBzdGlsbCBvZmZlcnMuIEEgZ3JhaW4gaXQgZG9lc24ndFxuLy8gY2Fubm90IHN0YXkgaW4gZWZmZWN0OiB0aGUgYWdlbnQgY2FuIG5hcnJvdyB0aGUgbGlzdCBhdCBhbnkgdGltZSwgYW5kIGEgY2hhcnRcbi8vIGxlZnQgYnVja2V0aW5nIGF0IGEgZHJvcHBlZCBncmFpbiBpcyBvbmUgdGhlIHZpZXdlciBjYW4gbmVpdGhlciBzZWUgbm9yIGNoYW5nZS5cbmV4cG9ydCBmdW5jdGlvbiBpc0dyYW51bGFyaXR5T2ZmZXJlZChyZXBvcnQ6IFJlcG9ydCwgZ3JhbnVsYXJpdHk6IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsKTogYm9vbGVhbiB7XG4gIHJldHVybiAhZ3JhbnVsYXJpdHkgfHwgZ3JvdXBCeU9wdGlvbnMocmVwb3J0KS5zb21lKChvcHRpb24pID0+IG9wdGlvbi52YWx1ZSA9PT0gZ3JhbnVsYXJpdHkpO1xufVxuXG4vLyBUaGUgZnMtZmlsdGVyIGNvbmZpZyBpdGVtIGZvciB0aGUgcmVwb3J0J3MgZ3JvdXAtYnkgY29udHJvbCwgb3IgbnVsbCB3aGVuIHRoZVxuLy8gcmVwb3J0IGhhcyBub25lIHRvIHNob3cuXG4vL1xuLy8gSXQgbGVhZHMgdGhlIHNhbWUgYmFyIHRoZSBmaWx0ZXJzIHJlbmRlciBpbiwgYnV0IGl0IGlzIE5PVCBvbmU6IGEgZmlsdGVyXG4vLyBuYXJyb3dzIFdISUNIIHJvd3MgYXJlIGNvdW50ZWQsIHRoaXMgY2hhbmdlcyBob3cgdGhlIHN1cnZpdmluZyByb3dzIGFyZVxuLy8gQlVDS0VURUQg4oCUIGFuZCBpdCBjb21lcyBmaXJzdCBiZWNhdXNlIHRoZSBncmFpbiBpcyB3aGF0IGEgdmlld2VyIHNldHRsZXNcbi8vIGJlZm9yZSBkZWNpZGluZyB3aGljaCByb3dzIHRoZXkgd2FudC5cbi8vIFBpY2tpbmcgYSBncmFpbiBzZXRzIGEgc2Vzc2lvbi13aWRlIG92ZXJyaWRlIHRoYXQgcmlkZXMgYWxvbmcgaW4gZWFjaCBjaGFydCdzXG4vLyBkYXRhIHJlcXVlc3QsIHNvIHRoZSBjaGFydHMgdGhlbXNlbHZlcyBhcmUgbmV2ZXIgcmV3cml0dGVuLlxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwQnlGaWx0ZXJJdGVtKFxuICByZXBvcnQ6IFJlcG9ydCxcbiAgaW5pdGlhbD86IENoYXJ0R3JhbnVsYXJpdHkgfCBudWxsLFxuKTogSUZpbHRlckNvbmZpZ0l0ZW0gfCBudWxsIHtcbiAgY29uc3QgZ3JvdXBCeSA9IHJlcG9ydC5jb25maWc/Lmdyb3VwQnk7XG5cbiAgLy8gT25seSBhbiBFWFBMSUNJVCBmYWxzZSBoaWRlcyB0aGUgY29udHJvbC4gQW4gYWJzZW50IGJsb2NrIG1lYW5zIGEgcmVwb3J0XG4gIC8vIHNlcnZlZCBieSBhIGJ1aWxkIHRoYXQgcHJlZGF0ZXMgdGhlIGNvbnRyb2wgYmVpbmcgc3RvcmVkLCBhbmQgZXZlcnkgb25lIG9mXG4gIC8vIHRob3NlIGhhZCBvbmUg4oCUIHRoZSBiYWNrZW5kIHJlc29sdmVzIGl0IHRoZSBzYW1lIHdheSAoUmVwb3J0R3JvdXBCeSkuXG4gIGlmIChncm91cEJ5Py5lbmFibGVkID09PSBmYWxzZSB8fCAhaGFzVGltZVNlcmllc0NoYXJ0KHJlcG9ydCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlcyA9IGdyb3VwQnlPcHRpb25zKHJlcG9ydCk7XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBHUk9VUF9CWV9JVEVNLFxuICAgIHR5cGU6IEl0ZW1UeXBlLlNlbGVjdCxcbiAgICBsYWJlbDogZ3JvdXBCeT8ubGFiZWwgfHwgJ0dyb3VwIEJ5JyxcbiAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgdmFsdWVzOiAoKSA9PiB2YWx1ZXMsXG4gICAgZGVmYXVsdDogaXNHcmFudWxhcml0eU9mZmVyZWQocmVwb3J0LCBpbml0aWFsID8/IG51bGwpID8gKGluaXRpYWwgPz8gdW5kZWZpbmVkKSA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuLy8gVGhlIGdyb3VwLWJ5IGNvbnRyb2wncyBjb250cmlidXRpb24gdG8gdGhlIHRvb2xiYXIncyBmcy1maWx0ZXIga2V5LiBmcy1maWx0ZXJcbi8vIHJlYWRzIGl0cyBjb25maWcgb25jZSBhdCBpbml0LCBhbmQgdGhlIGFnZW50IGNhbiBjaGFuZ2UgdGhlIGNvbnRyb2wncyBsYWJlbFxuLy8gb3IgdGhlIGdyYWlucyBpdCBvZmZlcnMg4oCUIHdpdGhvdXQgdGhvc2UgaW4gdGhlIGtleSB0aGUgYmFyIGtlZXBzIHJlbmRlcmluZ1xuLy8gdGhlIGNvbnRyb2wgaXQgd2FzIGNyZWF0ZWQgd2l0aCB1bnRpbCBhIGZ1bGwgcGFnZSByZWxvYWQuXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBCeVNpZ25hdHVyZShyZXBvcnQ6IFJlcG9ydCB8IG51bGwpOiBzdHJpbmcge1xuICBpZiAoIXJlcG9ydCB8fCAhZ3JvdXBCeUZpbHRlckl0ZW0ocmVwb3J0KSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IGdyb3VwQnkgPSByZXBvcnQuY29uZmlnPy5ncm91cEJ5O1xuXG4gIHJldHVybiBbJ2dyb3VwQnknLCBncm91cEJ5Py5sYWJlbCA/PyAnJywgKGdyb3VwQnk/LmdyYW51bGFyaXRpZXMgPz8gW10pLmpvaW4oJywnKV0uam9pbignOicpO1xufVxuXG4vLyBSZWFkIGFuIGZzLWZpbHRlciBjaGFuZ2UgcXVlcnkgaW50byBwZXItZ3JvdXAgdmFsdWVzLiBSZXR1cm5zIG9uZSBlbnRyeSBwZXJcbi8vIGdyb3VwIHdpdGggdGhlIHZhbHVlIHRvIHN0b3JlIChvciBudWxsIHRvIGNsZWFyKSDigJQgY2FsbGVycyBmZWVkIHRoZXNlIHRvXG4vLyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2Uuc2V0VmFsdWUuXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBWYWx1ZXNGcm9tUXVlcnkoXG4gIHF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBncm91cHM6IFJlcG9ydEZpbHRlckdyb3VwW10sXG4pOiB7IGdyb3VwSWQ6IG51bWJlcjsgdmFsdWU6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIH1bXSB7XG4gIHJldHVybiBncm91cHMubWFwKChncm91cCkgPT4ge1xuICAgIGNvbnN0IG5hbWUgPSBpdGVtTmFtZShncm91cCk7XG5cbiAgICBpZiAoZ3JvdXAudHlwZSA9PT0gJ2RhdGVSYW5nZScpIHtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gcXVlcnlbYCR7bmFtZX1Gcm9tYF07XG4gICAgICBjb25zdCBlbmQgPSBxdWVyeVtgJHtuYW1lfVRvYF07XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGdyb3VwSWQ6IGdyb3VwLmlkLFxuICAgICAgICB2YWx1ZTogKHN0YXJ0IHx8IGVuZCkgPyB7IHN0YXJ0OiBzdGFydCB8fCBudWxsLCBlbmQ6IGVuZCB8fCBudWxsIH0gOiBudWxsLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoZ3JvdXAudHlwZSA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHNlbGVjdFF1ZXJ5VmFsdWVzKHF1ZXJ5W25hbWVdKTtcblxuICAgICAgcmV0dXJuIHsgZ3JvdXBJZDogZ3JvdXAuaWQsIHZhbHVlOiB2YWx1ZXMubGVuZ3RoID8geyB2YWx1ZXMgfSA6IG51bGwgfTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXl3b3JkID0gU3RyaW5nKHF1ZXJ5W25hbWVdID8/ICcnKS50cmltKCk7XG5cbiAgICByZXR1cm4geyBncm91cElkOiBncm91cC5pZCwgdmFsdWU6IGtleXdvcmQgPyB7IHZhbHVlOiBrZXl3b3JkIH0gOiBudWxsIH07XG4gIH0pO1xufVxuXG4vLyBmcy1maWx0ZXIncyBBdXRvQ29tcGxldGVDaGlwcyBzZXJpYWxpc2VzIGEgbXVsdGktc2VsZWN0IGludG8gT05FIHF1ZXJ5IHZhbHVlOlxuLy8gdGhlIHNlbGVjdGVkIHZhbHVlcyBqb2luZWQgYnkgXCIsXCIgKGl0cyBgcXVlcnlgIGdldHRlciBkb2VzIGAubWFwKHZhbHVlKS5qb2luKCcsJylgKS5cbi8vIFNvIGEgMisgc2VsZWN0aW9uIGFycml2ZXMgYXMgdGhlIHN0cmluZyBcImEsYlwiLCBub3QgYW4gYXJyYXkg4oCUIHNwbGl0dGluZyBvbiBcIixcIlxuLy8gcmV2ZXJzZXMgdGhhdCBmYWl0aGZ1bGx5LiBXaXRob3V0IHRoaXMsIGEgbXVsdGktc2VsZWN0IHdhcyBzZW50IGFzIHRoZSBzaW5nbGVcbi8vIHZhbHVlIFtcImEsYlwiXSwgcHJvZHVjaW5nIGBjb2wgSU4gKCdhLGInKWAgc2VydmVyLXNpZGUsIHdoaWNoIG1hdGNoZXMgbm90aGluZy5cbmZ1bmN0aW9uIHNlbGVjdFF1ZXJ5VmFsdWVzKHJhdzogdW5rbm93bik6IHVua25vd25bXSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHJhdykpIHtcbiAgICByZXR1cm4gcmF3O1xuICB9XG5cbiAgaWYgKHJhdyA9PT0gbnVsbCB8fCByYXcgPT09IHVuZGVmaW5lZCB8fCByYXcgPT09ICcnKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcmV0dXJuIFN0cmluZyhyYXcpLnNwbGl0KCcsJyk7XG59XG4iXX0=
257
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWZpbHRlci1pdGVtcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9yZXBvcnQtZmlsdGVyLWl0ZW1zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFakUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFNUMsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR2xELE9BQU8sRUFDK0IsbUJBQW1CLEdBQ3hELE1BQU0sK0JBQStCLENBQUM7QUFHdkMsMkVBQTJFO0FBQzNFLDRFQUE0RTtBQUM1RSx5RUFBeUU7QUFDekUsTUFBTSxVQUFVLGVBQWUsQ0FBQyxLQUF1QztJQUNyRSxJQUFJLEtBQUssWUFBWSxJQUFJLEVBQUUsQ0FBQztRQUMxQixPQUFPLE1BQU0sQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELHNFQUFzRTtJQUN0RSw4QkFBOEI7SUFDOUIsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDeEQsQ0FBQztBQUdELDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLGlFQUFpRTtBQUNqRSxFQUFFO0FBQ0YsZ0ZBQWdGO0FBQ2hGLGdGQUFnRjtBQUNoRiw2REFBNkQ7QUFDN0QsTUFBTSxVQUFVLGNBQWMsQ0FBQyxLQUF1QztJQUNwRSxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFckMsSUFBSSxDQUFDLEtBQUssRUFBRSxD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QUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDM0UsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsZ0ZBQWdGO0FBQ2hGLHVGQUF1RjtBQUN2RixpRkFBaUY7QUFDakYsZ0ZBQWdGO0FBQ2hGLGdGQUFnRjtBQUNoRixTQUFTLGlCQUFpQixDQUFDLEdBQVk7SUFDckMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdkIsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxTQUFTLElBQUksR0FBRyxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQ3BELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUZpbHRlckNvbmZpZ0l0ZW0sIEl0ZW1UeXBlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZmlsdGVyJztcblxuaW1wb3J0IHsgZm9ybWF0LCBwYXJzZUlTTyB9IGZyb20gJ2RhdGUtZm5zJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgc2hhcmVSZXBsYXkgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuL2RhdGEvcmVwb3J0LmRhdGEnO1xuaW1wb3J0IHtcbiAgQ2hhcnRHcmFudWxhcml0eSwgRmlsdGVyR3JvdXBWYWx1ZSwgR1JBTlVMQVJJVFlfT1BUSU9OUywgUmVwb3J0LCBSZXBvcnRGaWx0ZXJHcm91cCwgUmVwb3J0RmlsdGVyT3B0aW9uLFxufSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5cblxuLy8gQSBkYXRlLXJhbmdlIGJvdW5kYXJ5IGFzIHRoZSBwaWNrZWQgTE9DQUwgY2FsZW5kYXIgZGF5IChubyB0aW1lLCBubyB0eikuXG4vLyBEYXRlLXJhbmdlIGZpbHRlcnMgYXJlIGNhbGVuZGFyLWRheSBzZW1hbnRpY3MsIHNvIHRoZSBib3VuZGFyeSBtdXN0IGNhcnJ5XG4vLyBvbmx5IFktTS1EIOKAlCBuZXZlciBhIHRpbWV6b25lLWJlYXJpbmcgaW5zdGFudCB0aGUgYmFja2VuZCB3b3VsZCBzaGlmdC5cbmV4cG9ydCBmdW5jdGlvbiBkYXRlQm91bmRTdHJpbmcodmFsdWU6IERhdGUgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBmb3JtYXQodmFsdWUsICd5eXl5LU1NLWRkJyk7XG4gIH1cblxuICAvLyBBdXRob3JlZC9yZWxhdGl2ZSBkZWZhdWx0cyBhcnJpdmUgYXMgc3RyaW5ncyBhbHJlYWR5IGluIFktTS1EIGZvcm07XG4gIC8vIGtlZXAganVzdCB0aGUgZGF0ZSBwb3J0aW9uLlxuICByZXR1cm4gdmFsdWUgPyBTdHJpbmcodmFsdWUpLnNsaWNlKDAsIDEwKSA6IHVuZGVmaW5lZDtcbn1cblxuXG4vLyBBIGRhdGUtcmFuZ2UgYm91bmRhcnkgYXMgaXQgc2hvdWxkIFJFQUQgb24gYSBjb3ZlciBwYWdlIOKAlCB0aGUgc2FtZSBjYWxlbmRhclxuLy8gZGF5IGRhdGVCb3VuZFN0cmluZygpIGhhbmRzIHRoZSBzZXJ2ZXIsIHNvIGEgcHJpbnRlZCBwZXJpb2QgY2FuIG5ldmVyIG5hbWUgYVxuLy8gZGlmZmVyZW50IGRheSB0aGFuIHRoZSBudW1iZXJzIHVuZGVyIGl0IHdlcmUgZmlsdGVyZWQgYnkuIFJldHVybnMgbnVsbCB3aGVuXG4vLyB0aGVyZSBpcyBubyBib3VuZGFyeTsgdGhlIGNhbGxlciBzdXBwbGllcyBpdHMgb3duIHBsYWNlaG9sZGVyLlxuLy9cbi8vIFRoZSBwYXJzZSBoYXMgdG8gYmUgcGFyc2VJU08sIG5vdCBgbmV3IERhdGVgOiBgbmV3IERhdGUoJzIwMjYtMDUtMDEnKWAgaXMgVVRDXG4vLyBtaWRuaWdodCwgc28gZm9ybWF0dGluZyBpdCBhbnl3aGVyZSB3ZXN0IG9mIFVUQyBwcmludHMgQXByIDMwLiBwYXJzZUlTTyByZWFkc1xuLy8gYSBiYXJlIFktTS1EIGFzIExPQ0FMIG1pZG5pZ2h0LCB3aGljaCBubyBvZmZzZXQgY2FuIHNoaWZ0LlxuZXhwb3J0IGZ1bmN0aW9uIGRhdGVCb3VuZExhYmVsKHZhbHVlOiBEYXRlIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBib3VuZCA9IGRhdGVCb3VuZFN0cmluZyh2YWx1ZSk7XG5cbiAgaWYgKCFib3VuZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZGF0ZSA9IHBhcnNlSVNPKGJvdW5kKTtcblxuICByZXR1cm4gTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSA/IFN0cmluZyh2YWx1ZSkgOiBmb3JtYXQoZGF0ZSwgJ01NTSBkLCB5eXl5Jyk7XG59XG5cblxuLy8gQSBzdG9yZWQgeXl5eS1NTS1kZCBib3VuZGFyeSBhcyBhIGxvY2FsIERhdGUgZm9yIGEgZGF0ZSBwaWNrZXIsIG9yIG51bGwuXG4vLyBwYXJzZUlTTyByZWFkcyBhIGJhcmUgWS1NLUQgYXMgTE9DQUwgbWlkbmlnaHQsIHNvIHRoZSBwaWNrZXIgc2hvd3MgdGhlIGRheVxuLy8gdGhhdCB3YXMgc3RvcmVkLCB3aGF0ZXZlciB0aGUgYnJvd3NlcidzIHpvbmUuXG5leHBvcnQgZnVuY3Rpb24gZGF0ZUZyb21Cb3VuZCh2YWx1ZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IERhdGUgfCBudWxsIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZGF0ZSA9IHBhcnNlSVNPKHZhbHVlLnNsaWNlKDAsIDEwKSk7XG5cbiAgcmV0dXJuIE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkgPyBudWxsIDogZGF0ZTtcbn1cblxuXG4vLyBBIHBpY2tlZCBEYXRlIGFzIGEgeXl5eS1NTS1kZCBib3VuZGFyeSBmb3Igc3RvcmFnZSwgb3IgbnVsbC4gVXNlcyB0aGUgbG9jYWxcbi8vIGNhbGVuZGFyIGRheSAoZm9ybWF0LCBub3QgdG9JU09TdHJpbmcpIHNvIHRoZSBib3VuZGFyeSBpcyB0aGUgZGF5IHRoYXQgd2FzXG4vLyBwaWNrZWQsIHJlZ2FyZGxlc3Mgb2YgdGhlIGJyb3dzZXIncyB6b25lLlxuZXhwb3J0IGZ1bmN0aW9uIGRhdGVUb0JvdW5kKHZhbHVlOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlICYmICFOdW1iZXIuaXNOYU4odmFsdWUuZ2V0VGltZSgpKVxuICAgID8gZm9ybWF0KHZhbHVlLCAneXl5eS1NTS1kZCcpXG4gICAgOiBudWxsO1xufVxuXG5cbi8vIEEgcmVsYXRpdmUgZGF0ZS1yYW5nZSBwcmVzZXQga2V5IGFzIGEgc2VudGVuY2UtY2FzZSBsYWJlbCwgZGVyaXZlZCBmcm9tIHRoZVxuLy8gY2FtZWxDYXNlIGtleSBpdHNlbGYgKCdsYXN0MTJNb250aHMnIHJlYWRzICdMYXN0IDEyIG1vbnRocycsICd0aGlzV2Vlaydcbi8vIHJlYWRzICdUaGlzIHdlZWsnKSwgc28gbm8gbGlzdCBvZiBwcmVzZXRzIGlzIG1pcnJvcmVkIGhlcmUgYW5kIGEga2V5IHRoZVxuLy8gc2VydmVyIGFkZHMgbGF0ZXIgc3RpbGwgcmVhZHMgc2Vuc2libHkuXG5leHBvcnQgZnVuY3Rpb24gcmVsYXRpdmVMYWJlbChyZWxhdGl2ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgd29yZHMgPSByZWxhdGl2ZVxuICAgIC5yZXBsYWNlKC8oW2Etel0pKFtBLVowLTldKS9nLCAnJDEgJDInKVxuICAgIC5yZXBsYWNlKC8oXFxkKShbQS1aXSkvZywgJyQxICQyJylcbiAgICAudG9Mb3dlckNhc2UoKTtcblxuICByZXR1cm4gd29yZHMuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3Jkcy5zbGljZSgxKTtcbn1cblxuXG4vLyBNYXBzIGEgcmVwb3J0IGZpbHRlciBHUk9VUCB0byBhbiBmcy1maWx0ZXIgY29uZmlnIGl0ZW0sIGFuZCByZWFkcyBmcy1maWx0ZXJcbi8vIHF1ZXJ5IHZhbHVlcyBiYWNrIGludG8gcGVyLWdyb3VwIEZpbHRlckdyb3VwVmFsdWVzLiBTaGFyZWQgYnkgdGhlIHJlcG9ydC1iYXJcbi8vIGZzLWZpbHRlciBhbmQgdGhlIHBlci1jb21wb25lbnQgZnMtZmlsdGVyIHNvIGJvdGggcmVuZGVyIHRocm91Z2ggdGhlIHNhbWVcbi8vIGxpYnJhcnkgYW5kIHdyaXRlIGludG8gUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIGlkZW50aWNhbGx5LiBJdGVtcyBhcmUgbmFtZWRcbi8vIGBnPGdyb3VwSWQ+YCBzbyB0aGUgcXVlcnkga2V5cyBtYXAgc3RyYWlnaHQgYmFjayB0byB0aGUgZ3JvdXAuXG5cbi8vIFRoZSBwcmVmaXggb2YgYSBncm91cCdzIGl0ZW0gbmFtZSwgYW5kIG9mIGl0cyBrZXkgaW4gdGhlIHJlcG9ydCBVUkwuXG5leHBvcnQgY29uc3QgR1JPVVBfUEFSQU1fUFJFRklYID0gJ2cnO1xuXG4vLyBUaGUgcXVlcnkga2V5IGZzLWZpbHRlciB1c2VzIGZvciBhIGdyb3VwJ3MgaXRlbShzKSwgYW5kIHRoZSByZXBvcnQgVVJMJ3Mga2V5XG4vLyBmb3IgdGhlIGdyb3VwJ3MgdmFsdWUgKHJlcG9ydC11cmwtc3RhdGUudHMpLiBPbmUgbmFtaW5nIGZvciBib3RoLlxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwSXRlbU5hbWUoZ3JvdXA6IFBpY2s8UmVwb3J0RmlsdGVyR3JvdXAsICdpZCc+KTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke0dST1VQX1BBUkFNX1BSRUZJWH0ke2dyb3VwLmlkfWA7XG59XG5cbi8vIFRoZSBxdWVyeSBrZXkgZm9yIHRoZSByZXBvcnQncyBncm91cC1ieSBjb250cm9sLiBGaXhlZCByYXRoZXIgdGhhbiBkZXJpdmVkXG4vLyBmcm9tIGFuIGlkIGJlY2F1c2UgYSByZXBvcnQgaGFzIGV4YWN0bHkgb25lIOKAlCBhbmQgaXQgaXMgTk9UIGEgZmlsdGVyIGdyb3VwLFxuLy8gc28gaXQgaXMgcmVhZCBzdHJhaWdodCBvZmYgdGhlIGNoYW5nZSBxdWVyeSBpbnN0ZWFkIG9mIHRocm91Z2hcbi8vIGdyb3VwVmFsdWVzRnJvbVF1ZXJ5LiBJdCBpcyBhbHNvIHRoZSByZXBvcnQgVVJMJ3Mga2V5IGZvciB0aGUgZ3JhaW5cbi8vIChyZXBvcnQtdXJsLXN0YXRlLnRzKS4gVGhlIGdyYWluIHRyYXZlbHMgdG8gdGhlIHNlcnZlciBhcyB0aGUgZGF0YVxuLy8gcmVxdWVzdCdzIGBzdGF0ZS5mcmVxdWVuY3lgLlxuZXhwb3J0IGNvbnN0IEdST1VQX0JZX0lURU0gPSAnZ3JvdXBCeSc7XG5cbi8vIEEgc2VsZWN0IGdyb3VwJ3MgZGlzdGluY3Qgb3B0aW9ucywgYXMgeyBuYW1lLCB2YWx1ZSB9IHBhaXJzLiBUaGUgc2VydmVyIHNlbmRzXG4vLyB7IHZhbHVlLCBsYWJlbCB9OiB0aGUgdmFsdWUgaXMgd2hhdCB0aGUgZmlsdGVyIG1hdGNoZXMgb24gKGFuIGVudGl0eSdzIHN0YWJsZVxuLy8gaWQpIGFuZCB0aGUgbGFiZWwgaXMgd2hhdCB0aGUgdmlld2VyIHJlYWRzIOKAlCBzbyBhIHJlbmFtZWQgZW50aXR5IGtlZXBzIGl0cyBpZFxuLy8gYW5kIHNpbXBseSBzaG93cyBpdHMgbmV3IG5hbWUgaGVyZS4gT3B0aW9ucyBjb21lIGZyb20gdGhlIGZpcnN0IG1lbWJlciBmaWx0ZXJcbi8vIHRoYXQgZGVjbGFyZXMgdGhlbSDigJQgbWVtYmVycyBhcmUgdGhlIHNhbWUgZGF0YSBwb2ludCwgc28gYW55IG1lbWJlcidzIGxpc3Rcbi8vIHNlcnZlcyB0aGUgZ3JvdXAuIFRoZSBsaXN0IGlzIGZldGNoZWQgb25jZSAodGhlIHNlcnZlciBjYXBzIGl0KSBhbmQgcmVwbGF5ZWRcbi8vIChzaGFyZVJlcGxheSksIHNvIHJlcGVhdGVkIHJlYWRzIG5ldmVyIHJlZmV0Y2guIFNoYXJlZCBieSB0aGUgcmVwb3J0LWJhclxuLy8gc2VsZWN0IGNvbnRyb2wgYW5kIHRoZSByZXBvcnQtc2V0dGluZ3MgZGVmYXVsdCBwaWNrZXIgc28gdGhlIHR3byBuZXZlciBkcmlmdC5cbi8vIFJldHVybnMgYW4gZW1wdHkgbGlzdCB3aGVuIG5vIG1lbWJlciBwcm92aWRlcyBvcHRpb25zLlxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRHcm91cE9wdGlvbnMoXG4gIGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgcmVwb3J0RGF0YTogUmVwb3J0RGF0YSxcbiAgcmVwb3J0SWQ6IG51bWJlcixcbik6IE9ic2VydmFibGU8eyBuYW1lOiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH1bXT4ge1xuICBjb25zdCBvcHRpb25GaWx0ZXIgPSAoZ3JvdXAuZmlsdGVycyA/PyBbXSkuZmluZCgobWVtYmVyKSA9PiBtZW1iZXIuaGFzT3B0aW9ucyk7XG4gIGlmICghb3B0aW9uRmlsdGVyKSB7XG4gICAgcmV0dXJuIG9mKFtdKTtcbiAgfVxuXG4gIHJldHVybiByZXBvcnREYXRhLmZpbHRlck9wdGlvbnMocmVwb3J0SWQsIG9wdGlvbkZpbHRlci5pZClcbiAgICAucGlwZShcbiAgICAgIG1hcCgob3B0aW9uczogUmVwb3J0RmlsdGVyT3B0aW9uW10pID0+IChvcHRpb25zID8/IFtdKVxuICAgICAgICAubWFwKChvcHRpb24pID0+ICh7IG5hbWU6IG9wdGlvbi5sYWJlbCwgdmFsdWU6IG9wdGlvbi52YWx1ZSB9KSkpLFxuICAgICAgc2hhcmVSZXBsYXkoeyBidWZmZXJTaXplOiAxLCByZWZDb3VudDogZmFsc2UgfSksXG4gICAgKTtcbn1cblxuLy8gU3RvcmVkIGZpbHRlciB2YWx1ZXMgKGlkcykgcGFpcmVkIGJhY2sgd2l0aCB0aGUgbGFiZWxzIHRvIHNob3cgZm9yIHRoZW0uXG4vLyBBIHNhdmVkIGRlZmF1bHQgaG9sZHMgb25seSB2YWx1ZXMsIHNvIHRoZSBuYW1lcyBoYXZlIHRvIGJlIHJlYWQgYmFjayBvZmYgdGhlXG4vLyBvcHRpb24gbGlzdCDigJQgdGhhdCBpbmRpcmVjdGlvbiBpcyBleGFjdGx5IHdoYXQgc3Vydml2ZXMgYSByZW5hbWUuIEEgdmFsdWUgd2l0aFxuLy8gbm8gbWF0Y2hpbmcgb3B0aW9uIChpdHMgZW50aXR5IHdhcyBkZWxldGVkLCBzbyBpdCBpcyBubyBsb25nZXIgbGlzdGVkKSBmYWxsc1xuLy8gYmFjayB0byBzaG93aW5nIHRoZSByYXcgdmFsdWUgcmF0aGVyIHRoYW4gZHJvcHBpbmcgdGhlIGNoaXAsIHdoaWNoIHdvdWxkXG4vLyBzaWxlbnRseSB3aWRlbiB0aGUgZmlsdGVyLlxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVPcHRpb25WYWx1ZXMoXG4gIG9wdGlvbnMkOiBPYnNlcnZhYmxlPHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9W10+LFxuICB2YWx1ZXM6IHVua25vd25bXSxcbik6IE9ic2VydmFibGU8eyBuYW1lOiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH1bXT4ge1xuICByZXR1cm4gb3B0aW9ucyQucGlwZShtYXAoKG9wdGlvbnMpID0+IHZhbHVlcy5tYXAoKHZhbHVlKSA9PiB7XG4gICAgY29uc3Qgb3B0aW9uID0gb3B0aW9ucy5maW5kKChjYW5kaWRhdGUpID0+IFN0cmluZyhjYW5kaWRhdGUudmFsdWUpID09PSBTdHJpbmcodmFsdWUpKTtcblxuICAgIHJldHVybiB7IG5hbWU6IG9wdGlvbj8ubmFtZSA/PyBTdHJpbmcodmFsdWUpLCB2YWx1ZSB9O1xuICB9KSkpO1xufVxuXG4vLyBDYXNlLWluc2Vuc2l0aXZlIG5hbWUgZmlsdGVyIGFwcGxpZWQgdG8gYSBsb2FkZWQgb3B0aW9uIGxpc3Qg4oCUIHRoZSB0eXBlZFxuLy8ga2V5d29yZCBoYXMgdG8gYmUgbWF0Y2hlZCBoZXJlIGJlY2F1c2UgZnMtYXV0b2NvbXBsZXRlIHJlbmRlcnMgd2hhdCB3ZSByZXR1cm5cbi8vIHZlcmJhdGltLlxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoT3B0aW9ucyhcbiAgb3B0aW9ucyQ6IE9ic2VydmFibGU8eyBuYW1lOiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH1bXT4sXG4gIGtleXdvcmQ/OiBzdHJpbmcsXG4pOiBPYnNlcnZhYmxlPHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9W10+IHtcbiAgY29uc3QgdGVybSA9IChrZXl3b3JkID8/ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcblxuICByZXR1cm4gb3B0aW9ucyQucGlwZShtYXAoKG9wdGlvbnMpID0+IHRlcm1cbiAgICA/IG9wdGlvbnMuZmlsdGVyKChvcHRpb24pID0+IG9wdGlvbi5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybSkpXG4gICAgOiBvcHRpb25zKSk7XG59XG5cbi8vIEJ1aWxkIHRoZSBmcy1maWx0ZXIgY29uZmlnIGl0ZW0gZm9yIGEgZ3JvdXAsIHNlZWRpbmcgaXRzIGRlZmF1bHQgZnJvbSB0aGVcbi8vIGN1cnJlbnQgc2Vzc2lvbiB2YWx1ZSBzbyBhdXRob3JlZC9yZWxhdGl2ZSBkZWZhdWx0cyBzaG93IHNlbGVjdGVkIG9uIG9wZW4uXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVySXRlbUZvckdyb3VwKFxuICBncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsXG4gIHJlcG9ydERhdGE6IFJlcG9ydERhdGEsXG4gIHJlcG9ydElkOiBudW1iZXIsXG4gIGluaXRpYWw/OiBGaWx0ZXJHcm91cFZhbHVlLFxuKTogSUZpbHRlckNvbmZpZ0l0ZW0ge1xuICBjb25zdCBuYW1lID0gZ3JvdXBJdGVtTmFtZShncm91cCk7XG4gIGNvbnN0IGxhYmVsID0gZ3JvdXAubGFiZWwgfHwgZ3JvdXAuZmlsdGVycz8uWzBdPy5maWx0ZXJDb2x1bW4gfHwgJyc7XG5cbiAgc3dpdGNoIChncm91cC50eXBlKSB7XG4gICAgY2FzZSAnZGF0ZVJhbmdlJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIHR5cGU6IEl0ZW1UeXBlLkRhdGVSYW5nZSxcbiAgICAgICAgbGFiZWw6IHsgZnJvbTogYCR7bGFiZWx9IEZyb21gLCB0bzogYCR7bGFiZWx9IFRvYCB9LFxuICAgICAgICBkZWZhdWx0OiAoaW5pdGlhbD8uc3RhcnQgfHwgaW5pdGlhbD8uZW5kKVxuICAgICAgICAgID8geyBmcm9tOiBpbml0aWFsLnN0YXJ0ID8/IHVuZGVmaW5lZCwgdG86IGluaXRpYWwuZW5kID8/IHVuZGVmaW5lZCB9XG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICB9O1xuXG4gICAgY2FzZSAnc2VsZWN0Jzoge1xuICAgICAgLy8gT25lIHNoYXJlZCwgcmVwbGF5ZWQgb3B0aW9uIHN0cmVhbSBzbyB0eXBpbmcgbmV2ZXIgcmVmZXRjaGVzLlxuICAgICAgY29uc3Qgb3B0aW9ucyQgPSBsb2FkR3JvdXBPcHRpb25zKGdyb3VwLCByZXBvcnREYXRhLCByZXBvcnRJZCk7XG4gICAgICBjb25zdCB2YWx1ZXMgPSBpbml0aWFsPy52YWx1ZXM7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIHR5cGU6IEl0ZW1UeXBlLkF1dG9Db21wbGV0ZUNoaXBzLFxuICAgICAgICBsYWJlbCxcbiAgICAgICAgZmV0Y2hPbkZvY3VzOiB0cnVlLFxuICAgICAgICB2YWx1ZXM6IChrZXl3b3JkPzogc3RyaW5nKSA9PiBtYXRjaE9wdGlvbnMob3B0aW9ucyQsIGtleXdvcmQpLFxuICAgICAgICAvLyBTdG9yZWQgdmFsdWVzIGFyZSBpZHMsIHNvIHRoZSBjaGlwcyBjYW4gb25seSBiZSBuYW1lZCBvbmNlIHRoZSBvcHRpb25cbiAgICAgICAgLy8gbGlzdCBoYXMgbG9hZGVkIOKAlCBoZW5jZSB0aGUgb2JzZXJ2YWJsZSBmb3JtIG9mIGBkZWZhdWx0YC5cbiAgICAgICAgZGVmYXVsdDogdmFsdWVzPy5sZW5ndGhcbiAgICAgICAgICA/ICgpID0+IHJlc29sdmVPcHRpb25WYWx1ZXMob3B0aW9ucyQsIHZhbHVlcylcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY2FzZSAna2V5d29yZCc6XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIHR5cGU6IEl0ZW1UeXBlLktleXdvcmQsXG4gICAgICAgIGxhYmVsLFxuICAgICAgICBkZWZhdWx0OiBpbml0aWFsPy52YWx1ZSxcbiAgICAgIH07XG4gIH1cbn1cblxuLy8gV2hldGhlciB0aGUgcmVwb3J0IGhhcyBhIGNoYXJ0IHRoZSBncm91cC1ieSBjb250cm9sIGNhbiByZS1idWNrZXQuIEEgdGltZVxuLy8geC1heGlzIGlzIHRoZSB3aG9sZSBxdWFsaWZpY2F0aW9uOiB0aGUgY29udHJvbCBjaGFuZ2VzIHRoZSBncmFpbiBvZiB0aGF0XG4vLyBheGlzLCBhbmQgYSBjYXRlZ29yeSBheGlzIGhhcyBubyBncmFpbiB0byBjaGFuZ2UuXG5leHBvcnQgZnVuY3Rpb24gaGFzVGltZVNlcmllc0NoYXJ0KHJlcG9ydDogUmVwb3J0IHwgbnVsbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKHJlcG9ydD8ucGFnZXMgPz8gW10pLnNvbWUoKHBhZ2UpID0+IChwYWdlLmNvbXBvbmVudHMgPz8gW10pLnNvbWUoKGNvbXBvbmVudCkgPT5cbiAgICBjb21wb25lbnQudHlwZSA9PT0gJ2NoYXJ0JyAmJiBjb21wb25lbnQuY29uZmlnPy54QXhpcz8ua2luZCA9PT0gJ3RpbWUnKSk7XG59XG5cbi8vIFRoZSBncmFpbnMgdGhlIHJlcG9ydCdzIGdyb3VwLWJ5IGNvbnRyb2wgb2ZmZXJzLCBuYW1lZCBmb3IgdGhlIHZpZXdlci4gV0hJQ0hcbi8vIG9mIHRoZW0gY29tZXMgZnJvbSB0aGUgcmVwb3J0OyBob3cgdGhleSByZWFkIGNvbWVzIGZyb20gR1JBTlVMQVJJVFlfT1BUSU9OUy5cbi8vIEFuIGVtcHR5IHN0b3JlZCBsaXN0IG1lYW5zIGV2ZXJ5IGdyYWluIOKAlCB0aGUgc2FtZSBydWxlIHRoZSBiYWNrZW5kIGFwcGxpZXMuXG5mdW5jdGlvbiBncm91cEJ5T3B0aW9ucyhyZXBvcnQ6IFJlcG9ydCk6IHsgdmFsdWU6IENoYXJ0R3JhbnVsYXJpdHk7IG5hbWU6IHN0cmluZyB9W10ge1xuICBjb25zdCBncmFudWxhcml0aWVzID0gcmVwb3J0LmNvbmZpZz8uZ3JvdXBCeT8uZ3JhbnVsYXJpdGllcyA/PyBbXTtcblxuICByZXR1cm4gZ3JhbnVsYXJpdGllcy5sZW5ndGhcbiAgICA/IEdSQU5VTEFSSVRZX09QVElPTlMuZmlsdGVyKChvcHRpb24pID0+IGdyYW51bGFyaXRpZXMuaW5jbHVkZXMob3B0aW9uLnZhbHVlKSlcbiAgICA6IEdSQU5VTEFSSVRZX09QVElPTlM7XG59XG5cbi8vIFdoZXRoZXIgYSBncmFpbiBpcyBvbmUgdGhlIHJlcG9ydCdzIGNvbnRyb2wgc3RpbGwgb2ZmZXJzLiBBIGdyYWluIGl0IGRvZXNuJ3Rcbi8vIGNhbm5vdCBzdGF5IGluIGVmZmVjdDogdGhlIGFnZW50IGNhbiBuYXJyb3cgdGhlIGxpc3QgYXQgYW55IHRpbWUsIGFuZCBhIGNoYXJ0XG4vLyBsZWZ0IGJ1Y2tldGluZyBhdCBhIGRyb3BwZWQgZ3JhaW4gaXMgb25lIHRoZSB2aWV3ZXIgY2FuIG5laXRoZXIgc2VlIG5vciBjaGFuZ2UuXG5leHBvcnQgZnVuY3Rpb24gaXNHcmFudWxhcml0eU9mZmVyZWQocmVwb3J0OiBSZXBvcnQsIGdyYW51bGFyaXR5OiBDaGFydEdyYW51bGFyaXR5IHwgbnVsbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gIWdyYW51bGFyaXR5IHx8IGdyb3VwQnlPcHRpb25zKHJlcG9ydCkuc29tZSgob3B0aW9uKSA9PiBvcHRpb24udmFsdWUgPT09IGdyYW51bGFyaXR5KTtcbn1cblxuLy8gVGhlIGZzLWZpbHRlciBjb25maWcgaXRlbSBmb3IgdGhlIHJlcG9ydCdzIGdyb3VwLWJ5IGNvbnRyb2wsIG9yIG51bGwgd2hlbiB0aGVcbi8vIHJlcG9ydCBoYXMgbm9uZSB0byBzaG93LlxuLy9cbi8vIEl0IGxlYWRzIHRoZSBzYW1lIGJhciB0aGUgZmlsdGVycyByZW5kZXIgaW4sIGJ1dCBpdCBpcyBOT1Qgb25lOiBhIGZpbHRlclxuLy8gbmFycm93cyBXSElDSCByb3dzIGFyZSBjb3VudGVkLCB0aGlzIGNoYW5nZXMgaG93IHRoZSBzdXJ2aXZpbmcgcm93cyBhcmVcbi8vIEJVQ0tFVEVEIOKAlCBhbmQgaXQgY29tZXMgZmlyc3QgYmVjYXVzZSB0aGUgZ3JhaW4gaXMgd2hhdCBhIHZpZXdlciBzZXR0bGVzXG4vLyBiZWZvcmUgZGVjaWRpbmcgd2hpY2ggcm93cyB0aGV5IHdhbnQuXG4vLyBQaWNraW5nIGEgZ3JhaW4gc2V0cyBhIHNlc3Npb24td2lkZSBvdmVycmlkZSB0aGF0IHJpZGVzIGFsb25nIGluIGVhY2ggY2hhcnQnc1xuLy8gZGF0YSByZXF1ZXN0LCBzbyB0aGUgY2hhcnRzIHRoZW1zZWx2ZXMgYXJlIG5ldmVyIHJld3JpdHRlbi5cbmV4cG9ydCBmdW5jdGlvbiBncm91cEJ5RmlsdGVySXRlbShcbiAgcmVwb3J0OiBSZXBvcnQsXG4gIGluaXRpYWw/OiBDaGFydEdyYW51bGFyaXR5IHwgbnVsbCxcbik6IElGaWx0ZXJDb25maWdJdGVtIHwgbnVsbCB7XG4gIGNvbnN0IGdyb3VwQnkgPSByZXBvcnQuY29uZmlnPy5ncm91cEJ5O1xuXG4gIC8vIE9ubHkgYW4gRVhQTElDSVQgZmFsc2UgaGlkZXMgdGhlIGNvbnRyb2wuIEFuIGFic2VudCBibG9jayBtZWFucyBhIHJlcG9ydFxuICAvLyBzZXJ2ZWQgYnkgYSBidWlsZCB0aGF0IHByZWRhdGVzIHRoZSBjb250cm9sIGJlaW5nIHN0b3JlZCwgYW5kIGV2ZXJ5IG9uZSBvZlxuICAvLyB0aG9zZSBoYWQgb25lIOKAlCB0aGUgYmFja2VuZCByZXNvbHZlcyBpdCB0aGUgc2FtZSB3YXkgKFJlcG9ydEdyb3VwQnkpLlxuICBpZiAoZ3JvdXBCeT8uZW5hYmxlZCA9PT0gZmFsc2UgfHwgIWhhc1RpbWVTZXJpZXNDaGFydChyZXBvcnQpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB2YWx1ZXMgPSBncm91cEJ5T3B0aW9ucyhyZXBvcnQpO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogR1JPVVBfQllfSVRFTSxcbiAgICB0eXBlOiBJdGVtVHlwZS5TZWxlY3QsXG4gICAgbGFiZWw6IGdyb3VwQnk/LmxhYmVsIHx8ICdHcm91cCBCeScsXG4gICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgIHZhbHVlczogKCkgPT4gdmFsdWVzLFxuICAgIGRlZmF1bHQ6IGlzR3JhbnVsYXJpdHlPZmZlcmVkKHJlcG9ydCwgaW5pdGlhbCA/PyBudWxsKSA/IChpbml0aWFsID8/IHVuZGVmaW5lZCkgOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8vIFRoZSBncm91cC1ieSBjb250cm9sJ3MgY29udHJpYnV0aW9uIHRvIHRoZSB0b29sYmFyJ3MgZnMtZmlsdGVyIGtleS4gZnMtZmlsdGVyXG4vLyByZWFkcyBpdHMgY29uZmlnIG9uY2UgYXQgaW5pdCwgYW5kIHRoZSBhZ2VudCBjYW4gY2hhbmdlIHRoZSBjb250cm9sJ3MgbGFiZWxcbi8vIG9yIHRoZSBncmFpbnMgaXQgb2ZmZXJzIOKAlCB3aXRob3V0IHRob3NlIGluIHRoZSBrZXkgdGhlIGJhciBrZWVwcyByZW5kZXJpbmdcbi8vIHRoZSBjb250cm9sIGl0IHdhcyBjcmVhdGVkIHdpdGggdW50aWwgYSBmdWxsIHBhZ2UgcmVsb2FkLlxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwQnlTaWduYXR1cmUocmVwb3J0OiBSZXBvcnQgfCBudWxsKTogc3RyaW5nIHtcbiAgaWYgKCFyZXBvcnQgfHwgIWdyb3VwQnlGaWx0ZXJJdGVtKHJlcG9ydCkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBjb25zdCBncm91cEJ5ID0gcmVwb3J0LmNvbmZpZz8uZ3JvdXBCeTtcblxuICByZXR1cm4gWydncm91cEJ5JywgZ3JvdXBCeT8ubGFiZWwgPz8gJycsIChncm91cEJ5Py5ncmFudWxhcml0aWVzID8/IFtdKS5qb2luKCcsJyldLmpvaW4oJzonKTtcbn1cblxuLy8gUmVhZCBhbiBmcy1maWx0ZXIgY2hhbmdlIHF1ZXJ5IGludG8gcGVyLWdyb3VwIHZhbHVlcy4gUmV0dXJucyBvbmUgZW50cnkgcGVyXG4vLyBncm91cCB3aXRoIHRoZSB2YWx1ZSB0byBzdG9yZSAob3IgbnVsbCB0byBjbGVhcikg4oCUIGNhbGxlcnMgZmVlZCB0aGVzZSB0b1xuLy8gUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlLnNldFZhbHVlLlxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwVmFsdWVzRnJvbVF1ZXJ5KFxuICBxdWVyeTogUmVjb3JkPHN0cmluZywgYW55PixcbiAgZ3JvdXBzOiBSZXBvcnRGaWx0ZXJHcm91cFtdLFxuKTogeyBncm91cElkOiBudW1iZXI7IHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB9W10ge1xuICByZXR1cm4gZ3JvdXBzLm1hcCgoZ3JvdXApID0+IHtcbiAgICBjb25zdCBuYW1lID0gZ3JvdXBJdGVtTmFtZShncm91cCk7XG5cbiAgICBpZiAoZ3JvdXAudHlwZSA9PT0gJ2RhdGVSYW5nZScpIHtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gcXVlcnlbYCR7bmFtZX1Gcm9tYF07XG4gICAgICBjb25zdCBlbmQgPSBxdWVyeVtgJHtuYW1lfVRvYF07XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGdyb3VwSWQ6IGdyb3VwLmlkLFxuICAgICAgICB2YWx1ZTogKHN0YXJ0IHx8IGVuZCkgPyB7IHN0YXJ0OiBzdGFydCB8fCBudWxsLCBlbmQ6IGVuZCB8fCBudWxsIH0gOiBudWxsLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoZ3JvdXAudHlwZSA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHNlbGVjdFF1ZXJ5VmFsdWVzKHF1ZXJ5W25hbWVdKTtcblxuICAgICAgcmV0dXJuIHsgZ3JvdXBJZDogZ3JvdXAuaWQsIHZhbHVlOiB2YWx1ZXMubGVuZ3RoID8geyB2YWx1ZXMgfSA6IG51bGwgfTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXl3b3JkID0gU3RyaW5nKHF1ZXJ5W25hbWVdID8/ICcnKS50cmltKCk7XG5cbiAgICByZXR1cm4geyBncm91cElkOiBncm91cC5pZCwgdmFsdWU6IGtleXdvcmQgPyB7IHZhbHVlOiBrZXl3b3JkIH0gOiBudWxsIH07XG4gIH0pO1xufVxuXG4vLyBmcy1maWx0ZXIncyBBdXRvQ29tcGxldGVDaGlwcyBzZXJpYWxpc2VzIGEgbXVsdGktc2VsZWN0IGludG8gT05FIHF1ZXJ5IHZhbHVlOlxuLy8gdGhlIHNlbGVjdGVkIHZhbHVlcyBqb2luZWQgYnkgXCIsXCIgKGl0cyBgcXVlcnlgIGdldHRlciBkb2VzIGAubWFwKHZhbHVlKS5qb2luKCcsJylgKS5cbi8vIFNvIGEgMisgc2VsZWN0aW9uIGFycml2ZXMgYXMgdGhlIHN0cmluZyBcImEsYlwiLCBub3QgYW4gYXJyYXkg4oCUIHNwbGl0dGluZyBvbiBcIixcIlxuLy8gcmV2ZXJzZXMgdGhhdCBmYWl0aGZ1bGx5LiBXaXRob3V0IHRoaXMsIGEgbXVsdGktc2VsZWN0IHdhcyBzZW50IGFzIHRoZSBzaW5nbGVcbi8vIHZhbHVlIFtcImEsYlwiXSwgcHJvZHVjaW5nIGBjb2wgSU4gKCdhLGInKWAgc2VydmVyLXNpZGUsIHdoaWNoIG1hdGNoZXMgbm90aGluZy5cbmZ1bmN0aW9uIHNlbGVjdFF1ZXJ5VmFsdWVzKHJhdzogdW5rbm93bik6IHVua25vd25bXSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHJhdykpIHtcbiAgICByZXR1cm4gcmF3O1xuICB9XG5cbiAgaWYgKHJhdyA9PT0gbnVsbCB8fCByYXcgPT09IHVuZGVmaW5lZCB8fCByYXcgPT09ICcnKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcmV0dXJuIFN0cmluZyhyYXcpLnNwbGl0KCcsJyk7XG59XG4iXX0=
@@ -0,0 +1,148 @@
1
+ import { GROUP_BY_ITEM, GROUP_PARAM_PREFIX, dateBoundString, dateFromBound, groupItemName, } from './report-filter-items';
2
+ // The report viewer's state in its URL: a pure codec, with no knowledge of a
3
+ // loaded report. ReportFilterStateService decides WHAT is carried (only values
4
+ // that differ from the authored defaults) and checks what is read back against
5
+ // the report; this file only turns values into query params and back.
6
+ //
7
+ // ?page=7&groupBy=week&g12=last30Days&g15=3,5&g16=2026-01-01..&s31=-create_date
8
+ //
9
+ // - g<groupId>: one key per filter group. A dateRange is its relative preset
10
+ // name when it carries one, else 'YYYY-MM-DD..YYYY-MM-DD' (either side may be
11
+ // empty); a select is its values joined by ','; a keyword is its text. An
12
+ // empty value is an explicit clear of a group that has a default.
13
+ // - s<componentId>: a list's sort column, '-' prefixed when descending.
14
+ // - groupBy: the group-by grain (GROUP_BY_ITEM).
15
+ // The page key is the host's (FsAiReportComponent.pageQueryParam) and is
16
+ // written beside these, never by this codec.
17
+ // The prefix of a group's value key. Declared beside the filter items, which
18
+ // read it too (declaring it here would make the two files import each other);
19
+ // re-exported so every codec constant can be imported from the codec.
20
+ export { GROUP_PARAM_PREFIX } from './report-filter-items';
21
+ // The prefix of a list's sort key.
22
+ export const LIST_SORT_PARAM_PREFIX = 's';
23
+ // Between the two days of an encoded fixed date range.
24
+ export const DATE_RANGE_SEPARATOR = '..';
25
+ // A key this codec owns: a group value or a list sort. Any such key the
26
+ // snapshot no longer carries is removed from the URL.
27
+ export const OWNED_PARAM = new RegExp(`^[${GROUP_PARAM_PREFIX}${LIST_SORT_PARAM_PREFIX}]\\d+$`);
28
+ const DAY_PATTERN = /^\d{4}-\d{2}-\d{2}$/;
29
+ // The viewer-state params of a URL as raw strings. Keys this codec does not
30
+ // own are ignored.
31
+ export function readReportUrlParams(params) {
32
+ const groups = new Map();
33
+ const listSorts = new Map();
34
+ for (const key of params.keys) {
35
+ if (!OWNED_PARAM.test(key)) {
36
+ continue;
37
+ }
38
+ const id = Number(key.slice(1));
39
+ const raw = params.get(key) ?? '';
40
+ if (key.startsWith(GROUP_PARAM_PREFIX)) {
41
+ groups.set(id, raw);
42
+ }
43
+ else {
44
+ listSorts.set(id, raw);
45
+ }
46
+ }
47
+ return { groups, listSorts, groupBy: params.get(GROUP_BY_ITEM) };
48
+ }
49
+ // A group value read back from its URL param. null is an explicit clear (an
50
+ // empty param). undefined means the param is unusable for a group of this type
51
+ // (an unknown preset name, a malformed day, a wrong shape) and is ignored.
52
+ // `resolveRelative` turns a preset name into today's range for it, or null for
53
+ // a name it does not know.
54
+ export function decodeFilterValue(type, raw, resolveRelative) {
55
+ if (raw === '') {
56
+ return null;
57
+ }
58
+ switch (type) {
59
+ case 'dateRange':
60
+ return raw.includes(DATE_RANGE_SEPARATOR)
61
+ ? decodeFixedRange(raw)
62
+ : decodePreset(raw, resolveRelative);
63
+ case 'select': {
64
+ const values = raw.split(',').filter((value) => value !== '');
65
+ return values.length ? { values } : undefined;
66
+ }
67
+ case 'keyword':
68
+ return raw.trim() ? { value: raw } : undefined;
69
+ default:
70
+ return undefined;
71
+ }
72
+ }
73
+ // A group value as its URL param. The shape says how: a preset name, then a
74
+ // date range, then select values, then keyword text. null (a cleared group)
75
+ // is the empty param.
76
+ export function encodeFilterValue(value) {
77
+ if (!value) {
78
+ return '';
79
+ }
80
+ if (value.preset) {
81
+ return value.preset;
82
+ }
83
+ if (value.start || value.end) {
84
+ return [dateBoundString(value.start) ?? '', dateBoundString(value.end) ?? '']
85
+ .join(DATE_RANGE_SEPARATOR);
86
+ }
87
+ if (value.values) {
88
+ return value.values.map((item) => String(item)).join(',');
89
+ }
90
+ return value.value ?? '';
91
+ }
92
+ export function encodeSort(sort) {
93
+ return `${sort.direction === 'desc' ? '-' : ''}${sort.column}`;
94
+ }
95
+ // A list sort read back from its URL param, or null when it names no column.
96
+ // Whether the column is one the list can sort by is the caller's check.
97
+ export function decodeSort(raw) {
98
+ const descending = raw.startsWith('-');
99
+ const column = descending ? raw.slice(1) : raw;
100
+ return column
101
+ ? { column, direction: descending ? 'desc' : 'asc' }
102
+ : null;
103
+ }
104
+ // The query params that make the URL carry `snapshot`: every snapshot key is
105
+ // set, and each owned key (or the grain) that `current` carries but the
106
+ // snapshot does not is set to null, which removes it under the router's
107
+ // 'merge' handling. Keys this codec does not own are left alone.
108
+ export function buildReportUrlParams(snapshot, current) {
109
+ const params = {};
110
+ for (const key of current.keys) {
111
+ if (OWNED_PARAM.test(key) || key === GROUP_BY_ITEM) {
112
+ params[key] = null;
113
+ }
114
+ }
115
+ snapshot.groups.forEach((value, groupId) => {
116
+ params[groupItemName({ id: groupId })] = encodeFilterValue(value);
117
+ });
118
+ snapshot.listSorts.forEach((sort, componentId) => {
119
+ params[`${LIST_SORT_PARAM_PREFIX}${componentId}`] = encodeSort(sort);
120
+ });
121
+ if (snapshot.frequency) {
122
+ params[GROUP_BY_ITEM] = snapshot.frequency;
123
+ }
124
+ return params;
125
+ }
126
+ // 'YYYY-MM-DD..YYYY-MM-DD', either side optional but not both. Each side must
127
+ // be a real calendar day.
128
+ function decodeFixedRange(raw) {
129
+ const sides = raw.split(DATE_RANGE_SEPARATOR);
130
+ if (sides.length !== 2 || (!sides[0] && !sides[1])) {
131
+ return undefined;
132
+ }
133
+ const [start, end] = sides.map((side) => side ? decodeDay(side) : null);
134
+ if (start === undefined || end === undefined) {
135
+ return undefined;
136
+ }
137
+ return { start, end };
138
+ }
139
+ // One side of a fixed range as a local Date, or undefined when it is not a
140
+ // real Y-M-D day.
141
+ function decodeDay(side) {
142
+ return DAY_PATTERN.test(side) ? (dateFromBound(side) ?? undefined) : undefined;
143
+ }
144
+ function decodePreset(name, resolveRelative) {
145
+ const range = resolveRelative(name);
146
+ return range ? { start: range.start, end: range.end, preset: name } : undefined;
147
+ }
148
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXVybC1zdGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9yZXBvcnQtdXJsLXN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBLE9BQU8sRUFDTCxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxhQUFhLEdBQ2pGLE1BQU0sdUJBQXVCLENBQUM7QUFHL0IsNkVBQTZFO0FBQzdFLCtFQUErRTtBQUMvRSwrRUFBK0U7QUFDL0Usc0VBQXNFO0FBQ3RFLEVBQUU7QUFDRixrRkFBa0Y7QUFDbEYsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSxnRkFBZ0Y7QUFDaEYsNEVBQTRFO0FBQzVFLG9FQUFvRTtBQUNwRSx3RUFBd0U7QUFDeEUsaURBQWlEO0FBQ2pELHlFQUF5RTtBQUN6RSw2Q0FBNkM7QUFFN0MsNkVBQTZFO0FBQzdFLDhFQUE4RTtBQUM5RSxzRUFBc0U7QUFDdEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFM0QsbUNBQW1DO0FBQ25DLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQztBQUUxQyx1REFBdUQ7QUFDdkQsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDO0FBRXpDLHdFQUF3RTtBQUN4RSxzREFBc0Q7QUFDdEQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLElBQUksTUFBTSxDQUFDLEtBQUssa0JBQWtCLEdBQUcsc0JBQXNCLFFBQVEsQ0FBQyxDQUFDO0FBRWhHLE1BQU0sV0FBVyxHQUFHLHFCQUFxQixDQUFDO0FBRTFDLDRFQUE0RTtBQUM1RSxtQkFBbUI7QUFDbkIsTUFBTSxVQUFVLG1CQUFtQixDQUFDLE1BQWdCO0lBQ2xELE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQ3pDLE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFD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QUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4RSxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzdDLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3hCLENBQUM7QUFFRCwyRUFBMkU7QUFDM0Usa0JBQWtCO0FBQ2xCLFNBQVMsU0FBUyxDQUFDLElBQVk7SUFDN0IsT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ2pGLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FDbkIsSUFBWSxFQUNaLGVBQW9FO0lBRXBFLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVwQyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNsRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGFyYW1NYXAsIFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7XG4gIEZpbHRlckdyb3VwVmFsdWUsIFJlcG9ydEZpbHRlclR5cGUsIFJlcG9ydFNvcnQsIFJlcG9ydFVybFBhcmFtcywgUmVwb3J0VXJsU25hcHNob3QsXG59IGZyb20gJy4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIEdST1VQX0JZX0lURU0sIEdST1VQX1BBUkFNX1BSRUZJWCwgZGF0ZUJvdW5kU3RyaW5nLCBkYXRlRnJvbUJvdW5kLCBncm91cEl0ZW1OYW1lLFxufSBmcm9tICcuL3JlcG9ydC1maWx0ZXItaXRlbXMnO1xuXG5cbi8vIFRoZSByZXBvcnQgdmlld2VyJ3Mgc3RhdGUgaW4gaXRzIFVSTDogYSBwdXJlIGNvZGVjLCB3aXRoIG5vIGtub3dsZWRnZSBvZiBhXG4vLyBsb2FkZWQgcmVwb3J0LiBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UgZGVjaWRlcyBXSEFUIGlzIGNhcnJpZWQgKG9ubHkgdmFsdWVzXG4vLyB0aGF0IGRpZmZlciBmcm9tIHRoZSBhdXRob3JlZCBkZWZhdWx0cykgYW5kIGNoZWNrcyB3aGF0IGlzIHJlYWQgYmFjayBhZ2FpbnN0XG4vLyB0aGUgcmVwb3J0OyB0aGlzIGZpbGUgb25seSB0dXJucyB2YWx1ZXMgaW50byBxdWVyeSBwYXJhbXMgYW5kIGJhY2suXG4vL1xuLy8gICA/cGFnZT03Jmdyb3VwQnk9d2VlayZnMTI9bGFzdDMwRGF5cyZnMTU9Myw1JmcxNj0yMDI2LTAxLTAxLi4mczMxPS1jcmVhdGVfZGF0ZVxuLy9cbi8vIC0gZzxncm91cElkPjogb25lIGtleSBwZXIgZmlsdGVyIGdyb3VwLiBBIGRhdGVSYW5nZSBpcyBpdHMgcmVsYXRpdmUgcHJlc2V0XG4vLyAgIG5hbWUgd2hlbiBpdCBjYXJyaWVzIG9uZSwgZWxzZSAnWVlZWS1NTS1ERC4uWVlZWS1NTS1ERCcgKGVpdGhlciBzaWRlIG1heSBiZVxuLy8gICBlbXB0eSk7IGEgc2VsZWN0IGlzIGl0cyB2YWx1ZXMgam9pbmVkIGJ5ICcsJzsgYSBrZXl3b3JkIGlzIGl0cyB0ZXh0LiBBblxuLy8gICBlbXB0eSB2YWx1ZSBpcyBhbiBleHBsaWNpdCBjbGVhciBvZiBhIGdyb3VwIHRoYXQgaGFzIGEgZGVmYXVsdC5cbi8vIC0gczxjb21wb25lbnRJZD46IGEgbGlzdCdzIHNvcnQgY29sdW1uLCAnLScgcHJlZml4ZWQgd2hlbiBkZXNjZW5kaW5nLlxuLy8gLSBncm91cEJ5OiB0aGUgZ3JvdXAtYnkgZ3JhaW4gKEdST1VQX0JZX0lURU0pLlxuLy8gVGhlIHBhZ2Uga2V5IGlzIHRoZSBob3N0J3MgKEZzQWlSZXBvcnRDb21wb25lbnQucGFnZVF1ZXJ5UGFyYW0pIGFuZCBpc1xuLy8gd3JpdHRlbiBiZXNpZGUgdGhlc2UsIG5ldmVyIGJ5IHRoaXMgY29kZWMuXG5cbi8vIFRoZSBwcmVmaXggb2YgYSBncm91cCdzIHZhbHVlIGtleS4gRGVjbGFyZWQgYmVzaWRlIHRoZSBmaWx0ZXIgaXRlbXMsIHdoaWNoXG4vLyByZWFkIGl0IHRvbyAoZGVjbGFyaW5nIGl0IGhlcmUgd291bGQgbWFrZSB0aGUgdHdvIGZpbGVzIGltcG9ydCBlYWNoIG90aGVyKTtcbi8vIHJlLWV4cG9ydGVkIHNvIGV2ZXJ5IGNvZGVjIGNvbnN0YW50IGNhbiBiZSBpbXBvcnRlZCBmcm9tIHRoZSBjb2RlYy5cbmV4cG9ydCB7IEdST1VQX1BBUkFNX1BSRUZJWCB9IGZyb20gJy4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XG5cbi8vIFRoZSBwcmVmaXggb2YgYSBsaXN0J3Mgc29ydCBrZXkuXG5leHBvcnQgY29uc3QgTElTVF9TT1JUX1BBUkFNX1BSRUZJWCA9ICdzJztcblxuLy8gQmV0d2VlbiB0aGUgdHdvIGRheXMgb2YgYW4gZW5jb2RlZCBmaXhlZCBkYXRlIHJhbmdlLlxuZXhwb3J0IGNvbnN0IERBVEVfUkFOR0VfU0VQQVJBVE9SID0gJy4uJztcblxuLy8gQSBrZXkgdGhpcyBjb2RlYyBvd25zOiBhIGdyb3VwIHZhbHVlIG9yIGEgbGlzdCBzb3J0LiBBbnkgc3VjaCBrZXkgdGhlXG4vLyBzbmFwc2hvdCBubyBsb25nZXIgY2FycmllcyBpcyByZW1vdmVkIGZyb20gdGhlIFVSTC5cbmV4cG9ydCBjb25zdCBPV05FRF9QQVJBTSA9IG5ldyBSZWdFeHAoYF5bJHtHUk9VUF9QQVJBTV9QUkVGSVh9JHtMSVNUX1NPUlRfUEFSQU1fUFJFRklYfV1cXFxcZCskYCk7XG5cbmNvbnN0IERBWV9QQVRURVJOID0gL15cXGR7NH0tXFxkezJ9LVxcZHsyfSQvO1xuXG4vLyBUaGUgdmlld2VyLXN0YXRlIHBhcmFtcyBvZiBhIFVSTCBhcyByYXcgc3RyaW5ncy4gS2V5cyB0aGlzIGNvZGVjIGRvZXMgbm90XG4vLyBvd24gYXJlIGlnbm9yZWQuXG5leHBvcnQgZnVuY3Rpb24gcmVhZFJlcG9ydFVybFBhcmFtcyhwYXJhbXM6IFBhcmFtTWFwKTogUmVwb3J0VXJsUGFyYW1zIHtcbiAgY29uc3QgZ3JvdXBzID0gbmV3IE1hcDxudW1iZXIsIHN0cmluZz4oKTtcbiAgY29uc3QgbGlzdFNvcnRzID0gbmV3IE1hcDxudW1iZXIsIHN0cmluZz4oKTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBwYXJhbXMua2V5cykge1xuICAgIGlmICghT1dORURfUEFSQU0udGVzdChrZXkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBpZCA9IE51bWJlcihrZXkuc2xpY2UoMSkpO1xuICAgIGNvbnN0IHJhdyA9IHBhcmFtcy5nZXQoa2V5KSA/PyAnJztcblxuICAgIGlmIChrZXkuc3RhcnRzV2l0aChHUk9VUF9QQVJBTV9QUkVGSVgpKSB7XG4gICAgICBncm91cHMuc2V0KGlkLCByYXcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaXN0U29ydHMuc2V0KGlkLCByYXcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGdyb3VwcywgbGlzdFNvcnRzLCBncm91cEJ5OiBwYXJhbXMuZ2V0KEdST1VQX0JZX0lURU0pIH07XG59XG5cbi8vIEEgZ3JvdXAgdmFsdWUgcmVhZCBiYWNrIGZyb20gaXRzIFVSTCBwYXJhbS4gbnVsbCBpcyBhbiBleHBsaWNpdCBjbGVhciAoYW5cbi8vIGVtcHR5IHBhcmFtKS4gdW5kZWZpbmVkIG1lYW5zIHRoZSBwYXJhbSBpcyB1bnVzYWJsZSBmb3IgYSBncm91cCBvZiB0aGlzIHR5cGVcbi8vIChhbiB1bmtub3duIHByZXNldCBuYW1lLCBhIG1hbGZvcm1lZCBkYXksIGEgd3Jvbmcgc2hhcGUpIGFuZCBpcyBpZ25vcmVkLlxuLy8gYHJlc29sdmVSZWxhdGl2ZWAgdHVybnMgYSBwcmVzZXQgbmFtZSBpbnRvIHRvZGF5J3MgcmFuZ2UgZm9yIGl0LCBvciBudWxsIGZvclxuLy8gYSBuYW1lIGl0IGRvZXMgbm90IGtub3cuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRmlsdGVyVmFsdWUoXG4gIHR5cGU6IFJlcG9ydEZpbHRlclR5cGUsXG4gIHJhdzogc3RyaW5nLFxuICByZXNvbHZlUmVsYXRpdmU6IChuYW1lOiBzdHJpbmcpID0+IHsgc3RhcnQ6IERhdGU7IGVuZDogRGF0ZSB9IHwgbnVsbCxcbik6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHJhdyA9PT0gJycpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2RhdGVSYW5nZSc6XG4gICAgICByZXR1cm4gcmF3LmluY2x1ZGVzKERBVEVfUkFOR0VfU0VQQVJBVE9SKVxuICAgICAgICA/IGRlY29kZUZpeGVkUmFuZ2UocmF3KVxuICAgICAgICA6IGRlY29kZVByZXNldChyYXcsIHJlc29sdmVSZWxhdGl2ZSk7XG5cbiAgICBjYXNlICdzZWxlY3QnOiB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSByYXcuc3BsaXQoJywnKS5maWx0ZXIoKHZhbHVlKSA9PiB2YWx1ZSAhPT0gJycpO1xuXG4gICAgICByZXR1cm4gdmFsdWVzLmxlbmd0aCA/IHsgdmFsdWVzIH0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY2FzZSAna2V5d29yZCc6XG4gICAgICByZXR1cm4gcmF3LnRyaW0oKSA/IHsgdmFsdWU6IHJhdyB9IDogdW5kZWZpbmVkO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLy8gQSBncm91cCB2YWx1ZSBhcyBpdHMgVVJMIHBhcmFtLiBUaGUgc2hhcGUgc2F5cyBob3c6IGEgcHJlc2V0IG5hbWUsIHRoZW4gYVxuLy8gZGF0ZSByYW5nZSwgdGhlbiBzZWxlY3QgdmFsdWVzLCB0aGVuIGtleXdvcmQgdGV4dC4gbnVsbCAoYSBjbGVhcmVkIGdyb3VwKVxuLy8gaXMgdGhlIGVtcHR5IHBhcmFtLlxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZUZpbHRlclZhbHVlKHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCk6IHN0cmluZyB7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodmFsdWUucHJlc2V0KSB7XG4gICAgcmV0dXJuIHZhbHVlLnByZXNldDtcbiAgfVxuXG4gIGlmICh2YWx1ZS5zdGFydCB8fCB2YWx1ZS5lbmQpIHtcbiAgICByZXR1cm4gW2RhdGVCb3VuZFN0cmluZyh2YWx1ZS5zdGFydCkgPz8gJycsIGRhdGVCb3VuZFN0cmluZyh2YWx1ZS5lbmQpID8/ICcnXVxuICAgICAgLmpvaW4oREFURV9SQU5HRV9TRVBBUkFUT1IpO1xuICB9XG5cbiAgaWYgKHZhbHVlLnZhbHVlcykge1xuICAgIHJldHVybiB2YWx1ZS52YWx1ZXMubWFwKChpdGVtKSA9PiBTdHJpbmcoaXRlbSkpLmpvaW4oJywnKTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZS52YWx1ZSA/PyAnJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVNvcnQoc29ydDogUmVwb3J0U29ydCk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtzb3J0LmRpcmVjdGlvbiA9PT0gJ2Rlc2MnID8gJy0nIDogJyd9JHtzb3J0LmNvbHVtbn1gO1xufVxuXG4vLyBBIGxpc3Qgc29ydCByZWFkIGJhY2sgZnJvbSBpdHMgVVJMIHBhcmFtLCBvciBudWxsIHdoZW4gaXQgbmFtZXMgbm8gY29sdW1uLlxuLy8gV2hldGhlciB0aGUgY29sdW1uIGlzIG9uZSB0aGUgbGlzdCBjYW4gc29ydCBieSBpcyB0aGUgY2FsbGVyJ3MgY2hlY2suXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlU29ydChyYXc6IHN0cmluZyk6IFJlcG9ydFNvcnQgfCBudWxsIHtcbiAgY29uc3QgZGVzY2VuZGluZyA9IHJhdy5zdGFydHNXaXRoKCctJyk7XG4gIGNvbnN0IGNvbHVtbiA9IGRlc2NlbmRpbmcgPyByYXcuc2xpY2UoMSkgOiByYXc7XG5cbiAgcmV0dXJuIGNvbHVtblxuICAgID8geyBjb2x1bW4sIGRpcmVjdGlvbjogZGVzY2VuZGluZyA/ICdkZXNjJyA6ICdhc2MnIH1cbiAgICA6IG51bGw7XG59XG5cbi8vIFRoZSBxdWVyeSBwYXJhbXMgdGhhdCBtYWtlIHRoZSBVUkwgY2FycnkgYHNuYXBzaG90YDogZXZlcnkgc25hcHNob3Qga2V5IGlzXG4vLyBzZXQsIGFuZCBlYWNoIG93bmVkIGtleSAob3IgdGhlIGdyYWluKSB0aGF0IGBjdXJyZW50YCBjYXJyaWVzIGJ1dCB0aGVcbi8vIHNuYXBzaG90IGRvZXMgbm90IGlzIHNldCB0byBudWxsLCB3aGljaCByZW1vdmVzIGl0IHVuZGVyIHRoZSByb3V0ZXInc1xuLy8gJ21lcmdlJyBoYW5kbGluZy4gS2V5cyB0aGlzIGNvZGVjIGRvZXMgbm90IG93biBhcmUgbGVmdCBhbG9uZS5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFJlcG9ydFVybFBhcmFtcyhzbmFwc2hvdDogUmVwb3J0VXJsU25hcHNob3QsIGN1cnJlbnQ6IFBhcmFtTWFwKTogUGFyYW1zIHtcbiAgY29uc3QgcGFyYW1zOiBQYXJhbXMgPSB7fTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBjdXJyZW50LmtleXMpIHtcbiAgICBpZiAoT1dORURfUEFSQU0udGVzdChrZXkpIHx8IGtleSA9PT0gR1JPVVBfQllfSVRFTSkge1xuICAgICAgcGFyYW1zW2tleV0gPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHNuYXBzaG90Lmdyb3Vwcy5mb3JFYWNoKCh2YWx1ZSwgZ3JvdXBJZCkgPT4ge1xuICAgIHBhcmFtc1tncm91cEl0ZW1OYW1lKHsgaWQ6IGdyb3VwSWQgfSldID0gZW5jb2RlRmlsdGVyVmFsdWUodmFsdWUpO1xuICB9KTtcblxuICBzbmFwc2hvdC5saXN0U29ydHMuZm9yRWFjaCgoc29ydCwgY29tcG9uZW50SWQpID0+IHtcbiAgICBwYXJhbXNbYCR7TElTVF9TT1JUX1BBUkFNX1BSRUZJWH0ke2NvbXBvbmVudElkfWBdID0gZW5jb2RlU29ydChzb3J0KTtcbiAgfSk7XG5cbiAgaWYgKHNuYXBzaG90LmZyZXF1ZW5jeSkge1xuICAgIHBhcmFtc1tHUk9VUF9CWV9JVEVNXSA9IHNuYXBzaG90LmZyZXF1ZW5jeTtcbiAgfVxuXG4gIHJldHVybiBwYXJhbXM7XG59XG5cbi8vICdZWVlZLU1NLURELi5ZWVlZLU1NLUREJywgZWl0aGVyIHNpZGUgb3B0aW9uYWwgYnV0IG5vdCBib3RoLiBFYWNoIHNpZGUgbXVzdFxuLy8gYmUgYSByZWFsIGNhbGVuZGFyIGRheS5cbmZ1bmN0aW9uIGRlY29kZUZpeGVkUmFuZ2UocmF3OiBzdHJpbmcpOiBGaWx0ZXJHcm91cFZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc2lkZXMgPSByYXcuc3BsaXQoREFURV9SQU5HRV9TRVBBUkFUT1IpO1xuICBpZiAoc2lkZXMubGVuZ3RoICE9PSAyIHx8ICghc2lkZXNbMF0gJiYgIXNpZGVzWzFdKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBbc3RhcnQsIGVuZF0gPSBzaWRlcy5tYXAoKHNpZGUpID0+IHNpZGUgPyBkZWNvZGVEYXkoc2lkZSkgOiBudWxsKTtcbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQgfHwgZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xufVxuXG4vLyBPbmUgc2lkZSBvZiBhIGZpeGVkIHJhbmdlIGFzIGEgbG9jYWwgRGF0ZSwgb3IgdW5kZWZpbmVkIHdoZW4gaXQgaXMgbm90IGFcbi8vIHJlYWwgWS1NLUQgZGF5LlxuZnVuY3Rpb24gZGVjb2RlRGF5KHNpZGU6IHN0cmluZyk6IERhdGUgfCB1bmRlZmluZWQge1xuICByZXR1cm4gREFZX1BBVFRFUk4udGVzdChzaWRlKSA/IChkYXRlRnJvbUJvdW5kKHNpZGUpID8/IHVuZGVmaW5lZCkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGRlY29kZVByZXNldChcbiAgbmFtZTogc3RyaW5nLFxuICByZXNvbHZlUmVsYXRpdmU6IChuYW1lOiBzdHJpbmcpID0+IHsgc3RhcnQ6IERhdGU7IGVuZDogRGF0ZSB9IHwgbnVsbCxcbik6IEZpbHRlckdyb3VwVmFsdWUgfCB1bmRlZmluZWQge1xuICBjb25zdCByYW5nZSA9IHJlc29sdmVSZWxhdGl2ZShuYW1lKTtcblxuICByZXR1cm4gcmFuZ2UgPyB7IHN0YXJ0OiByYW5nZS5zdGFydCwgZW5kOiByYW5nZS5lbmQsIHByZXNldDogbmFtZSB9IDogdW5kZWZpbmVkO1xufVxuIl19