@stiunb/unb-lib-components 18.0.23 → 18.0.24

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 (25) hide show
  1. package/esm2022/lib/unb-mensagem/unb-mensagem.component.mjs +18 -26
  2. package/esm2022/lib/unb-mensagem/unb-mensagem.service.mjs +16 -21
  3. package/esm2022/lib/unb-pessoa/unb-pessoa-email-form/unb-pessoa-email-form.mjs +60 -29
  4. package/esm2022/lib/unb-pessoa/unb-pessoa-email-form/unb-pessoa-email-list.mjs +4 -4
  5. package/esm2022/lib/unb-pessoa/unb-pessoa-endereco-form/unb-pessoa-endereco-form.mjs +98 -67
  6. package/esm2022/lib/unb-pessoa/unb-pessoa-endereco-form/unb-pessoa-endereco-list.mjs +4 -4
  7. package/esm2022/lib/unb-pessoa/unb-pessoa-form/unb-pessoa-form.component.mjs +57 -73
  8. package/esm2022/lib/unb-pessoa/unb-pessoa-pesquisar/unb-pessoa-pesquisar.component.mjs +49 -36
  9. package/esm2022/lib/unb-pessoa/unb-pessoa-telefone-form/unb-pessoa-telefone-form.mjs +57 -29
  10. package/esm2022/lib/unb-pessoa/unb-pessoa-telefone-form/unb-pessoa-telefone-list.mjs +4 -4
  11. package/esm2022/lib/unb-pessoa/unb-pessoa.service.mjs +141 -45
  12. package/fesm2022/stiunb-unb-lib-components.mjs +467 -309
  13. package/fesm2022/stiunb-unb-lib-components.mjs.map +1 -1
  14. package/lib/unb-mensagem/unb-mensagem.component.d.ts +3 -17
  15. package/lib/unb-mensagem/unb-mensagem.service.d.ts +16 -18
  16. package/lib/unb-pessoa/unb-pessoa-email-form/unb-pessoa-email-form.d.ts +6 -2
  17. package/lib/unb-pessoa/unb-pessoa-email-form/unb-pessoa-email-list.d.ts +2 -5
  18. package/lib/unb-pessoa/unb-pessoa-endereco-form/unb-pessoa-endereco-form.d.ts +6 -3
  19. package/lib/unb-pessoa/unb-pessoa-endereco-form/unb-pessoa-endereco-list.d.ts +2 -5
  20. package/lib/unb-pessoa/unb-pessoa-form/unb-pessoa-form.component.d.ts +8 -8
  21. package/lib/unb-pessoa/unb-pessoa-pesquisar/unb-pessoa-pesquisar.component.d.ts +8 -8
  22. package/lib/unb-pessoa/unb-pessoa-telefone-form/unb-pessoa-telefone-form.d.ts +6 -4
  23. package/lib/unb-pessoa/unb-pessoa-telefone-form/unb-pessoa-telefone-list.d.ts +2 -5
  24. package/lib/unb-pessoa/unb-pessoa.service.d.ts +9 -13
  25. package/package.json +1 -1
@@ -1,27 +1,32 @@
1
1
  import { Component, Inject } from '@angular/core';
2
2
  import { UnbPessoaEndereco } from '../unb-pessoa-models/unb-pessoa-endereco.model';
3
3
  import { MAT_DIALOG_DATA } from '@angular/material/dialog';
4
+ import { UnbTipoMensagemEnum } from '../../unb-mensagem/unb-mensagem.service';
4
5
  import * as i0 from "@angular/core";
5
6
  import * as i1 from "@angular/material/snack-bar";
6
7
  import * as i2 from "../unb-pessoa.service";
