@oneteme/jquery-organizer 0.0.1 → 0.0.3

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/README.md CHANGED
@@ -7,7 +7,11 @@ Bibliothèque Angular autonome pour la gestion décentralisée des configuration
7
7
  - **Adapters** — Fonctions de conversion ChartConfig ↔ OrganizerConfig avec auto-détection d'unités
8
8
  - **Facade** — Gestion centralisée d'état pour les champs visibles, regroupements, filtres
9
9
 
10
- **v0.0.43+**: Support complet pour **UnitConfig avec auto-scaling intelligent** des unités Y (ms → µs → s, etc.)
10
+ **Fonctionnalités principales** :
11
+ - **UnitConfig avec auto-scaling intelligent** des unités Y (ms → µs → s, etc.)
12
+ - **Template normalization** avec validation permissive des états et auto-détection de templates
13
+ - **Slice loading unification** dans le composant organizer (Promise/Observable dual-support)
14
+ - **Chart binding facade** pour simplifier l'intégration ChartConfig ↔ Organizer (50% réduction de boilerplate)
11
15
 
12
16
  ---
13
17
 
@@ -251,31 +255,87 @@ Valeur Format Raison
251
255
 
252
256
  ## Chart Adapter
253
257
 
254
- Les fonctions `organizer-chart-adapter.ts` convertissent entre `ChartConfig` (métier) et `OrganizerConfig` (UI) :
258
+ Les fonctions `organizer-chart-adapter.ts` fournissent une façade complète pour l'intégration ChartConfig ↔ OrganizerConfig :
259
+
260
+ ### Normalisation d'État (Étape 1)
261
+
262
+ ```typescript
263
+ // Valide permissivement un état contre une config
264
+ export function normalizeOrganizerState(
265
+ state: OrganizerState,
266
+ config: OrganizerConfig
267
+ ): OrganizerState
268
+ // - Filtre les références invalides (selectedY, selectedGroupBy, selectedSlices)
269
+ // - Maintient les fallbacks si nécessaire
270
+ // - Auto-détecte le template matching l'état final
271
+
272
+ // Applique un template et recalcule le template actif
273
+ export function normalizeTemplateToState(
274
+ template: OrganizerTemplate,
275
+ currentState: OrganizerState,
276
+ config: OrganizerConfig
277
+ ): OrganizerState
278
+ // - Applique les champs du template (xField, yField, groupBy, etc.)
279
+ // - Recalcule selectedTemplate en matchant l'état final contre tous les templates
280
+ // - Gère les fallbacks si le template n'est pas complet
281
+
282
+ // Trouve le template matching l'état courant
283
+ export function resolveMatchingTemplateId(
284
+ templates: OrganizerTemplate[],
285
+ state: OrganizerState,
286
+ config: OrganizerConfig
287
+ ): string | undefined
288
+ // - Itère sur tous les templates et retourne le premier match
289
+ // - Utilisé pour auto-set selectedTemplate lors de changements d'état
290
+ ```
291
+
292
+ ### Façade de Binding (Étape 3)
255
293
 
256
294
  ```typescript
257
- // ChartConfig → OrganizerConfig
295
+ // Interface pour les callbacks
296
+ export interface OrganizerChartBridgeOptions {
297
+ onFetchSliceData?: (filterKey: string) => Observable<any[]> | Promise<any[]>;
298
+ onExportVisual?: () => void;
299
+ onExportData?: () => void;
300
+ switchView?: {
301
+ currentView: 'chart' | 'table';
302
+ onSwitch: (newView: 'chart' | 'table') => void;
303
+ };
304
+ }
305
+
306
+ // Construit un binding prêt à utiliser
307
+ export function buildOrganizerChartBinding(
308
+ chartConfig: any,
309
+ options: OrganizerChartBridgeOptions
310
+ ): OrganizerChartBinding
311
+ // Retourne: { config: OrganizerConfig, state: OrganizerState }
312
+ // - Appelle chartConfigToOrganizer + normalizeOrganizerState
313
+ // - Injecte les options (callbacks, export, etc.)
314
+
315
+ // Gestion unifiée des événements organizer
316
+ export function handleOrganizerChartEvent(
317
+ event: OrganizerButtonEvent,
318
+ chartConfig: any,
319
+ currentBinding: OrganizerChartBinding,
320
+ options: OrganizerChartBridgeOptions
321
+ ): { binding: OrganizerChartBinding, shouldRefetch: boolean }
322
+ // - Applique l'événement au ChartConfig
323
+ // - Reconstruit le binding
324
+ // - Retourne shouldRefetch = true si ySelected ou templateSelected
325
+
326
+ // Utilitaires (existants, maintenant intégrés à la façade)
258
327
  export function chartConfigToOrganizer(
259
328
  chartConfig: any,
260
329
  options?: OrganizerChartBridgeOptions
261
330
  ): OrganizerConfig
262
331
 
263
- // ChartConfig → OrganizerState
264
332
  export function chartConfigToState(chartConfig: any): OrganizerState
265
333
 
266
- // ChartConfig → Événement + État unifié
267
- export function chartConfigToUnifiedState(
268
- chartConfig: any,
269
- viewMode?: 'chart' | 'table'
270
- ): OrganizerUnifiedState
271
-
272
- // Applique un OrganizerEvent à ChartConfig
273
334
  export function applyOrganizerEventToChart(
274
335
  event: OrganizerButtonEvent,
275
336
  chartConfig: any
276
337
  ): void
277
338
 
278
- // Résout l'unité Y pour l'événement
279
339
  export function resolveYUnit(
280
340
  chartConfig: any,
281
341
  selectedY?: string,
@@ -287,17 +347,12 @@ export function resolveYUnit(
287
347
 
288
348
  ## Intégration avec jquery-echarts
289
349
 
290
- ### Pattern 3-étapes
291
-
292
- 1. **Initialisation** : Construire OrganizerConfig depuis ChartConfig
293
- 2. **Réaction aux événements** : Appliquer OrganizerEvent à ChartConfig
294
- 3. **Refetch** : Recharger les données avec la nouvelle config
350
+ ### Pattern Simplifié avec Binding Facade (v0.0.44+) ⭐ **Recommandé**
295
351
 
296
- ### Exemple Complet
352
+ La **façade de binding** unifie les 3 étapes et réduit le boilerplate de ~50% :
297
353
 
298
354
  ```typescript
299
- import { OrganizerButtonEvent, OrganizerSliceState } from '@oneteme/jquery-organizer';
300
- import { chartConfigToOrganizer, chartConfigToState, applyOrganizerEventToChart } from '@oneteme/jquery-organizer';
355
+ import { buildOrganizerChartBinding, handleOrganizerChartEvent, OrganizerChartBridgeOptions } from '@oneteme/jquery-organizer';
301
356
 
