@firestitch/report 18.6.1 → 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 (97) hide show
  1. package/app/reports/components/component-chart/component-chart.component.d.ts +6 -7
  2. package/app/reports/components/component-kpi/component-kpi.component.d.ts +17 -9
  3. package/app/reports/components/component-kpi/components/sparkline/sparkline.component.d.ts +8 -0
  4. package/app/reports/components/component-list/component-list.component.d.ts +39 -10
  5. package/app/reports/components/component-note/component-note.component.d.ts +12 -0
  6. package/app/reports/components/report-canvas/report-canvas.component.d.ts +0 -10
  7. package/app/reports/components/report-component/report-component.component.d.ts +5 -12
  8. package/app/reports/data/report.data.d.ts +2 -3
  9. package/app/reports/dialogs/component-settings/component-settings.component.d.ts +34 -2
  10. package/app/reports/dialogs/list-columns/list-columns.component.d.ts +23 -0
  11. package/app/reports/dialogs/report-settings/report-locale-patch.d.ts +5 -0
  12. package/app/reports/dialogs/report-settings/report-settings.component.d.ts +20 -2
  13. package/app/reports/enums/report-change-polarity.enum.d.ts +5 -0
  14. package/app/reports/enums/report-chart-color.enum.d.ts +12 -0
  15. package/app/reports/enums/report-chart-data-labels.enum.d.ts +6 -0
  16. package/app/reports/enums/report-chart-date-label.enum.d.ts +5 -0
  17. package/app/reports/enums/report-chart-line-style.enum.d.ts +5 -0
  18. package/app/reports/enums/report-chart-mark-stat.enum.d.ts +6 -0
  19. package/app/reports/enums/report-kpi-trend.enum.d.ts +5 -0
  20. package/app/reports/enums/report-list-column-format.enum.d.ts +6 -0
  21. package/app/reports/enums/report-number-units.enum.d.ts +6 -0
  22. package/app/reports/enums/report-value-format.enum.d.ts +5 -0
  23. package/app/reports/export/offscreen-chart.d.ts +2 -2
  24. package/app/reports/export/report-export-collector.service.d.ts +37 -8
  25. package/app/reports/export/report-pdf.service.d.ts +6 -0
  26. package/app/reports/export/report-pptx.service.d.ts +24 -0
  27. package/app/reports/format.d.ts +64 -3
  28. package/app/reports/interfaces/report-chat-viewer-filter.interface.d.ts +2 -0
  29. package/app/reports/interfaces/report.interface.d.ts +205 -14
  30. package/app/reports/kpi-card.d.ts +48 -0
  31. package/app/reports/layout.d.ts +0 -9
  32. package/app/reports/list-config.d.ts +16 -0
  33. package/app/reports/option-builder.d.ts +76 -9
  34. package/app/reports/output-notes.d.ts +14 -0
  35. package/app/reports/pipes/report-date.pipe.d.ts +2 -1
  36. package/app/reports/pipes/report-number.pipe.d.ts +8 -0
  37. package/app/reports/pipes/report-output.pipe.d.ts +10 -0
  38. package/app/reports/report-filter-items.d.ts +5 -2
  39. package/app/reports/report-url-state.d.ts +4 -0
  40. package/app/reports/services/report-filter-state.service.d.ts +27 -2
  41. package/app/reports/theme/palette.d.ts +6 -0
  42. package/app/reports/theme/typography.d.ts +2 -0
  43. package/esm2022/app/reports/components/component-chart/component-chart.component.mjs +23 -20
  44. package/esm2022/app/reports/components/component-kpi/component-kpi.component.mjs +56 -29
  45. package/esm2022/app/reports/components/component-kpi/components/sparkline/sparkline.component.mjs +19 -0
  46. package/esm2022/app/reports/components/component-list/component-list.component.mjs +218 -32
  47. package/esm2022/app/reports/components/component-note/component-note.component.mjs +30 -0
  48. package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +7 -61
  49. package/esm2022/app/reports/components/report-component/report-component.component.mjs +99 -100
  50. package/esm2022/app/reports/data/report.data.mjs +20 -7
  51. package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +133 -13
  52. package/esm2022/app/reports/dialogs/list-columns/list-columns.component.mjs +56 -0
  53. package/esm2022/app/reports/dialogs/report-settings/report-locale-patch.mjs +13 -0
  54. package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +138 -20
  55. package/esm2022/app/reports/enums/report-change-polarity.enum.mjs +11 -0
  56. package/esm2022/app/reports/enums/report-chart-color.enum.mjs +19 -0
  57. package/esm2022/app/reports/enums/report-chart-data-labels.enum.mjs +13 -0
  58. package/esm2022/app/reports/enums/report-chart-date-label.enum.mjs +13 -0
  59. package/esm2022/app/reports/enums/report-chart-line-style.enum.mjs +12 -0
  60. package/esm2022/app/reports/enums/report-chart-mark-stat.enum.mjs +12 -0
  61. package/esm2022/app/reports/enums/report-kpi-trend.enum.mjs +10 -0
  62. package/esm2022/app/reports/enums/report-list-column-format.enum.mjs +14 -0
  63. package/esm2022/app/reports/enums/report-number-units.enum.mjs +14 -0
  64. package/esm2022/app/reports/enums/report-value-format.enum.mjs +13 -0
  65. package/esm2022/app/reports/export/offscreen-chart.mjs +5 -4
  66. package/esm2022/app/reports/export/report-export-collector.service.mjs +186 -40
  67. package/esm2022/app/reports/export/report-pdf.service.mjs +332 -67
  68. package/esm2022/app/reports/export/report-pptx.service.mjs +765 -106
  69. package/esm2022/app/reports/format.mjs +917 -57
  70. package/esm2022/app/reports/interfaces/report-chat-viewer-filter.interface.mjs +1 -1
  71. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  72. package/esm2022/app/reports/kpi-card.mjs +174 -0
  73. package/esm2022/app/reports/layout.mjs +1 -46
  74. package/esm2022/app/reports/list-config.mjs +106 -0
  75. package/esm2022/app/reports/option-builder.mjs +1457 -117
  76. package/esm2022/app/reports/output-notes.mjs +158 -0
  77. package/esm2022/app/reports/pipes/report-date.pipe.mjs +7 -6
  78. package/esm2022/app/reports/pipes/report-number.pipe.mjs +25 -0
  79. package/esm2022/app/reports/pipes/report-output.pipe.mjs +28 -0
  80. package/esm2022/app/reports/report-filter-items.mjs +28 -3
  81. package/esm2022/app/reports/report-url-state.mjs +56 -15
  82. package/esm2022/app/reports/services/report-filter-state.service.mjs +274 -22
  83. package/esm2022/app/reports/theme/echarts.mjs +8 -2
  84. package/esm2022/app/reports/theme/palette.mjs +35 -1
  85. package/esm2022/app/reports/theme/typography.mjs +8 -1
  86. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +2 -2
  87. package/esm2022/app/reports/views/report/report.component.mjs +3 -4
  88. package/esm2022/public_api.mjs +10 -1
  89. package/fesm2022/{firestitch-report-echarts-Djtmaxj1.mjs → firestitch-report-echarts-qCBE3LqM.mjs} +9 -3
  90. package/fesm2022/firestitch-report-echarts-qCBE3LqM.mjs.map +1 -0
  91. package/fesm2022/{firestitch-report-firestitch-report-D3zseBZc.mjs → firestitch-report-firestitch-report-DbsWbE-j.mjs} +5523 -875
  92. package/fesm2022/firestitch-report-firestitch-report-DbsWbE-j.mjs.map +1 -0
  93. package/fesm2022/firestitch-report.mjs +1 -1
  94. package/package.json +1 -1
  95. package/public_api.d.ts +9 -0
  96. package/fesm2022/firestitch-report-echarts-Djtmaxj1.mjs.map +0 -1
  97. package/fesm2022/firestitch-report-firestitch-report-D3zseBZc.mjs.map +0 -1
