@oneteme/jquery-organizer 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +441 -0
- package/esm2022/lib/group-by-manager/group-by-manager.mjs +73 -0
- package/esm2022/lib/lazy-field-manager/lazy-field-manager.mjs +91 -0
- package/esm2022/lib/models/index.mjs +3 -0
- package/esm2022/lib/models/organizer-chart-adapter.mjs +164 -0
- package/esm2022/lib/models/organizer-config.interface.mjs +2 -0
- package/esm2022/lib/models/organizer-menu.model.mjs +17 -0
- package/esm2022/lib/models/organizer-utils.mjs +26 -0
- package/esm2022/lib/organizer-button/organizer-button.component.mjs +266 -0
- package/esm2022/lib/organizer-button/organizer-button.module.mjs +17 -0
- package/esm2022/lib/organizer-facade/organizer-facade.mjs +269 -0
- package/esm2022/lib/organizer-facade/organizer-facade.types.mjs +2 -0
- package/esm2022/lib/slice-panel/slice-panel.component.mjs +452 -0
- package/esm2022/lib/slice-panel/slice-panel.model.mjs +2 -0
- package/esm2022/oneteme-jquery-organizer.mjs +5 -0
- package/esm2022/public-api.mjs +12 -0
- package/fesm2022/oneteme-jquery-organizer.mjs +1369 -0
- package/fesm2022/oneteme-jquery-organizer.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/group-by-manager/group-by-manager.d.ts +20 -0
- package/lib/lazy-field-manager/lazy-field-manager.d.ts +25 -0
- package/lib/models/index.d.ts +2 -0
- package/lib/models/organizer-chart-adapter.d.ts +44 -0
- package/lib/models/organizer-config.interface.d.ts +103 -0
- package/lib/models/organizer-menu.model.d.ts +7 -0
- package/lib/models/organizer-utils.d.ts +8 -0
- package/lib/organizer-button/organizer-button.component.d.ts +51 -0
- package/lib/organizer-button/organizer-button.module.d.ts +8 -0
- package/lib/organizer-facade/organizer-facade.d.ts +51 -0
- package/lib/organizer-facade/organizer-facade.types.d.ts +31 -0
- package/lib/slice-panel/slice-panel.component.d.ts +80 -0
- package/lib/slice-panel/slice-panel.model.d.ts +25 -0
- package/package.json +35 -0
- package/public-api.d.ts +12 -0
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ChangeDetectorRef, ViewChild, ViewEncapsulation } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
4
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
5
|
+
import { MatMenuModule, MatMenuTrigger } from '@angular/material/menu';
|
|
6
|
+
import { MatDividerModule } from '@angular/material/divider';
|
|
7
|
+
import { Subject, isObservable } from 'rxjs';
|
|
8
|
+
import { takeUntil } from 'rxjs/operators';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "@angular/common";
|
|
11
|
+
import * as i2 from "@angular/material/icon";
|
|
12
|
+
import * as i3 from "@angular/material/menu";
|
|
13
|
+
import * as i4 from "@angular/material/divider";
|
|
14
|
+
export class OrganizerButtonComponent {
|
|
15
|
+
constructor(cdr) {
|
|
16
|
+
this.cdr = cdr;
|
|
17
|
+
this.hideMenuValues = false;
|
|
18
|
+
this.viewChange = new EventEmitter();
|
|
19
|
+
this.sliceStateChange = new EventEmitter();
|
|
20
|
+
this.fieldDataCache = new Map();
|
|
21
|
+
this.destroy$ = new Subject();
|
|
22
|
+
}
|
|
23
|
+
ngOnInit() { }
|
|
24
|
+
ngOnDestroy() {
|
|
25
|
+
this.destroy$.next();
|
|
26
|
+
this.destroy$.complete();
|
|
27
|
+
}
|
|
28
|
+
isFieldVisible(fieldId) {
|
|
29
|
+
const visible = this.state?.visibleFields;
|
|
30
|
+
if (!visible) {
|
|
31
|
+
return this.config.fields?.find(f => f.id === fieldId)?.visible !== false;
|
|
32
|
+
}
|
|
33
|
+
return visible.includes(fieldId);
|
|
34
|
+
}
|
|
35
|
+
fieldsSummary() {
|
|
36
|
+
const total = this.config.fields?.length ?? 0;
|
|
37
|
+
const visible = this.state?.visibleFields?.length ?? total;
|
|
38
|
+
return `${visible}/${total}`;
|
|
39
|
+
}
|
|
40
|
+
onFieldToggle(fieldId, visible) {
|
|
41
|
+
const visibleFields = this.state?.visibleFields || [];
|
|
42
|
+
const updated = visible
|
|
43
|
+
? [...visibleFields, fieldId]
|
|
44
|
+
: visibleFields.filter(f => f !== fieldId);
|
|
45
|
+
this.emitChange('fieldToggled', { visibleFields: updated });
|
|
46
|
+
}
|
|
47
|
+
onXFieldSelect(fieldId) {
|
|
48
|
+
this.emitChange('xSelected', { selectedX: fieldId });
|
|
49
|
+
}
|
|
50
|
+
onYFieldSelect(fieldId) {
|
|
51
|
+
this.emitChange('ySelected', {
|
|
52
|
+
selectedY: fieldId,
|
|
53
|
+
selectedYAggregate: undefined
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
onYAggregateSelect(yFieldId, aggregateId) {
|
|
57
|
+
this.emitChange('ySelected', {
|
|
58
|
+
selectedY: yFieldId,
|
|
59
|
+
selectedYAggregate: aggregateId
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
onGroupBySelect(groupId) {
|
|
63
|
+
const current = this.state.selectedGroupBy;
|
|
64
|
+
this.emitChange('groupBySelected', { selectedGroupBy: current === groupId ? undefined : groupId });
|
|
65
|
+
}
|
|
66
|
+
onTemplateSelect(templateId) {
|
|
67
|
+
const t = this.config.templates?.find(tmpl => tmpl.id === templateId);
|
|
68
|
+
if (!t)
|
|
69
|
+
return;
|
|
70
|
+
this.emitChange('templateSelected', {
|
|
71
|
+
selectedTemplate: templateId,
|
|
72
|
+
selectedX: t.xField,
|
|
73
|
+
selectedY: t.yField,
|
|
74
|
+
selectedYAggregate: t.yAggregate,
|
|
75
|
+
selectedGroupBy: t.groupBy
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
onSliceClick(sliceId) {
|
|
79
|
+
if (this.config.onSliceClick) {
|
|
80
|
+
this.config.onSliceClick();
|
|
81
|
+
}
|
|
82
|
+
const selectedSlices = this.state?.selectedSlices || [];
|
|
83
|
+
let updated;
|
|
84
|
+
if (sliceId) {
|
|
85
|
+
updated = selectedSlices.includes(sliceId) ? [] : [sliceId];
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
updated = selectedSlices;
|
|
89
|
+
}
|
|
90
|
+
if (updated.length === 0 || !sliceId || !this.config.onFetchSliceData) {
|
|
91
|
+
if (this.config.onFetchSliceData) {
|
|
92
|
+
this.sliceStateChange.emit(null);
|
|
93
|
+
}
|
|
94
|
+
this.emitChange('sliceSelected', { selectedSlices: updated });
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const slice = this.config.slices?.find(s => s.id === sliceId);
|
|
98
|
+
const result = this.config.onFetchSliceData(sliceId);
|
|
99
|
+
const handleData = (tasks) => {
|
|
100
|
+
this.sliceStateChange.emit({
|
|
101
|
+
sliceConfigs: [{ title: slice?.label ?? sliceId, columnKey: sliceId }],
|
|
102
|
+
tasks
|
|
103
|
+
});
|
|
104
|
+
this.emitChange('sliceSelected', { selectedSlices: updated });
|
|
105
|
+
};
|
|
106
|
+
if (isObservable(result)) {
|
|
107
|
+
result.pipe(takeUntil(this.destroy$)).subscribe({ next: handleData });
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
result.then(handleData);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async loadFieldData(fieldId) {
|
|
114
|
+
if (this.fieldDataCache.has(fieldId))
|
|
115
|
+
return;
|
|
116
|
+
if (!this.config.onFetchFieldData)
|
|
117
|
+
return;
|
|
118
|
+
const field = this.config.fields?.find(f => f.id === fieldId);
|
|
119
|
+
if (!field)
|
|
120
|
+
return;
|
|
121
|
+
this.loadingFieldId = fieldId;
|
|
122
|
+
this.cdr.markForCheck();
|
|
123
|
+
try {
|
|
124
|
+
const data = await this.config.onFetchFieldData(fieldId);
|
|
125
|
+
this.fieldDataCache.set(fieldId, data);
|
|
126
|
+
}
|
|
127
|
+
finally {
|
|
128
|
+
this.loadingFieldId = undefined;
|
|
129
|
+
this.cdr.markForCheck();
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
onExport() {
|
|
133
|
+
if (this.config.onExport)
|
|
134
|
+
this.config.onExport();
|
|
135
|
+
this.mainMenuTrigger?.closeMenu();
|
|
136
|
+
}
|
|
137
|
+
onExportVisual() {
|
|
138
|
+
if (this.config.onExportVisual)
|
|
139
|
+
this.config.onExportVisual();
|
|
140
|
+
this.mainMenuTrigger?.closeMenu();
|
|
141
|
+
}
|
|
142
|
+
onExportData() {
|
|
143
|
+
if (this.config.onExportData)
|
|
144
|
+
this.config.onExportData();
|
|
145
|
+
this.mainMenuTrigger?.closeMenu();
|
|
146
|
+
}
|
|
147
|
+
hasExportSubMenu() {
|
|
148
|
+
return !!(this.config.onExportVisual || this.config.onExportData);
|
|
149
|
+
}
|
|
150
|
+
hasSwitchView() {
|
|
151
|
+
return !!this.config.switchView;
|
|
152
|
+
}
|
|
153
|
+
onSwitchView() {
|
|
154
|
+
const sv = this.config.switchView;
|
|
155
|
+
if (!sv)
|
|
156
|
+
return;
|
|
157
|
+
const newView = sv.currentView === 'chart' ? 'table' : 'chart';
|
|
158
|
+
sv.onSwitch(newView);
|
|
159
|
+
this.emitChange('viewSwitched', { viewMode: newView });
|
|
160
|
+
this.mainMenuTrigger?.closeMenu();
|
|
161
|
+
}
|
|
162
|
+
onPreferencesEdit() {
|
|
163
|
+
if (this.config.onPreferencesEdit)
|
|
164
|
+
this.config.onPreferencesEdit();
|
|
165
|
+
this.mainMenuTrigger?.closeMenu();
|
|
166
|
+
}
|
|
167
|
+
onPreferencesSave() {
|
|
168
|
+
if (this.config.onPreferencesSave)
|
|
169
|
+
this.config.onPreferencesSave();
|
|
170
|
+
this.mainMenuTrigger?.closeMenu();
|
|
171
|
+
}
|
|
172
|
+
onPreferencesClear() {
|
|
173
|
+
if (this.config.onPreferencesClear)
|
|
174
|
+
this.config.onPreferencesClear();
|
|
175
|
+
this.mainMenuTrigger?.closeMenu();
|
|
176
|
+
}
|
|
177
|
+
onReset() {
|
|
178
|
+
this.emitChange('reset', {
|
|
179
|
+
visibleFields: [],
|
|
180
|
+
selectedX: undefined,
|
|
181
|
+
selectedY: undefined,
|
|
182
|
+
selectedYAggregate: undefined,
|
|
183
|
+
selectedGroupBy: undefined,
|
|
184
|
+
selectedSlices: []
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
activeXLabel() {
|
|
188
|
+
const id = this.state?.selectedX;
|
|
189
|
+
if (!id)
|
|
190
|
+
return '';
|
|
191
|
+
return this.config.xFields?.find(f => f.id === id)?.label ?? id;
|
|
192
|
+
}
|
|
193
|
+
activeYLabel() {
|
|
194
|
+
const yId = this.state?.selectedY;
|
|
195
|
+
if (!yId)
|
|
196
|
+
return '';
|
|
197
|
+
const yField = this.config.yFields?.find(f => f.id === yId);
|
|
198
|
+
const base = yField?.label ?? yId;
|
|
199
|
+
if (this.state?.selectedYAggregate) {
|
|
200
|
+
const agg = yField?.aggregates?.find(a => a.id === this.state.selectedYAggregate);
|
|
201
|
+
return agg ? `${base} · ${agg.label}` : base;
|
|
202
|
+
}
|
|
203
|
+
return base;
|
|
204
|
+
}
|
|
205
|
+
activeGroupByLabel() {
|
|
206
|
+
const id = this.state?.selectedGroupBy;
|
|
207
|
+
if (!id)
|
|
208
|
+
return '';
|
|
209
|
+
return this.config.groups?.find(g => g.id === id)?.label ?? id;
|
|
210
|
+
}
|
|
211
|
+
activeSlicesLabel() {
|
|
212
|
+
const ids = this.state?.selectedSlices;
|
|
213
|
+
if (!ids?.length)
|
|
214
|
+
return '';
|
|
215
|
+
if (ids.length === 1) {
|
|
216
|
+
return this.config.slices?.find(s => s.id === ids[0])?.label ?? ids[0];
|
|
217
|
+
}
|
|
218
|
+
return `${ids.length} sélectionnés`;
|
|
219
|
+
}
|
|
220
|
+
activeTemplateLabel() {
|
|
221
|
+
const id = this.state?.selectedTemplate;
|
|
222
|
+
if (!id)
|
|
223
|
+
return '';
|
|
224
|
+
return this.config.templates?.find(t => t.id === id)?.label ?? id;
|
|
225
|
+
}
|
|
226
|
+
hasChartFields() {
|
|
227
|
+
return (this.config.xFields?.length ?? 0) > 0 || (this.config.yFields?.length ?? 0) > 0;
|
|
228
|
+
}
|
|
229
|
+
hasTableFields() {
|
|
230
|
+
return (this.config.fields?.length ?? 0) > 0;
|
|
231
|
+
}
|
|
232
|
+
isYActive(yFieldId) {
|
|
233
|
+
return this.state?.selectedY === yFieldId;
|
|
234
|
+
}
|
|
235
|
+
isYAggregateActive(yFieldId, aggregateId) {
|
|
236
|
+
return this.state?.selectedY === yFieldId && this.state?.selectedYAggregate === aggregateId;
|
|
237
|
+
}
|
|
238
|
+
emitChange(type, stateUpdate) {
|
|
239
|
+
const event = {
|
|
240
|
+
type,
|
|
241
|
+
state: { ...this.state, ...stateUpdate },
|
|
242
|
+
source: 'user'
|
|
243
|
+
};
|
|
244
|
+
this.viewChange.emit(event);
|
|
245
|
+
}
|
|
246
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: OrganizerButtonComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
247
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: OrganizerButtonComponent, isStandalone: true, selector: "organizer-button", inputs: { config: "config", state: "state", hideMenuValues: "hideMenuValues" }, outputs: { viewChange: "viewChange", sliceStateChange: "sliceStateChange" }, viewQueries: [{ propertyName: "mainMenuTrigger", first: true, predicate: ["mainMenuTrigger"], descendants: true }], ngImport: i0, template: "<button type=\"button\" class=\"organizer-btn\" [matMenuTriggerFor]=\"viewMenu\" #mainMenuTrigger=\"matMenuTrigger\" [attr.aria-label]=\"'View'\">\n <mat-icon class=\"organizer-btn-icon\">{{ config.buttonIcon || 'settings' }}</mat-icon>\n</button>\n\n<mat-menu #viewMenu=\"matMenu\" panelClass=\"organizer-menu-panel\">\n\n <!-- Champs : mode chart (X + Y) -->\n <button *ngIf=\"hasChartFields()\" mat-menu-item [matMenuTriggerFor]=\"champsSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Champs</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues && (activeXLabel() || activeYLabel())\">\n {{ activeXLabel() }}<ng-container *ngIf=\"activeXLabel() && activeYLabel()\"> / </ng-container>{{ activeYLabel() }}\n </span>\n </button>\n\n <!-- Champs : mode table (toggle colonnes) -->\n <button *ngIf=\"hasTableFields()\" mat-menu-item [matMenuTriggerFor]=\"fieldsSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Champs</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues\">{{ fieldsSummary() }}</span>\n </button>\n\n <!-- Grouper par -->\n <button *ngIf=\"config.groups?.length\" mat-menu-item [matMenuTriggerFor]=\"groupsSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Grouper par</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues && activeGroupByLabel()\">{{ activeGroupByLabel() }}</span>\n </button>\n\n <!-- Filtrer par -->\n <button *ngIf=\"config.slices?.length\" mat-menu-item [matMenuTriggerFor]=\"slicesSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Filtrer par</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues && activeSlicesLabel()\">{{ activeSlicesLabel() }}</span>\n </button>\n\n <!-- Template -->\n <button *ngIf=\"config.templates?.length\" mat-menu-item [matMenuTriggerFor]=\"templateSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Template</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues && activeTemplateLabel()\">{{ activeTemplateLabel() }}</span>\n </button>\n\n <!-- Export direct (mode table) -->\n <mat-divider *ngIf=\"config.showExport\" class=\"organizer-divider\"></mat-divider>\n <button *ngIf=\"config.showExport && !hasExportSubMenu()\" mat-menu-item type=\"button\" class=\"organizer-menu-export\" (click)=\"onExport()\">\n <mat-icon class=\"organizer-menu-export-icon\">download</mat-icon>\n <span class=\"organizer-menu-label\">Exporter</span>\n </button>\n\n <!-- Export graphique (mode chart) \u2014 ouvre un sous-menu -->\n <button *ngIf=\"config.showExport && hasExportSubMenu()\" mat-menu-item [matMenuTriggerFor]=\"exportSubMenu\" class=\"organizer-menu-trigger organizer-menu-export\">\n <mat-icon class=\"organizer-menu-export-icon\">download</mat-icon>\n <span class=\"organizer-menu-label\">Exporter</span>\n </button>\n\n <!-- Pr\u00E9f\u00E9rences -->\n <mat-divider *ngIf=\"config.showPreferences\" class=\"organizer-divider\"></mat-divider>\n <button *ngIf=\"config.showPreferences\" mat-menu-item [matMenuTriggerFor]=\"preferencesSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Pr\u00E9f\u00E9rences</span>\n </button>\n\n <!-- Switch chart / table -->\n <mat-divider *ngIf=\"hasSwitchView()\" class=\"organizer-divider\"></mat-divider>\n <button *ngIf=\"hasSwitchView()\" mat-menu-item type=\"button\" class=\"organizer-menu-trigger\" (click)=\"onSwitchView()\">\n <mat-icon class=\"organizer-menu-export-icon\">{{ config.switchView?.currentView === 'chart' ? 'table_chart' : 'bar_chart' }}</mat-icon>\n <span class=\"organizer-menu-label\">{{ config.switchView?.currentView === 'chart' ? 'Tableau' : 'Graphique' }}</span>\n </button>\n\n</mat-menu>\n\n<!-- Sous-menu : Export graphique -->\n<mat-menu #exportSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button *ngIf=\"config.onExportVisual\" type=\"button\" class=\"organizer-submenu-item\"\n (mousedown)=\"onExportVisual()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">image</mat-icon>\n Visuel\n </button>\n <button *ngIf=\"config.onExportData\" type=\"button\" class=\"organizer-submenu-item\"\n (mousedown)=\"onExportData()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">table_chart</mat-icon>\n Donn\u00E9es\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Champs chart (X + Y) -->\n<mat-menu #champsSubMenu=\"matMenu\" panelClass=\"organizer-champs-panel\">\n <div class=\"organizer-champs-wrapper\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n\n <!-- Bloc X -->\n <div class=\"organizer-champs-block\" *ngIf=\"config.xFields?.length\">\n <span class=\"organizer-champs-block-title\">X \u2014 Axe horizontal</span>\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let xField of config.xFields\"\n [class.active]=\"state?.selectedX === xField.id\"\n [disabled]=\"xField.disabled\"\n (mousedown)=\"onXFieldSelect(xField.id)\">\n <span class=\"organizer-submenu-check\">{{ state?.selectedX === xField.id ? '\u2713' : '' }}</span>\n {{ xField.label }}\n </button>\n </div>\n\n <mat-divider *ngIf=\"config.xFields?.length && config.yFields?.length\" class=\"organizer-champs-divider\"></mat-divider>\n\n <!-- Bloc Y -->\n <div class=\"organizer-champs-block\" *ngIf=\"config.yFields?.length\">\n <span class=\"organizer-champs-block-title\">Y \u2014 Axe vertical</span>\n <ng-container *ngFor=\"let yField of config.yFields\">\n\n <!-- Y simple (Count sans agr\u00E9gat ni stack) -->\n <!-- Y simple (Count ou m\u00E9trique directe) -->\n <button *ngIf=\"!yField.aggregates?.length\"\n type=\"button\" class=\"organizer-submenu-item\"\n [class.active]=\"isYActive(yField.id)\"\n [disabled]=\"yField.disabled\"\n (mousedown)=\"onYFieldSelect(yField.id)\">\n <span class=\"organizer-submenu-check\">{{ isYActive(yField.id) ? '\u2713' : '' }}</span>\n {{ yField.label }}\n </button>\n\n <!-- Y avec agr\u00E9gats \u2192 sous-menu -->\n <button *ngIf=\"yField.aggregates?.length\"\n type=\"button\" class=\"organizer-submenu-item organizer-submenu-item--has-children\"\n [class.active]=\"isYActive(yField.id)\"\n [disabled]=\"yField.disabled\"\n [matMenuTriggerFor]=\"yAggSubMenu\"\n [matMenuTriggerData]=\"{ yField: yField }\"\n (mousedown)=\"$event.stopPropagation()\">\n <span class=\"organizer-submenu-check\">{{ isYActive(yField.id) ? '\u2713' : '' }}</span>\n {{ yField.label }}\n <mat-icon class=\"organizer-submenu-arrow\">chevron_right</mat-icon>\n </button>\n\n </ng-container>\n </div>\n\n </div>\n</mat-menu>\n\n<!-- Sous-menu dynamique : agr\u00E9gats d'un champ Y -->\n<mat-menu #yAggSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <ng-template matMenuContent let-yField=\"yField\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let agg of yField.aggregates\"\n [class.active]=\"isYAggregateActive(yField.id, agg.id)\"\n (mousedown)=\"onYAggregateSelect(yField.id, agg.id)\">\n <span class=\"organizer-submenu-check\">{{ isYAggregateActive(yField.id, agg.id) ? '\u2713' : '' }}</span>\n {{ agg.label }}\n </button>\n </div>\n </ng-template>\n</mat-menu>\n\n<!-- Sous-menu : Champs table (toggle colonnes) -->\n<mat-menu #fieldsSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let field of config.fields\"\n [class.active]=\"isFieldVisible(field.id)\"\n (mousedown)=\"onFieldToggle(field.id, !isFieldVisible(field.id))\">\n <span class=\"organizer-submenu-check\">{{ isFieldVisible(field.id) ? '\u2713' : '' }}</span> <mat-icon *ngIf=\"field.icon\" class=\"organizer-submenu-icon\">{{ field.icon }}</mat-icon> {{ field.label }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Grouper par -->\n<mat-menu #groupsSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let group of config.groups\"\n [class.active]=\"state?.selectedGroupBy === group.id\"\n (mousedown)=\"onGroupBySelect(group.id)\">\n <span class=\"organizer-submenu-check\">{{ state?.selectedGroupBy === group.id ? '\u2713' : '' }}</span> <mat-icon *ngIf=\"group.icon\" class=\"organizer-submenu-icon\">{{ group.icon }}</mat-icon> {{ group.label }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Filtrer par -->\n<mat-menu #slicesSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let slice of config.slices\"\n [class.active]=\"state?.selectedSlices?.includes(slice.id)\"\n (mousedown)=\"onSliceClick(slice.id)\">\n <span class=\"organizer-submenu-check\">{{ state?.selectedSlices?.includes(slice.id) ? '\u2713' : '' }}</span> <mat-icon *ngIf=\"slice.icon\" class=\"organizer-submenu-icon\">{{ slice.icon }}</mat-icon> {{ slice.label }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Template -->\n<mat-menu #templateSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let tmpl of config.templates\"\n [class.active]=\"state?.selectedTemplate === tmpl.id\"\n (mousedown)=\"onTemplateSelect(tmpl.id)\">\n <span class=\"organizer-submenu-check\">{{ state?.selectedTemplate === tmpl.id ? '\u2713' : '' }}</span>\n <mat-icon *ngIf=\"tmpl.icon\" class=\"organizer-submenu-icon\">{{ tmpl.icon }}</mat-icon>\n {{ tmpl.label }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Pr\u00E9f\u00E9rences -->\n<mat-menu #preferencesSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\" (mousedown)=\"onPreferencesEdit()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">edit</mat-icon>\u00C9diter\n </button>\n <button type=\"button\" class=\"organizer-submenu-item\" (mousedown)=\"onPreferencesSave()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">save</mat-icon>Sauvegarder\n </button>\n <button type=\"button\" class=\"organizer-submenu-item\" [disabled]=\"!config.hasSavedPreferences\" (mousedown)=\"onPreferencesClear()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">delete_outline</mat-icon>R\u00E9initialiser\n </button>\n </div>\n</mat-menu>\n\n", styles: [".organizer-btn{display:inline-flex;align-items:center;height:34px;border:1px solid #e0e0e0;border-radius:8px;background:#fff;padding:0 10px;cursor:pointer;box-sizing:border-box}.organizer-btn:hover{border-color:#9e9e9e}.organizer-btn-icon{font-size:16px;width:16px;height:16px;line-height:1;color:#000}.mat-mdc-menu-panel:has(.organizer-menu-label){min-width:170px!important;max-width:320px!important;overflow:visible!important}.mat-mdc-menu-panel:has(.organizer-menu-label) .mat-mdc-menu-content{padding:4px 0!important}.mat-mdc-menu-panel:has(.organizer-menu-label) .organizer-menu-trigger.mat-mdc-menu-item{min-height:42px;padding:0 14px;display:flex;align-items:center;box-sizing:border-box}.mat-mdc-menu-panel:has(.organizer-menu-label) .organizer-menu-trigger.mat-mdc-menu-item .mdc-list-item__primary-text{display:flex;align-items:center;width:100%;overflow:hidden}.organizer-menu-label{font-size:13px;font-weight:500;color:#212121;flex:0 0 auto;white-space:nowrap;padding-right:8px}.organizer-menu-value{font-size:12px;color:#757575;flex:1 1 auto;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:right}.organizer-submenu{padding:4px 6px;min-width:180px;box-sizing:border-box}.organizer-submenu .organizer-submenu-item{display:flex;align-items:center;gap:6px;width:100%;padding:7px 8px;border:none;background:transparent;border-radius:6px;font-size:13px;color:#212121;cursor:pointer;text-align:left;box-sizing:border-box;white-space:nowrap}.organizer-submenu .organizer-submenu-item:hover{background:#f5f5f5}.organizer-submenu .organizer-submenu-item.active{font-weight:600}.organizer-submenu-check{flex-shrink:0;width:16px;text-align:center;font-size:12px;color:#212121}.organizer-submenu-icon{font-size:14px!important;width:14px!important;height:14px!important;color:#212121;margin-right:4px}.organizer-menu-export.mat-mdc-menu-item{min-height:42px;padding:0 14px}.organizer-menu-export-icon{font-size:16px!important;width:16px!important;height:16px!important;color:#424242;margin-right:8px}.organizer-divider{margin:4px 0!important}.organizer-champs-wrapper{padding:4px 6px;min-width:200px;box-sizing:border-box;display:flex;flex-direction:column}.organizer-champs-block{display:flex;flex-direction:column}.organizer-champs-block-title{font-size:10px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:#9e9e9e;padding:6px 2px 2px}.organizer-champs-divider{margin:4px 0!important}.organizer-champs-wrapper .organizer-submenu-item{display:flex;align-items:center;gap:6px;width:100%;padding:7px 8px;border:none;background:transparent;border-radius:6px;font-size:13px;font-family:inherit;color:#212121;cursor:pointer;text-align:left;box-sizing:border-box;white-space:nowrap}.organizer-champs-wrapper .organizer-submenu-item:hover:not([disabled]){background:#f5f5f5}.organizer-champs-wrapper .organizer-submenu-item.active{font-weight:600}.organizer-champs-wrapper .organizer-submenu-item[disabled]{opacity:.38;cursor:default}.organizer-champs-wrapper .organizer-submenu-check{flex-shrink:0;width:16px;text-align:center;font-size:12px;color:#212121}.organizer-champs-wrapper .organizer-submenu-item--has-children{padding-right:8px}.organizer-champs-wrapper .organizer-submenu-arrow{font-size:18px!important;width:18px!important;height:18px!important;color:#00000061;margin-left:auto}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i3.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i3.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i3.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "directive", type: i3.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i4.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
248
|
+
}
|
|
249
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: OrganizerButtonComponent, decorators: [{
|
|
250
|
+
type: Component,
|
|
251
|
+
args: [{ standalone: true, imports: [CommonModule, MatButtonModule, MatIconModule, MatMenuModule, MatDividerModule], selector: 'organizer-button', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<button type=\"button\" class=\"organizer-btn\" [matMenuTriggerFor]=\"viewMenu\" #mainMenuTrigger=\"matMenuTrigger\" [attr.aria-label]=\"'View'\">\n <mat-icon class=\"organizer-btn-icon\">{{ config.buttonIcon || 'settings' }}</mat-icon>\n</button>\n\n<mat-menu #viewMenu=\"matMenu\" panelClass=\"organizer-menu-panel\">\n\n <!-- Champs : mode chart (X + Y) -->\n <button *ngIf=\"hasChartFields()\" mat-menu-item [matMenuTriggerFor]=\"champsSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Champs</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues && (activeXLabel() || activeYLabel())\">\n {{ activeXLabel() }}<ng-container *ngIf=\"activeXLabel() && activeYLabel()\"> / </ng-container>{{ activeYLabel() }}\n </span>\n </button>\n\n <!-- Champs : mode table (toggle colonnes) -->\n <button *ngIf=\"hasTableFields()\" mat-menu-item [matMenuTriggerFor]=\"fieldsSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Champs</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues\">{{ fieldsSummary() }}</span>\n </button>\n\n <!-- Grouper par -->\n <button *ngIf=\"config.groups?.length\" mat-menu-item [matMenuTriggerFor]=\"groupsSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Grouper par</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues && activeGroupByLabel()\">{{ activeGroupByLabel() }}</span>\n </button>\n\n <!-- Filtrer par -->\n <button *ngIf=\"config.slices?.length\" mat-menu-item [matMenuTriggerFor]=\"slicesSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Filtrer par</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues && activeSlicesLabel()\">{{ activeSlicesLabel() }}</span>\n </button>\n\n <!-- Template -->\n <button *ngIf=\"config.templates?.length\" mat-menu-item [matMenuTriggerFor]=\"templateSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Template</span>\n <span class=\"organizer-menu-value\" *ngIf=\"!hideMenuValues && activeTemplateLabel()\">{{ activeTemplateLabel() }}</span>\n </button>\n\n <!-- Export direct (mode table) -->\n <mat-divider *ngIf=\"config.showExport\" class=\"organizer-divider\"></mat-divider>\n <button *ngIf=\"config.showExport && !hasExportSubMenu()\" mat-menu-item type=\"button\" class=\"organizer-menu-export\" (click)=\"onExport()\">\n <mat-icon class=\"organizer-menu-export-icon\">download</mat-icon>\n <span class=\"organizer-menu-label\">Exporter</span>\n </button>\n\n <!-- Export graphique (mode chart) \u2014 ouvre un sous-menu -->\n <button *ngIf=\"config.showExport && hasExportSubMenu()\" mat-menu-item [matMenuTriggerFor]=\"exportSubMenu\" class=\"organizer-menu-trigger organizer-menu-export\">\n <mat-icon class=\"organizer-menu-export-icon\">download</mat-icon>\n <span class=\"organizer-menu-label\">Exporter</span>\n </button>\n\n <!-- Pr\u00E9f\u00E9rences -->\n <mat-divider *ngIf=\"config.showPreferences\" class=\"organizer-divider\"></mat-divider>\n <button *ngIf=\"config.showPreferences\" mat-menu-item [matMenuTriggerFor]=\"preferencesSubMenu\" class=\"organizer-menu-trigger\">\n <span class=\"organizer-menu-label\">Pr\u00E9f\u00E9rences</span>\n </button>\n\n <!-- Switch chart / table -->\n <mat-divider *ngIf=\"hasSwitchView()\" class=\"organizer-divider\"></mat-divider>\n <button *ngIf=\"hasSwitchView()\" mat-menu-item type=\"button\" class=\"organizer-menu-trigger\" (click)=\"onSwitchView()\">\n <mat-icon class=\"organizer-menu-export-icon\">{{ config.switchView?.currentView === 'chart' ? 'table_chart' : 'bar_chart' }}</mat-icon>\n <span class=\"organizer-menu-label\">{{ config.switchView?.currentView === 'chart' ? 'Tableau' : 'Graphique' }}</span>\n </button>\n\n</mat-menu>\n\n<!-- Sous-menu : Export graphique -->\n<mat-menu #exportSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button *ngIf=\"config.onExportVisual\" type=\"button\" class=\"organizer-submenu-item\"\n (mousedown)=\"onExportVisual()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">image</mat-icon>\n Visuel\n </button>\n <button *ngIf=\"config.onExportData\" type=\"button\" class=\"organizer-submenu-item\"\n (mousedown)=\"onExportData()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">table_chart</mat-icon>\n Donn\u00E9es\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Champs chart (X + Y) -->\n<mat-menu #champsSubMenu=\"matMenu\" panelClass=\"organizer-champs-panel\">\n <div class=\"organizer-champs-wrapper\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n\n <!-- Bloc X -->\n <div class=\"organizer-champs-block\" *ngIf=\"config.xFields?.length\">\n <span class=\"organizer-champs-block-title\">X \u2014 Axe horizontal</span>\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let xField of config.xFields\"\n [class.active]=\"state?.selectedX === xField.id\"\n [disabled]=\"xField.disabled\"\n (mousedown)=\"onXFieldSelect(xField.id)\">\n <span class=\"organizer-submenu-check\">{{ state?.selectedX === xField.id ? '\u2713' : '' }}</span>\n {{ xField.label }}\n </button>\n </div>\n\n <mat-divider *ngIf=\"config.xFields?.length && config.yFields?.length\" class=\"organizer-champs-divider\"></mat-divider>\n\n <!-- Bloc Y -->\n <div class=\"organizer-champs-block\" *ngIf=\"config.yFields?.length\">\n <span class=\"organizer-champs-block-title\">Y \u2014 Axe vertical</span>\n <ng-container *ngFor=\"let yField of config.yFields\">\n\n <!-- Y simple (Count sans agr\u00E9gat ni stack) -->\n <!-- Y simple (Count ou m\u00E9trique directe) -->\n <button *ngIf=\"!yField.aggregates?.length\"\n type=\"button\" class=\"organizer-submenu-item\"\n [class.active]=\"isYActive(yField.id)\"\n [disabled]=\"yField.disabled\"\n (mousedown)=\"onYFieldSelect(yField.id)\">\n <span class=\"organizer-submenu-check\">{{ isYActive(yField.id) ? '\u2713' : '' }}</span>\n {{ yField.label }}\n </button>\n\n <!-- Y avec agr\u00E9gats \u2192 sous-menu -->\n <button *ngIf=\"yField.aggregates?.length\"\n type=\"button\" class=\"organizer-submenu-item organizer-submenu-item--has-children\"\n [class.active]=\"isYActive(yField.id)\"\n [disabled]=\"yField.disabled\"\n [matMenuTriggerFor]=\"yAggSubMenu\"\n [matMenuTriggerData]=\"{ yField: yField }\"\n (mousedown)=\"$event.stopPropagation()\">\n <span class=\"organizer-submenu-check\">{{ isYActive(yField.id) ? '\u2713' : '' }}</span>\n {{ yField.label }}\n <mat-icon class=\"organizer-submenu-arrow\">chevron_right</mat-icon>\n </button>\n\n </ng-container>\n </div>\n\n </div>\n</mat-menu>\n\n<!-- Sous-menu dynamique : agr\u00E9gats d'un champ Y -->\n<mat-menu #yAggSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <ng-template matMenuContent let-yField=\"yField\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let agg of yField.aggregates\"\n [class.active]=\"isYAggregateActive(yField.id, agg.id)\"\n (mousedown)=\"onYAggregateSelect(yField.id, agg.id)\">\n <span class=\"organizer-submenu-check\">{{ isYAggregateActive(yField.id, agg.id) ? '\u2713' : '' }}</span>\n {{ agg.label }}\n </button>\n </div>\n </ng-template>\n</mat-menu>\n\n<!-- Sous-menu : Champs table (toggle colonnes) -->\n<mat-menu #fieldsSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let field of config.fields\"\n [class.active]=\"isFieldVisible(field.id)\"\n (mousedown)=\"onFieldToggle(field.id, !isFieldVisible(field.id))\">\n <span class=\"organizer-submenu-check\">{{ isFieldVisible(field.id) ? '\u2713' : '' }}</span> <mat-icon *ngIf=\"field.icon\" class=\"organizer-submenu-icon\">{{ field.icon }}</mat-icon> {{ field.label }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Grouper par -->\n<mat-menu #groupsSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let group of config.groups\"\n [class.active]=\"state?.selectedGroupBy === group.id\"\n (mousedown)=\"onGroupBySelect(group.id)\">\n <span class=\"organizer-submenu-check\">{{ state?.selectedGroupBy === group.id ? '\u2713' : '' }}</span> <mat-icon *ngIf=\"group.icon\" class=\"organizer-submenu-icon\">{{ group.icon }}</mat-icon> {{ group.label }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Filtrer par -->\n<mat-menu #slicesSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let slice of config.slices\"\n [class.active]=\"state?.selectedSlices?.includes(slice.id)\"\n (mousedown)=\"onSliceClick(slice.id)\">\n <span class=\"organizer-submenu-check\">{{ state?.selectedSlices?.includes(slice.id) ? '\u2713' : '' }}</span> <mat-icon *ngIf=\"slice.icon\" class=\"organizer-submenu-icon\">{{ slice.icon }}</mat-icon> {{ slice.label }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Template -->\n<mat-menu #templateSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\"\n *ngFor=\"let tmpl of config.templates\"\n [class.active]=\"state?.selectedTemplate === tmpl.id\"\n (mousedown)=\"onTemplateSelect(tmpl.id)\">\n <span class=\"organizer-submenu-check\">{{ state?.selectedTemplate === tmpl.id ? '\u2713' : '' }}</span>\n <mat-icon *ngIf=\"tmpl.icon\" class=\"organizer-submenu-icon\">{{ tmpl.icon }}</mat-icon>\n {{ tmpl.label }}\n </button>\n </div>\n</mat-menu>\n\n<!-- Sous-menu : Pr\u00E9f\u00E9rences -->\n<mat-menu #preferencesSubMenu=\"matMenu\" panelClass=\"organizer-submenu-panel\">\n <div class=\"organizer-submenu\"\n (mousedown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"organizer-submenu-item\" (mousedown)=\"onPreferencesEdit()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">edit</mat-icon>\u00C9diter\n </button>\n <button type=\"button\" class=\"organizer-submenu-item\" (mousedown)=\"onPreferencesSave()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">save</mat-icon>Sauvegarder\n </button>\n <button type=\"button\" class=\"organizer-submenu-item\" [disabled]=\"!config.hasSavedPreferences\" (mousedown)=\"onPreferencesClear()\">\n <span class=\"organizer-submenu-check\"></span>\n <mat-icon class=\"organizer-submenu-icon\">delete_outline</mat-icon>R\u00E9initialiser\n </button>\n </div>\n</mat-menu>\n\n", styles: [".organizer-btn{display:inline-flex;align-items:center;height:34px;border:1px solid #e0e0e0;border-radius:8px;background:#fff;padding:0 10px;cursor:pointer;box-sizing:border-box}.organizer-btn:hover{border-color:#9e9e9e}.organizer-btn-icon{font-size:16px;width:16px;height:16px;line-height:1;color:#000}.mat-mdc-menu-panel:has(.organizer-menu-label){min-width:170px!important;max-width:320px!important;overflow:visible!important}.mat-mdc-menu-panel:has(.organizer-menu-label) .mat-mdc-menu-content{padding:4px 0!important}.mat-mdc-menu-panel:has(.organizer-menu-label) .organizer-menu-trigger.mat-mdc-menu-item{min-height:42px;padding:0 14px;display:flex;align-items:center;box-sizing:border-box}.mat-mdc-menu-panel:has(.organizer-menu-label) .organizer-menu-trigger.mat-mdc-menu-item .mdc-list-item__primary-text{display:flex;align-items:center;width:100%;overflow:hidden}.organizer-menu-label{font-size:13px;font-weight:500;color:#212121;flex:0 0 auto;white-space:nowrap;padding-right:8px}.organizer-menu-value{font-size:12px;color:#757575;flex:1 1 auto;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:right}.organizer-submenu{padding:4px 6px;min-width:180px;box-sizing:border-box}.organizer-submenu .organizer-submenu-item{display:flex;align-items:center;gap:6px;width:100%;padding:7px 8px;border:none;background:transparent;border-radius:6px;font-size:13px;color:#212121;cursor:pointer;text-align:left;box-sizing:border-box;white-space:nowrap}.organizer-submenu .organizer-submenu-item:hover{background:#f5f5f5}.organizer-submenu .organizer-submenu-item.active{font-weight:600}.organizer-submenu-check{flex-shrink:0;width:16px;text-align:center;font-size:12px;color:#212121}.organizer-submenu-icon{font-size:14px!important;width:14px!important;height:14px!important;color:#212121;margin-right:4px}.organizer-menu-export.mat-mdc-menu-item{min-height:42px;padding:0 14px}.organizer-menu-export-icon{font-size:16px!important;width:16px!important;height:16px!important;color:#424242;margin-right:8px}.organizer-divider{margin:4px 0!important}.organizer-champs-wrapper{padding:4px 6px;min-width:200px;box-sizing:border-box;display:flex;flex-direction:column}.organizer-champs-block{display:flex;flex-direction:column}.organizer-champs-block-title{font-size:10px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:#9e9e9e;padding:6px 2px 2px}.organizer-champs-divider{margin:4px 0!important}.organizer-champs-wrapper .organizer-submenu-item{display:flex;align-items:center;gap:6px;width:100%;padding:7px 8px;border:none;background:transparent;border-radius:6px;font-size:13px;font-family:inherit;color:#212121;cursor:pointer;text-align:left;box-sizing:border-box;white-space:nowrap}.organizer-champs-wrapper .organizer-submenu-item:hover:not([disabled]){background:#f5f5f5}.organizer-champs-wrapper .organizer-submenu-item.active{font-weight:600}.organizer-champs-wrapper .organizer-submenu-item[disabled]{opacity:.38;cursor:default}.organizer-champs-wrapper .organizer-submenu-check{flex-shrink:0;width:16px;text-align:center;font-size:12px;color:#212121}.organizer-champs-wrapper .organizer-submenu-item--has-children{padding-right:8px}.organizer-champs-wrapper .organizer-submenu-arrow{font-size:18px!important;width:18px!important;height:18px!important;color:#00000061;margin-left:auto}\n"] }]
|
|
252
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { config: [{
|
|
253
|
+
type: Input
|
|
254
|
+
}], state: [{
|
|
255
|
+
type: Input
|
|
256
|
+
}], hideMenuValues: [{
|
|
257
|
+
type: Input
|
|
258
|
+
}], viewChange: [{
|
|
259
|
+
type: Output
|
|
260
|
+
}], sliceStateChange: [{
|
|
261
|
+
type: Output
|
|
262
|
+
}], mainMenuTrigger: [{
|
|
263
|
+
type: ViewChild,
|
|
264
|
+
args: ['mainMenuTrigger']
|
|
265
|
+
}] } });
|
|
266
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pemVyLWJ1dHRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmV0ZW1lL2pxdWVyeS1vcmdhbml6ZXIvc3JjL2xpYi9vcmdhbml6ZXItYnV0dG9uL29yZ2FuaXplci1idXR0b24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25ldGVtZS9qcXVlcnktb3JnYW5pemVyL3NyYy9saWIvb3JnYW5pemVyLWJ1dHRvbi9vcmdhbml6ZXItYnV0dG9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQVUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQWEsU0FBUyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BLLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7QUFhM0MsTUFBTSxPQUFPLHdCQUF3QjtJQWNuQyxZQUFvQixHQUFzQjtRQUF0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQVhqQyxtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUN0QixlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQXdCLENBQUM7UUFD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YixpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNO3dHQUd0QyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0ksVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBT3VCLGVBQWU7c0JBQTVDLFNBQVM7dUJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBPbkRlc3Ryb3ksIFZpZXdDaGlsZCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0TWVudU1vZHVsZSwgTWF0TWVudVRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcbmltcG9ydCB7IE1hdERpdmlkZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaXZpZGVyJztcbmltcG9ydCB7IFN1YmplY3QsIGlzT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBPcmdhbml6ZXJDb25maWcsIE9yZ2FuaXplckJ1dHRvbkV2ZW50LCBPcmdhbml6ZXJTbGljZVN0YXRlLCBPcmdhbml6ZXJTdGF0ZSB9IGZyb20gJy4uL21vZGVscyc7XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbIENvbW1vbk1vZHVsZSwgTWF0QnV0dG9uTW9kdWxlLCBNYXRJY29uTW9kdWxlLCBNYXRNZW51TW9kdWxlLCBNYXREaXZpZGVyTW9kdWxlIF0sXG4gIHNlbGVjdG9yOiAnb3JnYW5pemVyLWJ1dHRvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9vcmdhbml6ZXItYnV0dG9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vb3JnYW5pemVyLWJ1dHRvbi5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBPcmdhbml6ZXJCdXR0b25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGNvbmZpZyE6IE9yZ2FuaXplckNvbmZpZztcbiAgQElucHV0KCkgc3RhdGU/OiBPcmdhbml6ZXJTdGF0ZTtcbiAgQElucHV0KCkgaGlkZU1lbnVWYWx1ZXMgPSBmYWxzZTtcbiAgQE91dHB1dCgpIHZpZXdDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE9yZ2FuaXplckJ1dHRvbkV2ZW50PigpO1xuICBAT3V0cHV0KCkgc2xpY2VTdGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8T3JnYW5pemVyU2xpY2VTdGF0ZSB8IG51bGw+KCk7XG5cbiAgbG9hZGluZ0ZpZWxkSWQ/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBmaWVsZERhdGFDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBhbnlbXT4oKTtcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgQFZpZXdDaGlsZCgnbWFpbk1lbnVUcmlnZ2VyJykgbWFpbk1lbnVUcmlnZ2VyPzogTWF0TWVudVRyaWdnZXI7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge31cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBpc0ZpZWxkVmlzaWJsZShmaWVsZElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCB2aXNpYmxlID0gdGhpcy5zdGF0ZT8udmlzaWJsZUZpZWxkcztcbiAgICBpZiAoIXZpc2libGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5maWVsZHM/LmZpbmQoZiA9PiBmLmlkID09PSBmaWVsZElkKT8udmlzaWJsZSAhPT0gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB2aXNpYmxlLmluY2x1ZGVzKGZpZWxkSWQpO1xuICB9XG5cbiAgZmllbGRzU3VtbWFyeSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRvdGFsID0gdGhpcy5jb25maWcuZmllbGRzPy5sZW5ndGggPz8gMDtcbiAgICBjb25zdCB2aXNpYmxlID0gdGhpcy5zdGF0ZT8udmlzaWJsZUZpZWxkcz8ubGVuZ3RoID8/IHRvdGFsO1xuICAgIHJldHVybiBgJHt2aXNpYmxlfS8ke3RvdGFsfWA7XG4gIH1cblxuICBvbkZpZWxkVG9nZ2xlKGZpZWxkSWQ6IHN0cmluZywgdmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IHZpc2libGVGaWVsZHMgPSB0aGlzLnN0YXRlPy52aXNpYmxlRmllbGRzIHx8IFtdO1xuICAgIGNvbnN0IHVwZGF0ZWQgPSB2aXNpYmxlXG4gICAgICA/IFsuLi52aXNpYmxlRmllbGRzLCBmaWVsZElkXVxuICAgICAgOiB2aXNpYmxlRmllbGRzLmZpbHRlcihmID0+IGYgIT09IGZpZWxkSWQpO1xuICAgIHRoaXMuZW1pdENoYW5nZSgnZmllbGRUb2dnbGVkJywgeyB2aXNpYmxlRmllbGRzOiB1cGRhdGVkIH0pO1xuICB9XG5cbiAgb25YRmllbGRTZWxlY3QoZmllbGRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5lbWl0Q2hhbmdlKCd4U2VsZWN0ZWQnLCB7IHNlbGVjdGVkWDogZmllbGRJZCB9KTtcbiAgfVxuXG4gIG9uWUZpZWxkU2VsZWN0KGZpZWxkSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZW1pdENoYW5nZSgneVNlbGVjdGVkJywge1xuICAgICAgc2VsZWN0ZWRZOiBmaWVsZElkLFxuICAgICAgc2VsZWN0ZWRZQWdncmVnYXRlOiB1bmRlZmluZWRcbiAgICB9KTtcbiAgfVxuXG4gIG9uWUFnZ3JlZ2F0ZVNlbGVjdCh5RmllbGRJZDogc3RyaW5nLCBhZ2dyZWdhdGVJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5lbWl0Q2hhbmdlKCd5U2VsZWN0ZWQnLCB7XG4gICAgICBzZWxlY3RlZFk6IHlGaWVsZElkLFxuICAgICAgc2VsZWN0ZWRZQWdncmVnYXRlOiBhZ2dyZWdhdGVJZFxuICAgIH0pO1xuICB9XG5cbiAgb25Hcm91cEJ5U2VsZWN0KGdyb3VwSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnN0YXRlLnNlbGVjdGVkR3JvdXBCeTtcbiAgICB0aGlzLmVtaXRDaGFuZ2UoJ2dyb3VwQnlTZWxlY3RlZCcsIHsgc2VsZWN0ZWRHcm91cEJ5OiBjdXJyZW50ID09PSBncm91cElkID8gdW5kZWZpbmVkIDogZ3JvdXBJZCB9KTtcbiAgfVxuXG4gIG9uVGVtcGxhdGVTZWxlY3QodGVtcGxhdGVJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgdCA9IHRoaXMuY29uZmlnLnRlbXBsYXRlcz8uZmluZCh0bXBsID0+IHRtcGwuaWQgPT09IHRlbXBsYXRlSWQpO1xuICAgIGlmICghdCkgcmV0dXJuO1xuICAgIHRoaXMuZW1pdENoYW5nZSgndGVtcGxhdGVTZWxlY3RlZCcsIHtcbiAgICAgIHNlbGVjdGVkVGVtcGxhdGU6IHRlbXBsYXRlSWQsXG4gICAgICBzZWxlY3RlZFg6IHQueEZpZWxkLFxuICAgICAgc2VsZWN0ZWRZOiB0LnlGaWVsZCxcbiAgICAgIHNlbGVjdGVkWUFnZ3JlZ2F0ZTogdC55QWdncmVnYXRlLFxuICAgICAgc2VsZWN0ZWRHcm91cEJ5OiB0Lmdyb3VwQnlcbiAgICB9KTtcbiAgfVxuXG4gIG9uU2xpY2VDbGljayhzbGljZUlkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29uZmlnLm9uU2xpY2VDbGljaykge1xuICAgICAgdGhpcy5jb25maWcub25TbGljZUNsaWNrKCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRTbGljZXMgPSB0aGlzLnN0YXRlPy5zZWxlY3RlZFNsaWNlcyB8fCBbXTtcbiAgICBsZXQgdXBkYXRlZDogc3RyaW5nW107XG4gICAgaWYgKHNsaWNlSWQpIHtcbiAgICAgIHVwZGF0ZWQgPSBzZWxlY3RlZFNsaWNlcy5pbmNsdWRlcyhzbGljZUlkKSA/IFtdIDogW3NsaWNlSWRdO1xuICAgIH0gZWxzZSB7XG4gICAgICB1cGRhdGVkID0gc2VsZWN0ZWRTbGljZXM7XG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZWQubGVuZ3RoID09PSAwIHx8ICFzbGljZUlkIHx8ICF0aGlzLmNvbmZpZy5vbkZldGNoU2xpY2VEYXRhKSB7XG4gICAgICBpZiAodGhpcy5jb25maWcub25GZXRjaFNsaWNlRGF0YSkge1xuICAgICAgICB0aGlzLnNsaWNlU3RhdGVDaGFuZ2UuZW1pdChudWxsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZW1pdENoYW5nZSgnc2xpY2VTZWxlY3RlZCcsIHsgc2VsZWN0ZWRTbGljZXM6IHVwZGF0ZWQgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2xpY2UgPSB0aGlzLmNvbmZpZy5zbGljZXM/LmZpbmQocyA9PiBzLmlkID09PSBzbGljZUlkKTtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNvbmZpZy5vbkZldGNoU2xpY2VEYXRhKHNsaWNlSWQpO1xuICAgIGNvbnN0IGhhbmRsZURhdGEgPSAodGFza3M6IGFueVtdKSA9PiB7XG4gICAgICB0aGlzLnNsaWNlU3RhdGVDaGFuZ2UuZW1pdCh7XG4gICAgICAgIHNsaWNlQ29uZmlnczogW3sgdGl0bGU6IHNsaWNlPy5sYWJlbCA/PyBzbGljZUlkLCBjb2x1bW5LZXk6IHNsaWNlSWQgfV0sXG4gICAgICAgIHRhc2tzXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZW1pdENoYW5nZSgnc2xpY2VTZWxlY3RlZCcsIHsgc2VsZWN0ZWRTbGljZXM6IHVwZGF0ZWQgfSk7XG4gICAgfTtcbiAgICBpZiAoaXNPYnNlcnZhYmxlKHJlc3VsdCkpIHtcbiAgICAgIHJlc3VsdC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHsgbmV4dDogaGFuZGxlRGF0YSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnRoZW4oaGFuZGxlRGF0YSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbG9hZEZpZWxkRGF0YShmaWVsZElkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5maWVsZERhdGFDYWNoZS5oYXMoZmllbGRJZCkpIHJldHVybjtcbiAgICBpZiAoIXRoaXMuY29uZmlnLm9uRmV0Y2hGaWVsZERhdGEpIHJldHVybjtcblxuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5jb25maWcuZmllbGRzPy5maW5kKGYgPT4gZi5pZCA9PT0gZmllbGRJZCk7XG4gICAgaWYgKCFmaWVsZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5sb2FkaW5nRmllbGRJZCA9IGZpZWxkSWQ7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuY29uZmlnLm9uRmV0Y2hGaWVsZERhdGEoZmllbGRJZCk7XG4gICAgICB0aGlzLmZpZWxkRGF0YUNhY2hlLnNldChmaWVsZElkLCBkYXRhKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5sb2FkaW5nRmllbGRJZCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIG9uRXhwb3J0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbmZpZy5vbkV4cG9ydCkgdGhpcy5jb25maWcub25FeHBvcnQoKTtcbiAgICB0aGlzLm1haW5NZW51VHJpZ2dlcj8uY2xvc2VNZW51KCk7XG4gIH1cblxuICBvbkV4cG9ydFZpc3VhbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb25maWcub25FeHBvcnRWaXN1YWwpIHRoaXMuY29uZmlnLm9uRXhwb3J0VmlzdWFsKCk7XG4gICAgdGhpcy5tYWluTWVudVRyaWdnZXI/LmNsb3NlTWVudSgpO1xuICB9XG5cbiAgb25FeHBvcnREYXRhKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbmZpZy5vbkV4cG9ydERhdGEpIHRoaXMuY29uZmlnLm9uRXhwb3J0RGF0YSgpO1xuICAgIHRoaXMubWFpbk1lbnVUcmlnZ2VyPy5jbG9zZU1lbnUoKTtcbiAgfVxuXG4gIGhhc0V4cG9ydFN1Yk1lbnUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMuY29uZmlnLm9uRXhwb3J0VmlzdWFsIHx8IHRoaXMuY29uZmlnLm9uRXhwb3J0RGF0YSk7XG4gIH1cblxuICBoYXNTd2l0Y2hWaWV3KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuY29uZmlnLnN3aXRjaFZpZXc7XG4gIH1cblxuICBvblN3aXRjaFZpZXcoKTogdm9pZCB7XG4gICAgY29uc3Qgc3YgPSB0aGlzLmNvbmZpZy5zd2l0Y2hWaWV3O1xuICAgIGlmICghc3YpIHJldHVybjtcbiAgICBjb25zdCBuZXdWaWV3OiAnY2hhcnQnIHwgJ3RhYmxlJyA9IHN2LmN1cnJlbnRWaWV3ID09PSAnY2hhcnQnID8gJ3RhYmxlJyA6ICdjaGFydCc7XG4gICAgc3Yub25Td2l0Y2gobmV3Vmlldyk7XG4gICAgdGhpcy5lbWl0Q2hhbmdlKCd2aWV3U3dpdGNoZWQnLCB7IHZpZXdNb2RlOiBuZXdWaWV3IH0pO1xuICAgIHRoaXMubWFpbk1lbnVUcmlnZ2VyPy5jbG9zZU1lbnUoKTtcbiAgfVxuXG4gIG9uUHJlZmVyZW5jZXNFZGl0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbmZpZy5vblByZWZlcmVuY2VzRWRpdCkgdGhpcy5jb25maWcub25QcmVmZXJlbmNlc0VkaXQoKTtcbiAgICB0aGlzLm1haW5NZW51VHJpZ2dlcj8uY2xvc2VNZW51KCk7XG4gIH1cblxuICBvblByZWZlcmVuY2VzU2F2ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb25maWcub25QcmVmZXJlbmNlc1NhdmUpIHRoaXMuY29uZmlnLm9uUHJlZmVyZW5jZXNTYXZlKCk7XG4gICAgdGhpcy5tYWluTWVudVRyaWdnZXI/LmNsb3NlTWVudSgpO1xuICB9XG5cbiAgb25QcmVmZXJlbmNlc0NsZWFyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbmZpZy5vblByZWZlcmVuY2VzQ2xlYXIpIHRoaXMuY29uZmlnLm9uUHJlZmVyZW5jZXNDbGVhcigpO1xuICAgIHRoaXMubWFpbk1lbnVUcmlnZ2VyPy5jbG9zZU1lbnUoKTtcbiAgfVxuXG4gIG9uUmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5lbWl0Q2hhbmdlKCdyZXNldCcsIHtcbiAgICAgIHZpc2libGVGaWVsZHM6IFtdLFxuICAgICAgc2VsZWN0ZWRYOiB1bmRlZmluZWQsXG4gICAgICBzZWxlY3RlZFk6IHVuZGVmaW5lZCxcbiAgICAgIHNlbGVjdGVkWUFnZ3JlZ2F0ZTogdW5kZWZpbmVkLFxuICAgICAgc2VsZWN0ZWRHcm91cEJ5OiB1bmRlZmluZWQsXG4gICAgICBzZWxlY3RlZFNsaWNlczogW11cbiAgICB9KTtcbiAgfVxuXG4gIGFjdGl2ZVhMYWJlbCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGlkID0gdGhpcy5zdGF0ZT8uc2VsZWN0ZWRYO1xuICAgIGlmICghaWQpIHJldHVybiAnJztcbiAgICByZXR1cm4gdGhpcy5jb25maWcueEZpZWxkcz8uZmluZChmID0+IGYuaWQgPT09IGlkKT8ubGFiZWwgPz8gaWQ7XG4gIH1cblxuICBhY3RpdmVZTGFiZWwoKTogc3RyaW5nIHtcbiAgICBjb25zdCB5SWQgPSB0aGlzLnN0YXRlPy5zZWxlY3RlZFk7XG4gICAgaWYgKCF5SWQpIHJldHVybiAnJztcbiAgICBjb25zdCB5RmllbGQgPSB0aGlzLmNvbmZpZy55RmllbGRzPy5maW5kKGYgPT4gZi5pZCA9PT0geUlkKTtcbiAgICBjb25zdCBiYXNlID0geUZpZWxkPy5sYWJlbCA/PyB5SWQ7XG5cbiAgICBpZiAodGhpcy5zdGF0ZT8uc2VsZWN0ZWRZQWdncmVnYXRlKSB7XG4gICAgICBjb25zdCBhZ2cgPSB5RmllbGQ/LmFnZ3JlZ2F0ZXM/LmZpbmQoYSA9PiBhLmlkID09PSB0aGlzLnN0YXRlIS5zZWxlY3RlZFlBZ2dyZWdhdGUpO1xuICAgICAgcmV0dXJuIGFnZyA/IGAke2Jhc2V9IMK3ICR7YWdnLmxhYmVsfWAgOiBiYXNlO1xuICAgIH1cbiAgICByZXR1cm4gYmFzZTtcbiAgfVxuXG4gIGFjdGl2ZUdyb3VwQnlMYWJlbCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGlkID0gdGhpcy5zdGF0ZT8uc2VsZWN0ZWRHcm91cEJ5O1xuICAgIGlmICghaWQpIHJldHVybiAnJztcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZ3JvdXBzPy5maW5kKGcgPT4gZy5pZCA9PT0gaWQpPy5sYWJlbCA/PyBpZDtcbiAgfVxuXG4gIGFjdGl2ZVNsaWNlc0xhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgaWRzID0gdGhpcy5zdGF0ZT8uc2VsZWN0ZWRTbGljZXM7XG4gICAgaWYgKCFpZHM/Lmxlbmd0aCkgcmV0dXJuICcnO1xuICAgIGlmIChpZHMubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb25maWcuc2xpY2VzPy5maW5kKHMgPT4gcy5pZCA9PT0gaWRzWzBdKT8ubGFiZWwgPz8gaWRzWzBdO1xuICAgIH1cbiAgICByZXR1cm4gYCR7aWRzLmxlbmd0aH0gc8OpbGVjdGlvbm7DqXNgO1xuICB9XG5cbiAgYWN0aXZlVGVtcGxhdGVMYWJlbCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGlkID0gdGhpcy5zdGF0ZT8uc2VsZWN0ZWRUZW1wbGF0ZTtcbiAgICBpZiAoIWlkKSByZXR1cm4gJyc7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnRlbXBsYXRlcz8uZmluZCh0ID0+IHQuaWQgPT09IGlkKT8ubGFiZWwgPz8gaWQ7XG4gIH1cblxuICBoYXNDaGFydEZpZWxkcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMuY29uZmlnLnhGaWVsZHM/Lmxlbmd0aCA/PyAwKSA+IDAgfHwgKHRoaXMuY29uZmlnLnlGaWVsZHM/Lmxlbmd0aCA/PyAwKSA+IDA7XG4gIH1cblxuICBoYXNUYWJsZUZpZWxkcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMuY29uZmlnLmZpZWxkcz8ubGVuZ3RoID8/IDApID4gMDtcbiAgfVxuXG4gIGlzWUFjdGl2ZSh5RmllbGRJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGU/LnNlbGVjdGVkWSA9PT0geUZpZWxkSWQ7XG4gIH1cblxuICBpc1lBZ2dyZWdhdGVBY3RpdmUoeUZpZWxkSWQ6IHN0cmluZywgYWdncmVnYXRlSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN0YXRlPy5zZWxlY3RlZFkgPT09IHlGaWVsZElkICYmIHRoaXMuc3RhdGU/LnNlbGVjdGVkWUFnZ3JlZ2F0ZSA9PT0gYWdncmVnYXRlSWQ7XG4gIH1cblxuICBwcml2YXRlIGVtaXRDaGFuZ2UodHlwZTogT3JnYW5pemVyQnV0dG9uRXZlbnRbJ3R5cGUnXSwgc3RhdGVVcGRhdGU6IFBhcnRpYWw8T3JnYW5pemVyU3RhdGU+KTogdm9pZCB7XG4gICAgY29uc3QgZXZlbnQ6IE9yZ2FuaXplckJ1dHRvbkV2ZW50ID0ge1xuICAgICAgdHlwZSxcbiAgICAgIHN0YXRlOiB7IC4uLnRoaXMuc3RhdGUsIC4uLnN0YXRlVXBkYXRlIH0sXG4gICAgICBzb3VyY2U6ICd1c2VyJ1xuICAgIH07XG4gICAgdGhpcy52aWV3Q2hhbmdlLmVtaXQoZXZlbnQpO1xuICB9XG59XG4iLCI8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9yZ2FuaXplci1idG5cIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwidmlld01lbnVcIiAjbWFpbk1lbnVUcmlnZ2VyPVwibWF0TWVudVRyaWdnZXJcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIidWaWV3J1wiPlxuICA8bWF0LWljb24gY2xhc3M9XCJvcmdhbml6ZXItYnRuLWljb25cIj57eyBjb25maWcuYnV0dG9uSWNvbiB8fCAnc2V0dGluZ3MnIH19PC9tYXQtaWNvbj5cbjwvYnV0dG9uPlxuXG48bWF0LW1lbnUgI3ZpZXdNZW51PVwibWF0TWVudVwiIHBhbmVsQ2xhc3M9XCJvcmdhbml6ZXItbWVudS1wYW5lbFwiPlxuXG4gIDwhLS0gQ2hhbXBzIDogbW9kZSBjaGFydCAoWCArIFkpIC0tPlxuICA8YnV0dG9uICpuZ0lmPVwiaGFzQ2hhcnRGaWVsZHMoKVwiIG1hdC1tZW51LWl0ZW0gW21hdE1lbnVUcmlnZ2VyRm9yXT1cImNoYW1wc1N1Yk1lbnVcIiBjbGFzcz1cIm9yZ2FuaXplci1tZW51LXRyaWdnZXJcIj5cbiAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1tZW51LWxhYmVsXCI+Q2hhbXBzPC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLW1lbnUtdmFsdWVcIiAqbmdJZj1cIiFoaWRlTWVudVZhbHVlcyAmJiAoYWN0aXZlWExhYmVsKCkgfHwgYWN0aXZlWUxhYmVsKCkpXCI+XG4gICAgICB7eyBhY3RpdmVYTGFiZWwoKSB9fTxuZy1jb250YWluZXIgKm5nSWY9XCJhY3RpdmVYTGFiZWwoKSAmJiBhY3RpdmVZTGFiZWwoKVwiPiAvIDwvbmctY29udGFpbmVyPnt7IGFjdGl2ZVlMYWJlbCgpIH19XG4gICAgPC9zcGFuPlxuICA8L2J1dHRvbj5cblxuICA8IS0tIENoYW1wcyA6IG1vZGUgdGFibGUgKHRvZ2dsZSBjb2xvbm5lcykgLS0+XG4gIDxidXR0b24gKm5nSWY9XCJoYXNUYWJsZUZpZWxkcygpXCIgbWF0LW1lbnUtaXRlbSBbbWF0TWVudVRyaWdnZXJGb3JdPVwiZmllbGRzU3ViTWVudVwiIGNsYXNzPVwib3JnYW5pemVyLW1lbnUtdHJpZ2dlclwiPlxuICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLW1lbnUtbGFiZWxcIj5DaGFtcHM8L3NwYW4+XG4gICAgPHNwYW4gY2xhc3M9XCJvcmdhbml6ZXItbWVudS12YWx1ZVwiICpuZ0lmPVwiIWhpZGVNZW51VmFsdWVzXCI+e3sgZmllbGRzU3VtbWFyeSgpIH19PC9zcGFuPlxuICA8L2J1dHRvbj5cblxuICA8IS0tIEdyb3VwZXIgcGFyIC0tPlxuICA8YnV0dG9uICpuZ0lmPVwiY29uZmlnLmdyb3Vwcz8ubGVuZ3RoXCIgbWF0LW1lbnUtaXRlbSBbbWF0TWVudVRyaWdnZXJGb3JdPVwiZ3JvdXBzU3ViTWVudVwiIGNsYXNzPVwib3JnYW5pemVyLW1lbnUtdHJpZ2dlclwiPlxuICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLW1lbnUtbGFiZWxcIj5Hcm91cGVyIHBhcjwvc3Bhbj5cbiAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1tZW51LXZhbHVlXCIgKm5nSWY9XCIhaGlkZU1lbnVWYWx1ZXMgJiYgYWN0aXZlR3JvdXBCeUxhYmVsKClcIj57eyBhY3RpdmVHcm91cEJ5TGFiZWwoKSB9fTwvc3Bhbj5cbiAgPC9idXR0b24+XG5cbiAgPCEtLSBGaWx0cmVyIHBhciAtLT5cbiAgPGJ1dHRvbiAqbmdJZj1cImNvbmZpZy5zbGljZXM/Lmxlbmd0aFwiIG1hdC1tZW51LWl0ZW0gW21hdE1lbnVUcmlnZ2VyRm9yXT1cInNsaWNlc1N1Yk1lbnVcIiBjbGFzcz1cIm9yZ2FuaXplci1tZW51LXRyaWdnZXJcIj5cbiAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1tZW51LWxhYmVsXCI+RmlsdHJlciBwYXI8L3NwYW4+XG4gICAgPHNwYW4gY2xhc3M9XCJvcmdhbml6ZXItbWVudS12YWx1ZVwiICpuZ0lmPVwiIWhpZGVNZW51VmFsdWVzICYmIGFjdGl2ZVNsaWNlc0xhYmVsKClcIj57eyBhY3RpdmVTbGljZXNMYWJlbCgpIH19PC9zcGFuPlxuICA8L2J1dHRvbj5cblxuICA8IS0tIFRlbXBsYXRlIC0tPlxuICA8YnV0dG9uICpuZ0lmPVwiY29uZmlnLnRlbXBsYXRlcz8ubGVuZ3RoXCIgbWF0LW1lbnUtaXRlbSBbbWF0TWVudVRyaWdnZXJGb3JdPVwidGVtcGxhdGVTdWJNZW51XCIgY2xhc3M9XCJvcmdhbml6ZXItbWVudS10cmlnZ2VyXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJvcmdhbml6ZXItbWVudS1sYWJlbFwiPlRlbXBsYXRlPC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLW1lbnUtdmFsdWVcIiAqbmdJZj1cIiFoaWRlTWVudVZhbHVlcyAmJiBhY3RpdmVUZW1wbGF0ZUxhYmVsKClcIj57eyBhY3RpdmVUZW1wbGF0ZUxhYmVsKCkgfX08L3NwYW4+XG4gIDwvYnV0dG9uPlxuXG4gIDwhLS0gRXhwb3J0IGRpcmVjdCAobW9kZSB0YWJsZSkgLS0+XG4gIDxtYXQtZGl2aWRlciAqbmdJZj1cImNvbmZpZy5zaG93RXhwb3J0XCIgY2xhc3M9XCJvcmdhbml6ZXItZGl2aWRlclwiPjwvbWF0LWRpdmlkZXI+XG4gIDxidXR0b24gKm5nSWY9XCJjb25maWcuc2hvd0V4cG9ydCAmJiAhaGFzRXhwb3J0U3ViTWVudSgpXCIgbWF0LW1lbnUtaXRlbSB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJvcmdhbml6ZXItbWVudS1leHBvcnRcIiAoY2xpY2spPVwib25FeHBvcnQoKVwiPlxuICAgIDxtYXQtaWNvbiBjbGFzcz1cIm9yZ2FuaXplci1tZW51LWV4cG9ydC1pY29uXCI+ZG93bmxvYWQ8L21hdC1pY29uPlxuICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLW1lbnUtbGFiZWxcIj5FeHBvcnRlcjwvc3Bhbj5cbiAgPC9idXR0b24+XG5cbiAgPCEtLSBFeHBvcnQgZ3JhcGhpcXVlIChtb2RlIGNoYXJ0KSDigJQgb3V2cmUgdW4gc291cy1tZW51IC0tPlxuICA8YnV0dG9uICpuZ0lmPVwiY29uZmlnLnNob3dFeHBvcnQgJiYgaGFzRXhwb3J0U3ViTWVudSgpXCIgbWF0LW1lbnUtaXRlbSBbbWF0TWVudVRyaWdnZXJGb3JdPVwiZXhwb3J0U3ViTWVudVwiIGNsYXNzPVwib3JnYW5pemVyLW1lbnUtdHJpZ2dlciBvcmdhbml6ZXItbWVudS1leHBvcnRcIj5cbiAgICA8bWF0LWljb24gY2xhc3M9XCJvcmdhbml6ZXItbWVudS1leHBvcnQtaWNvblwiPmRvd25sb2FkPC9tYXQtaWNvbj5cbiAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1tZW51LWxhYmVsXCI+RXhwb3J0ZXI8L3NwYW4+XG4gIDwvYnV0dG9uPlxuXG4gIDwhLS0gUHLDqWbDqXJlbmNlcyAtLT5cbiAgPG1hdC1kaXZpZGVyICpuZ0lmPVwiY29uZmlnLnNob3dQcmVmZXJlbmNlc1wiIGNsYXNzPVwib3JnYW5pemVyLWRpdmlkZXJcIj48L21hdC1kaXZpZGVyPlxuICA8YnV0dG9uICpuZ0lmPVwiY29uZmlnLnNob3dQcmVmZXJlbmNlc1wiIG1hdC1tZW51LWl0ZW0gW21hdE1lbnVUcmlnZ2VyRm9yXT1cInByZWZlcmVuY2VzU3ViTWVudVwiIGNsYXNzPVwib3JnYW5pemVyLW1lbnUtdHJpZ2dlclwiPlxuICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLW1lbnUtbGFiZWxcIj5QcsOpZsOpcmVuY2VzPC9zcGFuPlxuICA8L2J1dHRvbj5cblxuICA8IS0tIFN3aXRjaCBjaGFydCAvIHRhYmxlIC0tPlxuICA8bWF0LWRpdmlkZXIgKm5nSWY9XCJoYXNTd2l0Y2hWaWV3KClcIiBjbGFzcz1cIm9yZ2FuaXplci1kaXZpZGVyXCI+PC9tYXQtZGl2aWRlcj5cbiAgPGJ1dHRvbiAqbmdJZj1cImhhc1N3aXRjaFZpZXcoKVwiIG1hdC1tZW51LWl0ZW0gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3JnYW5pemVyLW1lbnUtdHJpZ2dlclwiIChjbGljayk9XCJvblN3aXRjaFZpZXcoKVwiPlxuICAgIDxtYXQtaWNvbiBjbGFzcz1cIm9yZ2FuaXplci1tZW51LWV4cG9ydC1pY29uXCI+e3sgY29uZmlnLnN3aXRjaFZpZXc/LmN1cnJlbnRWaWV3ID09PSAnY2hhcnQnID8gJ3RhYmxlX2NoYXJ0JyA6ICdiYXJfY2hhcnQnIH19PC9tYXQtaWNvbj5cbiAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1tZW51LWxhYmVsXCI+e3sgY29uZmlnLnN3aXRjaFZpZXc/LmN1cnJlbnRWaWV3ID09PSAnY2hhcnQnID8gJ1RhYmxlYXUnIDogJ0dyYXBoaXF1ZScgfX08L3NwYW4+XG4gIDwvYnV0dG9uPlxuXG48L21hdC1tZW51PlxuXG48IS0tIFNvdXMtbWVudSA6IEV4cG9ydCBncmFwaGlxdWUgLS0+XG48bWF0LW1lbnUgI2V4cG9ydFN1Yk1lbnU9XCJtYXRNZW51XCIgcGFuZWxDbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LXBhbmVsXCI+XG4gIDxkaXYgY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudVwiXG4gICAgICAgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgIDxidXR0b24gKm5nSWY9XCJjb25maWcub25FeHBvcnRWaXN1YWxcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1pdGVtXCJcbiAgICAgIChtb3VzZWRvd24pPVwib25FeHBvcnRWaXN1YWwoKVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1jaGVja1wiPjwvc3Bhbj5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWljb25cIj5pbWFnZTwvbWF0LWljb24+XG4gICAgICBWaXN1ZWxcbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uICpuZ0lmPVwiY29uZmlnLm9uRXhwb3J0RGF0YVwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWl0ZW1cIlxuICAgICAgKG1vdXNlZG93bik9XCJvbkV4cG9ydERhdGEoKVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1jaGVja1wiPjwvc3Bhbj5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWljb25cIj50YWJsZV9jaGFydDwvbWF0LWljb24+XG4gICAgICBEb25uw6llc1xuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvbWF0LW1lbnU+XG5cbjwhLS0gU291cy1tZW51IDogQ2hhbXBzIGNoYXJ0IChYICsgWSkgLS0+XG48bWF0LW1lbnUgI2NoYW1wc1N1Yk1lbnU9XCJtYXRNZW51XCIgcGFuZWxDbGFzcz1cIm9yZ2FuaXplci1jaGFtcHMtcGFuZWxcIj5cbiAgPGRpdiBjbGFzcz1cIm9yZ2FuaXplci1jaGFtcHMtd3JhcHBlclwiXG4gICAgICAgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuXG4gICAgPCEtLSBCbG9jIFggLS0+XG4gICAgPGRpdiBjbGFzcz1cIm9yZ2FuaXplci1jaGFtcHMtYmxvY2tcIiAqbmdJZj1cImNvbmZpZy54RmllbGRzPy5sZW5ndGhcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLWNoYW1wcy1ibG9jay10aXRsZVwiPlgg4oCUIEF4ZSBob3Jpem9udGFsPC9zcGFuPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1pdGVtXCJcbiAgICAgICAgKm5nRm9yPVwibGV0IHhGaWVsZCBvZiBjb25maWcueEZpZWxkc1wiXG4gICAgICAgIFtjbGFzcy5hY3RpdmVdPVwic3RhdGU/LnNlbGVjdGVkWCA9PT0geEZpZWxkLmlkXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cInhGaWVsZC5kaXNhYmxlZFwiXG4gICAgICAgIChtb3VzZWRvd24pPVwib25YRmllbGRTZWxlY3QoeEZpZWxkLmlkKVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWNoZWNrXCI+e3sgc3RhdGU/LnNlbGVjdGVkWCA9PT0geEZpZWxkLmlkID8gJ+KckycgOiAnJyB9fTwvc3Bhbj5cbiAgICAgICAge3sgeEZpZWxkLmxhYmVsIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDxtYXQtZGl2aWRlciAqbmdJZj1cImNvbmZpZy54RmllbGRzPy5sZW5ndGggJiYgY29uZmlnLnlGaWVsZHM/Lmxlbmd0aFwiIGNsYXNzPVwib3JnYW5pemVyLWNoYW1wcy1kaXZpZGVyXCI+PC9tYXQtZGl2aWRlcj5cblxuICAgIDwhLS0gQmxvYyBZIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJvcmdhbml6ZXItY2hhbXBzLWJsb2NrXCIgKm5nSWY9XCJjb25maWcueUZpZWxkcz8ubGVuZ3RoXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1jaGFtcHMtYmxvY2stdGl0bGVcIj5ZIOKAlCBBeGUgdmVydGljYWw8L3NwYW4+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB5RmllbGQgb2YgY29uZmlnLnlGaWVsZHNcIj5cblxuICAgICAgICA8IS0tIFkgc2ltcGxlIChDb3VudCBzYW5zIGFncsOpZ2F0IG5pIHN0YWNrKSAtLT5cbiAgICAgICAgPCEtLSBZIHNpbXBsZSAoQ291bnQgb3UgbcOpdHJpcXVlIGRpcmVjdGUpIC0tPlxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIXlGaWVsZC5hZ2dyZWdhdGVzPy5sZW5ndGhcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWl0ZW1cIlxuICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiaXNZQWN0aXZlKHlGaWVsZC5pZClcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJ5RmllbGQuZGlzYWJsZWRcIlxuICAgICAgICAgIChtb3VzZWRvd24pPVwib25ZRmllbGRTZWxlY3QoeUZpZWxkLmlkKVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtY2hlY2tcIj57eyBpc1lBY3RpdmUoeUZpZWxkLmlkKSA/ICfinJMnIDogJycgfX08L3NwYW4+XG4gICAgICAgICAge3sgeUZpZWxkLmxhYmVsIH19XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDwhLS0gWSBhdmVjIGFncsOpZ2F0cyDihpIgc291cy1tZW51IC0tPlxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwieUZpZWxkLmFnZ3JlZ2F0ZXM/Lmxlbmd0aFwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtaXRlbSBvcmdhbml6ZXItc3VibWVudS1pdGVtLS1oYXMtY2hpbGRyZW5cIlxuICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiaXNZQWN0aXZlKHlGaWVsZC5pZClcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJ5RmllbGQuZGlzYWJsZWRcIlxuICAgICAgICAgIFttYXRNZW51VHJpZ2dlckZvcl09XCJ5QWdnU3ViTWVudVwiXG4gICAgICAgICAgW21hdE1lbnVUcmlnZ2VyRGF0YV09XCJ7IHlGaWVsZDogeUZpZWxkIH1cIlxuICAgICAgICAgIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1jaGVja1wiPnt7IGlzWUFjdGl2ZSh5RmllbGQuaWQpID8gJ+KckycgOiAnJyB9fTwvc3Bhbj5cbiAgICAgICAgICB7eyB5RmllbGQubGFiZWwgfX1cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1hcnJvd1wiPmNoZXZyb25fcmlnaHQ8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgPC9kaXY+XG48L21hdC1tZW51PlxuXG48IS0tIFNvdXMtbWVudSBkeW5hbWlxdWUgOiBhZ3LDqWdhdHMgZCd1biBjaGFtcCBZIC0tPlxuPG1hdC1tZW51ICN5QWdnU3ViTWVudT1cIm1hdE1lbnVcIiBwYW5lbENsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtcGFuZWxcIj5cbiAgPG5nLXRlbXBsYXRlIG1hdE1lbnVDb250ZW50IGxldC15RmllbGQ9XCJ5RmllbGRcIj5cbiAgICA8ZGl2IGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnVcIlxuICAgICAgICAgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAoa2V5ZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtaXRlbVwiXG4gICAgICAgICpuZ0Zvcj1cImxldCBhZ2cgb2YgeUZpZWxkLmFnZ3JlZ2F0ZXNcIlxuICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImlzWUFnZ3JlZ2F0ZUFjdGl2ZSh5RmllbGQuaWQsIGFnZy5pZClcIlxuICAgICAgICAobW91c2Vkb3duKT1cIm9uWUFnZ3JlZ2F0ZVNlbGVjdCh5RmllbGQuaWQsIGFnZy5pZClcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1jaGVja1wiPnt7IGlzWUFnZ3JlZ2F0ZUFjdGl2ZSh5RmllbGQuaWQsIGFnZy5pZCkgPyAn4pyTJyA6ICcnIH19PC9zcGFuPlxuICAgICAgICB7eyBhZ2cubGFiZWwgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuPC9tYXQtbWVudT5cblxuPCEtLSBTb3VzLW1lbnUgOiBDaGFtcHMgdGFibGUgKHRvZ2dsZSBjb2xvbm5lcykgLS0+XG48bWF0LW1lbnUgI2ZpZWxkc1N1Yk1lbnU9XCJtYXRNZW51XCIgcGFuZWxDbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LXBhbmVsXCI+XG4gIDxkaXYgY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudVwiXG4gICAgICAgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtaXRlbVwiXG4gICAgICAqbmdGb3I9XCJsZXQgZmllbGQgb2YgY29uZmlnLmZpZWxkc1wiXG4gICAgICBbY2xhc3MuYWN0aXZlXT1cImlzRmllbGRWaXNpYmxlKGZpZWxkLmlkKVwiXG4gICAgICAobW91c2Vkb3duKT1cIm9uRmllbGRUb2dnbGUoZmllbGQuaWQsICFpc0ZpZWxkVmlzaWJsZShmaWVsZC5pZCkpXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWNoZWNrXCI+e3sgaXNGaWVsZFZpc2libGUoZmllbGQuaWQpID8gJ+KckycgOiAnJyB9fTwvc3Bhbj4gICAgICA8bWF0LWljb24gKm5nSWY9XCJmaWVsZC5pY29uXCIgY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1pY29uXCI+e3sgZmllbGQuaWNvbiB9fTwvbWF0LWljb24+ICAgICAge3sgZmllbGQubGFiZWwgfX1cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L21hdC1tZW51PlxuXG48IS0tIFNvdXMtbWVudSA6IEdyb3VwZXIgcGFyIC0tPlxuPG1hdC1tZW51ICNncm91cHNTdWJNZW51PVwibWF0TWVudVwiIHBhbmVsQ2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1wYW5lbFwiPlxuICA8ZGl2IGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnVcIlxuICAgICAgIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAoa2V5ZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWl0ZW1cIlxuICAgICAgKm5nRm9yPVwibGV0IGdyb3VwIG9mIGNvbmZpZy5ncm91cHNcIlxuICAgICAgW2NsYXNzLmFjdGl2ZV09XCJzdGF0ZT8uc2VsZWN0ZWRHcm91cEJ5ID09PSBncm91cC5pZFwiXG4gICAgICAobW91c2Vkb3duKT1cIm9uR3JvdXBCeVNlbGVjdChncm91cC5pZClcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtY2hlY2tcIj57eyBzdGF0ZT8uc2VsZWN0ZWRHcm91cEJ5ID09PSBncm91cC5pZCA/ICfinJMnIDogJycgfX08L3NwYW4+ICAgICAgPG1hdC1pY29uICpuZ0lmPVwiZ3JvdXAuaWNvblwiIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtaWNvblwiPnt7IGdyb3VwLmljb24gfX08L21hdC1pY29uPiAgICAgIHt7IGdyb3VwLmxhYmVsIH19XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9tYXQtbWVudT5cblxuPCEtLSBTb3VzLW1lbnUgOiBGaWx0cmVyIHBhciAtLT5cbjxtYXQtbWVudSAjc2xpY2VzU3ViTWVudT1cIm1hdE1lbnVcIiBwYW5lbENsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtcGFuZWxcIj5cbiAgPGRpdiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51XCJcbiAgICAgICAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1pdGVtXCJcbiAgICAgICpuZ0Zvcj1cImxldCBzbGljZSBvZiBjb25maWcuc2xpY2VzXCJcbiAgICAgIFtjbGFzcy5hY3RpdmVdPVwic3RhdGU/LnNlbGVjdGVkU2xpY2VzPy5pbmNsdWRlcyhzbGljZS5pZClcIlxuICAgICAgKG1vdXNlZG93bik9XCJvblNsaWNlQ2xpY2soc2xpY2UuaWQpXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWNoZWNrXCI+e3sgc3RhdGU/LnNlbGVjdGVkU2xpY2VzPy5pbmNsdWRlcyhzbGljZS5pZCkgPyAn4pyTJyA6ICcnIH19PC9zcGFuPiAgICAgIDxtYXQtaWNvbiAqbmdJZj1cInNsaWNlLmljb25cIiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWljb25cIj57eyBzbGljZS5pY29uIH19PC9tYXQtaWNvbj4gICAgICB7eyBzbGljZS5sYWJlbCB9fVxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvbWF0LW1lbnU+XG5cbjwhLS0gU291cy1tZW51IDogVGVtcGxhdGUgLS0+XG48bWF0LW1lbnUgI3RlbXBsYXRlU3ViTWVudT1cIm1hdE1lbnVcIiBwYW5lbENsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtcGFuZWxcIj5cbiAgPGRpdiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51XCJcbiAgICAgICAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1pdGVtXCJcbiAgICAgICpuZ0Zvcj1cImxldCB0bXBsIG9mIGNvbmZpZy50ZW1wbGF0ZXNcIlxuICAgICAgW2NsYXNzLmFjdGl2ZV09XCJzdGF0ZT8uc2VsZWN0ZWRUZW1wbGF0ZSA9PT0gdG1wbC5pZFwiXG4gICAgICAobW91c2Vkb3duKT1cIm9uVGVtcGxhdGVTZWxlY3QodG1wbC5pZClcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtY2hlY2tcIj57eyBzdGF0ZT8uc2VsZWN0ZWRUZW1wbGF0ZSA9PT0gdG1wbC5pZCA/ICfinJMnIDogJycgfX08L3NwYW4+XG4gICAgICA8bWF0LWljb24gKm5nSWY9XCJ0bXBsLmljb25cIiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWljb25cIj57eyB0bXBsLmljb24gfX08L21hdC1pY29uPlxuICAgICAge3sgdG1wbC5sYWJlbCB9fVxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvbWF0LW1lbnU+XG5cbjwhLS0gU291cy1tZW51IDogUHLDqWbDqXJlbmNlcyAtLT5cbjxtYXQtbWVudSAjcHJlZmVyZW5jZXNTdWJNZW51PVwibWF0TWVudVwiIHBhbmVsQ2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1wYW5lbFwiPlxuICA8ZGl2IGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnVcIlxuICAgICAgIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAoa2V5ZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWl0ZW1cIiAobW91c2Vkb3duKT1cIm9uUHJlZmVyZW5jZXNFZGl0KClcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtY2hlY2tcIj48L3NwYW4+XG4gICAgICA8bWF0LWljb24gY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1pY29uXCI+ZWRpdDwvbWF0LWljb24+w4lkaXRlclxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtaXRlbVwiIChtb3VzZWRvd24pPVwib25QcmVmZXJlbmNlc1NhdmUoKVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJvcmdhbml6ZXItc3VibWVudS1jaGVja1wiPjwvc3Bhbj5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWljb25cIj5zYXZlPC9tYXQtaWNvbj5TYXV2ZWdhcmRlclxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtaXRlbVwiIFtkaXNhYmxlZF09XCIhY29uZmlnLmhhc1NhdmVkUHJlZmVyZW5jZXNcIiAobW91c2Vkb3duKT1cIm9uUHJlZmVyZW5jZXNDbGVhcigpXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cIm9yZ2FuaXplci1zdWJtZW51LWNoZWNrXCI+PC9zcGFuPlxuICAgICAgPG1hdC1pY29uIGNsYXNzPVwib3JnYW5pemVyLXN1Ym1lbnUtaWNvblwiPmRlbGV0ZV9vdXRsaW5lPC9tYXQtaWNvbj5Sw6lpbml0aWFsaXNlclxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvbWF0LW1lbnU+XG5cbiJdfQ==
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { OrganizerButtonComponent } from './organizer-button.component';
|
|
3
|
+
import { SlicePanelComponent } from '../slice-panel/slice-panel.component';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export class OrganizerButtonModule {
|
|
6
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: OrganizerButtonModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
7
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: OrganizerButtonModule, imports: [OrganizerButtonComponent, SlicePanelComponent], exports: [OrganizerButtonComponent, SlicePanelComponent] }); }
|
|
8
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: OrganizerButtonModule, imports: [OrganizerButtonComponent, SlicePanelComponent] }); }
|
|
9
|
+
}
|
|
10
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: OrganizerButtonModule, decorators: [{
|
|
11
|
+
type: NgModule,
|
|
12
|
+
args: [{
|
|
13
|
+
imports: [OrganizerButtonComponent, SlicePanelComponent],
|
|
14
|
+
exports: [OrganizerButtonComponent, SlicePanelComponent]
|
|
15
|
+
}]
|
|
16
|
+
}] });
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pemVyLWJ1dHRvbi5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmV0ZW1lL2pxdWVyeS1vcmdhbml6ZXIvc3JjL2xpYi9vcmdhbml6ZXItYnV0dG9uL29yZ2FuaXplci1idXR0b24ubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7O0FBTTNFLE1BQU0sT0FBTyxxQkFBcUI7K0dBQXJCLHFCQUFxQjtnSEFBckIscUJBQXFCLFlBSHRCLHdCQUF3QixFQUFFLG1CQUFtQixhQUM3Qyx3QkFBd0IsRUFBRSxtQkFBbUI7Z0hBRTVDLHFCQUFxQixZQUh0Qix3QkFBd0IsRUFBRSxtQkFBbUI7OzRGQUc1QyxxQkFBcUI7a0JBSmpDLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFLENBQUMsd0JBQXdCLEVBQUUsbUJBQW1CLENBQUM7b0JBQ3hELE9BQU8sRUFBRSxDQUFDLHdCQUF3QixFQUFFLG1CQUFtQixDQUFDO2lCQUN6RCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPcmdhbml6ZXJCdXR0b25Db21wb25lbnQgfSBmcm9tICcuL29yZ2FuaXplci1idXR0b24uY29tcG9uZW50JztcbmltcG9ydCB7IFNsaWNlUGFuZWxDb21wb25lbnQgfSBmcm9tICcuLi9zbGljZS1wYW5lbC9zbGljZS1wYW5lbC5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbT3JnYW5pemVyQnV0dG9uQ29tcG9uZW50LCBTbGljZVBhbmVsQ29tcG9uZW50XSxcbiAgZXhwb3J0czogW09yZ2FuaXplckJ1dHRvbkNvbXBvbmVudCwgU2xpY2VQYW5lbENvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgT3JnYW5pemVyQnV0dG9uTW9kdWxlIHt9XG4iXX0=
|