keevo-components 2.0.179 → 2.0.181

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.
Files changed (21) hide show
  1. package/esm2022/lib/components/kv-icon/kv-icon.component.mjs +3 -3
  2. package/esm2022/lib/components/kv-table-draggable/kv-table-draggable.component.mjs +35 -35
  3. package/esm2022/lib/components/kv-tree-environment/components/kv-tree-environment/kv-tree-environment.component.mjs +134 -174
  4. package/esm2022/lib/components/kv-tree-environment/components/no-arvore/no-arvore.component.mjs +30 -46
  5. package/esm2022/lib/components/kv-tree-environment/models/no-arvore.model.mjs +1 -1
  6. package/esm2022/lib/components/kv-widget-card/kv-widget-card.component.mjs +3 -3
  7. package/fesm2022/keevo-components.mjs +231 -294
  8. package/fesm2022/keevo-components.mjs.map +1 -1
  9. package/lib/api/base-components/base-component-dropdown.d.ts +1 -1
  10. package/lib/components/kv-button/kv-button.component.d.ts +1 -1
  11. package/lib/components/kv-buttons/kv-button-popup/kv-button-popup.component.d.ts +1 -1
  12. package/lib/components/kv-stepper/kv-stepper.component.d.ts +2 -2
  13. package/lib/components/kv-table/kv-table.component.d.ts +1 -1
  14. package/lib/components/kv-table-draggable/kv-table-draggable.component.d.ts +1 -1
  15. package/lib/components/kv-table-expandable/kv-table-expandable.component.d.ts +1 -1
  16. package/lib/components/kv-table-viewer/kv-table-viewer.component.d.ts +1 -1
  17. package/lib/components/kv-tag/kv-tag.component.d.ts +1 -1
  18. package/lib/components/kv-tree-environment/components/kv-tree-environment/kv-tree-environment.component.d.ts +28 -31
  19. package/lib/components/kv-tree-environment/components/no-arvore/no-arvore.component.d.ts +14 -15
  20. package/lib/components/kv-tree-environment/models/no-arvore.model.d.ts +6 -4
  21. package/package.json +1 -1
@@ -1,13 +1,24 @@
1
1
  import { CommonModule } from '@angular/common';
2
- import { Component, input, signal, Output, EventEmitter, effect, ChangeDetectorRef, inject } from '@angular/core';
2
+ import { ChangeDetectionStrategy, Component, input, signal, Output, EventEmitter, computed, ContentChild, effect } from '@angular/core';
3
3
  import { NoArvoreComponent } from '../no-arvore/no-arvore.component';
4
4
  import { ScrollingModule } from '@angular/cdk/scrolling';
5
5
  import { PrimeNgModule } from '../../../../api/modules/primeng.module';
6
+ import { FormControl, FormGroup, FormsModule, ReactiveFormsModule } from "@angular/forms";
7
+ import { toSignal } from '@angular/core/rxjs-interop';
8
+ import { KeevoComponentsModule } from '../../../keevo-components.module';
6
9
  import * as i0 from "@angular/core";
