@firestitch/report 18.7.0 → 18.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/reports/components/component-kpi/component-kpi.component.d.ts +12 -3
- package/app/reports/components/component-kpi/components/sparkline/sparkline.component.d.ts +8 -0
- package/app/reports/components/component-list/component-list.component.d.ts +7 -1
- package/app/reports/components/component-note/component-note.component.d.ts +12 -0
- package/app/reports/components/report-canvas/report-canvas.component.d.ts +0 -9
- package/app/reports/components/report-component/report-component.component.d.ts +2 -11
- package/app/reports/data/report.data.d.ts +0 -2
- package/app/reports/dialogs/component-settings/component-settings.component.d.ts +34 -2
- package/app/reports/dialogs/report-settings/report-settings.component.d.ts +0 -1
- package/app/reports/enums/report-change-polarity.enum.d.ts +5 -0
- package/app/reports/enums/report-kpi-trend.enum.d.ts +5 -0
- package/app/reports/export/report-export-collector.service.d.ts +27 -1
- package/app/reports/export/report-pdf.service.d.ts +5 -0
- package/app/reports/export/report-pptx.service.d.ts +7 -0
- package/app/reports/format.d.ts +27 -1
- package/app/reports/interfaces/report-chat-viewer-filter.interface.d.ts +2 -0
- package/app/reports/interfaces/report.interface.d.ts +124 -4
- package/app/reports/kpi-card.d.ts +48 -0
- package/app/reports/layout.d.ts +0 -9
- package/app/reports/list-config.d.ts +8 -1
- package/app/reports/option-builder.d.ts +7 -0
- package/app/reports/output-notes.d.ts +14 -0
- package/app/reports/pipes/report-output.pipe.d.ts +10 -0
- package/app/reports/services/report-filter-state.service.d.ts +1 -0
- package/app/reports/theme/palette.d.ts +3 -0
- package/app/reports/theme/typography.d.ts +1 -0
- package/esm2022/app/reports/components/component-chart/component-chart.component.mjs +8 -4
- package/esm2022/app/reports/components/component-kpi/component-kpi.component.mjs +50 -17
- package/esm2022/app/reports/components/component-kpi/components/sparkline/sparkline.component.mjs +19 -0
- package/esm2022/app/reports/components/component-list/component-list.component.mjs +66 -6
- package/esm2022/app/reports/components/component-note/component-note.component.mjs +30 -0
- package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +7 -56
- package/esm2022/app/reports/components/report-component/report-component.component.mjs +21 -82
- package/esm2022/app/reports/data/report.data.mjs +5 -5
- package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +133 -13
- package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +4 -8
- package/esm2022/app/reports/enums/report-change-polarity.enum.mjs +11 -0
- package/esm2022/app/reports/enums/report-kpi-trend.enum.mjs +10 -0
- package/esm2022/app/reports/export/report-export-collector.service.mjs +101 -10
- package/esm2022/app/reports/export/report-pdf.service.mjs +249 -40
- package/esm2022/app/reports/export/report-pptx.service.mjs +312 -49
- package/esm2022/app/reports/format.mjs +423 -2
- package/esm2022/app/reports/interfaces/report-chat-viewer-filter.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
- package/esm2022/app/reports/kpi-card.mjs +174 -0
- package/esm2022/app/reports/layout.mjs +1 -46
- package/esm2022/app/reports/list-config.mjs +33 -1
- package/esm2022/app/reports/option-builder.mjs +624 -54
- package/esm2022/app/reports/output-notes.mjs +158 -0
- package/esm2022/app/reports/pipes/report-output.pipe.mjs +28 -0
- package/esm2022/app/reports/services/report-filter-state.service.mjs +40 -3
- package/esm2022/app/reports/theme/palette.mjs +17 -1
- package/esm2022/app/reports/theme/typography.mjs +5 -1
- package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +2 -2
- package/esm2022/app/reports/views/report/report.component.mjs +3 -4
- package/esm2022/public_api.mjs +2 -1
- package/fesm2022/{firestitch-report-echarts-u5ImuZT5.mjs → firestitch-report-echarts-qCBE3LqM.mjs} +2 -2
- package/fesm2022/{firestitch-report-echarts-u5ImuZT5.mjs.map → firestitch-report-echarts-qCBE3LqM.mjs.map} +1 -1
- package/fesm2022/{firestitch-report-firestitch-report-Cz-kA_id.mjs → firestitch-report-firestitch-report-DbsWbE-j.mjs} +2574 -487
- package/fesm2022/firestitch-report-firestitch-report-DbsWbE-j.mjs.map +1 -0
- package/fesm2022/firestitch-report.mjs +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +1 -0
- package/fesm2022/firestitch-report-firestitch-report-Cz-kA_id.mjs.map +0 -1
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { comparisonNoteText, comparisonOffsetLabel, formatDayWindow, kpiNoteText, windowNoteText, windowText, } from './format';
|
|
2
|
+
// Between the current window and each prior one on the windows line.
|
|
3
|
+
const WINDOWS_SEPARATOR = ' · ';
|
|
4
|
+
// Ranks and shares are computed after the viewer's filters, never before.
|
|
5
|
+
const FILTERED_ROWS_SENTENCE = 'Computed over the rows the filters keep.';
|
|
6
|
+
const ROLE_LEADS = {
|
|
7
|
+
current: 'Value',
|
|
8
|
+
prior: 'Prior value',
|
|
9
|
+
change: 'Change',
|
|
10
|
+
percent_change: 'Percent change',
|
|
11
|
+
};
|
|
12
|
+
// The note's lines, in order: the windows, then the comparison's notes and a
|
|
13
|
+
// KPI's delta note, then the windowed values' descriptions and notes. A line is never repeated (two
|
|
14
|
+
// windowed values often share a note). Empty when the data has none of the
|
|
15
|
+
// keys, or none of the parts asked for.
|
|
16
|
+
export function componentNoteLines(data, context, parts = {}) {
|
|
17
|
+
if (!data) {
|
|
18
|
+
return [];
|
|
19
|
+
}
|
|
20
|
+
const lines = [
|
|
21
|
+
parts.windows === false ? '' : componentWindowsLine(data, context),
|
|
22
|
+
...comparisonNotes(data.comparison),
|
|
23
|
+
kpiNote(data.kpi, data.comparison),
|
|
24
|
+
...(parts.windowDescriptions ? windowDescriptions(data, context.locale) : []),
|
|
25
|
+
...(parts.windowNotes === false ? [] : windowNotes(data, context.locale)),
|
|
26
|
+
];
|
|
27
|
+
return [...new Set(lines.filter((line) => !!line))];
|
|
28
|
+
}
|
|
29
|
+
// What one output column holds, for its header's tooltip: the windows a
|
|
30
|
+
// compared value covers, a rank's or a share's scope, and how a windowed value
|
|
31
|
+
// was computed. A cross-tab cell column reads its measure's meaning through
|
|
32
|
+
// cellMeasures. '' for a plain column.
|
|
33
|
+
export function outputColumnNote(column, data, locale) {
|
|
34
|
+
const alias = data?.cellMeasures?.[column] ?? column;
|
|
35
|
+
const output = data?.outputs?.[alias];
|
|
36
|
+
if (!output) {
|
|
37
|
+
return '';
|
|
38
|
+
}
|
|
39
|
+
return [
|
|
40
|
+
comparisonSentence(output, data.comparison, locale),
|
|
41
|
+
rankSentence(output),
|
|
42
|
+
shareSentence(output),
|
|
43
|
+
windowSentences(data.windows?.[alias], locale, data),
|
|
44
|
+
]
|
|
45
|
+
.filter((sentence) => !!sentence)
|
|
46
|
+
.join(' ');
|
|
47
|
+
}
|
|
48
|
+
// 'Sep 1 – 15, 2026 · vs previous month: Aug 1 – 15, 2026'. A comparison
|
|
49
|
+
// with no current window yet has no line (its no_window note says so); a
|
|
50
|
+
// component without a comparison shows its timeframe's days. '' when the data
|
|
51
|
+
// has neither. The note's first line, and the PDF and PowerPoint exports'
|
|
52
|
+
// subtitle under a chart's or a list's title.
|
|
53
|
+
export function componentWindowsLine(data, context) {
|
|
54
|
+
const comparison = data.comparison;
|
|
55
|
+
if (comparison) {
|
|
56
|
+
return comparison.current ? comparisonWindowsLine(comparison, comparison.current, context.locale) : '';
|
|
57
|
+
}
|
|
58
|
+
return data.timeframe ? formatDayWindow(data.timeframe, context.timezone, context.locale) : '';
|
|
59
|
+
}
|
|
60
|
+
function comparisonWindowsLine(comparison, currentWindow, locale) {
|
|
61
|
+
const current = formatDayWindow(currentWindow, comparison.timezone, locale);
|
|
62
|
+
const priors = (comparison.offsets ?? []).map((offset, index) => {
|
|
63
|
+
return priorWindowText(offset, comparison.priors?.[index], comparison.timezone, locale);
|
|
64
|
+
});
|
|
65
|
+
return [current, ...priors]
|
|
66
|
+
.filter((part) => !!part)
|
|
67
|
+
.join(WINDOWS_SEPARATOR);
|
|
68
|
+
}
|
|
69
|
+
// One prior lane: 'vs previous month: Aug 1 – 15, 2026', or its label alone
|
|
70
|
+
// when the server sends no window for it.
|
|
71
|
+
function priorWindowText(offset, prior, timezone, locale) {
|
|
72
|
+
const label = comparisonOffsetLabel(offset);
|
|
73
|
+
const days = prior ? formatDayWindow(prior, timezone, locale) : '';
|
|
74
|
+
return days ? `${label}: ${days}` : label;
|
|
75
|
+
}
|
|
76
|
+
function comparisonNotes(comparison) {
|
|
77
|
+
return (comparison?.notes ?? []).map((code) => comparisonNoteText(code, comparison));
|
|
78
|
+
}
|
|
79
|
+
// Why a KPI card's delta reads as it does ('No baseline: the previous period
|
|
80
|
+
// has no data.'), naming the baseline by what the first lane compares against.
|
|
81
|
+
function kpiNote(kpi, comparison) {
|
|
82
|
+
return kpi?.note ? kpiNoteText(kpi.note, comparison?.offsets?.[0]?.against) : '';
|
|
83
|
+
}
|
|
84
|
+
// One line per windowed value, named by its column when there are several.
|
|
85
|
+
function windowDescriptions(data, locale) {
|
|
86
|
+
const windows = Object.entries(data.windows ?? {});
|
|
87
|
+
return windows.map(([alias, meta]) => {
|
|
88
|
+
const text = windowText(meta, locale, data.granularity);
|
|
89
|
+
return windows.length > 1 ? `${alias}: ${text}` : text;
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
function windowNotes(data, locale) {
|
|
93
|
+
return Object.values(data.windows ?? {})
|
|
94
|
+
.flatMap((meta) => (meta.notes ?? []).map((code) => windowNoteText(code, meta, locale, data.granularity)));
|
|
95
|
+
}
|
|
96
|
+
// A compared column's windows. In range mode every row compares the same two
|
|
97
|
+
// windows, so they are named; in series and as-of modes each row compares its
|
|
98
|
+
// own period, so only the lane is.
|
|
99
|
+
function comparisonSentence(output, comparison, locale) {
|
|
100
|
+
if (!output.role || !comparison) {
|
|
101
|
+
return '';
|
|
102
|
+
}
|
|
103
|
+
const offset = comparison.offsets?.[(output.offset ?? 1) - 1] ?? null;
|
|
104
|
+
const current = comparison.current ? formatDayWindow(comparison.current, comparison.timezone, locale) : '';
|
|
105
|
+
const priorWindow = comparison.priors?.[(output.offset ?? 1) - 1];
|
|
106
|
+
const prior = priorWindow ? formatDayWindow(priorWindow, comparison.timezone, locale) : '';
|
|
107
|
+
if (comparison.mode === 'range' && current && (output.role === 'current' || prior)) {
|
|
108
|
+
return rangeSentence(output.role, current, prior, offset);
|
|
109
|
+
}
|
|
110
|
+
return output.role === 'current' || !offset ? '' : `${ROLE_LEADS[output.role]} ${comparisonOffsetLabel(offset)}.`;
|
|
111
|
+
}
|
|
112
|
+
function rangeSentence(role, current, prior, offset) {
|
|
113
|
+
switch (role) {
|
|
114
|
+
case 'current':
|
|
115
|
+
return `Value for ${current}.`;
|
|
116
|
+
case 'prior':
|
|
117
|
+
return offset ? `Prior value for ${prior} (${comparisonOffsetLabel(offset)}).` : `Prior value for ${prior}.`;
|
|
118
|
+
default:
|
|
119
|
+
return `${ROLE_LEADS[role]} from ${prior} to ${current}.`;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// 'Rank by Revenue, 1 being the largest, within each Region. Tied values share
|
|
123
|
+
// a rank (1, 1, 3).'
|
|
124
|
+
function rankSentence(output) {
|
|
125
|
+
const rank = output.kind === 'rank' ? output.rank : null;
|
|
126
|
+
if (!rank) {
|
|
127
|
+
return '';
|
|
128
|
+
}
|
|
129
|
+
const end = rank.direction === 'asc' ? 'smallest' : 'largest';
|
|
130
|
+
const scope = rank.within?.length ? `within each ${joinNames(rank.within)}` : 'across all rows';
|
|
131
|
+
const ties = rank.method === 'dense' ? '1, 1, 2' : '1, 1, 3';
|
|
132
|
+
return `Rank by ${output.measure}, 1 being the ${end}, ${scope}. Tied values share a rank (${ties}). `
|
|
133
|
+
+ FILTERED_ROWS_SENTENCE;
|
|
134
|
+
}
|
|
135
|
+
// 'Share of the total Revenue within each Region.'
|
|
136
|
+
function shareSentence(output) {
|
|
137
|
+
const share = output.kind === 'share' ? output.share : null;
|
|
138
|
+
if (!share) {
|
|
139
|
+
return '';
|
|
140
|
+
}
|
|
141
|
+
const scope = share.within?.length ? ` within each ${joinNames(share.within)}` : '';
|
|
142
|
+
return `Share of the total ${output.measure}${scope}. ${FILTERED_ROWS_SENTENCE}`;
|
|
143
|
+
}
|
|
144
|
+
// A windowed column: what it is, then why it reads as it does.
|
|
145
|
+
function windowSentences(meta, locale, data) {
|
|
146
|
+
if (!meta) {
|
|
147
|
+
return '';
|
|
148
|
+
}
|
|
149
|
+
const notes = (meta.notes ?? []).map((code) => windowNoteText(code, meta, locale, data.granularity));
|
|
150
|
+
return [`${windowText(meta, locale, data.granularity)}.`, ...notes].join(' ');
|
|
151
|
+
}
|
|
152
|
+
// 'Region', 'Region and Channel', 'Region, Channel and Plan'.
|
|
153
|
+
function joinNames(names) {
|
|
154
|
+
return names.length > 1
|
|
155
|
+
? `${names.slice(0, -1).join(', ')} and ${names[names.length - 1]}`
|
|
156
|
+
: names.join('');
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0LW5vdGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL291dHB1dC1ub3Rlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLHFCQUFxQixFQUNyQixlQUFlLEVBQ2YsV0FBVyxFQUNYLGNBQWMsRUFDZCxVQUFVLEdBQ1gsTUFBTSxVQUFVLENBQUM7QUE4Q2xCLHFFQUFxRTtBQUNyRSxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQztBQUVoQywwRUFBMEU7QUFDMUUsTUFBTSxzQkFBc0IsR0FBRywwQ0FBMEMsQ0FBQztBQUUxRSxNQUFNLFVBQVUsR0FBK0I7SUFDN0MsT0FBTyxFQUFFLE9BQU87SUFDaEIsS0FBSyxFQUFFLGFBQWE7SUFDcEIsTUFBTSxFQUFFLFFBQVE7SUFDaEIsY0FBYyxFQUFFLGdCQUFnQjtDQUNqQyxDQUFDO0FBRUYsNkVBQTZFO0FBQzdFLG9HQUFvRztBQUNwRywyRUFBMkU7QUFDM0Usd0NBQXdDO0FBQ3hDLE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsSUFBMEMsRUFDMUMsT0FBNkIsRUFDN0IsUUFBNEIsRUFBRTtJQUU5QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRztRQUNaLEtBQUssQ0FBQyxPQUFPLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxPQUFPLENBQUM7UUFDbEUsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNuQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ2xDLEdBQUcsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3RSxHQUFHLENBQUMsS0FBSyxDQUFDLFdBQVcsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDMUUsQ0FBQztJQUVGLE9BQU8sQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUVELHdFQUF3RTtBQUN4RSwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLHVDQUF1QztBQUN2QyxNQUFNLFVBQVUsZ0JBQWdCLENBQzlCLE1BQWMsRUFDZCxJQUEwQyxFQUMxQyxNQUF1QjtJQUV2QixNQUFNLEtBQUssR0FBRyxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDO0lBQ3JELE1BQU0sTUFBTSxHQUFHLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV0QyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxPQUFPO1FBQ0wsa0JBQWtCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDO1FBQ25ELFlBQVksQ0FBQyxNQUFNLENBQUM7UUFDcEIsYUFBYSxDQUFDLE1BQU0sQ0FBQztRQUNyQixlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUM7S0FDckQ7U0FDRSxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7U0FDaEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2YsQ0FBQztBQUVELHlFQUF5RTtBQUN6RSx5RUFBeUU7QUFDekUsOEVBQThFO0FBQzlFLDBFQUEwRTtBQUMxRSw4Q0FBOEM7QUFDOUMsTUFBTSxVQUFVLG9CQUFvQixDQUFDLElBQXVCLEVBQUUsT0FBNkI7SUFDekYsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUVuQyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2YsT0FBTyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUN6RyxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pHLENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUM1QixVQUErQixFQUMvQixhQUErQixFQUMvQixNQUF1QjtJQUV2QixNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsYUFBYSxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDNUUsTUFBTSxNQUFNLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUM5RCxPQUFPLGVBQWUsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDMUYsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUcsTUFBTSxDQUFDO1NBQ3hCLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztTQUN4QixJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUM3QixDQUFDO0FBRUQsNEVBQTRFO0FBQzVFLDBDQUEwQztBQUMxQyxTQUFTLGVBQWUsQ0FDdEIsTUFBd0IsRUFDeEIsS0FBbUMsRUFDbkMsUUFBZ0IsRUFDaEIsTUFBdUI7SUFFdkIsTUFBTSxLQUFLLEdBQUcscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBRW5FLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQzVDLENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FBQyxVQUFrRDtJQUN6RSxPQUFPLENBQUMsVUFBVSxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO0FBQ3ZGLENBQUM7QUFFRCw2RUFBNkU7QUFDN0UsK0VBQStFO0FBQy9FLFNBQVMsT0FBTyxDQUNkLEdBQW9DLEVBQ3BDLFVBQWtEO0lBRWxELE9BQU8sR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDbkYsQ0FBQztBQUVELDJFQUEyRTtBQUMzRSxTQUFTLGtCQUFrQixDQUFDLElBQXVCLEVBQUUsTUFBdUI7SUFDMUUsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBRW5ELE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7UUFDbkMsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXhELE9BQU8sT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDekQsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsSUFBdUIsRUFBRSxNQUF1QjtJQUNuRSxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7U0FDckMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvRyxDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLDhFQUE4RTtBQUM5RSxtQ0FBbUM7QUFDbkMsU0FBUyxrQkFBa0IsQ0FDekIsTUFBa0IsRUFDbEIsVUFBa0QsRUFDbEQsTUFBdUI7SUFFdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoQyxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQztJQUN0RSxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDM0csTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNsRSxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBRTNGLElBQUksVUFBVSxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNuRixPQUFPLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7QUFDcEgsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLElBQWdCLEVBQUUsT0FBZSxFQUFFLEtBQWEsRUFBRSxNQUErQjtJQUN0RyxRQUFRLElBQUksRUFBRSxDQUFDO1FBQ2IsS0FBSyxTQUFTO1lBQ1osT0FBTyxhQUFhLE9BQU8sR0FBRyxDQUFDO1FBQ2pDLEtBQUssT0FBTztZQUNWLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsS0FBSyxLQUFLLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixLQUFLLEdBQUcsQ0FBQztRQUMvRztZQUNFLE9BQU8sR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxPQUFPLE9BQU8sR0FBRyxDQUFDO0lBQzlELENBQUM7QUFDSCxDQUFDO0FBRUQsK0VBQStFO0FBQy9FLHFCQUFxQjtBQUNyQixTQUFTLFlBQVksQ0FBQyxNQUFrQjtJQUN0QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBRXpELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNWLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUM5RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsZUFBZSxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDO0lBQ2hHLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUU3RCxPQUFPLFdBQVcsTUFBTSxDQUFDLE9BQU8saUJBQWlCLEdBQUcsS0FBSyxLQUFLLCtCQUErQixJQUFJLEtBQUs7VUFDbEcsc0JBQXNCLENBQUM7QUFDN0IsQ0FBQztBQUVELG1EQUFtRDtBQUNuRCxTQUFTLGFBQWEsQ0FBQyxNQUFrQjtJQUN2QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBRTVELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFFcEYsT0FBTyxzQkFBc0IsTUFBTSxDQUFDLE9BQU8sR0FBRyxLQUFLLEtBQUssc0JBQXNCLEVBQUUsQ0FBQztBQUNuRixDQUFDO0FBRUQsK0RBQStEO0FBQy9ELFNBQVMsZUFBZSxDQUN0QixJQUE0QixFQUM1QixNQUF1QixFQUN2QixJQUF1QjtJQUV2QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFFckcsT0FBTyxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEYsQ0FBQztBQUVELDhEQUE4RDtBQUM5RCxTQUFTLFNBQVMsQ0FBQyxLQUFlO0lBQ2hDLE9BQU8sS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFO1FBQ25FLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBjb21wYXJpc29uTm90ZVRleHQsXG4gIGNvbXBhcmlzb25PZmZzZXRMYWJlbCxcbiAgZm9ybWF0RGF5V2luZG93LFxuICBrcGlOb3RlVGV4dCxcbiAgd2luZG93Tm90ZVRleHQsXG4gIHdpbmRvd1RleHQsXG59IGZyb20gJy4vZm9ybWF0JztcbmltcG9ydCB7XG4gIENvbXBhcmlzb25PZmZzZXQsXG4gIENvbXBhcmlzb25XaW5kb3csXG4gIENvbXBvbmVudENvbXBhcmlzb24sXG4gIENvbXBvbmVudERhdGEsXG4gIENvbXBvbmVudEtwaSxcbiAgT3V0cHV0TWV0YSxcbiAgT3V0cHV0Um9sZSxcbiAgUmVwb3J0TG9jYWxlVGFnLFxuICBXaW5kb3dNZXRhLFxufSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5cblxuLy8gVGhlIG5vdGVzIGEgY29tcG9uZW50IHNob3dzIGFib3V0IHRoZSBudW1iZXJzIGl0IGRyYXdzOiB3aGljaCBkYXlzIGFcbi8vIGNvbXBhcmlzb24gY29tcGFyZXMsIHdoeSBpdCByZWFkcyBhcyBpdCBkb2VzLCBhbmQgaG93IGl0cyB3aW5kb3dlZCB2YWx1ZXNcbi8vIHdlcmUgY29tcHV0ZWQuIFRoZSBzZXJ2ZXIgc2VuZHMgd2luZG93cywgZmllbGRzIGFuZCBjb2RlczsgZXZlcnkgc2VudGVuY2UgaXNcbi8vIHdvcmRlZCBoZXJlLCB0aHJvdWdoIGZvcm1hdC50cywgaW4gRW5nbGlzaCB3aXRoIHRoZSBkYXlzIGluIHRoZSByZXBvcnQnc1xuLy8gbG9jYWxlLiBBIGNvbXBvbmVudCB3aG9zZSBkYXRhIGNhcnJpZXMgbm9uZSBvZiB0aG9zZSBrZXlzIGhhcyBubyBub3RlLlxuXG4vLyBUaGUgQ29tcG9uZW50RGF0YSBrZXlzIGEgbm90ZSByZWFkcy5cbmV4cG9ydCB0eXBlIENvbXBvbmVudE5vdGVEYXRhID0gUGljazxcbiAgQ29tcG9uZW50RGF0YSxcbiAgJ2NvbXBhcmlzb24nIHwgJ3RpbWVmcmFtZScgfCAnb3V0cHV0cycgfCAnY2VsbE1lYXN1cmVzJyB8ICd3aW5kb3dzJyB8ICdncmFudWxhcml0eScgfCAna3BpJ1xuPjtcblxuLy8gVGhlIHJlcG9ydCB0aGUgbm90ZSBpcyB3cml0dGVuIGZvcjogaXRzIGxvY2FsZSwgYW5kIHRoZSB6b25lIGEgdGltZWZyYW1lJ3Ncbi8vIGN1dCB0aW1lIHJlYWRzIGluIChhIGNvbXBhcmlzb24gbmFtZXMgaXRzIG93bikuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudE5vdGVDb250ZXh0IHtcbiAgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWc7XG4gIHRpbWV6b25lOiBzdHJpbmc7XG59XG5cbi8vIFdoaWNoIHBhcnRzIG9mIHRoZSBub3RlIGEgY29tcG9uZW50IHNob3dzLiBPbWl0dGVkLCBhIHBhcnQgaXMgc2hvd24sIGV4Y2VwdFxuLy8gdGhlIHdpbmRvdyBkZXNjcmlwdGlvbnMsIHdoaWNoIGEgY2hhcnQncyB0b29sdGlwcyBhbmQgYSBsaXN0J3MgaGVhZGVycyBjYXJyeVxuLy8gaW5zdGVhZC5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50Tm90ZVBhcnRzIHtcbiAgLy8gVGhlIGRheXMgdGhlIGNvbXBvbmVudCByZWFkczogaXRzIGNvbXBhcmlzb24ncyBjdXJyZW50IGFuZCBwcmlvciB3aW5kb3dzLFxuICAvLyBlbHNlIGl0cyB0aW1lZnJhbWUncyBkYXlzLlxuICB3aW5kb3dzPzogYm9vbGVhbjtcbiAgLy8gV2hhdCBlYWNoIHdpbmRvd2VkIHZhbHVlIGlzICgnUm9sbGluZyAzLW1vbnRoIHRvdGFsLCBTZXAgMSDigJMgMzAsIDIwMjYnKS5cbiAgd2luZG93RGVzY3JpcHRpb25zPzogYm9vbGVhbjtcbiAgLy8gV2h5IHRoZSB3aW5kb3dlZCB2YWx1ZXMgcmVhZCBhcyB0aGV5IGRvLlxuICB3aW5kb3dOb3Rlcz86IGJvb2xlYW47XG59XG5cbi8vIEJldHdlZW4gdGhlIGN1cnJlbnQgd2luZG93IGFuZCBlYWNoIHByaW9yIG9uZSBvbiB0aGUgd2luZG93cyBsaW5lLlxuY29uc3QgV0lORE9XU19TRVBBUkFUT1IgPSAnIMK3ICc7XG5cbi8vIFJhbmtzIGFuZCBzaGFyZXMgYXJlIGNvbXB1dGVkIGFmdGVyIHRoZSB2aWV3ZXIncyBmaWx0ZXJzLCBuZXZlciBiZWZvcmUuXG5jb25zdCBGSUxURVJFRF9ST1dTX1NFTlRFTkNFID0gJ0NvbXB1dGVkIG92ZXIgdGhlIHJvd3MgdGhlIGZpbHRlcnMga2VlcC4nO1xuXG5jb25zdCBST0xFX0xFQURTOiBSZWNvcmQ8T3V0cHV0Um9sZSwgc3RyaW5nPiA9IHtcbiAgY3VycmVudDogJ1ZhbHVlJyxcbiAgcHJpb3I6ICdQcmlvciB2YWx1ZScsXG4gIGNoYW5nZTogJ0NoYW5nZScsXG4gIHBlcmNlbnRfY2hhbmdlOiAnUGVyY2VudCBjaGFuZ2UnLFxufTtcblxuLy8gVGhlIG5vdGUncyBsaW5lcywgaW4gb3JkZXI6IHRoZSB3aW5kb3dzLCB0aGVuIHRoZSBjb21wYXJpc29uJ3Mgbm90ZXMgYW5kIGFcbi8vIEtQSSdzIGRlbHRhIG5vdGUsIHRoZW4gdGhlIHdpbmRvd2VkIHZhbHVlcycgZGVzY3JpcHRpb25zIGFuZCBub3Rlcy4gQSBsaW5lIGlzIG5ldmVyIHJlcGVhdGVkICh0d29cbi8vIHdpbmRvd2VkIHZhbHVlcyBvZnRlbiBzaGFyZSBhIG5vdGUpLiBFbXB0eSB3aGVuIHRoZSBkYXRhIGhhcyBub25lIG9mIHRoZVxuLy8ga2V5cywgb3Igbm9uZSBvZiB0aGUgcGFydHMgYXNrZWQgZm9yLlxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvbmVudE5vdGVMaW5lcyhcbiAgZGF0YTogQ29tcG9uZW50Tm90ZURhdGEgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBjb250ZXh0OiBDb21wb25lbnROb3RlQ29udGV4dCxcbiAgcGFydHM6IENvbXBvbmVudE5vdGVQYXJ0cyA9IHt9LFxuKTogc3RyaW5nW10ge1xuICBpZiAoIWRhdGEpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBsaW5lcyA9IFtcbiAgICBwYXJ0cy53aW5kb3dzID09PSBmYWxzZSA/ICcnIDogY29tcG9uZW50V2luZG93c0xpbmUoZGF0YSwgY29udGV4dCksXG4gICAgLi4uY29tcGFyaXNvbk5vdGVzKGRhdGEuY29tcGFyaXNvbiksXG4gICAga3BpTm90ZShkYXRhLmtwaSwgZGF0YS5jb21wYXJpc29uKSxcbiAgICAuLi4ocGFydHMud2luZG93RGVzY3JpcHRpb25zID8gd2luZG93RGVzY3JpcHRpb25zKGRhdGEsIGNvbnRleHQubG9jYWxlKSA6IFtdKSxcbiAgICAuLi4ocGFydHMud2luZG93Tm90ZXMgPT09IGZhbHNlID8gW10gOiB3aW5kb3dOb3RlcyhkYXRhLCBjb250ZXh0LmxvY2FsZSkpLFxuICBdO1xuXG4gIHJldHVybiBbLi4ubmV3IFNldChsaW5lcy5maWx0ZXIoKGxpbmUpID0+ICEhbGluZSkpXTtcbn1cblxuLy8gV2hhdCBvbmUgb3V0cHV0IGNvbHVtbiBob2xkcywgZm9yIGl0cyBoZWFkZXIncyB0b29sdGlwOiB0aGUgd2luZG93cyBhXG4vLyBjb21wYXJlZCB2YWx1ZSBjb3ZlcnMsIGEgcmFuaydzIG9yIGEgc2hhcmUncyBzY29wZSwgYW5kIGhvdyBhIHdpbmRvd2VkIHZhbHVlXG4vLyB3YXMgY29tcHV0ZWQuIEEgY3Jvc3MtdGFiIGNlbGwgY29sdW1uIHJlYWRzIGl0cyBtZWFzdXJlJ3MgbWVhbmluZyB0aHJvdWdoXG4vLyBjZWxsTWVhc3VyZXMuICcnIGZvciBhIHBsYWluIGNvbHVtbi5cbmV4cG9ydCBmdW5jdGlvbiBvdXRwdXRDb2x1bW5Ob3RlKFxuICBjb2x1bW46IHN0cmluZyxcbiAgZGF0YTogQ29tcG9uZW50Tm90ZURhdGEgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyxcbik6IHN0cmluZyB7XG4gIGNvbnN0IGFsaWFzID0gZGF0YT8uY2VsbE1lYXN1cmVzPy5bY29sdW1uXSA/PyBjb2x1bW47XG4gIGNvbnN0IG91dHB1dCA9IGRhdGE/Lm91dHB1dHM/LlthbGlhc107XG5cbiAgaWYgKCFvdXRwdXQpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICByZXR1cm4gW1xuICAgIGNvbXBhcmlzb25TZW50ZW5jZShvdXRwdXQsIGRhdGEuY29tcGFyaXNvbiwgbG9jYWxlKSxcbiAgICByYW5rU2VudGVuY2Uob3V0cHV0KSxcbiAgICBzaGFyZVNlbnRlbmNlKG91dHB1dCksXG4gICAgd2luZG93U2VudGVuY2VzKGRhdGEud2luZG93cz8uW2FsaWFzXSwgbG9jYWxlLCBkYXRhKSxcbiAgXVxuICAgIC5maWx0ZXIoKHNlbnRlbmNlKSA9PiAhIXNlbnRlbmNlKVxuICAgIC5qb2luKCcgJyk7XG59XG5cbi8vICdTZXAgMSDigJMgMTUsIDIwMjYgwrcgdnMgcHJldmlvdXMgbW9udGg6IEF1ZyAxIOKAkyAxNSwgMjAyNicuIEEgY29tcGFyaXNvblxuLy8gd2l0aCBubyBjdXJyZW50IHdpbmRvdyB5ZXQgaGFzIG5vIGxpbmUgKGl0cyBub193aW5kb3cgbm90ZSBzYXlzIHNvKTsgYVxuLy8gY29tcG9uZW50IHdpdGhvdXQgYSBjb21wYXJpc29uIHNob3dzIGl0cyB0aW1lZnJhbWUncyBkYXlzLiAnJyB3aGVuIHRoZSBkYXRhXG4vLyBoYXMgbmVpdGhlci4gVGhlIG5vdGUncyBmaXJzdCBsaW5lLCBhbmQgdGhlIFBERiBhbmQgUG93ZXJQb2ludCBleHBvcnRzJ1xuLy8gc3VidGl0bGUgdW5kZXIgYSBjaGFydCdzIG9yIGEgbGlzdCdzIHRpdGxlLlxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvbmVudFdpbmRvd3NMaW5lKGRhdGE6IENvbXBvbmVudE5vdGVEYXRhLCBjb250ZXh0OiBDb21wb25lbnROb3RlQ29udGV4dCk6IHN0cmluZyB7XG4gIGNvbnN0IGNvbXBhcmlzb24gPSBkYXRhLmNvbXBhcmlzb247XG5cbiAgaWYgKGNvbXBhcmlzb24pIHtcbiAgICByZXR1cm4gY29tcGFyaXNvbi5jdXJyZW50ID8gY29tcGFyaXNvbldpbmRvd3NMaW5lKGNvbXBhcmlzb24sIGNvbXBhcmlzb24uY3VycmVudCwgY29udGV4dC5sb2NhbGUpIDogJyc7XG4gIH1cblxuICByZXR1cm4gZGF0YS50aW1lZnJhbWUgPyBmb3JtYXREYXlXaW5kb3coZGF0YS50aW1lZnJhbWUsIGNvbnRleHQudGltZXpvbmUsIGNvbnRleHQubG9jYWxlKSA6ICcnO1xufVxuXG5mdW5jdGlvbiBjb21wYXJpc29uV2luZG93c0xpbmUoXG4gIGNvbXBhcmlzb246IENvbXBvbmVudENvbXBhcmlzb24sXG4gIGN1cnJlbnRXaW5kb3c6IENvbXBhcmlzb25XaW5kb3csXG4gIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgY3VycmVudCA9IGZvcm1hdERheVdpbmRvdyhjdXJyZW50V2luZG93LCBjb21wYXJpc29uLnRpbWV6b25lLCBsb2NhbGUpO1xuICBjb25zdCBwcmlvcnMgPSAoY29tcGFyaXNvbi5vZmZzZXRzID8/IFtdKS5tYXAoKG9mZnNldCwgaW5kZXgpID0+IHtcbiAgICByZXR1cm4gcHJpb3JXaW5kb3dUZXh0KG9mZnNldCwgY29tcGFyaXNvbi5wcmlvcnM/LltpbmRleF0sIGNvbXBhcmlzb24udGltZXpvbmUsIGxvY2FsZSk7XG4gIH0pO1xuXG4gIHJldHVybiBbY3VycmVudCwgLi4ucHJpb3JzXVxuICAgIC5maWx0ZXIoKHBhcnQpID0+ICEhcGFydClcbiAgICAuam9pbihXSU5ET1dTX1NFUEFSQVRPUik7XG59XG5cbi8vIE9uZSBwcmlvciBsYW5lOiAndnMgcHJldmlvdXMgbW9udGg6IEF1ZyAxIOKAkyAxNSwgMjAyNicsIG9yIGl0cyBsYWJlbCBhbG9uZVxuLy8gd2hlbiB0aGUgc2VydmVyIHNlbmRzIG5vIHdpbmRvdyBmb3IgaXQuXG5mdW5jdGlvbiBwcmlvcldpbmRvd1RleHQoXG4gIG9mZnNldDogQ29tcGFyaXNvbk9mZnNldCxcbiAgcHJpb3I6IENvbXBhcmlzb25XaW5kb3cgfCB1bmRlZmluZWQsXG4gIHRpbWV6b25lOiBzdHJpbmcsXG4gIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgbGFiZWwgPSBjb21wYXJpc29uT2Zmc2V0TGFiZWwob2Zmc2V0KTtcbiAgY29uc3QgZGF5cyA9IHByaW9yID8gZm9ybWF0RGF5V2luZG93KHByaW9yLCB0aW1lem9uZSwgbG9jYWxlKSA6ICcnO1xuXG4gIHJldHVybiBkYXlzID8gYCR7bGFiZWx9OiAke2RheXN9YCA6IGxhYmVsO1xufVxuXG5mdW5jdGlvbiBjb21wYXJpc29uTm90ZXMoY29tcGFyaXNvbjogQ29tcG9uZW50Q29tcGFyaXNvbiB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB7XG4gIHJldHVybiAoY29tcGFyaXNvbj8ubm90ZXMgPz8gW10pLm1hcCgoY29kZSkgPT4gY29tcGFyaXNvbk5vdGVUZXh0KGNvZGUsIGNvbXBhcmlzb24pKTtcbn1cblxuLy8gV2h5IGEgS1BJIGNhcmQncyBkZWx0YSByZWFkcyBhcyBpdCBkb2VzICgnTm8gYmFzZWxpbmU6IHRoZSBwcmV2aW91cyBwZXJpb2Rcbi8vIGhhcyBubyBkYXRhLicpLCBuYW1pbmcgdGhlIGJhc2VsaW5lIGJ5IHdoYXQgdGhlIGZpcnN0IGxhbmUgY29tcGFyZXMgYWdhaW5zdC5cbmZ1bmN0aW9uIGtwaU5vdGUoXG4gIGtwaTogQ29tcG9uZW50S3BpIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgY29tcGFyaXNvbjogQ29tcG9uZW50Q29tcGFyaXNvbiB8IG51bGwgfCB1bmRlZmluZWQsXG4pOiBzdHJpbmcge1xuICByZXR1cm4ga3BpPy5ub3RlID8ga3BpTm90ZVRleHQoa3BpLm5vdGUsIGNvbXBhcmlzb24/Lm9mZnNldHM/LlswXT8uYWdhaW5zdCkgOiAnJztcbn1cblxuLy8gT25lIGxpbmUgcGVyIHdpbmRvd2VkIHZhbHVlLCBuYW1lZCBieSBpdHMgY29sdW1uIHdoZW4gdGhlcmUgYXJlIHNldmVyYWwuXG5mdW5jdGlvbiB3aW5kb3dEZXNjcmlwdGlvbnMoZGF0YTogQ29tcG9uZW50Tm90ZURhdGEsIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnKTogc3RyaW5nW10ge1xuICBjb25zdCB3aW5kb3dzID0gT2JqZWN0LmVudHJpZXMoZGF0YS53aW5kb3dzID8/IHt9KTtcblxuICByZXR1cm4gd2luZG93cy5tYXAoKFthbGlhcywgbWV0YV0pID0+IHtcbiAgICBjb25zdCB0ZXh0ID0gd2luZG93VGV4dChtZXRhLCBsb2NhbGUsIGRhdGEuZ3JhbnVsYXJpdHkpO1xuXG4gICAgcmV0dXJuIHdpbmRvd3MubGVuZ3RoID4gMSA/IGAke2FsaWFzfTogJHt0ZXh0fWAgOiB0ZXh0O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gd2luZG93Tm90ZXMoZGF0YTogQ29tcG9uZW50Tm90ZURhdGEsIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnKTogc3RyaW5nW10ge1xuICByZXR1cm4gT2JqZWN0LnZhbHVlcyhkYXRhLndpbmRvd3MgPz8ge30pXG4gICAgLmZsYXRNYXAoKG1ldGEpID0+IChtZXRhLm5vdGVzID8/IFtdKS5tYXAoKGNvZGUpID0+IHdpbmRvd05vdGVUZXh0KGNvZGUsIG1ldGEsIGxvY2FsZSwgZGF0YS5ncmFudWxhcml0eSkpKTtcbn1cblxuLy8gQSBjb21wYXJlZCBjb2x1bW4ncyB3aW5kb3dzLiBJbiByYW5nZSBtb2RlIGV2ZXJ5IHJvdyBjb21wYXJlcyB0aGUgc2FtZSB0d29cbi8vIHdpbmRvd3MsIHNvIHRoZXkgYXJlIG5hbWVkOyBpbiBzZXJpZXMgYW5kIGFzLW9mIG1vZGVzIGVhY2ggcm93IGNvbXBhcmVzIGl0c1xuLy8gb3duIHBlcmlvZCwgc28gb25seSB0aGUgbGFuZSBpcy5cbmZ1bmN0aW9uIGNvbXBhcmlzb25TZW50ZW5jZShcbiAgb3V0cHV0OiBPdXRwdXRNZXRhLFxuICBjb21wYXJpc29uOiBDb21wb25lbnRDb21wYXJpc29uIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcsXG4pOiBzdHJpbmcge1xuICBpZiAoIW91dHB1dC5yb2xlIHx8ICFjb21wYXJpc29uKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3Qgb2Zmc2V0ID0gY29tcGFyaXNvbi5vZmZzZXRzPy5bKG91dHB1dC5vZmZzZXQgPz8gMSkgLSAxXSA/PyBudWxsO1xuICBjb25zdCBjdXJyZW50ID0gY29tcGFyaXNvbi5jdXJyZW50ID8gZm9ybWF0RGF5V2luZG93KGNvbXBhcmlzb24uY3VycmVudCwgY29tcGFyaXNvbi50aW1lem9uZSwgbG9jYWxlKSA6ICcnO1xuICBjb25zdCBwcmlvcldpbmRvdyA9IGNvbXBhcmlzb24ucHJpb3JzPy5bKG91dHB1dC5vZmZzZXQgPz8gMSkgLSAxXTtcbiAgY29uc3QgcHJpb3IgPSBwcmlvcldpbmRvdyA/IGZvcm1hdERheVdpbmRvdyhwcmlvcldpbmRvdywgY29tcGFyaXNvbi50aW1lem9uZSwgbG9jYWxlKSA6ICcnO1xuXG4gIGlmIChjb21wYXJpc29uLm1vZGUgPT09ICdyYW5nZScgJiYgY3VycmVudCAmJiAob3V0cHV0LnJvbGUgPT09ICdjdXJyZW50JyB8fCBwcmlvcikpIHtcbiAgICByZXR1cm4gcmFuZ2VTZW50ZW5jZShvdXRwdXQucm9sZSwgY3VycmVudCwgcHJpb3IsIG9mZnNldCk7XG4gIH1cblxuICByZXR1cm4gb3V0cHV0LnJvbGUgPT09ICdjdXJyZW50JyB8fCAhb2Zmc2V0ID8gJycgOiBgJHtST0xFX0xFQURTW291dHB1dC5yb2xlXX0gJHtjb21wYXJpc29uT2Zmc2V0TGFiZWwob2Zmc2V0KX0uYDtcbn1cblxuZnVuY3Rpb24gcmFuZ2VTZW50ZW5jZShyb2xlOiBPdXRwdXRSb2xlLCBjdXJyZW50OiBzdHJpbmcsIHByaW9yOiBzdHJpbmcsIG9mZnNldDogQ29tcGFyaXNvbk9mZnNldCB8IG51bGwpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHJvbGUpIHtcbiAgICBjYXNlICdjdXJyZW50JzpcbiAgICAgIHJldHVybiBgVmFsdWUgZm9yICR7Y3VycmVudH0uYDtcbiAgICBjYXNlICdwcmlvcic6XG4gICAgICByZXR1cm4gb2Zmc2V0ID8gYFByaW9yIHZhbHVlIGZvciAke3ByaW9yfSAoJHtjb21wYXJpc29uT2Zmc2V0TGFiZWwob2Zmc2V0KX0pLmAgOiBgUHJpb3IgdmFsdWUgZm9yICR7cHJpb3J9LmA7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBgJHtST0xFX0xFQURTW3JvbGVdfSBmcm9tICR7cHJpb3J9IHRvICR7Y3VycmVudH0uYDtcbiAgfVxufVxuXG4vLyAnUmFuayBieSBSZXZlbnVlLCAxIGJlaW5nIHRoZSBsYXJnZXN0LCB3aXRoaW4gZWFjaCBSZWdpb24uIFRpZWQgdmFsdWVzIHNoYXJlXG4vLyBhIHJhbmsgKDEsIDEsIDMpLidcbmZ1bmN0aW9uIHJhbmtTZW50ZW5jZShvdXRwdXQ6IE91dHB1dE1ldGEpOiBzdHJpbmcge1xuICBjb25zdCByYW5rID0gb3V0cHV0LmtpbmQgPT09ICdyYW5rJyA/IG91dHB1dC5yYW5rIDogbnVsbDtcblxuICBpZiAoIXJhbmspIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBjb25zdCBlbmQgPSByYW5rLmRpcmVjdGlvbiA9PT0gJ2FzYycgPyAnc21hbGxlc3QnIDogJ2xhcmdlc3QnO1xuICBjb25zdCBzY29wZSA9IHJhbmsud2l0aGluPy5sZW5ndGggPyBgd2l0aGluIGVhY2ggJHtqb2luTmFtZXMocmFuay53aXRoaW4pfWAgOiAnYWNyb3NzIGFsbCByb3dzJztcbiAgY29uc3QgdGllcyA9IHJhbmsubWV0aG9kID09PSAnZGVuc2UnID8gJzEsIDEsIDInIDogJzEsIDEsIDMnO1xuXG4gIHJldHVybiBgUmFuayBieSAke291dHB1dC5tZWFzdXJlfSwgMSBiZWluZyB0aGUgJHtlbmR9LCAke3Njb3BlfS4gVGllZCB2YWx1ZXMgc2hhcmUgYSByYW5rICgke3RpZXN9KS4gYFxuICAgICsgRklMVEVSRURfUk9XU19TRU5URU5DRTtcbn1cblxuLy8gJ1NoYXJlIG9mIHRoZSB0b3RhbCBSZXZlbnVlIHdpdGhpbiBlYWNoIFJlZ2lvbi4nXG5mdW5jdGlvbiBzaGFyZVNlbnRlbmNlKG91dHB1dDogT3V0cHV0TWV0YSk6IHN0cmluZyB7XG4gIGNvbnN0IHNoYXJlID0gb3V0cHV0LmtpbmQgPT09ICdzaGFyZScgPyBvdXRwdXQuc2hhcmUgOiBudWxsO1xuXG4gIGlmICghc2hhcmUpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBjb25zdCBzY29wZSA9IHNoYXJlLndpdGhpbj8ubGVuZ3RoID8gYCB3aXRoaW4gZWFjaCAke2pvaW5OYW1lcyhzaGFyZS53aXRoaW4pfWAgOiAnJztcblxuICByZXR1cm4gYFNoYXJlIG9mIHRoZSB0b3RhbCAke291dHB1dC5tZWFzdXJlfSR7c2NvcGV9LiAke0ZJTFRFUkVEX1JPV1NfU0VOVEVOQ0V9YDtcbn1cblxuLy8gQSB3aW5kb3dlZCBjb2x1bW46IHdoYXQgaXQgaXMsIHRoZW4gd2h5IGl0IHJlYWRzIGFzIGl0IGRvZXMuXG5mdW5jdGlvbiB3aW5kb3dTZW50ZW5jZXMoXG4gIG1ldGE6IFdpbmRvd01ldGEgfCB1bmRlZmluZWQsXG4gIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnLFxuICBkYXRhOiBDb21wb25lbnROb3RlRGF0YSxcbik6IHN0cmluZyB7XG4gIGlmICghbWV0YSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IG5vdGVzID0gKG1ldGEubm90ZXMgPz8gW10pLm1hcCgoY29kZSkgPT4gd2luZG93Tm90ZVRleHQoY29kZSwgbWV0YSwgbG9jYWxlLCBkYXRhLmdyYW51bGFyaXR5KSk7XG5cbiAgcmV0dXJuIFtgJHt3aW5kb3dUZXh0KG1ldGEsIGxvY2FsZSwgZGF0YS5ncmFudWxhcml0eSl9LmAsIC4uLm5vdGVzXS5qb2luKCcgJyk7XG59XG5cbi8vICdSZWdpb24nLCAnUmVnaW9uIGFuZCBDaGFubmVsJywgJ1JlZ2lvbiwgQ2hhbm5lbCBhbmQgUGxhbicuXG5mdW5jdGlvbiBqb2luTmFtZXMobmFtZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5hbWVzLmxlbmd0aCA+IDFcbiAgICA/IGAke25hbWVzLnNsaWNlKDAsIC0xKS5qb2luKCcsICcpfSBhbmQgJHtuYW1lc1tuYW1lcy5sZW5ndGggLSAxXX1gXG4gICAgOiBuYW1lcy5qb2luKCcnKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Pipe } from '@angular/core';
|
|
2
|
+
import { formatOutputValue } from '../format';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
// A list cell (or a totals cell) of an output column, written by what it holds:
|
|
5
|
+
// a prior or a change in its measure's format, a signed percent change, a
|
|
6
|
+
// change of a rate in points, a rank as a whole number, a share as a percent.
|
|
7
|
+
// It reads the whole row, since a change looks up its prior beside it to tell
|
|
8
|
+
// a missing baseline ('—') from a zero one ('n/a'). An empty value reads ''.
|
|
9
|
+
export class ReportOutputPipe {
|
|
10
|
+
transform(row, column, output, context) {
|
|
11
|
+
return formatOutputValue(row?.[column.column], output.output, column, context, {
|
|
12
|
+
measureSpec: output.measureSpec,
|
|
13
|
+
prior: output.priorAlias && row ? row[output.priorAlias] : undefined,
|
|
14
|
+
floor: output.floor,
|
|
15
|
+
empty: '',
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportOutputPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
|
19
|
+
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: ReportOutputPipe, isStandalone: true, name: "fsReportOutput" });
|
|
20
|
+
}
|
|
21
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportOutputPipe, decorators: [{
|
|
22
|
+
type: Pipe,
|
|
23
|
+
args: [{
|
|
24
|
+
name: 'fsReportOutput',
|
|
25
|
+
standalone: true,
|
|
26
|
+
}]
|
|
27
|
+
}] });
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LW91dHB1dC5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL3BpcGVzL3JlcG9ydC1vdXRwdXQucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUVwRCxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sV0FBVyxDQUFDOztBQUtwRSxnRkFBZ0Y7QUFDaEYsMEVBQTBFO0FBQzFFLDhFQUE4RTtBQUM5RSw4RUFBOEU7QUFDOUUsNkVBQTZFO0FBSzdFLE1BQU0sT0FBTyxnQkFBZ0I7SUFFcEIsU0FBUyxDQUNkLEdBQStDLEVBQy9DLE1BQWtCLEVBQ2xCLE1BQXdCLEVBQ3hCLE9BQTRCO1FBRTVCLE9BQU8saUJBQWlCLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRTtZQUM3RSxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7WUFDL0IsS0FBSyxFQUFFLE1BQU0sQ0FBQyxVQUFVLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQ3BFLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztZQUNuQixLQUFLLEVBQUUsRUFBRTtTQUNWLENBQUMsQ0FBQztJQUNMLENBQUM7d0dBZFUsZ0JBQWdCO3NHQUFoQixnQkFBZ0I7OzRGQUFoQixnQkFBZ0I7a0JBSjVCLElBQUk7bUJBQUM7b0JBQ0osSUFBSSxFQUFFLGdCQUFnQjtvQkFDdEIsVUFBVSxFQUFFLElBQUk7aUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBGb3JtYXR0ZWRPdXRwdXRWYWx1ZSwgZm9ybWF0T3V0cHV0VmFsdWUgfSBmcm9tICcuLi9mb3JtYXQnO1xuaW1wb3J0IHsgTGlzdENvbHVtbiwgUmVwb3J0Rm9ybWF0Q29udGV4dCB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBMaXN0T3V0cHV0Q29sdW1uIH0gZnJvbSAnLi4vbGlzdC1jb25maWcnO1xuXG5cbi8vIEEgbGlzdCBjZWxsIChvciBhIHRvdGFscyBjZWxsKSBvZiBhbiBvdXRwdXQgY29sdW1uLCB3cml0dGVuIGJ5IHdoYXQgaXQgaG9sZHM6XG4vLyBhIHByaW9yIG9yIGEgY2hhbmdlIGluIGl0cyBtZWFzdXJlJ3MgZm9ybWF0LCBhIHNpZ25lZCBwZXJjZW50IGNoYW5nZSwgYVxuLy8gY2hhbmdlIG9mIGEgcmF0ZSBpbiBwb2ludHMsIGEgcmFuayBhcyBhIHdob2xlIG51bWJlciwgYSBzaGFyZSBhcyBhIHBlcmNlbnQuXG4vLyBJdCByZWFkcyB0aGUgd2hvbGUgcm93LCBzaW5jZSBhIGNoYW5nZSBsb29rcyB1cCBpdHMgcHJpb3IgYmVzaWRlIGl0IHRvIHRlbGxcbi8vIGEgbWlzc2luZyBiYXNlbGluZSAoJ+KAlCcpIGZyb20gYSB6ZXJvIG9uZSAoJ24vYScpLiBBbiBlbXB0eSB2YWx1ZSByZWFkcyAnJy5cbkBQaXBlKHtcbiAgbmFtZTogJ2ZzUmVwb3J0T3V0cHV0JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgUmVwb3J0T3V0cHV0UGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuXG4gIHB1YmxpYyB0cmFuc2Zvcm0oXG4gICAgcm93OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwgfCB1bmRlZmluZWQsXG4gICAgY29sdW1uOiBMaXN0Q29sdW1uLFxuICAgIG91dHB1dDogTGlzdE91dHB1dENvbHVtbixcbiAgICBjb250ZXh0OiBSZXBvcnRGb3JtYXRDb250ZXh0LFxuICApOiBGb3JtYXR0ZWRPdXRwdXRWYWx1ZSB7XG4gICAgcmV0dXJuIGZvcm1hdE91dHB1dFZhbHVlKHJvdz8uW2NvbHVtbi5jb2x1bW5dLCBvdXRwdXQub3V0cHV0LCBjb2x1bW4sIGNvbnRleHQsIHtcbiAgICAgIG1lYXN1cmVTcGVjOiBvdXRwdXQubWVhc3VyZVNwZWMsXG4gICAgICBwcmlvcjogb3V0cHV0LnByaW9yQWxpYXMgJiYgcm93ID8gcm93W291dHB1dC5wcmlvckFsaWFzXSA6IHVuZGVmaW5lZCxcbiAgICAgIGZsb29yOiBvdXRwdXQuZmxvb3IsXG4gICAgICBlbXB0eTogJycsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|