7
- import * as i3 from "@angular/material/dialog";
8
- import * as i4 from "@angular/common";
9
- import * as i5 from "@angular/forms";
10
- import * as i6 from "@angular/material/icon";
11
- import * as i7 from "@angular/material/button";
12
- import * as i8 from "@angular/material/form-field";
13
- import * as i9 from "@angular/material/input";
14
- import * as i10 from "@angular/material/select";
15
- import * as i11 from "@angular/material/core";
8
+ import * as i3 from "../../unb-mensagem/unb-mensagem.service";
9
+ import * as i4 from "@angular/material/dialog";
10
+ import * as i5 from "@angular/common";
11
+ import * as i6 from "@angular/forms";
12
+ import * as i7 from "@angular/material/icon";
13
+ import * as i8 from "@angular/material/button";
14
+ import * as i9 from "../../unb-mensagem/unb-mensagem.component";
15
+ import * as i10 from "@angular/material/form-field";
16
+ import * as i11 from "@angular/material/input";
17
+ import * as i12 from "@angular/material/select";
18
+ import * as i13 from "@angular/material/core";
16
19
  export class UnbPessoaEnderecoFormComponent {
17
- constructor(snackBar, service, dialogRef, data) {
20
+ constructor(snackBar, service, alertService, dialogRef, data) {
18
21
  this.snackBar = snackBar;
19
22
  this.service = service;
23
+ this.alertService = alertService;
20
24
  this.dialogRef = dialogRef;
21
25
  this.data = data;
22
26
  this.endereco = new UnbPessoaEndereco();
23
27
  this.listaTipoEndereco = [];
24
28
  this.listaPaises = [];
29
+ this.idMensagemService = "UnbPessoaEnderecoForm";
25
30
  this.endereco = JSON.parse(JSON.stringify(data.endereco)); // O e-mail específico para edição
26
31
  // Verifique se a lista de e-mails foi passada e atribua-a
27
32
  if (data.enderecosList) {
@@ -35,56 +40,61 @@ export class UnbPessoaEnderecoFormComponent {
35
40
  }
36
41
  }
37
42
  ngOnInit() {
38
- this.tipoEndereco = this.service.getTipoEndereco();
39
- this.paises = this.service.getPaises(); // Você já tinha isso
40
43
  // --- Preenche o Tipos de Endereço ---
41
- this.tipoEndereco.subscribe(lista => {
42
- this.listaTipoEndereco = lista;
43
- // Se já tiver tipoEnderecoCodigo, preenche o nome correspondente
44
- if (this.endereco.tipoEnderecoCodigo != null) {
45
- const tipoEncontrado = lista.find(t => t.codigo === this.endereco.tipoEnderecoCodigo);
46
- if (tipoEncontrado) {
47
- this.endereco.tipo = tipoEncontrado.denominacao;
44
+ this.service.getTipoEndereco().subscribe({
45
+ next: (lista) => {
46
+ this.listaTipoEndereco = lista;
47
+ // Se já tiver tipoEnderecoCodigo, preenche o nome correspondente
48
+ if (this.endereco.tipoEnderecoCodigo != null) {
49
+ const tipoEncontrado = lista.find(t => t.codigo === this.endereco.tipoEnderecoCodigo);
50
+ if (tipoEncontrado) {
51
+ this.endereco.tipo = tipoEncontrado.denominacao;
52
+ }
48
53
  }
49
- }
50
- else if (this.endereco.tipo) {
51
- // Se tiver o nome, preenche o código
52
- const tipoEncontrado = lista.find(t => t.denominacao?.toLowerCase() === this.endereco.tipo?.toLowerCase());
53
- if (tipoEncontrado) {
54
- this.endereco.tipoEnderecoCodigo = tipoEncontrado.codigo;
54
+ else if (this.endereco.tipo) {
55
+ // Se tiver só o nome, preenche o código
56
+ const tipoEncontrado = lista.find(t => t.denominacao?.toLowerCase() === this.endereco.tipo?.toLowerCase());
57
+ if (tipoEncontrado) {
58
+ this.endereco.tipoEnderecoCodigo = tipoEncontrado.codigo;
59
+ }
55
60
  }
56
- }
57
- // O metodo get retorna uf, mas o put espera ufEndereco
58
- if (this.endereco.uf) {
59
- this.endereco.ufEndereco = this.endereco.uf; // Converte uf para ufEndereco
60
- }
61
+ // O metodo get retorna uf, mas o put espera ufEndereco
62
+ if (this.endereco.uf) {
63
+ this.endereco.ufEndereco = this.endereco.uf; // Converte uf para ufEndereco
64
+ }
65
+ },
66
+ // Tratamento de erro no carregamento da lista
67
+ error: (err) => this.handleError(err)
61
68
  });
62
69
  // --- Preenche o País ---
63
- this.paises.subscribe(listaDePaises => {
64
- this.listaPaises = listaDePaises; // Armazena a lista de países
65
- const CODIGO_BRASIL = 22; // Código padrão para o Brasil
66
- // Lógica 1: Se o ID do país já existe (ex: 22), encontra o nome (ex: "Brasil")
67
- if (this.endereco.paisEnderecoCodigo != null) {
68
- const paisEncontrado = this.listaPaises.find(p => p.codigo === this.endereco.paisEnderecoCodigo);
69
- if (paisEncontrado) {
70
- this.endereco.pais = paisEncontrado.denominacao;
70
+ this.service.getPaises().subscribe({
71
+ next: (listaDePaises) => {
72
+ this.listaPaises = listaDePaises; // Armazena a lista de países
73
+ const CODIGO_BRASIL = 22; // Código padrão para o Brasil
74
+ // Lógica 1: Se o ID do país já existe (ex: 22), encontra o nome (ex: "Brasil")
75
+ if (this.endereco.paisEnderecoCodigo != null) {
76
+ const paisEncontrado = this.listaPaises.find(p => p.codigo === this.endereco.paisEnderecoCodigo);
77
+ if (paisEncontrado) {
78
+ this.endereco.pais = paisEncontrado.denominacao;
79
+ }
71
80
  }
72
- }
73
- // Lógica 2: Se o nome do país existe (ex: "Brasil"), encontra o ID (ex: 22)
74
- else if (this.endereco.pais) {
75
- const paisEncontrado = this.listaPaises.find(p => p.denominacao?.toLowerCase() === this.endereco.pais?.toLowerCase());
76
- if (paisEncontrado) {
77
- this.endereco.paisEnderecoCodigo = paisEncontrado.codigo;
81
+ // Lógica 2: Se o nome do país existe (ex: "Brasil"), encontra o ID (ex: 22)
82
+ else if (this.endereco.pais) {
83
+ const paisEncontrado = this.listaPaises.find(p => p.denominacao?.toLowerCase() === this.endereco.pais?.toLowerCase());
84
+ if (paisEncontrado) {
85
+ this.endereco.paisEnderecoCodigo = paisEncontrado.codigo;
86
+ }
87
+ else {
88
+ // Se o nome foi fornecido mas não encontrado na lista, assume Brasil
89
+ this.endereco.paisEnderecoCodigo = CODIGO_BRASIL;
90
+ }
78
91
  }
92
+ // Lógica 3: Se nem o ID nem o nome existem, assume Brasil por padrão
79
93
  else {
80
- // Se o nome foi fornecido mas não encontrado na lista, assume Brasil
81
94
  this.endereco.paisEnderecoCodigo = CODIGO_BRASIL;
82
95
  }
83
- }
84
- // Lógica 3: Se nem o ID nem o nome existem, assume Brasil por padrão
85
- else {
86
- this.endereco.paisEnderecoCodigo = CODIGO_BRASIL;
87
- }
96
+ },
97
+ error: (err) => this.handleError(err)
88
98
  });
89
99
  }
90
100
  salvar(form) {
@@ -125,14 +135,13 @@ export class UnbPessoaEnderecoFormComponent {
125
135
  this.endereco.uf = data.uf;
126
136
  this.endereco.complemento = data.complemento;
127
137
  },
128
- error: (error) => {
129
- this.openSnackBar('Falha ao encontrar o CEP');
130
- console.error('Erro ao pesquisar CEP:', error);
138
+ error: (err) => {
139
+ this.handleError(err);
131
140
  }
132
141
  });
133
142
  }
134
143
  else {
135
- this.openSnackBar('Por favor, insira um CEP válido.');
144
+ this.handleError('Por favor, insira um CEP válido.');
136
145
  }
137
146
  }
138
147
  getListaEstados() {
@@ -150,12 +159,12 @@ export class UnbPessoaEnderecoFormComponent {
150
159
  // 1. Validação de tipoEnderecoCodigo (Obrigatório e 0-4)
151
160
  // [Java: request.getTipoEnderecoCodigo() == null]
152
161
  if (enderecoToValidate.tipoEnderecoCodigo == null) {
153
- this.openSnackBar("Tipo de Endereço é um campo obrigatório.");
162
+ this.handleError("Tipo de Endereço é um campo obrigatório.");
154
163
  return false;
155
164
  }
156
165
  // [Java: request.getTipoEnderecoCodigo() < (byte) 0 || request.getTipoEnderecoCodigo() > (byte) 4]
157
166
  if (enderecoToValidate.tipoEnderecoCodigo < 0 || enderecoToValidate.tipoEnderecoCodigo > 4) {
158
- this.openSnackBar("Tipo de Endereço é inválido (deve ser entre 0 e 4).");
167
+ this.handleError("Tipo de Endereço é inválido (deve ser entre 0 e 4).");
159
168
  return false;
160
169
  }
161
170
  // 3. Validação de CEP (8 dígitos, se preenchido)
@@ -163,39 +172,39 @@ export class UnbPessoaEnderecoFormComponent {
163
172
  if (enderecoToValidate.cep && enderecoToValidate.cep.trim() !== '') {
164
173
  const cepLimpo = enderecoToValidate.cep.replace(/\D/g, ''); // Remove não-dígitos
165
174
  if (cepLimpo.length !== 8) {
166
- this.openSnackBar("CEP deve conter 8 dígitos.");
175
+ this.handleError("CEP deve conter 8 dígitos.");
167
176
  return false;
168
177
  }
169
178
  }
170
179
  // 4. Validação de Logradouro (Max 100, se preenchido)
171
180
  // [Java: request.getLogradouro().trim().length() > 100]
172
181
  if (enderecoToValidate.logradouro && enderecoToValidate.logradouro.trim().length > 100) {
173
- this.openSnackBar("Logradouro deve ter no máximo 100 caracteres.");
182
+ this.handleError("Logradouro deve ter no máximo 100 caracteres.");
174
183
  return false;
175
184
  }
176
185
  // 5. Validação de Bairro (Max 100, se preenchido)
177
186
  // [Java: request.getBairro().trim().length() > 100]
178
187
  if (enderecoToValidate.bairro && enderecoToValidate.bairro.trim().length > 100) {
179
- this.openSnackBar("Bairro deve ter no máximo 100 caracteres.");
188
+ this.handleError("Bairro deve ter no máximo 100 caracteres.");
180
189
  return false;
181
190
  }
182
191
  // 6. Validação de Complemento (Max 100, se preenchido)
183
192
  // [Java: request.getComplemento().trim().length() > 100]
184
193
  if (enderecoToValidate.complemento && enderecoToValidate.complemento.trim().length > 100) {
185
- this.openSnackBar("Complemento deve ter no máximo 100 caracteres.");
194
+ this.handleError("Complemento deve ter no máximo 100 caracteres.");
186
195
  return false;
187
196
  }
188
197
  // 7. Validação de Caixa Postal (Max 100, se preenchida)
189
198
  // [Java: request.getCaixaPostal().trim().length() > 100]
190
199
  if (enderecoToValidate.caixaPostal && enderecoToValidate.caixaPostal.trim().length > 100) {
191
- this.openSnackBar("Caixa Postal deve ter no máximo 100 caracteres.");
200
+ this.handleError("Caixa Postal deve ter no máximo 100 caracteres.");
192
201
  return false;
193
202
  }
194
203
  // 8. Validação de UF (2 caracteres, se preenchida)
195
204
  // O form usa 'ufEndereco', o java usa 'uf'. O ngOnInit mapeia uf -> ufEndereco.
196
205
  // [Java: request.getUf().trim().length() != 2]
197
206
  if (enderecoToValidate.ufEndereco && enderecoToValidate.ufEndereco.trim().length !== 2) {
198
- this.openSnackBar("UF deve ter 2 caracteres.");
207
+ this.handleError("UF deve ter 2 caracteres.");
199
208
  return false;
200
209
  }
201
210
  // --- Validação de Duplicar ---
@@ -214,19 +223,41 @@ export class UnbPessoaEnderecoFormComponent {
214
223
  salvarclose() {
215
224
  this.dialogRef.close(this.enderecoSalvo);
216
225
  }
226
+ handleError(erro) {
227
+ let erroTratado;
228
+ // Converte string local em Objeto Padrão
229
+ if (typeof erro === 'string') {
230
+ erroTratado = {
231
+ status: 400,
232
+ mensagemSimples: erro,
233
+ mensagemHtml: `<strong>${erro}</strong>`
234
+ };
235
+ }
236
+ else {
237
+ erroTratado = erro;
238
+ }
239
+ // 1. SnackBar
240
+ if (erroTratado.mensagemSimples) {
241
+ this.openSnackBar(erroTratado.mensagemSimples);
242
+ }
243
+ // 2. AlertService (Se houver tag <unb-mensagem> no HTML do dialog)
244
+ if (this.alertService && erroTratado.mensagemHtml) {
245
+ this.alertService.showMessage(erroTratado.mensagemHtml, UnbTipoMensagemEnum.DANGER, this.idMensagemService);
246
+ }
247
+ }
217
248
  openSnackBar(message) {
218
249
  this.snackBar.open(message, 'x', {
219
250
  duration: 5000,
220
251
  });
221
252
  }
222
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbPessoaEnderecoFormComponent, deps: [{ token: i1.MatSnackBar }, { token: i2.UnBPessoaService }, { token: i3.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
223
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.2", type: UnbPessoaEnderecoFormComponent, selector: "lib-unb-pessoa-endereco-form", ngImport: i0, template: "<h1 mat-dialog-title>Cadastro de E-mail</h1>\r\n<form (ngSubmit)=\"salvar(form)\" #form=\"ngForm\">\r\n <mat-dialog-content>\r\n <div class=\"form-container\">\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>Tipo</mat-label>\r\n <mat-select [(ngModel)]=\"endereco.tipoEnderecoCodigo\" name=\"tipo\" #tipo=\"ngModel\"\r\n (selectionChange)=\"onTipoSelecionado($event.value)\" required>\r\n <mat-option *ngFor=\"let tipo of tipoEndereco | async\" [value]=\"tipo.codigo\">\r\n {{tipo.denominacao}}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Pa\u00EDs</mat-label>\r\n\r\n <mat-select [(ngModel)]=\"endereco.paisEnderecoCodigo\" name=\"paisEnderecoCodigo\" #paisEnderecoCodigo=\"ngModel\">\r\n\r\n <mat-option *ngFor=\"let paises of paises | async\" [value]=\"paises.codigo\">\r\n <span *ngIf=\"paises.denominacao === 'BRASIL'\">\uD83C\uDDE7\uD83C\uDDF7 <b>{{ paises.denominacao }}</b></span>\r\n <span *ngIf=\"paises.denominacao !== 'BRASIL'\">{{ paises.denominacao }}</span>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>CEP</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"endereco.cep\" name=\"cep\" #cep=\"ngModel\" />\r\n <button matSuffix mat-icon-button type=\"button\" aria-label=\"Pesquisar\" (click)=\"pesquisarCep()\">\r\n <mat-icon style=\"margin-right: 2px;\">search</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Endere\u00E7o</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"endereco.logradouro\" name=\"logradouro\" #logradouro=\"ngModel\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>Bairro</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"endereco.bairro\" name=\"bairro\" #bairro=\"ngModel\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>Complemento</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"endereco.complemento\" name=\"complemento\" #complemento=\"ngModel\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>UF</mat-label>\r\n <mat-select [(ngModel)]=\"endereco.uf\" name=\"uf\" #uf=\"ngModel\">\r\n <mat-option *ngFor=\"let uf of getListaEstados()\" [value]=\"uf\">\r\n {{ uf }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\">\r\n <button mat-stroked-button type=\"button\" color=\"warn\" (click)=\"close()\">Fechar</button>\r\n <button mat-flat-button type=\"submit\" color=\"primary\">Salvar</button>\r\n </mat-dialog-actions>\r\n</form>", styles: [".card-actions-buttons{display:flex;gap:5px;flex-wrap:wrap}.form-container{display:flex;flex-wrap:wrap;column-gap:10px;margin:10px}@media (max-width: 1000px){.form-container{flex-direction:column;gap:5px}}.break{flex-basis:100%;height:0}.form-5{flex:1 1 5%}.inline-table-container{display:flex;align-items:center;justify-content:space-between;padding:5px}@media (max-width: 600px){.form-5,.form-10,.form-15{flex:1 1 100%}}.form-10{flex:1 1 10%}.form-15{flex:1 1 15%}.form-20{flex:1 1 20%}.form-25{flex:1 1 25%}.form-30{flex:1 1 30%}.form-35{flex:1 1 35%}.form-40{flex:1 1 40%}.form-45{flex:1 1 45%}.form-50{flex:1 1 50%}.form-100{flex:1 1 100%;min-width:250px}.botoes-container{display:flex;gap:5px}@media (max-width: 600px){.botoes-container{margin-bottom:10px}.botoes-container button{flex:1;max-width:50%}}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i9.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i3.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i3.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i3.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: i10.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i11.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }] }); }
253
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbPessoaEnderecoFormComponent, deps: [{ token: i1.MatSnackBar }, { token: i2.UnBPessoaService }, { token: i3.UnbMensagemService }, { token: i4.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
254
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.2", type: UnbPessoaEnderecoFormComponent, selector: "lib-unb-pessoa-endereco-form", ngImport: i0, template: "<h1 mat-dialog-title>Cadastro de E-mail</h1>\r\n<form (ngSubmit)=\"salvar(form)\" #form=\"ngForm\">\r\n <mat-dialog-content>\r\n <unb-mensagem [identificador]=\"idMensagemService\"></unb-mensagem>\r\n <div class=\"form-container\">\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>Tipo</mat-label>\r\n <mat-select [(ngModel)]=\"endereco.tipoEnderecoCodigo\" name=\"tipo\" #tipo=\"ngModel\"\r\n (selectionChange)=\"onTipoSelecionado($event.value)\" required>\r\n <mat-option *ngFor=\"let tipo of listaTipoEndereco\" [value]=\"tipo.codigo\">\r\n {{tipo.denominacao}}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Pa\u00EDs</mat-label>\r\n\r\n <mat-select [(ngModel)]=\"endereco.paisEnderecoCodigo\" name=\"paisEnderecoCodigo\" #paisEnderecoCodigo=\"ngModel\">\r\n\r\n <mat-option *ngFor=\"let paises of listaPaises\" [value]=\"paises.codigo\">\r\n <span *ngIf=\"paises.denominacao === 'BRASIL'\">\uD83C\uDDE7\uD83C\uDDF7 <b>{{ paises.denominacao }}</b></span>\r\n <span *ngIf=\"paises.denominacao !== 'BRASIL'\">{{ paises.denominacao }}</span>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>CEP</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"endereco.cep\" name=\"cep\" #cep=\"ngModel\" />\r\n <button matSuffix mat-icon-button type=\"button\" aria-label=\"Pesquisar\" (click)=\"pesquisarCep()\">\r\n <mat-icon style=\"margin-right: 2px;\">search</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Endere\u00E7o</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"endereco.logradouro\" name=\"logradouro\" #logradouro=\"ngModel\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>Bairro</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"endereco.bairro\" name=\"bairro\" #bairro=\"ngModel\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>Complemento</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"endereco.complemento\" name=\"complemento\" #complemento=\"ngModel\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>UF</mat-label>\r\n <mat-select [(ngModel)]=\"endereco.uf\" name=\"uf\" #uf=\"ngModel\">\r\n <mat-option *ngFor=\"let uf of getListaEstados()\" [value]=\"uf\">\r\n {{ uf }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\">\r\n <button mat-stroked-button type=\"button\" color=\"warn\" (click)=\"close()\">Fechar</button>\r\n <button mat-flat-button type=\"submit\" color=\"primary\">Salvar</button>\r\n </mat-dialog-actions>\r\n</form>", styles: [".card-actions-buttons{display:flex;gap:5px;flex-wrap:wrap}.form-container{display:flex;flex-wrap:wrap;column-gap:10px;margin:10px}@media (max-width: 1000px){.form-container{flex-direction:column;gap:5px}}.break{flex-basis:100%;height:0}.form-5{flex:1 1 5%}.inline-table-container{display:flex;align-items:center;justify-content:space-between;padding:5px}@media (max-width: 600px){.form-5,.form-10,.form-15{flex:1 1 100%}}.form-10{flex:1 1 10%}.form-15{flex:1 1 15%}.form-20{flex:1 1 20%}.form-25{flex:1 1 25%}.form-30{flex:1 1 30%}.form-35{flex:1 1 35%}.form-40{flex:1 1 40%}.form-45{flex:1 1 45%}.form-50{flex:1 1 50%}.form-100{flex:1 1 100%;min-width:250px}.botoes-container{display:flex;gap:5px}@media (max-width: 600px){.botoes-container{margin-bottom:10px}.botoes-container button{flex:1;max-width:50%}}\n"], dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i8.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i8.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i9.UnbMensagemComponent, selector: "unb-mensagem", inputs: ["mensagem", "tipo", "identificador"] }, { kind: "component", type: i10.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i10.MatLabel, selector: "mat-label" }, { kind: "directive", type: i10.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i11.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i4.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i4.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i4.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: i12.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i13.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }] }); }
224
255
  }
225
256
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbPessoaEnderecoFormComponent, decorators: [{
226
257
  type: Component,
227
- args: [{ standalone: false, selector: 'lib-unb-pessoa-endereco-form', template: "<h1 mat-dialog-title>Cadastro de E-mail</h1>\r\n<form (ngSubmit)=\"salvar(form)\" #form=\"ngForm\">\r\n <mat-dialog-content>\r\n <div class=\"form-container\">\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>Tipo</mat-label>\r\n <mat-select [(ngModel)]=\"endereco.tipoEnderecoCodigo\" name=\"tipo\" #tipo=\"ngModel\"\r\n (selectionChange)=\"onTipoSelecionado($event.value)\" required>\r\n <mat-option *ngFor=\"let tipo of tipoEndereco | async\" [value]=\"tipo.codigo\">\r\n {{tipo.denominacao}}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Pa\u00EDs</mat-label>\r\n\r\n <mat-select [(ngModel)]=\"endereco.paisEnderecoCodigo\" name=\"paisEnderecoCodigo\" #paisEnderecoCodigo=\"ngModel\">\r\n\r\n <mat-option *ngFor=\"let paises of paises | async\" [value]=\"paises.codigo\">\r\n <span *ngIf=\"paises.denominacao === 'BRASIL'\">\uD83C\uDDE7\uD83C\uDDF7 <b>{{ paises.denominacao }}</b></span>\r\n <span *ngIf=\"paises.denominacao !== 'BRASIL'\">{{ paises.denominacao }}</span>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>CEP</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"endereco.cep\" name=\"cep\" #cep=\"ngModel\" />\r\n <button matSuffix mat-icon-button type=\"button\" aria-label=\"Pesquisar\" (click)=\"pesquisarCep()\">\r\n <mat-icon style=\"margin-right: 2px;\">search</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Endere\u00E7o</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"endereco.logradouro\" name=\"logradouro\" #logradouro=\"ngModel\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>Bairro</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"endereco.bairro\" name=\"bairro\" #bairro=\"ngModel\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>Complemento</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"endereco.complemento\" name=\"complemento\" #complemento=\"ngModel\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>UF</mat-label>\r\n <mat-select [(ngModel)]=\"endereco.uf\" name=\"uf\" #uf=\"ngModel\">\r\n <mat-option *ngFor=\"let uf of getListaEstados()\" [value]=\"uf\">\r\n {{ uf }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\">\r\n <button mat-stroked-button type=\"button\" color=\"warn\" (click)=\"close()\">Fechar</button>\r\n <button mat-flat-button type=\"submit\" color=\"primary\">Salvar</button>\r\n </mat-dialog-actions>\r\n</form>", styles: [".card-actions-buttons{display:flex;gap:5px;flex-wrap:wrap}.form-container{display:flex;flex-wrap:wrap;column-gap:10px;margin:10px}@media (max-width: 1000px){.form-container{flex-direction:column;gap:5px}}.break{flex-basis:100%;height:0}.form-5{flex:1 1 5%}.inline-table-container{display:flex;align-items:center;justify-content:space-between;padding:5px}@media (max-width: 600px){.form-5,.form-10,.form-15{flex:1 1 100%}}.form-10{flex:1 1 10%}.form-15{flex:1 1 15%}.form-20{flex:1 1 20%}.form-25{flex:1 1 25%}.form-30{flex:1 1 30%}.form-35{flex:1 1 35%}.form-40{flex:1 1 40%}.form-45{flex:1 1 45%}.form-50{flex:1 1 50%}.form-100{flex:1 1 100%;min-width:250px}.botoes-container{display:flex;gap:5px}@media (max-width: 600px){.botoes-container{margin-bottom:10px}.botoes-container button{flex:1;max-width:50%}}\n"] }]
228
- }], ctorParameters: () => [{ type: i1.MatSnackBar }, { type: i2.UnBPessoaService }, { type: i3.MatDialogRef }, { type: undefined, decorators: [{
258
+ args: [{ standalone: false, selector: 'lib-unb-pessoa-endereco-form', template: "<h1 mat-dialog-title>Cadastro de E-mail</h1>\r\n<form (ngSubmit)=\"salvar(form)\" #form=\"ngForm\">\r\n <mat-dialog-content>\r\n <unb-mensagem [identificador]=\"idMensagemService\"></unb-mensagem>\r\n <div class=\"form-container\">\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>Tipo</mat-label>\r\n <mat-select [(ngModel)]=\"endereco.tipoEnderecoCodigo\" name=\"tipo\" #tipo=\"ngModel\"\r\n (selectionChange)=\"onTipoSelecionado($event.value)\" required>\r\n <mat-option *ngFor=\"let tipo of listaTipoEndereco\" [value]=\"tipo.codigo\">\r\n {{tipo.denominacao}}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Pa\u00EDs</mat-label>\r\n\r\n <mat-select [(ngModel)]=\"endereco.paisEnderecoCodigo\" name=\"paisEnderecoCodigo\" #paisEnderecoCodigo=\"ngModel\">\r\n\r\n <mat-option *ngFor=\"let paises of listaPaises\" [value]=\"paises.codigo\">\r\n <span *ngIf=\"paises.denominacao === 'BRASIL'\">\uD83C\uDDE7\uD83C\uDDF7 <b>{{ paises.denominacao }}</b></span>\r\n <span *ngIf=\"paises.denominacao !== 'BRASIL'\">{{ paises.denominacao }}</span>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>CEP</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"endereco.cep\" name=\"cep\" #cep=\"ngModel\" />\r\n <button matSuffix mat-icon-button type=\"button\" aria-label=\"Pesquisar\" (click)=\"pesquisarCep()\">\r\n <mat-icon style=\"margin-right: 2px;\">search</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Endere\u00E7o</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"endereco.logradouro\" name=\"logradouro\" #logradouro=\"ngModel\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>Bairro</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"endereco.bairro\" name=\"bairro\" #bairro=\"ngModel\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>Complemento</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"endereco.complemento\" name=\"complemento\" #complemento=\"ngModel\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-100\" appearance=\"outline\">\r\n <mat-label>UF</mat-label>\r\n <mat-select [(ngModel)]=\"endereco.uf\" name=\"uf\" #uf=\"ngModel\">\r\n <mat-option *ngFor=\"let uf of getListaEstados()\" [value]=\"uf\">\r\n {{ uf }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\">\r\n <button mat-stroked-button type=\"button\" color=\"warn\" (click)=\"close()\">Fechar</button>\r\n <button mat-flat-button type=\"submit\" color=\"primary\">Salvar</button>\r\n </mat-dialog-actions>\r\n</form>", styles: [".card-actions-buttons{display:flex;gap:5px;flex-wrap:wrap}.form-container{display:flex;flex-wrap:wrap;column-gap:10px;margin:10px}@media (max-width: 1000px){.form-container{flex-direction:column;gap:5px}}.break{flex-basis:100%;height:0}.form-5{flex:1 1 5%}.inline-table-container{display:flex;align-items:center;justify-content:space-between;padding:5px}@media (max-width: 600px){.form-5,.form-10,.form-15{flex:1 1 100%}}.form-10{flex:1 1 10%}.form-15{flex:1 1 15%}.form-20{flex:1 1 20%}.form-25{flex:1 1 25%}.form-30{flex:1 1 30%}.form-35{flex:1 1 35%}.form-40{flex:1 1 40%}.form-45{flex:1 1 45%}.form-50{flex:1 1 50%}.form-100{flex:1 1 100%;min-width:250px}.botoes-container{display:flex;gap:5px}@media (max-width: 600px){.botoes-container{margin-bottom:10px}.botoes-container button{flex:1;max-width:50%}}\n"] }]
259
+ }], ctorParameters: () => [{ type: i1.MatSnackBar }, { type: i2.UnBPessoaService }, { type: i3.UnbMensagemService }, { type: i4.MatDialogRef }, { type: undefined, decorators: [{
229
260
  type: Inject,
230
261
  args: [MAT_DIALOG_DATA]
231
262
  }] }] });
232
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5iLXBlc3NvYS1lbmRlcmVjby1mb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdW5iLWxpYi1jb21wb25lbnRzL3NyYy9saWIvdW5iLXBlc3NvYS91bmItcGVzc29hLWVuZGVyZWNvLWZvcm0vdW5iLXBlc3NvYS1lbmRlcmVjby1mb3JtLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdW5iLWxpYi1jb21wb25lbnRzL3NyYy9saWIvdW5iLXBlc3NvYS91bmItcGVzc29hLWVuZGVyZWNvLWZvcm0vdW5iLXBlc3NvYS1lbmRlcmVjby1mb3JtLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHMUQsT0FBTyxFQUFFLGlCQUFpQixFQUF5QixNQUFNLGdEQUFnRCxDQUFDO0FBRTFHLE9BQU8sRUFBRSxlQUFlLEVBQWdCLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFXekUsTUFBTSxPQUFPLDhCQUE4QjtJQVV6QyxZQUFvQixRQUFxQixFQUFVLE9BQXlCLEVBQVMsU0FBdUQsRUFBa0MsSUFBUztRQUFuSyxhQUFRLEdBQVIsUUFBUSxDQUFhO1FBQVUsWUFBTyxHQUFQLE9BQU8sQ0FBa0I7UUFBUyxjQUFTLEdBQVQsU0FBUyxDQUE4QztRQUFrQyxTQUFJLEdBQUosSUFBSSxDQUFLO1FBUHZMLGFBQVEsR0FBRyxJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFHbkMsc0JBQWlCLEdBQTRCLEVBQUUsQ0FBQztRQUNoRCxnQkFBVyxHQUFvQixFQUFFLENBQUM7UUFJaEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQ0FBa0M7UUFFN0YsMERBQTBEO1FBQzFELElBQUks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QyxVQUFVLEVBQUUsV0FBVyxFQUFFLEtBQUssa0JBQWtCLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRTtZQUMzRixnQkFBZ0IsQ0FBQyxNQUFNLEtBQUssa0JBQWtCLENBQUMsTUFBTSxDQUFDLHFEQUFxRDtTQUM1RyxDQUFDO1FBRUYsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsWUFBWSxDQUFDLG1DQUFtQyxDQUFDLENBQUM7WUFDdkQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsQ0FBQyxnQ0FBZ0M7SUFDL0MsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsWUFBWSxDQUFDLE9BQWU7UUFDMUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtZQUMvQixRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUMsQ0FBQztJQUNMLENBQUM7OEdBaFBVLDhCQUE4Qix5R0FVNkcsZUFBZTtrR0FWMUosOEJBQThCLG9FQ2hCM0MsaXBHQWdFTzs7MkZEaERNLDhCQUE4QjtrQkFOMUMsU0FBUztpQ0FDSSxLQUFLLFlBQ1AsOEJBQThCOzswQkFjdUcsTUFBTTsyQkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcic7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgVW5iUGVzc29hRW5kZXJlY28sIFVuYlBlc3NvYUVuZGVyZWNvVGlwbyB9IGZyb20gJy4uL3VuYi1wZXNzb2EtbW9kZWxzL3VuYi1wZXNzb2EtZW5kZXJlY28ubW9kZWwnO1xyXG5pbXBvcnQgeyBVbkJQZXNzb2FTZXJ2aWNlIH0gZnJvbSAnLi4vdW5iLXBlc3NvYS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTUFUX0RJQUxPR19EQVRBLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBOZ0Zvcm0gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFVuYlBlc3NvYVBhaXMgfSBmcm9tICcuLi91bmItcGVzc29hLW1vZGVscy91bmItcGVzc29hLXBhaXMnO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHN0YW5kYWxvbmU6IGZhbHNlLFxyXG4gIHNlbGVjdG9yOiAnbGliLXVuYi1wZXNzb2EtZW5kZXJlY28tZm9ybScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3VuYi1wZXNzb2EtZW5kZXJlY28tZm9ybS5odG1sJyxcclxuICBzdHlsZVVybDogJy4vdW5iLXBlc3NvYS1lbmRlcmVjby1mb3JtLmNzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIFVuYlBlc3NvYUVuZGVyZWNvRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIGVuZGVyZWNvU2Fsdm8hOiBVbmJQZXNzb2FFbmRlcmVjbztcclxuICBlbmRlcmVjbyA9IG5ldyBVbmJQZXNzb2FFbmRlcmVjbygpO1xyXG4gIGVuZGVyZWNvc0xpc3Q6IFVuYlBlc3NvYUVuZGVyZWNvW107XHJcbiAgdGlwb0VuZGVyZWNvITogT2JzZXJ2YWJsZTxVbmJQZXNzb2FFbmRlcmVjb1RpcG9bXT47XHJcbiAgbGlzdGFUaXBvRW5kZXJlY286IFVuYlBlc3NvYUVuZGVyZWNvVGlwb1tdID0gW107XHJcbiAgbGlzdGFQYWlzZXM6IFVuYlBlc3NvYVBhaXNbXSA9IFtdO1xyXG4gIHBhaXNlcyE6IE9ic2VydmFibGU8VW5iUGVzc29hUGFpc1tdPjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzbmFja0JhcjogTWF0U25hY2tCYXIsIHByaXZhdGUgc2VydmljZTogVW5CUGVzc29hU2VydmljZSwgcHVibGljIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPFVuYlBlc3NvYUVuZGVyZWNvRm9ybUNvbXBvbmVudD4sIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YTogYW55KSB7XHJcbiAgICB0aGlzLmVuZGVyZWNvID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhLmVuZGVyZWNvKSk7IC8vIE8gZS1tYWlsIGVzcGVjw61maWNvIHBhcmEgZWRpw6fDo29cclxuXHJcbiAgICAvLyBWZXJpZmlxdWUgc2UgYSBsaXN0YSBkZSBlLW1haWxzIGZvaSBwYXNzYWRhIGUgYXRyaWJ1YS1hXHJcbiAgICBpZiAoZGF0YS5lbmRlcmVjb3NMaXN0KSB7XHJcbiAgICAgIHRoaXMuZW5kZXJlY29zTGlzdCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGF0YS5lbmRlcmVjb3NMaXN0KSk7IC8vIEZhw6dhIHVtYSBjw7NwaWEgcHJvZnVuZGEgc2UgZm9yIG1hbmlwdWxhclxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5lbmRlcmVjb3NMaXN0ID0gW107IC8vIEluaWNpYWxpemUgY29tbyB2YXppbyBzZSBuw6NvIGZvciBwYXNzYWRhXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmVuZGVyZWNvKSB7XHJcbiAgICAgIHRoaXMuZW5kZXJlY28gPSBuZXcgVW5iUGVzc29hRW5kZXJlY28oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy50aXBvRW5kZXJlY28gPSB0aGlzLnNlcnZpY2UuZ2V0VGlwb0VuZGVyZWNvKCk7XHJcbiAgICB0aGlzLnBhaXNlcyA9IHRoaXMuc2VydmljZS5nZXRQYWlzZXMoKTsgLy8gVm9jw6ogasOhIHRpbmhhIGlzc29cclxuXHJcbiAgICAvLyAtLS0gUHJlZW5jaGUgbyAgVGlwb3MgZGUgRW5kZXJlw6dvIC0tLVxyXG4gICAgdGhpcy50aXBvRW5kZXJlY28uc3Vic2NyaWJlKGxpc3RhID0+IHtcclxuICAgICAgdGhpcy5saXN0YVRpcG9FbmRlcmVjbyA9IGxpc3RhO1xyXG5cclxuICAgICAgLy8gU2UgasOhIHRpdmVyIHRpcG9FbmRlcmVjb0NvZGlnbywgcHJlZW5jaGUgbyBub21lIGNvcnJlc3BvbmRlbnRlXHJcbiAgICAgIGlmICh0aGlzLmVuZGVyZWNvLnRpcG9FbmRlcmVjb0NvZGlnbyAhPSBudWxsKSB7XHJcbiAgICAgICAgY29uc3QgdGlwb0VuY29udHJhZG8gPSBsaXN0YS5maW5kKHQgPT4gdC5jb2RpZ28gPT09IHRoaXMuZW5kZXJlY28udGlwb0VuZGVyZWNvQ29kaWdvKTtcclxuICAgICAgICBpZiAodGlwb0VuY29udHJhZG8pIHtcclxuICAgICAgICAgIHRoaXMuZW5kZXJlY28udGlwbyA9IHRpcG9FbmNvbnRyYWRvLmRlbm9taW5hY2FvO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmICh0aGlzLmVuZGVyZWNvLnRpcG8pIHtcclxuICAgICAgICAvLyBTZSB0aXZlciBzw7MgbyBub21lLCBwcmVlbmNoZSBvIGPDs2RpZ29cclxuICAgICAgICBjb25zdCB0aXBvRW5jb250cmFkbyA9IGxpc3RhLmZpbmQoXHJcbiAgICAgICAgICB0ID0+IHQuZGVub21pbmFjYW8/LnRvTG93ZXJDYXNlKCkgPT09IHRoaXMuZW5kZXJlY28udGlwbz8udG9Mb3dlckNhc2UoKVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGlmICh0aXBvRW5jb250cmFkbykge1xyXG4gICAgICAgICAgICB0aGlzLmVuZGVyZWNvLnRpcG9FbmRlcmVjb0NvZGlnbyA9IHRpcG9FbmNvbnRyYWRvLmNvZGlnbyE7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBPIG1ldG9kbyBnZXQgcmV0b3JuYSB1ZiwgbWFzIG8gcHV0IGVzcGVyYSB1ZkVuZGVyZWNvXHJcbiAgICAgIGlmICh0aGlzLmVuZGVyZWNvLnVmKSB7XHJcbiAgICAgICAgdGhpcy5lbmRlcmVjby51ZkVuZGVyZWNvID0gdGhpcy5lbmRlcmVjby51ZjsgLy8gQ29udmVydGUgdWYgcGFyYSB1ZkVuZGVyZWNvXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIC0tLSBQcmVlbmNoZSBvIFBhw61zIC0tLVxyXG4gICAgdGhpcy5wYWlzZXMuc3Vic2NyaWJlKGxpc3RhRGVQYWlzZXMgPT4ge1xyXG4gICAgICB0aGlzLmxpc3RhUGFpc2VzID0gbGlzdGFEZVBhaXNlczsgLy8gQXJtYXplbmEgYSBsaXN0YSBkZSBwYcOtc2VzXHJcbiAgICAgIFxyXG4gICAgICBjb25zdCBDT0RJR09fQlJBU0lMID0gMjI7IC8vIEPDs2RpZ28gcGFkcsOjbyBwYXJhIG8gQnJhc2lsXHJcblxyXG4gICAgICAvLyBMw7NnaWNhIDE6IFNlIG8gSUQgZG8gcGHDrXMgasOhIGV4aXN0ZSAoZXg6IDIyKSwgZW5jb250cmEgbyBub21lIChleDogXCJCcmFzaWxcIilcclxuICAgICAgaWYgKHRoaXMuZW5kZXJlY28ucGFpc0VuZGVyZWNvQ29kaWdvICE9IG51bGwpIHtcclxuICAgICAgICBjb25zdCBwYWlzRW5jb250cmFkbyA9IHRoaXMubGlzdGFQYWlzZXMuZmluZChwID0+IHAuY29kaWdvID09PSB0aGlzLmVuZGVyZWNvLnBhaXNFbmRlcmVjb0NvZGlnbyk7XHJcbiAgICAgICAgaWYgKHBhaXNFbmNvbnRyYWRvKSB7XHJcbiAgICAgICAgICB0aGlzLmVuZGVyZWNvLnBhaXMgPSBwYWlzRW5jb250cmFkby5kZW5vbWluYWNhbztcclxuICAgICAgICB9XHJcbiAgICAgIH0gXHJcbiAgICAgIC8vIEzDs2dpY2EgMjogU2UgbyBub21lIGRvIHBhw61zIGV4aXN0ZSAoZXg6IFwiQnJhc2lsXCIpLCBlbmNvbnRyYSBvIElEIChleDogMjIpXHJcbiAgICAgIGVsc2UgaWYgKHRoaXMuZW5kZXJlY28ucGFpcykge1xyXG4gICAgICAgIGNvbnN0IHBhaXNFbmNvbnRyYWRvID0gdGhpcy5saXN0YVBhaXNlcy5maW5kKFxyXG4gICAgICAgICAgcCA9PiBwLmRlbm9taW5hY2FvPy50b0xvd2VyQ2FzZSgpID09PSB0aGlzLmVuZGVyZWNvLnBhaXM/LnRvTG93ZXJDYXNlKClcclxuICAgICAgICApO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChwYWlzRW5jb250cmFkbykge1xyXG4gICAgICAgICAgdGhpcy5lbmRlcmVjby5wYWlzRW5kZXJlY29Db2RpZ28gPSBwYWlzRW5jb250cmFkby5jb2RpZ287XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIFNlIG8gbm9tZSBmb2kgZm9ybmVjaWRvIG1hcyBuw6NvIGVuY29udHJhZG8gbmEgbGlzdGEsIGFzc3VtZSBCcmFzaWxcclxuICAgICAgICAgIHRoaXMuZW5kZXJlY28ucGFpc0VuZGVyZWNvQ29kaWdvID0gQ09ESUdPX0JSQVNJTDtcclxuICAgICAgICB9XHJcbiAgICAgIH0gXHJcbiAgICAgIC8vIEzDs2dpY2EgMzogU2UgbmVtIG8gSUQgbmVtIG8gbm9tZSBleGlzdGVtLCBhc3N1bWUgQnJhc2lsIHBvciBwYWRyw6NvXHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZW5kZXJlY28ucGFpc0VuZGVyZWNvQ29kaWdvID0gQ09ESUdPX0JSQVNJTDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzYWx2YXIoZm9ybTogTmdGb3JtKSB7XHJcbiAgICBpZiAoZm9ybS5pbnZhbGlkKSB7XHJcbiAgICAgIHRoaXMub3BlblNuYWNrQmFyKCdFeGlzdGVtIGVycm9zIG5vIGZvcm11bMOhcmlvLCBwb3IgZmF2b3IsIHZlcmlmaWNhci4nKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFNlIGEgb3JkZW1FbmRlcmVjbyBuw6NvIGVzdGl2ZXIgZGVmaW5pZGEgKG5vdm8gaXRlbSkgb3UgZm9yIDBcclxuICAgIGlmICghdGhpcy5lbmRlcmVjby5vcmRlbUVuZGVyZWNvIHx8IHRoaXMuZW5kZXJlY28ub3JkZW1FbmRlcmVjbyA9PT0gMCkge1xyXG4gICAgICBsZXQgbWF4T3JkZW0gPSAwO1xyXG4gICAgICBpZiAodGhpcy5lbmRlcmVjb3NMaXN0ICYmIHRoaXMuZW5kZXJlY29zTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgbWF4T3JkZW0gPSBNYXRoLm1heCguLi50aGlzLmVuZGVyZWNvc0xpc3QubWFwKGUgPT4gZS5vcmRlbUVuZGVyZWNvIHx8IDApKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmVuZGVyZWNvLm9yZGVtRW5kZXJlY28gPSBtYXhPcmRlbSArIDE7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMudmFsaWRhcih0aGlzLmVuZGVyZWNvKSA9PSBmYWxzZSkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuZW5kZXJlY29TYWx2byA9IHRoaXMuZW5kZXJlY287XHJcbiAgICB0aGlzLnNhbHZhcmNsb3NlKClcclxuICB9XHJcblxyXG4gIGNvbXBhcmFyVGlwb3ModDE6IGFueSwgdDI6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHQxICYmIHQyICYmIHQxLmNvZGlnbyA9PT0gdDIuY29kaWdvO1xyXG4gIH1cclxuXHJcbiAgb25UaXBvU2VsZWNpb25hZG8oY29kaWdvU2VsZWNpb25hZG86IG51bWJlcikge1xyXG4gICAgY29uc3QgdGlwb1NlbGVjaW9uYWRvID0gdGhpcy5saXN0YVRpcG9FbmRlcmVjby5maW5kKHQgPT4gdC5jb2RpZ28gPT09IGNvZGlnb1NlbGVjaW9uYWRvKTtcclxuICAgIGlmICh0aXBvU2VsZWNpb25hZG8pIHtcclxuICAgICAgdGhpcy5lbmRlcmVjby50aXBvID0gdGlwb1NlbGVjaW9uYWRvLmRlbm9taW5hY2FvO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcGVzcXVpc2FyQ2VwKCkge1xyXG4gICBpZiAodGhpcy5lbmRlcmVjby5jZXAgJiYgdGhpcy5lbmRlcmVjby5jZXAudHJpbSgpICE9PSAnJykge1xyXG4gICAgICBsZXQgY2VwRm9ybWF0YWRvID0gdGhpcy5lbmRlcmVjby5jZXAucmVwbGFjZSgvXFxEL2csICcnKTsgLy8gUmVtb3ZlIGNhcmFjdGVyZXMgbsOjbyBudW3DqXJpY29zXHJcbiAgICAgIHRoaXMuc2VydmljZS5wZXNxdWlzYXJDZXAoY2VwRm9ybWF0YWRvKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChkYXRhOiBVbmJQZXNzb2FFbmRlcmVjbykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5lbmRlcmVjby5sb2dyYWRvdXJvID0gZGF0YS5sb2dyYWRvdXJvO1xyXG4gICAgICAgICAgdGhpcy5lbmRlcmVjby5iYWlycm8gPSBkYXRhLmJhaXJybztcclxuICAgICAgICAgIHRoaXMuZW5kZXJlY28udWZFbmRlcmVjbyA9IGRhdGEudWY7XHJcbiAgICAgICAgICB0aGlzLmVuZGVyZWNvLnVmID0gZGF0YS51ZjtcclxuICAgICAgICAgIHRoaXMuZW5kZXJlY28uY29tcGxlbWVudG8gPSBkYXRhLmNvbXBsZW1lbnRvO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5vcGVuU25hY2tCYXIoJ0ZhbGhhIGFvIGVuY29udHJhciBvIENFUCcpO1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJybyBhbyBwZXNxdWlzYXIgQ0VQOicsIGVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5vcGVuU25hY2tCYXIoJ1BvciBmYXZvciwgaW5zaXJhIHVtIENFUCB2w6FsaWRvLicpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0TGlzdGFFc3RhZG9zKCk6IGFueSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICAnQUMnLCAnQUwnLCAnQVAnLCAnQU0nLCAnQkEnLCAnQ0UnLCAnREYnLCAnRVMnLCAnR08nLCAnTUEnLFxyXG4gICAgICAnTVQnLCAnTVMnLCAnTUcnLCAnUEEnLCAnUEInLCAnUFInLCAnUEUnLCAnUEknLCAnUkonLCAnUk4nLFxyXG4gICAgICAnUlMnLCAnUk8nLCAnUlInLCAnU0MnLCAnU1AnLCAnU0UnLCAnVE8nXHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVmFsaWRhIG8gb2JqZXRvIGRlIGVuZGVyZcOnbywgcmVwbGljYW5kbyBhcyByZWdyYXMgZG8gdmFsaWRhZG9yIGRvIGJhY2tlbmQuXHJcbiAgICogUmV0b3JuYSB0cnVlIHNlIG8gZW5kZXJlw6dvIGZvciB2w6FsaWRvLCBmYWxzZSBjYXNvIGNvbnRyw6FyaW8uXHJcbiAgICovXHJcbiAgdmFsaWRhcihlbmRlcmVjb1RvVmFsaWRhdGU6IFVuYlBlc3NvYUVuZGVyZWNvKTogYm9vbGVhbiB7XHJcbiAgICBcclxuICAgIC8vIDEuIFZhbGlkYcOnw6NvIGRlIHRpcG9FbmRlcmVjb0NvZGlnbyAoT2JyaWdhdMOzcmlvIGUgMC00KVxyXG4gICAgLy8gW0phdmE6IHJlcXVlc3QuZ2V0VGlwb0VuZGVyZWNvQ29kaWdvKCkgPT0gbnVsbF1cclxuICAgIGlmIChlbmRlcmVjb1RvVmFsaWRhdGUudGlwb0VuZGVyZWNvQ29kaWdvID09IG51bGwpIHtcclxuICAgICAgdGhpcy5vcGVuU25hY2tCYXIoXCJUaXBvIGRlIEVuZGVyZcOnbyDDqSB1bSBjYW1wbyBvYnJpZ2F0w7NyaW8uXCIpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICAvLyBbSmF2YTogcmVxdWVzdC5nZXRUaXBvRW5kZXJlY29Db2RpZ28oKSA8IChieXRlKSAwIHx8IHJlcXVlc3QuZ2V0VGlwb0VuZGVyZWNvQ29kaWdvKCkgPiAoYnl0ZSkgNF1cclxuICAgIGlmIChlbmRlcmVjb1RvVmFsaWRhdGUudGlwb0VuZGVyZWNvQ29kaWdvIDwgMCB8fCBlbmRlcmVjb1RvVmFsaWRhdGUudGlwb0VuZGVyZWNvQ29kaWdvID4gNCkge1xyXG4gICAgICB0aGlzLm9wZW5TbmFja0JhcihcIlRpcG8gZGUgRW5kZXJlw6dvIMOpIGludsOhbGlkbyAoZGV2ZSBzZXIgZW50cmUgMCBlIDQpLlwiKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIDMuIFZhbGlkYcOnw6NvIGRlIENFUCAoOCBkw61naXRvcywgc2UgcHJlZW5jaGlkbylcclxuICAgIC8vIFtKYXZhOiByZXF1ZXN0LmdldENlcCgpLnRyaW0oKS5sZW5ndGgoKSAhPSA4XVxyXG4gICAgaWYgKGVuZGVyZWNvVG9WYWxpZGF0ZS5jZXAgJiYgZW5kZXJlY29Ub1ZhbGlkYXRlLmNlcC50cmltKCkgIT09ICcnKSB7XHJcbiAgICAgIGNvbnN0IGNlcExpbXBvID0gZW5kZXJlY29Ub1ZhbGlkYXRlLmNlcC5yZXBsYWNlKC9cXEQvZywgJycpOyAvLyBSZW1vdmUgbsOjby1kw61naXRvc1xyXG4gICAgICBpZiAoY2VwTGltcG8ubGVuZ3RoICE9PSA4KSB7XHJcbiAgICAgICAgdGhpcy5vcGVuU25hY2tCYXIoXCJDRVAgZGV2ZSBjb250ZXIgOCBkw61naXRvcy5cIik7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gNC4gVmFsaWRhw6fDo28gZGUgTG9ncmFkb3VybyAoTWF4IDEwMCwgc2UgcHJlZW5jaGlkbylcclxuICAgIC8vIFtKYXZhOiByZXF1ZXN0LmdldExvZ3JhZG91cm8oKS50cmltKCkubGVuZ3RoKCkgPiAxMDBdXHJcbiAgICBpZiAoZW5kZXJlY29Ub1ZhbGlkYXRlLmxvZ3JhZG91cm8gJiYgZW5kZXJlY29Ub1ZhbGlkYXRlLmxvZ3JhZG91cm8udHJpbSgpLmxlbmd0aCA+IDEwMCkge1xyXG4gICAgICB0aGlzLm9wZW5TbmFja0JhcihcIkxvZ3JhZG91cm8gZGV2ZSB0ZXIgbm8gbcOheGltbyAxMDAgY2FyYWN0ZXJlcy5cIik7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyA1LiBWYWxpZGHDp8OjbyBkZSBCYWlycm8gKE1heCAxMDAsIHNlIHByZWVuY2hpZG8pXHJcbiAgICAvLyBbSmF2YTogcmVxdWVzdC5nZXRCYWlycm8oKS50cmltKCkubGVuZ3RoKCkgPiAxMDBdXHJcbiAgICBpZiAoZW5kZXJlY29Ub1ZhbGlkYXRlLmJhaXJybyAmJiBlbmRlcmVjb1RvVmFsaWRhdGUuYmFpcnJvLnRyaW0oKS5sZW5ndGggPiAxMDApIHtcclxuICAgICAgdGhpcy5vcGVuU25hY2tCYXIoXCJCYWlycm8gZGV2ZSB0ZXIgbm8gbcOheGltbyAxMDAgY2FyYWN0ZXJlcy5cIik7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyA2LiBWYWxpZGHDp8OjbyBkZSBDb21wbGVtZW50byAoTWF4IDEwMCwgc2UgcHJlZW5jaGlkbylcclxuICAgIC8vIFtKYXZhOiByZXF1ZXN0LmdldENvbXBsZW1lbnRvKCkudHJpbSgpLmxlbmd0aCgpID4gMTAwXVxyXG4gICAgaWYgKGVuZGVyZWNvVG9WYWxpZGF0ZS5jb21wbGVtZW50byAmJiBlbmRlcmVjb1RvVmFsaWRhdGUuY29tcGxlbWVudG8udHJpbSgpLmxlbmd0aCA+IDEwMCkge1xyXG4gICAgICB0aGlzLm9wZW5TbmFja0JhcihcIkNvbXBsZW1lbnRvIGRldmUgdGVyIG5vIG3DoXhpbW8gMTAwIGNhcmFjdGVyZXMuXCIpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gNy4gVmFsaWRhw6fDo28gZGUgQ2FpeGEgUG9zdGFsIChNYXggMTAwLCBzZSBwcmVlbmNoaWRhKVxyXG4gICAgLy8gW0phdmE6IHJlcXVlc3QuZ2V0Q2FpeGFQb3N0YWwoKS50cmltKCkubGVuZ3RoKCkgPiAxMDBdXHJcbiAgICBpZiAoZW5kZXJlY29Ub1ZhbGlkYXRlLmNhaXhhUG9zdGFsICYmIGVuZGVyZWNvVG9WYWxpZGF0ZS5jYWl4YVBvc3RhbC50cmltKCkubGVuZ3RoID4gMTAwKSB7XHJcbiAgICAgIHRoaXMub3BlblNuYWNrQmFyKFwiQ2FpeGEgUG9zdGFsIGRldmUgdGVyIG5vIG3DoXhpbW8gMTAwIGNhcmFjdGVyZXMuXCIpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gOC4gVmFsaWRhw6fDo28gZGUgVUYgKDIgY2FyYWN0ZXJlcywgc2UgcHJlZW5jaGlkYSlcclxuICAgIC8vIE8gZm9ybSB1c2EgJ3VmRW5kZXJlY28nLCBvIGphdmEgdXNhICd1ZicuIE8gbmdPbkluaXQgbWFwZWlhIHVmIC0+IHVmRW5kZXJlY28uXHJcbiAgICAvLyBbSmF2YTogcmVxdWVzdC5nZXRVZigpLnRyaW0oKS5sZW5ndGgoKSAhPSAyXVxyXG4gICAgaWYgKGVuZGVyZWNvVG9WYWxpZGF0ZS51ZkVuZGVyZWNvICYmIGVuZGVyZWNvVG9WYWxpZGF0ZS51ZkVuZGVyZWNvLnRyaW0oKS5sZW5ndGggIT09IDIpIHtcclxuICAgICAgdGhpcy5vcGVuU25hY2tCYXIoXCJVRiBkZXZlIHRlciAyIGNhcmFjdGVyZXMuXCIpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gLS0tIFZhbGlkYcOnw6NvIGRlIER1cGxpY2FyIC0tLVxyXG4gICAgY29uc3QgaXNEdXBsaWNhdGUgPSB0aGlzLmVuZGVyZWNvc0xpc3Quc29tZShleGlzdGluZ0VuZGVyZWNvID0+XHJcbiAgICAgIGV4aXN0aW5nRW5kZXJlY28ubG9ncmFkb3Vybz8udG9Mb3dlckNhc2UoKSA9PT0gZW5kZXJlY29Ub1ZhbGlkYXRlLmxvZ3JhZG91cm8/LnRvTG93ZXJDYXNlKCkgJiZcclxuICAgICAgZXhpc3RpbmdFbmRlcmVjby5jb2RpZ28gIT09IGVuZGVyZWNvVG9WYWxpZGF0ZS5jb2RpZ28gLy8gSWdub3JhIG8gcHLDs3ByaW8gZW5kZXJlw6dvIHNlIGVzdGl2ZXIgc2VuZG8gZWRpdGFkb1xyXG4gICAgKTtcclxuXHJcbiAgICBpZiAoaXNEdXBsaWNhdGUpIHtcclxuICAgICAgdGhpcy5vcGVuU25hY2tCYXIoXCJFc3RlIGVuZGVyZcOnbyBqw6EgZXhpc3RlIG5hIGxpc3RhLlwiKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlOyAvLyBQYXNzb3UgZW0gdG9kYXMgYXMgdmFsaWRhw6fDtWVzXHJcbiAgfVxyXG5cclxuICBjbG9zZSgpIHtcclxuICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKG51bGwpO1xyXG4gIH1cclxuXHJcbiAgc2FsdmFyY2xvc2UoKSB7XHJcbiAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSh0aGlzLmVuZGVyZWNvU2Fsdm8pO1xyXG4gIH1cclxuXHJcbiAgb3BlblNuYWNrQmFyKG1lc3NhZ2U6IHN0cmluZykge1xyXG4gICAgdGhpcy5zbmFja0Jhci5vcGVuKG1lc3NhZ2UsICd4Jywge1xyXG4gICAgICBkdXJhdGlvbjogNTAwMCxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbn0iLCI8aDEgbWF0LWRpYWxvZy10aXRsZT5DYWRhc3RybyBkZSBFLW1haWw8L2gxPlxyXG48Zm9ybSAobmdTdWJtaXQpPVwic2FsdmFyKGZvcm0pXCIgI2Zvcm09XCJuZ0Zvcm1cIj5cclxuICA8bWF0LWRpYWxvZy1jb250ZW50PlxyXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tY29udGFpbmVyXCI+XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZvcm0tMTAwXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICA8bWF0LWxhYmVsPlRpcG88L21hdC1sYWJlbD5cclxuICAgICAgICA8bWF0LXNlbGVjdCBbKG5nTW9kZWwpXT1cImVuZGVyZWNvLnRpcG9FbmRlcmVjb0NvZGlnb1wiIG5hbWU9XCJ0aXBvXCIgI3RpcG89XCJuZ01vZGVsXCJcclxuICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25UaXBvU2VsZWNpb25hZG8oJGV2ZW50LnZhbHVlKVwiIHJlcXVpcmVkPlxyXG4gICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHRpcG8gb2YgdGlwb0VuZGVyZWNvIHwgYXN5bmNcIiBbdmFsdWVdPVwidGlwby5jb2RpZ29cIj5cclxuICAgICAgICAgICAge3t0aXBvLmRlbm9taW5hY2FvfX1cclxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmb3JtLTEwXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICA8bWF0LWxhYmVsPlBhw61zPC9tYXQtbGFiZWw+XHJcblxyXG4gICAgICAgIDxtYXQtc2VsZWN0IFsobmdNb2RlbCldPVwiZW5kZXJlY28ucGFpc0VuZGVyZWNvQ29kaWdvXCIgbmFtZT1cInBhaXNFbmRlcmVjb0NvZGlnb1wiICNwYWlzRW5kZXJlY29Db2RpZ289XCJuZ01vZGVsXCI+XHJcblxyXG4gICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHBhaXNlcyBvZiBwYWlzZXMgfCBhc3luY1wiIFt2YWx1ZV09XCJwYWlzZXMuY29kaWdvXCI+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicGFpc2VzLmRlbm9taW5hY2FvID09PSAnQlJBU0lMJ1wiPvCfh6fwn4e3IDxiPnt7IHBhaXNlcy5kZW5vbWluYWNhbyB9fTwvYj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicGFpc2VzLmRlbm9taW5hY2FvICE9PSAnQlJBU0lMJ1wiPnt7IHBhaXNlcy5kZW5vbWluYWNhbyB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmb3JtLTEwMFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgPG1hdC1sYWJlbD5DRVA8L21hdC1sYWJlbD5cclxuICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBbKG5nTW9kZWwpXT1cImVuZGVyZWNvLmNlcFwiIG5hbWU9XCJjZXBcIiAjY2VwPVwibmdNb2RlbFwiIC8+XHJcbiAgICAgICAgPGJ1dHRvbiBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIiBhcmlhLWxhYmVsPVwiUGVzcXVpc2FyXCIgKGNsaWNrKT1cInBlc3F1aXNhckNlcCgpXCI+XHJcbiAgICAgICAgICA8bWF0LWljb24gc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDJweDtcIj5zZWFyY2g8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZm9ybS0yNVwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgPG1hdC1sYWJlbD5FbmRlcmXDp288L21hdC1sYWJlbD5cclxuICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBbKG5nTW9kZWwpXT1cImVuZGVyZWNvLmxvZ3JhZG91cm9cIiBuYW1lPVwibG9ncmFkb3Vyb1wiICNsb2dyYWRvdXJvPVwibmdNb2RlbFwiIC8+XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmb3JtLTEwMFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgPG1hdC1sYWJlbD5CYWlycm88L21hdC1sYWJlbD5cclxuICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBbKG5nTW9kZWwpXT1cImVuZGVyZWNvLmJhaXJyb1wiIG5hbWU9XCJiYWlycm9cIiAjYmFpcnJvPVwibmdNb2RlbFwiIC8+XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmb3JtLTEwMFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgPG1hdC1sYWJlbD5Db21wbGVtZW50bzwvbWF0LWxhYmVsPlxyXG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1hdElucHV0IFsobmdNb2RlbCldPVwiZW5kZXJlY28uY29tcGxlbWVudG9cIiBuYW1lPVwiY29tcGxlbWVudG9cIiAjY29tcGxlbWVudG89XCJuZ01vZGVsXCIgLz5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZvcm0tMTAwXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICA8bWF0LWxhYmVsPlVGPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgPG1hdC1zZWxlY3QgWyhuZ01vZGVsKV09XCJlbmRlcmVjby51ZlwiIG5hbWU9XCJ1ZlwiICN1Zj1cIm5nTW9kZWxcIj5cclxuICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCB1ZiBvZiBnZXRMaXN0YUVzdGFkb3MoKVwiIFt2YWx1ZV09XCJ1ZlwiPlxyXG4gICAgICAgICAgICB7eyB1ZiB9fVxyXG4gICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDwvZGl2PlxyXG4gIDwvbWF0LWRpYWxvZy1jb250ZW50PlxyXG5cclxuICA8bWF0LWRpYWxvZy1hY3Rpb25zIGFsaWduPVwiZW5kXCI+XHJcbiAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY29sb3I9XCJ3YXJuXCIgKGNsaWNrKT1cImNsb3NlKClcIj5GZWNoYXI8L2J1dHRvbj5cclxuICAgIDxidXR0b24gbWF0LWZsYXQtYnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjb2xvcj1cInByaW1hcnlcIj5TYWx2YXI8L2J1dHRvbj5cclxuICA8L21hdC1kaWFsb2ctYWN0aW9ucz5cclxuPC9mb3JtPiJdfQ==
263
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5iLXBlc3NvYS1lbmRlcmVjby1mb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdW5iLWxpYi1jb21wb25lbnRzL3NyYy9saWIvdW5iLXBlc3NvYS91bmItcGVzc29hLWVuZGVyZWNvLWZvcm0vdW5iLXBlc3NvYS1lbmRlcmVjby1mb3JtLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdW5iLWxpYi1jb21wb25lbnRzL3NyYy9saWIvdW5iLXBlc3NvYS91bmItcGVzc29hLWVuZGVyZWNvLWZvcm0vdW5iLXBlc3NvYS1lbmRlcmVjby1mb3JtLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHMUQsT0FBTyxFQUFFLGlCQUFpQixFQUF5QixNQUFNLGdEQUFnRCxDQUFDO0FBRTFHLE9BQU8sRUFBRSxlQUFlLEVBQWdCLE1BQU0sMEJBQTBCLENBQUM7QUFHekUsT0FBTyxFQUFzQixtQkFBbUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUFTbEcsTUFBTSxPQUFPLDhCQUE4QjtJQVd6QyxZQUFvQixRQUFxQixFQUFVLE9BQXlCLEVBQVUsWUFBZ0MsRUFBUyxTQUF1RCxFQUFrQyxJQUFTO1FBQTdNLGFBQVEsR0FBUixRQUFRLENBQWE7UUFBVSxZQUFPLEdBQVAsT0FBTyxDQUFrQjtRQUFVLGlCQUFZLEdBQVosWUFBWSxDQUFvQjtRQUFTLGNBQVMsR0FBVCxTQUFTLENBQThDO1FBQWtDLFNBQUksR0FBSixJQUFJLENBQUs7UUFSak8sYUFBUSxHQUFHLElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUVuQyxzQkFBaUIsR0FBNEIsRUFBRSxDQUFDO1FBQ2hELGdCQUFXLEdBQW9CLEVBQUUsQ0FBQztRQUdsQyxzQkFBaUIsR0FBRyx1QkFBdUIsQ0FBQztRQUcxQyxJQUFJLENBQUMs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QUM7WUFDaEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUVELG1FQUFtRTtRQUNuRSxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ2xELElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzlHLENBQUM7SUFDSCxDQUFDO0lBRUQsWUFBWSxDQUFDLE9BQWU7UUFDMUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRTtZQUMvQixRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUMsQ0FBQztJQUNMLENBQUM7OEdBN1FVLDhCQUE4QiwySUFXdUosZUFBZTtrR0FYcE0sOEJBQThCLG9FQ2pCM0Msc3RHQWlFTzs7MkZEaERNLDhCQUE4QjtrQkFOMUMsU0FBUztpQ0FDSSxLQUFLLFlBQ1AsOEJBQThCOzswQkFlaUosTUFBTTsyQkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcic7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgVW5iUGVzc29hRW5kZXJlY28sIFVuYlBlc3NvYUVuZGVyZWNvVGlwbyB9IGZyb20gJy4uL3VuYi1wZXNzb2EtbW9kZWxzL3VuYi1wZXNzb2EtZW5kZXJlY28ubW9kZWwnO1xyXG5pbXBvcnQgeyBVbmJQZXNzb2FFcnJvUGFkcmFvLCBVbkJQZXNzb2FTZXJ2aWNlIH0gZnJvbSAnLi4vdW5iLXBlc3NvYS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTUFUX0RJQUxPR19EQVRBLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBOZ0Zvcm0gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFVuYlBlc3NvYVBhaXMgfSBmcm9tICcuLi91bmItcGVzc29hLW1vZGVscy91bmItcGVzc29hLXBhaXMnO1xyXG5pbXBvcnQgeyBVbmJNZW5zYWdlbVNlcnZpY2UsIFVuYlRpcG9NZW5zYWdlbUVudW0gfSBmcm9tICcuLi8uLi91bmItbWVuc2FnZW0vdW5iLW1lbnNhZ2VtLnNlcnZpY2UnO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHN0YW5kYWxvbmU6IGZhbHNlLFxyXG4gIHNlbGVjdG9yOiAnbGliLXVuYi1wZXNzb2EtZW5kZXJlY28tZm9ybScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3VuYi1wZXNzb2EtZW5kZXJlY28tZm9ybS5odG1sJyxcclxuICBzdHlsZVVybDogJy4vdW5iLXBlc3NvYS1lbmRlcmVjby1mb3JtLmNzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIFVuYlBlc3NvYUVuZGVyZWNvRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIGVuZGVyZWNvU2Fsdm8hOiBVbmJQZXNzb2FFbmRlcmVjbztcclxuICBlbmRlcmVjbyA9IG5ldyBVbmJQZXNzb2FFbmRlcmVjbygpO1xyXG4gIGVuZGVyZWNvc0xpc3Q6IFVuYlBlc3NvYUVuZGVyZWNvW107XHJcbiAgbGlzdGFUaXBvRW5kZXJlY286IFVuYlBlc3NvYUVuZGVyZWNvVGlwb1tdID0gW107XHJcbiAgbGlzdGFQYWlzZXM6IFVuYlBlc3NvYVBhaXNbXSA9IFtdO1xyXG4gIHBhaXNlcyE6IE9ic2VydmFibGU8VW5iUGVzc29hUGFpc1tdPjtcclxuXHJcbiAgaWRNZW5zYWdlbVNlcnZpY2UgPSBcIlVuYlBlc3NvYUVuZGVyZWNvRm9ybVwiO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHNuYWNrQmFyOiBNYXRTbmFja0JhciwgcHJpdmF0ZSBzZXJ2aWNlOiBVbkJQZXNzb2FTZXJ2aWNlLCBwcml2YXRlIGFsZXJ0U2VydmljZTogVW5iTWVuc2FnZW1TZXJ2aWNlLCBwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8VW5iUGVzc29hRW5kZXJlY29Gb3JtQ29tcG9uZW50PiwgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkYXRhOiBhbnkpIHtcclxuICAgIHRoaXMuZW5kZXJlY28gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRhdGEuZW5kZXJlY28pKTsgLy8gTyBlLW1haWwgZXNwZWPDrWZpY28gcGFyYSBlZGnDp8Ojb1xyXG5cclxuICAgIC8vIFZlcmlmaXF1ZSBzZSBhIGxpc3RhIGRlIGUtbWFpbHMgZm9pIHBhc3NhZGEgZSBhdHJpYnVhLWFcclxuICAgIGlmIChkYXRhLmVuZGVyZWNvc0xpc3QpIHtcclxuICAgICAgdGhpcy5lbmRlcmVjb3NMaXN0ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhLmVuZGVyZWNvc0xpc3QpKTsgLy8gRmHDp2EgdW1hIGPDs3BpYSBwcm9mdW5kYSBzZSBmb3IgbWFuaXB1bGFyXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmVuZGVyZWNvc0xpc3QgPSBbXTsgLy8gSW5pY2lhbGl6ZSBjb21vIHZhemlvIHNlIG7Do28gZm9yIHBhc3NhZGFcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuZW5kZXJlY28pIHtcclxuICAgICAgdGhpcy5lbmRlcmVjbyA9IG5ldyBVbmJQZXNzb2FFbmRlcmVjbygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAvLyAtLS0gUHJlZW5jaGUgbyAgVGlwb3MgZGUgRW5kZXJlw6dvIC0tLVxyXG4gICAgdGhpcy5zZXJ2aWNlLmdldFRpcG9FbmRlcmVjbygpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChsaXN0YSkgPT4ge1xyXG4gICAgICAgIHRoaXMubGlzdGFUaXBvRW5kZXJlY28gPSBsaXN0YTtcclxuXHJcbiAgICAgICAgLy8gU2UgasOhIHRpdmVyIHRpcG9FbmRlcmVjb0NvZGlnbywgcHJlZW5jaGUgbyBub21lIGNvcnJlc3BvbmRlbnRlXHJcbiAgICAgICAgaWYgKHRoaXMuZW5kZXJlY28udGlwb0VuZGVyZWNvQ29kaWdvICE9IG51bGwpIHtcclxuICAgICAgICAgIGNvbnN0IHRpcG9FbmNvbnRyYWRvID0gbGlzdGEuZmluZCh0ID0+IHQuY29kaWdvID09PSB0aGlzLmVuZGVyZWNvLnRpcG9FbmRlcmVjb0NvZGlnbyk7XHJcbiAgICAgICAgICBpZiAodGlwb0VuY29udHJhZG8pIHtcclxuICAgICAgICAgICAgdGhpcy5lbmRlcmVjby50aXBvID0gdGlwb0VuY29udHJhZG8uZGVub21pbmFjYW87XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVuZGVyZWNvLnRpcG8pIHtcclxuICAgICAgICAgIC8vIFNlIHRpdmVyIHPDsyBvIG5vbWUsIHByZWVuY2hlIG8gY8OzZGlnb1xyXG4gICAgICAgICAgY29uc3QgdGlwb0VuY29udHJhZG8gPSBsaXN0YS5maW5kKFxyXG4gICAgICAgICAgICB0ID0+IHQuZGVub21pbmFjYW8/LnRvTG93ZXJDYXNlKCkgPT09IHRoaXMuZW5kZXJlY28udGlwbz8udG9Mb3dlckNhc2UoKVxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICBpZiAodGlwb0VuY29udHJhZG8pIHtcclxuICAgICAgICAgICAgdGhpcy5lbmRlcmVjby50aXBvRW5kZXJlY29Db2RpZ28gPSB0aXBvRW5jb250cmFkby5jb2RpZ28hO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gTyBtZXRvZG8gZ2V0IHJldG9ybmEgdWYsIG1hcyBvIHB1dCBlc3BlcmEgdWZFbmRlcmVjb1xyXG4gICAgICAgIGlmICh0aGlzLmVuZGVyZWNvLnVmKSB7XHJcbiAgICAgICAgICB0aGlzLmVuZGVyZWNvLnVmRW5kZXJlY28gPSB0aGlzLmVuZGVyZWNvLnVmOyAvLyBDb252ZXJ0ZSB1ZiBwYXJhIHVmRW5kZXJlY29cclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIC8vIFRyYXRhbWVudG8gZGUgZXJybyBubyBjYXJyZWdhbWVudG8gZGEgbGlzdGFcclxuICAgICAgZXJyb3I6IChlcnI6IFVuYlBlc3NvYUVycm9QYWRyYW8pID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKVxyXG4gICAgfSk7XHJcbiAgXHJcbiAgICAvLyAtLS0gUHJlZW5jaGUgbyBQYcOtcyAtLS1cclxuICAgIHRoaXMuc2VydmljZS5nZXRQYWlzZXMoKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAobGlzdGFEZVBhaXNlcykgPT4ge1xyXG4gICAgICAgIHRoaXMubGlzdGFQYWlzZXMgPSBsaXN0YURlUGFpc2VzOyAvLyBBcm1hemVuYSBhIGxpc3RhIGRlIHBhw61zZXNcclxuXHJcbiAgICAgICAgY29uc3QgQ09ESUdPX0JSQVNJTCA9IDIyOyAvLyBDw7NkaWdvIHBhZHLDo28gcGFyYSBvIEJyYXNpbFxyXG5cclxuICAgICAgICAvLyBMw7NnaWNhIDE6IFNlIG8gSUQgZG8gcGHDrXMgasOhIGV4aXN0ZSAoZXg6IDIyKSwgZW5jb250cmEgbyBub21lIChleDogXCJCcmFzaWxcIilcclxuICAgICAgICBpZiAodGhpcy5lbmRlcmVjby5wYWlzRW5kZXJlY29Db2RpZ28gIT0gbnVsbCkge1xyXG4gICAgICAgICAgY29uc3QgcGFpc0VuY29udHJhZG8gPSB0aGlzLmxpc3RhUGFpc2VzLmZpbmQocCA9PiBwLmNvZGlnbyA9PT0gdGhpcy5lbmRlcmVjby5wYWlzRW5kZXJlY29Db2RpZ28pO1xyXG4gICAgICAgICAgaWYgKHBhaXNFbmNvbnRyYWRvKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kZXJlY28ucGFpcyA9IHBhaXNFbmNvbnRyYWRvLmRlbm9taW5hY2FvO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBMw7NnaWNhIDI6IFNlIG8gbm9tZSBkbyBwYcOtcyBleGlzdGUgKGV4OiBcIkJyYXNpbFwiKSwgZW5jb250cmEgbyBJRCAoZXg6IDIyKVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZW5kZXJlY28ucGFpcykge1xyXG4gICAgICAgICAgY29uc3QgcGFpc0VuY29udHJhZG8gPSB0aGlzLmxpc3RhUGFpc2VzLmZpbmQoXHJcbiAgICAgICAgICAgIHAgPT4gcC5kZW5vbWluYWNhbz8udG9Mb3dlckNhc2UoKSA9PT0gdGhpcy5lbmRlcmVjby5wYWlzPy50b0xvd2VyQ2FzZSgpXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIGlmIChwYWlzRW5jb250cmFkbykge1xyXG4gICAgICAgICAgICB0aGlzLmVuZGVyZWNvLnBhaXNFbmRlcmVjb0NvZGlnbyA9IHBhaXNFbmNvbnRyYWRvLmNvZGlnbztcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIFNlIG8gbm9tZSBmb2kgZm9ybmVjaWRvIG1hcyBuw6NvIGVuY29udHJhZG8gbmEgbGlzdGEsIGFzc3VtZSBCcmFzaWxcclxuICAgICAgICAgICAgdGhpcy5lbmRlcmVjby5wYWlzRW5kZXJlY29Db2RpZ28gPSBDT0RJR09fQlJBU0lMO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBMw7NnaWNhIDM6IFNlIG5lbSBvIElEIG5lbSBvIG5vbWUgZXhpc3RlbSwgYXNzdW1lIEJyYXNpbCBwb3IgcGFkcsOjb1xyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5lbmRlcmVjby5wYWlzRW5kZXJlY29Db2RpZ28gPSBDT0RJR09fQlJBU0lMO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnI6IFVuYlBlc3NvYUVycm9QYWRyYW8pID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzYWx2YXIoZm9ybTogTmdGb3JtKSB7XHJcbiAgICBpZiAoZm9ybS5pbnZhbGlkKSB7XHJcbiAgICAgIHRoaXMub3BlblNuYWNrQmFyKCdFeGlzdGVtIGVycm9zIG5vIGZvcm11bMOhcmlvLCBwb3IgZmF2b3IsIHZlcmlmaWNhci4nKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFNlIGEgb3JkZW1FbmRlcmVjbyBuw6NvIGVzdGl2ZXIgZGVmaW5pZGEgKG5vdm8gaXRlbSkgb3UgZm9yIDBcclxuICAgIGlmICghdGhpcy5lbmRlcmVjby5vcmRlbUVuZGVyZWNvIHx8IHRoaXMuZW5kZXJlY28ub3JkZW1FbmRlcmVjbyA9PT0gMCkge1xyXG4gICAgICBsZXQgbWF4T3JkZW0gPSAwO1xyXG4gICAgICBpZiAodGhpcy5lbmRlcmVjb3NMaXN0ICYmIHRoaXMuZW5kZXJlY29zTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgbWF4T3JkZW0gPSBNYXRoLm1heCguLi50aGlzLmVuZGVyZWNvc0xpc3QubWFwKGUgPT4gZS5vcmRlbUVuZGVyZWNvIHx8IDApKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmVuZGVyZWNvLm9yZGVtRW5kZXJlY28gPSBtYXhPcmRlbSArIDE7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMudmFsaWRhcih0aGlzLmVuZGVyZWNvKSA9PSBmYWxzZSkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuZW5kZXJlY29TYWx2byA9IHRoaXMuZW5kZXJlY287XHJcbiAgICB0aGlzLnNhbHZhcmNsb3NlKClcclxuICB9XHJcblxyXG4gIGNvbXBhcmFyVGlwb3ModDE6IGFueSwgdDI6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHQxICYmIHQyICYmIHQxLmNvZGlnbyA9PT0gdDIuY29kaWdvO1xyXG4gIH1cclxuXHJcbiAgb25UaXBvU2VsZWNpb25hZG8oY29kaWdvU2VsZWNpb25hZG86IG51bWJlcikge1xyXG4gICAgY29uc3QgdGlwb1NlbGVjaW9uYWRvID0gdGhpcy5saXN0YVRpcG9FbmRlcmVjby5maW5kKHQgPT4gdC5jb2RpZ28gPT09IGNvZGlnb1NlbGVjaW9uYWRvKTtcclxuICAgIGlmICh0aXBvU2VsZWNpb25hZG8pIHtcclxuICAgICAgdGhpcy5lbmRlcmVjby50aXBvID0gdGlwb1NlbGVjaW9uYWRvLmRlbm9taW5hY2FvO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcGVzcXVpc2FyQ2VwKCkge1xyXG4gICAgaWYgKHRoaXMuZW5kZXJlY28uY2VwICYmIHRoaXMuZW5kZXJlY28uY2VwLnRyaW0oKSAhPT0gJycpIHtcclxuICAgICAgbGV0IGNlcEZvcm1hdGFkbyA9IHRoaXMuZW5kZXJlY28uY2VwLnJlcGxhY2UoL1xcRC9nLCAnJyk7IC8vIFJlbW92ZSBjYXJhY3RlcmVzIG7Do28gbnVtw6lyaWNvc1xyXG4gICAgICB0aGlzLnNlcnZpY2UucGVzcXVpc2FyQ2VwKGNlcEZvcm1hdGFkbykuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAoZGF0YTogVW5iUGVzc29hRW5kZXJlY28pID0+IHtcclxuICAgICAgICAgIHRoaXMuZW5kZXJlY28ubG9ncmFkb3VybyA9IGRhdGEubG9ncmFkb3VybztcclxuICAgICAgICAgIHRoaXMuZW5kZXJlY28uYmFpcnJvID0gZGF0YS5iYWlycm87XHJcbiAgICAgICAgICB0aGlzLmVuZGVyZWNvLnVmRW5kZXJlY28gPSBkYXRhLnVmO1xyXG4gICAgICAgICAgdGhpcy5lbmRlcmVjby51ZiA9IGRhdGEudWY7XHJcbiAgICAgICAgICB0aGlzLmVuZGVyZWNvLmNvbXBsZW1lbnRvID0gZGF0YS5jb21wbGVtZW50bztcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyOiBVbmJQZXNzb2FFcnJvUGFkcmFvKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmhhbmRsZUVycm9yKGVycik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlRXJyb3IoJ1BvciBmYXZvciwgaW5zaXJhIHVtIENFUCB2w6FsaWRvLicpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0TGlzdGFFc3RhZG9zKCk6IGFueSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICAnQUMnLCAnQUwnLCAnQVAnLCAnQU0nLCAnQkEnLCAnQ0UnLCAnREYnLCAnRVMnLCAnR08nLCAnTUEnLFxyXG4gICAgICAnTVQnLCAnTVMnLCAnTUcnLCAnUEEnLCAnUEInLCAnUFInLCAnUEUnLCAnUEknLCAnUkonLCAnUk4nLFxyXG4gICAgICAnUlMnLCAnUk8nLCAnUlInLCAnU0MnLCAnU1AnLCAnU0UnLCAnVE8nXHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVmFsaWRhIG8gb2JqZXRvIGRlIGVuZGVyZcOnbywgcmVwbGljYW5kbyBhcyByZWdyYXMgZG8gdmFsaWRhZG9yIGRvIGJhY2tlbmQuXHJcbiAgICogUmV0b3JuYSB0cnVlIHNlIG8gZW5kZXJlw6dvIGZvciB2w6FsaWRvLCBmYWxzZSBjYXNvIGNvbnRyw6FyaW8uXHJcbiAgICovXHJcbiAgdmFsaWRhcihlbmRlcmVjb1RvVmFsaWRhdGU6IFVuYlBlc3NvYUVuZGVyZWNvKTogYm9vbGVhbiB7XHJcblxyXG4gICAgLy8gMS4gVmFsaWRhw6fDo28gZGUgdGlwb0VuZGVyZWNvQ29kaWdvIChPYnJpZ2F0w7NyaW8gZSAwLTQpXHJcbiAgICAvLyBbSmF2YTogcmVxdWVzdC5nZXRUaXBvRW5kZXJlY29Db2RpZ28oKSA9PSBudWxsXVxyXG4gICAgaWYgKGVuZGVyZWNvVG9WYWxpZGF0ZS50aXBvRW5kZXJlY29Db2RpZ28gPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLmhhbmRsZUVycm9yKFwiVGlwbyBkZSBFbmRlcmXDp28gw6kgdW0gY2FtcG8gb2JyaWdhdMOzcmlvLlwiKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy8gW0phdmE6IHJlcXVlc3QuZ2V0VGlwb0VuZGVyZWNvQ29kaWdvKCkgPCAoYnl0ZSkgMCB8fCByZXF1ZXN0LmdldFRpcG9FbmRlcmVjb0NvZGlnbygpID4gKGJ5dGUpIDRdXHJcbiAgICBpZiAoZW5kZXJlY29Ub1ZhbGlkYXRlLnRpcG9FbmRlcmVjb0NvZGlnbyA8IDAgfHwgZW5kZXJlY29Ub1ZhbGlkYXRlLnRpcG9FbmRlcmVjb0NvZGlnbyA+IDQpIHtcclxuICAgICAgdGhpcy5oYW5kbGVFcnJvcihcIlRpcG8gZGUgRW5kZXJlw6dvIMOpIGludsOhbGlkbyAoZGV2ZSBzZXIgZW50cmUgMCBlIDQpLlwiKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIDMuIFZhbGlkYcOnw6NvIGRlIENFUCAoOCBkw61naXRvcywgc2UgcHJlZW5jaGlkbylcclxuICAgIC8vIFtKYXZhOiByZXF1ZXN0LmdldENlcCgpLnRyaW0oKS5sZW5ndGgoKSAhPSA4XVxyXG4gICAgaWYgKGVuZGVyZWNvVG9WYWxpZGF0ZS5jZXAgJiYgZW5kZXJlY29Ub1ZhbGlkYXRlLmNlcC50cmltKCkgIT09ICcnKSB7XHJcbiAgICAgIGNvbnN0IGNlcExpbXBvID0gZW5kZXJlY29Ub1ZhbGlkYXRlLmNlcC5yZXBsYWNlKC9cXEQvZywgJycpOyAvLyBSZW1vdmUgbsOjby1kw61naXRvc1xyXG4gICAgICBpZiAoY2VwTGltcG8ubGVuZ3RoICE9PSA4KSB7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihcIkNFUCBkZXZlIGNvbnRlciA4IGTDrWdpdG9zLlwiKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyA0LiBWYWxpZGHDp8OjbyBkZSBMb2dyYWRvdXJvIChNYXggMTAwLCBzZSBwcmVlbmNoaWRvKVxyXG4gICAgLy8gW0phdmE6IHJlcXVlc3QuZ2V0TG9ncmFkb3VybygpLnRyaW0oKS5sZW5ndGgoKSA+IDEwMF1cclxuICAgIGlmIChlbmRlcmVjb1RvVmFsaWRhdGUubG9ncmFkb3VybyAmJiBlbmRlcmVjb1RvVmFsaWRhdGUubG9ncmFkb3Vyby50cmltKCkubGVuZ3RoID4gMTAwKSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlRXJyb3IoXCJMb2dyYWRvdXJvIGRldmUgdGVyIG5vIG3DoXhpbW8gMTAwIGNhcmFjdGVyZXMuXCIpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gNS4gVmFsaWRhw6fDo28gZGUgQmFpcnJvIChNYXggMTAwLCBzZSBwcmVlbmNoaWRvKVxyXG4gICAgLy8gW0phdmE6IHJlcXVlc3QuZ2V0QmFpcnJvKCkudHJpbSgpLmxlbmd0aCgpID4gMTAwXVxyXG4gICAgaWYgKGVuZGVyZWNvVG9WYWxpZGF0ZS5iYWlycm8gJiYgZW5kZXJlY29Ub1ZhbGlkYXRlLmJhaXJyby50cmltKCkubGVuZ3RoID4gMTAwKSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlRXJyb3IoXCJCYWlycm8gZGV2ZSB0ZXIgbm8gbcOheGltbyAxMDAgY2FyYWN0ZXJlcy5cIik7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyA2LiBWYWxpZGHDp8OjbyBkZSBDb21wbGVtZW50byAoTWF4IDEwMCwgc2UgcHJlZW5jaGlkbylcclxuICAgIC8vIFtKYXZhOiByZXF1ZXN0LmdldENvbXBsZW1lbnRvKCkudHJpbSgpLmxlbmd0aCgpID4gMTAwXVxyXG4gICAgaWYgKGVuZGVyZWNvVG9WYWxpZGF0ZS5jb21wbGVtZW50byAmJiBlbmRlcmVjb1RvVmFsaWRhdGUuY29tcGxlbWVudG8udHJpbSgpLmxlbmd0aCA+IDEwMCkge1xyXG4gICAgICB0aGlzLmhhbmRsZUVycm9yKFwiQ29tcGxlbWVudG8gZGV2ZSB0ZXIgbm8gbcOheGltbyAxMDAgY2FyYWN0ZXJlcy5cIik7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyA3LiBWYWxpZGHDp8OjbyBkZSBDYWl4YSBQb3N0YWwgKE1heCAxMDAsIHNlIHByZWVuY2hpZGEpXHJcbiAgICAvLyBbSmF2YTogcmVxdWVzdC5nZXRDYWl4YVBvc3RhbCgpLnRyaW0oKS5sZW5ndGgoKSA+IDEwMF1cclxuICAgIGlmIChlbmRlcmVjb1RvVmFsaWRhdGUuY2FpeGFQb3N0YWwgJiYgZW5kZXJlY29Ub1ZhbGlkYXRlLmNhaXhhUG9zdGFsLnRyaW0oKS5sZW5ndGggPiAxMDApIHtcclxuICAgICAgdGhpcy5oYW5kbGVFcnJvcihcIkNhaXhhIFBvc3RhbCBkZXZlIHRlciBubyBtw6F4aW1vIDEwMCBjYXJhY3RlcmVzLlwiKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIDguIFZhbGlkYcOnw6NvIGRlIFVGICgyIGNhcmFjdGVyZXMsIHNlIHByZWVuY2hpZGEpXHJcbiAgICAvLyBPIGZvcm0gdXNhICd1ZkVuZGVyZWNvJywgbyBqYXZhIHVzYSAndWYnLiBPIG5nT25Jbml0IG1hcGVpYSB1ZiAtPiB1ZkVuZGVyZWNvLlxyXG4gICAgLy8gW0phdmE6IHJlcXVlc3QuZ2V0VWYoKS50cmltKCkubGVuZ3RoKCkgIT0gMl1cclxuICAgIGlmIChlbmRlcmVjb1RvVmFsaWRhdGUudWZFbmRlcmVjbyAmJiBlbmRlcmVjb1RvVmFsaWRhdGUudWZFbmRlcmVjby50cmltKCkubGVuZ3RoICE9PSAyKSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlRXJyb3IoXCJVRiBkZXZlIHRlciAyIGNhcmFjdGVyZXMuXCIpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gLS0tIFZhbGlkYcOnw6NvIGRlIER1cGxpY2FyIC0tLVxyXG4gICAgY29uc3QgaXNEdXBsaWNhdGUgPSB0aGlzLmVuZGVyZWNvc0xpc3Quc29tZShleGlzdGluZ0VuZGVyZWNvID0+XHJcbiAgICAgIGV4aXN0aW5nRW5kZXJlY28ubG9ncmFkb3Vybz8udG9Mb3dlckNhc2UoKSA9PT0gZW5kZXJlY29Ub1ZhbGlkYXRlLmxvZ3JhZG91cm8/LnRvTG93ZXJDYXNlKCkgJiZcclxuICAgICAgZXhpc3RpbmdFbmRlcmVjby5jb2RpZ28gIT09IGVuZGVyZWNvVG9WYWxpZGF0ZS5jb2RpZ28gLy8gSWdub3JhIG8gcHLDs3ByaW8gZW5kZXJlw6dvIHNlIGVzdGl2ZXIgc2VuZG8gZWRpdGFkb1xyXG4gICAgKTtcclxuXHJcbiAgICBpZiAoaXNEdXBsaWNhdGUpIHtcclxuICAgICAgdGhpcy5vcGVuU25hY2tCYXIoXCJFc3RlIGVuZGVyZcOnbyBqw6EgZXhpc3RlIG5hIGxpc3RhLlwiKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlOyAvLyBQYXNzb3UgZW0gdG9kYXMgYXMgdmFsaWRhw6fDtWVzXHJcbiAgfVxyXG5cclxuICBjbG9zZSgpIHtcclxuICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKG51bGwpO1xyXG4gIH1cclxuXHJcbiAgc2FsdmFyY2xvc2UoKSB7XHJcbiAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSh0aGlzLmVuZGVyZWNvU2Fsdm8pO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlRXJyb3IoZXJybzogVW5iUGVzc29hRXJyb1BhZHJhbyB8IHN0cmluZykge1xyXG4gICAgbGV0IGVycm9UcmF0YWRvOiBVbmJQZXNzb2FFcnJvUGFkcmFvO1xyXG5cclxuICAgIC8vIENvbnZlcnRlIHN0cmluZyBsb2NhbCBlbSBPYmpldG8gUGFkcsOjb1xyXG4gICAgaWYgKHR5cGVvZiBlcnJvID09PSAnc3RyaW5nJykge1xyXG4gICAgICBlcnJvVHJhdGFkbyA9IHtcclxuICAgICAgICBzdGF0dXM6IDQwMCxcclxuICAgICAgICBtZW5zYWdlbVNpbXBsZXM6IGVycm8sXHJcbiAgICAgICAgbWVuc2FnZW1IdG1sOiBgPHN0cm9uZz4ke2Vycm99PC9zdHJvbmc+YFxyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZXJyb1RyYXRhZG8gPSBlcnJvO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIDEuIFNuYWNrQmFyXHJcbiAgICBpZiAoZXJyb1RyYXRhZG8ubWVuc2FnZW1TaW1wbGVzKSB7XHJcbiAgICAgIHRoaXMub3BlblNuYWNrQmFyKGVycm9UcmF0YWRvLm1lbnNhZ2VtU2ltcGxlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gMi4gQWxlcnRTZXJ2aWNlIChTZSBob3V2ZXIgdGFnIDx1bmItbWVuc2FnZW0+IG5vIEhUTUwgZG8gZGlhbG9nKVxyXG4gICAgaWYgKHRoaXMuYWxlcnRTZXJ2aWNlICYmIGVycm9UcmF0YWRvLm1lbnNhZ2VtSHRtbCkge1xyXG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5zaG93TWVzc2FnZShlcnJvVHJhdGFkby5tZW5zYWdlbUh0bWwsIFVuYlRpcG9NZW5zYWdlbUVudW0uREFOR0VSLCB0aGlzLmlkTWVuc2FnZW1TZXJ2aWNlKTtcclxuICAgIH1cclxuICB9XHJcbiAgXHJcbiAgb3BlblNuYWNrQmFyKG1lc3NhZ2U6IHN0cmluZykge1xyXG4gICAgdGhpcy5zbmFja0Jhci5vcGVuKG1lc3NhZ2UsICd4Jywge1xyXG4gICAgICBkdXJhdGlvbjogNTAwMCxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbn0iLCI8aDEgbWF0LWRpYWxvZy10aXRsZT5DYWRhc3RybyBkZSBFLW1haWw8L2gxPlxyXG48Zm9ybSAobmdTdWJtaXQpPVwic2FsdmFyKGZvcm0pXCIgI2Zvcm09XCJuZ0Zvcm1cIj5cclxuICA8bWF0LWRpYWxvZy1jb250ZW50PlxyXG4gICAgPHVuYi1tZW5zYWdlbSBbaWRlbnRpZmljYWRvcl09XCJpZE1lbnNhZ2VtU2VydmljZVwiPjwvdW5iLW1lbnNhZ2VtPlxyXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tY29udGFpbmVyXCI+XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZvcm0tMTAwXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICA8bWF0LWxhYmVsPlRpcG88L21hdC1sYWJlbD5cclxuICAgICAgICA8bWF0LXNlbGVjdCBbKG5nTW9kZWwpXT1cImVuZGVyZWNvLnRpcG9FbmRlcmVjb0NvZGlnb1wiIG5hbWU9XCJ0aXBvXCIgI3RpcG89XCJuZ01vZGVsXCJcclxuICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25UaXBvU2VsZWNpb25hZG8oJGV2ZW50LnZhbHVlKVwiIHJlcXVpcmVkPlxyXG4gICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHRpcG8gb2YgbGlzdGFUaXBvRW5kZXJlY29cIiBbdmFsdWVdPVwidGlwby5jb2RpZ29cIj5cclxuICAgICAgICAgICAge3t0aXBvLmRlbm9taW5hY2FvfX1cclxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmb3JtLTEwXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICA8bWF0LWxhYmVsPlBhw61zPC9tYXQtbGFiZWw+XHJcblxyXG4gICAgICAgIDxtYXQtc2VsZWN0IFsobmdNb2RlbCldPVwiZW5kZXJlY28ucGFpc0VuZGVyZWNvQ29kaWdvXCIgbmFtZT1cInBhaXNFbmRlcmVjb0NvZGlnb1wiICNwYWlzRW5kZXJlY29Db2RpZ289XCJuZ01vZGVsXCI+XHJcblxyXG4gICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHBhaXNlcyBvZiBsaXN0YVBhaXNlc1wiIFt2YWx1ZV09XCJwYWlzZXMuY29kaWdvXCI+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicGFpc2VzLmRlbm9taW5hY2FvID09PSAnQlJBU0lMJ1wiPvCfh6fwn4e3IDxiPnt7IHBhaXNlcy5kZW5vbWluYWNhbyB9fTwvYj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicGFpc2VzLmRlbm9taW5hY2FvICE9PSAnQlJBU0lMJ1wiPnt7IHBhaXNlcy5kZW5vbWluYWNhbyB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmb3JtLTEwMFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgPG1hdC1sYWJlbD5DRVA8L21hdC1sYWJlbD5cclxuICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBbKG5nTW9kZWwpXT1cImVuZGVyZWNvLmNlcFwiIG5hbWU9XCJjZXBcIiAjY2VwPVwibmdNb2RlbFwiIC8+XHJcbiAgICAgICAgPGJ1dHRvbiBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIiBhcmlhLWxhYmVsPVwiUGVzcXVpc2FyXCIgKGNsaWNrKT1cInBlc3F1aXNhckNlcCgpXCI+XHJcbiAgICAgICAgICA8bWF0LWljb24gc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDJweDtcIj5zZWFyY2g8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZm9ybS0yNVwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgPG1hdC1sYWJlbD5FbmRlcmXDp288L21hdC1sYWJlbD5cclxuICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBbKG5nTW9kZWwpXT1cImVuZGVyZWNvLmxvZ3JhZG91cm9cIiBuYW1lPVwibG9ncmFkb3Vyb1wiICNsb2dyYWRvdXJvPVwibmdNb2RlbFwiIC8+XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmb3JtLTEwMFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgPG1hdC1sYWJlbD5CYWlycm88L21hdC1sYWJlbD5cclxuICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBbKG5nTW9kZWwpXT1cImVuZGVyZWNvLmJhaXJyb1wiIG5hbWU9XCJiYWlycm9cIiAjYmFpcnJvPVwibmdNb2RlbFwiIC8+XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmb3JtLTEwMFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgPG1hdC1sYWJlbD5Db21wbGVtZW50bzwvbWF0LWxhYmVsPlxyXG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1hdElucHV0IFsobmdNb2RlbCldPVwiZW5kZXJlY28uY29tcGxlbWVudG9cIiBuYW1lPVwiY29tcGxlbWVudG9cIiAjY29tcGxlbWVudG89XCJuZ01vZGVsXCIgLz5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZvcm0tMTAwXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICA8bWF0LWxhYmVsPlVGPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgPG1hdC1zZWxlY3QgWyhuZ01vZGVsKV09XCJlbmRlcmVjby51ZlwiIG5hbWU9XCJ1ZlwiICN1Zj1cIm5nTW9kZWxcIj5cclxuICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCB1ZiBvZiBnZXRMaXN0YUVzdGFkb3MoKVwiIFt2YWx1ZV09XCJ1ZlwiPlxyXG4gICAgICAgICAgICB7eyB1ZiB9fVxyXG4gICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDwvZGl2PlxyXG4gIDwvbWF0LWRpYWxvZy1jb250ZW50PlxyXG5cclxuICA8bWF0LWRpYWxvZy1hY3Rpb25zIGFsaWduPVwiZW5kXCI+XHJcbiAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY29sb3I9XCJ3YXJuXCIgKGNsaWNrKT1cImNsb3NlKClcIj5GZWNoYXI8L2J1dHRvbj5cclxuICAgIDxidXR0b24gbWF0LWZsYXQtYnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjb2xvcj1cInByaW1hcnlcIj5TYWx2YXI8L2J1dHRvbj5cclxuICA8L21hdC1kaWFsb2ctYWN0aW9ucz5cclxuPC9mb3JtPiJdfQ==