@esfaenza/es-diagrams 12.2.13 → 13.1.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/esfaenza-es-diagrams.d.ts +1 -5
- package/esm2020/esfaenza-es-diagrams.mjs +5 -0
- package/esm2020/lib/components/es-diagram.component.mjs +519 -0
- package/esm2020/lib/esdiagram.module.mjs +33 -0
- package/esm2020/lib/extensions/ReactiveExtensions.mjs +36 -0
- package/{esm2015/lib/extensions/ResizeSensor.js → esm2020/lib/extensions/ResizeSensor.mjs} +0 -0
- package/{esm2015/lib/models/EsDiagramModuleConfig.js → esm2020/lib/models/EsDiagramModuleConfig.mjs} +0 -0
- package/{esm2015/lib/models/component/contextmenu/ContextMenuCommand.js → esm2020/lib/models/component/contextmenu/ContextMenuCommand.mjs} +0 -0
- package/{esm2015/lib/models/component/contextmenu/ContextMenuOptions.js → esm2020/lib/models/component/contextmenu/ContextMenuOptions.mjs} +0 -0
- package/{esm2015/lib/models/component/grouping/ExpandCollapseOptions.js → esm2020/lib/models/component/grouping/ExpandCollapseOptions.mjs} +0 -0
- package/{esm2015/lib/models/component/nodes/NodeHTMLTemplate.js → esm2020/lib/models/component/nodes/NodeHTMLTemplate.mjs} +0 -0
- package/{esm2015/lib/models/component/nodes/NodeTemplate.js → esm2020/lib/models/component/nodes/NodeTemplate.mjs} +0 -0
- package/{esm2015/lib/models/component/nodes/ZoomLevelBasedTemplate.js → esm2020/lib/models/component/nodes/ZoomLevelBasedTemplate.mjs} +0 -0
- package/{esm2015/lib/models/layouts/BreadthFirstLayoutOptionsImpl.js → esm2020/lib/models/layouts/BreadthFirstLayoutOptionsImpl.mjs} +0 -0
- package/{esm2015/lib/models/layouts/CircleLayoutOptionsImpl.js → esm2020/lib/models/layouts/CircleLayoutOptionsImpl.mjs} +0 -0
- package/{esm2015/lib/models/layouts/ConcentricLayoutOptionsImpl.js → esm2020/lib/models/layouts/ConcentricLayoutOptionsImpl.mjs} +0 -0
- package/{esm2015/lib/models/layouts/CoseLayoutOptionsImpl.js → esm2020/lib/models/layouts/CoseLayoutOptionsImpl.mjs} +0 -0
- package/{esm2015/lib/models/layouts/DagreLayoutOptionsImpl.js → esm2020/lib/models/layouts/DagreLayoutOptionsImpl.mjs} +0 -0
- package/{esm2015/lib/models/layouts/GridLayoutOptionsImpl.js → esm2020/lib/models/layouts/GridLayoutOptionsImpl.mjs} +0 -0
- package/{esm2015/lib/models/layouts/NullLayoutOptionsImpl.js → esm2020/lib/models/layouts/NullLayoutOptionsImpl.mjs} +0 -0
- package/{esm2015/lib/models/layouts/PresetLayoutOptionsImpl.js → esm2020/lib/models/layouts/PresetLayoutOptionsImpl.mjs} +0 -0
- package/{esm2015/lib/models/layouts/RandomLayoutOptionsImpl.js → esm2020/lib/models/layouts/RandomLayoutOptionsImpl.mjs} +0 -0
- package/{esm2015/lib/models/layouts/base/AnimateLayoutOptionsImpl.js → esm2020/lib/models/layouts/base/AnimateLayoutOptionsImpl.mjs} +0 -0
- package/{esm2015/lib/models/layouts/base/BaseLayoutOptionsImpl.js → esm2020/lib/models/layouts/base/BaseLayoutOptionsImpl.mjs} +0 -0
- package/{esm2015/lib/models/layouts/base/ShapedLayoutOptionsImpl.js → esm2020/lib/models/layouts/base/ShapedLayoutOptionsImpl.mjs} +0 -0
- package/esm2020/lib/services/es-diagram.dispatcher.mjs +89 -0
- package/{esm2015/lib/services/es-diagram.loc.js → esm2020/lib/services/es-diagram.loc.mjs} +0 -0
- package/esm2020/lib/services/es-diagram.service.mjs +112 -0
- package/{esm2015/lib/tokens.js → esm2020/lib/tokens.mjs} +0 -0
- package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
- package/fesm2015/{esfaenza-es-diagrams.js → esfaenza-es-diagrams.mjs} +180 -136
- package/fesm2015/esfaenza-es-diagrams.mjs.map +1 -0
- package/fesm2020/esfaenza-es-diagrams.mjs +1391 -0
- package/fesm2020/esfaenza-es-diagrams.mjs.map +1 -0
- package/lib/components/es-diagram.component.d.ts +3 -0
- package/lib/esdiagram.module.d.ts +7 -0
- package/lib/extensions/ReactiveExtensions.d.ts +3 -0
- package/lib/services/es-diagram.dispatcher.d.ts +3 -0
- package/lib/services/es-diagram.service.d.ts +3 -0
- package/package.json +21 -9
- package/bundles/esfaenza-es-diagrams.umd.js +0 -1856
- package/bundles/esfaenza-es-diagrams.umd.js.map +0 -1
- package/esfaenza-es-diagrams.metadata.json +0 -1
- package/esm2015/esfaenza-es-diagrams.js +0 -10
- package/esm2015/lib/components/es-diagram.component.js +0 -503
- package/esm2015/lib/esdiagram.module.js +0 -28
- package/esm2015/lib/extensions/ReactiveExtensions.js +0 -34
- package/esm2015/lib/services/es-diagram.dispatcher.js +0 -86
- package/esm2015/lib/services/es-diagram.service.js +0 -106
- package/fesm2015/esfaenza-es-diagrams.js.map +0 -1
|
@@ -1,503 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { Component, EventEmitter, Input, Optional, Output, ViewChild } from '@angular/core';
|
|
3
|
-
import { EsDiagramService } from '../services/es-diagram.service';
|
|
4
|
-
import { EsDiagramDispatcher } from '../services/es-diagram.dispatcher';
|
|
5
|
-
import { ResizeSensor } from "../extensions/ResizeSensor";
|
|
6
|
-
import { ReactiveExtensions } from '../extensions/ReactiveExtensions';
|
|
7
|
-
import * as cy_ from 'cytoscape';
|
|
8
|
-
/** @ignore */ const cytoscape = cy_;
|
|
9
|
-
/**
|
|
10
|
-
* Componente che si occupa di graficare un diagramma e di gestirne il ciclo di vita
|
|
11
|
-
*/
|
|
12
|
-
export class EsDiagramComponent {
|
|
13
|
-
/**
|
|
14
|
-
* Costruttore
|
|
15
|
-
*
|
|
16
|
-
* @ignore
|
|
17
|
-
*/
|
|
18
|
-
constructor(service, dispatcher, exts) {
|
|
19
|
-
this.service = service;
|
|
20
|
-
this.dispatcher = dispatcher;
|
|
21
|
-
this.exts = exts;
|
|
22
|
-
/**
|
|
23
|
-
* Nome del diagramma, fondamentale assegnarlo per permettere alla libreria di schedularne la creazione
|
|
24
|
-
*/
|
|
25
|
-
this.name = "";
|
|
26
|
-
/**
|
|
27
|
-
* Indica se utilizzare il menù contestuale a ruota attorno ad ogni nodo
|
|
28
|
-
*/
|
|
29
|
-
this.UseContextMenu = false;
|
|
30
|
-
/**
|
|
31
|
-
* Dice al componente se il diagramma deve utilizzare il sistema di estensione per l'expand e collapse dei gruppi
|
|
32
|
-
*/
|
|
33
|
-
this.UseExpandCollapse = false;
|
|
34
|
-
/**
|
|
35
|
-
* Blocco completo delle opzioni, alternativo all'assegnazione di **Elements**, **NodeStyles**, **EdgeStyles**, e **Layout**.
|
|
36
|
-
*
|
|
37
|
-
* Qualora entrambe venissero specificate verrà effettuata un'unione fra queste opzioni e quelle specificate, dando priorità alle specificate
|
|
38
|
-
*/
|
|
39
|
-
this.NativeOptions = {};
|
|
40
|
-
/**
|
|
41
|
-
* Aggiorna automaticamente le dimensioni del diagramma quando cambiano le dimensioni della finestra
|
|
42
|
-
*/
|
|
43
|
-
this.AutoupdateSize = true;
|
|
44
|
-
/**
|
|
45
|
-
* Indica di mantenere la posizione dei nodi qualora venissero cambiati dall'Input **Elements**.
|
|
46
|
-
*
|
|
47
|
-
* Se l'ID di un nodo è uguale all'ID di un nodo presente in precedenza, il nuovo nodo ne erediterà la posizione
|
|
48
|
-
*/
|
|
49
|
-
this.PreserveElementsPosition = true;
|
|
50
|
-
/**
|
|
51
|
-
* Qualora venisse modificato l'Input **Elements**, piuttosto che mettere semplicemente il nuovo Elemento in base al Layout precedente, applica anche un'animazione
|
|
52
|
-
*
|
|
53
|
-
* Funziona solamente se il **Layout** corrente del diagramma supporta le animazioni
|
|
54
|
-
*/
|
|
55
|
-
this.AnimateLayoutChanges = true;
|
|
56
|
-
/**
|
|
57
|
-
* Attiva una modalità di selezione "smart"... o perlomeno "smarter" del default di Cytoscape.
|
|
58
|
-
*
|
|
59
|
-
* - Il click di un elemento non selezionato lo seleziona
|
|
60
|
-
* - Il click di un elemento selezionato lo deseleziona
|
|
61
|
-
* - Lo stato di selezione viene persistito sull'oggetto originale invece di rimanere in un internal
|
|
62
|
-
* - All'assegnazione di oggetti selezionati, questi vengono marcati correttamente con l'overlay di selezione
|
|
63
|
-
*
|
|
64
|
-
* N.B: la chiamata all'evento **onNodeClick** avviene **DOPO** la gestione della selezione
|
|
65
|
-
*/
|
|
66
|
-
this.SmartSelection = false;
|
|
67
|
-
/**
|
|
68
|
-
* CSS per la graficazione della selezione dei nodi. Quando un nodo verrà selezionato avrà sopra di se un overlay che 'sborda' di **overlay-padding** pixel,
|
|
69
|
-
* di colore **overlay-color** e con un opacità **overlay-opacity**
|
|
70
|
-
*
|
|
71
|
-
* Assegnando "{}" a questo input, la Smart selection viene gestita ma la gestione grafica è affidata all'utente,
|
|
72
|
-
* ad esempio usando dei **NodeHTMLTemplates** che definiscano selettori su nodi ":selected"
|
|
73
|
-
*
|
|
74
|
-
* @default {'overlay-color':'blue','overlay-opacity':0.5,'overlay-padding':7}
|
|
75
|
-
*/
|
|
76
|
-
this.SmartSelectionStyles = null;
|
|
77
|
-
/**
|
|
78
|
-
* Periodo di throttle da quando viene effettuato un resize a quando ricalcolare le dimensioni del diagramma.
|
|
79
|
-
*
|
|
80
|
-
* Può essere tenuto a 0 (redraw istantaneo) finché non ci sono problemi di prestazioni con eventualmente tanti resize a poca distanza l'uno dall'altro.
|
|
81
|
-
*/
|
|
82
|
-
this.ResizeThrottleTime = 0;
|
|
83
|
-
/**
|
|
84
|
-
* Fornisce il global della libreria (namespace **cytoscape**) e si aspetta che dopo operazioni di importazione
|
|
85
|
-
* lasciate all'utente vengano aggiunti tutti i moduli desiderati.
|
|
86
|
-
*
|
|
87
|
-
* È **fondamentale** che il primo parametro (il nome del modulo) sia uguale a ciò di cui viene fatto il require in modo che la libreria
|
|
88
|
-
* possa controllare che il modulo importato non sia già stato importato in precedenza
|
|
89
|
-
*
|
|
90
|
-
* ## Esempio:
|
|
91
|
-
*
|
|
92
|
-
* ```typescript
|
|
93
|
-
* (global) => {
|
|
94
|
-
* return import("cytoscape-extension-library").then(module => global.use("cytoscape-extension-library", module.default));
|
|
95
|
-
*
|
|
96
|
-
* ...
|
|
97
|
-
* }
|
|
98
|
-
* ```
|
|
99
|
-
*/
|
|
100
|
-
this.ExtensionModulesImporter = null;
|
|
101
|
-
/**
|
|
102
|
-
* Fornisce l'istanza attuale di Cytoscape da cui è possibile prendere le librerie di estensione caricate in **ExtensionModulesImporter**
|
|
103
|
-
* e configurarle in base ai comportamenti specifici
|
|
104
|
-
*
|
|
105
|
-
* ## Esempio:
|
|
106
|
-
*
|
|
107
|
-
* ```typescript
|
|
108
|
-
* (cytoscapeCore) => {
|
|
109
|
-
* // Fare questo lavoro per ogni estensione caricata
|
|
110
|
-
* let extensionConfiguration = { ... };
|
|
111
|
-
* let extensionInstance = cytoscapeCore.extensionLibrary(extensionConfiguration);
|
|
112
|
-
* extensionInstance.doSomethingSpecificToThisExtension();
|
|
113
|
-
*
|
|
114
|
-
* ...
|
|
115
|
-
* }
|
|
116
|
-
* ```
|
|
117
|
-
*/
|
|
118
|
-
this.ExtensionModulesApplyer = null;
|
|
119
|
-
/**
|
|
120
|
-
* Evento lanciato al click di un nodo, contiene l'oggetto **data** del nodo in questione
|
|
121
|
-
*/
|
|
122
|
-
this.onNodeClick = new EventEmitter();
|
|
123
|
-
/**
|
|
124
|
-
* Evento lanciato alla selezione o deselezione di un nodo, contiene l'oggetto **data** del nodo in questione e informazioni sul suo stato di selezione
|
|
125
|
-
*/
|
|
126
|
-
this.onNodeSelection = new EventEmitter();
|
|
127
|
-
/**
|
|
128
|
-
* Evento lanciato al termine del Layouting. Se si vuole eseguire codice dopo che il Layout è fatto e completamente graficato, questo è il punto
|
|
129
|
-
*/
|
|
130
|
-
this.onLayoutDone = new EventEmitter();
|
|
131
|
-
/**
|
|
132
|
-
* Evento lanciato al termine del caricamento del diagramma
|
|
133
|
-
*/
|
|
134
|
-
this.onLoaded = new EventEmitter();
|
|
135
|
-
/**
|
|
136
|
-
* Indica se il rendering del diagramma è terminato
|
|
137
|
-
*/
|
|
138
|
-
this.Rendered = false;
|
|
139
|
-
/**
|
|
140
|
-
* Api dell'estensione expand-collapse per permettere di effettuare operazioni dall'esterno del diagramma. Vengono valorizzate se **UseExpandCollapse** è **true**
|
|
141
|
-
*/
|
|
142
|
-
this.ExpandCollapseApi = null;
|
|
143
|
-
/**
|
|
144
|
-
* Api dell'estensione html-node per permettere di effettuare operazioni dall'esterno del diagramma. Vengono valorizzate se sono impostati dei **NodeHTMLTemplates**
|
|
145
|
-
*/
|
|
146
|
-
this.HtmlNodeApi = null;
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* @ignore
|
|
150
|
-
*
|
|
151
|
-
* Angular Pipeline
|
|
152
|
-
*/
|
|
153
|
-
ngAfterViewInit() {
|
|
154
|
-
if (!this.service || !this.dispatcher)
|
|
155
|
-
throw "Il modulo @esfaenza/diagrams non è stato importato con il forRoot();";
|
|
156
|
-
this.dispatchLoadChart();
|
|
157
|
-
}
|
|
158
|
-
/**
|
|
159
|
-
* All'onDestroy ripulisco la memoria dal diagramma
|
|
160
|
-
*/
|
|
161
|
-
ngOnDestroy() {
|
|
162
|
-
this.resizeObserver.dispose();
|
|
163
|
-
this.resizeObserver = null;
|
|
164
|
-
if (this.cy) {
|
|
165
|
-
this.service.log("I", "Diagram" + " " + this.name + ": Unloading destroyed diagram", false);
|
|
166
|
-
this.cy.destroy();
|
|
167
|
-
this.dispatcher.deregister(this.name);
|
|
168
|
-
}
|
|
169
|
-
else
|
|
170
|
-
this.service.log("I", "Chart " + this.name + ": Unloading uncreated chart component. It probably was a duplicated", false);
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* Registra il diagramma attuale nel Dispatcher in modo che venga caricato appena possibile
|
|
174
|
-
*/
|
|
175
|
-
dispatchLoadChart() {
|
|
176
|
-
this.dispatcher.register(this.name, () => { return this.render(); });
|
|
177
|
-
}
|
|
178
|
-
/**
|
|
179
|
-
* @ignore
|
|
180
|
-
*
|
|
181
|
-
* Angular Pipeline: Gestione ri-graficazione del diagramma, se possibile
|
|
182
|
-
*/
|
|
183
|
-
ngOnChanges(changes) {
|
|
184
|
-
let toCheck = ["Templates", "UseContextMenu", "ContextMenuOptions", "UseExpandCollapse", "ExpandCollapseOptions", "NodeStyles", "EdgeStyles", "NativeOptions"];
|
|
185
|
-
if (this.Rendered && toCheck.some(t => changes[t]))
|
|
186
|
-
this.service.log("W", "Redraw based on dynamic Input change is supported only for 'Elements' and 'Layout' inputs, please destroy the component and recreate it with the new settings");
|
|
187
|
-
let elementChanges = changes["Elements"];
|
|
188
|
-
let layoutChanges = changes["Layout"];
|
|
189
|
-
if (elementChanges && !elementChanges.firstChange) {
|
|
190
|
-
this.service.log("I", "Elements have been changed after diagram initialization");
|
|
191
|
-
// Cambiamento agli Elementi: ripulisco gli elementi vecchi, prendo i nuovi, li sistemo e li riassegno.
|
|
192
|
-
// Se il nuovo Input Elements è roba strana mi limito a ripulire il diagramma
|
|
193
|
-
// Se cytoscape aveva già degli elementi precedentemente ne prendo le posizioni in modo da ridisegnarli partendo dallo stesso punto (carino per le animazioni)
|
|
194
|
-
let elements = elementChanges === null || elementChanges === void 0 ? void 0 : elementChanges.currentValue;
|
|
195
|
-
let previous_elements = this.PreserveElementsPosition ? this.cy.nodes() : null;
|
|
196
|
-
this.cy.elements().remove();
|
|
197
|
-
if (elements && elements.length && elements.length > 0) {
|
|
198
|
-
this.reviewCytoscapeElements(elements, previous_elements);
|
|
199
|
-
this.cy.add(elements);
|
|
200
|
-
if (this.SmartSelection)
|
|
201
|
-
this.setupElementsSelectionIfNeeded();
|
|
202
|
-
// Se solo gli elementi cambiano, riapplico il Layout precedente
|
|
203
|
-
if (!layoutChanges && this.LastLayout) {
|
|
204
|
-
// Se devo animare le modifche al layout forzo il parametro relativo
|
|
205
|
-
if (this.AnimateLayoutChanges)
|
|
206
|
-
this.LastLayout.animate = true;
|
|
207
|
-
this.cy.layout(this.LastLayout).run();
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
// Se il layout cambia lo applico e me lo salvo come layout precedente per il futuro
|
|
212
|
-
if (layoutChanges && !layoutChanges.firstChange) {
|
|
213
|
-
this.service.log("I", "Layout have been changed after diagram initialization");
|
|
214
|
-
this.LastLayout = JSON.parse(JSON.stringify(layoutChanges.currentValue));
|
|
215
|
-
this.cy.layout(this.LastLayout).run();
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
/**
|
|
219
|
-
* Effettua il rendering del diagramma
|
|
220
|
-
*/
|
|
221
|
-
render() {
|
|
222
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
223
|
-
// Tiro fuori le opzioni con cui generare il diagramma
|
|
224
|
-
let cyOptions = this.getCompletedOptions();
|
|
225
|
-
this.NodesHierarchy = cyOptions.elements && cyOptions.elements.some(t => t.data.parent);
|
|
226
|
-
// Carico eventuali classi di estensione che servono
|
|
227
|
-
yield this.performModulesLoading();
|
|
228
|
-
// Genero il diagramma
|
|
229
|
-
this.cy = cytoscape(cyOptions);
|
|
230
|
-
// Collego gli eventi al componente
|
|
231
|
-
this.bindCytoscapeEvents();
|
|
232
|
-
// Utilizzo le classi di estensione caricate precedentemente per fare il resto delle mie operazioni
|
|
233
|
-
this.performOperationsWithLoadedModules();
|
|
234
|
-
// Imposto la variabile Rendered a true in modo che se da adesso vengono fatte modifiche che dovrebbero causare un redraw posso accorgermene
|
|
235
|
-
// e mandare a cagare lo stronzo di turno
|
|
236
|
-
this.Rendered = true;
|
|
237
|
-
// Se devo aggiornare in automatico in base alla dimensione del contenitore collego il ResizeObserver
|
|
238
|
-
if (this.AutoupdateSize)
|
|
239
|
-
this.listenOnChanges();
|
|
240
|
-
if (this.SmartSelection) {
|
|
241
|
-
this.setupSelectionStyles();
|
|
242
|
-
this.setupElementsSelectionIfNeeded();
|
|
243
|
-
}
|
|
244
|
-
this.onLoaded.emit();
|
|
245
|
-
});
|
|
246
|
-
}
|
|
247
|
-
/**
|
|
248
|
-
* Prende tutti gli elementi appena assegnati, e se qualcuno era selezionato la situazione viene persistita su cytoscape
|
|
249
|
-
*/
|
|
250
|
-
setupElementsSelectionIfNeeded() {
|
|
251
|
-
for (let i = 0; i < this.Elements.length; i++) {
|
|
252
|
-
let eldata = this.Elements[i].data;
|
|
253
|
-
if (eldata.__selected) {
|
|
254
|
-
let el = this.cy.$id(eldata.id);
|
|
255
|
-
el.select();
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
/**
|
|
260
|
-
* Carica gli stili per mostrare carina la selezione dei nodi
|
|
261
|
-
*/
|
|
262
|
-
setupSelectionStyles() {
|
|
263
|
-
let cssItem = this.SmartSelectionStyles || {
|
|
264
|
-
'overlay-color': 'blue',
|
|
265
|
-
'overlay-opacity': 0.5,
|
|
266
|
-
'overlay-padding': 7
|
|
267
|
-
};
|
|
268
|
-
// Backdoor per poter assegnare "{}" a SmartSelectionStyles in modo di utilizzare la smart selection ma senza che nessuno stile venga applicato
|
|
269
|
-
// ad esempio qualora si volesse utilizzare l'htmlnode per gestire la grafica degli elementi selezionati
|
|
270
|
-
if (cssItem['overlay-color'] && cssItem['overlay-opacity'] && cssItem['overlay-padding'])
|
|
271
|
-
this.cy.style().selector('node:selected').css(cssItem);
|
|
272
|
-
}
|
|
273
|
-
/**
|
|
274
|
-
* Registra l'ascolto al contenitore del grafico e in caso di modifiche alla dimensione, al massimo una volta ogni 500 millisecondi, lo ridisegna
|
|
275
|
-
*/
|
|
276
|
-
listenOnChanges() {
|
|
277
|
-
this.resizeObserver = new ResizeSensor(this.cyGraph.nativeElement, () => {
|
|
278
|
-
this.exts.throttle(this.name, this.onContainerSizeChanged.bind(this), this.ResizeThrottleTime);
|
|
279
|
-
});
|
|
280
|
-
}
|
|
281
|
-
/**
|
|
282
|
-
* Funzione che si occupa di gestire il repaint del diagramma
|
|
283
|
-
*/
|
|
284
|
-
onContainerSizeChanged() {
|
|
285
|
-
this.service.log("I", "Diagram container size has changed, redrawing");
|
|
286
|
-
this.cy.resize();
|
|
287
|
-
this.cy.fit();
|
|
288
|
-
}
|
|
289
|
-
/**
|
|
290
|
-
* Collega tutti gli eventi che mi possono servire e li espone in output
|
|
291
|
-
*/
|
|
292
|
-
bindCytoscapeEvents() {
|
|
293
|
-
this.cy.bind('click', 'node', (event) => {
|
|
294
|
-
let targetData = event.target.data();
|
|
295
|
-
if (this.SmartSelection) {
|
|
296
|
-
let id = targetData.id;
|
|
297
|
-
let el = this.cy.$id(id);
|
|
298
|
-
let selected = el.selected();
|
|
299
|
-
el.selectify();
|
|
300
|
-
if (selected)
|
|
301
|
-
el.unselect();
|
|
302
|
-
else
|
|
303
|
-
el.select();
|
|
304
|
-
el.unselectify();
|
|
305
|
-
// Questo va anche nella lista degli elementi originali (this.Elements) dato che cytoscape li prende per riferimento (bbbbbravo cyto-chan)
|
|
306
|
-
el.data("__selected", !selected);
|
|
307
|
-
}
|
|
308
|
-
this.onNodeClick.emit({ data: targetData });
|
|
309
|
-
});
|
|
310
|
-
this.cy.bind('select', 'node', (event) => {
|
|
311
|
-
let targetData = event.target.data();
|
|
312
|
-
this.onNodeSelection.emit({ data: targetData, selected: true });
|
|
313
|
-
});
|
|
314
|
-
this.cy.bind('layoutstop', (event) => {
|
|
315
|
-
this.onLayoutDone.emit();
|
|
316
|
-
});
|
|
317
|
-
this.cy.bind('unselect', 'node', (event) => {
|
|
318
|
-
let targetData = event.target.data();
|
|
319
|
-
this.onNodeSelection.emit({ data: targetData, selected: false });
|
|
320
|
-
});
|
|
321
|
-
// Altri eventi...
|
|
322
|
-
}
|
|
323
|
-
/**
|
|
324
|
-
* Metodo che serve per caricare tutte le estensioni della libreria in base a ciò che viene utilizzato
|
|
325
|
-
*/
|
|
326
|
-
performModulesLoading() {
|
|
327
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
328
|
-
if (this.Layout.name == 'dagre')
|
|
329
|
-
yield this.loadInternal("cytoscape-dagre");
|
|
330
|
-
if (this.NodeHTMLTemplates && this.NodeHTMLTemplates.length > 0)
|
|
331
|
-
yield this.loadInternal("cytoscape-html-node");
|
|
332
|
-
if (this.UseContextMenu)
|
|
333
|
-
yield this.loadInternal("cytoscape-cxtmenu");
|
|
334
|
-
if (this.NodesHierarchy && this.UseExpandCollapse)
|
|
335
|
-
yield this.loadInternal("cytoscape-expand-collapse");
|
|
336
|
-
if (this.ExtensionModulesImporter) {
|
|
337
|
-
// Wrappo il namespace in modo che possa dire la mia sul fatto che l'utente aggiunga un modulo o meno :D
|
|
338
|
-
var wrappedCytoscape = {
|
|
339
|
-
use: (moduleName, module) => {
|
|
340
|
-
if (!module)
|
|
341
|
-
this.service.log("E", this.service.loc("Received an undefined module. Make sure you are correctly loading it") + ": " + moduleName, false);
|
|
342
|
-
if (["cytoscape-dagre", "cytoscape-html-node", "cytoscape-cxtmenu", "cytoscape-expand-collapse"].includes(moduleName))
|
|
343
|
-
this.service.log("W", this.service.loc("Module") + " " + moduleName + " " + this.service.loc("is loaded and managed directly by this library. You don't need to import it or use it directly, just be sure to set the relative options"), false);
|
|
344
|
-
else
|
|
345
|
-
cytoscape.use(module);
|
|
346
|
-
}
|
|
347
|
-
};
|
|
348
|
-
yield this.ExtensionModulesImporter(wrappedCytoscape);
|
|
349
|
-
}
|
|
350
|
-
});
|
|
351
|
-
}
|
|
352
|
-
/**
|
|
353
|
-
* Metodo che serve per caricare tutte le estensioni della libreria in base a ciò che viene utilizzato con le opzioni definite dagli Input
|
|
354
|
-
*/
|
|
355
|
-
performOperationsWithLoadedModules() {
|
|
356
|
-
let anyCy = this.cy;
|
|
357
|
-
// Utilizzo del layout, lo salvo per poterlo riutilizzare in futuro
|
|
358
|
-
if (this.Layout) {
|
|
359
|
-
this.LastLayout = JSON.parse(JSON.stringify(this.Layout));
|
|
360
|
-
this.cy.layout(this.LastLayout).run();
|
|
361
|
-
}
|
|
362
|
-
// Utilizzo dell'HTML node
|
|
363
|
-
if (this.NodeHTMLTemplates && this.NodeHTMLTemplates.length > 0) {
|
|
364
|
-
this.HtmlNodeApi = anyCy.htmlnode();
|
|
365
|
-
this.HtmlNodeApi.createHtmlNode(cytoscape, this.cy, this.NodeHTMLTemplates);
|
|
366
|
-
}
|
|
367
|
-
// Utilizzo del Context Menu
|
|
368
|
-
if (this.UseContextMenu)
|
|
369
|
-
this.ContextMenuOptions.forEach(o => { anyCy.cxtmenu(o); });
|
|
370
|
-
// Utilizzo dell'expand collapse solo quando c'è una gerarchia di nodi
|
|
371
|
-
if (this.NodesHierarchy && this.UseExpandCollapse)
|
|
372
|
-
this.ExpandCollapseApi = anyCy.expandCollapse(this.ExpandCollapseOptions);
|
|
373
|
-
// Utilizzo di estensioni extra, implementazione affidata al programmatore
|
|
374
|
-
if (this.ExtensionModulesApplyer)
|
|
375
|
-
this.ExtensionModulesApplyer(this.cy);
|
|
376
|
-
}
|
|
377
|
-
updateCardData() {
|
|
378
|
-
if (!this.HtmlNodeApi) {
|
|
379
|
-
this.service.log("E", "Cannot update NodeHTMLTemplates as they don't seem to be used");
|
|
380
|
-
return;
|
|
381
|
-
}
|
|
382
|
-
this.HtmlNodeApi.update();
|
|
383
|
-
}
|
|
384
|
-
/**
|
|
385
|
-
* Metodo interno per il caricamento dei moduli di estensione
|
|
386
|
-
*
|
|
387
|
-
* @param {'cytoscape-expand-collapse' | 'cytoscape-cxtmenu' | 'cytoscape-html-node' | 'cytoscape-dagre'} moduleId Modulo da caricare
|
|
388
|
-
*/
|
|
389
|
-
loadInternal(moduleId) {
|
|
390
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
391
|
-
let toLoad = yield this.service.importIfNeeded(moduleId);
|
|
392
|
-
if (toLoad)
|
|
393
|
-
cytoscape.use(toLoad);
|
|
394
|
-
});
|
|
395
|
-
}
|
|
396
|
-
/**
|
|
397
|
-
* Metodo che basandosi sulle opzioni native eventualmente assegnate le completa con gli Input addizionali
|
|
398
|
-
*
|
|
399
|
-
* @returns {cy_.CytoscapeOptions} Opzioni finali unite da Input ed opzioni native
|
|
400
|
-
*/
|
|
401
|
-
getCompletedOptions() {
|
|
402
|
-
var opts = this.NativeOptions || {};
|
|
403
|
-
opts.container = this.cyGraph.nativeElement;
|
|
404
|
-
opts.style = opts.style || [];
|
|
405
|
-
// Per tutte le cose per cui gli Input hanno priorità sovrascrivo gli originali delle opzioni
|
|
406
|
-
if (this.NodeStyles || this.EdgeStyles) {
|
|
407
|
-
opts.style = [];
|
|
408
|
-
if (this.NodeStyles)
|
|
409
|
-
opts.style.push({ selector: 'node', css: this.NodeStyles });
|
|
410
|
-
if (this.EdgeStyles)
|
|
411
|
-
opts.style.push({ selector: 'edge', css: this.EdgeStyles });
|
|
412
|
-
}
|
|
413
|
-
if (this.Elements)
|
|
414
|
-
opts.elements = this.Elements;
|
|
415
|
-
this.reviewCytoscapeElements(opts.elements);
|
|
416
|
-
if (this.Layout)
|
|
417
|
-
opts.layout = this.Layout;
|
|
418
|
-
if (this.Readonly) {
|
|
419
|
-
// Questo coso fa effetti strani....
|
|
420
|
-
//opts.autolock = true;
|
|
421
|
-
opts.autoungrabify = true;
|
|
422
|
-
opts.autounselectify = false;
|
|
423
|
-
opts.boxSelectionEnabled = true;
|
|
424
|
-
opts.userZoomingEnabled = false;
|
|
425
|
-
opts.userPanningEnabled = false;
|
|
426
|
-
}
|
|
427
|
-
return opts;
|
|
428
|
-
}
|
|
429
|
-
/**
|
|
430
|
-
* Aggiustamenti degli elementi di Cytoscape.
|
|
431
|
-
*
|
|
432
|
-
* I nodi non vengono toccati.
|
|
433
|
-
*
|
|
434
|
-
* Per ogni edge viene controllato se è specificata una sorgente ed una destinazione, in caso contrario si cerca di dedurli dall'ID
|
|
435
|
-
*
|
|
436
|
-
* @param {cytoscape.ElementDefinition[]} elements Elementi da sistemare
|
|
437
|
-
*/
|
|
438
|
-
reviewCytoscapeElements(elements, prevPositions) {
|
|
439
|
-
let hasPreviousPositions = prevPositions && prevPositions.length > 0;
|
|
440
|
-
let positionCache = {};
|
|
441
|
-
if (hasPreviousPositions) {
|
|
442
|
-
for (let i = 0; i < prevPositions.length; i++) {
|
|
443
|
-
let item = prevPositions[i];
|
|
444
|
-
if (!positionCache[item.data().id])
|
|
445
|
-
positionCache[item.data().id] = item.position();
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
for (let i = 0; i < elements.length; i++) {
|
|
449
|
-
let el = elements[i];
|
|
450
|
-
if (el.group == "edges" && (!el.data.source && !el.data.target)) {
|
|
451
|
-
if (!el.data.id.includes("-"))
|
|
452
|
-
this.service.log("E", "If you don't specify a source and a target for an edge you have to write its id in the format {source}-{target}");
|
|
453
|
-
else {
|
|
454
|
-
var sourceTarget = el.data.id.split('-');
|
|
455
|
-
el.data.source = sourceTarget[0].trim();
|
|
456
|
-
el.data.target = sourceTarget[1].trim();
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
|
-
if (hasPreviousPositions && el.group == "nodes")
|
|
460
|
-
el.position = positionCache[el.data.id];
|
|
461
|
-
}
|
|
462
|
-
}
|
|
463
|
-
}
|
|
464
|
-
EsDiagramComponent.decorators = [
|
|
465
|
-
{ type: Component, args: [{
|
|
466
|
-
selector: 'es-diagram',
|
|
467
|
-
template: "<div #graph class=\"graph-wrapper {{name}}\"></div>",
|
|
468
|
-
styles: [".graph-wrapper{height:100%;width:100%}.html-node-notransition{transition:none!important;transform:none!important}\n"]
|
|
469
|
-
},] }
|
|
470
|
-
];
|
|
471
|
-
EsDiagramComponent.ctorParameters = () => [
|
|
472
|
-
{ type: EsDiagramService, decorators: [{ type: Optional }] },
|
|
473
|
-
{ type: EsDiagramDispatcher, decorators: [{ type: Optional }] },
|
|
474
|
-
{ type: ReactiveExtensions }
|
|
475
|
-
];
|
|
476
|
-
EsDiagramComponent.propDecorators = {
|
|
477
|
-
cyGraph: [{ type: ViewChild, args: ['graph',] }],
|
|
478
|
-
name: [{ type: Input }],
|
|
479
|
-
UseContextMenu: [{ type: Input }],
|
|
480
|
-
ContextMenuOptions: [{ type: Input }],
|
|
481
|
-
UseExpandCollapse: [{ type: Input }],
|
|
482
|
-
ExpandCollapseOptions: [{ type: Input }],
|
|
483
|
-
NativeOptions: [{ type: Input }],
|
|
484
|
-
Elements: [{ type: Input }],
|
|
485
|
-
NodeStyles: [{ type: Input }],
|
|
486
|
-
EdgeStyles: [{ type: Input }],
|
|
487
|
-
Readonly: [{ type: Input }],
|
|
488
|
-
AutoupdateSize: [{ type: Input }],
|
|
489
|
-
PreserveElementsPosition: [{ type: Input }],
|
|
490
|
-
AnimateLayoutChanges: [{ type: Input }],
|
|
491
|
-
SmartSelection: [{ type: Input }],
|
|
492
|
-
SmartSelectionStyles: [{ type: Input }],
|
|
493
|
-
ResizeThrottleTime: [{ type: Input }],
|
|
494
|
-
Layout: [{ type: Input }],
|
|
495
|
-
NodeHTMLTemplates: [{ type: Input }],
|
|
496
|
-
ExtensionModulesImporter: [{ type: Input }],
|
|
497
|
-
ExtensionModulesApplyer: [{ type: Input }],
|
|
498
|
-
onNodeClick: [{ type: Output }],
|
|
499
|
-
onNodeSelection: [{ type: Output }],
|
|
500
|
-
onLayoutDone: [{ type: Output }],
|
|
501
|
-
onLoaded: [{ type: Output }]
|
|
502
|
-
};
|
|
503
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXMtZGlhZ3JhbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lcy1kaWFncmFtcy9zcmMvbGliL2NvbXBvbmVudHMvZXMtZGlhZ3JhbS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBYSxRQUFRLEVBQUUsTUFBTSxFQUFpQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFnQmpJLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUV0RSxPQUFPLEtBQUssR0FBRyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxjQUFjLENBQUEsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDO0FBRXBDOztHQUVHO0FBTUgsTUFBTSxPQUFPLGtCQUFrQjtJQTBON0I7Ozs7T0FJRztJQUNILFlBQWdDLE9BQXlCLEVBQXNCLFVBQStCLEVBQVUsSUFBd0I7UUFBaEgsWUFBTyxHQUFQLE9BQU8sQ0FBa0I7UUFBc0IsZUFBVSxHQUFWLFVBQVUsQ0FBcUI7UUFBVSxTQUFJLEdBQUosSUFBSSxDQUFvQjtRQXhOaEo7O1dBRUc7UUFDTSxTQUFJLEdBQVcsRUFBRSxDQUFDO1FBRTNCOztXQUVHO1FBQ00sbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFTekM7O1dBRUc7UUFDTSxzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFPNUM7Ozs7V0FJRztRQUNNLGtCQUFhLEdBQStCLEVBQUUsQ0FBQztRQXNCeEQ7O1dBRUc7UUFDTSxtQkFBYyxHQUFZLElBQUksQ0FBQztRQUV4Qzs7OztX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QVE7WUEvT2QsbUJBQW1CLHVCQStPa0MsUUFBUTtZQTVPN0Qsa0JBQWtCOzs7c0JBa0J4QixTQUFTLFNBQUMsT0FBTzttQkFLakIsS0FBSzs2QkFLTCxLQUFLO2lDQU9MLEtBQUs7Z0NBS0wsS0FBSztvQ0FLTCxLQUFLOzRCQU9MLEtBQUs7dUJBS0wsS0FBSzt5QkFLTCxLQUFLO3lCQUtMLEtBQUs7dUJBS0wsS0FBSzs2QkFLTCxLQUFLO3VDQU9MLEtBQUs7bUNBT0wsS0FBSzs2QkFZTCxLQUFLO21DQVdMLEtBQUs7aUNBT0wsS0FBSztxQkFLTCxLQUFLO2dDQU9MLEtBQUs7dUNBbUJMLEtBQUs7c0NBbUJMLEtBQUs7MEJBS0wsTUFBTTs4QkFLTixNQUFNOzJCQUtOLE1BQU07dUJBS04sTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPcHRpb25hbCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5cclxuaW1wb3J0IHsgQ29udGV4dE1lbnVPcHRpb25zIH0gZnJvbSAnLi4vbW9kZWxzL2NvbXBvbmVudC9jb250ZXh0bWVudS9Db250ZXh0TWVudU9wdGlvbnMnO1xyXG5pbXBvcnQgeyBFeHBhbmRDb2xsYXBzZU9wdGlvbnMgfSBmcm9tICcuLi9tb2RlbHMvY29tcG9uZW50L2dyb3VwaW5nL0V4cGFuZENvbGxhcHNlT3B0aW9ucyc7XHJcbmltcG9ydCB7IE5vZGVIVE1MVGVtcGxhdGUgfSBmcm9tICcuLi9tb2RlbHMvY29tcG9uZW50L25vZGVzL05vZGVIVE1MVGVtcGxhdGUnO1xyXG5cclxuaW1wb3J0IHsgQnJlYWR0aEZpcnN0TGF5b3V0T3B0aW9uc0ltcGwgfSBmcm9tICcuLi9tb2RlbHMvbGF5b3V0cy9CcmVhZHRoRmlyc3RMYXlvdXRPcHRpb25zSW1wbCc7XHJcbmltcG9ydCB7IENpcmNsZUxheW91dE9wdGlvbnNJbXBsIH0gZnJvbSAnLi4vbW9kZWxzL2xheW91dHMvQ2lyY2xlTGF5b3V0T3B0aW9uc0ltcGwnO1xyXG5pbXBvcnQgeyBDb25jZW50cmljTGF5b3V0T3B0aW9uc0ltcGwgfSBmcm9tICcuLi9tb2RlbHMvbGF5b3V0cy9Db25jZW50cmljTGF5b3V0T3B0aW9uc0ltcGwnO1xyXG5pbXBvcnQgeyBDb3NlTGF5b3V0T3B0aW9uc0ltcGwgfSBmcm9tICcuLi9tb2RlbHMvbGF5b3V0cy9Db3NlTGF5b3V0T3B0aW9uc0ltcGwnO1xyXG5pbXBvcnQgeyBEYWdyZUxheW91dE9wdGlvbnNJbXBsIH0gZnJvbSAnLi4vbW9kZWxzL2xheW91dHMvRGFncmVMYXlvdXRPcHRpb25zSW1wbCc7XHJcbmltcG9ydCB7IEdyaWRMYXlvdXRPcHRpb25zSW1wbCB9IGZyb20gJy4uL21vZGVscy9sYXlvdXRzL0dyaWRMYXlvdXRPcHRpb25zSW1wbCc7XHJcbmltcG9ydCB7IE51bGxMYXlvdXRPcHRpb25zSW1wbCB9IGZyb20gJy4uL21vZGVscy9sYXlvdXRzL051bGxMYXlvdXRPcHRpb25zSW1wbCc7XHJcbmltcG9ydCB7IFByZXNldExheW91dE9wdGlvbnNJbXBsIH0gZnJvbSAnLi4vbW9kZWxzL2xheW91dHMvUHJlc2V0TGF5b3V0T3B0aW9uc0ltcGwnO1xyXG5pbXBvcnQgeyBSYW5kb21MYXlvdXRPcHRpb25zSW1wbCB9IGZyb20gJy4uL21vZGVscy9sYXlvdXRzL1JhbmRvbUxheW91dE9wdGlvbnNJbXBsJztcclxuXHJcbmltcG9ydCB7IEVzRGlhZ3JhbVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9lcy1kaWFncmFtLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFc0RpYWdyYW1EaXNwYXRjaGVyIH0gZnJvbSAnLi4vc2VydmljZXMvZXMtZGlhZ3JhbS5kaXNwYXRjaGVyJztcclxuaW1wb3J0IHsgUmVzaXplU2Vuc29yIH0gZnJvbSBcIi4uL2V4dGVuc2lvbnMvUmVzaXplU2Vuc29yXCI7XHJcblxyXG5pbXBvcnQgeyBSZWFjdGl2ZUV4dGVuc2lvbnMgfSBmcm9tICcuLi9leHRlbnNpb25zL1JlYWN0aXZlRXh0ZW5zaW9ucyc7XHJcblxyXG5pbXBvcnQgKiBhcyBjeV8gZnJvbSAnY3l0b3NjYXBlJztcclxuLyoqIEBpZ25vcmUgKi9jb25zdCBjeXRvc2NhcGUgPSBjeV87XHJcblxyXG4vKipcclxuICogQ29tcG9uZW50ZSBjaGUgc2kgb2NjdXBhIGRpIGdyYWZpY2FyZSB1biBkaWFncmFtbWEgZSBkaSBnZXN0aXJuZSBpbCBjaWNsbyBkaSB2aXRhXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2VzLWRpYWdyYW0nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9lcy1kaWFncmFtLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9lcy1kaWFncmFtLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEVzRGlhZ3JhbUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XHJcblxyXG4gIC8qKlxyXG4gICAqIFJpZmVyaW1lbnRvIGFsbCdvZ2dldHRvIEhUTUwgc3UgY3VpIGNyZWFyZSBpbCBkaWFncmFtbWFcclxuICAgKi9cclxuICBAVmlld0NoaWxkKCdncmFwaCcpIGN5R3JhcGg6IEVsZW1lbnRSZWY7XHJcblxyXG4gIC8qKlxyXG4gICAqIE5vbWUgZGVsIGRpYWdyYW1tYSwgZm9uZGFtZW50YWxlIGFzc2VnbmFybG8gcGVyIHBlcm1ldHRlcmUgYWxsYSBsaWJyZXJpYSBkaSBzY2hlZHVsYXJuZSBsYSBjcmVhemlvbmVcclxuICAgKi9cclxuICBASW5wdXQoKSBuYW1lOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAvKipcclxuICAgKiBJbmRpY2Egc2UgdXRpbGl6emFyZSBpbCBtZW7DuSBjb250ZXN0dWFsZSBhIHJ1b3RhIGF0dG9ybm8gYWQgb2duaSBub2RvXHJcbiAgICovXHJcbiAgQElucHV0KCkgVXNlQ29udGV4dE1lbnU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogSW5kaWNhIGxlIG9wemlvbmkgZGVsIG1lbsO5IGNvbnRlc3R1YWxlIHF1YWxvcmEgKipVc2VDb250ZXh0TWVudSoqIGZvc3NlICoqdHJ1ZSoqLlxyXG4gICAqIFxyXG4gICAqIE9nbmkgZWxlbWVudG8gZGkgcXVlc3RvIGFycmF5IMOoIHVuIHNlbGV0dG9yZSBjb24gaWwgbWVudSBkYSBtb3N0cmFyZSBwZXIgcXVlbGxhIGNhc2lzdGljYVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIENvbnRleHRNZW51T3B0aW9uczogQ29udGV4dE1lbnVPcHRpb25zW107XHJcblxyXG4gIC8qKlxyXG4gICAqIERpY2UgYWwgY29tcG9uZW50ZSBzZSBpbCBkaWFncmFtbWEgZGV2ZSB1dGlsaXp6YXJlIGlsIHNpc3RlbWEgZGkgZXN0ZW5zaW9uZSBwZXIgbCdleHBhbmQgZSBjb2xsYXBzZSBkZWkgZ3J1cHBpXHJcbiAgICovXHJcbiAgQElucHV0KCkgVXNlRXhwYW5kQ29sbGFwc2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogT3B6aW9uaSBuYXRpdmUgZGVsbCdlc3RlbnNpb25lIGV4cGFuZC1jb2xsYXBzZSwgdmVuZ29ubyBvdnZpYW1lbnRlIHV0aWxpenphdGUgc29sbyBzZSAqKlVzZUV4cGFuZENvbGxhcHNlKiogw6ggKip0cnVlKipcclxuICAgKi9cclxuICBASW5wdXQoKSBFeHBhbmRDb2xsYXBzZU9wdGlvbnM6IEV4cGFuZENvbGxhcHNlT3B0aW9ucztcclxuXHJcbiAgLyoqXHJcbiAgICogQmxvY2NvIGNvbXBsZXRvIGRlbGxlIG9wemlvbmksIGFsdGVybmF0aXZvIGFsbCdhc3NlZ25hemlvbmUgZGkgKipFbGVtZW50cyoqLCAqKk5vZGVTdHlsZXMqKiwgKipFZGdlU3R5bGVzKiosIGUgKipMYXlvdXQqKi5cclxuICAgKiBcclxuICAgKiBRdWFsb3JhIGVudHJhbWJlIHZlbmlzc2VybyBzcGVjaWZpY2F0ZSB2ZXJyw6AgZWZmZXR0dWF0YSB1bid1bmlvbmUgZnJhIHF1ZXN0ZSBvcHppb25pIGUgcXVlbGxlIHNwZWNpZmljYXRlLCBkYW5kbyBwcmlvcml0w6AgYWxsZSBzcGVjaWZpY2F0ZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIE5hdGl2ZU9wdGlvbnM6IGN5dG9zY2FwZS5DeXRvc2NhcGVPcHRpb25zID0ge307XHJcblxyXG4gIC8qKlxyXG4gICAqIERlZmluaXppb25lIGRlZ2xpIGVsZW1lbnRpIGRhIG1vc3RyYXJlIG5lbCBkaWFncmFtbWFcclxuICAgKi9cclxuICBASW5wdXQoKSBFbGVtZW50czogY3l0b3NjYXBlLkVsZW1lbnREZWZpbml0aW9uW107XHJcblxyXG4gIC8qKlxyXG4gICAqIERlZmluaXppb25lIGRlZ2xpIHN0aWxpIGRlaSBub2RpXHJcbiAgICovXHJcbiAgQElucHV0KCkgTm9kZVN0eWxlczogY3l0b3NjYXBlLkNzcy5Ob2RlO1xyXG5cclxuICAvKipcclxuICAgKiBEZWZpbml6aW9uZSBkZWdsaSBzdGlsaSBkZWkgY29sbGVnYW1lbnRpIGZyYSBpIG5vZGlcclxuICAgKi9cclxuICBASW5wdXQoKSBFZGdlU3R5bGVzOiBjeXRvc2NhcGUuQ3NzLkVkZ2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIEluIHVuIGRpYWdyYW1tYSBpbiBzb2xhIGxldHR1cmEgdHV0dGUgbGUgaW50ZXJhemlvbmkgdXRlbnRlIHNvbm8gYW5udWxsYXRlXHJcbiAgICovXHJcbiAgQElucHV0KCkgUmVhZG9ubHk6IGJvb2xlYW47XHJcblxyXG4gIC8qKlxyXG4gICAqIEFnZ2lvcm5hIGF1dG9tYXRpY2FtZW50ZSBsZSBkaW1lbnNpb25pIGRlbCBkaWFncmFtbWEgcXVhbmRvIGNhbWJpYW5vIGxlIGRpbWVuc2lvbmkgZGVsbGEgZmluZXN0cmFcclxuICAgKi9cclxuICBASW5wdXQoKSBBdXRvdXBkYXRlU2l6ZTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8qKlxyXG4gICAqIEluZGljYSBkaSBtYW50ZW5lcmUgbGEgcG9zaXppb25lIGRlaSBub2RpIHF1YWxvcmEgdmVuaXNzZXJvIGNhbWJpYXRpIGRhbGwnSW5wdXQgKipFbGVtZW50cyoqLlxyXG4gICAqIFxyXG4gICAqIFNlIGwnSUQgZGkgdW4gbm9kbyDDqCB1Z3VhbGUgYWxsJ0lEIGRpIHVuIG5vZG8gcHJlc2VudGUgaW4gcHJlY2VkZW56YSwgaWwgbnVvdm8gbm9kbyBuZSBlcmVkaXRlcsOgIGxhIHBvc2l6aW9uZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIFByZXNlcnZlRWxlbWVudHNQb3NpdGlvbjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8qKlxyXG4gICAqIFF1YWxvcmEgdmVuaXNzZSBtb2RpZmljYXRvIGwnSW5wdXQgKipFbGVtZW50cyoqLCBwaXV0dG9zdG8gY2hlIG1ldHRlcmUgc2VtcGxpY2VtZW50ZSBpbCBudW92byBFbGVtZW50byBpbiBiYXNlIGFsIExheW91dCBwcmVjZWRlbnRlLCBhcHBsaWNhIGFuY2hlIHVuJ2FuaW1hemlvbmUgXHJcbiAgICogXHJcbiAgICogRnVuemlvbmEgc29sYW1lbnRlIHNlIGlsICoqTGF5b3V0KiogY29ycmVudGUgZGVsIGRpYWdyYW1tYSBzdXBwb3J0YSBsZSBhbmltYXppb25pXHJcbiAgICovXHJcbiAgQElucHV0KCkgQW5pbWF0ZUxheW91dENoYW5nZXM6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvKipcclxuICAgKiBBdHRpdmEgdW5hIG1vZGFsaXTDoCBkaSBzZWxlemlvbmUgXCJzbWFydFwiLi4uIG8gcGVybG9tZW5vIFwic21hcnRlclwiIGRlbCBkZWZhdWx0IGRpIEN5dG9zY2FwZS5cclxuICAgKiBcclxuICAgKiAtIElsIGNsaWNrIGRpIHVuIGVsZW1lbnRvIG5vbiBzZWxlemlvbmF0byBsbyBzZWxlemlvbmFcclxuICAgKiAtIElsIGNsaWNrIGRpIHVuIGVsZW1lbnRvIHNlbGV6aW9uYXRvIGxvIGRlc2VsZXppb25hXHJcbiAgICogLSBMbyBzdGF0byBkaSBzZWxlemlvbmUgdmllbmUgcGVyc2lzdGl0byBzdWxsJ29nZ2V0dG8gb3JpZ2luYWxlIGludmVjZSBkaSByaW1hbmVyZSBpbiB1biBpbnRlcm5hbFxyXG4gICAqIC0gQWxsJ2Fzc2VnbmF6aW9uZSBkaSBvZ2dldHRpIHNlbGV6aW9uYXRpLCBxdWVzdGkgdmVuZ29ubyBtYXJjYXRpIGNvcnJldHRhbWVudGUgY29uIGwnb3ZlcmxheSBkaSBzZWxlemlvbmVcclxuICAgKiBcclxuICAgKiBOLkI6IGxhIGNoaWFtYXRhIGFsbCdldmVudG8gKipvbk5vZGVDbGljayoqIGF2dmllbmUgKipET1BPKiogbGEgZ2VzdGlvbmUgZGVsbGEgc2VsZXppb25lXHJcbiAgICovXHJcbiAgQElucHV0KCkgU21hcnRTZWxlY3Rpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogQ1NTIHBlciBsYSBncmFmaWNhemlvbmUgZGVsbGEgc2VsZXppb25lIGRlaSBub2RpLiBRdWFuZG8gdW4gbm9kbyB2ZXJyw6Agc2VsZXppb25hdG8gYXZyw6Agc29wcmEgZGkgc2UgdW4gb3ZlcmxheSBjaGUgJ3Nib3JkYScgZGkgKipvdmVybGF5LXBhZGRpbmcqKiBwaXhlbCxcclxuICAgKiBkaSBjb2xvcmUgKipvdmVybGF5LWNvbG9yKiogZSBjb24gdW4gb3BhY2l0w6AgKipvdmVybGF5LW9wYWNpdHkqKlxyXG4gICAqIFxyXG4gICAqIEFzc2VnbmFuZG8gXCJ7fVwiIGEgcXVlc3RvIGlucHV0LCBsYSBTbWFydCBzZWxlY3Rpb24gdmllbmUgZ2VzdGl0YSBtYSBsYSBnZXN0aW9uZSBncmFmaWNhIMOoIGFmZmlkYXRhIGFsbCd1dGVudGUsXHJcbiAgICogYWQgZXNlbXBpbyB1c2FuZG8gZGVpICoqTm9kZUhUTUxUZW1wbGF0ZXMqKiBjaGUgZGVmaW5pc2Nhbm8gc2VsZXR0b3JpIHN1IG5vZGkgXCI6c2VsZWN0ZWRcIlxyXG4gICAqIFxyXG4gICAqIEBkZWZhdWx0IHsnb3ZlcmxheS1jb2xvcic6J2JsdWUnLCdvdmVybGF5LW9wYWNpdHknOjAuNSwnb3ZlcmxheS1wYWRkaW5nJzo3fVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIFNtYXJ0U2VsZWN0aW9uU3R5bGVzOiB7ICdvdmVybGF5LWNvbG9yJzogc3RyaW5nLCAnb3ZlcmxheS1vcGFjaXR5JzogbnVtYmVyLCAnb3ZlcmxheS1wYWRkaW5nJzogbnVtYmVyIH0gPSBudWxsXHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcmlvZG8gZGkgdGhyb3R0bGUgZGEgcXVhbmRvIHZpZW5lIGVmZmV0dHVhdG8gdW4gcmVzaXplIGEgcXVhbmRvIHJpY2FsY29sYXJlIGxlIGRpbWVuc2lvbmkgZGVsIGRpYWdyYW1tYS5cclxuICAgKiBcclxuICAgKiBQdcOyIGVzc2VyZSB0ZW51dG8gYSAwIChyZWRyYXcgaXN0YW50YW5lbykgZmluY2jDqSBub24gY2kgc29ubyBwcm9ibGVtaSBkaSBwcmVzdGF6aW9uaSBjb24gZXZlbnR1YWxtZW50ZSB0YW50aSByZXNpemUgYSBwb2NhIGRpc3RhbnphIGwndW5vIGRhbGwnYWx0cm8uXHJcbiAgICovXHJcbiAgQElucHV0KCkgUmVzaXplVGhyb3R0bGVUaW1lOiBudW1iZXIgPSAwO1xyXG5cclxuICAvKipcclxuICAgKiBMYXlvdXQgZGkgb3JkaW5hbWVudG8gZGVpIG5vZGlcclxuICAgKi9cclxuICBASW5wdXQoKSBMYXlvdXQ6IEJyZWFkdGhGaXJzdExheW91dE9wdGlvbnNJbXBsIHwgQ2lyY2xlTGF5b3V0T3B0aW9uc0ltcGwgfCBDb25jZW50cmljTGF5b3V0T3B0aW9uc0ltcGwgfFxyXG4gICAgQ29zZUxheW91dE9wdGlvbnNJbXBsIHwgRGFncmVMYXlvdXRPcHRpb25zSW1wbCB8IEdyaWRMYXlvdXRPcHRpb25zSW1wbCB8IE51bGxMYXlvdXRPcHRpb25zSW1wbCB8IFByZXNldExheW91dE9wdGlvbnNJbXBsIHxcclxuICAgIFJhbmRvbUxheW91dE9wdGlvbnNJbXBsO1xyXG5cclxuICAvKipcclxuICAgKiBUZW1wbGF0ZSBIVE1MIGRhIGFwcGxpY2FyZSBhaSBub2RpIHBlciBkYXJnbGkgc3RpbGkgcGFydGljb2xhcmksIGRpdmVyc2kgZGFsbGUgc2hhcGUgZGkgZGVmYXVsdFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIE5vZGVIVE1MVGVtcGxhdGVzOiBOb2RlSFRNTFRlbXBsYXRlW107XHJcblxyXG4gIC8qKlxyXG4gICAqIEZvcm5pc2NlIGlsIGdsb2JhbCBkZWxsYSBsaWJyZXJpYSAobmFtZXNwYWNlICoqY3l0b3NjYXBlKiopIGUgc2kgYXNwZXR0YSBjaGUgZG9wbyBvcGVyYXppb25pIGRpIGltcG9ydGF6aW9uZSBcclxuICAgKiBsYXNjaWF0ZSBhbGwndXRlbnRlIHZlbmdhbm8gYWdnaXVudGkgdHV0dGkgaSBtb2R1bGkgZGVzaWRlcmF0aS4gXHJcbiAgICogXHJcbiAgICogw4ggKipmb25kYW1lbnRhbGUqKiBjaGUgaWwgcHJpbW8gcGFyYW1ldHJvIChpbCBub21lIGRlbCBtb2R1bG8pIHNpYSB1Z3VhbGUgYSBjacOyIGRpIGN1aSB2aWVuZSBmYXR0byBpbCByZXF1aXJlIGluIG1vZG8gY2hlIGxhIGxpYnJlcmlhXHJcbiAgICogcG9zc2EgY29udHJvbGxhcmUgY2hlIGlsIG1vZHVsbyBpbXBvcnRhdG8gbm9uIHNpYSBnacOgIHN0YXRvIGltcG9ydGF0byBpbiBwcmVjZWRlbnphXHJcbiAgICogXHJcbiAgICogIyMgRXNlbXBpbzpcclxuICAgKiBcclxuICAgKiBgYGB0eXBlc2NyaXB0XHJcbiAgICogKGdsb2JhbCkgPT4ge1xyXG4gICAqICAgIHJldHVybiBpbXBvcnQoXCJjeXRvc2NhcGUtZXh0ZW5zaW9uLWxpYnJhcnlcIikudGhlbihtb2R1bGUgPT4gZ2xvYmFsLnVzZShcImN5dG9zY2FwZS1leHRlbnNpb24tbGlicmFyeVwiLCBtb2R1bGUuZGVmYXVsdCkpO1xyXG4gICAqIFxyXG4gICAqICAgIC4uLlxyXG4gICAqIH1cclxuICAgKiBgYGBcclxuICAgKi9cclxuICBASW5wdXQoKSBFeHRlbnNpb25Nb2R1bGVzSW1wb3J0ZXI6IChnbG9iYWw6IHsgdXNlOiAobW9kdWxlTmFtZTogc3RyaW5nLCBtb2R1bGU6IHZvaWQgfCBjeXRvc2NhcGUuRXh0KSA9PiB2b2lkIH0pID0+IFByb21pc2U8YW55PiA9IG51bGw7XHJcblxyXG4gIC8qKlxyXG4gICAqIEZvcm5pc2NlIGwnaXN0YW56YSBhdHR1YWxlIGRpIEN5dG9zY2FwZSBkYSBjdWkgw6ggcG9zc2liaWxlIHByZW5kZXJlIGxlIGxpYnJlcmllIGRpIGVzdGVuc2lvbmUgY2FyaWNhdGUgaW4gKipFeHRlbnNpb25Nb2R1bGVzSW1wb3J0ZXIqKlxyXG4gICAqIGUgY29uZmlndXJhcmxlIGluIGJhc2UgYWkgY29tcG9ydGFtZW50aSBzcGVjaWZpY2lcclxuICAgKiBcclxuICAgKiAjIyBFc2VtcGlvOlxyXG4gICAqIFxyXG4gICAqIGBgYHR5cGVzY3JpcHRcclxuICAgKiAoY3l0b3NjYXBlQ29yZSkgPT4ge1xyXG4gICAqICAgIC8vIEZhcmUgcXVlc3RvIGxhdm9ybyBwZXIgb2duaSBlc3RlbnNpb25lIGNhcmljYXRhXHJcbiAgICogICAgbGV0IGV4dGVuc2lvbkNvbmZpZ3VyYXRpb24gPSB7IC4uLiB9O1xyXG4gICAqICAgIGxldCBleHRlbnNpb25JbnN0YW5jZSA9IGN5dG9zY2FwZUNvcmUuZXh0ZW5zaW9uTGlicmFyeShleHRlbnNpb25Db25maWd1cmF0aW9uKTtcclxuICAgKiAgICBleHRlbnNpb25JbnN0YW5jZS5kb1NvbWV0aGluZ1NwZWNpZmljVG9UaGlzRXh0ZW5zaW9uKCk7XHJcbiAgICogXHJcbiAgICogICAgLi4uXHJcbiAgICogfVxyXG4gICAqIGBgYFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIEV4dGVuc2lvbk1vZHVsZXNBcHBseWVyOiAoY3l0b3NjYXBlQ29yZTogY3l0b3NjYXBlLkNvcmUpID0+IHZvaWQgPSBudWxsO1xyXG5cclxuICAvKipcclxuICAgKiBFdmVudG8gbGFuY2lhdG8gYWwgY2xpY2sgZGkgdW4gbm9kbywgY29udGllbmUgbCdvZ2dldHRvICoqZGF0YSoqIGRlbCBub2RvIGluIHF1ZXN0aW9uZVxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKSBvbk5vZGVDbGljazogRXZlbnRFbWl0dGVyPHsgZGF0YTogYW55IH0+ID0gbmV3IEV2ZW50RW1pdHRlcjx7IGRhdGE6IGFueSB9PigpO1xyXG5cclxuICAvKipcclxuICAgKiBFdmVudG8gbGFuY2lhdG8gYWxsYSBzZWxlemlvbmUgbyBkZXNlbGV6aW9uZSBkaSB1biBub2RvLCBjb250aWVuZSBsJ29nZ2V0dG8gKipkYXRhKiogZGVsIG5vZG8gaW4gcXVlc3Rpb25lIGUgaW5mb3JtYXppb25pIHN1bCBzdW8gc3RhdG8gZGkgc2VsZXppb25lXHJcbiAgICovXHJcbiAgQE91dHB1dCgpIG9uTm9kZVNlbGVjdGlvbjogRXZlbnRFbWl0dGVyPHsgZGF0YTogYW55LCBzZWxlY3RlZDogYm9vbGVhbiB9PiA9IG5ldyBFdmVudEVtaXR0ZXI8eyBkYXRhOiBhbnksIHNlbGVjdGVkOiBib29sZWFuIH0+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEV2ZW50byBsYW5jaWF0byBhbCB0ZXJtaW5lIGRlbCBMYXlvdXRpbmcuIFNlIHNpIHZ1b2xlIGVzZWd1aXJlIGNvZGljZSBkb3BvIGNoZSBpbCBMYXlvdXQgw6ggZmF0dG8gZSBjb21wbGV0YW1lbnRlIGdyYWZpY2F0bywgcXVlc3RvIMOoIGlsIHB1bnRvXHJcbiAgICovXHJcbiAgQE91dHB1dCgpIG9uTGF5b3V0RG9uZTogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAvKipcclxuICAgKiBFdmVudG8gbGFuY2lhdG8gYWwgdGVybWluZSBkZWwgY2FyaWNhbWVudG8gZGVsIGRpYWdyYW1tYVxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKSBvbkxvYWRlZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAvKipcclxuICAgKiBWYXJpYWJpbGUgc3UgY3VpIHNhbHZhcnNpIHNlIGkgbm9kaSBoYW5ubyB1bmEgZ2VyYXJjaGlhIGEgZ3J1cHBpIG8gbm8uIFNlcnZlIHBlciBwb2kgY2FyaWNhcmUgbCdlc3RlbnNpb25lIGV4cGFuZC1jb2xsYXBzZSBxdWFsb3JhIGZvc3NlIHJpY2hpZXN0YVxyXG4gICAqL1xyXG4gIHByaXZhdGUgTm9kZXNIaWVyYXJjaHk6IGJvb2xlYW47XHJcblxyXG4gIC8qKlxyXG4gICAqIEluZGljYSBzZSBpbCByZW5kZXJpbmcgZGVsIGRpYWdyYW1tYSDDqCB0ZXJtaW5hdG9cclxuICAgKi9cclxuICBwcml2YXRlIFJlbmRlcmVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIElzdGFuemEgZGVsIGRpYWdyYW1tYSBhdHR1YWxtZW50ZSBpbiB1c29cclxuICAgKi9cclxuICBwdWJsaWMgY3k6IGN5dG9zY2FwZS5Db3JlXHJcblxyXG4gIC8qKlxyXG4gICAqIEFwaSBkZWxsJ2VzdGVuc2lvbmUgZXhwYW5kLWNvbGxhcHNlIHBlciBwZXJtZXR0ZXJlIGRpIGVmZmV0dHVhcmUgb3BlcmF6aW9uaSBkYWxsJ2VzdGVybm8gZGVsIGRpYWdyYW1tYS4gVmVuZ29ubyB2YWxvcml6emF0ZSBzZSAqKlVzZUV4cGFuZENvbGxhcHNlKiogw6ggKip0cnVlKipcclxuICAgKi9cclxuICBwdWJsaWMgRXhwYW5kQ29sbGFwc2VBcGk6IGFueSA9IG51bGw7XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwaSBkZWxsJ2VzdGVuc2lvbmUgaHRtbC1ub2RlIHBlciBwZXJtZXR0ZXJlIGRpIGVmZmV0dHVhcmUgb3BlcmF6aW9uaSBkYWxsJ2VzdGVybm8gZGVsIGRpYWdyYW1tYS4gVmVuZ29ubyB2YWxvcml6emF0ZSBzZSBzb25vIGltcG9zdGF0aSBkZWkgKipOb2RlSFRNTFRlbXBsYXRlcyoqXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBIdG1sTm9kZUFwaTogYW55ID0gbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogT3NzZXJ2YXRvcmUgZGVsbGUgbW9kaWZpY2hlIGFsIGNvbnRlbml0b3JlIGRlbCBkaWFncmFtbWFcclxuICAgKi9cclxuICBwcml2YXRlIHJlc2l6ZU9ic2VydmVyOiBSZXNpemVTZW5zb3I7XHJcblxyXG4gIC8qKlxyXG4gICAqIFJpZmVyaW1lbnRvIGFsbCd1bHRpbW8gbGF5b3V0IHV0aWxpenphdG8uIFZpZW5lIHJpYXBwbGljYXRvIHF1YWxvcmEgdmVuaXNzZSBjYW1iaWF0byBsJ0lucHV0ICoqRWxlbWVudHMqKi5cclxuICAgKiBcclxuICAgKiBOb24gdXRpbGl6em8gaWwgbWFrZUxheW91dHMgcGVyY2jDqSBhbHRyaW1lbnRpIHJpc2NoaWVyZWkgZGkgY3JlYXJlIHVuIGxheW91dCByaWZlcml0byBhIFggZWxlbWVudGksIG5lIGFnZ2l1bmdvIDEsIHJpYXBwbGljbyBpbCBMYXlvdXQgXHJcbiAgICogbWEgbWkgdmllbmUgcmlhcHBsaWNhdG8gYSBYIGVsZW1lbnRpIGludmVjZSBjaGUgWCArIDFcclxuICAgKi9cclxuICBwcml2YXRlIExhc3RMYXlvdXQ6IGN5dG9zY2FwZS5MYXlvdXRPcHRpb25zO1xyXG5cclxuICAvKipcclxuICAgKiBDb3N0cnV0dG9yZVxyXG4gICAqIFxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBwcml2YXRlIHNlcnZpY2U6IEVzRGlhZ3JhbVNlcnZpY2UsIEBPcHRpb25hbCgpIHByaXZhdGUgZGlzcGF0Y2hlcjogRXNEaWFncmFtRGlzcGF0Y2hlciwgcHJpdmF0ZSBleHRzOiBSZWFjdGl2ZUV4dGVuc2lvbnMpIHsgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlIFxyXG4gICAqIFxyXG4gICAqIEFuZ3VsYXIgUGlwZWxpbmVcclxuICAgKi9cclxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgaWYgKCF0aGlzLnNlcnZpY2UgfHwgIXRoaXMuZGlzcGF0Y2hlcilcclxuICAgICAgdGhyb3cgXCJJbCBtb2R1bG8gQGVzZmFlbnphL2RpYWdyYW1zIG5vbiDDqCBzdGF0byBpbXBvcnRhdG8gY29uIGlsIGZvclJvb3QoKTtcIjtcclxuXHJcbiAgICB0aGlzLmRpc3BhdGNoTG9hZENoYXJ0KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBbGwnb25EZXN0cm95IHJpcHVsaXNjbyBsYSBtZW1vcmlhIGRhbCBkaWFncmFtbWFcclxuICAgKi9cclxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLmRpc3Bvc2UoKTtcclxuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBudWxsO1xyXG5cclxuICAgIGlmICh0aGlzLmN5KSB7XHJcbiAgICAgIHRoaXMuc2VydmljZS5sb2coXCJJXCIsIFwiRGlhZ3JhbVwiICsgXCIgXCIgKyB0aGlzLm5hbWUgKyBcIjogVW5sb2FkaW5nIGRlc3Ryb3llZCBkaWFncmFtXCIsIGZhbHNlKTtcclxuICAgICAgdGhpcy5jeS5kZXN0cm95KCk7XHJcbiAgICAgIHRoaXMuZGlzcGF0Y2hlci5kZXJlZ2lzdGVyKHRoaXMubmFtZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuc2VydmljZS5sb2coXCJJXCIsIFwiQ2hhcnQgXCIgKyB0aGlzLm5hbWUgKyBcIjogVW5sb2FkaW5nIHVuY3JlYXRlZCBjaGFydCBjb21wb25lbnQuIEl0IHByb2JhYmx5IHdhcyBhIGR1cGxpY2F0ZWRcIiwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVnaXN0cmEgaWwgZGlhZ3JhbW1hIGF0dHVhbGUgbmVsIERpc3BhdGNoZXIgaW4gbW9kbyBjaGUgdmVuZ2EgY2FyaWNhdG8gYXBwZW5hIHBvc3NpYmlsZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZGlzcGF0Y2hMb2FkQ2hhcnQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmRpc3BhdGNoZXIucmVnaXN0ZXIodGhpcy5uYW1lLCAoKSA9PiB7IHJldHVybiB0aGlzLnJlbmRlcigpOyB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmUgXHJcbiAgICogXHJcbiAgICogQW5ndWxhciBQaXBlbGluZTogR2VzdGlvbmUgcmktZ3JhZmljYXppb25lIGRlbCBkaWFncmFtbWEsIHNlIHBvc3NpYmlsZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogYW55IHtcclxuICAgIGxldCB0b0NoZWNrID0gW1wiVGVtcGxhdGVzXCIsIFwiVXNlQ29udGV4dE1lbnVcIiwgXCJDb250ZXh0TWVudU9wdGlvbnNcIiwgXCJVc2VFeHBhbmRDb2xsYXBzZVwiLCBcIkV4cGFuZENvbGxhcHNlT3B0aW9uc1wiLCBcIk5vZGVTdHlsZXNcIiwgXCJFZGdlU3R5bGVzXCIsIFwiTmF0aXZlT3B0aW9uc1wiXTtcclxuXHJcbiAgICBpZiAodGhpcy5SZW5kZXJlZCAmJiB0b0NoZWNrLnNvbWUodCA9PiBjaGFuZ2VzW3RdKSlcclxuICAgICAgdGhpcy5zZXJ2aWNlLmxvZyhcIldcIiwgXCJSZWRyYXcgYmFzZWQgb24gZHluYW1pYyBJbnB1dCBjaGFuZ2UgaXMgc3VwcG9ydGVkIG9ubHkgZm9yICdFbGVtZW50cycgYW5kICdMYXlvdXQnIGlucHV0cywgcGxlYXNlIGRlc3Ryb3kgdGhlIGNvbXBvbmVudCBhbmQgcmVjcmVhdGUgaXQgd2l0aCB0aGUgbmV3IHNldHRpbmdzXCIpO1xyXG5cclxuICAgIGxldCBlbGVtZW50Q2hhbmdlcyA9IGNoYW5nZXNbXCJFbGVtZW50c1wiXTtcclxuICAgIGxldCBsYXlvdXRDaGFuZ2VzID0gY2hhbmdlc1tcIkxheW91dFwiXTtcclxuICAgIGlmIChlbGVtZW50Q2hhbmdlcyAmJiAhZWxlbWVudENoYW5nZXMuZmlyc3RDaGFuZ2UpIHtcclxuICAgICAgdGhpcy5zZXJ2aWNlLmxvZyhcIklcIiwgXCJFbGVtZW50cyBoYXZlIGJlZW4gY2hhbmdlZCBhZnRlciBkaWFncmFtIGluaXRpYWxpemF0aW9uXCIpO1xyXG5cclxuICAgICAgLy8gQ2FtYmlhbWVudG8gYWdsaSBFbGVtZW50aTogcmlwdWxpc2NvIGdsaSBlbGVtZW50aSB2ZWNjaGksIHByZW5kbyBpIG51b3ZpLCBsaSBzaXN0ZW1vIGUgbGkgcmlhc3NlZ25vLiBcclxuICAgICAgLy8gU2UgaWwgbnVvdm8gSW5wdXQgRWxlbWVudHMgw6ggcm9iYSBzdHJhbmEgbWkgbGltaXRvIGEgcmlwdWxpcmUgaWwgZGlhZ3JhbW1hXHJcbiAgICAgIC8vIFNlIGN5dG9zY2FwZSBhdmV2YSBnacOgIGRlZ2xpIGVsZW1lbnRpIHByZWNlZGVudGVtZW50ZSBuZSBwcmVuZG8gbGUgcG9zaXppb25pIGluIG1vZG8gZGEgcmlkaXNlZ25hcmxpIHBhcnRlbmRvIGRhbGxvIHN0ZXNzbyBwdW50byAoY2FyaW5vIHBlciBsZSBhbmltYXppb25pKVxyXG4gICAgICBsZXQgZWxlbWVudHMgPSBlbGVtZW50Q2hhbmdlcz8uY3VycmVudFZhbHVlO1xyXG4gICAgICBsZXQgcHJldmlvdXNfZWxlbWVudHMgPSB0aGlzLlByZXNlcnZlRWxlbWVudHNQb3NpdGlvbiA/IDxhbnk+dGhpcy5jeS5ub2RlcygpIDogbnVsbDtcclxuXHJcbiAgICAgIHRoaXMuY3kuZWxlbWVudHMoKS5yZW1vdmUoKTtcclxuICAgICAgaWYgKGVsZW1lbnRzICYmIGVsZW1lbnRzLmxlbmd0aCAmJiBlbGVtZW50cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5yZXZpZXdDeXRvc2NhcGVFbGVtZW50cyhlbGVtZW50cywgcHJldmlvdXNfZWxlbWVudHMpO1xyXG4gICAgICAgIHRoaXMuY3kuYWRkKGVsZW1lbnRzKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuU21hcnRTZWxlY3Rpb24pXHJcbiAgICAgICAgICB0aGlzLnNldHVwRWxlbWVudHNTZWxlY3Rpb25JZk5lZWRlZCgpO1xyXG5cclxuICAgICAgICAvLyBTZSBzb2xvIGdsaSBlbGVtZW50aSBjYW1iaWFubywgcmlhcHBsaWNvIGlsIExheW91dCBwcmVjZWRlbnRlXHJcbiAgICAgICAgaWYgKCFsYXlvdXRDaGFuZ2VzICYmIHRoaXMuTGFzdExheW91dCkge1xyXG5cclxuICAgICAgICAgIC8vIFNlIGRldm8gYW5pbWFyZSBsZSBtb2RpZmNoZSBhbCBsYXlvdXQgZm9yem8gaWwgcGFyYW1ldHJvIHJlbGF0aXZvXHJcbiAgICAgICAgICBpZiAodGhpcy5BbmltYXRlTGF5b3V0Q2hhbmdlcylcclxuICAgICAgICAgICAgKDxhbnk+dGhpcy5MYXN0TGF5b3V0KS5hbmltYXRlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICB0aGlzLmN5LmxheW91dCh0aGlzLkxhc3RMYXlvdXQpLnJ1bigpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFNlIGlsIGxheW91dCBjYW1iaWEgbG8gYXBwbGljbyBlIG1lIGxvIHNhbHZvIGNvbWUgbGF5b3V0IHByZWNlZGVudGUgcGVyIGlsIGZ1dHVyb1xyXG4gICAgaWYgKGxheW91dENoYW5nZXMgJiYgIWxheW91dENoYW5nZXMuZmlyc3RDaGFuZ2UpIHtcclxuICAgICAgdGhpcy5zZXJ2aWNlLmxvZyhcIklcIiwgXCJMYXlvdXQgaGF2ZSBiZWVuIGNoYW5nZWQgYWZ0ZXIgZGlhZ3JhbSBpbml0aWFsaXphdGlvblwiKTtcclxuICAgICAgdGhpcy5MYXN0TGF5b3V0ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsYXlvdXRDaGFuZ2VzLmN1cnJlbnRWYWx1ZSkpO1xyXG4gICAgICB0aGlzLmN5LmxheW91dCh0aGlzLkxhc3RMYXlvdXQpLnJ1bigpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFZmZldHR1YSBpbCByZW5kZXJpbmcgZGVsIGRpYWdyYW1tYVxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgcmVuZGVyKCkge1xyXG5cclxuICAgIC8vIFRpcm8gZnVvcmkgbGUgb3B6aW9uaSBjb24gY3VpIGdlbmVyYXJlIGlsIGRpYWdyYW1tYVxyXG4gICAgbGV0IGN5T3B0aW9ucyA9IHRoaXMuZ2V0Q29tcGxldGVkT3B0aW9ucygpO1xyXG4gICAgdGhpcy5Ob2Rlc0hpZXJhcmNoeSA9IGN5T3B0aW9ucy5lbGVtZW50cyAmJiAoPGN5Xy5FbGVtZW50RGVmaW5pdGlvbltdPmN5T3B0aW9ucy5lbGVtZW50cykuc29tZSh0ID0+IHQuZGF0YS5wYXJlbnQpO1xyXG5cclxuICAgIC8vIENhcmljbyBldmVudHVhbGkgY2xhc3NpIGRpIGVzdGVuc2lvbmUgY2hlIHNlcnZvbm9cclxuICAgIGF3YWl0IHRoaXMucGVyZm9ybU1vZHVsZXNMb2FkaW5nKCk7XHJcblxyXG4gICAgLy8gR2VuZXJvIGlsIGRpYWdyYW1tYVxyXG4gICAgdGhpcy5jeSA9IGN5dG9zY2FwZShjeU9wdGlvbnMpO1xyXG5cclxuICAgIC8vIENvbGxlZ28gZ2xpIGV2ZW50aSBhbCBjb21wb25lbnRlXHJcbiAgICB0aGlzLmJpbmRDeXRvc2NhcGVFdmVudHMoKTtcclxuXHJcbiAgICAvLyBVdGlsaXp6byBsZSBjbGFzc2kgZGkgZXN0ZW5zaW9uZSBjYXJpY2F0ZSBwcmVjZWRlbnRlbWVudGUgcGVyIGZhcmUgaWwgcmVzdG8gZGVsbGUgbWllIG9wZXJhemlvbmlcclxuICAgIHRoaXMucGVyZm9ybU9wZXJhdGlvbnNXaXRoTG9hZGVkTW9kdWxlcygpO1xyXG5cclxuICAgIC8vIEltcG9zdG8gbGEgdmFyaWFiaWxlIFJlbmRlcmVkIGEgdHJ1ZSBpbiBtb2RvIGNoZSBzZSBkYSBhZGVzc28gdmVuZ29ubyBmYXR0ZSBtb2RpZmljaGUgY2hlIGRvdnJlYmJlcm8gY2F1c2FyZSB1biByZWRyYXcgcG9zc28gYWNjb3JnZXJtZW5lXHJcbiAgICAvLyBlIG1hbmRhcmUgYSBjYWdhcmUgbG8gc3Ryb256byBkaSB0dXJub1xyXG4gICAgdGhpcy5SZW5kZXJlZCA9IHRydWU7XHJcblxyXG4gICAgLy8gU2UgZGV2byBhZ2dpb3JuYXJlIGluIGF1dG9tYXRpY28gaW4gYmFzZSBhbGxhIGRpbWVuc2lvbmUgZGVsIGNvbnRlbml0b3JlIGNvbGxlZ28gaWwgUmVzaXplT2JzZXJ2ZXJcclxuICAgIGlmICh0aGlzLkF1dG91cGRhdGVTaXplKVxyXG4gICAgICB0aGlzLmxpc3Rlbk9uQ2hhbmdlcygpO1xyXG5cclxuICAgIGlmICh0aGlzLlNtYXJ0U2VsZWN0aW9uKSB7XHJcbiAgICAgIHRoaXMuc2V0dXBTZWxlY3Rpb25TdHlsZXMoKTtcclxuICAgICAgdGhpcy5zZXR1cEVsZW1lbnRzU2VsZWN0aW9uSWZOZWVkZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm9uTG9hZGVkLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFByZW5kZSB0dXR0aSBnbGkgZWxlbWVudGkgYXBwZW5hIGFzc2VnbmF0aSwgZSBzZSBxdWFsY3VubyBlcmEgc2VsZXppb25hdG8gbGEgc2l0dWF6aW9uZSB2aWVuZSBwZXJzaXN0aXRhIHN1IGN5dG9zY2FwZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2V0dXBFbGVtZW50c1NlbGVjdGlvbklmTmVlZGVkKCkge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLkVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBlbGRhdGEgPSA8YW55PnRoaXMuRWxlbWVudHNbaV0uZGF0YTtcclxuICAgICAgaWYgKGVsZGF0YS5fX3NlbGVjdGVkKSB7XHJcbiAgICAgICAgbGV0IGVsID0gdGhpcy5jeS4kaWQoZWxkYXRhLmlkKTtcclxuICAgICAgICBlbC5zZWxlY3QoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FyaWNhIGdsaSBzdGlsaSBwZXIgbW9zdHJhcmUgY2FyaW5hIGxhIHNlbGV6aW9uZSBkZWkgbm9kaVxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2V0dXBTZWxlY3Rpb25TdHlsZXMoKXtcclxuICAgIGxldCBjc3NJdGVtID0gdGhpcy5TbWFydFNlbGVjdGlvblN0eWxlcyB8fCB7XHJcbiAgICAgICdvdmVybGF5LWNvbG9yJzogJ2JsdWUnLFxyXG4gICAgICAnb3ZlcmxheS1vcGFjaXR5JzogMC41LFxyXG4gICAgICAnb3ZlcmxheS1wYWRkaW5nJzogN1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBCYWNrZG9vciBwZXIgcG90ZXIgYXNzZWduYXJlIFwie31cIiBhIFNtYXJ0U2VsZWN0aW9uU3R5bGVzIGluIG1vZG8gZGkgdXRpbGl6emFyZSBsYSBzbWFydCBzZWxlY3Rpb24gbWEgc2VuemEgY2hlIG5lc3N1bm8gc3RpbGUgdmVuZ2EgYXBwbGljYXRvXHJcbiAgICAvLyBhZCBlc2VtcGlvIHF1YWxvcmEgc2kgdm9sZXNzZSB1dGlsaXp6YXJlIGwnaHRtbG5vZGUgcGVyIGdlc3RpcmUgbGEgZ3JhZmljYSBkZWdsaSBlbGVtZW50aSBzZWxlemlvbmF0aVxyXG4gICAgaWYoY3NzSXRlbVsnb3ZlcmxheS1jb2xvciddICYmIGNzc0l0ZW1bJ292ZXJsYXktb3BhY2l0eSddICYmIGNzc0l0ZW1bJ292ZXJsYXktcGFkZGluZyddKVxyXG4gICAgICAoPGFueT50aGlzLmN5LnN0eWxlKCkpLnNlbGVjdG9yKCdub2RlOnNlbGVjdGVkJykuY3NzKGNzc0l0ZW0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVnaXN0cmEgbCdhc2NvbHRvIGFsIGNvbnRlbml0b3JlIGRlbCBncmFmaWNvIGUgaW4gY2FzbyBkaSBtb2RpZmljaGUgYWxsYSBkaW1lbnNpb25lLCBhbCBtYXNzaW1vIHVuYSB2b2x0YSBvZ25pIDUwMCBtaWxsaXNlY29uZGksIGxvIHJpZGlzZWduYVxyXG4gICAqL1xyXG4gIHByaXZhdGUgbGlzdGVuT25DaGFuZ2VzKCkge1xyXG4gICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVTZW5zb3IodGhpcy5jeUdyYXBoLm5hdGl2ZUVsZW1lbnQsICgpID0+IHtcclxuICAgICAgdGhpcy5leHRzLnRocm90dGxlKHRoaXMubmFtZSwgdGhpcy5vbkNvbnRhaW5lclNpemVDaGFuZ2VkLmJpbmQodGhpcyksIHRoaXMuUmVzaXplVGhyb3R0bGVUaW1lKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRnVuemlvbmUgY2hlIHNpIG9jY3VwYSBkaSBnZXN0aXJlIGlsIHJlcGFpbnQgZGVsIGRpYWdyYW1tYVxyXG4gICAqL1xyXG4gIHByaXZhdGUgb25Db250YWluZXJTaXplQ2hhbmdlZCgpIHtcclxuICAgIHRoaXMuc2VydmljZS5sb2coXCJJXCIsIFwiRGlhZ3JhbSBjb250YWluZXIgc2l6ZSBoYXMgY2hhbmdlZCwgcmVkcmF3aW5nXCIpO1xyXG4gICAgdGhpcy5jeS5yZXNpemUoKTtcclxuICAgIHRoaXMuY3kuZml0KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb2xsZWdhIHR1dHRpIGdsaSBldmVudGkgY2hlIG1pIHBvc3Nvbm8gc2VydmlyZSBlIGxpIGVzcG9uZSBpbiBvdXRwdXRcclxuICAgKi9cclxuICBwcml2YXRlIGJpbmRDeXRvc2NhcGVFdmVudHMoKSB7XHJcbiAgICB0aGlzLmN5LmJpbmQoJ2NsaWNrJywgJ25vZGUnLCAoZXZlbnQpID0+IHtcclxuICAgICAgbGV0IHRhcmdldERhdGEgPSBldmVudC50YXJnZXQuZGF0YSgpXHJcbiAgICAgIGlmICh0aGlzLlNtYXJ0U2VsZWN0aW9uKSB7XHJcbiAgICAgICAgbGV0IGlkID0gdGFyZ2V0RGF0YS5pZFxyXG4gICAgICAgIGxldCBlbCA9IHRoaXMuY3kuJGlkKGlkKTtcclxuICAgICAgICBsZXQgc2VsZWN0ZWQgPSBlbC5zZWxlY3RlZCgpO1xyXG5cclxuICAgICAgICBlbC5zZWxlY3RpZnkoKTtcclxuICAgICAgICBpZiAoc2VsZWN0ZWQpXHJcbiAgICAgICAgICBlbC51bnNlbGVjdCgpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGVsLnNlbGVjdCgpO1xyXG4gICAgICAgIGVsLnVuc2VsZWN0aWZ5KCk7XHJcblxyXG4gICAgICAgIC8vIFF1ZXN0byB2YSBhbmNoZSBuZWxsYSBsaXN0YSBkZWdsaSBlbGVtZW50aSBvcmlnaW5hbGkgKHRoaXMuRWxlbWVudHMpIGRhdG8gY2hlIGN5dG9zY2FwZSBsaSBwcmVuZGUgcGVyIHJpZmVyaW1lbnRvIChiYmJiYnJhdm8gY3l0by1jaGFuKVxyXG4gICAgICAgIGVsLmRhdGEoXCJfX3NlbGVjdGVkXCIsICFzZWxlY3RlZCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMub25Ob2RlQ2xpY2suZW1pdCh7IGRhdGE6IHRhcmdldERhdGEgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmN5LmJpbmQoJ3NlbGVjdCcsICdub2RlJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgIGxldCB0YXJnZXREYXRhID0gZXZlbnQudGFyZ2V0LmRhdGEoKVxyXG5cclxuICAgICAgdGhpcy5vbk5vZGVTZWxlY3Rpb24uZW1pdCh7IGRhdGE6IHRhcmdldERhdGEsIHNlbGVjdGVkOiB0cnVlIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jeS5iaW5kKCdsYXlvdXRzdG9wJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgIHRoaXMub25MYXlvdXREb25lLmVtaXQoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY3kuYmluZCgndW5zZWxlY3QnLCAnbm9kZScsIChldmVudCkgPT4ge1xyXG4gICAgICBsZXQgdGFyZ2V0RGF0YSA9IGV2ZW50LnRhcmdldC5kYXRhKClcclxuXHJcbiAgICAgIHRoaXMub25Ob2RlU2VsZWN0aW9uLmVtaXQoeyBkYXRhOiB0YXJnZXREYXRhLCBzZWxlY3RlZDogZmFsc2UgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBBbHRyaSBldmVudGkuLi5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBjaGUgc2VydmUgcGVyIGNhcmljYXJlIHR1dHRlIGxlIGVzdGVuc2lvbmkgZGVsbGEgbGlicmVyaWEgaW4gYmFzZSBhIGNpw7IgY2hlIHZpZW5lIHV0aWxpenphdG9cclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIHBlcmZvcm1Nb2R1bGVzTG9hZGluZygpIHtcclxuICAgIGlmICh0aGlzLkxheW91dC5uYW1lID09ICdkYWdyZScpXHJcbiAgICAgIGF3YWl0IHRoaXMubG9hZEludGVybmFsKFwiY3l0b3NjYXBlLWRhZ3JlXCIpO1xyXG5cclxuICAgIGlmICh0aGlzLk5vZGVIVE1MVGVtcGxhdGVzICYmIHRoaXMuTm9kZUhUTUxUZW1wbGF0ZXMubGVuZ3RoID4gMClcclxuICAgICAgYXdhaXQgdGhpcy5sb2FkSW50ZXJuYWwoXCJjeXRvc2NhcGUtaHRtbC1ub2RlXCIpO1xyXG5cclxuICAgIGlmICh0aGlzLlVzZUNvbnRleHRNZW51KVxyXG4gICAgICBhd2FpdCB0aGlzLmxvYWRJbnRlcm5hbChcImN5dG9zY2FwZS1jeHRtZW51XCIpO1xyXG5cclxuICAgIGlmICh0aGlzLk5vZGVzSGllcmFyY2h5ICYmIHRoaXMuVXNlRXhwYW5kQ29sbGFwc2UpXHJcbiAgICAgIGF3YWl0IHRoaXMubG9hZEludGVybmFsKFwiY3l0b3NjYXBlLWV4cGFuZC1jb2xsYXBzZVwiKTtcclxuXHJcbiAgICBpZiAodGhpcy5FeHRlbnNpb25Nb2R1bGVzSW1wb3J0ZXIpIHtcclxuICAgICAgLy8gV3JhcHBvIGlsIG5hbWVzcGFjZSBpbiBtb2RvIGNoZSBwb3NzYSBkaXJlIGxhIG1pYSBzdWwgZmF0dG8gY2hlIGwndXRlbnRlIGFnZ2l1bmdhIHVuIG1vZHVsbyBvIG1lbm8gOkRcclxuICAgICAgdmFyIHdyYXBwZWRDeXRvc2NhcGUgPSB7XHJcbiAgICAgICAgdXNlOiAobW9kdWxlTmFtZTogc3RyaW5nLCBtb2R1bGU6IGN5dG9zY2FwZS5FeHQpID0+IHtcclxuICAgICAgICAgIGlmICghbW9kdWxlKVxyXG4gICAgICAgICAgICB0aGlzLnNlcnZpY2UubG9nKFwiRVwiLCB0aGlzLnNlcnZpY2UubG9jKFwiUmVjZWl2ZWQgYW4gdW5kZWZpbmVkIG1vZHVsZS4gTWFrZSBzdXJlIHlvdSBhcmUgY29ycmVjdGx5IGxvYWRpbmcgaXRcIikgKyBcIjogXCIgKyBtb2R1bGVOYW1lLCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgaWYgKFtcImN5dG9zY2FwZS1kYWdyZVwiLCBcImN5dG9zY2FwZS1odG1sLW5vZGVcIiwgXCJjeXRvc2NhcGUtY3h0bWVudVwiLCBcImN5dG9zY2FwZS1leHBhbmQtY29sbGFwc2VcIl0uaW5jbHVkZXMobW9kdWxlTmFtZSkpXHJcbiAgICAgICAgICAgIHRoaXMuc2VydmljZS5sb2coXCJXXCIsIHRoaXMuc2VydmljZS5sb2MoXCJNb2R1bGVcIikgKyBcIiBcIiArIG1vZHVsZU5hbWUgKyBcIiBcIiArIHRoaXMuc2VydmljZS5sb2MoXCJpcyBsb2FkZWQgYW5kIG1hbmFnZWQgZGlyZWN0bHkgYnkgdGhpcyBsaWJyYXJ5LiBZb3UgZG9uJ3QgbmVlZCB0byBpbXBvcnQgaXQgb3IgdXNlIGl0IGRpcmVjdGx5LCBqdXN0IGJlIHN1cmUgdG8gc2V0IHRoZSByZWxhdGl2ZSBvcHRpb25zXCIpLCBmYWxzZSk7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGN5dG9zY2FwZS51c2UobW9kdWxlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGF3YWl0IHRoaXMuRXh0ZW5zaW9uTW9kdWxlc0ltcG9ydGVyKHdyYXBwZWRDeXRvc2NhcGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIGNoZSBzZXJ2ZSBwZXIgY2FyaWNhcmUgdHV0dGUgbGUgZXN0ZW5zaW9uaSBkZWxsYSBsaWJyZXJpYSBpbiBiYXNlIGEgY2nDsiBjaGUgdmllbmUgdXRpbGl6emF0byBjb24gbGUgb3B6aW9uaSBkZWZpbml0ZSBkYWdsaSBJbnB1dFxyXG4gICAqL1xyXG4gIHByaXZhdGUgcGVyZm9ybU9wZXJhdGlvbnNXaXRoTG9hZGVkTW9kdWxlcygpIHtcclxuXHJcbiAgICBsZXQgYW55Q3kgPSAoPGFueT50aGlzLmN5KTtcclxuXHJcbiAgICAvLyBVdGlsaXp6byBkZWwgbGF5b3V0LCBsbyBzYWx2byBwZXIgcG90ZXJsbyByaXV0aWxpenphcmUgaW4gZnV0dXJvXHJcbiAgICBpZiAodGhpcy5MYXlvdXQpIHtcclxuICAgICAgdGhpcy5MYXN0TGF5b3V0ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLkxheW91dCkpO1xyXG4gICAgICB0aGlzLmN5LmxheW91dCh0aGlzLkxhc3RMYXlvdXQpLnJ1bigpXHJcbiAgICB9XHJcblxyXG4gICAgLy8gVXRpbGl6em8gZGVsbCdIVE1MIG5vZGVcclxuICAgIGlmICh0aGlzLk5vZGVIVE1MVGVtcGxhdGVzICYmIHRoaXMuTm9kZUhUTUxUZW1wbGF0ZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLkh0bWxOb2RlQXBpID0gYW55Q3kuaHRtbG5vZGUoKTtcclxuICAgICAgdGhpcy5IdG1sTm9kZUFwaS5jcmVhdGVIdG1sTm9kZShjeXRvc2NhcGUsIHRoaXMuY3ksIHRoaXMuTm9kZUhUTUxUZW1wbGF0ZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFV0aWxpenpvIGRlbCBDb250ZXh0IE1lbnVcclxuICAgIGlmICh0aGlzLlVzZUNvbnRleHRNZW51KVxyXG4gICAgICB0aGlzLkNvbnRleHRNZW51T3B0aW9ucy5mb3JFYWNoKG8gPT4geyBhbnlDeS5jeHRtZW51KG8pOyB9KTtcclxuXHJcbiAgICAvLyBVdGlsaXp6byBkZWxsJ2V4cGFuZCBjb2xsYXBzZSBzb2xvIHF1YW5kbyBjJ8OoIHVuYSBnZXJhcmNoaWEgZGkgbm9kaVxyXG4gICAgaWYgKHRoaXMuTm9kZXNIaWVyYXJjaHkgJiYgdGhpcy5Vc2VFeHBhbmRDb2xsYXBzZSlcclxuICAgICAgdGhpcy5FeHBhbmRDb2xsYXBzZUFwaSA9IGFueUN5LmV4cGFuZENvbGxhcHNlKHRoaXMuRXhwYW5kQ29sbGFwc2VPcHRpb25zKTtcclxuXHJcbiAgICAvLyBVdGlsaXp6byBkaSBlc3RlbnNpb25pIGV4dHJhLCBpbXBsZW1lbnRhemlvbmUgYWZmaWRhdGEgYWwgcHJvZ3JhbW1hdG9yZVxyXG4gICAgaWYgKHRoaXMuRXh0ZW5zaW9uTW9kdWxlc0FwcGx5ZXIpXHJcbiAgICAgIHRoaXMuRXh0ZW5zaW9uTW9kdWxlc0FwcGx5ZXIodGhpcy5jeSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQ2FyZERhdGEoKSB7XHJcbiAgICBpZiAoIXRoaXMuSHRtbE5vZGVBcGkpIHtcclxuICAgICAgdGhpcy5zZXJ2aWNlLmxvZyhcIkVcIiwgXCJDYW5ub3QgdXBkYXRlIE5vZGVIVE1MVGVtcGxhdGVzIGFzIHRoZXkgZG9uJ3Qgc2VlbSB0byBiZSB1c2VkXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLkh0bWxOb2RlQXBpLnVwZGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIGludGVybm8gcGVyIGlsIGNhcmljYW1lbnRvIGRlaSBtb2R1bGkgZGkgZXN0ZW5zaW9uZVxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7J2N5dG9zY2FwZS1leHBhbmQtY29sbGFwc2UnIHwgJ2N5dG9zY2FwZS1jeHRtZW51JyB8ICdjeXRvc2NhcGUtaHRtbC1ub2RlJyB8ICdjeXRvc2NhcGUtZGFncmUnfSBtb2R1bGVJZCBNb2R1bG8gZGEgY2FyaWNhcmVcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGxvYWRJbnRlcm5hbChtb2R1bGVJZDogJ2N5dG9zY2FwZS1leHBhbmQtY29sbGFwc2UnIHwgJ2N5dG9zY2FwZS1jeHRtZW51JyB8ICdjeXRvc2NhcGUtaHRtbC1ub2RlJyB8ICdjeXRvc2NhcGUtZGFncmUnKSB7XHJcbiAgICBsZXQgdG9Mb2FkID0gYXdhaXQgdGhpcy5zZXJ2aWNlLmltcG9ydElmTmVlZGVkKG1vZHVsZUlkKTtcclxuICAgIGlmICh0b0xvYWQpIGN5dG9zY2FwZS51c2UodG9Mb2FkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBjaGUgYmFzYW5kb3NpIHN1bGxlIG9wemlvbmkgbmF0aXZlIGV2ZW50dWFsbWVudGUgYXNzZWduYXRlIGxlIGNvbXBsZXRhIGNvbiBnbGkgSW5wdXQgYWRkaXppb25hbGlcclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7Y3lfLkN5dG9zY2FwZU9wdGlvbnN9IE9wemlvbmkgZmluYWxpIHVuaXRlIGRhIElucHV0IGVkIG9wemlvbmkgbmF0aXZlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRDb21wbGV0ZWRPcHRpb25zKCk6IGN5Xy5DeXRvc2NhcGVPcHRpb25zIHtcclxuICAgIHZhciBvcHRzOiBjeV8uQ3l0b3NjYXBlT3B0aW9ucyA9IHRoaXMuTmF0aXZlT3B0aW9ucyB8fCB7fTtcclxuICAgIG9wdHMuY29udGFpbmVyID0gdGhpcy5jeUdyYXBoLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBvcHRzLnN0eWxlID0gb3B0cy5zdHlsZSB8fCBbXTtcclxuXHJcbiAgICAvLyBQZXIgdHV0dGUgbGUgY29zZSBwZXIgY3VpIGdsaSBJbnB1dCBoYW5ubyBwcmlvcml0w6Agc292cmFzY3Jpdm8gZ2xpIG9yaWdpbmFsaSBkZWxsZSBvcHppb25pXHJcblxyXG4gICAgaWYgKHRoaXMuTm9kZVN0eWxlcyB8fCB0aGlzLkVkZ2VTdHlsZXMpIHtcclxuICAgICAgb3B0cy5zdHlsZSA9IFtdO1xyXG4gICAgICBpZiAodGhpcy5Ob2RlU3R5bGVzKSBvcHRzLnN0eWxlLnB1c2goeyBzZWxlY3RvcjogJ25vZGUnLCBjc3M6IHRoaXMuTm9kZVN0eWxlcyB9KTtcclxuICAgICAgaWYgKHRoaXMuRWRnZVN0eWxlcykgb3B0cy5zdHlsZS5wdXNoKHsgc2VsZWN0b3I6ICdlZGdlJywgY3NzOiB0aGlzLkVkZ2VTdHlsZXMgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuRWxlbWVudHMpXHJcbiAgICAgIG9wdHMuZWxlbWVudHMgPSB0aGlzLkVsZW1lbnRzO1xyXG5cclxuICAgIHRoaXMucmV2aWV3Q3l0b3NjYXBlRWxlbWVudHMoPGN5dG9zY2FwZS5FbGVtZW50RGVmaW5pdGlvbltdPm9wdHMuZWxlbWVudHMpO1xyXG5cclxuICAgIGlmICh0aGlzLkxheW91dClcclxuICAgICAgb3B0cy5sYXlvdXQgPSB0aGlzLkxheW91dDtcclxuXHJcbiAgICBpZiAodGhpcy5SZWFkb25seSkge1xyXG4gICAgICAvLyBRdWVzdG8gY29zbyBmYSBlZmZldHRpIHN0cmFuaS4uLi5cclxuICAgICAgLy9vcHRzLmF1dG9sb2NrID0gdHJ1ZTtcclxuXHJcbiAgICAgIG9wdHMuYXV0b3VuZ3JhYmlmeSA9IHRydWU7XHJcbiAgICAgIG9wdHMuYXV0b3Vuc2VsZWN0aWZ5ID0gZmFsc2U7XHJcbiAgICAgIG9wdHMuYm94U2VsZWN0aW9uRW5hYmxlZCA9IHRydWU7XHJcbiAgICAgIG9wdHMudXNlclpvb21pbmdFbmFibGVkID0gZmFsc2U7XHJcbiAgICAgIG9wdHMudXNlclBhbm5pbmdFbmFibGVkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG9wdHM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBZ2dpdXN0YW1lbnRpIGRlZ2xpIGVsZW1lbnRpIGRpIEN5dG9zY2FwZS4gXHJcbiAgICogXHJcbiAgICogSSBub2RpIG5vbiB2ZW5nb25vIHRvY2NhdGkuXHJcbiAgICogXHJcbiAgICogUGVyIG9nbmkgZWRnZSB2aWVuZSBjb250cm9sbGF0byBzZSDDqCBzcGVjaWZpY2F0YSB1bmEgc29yZ2VudGUgZWQgdW5hIGRlc3RpbmF6aW9uZSwgaW4gY2FzbyBjb250cmFyaW8gc2kgY2VyY2EgZGkgZGVkdXJsaSBkYWxsJ0lEXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtjeXRvc2NhcGUuRWxlbWVudERlZmluaXRpb25bXX0gZWxlbWVudHMgRWxlbWVudGkgZGEgc2lzdGVtYXJlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZXZpZXdDeXRvc2NhcGVFbGVtZW50cyhlbGVtZW50czogY3l0b3NjYXBlLkVsZW1lbnREZWZpbml0aW9uW10sIHByZXZQb3NpdGlvbnM/OiBhbnkpIHtcclxuICAgIGxldCBoYXNQcmV2aW91c1Bvc2l0aW9ucyA9IHByZXZQb3NpdGlvbnMgJiYgcHJldlBvc2l0aW9ucy5sZW5ndGggPiAwO1xyXG4gICAgbGV0IHBvc2l0aW9uQ2FjaGU6IHsgW2luZGV4OiBzdHJpbmddOiBjeXRvc2NhcGUuUG9zaXRpb24gfSA9IHt9O1xyXG5cclxuICAgIGlmIChoYXNQcmV2aW91c1Bvc2l0aW9ucykge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXZQb3NpdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgaXRlbSA9IHByZXZQb3NpdGlvbnNbaV07XHJcbiAgICAgICAgaWYgKCFwb3NpdGlvbkNhY2hlW2l0ZW0uZGF0YSgpLmlkXSlcclxuICAgICAgICAgIHBvc2l0aW9uQ2FjaGVbaXRlbS5kYXRhKCkuaWRdID0gaXRlbS5wb3NpdGlvbigpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgZWwgPSBlbGVtZW50c1tpXTtcclxuICAgICAgaWYgKGVsLmdyb3VwID09IFwiZWRnZXNcIiAmJiAoIWVsLmRhdGEuc291cmNlICYmICFlbC5kYXRhLnRhcmdldCkpIHtcclxuICAgICAgICBpZiAoIWVsLmRhdGEuaWQuaW5jbHVkZXMoXCItXCIpKVxyXG4gICAgICAgICAgdGhpcy5zZXJ2aWNlLmxvZyhcIkVcIiwgXCJJZiB5b3UgZG9uJ3Qgc3BlY2lmeSBhIHNvdXJjZSBhbmQgYSB0YXJnZXQgZm9yIGFuIGVkZ2UgeW91IGhhdmUgdG8gd3JpdGUgaXRzIGlkIGluIHRoZSBmb3JtYXQge3NvdXJjZX0te3RhcmdldH1cIik7XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB2YXIgc291cmNlVGFyZ2V0ID0gZWwuZGF0YS5pZC5zcGxpdCgnLScpO1xyXG4gICAgICAgICAgZWwuZGF0YS5zb3VyY2UgPSBzb3VyY2VUYXJnZXRbMF0udHJpbSgpO1xyXG4gICAgICAgICAgZWwuZGF0YS50YXJnZXQgPSBzb3VyY2VUYXJnZXRbMV0udHJpbSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGhhc1ByZXZpb3VzUG9zaXRpb25zICYmIGVsLmdyb3VwID09IFwibm9kZXNcIilcclxuICAgICAgICBlbC5wb3NpdGlvbiA9IHBvc2l0aW9uQ2FjaGVbZWwuZGF0YS5pZF1cclxuICAgIH1cclxuICB9XHJcbn0iXX0=
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { NgModule } from '@angular/core';
|
|
2
|
-
import { EsDiagramComponent } from './components/es-diagram.component';
|
|
3
|
-
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
4
|
-
import { CommonModule } from '@angular/common';
|
|
5
|
-
import { EsDiagramService } from './services/es-diagram.service';
|
|
6
|
-
import { EsDiagramDispatcher } from './services/es-diagram.dispatcher';
|
|
7
|
-
import { DIA_LOCALE, DIA_DEBUG_MODE } from './tokens';
|
|
8
|
-
export class EsDiagramModule {
|
|
9
|
-
static forRoot(config) {
|
|
10
|
-
return {
|
|
11
|
-
ngModule: EsDiagramModule,
|
|
12
|
-
providers: [
|
|
13
|
-
EsDiagramService,
|
|
14
|
-
EsDiagramDispatcher,
|
|
15
|
-
{ provide: DIA_LOCALE, useValue: (config === null || config === void 0 ? void 0 : config.locale) || 'it-IT' },
|
|
16
|
-
{ provide: DIA_DEBUG_MODE, useValue: (config === null || config === void 0 ? void 0 : config.debugMode) || false },
|
|
17
|
-
]
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
EsDiagramModule.decorators = [
|
|
22
|
-
{ type: NgModule, args: [{
|
|
23
|
-
declarations: [EsDiagramComponent],
|
|
24
|
-
imports: [CommonModule, FormsModule, ReactiveFormsModule, CommonModule],
|
|
25
|
-
exports: [EsDiagramComponent]
|
|
26
|
-
},] }
|
|
27
|
-
];
|
|
28
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNkaWFncmFtLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2VzLWRpYWdyYW1zL3NyYy9saWIvZXNkaWFncmFtLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXVCLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQTtBQUV0RSxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDakUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQzlDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBR3ZFLE9BQU8sRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBT3RELE1BQU0sT0FBTyxlQUFlO0lBQzFCLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBOEI7UUFDM0MsT0FBTztZQUNMLFFBQVEsRUFBRSxlQUFlO1lBQ3pCLFNBQVMsRUFBRTtnQkFDVCxnQkFBZ0I7Z0JBQ2hCLG1CQUFtQjtnQkFDbkIsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxDQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxNQUFNLEtBQUksT0FBTyxFQUFFO2dCQUM1RCxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLENBQUEsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLFNBQVMsS0FBSSxLQUFLLEVBQUU7YUFDbEU7U0FDRixDQUFDO0lBQ0osQ0FBQzs7O1lBaEJGLFFBQVEsU0FBQztnQkFDUixZQUFZLEVBQUUsQ0FBRSxrQkFBa0IsQ0FBRTtnQkFDcEMsT0FBTyxFQUFFLENBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxZQUFZLENBQUU7Z0JBQ3pFLE9BQU8sRUFBRSxDQUFFLGtCQUFrQixDQUFFO2FBQ2hDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTW9kdWxlV2l0aFByb3ZpZGVycywgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgRXNEaWFncmFtQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2VzLWRpYWdyYW0uY29tcG9uZW50J1xuXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJ1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJ1xuaW1wb3J0IHsgRXNEaWFncmFtU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvZXMtZGlhZ3JhbS5zZXJ2aWNlJztcbmltcG9ydCB7IEVzRGlhZ3JhbURpc3BhdGNoZXIgfSBmcm9tICcuL3NlcnZpY2VzL2VzLWRpYWdyYW0uZGlzcGF0Y2hlcic7XG5pbXBvcnQgeyBFc0RpYWdyYW1Nb2R1bGVDb25maWcgfSBmcm9tICcuL21vZGVscy9Fc0RpYWdyYW1Nb2R1bGVDb25maWcnO1xuXG5pbXBvcnQgeyBESUFfTE9DQUxFLCBESUFfREVCVUdfTU9ERSB9IGZyb20gJy4vdG9rZW5zJztcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbIEVzRGlhZ3JhbUNvbXBvbmVudCBdLFxuICBpbXBvcnRzOiBbIENvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIENvbW1vbk1vZHVsZSBdLFxuICBleHBvcnRzOiBbIEVzRGlhZ3JhbUNvbXBvbmVudCBdXG59KVxuZXhwb3J0IGNsYXNzIEVzRGlhZ3JhbU1vZHVsZSB7XG4gIHN0YXRpYyBmb3JSb290KGNvbmZpZz86IEVzRGlhZ3JhbU1vZHVsZUNvbmZpZyk6IE1vZHVsZVdpdGhQcm92aWRlcnM8RXNEaWFncmFtTW9kdWxlPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBFc0RpYWdyYW1Nb2R1bGUsXG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgRXNEaWFncmFtU2VydmljZSxcbiAgICAgICAgRXNEaWFncmFtRGlzcGF0Y2hlcixcbiAgICAgICAgeyBwcm92aWRlOiBESUFfTE9DQUxFLCB1c2VWYWx1ZTogY29uZmlnPy5sb2NhbGUgfHwgJ2l0LUlUJyB9LFxuICAgICAgICB7IHByb3ZpZGU6IERJQV9ERUJVR19NT0RFLCB1c2VWYWx1ZTogY29uZmlnPy5kZWJ1Z01vZGUgfHwgZmFsc2UgfSxcbiAgICAgIF1cbiAgICB9O1xuICB9XG59Il19
|