7
- import * as i1 from "@angular/cdk/scrolling";
8
- import * as i2 from "primeng/tooltip";
10
+ import * as i1 from "@angular/common";
11
+ import * as i2 from "@angular/cdk/scrolling";
12
+ import * as i3 from "primeng/api";
13
+ import * as i4 from "primeng/sidebar";
14
+ import * as i5 from "../../../kv-button/kv-button.component";
15
+ import * as i6 from "../../../kv-inputs/kv-input-text/kv-input-text.component";
16
+ import * as i7 from "@angular/forms";
9
17
  export class KvTreeEnvironmentComponent {
10
18
  constructor() {
19
+ this.onAddClick = new EventEmitter();
20
+ this.onSelectedItem = new EventEmitter();
21
+ this.onSidebarNodeClick = new EventEmitter();
11
22
  this.arvoreDeDados = input([]);
12
23
  this.nosSimples = input([]);
13
24
  this.estruturaArvore = input([]);
@@ -15,128 +26,74 @@ export class KvTreeEnvironmentComponent {
15
26
  this.configuracao = input({});
16
27
  this.showButtonCollapsed = input(true);
17
28
  this.showAddButton = input(true);
18
- this.onAddClick = new EventEmitter();
19
- this.onSelectedItem = new EventEmitter();
20
- this.cdr = inject(ChangeDetectorRef);
21
- this.mapaDeExpansao = new Map();
22
- this._cachedDados = null;
23
- this._dadosHash = null;
24
- this._cachedListaPlana = null;
25
- this._listaPlanaHash = null;
26
- this.listaPlana = signal([]);
27
- this.iconCollapsed = signal('collapse_all');
28
- this.collapsedAll = signal(true);
29
+ this.showSearchField = input(false);
30
+ this.enableSidebar = input(false);
31
+ this.sidebarVisible = signal(false);
29
32
  this.selectedItem = signal(null);
30
- effect(() => {
33
+ this.currentSidebarNode = signal(null);
34
+ this.expansaoState = signal(new Map());
35
+ this.formFiltro = new FormGroup({
36
+ search: new FormControl('')
37
+ });
38
+ this.searchValue = toSignal(this.formFiltro.get('search').valueChanges, { initialValue: '' });
39
+ this.dadosProcessados = computed(() => {
31
40
  const estrutura = this.estruturaArvore();
32
41
  const dados = this.dadosArvore();
33
42
  const simples = this.nosSimples();
34
43
  const arvore = this.arvoreDeDados();
35
- const dadosHash = this.criarHashDados(estrutura, dados, simples, arvore);
36
- if (this._dadosHash !== dadosHash) {
37
- this._dadosHash = dadosHash;
38
- this.invalidarCache();
39
- const temDados = estrutura.length > 0 || dados.length > 0 || simples.length > 0 || arvore.length > 0;
40
- if (temDados) {
41
- this.gerarListaPlanaOtimizada();
42
- this.atualizarEstadoCollapseButton();
43
- }
44
- else {
45
- this.listaPlana.set([]);
46
- }
44
+ if (estrutura && estrutura.length > 0) {
45
+ return this.combinarEstruturaComDados(estrutura, dados || []);
47
46
  }
48
- }, { allowSignalWrites: true });
49
- }
50
- ngOnInit() {
51
- this.gerarListaPlana();
52
- this.atualizarEstadoCollapseButton();
47
+ else if (simples && simples.length > 0) {
48
+ return this.converterSimplesParaCompleto(simples);
49
+ }
50
+ else {
51
+ return arvore;
52
+ }
53
+ });
54
+ this.dadosFiltrados = computed(() => {
55
+ const search = this.searchValue()?.trim().toLowerCase() || '';
56
+ const dados = this.dadosProcessados();
57
+ if (!search) {
58
+ return dados;
59
+ }
60
+ return this.filtrarArvoreComHierarquia(dados, search);
61
+ });
62
+ this.listaPlana = computed(() => {
63
+ const dados = this.dadosFiltrados();
64
+ const expansaoMap = this.expansaoState();
65
+ return this.transformarParaListaPlana(dados, expansaoMap, 0);
66
+ });
67
+ this.iconCollapsed = computed(() => {
68
+ const nosExpandiveis = this.obterTodosNosExpandiveis(this.dadosProcessados());
69
+ const expansaoMap = this.expansaoState();
70
+ const algumExpandido = nosExpandiveis.some(node => expansaoMap.get(node.rotulo) ?? (node.expanded ?? false));
71
+ return algumExpandido ? 'collapse_all' : 'expand_content';
72
+ });
73
+ this.collapsedAll = computed(() => {
74
+ return this.iconCollapsed() === 'expand_content';
75
+ });
76
+ effect(() => {
77
+ const search = this.searchValue()?.trim().toLowerCase();
78
+ const dados = this.dadosFiltrados();
79
+ if (search) {
80
+ this.expandirTodosNos(dados);
81
+ }
82
+ });
53
83
  }
54
84
  alternarNo(noPlano) {
55
85
  if (!noPlano.expansivel)
56
86
  return;
57
- const estadoAtual = this.mapaDeExpansao.get(noPlano.dadosOriginais.rotulo) ?? false;
58
- this.mapaDeExpansao.set(noPlano.dadosOriginais.rotulo, !estadoAtual);
59
- this.forcarAtualizacaoLista();
60
- }
61
- forcarAtualizacaoLista() {
62
- this._cachedListaPlana = null;
63
- this._listaPlanaHash = null;
64
- const dados = this.obterDadosOtimizado();
65
- const novaListaPlana = this.transformarParaListaPlanaOtimizada(dados);
66
- this.listaPlana.set(novaListaPlana);
67
- this.cdr.detectChanges();
68
- setTimeout(() => {
69
- const expansaoHash = Array.from(this.mapaDeExpansao.entries())
70
- .sort(([a], [b]) => a.localeCompare(b))
71
- .map(([k, v]) => `${k}:${v}`)
72
- .join(',');
73
- this._listaPlanaHash = `${this._dadosHash}:${expansaoHash}`;
74
- this._cachedListaPlana = novaListaPlana;
75
- this.cdr.detectChanges();
76
- this.atualizarEstadoCollapseButton();
77
- }, 0);
78
- }
79
- criarHashDados(estrutura, dados, simples, arvore) {
80
- const estruturaHash = `e:${estrutura.length}:${estrutura.map(e => `${e.id}:${e.label}`).join(',')}`;
81
- const dadosHash = `d:${dados.length}:${dados.map(d => `${d.id}`).join(',')}`;
82
- const simplesHash = `s:${simples.length}:${simples.map(s => s.key).join(',')}`;
83
- const arvoreHash = `a:${arvore.length}:${arvore.map(a => a.rotulo).join(',')}`;
84
- return `${estruturaHash}|${dadosHash}|${simplesHash}|${arvoreHash}`;
85
- }
86
- invalidarCache() {
87
- this._cachedDados = null;
88
- this._cachedListaPlana = null;
89
- this._listaPlanaHash = null;
90
- }
91
- gerarListaPlanaOtimizada() {
92
- const dados = this.obterDadosOtimizado();
93
- const expansaoHash = Array.from(this.mapaDeExpansao.entries())
94
- .sort(([a], [b]) => a.localeCompare(b))
95
- .map(([k, v]) => `${k}:${v}`)
96
- .join(',');
97
- const listaPlanaHash = `${this._dadosHash}:${expansaoHash}`;
98
- if (this._listaPlanaHash === listaPlanaHash && this._cachedListaPlana) {
99
- this.listaPlana.set(this._cachedListaPlana);
100
- return;
101
- }
102
- const novaListaPlana = this.transformarParaListaPlanaOtimizada(dados);
103
- this._cachedListaPlana = novaListaPlana;
104
- this._listaPlanaHash = listaPlanaHash;
105
- this.listaPlana.set(novaListaPlana);
87
+ const novoMapa = new Map(this.expansaoState());
88
+ const estadoAtual = novoMapa.get(noPlano.dadosOriginais.rotulo) ?? (noPlano.dadosOriginais.expanded ?? false);
89
+ novoMapa.set(noPlano.dadosOriginais.rotulo, !estadoAtual);
90
+ this.expansaoState.set(novoMapa);
106
91
  }
107
92
  onActionExecuted(noPlano) {
108
93
  const dados = noPlano.dadosOriginais;
109
94
  this.selectedItem.set(dados);
110
95
  this.onSelectedItem.emit(dados);
111
96
  }
112
- gerarListaPlana() {
113
- this.gerarListaPlanaOtimizada();
114
- }
115
- obterDadosOtimizado() {
116
- if (this._cachedDados && this._dadosHash) {
117
- return this._cachedDados;
118
- }
119
- const estrutura = this.estruturaArvore();
120
- const dados = this.dadosArvore();
121
- let resultado;
122
- if (estrutura && estrutura.length > 0) {
123
- resultado = this.combinarEstruturaComDados(estrutura, dados || []);
124
- }
125
- else {
126
- const nosSimples = this.nosSimples();
127
- if (nosSimples && nosSimples.length > 0) {
128
- resultado = this.converterSimplesParaCompleto(nosSimples);
129
- }
130
- else {
131
- resultado = this.arvoreDeDados();
132
- }
133
- }
134
- this._cachedDados = resultado;
135
- return resultado;
136
- }
137
- obterDados() {
138
- return this.obterDadosOtimizado();
139
- }
140
97
  converterSimplesParaCompleto(nosSimples) {
141
98
  const mapa = new Map();
142
99
  const raiz = [];
@@ -146,7 +103,7 @@ export class KvTreeEnvironmentComponent {
146
103
  icone: simples.icone,
147
104
  cor: simples.cor,
148
105
  ativo: simples.ativo,
149
- estaExpandido: simples.estaExpandido,
106
+ expanded: simples.expanded,
150
107
  filhos: []
151
108
  };
152
109
  mapa.set(simples.key, no);
@@ -168,26 +125,23 @@ export class KvTreeEnvironmentComponent {
168
125
  });
169
126
  return raiz;
170
127
  }
171
- transformarParaListaPlana(nodes, nivel = 0) {
172
- return this.transformarParaListaPlanaOtimizada(nodes, nivel);
173
- }
174
- transformarParaListaPlanaOtimizada(nodes, nivel = 0) {
128
+ transformarParaListaPlana(nodes, expansaoMap, nivel = 0) {
175
129
  const lista = [];
176
130
  nodes.forEach((node, index) => {
177
131
  const rotulo = node.rotulo;
178
- const estaExpandido = this.mapaDeExpansao.get(rotulo) ?? (node.estaExpandido ?? false);
132
+ const expanded = expansaoMap.get(rotulo) ?? (node.expanded ?? false);
179
133
  const temFilhos = !!(node.filhos && node.filhos.length > 0);
180
134
  const noPlano = {
181
135
  id: rotulo,
182
136
  nivel: nivel,
183
137
  expansivel: temFilhos,
184
- estaExpandido: estaExpandido,
138
+ expanded: expanded,
185
139
  isLast: index === nodes.length - 1,
186
140
  dadosOriginais: node
187
141
  };
188
142
  lista.push(noPlano);
189
- if (estaExpandido && temFilhos) {
190
- const filhosPlanos = this.transformarParaListaPlanaOtimizada(node.filhos, nivel + 1);
143
+ if (expanded && temFilhos) {
144
+ const filhosPlanos = this.transformarParaListaPlana(node.filhos, expansaoMap, nivel + 1);
191
145
  lista.push(...filhosPlanos);
192
146
  }
193
147
  });
@@ -196,72 +150,50 @@ export class KvTreeEnvironmentComponent {
196
150
  trackByNode(index, noPlano) {
197
151
  return noPlano.id;
198
152
  }
199
- executeCollapsed() {
200
- const todosColapsados = this.collapsedAll();
201
- if (todosColapsados) {
202
- this.expandirTodosOtimizado();
203
- }
204
- else {
205
- this.colapsarTodosOtimizado();
206
- }
207
- this.forcarAtualizacaoLista();
208
- }
209
153
  expandirTodos() {
210
- this.expandirTodosOtimizado();
154
+ const novoMapa = new Map(this.expansaoState());
155
+ this.expandirTodosNos(this.dadosProcessados(), novoMapa);
156
+ this.expansaoState.set(novoMapa);
211
157
  }
212
158
  colapsarTodos() {
213
- this.colapsarTodosOtimizado();
159
+ const novoMapa = new Map(this.expansaoState());
160
+ this.colapsarTodosNos(this.dadosProcessados(), novoMapa);
161
+ this.expansaoState.set(novoMapa);
214
162
  }
215
- expandirTodosOtimizado() {
216
- const dados = this.obterDadosOtimizado();
217
- const stack = [...dados];
163
+ expandirTodosNos(nodes, mapa) {
164
+ const mapaDeExpansao = mapa || new Map(this.expansaoState());
165
+ const stack = [...nodes];
218
166
  while (stack.length > 0) {
219
167
  const node = stack.pop();
220
168
  if (node.filhos && node.filhos.length > 0) {
221
- this.mapaDeExpansao.set(node.rotulo, true);
169
+ mapaDeExpansao.set(node.rotulo, true);
222
170
  stack.push(...node.filhos);
223
171
  }
224
172
  }
173
+ if (!mapa) {
174
+ this.expansaoState.set(mapaDeExpansao);
175
+ }
225
176
  }
226
- colapsarTodosOtimizado() {
227
- const dados = this.obterDadosOtimizado();
228
- const stack = [...dados];
177
+ colapsarTodosNos(nodes, mapa) {
178
+ const stack = [...nodes];
229
179
  while (stack.length > 0) {
230
180
  const node = stack.pop();
231
181
  if (node.filhos && node.filhos.length > 0) {
232
- this.mapaDeExpansao.set(node.rotulo, false);
182
+ mapa.set(node.rotulo, false);
233
183
  stack.push(...node.filhos);
234
184
  }
235
185
  }
236
186
  }
237
- percorrerTodosNos(nodes, callback) {
238
- nodes.forEach(node => {
239
- callback(node);
240
- if (node.filhos && node.filhos.length > 0) {
241
- this.percorrerTodosNos(node.filhos, callback);
242
- }
243
- });
244
- }
245
- atualizarEstadoCollapseButton() {
246
- const nosExpandiveis = this.obterTodosNosExpandiveis();
247
- const nosExpandidos = nosExpandiveis.filter(node => this.mapaDeExpansao.get(node.rotulo) ?? (node.estaExpandido ?? false));
248
- const todosFechados = nosExpandidos.length === 0;
249
- if (todosFechados) {
250
- this.collapsedAll.set(true);
251
- this.iconCollapsed.set('expand_content');
252
- }
253
- else {
254
- this.collapsedAll.set(false);
255
- this.iconCollapsed.set('collapse_all');
256
- }
257
- }
258
- obterTodosNosExpandiveis() {
187
+ obterTodosNosExpandiveis(nodes) {
259
188
  const nosExpandiveis = [];
260
- this.percorrerTodosNos(this.obterDados(), (node) => {
189
+ const stack = [...nodes];
190
+ while (stack.length > 0) {
191
+ const node = stack.pop();
261
192
  if (node.filhos && node.filhos.length > 0) {
262
193
  nosExpandiveis.push(node);
194
+ stack.push(...node.filhos);
263
195
  }
264
- });
196
+ }
265
197
  return nosExpandiveis;
266
198
  }
267
199
  combinarEstruturaComDados(estrutura, dados) {
@@ -277,10 +209,11 @@ export class KvTreeEnvironmentComponent {
277
209
  icone: est.icone,
278
210
  cor: est.cor,
279
211
  ativo: dado?.ativo ?? true,
280
- estaExpandido: est.estaExpandido,
212
+ expanded: est.expanded,
281
213
  filhos: [],
282
214
  actions: est.actions,
283
- data: est.data
215
+ data: est.data,
216
+ showSidebarAction: est.showSidebarAction
284
217
  };
285
218
  mapaEstrutura.set(est.id, no);
286
219
  });
@@ -301,26 +234,53 @@ export class KvTreeEnvironmentComponent {
301
234
  executeAdd() {
302
235
  this.onAddClick.emit();
303
236
  }
304
- ngOnDestroy() {
305
- this._cachedDados = null;
306
- this._cachedListaPlana = null;
307
- this._dadosHash = '';
308
- this._listaPlanaHash = '';
237
+ abrirSidebarParaNo(no) {
238
+ this.currentSidebarNode.set(no);
239
+ this.sidebarVisible.set(true);
240
+ this.onSidebarNodeClick.emit(no);
241
+ }
242
+ filtrarArvoreComHierarquia(nodes, textoBusca) {
243
+ const resultado = [];
244
+ for (const node of nodes) {
245
+ const rotuloLower = node.rotulo.toLowerCase();
246
+ const corresponde = rotuloLower.includes(textoBusca);
247
+ let filhosFiltrados = [];
248
+ if (node.filhos && node.filhos.length > 0) {
249
+ filhosFiltrados = this.filtrarArvoreComHierarquia(node.filhos, textoBusca);
250
+ }
251
+ if (corresponde || filhosFiltrados.length > 0) {
252
+ const noClonado = {
253
+ ...node,
254
+ filhos: filhosFiltrados.length > 0 ? filhosFiltrados : node.filhos,
255
+ expanded: true
256
+ };
257
+ resultado.push(noClonado);
258
+ }
259
+ }
260
+ return resultado;
309
261
  }
310
262
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: KvTreeEnvironmentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
311
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "17.3.8", type: KvTreeEnvironmentComponent, isStandalone: true, selector: "kv-tree-environment", inputs: { arvoreDeDados: { classPropertyName: "arvoreDeDados", publicName: "arvoreDeDados", isSignal: true, isRequired: false, transformFunction: null }, nosSimples: { classPropertyName: "nosSimples", publicName: "nosSimples", isSignal: true, isRequired: false, transformFunction: null }, estruturaArvore: { classPropertyName: "estruturaArvore", publicName: "estruturaArvore", isSignal: true, isRequired: false, transformFunction: null }, dadosArvore: { classPropertyName: "dadosArvore", publicName: "dadosArvore", isSignal: true, isRequired: false, transformFunction: null }, configuracao: { classPropertyName: "configuracao", publicName: "configuracao", isSignal: true, isRequired: false, transformFunction: null }, showButtonCollapsed: { classPropertyName: "showButtonCollapsed", publicName: "showButtonCollapsed", isSignal: true, isRequired: false, transformFunction: null }, showAddButton: { classPropertyName: "showAddButton", publicName: "showAddButton", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onAddClick: "onAddClick", onSelectedItem: "onSelectedItem" }, ngImport: i0, template: "<div class=\"grid-container h-full\">\r\n <span \r\n class=\"material-symbols-outlined text-sm text-500 mx-1 p-1 cursor-pointer hover:surface-300\"\r\n style=\"border-radius: 4px; margin-top: 12px;\" \r\n (click)=\"executeCollapsed()\"\r\n [pTooltip]=\"collapsedAll() ? 'Expandir tudo' : 'Recolher tudo'\"\r\n >\r\n {{ iconCollapsed() }}\r\n </span>\r\n <cdk-virtual-scroll-viewport class=\"h-full w-full\" itemSize=\"40\">\r\n \r\n <ul class=\"lista-arvore-virtual pr-2 py-2\">\r\n <no-arvore \r\n *cdkVirtualFor=\"let no of listaPlana(); trackBy: trackByNode\" \r\n [noPlano]=\"no\"\r\n (noAlternado)=\"alternarNo($event)\"\r\n (actionExecuted)=\"onActionExecuted($event)\" />\r\n </ul>\r\n\r\n </cdk-virtual-scroll-viewport>\r\n</div>", styles: [".grid-container{display:grid;grid-template-columns:auto 1fr;align-items:start}.lista-arvore-virtual{list-style:none;padding:0;margin:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: NoArvoreComponent, selector: "no-arvore", inputs: ["noPlano"], outputs: ["noAlternado", "actionExecuted"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i1.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i1.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i1.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "ngmodule", type: PrimeNgModule }, { kind: "directive", type: i2.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }] }); }
263
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.8", type: KvTreeEnvironmentComponent, isStandalone: true, selector: "kv-tree-environment", inputs: { arvoreDeDados: { classPropertyName: "arvoreDeDados", publicName: "arvoreDeDados", isSignal: true, isRequired: false, transformFunction: null }, nosSimples: { classPropertyName: "nosSimples", publicName: "nosSimples", isSignal: true, isRequired: false, transformFunction: null }, estruturaArvore: { classPropertyName: "estruturaArvore", publicName: "estruturaArvore", isSignal: true, isRequired: false, transformFunction: null }, dadosArvore: { classPropertyName: "dadosArvore", publicName: "dadosArvore", isSignal: true, isRequired: false, transformFunction: null }, configuracao: { classPropertyName: "configuracao", publicName: "configuracao", isSignal: true, isRequired: false, transformFunction: null }, showButtonCollapsed: { classPropertyName: "showButtonCollapsed", publicName: "showButtonCollapsed", isSignal: true, isRequired: false, transformFunction: null }, showAddButton: { classPropertyName: "showAddButton", publicName: "showAddButton", isSignal: true, isRequired: false, transformFunction: null }, showSearchField: { classPropertyName: "showSearchField", publicName: "showSearchField", isSignal: true, isRequired: false, transformFunction: null }, enableSidebar: { classPropertyName: "enableSidebar", publicName: "enableSidebar", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onAddClick: "onAddClick", onSelectedItem: "onSelectedItem", onSidebarNodeClick: "onSidebarNodeClick" }, queries: [{ propertyName: "sidebarTemplate", first: true, predicate: ["sidebar"], descendants: true }], ngImport: i0, template: "<div class=\"flex flex-column h-full\">\n <div class=\"flex flex-row gap-2 p-2\" [formGroup]=\"formFiltro\">\n @if(showSearchField()) {\n <kv-input-text\n placeholder=\"Pesquisar...\"\n icon=\"search\"\n formControlName=\"search\"\n ></kv-input-text>\n }\n\n <kv-button\n severity=\"tertiary\"\n class=\"w-auto\"\n label=\"Expandir\"\n icon=\"expand_content\"\n (click)=\"expandirTodos()\"\n ></kv-button>\n\n <kv-button\n severity=\"tertiary\"\n class=\"w-auto\"\n label=\"Recolher\"\n icon=\"collapse_all\"\n (click)=\"colapsarTodos()\"\n ></kv-button>\n </div>\n\n <div class=\"pl-2 pb-2 flex-1 w-full flex flex-row items-center gap-2\" style=\"min-height: 0; position: relative;\">\n <cdk-virtual-scroll-viewport class=\"h-full flex-1\" itemSize=\"40\">\n <ul class=\"lista-arvore-virtual pr-2 py-2\">\n <no-arvore \n *cdkVirtualFor=\"let no of listaPlana(); trackBy: trackByNode\" \n [noPlano]=\"no\"\n [enableSidebar]=\"enableSidebar()\"\n (noAlternado)=\"alternarNo($event)\"\n (actionExecuted)=\"onActionExecuted($event)\"\n (sidebarClick)=\"abrirSidebarParaNo($event)\" />\n </ul>\n </cdk-virtual-scroll-viewport>\n\n @if (sidebarVisible() && enableSidebar()) {\n <kv-button\n severity=\"tertiary\"\n icon=\"menu\"\n (click)=\"sidebarVisible.set(false)\"\n ></kv-button>\n }\n\n <p-sidebar [visible]=\"sidebarVisible()\" (visibleChange)=\"sidebarVisible.set($event)\" position=\"right\" class=\"pr-2\" [ngStyle]=\"{'flex': '0.6 1 0%'}\" styleClass=\"w-full\">\n <ng-template pTemplate=\"headless\">\n @if (sidebarTemplate && currentSidebarNode()) {\n <ng-container [ngTemplateOutlet]=\"sidebarTemplate\" [ngTemplateOutletContext]=\"{ $implicit: currentSidebarNode() }\"></ng-container>\n }\n </ng-template>\n </p-sidebar>\n </div>\n</div>\n", styles: [".grid-container{display:grid;grid-template-columns:auto 1fr;align-items:start}.lista-arvore-virtual{list-style:none;padding:0;margin:0}::ng-deep .p-component-overlay{display:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: NoArvoreComponent, selector: "no-arvore", inputs: ["noPlano", "enableSidebar"], outputs: ["noAlternado", "actionExecuted", "sidebarClick"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i2.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i2.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i2.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "ngmodule", type: PrimeNgModule }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i4.Sidebar, selector: "p-sidebar", inputs: ["appendTo", "blockScroll", "style", "styleClass", "ariaCloseLabel", "autoZIndex", "baseZIndex", "modal", "dismissible", "showCloseIcon", "closeOnEscape", "transitionOptions", "visible", "position", "fullScreen"], outputs: ["onShow", "onHide", "visibleChange"] }, { kind: "ngmodule", type: KeevoComponentsModule }, { kind: "component", type: i5.KvButtonComponent, selector: "kv-button", inputs: ["fullWidth", "type", "loading", "severity", "size", "icon", "iconPosition", "label", "disabled", "items", "popup", "popupIcon"], outputs: ["iconChange", "onClick"] }, { kind: "component", type: i6.KvInputTextComponent, selector: "kv-input-text", inputs: ["textCaptalized"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i7.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i7.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
312
264
  }
313
265
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: KvTreeEnvironmentComponent, decorators: [{
314
266
  type: Component,
315
- args: [{ standalone: true, selector: 'kv-tree-environment', imports: [
267
+ args: [{ standalone: true, selector: 'kv-tree-environment', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
316
268
  CommonModule,
317
269
  NoArvoreComponent,
318
270
  ScrollingModule,
319
- PrimeNgModule
320
- ], template: "<div class=\"grid-container h-full\">\r\n <span \r\n class=\"material-symbols-outlined text-sm text-500 mx-1 p-1 cursor-pointer hover:surface-300\"\r\n style=\"border-radius: 4px; margin-top: 12px;\" \r\n (click)=\"executeCollapsed()\"\r\n [pTooltip]=\"collapsedAll() ? 'Expandir tudo' : 'Recolher tudo'\"\r\n >\r\n {{ iconCollapsed() }}\r\n </span>\r\n <cdk-virtual-scroll-viewport class=\"h-full w-full\" itemSize=\"40\">\r\n \r\n <ul class=\"lista-arvore-virtual pr-2 py-2\">\r\n <no-arvore \r\n *cdkVirtualFor=\"let no of listaPlana(); trackBy: trackByNode\" \r\n [noPlano]=\"no\"\r\n (noAlternado)=\"alternarNo($event)\"\r\n (actionExecuted)=\"onActionExecuted($event)\" />\r\n </ul>\r\n\r\n </cdk-virtual-scroll-viewport>\r\n</div>", styles: [".grid-container{display:grid;grid-template-columns:auto 1fr;align-items:start}.lista-arvore-virtual{list-style:none;padding:0;margin:0}\n"] }]
271
+ PrimeNgModule,
272
+ KeevoComponentsModule,
273
+ FormsModule,
274
+ ReactiveFormsModule
275
+ ], template: "<div class=\"flex flex-column h-full\">\n <div class=\"flex flex-row gap-2 p-2\" [formGroup]=\"formFiltro\">\n @if(showSearchField()) {\n <kv-input-text\n placeholder=\"Pesquisar...\"\n icon=\"search\"\n formControlName=\"search\"\n ></kv-input-text>\n }\n\n <kv-button\n severity=\"tertiary\"\n class=\"w-auto\"\n label=\"Expandir\"\n icon=\"expand_content\"\n (click)=\"expandirTodos()\"\n ></kv-button>\n\n <kv-button\n severity=\"tertiary\"\n class=\"w-auto\"\n label=\"Recolher\"\n icon=\"collapse_all\"\n (click)=\"colapsarTodos()\"\n ></kv-button>\n </div>\n\n <div class=\"pl-2 pb-2 flex-1 w-full flex flex-row items-center gap-2\" style=\"min-height: 0; position: relative;\">\n <cdk-virtual-scroll-viewport class=\"h-full flex-1\" itemSize=\"40\">\n <ul class=\"lista-arvore-virtual pr-2 py-2\">\n <no-arvore \n *cdkVirtualFor=\"let no of listaPlana(); trackBy: trackByNode\" \n [noPlano]=\"no\"\n [enableSidebar]=\"enableSidebar()\"\n (noAlternado)=\"alternarNo($event)\"\n (actionExecuted)=\"onActionExecuted($event)\"\n (sidebarClick)=\"abrirSidebarParaNo($event)\" />\n </ul>\n </cdk-virtual-scroll-viewport>\n\n @if (sidebarVisible() && enableSidebar()) {\n <kv-button\n severity=\"tertiary\"\n icon=\"menu\"\n (click)=\"sidebarVisible.set(false)\"\n ></kv-button>\n }\n\n <p-sidebar [visible]=\"sidebarVisible()\" (visibleChange)=\"sidebarVisible.set($event)\" position=\"right\" class=\"pr-2\" [ngStyle]=\"{'flex': '0.6 1 0%'}\" styleClass=\"w-full\">\n <ng-template pTemplate=\"headless\">\n @if (sidebarTemplate && currentSidebarNode()) {\n <ng-container [ngTemplateOutlet]=\"sidebarTemplate\" [ngTemplateOutletContext]=\"{ $implicit: currentSidebarNode() }\"></ng-container>\n }\n </ng-template>\n </p-sidebar>\n </div>\n</div>\n", styles: [".grid-container{display:grid;grid-template-columns:auto 1fr;align-items:start}.lista-arvore-virtual{list-style:none;padding:0;margin:0}::ng-deep .p-component-overlay{display:none}\n"] }]
321
276
  }], ctorParameters: () => [], propDecorators: { onAddClick: [{
322
277
  type: Output
323
278
  }], onSelectedItem: [{
324
279
  type: Output
280
+ }], onSidebarNodeClick: [{
281
+ type: Output
282
+ }], sidebarTemplate: [{
283
+ type: ContentChild,
284
+ args: ['sidebar']
325
285
  }] } });
326
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3YtdHJlZS1lbnZpcm9ubWVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rZWV2by1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9rdi10cmVlLWVudmlyb25tZW50L2NvbXBvbmVudHMva3YtdHJlZS1lbnZpcm9ubWVudC9rdi10cmVlLWVudmlyb25tZW50LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tlZXZvLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2t2LXRyZWUtZW52aXJvbm1lbnQvY29tcG9uZW50cy9rdi10cmVlLWVudmlyb25tZW50L2t2LXRyZWUtZW52aXJvbm1lbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBYSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0gsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFckUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQzs7OztBQWN2RSxNQUFNLE9BQU8sMEJBQTBCO0lBNEJyQztRQTFCQSxrQkFBYSxHQUFHLEtBQUssQ0FBYSxFQUFFLENBQUMsQ0FBQztRQUN0QyxlQUFVLEdBQUcsS0FBSyxDQUFvQixFQUFFLENBQUMsQ0FBQztRQUMxQyxvQkFBZSxHQUFHLEtBQUssQ0FFckIsRUFBRSxDQUFDLENBQUM7UUFDTixnQkFBVyxHQUFHLEtBQUssQ0FBZ0IsRUFBRSxDQUFD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LEVBQUUsQ0FBQyxDQUFDO2dCQUN2QixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQzlCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO0lBQzVCLENBQUM7OEdBdlhVLDBCQUEwQjtrR0FBMUIsMEJBQTBCLDBwQ0NuQnZDLGl5QkFvQk0sa01EUEYsWUFBWSwrQkFDWixpQkFBaUIsc0hBQ2pCLGVBQWUsMmpCQUNmLGFBQWE7OzJGQUdKLDBCQUEwQjtrQkFadEMsU0FBUztpQ0FDSSxJQUFJLFlBQ04scUJBQXFCLFdBR3RCO3dCQUNQLFlBQVk7d0JBQ1osaUJBQWlCO3dCQUNqQixlQUFlO3dCQUNmLGFBQWE7cUJBQ2Q7d0RBY1MsVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBpbnB1dCwgc2lnbmFsLCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgZWZmZWN0LCBPbkRlc3Ryb3ksIENoYW5nZURldGVjdG9yUmVmLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTm9BcnZvcmVDb21wb25lbnQgfSBmcm9tICcuLi9uby1hcnZvcmUvbm8tYXJ2b3JlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE5vQXJ2b3JlLCBOb0Fydm9yZVNpbXBsZXMsIENvbmZpZ0Fydm9yZVNpbXBsZXMsIEVzdHJ1dHVyYUFydm9yZSwgRGFkb3NBcnZvcmUsIE5vUGxhbm8gfSBmcm9tICcuLi8uLi9tb2RlbHMvbm8tYXJ2b3JlLm1vZGVsJztcclxuaW1wb3J0IHsgU2Nyb2xsaW5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XHJcbmltcG9ydCB7IFByaW1lTmdNb2R1bGUgfSBmcm9tICcuLi8uLi8uLi8uLi9hcGkvbW9kdWxlcy9wcmltZW5nLm1vZHVsZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIHNlbGVjdG9yOiAna3YtdHJlZS1lbnZpcm9ubWVudCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2t2LXRyZWUtZW52aXJvbm1lbnQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2t2LXRyZWUtZW52aXJvbm1lbnQuY29tcG9uZW50LnNjc3MnXSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsIFxyXG4gICAgTm9BcnZvcmVDb21wb25lbnQsXHJcbiAgICBTY3JvbGxpbmdNb2R1bGUsXHJcbiAgICBQcmltZU5nTW9kdWxlXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEt2VHJlZUVudmlyb25tZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcclxuXHJcbiAgYXJ2b3JlRGVEYWRvcyA9IGlucHV0PE5vQXJ2b3JlW10+KFtdKTtcclxuICBub3NTaW1wbGVzID0gaW5wdXQ8Tm9BcnZvcmVTaW1wbGVzW10+KFtdKTtcclxuICBlc3RydXR1cmFBcnZvcmUgPSBpbnB1dDxcclxuICAgIEVzdHJ1dHVyYUFydm9yZVtdXHJcbiAgPihbXSk7XHJcbiAgZGFkb3NBcnZvcmUgPSBpbnB1dDxEYWRvc0Fydm9yZVtdPihbXSk7XHJcbiAgY29uZmlndXJhY2FvID0gaW5wdXQ8Q29uZmlnQXJ2b3JlU2ltcGxlcz4oe30pO1xyXG4gIHNob3dCdXR0b25Db2xsYXBzZWQgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcclxuICBzaG93QWRkQnV0dG9uID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XHJcblxyXG4gIEBPdXRwdXQoKSBvbkFkZENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG4gIEBPdXRwdXQoKSBvblNlbGVjdGVkSXRlbSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBwcml2YXRlIGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XHJcbiAgcHJpdmF0ZSBtYXBhRGVFeHBhbnNhbyA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xyXG4gIFxyXG4gIHByaXZhdGUgX2NhY2hlZERhZG9zOiBOb0Fydm9yZVtdIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfZGFkb3NIYXNoOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIF9jYWNoZWRMaXN0YVBsYW5hOiBOb1BsYW5vW10gfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIF9saXN0YVBsYW5hSGFzaDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIGxpc3RhUGxhbmEgPSBzaWduYWw8Tm9QbGFub1tdPihbXSk7XHJcbiAgaWNvbkNvbGxhcHNlZCA9IHNpZ25hbDxzdHJpbmc+KCdjb2xsYXBzZV9hbGwnKTtcclxuICBjb2xsYXBzZWRBbGwgPSBzaWduYWw8Ym9vbGVhbj4odHJ1ZSk7XHJcbiAgc2VsZWN0ZWRJdGVtID0gc2lnbmFsPGFueT4obnVsbCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgZWZmZWN0KCgpID0+IHtcclxuICAgICAgY29uc3QgZXN0cnV0dXJhID0gdGhpcy5lc3RydXR1cmFBcnZvcmUoKTtcclxuICAgICAgY29uc3QgZGFkb3MgPSB0aGlzLmRhZG9zQXJ2b3JlKCk7XHJcbiAgICAgIGNvbnN0IHNpbXBsZXMgPSB0aGlzLm5vc1NpbXBsZXMoKTtcclxuICAgICAgY29uc3QgYXJ2b3JlID0gdGhpcy5hcnZvcmVEZURhZG9zKCk7XHJcbiAgICAgIFxyXG4gICAgICBjb25zdCBkYWRvc0hhc2ggPSB0aGlzLmNyaWFySGFzaERhZG9zKGVzdHJ1dHVyYSwgZGFkb3MsIHNpbXBsZXMsIGFydm9yZSk7XHJcbiAgICAgIFxyXG4gICAgICBpZiAodGhpcy5fZGFkb3NIYXNoICE9PSBkYWRvc0hhc2gpIHtcclxuICAgICAgICB0aGlzLl9kYWRvc0hhc2ggPSBkYWRvc0hhc2g7XHJcbiAgICAgICAgdGhpcy5pbnZhbGlkYXJDYWNoZSgpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IHRlbURhZG9zID0gZXN0cnV0dXJhLmxlbmd0aCA+IDAgfHwgZGFkb3MubGVuZ3RoID4gMCB8fCBzaW1wbGVzLmxlbmd0aCA+IDAgfHwgYXJ2b3JlLmxlbmd0aCA+IDA7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHRlbURhZG9zKSB7XHJcbiAgICAgICAgICB0aGlzLmdlcmFyTGlzdGFQbGFuYU90aW1pemFkYSgpO1xyXG4gICAgICAgICAgdGhpcy5hdHVhbGl6YXJFc3RhZG9Db2xsYXBzZUJ1dHRvbigpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmxpc3RhUGxhbmEuc2V0KFtdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0sIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZ2VyYXJMaXN0YVBsYW5hKCk7XHJcbiAgICB0aGlzLmF0dWFsaXphckVzdGFkb0NvbGxhcHNlQnV0dG9uKCk7XHJcbiAgfVxyXG5cclxuICBhbHRlcm5hck5vKG5vUGxhbm86IE5vUGxhbm8pOiB2b2lkIHtcclxuICAgIGlmICghbm9QbGFuby5leHBhbnNpdmVsKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgZXN0YWRvQXR1YWwgPSB0aGlzLm1hcGFEZUV4cGFuc2FvLmdldChub1BsYW5vLmRhZG9zT3JpZ2luYWlzLnJvdHVsbykgPz8gZmFsc2U7XHJcbiAgICB0aGlzLm1hcGFEZUV4cGFuc2FvLnNldChub1BsYW5vLmRhZG9zT3JpZ2luYWlzLnJvdHVsbywgIWVzdGFkb0F0dWFsKTtcclxuXHJcbiAgICB0aGlzLmZvcmNhckF0dWFsaXphY2FvTGlzdGEoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZm9yY2FyQXR1YWxpemFjYW9MaXN0YSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NhY2hlZExpc3RhUGxhbmEgPSBudWxsO1xyXG4gICAgdGhpcy5fbGlzdGFQbGFuYUhhc2ggPSBudWxsO1xyXG4gICAgXHJcbiAgICBjb25zdCBkYWRvcyA9IHRoaXMub2J0ZXJEYWRvc090aW1pemFkbygpO1xyXG4gICAgY29uc3Qgbm92YUxpc3RhUGxhbmEgPSB0aGlzLnRyYW5zZm9ybWFyUGFyYUxpc3RhUGxhbmFPdGltaXphZGEoZGFkb3MpO1xyXG4gICAgXHJcbiAgICB0aGlzLmxpc3RhUGxhbmEuc2V0KG5vdmFMaXN0YVBsYW5hKTtcclxuICAgIFxyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgY29uc3QgZXhwYW5zYW9IYXNoID0gQXJyYXkuZnJvbSh0aGlzLm1hcGFEZUV4cGFuc2FvLmVudHJpZXMoKSlcclxuICAgICAgICAuc29ydCgoW2FdLCBbYl0pID0+IGEubG9jYWxlQ29tcGFyZShiKSlcclxuICAgICAgICAubWFwKChbaywgdl0pID0+IGAke2t9OiR7dn1gKVxyXG4gICAgICAgIC5qb2luKCcsJyk7XHJcbiAgICAgIFxyXG4gICAgICB0aGlzLl9saXN0YVBsYW5hSGFzaCA9IGAke3RoaXMuX2RhZG9zSGFzaH06JHtleHBhbnNhb0hhc2h9YDtcclxuICAgICAgdGhpcy5fY2FjaGVkTGlzdGFQbGFuYSA9IG5vdmFMaXN0YVBsYW5hO1xyXG4gICAgICBcclxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB0aGlzLmF0dWFsaXphckVzdGFkb0NvbGxhcHNlQnV0dG9uKCk7XHJcbiAgICB9LCAwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JpYXJIYXNoRGFkb3MoZXN0cnV0dXJhOiBFc3RydXR1cmFBcnZvcmVbXSwgZGFkb3M6IERhZG9zQXJ2b3JlW10sIHNpbXBsZXM6IE5vQXJ2b3JlU2ltcGxlc1tdLCBhcnZvcmU6IE5vQXJ2b3JlW10pOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZXN0cnV0dXJhSGFzaCA9IGBlOiR7ZXN0cnV0dXJhLmxlbmd0aH06JHtlc3RydXR1cmEubWFwKGUgPT4gYCR7ZS5pZH06JHtlLmxhYmVsfWApLmpvaW4oJywnKX1gO1xyXG4gICAgY29uc3QgZGFkb3NIYXNoID0gYGQ6JHtkYWRvcy5sZW5ndGh9OiR7ZGFkb3MubWFwKGQgPT4gYCR7ZC5pZH1gKS5qb2luKCcsJyl9YDtcclxuICAgIGNvbnN0IHNpbXBsZXNIYXNoID0gYHM6JHtzaW1wbGVzLmxlbmd0aH06JHtzaW1wbGVzLm1hcChzID0+IHMua2V5KS5qb2luKCcsJyl9YDtcclxuICAgIGNvbnN0IGFydm9yZUhhc2ggPSBgYToke2Fydm9yZS5sZW5ndGh9OiR7YXJ2b3JlLm1hcChhID0+IGEucm90dWxvKS5qb2luKCcsJyl9YDtcclxuICAgIFxyXG4gICAgcmV0dXJuIGAke2VzdHJ1dHVyYUhhc2h9fCR7ZGFkb3NIYXNofXwke3NpbXBsZXNIYXNofXwke2Fydm9yZUhhc2h9YDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW52YWxpZGFyQ2FjaGUoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jYWNoZWREYWRvcyA9IG51bGw7XHJcbiAgICB0aGlzLl9jYWNoZWRMaXN0YVBsYW5hID0gbnVsbDtcclxuICAgIHRoaXMuX2xpc3RhUGxhbmFIYXNoID0gbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2VyYXJMaXN0YVBsYW5hT3RpbWl6YWRhKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZGFkb3MgPSB0aGlzLm9idGVyRGFkb3NPdGltaXphZG8oKTtcclxuICAgIFxyXG4gICAgY29uc3QgZXhwYW5zYW9IYXNoID0gQXJyYXkuZnJvbSh0aGlzLm1hcGFEZUV4cGFuc2FvLmVudHJpZXMoKSlcclxuICAgICAgLnNvcnQoKFthXSwgW2JdKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpXHJcbiAgICAgIC5tYXAoKFtrLCB2XSkgPT4gYCR7a306JHt2fWApXHJcbiAgICAgIC5qb2luKCcsJyk7XHJcbiAgICBcclxuICAgIGNvbnN0IGxpc3RhUGxhbmFIYXNoID0gYCR7dGhpcy5fZGFkb3NIYXNofToke2V4cGFuc2FvSGFzaH1gO1xyXG4gICAgXHJcbiAgICBpZiAodGhpcy5fbGlzdGFQbGFuYUhhc2ggPT09IGxpc3RhUGxhbmFIYXNoICYmIHRoaXMuX2NhY2hlZExpc3RhUGxhbmEpIHtcclxuICAgICAgdGhpcy5saXN0YVBsYW5hLnNldCh0aGlzLl9jYWNoZWRMaXN0YVBsYW5hKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBjb25zdCBub3ZhTGlzdGFQbGFuYSA9IHRoaXMudHJhbnNmb3JtYXJQYXJhTGlzdGFQbGFuYU90aW1pemFkYShkYWRvcyk7XHJcbiAgICBcclxuICAgIHRoaXMuX2NhY2hlZExpc3RhUGxhbmEgPSBub3ZhTGlzdGFQbGFuYTtcclxuICAgIHRoaXMuX2xpc3RhUGxhbmFIYXNoID0gbGlzdGFQbGFuYUhhc2g7XHJcbiAgICBcclxuICAgIHRoaXMubGlzdGFQbGFuYS5zZXQobm92YUxpc3RhUGxhbmEpO1xyXG4gIH1cclxuXHJcbiAgb25BY3Rpb25FeGVjdXRlZChub1BsYW5vOiBOb1BsYW5vKTogdm9pZCB7XHJcbiAgICBjb25zdCBkYWRvcyA9IG5vUGxhbm8uZGFkb3NPcmlnaW5haXM7XHJcbiAgICB0aGlzLnNlbGVjdGVkSXRlbS5zZXQoZGFkb3MpO1xyXG4gICAgdGhpcy5vblNlbGVjdGVkSXRlbS5lbWl0KGRhZG9zKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2VyYXJMaXN0YVBsYW5hKCk6IHZvaWQge1xyXG4gICAgdGhpcy5nZXJhckxpc3RhUGxhbmFPdGltaXphZGEoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb2J0ZXJEYWRvc090aW1pemFkbygpOiBOb0Fydm9yZVtdIHtcclxuICAgIGlmICh0aGlzLl9jYWNoZWREYWRvcyAmJiB0aGlzLl9kYWRvc0hhc2gpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZERhZG9zO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGVzdHJ1dHVyYSA9IHRoaXMuZXN0cnV0dXJhQXJ2b3JlKCk7XHJcbiAgICBjb25zdCBkYWRvcyA9IHRoaXMuZGFkb3NBcnZvcmUoKTtcclxuICAgIFxyXG4gICAgbGV0IHJlc3VsdGFkbzogTm9BcnZvcmVbXTtcclxuICAgIFxyXG4gICAgaWYgKGVzdHJ1dHVyYSAmJiBlc3RydXR1cmEubGVuZ3RoID4gMCkge1xyXG4gICAgICByZXN1bHRhZG8gPSB0aGlzLmNvbWJpbmFyRXN0cnV0dXJhQ29tRGFkb3MoZXN0cnV0dXJhLCBkYWRvcyB8fCBbXSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBub3NTaW1wbGVzID0gdGhpcy5ub3NTaW1wbGVzKCk7XHJcbiAgICAgIGlmIChub3NTaW1wbGVzICYmIG5vc1NpbXBsZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHJlc3VsdGFkbyA9IHRoaXMuY29udmVydGVyU2ltcGxlc1BhcmFDb21wbGV0byhub3NTaW1wbGVzKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXN1bHRhZG8gPSB0aGlzLmFydm9yZURlRGFkb3MoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICB0aGlzLl9jYWNoZWREYWRvcyA9IHJlc3VsdGFkbztcclxuICAgIHJldHVybiByZXN1bHRhZG87XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9idGVyRGFkb3MoKTogTm9BcnZvcmVbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5vYnRlckRhZG9zT3RpbWl6YWRvKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnZlcnRlclNpbXBsZXNQYXJhQ29tcGxldG8obm9zU2ltcGxlczogTm9BcnZvcmVTaW1wbGVzW10pOiBOb0Fydm9yZVtdIHtcclxuICAgIGNvbnN0IG1hcGEgPSBuZXcgTWFwPHN0cmluZywgTm9BcnZvcmU+KCk7XHJcbiAgICBjb25zdCByYWl6OiBOb0Fydm9yZVtdID0gW107XHJcblxyXG4gICAgbm9zU2ltcGxlcy5mb3JFYWNoKHNpbXBsZXMgPT4ge1xyXG4gICAgICBjb25zdCBubzogTm9BcnZvcmUgPSB7XHJcbiAgICAgICAgcm90dWxvOiBzaW1wbGVzLnJvdHVsbyxcclxuICAgICAgICBpY29uZTogc2ltcGxlcy5pY29uZSxcclxuICAgICAgICBjb3I6IHNpbXBsZXMuY29yLFxyXG4gICAgICAgIGF0aXZvOiBzaW1wbGVzLmF0aXZvLFxyXG4gICAgICAgIGVzdGFFeHBhbmRpZG86IHNpbXBsZXMuZXN0YUV4cGFuZGlkbyxcclxuICAgICAgICBmaWxob3M6IFtdXHJcbiAgICAgIH07XHJcbiAgICAgIG1hcGEuc2V0KHNpbXBsZXMua2V5LCBubyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBub3NTaW1wbGVzLmZvckVhY2goc2ltcGxlcyA9PiB7XHJcbiAgICAgIGNvbnN0IG5vID0gbWFwYS5nZXQoc2ltcGxlcy5rZXkpITtcclxuICAgICAgY29uc3QgcGFydGVzID0gc2ltcGxlcy5rZXkuc3BsaXQoJy0nKTtcclxuICAgICAgXHJcbiAgICAgIGlmIChwYXJ0ZXMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgcmFpei5wdXNoKG5vKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBrZXlQYWkgPSBwYXJ0ZXMuc2xpY2UoMCwgLTEpLmpvaW4oJy0nKTtcclxuICAgICAgICBjb25zdCBwYWkgPSBtYXBhLmdldChrZXlQYWkpO1xyXG4gICAgICAgIGlmIChwYWkpIHtcclxuICAgICAgICAgIHBhaS5maWxob3MgPSBwYWkuZmlsaG9zIHx8IFtdO1xyXG4gICAgICAgICAgcGFpLmZpbGhvcy5wdXNoKG5vKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiByYWl6O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cmFuc2Zvcm1hclBhcmFMaXN0YVBsYW5hKG5vZGVzOiBOb0Fydm9yZVtdLCBuaXZlbCA9IDApOiBOb1BsYW5vW10ge1xyXG4gICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtYXJQYXJhTGlzdGFQbGFuYU90aW1pemFkYShub2Rlcywgbml2ZWwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cmFuc2Zvcm1hclBhcmFMaXN0YVBsYW5hT3RpbWl6YWRhKG5vZGVzOiBOb0Fydm9yZVtdLCBuaXZlbCA9IDApOiBOb1BsYW5vW10ge1xyXG4gICAgY29uc3QgbGlzdGE6IE5vUGxhbm9bXSA9IFtdO1xyXG4gICAgXHJcbiAgICBub2Rlcy5mb3JFYWNoKChub2RlLCBpbmRleCkgPT4ge1xyXG4gICAgICBjb25zdCByb3R1bG8gPSBub2RlLnJvdHVsbztcclxuICAgICAgY29uc3QgZXN0YUV4cGFuZGlkbyA9IHRoaXMubWFwYURlRXhwYW5zYW8uZ2V0KHJvdHVsbykgPz8gKG5vZGUuZXN0YUV4cGFuZGlkbyA/PyBmYWxzZSk7XHJcbiAgICAgIGNvbnN0IHRlbUZpbGhvcyA9ICEhKG5vZGUuZmlsaG9zICYmIG5vZGUuZmlsaG9zLmxlbmd0aCA+IDApO1xyXG4gICAgICBcclxuICAgICAgY29uc3Qgbm9QbGFubzogTm9QbGFubyA9IHtcclxuICAgICAgICBpZDogcm90dWxvLFxyXG4gICAgICAgIG5pdmVsOiBuaXZlbCxcclxuICAgICAgICBleHBhbnNpdmVsOiB0ZW1GaWxob3MsXHJcbiAgICAgICAgZXN0YUV4cGFuZGlkbzogZXN0YUV4cGFuZGlkbyxcclxuICAgICAgICBpc0xhc3Q6IGluZGV4ID09PSBub2Rlcy5sZW5ndGggLSAxLFxyXG4gICAgICAgIGRhZG9zT3JpZ2luYWlzOiBub2RlXHJcbiAgICAgIH07XHJcbiAgICAgIFxyXG4gICAgICBsaXN0YS5wdXNoKG5vUGxhbm8pO1xyXG5cclxuICAgICAgaWYgKGVzdGFFeHBhbmRpZG8gJiYgdGVtRmlsaG9zKSB7XHJcbiAgICAgICAgY29uc3QgZmlsaG9zUGxhbm9zID0gdGhpcy50cmFuc2Zvcm1hclBhcmFMaXN0YVBsYW5hT3RpbWl6YWRhKG5vZGUuZmlsaG9zISwgbml2ZWwgKyAxKTtcclxuICAgICAgICBsaXN0YS5wdXNoKC4uLmZpbGhvc1BsYW5vcyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgXHJcbiAgICByZXR1cm4gbGlzdGE7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5Tm9kZShpbmRleDogbnVtYmVyLCBub1BsYW5vOiBOb1BsYW5vKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBub1BsYW5vLmlkO1xyXG4gIH1cclxuXHJcbiAgZXhlY3V0ZUNvbGxhcHNlZCgpIHtcclxuICAgIGNvbnN0IHRvZG9zQ29sYXBzYWRvcyA9IHRoaXMuY29sbGFwc2VkQWxsKCk7XHJcbiAgICBcclxuICAgIGlmICh0b2Rvc0NvbGFwc2Fkb3MpIHtcclxuICAgICAgdGhpcy5leHBhbmRpclRvZG9zT3RpbWl6YWRvKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNvbGFwc2FyVG9kb3NPdGltaXphZG8oKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgdGhpcy5mb3JjYXJBdHVhbGl6YWNhb0xpc3RhKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGV4cGFuZGlyVG9kb3MoKTogdm9pZCB7XHJcbiAgICB0aGlzLmV4cGFuZGlyVG9kb3NPdGltaXphZG8oKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29sYXBzYXJUb2RvcygpOiB2b2lkIHtcclxuICAgIHRoaXMuY29sYXBzYXJUb2Rvc090aW1pemFkbygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBleHBhbmRpclRvZG9zT3RpbWl6YWRvKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZGFkb3MgPSB0aGlzLm9idGVyRGFkb3NPdGltaXphZG8oKTtcclxuICAgIGNvbnN0IHN0YWNrOiBOb0Fydm9yZVtdID0gWy4uLmRhZG9zXTtcclxuICAgIFxyXG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3Qgbm9kZSA9IHN0YWNrLnBvcCgpITtcclxuICAgICAgXHJcbiAgICAgIGlmIChub2RlLmZpbGhvcyAmJiBub2RlLmZpbGhvcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5tYXBhRGVFeHBhbnNhby5zZXQobm9kZS5yb3R1bG8sIHRydWUpO1xyXG4gICAgICAgIHN0YWNrLnB1c2goLi4ubm9kZS5maWxob3MpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbGFwc2FyVG9kb3NPdGltaXphZG8oKTogdm9pZCB7XHJcbiAgICBjb25zdCBkYWRvcyA9IHRoaXMub2J0ZXJEYWRvc090aW1pemFkbygpO1xyXG4gICAgY29uc3Qgc3RhY2s6IE5vQXJ2b3JlW10gPSBbLi4uZGFkb3NdO1xyXG4gICAgXHJcbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBub2RlID0gc3RhY2sucG9wKCkhO1xyXG4gICAgICBcclxuICAgICAgaWYgKG5vZGUuZmlsaG9zICYmIG5vZGUuZmlsaG9zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLm1hcGFEZUV4cGFuc2FvLnNldChub2RlLnJvdHVsbywgZmFsc2UpO1xyXG4gICAgICAgIHN0YWNrLnB1c2goLi4ubm9kZS5maWxob3MpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBlcmNvcnJlclRvZG9zTm9zKG5vZGVzOiBOb0Fydm9yZVtdLCBjYWxsYmFjazogKG5vZGU6IE5vQXJ2b3JlKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICBub2Rlcy5mb3JFYWNoKG5vZGUgPT4ge1xyXG4gICAgICBjYWxsYmFjayhub2RlKTtcclxuICAgICAgaWYgKG5vZGUuZmlsaG9zICYmIG5vZGUuZmlsaG9zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLnBlcmNvcnJlclRvZG9zTm9zKG5vZGUuZmlsaG9zLCBjYWxsYmFjayk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhdHVhbGl6YXJFc3RhZG9Db2xsYXBzZUJ1dHRvbigpOiB2b2lkIHtcclxuICAgIGNvbnN0IG5vc0V4cGFuZGl2ZWlzID0gdGhpcy5vYnRlclRvZG9zTm9zRXhwYW5kaXZlaXMoKTtcclxuICAgIGNvbnN0IG5vc0V4cGFuZGlkb3MgPSBub3NFeHBhbmRpdmVpcy5maWx0ZXIobm9kZSA9PiBcclxuICAgICAgdGhpcy5tYXBhRGVFeHBhbnNhby5nZXQobm9kZS5yb3R1bG8pID8/IChub2RlLmVzdGFFeHBhbmRpZG8gPz8gZmFsc2UpXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IHRvZG9zRmVjaGFkb3MgPSBub3NFeHBhbmRpZG9zLmxlbmd0aCA9PT0gMDtcclxuXHJcbiAgICBpZiAodG9kb3NGZWNoYWRvcykge1xyXG4gICAgICB0aGlzLmNvbGxhcHNlZEFsbC5zZXQodHJ1ZSk7XHJcbiAgICAgIHRoaXMuaWNvbkNvbGxhcHNlZC5zZXQoJ2V4cGFuZF9jb250ZW50Jyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNvbGxhcHNlZEFsbC5zZXQoZmFsc2UpO1xyXG4gICAgICB0aGlzLmljb25Db2xsYXBzZWQuc2V0KCdjb2xsYXBzZV9hbGwnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgb2J0ZXJUb2Rvc05vc0V4cGFuZGl2ZWlzKCk6IE5vQXJ2b3JlW10ge1xyXG4gICAgY29uc3Qgbm9zRXhwYW5kaXZlaXM6IE5vQXJ2b3JlW10gPSBbXTtcclxuICAgIFxyXG4gICAgdGhpcy5wZXJjb3JyZXJUb2Rvc05vcyh0aGlzLm9idGVyRGFkb3MoKSwgKG5vZGUpID0+IHtcclxuICAgICAgaWYgKG5vZGUuZmlsaG9zICYmIG5vZGUuZmlsaG9zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBub3NFeHBhbmRpdmVpcy5wdXNoKG5vZGUpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIFxyXG4gICAgcmV0dXJuIG5vc0V4cGFuZGl2ZWlzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb21iaW5hckVzdHJ1dHVyYUNvbURhZG9zKGVzdHJ1dHVyYTogRXN0cnV0dXJhQXJ2b3JlW10sIGRhZG9zOiBEYWRvc0Fydm9yZVtdKTogTm9BcnZvcmVbXSB7XHJcbiAgICBjb25zdCBtYXBhRGFkb3MgPSBuZXcgTWFwKGRhZG9zLm1hcChkID0+IFtkLmlkLCBkXSkpO1xyXG4gICAgY29uc3QgbWFwYUVzdHJ1dHVyYSA9IG5ldyBNYXA8bnVtYmVyLCBOb0Fydm9yZT4oKTtcclxuICAgIGNvbnN0IHJhaXo6IE5vQXJ2b3JlW10gPSBbXTtcclxuXHJcbiAgICBlc3RydXR1cmFcclxuICAgICAgLnNvcnQoKGEsIGIpID0+IChhLm9yZGVtIHx8IDApIC0gKGIub3JkZW0gfHwgMCkpIFxyXG4gICAgICAuZm9yRWFjaChlc3QgPT4ge1xyXG4gICAgICAgIGNvbnN0IGRhZG8gPSBtYXBhRGFkb3MuZ2V0KGVzdC5pZCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3Qgbm86IE5vQXJ2b3JlID0ge1xyXG4gICAgICAgICAgcm90dWxvOiBkYWRvPy5yb3R1bG8gfHwgZXN0LmxhYmVsLFxyXG4gICAgICAgICAgaWNvbmU6IGVzdC5pY29uZSxcclxuICAgICAgICAgIGNvcjogZXN0LmNvcixcclxuICAgICAgICAgIGF0aXZvOiBkYWRvPy5hdGl2byA/PyB0cnVlLFxyXG4gICAgICAgICAgZXN0YUV4cGFuZGlkbzogZXN0LmVzdGFFeHBhbmRpZG8sXHJcbiAgICAgICAgICBmaWxob3M6IFtdLFxyXG4gICAgICAgICAgYWN0aW9uczogZXN0LmFjdGlvbnMsXHJcbiAgICAgICAgICBkYXRhOiBlc3QuZGF0YVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgXHJcbiAgICAgICAgbWFwYUVzdHJ1dHVyYS5zZXQoZXN0LmlkLCBubyk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIGVzdHJ1dHVyYS5mb3JFYWNoKGVzdCA9PiB7XHJcbiAgICAgIGNvbnN0IG5vID0gbWFwYUVzdHJ1dHVyYS5nZXQoZXN0LmlkKSE7XHJcbiAgICAgIFxyXG4gICAgICBpZiAoIWVzdC5wYXJlbnRJZCkge1xyXG4gICAgICAgIHJhaXoucHVzaChubyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgcGFpID0gbWFwYUVzdHJ1dHVyYS5nZXQoZXN0LnBhcmVudElkKTtcclxuICAgICAgICBpZiAocGFpKSB7XHJcbiAgICAgICAgICBwYWkuZmlsaG9zIS5wdXNoKG5vKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiByYWl6O1xyXG4gIH1cclxuXHJcbiAgZXhlY3V0ZUFkZCgpIHtcclxuICAgIHRoaXMub25BZGRDbGljay5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NhY2hlZERhZG9zID0gbnVsbDtcclxuICAgIHRoaXMuX2NhY2hlZExpc3RhUGxhbmEgPSBudWxsO1xyXG4gICAgdGhpcy5fZGFkb3NIYXNoID0gJyc7XHJcbiAgICB0aGlzLl9saXN0YVBsYW5hSGFzaCA9ICcnOyBcclxuICB9XHJcblxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJncmlkLWNvbnRhaW5lciBoLWZ1bGxcIj5cclxuICA8c3BhbiBcclxuICAgIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCB0ZXh0LXNtIHRleHQtNTAwIG14LTEgcC0xIGN1cnNvci1wb2ludGVyIGhvdmVyOnN1cmZhY2UtMzAwXCJcclxuICAgIHN0eWxlPVwiYm9yZGVyLXJhZGl1czogNHB4OyBtYXJnaW4tdG9wOiAxMnB4O1wiIFxyXG4gICAgKGNsaWNrKT1cImV4ZWN1dGVDb2xsYXBzZWQoKVwiXHJcbiAgICBbcFRvb2x0aXBdPVwiY29sbGFwc2VkQWxsKCkgPyAnRXhwYW5kaXIgdHVkbycgOiAnUmVjb2xoZXIgdHVkbydcIlxyXG4gID5cclxuICAgIHt7IGljb25Db2xsYXBzZWQoKSB9fVxyXG4gIDwvc3Bhbj5cclxuICA8Y2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0IGNsYXNzPVwiaC1mdWxsIHctZnVsbFwiIGl0ZW1TaXplPVwiNDBcIj5cclxuICAgIFxyXG4gICAgPHVsIGNsYXNzPVwibGlzdGEtYXJ2b3JlLXZpcnR1YWwgcHItMiBweS0yXCI+XHJcbiAgICAgIDxuby1hcnZvcmUgXHJcbiAgICAgICAgKmNka1ZpcnR1YWxGb3I9XCJsZXQgbm8gb2YgbGlzdGFQbGFuYSgpOyB0cmFja0J5OiB0cmFja0J5Tm9kZVwiIFxyXG4gICAgICAgIFtub1BsYW5vXT1cIm5vXCJcclxuICAgICAgICAobm9BbHRlcm5hZG8pPVwiYWx0ZXJuYXJObygkZXZlbnQpXCJcclxuICAgICAgICAoYWN0aW9uRXhlY3V0ZWQpPVwib25BY3Rpb25FeGVjdXRlZCgkZXZlbnQpXCIgLz5cclxuICAgIDwvdWw+XHJcblxyXG4gIDwvY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxyXG48L2Rpdj4iXX0=
286
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3YtdHJlZS1lbnZpcm9ubWVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rZWV2by1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9rdi10cmVlLWVudmlyb25tZW50L2NvbXBvbmVudHMva3YtdHJlZS1lbnZpcm9ubWVudC9rdi10cmVlLWVudmlyb25tZW50LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tlZXZvLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2t2LXRyZWUtZW52aXJvbm1lbnQvY29tcG9uZW50cy9rdi10cmVlLWVudmlyb25tZW50L2t2LXRyZWUtZW52aXJvbm1lbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBVSxZQUFZLEVBQWUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdKLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRXJFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDdkUsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDOzs7Ozs7Ozs7QUFrQnpFLE1BQU0sT0FB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QywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQzdFLENBQUM7WUFFRCxJQUFJLFdBQVcsSUFBSSxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUM5QyxNQUFNLFNBQVMsR0FBYTtvQkFDMUIsR0FBRyxJQUFJO29CQUNQLE1BQU0sRUFBRSxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTTtvQkFDbEUsUUFBUSxFQUFFLElBQUk7aUJBQ2YsQ0FBQztnQkFDRixTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzVCLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQzs4R0FyVFUsMEJBQTBCO2tHQUExQiwwQkFBMEIsa2xEQzFCdkMsMitEQXlEQSw4T0R4Q0ksWUFBWSwyUkFDWixpQkFBaUIsdUpBQ2pCLGVBQWUsMmpCQUNmLGFBQWEsbWRBQ2IscUJBQXFCLG1ZQUNyQixXQUFXLGtTQUNYLG1CQUFtQjs7MkZBR1YsMEJBQTBCO2tCQWhCdEMsU0FBUztpQ0FDSSxJQUFJLFlBQ04scUJBQXFCLG1CQUdkLHVCQUF1QixDQUFDLE1BQU0sV0FDdEM7d0JBQ1AsWUFBWTt3QkFDWixpQkFBaUI7d0JBQ2pCLGVBQWU7d0JBQ2YsYUFBYTt3QkFDYixxQkFBcUI7d0JBQ3JCLFdBQVc7d0JBQ1gsbUJBQW1CO3FCQUN0Qjt3REFJVyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUVrQixlQUFlO3NCQUF2QyxZQUFZO3VCQUFDLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgaW5wdXQsIHNpZ25hbCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIGNvbXB1dGVkLCBpbmplY3QsIENvbnRlbnRDaGlsZCwgVGVtcGxhdGVSZWYsIGVmZmVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTm9BcnZvcmVDb21wb25lbnQgfSBmcm9tICcuLi9uby1hcnZvcmUvbm8tYXJ2b3JlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOb0Fydm9yZSwgTm9BcnZvcmVTaW1wbGVzLCBDb25maWdBcnZvcmVTaW1wbGVzLCBFc3RydXR1cmFBcnZvcmUsIERhZG9zQXJ2b3JlLCBOb1BsYW5vIH0gZnJvbSAnLi4vLi4vbW9kZWxzL25vLWFydm9yZS5tb2RlbCc7XG5pbXBvcnQgeyBTY3JvbGxpbmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcbmltcG9ydCB7IFByaW1lTmdNb2R1bGUgfSBmcm9tICcuLi8uLi8uLi8uLi9hcGkvbW9kdWxlcy9wcmltZW5nLm1vZHVsZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHsgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBLZWV2b0NvbXBvbmVudHNNb2R1bGUgfSBmcm9tICcuLi8uLi8uLi9rZWV2by1jb21wb25lbnRzLm1vZHVsZSc7XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ2t2LXRyZWUtZW52aXJvbm1lbnQnLFxuICB0ZW1wbGF0ZVVybDogJy4va3YtdHJlZS1lbnZpcm9ubWVudC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2t2LXRyZWUtZW52aXJvbm1lbnQuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgTm9BcnZvcmVDb21wb25lbnQsXG4gICAgU2Nyb2xsaW5nTW9kdWxlLFxuICAgIFByaW1lTmdNb2R1bGUsXG4gICAgS2Vldm9Db21wb25lbnRzTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGVcbl0sXG59KVxuZXhwb3J0IGNsYXNzIEt2VHJlZUVudmlyb25tZW50Q29tcG9uZW50IHtcblxuICBAT3V0cHV0KCkgb25BZGRDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIG9uU2VsZWN0ZWRJdGVtID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBvblNpZGViYXJOb2RlQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPE5vQXJ2b3JlPigpO1xuXG4gIEBDb250ZW50Q2hpbGQoJ3NpZGViYXInKSBzaWRlYmFyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIGFydm9yZURlRGFkb3MgPSBpbnB1dDxOb0Fydm9yZVtdPihbXSk7XG4gIG5vc1NpbXBsZXMgPSBpbnB1dDxOb0Fydm9yZVNpbXBsZXNbXT4oW10pO1xuICBlc3RydXR1cmFBcnZvcmUgPSBpbnB1dDxFc3RydXR1cmFBcnZvcmVbXT4oW10pO1xuICBkYWRvc0Fydm9yZSA9IGlucHV0PERhZG9zQXJ2b3JlW10+KFtdKTtcbiAgY29uZmlndXJhY2FvID0gaW5wdXQ8Q29uZmlnQXJ2b3JlU2ltcGxlcz4oe30pO1xuICBzaG93QnV0dG9uQ29sbGFwc2VkID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG4gIHNob3dBZGRCdXR0b24gPSBpbnB1dDxib29sZWFuPih0cnVlKTtcbiAgc2hvd1NlYXJjaEZpZWxkID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICBlbmFibGVTaWRlYmFyID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIHNpZGViYXJWaXNpYmxlID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgc2VsZWN0ZWRJdGVtID0gc2lnbmFsPGFueT4obnVsbCk7XG4gIGN1cnJlbnRTaWRlYmFyTm9kZSA9IHNpZ25hbDxOb0Fydm9yZSB8IG51bGw+KG51bGwpO1xuICBcbiAgcHJpdmF0ZSBleHBhbnNhb1N0YXRlID0gc2lnbmFsPE1hcDxzdHJpbmcsIGJvb2xlYW4+PihuZXcgTWFwKCkpO1xuICBcbiAgZm9ybUZpbHRybyA9IG5ldyBGb3JtR3JvdXAoe1xuICAgIHNlYXJjaDogbmV3IEZvcm1Db250cm9sKCcnKVxuICB9KTtcblxuICBwcml2YXRlIHNlYXJjaFZhbHVlID0gdG9TaWduYWwodGhpcy5mb3JtRmlsdHJvLmdldCgnc2VhcmNoJykhLnZhbHVlQ2hhbmdlcywgeyBpbml0aWFsVmFsdWU6ICcnIH0pO1xuXG4gIHByaXZhdGUgZGFkb3NQcm9jZXNzYWRvcyA9IGNvbXB1dGVkPE5vQXJ2b3JlW10+KCgpID0+IHtcbiAgICBjb25zdCBlc3RydXR1cmEgPSB0aGlzLmVzdHJ1dHVyYUFydm9yZSgpO1xuICAgIGNvbnN0IGRhZG9zID0gdGhpcy5kYWRvc0Fydm9yZSgpO1xuICAgIGNvbnN0IHNpbXBsZXMgPSB0aGlzLm5vc1NpbXBsZXMoKTtcbiAgICBjb25zdCBhcnZvcmUgPSB0aGlzLmFydm9yZURlRGFkb3MoKTtcblxuICAgIGlmIChlc3RydXR1cmEgJiYgZXN0cnV0dXJhLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbWJpbmFyRXN0cnV0dXJhQ29tRGFkb3MoZXN0cnV0dXJhLCBkYWRvcyB8fCBbXSk7XG4gICAgfSBlbHNlIGlmIChzaW1wbGVzICYmIHNpbXBsZXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydGVyU2ltcGxlc1BhcmFDb21wbGV0byhzaW1wbGVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGFydm9yZTtcbiAgICB9XG4gIH0pO1xuXG4gIHByaXZhdGUgZGFkb3NGaWx0cmFkb3MgPSBjb21wdXRlZDxOb0Fydm9yZVtdPigoKSA9PiB7XG4gICAgY29uc3Qgc2VhcmNoID0gdGhpcy5zZWFyY2hWYWx1ZSgpPy50cmltKCkudG9Mb3dlckNhc2UoKSB8fCAnJztcbiAgICBjb25zdCBkYWRvcyA9IHRoaXMuZGFkb3NQcm9jZXNzYWRvcygpO1xuXG4gICAgaWYgKCFzZWFyY2gpIHtcbiAgICAgIHJldHVybiBkYWRvcztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5maWx0cmFyQXJ2b3JlQ29tSGllcmFycXVpYShkYWRvcywgc2VhcmNoKTtcbiAgfSk7XG5cbiAgbGlzdGFQbGFuYSA9IGNvbXB1dGVkPE5vUGxhbm9bXT4oKCkgPT4ge1xuICAgIGNvbnN0IGRhZG9zID0gdGhpcy5kYWRvc0ZpbHRyYWRvcygpO1xuICAgIGNvbnN0IGV4cGFuc2FvTWFwID0gdGhpcy5leHBhbnNhb1N0YXRlKCk7XG4gICAgXG4gICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtYXJQYXJhTGlzdGFQbGFuYShkYWRvcywgZXhwYW5zYW9NYXAsIDApO1xuICB9KTtcblxuICBpY29uQ29sbGFwc2VkID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PiB7XG4gICAgY29uc3Qgbm9zRXhwYW5kaXZlaXMgPSB0aGlzLm9idGVyVG9kb3NOb3NFeHBhbmRpdmVpcyh0aGlzLmRhZG9zUHJvY2Vzc2Fkb3MoKSk7XG4gICAgY29uc3QgZXhwYW5zYW9NYXAgPSB0aGlzLmV4cGFuc2FvU3RhdGUoKTtcbiAgICBcbiAgICBjb25zdCBhbGd1bUV4cGFuZGlkbyA9IG5vc0V4cGFuZGl2ZWlzLnNvbWUobm9kZSA9PiBcbiAgICAgIGV4cGFuc2FvTWFwLmdldChub2RlLnJvdHVsbykgPz8gKG5vZGUuZXhwYW5kZWQgPz8gZmFsc2UpXG4gICAgKTtcblxuICAgIHJldHVybiBhbGd1bUV4cGFuZGlkbyA/ICdjb2xsYXBzZV9hbGwnIDogJ2V4cGFuZF9jb250ZW50JztcbiAgfSk7XG5cbiAgY29sbGFwc2VkQWxsID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLmljb25Db2xsYXBzZWQoKSA9PT0gJ2V4cGFuZF9jb250ZW50JztcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHNlYXJjaCA9IHRoaXMuc2VhcmNoVmFsdWUoKT8udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCBkYWRvcyA9IHRoaXMuZGFkb3NGaWx0cmFkb3MoKTtcbiAgICAgIFxuICAgICAgaWYgKHNlYXJjaCkge1xuICAgICAgICB0aGlzLmV4cGFuZGlyVG9kb3NOb3MoZGFkb3MpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYWx0ZXJuYXJObyhub1BsYW5vOiBOb1BsYW5vKTogdm9pZCB7XG4gICAgaWYgKCFub1BsYW5vLmV4cGFuc2l2ZWwpIHJldHVybjtcblxuICAgIGNvbnN0IG5vdm9NYXBhID0gbmV3IE1hcCh0aGlzLmV4cGFuc2FvU3RhdGUoKSk7XG4gICAgY29uc3QgZXN0YWRvQXR1YWwgPSBub3ZvTWFwYS5nZXQobm9QbGFuby5kYWRvc09yaWdpbmFpcy5yb3R1bG8pID8/IChub1BsYW5vLmRhZG9zT3JpZ2luYWlzLmV4cGFuZGVkID8/IGZhbHNlKTtcbiAgICBub3ZvTWFwYS5zZXQobm9QbGFuby5kYWRvc09yaWdpbmFpcy5yb3R1bG8sICFlc3RhZG9BdHVhbCk7XG4gICAgXG4gICAgdGhpcy5leHBhbnNhb1N0YXRlLnNldChub3ZvTWFwYSk7XG4gIH1cblxuICBvbkFjdGlvbkV4ZWN1dGVkKG5vUGxhbm86IE5vUGxhbm8pOiB2b2lkIHtcbiAgICBjb25zdCBkYWRvcyA9IG5vUGxhbm8uZGFkb3NPcmlnaW5haXM7XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW0uc2V0KGRhZG9zKTtcbiAgICB0aGlzLm9uU2VsZWN0ZWRJdGVtLmVtaXQoZGFkb3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0ZXJTaW1wbGVzUGFyYUNvbXBsZXRvKG5vc1NpbXBsZXM6IE5vQXJ2b3JlU2ltcGxlc1tdKTogTm9BcnZvcmVbXSB7XG4gICAgY29uc3QgbWFwYSA9IG5ldyBNYXA8c3RyaW5nLCBOb0Fydm9yZT4oKTtcbiAgICBjb25zdCByYWl6OiBOb0Fydm9yZVtdID0gW107XG5cbiAgICBub3NTaW1wbGVzLmZvckVhY2goc2ltcGxlcyA9PiB7XG4gICAgICBjb25zdCBubzogTm9BcnZvcmUgPSB7XG4gICAgICAgIHJvdHVsbzogc2ltcGxlcy5yb3R1bG8sXG4gICAgICAgIGljb25lOiBzaW1wbGVzLmljb25lLFxuICAgICAgICBjb3I6IHNpbXBsZXMuY29yLFxuICAgICAgICBhdGl2bzogc2ltcGxlcy5hdGl2byxcbiAgICAgICAgZXhwYW5kZWQ6IHNpbXBsZXMuZXhwYW5kZWQsXG4gICAgICAgIGZpbGhvczogW11cbiAgICAgIH07XG4gICAgICBtYXBhLnNldChzaW1wbGVzLmtleSwgbm8pO1xuICAgIH0pO1xuXG4gICAgbm9zU2ltcGxlcy5mb3JFYWNoKHNpbXBsZXMgPT4ge1xuICAgICAgY29uc3Qgbm8gPSBtYXBhLmdldChzaW1wbGVzLmtleSkhO1xuICAgICAgY29uc3QgcGFydGVzID0gc2ltcGxlcy5rZXkuc3BsaXQoJy0nKTtcbiAgICAgIFxuICAgICAgaWYgKHBhcnRlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmFpei5wdXNoKG5vKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGtleVBhaSA9IHBhcnRlcy5zbGljZSgwLCAtMSkuam9pbignLScpO1xuICAgICAgICBjb25zdCBwYWkgPSBtYXBhLmdldChrZXlQYWkpO1xuICAgICAgICBpZiAocGFpKSB7XG4gICAgICAgICAgcGFpLmZpbGhvcyA9IHBhaS5maWxob3MgfHwgW107XG4gICAgICAgICAgcGFpLmZpbGhvcy5wdXNoKG5vKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJhaXo7XG4gIH1cblxuICBwcml2YXRlIHRyYW5zZm9ybWFyUGFyYUxpc3RhUGxhbmEoXG4gICAgbm9kZXM6IE5vQXJ2b3JlW10sIFxuICAgIGV4cGFuc2FvTWFwOiBNYXA8c3RyaW5nLCBib29sZWFuPiwgXG4gICAgbml2ZWwgPSAwXG4gICk6IE5vUGxhbm9bXSB7XG4gICAgY29uc3QgbGlzdGE6IE5vUGxhbm9bXSA9IFtdO1xuICAgIFxuICAgIG5vZGVzLmZvckVhY2goKG5vZGUsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCByb3R1bG8gPSBub2RlLnJvdHVsbztcbiAgICAgIGNvbnN0IGV4cGFuZGVkID0gZXhwYW5zYW9NYXAuZ2V0KHJvdHVsbykgPz8gKG5vZGUuZXhwYW5kZWQgPz8gZmFsc2UpO1xuICAgICAgY29uc3QgdGVtRmlsaG9zID0gISEobm9kZS5maWxob3MgJiYgbm9kZS5maWxob3MubGVuZ3RoID4gMCk7XG4gICAgICBcbiAgICAgIGNvbnN0IG5vUGxhbm86IE5vUGxhbm8gPSB7XG4gICAgICAgIGlkOiByb3R1bG8sXG4gICAgICAgIG5pdmVsOiBuaXZlbCxcbiAgICAgICAgZXhwYW5zaXZlbDogdGVtRmlsaG9zLFxuICAgICAgICBleHBhbmRlZDogZXhwYW5kZWQsXG4gICAgICAgIGlzTGFzdDogaW5kZXggPT09IG5vZGVzLmxlbmd0aCAtIDEsXG4gICAgICAgIGRhZG9zT3JpZ2luYWlzOiBub2RlXG4gICAgICB9O1xuICAgICAgXG4gICAgICBsaXN0YS5wdXNoKG5vUGxhbm8pO1xuXG4gICAgICBpZiAoZXhwYW5kZWQgJiYgdGVtRmlsaG9zKSB7XG4gICAgICAgIGNvbnN0IGZpbGhvc1BsYW5vcyA9IHRoaXMudHJhbnNmb3JtYXJQYXJhTGlzdGFQbGFuYShub2RlLmZpbGhvcyEsIGV4cGFuc2FvTWFwLCBuaXZlbCArIDEpO1xuICAgICAgICBsaXN0YS5wdXNoKC4uLmZpbGhvc1BsYW5vcyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIGxpc3RhO1xuICB9XG5cbiAgdHJhY2tCeU5vZGUoaW5kZXg6IG51bWJlciwgbm9QbGFubzogTm9QbGFubyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5vUGxhbm8uaWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZXhwYW5kaXJUb2RvcygpOiB2b2lkIHtcbiAgICBjb25zdCBub3ZvTWFwYSA9IG5ldyBNYXAodGhpcy5leHBhbnNhb1N0YXRlKCkpO1xuICAgIHRoaXMuZXhwYW5kaXJUb2Rvc05vcyh0aGlzLmRhZG9zUHJvY2Vzc2Fkb3MoKSwgbm92b01hcGEpO1xuICAgIHRoaXMuZXhwYW5zYW9TdGF0ZS5zZXQobm92b01hcGEpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbGFwc2FyVG9kb3MoKTogdm9pZCB7XG4gICAgY29uc3Qgbm92b01hcGEgPSBuZXcgTWFwKHRoaXMuZXhwYW5zYW9TdGF0ZSgpKTtcbiAgICB0aGlzLmNvbGFwc2FyVG9kb3NOb3ModGhpcy5kYWRvc1Byb2Nlc3NhZG9zKCksIG5vdm9NYXBhKTtcbiAgICB0aGlzLmV4cGFuc2FvU3RhdGUuc2V0KG5vdm9NYXBhKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhwYW5kaXJUb2Rvc05vcyhub2RlczogTm9BcnZvcmVbXSwgbWFwYT86IE1hcDxzdHJpbmcsIGJvb2xlYW4+KTogdm9pZCB7XG4gICAgY29uc3QgbWFwYURlRXhwYW5zYW8gPSBtYXBhIHx8IG5ldyBNYXAodGhpcy5leHBhbnNhb1N0YXRlKCkpO1xuICAgIGNvbnN0IHN0YWNrOiBOb0Fydm9yZVtdID0gWy4uLm5vZGVzXTtcbiAgICBcbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgbm9kZSA9IHN0YWNrLnBvcCgpITtcbiAgICAgIFxuICAgICAgaWYgKG5vZGUuZmlsaG9zICYmIG5vZGUuZmlsaG9zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbWFwYURlRXhwYW5zYW8uc2V0KG5vZGUucm90dWxvLCB0cnVlKTtcbiAgICAgICAgc3RhY2sucHVzaCguLi5ub2RlLmZpbGhvcyk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGlmICghbWFwYSkge1xuICAgICAgdGhpcy5leHBhbnNhb1N0YXRlLnNldChtYXBhRGVFeHBhbnNhbyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb2xhcHNhclRvZG9zTm9zKG5vZGVzOiBOb0Fydm9yZVtdLCBtYXBhOiBNYXA8c3RyaW5nLCBib29sZWFuPik6IHZvaWQge1xuICAgIGNvbnN0IHN0YWNrOiBOb0Fydm9yZVtdID0gWy4uLm5vZGVzXTtcbiAgICBcbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgbm9kZSA9IHN0YWNrLnBvcCgpITtcbiAgICAgIFxuICAgICAgaWYgKG5vZGUuZmlsaG9zICYmIG5vZGUuZmlsaG9zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbWFwYS5zZXQobm9kZS5yb3R1bG8sIGZhbHNlKTtcbiAgICAgICAgc3RhY2sucHVzaCguLi5ub2RlLmZpbGhvcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvYnRlclRvZG9zTm9zRXhwYW5kaXZlaXMobm9kZXM6IE5vQXJ2b3JlW10pOiBOb0Fydm9yZVtdIHtcbiAgICBjb25zdCBub3NFeHBhbmRpdmVpczogTm9BcnZvcmVbXSA9IFtdO1xuICAgIGNvbnN0IHN0YWNrOiBOb0Fydm9yZVtdID0gWy4uLm5vZGVzXTtcbiAgICBcbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgbm9kZSA9IHN0YWNrLnBvcCgpITtcbiAgICAgIFxuICAgICAgaWYgKG5vZGUuZmlsaG9zICYmIG5vZGUuZmlsaG9zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbm9zRXhwYW5kaXZlaXMucHVzaChub2RlKTtcbiAgICAgICAgc3RhY2sucHVzaCguLi5ub2RlLmZpbGhvcyk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBub3NFeHBhbmRpdmVpcztcbiAgfVxuXG4gIHByaXZhdGUgY29tYmluYXJFc3RydXR1cmFDb21EYWRvcyhlc3RydXR1cmE6IEVzdHJ1dHVyYUFydm9yZVtdLCBkYWRvczogRGFkb3NBcnZvcmVbXSk6IE5vQXJ2b3JlW10ge1xuICAgIGNvbnN0IG1hcGFEYWRvcyA9IG5ldyBNYXAoZGFkb3MubWFwKGQgPT4gW2QuaWQsIGRdKSk7XG4gICAgY29uc3QgbWFwYUVzdHJ1dHVyYSA9IG5ldyBNYXA8bnVtYmVyLCBOb0Fydm9yZT4oKTtcbiAgICBjb25zdCByYWl6OiBOb0Fydm9yZVtdID0gW107XG5cbiAgICBlc3RydXR1cmFcbiAgICAgIC5zb3J0KChhLCBiKSA9PiAoYS5vcmRlbSB8fCAwKSAtIChiLm9yZGVtIHx8IDApKSBcbiAgICAgIC5mb3JFYWNoKGVzdCA9PiB7XG4gICAgICAgIGNvbnN0IGRhZG8gPSBtYXBhRGFkb3MuZ2V0KGVzdC5pZCk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBubzogTm9BcnZvcmUgPSB7XG4gICAgICAgICAgcm90dWxvOiBkYWRvPy5yb3R1bG8gfHwgZXN0LmxhYmVsLFxuICAgICAgICAgIGljb25lOiBlc3QuaWNvbmUsXG4gICAgICAgICAgY29yOiBlc3QuY29yLFxuICAgICAgICAgIGF0aXZvOiBkYWRvPy5hdGl2byA/PyB0cnVlLFxuICAgICAgICAgIGV4cGFuZGVkOiBlc3QuZXhwYW5kZWQsXG4gICAgICAgICAgZmlsaG9zOiBbXSxcbiAgICAgICAgICBhY3Rpb25zOiBlc3QuYWN0aW9ucyxcbiAgICAgICAgICBkYXRhOiBlc3QuZGF0YSxcbiAgICAgICAgICBzaG93U2lkZWJhckFjdGlvbjogZXN0LnNob3dTaWRlYmFyQWN0aW9uXG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICBtYXBhRXN0cnV0dXJhLnNldChlc3QuaWQsIG5vKTtcbiAgICAgIH0pO1xuXG4gICAgZXN0cnV0dXJhLmZvckVhY2goZXN0ID0+IHtcbiAgICAgIGNvbnN0IG5vID0gbWFwYUVzdHJ1dHVyYS5nZXQoZXN0LmlkKSE7XG4gICAgICBcbiAgICAgIGlmICghZXN0LnBhcmVudElkKSB7XG4gICAgICAgIHJhaXoucHVzaChubyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwYWkgPSBtYXBhRXN0cnV0dXJhLmdldChlc3QucGFyZW50SWQpO1xuICAgICAgICBpZiAocGFpKSB7XG4gICAgICAgICAgcGFpLmZpbGhvcyEucHVzaChubyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiByYWl6O1xuICB9XG5cbiAgZXhlY3V0ZUFkZCgpIHtcbiAgICB0aGlzLm9uQWRkQ2xpY2suZW1pdCgpO1xuICB9XG5cbiAgYWJyaXJTaWRlYmFyUGFyYU5vKG5vOiBOb0Fydm9yZSk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFNpZGViYXJOb2RlLnNldChubyk7XG4gICAgdGhpcy5zaWRlYmFyVmlzaWJsZS5zZXQodHJ1ZSk7XG4gICAgdGhpcy5vblNpZGViYXJOb2RlQ2xpY2suZW1pdChubyk7XG4gIH1cblxuICBwcml2YXRlIGZpbHRyYXJBcnZvcmVDb21IaWVyYXJxdWlhKG5vZGVzOiBOb0Fydm9yZVtdLCB0ZXh0b0J1c2NhOiBzdHJpbmcpOiBOb0Fydm9yZVtdIHtcbiAgICBjb25zdCByZXN1bHRhZG86IE5vQXJ2b3JlW10gPSBbXTtcblxuICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgICAgY29uc3Qgcm90dWxvTG93ZXIgPSBub2RlLnJvdHVsby50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3QgY29ycmVzcG9uZGUgPSByb3R1bG9Mb3dlci5pbmNsdWRlcyh0ZXh0b0J1c2NhKTtcblxuICAgICAgbGV0IGZpbGhvc0ZpbHRyYWRvczogTm9BcnZvcmVbXSA9IFtdO1xuICAgICAgaWYgKG5vZGUuZmlsaG9zICYmIG5vZGUuZmlsaG9zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZmlsaG9zRmlsdHJhZG9zID0gdGhpcy5maWx0cmFyQXJ2b3JlQ29tSGllcmFycXVpYShub2RlLmZpbGhvcywgdGV4dG9CdXNjYSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb3JyZXNwb25kZSB8fCBmaWxob3NGaWx0cmFkb3MubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBub0Nsb25hZG86IE5vQXJ2b3JlID0ge1xuICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgZmlsaG9zOiBmaWxob3NGaWx0cmFkb3MubGVuZ3RoID4gMCA/IGZpbGhvc0ZpbHRyYWRvcyA6IG5vZGUuZmlsaG9zLFxuICAgICAgICAgIGV4cGFuZGVkOiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIHJlc3VsdGFkby5wdXNoKG5vQ2xvbmFkbyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdGFkbztcbiAgfVxuXG59XG4iLCI8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtbiBoLWZ1bGxcIj5cbiAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTIgcC0yXCIgW2Zvcm1Hcm91cF09XCJmb3JtRmlsdHJvXCI+XG4gICAgQGlmKHNob3dTZWFyY2hGaWVsZCgpKSB7XG4gICAgICA8a3YtaW5wdXQtdGV4dFxuICAgICAgICBwbGFjZWhvbGRlcj1cIlBlc3F1aXNhci4uLlwiXG4gICAgICAgIGljb249XCJzZWFyY2hcIlxuICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzZWFyY2hcIlxuICAgICAgPjwva3YtaW5wdXQtdGV4dD5cbiAgICB9XG5cbiAgICA8a3YtYnV0dG9uXG4gICAgICBzZXZlcml0eT1cInRlcnRpYXJ5XCJcbiAgICAgIGNsYXNzPVwidy1hdXRvXCJcbiAgICAgIGxhYmVsPVwiRXhwYW5kaXJcIlxuICAgICAgaWNvbj1cImV4cGFuZF9jb250ZW50XCJcbiAgICAgIChjbGljayk9XCJleHBhbmRpclRvZG9zKClcIlxuICAgID48L2t2LWJ1dHRvbj5cblxuICAgIDxrdi1idXR0b25cbiAgICAgIHNldmVyaXR5PVwidGVydGlhcnlcIlxuICAgICAgY2xhc3M9XCJ3LWF1dG9cIlxuICAgICAgbGFiZWw9XCJSZWNvbGhlclwiXG4gICAgICBpY29uPVwiY29sbGFwc2VfYWxsXCJcbiAgICAgIChjbGljayk9XCJjb2xhcHNhclRvZG9zKClcIlxuICAgID48L2t2LWJ1dHRvbj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cInBsLTIgcGItMiBmbGV4LTEgdy1mdWxsIGZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIGdhcC0yXCIgc3R5bGU9XCJtaW4taGVpZ2h0OiAwOyBwb3NpdGlvbjogcmVsYXRpdmU7XCI+XG4gICAgPGNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydCBjbGFzcz1cImgtZnVsbCBmbGV4LTFcIiBpdGVtU2l6ZT1cIjQwXCI+XG4gICAgICAgIDx1bCBjbGFzcz1cImxpc3RhLWFydm9yZS12aXJ0dWFsIHByLTIgcHktMlwiPlxuICAgICAgICAgIDxuby1hcnZvcmUgXG4gICAgICAgICAgICAqY2RrVmlydHVhbEZvcj1cImxldCBubyBvZiBsaXN0YVBsYW5hKCk7IHRyYWNrQnk6IHRyYWNrQnlOb2RlXCIgXG4gICAgICAgICAgICBbbm9QbGFub109XCJub1wiXG4gICAgICAgICAgICBbZW5hYmxlU2lkZWJhcl09XCJlbmFibGVTaWRlYmFyKClcIlxuICAgICAgICAgICAgKG5vQWx0ZXJuYWRvKT1cImFsdGVybmFyTm8oJGV2ZW50KVwiXG4gICAgICAgICAgICAoYWN0aW9uRXhlY3V0ZWQpPVwib25BY3Rpb25FeGVjdXRlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChzaWRlYmFyQ2xpY2spPVwiYWJyaXJTaWRlYmFyUGFyYU5vKCRldmVudClcIiAvPlxuICAgICAgICA8L3VsPlxuICAgICAgPC9jZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQ+XG5cbiAgICBAaWYgKHNpZGViYXJWaXNpYmxlKCkgJiYgZW5hYmxlU2lkZWJhcigpKSB7XG4gICAgICA8a3YtYnV0dG9uXG4gICAgICAgIHNldmVyaXR5PVwidGVydGlhcnlcIlxuICAgICAgICBpY29uPVwibWVudVwiXG4gICAgICAgIChjbGljayk9XCJzaWRlYmFyVmlzaWJsZS5zZXQoZmFsc2UpXCJcbiAgICAgID48L2t2LWJ1dHRvbj5cbiAgICB9XG5cbiAgICA8cC1zaWRlYmFyIFt2aXNpYmxlXT1cInNpZGViYXJWaXNpYmxlKClcIiAodmlzaWJsZUNoYW5nZSk9XCJzaWRlYmFyVmlzaWJsZS5zZXQoJGV2ZW50KVwiIHBvc2l0aW9uPVwicmlnaHRcIiBjbGFzcz1cInByLTJcIiBbbmdTdHlsZV09XCJ7J2ZsZXgnOiAnMC42IDEgMCUnfVwiIHN0eWxlQ2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkbGVzc1wiPlxuICAgICAgICBAaWYgKHNpZGViYXJUZW1wbGF0ZSAmJiBjdXJyZW50U2lkZWJhck5vZGUoKSkge1xuICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwic2lkZWJhclRlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBjdXJyZW50U2lkZWJhck5vZGUoKSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIH1cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9wLXNpZGViYXI+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=