@@ -4,13 +4,15 @@ import { GROUP_BY_ITEM, GROUP_PARAM_PREFIX, dateBoundString, dateFromBound, grou
4
4
  // that differ from the authored defaults) and checks what is read back against
5
5
  // the report; this file only turns values into query params and back.
6
6
  //
7
- // ?page=7&groupBy=week&g12=last30Days&g15=3,5&g16=2026-01-01..&s31=-create_date
7
+ // ?page=7&groupBy=week&g12=last30Days&g15=3,5&g16=2026-01-01..&s31=-create_date&q31=north&h31=notes,total
8
8
  //
9
9
  // - g<groupId>: one key per filter group. A dateRange is its relative preset
10
10
  // name when it carries one, else 'YYYY-MM-DD..YYYY-MM-DD' (either side may be
11
11
  // empty); a select is its values joined by ','; a keyword is its text. An
12
12
  // empty value is an explicit clear of a group that has a default.
13
13
  // - s<componentId>: a list's sort column, '-' prefixed when descending.
14
+ // - q<componentId>: the text in a list's search box.
15
+ // - h<componentId>: the columns a viewer hid on a list (encodeColumnList).
14
16
  // - groupBy: the group-by grain (GROUP_BY_ITEM).
15
17
  // The page key is the host's (FsAiReportComponent.pageQueryParam) and is
16
18
  // written beside these, never by this codec.
@@ -22,29 +24,61 @@ export { GROUP_PARAM_PREFIX } from './report-filter-items';
22
24
  export const LIST_SORT_PARAM_PREFIX = 's';
23
25
  // Between the two days of an encoded fixed date range.
24
26
  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+$`);
27
+ // The prefix of a list's search key.
28
+ export const LIST_SEARCH_PARAM_PREFIX = 'q';
29
+ // The prefix of a list's hidden-columns key.
30
+ export const LIST_HIDDEN_PARAM_PREFIX = 'h';
31
+ // The prefixes of the keys this codec owns, each followed by an id.
32
+ const OWNED_PREFIXES = [
33
+ GROUP_PARAM_PREFIX, LIST_SORT_PARAM_PREFIX, LIST_SEARCH_PARAM_PREFIX, LIST_HIDDEN_PARAM_PREFIX,
34
+ ];
35
+ // A key this codec owns: a group value, or a list's sort, search or hidden
36
+ // columns. Any such key the snapshot no longer carries is removed from the
37
+ // URL, so a host must not keep its own state under a key of this shape (one
38
+ // of the prefixes above, then digits).
39
+ export const OWNED_PARAM = new RegExp(`^[${OWNED_PREFIXES.join('')}]\\d+$`);
28
40
  const DAY_PATTERN = /^\d{4}-\d{2}-\d{2}$/;
29
41
  // The viewer-state params of a URL as raw strings. Keys this codec does not
30
42
  // own are ignored.
31
43
  export function readReportUrlParams(params) {
32
44
  const groups = new Map();
33
45
  const listSorts = new Map();
46
+ const listSearches = new Map();
47
+ const listHidden = new Map();
48
+ // Each owned prefix names the map its keys go to; a prefix with no entry
49
+ // here is never read as some other kind of state.
50
+ const byPrefix = {
51
+ [GROUP_PARAM_PREFIX]: groups,
52
+ [LIST_SORT_PARAM_PREFIX]: listSorts,
53
+ [LIST_SEARCH_PARAM_PREFIX]: listSearches,
54
+ [LIST_HIDDEN_PARAM_PREFIX]: listHidden,
55
+ };
34
56
  for (const key of params.keys) {
35
- if (!OWNED_PARAM.test(key)) {
36
- continue;
57
+ if (OWNED_PARAM.test(key)) {
58
+ byPrefix[key.charAt(0)]?.set(Number(key.slice(1)), params.get(key) ?? '');
37
59
  }
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);
60
+ }
61
+ return { groups, listSorts, listSearches, listHidden, groupBy: params.get(GROUP_BY_ITEM) };
62
+ }
63
+ // A list's hidden column names as one param value. A name is a query's output
64
+ // alias, which can hold a comma, so each is percent-encoded before the join.
65
+ export function encodeColumnList(names) {
66
+ return names.map((name) => encodeURIComponent(name)).join(',');
67
+ }
68
+ // The column names of a hidden-columns param, in its order. Empty items are
69
+ // dropped, and an item that does not decode (a hand-edited '%') is kept as
70
+ // written. Whether a name is a column of the list is the caller's check.
71
+ export function decodeColumnList(raw) {
72
+ return raw.split(',')
73
+ .filter((item) => item !== '')
74
+ .map((item) => {
75
+ try {
76
+ return decodeURIComponent(item);
42
77
  }
43
- else {
44
- listSorts.set(id, raw);
78
+ catch {
79
+ return item;
45
80
  }
46
- }
47
- return { groups, listSorts, groupBy: params.get(GROUP_BY_ITEM) };
81
+ });
48
82
  }
49
83
  // A group value read back from its URL param. null is an explicit clear (an
50
84
  // empty param). undefined means the param is unusable for a group of this type
@@ -118,6 +152,13 @@ export function buildReportUrlParams(snapshot, current) {
118
152
  snapshot.listSorts.forEach((sort, componentId) => {
119
153
  params[`${LIST_SORT_PARAM_PREFIX}${componentId}`] = encodeSort(sort);
120
154
  });
155
+ // The text as typed: the router percent-encodes it in the URL.
156
+ snapshot.listSearches.forEach((search, componentId) => {
157
+ params[`${LIST_SEARCH_PARAM_PREFIX}${componentId}`] = search;
158
+ });
159
+ snapshot.listHidden.forEach((names, componentId) => {
160
+ params[`${LIST_HIDDEN_PARAM_PREFIX}${componentId}`] = encodeColumnList(names);
161
+ });
121
162
  if (snapshot.frequency) {
122
163
  params[GROUP_BY_ITEM] = snapshot.frequency;
123
164
  }
@@ -145,4 +186,4 @@ function decodePreset(name, resolveRelative) {
145
186
  const range = resolveRelative(name);
146
187
  return range ? { start: range.start, end: range.end, preset: name } : undefined;
147
188
  }
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
189
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXVybC1zdGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9yZXBvcnQtdXJsLXN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBLE9BQU8sRUFDTCxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxhQUFhLEdBQ2pGLE1BQU0sdUJBQXVCLENBQUM7QUFHL0IsNkVBQTZFO0FBQzdFLCtFQUErRTtBQUMvRSwrRUFBK0U7QUFDL0Usc0VBQXNFO0FBQ3RFLEVBQUU7QUFDRiw0R0FBNEc7QUFDNUcsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSxnRkFBZ0Y7QUFDaEYsNEVBQTRFO0FBQzVFLG9FQUFvRTtBQUNwRSx3RUFBd0U7QUFDeEUscURBQXFEO0FBQ3JELDJFQUEyRTtBQUMzRSxpREFBaUQ7QUFDakQseUVBQXlFO0FBQ3pFLDZDQUE2QztBQUU3Qyw2RUFBNkU7QUFDN0UsOEVBQThFO0FBQzlFLHNFQUFzRTtBQUN0RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUzRCxtQ0FBbUM7QUFDbkMsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsR0FBRyxDQUFDO0FBRTFDLHVEQUF1RDtBQUN2RCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUM7QUFFekMscUNBQXFDO0FBQ3JDLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLEdBQUcsQ0FBQztBQUU1Qyw2Q0FBNkM7QUFDN0MsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsR0FBRyxDQUFDO0FBRTVDLG9FQUFvRTtBQUNwRSxNQUFNLGNBQWMsR0FBRztJQUNyQixrQkFBa0IsRUFBRSxzQkFBc0IsRUFBRSx3QkFBd0IsRUFBRSx3QkFBd0I7Q0FDL0YsQ0FBQztBQUVGLDJFQUEyRTtBQUMzRSwyRUFBMkU7QUFDM0UsNEVBQTRFO0FBQzVFLHVDQUF1QztBQUN2QyxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxNQUFNLENBQUMsS0FBSyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUU1RSxNQUFNLFdBQVcsR0FBRyxxQkFBcUIsQ0FBQztBQUUxQyw0RUFBNEU7QUFDNUUsbUJBQW1CO0FBQ25CLE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxNQUFnQjtJQUNsRCxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUN6QyxNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUM1QyxNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUMvQyxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUM3Qyx5RUFBeUU7SUFDekUsa0RBQWtEO0lBQ2xELE1BQU0sUUFBUSxHQUF3QztRQUNwRCxDQUFDLGtCQUFrQixDQUFDLEVBQUUsTUFBTTtRQUM1QixDQUFDLHNCQUFzQixDQUFDLEVBQUUsU0FBUztRQUNuQyxDQUFDLHdCQUF3QixDQUFDLEVBQUUsWUFBWTtRQUN4QyxDQUFDLHdCQUF3QixDQUFDLEVBQUUsVUFBVTtLQUN2QyxDQUFDO0lBRUYsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDOUIsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDMUIsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO0FBQzdGLENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsNkVBQTZFO0FBQzdFLE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxLQUF3QjtJQUN2RCxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFFRCw0RUFBNEU7QUFDNUUsMkVBQTJFO0FBQzNFLHlFQUF5RTtBQUN6RSxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsR0FBVztJQUMxQyxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1NBQ2xCLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQztTQUM3QixHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUNaLElBQUksQ0FBQztZQUNILE9BQU8sa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUVELDRFQUE0RTtBQUM1RSwrRUFBK0U7QUFDL0UsMkVBQTJFO0FBQzNFLCtFQUErRTtBQUMvRSwyQkFBMkI7QUFDM0IsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixJQUFzQixFQUN0QixHQUFXLEVBQ1gsZUFBb0U7SUFFcEUsSUFBSSxHQUFHLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDZixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxRQUFRLElBQUksRUFBRSxDQUFDO1FBQ2IsS0FBSyxXQUFXO1lBQ2QsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDO2dCQUN2QyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDO2dCQUN2QixDQUFDLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUV6QyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDZCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBRTlELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ2hELENBQUM7UUFFRCxLQUFLLFNBQVM7WUFDWixPQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUVqRDtZQUNFLE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7QUFDSCxDQUFDO0FBRUQsNEVBQTRFO0FBQzVFLDRFQUE0RTtBQUM1RSxzQkFBc0I7QUFDdEIsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEtBQThCO0lBQzlELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2pCLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBSSxLQUFLLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM3QixPQUFPLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsZUFBZSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDMUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2pCLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztBQUMzQixDQUFDO0FBRUQsTUFBTSxVQUFVLFVBQVUsQ0FBQyxJQUFnQjtJQUN6QyxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUNqRSxDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLHdFQUF3RTtBQUN4RSxNQUFNLFVBQVUsVUFBVSxDQUFDLEdBQVc7SUFDcEMsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN2QyxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUUvQyxPQUFPLE1BQU07UUFDWCxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUU7UUFDcEQsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNYLENBQUM7QUFFRCw2RUFBNkU7QUFDN0Usd0VBQXdFO0FBQ3hFLHdFQUF3RTtBQUN4RSxpRUFBaUU7QUFDakUsTUFBTSxVQUFVLG9CQUFvQixDQUFDLFFBQTJCLEVBQUUsT0FBaUI7SUFDakYsTUFBTSxNQUFNLEdBQVcsRUFBRSxDQUFDO0lBRTFCLEtBQUssTUFBTSxHQUFHLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQy9CLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEtBQUssYUFBYSxFQUFFLENBQUM7WUFDbkQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUNyQixDQUFDO0lBQ0gsQ0FBQztJQUVELFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO1FBQ3pDLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxHQUFHLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BFLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLEVBQUU7UUFDL0MsTUFBTSxDQUFDLEdBQUcsc0JBQXNCLEdBQUcsV0FBVyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkUsQ0FBQyxDQUFDLENBQUM7SUFFSCwrREFBK0Q7SUFDL0QsUUFBUSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLEVBQUU7UUFDcEQsTUFBTSxDQUFDLEdBQUcsd0JBQXdCLEdBQUcsV0FBVyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUM7SUFDL0QsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsRUFBRTtRQUNqRCxNQUFNLENBQUMsR0FBRyx3QkFBd0IsR0FBRyxXQUFXLEVBQUUsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hGLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDdkIsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUM7SUFDN0MsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsMEJBQTBCO0FBQzFCLFNBQVMsZ0JBQWdCLENBQUMsR0FBVztJQUNuQyxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDOUMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNuRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEUsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUM3QyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN4QixDQUFDO0FBRUQsMkVBQTJFO0FBQzNFLGtCQUFrQjtBQUNsQixTQUFTLFNBQVMsQ0FBQyxJQUFZO0lBQzdCLE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNqRixDQUFDO0FBRUQsU0FBUyxZQUFZLENBQ25CLElBQVksRUFDWixlQUFvRTtJQUVwRSxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFcEMsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDbEYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBhcmFtTWFwLCBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQge1xuICBGaWx0ZXJHcm91cFZhbHVlLCBSZXBvcnRGaWx0ZXJUeXBlLCBSZXBvcnRTb3J0LCBSZXBvcnRVcmxQYXJhbXMsIFJlcG9ydFVybFNuYXBzaG90LFxufSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBHUk9VUF9CWV9JVEVNLCBHUk9VUF9QQVJBTV9QUkVGSVgsIGRhdGVCb3VuZFN0cmluZywgZGF0ZUZyb21Cb3VuZCwgZ3JvdXBJdGVtTmFtZSxcbn0gZnJvbSAnLi9yZXBvcnQtZmlsdGVyLWl0ZW1zJztcblxuXG4vLyBUaGUgcmVwb3J0IHZpZXdlcidzIHN0YXRlIGluIGl0cyBVUkw6IGEgcHVyZSBjb2RlYywgd2l0aCBubyBrbm93bGVkZ2Ugb2YgYVxuLy8gbG9hZGVkIHJlcG9ydC4gUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIGRlY2lkZXMgV0hBVCBpcyBjYXJyaWVkIChvbmx5IHZhbHVlc1xuLy8gdGhhdCBkaWZmZXIgZnJvbSB0aGUgYXV0aG9yZWQgZGVmYXVsdHMpIGFuZCBjaGVja3Mgd2hhdCBpcyByZWFkIGJhY2sgYWdhaW5zdFxuLy8gdGhlIHJlcG9ydDsgdGhpcyBmaWxlIG9ubHkgdHVybnMgdmFsdWVzIGludG8gcXVlcnkgcGFyYW1zIGFuZCBiYWNrLlxuLy9cbi8vICAgP3BhZ2U9NyZncm91cEJ5PXdlZWsmZzEyPWxhc3QzMERheXMmZzE1PTMsNSZnMTY9MjAyNi0wMS0wMS4uJnMzMT0tY3JlYXRlX2RhdGUmcTMxPW5vcnRoJmgzMT1ub3Rlcyx0b3RhbFxuLy9cbi8vIC0gZzxncm91cElkPjogb25lIGtleSBwZXIgZmlsdGVyIGdyb3VwLiBBIGRhdGVSYW5nZSBpcyBpdHMgcmVsYXRpdmUgcHJlc2V0XG4vLyAgIG5hbWUgd2hlbiBpdCBjYXJyaWVzIG9uZSwgZWxzZSAnWVlZWS1NTS1ERC4uWVlZWS1NTS1ERCcgKGVpdGhlciBzaWRlIG1heSBiZVxuLy8gICBlbXB0eSk7IGEgc2VsZWN0IGlzIGl0cyB2YWx1ZXMgam9pbmVkIGJ5ICcsJzsgYSBrZXl3b3JkIGlzIGl0cyB0ZXh0LiBBblxuLy8gICBlbXB0eSB2YWx1ZSBpcyBhbiBleHBsaWNpdCBjbGVhciBvZiBhIGdyb3VwIHRoYXQgaGFzIGEgZGVmYXVsdC5cbi8vIC0gczxjb21wb25lbnRJZD46IGEgbGlzdCdzIHNvcnQgY29sdW1uLCAnLScgcHJlZml4ZWQgd2hlbiBkZXNjZW5kaW5nLlxuLy8gLSBxPGNvbXBvbmVudElkPjogdGhlIHRleHQgaW4gYSBsaXN0J3Mgc2VhcmNoIGJveC5cbi8vIC0gaDxjb21wb25lbnRJZD46IHRoZSBjb2x1bW5zIGEgdmlld2VyIGhpZCBvbiBhIGxpc3QgKGVuY29kZUNvbHVtbkxpc3QpLlxuLy8gLSBncm91cEJ5OiB0aGUgZ3JvdXAtYnkgZ3JhaW4gKEdST1VQX0JZX0lURU0pLlxuLy8gVGhlIHBhZ2Uga2V5IGlzIHRoZSBob3N0J3MgKEZzQWlSZXBvcnRDb21wb25lbnQucGFnZVF1ZXJ5UGFyYW0pIGFuZCBpc1xuLy8gd3JpdHRlbiBiZXNpZGUgdGhlc2UsIG5ldmVyIGJ5IHRoaXMgY29kZWMuXG5cbi8vIFRoZSBwcmVmaXggb2YgYSBncm91cCdzIHZhbHVlIGtleS4gRGVjbGFyZWQgYmVzaWRlIHRoZSBmaWx0ZXIgaXRlbXMsIHdoaWNoXG4vLyByZWFkIGl0IHRvbyAoZGVjbGFyaW5nIGl0IGhlcmUgd291bGQgbWFrZSB0aGUgdHdvIGZpbGVzIGltcG9ydCBlYWNoIG90aGVyKTtcbi8vIHJlLWV4cG9ydGVkIHNvIGV2ZXJ5IGNvZGVjIGNvbnN0YW50IGNhbiBiZSBpbXBvcnRlZCBmcm9tIHRoZSBjb2RlYy5cbmV4cG9ydCB7IEdST1VQX1BBUkFNX1BSRUZJWCB9IGZyb20gJy4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XG5cbi8vIFRoZSBwcmVmaXggb2YgYSBsaXN0J3Mgc29ydCBrZXkuXG5leHBvcnQgY29uc3QgTElTVF9TT1JUX1BBUkFNX1BSRUZJWCA9ICdzJztcblxuLy8gQmV0d2VlbiB0aGUgdHdvIGRheXMgb2YgYW4gZW5jb2RlZCBmaXhlZCBkYXRlIHJhbmdlLlxuZXhwb3J0IGNvbnN0IERBVEVfUkFOR0VfU0VQQVJBVE9SID0gJy4uJztcblxuLy8gVGhlIHByZWZpeCBvZiBhIGxpc3QncyBzZWFyY2gga2V5LlxuZXhwb3J0IGNvbnN0IExJU1RfU0VBUkNIX1BBUkFNX1BSRUZJWCA9ICdxJztcblxuLy8gVGhlIHByZWZpeCBvZiBhIGxpc3QncyBoaWRkZW4tY29sdW1ucyBrZXkuXG5leHBvcnQgY29uc3QgTElTVF9ISURERU5fUEFSQU1fUFJFRklYID0gJ2gnO1xuXG4vLyBUaGUgcHJlZml4ZXMgb2YgdGhlIGtleXMgdGhpcyBjb2RlYyBvd25zLCBlYWNoIGZvbGxvd2VkIGJ5IGFuIGlkLlxuY29uc3QgT1dORURfUFJFRklYRVMgPSBbXG4gIEdST1VQX1BBUkFNX1BSRUZJWCwgTElTVF9TT1JUX1BBUkFNX1BSRUZJWCwgTElTVF9TRUFSQ0hfUEFSQU1fUFJFRklYLCBMSVNUX0hJRERFTl9QQVJBTV9QUkVGSVgsXG5dO1xuXG4vLyBBIGtleSB0aGlzIGNvZGVjIG93bnM6IGEgZ3JvdXAgdmFsdWUsIG9yIGEgbGlzdCdzIHNvcnQsIHNlYXJjaCBvciBoaWRkZW5cbi8vIGNvbHVtbnMuIEFueSBzdWNoIGtleSB0aGUgc25hcHNob3Qgbm8gbG9uZ2VyIGNhcnJpZXMgaXMgcmVtb3ZlZCBmcm9tIHRoZVxuLy8gVVJMLCBzbyBhIGhvc3QgbXVzdCBub3Qga2VlcCBpdHMgb3duIHN0YXRlIHVuZGVyIGEga2V5IG9mIHRoaXMgc2hhcGUgKG9uZVxuLy8gb2YgdGhlIHByZWZpeGVzIGFib3ZlLCB0aGVuIGRpZ2l0cykuXG5leHBvcnQgY29uc3QgT1dORURfUEFSQU0gPSBuZXcgUmVnRXhwKGBeWyR7T1dORURfUFJFRklYRVMuam9pbignJyl9XVxcXFxkKyRgKTtcblxuY29uc3QgREFZX1BBVFRFUk4gPSAvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9JC87XG5cbi8vIFRoZSB2aWV3ZXItc3RhdGUgcGFyYW1zIG9mIGEgVVJMIGFzIHJhdyBzdHJpbmdzLiBLZXlzIHRoaXMgY29kZWMgZG9lcyBub3Rcbi8vIG93biBhcmUgaWdub3JlZC5cbmV4cG9ydCBmdW5jdGlvbiByZWFkUmVwb3J0VXJsUGFyYW1zKHBhcmFtczogUGFyYW1NYXApOiBSZXBvcnRVcmxQYXJhbXMge1xuICBjb25zdCBncm91cHMgPSBuZXcgTWFwPG51bWJlciwgc3RyaW5nPigpO1xuICBjb25zdCBsaXN0U29ydHMgPSBuZXcgTWFwPG51bWJlciwgc3RyaW5nPigpO1xuICBjb25zdCBsaXN0U2VhcmNoZXMgPSBuZXcgTWFwPG51bWJlciwgc3RyaW5nPigpO1xuICBjb25zdCBsaXN0SGlkZGVuID0gbmV3IE1hcDxudW1iZXIsIHN0cmluZz4oKTtcbiAgLy8gRWFjaCBvd25lZCBwcmVmaXggbmFtZXMgdGhlIG1hcCBpdHMga2V5cyBnbyB0bzsgYSBwcmVmaXggd2l0aCBubyBlbnRyeVxuICAvLyBoZXJlIGlzIG5ldmVyIHJlYWQgYXMgc29tZSBvdGhlciBraW5kIG9mIHN0YXRlLlxuICBjb25zdCBieVByZWZpeDogUmVjb3JkPHN0cmluZywgTWFwPG51bWJlciwgc3RyaW5nPj4gPSB7XG4gICAgW0dST1VQX1BBUkFNX1BSRUZJWF06IGdyb3VwcyxcbiAgICBbTElTVF9TT1JUX1BBUkFNX1BSRUZJWF06IGxpc3RTb3J0cyxcbiAgICBbTElTVF9TRUFSQ0hfUEFSQU1fUFJFRklYXTogbGlzdFNlYXJjaGVzLFxuICAgIFtMSVNUX0hJRERFTl9QQVJBTV9QUkVGSVhdOiBsaXN0SGlkZGVuLFxuICB9O1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIHBhcmFtcy5rZXlzKSB7XG4gICAgaWYgKE9XTkVEX1BBUkFNLnRlc3Qoa2V5KSkge1xuICAgICAgYnlQcmVmaXhba2V5LmNoYXJBdCgwKV0/LnNldChOdW1iZXIoa2V5LnNsaWNlKDEpKSwgcGFyYW1zLmdldChrZXkpID8/ICcnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBncm91cHMsIGxpc3RTb3J0cywgbGlzdFNlYXJjaGVzLCBsaXN0SGlkZGVuLCBncm91cEJ5OiBwYXJhbXMuZ2V0KEdST1VQX0JZX0lURU0pIH07XG59XG5cbi8vIEEgbGlzdCdzIGhpZGRlbiBjb2x1bW4gbmFtZXMgYXMgb25lIHBhcmFtIHZhbHVlLiBBIG5hbWUgaXMgYSBxdWVyeSdzIG91dHB1dFxuLy8gYWxpYXMsIHdoaWNoIGNhbiBob2xkIGEgY29tbWEsIHNvIGVhY2ggaXMgcGVyY2VudC1lbmNvZGVkIGJlZm9yZSB0aGUgam9pbi5cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVDb2x1bW5MaXN0KG5hbWVzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBuYW1lcy5tYXAoKG5hbWUpID0+IGVuY29kZVVSSUNvbXBvbmVudChuYW1lKSkuam9pbignLCcpO1xufVxuXG4vLyBUaGUgY29sdW1uIG5hbWVzIG9mIGEgaGlkZGVuLWNvbHVtbnMgcGFyYW0sIGluIGl0cyBvcmRlci4gRW1wdHkgaXRlbXMgYXJlXG4vLyBkcm9wcGVkLCBhbmQgYW4gaXRlbSB0aGF0IGRvZXMgbm90IGRlY29kZSAoYSBoYW5kLWVkaXRlZCAnJScpIGlzIGtlcHQgYXNcbi8vIHdyaXR0ZW4uIFdoZXRoZXIgYSBuYW1lIGlzIGEgY29sdW1uIG9mIHRoZSBsaXN0IGlzIHRoZSBjYWxsZXIncyBjaGVjay5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVDb2x1bW5MaXN0KHJhdzogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gcmF3LnNwbGl0KCcsJylcbiAgICAuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSAnJylcbiAgICAubWFwKChpdGVtKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGl0ZW0pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgfVxuICAgIH0pO1xufVxuXG4vLyBBIGdyb3VwIHZhbHVlIHJlYWQgYmFjayBmcm9tIGl0cyBVUkwgcGFyYW0uIG51bGwgaXMgYW4gZXhwbGljaXQgY2xlYXIgKGFuXG4vLyBlbXB0eSBwYXJhbSkuIHVuZGVmaW5lZCBtZWFucyB0aGUgcGFyYW0gaXMgdW51c2FibGUgZm9yIGEgZ3JvdXAgb2YgdGhpcyB0eXBlXG4vLyAoYW4gdW5rbm93biBwcmVzZXQgbmFtZSwgYSBtYWxmb3JtZWQgZGF5LCBhIHdyb25nIHNoYXBlKSBhbmQgaXMgaWdub3JlZC5cbi8vIGByZXNvbHZlUmVsYXRpdmVgIHR1cm5zIGEgcHJlc2V0IG5hbWUgaW50byB0b2RheSdzIHJhbmdlIGZvciBpdCwgb3IgbnVsbCBmb3Jcbi8vIGEgbmFtZSBpdCBkb2VzIG5vdCBrbm93LlxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUZpbHRlclZhbHVlKFxuICB0eXBlOiBSZXBvcnRGaWx0ZXJUeXBlLFxuICByYXc6IHN0cmluZyxcbiAgcmVzb2x2ZVJlbGF0aXZlOiAobmFtZTogc3RyaW5nKSA9PiB7IHN0YXJ0OiBEYXRlOyBlbmQ6IERhdGUgfSB8IG51bGwsXG4pOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gIGlmIChyYXcgPT09ICcnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdkYXRlUmFuZ2UnOlxuICAgICAgcmV0dXJuIHJhdy5pbmNsdWRlcyhEQVRFX1JBTkdFX1NFUEFSQVRPUilcbiAgICAgICAgPyBkZWNvZGVGaXhlZFJhbmdlKHJhdylcbiAgICAgICAgOiBkZWNvZGVQcmVzZXQocmF3LCByZXNvbHZlUmVsYXRpdmUpO1xuXG4gICAgY2FzZSAnc2VsZWN0Jzoge1xuICAgICAgY29uc3QgdmFsdWVzID0gcmF3LnNwbGl0KCcsJykuZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUgIT09ICcnKTtcblxuICAgICAgcmV0dXJuIHZhbHVlcy5sZW5ndGggPyB7IHZhbHVlcyB9IDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNhc2UgJ2tleXdvcmQnOlxuICAgICAgcmV0dXJuIHJhdy50cmltKCkgPyB7IHZhbHVlOiByYXcgfSA6IHVuZGVmaW5lZDtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8vIEEgZ3JvdXAgdmFsdWUgYXMgaXRzIFVSTCBwYXJhbS4gVGhlIHNoYXBlIHNheXMgaG93OiBhIHByZXNldCBuYW1lLCB0aGVuIGFcbi8vIGRhdGUgcmFuZ2UsIHRoZW4gc2VsZWN0IHZhbHVlcywgdGhlbiBrZXl3b3JkIHRleHQuIG51bGwgKGEgY2xlYXJlZCBncm91cClcbi8vIGlzIHRoZSBlbXB0eSBwYXJhbS5cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVGaWx0ZXJWYWx1ZSh2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwpOiBzdHJpbmcge1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKHZhbHVlLnByZXNldCkge1xuICAgIHJldHVybiB2YWx1ZS5wcmVzZXQ7XG4gIH1cblxuICBpZiAodmFsdWUuc3RhcnQgfHwgdmFsdWUuZW5kKSB7XG4gICAgcmV0dXJuIFtkYXRlQm91bmRTdHJpbmcodmFsdWUuc3RhcnQpID8/ICcnLCBkYXRlQm91bmRTdHJpbmcodmFsdWUuZW5kKSA/PyAnJ11cbiAgICAgIC5qb2luKERBVEVfUkFOR0VfU0VQQVJBVE9SKTtcbiAgfVxuXG4gIGlmICh2YWx1ZS52YWx1ZXMpIHtcbiAgICByZXR1cm4gdmFsdWUudmFsdWVzLm1hcCgoaXRlbSkgPT4gU3RyaW5nKGl0ZW0pKS5qb2luKCcsJyk7XG4gIH1cblxuICByZXR1cm4gdmFsdWUudmFsdWUgPz8gJyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVTb3J0KHNvcnQ6IFJlcG9ydFNvcnQpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7c29ydC5kaXJlY3Rpb24gPT09ICdkZXNjJyA/ICctJyA6ICcnfSR7c29ydC5jb2x1bW59YDtcbn1cblxuLy8gQSBsaXN0IHNvcnQgcmVhZCBiYWNrIGZyb20gaXRzIFVSTCBwYXJhbSwgb3IgbnVsbCB3aGVuIGl0IG5hbWVzIG5vIGNvbHVtbi5cbi8vIFdoZXRoZXIgdGhlIGNvbHVtbiBpcyBvbmUgdGhlIGxpc3QgY2FuIHNvcnQgYnkgaXMgdGhlIGNhbGxlcidzIGNoZWNrLlxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVNvcnQocmF3OiBzdHJpbmcpOiBSZXBvcnRTb3J0IHwgbnVsbCB7XG4gIGNvbnN0IGRlc2NlbmRpbmcgPSByYXcuc3RhcnRzV2l0aCgnLScpO1xuICBjb25zdCBjb2x1bW4gPSBkZXNjZW5kaW5nID8gcmF3LnNsaWNlKDEpIDogcmF3O1xuXG4gIHJldHVybiBjb2x1bW5cbiAgICA/IHsgY29sdW1uLCBkaXJlY3Rpb246IGRlc2NlbmRpbmcgPyAnZGVzYycgOiAnYXNjJyB9XG4gICAgOiBudWxsO1xufVxuXG4vLyBUaGUgcXVlcnkgcGFyYW1zIHRoYXQgbWFrZSB0aGUgVVJMIGNhcnJ5IGBzbmFwc2hvdGA6IGV2ZXJ5IHNuYXBzaG90IGtleSBpc1xuLy8gc2V0LCBhbmQgZWFjaCBvd25lZCBrZXkgKG9yIHRoZSBncmFpbikgdGhhdCBgY3VycmVudGAgY2FycmllcyBidXQgdGhlXG4vLyBzbmFwc2hvdCBkb2VzIG5vdCBpcyBzZXQgdG8gbnVsbCwgd2hpY2ggcmVtb3ZlcyBpdCB1bmRlciB0aGUgcm91dGVyJ3Ncbi8vICdtZXJnZScgaGFuZGxpbmcuIEtleXMgdGhpcyBjb2RlYyBkb2VzIG5vdCBvd24gYXJlIGxlZnQgYWxvbmUuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRSZXBvcnRVcmxQYXJhbXMoc25hcHNob3Q6IFJlcG9ydFVybFNuYXBzaG90LCBjdXJyZW50OiBQYXJhbU1hcCk6IFBhcmFtcyB7XG4gIGNvbnN0IHBhcmFtczogUGFyYW1zID0ge307XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgY3VycmVudC5rZXlzKSB7XG4gICAgaWYgKE9XTkVEX1BBUkFNLnRlc3Qoa2V5KSB8fCBrZXkgPT09IEdST1VQX0JZX0lURU0pIHtcbiAgICAgIHBhcmFtc1trZXldID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBzbmFwc2hvdC5ncm91cHMuZm9yRWFjaCgodmFsdWUsIGdyb3VwSWQpID0+IHtcbiAgICBwYXJhbXNbZ3JvdXBJdGVtTmFtZSh7IGlkOiBncm91cElkIH0pXSA9IGVuY29kZUZpbHRlclZhbHVlKHZhbHVlKTtcbiAgfSk7XG5cbiAgc25hcHNob3QubGlzdFNvcnRzLmZvckVhY2goKHNvcnQsIGNvbXBvbmVudElkKSA9PiB7XG4gICAgcGFyYW1zW2Ake0xJU1RfU09SVF9QQVJBTV9QUkVGSVh9JHtjb21wb25lbnRJZH1gXSA9IGVuY29kZVNvcnQoc29ydCk7XG4gIH0pO1xuXG4gIC8vIFRoZSB0ZXh0IGFzIHR5cGVkOiB0aGUgcm91dGVyIHBlcmNlbnQtZW5jb2RlcyBpdCBpbiB0aGUgVVJMLlxuICBzbmFwc2hvdC5saXN0U2VhcmNoZXMuZm9yRWFjaCgoc2VhcmNoLCBjb21wb25lbnRJZCkgPT4ge1xuICAgIHBhcmFtc1tgJHtMSVNUX1NFQVJDSF9QQVJBTV9QUkVGSVh9JHtjb21wb25lbnRJZH1gXSA9IHNlYXJjaDtcbiAgfSk7XG5cbiAgc25hcHNob3QubGlzdEhpZGRlbi5mb3JFYWNoKChuYW1lcywgY29tcG9uZW50SWQpID0+IHtcbiAgICBwYXJhbXNbYCR7TElTVF9ISURERU5fUEFSQU1fUFJFRklYfSR7Y29tcG9uZW50SWR9YF0gPSBlbmNvZGVDb2x1bW5MaXN0KG5hbWVzKTtcbiAgfSk7XG5cbiAgaWYgKHNuYXBzaG90LmZyZXF1ZW5jeSkge1xuICAgIHBhcmFtc1tHUk9VUF9CWV9JVEVNXSA9IHNuYXBzaG90LmZyZXF1ZW5jeTtcbiAgfVxuXG4gIHJldHVybiBwYXJhbXM7XG59XG5cbi8vICdZWVlZLU1NLURELi5ZWVlZLU1NLUREJywgZWl0aGVyIHNpZGUgb3B0aW9uYWwgYnV0IG5vdCBib3RoLiBFYWNoIHNpZGUgbXVzdFxuLy8gYmUgYSByZWFsIGNhbGVuZGFyIGRheS5cbmZ1bmN0aW9uIGRlY29kZUZpeGVkUmFuZ2UocmF3OiBzdHJpbmcpOiBGaWx0ZXJHcm91cFZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc2lkZXMgPSByYXcuc3BsaXQoREFURV9SQU5HRV9TRVBBUkFUT1IpO1xuICBpZiAoc2lkZXMubGVuZ3RoICE9PSAyIHx8ICghc2lkZXNbMF0gJiYgIXNpZGVzWzFdKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBbc3RhcnQsIGVuZF0gPSBzaWRlcy5tYXAoKHNpZGUpID0+IHNpZGUgPyBkZWNvZGVEYXkoc2lkZSkgOiBudWxsKTtcbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQgfHwgZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xufVxuXG4vLyBPbmUgc2lkZSBvZiBhIGZpeGVkIHJhbmdlIGFzIGEgbG9jYWwgRGF0ZSwgb3IgdW5kZWZpbmVkIHdoZW4gaXQgaXMgbm90IGFcbi8vIHJlYWwgWS1NLUQgZGF5LlxuZnVuY3Rpb24gZGVjb2RlRGF5KHNpZGU6IHN0cmluZyk6IERhdGUgfCB1bmRlZmluZWQge1xuICByZXR1cm4gREFZX1BBVFRFUk4udGVzdChzaWRlKSA/IChkYXRlRnJvbUJvdW5kKHNpZGUpID8/IHVuZGVmaW5lZCkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGRlY29kZVByZXNldChcbiAgbmFtZTogc3RyaW5nLFxuICByZXNvbHZlUmVsYXRpdmU6IChuYW1lOiBzdHJpbmcpID0+IHsgc3RhcnQ6IERhdGU7IGVuZDogRGF0ZSB9IHwgbnVsbCxcbik6IEZpbHRlckdyb3VwVmFsdWUgfCB1bmRlZmluZWQge1xuICBjb25zdCByYW5nZSA9IHJlc29sdmVSZWxhdGl2ZShuYW1lKTtcblxuICByZXR1cm4gcmFuZ2UgPyB7IHN0YXJ0OiByYW5nZS5zdGFydCwgZW5kOiByYW5nZS5lbmQsIHByZXNldDogbmFtZSB9IDogdW5kZWZpbmVkO1xufVxuIl19