@testgorilla/tgo-ui 2.24.4 → 2.24.5
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/components/autocomplete/autocomplete.component.d.ts +6 -6
- package/components/badge/badge.model.d.ts +2 -1
- package/components/spider-chart/spider-chart.component.d.ts +88 -0
- package/components/spider-chart/spider-chart.model.d.ts +12 -0
- package/components/spider-chart/spider-chart.module.d.ts +12 -0
- package/components/universal-skills-report/universal-skills-report.component.d.ts +33 -0
- package/components/universal-skills-report/universal-skills-report.component.module.d.ts +14 -0
- package/components/universal-skills-report/universal-skills-report.model.d.ts +33 -0
- package/esm2022/assets/i18n/en.json +36 -0
- package/esm2022/components/autocomplete/autocomplete.component.mjs +40 -36
- package/esm2022/components/badge/badge.component.mjs +2 -2
- package/esm2022/components/badge/badge.model.mjs +2 -1
- package/esm2022/components/spider-chart/spider-chart.component.mjs +425 -0
- package/esm2022/components/spider-chart/spider-chart.model.mjs +4 -0
- package/esm2022/components/spider-chart/spider-chart.module.mjs +41 -0
- package/esm2022/components/universal-skills-report/universal-skills-report.component.mjs +115 -0
- package/esm2022/components/universal-skills-report/universal-skills-report.component.module.mjs +43 -0
- package/esm2022/components/universal-skills-report/universal-skills-report.model.mjs +19 -0
- package/esm2022/pipes/ui-ordinal-suffix.pipe.mjs +31 -0
- package/esm2022/public-api.mjs +9 -1
- package/fesm2022/testgorilla-tgo-ui.mjs +1544 -861
- package/fesm2022/testgorilla-tgo-ui.mjs.map +1 -1
- package/package.json +3 -1
- package/pipes/ui-ordinal-suffix.pipe.d.ts +7 -0
- package/projects/tgo-canopy-ui/assets/i18n/en.json +36 -0
- package/public-api.d.ts +6 -0
|
@@ -0,0 +1,425 @@
|
|
|
1
|
+
import { Component, Input, ViewChild, ViewChildren, } from '@angular/core';
|
|
2
|
+
import { LargeSpiderChartSize, SmallSpiderChartSize } from './spider-chart.model';
|
|
3
|
+
import { Color } from './../../models/colors.model';
|
|
4
|
+
import { BaseChartDirective } from 'ng2-charts';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/common";
|
|
7
|
+
import * as i2 from "ng2-charts";
|
|
8
|
+
import * as i3 from "@angular/material/tooltip";
|
|
9
|
+
import * as i4 from "../spinner/spinner.component";
|
|
10
|
+
import * as i5 from "../../pipes/ui-translate.pipe";
|
|
11
|
+
export class SpiderChartComponent {
|
|
12
|
+
constructor() {
|
|
13
|
+
/**
|
|
14
|
+
* The size of the spider chart.
|
|
15
|
+
* @type {SpiderChartSize}
|
|
16
|
+
* @memberof SpiderChartComponent
|
|
17
|
+
*/
|
|
18
|
+
this.size = 'large';
|
|
19
|
+
/**
|
|
20
|
+
* The step size for the spider chart.
|
|
21
|
+
* @type {number}
|
|
22
|
+
* @memberof SpiderChartComponent
|
|
23
|
+
*/
|
|
24
|
+
this.stepSize = 20;
|
|
25
|
+
/**
|
|
26
|
+
* The aria label for the spider chart.
|
|
27
|
+
* @type {string}
|
|
28
|
+
* @memberof SpiderChartComponent
|
|
29
|
+
*/
|
|
30
|
+
this.ariaLabel = 'Radar chart. Press tab to navigate through the chart.';
|
|
31
|
+
/**
|
|
32
|
+
* Whether the spider chart is loading.
|
|
33
|
+
* @type {boolean}
|
|
34
|
+
* @memberof SpiderChartComponent
|
|
35
|
+
*/
|
|
36
|
+
this.loading = false;
|
|
37
|
+
/**
|
|
38
|
+
*
|
|
39
|
+
* Defines the application theme
|
|
40
|
+
*
|
|
41
|
+
* @type {ApplicationTheme}
|
|
42
|
+
* @memberof SpinnerComponent
|
|
43
|
+
*/
|
|
44
|
+
this.applicationTheme = 'light';
|
|
45
|
+
this.radarChartData = {
|
|
46
|
+
labels: [],
|
|
47
|
+
datasets: [],
|
|
48
|
+
};
|
|
49
|
+
this.labelPositions = {};
|
|
50
|
+
this.labelPositionsVisible = false;
|
|
51
|
+
this.focusedLabelIndex = 0;
|
|
52
|
+
this.focusedFakeDataPointIndex = 0;
|
|
53
|
+
this.loadingChartData = {
|
|
54
|
+
labels: [1, 2, 3, 4, 5, 6],
|
|
55
|
+
datasets: [],
|
|
56
|
+
};
|
|
57
|
+
this.loadingChartOptions = {
|
|
58
|
+
responsive: true,
|
|
59
|
+
layout: {
|
|
60
|
+
padding: {
|
|
61
|
+
left: 40,
|
|
62
|
+
right: 40,
|
|
63
|
+
top: 40,
|
|
64
|
+
bottom: 40,
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
scales: {
|
|
68
|
+
r: {
|
|
69
|
+
angleLines: {
|
|
70
|
+
display: true,
|
|
71
|
+
color: Color.GRAYSCALE_30,
|
|
72
|
+
},
|
|
73
|
+
grid: {
|
|
74
|
+
color: () => Color.GRAYSCALE_30,
|
|
75
|
+
},
|
|
76
|
+
pointLabels: {
|
|
77
|
+
display: false,
|
|
78
|
+
},
|
|
79
|
+
suggestedMin: 0,
|
|
80
|
+
suggestedMax: 100,
|
|
81
|
+
ticks: {
|
|
82
|
+
stepSize: this.stepSize,
|
|
83
|
+
display: false,
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
this.translationContext = 'CHARTS.SPIDER.';
|
|
89
|
+
}
|
|
90
|
+
ngOnInit() {
|
|
91
|
+
if (!this.loading) {
|
|
92
|
+
this.handleInputErrors();
|
|
93
|
+
this.setChartData();
|
|
94
|
+
this.setChartOptions();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
handleInputErrors() {
|
|
98
|
+
if (!this.spiderChartData.labels || this.spiderChartData.labels.length === 0) {
|
|
99
|
+
throw new Error('The "labels" input is required and cannot be empty.');
|
|
100
|
+
}
|
|
101
|
+
if (!this.spiderChartData.labelDescription || this.spiderChartData.labelDescription.length === 0) {
|
|
102
|
+
throw new Error('The "labelDescription" input is required and cannot be empty.');
|
|
103
|
+
}
|
|
104
|
+
if (this.spiderChartData.labelDescription &&
|
|
105
|
+
this.spiderChartData.labelDescription.length !== this.spiderChartData.labels.length) {
|
|
106
|
+
throw new Error('The "labelDescription" input must have the same length as "labels".');
|
|
107
|
+
}
|
|
108
|
+
if (!this.spiderChartData.plotData[0].databaseLabel) {
|
|
109
|
+
throw new Error('The "plotData.databaseLabel" input is required.');
|
|
110
|
+
}
|
|
111
|
+
if (!this.spiderChartData.plotData[0].data || this.spiderChartData.plotData[0].data.length === 0) {
|
|
112
|
+
throw new Error('The "plotData.data" input is required and cannot be empty.');
|
|
113
|
+
}
|
|
114
|
+
if (this.spiderChartData.plotData[0].data.length !== this.spiderChartData.labels.length) {
|
|
115
|
+
throw new Error('The "plotData.data" input must have the same length as "labels".');
|
|
116
|
+
}
|
|
117
|
+
if (this.spiderChartData.plotData.length === 2 &&
|
|
118
|
+
this.spiderChartData.labels.length > 0 &&
|
|
119
|
+
this.spiderChartData.plotData[1].data &&
|
|
120
|
+
this.spiderChartData.plotData[1].data.length !== this.spiderChartData.labels.length) {
|
|
121
|
+
throw new Error('The "plotData.data" input must have the same length as "labels".');
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
setChartData() {
|
|
125
|
+
const datasets = [];
|
|
126
|
+
datasets.push({
|
|
127
|
+
label: this.spiderChartData.plotData[0].databaseLabel,
|
|
128
|
+
data: this.spiderChartData.plotData[0].data,
|
|
129
|
+
fill: true,
|
|
130
|
+
backgroundColor: 'rgba(212, 16, 170, 0.2)',
|
|
131
|
+
borderColor: Color.BRAND_50,
|
|
132
|
+
pointBackgroundColor: Color.BRAND_50,
|
|
133
|
+
pointBorderColor: Color.TGO_WHITE,
|
|
134
|
+
pointHoverBackgroundColor: Color.TGO_WHITE,
|
|
135
|
+
pointHoverBorderColor: Color.BRAND_50,
|
|
136
|
+
});
|
|
137
|
+
if (this.spiderChartData.plotData.length === 2) {
|
|
138
|
+
datasets.push({
|
|
139
|
+
label: this.spiderChartData.plotData[1].databaseLabel,
|
|
140
|
+
data: this.spiderChartData.plotData[1].data,
|
|
141
|
+
fill: false,
|
|
142
|
+
borderColor: Color.BLACK,
|
|
143
|
+
borderDash: [5, 5],
|
|
144
|
+
borderWidth: 1,
|
|
145
|
+
pointBackgroundColor: Color.BLACK,
|
|
146
|
+
pointBorderColor: Color.TGO_WHITE,
|
|
147
|
+
pointHoverBackgroundColor: Color.TGO_WHITE,
|
|
148
|
+
pointHoverBorderColor: Color.BLACK,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
this.radarChartData = {
|
|
152
|
+
labels: this.spiderChartData.labels,
|
|
153
|
+
datasets: datasets,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
setChartOptions() {
|
|
157
|
+
this.radarChartOptions = {
|
|
158
|
+
responsive: true,
|
|
159
|
+
elements: {
|
|
160
|
+
line: {
|
|
161
|
+
borderWidth: 3,
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
layout: {
|
|
165
|
+
padding: {
|
|
166
|
+
left: 40,
|
|
167
|
+
right: 40,
|
|
168
|
+
top: 40,
|
|
169
|
+
bottom: 40,
|
|
170
|
+
},
|
|
171
|
+
},
|
|
172
|
+
scales: {
|
|
173
|
+
r: {
|
|
174
|
+
angleLines: {
|
|
175
|
+
display: true,
|
|
176
|
+
color: Color.BLACK,
|
|
177
|
+
},
|
|
178
|
+
grid: {
|
|
179
|
+
color: context => {
|
|
180
|
+
if (context.tick.value === 100) {
|
|
181
|
+
return Color.BLACK;
|
|
182
|
+
}
|
|
183
|
+
return Color.GRAYSCALE_30;
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
pointLabels: {
|
|
187
|
+
color: 'black',
|
|
188
|
+
font: {
|
|
189
|
+
family: 'Arial',
|
|
190
|
+
size: 14,
|
|
191
|
+
},
|
|
192
|
+
display: false,
|
|
193
|
+
},
|
|
194
|
+
suggestedMin: 0,
|
|
195
|
+
suggestedMax: 100,
|
|
196
|
+
ticks: {
|
|
197
|
+
stepSize: this.stepSize,
|
|
198
|
+
display: false,
|
|
199
|
+
},
|
|
200
|
+
},
|
|
201
|
+
},
|
|
202
|
+
plugins: {
|
|
203
|
+
legend: {
|
|
204
|
+
display: false,
|
|
205
|
+
},
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
ngAfterViewInit() {
|
|
210
|
+
if (this.chart?.chart && !this.loading) {
|
|
211
|
+
this.logCornerCoordinates(this.chart.chart);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
logCornerCoordinates(chart) {
|
|
215
|
+
const scale = chart.scales['r'];
|
|
216
|
+
const canvasWidth = this.size === 'large' ? LargeSpiderChartSize : SmallSpiderChartSize;
|
|
217
|
+
const canvasHeight = this.size === 'large' ? LargeSpiderChartSize : SmallSpiderChartSize;
|
|
218
|
+
// Loop through the labels and calculate the percentage coordinates
|
|
219
|
+
this.spiderChartData.labels.forEach((label, index) => {
|
|
220
|
+
const position = scale.getPointPositionForValue(index, scale.max);
|
|
221
|
+
// Calculate percentage values relative to the canvas size
|
|
222
|
+
const xPercent = (position.x / canvasWidth) * 100;
|
|
223
|
+
const yPercent = ((canvasHeight - position.y) / canvasHeight) * 100; // Inverting the Y-axis
|
|
224
|
+
this.labelPositions[label] = { x: Number(xPercent.toFixed(2)), y: Number(yPercent.toFixed(2)) };
|
|
225
|
+
});
|
|
226
|
+
this.labelPositionsVisible = true;
|
|
227
|
+
}
|
|
228
|
+
getCenteredLabelBottomPosition(label, height) {
|
|
229
|
+
const position = this.labelPositions[label];
|
|
230
|
+
const padding = 7;
|
|
231
|
+
if (position.x > 50 || position.x < 50) {
|
|
232
|
+
return `calc(${position.y}% - ${height / 2}px)`;
|
|
233
|
+
}
|
|
234
|
+
else if (position.y < 50) {
|
|
235
|
+
return `calc(${position.y}% - ${height}px - ${padding}px)`;
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
return `calc(${position.y}% + ${padding}px)`;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
getCenteredLabelLeftPosition(label, width) {
|
|
242
|
+
const position = this.labelPositions[label];
|
|
243
|
+
const padding = 15;
|
|
244
|
+
if (position.x === 50) {
|
|
245
|
+
return `calc(${position.x}% - ${width / 2}px)`;
|
|
246
|
+
}
|
|
247
|
+
else if (position.x < 50) {
|
|
248
|
+
return `calc(${position.x}% - ${width}px - ${padding}px)`;
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
return `calc(${position.x}% + ${padding}px)`;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
onLabelKeyDown(event, index) {
|
|
255
|
+
if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {
|
|
256
|
+
this.focusNextLabel(index);
|
|
257
|
+
}
|
|
258
|
+
else if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {
|
|
259
|
+
this.focusPreviousLabel(index);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
focusNextLabel(index) {
|
|
263
|
+
const nextIndex = index + 1;
|
|
264
|
+
if (nextIndex < this.labelContainers.length) {
|
|
265
|
+
this.labelContainers.get(nextIndex)?.nativeElement.focus();
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
this.labelContainers.first?.nativeElement.focus();
|
|
269
|
+
}
|
|
270
|
+
this.focusedLabelIndex = nextIndex;
|
|
271
|
+
}
|
|
272
|
+
focusPreviousLabel(index) {
|
|
273
|
+
const previousIndex = index - 1;
|
|
274
|
+
if (previousIndex >= 0) {
|
|
275
|
+
this.labelContainers.get(previousIndex)?.nativeElement.focus();
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
this.labelContainers.last?.nativeElement.focus();
|
|
279
|
+
}
|
|
280
|
+
this.focusedLabelIndex = previousIndex;
|
|
281
|
+
}
|
|
282
|
+
onLegendItemKeyDown(event, index) {
|
|
283
|
+
if (event.key === 'Enter') {
|
|
284
|
+
this.toggleDatasetVisibility(index);
|
|
285
|
+
}
|
|
286
|
+
else if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {
|
|
287
|
+
this.focusNextLegendItem(index);
|
|
288
|
+
}
|
|
289
|
+
else if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {
|
|
290
|
+
this.focusPreviousLegendItem(index);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
focusNextLegendItem(index) {
|
|
294
|
+
const nextIndex = index + 1;
|
|
295
|
+
if (nextIndex < this.legendItems.length) {
|
|
296
|
+
this.legendItems.get(nextIndex)?.nativeElement.focus();
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
this.legendItems.first?.nativeElement.focus();
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
focusPreviousLegendItem(index) {
|
|
303
|
+
const previousIndex = index - 1;
|
|
304
|
+
if (previousIndex >= 0) {
|
|
305
|
+
this.legendItems.get(previousIndex)?.nativeElement.focus();
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
this.legendItems.last?.nativeElement.focus();
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
onFakeDataPointsKeyDown(event, index, isSecondary = false) {
|
|
312
|
+
if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {
|
|
313
|
+
this.focusNextFakeDataPoint(index, isSecondary);
|
|
314
|
+
this.showTooltipForDataPoint(index + 1 > this.spiderChartData.labels.length ? 0 : index + 1, isSecondary);
|
|
315
|
+
}
|
|
316
|
+
else if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {
|
|
317
|
+
this.focusPreviousFakeDataPoint(index, isSecondary);
|
|
318
|
+
this.showTooltipForDataPoint(index - 1 < 0 ? this.spiderChartData.labels.length - 1 : index - 1, isSecondary);
|
|
319
|
+
}
|
|
320
|
+
else if (event.key === 'Tab') {
|
|
321
|
+
this.resetActiveElement();
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
focusNextFakeDataPoint(index, isSecondary = false) {
|
|
325
|
+
const nextIndex = index + 1;
|
|
326
|
+
if (nextIndex < this.fakeDataPoints.length) {
|
|
327
|
+
const fakeDataPoints = isSecondary ? this.fakeDataPointsSecondary : this.fakeDataPoints;
|
|
328
|
+
fakeDataPoints.get(nextIndex)?.nativeElement.focus();
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
const fakeDataPoints = isSecondary ? this.fakeDataPointsSecondary : this.fakeDataPoints;
|
|
332
|
+
fakeDataPoints.first?.nativeElement.focus();
|
|
333
|
+
}
|
|
334
|
+
if (!isSecondary) {
|
|
335
|
+
this.focusedFakeDataPointIndex = nextIndex;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
focusPreviousFakeDataPoint(index, isSecondary = false) {
|
|
339
|
+
const previousIndex = index - 1;
|
|
340
|
+
if (previousIndex >= 0) {
|
|
341
|
+
const fakeDataPoints = isSecondary ? this.fakeDataPointsSecondary : this.fakeDataPoints;
|
|
342
|
+
fakeDataPoints.get(previousIndex)?.nativeElement.focus();
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
const fakeDataPoints = isSecondary ? this.fakeDataPointsSecondary : this.fakeDataPoints;
|
|
346
|
+
fakeDataPoints.last?.nativeElement.focus();
|
|
347
|
+
}
|
|
348
|
+
if (!isSecondary) {
|
|
349
|
+
this.focusedFakeDataPointIndex = previousIndex;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
showTooltipForDataPoint(index, isSecondary = false) {
|
|
353
|
+
const chartInstance = this.chart?.chart;
|
|
354
|
+
if (!chartInstance)
|
|
355
|
+
return;
|
|
356
|
+
const activeElement = [{ datasetIndex: isSecondary ? 1 : 0, index }];
|
|
357
|
+
const meta = chartInstance.getDatasetMeta(isSecondary ? 1 : 0);
|
|
358
|
+
const dataPoint = meta.data[index];
|
|
359
|
+
const eventPosition = {
|
|
360
|
+
x: dataPoint.x,
|
|
361
|
+
y: dataPoint.y,
|
|
362
|
+
};
|
|
363
|
+
if (!isSecondary) {
|
|
364
|
+
this.focusedFakeDataPointIndex = index;
|
|
365
|
+
}
|
|
366
|
+
chartInstance.tooltip?.setActiveElements(activeElement, eventPosition);
|
|
367
|
+
chartInstance.update();
|
|
368
|
+
}
|
|
369
|
+
resetActiveElement() {
|
|
370
|
+
const chartInstance = this.chart?.chart;
|
|
371
|
+
if (!chartInstance)
|
|
372
|
+
return;
|
|
373
|
+
// Clear the active elements to hide the tooltip
|
|
374
|
+
chartInstance.tooltip?.setActiveElements([], { x: 0, y: 0 });
|
|
375
|
+
chartInstance.update();
|
|
376
|
+
}
|
|
377
|
+
toggleDatasetVisibility(datasetIndex) {
|
|
378
|
+
const chartInstance = this.chart?.chart;
|
|
379
|
+
if (!chartInstance)
|
|
380
|
+
return;
|
|
381
|
+
const dataset = chartInstance.data.datasets[datasetIndex];
|
|
382
|
+
dataset.hidden = !dataset.hidden;
|
|
383
|
+
chartInstance.update();
|
|
384
|
+
}
|
|
385
|
+
isDatasetVisible(datasetIndex) {
|
|
386
|
+
const chartInstance = this.chart?.chart;
|
|
387
|
+
if (!chartInstance)
|
|
388
|
+
return;
|
|
389
|
+
return !chartInstance.data.datasets[datasetIndex].hidden;
|
|
390
|
+
}
|
|
391
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SpiderChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
392
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: SpiderChartComponent, selector: "ui-spider-chart", inputs: { size: "size", spiderChartData: "spiderChartData", stepSize: "stepSize", ariaLabel: "ariaLabel", loading: "loading", applicationTheme: "applicationTheme" }, viewQueries: [{ propertyName: "chart", first: true, predicate: BaseChartDirective, descendants: true }, { propertyName: "labelContainers", predicate: ["labelContainer"], descendants: true }, { propertyName: "fakeDataPoints", predicate: ["fakeDataPoints"], descendants: true }, { propertyName: "fakeDataPointsSecondary", predicate: ["fakeDataPointsSecondary"], descendants: true }, { propertyName: "legendItems", predicate: ["legendItem"], descendants: true }], ngImport: i0, template: "<div class=\"container\"\n tabindex=\"0\"\n [attr.aria-label]=\"ariaLabel\">\n <div class=\"spacing-container\"\n [ngClass]=\"{'small-spacing': radarChartData.labels && radarChartData.labels.length % 2 === 1 && !loading}\">\n <div class=\"chart-container\"\n [style.width]=\"size === 'large' ? '280px' : '200px'\"\n [style.height]=\"size === 'large' ? '280px' : '200px'\">\n @if (!loading) {\n <canvas\n baseChart\n [data]=\"radarChartData\"\n [options]=\"radarChartOptions\"\n type=\"radar\"\n class=\"chart\"\n >\n </canvas>\n } @else {\n <canvas\n baseChart\n [data]=\"loadingChartData\"\n [options]=\"loadingChartOptions\"\n type=\"radar\"\n class=\"chart\"\n >\n </canvas>\n <ui-spinner></ui-spinner>\n }\n\n @if (labelPositionsVisible) {\n <div class=\"overlay-container\">\n @for (label of spiderChartData.labels; track label) {\n <div class=\"label-container\" #labelContainer\n [matTooltip]=\"label + ': ' + spiderChartData.labelDescription[$index]\"\n [tabindex]=\"$index === 0 ? '0' : '-1'\"\n (keydown)=\"onLabelKeyDown($event, $index)\"\n [attr.aria-label]=\"label + ': ' + spiderChartData.labelDescription[$index]\"\n [style.left]=\"getCenteredLabelLeftPosition(label, labelContainer.offsetWidth)\"\n [style.bottom]=\"getCenteredLabelBottomPosition(label, labelContainer.offsetHeight)\">\n <div class=\"label\" #labelElement [style.max-width]=\"size === 'large' ? '150px' : '100px'\"\n [class.two-lines]=\"label.length > 20 && size === 'large' && spiderChartData.labels.length < 9\">\n {{ label }}\n </div>\n <span class=\"value\">{{ spiderChartData.plotData[0].data[$index] }}</span>\n </div>\n <span class=\"fake-data-points\" #fakeDataPoints\n [tabindex]=\"focusedLabelIndex === $index ? '0' : '-1'\"\n (focus)=\"$index === focusedLabelIndex ? showTooltipForDataPoint($index) : null\"\n (keydown)=\"onFakeDataPointsKeyDown($event, $index)\">\n </span>\n @if (radarChartData.datasets.length > 1) {\n <span class=\"fake-data-points-secondary\" #fakeDataPointsSecondary\n [tabindex]=\"focusedFakeDataPointIndex === $index ? '0' : '-1'\"\n (focus)=\"$index === focusedFakeDataPointIndex ? showTooltipForDataPoint($index, true) : null\"\n (keydown)=\"onFakeDataPointsKeyDown($event, $index, true)\">\n </span>\n }\n }\n </div>\n }\n </div>\n </div>\n @if (radarChartData.datasets.length > 0) {\n <div class=\"legend-container\">\n @for (dataset of radarChartData.datasets; track dataset.label) {\n <div class=\"legend-item\"\n (click)=\"toggleDatasetVisibility($index)\"\n [tabindex]=\"$index === 0 ? '0' : '-1'\"\n role=\"button\"\n [attr.aria-pressed]=\"isDatasetVisible($index) ? false : true\"\n [attr.aria-label]=\"isDatasetVisible($index) ?\n ((translationContext + 'DATASET_VISIBLE') | uiTranslate : { dataset: dataset.label } | async) :\n ((translationContext + 'DATASET_HIDDEN') | uiTranslate : { dataset: dataset.label } | async)\"\n (keydown)=\"onLegendItemKeyDown($event, $index)\"\n #legendItem>\n <span class=\"legend-line\" [ngClass]=\"{'solid-line': $index === 0, 'dashed-line': $index === 1}\"></span>\n <span class=\"legend-label\" [style.text-decoration]=\"isDatasetVisible($index) ? 'none' : 'line-through'\">\n {{ dataset.label }}\n </span>\n </div>\n }\n </div>\n }\n</div>\n\n", styles: [".bg-teal-60b{background:#1c443c}.bg-teal-30b{background:#31766a}.bg-teal-default{background:#46a997}.bg-teal-30w{background:#7ec3b6}.bg-teal-60w{background:#b5ddd5}.bg-teal-secondary{background:#cbd6cb}.bg-teal-90w{background:#ecf6f5}.bg-petrol-60b{background:#102930}.bg-petrol-30b{background:#1b4754}.bg-petrol-default{background:#276678}.bg-petrol-30w{background:#6894a0}.bg-petrol-60w{background:#a9c2c9}.bg-petrol-secondary{background:#c8d7de}.bg-petrol-90w{background:#e9f0f1}.bg-error-60b{background:#513131}.bg-error-30b{background:#8e5655}.bg-error-60w{background:#e3c3c6}.bg-error-secondary{background:#f0dad9}.bg-error-default{background:#cb7b7a}.bg-warning-secondary{background:#f0d6bb}.bg-warning-default{background:#cca45f}.bg-black{background:#000}.bg-dark{background:#888}.bg-medium{background:#e0e0e0}.bg-grey{background:#ededed}.bg-light{background:#f6f6f6}.bg-white{background:#fff}.bg-box-shadow{background:#00000014}.bg-navigation-subtitle{background:#528593}.bgc-teal-60b{background-color:#1c443c}.bgc-teal-30b{background-color:#31766a}.bgc-teal-default{background-color:#46a997}.bgc-teal-30w{background-color:#7ec3b6}.bgc-teal-60w{background-color:#b5ddd5}.bgc-teal-secondary{background-color:#cbd6cb}.bgc-teal-90w{background-color:#ecf6f5}.bgc-petrol-60b{background-color:#102930}.bgc-petrol-30b{background-color:#1b4754}.bgc-petrol-default{background-color:#276678}.bgc-petrol-30w{background-color:#6894a0}.bgc-petrol-60w{background-color:#a9c2c9}.bgc-petrol-secondary{background-color:#c8d7de}.bgc-petrol-90w{background-color:#e9f0f1}.bgc-error-60b{background-color:#513131}.bgc-error-30b{background-color:#8e5655}.bgc-error-60w{background-color:#e3c3c6}.bgc-error-secondary{background-color:#f0dad9}.bgc-error-default{background-color:#cb7b7a}.bgc-warning-secondary{background-color:#f0d6bb}.bgc-warning-default{background-color:#cca45f}.bgc-black{background-color:#000}.bgc-dark{background-color:#888}.bgc-medium{background-color:#e0e0e0}.bgc-grey{background-color:#ededed}.bgc-light{background-color:#f6f6f6}.bgc-white{background-color:#fff}.bgc-box-shadow{background-color:#00000014}.bgc-navigation-subtitle{background-color:#528593}.container{display:flex;flex-direction:column;align-items:center}.container .spacing-container{padding:40px 140px}.container .spacing-container.small-spacing{padding:0 80px}.container .spacing-container .chart-container{position:relative}.container .spacing-container .chart-container .overlay-container{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.container .spacing-container .chart-container .overlay-container .label-container{display:flex;gap:4px;position:absolute;pointer-events:all;cursor:pointer}.container .spacing-container .chart-container .overlay-container .label-container .fake-data-points{visibility:hidden}.container .spacing-container .chart-container .overlay-container .label-container:focus{outline:none}.container .spacing-container .chart-container .overlay-container .label-container .label{border-bottom:1px dashed #D3D3D3;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.container .spacing-container .chart-container .overlay-container .label-container .label.two-lines{width:150px;white-space:normal;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-clamp:2}.container .spacing-container .chart-container .overlay-container .label-container .value{font-weight:700}.container .legend-container{display:flex;gap:16px;cursor:pointer}.container .legend-container .legend-item{display:flex;align-items:center;gap:8px}.container .legend-container .legend-item .legend-line{display:inline-block;width:11px;height:4px}.container .legend-container .legend-item .solid-line{background-color:#d410aa}.container .legend-container .legend-item .dashed-line{border-top:2px dashed #242424}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.BaseChartDirective, selector: "canvas[baseChart]", inputs: ["type", "legend", "data", "options", "plugins", "labels", "datasets"], outputs: ["chartClick", "chartHover"], exportAs: ["base-chart"] }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i4.SpinnerComponent, selector: "ui-spinner", inputs: ["size", "isLoader", "applicationTheme"] }, { kind: "pipe", type: i5.UiTranslatePipe, name: "uiTranslate" }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }] }); }
|
|
393
|
+
}
|
|
394
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SpiderChartComponent, decorators: [{
|
|
395
|
+
type: Component,
|
|
396
|
+
args: [{ selector: 'ui-spider-chart', template: "<div class=\"container\"\n tabindex=\"0\"\n [attr.aria-label]=\"ariaLabel\">\n <div class=\"spacing-container\"\n [ngClass]=\"{'small-spacing': radarChartData.labels && radarChartData.labels.length % 2 === 1 && !loading}\">\n <div class=\"chart-container\"\n [style.width]=\"size === 'large' ? '280px' : '200px'\"\n [style.height]=\"size === 'large' ? '280px' : '200px'\">\n @if (!loading) {\n <canvas\n baseChart\n [data]=\"radarChartData\"\n [options]=\"radarChartOptions\"\n type=\"radar\"\n class=\"chart\"\n >\n </canvas>\n } @else {\n <canvas\n baseChart\n [data]=\"loadingChartData\"\n [options]=\"loadingChartOptions\"\n type=\"radar\"\n class=\"chart\"\n >\n </canvas>\n <ui-spinner></ui-spinner>\n }\n\n @if (labelPositionsVisible) {\n <div class=\"overlay-container\">\n @for (label of spiderChartData.labels; track label) {\n <div class=\"label-container\" #labelContainer\n [matTooltip]=\"label + ': ' + spiderChartData.labelDescription[$index]\"\n [tabindex]=\"$index === 0 ? '0' : '-1'\"\n (keydown)=\"onLabelKeyDown($event, $index)\"\n [attr.aria-label]=\"label + ': ' + spiderChartData.labelDescription[$index]\"\n [style.left]=\"getCenteredLabelLeftPosition(label, labelContainer.offsetWidth)\"\n [style.bottom]=\"getCenteredLabelBottomPosition(label, labelContainer.offsetHeight)\">\n <div class=\"label\" #labelElement [style.max-width]=\"size === 'large' ? '150px' : '100px'\"\n [class.two-lines]=\"label.length > 20 && size === 'large' && spiderChartData.labels.length < 9\">\n {{ label }}\n </div>\n <span class=\"value\">{{ spiderChartData.plotData[0].data[$index] }}</span>\n </div>\n <span class=\"fake-data-points\" #fakeDataPoints\n [tabindex]=\"focusedLabelIndex === $index ? '0' : '-1'\"\n (focus)=\"$index === focusedLabelIndex ? showTooltipForDataPoint($index) : null\"\n (keydown)=\"onFakeDataPointsKeyDown($event, $index)\">\n </span>\n @if (radarChartData.datasets.length > 1) {\n <span class=\"fake-data-points-secondary\" #fakeDataPointsSecondary\n [tabindex]=\"focusedFakeDataPointIndex === $index ? '0' : '-1'\"\n (focus)=\"$index === focusedFakeDataPointIndex ? showTooltipForDataPoint($index, true) : null\"\n (keydown)=\"onFakeDataPointsKeyDown($event, $index, true)\">\n </span>\n }\n }\n </div>\n }\n </div>\n </div>\n @if (radarChartData.datasets.length > 0) {\n <div class=\"legend-container\">\n @for (dataset of radarChartData.datasets; track dataset.label) {\n <div class=\"legend-item\"\n (click)=\"toggleDatasetVisibility($index)\"\n [tabindex]=\"$index === 0 ? '0' : '-1'\"\n role=\"button\"\n [attr.aria-pressed]=\"isDatasetVisible($index) ? false : true\"\n [attr.aria-label]=\"isDatasetVisible($index) ?\n ((translationContext + 'DATASET_VISIBLE') | uiTranslate : { dataset: dataset.label } | async) :\n ((translationContext + 'DATASET_HIDDEN') | uiTranslate : { dataset: dataset.label } | async)\"\n (keydown)=\"onLegendItemKeyDown($event, $index)\"\n #legendItem>\n <span class=\"legend-line\" [ngClass]=\"{'solid-line': $index === 0, 'dashed-line': $index === 1}\"></span>\n <span class=\"legend-label\" [style.text-decoration]=\"isDatasetVisible($index) ? 'none' : 'line-through'\">\n {{ dataset.label }}\n </span>\n </div>\n }\n </div>\n }\n</div>\n\n", styles: [".bg-teal-60b{background:#1c443c}.bg-teal-30b{background:#31766a}.bg-teal-default{background:#46a997}.bg-teal-30w{background:#7ec3b6}.bg-teal-60w{background:#b5ddd5}.bg-teal-secondary{background:#cbd6cb}.bg-teal-90w{background:#ecf6f5}.bg-petrol-60b{background:#102930}.bg-petrol-30b{background:#1b4754}.bg-petrol-default{background:#276678}.bg-petrol-30w{background:#6894a0}.bg-petrol-60w{background:#a9c2c9}.bg-petrol-secondary{background:#c8d7de}.bg-petrol-90w{background:#e9f0f1}.bg-error-60b{background:#513131}.bg-error-30b{background:#8e5655}.bg-error-60w{background:#e3c3c6}.bg-error-secondary{background:#f0dad9}.bg-error-default{background:#cb7b7a}.bg-warning-secondary{background:#f0d6bb}.bg-warning-default{background:#cca45f}.bg-black{background:#000}.bg-dark{background:#888}.bg-medium{background:#e0e0e0}.bg-grey{background:#ededed}.bg-light{background:#f6f6f6}.bg-white{background:#fff}.bg-box-shadow{background:#00000014}.bg-navigation-subtitle{background:#528593}.bgc-teal-60b{background-color:#1c443c}.bgc-teal-30b{background-color:#31766a}.bgc-teal-default{background-color:#46a997}.bgc-teal-30w{background-color:#7ec3b6}.bgc-teal-60w{background-color:#b5ddd5}.bgc-teal-secondary{background-color:#cbd6cb}.bgc-teal-90w{background-color:#ecf6f5}.bgc-petrol-60b{background-color:#102930}.bgc-petrol-30b{background-color:#1b4754}.bgc-petrol-default{background-color:#276678}.bgc-petrol-30w{background-color:#6894a0}.bgc-petrol-60w{background-color:#a9c2c9}.bgc-petrol-secondary{background-color:#c8d7de}.bgc-petrol-90w{background-color:#e9f0f1}.bgc-error-60b{background-color:#513131}.bgc-error-30b{background-color:#8e5655}.bgc-error-60w{background-color:#e3c3c6}.bgc-error-secondary{background-color:#f0dad9}.bgc-error-default{background-color:#cb7b7a}.bgc-warning-secondary{background-color:#f0d6bb}.bgc-warning-default{background-color:#cca45f}.bgc-black{background-color:#000}.bgc-dark{background-color:#888}.bgc-medium{background-color:#e0e0e0}.bgc-grey{background-color:#ededed}.bgc-light{background-color:#f6f6f6}.bgc-white{background-color:#fff}.bgc-box-shadow{background-color:#00000014}.bgc-navigation-subtitle{background-color:#528593}.container{display:flex;flex-direction:column;align-items:center}.container .spacing-container{padding:40px 140px}.container .spacing-container.small-spacing{padding:0 80px}.container .spacing-container .chart-container{position:relative}.container .spacing-container .chart-container .overlay-container{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.container .spacing-container .chart-container .overlay-container .label-container{display:flex;gap:4px;position:absolute;pointer-events:all;cursor:pointer}.container .spacing-container .chart-container .overlay-container .label-container .fake-data-points{visibility:hidden}.container .spacing-container .chart-container .overlay-container .label-container:focus{outline:none}.container .spacing-container .chart-container .overlay-container .label-container .label{border-bottom:1px dashed #D3D3D3;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.container .spacing-container .chart-container .overlay-container .label-container .label.two-lines{width:150px;white-space:normal;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-clamp:2}.container .spacing-container .chart-container .overlay-container .label-container .value{font-weight:700}.container .legend-container{display:flex;gap:16px;cursor:pointer}.container .legend-container .legend-item{display:flex;align-items:center;gap:8px}.container .legend-container .legend-item .legend-line{display:inline-block;width:11px;height:4px}.container .legend-container .legend-item .solid-line{background-color:#d410aa}.container .legend-container .legend-item .dashed-line{border-top:2px dashed #242424}\n"] }]
|
|
397
|
+
}], propDecorators: { size: [{
|
|
398
|
+
type: Input
|
|
399
|
+
}], spiderChartData: [{
|
|
400
|
+
type: Input
|
|
401
|
+
}], stepSize: [{
|
|
402
|
+
type: Input
|
|
403
|
+
}], ariaLabel: [{
|
|
404
|
+
type: Input
|
|
405
|
+
}], loading: [{
|
|
406
|
+
type: Input
|
|
407
|
+
}], applicationTheme: [{
|
|
408
|
+
type: Input
|
|
409
|
+
}], chart: [{
|
|
410
|
+
type: ViewChild,
|
|
411
|
+
args: [BaseChartDirective]
|
|
412
|
+
}], labelContainers: [{
|
|
413
|
+
type: ViewChildren,
|
|
414
|
+
args: ['labelContainer']
|
|
415
|
+
}], fakeDataPoints: [{
|
|
416
|
+
type: ViewChildren,
|
|
417
|
+
args: ['fakeDataPoints']
|
|
418
|
+
}], fakeDataPointsSecondary: [{
|
|
419
|
+
type: ViewChildren,
|
|
420
|
+
args: ['fakeDataPointsSecondary']
|
|
421
|
+
}], legendItems: [{
|
|
422
|
+
type: ViewChildren,
|
|
423
|
+
args: ['legendItem']
|
|
424
|
+
}] } });
|
|
425
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BpZGVyLWNoYXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Rnby1jYW5vcHktdWkvY29tcG9uZW50cy9zcGlkZXItY2hhcnQvc3BpZGVyLWNoYXJ0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Rnby1jYW5vcHktdWkvY29tcG9uZW50cy9zcGlkZXItY2hhcnQvc3BpZGVyLWNoYXJ0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBR1QsS0FBSyxFQUlMLFNBQVMsRUFDVCxZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLG9CQUFvQixFQUFvQyxNQUFNLHNCQUFzQixDQUFDO0FBR3BILE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxZQUFZLENBQUM7Ozs7Ozs7QUFTaEQsTUFBTSxPQUFPLG9CQUFvQjtJQUxqQztRQU1FOzs7O1dBSUc7UUFDTSxTQUFJLEdBQW9CLE9BQU8sQ0FBQztRQVN6Qzs7OztXQUlHO1FBQ00sYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUUvQjs7OztXQUlHO1FBQ00sY0FBUyxHQUFXLHVEQUF1RCxDQUFDO1FBRXJGOzs7O1dBSUc7UUFDTSxZQUFPLEdBQVksS0FBSyxDQUFDO1FBRWxDOzs7Ozs7V0FNRztRQUNNLHFCQUFnQixHQUFxQixPQUFPLENBQUM7UUFRdEQsbUJBQWMsR0FBdUI7WUFDbkMsTUFBTSxFQUFFLEVBQUU7WUFDVixRQUFRLEVBQUUsRUFBRTtTQUNiLENBQUM7UUFFRixtQkFBYyxHQUFnRCxFQUFFLENBQUM7UUFDakUsMEJBQXFCLEdBQVksS0FBSyxDQUFDO1FBQ3ZDLHNCQUFpQixHQUFXLENBQUMsQ0FBQztRQUM5Qiw4QkFBeUIsR0FB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QUFLLEVBQUUsS0FBSyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxhQUFhO1lBQUUsT0FBTztRQUUzQixNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMxRCxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUNqQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELGdCQUFnQixDQUFDLFlBQW9CO1FBQ25DLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxhQUFhO1lBQUUsT0FBTztRQUMzQixPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzNELENBQUM7K0dBMVpVLG9CQUFvQjttR0FBcEIsb0JBQW9CLG9RQTZDcEIsa0JBQWtCLG9aQ3JFL0IsZzBIQXFGQTs7NEZEN0RhLG9CQUFvQjtrQkFMaEMsU0FBUzsrQkFDRSxpQkFBaUI7OEJBVWxCLElBQUk7c0JBQVosS0FBSztnQkFPRyxlQUFlO3NCQUF2QixLQUFLO2dCQU9HLFFBQVE7c0JBQWhCLEtBQUs7Z0JBT0csU0FBUztzQkFBakIsS0FBSztnQkFPRyxPQUFPO3NCQUFmLEtBQUs7Z0JBU0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUV5QixLQUFLO3NCQUFuQyxTQUFTO3VCQUFDLGtCQUFrQjtnQkFDRyxlQUFlO3NCQUE5QyxZQUFZO3VCQUFDLGdCQUFnQjtnQkFDRSxjQUFjO3NCQUE3QyxZQUFZO3VCQUFDLGdCQUFnQjtnQkFDVyx1QkFBdUI7c0JBQS9ELFlBQVk7dUJBQUMseUJBQXlCO2dCQUNYLFdBQVc7c0JBQXRDLFlBQVk7dUJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgUXVlcnlMaXN0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMYXJnZVNwaWRlckNoYXJ0U2l6ZSwgU21hbGxTcGlkZXJDaGFydFNpemUsIFNwaWRlckNoYXJ0RGF0YSwgU3BpZGVyQ2hhcnRTaXplIH0gZnJvbSAnLi9zcGlkZXItY2hhcnQubW9kZWwnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25UaGVtZSB9IGZyb20gJy4uLy4uL21vZGVscy9hcHBsaWNhdGlvbi10aGVtZS5tb2RlbCc7XG5pbXBvcnQgeyBDaGFydCwgQ2hhcnREYXRhLCBDaGFydE9wdGlvbnMgfSBmcm9tICdjaGFydC5qcyc7XG5pbXBvcnQgeyBDb2xvciB9IGZyb20gJy4vLi4vLi4vbW9kZWxzL2NvbG9ycy5tb2RlbCc7XG5pbXBvcnQgeyBCYXNlQ2hhcnREaXJlY3RpdmUgfSBmcm9tICduZzItY2hhcnRzJztcbmltcG9ydCB7IExhbmd1YWdlU2VydmljZSB9IGZyb20gJy4uLy4uL3V0aWxzL2xvY2FsaXphdGlvbi9sYW5ndWFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IExhbmd1YWdlIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9jYWxpemF0aW9uL2xhbmd1YWdlLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndWktc3BpZGVyLWNoYXJ0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NwaWRlci1jaGFydC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NwaWRlci1jaGFydC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBTcGlkZXJDaGFydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBvZiB0aGUgc3BpZGVyIGNoYXJ0LlxuICAgKiBAdHlwZSB7U3BpZGVyQ2hhcnRTaXplfVxuICAgKiBAbWVtYmVyb2YgU3BpZGVyQ2hhcnRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIHNpemU6IFNwaWRlckNoYXJ0U2l6ZSA9ICdsYXJnZSc7XG5cbiAgLyoqXG4gICAqIFRoZSBkYXRhIHRvIGJlIHVzZWQgZm9yIHRoZSBzcGlkZXIgY2hhcnQuXG4gICAqIEB0eXBlIHtTcGlkZXJDaGFydERhdGF9XG4gICAqIEBtZW1iZXJvZiBTcGlkZXJDaGFydENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KCkgc3BpZGVyQ2hhcnREYXRhOiBTcGlkZXJDaGFydERhdGE7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGVwIHNpemUgZm9yIHRoZSBzcGlkZXIgY2hhcnQuXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBTcGlkZXJDaGFydENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KCkgc3RlcFNpemU6IG51bWJlciA9IDIwO1xuXG4gIC8qKlxuICAgKiBUaGUgYXJpYSBsYWJlbCBmb3IgdGhlIHNwaWRlciBjaGFydC5cbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQG1lbWJlcm9mIFNwaWRlckNoYXJ0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBhcmlhTGFiZWw6IHN0cmluZyA9ICdSYWRhciBjaGFydC4gUHJlc3MgdGFiIHRvIG5hdmlnYXRlIHRocm91Z2ggdGhlIGNoYXJ0Lic7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHNwaWRlciBjaGFydCBpcyBsb2FkaW5nLlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQG1lbWJlcm9mIFNwaWRlckNoYXJ0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKSBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqXG4gICAqIERlZmluZXMgdGhlIGFwcGxpY2F0aW9uIHRoZW1lXG4gICAqXG4gICAqIEB0eXBlIHtBcHBsaWNhdGlvblRoZW1lfVxuICAgKiBAbWVtYmVyb2YgU3Bpbm5lckNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KCkgYXBwbGljYXRpb25UaGVtZTogQXBwbGljYXRpb25UaGVtZSA9ICdsaWdodCc7XG5cbiAgQFZpZXdDaGlsZChCYXNlQ2hhcnREaXJlY3RpdmUpIGNoYXJ0OiBCYXNlQ2hhcnREaXJlY3RpdmU7XG4gIEBWaWV3Q2hpbGRyZW4oJ2xhYmVsQ29udGFpbmVyJykgbGFiZWxDb250YWluZXJzOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG4gIEBWaWV3Q2hpbGRyZW4oJ2Zha2VEYXRhUG9pbnRzJykgZmFrZURhdGFQb2ludHM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcbiAgQFZpZXdDaGlsZHJlbignZmFrZURhdGFQb2ludHNTZWNvbmRhcnknKSBmYWtlRGF0YVBvaW50c1NlY29uZGFyeTogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuICBAVmlld0NoaWxkcmVuKCdsZWdlbmRJdGVtJykgbGVnZW5kSXRlbXM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcblxuICByYWRhckNoYXJ0RGF0YTogQ2hhcnREYXRhPCdyYWRhcic+ID0ge1xuICAgIGxhYmVsczogW10sXG4gICAgZGF0YXNldHM6IFtdLFxuICB9O1xuICByYWRhckNoYXJ0T3B0aW9uczogQ2hhcnRPcHRpb25zPCdyYWRhcic+O1xuICBsYWJlbFBvc2l0aW9uczogeyBba2V5OiBzdHJpbmddOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gfSA9IHt9O1xuICBsYWJlbFBvc2l0aW9uc1Zpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZm9jdXNlZExhYmVsSW5kZXg6IG51bWJlciA9IDA7XG4gIGZvY3VzZWRGYWtlRGF0YVBvaW50SW5kZXg6IG51bWJlciA9IDA7XG4gIGxvYWRpbmdDaGFydERhdGE6IENoYXJ0RGF0YTwncmFkYXInPiA9IHtcbiAgICBsYWJlbHM6IFsxLCAyLCAzLCA0LCA1LCA2XSxcbiAgICBkYXRhc2V0czogW10sXG4gIH07XG4gIGxvYWRpbmdDaGFydE9wdGlvbnM6IENoYXJ0T3B0aW9uczwncmFkYXInPiA9IHtcbiAgICByZXNwb25zaXZlOiB0cnVlLFxuICAgIGxheW91dDoge1xuICAgICAgcGFkZGluZzoge1xuICAgICAgICBsZWZ0OiA0MCxcbiAgICAgICAgcmlnaHQ6IDQwLFxuICAgICAgICB0b3A6IDQwLFxuICAgICAgICBib3R0b206IDQwLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHNjYWxlczoge1xuICAgICAgcjoge1xuICAgICAgICBhbmdsZUxpbmVzOiB7XG4gICAgICAgICAgZGlzcGxheTogdHJ1ZSxcbiAgICAgICAgICBjb2xvcjogQ29sb3IuR1JBWVNDQUxFXzMwLFxuICAgICAgICB9LFxuICAgICAgICBncmlkOiB7XG4gICAgICAgICAgY29sb3I6ICgpID0+IENvbG9yLkdSQVlTQ0FMRV8zMCxcbiAgICAgICAgfSxcbiAgICAgICAgcG9pbnRMYWJlbHM6IHtcbiAgICAgICAgICBkaXNwbGF5OiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAgc3VnZ2VzdGVkTWluOiAwLFxuICAgICAgICBzdWdnZXN0ZWRNYXg6IDEwMCxcbiAgICAgICAgdGlja3M6IHtcbiAgICAgICAgICBzdGVwU2l6ZTogdGhpcy5zdGVwU2l6ZSxcbiAgICAgICAgICBkaXNwbGF5OiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRyYW5zbGF0aW9uQ29udGV4dCA9ICdDSEFSVFMuU1BJREVSLic7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmxvYWRpbmcpIHtcbiAgICAgIHRoaXMuaGFuZGxlSW5wdXRFcnJvcnMoKTtcbiAgICAgIHRoaXMuc2V0Q2hhcnREYXRhKCk7XG4gICAgICB0aGlzLnNldENoYXJ0T3B0aW9ucygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlSW5wdXRFcnJvcnMoKSB7XG4gICAgaWYgKCF0aGlzLnNwaWRlckNoYXJ0RGF0YS5sYWJlbHMgfHwgdGhpcy5zcGlkZXJDaGFydERhdGEubGFiZWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgXCJsYWJlbHNcIiBpbnB1dCBpcyByZXF1aXJlZCBhbmQgY2Fubm90IGJlIGVtcHR5LicpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuc3BpZGVyQ2hhcnREYXRhLmxhYmVsRGVzY3JpcHRpb24gfHwgdGhpcy5zcGlkZXJDaGFydERhdGEubGFiZWxEZXNjcmlwdGlvbi5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIFwibGFiZWxEZXNjcmlwdGlvblwiIGlucHV0IGlzIHJlcXVpcmVkIGFuZCBjYW5ub3QgYmUgZW1wdHkuJyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMuc3BpZGVyQ2hhcnREYXRhLmxhYmVsRGVzY3JpcHRpb24gJiZcbiAgICAgIHRoaXMuc3BpZGVyQ2hhcnREYXRhLmxhYmVsRGVzY3JpcHRpb24ubGVuZ3RoICE9PSB0aGlzLnNwaWRlckNoYXJ0RGF0YS5sYWJlbHMubGVuZ3RoXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBcImxhYmVsRGVzY3JpcHRpb25cIiBpbnB1dCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIFwibGFiZWxzXCIuJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5zcGlkZXJDaGFydERhdGEucGxvdERhdGFbMF0uZGF0YWJhc2VMYWJlbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgXCJwbG90RGF0YS5kYXRhYmFzZUxhYmVsXCIgaW5wdXQgaXMgcmVxdWlyZWQuJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5zcGlkZXJDaGFydERhdGEucGxvdERhdGFbMF0uZGF0YSB8fCB0aGlzLnNwaWRlckNoYXJ0RGF0YS5wbG90RGF0YVswXS5kYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgXCJwbG90RGF0YS5kYXRhXCIgaW5wdXQgaXMgcmVxdWlyZWQgYW5kIGNhbm5vdCBiZSBlbXB0eS4nKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3BpZGVyQ2hhcnREYXRhLnBsb3REYXRhWzBdLmRhdGEubGVuZ3RoICE9PSB0aGlzLnNwaWRlckNoYXJ0RGF0YS5sYWJlbHMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBcInBsb3REYXRhLmRhdGFcIiBpbnB1dCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIFwibGFiZWxzXCIuJyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMuc3BpZGVyQ2hhcnREYXRhLnBsb3REYXRhLmxlbmd0aCA9PT0gMiAmJlxuICAgICAgdGhpcy5zcGlkZXJDaGFydERhdGEubGFiZWxzLmxlbmd0aCA+IDAgJiZcbiAgICAgIHRoaXMuc3BpZGVyQ2hhcnREYXRhLnBsb3REYXRhWzFdLmRhdGEgJiZcbiAgICAgIHRoaXMuc3BpZGVyQ2hhcnREYXRhLnBsb3REYXRhWzFdLmRhdGEubGVuZ3RoICE9PSB0aGlzLnNwaWRlckNoYXJ0RGF0YS5sYWJlbHMubGVuZ3RoXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBcInBsb3REYXRhLmRhdGFcIiBpbnB1dCBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIFwibGFiZWxzXCIuJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRDaGFydERhdGEoKSB7XG4gICAgY29uc3QgZGF0YXNldHMgPSBbXTtcbiAgICBkYXRhc2V0cy5wdXNoKHtcbiAgICAgIGxhYmVsOiB0aGlzLnNwaWRlckNoYXJ0RGF0YS5wbG90RGF0YVswXS5kYXRhYmFzZUxhYmVsLFxuICAgICAgZGF0YTogdGhpcy5zcGlkZXJDaGFydERhdGEucGxvdERhdGFbMF0uZGF0YSxcbiAgICAgIGZpbGw6IHRydWUsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDIxMiwgMTYsIDE3MCwgMC4yKScsXG4gICAgICBib3JkZXJDb2xvcjogQ29sb3IuQlJBTkRfNTAsXG4gICAgICBwb2ludEJhY2tncm91bmRDb2xvcjogQ29sb3IuQlJBTkRfNTAsXG4gICAgICBwb2ludEJvcmRlckNvbG9yOiBDb2xvci5UR09fV0hJVEUsXG4gICAgICBwb2ludEhvdmVyQmFja2dyb3VuZENvbG9yOiBDb2xvci5UR09fV0hJVEUsXG4gICAgICBwb2ludEhvdmVyQm9yZGVyQ29sb3I6IENvbG9yLkJSQU5EXzUwLFxuICAgIH0pO1xuICAgIGlmICh0aGlzLnNwaWRlckNoYXJ0RGF0YS5wbG90RGF0YS5sZW5ndGggPT09IDIpIHtcbiAgICAgIGRhdGFzZXRzLnB1c2goe1xuICAgICAgICBsYWJlbDogdGhpcy5zcGlkZXJDaGFydERhdGEucGxvdERhdGFbMV0uZGF0YWJhc2VMYWJlbCxcbiAgICAgICAgZGF0YTogdGhpcy5zcGlkZXJDaGFydERhdGEucGxvdERhdGFbMV0uZGF0YSxcbiAgICAgICAgZmlsbDogZmFsc2UsXG4gICAgICAgIGJvcmRlckNvbG9yOiBDb2xvci5CTEFDSyxcbiAgICAgICAgYm9yZGVyRGFzaDogWzUsIDVdLFxuICAgICAgICBib3JkZXJXaWR0aDogMSxcbiAgICAgICAgcG9pbnRCYWNrZ3JvdW5kQ29sb3I6IENvbG9yLkJMQUNLLFxuICAgICAgICBwb2ludEJvcmRlckNvbG9yOiBDb2xvci5UR09fV0hJVEUsXG4gICAgICAgIHBvaW50SG92ZXJCYWNrZ3JvdW5kQ29sb3I6IENvbG9yLlRHT19XSElURSxcbiAgICAgICAgcG9pbnRIb3ZlckJvcmRlckNvbG9yOiBDb2xvci5CTEFDSyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnJhZGFyQ2hhcnREYXRhID0ge1xuICAgICAgbGFiZWxzOiB0aGlzLnNwaWRlckNoYXJ0RGF0YS5sYWJlbHMsXG4gICAgICBkYXRhc2V0czogZGF0YXNldHMsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Q2hhcnRPcHRpb25zKCkge1xuICAgIHRoaXMucmFkYXJDaGFydE9wdGlvbnMgPSB7XG4gICAgICByZXNwb25zaXZlOiB0cnVlLFxuICAgICAgZWxlbWVudHM6IHtcbiAgICAgICAgbGluZToge1xuICAgICAgICAgIGJvcmRlcldpZHRoOiAzLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGxheW91dDoge1xuICAgICAgICBwYWRkaW5nOiB7XG4gICAgICAgICAgbGVmdDogNDAsXG4gICAgICAgICAgcmlnaHQ6IDQwLFxuICAgICAgICAgIHRvcDogNDAsXG4gICAgICAgICAgYm90dG9tOiA0MCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzY2FsZXM6IHtcbiAgICAgICAgcjoge1xuICAgICAgICAgIGFuZ2xlTGluZXM6IHtcbiAgICAgICAgICAgIGRpc3BsYXk6IHRydWUsXG4gICAgICAgICAgICBjb2xvcjogQ29sb3IuQkxBQ0ssXG4gICAgICAgICAgfSxcbiAgICAgICAgICBncmlkOiB7XG4gICAgICAgICAgICBjb2xvcjogY29udGV4dCA9PiB7XG4gICAgICAgICAgICAgIGlmIChjb250ZXh0LnRpY2sudmFsdWUgPT09IDEwMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBDb2xvci5CTEFDSztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gQ29sb3IuR1JBWVNDQUxFXzMwO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBvaW50TGFiZWxzOiB7XG4gICAgICAgICAgICBjb2xvcjogJ2JsYWNrJyxcbiAgICAgICAgICAgIGZvbnQ6IHtcbiAgICAgICAgICAgICAgZmFtaWx5OiAnQXJpYWwnLFxuICAgICAgICAgICAgICBzaXplOiAxNCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkaXNwbGF5OiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN1Z2dlc3RlZE1pbjogMCxcbiAgICAgICAgICBzdWdnZXN0ZWRNYXg6IDEwMCxcbiAgICAgICAgICB0aWNrczoge1xuICAgICAgICAgICAgc3RlcFNpemU6IHRoaXMuc3RlcFNpemUsXG4gICAgICAgICAgICBkaXNwbGF5OiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHBsdWdpbnM6IHtcbiAgICAgICAgbGVnZW5kOiB7XG4gICAgICAgICAgZGlzcGxheTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hhcnQ/LmNoYXJ0ICYmICF0aGlzLmxvYWRpbmcpIHtcbiAgICAgIHRoaXMubG9nQ29ybmVyQ29vcmRpbmF0ZXModGhpcy5jaGFydC5jaGFydCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2dDb3JuZXJDb29yZGluYXRlcyhjaGFydDogQ2hhcnQpIHtcbiAgICBjb25zdCBzY2FsZSA9IGNoYXJ0LnNjYWxlc1snciddIGFzIGFueTtcbiAgICBjb25zdCBjYW52YXNXaWR0aCA9IHRoaXMuc2l6ZSA9PT0gJ2xhcmdlJyA/IExhcmdlU3BpZGVyQ2hhcnRTaXplIDogU21hbGxTcGlkZXJDaGFydFNpemU7XG4gICAgY29uc3QgY2FudmFzSGVpZ2h0ID0gdGhpcy5zaXplID09PSAnbGFyZ2UnID8gTGFyZ2VTcGlkZXJDaGFydFNpemUgOiBTbWFsbFNwaWRlckNoYXJ0U2l6ZTtcblxuICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgbGFiZWxzIGFuZCBjYWxjdWxhdGUgdGhlIHBlcmNlbnRhZ2UgY29vcmRpbmF0ZXNcbiAgICB0aGlzLnNwaWRlckNoYXJ0RGF0YS5sYWJlbHMuZm9yRWFjaCgobGFiZWwsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBwb3NpdGlvbiA9IHNjYWxlLmdldFBvaW50UG9zaXRpb25Gb3JWYWx1ZShpbmRleCwgc2NhbGUubWF4KTtcblxuICAgICAgLy8gQ2FsY3VsYXRlIHBlcmNlbnRhZ2UgdmFsdWVzIHJlbGF0aXZlIHRvIHRoZSBjYW52YXMgc2l6ZVxuICAgICAgY29uc3QgeFBlcmNlbnQgPSAocG9zaXRpb24ueCAvIGNhbnZhc1dpZHRoKSAqIDEwMDtcbiAgICAgIGNvbnN0IHlQZXJjZW50ID0gKChjYW52YXNIZWlnaHQgLSBwb3NpdGlvbi55KSAvIGNhbnZhc0hlaWdodCkgKiAxMDA7IC8vIEludmVydGluZyB0aGUgWS1heGlzXG5cbiAgICAgIHRoaXMubGFiZWxQb3NpdGlvbnNbbGFiZWxdID0geyB4OiBOdW1iZXIoeFBlcmNlbnQudG9GaXhlZCgyKSksIHk6IE51bWJlcih5UGVyY2VudC50b0ZpeGVkKDIpKSB9O1xuICAgIH0pO1xuICAgIHRoaXMubGFiZWxQb3NpdGlvbnNWaXNpYmxlID0gdHJ1ZTtcbiAgfVxuXG4gIGdldENlbnRlcmVkTGFiZWxCb3R0b21Qb3NpdGlvbihsYWJlbDogc3RyaW5nLCBoZWlnaHQ6IG51bWJlcikge1xuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5sYWJlbFBvc2l0aW9uc1tsYWJlbF07XG4gICAgY29uc3QgcGFkZGluZyA9IDc7XG4gICAgaWYgKHBvc2l0aW9uLnggPiA1MCB8fCBwb3NpdGlvbi54IDwgNTApIHtcbiAgICAgIHJldHVybiBgY2FsYygke3Bvc2l0aW9uLnl9JSAtICR7aGVpZ2h0IC8gMn1weClgO1xuICAgIH0gZWxzZSBpZiAocG9zaXRpb24ueSA8IDUwKSB7XG4gICAgICByZXR1cm4gYGNhbGMoJHtwb3NpdGlvbi55fSUgLSAke2hlaWdodH1weCAtICR7cGFkZGluZ31weClgO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYGNhbGMoJHtwb3NpdGlvbi55fSUgKyAke3BhZGRpbmd9cHgpYDtcbiAgICB9XG4gIH1cblxuICBnZXRDZW50ZXJlZExhYmVsTGVmdFBvc2l0aW9uKGxhYmVsOiBzdHJpbmcsIHdpZHRoOiBudW1iZXIpIHtcbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMubGFiZWxQb3NpdGlvbnNbbGFiZWxdO1xuICAgIGNvbnN0IHBhZGRpbmcgPSAxNTtcbiAgICBpZiAocG9zaXRpb24ueCA9PT0gNTApIHtcbiAgICAgIHJldHVybiBgY2FsYygke3Bvc2l0aW9uLnh9JSAtICR7d2lkdGggLyAyfXB4KWA7XG4gICAgfSBlbHNlIGlmIChwb3NpdGlvbi54IDwgNTApIHtcbiAgICAgIHJldHVybiBgY2FsYygke3Bvc2l0aW9uLnh9JSAtICR7d2lkdGh9cHggLSAke3BhZGRpbmd9cHgpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGBjYWxjKCR7cG9zaXRpb24ueH0lICsgJHtwYWRkaW5nfXB4KWA7XG4gICAgfVxuICB9XG5cbiAgb25MYWJlbEtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dSaWdodCcgfHwgZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykge1xuICAgICAgdGhpcy5mb2N1c05leHRMYWJlbChpbmRleCk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0xlZnQnIHx8IGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnKSB7XG4gICAgICB0aGlzLmZvY3VzUHJldmlvdXNMYWJlbChpbmRleCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmb2N1c05leHRMYWJlbChpbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgbmV4dEluZGV4ID0gaW5kZXggKyAxO1xuICAgIGlmIChuZXh0SW5kZXggPCB0aGlzLmxhYmVsQ29udGFpbmVycy5sZW5ndGgpIHtcbiAgICAgIHRoaXMubGFiZWxDb250YWluZXJzLmdldChuZXh0SW5kZXgpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubGFiZWxDb250YWluZXJzLmZpcnN0Py5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICAgIHRoaXMuZm9jdXNlZExhYmVsSW5kZXggPSBuZXh0SW5kZXg7XG4gIH1cblxuICBwcml2YXRlIGZvY3VzUHJldmlvdXNMYWJlbChpbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgcHJldmlvdXNJbmRleCA9IGluZGV4IC0gMTtcbiAgICBpZiAocHJldmlvdXNJbmRleCA+PSAwKSB7XG4gICAgICB0aGlzLmxhYmVsQ29udGFpbmVycy5nZXQocHJldmlvdXNJbmRleCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sYWJlbENvbnRhaW5lcnMubGFzdD8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgICB0aGlzLmZvY3VzZWRMYWJlbEluZGV4ID0gcHJldmlvdXNJbmRleDtcbiAgfVxuXG4gIG9uTGVnZW5kSXRlbUtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICB0aGlzLnRvZ2dsZURhdGFzZXRWaXNpYmlsaXR5KGluZGV4KTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93UmlnaHQnIHx8IGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicpIHtcbiAgICAgIHRoaXMuZm9jdXNOZXh0TGVnZW5kSXRlbShpbmRleCk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0xlZnQnIHx8IGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnKSB7XG4gICAgICB0aGlzLmZvY3VzUHJldmlvdXNMZWdlbmRJdGVtKGluZGV4KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZvY3VzTmV4dExlZ2VuZEl0ZW0oaW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IG5leHRJbmRleCA9IGluZGV4ICsgMTtcbiAgICBpZiAobmV4dEluZGV4IDwgdGhpcy5sZWdlbmRJdGVtcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMubGVnZW5kSXRlbXMuZ2V0KG5leHRJbmRleCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sZWdlbmRJdGVtcy5maXJzdD8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZm9jdXNQcmV2aW91c0xlZ2VuZEl0ZW0oaW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IHByZXZpb3VzSW5kZXggPSBpbmRleCAtIDE7XG4gICAgaWYgKHByZXZpb3VzSW5kZXggPj0gMCkge1xuICAgICAgdGhpcy5sZWdlbmRJdGVtcy5nZXQocHJldmlvdXNJbmRleCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sZWdlbmRJdGVtcy5sYXN0Py5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgb25GYWtlRGF0YVBvaW50c0tleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGluZGV4OiBudW1iZXIsIGlzU2Vjb25kYXJ5OiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dSaWdodCcgfHwgZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykge1xuICAgICAgdGhpcy5mb2N1c05leHRGYWtlRGF0YVBvaW50KGluZGV4LCBpc1NlY29uZGFyeSk7XG4gICAgICB0aGlzLnNob3dUb29sdGlwRm9yRGF0YVBvaW50KGluZGV4ICsgMSA+IHRoaXMuc3BpZGVyQ2hhcnREYXRhLmxhYmVscy5sZW5ndGggPyAwIDogaW5kZXggKyAxLCBpc1NlY29uZGFyeSk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0xlZnQnIHx8IGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnKSB7XG4gICAgICB0aGlzLmZvY3VzUHJldmlvdXNGYWtlRGF0YVBvaW50KGluZGV4LCBpc1NlY29uZGFyeSk7XG4gICAgICB0aGlzLnNob3dUb29sdGlwRm9yRGF0YVBvaW50KGluZGV4IC0gMSA8IDAgPyB0aGlzLnNwaWRlckNoYXJ0RGF0YS5sYWJlbHMubGVuZ3RoIC0gMSA6IGluZGV4IC0gMSwgaXNTZWNvbmRhcnkpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnVGFiJykge1xuICAgICAgdGhpcy5yZXNldEFjdGl2ZUVsZW1lbnQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZvY3VzTmV4dEZha2VEYXRhUG9pbnQoaW5kZXg6IG51bWJlciwgaXNTZWNvbmRhcnk6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGNvbnN0IG5leHRJbmRleCA9IGluZGV4ICsgMTtcbiAgICBpZiAobmV4dEluZGV4IDwgdGhpcy5mYWtlRGF0YVBvaW50cy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGZha2VEYXRhUG9pbnRzID0gaXNTZWNvbmRhcnkgPyB0aGlzLmZha2VEYXRhUG9pbnRzU2Vjb25kYXJ5IDogdGhpcy5mYWtlRGF0YVBvaW50cztcbiAgICAgIGZha2VEYXRhUG9pbnRzLmdldChuZXh0SW5kZXgpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZha2VEYXRhUG9pbnRzID0gaXNTZWNvbmRhcnkgPyB0aGlzLmZha2VEYXRhUG9pbnRzU2Vjb25kYXJ5IDogdGhpcy5mYWtlRGF0YVBvaW50cztcbiAgICAgIGZha2VEYXRhUG9pbnRzLmZpcnN0Py5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICAgIGlmICghaXNTZWNvbmRhcnkpIHtcbiAgICAgIHRoaXMuZm9jdXNlZEZha2VEYXRhUG9pbnRJbmRleCA9IG5leHRJbmRleDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZvY3VzUHJldmlvdXNGYWtlRGF0YVBvaW50KGluZGV4OiBudW1iZXIsIGlzU2Vjb25kYXJ5OiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBjb25zdCBwcmV2aW91c0luZGV4ID0gaW5kZXggLSAxO1xuICAgIGlmIChwcmV2aW91c0luZGV4ID49IDApIHtcbiAgICAgIGNvbnN0IGZha2VEYXRhUG9pbnRzID0gaXNTZWNvbmRhcnkgPyB0aGlzLmZha2VEYXRhUG9pbnRzU2Vjb25kYXJ5IDogdGhpcy5mYWtlRGF0YVBvaW50cztcbiAgICAgIGZha2VEYXRhUG9pbnRzLmdldChwcmV2aW91c0luZGV4KT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmYWtlRGF0YVBvaW50cyA9IGlzU2Vjb25kYXJ5ID8gdGhpcy5mYWtlRGF0YVBvaW50c1NlY29uZGFyeSA6IHRoaXMuZmFrZURhdGFQb2ludHM7XG4gICAgICBmYWtlRGF0YVBvaW50cy5sYXN0Py5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICAgIGlmICghaXNTZWNvbmRhcnkpIHtcbiAgICAgIHRoaXMuZm9jdXNlZEZha2VEYXRhUG9pbnRJbmRleCA9IHByZXZpb3VzSW5kZXg7XG4gICAgfVxuICB9XG5cbiAgc2hvd1Rvb2x0aXBGb3JEYXRhUG9pbnQoaW5kZXg6IG51bWJlciwgaXNTZWNvbmRhcnk6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGNvbnN0IGNoYXJ0SW5zdGFuY2UgPSB0aGlzLmNoYXJ0Py5jaGFydDtcbiAgICBpZiAoIWNoYXJ0SW5zdGFuY2UpIHJldHVybjtcbiAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gW3sgZGF0YXNldEluZGV4OiBpc1NlY29uZGFyeSA/IDEgOiAwLCBpbmRleCB9XTtcbiAgICBjb25zdCBtZXRhID0gY2hhcnRJbnN0YW5jZS5nZXREYXRhc2V0TWV0YShpc1NlY29uZGFyeSA/IDEgOiAwKTtcbiAgICBjb25zdCBkYXRhUG9pbnQgPSBtZXRhLmRhdGFbaW5kZXhdO1xuICAgIGNvbnN0IGV2ZW50UG9zaXRpb24gPSB7XG4gICAgICB4OiBkYXRhUG9pbnQueCxcbiAgICAgIHk6IGRhdGFQb2ludC55LFxuICAgIH07XG4gICAgaWYgKCFpc1NlY29uZGFyeSkge1xuICAgICAgdGhpcy5mb2N1c2VkRmFrZURhdGFQb2ludEluZGV4ID0gaW5kZXg7XG4gICAgfVxuXG4gICAgY2hhcnRJbnN0YW5jZS50b29sdGlwPy5zZXRBY3RpdmVFbGVtZW50cyhhY3RpdmVFbGVtZW50LCBldmVudFBvc2l0aW9uKTtcblxuICAgIGNoYXJ0SW5zdGFuY2UudXBkYXRlKCk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0QWN0aXZlRWxlbWVudCgpIHtcbiAgICBjb25zdCBjaGFydEluc3RhbmNlID0gdGhpcy5jaGFydD8uY2hhcnQ7XG4gICAgaWYgKCFjaGFydEluc3RhbmNlKSByZXR1cm47XG5cbiAgICAvLyBDbGVhciB0aGUgYWN0aXZlIGVsZW1lbnRzIHRvIGhpZGUgdGhlIHRvb2x0aXBcbiAgICBjaGFydEluc3RhbmNlLnRvb2x0aXA/LnNldEFjdGl2ZUVsZW1lbnRzKFtdLCB7IHg6IDAsIHk6IDAgfSk7XG5cbiAgICBjaGFydEluc3RhbmNlLnVwZGF0ZSgpO1xuICB9XG5cbiAgdG9nZ2xlRGF0YXNldFZpc2liaWxpdHkoZGF0YXNldEluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBjaGFydEluc3RhbmNlID0gdGhpcy5jaGFydD8uY2hhcnQ7XG4gICAgaWYgKCFjaGFydEluc3RhbmNlKSByZXR1cm47XG5cbiAgICBjb25zdCBkYXRhc2V0ID0gY2hhcnRJbnN0YW5jZS5kYXRhLmRhdGFzZXRzW2RhdGFzZXRJbmRleF07XG4gICAgZGF0YXNldC5oaWRkZW4gPSAhZGF0YXNldC5oaWRkZW47XG4gICAgY2hhcnRJbnN0YW5jZS51cGRhdGUoKTtcbiAgfVxuXG4gIGlzRGF0YXNldFZpc2libGUoZGF0YXNldEluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBjaGFydEluc3RhbmNlID0gdGhpcy5jaGFydD8uY2hhcnQ7XG4gICAgaWYgKCFjaGFydEluc3RhbmNlKSByZXR1cm47XG4gICAgcmV0dXJuICFjaGFydEluc3RhbmNlLmRhdGEuZGF0YXNldHNbZGF0YXNldEluZGV4XS5oaWRkZW47XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjb250YWluZXJcIlxuICB0YWJpbmRleD1cIjBcIlxuICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbFwiPlxuICA8ZGl2IGNsYXNzPVwic3BhY2luZy1jb250YWluZXJcIlxuICAgIFtuZ0NsYXNzXT1cInsnc21hbGwtc3BhY2luZyc6IHJhZGFyQ2hhcnREYXRhLmxhYmVscyAmJiByYWRhckNoYXJ0RGF0YS5sYWJlbHMubGVuZ3RoICUgMiA9PT0gMSAmJiAhbG9hZGluZ31cIj5cbiAgICA8ZGl2IGNsYXNzPVwiY2hhcnQtY29udGFpbmVyXCJcbiAgICAgIFtzdHlsZS53aWR0aF09XCJzaXplID09PSAnbGFyZ2UnID8gJzI4MHB4JyA6ICcyMDBweCdcIlxuICAgICAgW3N0eWxlLmhlaWdodF09XCJzaXplID09PSAnbGFyZ2UnID8gJzI4MHB4JyA6ICcyMDBweCdcIj5cbiAgICAgIEBpZiAoIWxvYWRpbmcpIHtcbiAgICAgICAgPGNhbnZhc1xuICAgICAgICAgIGJhc2VDaGFydFxuICAgICAgICAgIFtkYXRhXT1cInJhZGFyQ2hhcnREYXRhXCJcbiAgICAgICAgICBbb3B0aW9uc109XCJyYWRhckNoYXJ0T3B0aW9uc1wiXG4gICAgICAgICAgdHlwZT1cInJhZGFyXCJcbiAgICAgICAgICBjbGFzcz1cImNoYXJ0XCJcbiAgICAgICAgPlxuICAgICAgICA8L2NhbnZhcz5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8Y2FudmFzXG4gICAgICAgICAgYmFzZUNoYXJ0XG4gICAgICAgICAgW2RhdGFdPVwibG9hZGluZ0NoYXJ0RGF0YVwiXG4gICAgICAgICAgW29wdGlvbnNdPVwibG9hZGluZ0NoYXJ0T3B0aW9uc1wiXG4gICAgICAgICAgdHlwZT1cInJhZGFyXCJcbiAgICAgICAgICBjbGFzcz1cImNoYXJ0XCJcbiAgICAgICAgPlxuICAgICAgICA8L2NhbnZhcz5cbiAgICAgICAgPHVpLXNwaW5uZXI+PC91aS1zcGlubmVyPlxuICAgICAgfVxuXG4gICAgICBAaWYgKGxhYmVsUG9zaXRpb25zVmlzaWJsZSkge1xuICAgICAgPGRpdiBjbGFzcz1cIm92ZXJsYXktY29udGFpbmVyXCI+XG4gICAgICAgICAgQGZvciAobGFiZWwgb2Ygc3BpZGVyQ2hhcnREYXRhLmxhYmVsczsgdHJhY2sgbGFiZWwpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1jb250YWluZXJcIiAjbGFiZWxDb250YWluZXJcbiAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwibGFiZWwgKyAnOiAnICsgc3BpZGVyQ2hhcnREYXRhLmxhYmVsRGVzY3JpcHRpb25bJGluZGV4XVwiXG4gICAgICAgICAgICAgIFt0YWJpbmRleF09XCIkaW5kZXggPT09IDAgPyAnMCcgOiAnLTEnXCJcbiAgICAgICAgICAgICAgKGtleWRvd24pPVwib25MYWJlbEtleURvd24oJGV2ZW50LCAkaW5kZXgpXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJsYWJlbCArICc6ICcgKyBzcGlkZXJDaGFydERhdGEubGFiZWxEZXNjcmlwdGlvblskaW5kZXhdXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmxlZnRdPVwiZ2V0Q2VudGVyZWRMYWJlbExlZnRQb3NpdGlvbihsYWJlbCwgbGFiZWxDb250YWluZXIub2Zmc2V0V2lkdGgpXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmJvdHRvbV09XCJnZXRDZW50ZXJlZExhYmVsQm90dG9tUG9zaXRpb24obGFiZWwsIGxhYmVsQ29udGFpbmVyLm9mZnNldEhlaWdodClcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsXCIgI2xhYmVsRWxlbWVudCBbc3R5bGUubWF4LXdpZHRoXT1cInNpemUgPT09ICdsYXJnZScgPyAnMTUwcHgnIDogJzEwMHB4J1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzLnR3by1saW5lc109XCJsYWJlbC5sZW5ndGggPiAyMCAmJiBzaXplID09PSAnbGFyZ2UnICYmIHNwaWRlckNoYXJ0RGF0YS5sYWJlbHMubGVuZ3RoIDwgOVwiPlxuICAgICAgICAgICAgICAgIHt7IGxhYmVsIH19XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZhbHVlXCI+e3sgc3BpZGVyQ2hhcnREYXRhLnBsb3REYXRhWzBdLmRhdGFbJGluZGV4XSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYWtlLWRhdGEtcG9pbnRzXCIgI2Zha2VEYXRhUG9pbnRzXG4gICAgICAgICAgICAgIFt0YWJpbmRleF09XCJmb2N1c2VkTGFiZWxJbmRleCA9PT0gJGluZGV4ID8gJzAnIDogJy0xJ1wiXG4gICAgICAgICAgICAgIChmb2N1cyk9XCIkaW5kZXggPT09IGZvY3VzZWRMYWJlbEluZGV4ID8gc2hvd1Rvb2x0aXBGb3JEYXRhUG9pbnQoJGluZGV4KSA6IG51bGxcIlxuICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbkZha2VEYXRhUG9pbnRzS2V5RG93bigkZXZlbnQsICRpbmRleClcIj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIEBpZiAocmFkYXJDaGFydERhdGEuZGF0YXNldHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZha2UtZGF0YS1wb2ludHMtc2Vjb25kYXJ5XCIgI2Zha2VEYXRhUG9pbnRzU2Vjb25kYXJ5XG4gICAgICAgICAgICAgICAgW3RhYmluZGV4XT1cImZvY3VzZWRGYWtlRGF0YVBvaW50SW5kZXggPT09ICRpbmRleCA/ICcwJyA6ICctMSdcIlxuICAgICAgICAgICAgICAgIChmb2N1cyk9XCIkaW5kZXggPT09IGZvY3VzZWRGYWtlRGF0YVBvaW50SW5kZXggPyBzaG93VG9vbHRpcEZvckRhdGFQb2ludCgkaW5kZXgsIHRydWUpIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25GYWtlRGF0YVBvaW50c0tleURvd24oJGV2ZW50LCAkaW5kZXgsIHRydWUpXCI+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgQGlmIChyYWRhckNoYXJ0RGF0YS5kYXRhc2V0cy5sZW5ndGggPiAwKSB7XG4gICAgPGRpdiBjbGFzcz1cImxlZ2VuZC1jb250YWluZXJcIj5cbiAgICAgIEBmb3IgKGRhdGFzZXQgb2YgcmFkYXJDaGFydERhdGEuZGF0YXNldHM7IHRyYWNrIGRhdGFzZXQubGFiZWwpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC1pdGVtXCJcbiAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRGF0YXNldFZpc2liaWxpdHkoJGluZGV4KVwiXG4gICAgICAgICAgW3RhYmluZGV4XT1cIiRpbmRleCA9PT0gMCA/ICcwJyA6ICctMSdcIlxuICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICAgIFthdHRyLmFyaWEtcHJlc3NlZF09XCJpc0RhdGFzZXRWaXNpYmxlKCRpbmRleCkgPyBmYWxzZSA6IHRydWVcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiaXNEYXRhc2V0VmlzaWJsZSgkaW5kZXgpID9cbiAgICAgICAgICAoKHRyYW5zbGF0aW9uQ29udGV4dCArICdEQVRBU0VUX1ZJU0lCTEUnKSB8IHVpVHJhbnNsYXRlIDogeyBkYXRhc2V0OiBkYXRhc2V0LmxhYmVsIH0gfCBhc3luYykgOlxuICAgICAgICAgICgodHJhbnNsYXRpb25Db250ZXh0ICsgJ0RBVEFTRVRfSElEREVOJykgfCB1aVRyYW5zbGF0ZSA6IHsgZGF0YXNldDogZGF0YXNldC5sYWJlbCB9IHwgYXN5bmMpXCJcbiAgICAgICAgICAoa2V5ZG93bik9XCJvbkxlZ2VuZEl0ZW1LZXlEb3duKCRldmVudCwgJGluZGV4KVwiXG4gICAgICAgICAgI2xlZ2VuZEl0ZW0+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJsZWdlbmQtbGluZVwiIFtuZ0NsYXNzXT1cInsnc29saWQtbGluZSc6ICRpbmRleCA9PT0gMCwgJ2Rhc2hlZC1saW5lJzogJGluZGV4ID09PSAxfVwiPjwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImxlZ2VuZC1sYWJlbFwiIFtzdHlsZS50ZXh0LWRlY29yYXRpb25dPVwiaXNEYXRhc2V0VmlzaWJsZSgkaW5kZXgpID8gJ25vbmUnIDogJ2xpbmUtdGhyb3VnaCdcIj5cbiAgICAgICAgICAgIHt7IGRhdGFzZXQubGFiZWwgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG48L2Rpdj5cblxuIl19
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
// These are the sizes of the canvas, not the chart itself. It includes 40px of padding on all sides.
|
|
2
|
+
export const SmallSpiderChartSize = 200;
|
|
3
|
+
export const LargeSpiderChartSize = 280;
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BpZGVyLWNoYXJ0Lm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGdvLWNhbm9weS11aS9jb21wb25lbnRzL3NwaWRlci1jaGFydC9zcGlkZXItY2hhcnQubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EscUdBQXFHO0FBQ3JHLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFXLEdBQUcsQ0FBQztBQUNoRCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBVyxHQUFHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBTcGlkZXJDaGFydFNpemUgPSAnbGFyZ2UnIHwgJ3NtYWxsJztcbi8vIFRoZXNlIGFyZSB0aGUgc2l6ZXMgb2YgdGhlIGNhbnZhcywgbm90IHRoZSBjaGFydCBpdHNlbGYuIEl0IGluY2x1ZGVzIDQwcHggb2YgcGFkZGluZyBvbiBhbGwgc2lkZXMuXG5leHBvcnQgY29uc3QgU21hbGxTcGlkZXJDaGFydFNpemU6IG51bWJlciA9IDIwMDtcbmV4cG9ydCBjb25zdCBMYXJnZVNwaWRlckNoYXJ0U2l6ZTogbnVtYmVyID0gMjgwO1xuZXhwb3J0IHR5cGUgU3BpZGVyQ2hhcnREYXRhID0ge1xuICBsYWJlbHM6IHN0cmluZ1tdO1xuICBsYWJlbERlc2NyaXB0aW9uOiBzdHJpbmdbXTtcbiAgcGxvdERhdGE6IFtQbG90RGF0YSwgUGxvdERhdGFdIHwgW1Bsb3REYXRhXTsgLy8gQ3VycmVudCBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBtYXggMiBkYXRhc2V0cy5cbn07XG5leHBvcnQgdHlwZSBQbG90RGF0YSA9IHtcbiAgZGF0YWJhc2VMYWJlbDogc3RyaW5nO1xuICBkYXRhOiBudW1iZXJbXTtcbn07XG4iXX0=
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { UiTranslatePipe } from '../../pipes/ui-translate.pipe';
|
|
3
|
+
import { SpiderChartComponent } from './spider-chart.component';
|
|
4
|
+
import { NgChartsModule } from 'ng2-charts';
|
|
5
|
+
import { Chart, registerables } from 'chart.js';
|
|
6
|
+
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
7
|
+
import { CommonModule, NgClass } from '@angular/common';
|
|
8
|
+
import { SpinnerComponentModule } from '../spinner/spinner.module';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
Chart.register(...registerables);
|
|
11
|
+
export class SpiderChartComponentModule {
|
|
12
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SpiderChartComponentModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
13
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.12", ngImport: i0, type: SpiderChartComponentModule, declarations: [SpiderChartComponent], imports: [NgClass,
|
|
14
|
+
UiTranslatePipe,
|
|
15
|
+
NgChartsModule,
|
|
16
|
+
MatTooltipModule,
|
|
17
|
+
UiTranslatePipe,
|
|
18
|
+
SpinnerComponentModule,
|
|
19
|
+
CommonModule], exports: [SpiderChartComponent] }); }
|
|
20
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SpiderChartComponentModule, imports: [NgChartsModule,
|
|
21
|
+
MatTooltipModule,
|
|
22
|
+
SpinnerComponentModule,
|
|
23
|
+
CommonModule] }); }
|
|
24
|
+
}
|
|
25
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SpiderChartComponentModule, decorators: [{
|
|
26
|
+
type: NgModule,
|
|
27
|
+
args: [{
|
|
28
|
+
declarations: [SpiderChartComponent],
|
|
29
|
+
exports: [SpiderChartComponent],
|
|
30
|
+
imports: [
|
|
31
|
+
NgClass,
|
|
32
|
+
UiTranslatePipe,
|
|
33
|
+
NgChartsModule,
|
|
34
|
+
MatTooltipModule,
|
|
35
|
+
UiTranslatePipe,
|
|
36
|
+
SpinnerComponentModule,
|
|
37
|
+
CommonModule,
|
|
38
|
+
],
|
|
39
|
+
}]
|
|
40
|
+
}] });
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BpZGVyLWNoYXJ0Lm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Rnby1jYW5vcHktdWkvY29tcG9uZW50cy9zcGlkZXItY2hhcnQvc3BpZGVyLWNoYXJ0Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7O0FBRW5FLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxhQUFhLENBQUMsQ0FBQztBQWVqQyxNQUFNLE9BQU8sMEJBQTBCOytHQUExQiwwQkFBMEI7Z0hBQTFCLDBCQUEwQixpQkFadEIsb0JBQW9CLGFBR2pDLE9BQU87WUFDUCxlQUFlO1lBQ2YsY0FBYztZQUNkLGdCQUFnQjtZQUNoQixlQUFlO1lBQ2Ysc0JBQXNCO1lBQ3RCLFlBQVksYUFSSixvQkFBb0I7Z0hBV25CLDBCQUEwQixZQVBuQyxjQUFjO1lBQ2QsZ0JBQWdCO1lBRWhCLHNCQUFzQjtZQUN0QixZQUFZOzs0RkFHSCwwQkFBMEI7a0JBYnRDLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFLENBQUMsb0JBQW9CLENBQUM7b0JBQ3BDLE9BQU8sRUFBRSxDQUFDLG9CQUFvQixDQUFDO29CQUMvQixPQUFPLEVBQUU7d0JBQ1AsT0FBTzt3QkFDUCxlQUFlO3dCQUNmLGNBQWM7d0JBQ2QsZ0JBQWdCO3dCQUNoQixlQUFlO3dCQUNmLHNCQUFzQjt3QkFDdEIsWUFBWTtxQkFDYjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBVaVRyYW5zbGF0ZVBpcGUgfSBmcm9tICcuLi8uLi9waXBlcy91aS10cmFuc2xhdGUucGlwZSc7XG5pbXBvcnQgeyBTcGlkZXJDaGFydENvbXBvbmVudCB9IGZyb20gJy4vc3BpZGVyLWNoYXJ0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOZ0NoYXJ0c01vZHVsZSB9IGZyb20gJ25nMi1jaGFydHMnO1xuaW1wb3J0IHsgQ2hhcnQsIHJlZ2lzdGVyYWJsZXMgfSBmcm9tICdjaGFydC5qcyc7XG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUsIE5nQ2xhc3MgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgU3Bpbm5lckNvbXBvbmVudE1vZHVsZSB9IGZyb20gJy4uL3NwaW5uZXIvc3Bpbm5lci5tb2R1bGUnO1xuXG5DaGFydC5yZWdpc3RlciguLi5yZWdpc3RlcmFibGVzKTtcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbU3BpZGVyQ2hhcnRDb21wb25lbnRdLFxuICBleHBvcnRzOiBbU3BpZGVyQ2hhcnRDb21wb25lbnRdLFxuICBpbXBvcnRzOiBbXG4gICAgTmdDbGFzcyxcbiAgICBVaVRyYW5zbGF0ZVBpcGUsXG4gICAgTmdDaGFydHNNb2R1bGUsXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcbiAgICBVaVRyYW5zbGF0ZVBpcGUsXG4gICAgU3Bpbm5lckNvbXBvbmVudE1vZHVsZSxcbiAgICBDb21tb25Nb2R1bGUsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFNwaWRlckNoYXJ0Q29tcG9uZW50TW9kdWxlIHt9XG4iXX0=
|