302
357
  @Component({
303
358
  selector: 'app-kpi',
@@ -312,44 +367,56 @@ import { chartConfigToOrganizer, chartConfigToState, applyOrganizerEventToChart
312
367
  `
313
368
  })
314
369
  export class KpiComponent {
315
- $latency = {
316
- config: {},
317
- state: {},
318
- chartConfig: REST_LATENCY_CHART_CONFIG('day'),
319
- chartProvider: {},
320
- data: []
321
- };
370
+ $latency: any; // { config, state, chartProvider, data }
371
+ private $latencyChartConfig = REST_LATENCY_CHART_CONFIG('day');
372
+ @ViewChild('latencyChart') private _latencyChart: ChartComponent<any, any>;
322
373
 
323
374
  ngOnInit() {
324
- // Initialisation
325
- this.$latency.config = chartConfigToOrganizer(this.$latency.chartConfig);
326
- this.$latency.state = chartConfigToState(this.$latency.chartConfig);
375
+ // Initialisation unifiée via façade
376
+ this.$latency = buildOrganizerChartBinding(
377
+ this.$latencyChartConfig,
378
+ this._latencyOrganizerOptions()
379
+ );
327
380
  this._fetchLatency();
328
381
  }
329
382
 
330
383
  onLatencyViewChange(event: OrganizerButtonEvent): void {
331
- // Appliquer l'événement → met à jour ChartConfig
332
- applyOrganizerEventToChart(event, this.$latency.chartConfig);
333
-
334
- // Mettre à jour la UI du button
335
- this.$latency.state = event.state;
384
+ // Traitement événement + calcul intelligent du refetch
385
+ const result = handleOrganizerChartEvent(
386
+ event,
387
+ this.$latencyChartConfig,
388
+ this.$latency,
389
+ this._latencyOrganizerOptions()
390
+ );
391
+ this.$latency = result.binding;
336
392
 
337
- // Refetch
338
- this._fetchLatency();
393
+ // Refetch uniquement si nécessaire (ySelected, templateSelected, etc.)
394
+ if (result.shouldRefetch) {
395
+ this._fetchLatency();
396
+ }
397
+ }
398
+
399
+ private _latencyOrganizerOptions(): OrganizerChartBridgeOptions {
400
+ return {
401
+ onFetchSliceData: (filterKey: string) => this._fetchSliceData(filterKey),
402
+ onExportVisual: () => this._latencyChart?.exportImage('latence'),
403
+ onExportData: () => this._latencyChart?.exportData('latence')
404
+ };
339
405
  }
340
406
 
341
407
  private _fetchLatency(): void {
342
- const cfg = this.$latency.chartConfig;
408
+ const cfg = this.$latencyChartConfig;
343
409
  const ind = cfg.indicators.items.find(i => i.selected);
410
+ const grp = cfg.groups.items.find(g => g.selected);
344
411
 
345
- this._httpService.getLatency({ indicator: ind, ... }).subscribe(data => {
346
- const series = buildSeries(cfg.series.items, ind, cfg.groups.items[0], null, data);
412
+ this._httpService.getLatency({ indicator: ind, group: grp }).subscribe(data => {
413
+ const series = buildSeries(cfg.series.items, ind, grp, null, data);
347
414
 
348
- // Injection de l'unité (simple string ou UnitConfig)
349
415
  this.$latency.chartProvider = {
350
416
  ...this.BASE_CHART_PROVIDER,
351
417
  series,
352
- yUnit: ind?.unit // ← string | UnitConfig
418
+ xtitle: grp?.menu?.label || 'Date', // Titre X dynamique
419
+ yUnit: ind?.unit // ← string | UnitConfig (auto-scaling)
353
420
  };
354
421
 
355
422
  this.$latency.data = data;
@@ -358,6 +425,43 @@ export class KpiComponent {
358
425
  }
359
426
  ```
360
427
 
428
+ ### Architecture des 3 Étapes
429
+
430
+ **Étape 1: Normalisation d'État**
431
+ - `normalizeOrganizerState()` valide les références et auto-détecte le template
432
+ - Utilisée automatiquement par `buildOrganizerChartBinding()`
433
+ - Stratégie permissive : filtre les références invalides sans levée d'exception
434
+
435
+ **Étape 2: Chargement des Slices (organizer-button.component.ts)**
436
+ - Méthode `syncSliceState()` gère Promise et Observable uniformément
437
+ - Unifie les chemins manuels (onSliceClick) et template-driven (onTemplateSelect)
438
+ - Émet sliceStateChange pour mise à jour du binding côté app
439
+
440
+ **Étape 3: Façade de Binding**
441
+ - `buildOrganizerChartBinding()` : Construction du binding initial
442
+ - `handleOrganizerChartEvent()` : Traitement unifié avec retour du shouldRefetch
443
+ - Encapsule applyOrganizerEventToChart + normalisation + refetch logic
444
+
445
+ ### Pattern Détaillé (Utilitaires bas-niveau)
446
+
447
+ Pour des besoins avancés ou migration progressive :
448
+
449
+ ```typescript
450
+ import { chartConfigToOrganizer, chartConfigToState, applyOrganizerEventToChart } from '@oneteme/jquery-organizer';
451
+
452
+ onLatencyViewChange(event: OrganizerButtonEvent): void {
453
+ // Étape 1: Appliquer l'événement au ChartConfig
454
+ applyOrganizerEventToChart(event, this.$latencyChartConfig);
455
+
456
+ // Étape 2: Recalculer l'état (avec normalisation)
457
+ this.$latency.config = chartConfigToOrganizer(this.$latencyChartConfig);
458
+ this.$latency.state = chartConfigToState(this.$latencyChartConfig);
459
+
460
+ // Étape 3: Refetch
461
+ this._fetchLatency();
462
+ }
463
+ ```
464
+
361
465
  ---
362
466
 
363
467
  ## Intégration avec jquery-table
@@ -397,11 +501,22 @@ export { OrganizerButtonModule } from './organizer-button.module';
397
501
  export { SlicePanelComponent } from './slice-panel.component';
398
502
 
399
503
  // Interfaces
400
- export { OrganizerConfig, OrganizerState, OrganizerButtonEvent, OrganizerSliceState } from './organizer-config.interface';
504
+ export { OrganizerConfig, OrganizerState, OrganizerButtonEvent, OrganizerSliceState, OrganizerChartBinding } from './organizer-config.interface';
505
+ export { OrganizerChartBridgeOptions, OrganizerTemplate } from './organizer-chart-adapter';
401
506
  export { SliceConfig, SliceColumnDef, SliceCategory } from './slice-panel.model';
402
507
 
403
- // Adapters
508
+ // Adapters & Façade (v0.0.44+)
404
509
  export {
510
+ // Binding Facade (recommandé)
511
+ buildOrganizerChartBinding,
512
+ handleOrganizerChartEvent,
513
+
514
+ // Normalisation d'état
515
+ normalizeOrganizerState,
516
+ normalizeTemplateToState,
517
+ resolveMatchingTemplateId,
518
+
519
+ // Utilitaires bas-niveau
405
520
  chartConfigToOrganizer,
406
521
  chartConfigToState,
407
522
  chartConfigToUnifiedState,
@@ -418,22 +533,6 @@ export { OrganizerFacade } from './organizer-facade/organizer-facade';
418
533
 
419
534
  ---
420
535
 
421
- ## Changelog
422
-
423
- ### v0.0.43+ (2026-07-03)
424
- - Ajout du support **UnitConfig** avec auto-scaling intelligent
425
- - Exports des adapters (chartConfigToOrganizer, resolveYUnit, etc.)
426
- - Renommage des propriétés OrganizerFacade (Column → Field) dans jquery-table
427
- - Support des `ScaleConfig` pour conversion dynamique d'unités
428
- - Formatage adaptatif de la précision (smartFormatY) en chart-utils
429
- - Intégration complète avec REST_LATENCY_CHART_CONFIG
430
-
431
- ### v0.0.42
432
- - Refactoring des exports publics
433
- - Consolidation de SlicePanelComponent
434
-
435
- ---
436
-
437
536
  ## Support
438
537
 
439
538
  Pour des questions ou des bugs, ouvrir une issue dans le repository jquery-charts.
@@ -1,14 +1,24 @@
1
- import { buildYFields, resolveYKey } from './organizer-utils';
1
+ import { buildYFields, normalizeOrganizerState, resolveYKey } from './organizer-utils';
2
+ import { getGroupItems, getIndicatorItems, getFilterItems, getStackItems } from './organizer-chart-config';
3
+ export { getGroupItems, getIndicatorItems, getFilterItems, getStackItems } from './organizer-chart-config';
2
4
  export function chartConfigToOrganizer(chartConfig, options = {}) {
3
- if (!chartConfig)
5
+ if (!chartConfig) {
6
+ console.debug('[OrganizerChartAdapter] Empty chart config, returning empty organizer config');
4
7
  return {};
8
+ }
9
+ console.debug('[OrganizerChartAdapter] Converting chart config to organizer', {
10
+ hasGroups: !!chartConfig.groups,
11
+ indicatorCount: chartConfig.indicators?.items?.length ?? 0,
12
+ filterCount: chartConfig.filters?.items?.length ?? 0
13
+ });
5
14
  const { onFetchSliceData, onExportVisual, onExportData, switchView } = options;
6
- const activeIndicator = chartConfig.indicators?.items?.find(i => i.selected);
7
- const baseXFields = (chartConfig.groups?.items || [])
15
+ const indicators = getIndicatorItems(chartConfig);
16
+ const activeIndicator = indicators.find(i => i.selected);
17
+ const baseXFields = getGroupItems(chartConfig)
8
18
  .filter(g => !_isSynthetic(g))
9
19
  .map(g => ({ id: g.key, label: g.menu.label || g.key }));
10
- const yFields = buildYFields((chartConfig.indicators?.items || []).map(i => ({ id: i.key, label: i.menu.label || i.key, group: i.group })));
11
- const stackFields = (activeIndicator?.extra?.stacks?.items || [])
20
+ const yFields = buildYFields(indicators.map(i => ({ id: i.key, label: i.menu.label || i.key, group: i.group })));
21
+ const stackFields = getStackItems(activeIndicator)
12
22
  .filter((s) => !_isSynthetic(s))
13
23
  .map((s) => ({ id: s.key, label: s.menu.label || s.key }));
14
24
  const seenKeys = new Set();
@@ -22,7 +32,8 @@ export function chartConfigToOrganizer(chartConfig, options = {}) {
22
32
  xFields: mergedGroupFields,
23
33
  yFields,
24
34
  groups: mergedGroupFields,
25
- slices: (chartConfig.filters?.items || []).map(f => ({ id: f.key, label: f.menu.label || f.key })),
35
+ slices: getFilterItems(chartConfig).map(f => ({ id: f.key, label: f.menu.label || f.key })),
36
+ templates: chartConfig.templates,
26
37
  showReset: false,
27
38
  onFetchSliceData,
28
39
  showExport: !!(onExportVisual || onExportData),
@@ -32,20 +43,37 @@ export function chartConfigToOrganizer(chartConfig, options = {}) {
32
43
  };
33
44
  }
34
45
  export function chartConfigToState(chartConfig) {
35
- if (!chartConfig)
46
+ if (!chartConfig) {
47
+ console.debug('[OrganizerChartAdapter] Empty chart config for state conversion');
36
48
  return {};
37
- const activeIndicator = chartConfig.indicators?.items?.find(i => i.selected);
38
- const activeStack = (activeIndicator?.extra?.stacks?.items || []).find((s) => s.selected);
39
- const activeGroup = chartConfig.groups?.items?.find(g => g.selected);
40
- const activeSlices = (chartConfig.filters?.items || []).filter(f => f.selected);
49
+ }
50
+ const indicators = getIndicatorItems(chartConfig);
51
+ const activeIndicator = indicators.find(i => i.selected);
52
+ const activeStack = getStackItems(activeIndicator).find((s) => s.selected);
53
+ const activeGroup = getGroupItems(chartConfig).find(g => g.selected);
54
+ const activeSlices = getFilterItems(chartConfig).filter(f => f.selected);
41
55
  const indicatorGroup = activeIndicator?.group;
42
- return {
56
+ console.debug('[OrganizerChartAdapter] Current chart state', {
57
+ activeGroup: activeGroup?.key,
58
+ activeIndicator: activeIndicator?.key,
59
+ activeStack: activeStack?.key,
60
+ sliceCount: activeSlices.length
61
+ });
62
+ const state = {
43
63
  selectedX: activeGroup?.key,
44
64
  selectedY: indicatorGroup ?? activeIndicator?.key,
45
65
  selectedYAggregate: indicatorGroup ? activeIndicator?.key : undefined,
46
66
  selectedGroupBy: activeStack?.key,
47
67
  selectedSlices: activeSlices.map(f => f.key),
48
68
  };
69
+ const organizerConfig = chartConfigToOrganizer(chartConfig);
70
+ return normalizeOrganizerState(state, organizerConfig);
71
+ }
72
+ export function buildOrganizerChartBinding(chartConfig, options = {}) {
73
+ return {
74
+ config: chartConfigToOrganizer(chartConfig, options),
75
+ state: chartConfigToState(chartConfig)
76
+ };
49
77
  }
50
78
  export function chartConfigToUnifiedState(chartConfig, viewMode = 'chart') {
51
79
  const state = chartConfigToState(chartConfig);
@@ -59,8 +87,11 @@ export function chartConfigToUnifiedState(chartConfig, viewMode = 'chart') {
59
87
  };
60
88
  }
61
89
  export function applyOrganizerEventToChart(event, chartConfig) {
62
- if (!chartConfig)
90
+ if (!chartConfig) {
91
+ console.debug('[OrganizerChartAdapter] Cannot apply event to empty chart config');
63
92
  return;
93
+ }
94
+ console.debug('[OrganizerChartAdapter] Applying organizer event', { eventType: event.type, state: event.state });
64
95
  const state = event.state;
65
96
  _cleanSynthetics(chartConfig);
66
97
  if (state.selectedX !== undefined)
@@ -73,11 +104,37 @@ export function applyOrganizerEventToChart(event, chartConfig) {
73
104
  _applySliceSelection(state.selectedSlices, chartConfig);
74
105
  event.resolvedYUnit = resolveYUnit(chartConfig, event.state.selectedY, event.state.selectedYAggregate);
75
106
  }
107
+ export function handleOrganizerChartEvent(event, chartConfig, currentBinding, options = {}) {
108
+ console.debug('[OrganizerChartAdapter] Handling organizer event', { eventType: event.type });
109
+ if (event.type === 'viewSwitched') {
110
+ return {
111
+ binding: {
112
+ config: chartConfigToOrganizer(chartConfig, options),
113
+ state: { ...event.state }
114
+ },
115
+ shouldRefetch: false
116
+ };
117
+ }
118
+ applyOrganizerEventToChart(event, chartConfig);
119
+ if (event.type === 'ySelected' || event.type === 'templateSelected') {
120
+ return {
121
+ binding: buildOrganizerChartBinding(chartConfig, options),
122
+ shouldRefetch: true
123
+ };
124
+ }
125
+ return {
126
+ binding: {
127
+ config: currentBinding?.config ?? chartConfigToOrganizer(chartConfig, options),
128
+ state: event.state
129
+ },
130
+ shouldRefetch: event.type !== 'sliceSelected'
131
+ };
132
+ }
76
133
  export function resolveYUnit(chartConfig, selectedY, selectedYAggregate) {
77
134
  if (!chartConfig || !selectedY)
78
135
  return undefined;
79
136
  const actualKey = resolveYKey(selectedY, selectedYAggregate);
80
- return chartConfig.indicators?.items?.find(i => i.key === actualKey)?.unit;
137
+ return getIndicatorItems(chartConfig).find(i => i.key === actualKey)?.unit;
81
138
  }
82
139
  const _syntheticItems = new WeakSet();
83
140
  function _makeSynthetic(item) {
@@ -88,24 +145,30 @@ function _isSynthetic(item) {
88
145
  return _syntheticItems.has(item);
89
146
  }
90
147
  function _cleanSynthetics(chartConfig) {
91
- chartConfig.groups.items = chartConfig.groups.items.filter(g => !_isSynthetic(g));
92
- chartConfig.indicators.items.forEach(ind => {
93
- if (ind.extra?.stacks?.items) {
94
- ind.extra.stacks.items = ind.extra.stacks.items.filter((s) => !_isSynthetic(s));
95
- }
96
- });
148
+ if (chartConfig.groups?.items) {
149
+ chartConfig.groups.items = chartConfig.groups.items.filter(g => !_isSynthetic(g));
150
+ }
151
+ if (chartConfig.indicators?.items) {
152
+ chartConfig.indicators.items.forEach(ind => {
153
+ if (ind.extra?.stacks?.items) {
154
+ ind.extra.stacks.items = ind.extra.stacks.items.filter((s) => !_isSynthetic(s));
155
+ }
156
+ });
157
+ }
97
158
  }
98
159
  function _applyXSelection(selectedX, chartConfig) {
99
- const isGroupItem = chartConfig.groups.items.some(g => g.key === selectedX);
160
+ const groupItems = getGroupItems(chartConfig);
161
+ const isGroupItem = groupItems.some(g => g.key === selectedX);
100
162
  if (isGroupItem) {
101
- chartConfig.groups.items.forEach(g => { g.selected = g.key === selectedX; });
163
+ groupItems.forEach(g => { g.selected = g.key === selectedX; });
102
164
  return;
103
165
  }
104
- const allStacks = chartConfig.indicators.items.flatMap(i => i.extra?.stacks?.items ?? []);
166
+ const indicators = getIndicatorItems(chartConfig);
167
+ const allStacks = indicators.flatMap(i => getStackItems(i));
105
168
  const stackItem = allStacks.find(s => s.key === selectedX);
106
169
  if (stackItem) {
107
- chartConfig.groups.items.forEach(g => { g.selected = false; });
108
- chartConfig.groups.items.push(_makeSynthetic({
170
+ groupItems.forEach(g => { g.selected = false; });
171
+ groupItems.push(_makeSynthetic({
109
172
  key: stackItem.key,
110
173
  selected: true,
111
174
  menu: stackItem.menu,
@@ -117,14 +180,15 @@ function _applyXSelection(selectedX, chartConfig) {
117
180
  }
118
181
  function _applyYSelection(selectedY, selectedYAggregate, chartConfig) {
119
182
  const actualKey = resolveYKey(selectedY, selectedYAggregate);
120
- chartConfig.indicators.items.forEach(i => { i.selected = i.key === actualKey; });
121
- chartConfig.indicators.items.forEach(i => {
122
- i.extra?.stacks?.items?.forEach((s) => { s.selected = false; });
183
+ const indicators = getIndicatorItems(chartConfig);
184
+ indicators.forEach(i => { i.selected = i.key === actualKey; });
185
+ indicators.forEach(i => {
186
+ getStackItems(i).forEach((s) => { s.selected = false; });
123
187
  });
124
188
  }
125
189
  function _applyGroupBySelection(effectiveGroupBy, chartConfig) {
126
- const activeIndicator = chartConfig.indicators.items.find(i => i.selected);
127
- const stackItems = activeIndicator?.extra?.stacks?.items ?? [];
190
+ const activeIndicator = getIndicatorItems(chartConfig).find(i => i.selected);
191
+ const stackItems = getStackItems(activeIndicator);
128
192
  if (effectiveGroupBy === undefined) {
129
193
  stackItems.forEach(s => { s.selected = false; });
130
194
  return;
@@ -134,7 +198,7 @@ function _applyGroupBySelection(effectiveGroupBy, chartConfig) {
134
198
  stackItems.forEach(s => { s.selected = s.key === effectiveGroupBy; });
135
199
  return;
136
200
  }
137
- const groupItem = chartConfig.groups.items.find(g => g.key === effectiveGroupBy);
201
+ const groupItem = getGroupItems(chartConfig).find(g => g.key === effectiveGroupBy);
138
202
  if (groupItem && activeIndicator) {
139
203
  stackItems.forEach(s => { s.selected = false; });
140
204
  if (!activeIndicator.extra) {
@@ -159,6 +223,6 @@ function _applyGroupBySelection(effectiveGroupBy, chartConfig) {
159
223
  }
160
224
  }
161
225
  function _applySliceSelection(selectedSlices, chartConfig) {
162
- chartConfig.filters?.items?.forEach(f => { f.selected = selectedSlices.includes(f.key); });
226
+ getFilterItems(chartConfig).forEach(f => { f.selected = selectedSlices.includes(f.key); });
163
227
  }
164
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pemVyLWNoYXJ0LWFkYXB0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmV0ZW1lL2pxdWVyeS1vcmdhbml6ZXIvc3JjL2xpYi9tb2RlbHMvb3JnYW5pemVyLWNoYXJ0LWFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQXVDOUQsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxXQUFnQixFQUNoQixVQUF1QyxFQUFFO0lBRXpDLElBQUksQ0FBQyxXQUFXO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDNUIsTUFBTSxFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBQy9FLE1BQU0sZUFBZSxHQUFHLFdBQVcsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUU3RSxNQUFNLFdBQVcsR0FBc0IsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7U0FDckUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRTNELE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FDMUIsQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FB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Q0wsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDbEQ7QUFDSCxDQUFDO0FBRUQsU0FBUyxvQkFBb0IsQ0FBQyxjQUF3QixFQUFFLFdBQWlDO0lBQ3ZGLFdBQVcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLEdBQUcsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3JnYW5pemVyQnV0dG9uRXZlbnQsIE9yZ2FuaXplckNvbmZpZywgT3JnYW5pemVyU3RhdGUsIE9yZ2FuaXplclVuaWZpZWRTdGF0ZSwgT3JnYW5pemVyVmlld1NsaWNlLCBPcmdhbml6ZXJYRmllbGQgfSBmcm9tICcuL29yZ2FuaXplci1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IGJ1aWxkWUZpZWxkcywgcmVzb2x2ZVlLZXkgfSBmcm9tICcuL29yZ2FuaXplci11dGlscyc7XG5pbXBvcnQgeyBVbml0Q29uZmlnIH0gZnJvbSAnQG9uZXRlbWUvanF1ZXJ5LWNvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9yZ2FuaXplckNoYXJ0SXRlbSB7XG4gIGtleTogc3RyaW5nO1xuICBzZWxlY3RlZDogYm9vbGVhbjtcbiAgbWVudTogeyBsYWJlbDogc3RyaW5nIH07XG4gIHVuaXQ/OiBzdHJpbmcgfCBVbml0Q29uZmlnO1xuICBqcXVlcnk/OiB7XG4gICAgdmFsdWU6IChzPzogc3RyaW5nKSA9PiBzdHJpbmc7XG4gICAgYnVpbGRBbGlhczogKHM/OiBzdHJpbmcpID0+IHN0cmluZztcbiAgICBidWlsZE5hbWU/OiAoaXRlbTogYW55LCB2YWx1ZT86IHN0cmluZykgPT4gc3RyaW5nO1xuICAgIGJ1aWxkQ29sb3I/OiAodmFsdWU/OiBzdHJpbmcpID0+IHN0cmluZztcbiAgfTtcbiAgZ3JvdXA/OiBzdHJpbmc7XG4gIGV4dHJhPzoge1xuICAgIHN0YWNrcz86IHsgb3B0aW9uYWw6IGJvb2xlYW47IGl0ZW1zOiBPcmdhbml6ZXJDaGFydEl0ZW1bXSB9O1xuICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcmdhbml6ZXJDaGFydFNlY3Rpb24ge1xuICBvcHRpb25hbDogYm9vbGVhbjtcbiAgaXRlbXM6IE9yZ2FuaXplckNoYXJ0SXRlbVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9yZ2FuaXplckNoYXJ0Q29uZmlnIHtcbiAgZ3JvdXBzOiBPcmdhbml6ZXJDaGFydFNlY3Rpb247XG4gIGluZGljYXRvcnM6IE9yZ2FuaXplckNoYXJ0U2VjdGlvbjtcbiAgZmlsdGVycz86IE9yZ2FuaXplckNoYXJ0U2VjdGlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcmdhbml6ZXJDaGFydEJyaWRnZU9wdGlvbnMge1xuICBvbkZldGNoU2xpY2VEYXRhPzogT3JnYW5pemVyQ29uZmlnWydvbkZldGNoU2xpY2VEYXRhJ107XG4gIG9uRXhwb3J0VmlzdWFsPzogKCkgPT4gdm9pZDtcbiAgb25FeHBvcnREYXRhPzogKCkgPT4gdm9pZDtcbiAgc3dpdGNoVmlldz86IE9yZ2FuaXplckNvbmZpZ1snc3dpdGNoVmlldyddO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hhcnRDb25maWdUb09yZ2FuaXplcihcbiAgY2hhcnRDb25maWc6IGFueSxcbiAgb3B0aW9uczogT3JnYW5pemVyQ2hhcnRCcmlkZ2VPcHRpb25zID0ge31cbik6IE9yZ2FuaXplckNvbmZpZyB7XG4gIGlmICghY2hhcnRDb25maWcpIHJldHVybiB7fTtcbiAgY29uc3QgeyBvbkZldGNoU2xpY2VEYXRhLCBvbkV4cG9ydFZpc3VhbCwgb25FeHBvcnREYXRhLCBzd2l0Y2hWaWV3IH0gPSBvcHRpb25zO1xuICBjb25zdCBhY3RpdmVJbmRpY2F0b3IgPSBjaGFydENvbmZpZy5pbmRpY2F0b3JzPy5pdGVtcz8uZmluZChpID0+IGkuc2VsZWN0ZWQpO1xuXG4gIGNvbnN0IGJhc2VYRmllbGRzOiBPcmdhbml6ZXJYRmllbGRbXSA9IChjaGFydENvbmZpZy5ncm91cHM/Lml0ZW1zIHx8IFtdKVxuICAgIC5maWx0ZXIoZyA9PiAhX2lzU3ludGhldGljKGcpKVxuICAgIC5tYXAoZyA9PiAoeyBpZDogZy5rZXksIGxhYmVsOiBnLm1lbnUubGFiZWwgfHwgZy5rZXkgfSkpO1xuXG4gIGNvbnN0IHlGaWVsZHMgPSBidWlsZFlGaWVsZHMoXG4gICAgKGNoYXJ0Q29uZmlnLmluZGljYXRvcnM/Lml0ZW1zIHx8IFtdKS5tYXAoaSA9PiAoeyBpZDogaS5rZXksIGxhYmVsOiBpLm1lbnUubGFiZWwgfHwgaS5rZXksIGdyb3VwOiBpLmdyb3VwIH0pKVxuICApO1xuXG4gIGNvbnN0IHN0YWNrRmllbGRzID0gKGFjdGl2ZUluZGljYXRvcj8uZXh0cmE/LnN0YWNrcz8uaXRlbXMgfHwgW10pXG4gICAgLmZpbHRlcigoczogT3JnYW5pemVyQ2hhcnRJdGVtKSA9PiAhX2lzU3ludGhldGljKHMpKVxuICAgIC5tYXAoKHM6IE9yZ2FuaXplckNoYXJ0SXRlbSkgPT4gKHsgaWQ6IHMua2V5LCBsYWJlbDogcy5tZW51LmxhYmVsIHx8IHMua2V5IH0pKTtcblxuICBjb25zdCBzZWVuS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBtZXJnZWRHcm91cEZpZWxkcyA9IFsuLi5iYXNlWEZpZWxkcywgLi4uc3RhY2tGaWVsZHNdLmZpbHRlcihmID0+IHtcbiAgICBpZiAoc2VlbktleXMuaGFzKGYuaWQpKSByZXR1cm4gZmFsc2U7XG4gICAgc2VlbktleXMuYWRkKGYuaWQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHhGaWVsZHM6IG1lcmdlZEdyb3VwRmllbGRzLFxuICAgIHlGaWVsZHMsXG4gICAgZ3JvdXBzOiBtZXJnZWRHcm91cEZpZWxkcyxcbiAgICBzbGljZXM6IChjaGFydENvbmZpZy5maWx0ZXJzPy5pdGVtcyB8fCBbXSkubWFwKGYgPT4gKHsgaWQ6IGYua2V5LCBsYWJlbDogZi5tZW51LmxhYmVsIHx8IGYua2V5IH0pIGFzIE9yZ2FuaXplclZpZXdTbGljZSksXG4gICAgc2hvd1Jlc2V0OiBmYWxzZSxcbiAgICBvbkZldGNoU2xpY2VEYXRhLFxuICAgIHNob3dFeHBvcnQ6ICEhKG9uRXhwb3J0VmlzdWFsIHx8IG9uRXhwb3J0RGF0YSksXG4gICAgb25FeHBvcnRWaXN1YWwsXG4gICAgb25FeHBvcnREYXRhLFxuICAgIHN3aXRjaFZpZXcsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGFydENvbmZpZ1RvU3RhdGUoY2hhcnRDb25maWc6IGFueSk6IE9yZ2FuaXplclN0YXRlIHtcbiAgaWYgKCFjaGFydENvbmZpZykgcmV0dXJuIHt9O1xuICBjb25zdCBhY3RpdmVJbmRpY2F0b3IgPSBjaGFydENvbmZpZy5pbmRpY2F0b3JzPy5pdGVtcz8uZmluZChpID0+IGkuc2VsZWN0ZWQpO1xuICBjb25zdCBhY3RpdmVTdGFjayA9IChhY3RpdmVJbmRpY2F0b3I/LmV4dHJhPy5zdGFja3M/Lml0ZW1zIHx8IFtdKS5maW5kKChzOiBPcmdhbml6ZXJDaGFydEl0ZW0pID0+IHMuc2VsZWN0ZWQpO1xuICBjb25zdCBhY3RpdmVHcm91cCA9IGNoYXJ0Q29uZmlnLmdyb3Vwcz8uaXRlbXM/LmZpbmQoZyA9PiBnLnNlbGVjdGVkKTtcbiAgY29uc3QgYWN0aXZlU2xpY2VzID0gKGNoYXJ0Q29uZmlnLmZpbHRlcnM/Lml0ZW1zIHx8IFtdKS5maWx0ZXIoZiA9PiBmLnNlbGVjdGVkKTtcbiAgY29uc3QgaW5kaWNhdG9yR3JvdXAgPSBhY3RpdmVJbmRpY2F0b3I/Lmdyb3VwO1xuICByZXR1cm4ge1xuICAgIHNlbGVjdGVkWDogYWN0aXZlR3JvdXA/LmtleSxcbiAgICBzZWxlY3RlZFk6IGluZGljYXRvckdyb3VwID8/IGFjdGl2ZUluZGljYXRvcj8ua2V5LFxuICAgIHNlbGVjdGVkWUFnZ3JlZ2F0ZTogaW5kaWNhdG9yR3JvdXAgPyBhY3RpdmVJbmRpY2F0b3I/LmtleSA6IHVuZGVmaW5lZCxcbiAgICBzZWxlY3RlZEdyb3VwQnk6IGFjdGl2ZVN0YWNrPy5rZXksXG4gICAgc2VsZWN0ZWRTbGljZXM6IGFjdGl2ZVNsaWNlcy5tYXAoZiA9PiBmLmtleSksXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGFydENvbmZpZ1RvVW5pZmllZFN0YXRlKFxuICBjaGFydENvbmZpZzogYW55LFxuICB2aWV3TW9kZTogJ2NoYXJ0JyB8ICd0YWJsZScgPSAnY2hhcnQnXG4pOiBPcmdhbml6ZXJVbmlmaWVkU3RhdGUge1xuICBjb25zdCBzdGF0ZSA9IGNoYXJ0Q29uZmlnVG9TdGF0ZShjaGFydENvbmZpZyk7XG4gIHJldHVybiB7XG4gICAgdmlld01vZGUsXG4gICAgZGltZW5zaW9uOiBzdGF0ZS5zZWxlY3RlZFgsXG4gICAgbWV0cmljOiByZXNvbHZlWUtleShzdGF0ZS5zZWxlY3RlZFksIHN0YXRlLnNlbGVjdGVkWUFnZ3JlZ2F0ZSksXG4gICAgbWV0cmljQWdncmVnYXRlOiBzdGF0ZS5zZWxlY3RlZFlBZ2dyZWdhdGUsXG4gICAgYnJlYWtkb3duOiBzdGF0ZS5zZWxlY3RlZEdyb3VwQnksXG4gICAgZmlsdGVyczogc3RhdGUuc2VsZWN0ZWRTbGljZXMsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseU9yZ2FuaXplckV2ZW50VG9DaGFydChcbiAgZXZlbnQ6IE9yZ2FuaXplckJ1dHRvbkV2ZW50LFxuICBjaGFydENvbmZpZzogYW55XG4pOiB2b2lkIHtcbiAgaWYgKCFjaGFydENvbmZpZykgcmV0dXJuO1xuICBjb25zdCBzdGF0ZSA9IGV2ZW50LnN0YXRlO1xuICBfY2xlYW5TeW50aGV0aWNzKGNoYXJ0Q29uZmlnKTtcbiAgaWYgKHN0YXRlLnNlbGVjdGVkWCAhPT0gdW5kZWZpbmVkKSBfYXBwbHlYU2VsZWN0aW9uKHN0YXRlLnNlbGVjdGVkWCwgY2hhcnRDb25maWcpO1xuICBpZiAoc3RhdGUuc2VsZWN0ZWRZICE9PSB1bmRlZmluZWQpIF9hcHBseVlTZWxlY3Rpb24oc3RhdGUuc2VsZWN0ZWRZLCBzdGF0ZS5zZWxlY3RlZFlBZ2dyZWdhdGUsIGNoYXJ0Q29uZmlnKTtcbiAgY29uc3QgZWZmZWN0aXZlR3JvdXBCeSA9IHN0YXRlLnNlbGVjdGVkR3JvdXBCeSAhPT0gc3RhdGUuc2VsZWN0ZWRYID8gc3RhdGUuc2VsZWN0ZWRHcm91cEJ5IDogdW5kZWZpbmVkO1xuICBfYXBwbHlHcm91cEJ5U2VsZWN0aW9uKGVmZmVjdGl2ZUdyb3VwQnksIGNoYXJ0Q29uZmlnKTtcbiAgaWYgKHN0YXRlLnNlbGVjdGVkU2xpY2VzICE9PSB1bmRlZmluZWQpIF9hcHBseVNsaWNlU2VsZWN0aW9uKHN0YXRlLnNlbGVjdGVkU2xpY2VzLCBjaGFydENvbmZpZyk7XG4gIGV2ZW50LnJlc29sdmVkWVVuaXQgPSByZXNvbHZlWVVuaXQoY2hhcnRDb25maWcsIGV2ZW50LnN0YXRlLnNlbGVjdGVkWSwgZXZlbnQuc3RhdGUuc2VsZWN0ZWRZQWdncmVnYXRlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVZVW5pdChcbiAgY2hhcnRDb25maWc6IGFueSxcbiAgc2VsZWN0ZWRZOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHNlbGVjdGVkWUFnZ3JlZ2F0ZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBzdHJpbmcgfCBVbml0Q29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjaGFydENvbmZpZyB8fCAhc2VsZWN0ZWRZKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBhY3R1YWxLZXkgPSByZXNvbHZlWUtleShzZWxlY3RlZFksIHNlbGVjdGVkWUFnZ3JlZ2F0ZSk7XG4gIHJldHVybiBjaGFydENvbmZpZy5pbmRpY2F0b3JzPy5pdGVtcz8uZmluZChpID0+IGkua2V5ID09PSBhY3R1YWxLZXkpPy51bml0O1xufVxuXG5jb25zdCBfc3ludGhldGljSXRlbXMgPSBuZXcgV2Vha1NldDxPcmdhbml6ZXJDaGFydEl0ZW0+KCk7XG5cbmZ1bmN0aW9uIF9tYWtlU3ludGhldGljKGl0ZW06IE9yZ2FuaXplckNoYXJ0SXRlbSk6IE9yZ2FuaXplckNoYXJ0SXRlbSB7XG4gIF9zeW50aGV0aWNJdGVtcy5hZGQoaXRlbSk7XG4gIHJldHVybiBpdGVtO1xufVxuXG5mdW5jdGlvbiBfaXNTeW50aGV0aWMoaXRlbTogT3JnYW5pemVyQ2hhcnRJdGVtKTogYm9vbGVhbiB7XG4gIHJldHVybiBfc3ludGhldGljSXRlbXMuaGFzKGl0ZW0pO1xufVxuXG5mdW5jdGlvbiBfY2xlYW5TeW50aGV0aWNzKGNoYXJ0Q29uZmlnOiBPcmdhbml6ZXJDaGFydENvbmZpZyk6IHZvaWQge1xuICBjaGFydENvbmZpZy5ncm91cHMuaXRlbXMgPSBjaGFydENvbmZpZy5ncm91cHMuaXRlbXMuZmlsdGVyKGcgPT4gIV9pc1N5bnRoZXRpYyhnKSk7XG4gIGNoYXJ0Q29uZmlnLmluZGljYXRvcnMuaXRlbXMuZm9yRWFjaChpbmQgPT4ge1xuICAgIGlmIChpbmQuZXh0cmE/LnN0YWNrcz8uaXRlbXMpIHtcbiAgICAgIGluZC5leHRyYS5zdGFja3MuaXRlbXMgPSBpbmQuZXh0cmEuc3RhY2tzLml0ZW1zLmZpbHRlcigoczogT3JnYW5pemVyQ2hhcnRJdGVtKSA9PiAhX2lzU3ludGhldGljKHMpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBfYXBwbHlYU2VsZWN0aW9uKHNlbGVjdGVkWDogc3RyaW5nLCBjaGFydENvbmZpZzogT3JnYW5pemVyQ2hhcnRDb25maWcpOiB2b2lkIHtcbiAgY29uc3QgaXNHcm91cEl0ZW0gPSBjaGFydENvbmZpZy5ncm91cHMuaXRlbXMuc29tZShnID0+IGcua2V5ID09PSBzZWxlY3RlZFgpO1xuICBpZiAoaXNHcm91cEl0ZW0pIHtcbiAgICBjaGFydENvbmZpZy5ncm91cHMuaXRlbXMuZm9yRWFjaChnID0+IHsgZy5zZWxlY3RlZCA9IGcua2V5ID09PSBzZWxlY3RlZFg7IH0pO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBhbGxTdGFja3M6IE9yZ2FuaXplckNoYXJ0SXRlbVtdID0gY2hhcnRDb25maWcuaW5kaWNhdG9ycy5pdGVtcy5mbGF0TWFwKGkgPT4gaS5leHRyYT8uc3RhY2tzPy5pdGVtcyA/PyBbXSk7XG4gIGNvbnN0IHN0YWNrSXRlbSA9IGFsbFN0YWNrcy5maW5kKHMgPT4gcy5rZXkgPT09IHNlbGVjdGVkWCk7XG4gIGlmIChzdGFja0l0ZW0pIHtcbiAgICBjaGFydENvbmZpZy5ncm91cHMuaXRlbXMuZm9yRWFjaChnID0+IHsgZy5zZWxlY3RlZCA9IGZhbHNlOyB9KTtcbiAgICBjaGFydENvbmZpZy5ncm91cHMuaXRlbXMucHVzaChfbWFrZVN5bnRoZXRpYyh7XG4gICAgICBrZXk6IHN0YWNrSXRlbS5rZXksXG4gICAgICBzZWxlY3RlZDogdHJ1ZSxcbiAgICAgIG1lbnU6IHN0YWNrSXRlbS5tZW51LFxuICAgICAganF1ZXJ5OiBzdGFja0l0ZW0uanF1ZXJ5XG4gICAgICAgID8geyB2YWx1ZTogKCkgPT4gc3RhY2tJdGVtLmpxdWVyeSEudmFsdWUoKSwgYnVpbGRBbGlhczogKCkgPT4gc3RhY2tJdGVtLmpxdWVyeSEuYnVpbGRBbGlhcygpIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9hcHBseVlTZWxlY3Rpb24oc2VsZWN0ZWRZOiBzdHJpbmcsIHNlbGVjdGVkWUFnZ3JlZ2F0ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBjaGFydENvbmZpZzogT3JnYW5pemVyQ2hhcnRDb25maWcpOiB2b2lkIHtcbiAgY29uc3QgYWN0dWFsS2V5ID0gcmVzb2x2ZVlLZXkoc2VsZWN0ZWRZLCBzZWxlY3RlZFlBZ2dyZWdhdGUpO1xuICBjaGFydENvbmZpZy5pbmRpY2F0b3JzLml0ZW1zLmZvckVhY2goaSA9PiB7IGkuc2VsZWN0ZWQgPSBpLmtleSA9PT0gYWN0dWFsS2V5OyB9KTtcbiAgY2hhcnRDb25maWcuaW5kaWNhdG9ycy5pdGVtcy5mb3JFYWNoKGkgPT4ge1xuICAgIGkuZXh0cmE/LnN0YWNrcz8uaXRlbXM/LmZvckVhY2goKHM6IE9yZ2FuaXplckNoYXJ0SXRlbSkgPT4geyBzLnNlbGVjdGVkID0gZmFsc2U7IH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gX2FwcGx5R3JvdXBCeVNlbGVjdGlvbihlZmZlY3RpdmVHcm91cEJ5OiBzdHJpbmcgfCB1bmRlZmluZWQsIGNoYXJ0Q29uZmlnOiBPcmdhbml6ZXJDaGFydENvbmZpZyk6IHZvaWQge1xuICBjb25zdCBhY3RpdmVJbmRpY2F0b3IgPSBjaGFydENvbmZpZy5pbmRpY2F0b3JzLml0ZW1zLmZpbmQoaSA9PiBpLnNlbGVjdGVkKTtcbiAgY29uc3Qgc3RhY2tJdGVtczogT3JnYW5pemVyQ2hhcnRJdGVtW10gPSBhY3RpdmVJbmRpY2F0b3I/LmV4dHJhPy5zdGFja3M/Lml0ZW1zID8/IFtdO1xuICBpZiAoZWZmZWN0aXZlR3JvdXBCeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc3RhY2tJdGVtcy5mb3JFYWNoKHMgPT4geyBzLnNlbGVjdGVkID0gZmFsc2U7IH0pO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBpc1N0YWNrSXRlbSA9IHN0YWNrSXRlbXMuc29tZShzID0+IHMua2V5ID09PSBlZmZlY3RpdmVHcm91cEJ5KTtcbiAgaWYgKGlzU3RhY2tJdGVtKSB7XG4gICAgc3RhY2tJdGVtcy5mb3JFYWNoKHMgPT4geyBzLnNlbGVjdGVkID0gcy5rZXkgPT09IGVmZmVjdGl2ZUdyb3VwQnk7IH0pO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBncm91cEl0ZW0gPSBjaGFydENvbmZpZy5ncm91cHMuaXRlbXMuZmluZChnID0+IGcua2V5ID09PSBlZmZlY3RpdmVHcm91cEJ5KTtcbiAgaWYgKGdyb3VwSXRlbSAmJiBhY3RpdmVJbmRpY2F0b3IpIHtcbiAgICBzdGFja0l0ZW1zLmZvckVhY2gocyA9PiB7IHMuc2VsZWN0ZWQgPSBmYWxzZTsgfSk7XG4gICAgaWYgKCFhY3RpdmVJbmRpY2F0b3IuZXh0cmEpIHtcbiAgICAgIGFjdGl2ZUluZGljYXRvci5leHRyYSA9IHsgc3RhY2tzOiB7IG9wdGlvbmFsOiB0cnVlLCBpdGVtczogW10gfSB9O1xuICAgIH0gZWxzZSBpZiAoIWFjdGl2ZUluZGljYXRvci5leHRyYS5zdGFja3MpIHtcbiAgICAgIGFjdGl2ZUluZGljYXRvci5leHRyYS5zdGFja3MgPSB7IG9wdGlvbmFsOiB0cnVlLCBpdGVtczogW10gfTtcbiAgICB9XG4gICAgYWN0aXZlSW5kaWNhdG9yLmV4dHJhLnN0YWNrcy5pdGVtcy5wdXNoKF9tYWtlU3ludGhldGljKHtcbiAgICAgIGtleTogZ3JvdXBJdGVtLmtleSxcbiAgICAgIHNlbGVjdGVkOiB0cnVlLFxuICAgICAgbWVudTogZ3JvdXBJdGVtLm1lbnUsXG4gICAgICBqcXVlcnk6IGdyb3VwSXRlbS5qcXVlcnkgPyB7XG4gICAgICAgIHZhbHVlOiAoKSA9PiBncm91cEl0ZW0uanF1ZXJ5IS52YWx1ZSgpLFxuICAgICAgICBidWlsZEFsaWFzOiAoKSA9PiBncm91cEl0ZW0uanF1ZXJ5IS5idWlsZEFsaWFzKCksXG4gICAgICAgIGJ1aWxkTmFtZTogKF9pdGVtOiBhbnksIHZhbHVlOiBzdHJpbmcpID0+IFN0cmluZyh2YWx1ZSksXG4gICAgICB9IDogdW5kZWZpbmVkLFxuICAgIH0pKTtcbiAgfSBlbHNlIHtcbiAgICBzdGFja0l0ZW1zLmZvckVhY2gocyA9PiB7IHMuc2VsZWN0ZWQgPSBmYWxzZTsgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2FwcGx5U2xpY2VTZWxlY3Rpb24oc2VsZWN0ZWRTbGljZXM6IHN0cmluZ1tdLCBjaGFydENvbmZpZzogT3JnYW5pemVyQ2hhcnRDb25maWcpOiB2b2lkIHtcbiAgY2hhcnRDb25maWcuZmlsdGVycz8uaXRlbXM/LmZvckVhY2goZiA9PiB7IGYuc2VsZWN0ZWQgPSBzZWxlY3RlZFNsaWNlcy5pbmNsdWRlcyhmLmtleSk7IH0pO1xufVxuIl19
228
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pemVyLWNoYXJ0LWFkYXB0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmV0ZW1lL2pxdWVyeS1vcmdhbml6ZXIvc3JjL2xpYi9tb2RlbHMvb3JnYW5pemVyLWNoYXJ0LWFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSx1QkFBdUIsRUFBNkIsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbEgsT0FBTyxFQUF3QixhQUFhLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRWpJLE9BQU8sRUFBd0IsYUFBYSxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQTBDakksTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxXQUFvRCxFQUNwRCxVQUF1QyxFQUFFO0lBRXpDLElBQUksQ0FBQyxXQUFXLEVBQUU7UUFDaEIsT0FBTyxDQUFDLEtBQUssQ0FBQyw4RUFBOEUsQ0FBQyxDQUFDO1FBQzlGLE9BQU8sRUFBRSxDQUFDO0tBQ1g7SUFFRCxPQUFPLENBQUMsS0FBSyxDQUFDLDhEQUE4RCxFQUFFO1FBQzVFLFNBQVMsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU07UUFDL0IsY0FBYyxFQUFFLFdBQVcsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO1FBQzFELFdBQVcsRUFBRSxXQUFXLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztLQUNyRCxDQUFDLENBQUM7SUFFSCxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFDL0UsTUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFD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Q0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDbEQ7QUFDSCxDQUFDO0FBRUQsU0FBUyxvQkFBb0IsQ0FBQyxjQUF3QixFQUFFLFdBQWlDO0lBQ3ZGLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxHQUFHLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9yZ2FuaXplckJ1dHRvbkV2ZW50LCBPcmdhbml6ZXJDb25maWcsIE9yZ2FuaXplclN0YXRlLCBPcmdhbml6ZXJVbmlmaWVkU3RhdGUsIE9yZ2FuaXplclZpZXdTbGljZSwgT3JnYW5pemVyWEZpZWxkIH0gZnJvbSAnLi9vcmdhbml6ZXItY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBidWlsZFlGaWVsZHMsIG5vcm1hbGl6ZU9yZ2FuaXplclN0YXRlLCByZXNvbHZlTWF0Y2hpbmdUZW1wbGF0ZUlkLCByZXNvbHZlWUtleSB9IGZyb20gJy4vb3JnYW5pemVyLXV0aWxzJztcbmltcG9ydCB7IFVuaXRDb25maWcgfSBmcm9tICdAb25ldGVtZS9qcXVlcnktY29yZSc7XG5pbXBvcnQgeyBPcmdhbml6ZXJDaGFydENvbmZpZywgZ2V0R3JvdXBJdGVtcywgZ2V0SW5kaWNhdG9ySXRlbXMsIGdldEZpbHRlckl0ZW1zLCBnZXRTdGFja0l0ZW1zIH0gZnJvbSAnLi9vcmdhbml6ZXItY2hhcnQtY29uZmlnJztcblxuZXhwb3J0IHsgT3JnYW5pemVyQ2hhcnRDb25maWcsIGdldEdyb3VwSXRlbXMsIGdldEluZGljYXRvckl0ZW1zLCBnZXRGaWx0ZXJJdGVtcywgZ2V0U3RhY2tJdGVtcyB9IGZyb20gJy4vb3JnYW5pemVyLWNoYXJ0LWNvbmZpZyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3JnYW5pemVyQ2hhcnRJdGVtIHtcbiAga2V5OiBzdHJpbmc7XG4gIHNlbGVjdGVkOiBib29sZWFuO1xuICBtZW51OiB7IGxhYmVsOiBzdHJpbmcgfTtcbiAgdW5pdD86IHN0cmluZyB8IFVuaXRDb25maWc7XG4gIGpxdWVyeT86IHtcbiAgICB2YWx1ZTogKHM/OiBzdHJpbmcpID0+IHN0cmluZztcbiAgICBidWlsZEFsaWFzOiAocz86IHN0cmluZykgPT4gc3RyaW5nO1xuICAgIGJ1aWxkTmFtZT86IChpdGVtOiBhbnksIHZhbHVlPzogc3RyaW5nKSA9PiBzdHJpbmc7XG4gICAgYnVpbGRDb2xvcj86ICh2YWx1ZT86IHN0cmluZykgPT4gc3RyaW5nO1xuICB9O1xuICBncm91cD86IHN0cmluZztcbiAgZXh0cmE/OiB7XG4gICAgc3RhY2tzPzogeyBvcHRpb25hbDogYm9vbGVhbjsgaXRlbXM6IE9yZ2FuaXplckNoYXJ0SXRlbVtdIH07XG4gICAgW2tleTogc3RyaW5nXTogYW55O1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9yZ2FuaXplckNoYXJ0U2VjdGlvbiB7XG4gIG9wdGlvbmFsOiBib29sZWFuO1xuICBpdGVtczogT3JnYW5pemVyQ2hhcnRJdGVtW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3JnYW5pemVyQ2hhcnRCcmlkZ2VPcHRpb25zIHtcbiAgb25GZXRjaFNsaWNlRGF0YT86IE9yZ2FuaXplckNvbmZpZ1snb25GZXRjaFNsaWNlRGF0YSddO1xuICBvbkV4cG9ydFZpc3VhbD86ICgpID0+IHZvaWQ7XG4gIG9uRXhwb3J0RGF0YT86ICgpID0+IHZvaWQ7XG4gIHN3aXRjaFZpZXc/OiBPcmdhbml6ZXJDb25maWdbJ3N3aXRjaFZpZXcnXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcmdhbml6ZXJDaGFydEJpbmRpbmcge1xuICBjb25maWc6IE9yZ2FuaXplckNvbmZpZztcbiAgc3RhdGU6IE9yZ2FuaXplclN0YXRlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9yZ2FuaXplckNoYXJ0RXZlbnRSZXN1bHQge1xuICBiaW5kaW5nOiBPcmdhbml6ZXJDaGFydEJpbmRpbmc7XG4gIHNob3VsZFJlZmV0Y2g6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGFydENvbmZpZ1RvT3JnYW5pemVyKFxuICBjaGFydENvbmZpZzogT3JnYW5pemVyQ2hhcnRDb25maWcgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBvcHRpb25zOiBPcmdhbml6ZXJDaGFydEJyaWRnZU9wdGlvbnMgPSB7fVxuKTogT3JnYW5pemVyQ29uZmlnIHtcbiAgaWYgKCFjaGFydENvbmZpZykge1xuICAgIGNvbnNvbGUuZGVidWcoJ1tPcmdhbml6ZXJDaGFydEFkYXB0ZXJdIEVtcHR5IGNoYXJ0IGNvbmZpZywgcmV0dXJuaW5nIGVtcHR5IG9yZ2FuaXplciBjb25maWcnKTtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjb25zb2xlLmRlYnVnKCdbT3JnYW5pemVyQ2hhcnRBZGFwdGVyXSBDb252ZXJ0aW5nIGNoYXJ0IGNvbmZpZyB0byBvcmdhbml6ZXInLCB7XG4gICAgaGFzR3JvdXBzOiAhIWNoYXJ0Q29uZmlnLmdyb3VwcyxcbiAgICBpbmRpY2F0b3JDb3VudDogY2hhcnRDb25maWcuaW5kaWNhdG9ycz8uaXRlbXM/Lmxlbmd0aCA/PyAwLFxuICAgIGZpbHRlckNvdW50OiBjaGFydENvbmZpZy5maWx0ZXJzPy5pdGVtcz8ubGVuZ3RoID8/IDBcbiAgfSk7XG5cbiAgY29uc3QgeyBvbkZldGNoU2xpY2VEYXRhLCBvbkV4cG9ydFZpc3VhbCwgb25FeHBvcnREYXRhLCBzd2l0Y2hWaWV3IH0gPSBvcHRpb25zO1xuICBjb25zdCBpbmRpY2F0b3JzID0gZ2V0SW5kaWNhdG9ySXRlbXMoY2hhcnRDb25maWcpO1xuICBjb25zdCBhY3RpdmVJbmRpY2F0b3IgPSBpbmRpY2F0b3JzLmZpbmQoaSA9PiBpLnNlbGVjdGVkKTtcblxuICBjb25zdCBiYXNlWEZpZWxkczogT3JnYW5pemVyWEZpZWxkW10gPSBnZXRHcm91cEl0ZW1zKGNoYXJ0Q29uZmlnKVxuICAgIC5maWx0ZXIoZyA9PiAhX2lzU3ludGhldGljKGcpKVxuICAgIC5tYXAoZyA9PiAoeyBpZDogZy5rZXksIGxhYmVsOiBnLm1lbnUubGFiZWwgfHwgZy5rZXkgfSkpO1xuXG4gIGNvbnN0IHlGaWVsZHMgPSBidWlsZFlGaWVsZHMoXG4gICAgaW5kaWNhdG9ycy5tYXAoaSA9PiAoeyBpZDogaS5rZXksIGxhYmVsOiBpLm1lbnUubGFiZWwgfHwgaS5rZXksIGdyb3VwOiBpLmdyb3VwIH0pKVxuICApO1xuXG4gIGNvbnN0IHN0YWNrRmllbGRzID0gZ2V0U3RhY2tJdGVtcyhhY3RpdmVJbmRpY2F0b3IpXG4gICAgLmZpbHRlcigoczogT3JnYW5pemVyQ2hhcnRJdGVtKSA9PiAhX2lzU3ludGhldGljKHMpKVxuICAgIC5tYXAoKHM6IE9yZ2FuaXplckNoYXJ0SXRlbSkgPT4gKHsgaWQ6IHMua2V5LCBsYWJlbDogcy5tZW51LmxhYmVsIHx8IHMua2V5IH0pKTtcblxuICBjb25zdCBzZWVuS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBtZXJnZWRHcm91cEZpZWxkcyA9IFsuLi5iYXNlWEZpZWxkcywgLi4uc3RhY2tGaWVsZHNdLmZpbHRlcihmID0+IHtcbiAgICBpZiAoc2VlbktleXMuaGFzKGYuaWQpKSByZXR1cm4gZmFsc2U7XG4gICAgc2VlbktleXMuYWRkKGYuaWQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHhGaWVsZHM6IG1lcmdlZEdyb3VwRmllbGRzLFxuICAgIHlGaWVsZHMsXG4gICAgZ3JvdXBzOiBtZXJnZWRHcm91cEZpZWxkcyxcbiAgICBzbGljZXM6IGdldEZpbHRlckl0ZW1zKGNoYXJ0Q29uZmlnKS5tYXAoZiA9PiAoeyBpZDogZi5rZXksIGxhYmVsOiBmLm1lbnUubGFiZWwgfHwgZi5rZXkgfSkgYXMgT3JnYW5pemVyVmlld1NsaWNlKSxcbiAgICB0ZW1wbGF0ZXM6IGNoYXJ0Q29uZmlnLnRlbXBsYXRlcyxcbiAgICBzaG93UmVzZXQ6IGZhbHNlLFxuICAgIG9uRmV0Y2hTbGljZURhdGEsXG4gICAgc2hvd0V4cG9ydDogISEob25FeHBvcnRWaXN1YWwgfHwgb25FeHBvcnREYXRhKSxcbiAgICBvbkV4cG9ydFZpc3VhbCxcbiAgICBvbkV4cG9ydERhdGEsXG4gICAgc3dpdGNoVmlldyxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoYXJ0Q29uZmlnVG9TdGF0ZShjaGFydENvbmZpZzogT3JnYW5pemVyQ2hhcnRDb25maWcgfCBudWxsIHwgdW5kZWZpbmVkKTogT3JnYW5pemVyU3RhdGUge1xuICBpZiAoIWNoYXJ0Q29uZmlnKSB7XG4gICAgY29uc29sZS5kZWJ1ZygnW09yZ2FuaXplckNoYXJ0QWRhcHRlcl0gRW1wdHkgY2hhcnQgY29uZmlnIGZvciBzdGF0ZSBjb252ZXJzaW9uJyk7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgY29uc3QgaW5kaWNhdG9ycyA9IGdldEluZGljYXRvckl0ZW1zKGNoYXJ0Q29uZmlnKTtcbiAgY29uc3QgYWN0aXZlSW5kaWNhdG9yID0gaW5kaWNhdG9ycy5maW5kKGkgPT4gaS5zZWxlY3RlZCk7XG4gIGNvbnN0IGFjdGl2ZVN0YWNrID0gZ2V0U3RhY2tJdGVtcyhhY3RpdmVJbmRpY2F0b3IpLmZpbmQoKHM6IE9yZ2FuaXplckNoYXJ0SXRlbSkgPT4gcy5zZWxlY3RlZCk7XG4gIGNvbnN0IGFjdGl2ZUdyb3VwID0gZ2V0R3JvdXBJdGVtcyhjaGFydENvbmZpZykuZmluZChnID0+IGcuc2VsZWN0ZWQpO1xuICBjb25zdCBhY3RpdmVTbGljZXMgPSBnZXRGaWx0ZXJJdGVtcyhjaGFydENvbmZpZykuZmlsdGVyKGYgPT4gZi5zZWxlY3RlZCk7XG4gIGNvbnN0IGluZGljYXRvckdyb3VwID0gYWN0aXZlSW5kaWNhdG9yPy5ncm91cDtcblxuICBjb25zb2xlLmRlYnVnKCdbT3JnYW5pemVyQ2hhcnRBZGFwdGVyXSBDdXJyZW50IGNoYXJ0IHN0YXRlJywge1xuICAgIGFjdGl2ZUdyb3VwOiBhY3RpdmVHcm91cD8ua2V5LFxuICAgIGFjdGl2ZUluZGljYXRvcjogYWN0aXZlSW5kaWNhdG9yPy5rZXksXG4gICAgYWN0aXZlU3RhY2s6IGFjdGl2ZVN0YWNrPy5rZXksXG4gICAgc2xpY2VDb3VudDogYWN0aXZlU2xpY2VzLmxlbmd0aFxuICB9KTtcblxuICBjb25zdCBzdGF0ZSA9IHtcbiAgICBzZWxlY3RlZFg6IGFjdGl2ZUdyb3VwPy5rZXksXG4gICAgc2VsZWN0ZWRZOiBpbmRpY2F0b3JHcm91cCA/PyBhY3RpdmVJbmRpY2F0b3I/LmtleSxcbiAgICBzZWxlY3RlZFlBZ2dyZWdhdGU6IGluZGljYXRvckdyb3VwID8gYWN0aXZlSW5kaWNhdG9yPy5rZXkgOiB1bmRlZmluZWQsXG4gICAgc2VsZWN0ZWRHcm91cEJ5OiBhY3RpdmVTdGFjaz8ua2V5LFxuICAgIHNlbGVjdGVkU2xpY2VzOiBhY3RpdmVTbGljZXMubWFwKGYgPT4gZi5rZXkpLFxuICB9O1xuICBjb25zdCBvcmdhbml6ZXJDb25maWcgPSBjaGFydENvbmZpZ1RvT3JnYW5pemVyKGNoYXJ0Q29uZmlnKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZU9yZ2FuaXplclN0YXRlKHN0YXRlLCBvcmdhbml6ZXJDb25maWcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRPcmdhbml6ZXJDaGFydEJpbmRpbmcoXG4gIGNoYXJ0Q29uZmlnOiBPcmdhbml6ZXJDaGFydENvbmZpZyB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM6IE9yZ2FuaXplckNoYXJ0QnJpZGdlT3B0aW9ucyA9IHt9XG4pOiBPcmdhbml6ZXJDaGFydEJpbmRpbmcge1xuICByZXR1cm4ge1xuICAgIGNvbmZpZzogY2hhcnRDb25maWdUb09yZ2FuaXplcihjaGFydENvbmZpZywgb3B0aW9ucyksXG4gICAgc3RhdGU6IGNoYXJ0Q29uZmlnVG9TdGF0ZShjaGFydENvbmZpZylcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoYXJ0Q29uZmlnVG9VbmlmaWVkU3RhdGUoXG4gIGNoYXJ0Q29uZmlnOiBPcmdhbml6ZXJDaGFydENvbmZpZyB8IG51bGwgfCB1bmRlZmluZWQsXG4gIHZpZXdNb2RlOiAnY2hhcnQnIHwgJ3RhYmxlJyA9ICdjaGFydCdcbik6IE9yZ2FuaXplclVuaWZpZWRTdGF0ZSB7XG4gIGNvbnN0IHN0YXRlID0gY2hhcnRDb25maWdUb1N0YXRlKGNoYXJ0Q29uZmlnKTtcbiAgcmV0dXJuIHtcbiAgICB2aWV3TW9kZSxcbiAgICBkaW1lbnNpb246IHN0YXRlLnNlbGVjdGVkWCxcbiAgICBtZXRyaWM6IHJlc29sdmVZS2V5KHN0YXRlLnNlbGVjdGVkWSwgc3RhdGUuc2VsZWN0ZWRZQWdncmVnYXRlKSxcbiAgICBtZXRyaWNBZ2dyZWdhdGU6IHN0YXRlLnNlbGVjdGVkWUFnZ3JlZ2F0ZSxcbiAgICBicmVha2Rvd246IHN0YXRlLnNlbGVjdGVkR3JvdXBCeSxcbiAgICBmaWx0ZXJzOiBzdGF0ZS5zZWxlY3RlZFNsaWNlcyxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5T3JnYW5pemVyRXZlbnRUb0NoYXJ0KFxuICBldmVudDogT3JnYW5pemVyQnV0dG9uRXZlbnQsXG4gIGNoYXJ0Q29uZmlnOiBPcmdhbml6ZXJDaGFydENvbmZpZyB8IG51bGwgfCB1bmRlZmluZWRcbik6IHZvaWQge1xuICBpZiAoIWNoYXJ0Q29uZmlnKSB7XG4gICAgY29uc29sZS5kZWJ1ZygnW09yZ2FuaXplckNoYXJ0QWRhcHRlcl0gQ2Fubm90IGFwcGx5IGV2ZW50IHRvIGVtcHR5IGNoYXJ0IGNvbmZpZycpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnNvbGUuZGVidWcoJ1tPcmdhbml6ZXJDaGFydEFkYXB0ZXJdIEFwcGx5aW5nIG9yZ2FuaXplciBldmVudCcsIHsgZXZlbnRUeXBlOiBldmVudC50eXBlLCBzdGF0ZTogZXZlbnQuc3RhdGUgfSk7XG5cbiAgY29uc3Qgc3RhdGUgPSBldmVudC5zdGF0ZTtcbiAgX2NsZWFuU3ludGhldGljcyhjaGFydENvbmZpZyk7XG4gIGlmIChzdGF0ZS5zZWxlY3RlZFggIT09IHVuZGVmaW5lZCkgX2FwcGx5WFNlbGVjdGlvbihzdGF0ZS5zZWxlY3RlZFgsIGNoYXJ0Q29uZmlnKTtcbiAgaWYgKHN0YXRlLnNlbGVjdGVkWSAhPT0gdW5kZWZpbmVkKSBfYXBwbHlZU2VsZWN0aW9uKHN0YXRlLnNlbGVjdGVkWSwgc3RhdGUuc2VsZWN0ZWRZQWdncmVnYXRlLCBjaGFydENvbmZpZyk7XG4gIGNvbnN0IGVmZmVjdGl2ZUdyb3VwQnkgPSBzdGF0ZS5zZWxlY3RlZEdyb3VwQnkgIT09IHN0YXRlLnNlbGVjdGVkWCA/IHN0YXRlLnNlbGVjdGVkR3JvdXBCeSA6IHVuZGVmaW5lZDtcbiAgX2FwcGx5R3JvdXBCeVNlbGVjdGlvbihlZmZlY3RpdmVHcm91cEJ5LCBjaGFydENvbmZpZyk7XG4gIGlmIChzdGF0ZS5zZWxlY3RlZFNsaWNlcyAhPT0gdW5kZWZpbmVkKSBfYXBwbHlTbGljZVNlbGVjdGlvbihzdGF0ZS5zZWxlY3RlZFNsaWNlcywgY2hhcnRDb25maWcpO1xuICBldmVudC5yZXNvbHZlZFlVbml0ID0gcmVzb2x2ZVlVbml0KGNoYXJ0Q29uZmlnLCBldmVudC5zdGF0ZS5zZWxlY3RlZFksIGV2ZW50LnN0YXRlLnNlbGVjdGVkWUFnZ3JlZ2F0ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVPcmdhbml6ZXJDaGFydEV2ZW50KFxuICBldmVudDogT3JnYW5pemVyQnV0dG9uRXZlbnQsXG4gIGNoYXJ0Q29uZmlnOiBPcmdhbml6ZXJDaGFydENvbmZpZyB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGN1cnJlbnRCaW5kaW5nOiBPcmdhbml6ZXJDaGFydEJpbmRpbmcgfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM6IE9yZ2FuaXplckNoYXJ0QnJpZGdlT3B0aW9ucyA9IHt9XG4pOiBPcmdhbml6ZXJDaGFydEV2ZW50UmVzdWx0IHtcbiAgY29uc29sZS5kZWJ1ZygnW09yZ2FuaXplckNoYXJ0QWRhcHRlcl0gSGFuZGxpbmcgb3JnYW5pemVyIGV2ZW50JywgeyBldmVudFR5cGU6IGV2ZW50LnR5cGUgfSk7XG5cbiAgaWYgKGV2ZW50LnR5cGUgPT09ICd2aWV3U3dpdGNoZWQnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJpbmRpbmc6IHtcbiAgICAgICAgY29uZmlnOiBjaGFydENvbmZpZ1RvT3JnYW5pemVyKGNoYXJ0Q29uZmlnLCBvcHRpb25zKSxcbiAgICAgICAgc3RhdGU6IHsgLi4uZXZlbnQuc3RhdGUgfVxuICAgICAgfSxcbiAgICAgIHNob3VsZFJlZmV0Y2g6IGZhbHNlXG4gICAgfTtcbiAgfVxuXG4gIGFwcGx5T3JnYW5pemVyRXZlbnRUb0NoYXJ0KGV2ZW50LCBjaGFydENvbmZpZyk7XG5cbiAgaWYgKGV2ZW50LnR5cGUgPT09ICd5U2VsZWN0ZWQnIHx8IGV2ZW50LnR5cGUgPT09ICd0ZW1wbGF0ZVNlbGVjdGVkJykge1xuICAgIHJldHVybiB7XG4gICAgICBiaW5kaW5nOiBidWlsZE9yZ2FuaXplckNoYXJ0QmluZGluZyhjaGFydENvbmZpZywgb3B0aW9ucyksXG4gICAgICBzaG91bGRSZWZldGNoOiB0cnVlXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYmluZGluZzoge1xuICAgICAgY29uZmlnOiBjdXJyZW50QmluZGluZz8uY29uZmlnID8/IGNoYXJ0Q29uZmlnVG9Pcmdhbml6ZXIoY2hhcnRDb25maWcsIG9wdGlvbnMpLFxuICAgICAgc3RhdGU6IGV2ZW50LnN0YXRlXG4gICAgfSxcbiAgICBzaG91bGRSZWZldGNoOiBldmVudC50eXBlICE9PSAnc2xpY2VTZWxlY3RlZCdcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVZVW5pdChcbiAgY2hhcnRDb25maWc6IE9yZ2FuaXplckNoYXJ0Q29uZmlnIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgc2VsZWN0ZWRZOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHNlbGVjdGVkWUFnZ3JlZ2F0ZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBzdHJpbmcgfCBVbml0Q29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjaGFydENvbmZpZyB8fCAhc2VsZWN0ZWRZKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBhY3R1YWxLZXkgPSByZXNvbHZlWUtleShzZWxlY3RlZFksIHNlbGVjdGVkWUFnZ3JlZ2F0ZSk7XG4gIHJldHVybiBnZXRJbmRpY2F0b3JJdGVtcyhjaGFydENvbmZpZykuZmluZChpID0+IGkua2V5ID09PSBhY3R1YWxLZXkpPy51bml0O1xufVxuXG5jb25zdCBfc3ludGhldGljSXRlbXMgPSBuZXcgV2Vha1NldDxPcmdhbml6ZXJDaGFydEl0ZW0+KCk7XG5cbmZ1bmN0aW9uIF9tYWtlU3ludGhldGljKGl0ZW06IE9yZ2FuaXplckNoYXJ0SXRlbSk6IE9yZ2FuaXplckNoYXJ0SXRlbSB7XG4gIF9zeW50aGV0aWNJdGVtcy5hZGQoaXRlbSk7XG4gIHJldHVybiBpdGVtO1xufVxuXG5mdW5jdGlvbiBfaXNTeW50aGV0aWMoaXRlbTogT3JnYW5pemVyQ2hhcnRJdGVtKTogYm9vbGVhbiB7XG4gIHJldHVybiBfc3ludGhldGljSXRlbXMuaGFzKGl0ZW0pO1xufVxuXG5mdW5jdGlvbiBfY2xlYW5TeW50aGV0aWNzKGNoYXJ0Q29uZmlnOiBPcmdhbml6ZXJDaGFydENvbmZpZyk6IHZvaWQge1xuICBpZiAoY2hhcnRDb25maWcuZ3JvdXBzPy5pdGVtcykge1xuICAgIGNoYXJ0Q29uZmlnLmdyb3Vwcy5pdGVtcyA9IGNoYXJ0Q29uZmlnLmdyb3Vwcy5pdGVtcy5maWx0ZXIoZyA9PiAhX2lzU3ludGhldGljKGcpKTtcbiAgfVxuICBpZiAoY2hhcnRDb25maWcuaW5kaWNhdG9ycz8uaXRlbXMpIHtcbiAgICBjaGFydENvbmZpZy5pbmRpY2F0b3JzLml0ZW1zLmZvckVhY2goaW5kID0+IHtcbiAgICAgIGlmIChpbmQuZXh0cmE/LnN0YWNrcz8uaXRlbXMpIHtcbiAgICAgICAgaW5kLmV4dHJhLnN0YWNrcy5pdGVtcyA9IGluZC5leHRyYS5zdGFja3MuaXRlbXMuZmlsdGVyKChzOiBPcmdhbml6ZXJDaGFydEl0ZW0pID0+ICFfaXNTeW50aGV0aWMocykpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9hcHBseVhTZWxlY3Rpb24oc2VsZWN0ZWRYOiBzdHJpbmcsIGNoYXJ0Q29uZmlnOiBPcmdhbml6ZXJDaGFydENvbmZpZyk6IHZvaWQge1xuICBjb25zdCBncm91cEl0ZW1zID0gZ2V0R3JvdXBJdGVtcyhjaGFydENvbmZpZyk7XG4gIGNvbnN0IGlzR3JvdXBJdGVtID0gZ3JvdXBJdGVtcy5zb21lKGcgPT4gZy5rZXkgPT09IHNlbGVjdGVkWCk7XG4gIGlmIChpc0dyb3VwSXRlbSkge1xuICAgIGdyb3VwSXRlbXMuZm9yRWFjaChnID0+IHsgZy5zZWxlY3RlZCA9IGcua2V5ID09PSBzZWxlY3RlZFg7IH0pO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBpbmRpY2F0b3JzID0gZ2V0SW5kaWNhdG9ySXRlbXMoY2hhcnRDb25maWcpO1xuICBjb25zdCBhbGxTdGFja3M6IE9yZ2FuaXplckNoYXJ0SXRlbVtdID0gaW5kaWNhdG9ycy5mbGF0TWFwKGkgPT4gZ2V0U3RhY2tJdGVtcyhpKSk7XG4gIGNvbnN0IHN0YWNrSXRlbSA9IGFsbFN0YWNrcy5maW5kKHMgPT4gcy5rZXkgPT09IHNlbGVjdGVkWCk7XG4gIGlmIChzdGFja0l0ZW0pIHtcbiAgICBncm91cEl0ZW1zLmZvckVhY2goZyA9PiB7IGcuc2VsZWN0ZWQgPSBmYWxzZTsgfSk7XG4gICAgZ3JvdXBJdGVtcy5wdXNoKF9tYWtlU3ludGhldGljKHtcbiAgICAgIGtleTogc3RhY2tJdGVtLmtleSxcbiAgICAgIHNlbGVjdGVkOiB0cnVlLFxuICAgICAgbWVudTogc3RhY2tJdGVtLm1lbnUsXG4gICAgICBqcXVlcnk6IHN0YWNrSXRlbS5qcXVlcnlcbiAgICAgICAgPyB7IHZhbHVlOiAoKSA9PiBzdGFja0l0ZW0uanF1ZXJ5IS52YWx1ZSgpLCBidWlsZEFsaWFzOiAoKSA9PiBzdGFja0l0ZW0uanF1ZXJ5IS5idWlsZEFsaWFzKCkgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9KSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2FwcGx5WVNlbGVjdGlvbihzZWxlY3RlZFk6IHN0cmluZywgc2VsZWN0ZWRZQWdncmVnYXRlOiBzdHJpbmcgfCB1bmRlZmluZWQsIGNoYXJ0Q29uZmlnOiBPcmdhbml6ZXJDaGFydENvbmZpZyk6IHZvaWQge1xuICBjb25zdCBhY3R1YWxLZXkgPSByZXNvbHZlWUtleShzZWxlY3RlZFksIHNlbGVjdGVkWUFnZ3JlZ2F0ZSk7XG4gIGNvbnN0IGluZGljYXRvcnMgPSBnZXRJbmRpY2F0b3JJdGVtcyhjaGFydENvbmZpZyk7XG4gIGluZGljYXRvcnMuZm9yRWFjaChpID0+IHsgaS5zZWxlY3RlZCA9IGkua2V5ID09PSBhY3R1YWxLZXk7IH0pO1xuICBpbmRpY2F0b3JzLmZvckVhY2goaSA9PiB7XG4gICAgZ2V0U3RhY2tJdGVtcyhpKS5mb3JFYWNoKChzOiBPcmdhbml6ZXJDaGFydEl0ZW0pID0+IHsgcy5zZWxlY3RlZCA9IGZhbHNlOyB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIF9hcHBseUdyb3VwQnlTZWxlY3Rpb24oZWZmZWN0aXZlR3JvdXBCeTogc3RyaW5nIHwgdW5kZWZpbmVkLCBjaGFydENvbmZpZzogT3JnYW5pemVyQ2hhcnRDb25maWcpOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZlSW5kaWNhdG9yID0gZ2V0SW5kaWNhdG9ySXRlbXMoY2hhcnRDb25maWcpLmZpbmQoaSA9PiBpLnNlbGVjdGVkKTtcbiAgY29uc3Qgc3RhY2tJdGVtczogT3JnYW5pemVyQ2hhcnRJdGVtW10gPSBnZXRTdGFja0l0ZW1zKGFjdGl2ZUluZGljYXRvcik7XG4gIGlmIChlZmZlY3RpdmVHcm91cEJ5ID09PSB1bmRlZmluZWQpIHtcbiAgICBzdGFja0l0ZW1zLmZvckVhY2gocyA9PiB7IHMuc2VsZWN0ZWQgPSBmYWxzZTsgfSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGlzU3RhY2tJdGVtID0gc3RhY2tJdGVtcy5zb21lKHMgPT4gcy5rZXkgPT09IGVmZmVjdGl2ZUdyb3VwQnkpO1xuICBpZiAoaXNTdGFja0l0ZW0pIHtcbiAgICBzdGFja0l0ZW1zLmZvckVhY2gocyA9PiB7IHMuc2VsZWN0ZWQgPSBzLmtleSA9PT0gZWZmZWN0aXZlR3JvdXBCeTsgfSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGdyb3VwSXRlbSA9IGdldEdyb3VwSXRlbXMoY2hhcnRDb25maWcpLmZpbmQoZyA9PiBnLmtleSA9PT0gZWZmZWN0aXZlR3JvdXBCeSk7XG4gIGlmIChncm91cEl0ZW0gJiYgYWN0aXZlSW5kaWNhdG9yKSB7XG4gICAgc3RhY2tJdGVtcy5mb3JFYWNoKHMgPT4geyBzLnNlbGVjdGVkID0gZmFsc2U7IH0pO1xuICAgIGlmICghYWN0aXZlSW5kaWNhdG9yLmV4dHJhKSB7XG4gICAgICBhY3RpdmVJbmRpY2F0b3IuZXh0cmEgPSB7IHN0YWNrczogeyBvcHRpb25hbDogdHJ1ZSwgaXRlbXM6IFtdIH0gfTtcbiAgICB9IGVsc2UgaWYgKCFhY3RpdmVJbmRpY2F0b3IuZXh0cmEuc3RhY2tzKSB7XG4gICAgICBhY3RpdmVJbmRpY2F0b3IuZXh0cmEuc3RhY2tzID0geyBvcHRpb25hbDogdHJ1ZSwgaXRlbXM6IFtdIH07XG4gICAgfVxuICAgIGFjdGl2ZUluZGljYXRvci5leHRyYS5zdGFja3MuaXRlbXMucHVzaChfbWFrZVN5bnRoZXRpYyh7XG4gICAgICBrZXk6IGdyb3VwSXRlbS5rZXksXG4gICAgICBzZWxlY3RlZDogdHJ1ZSxcbiAgICAgIG1lbnU6IGdyb3VwSXRlbS5tZW51LFxuICAgICAganF1ZXJ5OiBncm91cEl0ZW0uanF1ZXJ5ID8ge1xuICAgICAgICB2YWx1ZTogKCkgPT4gZ3JvdXBJdGVtLmpxdWVyeSEudmFsdWUoKSxcbiAgICAgICAgYnVpbGRBbGlhczogKCkgPT4gZ3JvdXBJdGVtLmpxdWVyeSEuYnVpbGRBbGlhcygpLFxuICAgICAgICBidWlsZE5hbWU6IChfaXRlbTogYW55LCB2YWx1ZTogc3RyaW5nKSA9PiBTdHJpbmcodmFsdWUpLFxuICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICB9KSk7XG4gIH0gZWxzZSB7XG4gICAgc3RhY2tJdGVtcy5mb3JFYWNoKHMgPT4geyBzLnNlbGVjdGVkID0gZmFsc2U7IH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9hcHBseVNsaWNlU2VsZWN0aW9uKHNlbGVjdGVkU2xpY2VzOiBzdHJpbmdbXSwgY2hhcnRDb25maWc6IE9yZ2FuaXplckNoYXJ0Q29uZmlnKTogdm9pZCB7XG4gIGdldEZpbHRlckl0ZW1zKGNoYXJ0Q29uZmlnKS5mb3JFYWNoKGYgPT4geyBmLnNlbGVjdGVkID0gc2VsZWN0ZWRTbGljZXMuaW5jbHVkZXMoZi5rZXkpOyB9KTtcbn1cblxuIl19