@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
@@ -7,54 +7,145 @@ import * as i1 from "@angular/common/http";
7
7
  export class UnBPessoaService {
8
8
  constructor(http) {
9
9
  this.http = http;
10
- this.apiConfigSubject = new BehaviorSubject({ url: '', token: '' });
11
- this.apiConfig$ = this.apiConfigSubject.asObservable();
10
+ // Armazena apenas a string da URL. Inicializa vazio.
11
+ this.backendUrlSubject = new BehaviorSubject('');
12
+ // Exposta como Observable (caso algum componente queira se inscrever)
13
+ this.backendUrl$ = this.backendUrlSubject.asObservable();
14
+ // -------------------------------------------------------------------
15
+ // HANDLE ERROR PADRONIZADO
16
+ // -------------------------------------------------------------------
17
+ this.handleError = (error) => {
18
+ let mensagemSimples = 'Ocorreu um erro ao processar a requisição!';
19
+ let mensagemHtml = '<strong>Ocorreu um erro desconhecido.</strong>';
20
+ // 2. Descobre quem é o corpo do erro
21
+ let errorBody;
22
+ if (error.detalhes || error.codigoStatus) {
23
+ // CASO 1: O Interceptor já desembrulhou o erro (é o JSON puro)
24
+ errorBody = error;
25
+ }
26
+ else {
27
+ // CASO 2: É um HttpErrorResponse padrão (tem a propriedade .error)
28
+ errorBody = error.error || error;
29
+ }
30
+ // 3. Lógica de Limpeza e Parse (se for string suja)
31
+ if (typeof errorBody === 'string') {
32
+ try {
33
+ errorBody = JSON.parse(errorBody);
34
+ }
35
+ catch (e) {
36
+ const start = errorBody.indexOf('{');
37
+ const end = errorBody.lastIndexOf('}');
38
+ if (start > -1 && end > start) {
39
+ try {
40
+ errorBody = JSON.parse(errorBody.substring(start, end + 1));
41
+ }
42
+ catch (e2) {
43
+ // Se falhar o parse, usa o texto como mensagem
44
+ mensagemSimples = errorBody.substring(0, 200);
45
+ mensagemHtml = `<strong>${errorBody}</strong>`;
46
+ }
47
+ }
48
+ }
49
+ }
50
+ // 4. Formatação baseada no JSON identificado
51
+ if (errorBody && typeof errorBody === 'object') {
52
+ // A: Erros de Validação
53
+ if (errorBody.detalhes && Array.isArray(errorBody.detalhes) && errorBody.detalhes.length > 0) {
54
+ mensagemSimples = "O formulário possui erros de validação.";
55
+ const listaErros = errorBody.detalhes.map((d) => `<li><strong>${d.nomeCampo || 'Campo'}:</strong> ${d.critica || d.mensagem}</li>`).join('');
56
+ mensagemHtml = `<strong>Erros de Validação:</strong> <ul>${listaErros}</ul>`;
57
+ }
58
+ // B: Erro Genérico com mensagem
59
+ else {
60
+ const msgBackend = errorBody.mensagem || errorBody.message || errorBody.detail;
61
+ if (msgBackend) {
62
+ mensagemSimples = msgBackend;
63
+ mensagemHtml = `<strong>${msgBackend}</strong>`;
64
+ }
65
+ }
66
+ }
67
+ // 5. Tratamentos de Status HTTP (Se o wrapper original tiver status)
68
+ // Nota: Se o interceptor desembrulhou, 'error.status' pode não existir,
69
+ // mas 'errorBody.codigoStatus' (do Java) pode existir.
70
+ const status = error.status || errorBody?.codigoStatus || 0;
71
+ if (status === 401) {
72
+ mensagemSimples = "Sessão expirada.";
73
+ mensagemHtml = "<strong>Sessão expirada. Faça login novamente.</strong>";
74
+ }
75
+ else if (status === 403) {
76
+ mensagemSimples = "Acesso Negado.";
77
+ mensagemHtml = "<strong>Você não tem permissão para realizar esta ação.</strong>";
78
+ }
79
+ const erroFormatado = {
80
+ status: status,
81
+ mensagemSimples,
82
+ mensagemHtml
83
+ };
84
+ console.warn('[UnBPessoaService] Erro formatado final:', erroFormatado);
85
+ return throwError(() => erroFormatado);
86
+ };
12
87
  }
13
- // Atualiza a configuração global
14
- setApiConfig(config) {
15
- this.apiConfigSubject.next(config);
88
+ // Setter agora recebe string direta
89
+ setBackendUrl(url) {
90
+ // Tratamento remove barra no final para padronizar
91
+ if (url.endsWith('/')) {
92
+ url = url.slice(0, -1);
93
+ }
94
+ this.backendUrlSubject.next(url);
16
95
  }
17
- // Retorna a configuração atual
18
- getApiConfig() {
19
- return this.apiConfigSubject.getValue();
96
+ // Getter retorna string direta
97
+ getBackendUrl() {
98
+ return this.backendUrlSubject.getValue();
20
99
  }
21
100
  // Headers padrão
22
101
  getHeaders() {
23
- const { token } = this.getApiConfig();
24
102
  return {
25
103
  headers: new HttpHeaders({
26
- 'Content-Type': 'application/json',
27
- Authorization: `Bearer ${token}`
104
+ 'Content-Type': 'application/json'
28
105
  })
29
106
  };
30
107
  }
31
108
  // Métodos de busca
32
109
  findByCpf(cpf) {
33
- const url = `${this.getApiConfig().url}/pessoa-api/pessoas/fisicas?cpf=${cpf}`;
110
+ const url = `${this.getBackendUrl()}/pessoa-api/pessoas/fisicas?cpf=${cpf}`;
34
111
  return this.http.get(url, this.getHeaders()).pipe(catchError(this.handleError));
35
112
  }
36
113
  findByCnpj(cnpj) {
37
- const url = `${this.getApiConfig().url}/pessoa-api/pessoas/juridicas?cnpj=${cnpj}`;
114
+ const url = `${this.getBackendUrl()}/pessoa-api/pessoas/juridicas?cnpj=${cnpj}`;
38
115
  return this.http.get(url, this.getHeaders()).pipe(catchError(this.handleError));
39
116
  }
40
117
  findByPassaporte(passaporte) {
41
- const url = `${this.getApiConfig().url}/pessoa-api/pessoas/fisicas?passaporte=${passaporte}`;
118
+ const url = `${this.getBackendUrl()}/pessoa-api/pessoas/fisicas?passaporte=${passaporte}`;
42
119
  return this.http.get(url, this.getHeaders()).pipe(catchError(this.handleError));
43
120
  }
44
121
  findPessoaFisicaById(id) {
45
- const url = `${this.getApiConfig().url}/pessoa-api/pessoas/fisicas/${id}`;
122
+ const url = `${this.getBackendUrl()}/pessoa-api/pessoas/fisicas/${id}`;
46
123
  return this.http.get(url, this.getHeaders()).pipe(catchError(this.handleError));
47
124
  }
48
125
  pesquisarCep(cep) {
49
- const url = `${this.getApiConfig().url}/pessoa-api/public/busca-cep/servico-1/${cep}`;
126
+ const url = `${this.getBackendUrl()}/pessoa-api/public/busca-cep/servico-1/${cep}`;
50
127
  return this.http.get(url, this.getHeaders()).pipe(catchError(this.handleError));
51
128
  }
52
129
  // Salvar (decide fisica ou juridica)
53
130
  salvar(payload, tipoPessoa) {
54
- if (!payload)
55
- return throwError(() => new Error('Erro Local: Payload não pode ser null'));
56
- if (!tipoPessoa)
57
- return throwError(() => new Error('Erro Local: Tipo pessoa não pode ser null'));
131
+ // (Para o componente conseguir ler .mensagemSimples e .mensagemHtml)
132
+ if (!payload) {
133
+ return throwError(() => ({
134
+ status: 400,
135
+ mensagemSimples: 'Erro interno: Dados para salvamento inválidos (Payload null).',
136
+ mensagemHtml: '<strong>Erro interno:</strong> Tentativa de salvar dados vazios.'
137
+ }));
138
+ }
139
+ if (!tipoPessoa) {
140
+ return throwError(() => ({
141
+ status: 400,
142
+ mensagemSimples: 'Erro interno: Tipo de pessoa não definido.',
143
+ mensagemHtml: '<strong>Erro interno:</strong> O tipo de pessoa é obrigatório para salvar.'
144
+ }));
145
+ }
146
+ // 2. Delegação
147
+ // Como savePessoaFisica e savePessoaJuridica JÁ TÊM o .pipe(catchError),
148
+ // aqui nós apenas retornamos o Observable deles. O erro subirá tratado.
58
149
  if (tipoPessoa == TipoPessoaEnum.FISICA || tipoPessoa == TipoPessoaEnum.ESTRANGEIRA) {
59
150
  return this.savePessoaFisica(payload);
60
151
  }
@@ -65,41 +156,51 @@ export class UnBPessoaService {
65
156
  }
66
157
  // Salvar Pessoa Física
67
158
  savePessoaFisica(pessoa) {
68
- const url = this.getApiConfig().url;
159
+ const url = this.getBackendUrl();
69
160
  const httpOptions = this.getHeaders();
70
161
  const body = JSON.stringify(pessoa);
162
+ // Variável para armazenar o Observable antes de retornar
163
+ let request$;
71
164
  if (pessoa.codigoPessoa == null) {
72
- return this.http.post(`${url}/pessoa-api/pessoas/fisicas`, body, httpOptions);
165
+ request$ = this.http.post(`${url}/pessoa-api/pessoas/fisicas`, body, httpOptions);
73
166
  }
74
167
  else {
75
- return this.http.put(`${url}/pessoa-api/pessoas/fisicas/${pessoa.codigoPessoa}`, body, httpOptions);
168
+ request$ = this.http.put(`${url}/pessoa-api/pessoas/fisicas/${pessoa.codigoPessoa}`, body, httpOptions);
76
169
  }
170
+ // Antes de retornar, passamos pelo 'pipe' para tratar o erro se ele ocorrer.
171
+ return request$.pipe(catchError(this.handleError));
77
172
  }
78
173
  // Salvar Pessoa Jurídica
79
174
  savePessoaJuridica(pessoa) {
80
- const url = this.getApiConfig().url;
175
+ const url = this.getBackendUrl();
81
176
  const httpOptions = this.getHeaders();
82
177
  const body = JSON.stringify(pessoa);
178
+ let request$;
83
179
  if (pessoa.codigoPessoa == null) {
84
- return this.http.post(`${url}/pessoa-api/pessoas/juridicas`, body, httpOptions);
180
+ request$ = this.http.post(`${url}/pessoa-api/pessoas/juridicas`, body, httpOptions);
85
181
  }
86
182
  else {
87
- return this.http.put(`${url}/pessoa-api/pessoas/juridicas/${pessoa.codigoPessoa}`, body, httpOptions);
183
+ request$ = this.http.put(`${url}/pessoa-api/pessoas/juridicas/${pessoa.codigoPessoa}`, body, httpOptions);
88
184
  }
185
+ return request$.pipe(catchError(this.handleError));
89
186
  }
90
187
  // Dados auxiliares públicos
91
188
  getEscolaridade() {
92
- return this.http.get(`${this.getApiConfig().url}/pessoa-api/public/escolaridades/listagem`);
189
+ return this.http.get(`${this.getBackendUrl()}/pessoa-api/public/escolaridades/listagem`).pipe(catchError(this.handleError) // <--- Adicione aqui
190
+ );
93
191
  }
94
192
  getEstadoCivil() {
95
- return this.http.get(`${this.getApiConfig().url}/pessoa-api/public/estados-civis/listagem`);
193
+ return this.http.get(`${this.getBackendUrl()}/pessoa-api/public/estados-civis/listagem`).pipe(catchError(this.handleError) // <--- Adicione aqui
194
+ );
96
195
  }
97
196
  getMunicipios() {
98
- return this.http.get(`${this.getApiConfig().url}/pessoa-api/public/municipios/listagem`);
197
+ return this.http.get(`${this.getBackendUrl()}/pessoa-api/public/municipios/listagem`).pipe(catchError(this.handleError) // <--- Adicione aqui
198
+ );
99
199
  }
100
200
  getPaises() {
101
- return this.http.get(`${this.getApiConfig().url}/pessoa-api/public/paises/listagem?&page=0&size=200&sort=denominacao,asc`).pipe(map(response => {
201
+ return this.http.get(`${this.getBackendUrl()}/pessoa-api/public/paises/listagem?&page=0&size=200&sort=denominacao,asc`).pipe(map(response => {
102
202
  return response.content.sort((a, b) => {
203
+ // ... sua lógica de ordenação ...
103
204
  const nomeA = a?.denominacao?.toUpperCase() || '';
104
205
  const nomeB = b?.denominacao?.toUpperCase() || '';
105
206
  if (nomeA === 'BRASIL')
@@ -108,31 +209,31 @@ export class UnBPessoaService {
108
209
  return 1;
109
210
  return nomeA.localeCompare(nomeB);
110
211
  });
111
- }));
212
+ }), catchError(this.handleError));
112
213
  }
113
214
  getRacaCor() {
114
- return this.http.get(`${this.getApiConfig().url}/pessoa-api/public/etnias/listagem`).pipe(map(lista => lista.map((item, index) => ({
215
+ return this.http.get(`${this.getBackendUrl()}/pessoa-api/public/etnias/listagem`).pipe(map(lista => lista.map((item, index) => ({
115
216
  codigo: index, // gera um código numérico sequencial
116
217
  denominacao: this.formatarLabel(item) // formata se quiser
117
- }))));
218
+ }))), catchError(this.handleError));
118
219
  }
119
220
  getTipoEmail() {
120
- return this.http.get(`${this.getApiConfig().url}/pessoa-api/tipos-email/public/listagem`).pipe(map(lista => lista.map((item, index) => ({
221
+ return this.http.get(`${this.getBackendUrl()}/pessoa-api/tipos-email/public/listagem`).pipe(map(lista => lista.map((item, index) => ({
121
222
  codigo: index, // gera um código numérico sequencial
122
223
  denominacao: this.formatarLabel(item) // formata se quiser
123
- }))));
224
+ }))), catchError(this.handleError));
124
225
  }
125
226
  getTipoEndereco() {
126
- return this.http.get(`${this.getApiConfig().url}/pessoa-api/tipos-endereco/public/listagem`).pipe(map(lista => lista.map((item, index) => ({
227
+ return this.http.get(`${this.getBackendUrl()}/pessoa-api/tipos-endereco/public/listagem`).pipe(map(lista => lista.map((item, index) => ({
127
228
  codigo: index, // gera um código numérico sequencial
128
229
  denominacao: this.formatarLabel(item) // formata se quiser
129
- }))));
230
+ }))), catchError(this.handleError));
130
231
  }
131
232
  getTipoTelefone() {
132
- return this.http.get(`${this.getApiConfig().url}/pessoa-api/tipos-telefone/public/listagem`).pipe(map(lista => lista.map((item, index) => ({
233
+ return this.http.get(`${this.getBackendUrl()}/pessoa-api/tipos-telefone/public/listagem`).pipe(map(lista => lista.map((item, index) => ({
133
234
  codigo: index, // gera um código numérico sequencial
134
235
  denominacao: this.formatarLabel(item) // formata se quiser
135
- }))));
236
+ }))), catchError(this.handleError));
136
237
  }
137
238
  formatarLabel(text) {
138
239
  return text
@@ -140,11 +241,6 @@ export class UnBPessoaService {
140
241
  .replace(/_/g, ' ')
141
242
  .replace(/\b\w/g, l => l.toUpperCase());
142
243
  }
143
- // Handler de erro padrão
144
- handleError(error) {
145
- console.error('[UnBPessoaService] Erro na chamada HTTP:', error);
146
- return throwError(() => error);
147
- }
148
244
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnBPessoaService, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
149
245
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnBPessoaService, providedIn: 'root' }); }
150
246
  }
@@ -154,4 +250,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImpor
154
250
  providedIn: 'root'
155
251
  }]
156
252
  }], ctorParameters: () => [{ type: i1.HttpClient }] });
157
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5iLXBlc3NvYS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdW5iLWxpYi1jb21wb25lbnRzL3NyYy9saWIvdW5iLXBlc3NvYS91bmItcGVzc29hLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFjLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFLcEYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7QUFTeEQsTUFBTSxPQUFPLGdCQUFnQjtJQU0zQixZQUFvQixJQUFnQjtRQUFoQixTQUFJLEdBQUosSUFBSSxDQUFZO1FBSDVCLHFCQUFnQixHQUFHLElBQUksZUFBZSxDQUFpQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdkcsZUFBVSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUVWLENBQUM7SUFFekMsaUNBQWlDO0lBQ2pDLFlBQVksQ0FBQyxNQUFzQztRQUNqRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCwrQkFBK0I7SUFDL0IsWUFBWTtRQUNWLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFFRCxpQkFBaUI7SUFDVCxVQUFVO1FBQ2hCLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdEMsT0FBTztZQUNMLE9BQU8sRUFBRSxJQUFJLFdB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QUFNOzsyRkFFUCxnQkFBZ0I7a0JBSDVCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjYXRjaEVycm9yLCBtYXAsIE9ic2VydmFibGUsIG9mLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFVuYlBlc3NvYUVtYWlsVGlwbyB9IGZyb20gJy4vdW5iLXBlc3NvYS1tb2RlbHMvdW5iLXBlc3NvYS1lbWFpbC5tb2RlbCc7XHJcbmltcG9ydCB7IFVuYlBlc3NvYUVuZGVyZWNvLCBVbmJQZXNzb2FFbmRlcmVjb1RpcG8gfSBmcm9tICcuL3VuYi1wZXNzb2EtbW9kZWxzL3VuYi1wZXNzb2EtZW5kZXJlY28ubW9kZWwnO1xyXG5pbXBvcnQgeyBVbmJQZXNzb2FFc2NvbGFyaWRhZGUgfSBmcm9tICcuL3VuYi1wZXNzb2EtbW9kZWxzL3VuYi1wZXNzb2EtZXNjb2xhcmlkYWRlLm1vZGVsJztcclxuaW1wb3J0IHsgVW5iUGVzc29hTW9kZWwgfSBmcm9tICcuL3VuYi1wZXNzb2EtbW9kZWxzL3VuYi1wZXNzb2EubW9kZWwnO1xyXG5pbXBvcnQgeyBUaXBvUGVzc29hRW51bSB9IGZyb20gJy4vdW5iLXRpcG8tcGVzc29hLmVudW0nO1xyXG5pbXBvcnQgeyBVbmJQZXNzb2FQYWlzIH0gZnJvbSAnLi91bmItcGVzc29hLW1vZGVscy91bmItcGVzc29hLXBhaXMnO1xyXG5pbXBvcnQgeyBVbmJQZXNzb2FNdW5pbmNpcGlvIH0gZnJvbSAnLi91bmItcGVzc29hLW1vZGVscy91bmItcGVzc29hLW11bmljaXBpbyc7XHJcbmltcG9ydCB7IFVuYlBlc3NvYUVzdGFkb0NpdmlsIH0gZnJvbSAnLi91bmItcGVzc29hLW1vZGVscy91bmItcGVzc29hLWVzdGFkby1jaXZpbC5tb2RlbCc7XHJcbmltcG9ydCB7IFVuYlBlc3NvYVRlbGVmb25lVGlwbyB9IGZyb20gJy4vdW5iLXBlc3NvYS1tb2RlbHMvdW5iLXBlc3NvYS10ZWxlZm9uZS5tb2RlbCc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBVbkJQZXNzb2FTZXJ2aWNlIHtcclxuICBcclxuXHJcbiAgcHJpdmF0ZSBhcGlDb25maWdTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7IHVybDogc3RyaW5nOyB0b2tlbjogc3RyaW5nIH0+KHsgdXJsOiAnJywgdG9rZW46ICcnIH0pO1xyXG4gIGFwaUNvbmZpZyQgPSB0aGlzLmFwaUNvbmZpZ1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCkgeyB9XHJcblxyXG4gIC8vIEF0dWFsaXphIGEgY29uZmlndXJhw6fDo28gZ2xvYmFsXHJcbiAgc2V0QXBpQ29uZmlnKGNvbmZpZzogeyB1cmw6IHN0cmluZzsgdG9rZW46IHN0cmluZyB9KSB7XHJcbiAgICB0aGlzLmFwaUNvbmZpZ1N1YmplY3QubmV4dChjb25maWcpO1xyXG4gIH1cclxuXHJcbiAgLy8gUmV0b3JuYSBhIGNvbmZpZ3VyYcOnw6NvIGF0dWFsXHJcbiAgZ2V0QXBpQ29uZmlnKCk6IHsgdXJsOiBzdHJpbmc7IHRva2VuOiBzdHJpbmcgfSB7XHJcbiAgICByZXR1cm4gdGhpcy5hcGlDb25maWdTdWJqZWN0LmdldFZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICAvLyBIZWFkZXJzIHBhZHLDo29cclxuICBwcml2YXRlIGdldEhlYWRlcnMoKSB7XHJcbiAgICBjb25zdCB7IHRva2VuIH0gPSB0aGlzLmdldEFwaUNvbmZpZygpO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gXHJcbiAgICAgIH0pXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLy8gTcOpdG9kb3MgZGUgYnVzY2FcclxuICBmaW5kQnlDcGYoY3BmOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFVuYlBlc3NvYU1vZGVsPiB7XHJcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmdldEFwaUNvbmZpZygpLnVybH0vcGVzc29hLWFwaS9wZXNzb2FzL2Zpc2ljYXM/Y3BmPSR7Y3BmfWA7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxVbmJQZXNzb2FNb2RlbD4odXJsLCB0aGlzLmdldEhlYWRlcnMoKSkucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGZpbmRCeUNucGooY25wajogc3RyaW5nIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxVbmJQZXNzb2FNb2RlbD4ge1xyXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5nZXRBcGlDb25maWcoKS51cmx9L3Blc3NvYS1hcGkvcGVzc29hcy9qdXJpZGljYXM/Y25waj0ke2NucGp9YDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFVuYlBlc3NvYU1vZGVsPih1cmwsIHRoaXMuZ2V0SGVhZGVycygpKS5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZmluZEJ5UGFzc2Fwb3J0ZShwYXNzYXBvcnRlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFVuYlBlc3NvYU1vZGVsPiB7XHJcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmdldEFwaUNvbmZpZygpLnVybH0vcGVzc29hLWFwaS9wZXNzb2FzL2Zpc2ljYXM/cGFzc2Fwb3J0ZT0ke3Bhc3NhcG9ydGV9YDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFVuYlBlc3NvYU1vZGVsPih1cmwsIHRoaXMuZ2V0SGVhZGVycygpKS5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZmluZFBlc3NvYUZpc2ljYUJ5SWQoaWQ6IG51bWJlcik6IE9ic2VydmFibGU8VW5iUGVzc29hTW9kZWw+IHtcclxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZ2V0QXBpQ29uZmlnKCkudXJsfS9wZXNzb2EtYXBpL3Blc3NvYXMvZmlzaWNhcy8ke2lkfWA7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxVbmJQZXNzb2FNb2RlbD4odXJsLCB0aGlzLmdldEhlYWRlcnMoKSkucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHBlc3F1aXNhckNlcChjZXA6IHN0cmluZykge1xyXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5nZXRBcGlDb25maWcoKS51cmx9L3Blc3NvYS1hcGkvcHVibGljL2J1c2NhLWNlcC9zZXJ2aWNvLTEvJHtjZXB9YDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFVuYlBlc3NvYUVuZGVyZWNvPih1cmwsIHRoaXMuZ2V0SGVhZGVycygpKS5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8gU2FsdmFyIChkZWNpZGUgZmlzaWNhIG91IGp1cmlkaWNhKVxyXG4gIHNhbHZhcihwYXlsb2FkOiBhbnksIHRpcG9QZXNzb2E6IFRpcG9QZXNzb2FFbnVtKTogT2JzZXJ2YWJsZTxVbmJQZXNzb2FNb2RlbCB8IG51bGw+IHtcclxuICAgIGlmICghcGF5bG9hZCkgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKCdFcnJvIExvY2FsOiBQYXlsb2FkIG7Do28gcG9kZSBzZXIgbnVsbCcpKTtcclxuICAgIGlmICghdGlwb1Blc3NvYSkgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKCdFcnJvIExvY2FsOiBUaXBvIHBlc3NvYSBuw6NvIHBvZGUgc2VyIG51bGwnKSk7XHJcblxyXG4gICAgaWYgKHRpcG9QZXNzb2EgPT0gVGlwb1Blc3NvYUVudW0uRklTSUNBIHx8IHRpcG9QZXNzb2EgPT0gVGlwb1Blc3NvYUVudW0uRVNUUkFOR0VJUkEpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc2F2ZVBlc3NvYUZpc2ljYShwYXlsb2FkKTtcclxuICAgIH0gZWxzZSBpZiAodGlwb1Blc3NvYSA9PSBUaXBvUGVzc29hRW51bS5KVVJJRElDQSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5zYXZlUGVzc29hSnVyaWRpY2EocGF5bG9hZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG9mKG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLy8gU2FsdmFyIFBlc3NvYSBGw61zaWNhXHJcbiAgcHJpdmF0ZSBzYXZlUGVzc29hRmlzaWNhKHBlc3NvYTogVW5iUGVzc29hTW9kZWwpOiBPYnNlcnZhYmxlPFVuYlBlc3NvYU1vZGVsPiB7XHJcbiAgICBjb25zdCB1cmwgPSB0aGlzLmdldEFwaUNvbmZpZygpLnVybDtcclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0gdGhpcy5nZXRIZWFkZXJzKCk7XHJcbiAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkocGVzc29hKTtcclxuXHJcbiAgICBpZiAocGVzc29hLmNvZGlnb1Blc3NvYSA9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxVbmJQZXNzb2FNb2RlbD4oYCR7dXJsfS9wZXNzb2EtYXBpL3Blc3NvYXMvZmlzaWNhc2AsIGJvZHksIGh0dHBPcHRpb25zKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0PFVuYlBlc3NvYU1vZGVsPihgJHt1cmx9L3Blc3NvYS1hcGkvcGVzc29hcy9maXNpY2FzLyR7cGVzc29hLmNvZGlnb1Blc3NvYX1gLCBib2R5LCBodHRwT3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBTYWx2YXIgUGVzc29hIEp1csOtZGljYVxyXG4gIHByaXZhdGUgc2F2ZVBlc3NvYUp1cmlkaWNhKHBlc3NvYTogVW5iUGVzc29hTW9kZWwpOiBPYnNlcnZhYmxlPFVuYlBlc3NvYU1vZGVsPiB7XHJcbiAgICBjb25zdCB1cmwgPSB0aGlzLmdldEFwaUNvbmZpZygpLnVybDtcclxuICAgIGNvbnN0IGh0dHBPcHRpb25zID0gdGhpcy5nZXRIZWFkZXJzKCk7XHJcbiAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkocGVzc29hKTtcclxuXHJcbiAgICBpZiAocGVzc29hLmNvZGlnb1Blc3NvYSA9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxVbmJQZXNzb2FNb2RlbD4oYCR7dXJsfS9wZXNzb2EtYXBpL3Blc3NvYXMvanVyaWRpY2FzYCwgYm9keSwgaHR0cE9wdGlvbnMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8VW5iUGVzc29hTW9kZWw+KGAke3VybH0vcGVzc29hLWFwaS9wZXNzb2FzL2p1cmlkaWNhcy8ke3Blc3NvYS5jb2RpZ29QZXNzb2F9YCwgYm9keSwgaHR0cE9wdGlvbnMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gRGFkb3MgYXV4aWxpYXJlcyBww7pibGljb3NcclxuICBwdWJsaWMgZ2V0RXNjb2xhcmlkYWRlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VW5iUGVzc29hRXNjb2xhcmlkYWRlW10+KGAke3RoaXMuZ2V0QXBpQ29uZmlnKCkudXJsfS9wZXNzb2EtYXBpL3B1YmxpYy9lc2NvbGFyaWRhZGVzL2xpc3RhZ2VtYCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RXN0YWRvQ2l2aWwoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxVbmJQZXNzb2FFc3RhZG9DaXZpbFtdPihgJHt0aGlzLmdldEFwaUNvbmZpZygpLnVybH0vcGVzc29hLWFwaS9wdWJsaWMvZXN0YWRvcy1jaXZpcy9saXN0YWdlbWApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldE11bmljaXBpb3MoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxVbmJQZXNzb2FNdW5pbmNpcGlvW10+KGAke3RoaXMuZ2V0QXBpQ29uZmlnKCkudXJsfS9wZXNzb2EtYXBpL3B1YmxpYy9tdW5pY2lwaW9zL2xpc3RhZ2VtYCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0UGFpc2VzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8eyBjb250ZW50OiBVbmJQZXNzb2FQYWlzW10gfT4oXHJcbiAgICAgIGAke3RoaXMuZ2V0QXBpQ29uZmlnKCkudXJsfS9wZXNzb2EtYXBpL3B1YmxpYy9wYWlzZXMvbGlzdGFnZW0/JnBhZ2U9MCZzaXplPTIwMCZzb3J0PWRlbm9taW5hY2FvLGFzY2BcclxuICAgICkucGlwZShcclxuICAgICAgbWFwKHJlc3BvbnNlID0+IHtcclxuICAgICAgICByZXR1cm4gcmVzcG9uc2UuY29udGVudC5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBub21lQSA9IGE/LmRlbm9taW5hY2FvPy50b1VwcGVyQ2FzZSgpIHx8ICcnO1xyXG4gICAgICAgICAgY29uc3Qgbm9tZUIgPSBiPy5kZW5vbWluYWNhbz8udG9VcHBlckNhc2UoKSB8fCAnJztcclxuXHJcbiAgICAgICAgICBpZiAobm9tZUEgPT09ICdCUkFTSUwnKSByZXR1cm4gLTE7XHJcbiAgICAgICAgICBpZiAobm9tZUIgPT09ICdCUkFTSUwnKSByZXR1cm4gMTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gbm9tZUEubG9jYWxlQ29tcGFyZShub21lQik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0UmFjYUNvcigpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PHN0cmluZ1tdPihgJHt0aGlzLmdldEFwaUNvbmZpZygpLnVybH0vcGVzc29hLWFwaS9wdWJsaWMvZXRuaWFzL2xpc3RhZ2VtYCkucGlwZShcclxuICAgICAgbWFwKGxpc3RhID0+IGxpc3RhLm1hcCgoaXRlbSwgaW5kZXgpID0+ICh7XHJcbiAgICAgICAgY29kaWdvOiBpbmRleCwgLy8gZ2VyYSB1bSBjw7NkaWdvIG51bcOpcmljbyBzZXF1ZW5jaWFsXHJcbiAgICAgICAgZGVub21pbmFjYW86IHRoaXMuZm9ybWF0YXJMYWJlbChpdGVtKSAvLyBmb3JtYXRhIHNlIHF1aXNlclxyXG4gICAgICB9KSkpXHJcbiAgICApOyAgXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0VGlwb0VtYWlsKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8c3RyaW5nW10+KGAke3RoaXMuZ2V0QXBpQ29uZmlnKCkudXJsfS9wZXNzb2EtYXBpL3RpcG9zLWVtYWlsL3B1YmxpYy9saXN0YWdlbWAgKS5waXBlKFxyXG4gICAgICBtYXAobGlzdGEgPT4gbGlzdGEubWFwKChpdGVtLCBpbmRleCkgPT4gKHtcclxuICAgICAgICBjb2RpZ286IGluZGV4LCAvLyBnZXJhIHVtIGPDs2RpZ28gbnVtw6lyaWNvIHNlcXVlbmNpYWxcclxuICAgICAgICBkZW5vbWluYWNhbzogdGhpcy5mb3JtYXRhckxhYmVsKGl0ZW0pIC8vIGZvcm1hdGEgc2UgcXVpc2VyXHJcbiAgICAgIH0pKSlcclxuICAgICk7XHJcbiAgfSAgXHJcblxyXG4gIHB1YmxpYyBnZXRUaXBvRW5kZXJlY28oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxzdHJpbmdbXT4oYCR7dGhpcy5nZXRBcGlDb25maWcoKS51cmx9L3Blc3NvYS1hcGkvdGlwb3MtZW5kZXJlY28vcHVibGljL2xpc3RhZ2VtYCkucGlwZShcclxuICAgICAgbWFwKGxpc3RhID0+IGxpc3RhLm1hcCgoaXRlbSwgaW5kZXgpID0+ICh7XHJcbiAgICAgICAgY29kaWdvOiBpbmRleCwgLy8gZ2VyYSB1bSBjw7NkaWdvIG51bcOpcmljbyBzZXF1ZW5jaWFsXHJcbiAgICAgICAgZGVub21pbmFjYW86IHRoaXMuZm9ybWF0YXJMYWJlbChpdGVtKSAvLyBmb3JtYXRhIHNlIHF1aXNlclxyXG4gICAgICB9KSkpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFRpcG9UZWxlZm9uZSgpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PHN0cmluZ1tdPihgJHt0aGlzLmdldEFwaUNvbmZpZygpLnVybH0vcGVzc29hLWFwaS90aXBvcy10ZWxlZm9uZS9wdWJsaWMvbGlzdGFnZW1gKS5waXBlKFxyXG4gICAgICBtYXAobGlzdGEgPT4gbGlzdGEubWFwKChpdGVtLCBpbmRleCkgPT4gKHtcclxuICAgICAgICBjb2RpZ286IGluZGV4LCAvLyBnZXJhIHVtIGPDs2RpZ28gbnVtw6lyaWNvIHNlcXVlbmNpYWxcclxuICAgICAgICBkZW5vbWluYWNhbzogdGhpcy5mb3JtYXRhckxhYmVsKGl0ZW0pIC8vIGZvcm1hdGEgc2UgcXVpc2VyXHJcbiAgICAgIH0pKSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZvcm1hdGFyTGFiZWwodGV4dDogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdGV4dFxyXG4gICAgICAudG9Mb3dlckNhc2UoKVxyXG4gICAgICAucmVwbGFjZSgvXy9nLCAnICcpXHJcbiAgICAgIC5yZXBsYWNlKC9cXGJcXHcvZywgbCA9PiBsLnRvVXBwZXJDYXNlKCkpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vIEhhbmRsZXIgZGUgZXJybyBwYWRyw6NvXHJcbiAgcHJpdmF0ZSBoYW5kbGVFcnJvcihlcnJvcjogYW55KSB7XHJcbiAgICBjb25zb2xlLmVycm9yKCdbVW5CUGVzc29hU2VydmljZV0gRXJybyBuYSBjaGFtYWRhIEhUVFA6JywgZXJyb3IpO1xyXG4gICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xyXG4gIH1cclxufSJdfQ==
253
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5iLXBlc3NvYS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdW5iLWxpYi1jb21wb25lbnRzL3NyYy9saWIvdW5iLXBlc3NvYS91bmItcGVzc29hLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQyxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBYyxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSXBGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7O0FBZ0J4RCxNQUFNLE9BQU8sZ0JBQWdCO0lBTzNCLFlBQW9CLElBQWdCO1FBQWhCLFNBQUksR0FBSixJQUFJLENBQVk7UUFMcEMscURBQXFEO1FBQzdDLHNCQUFpQixHQUFHLElBQUksZUFBZSxDQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQzVELHNFQUFzRTtRQUN0RSxnQkFBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQTJOcEQsc0VBQXNFO1FBQ3RFLDRCQUE0QjtRQUM1QixzRUFBc0U7UUFDL0QsZ0JBQVcsR0FBRyxDQUFDLEtBQVUsRUFBRSxFQUFFO1lBQ2xDLElBQUksZUFBZSxHQUFHLDRDQUE0QyxDQUFDO1lBQ25FLElBQUksWUFBWSxHQUFHLGdEQUFnRCxDQUFDO1lBRXBFLHFDQUFxQztZQUNyQyxJQUFJLFNBQWMsQ0FBQztZQUVuQixJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUN2QywrREFBK0Q7Z0JBQy9ELFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLG1FQUFtRTtnQkFD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LENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDNUMsQ0FBQzs4R0E3TlUsZ0JBQWdCO2tIQUFoQixnQkFBZ0IsY0FGZixNQUFNOzsyRkFFUCxnQkFBZ0I7a0JBSDVCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEVycm9yUmVzcG9uc2UsIEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY2F0Y2hFcnJvciwgbWFwLCBPYnNlcnZhYmxlLCBvZiwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBVbmJQZXNzb2FFbmRlcmVjbyB9IGZyb20gJy4vdW5iLXBlc3NvYS1tb2RlbHMvdW5iLXBlc3NvYS1lbmRlcmVjby5tb2RlbCc7XHJcbmltcG9ydCB7IFVuYlBlc3NvYUVzY29sYXJpZGFkZSB9IGZyb20gJy4vdW5iLXBlc3NvYS1tb2RlbHMvdW5iLXBlc3NvYS1lc2NvbGFyaWRhZGUubW9kZWwnO1xyXG5pbXBvcnQgeyBVbmJQZXNzb2FNb2RlbCB9IGZyb20gJy4vdW5iLXBlc3NvYS1tb2RlbHMvdW5iLXBlc3NvYS5tb2RlbCc7XHJcbmltcG9ydCB7IFRpcG9QZXNzb2FFbnVtIH0gZnJvbSAnLi91bmItdGlwby1wZXNzb2EuZW51bSc7XHJcbmltcG9ydCB7IFVuYlBlc3NvYVBhaXMgfSBmcm9tICcuL3VuYi1wZXNzb2EtbW9kZWxzL3VuYi1wZXNzb2EtcGFpcyc7XHJcbmltcG9ydCB7IFVuYlBlc3NvYU11bmluY2lwaW8gfSBmcm9tICcuL3VuYi1wZXNzb2EtbW9kZWxzL3VuYi1wZXNzb2EtbXVuaWNpcGlvJztcclxuaW1wb3J0IHsgVW5iUGVzc29hRXN0YWRvQ2l2aWwgfSBmcm9tICcuL3VuYi1wZXNzb2EtbW9kZWxzL3VuYi1wZXNzb2EtZXN0YWRvLWNpdmlsLm1vZGVsJztcclxuXHJcblxyXG4vLyBJbnRlcmZhY2UgcGFyYSBwYWRyb25pemFyIG8gZXJybyBxdWUgY2hlZ2Egbm9zIGNvbXBvbmVudGVzXHJcbmV4cG9ydCBpbnRlcmZhY2UgVW5iUGVzc29hRXJyb1BhZHJhbyB7XHJcbiAgc3RhdHVzOiBudW1iZXI7XHJcbiAgbWVuc2FnZW1TaW1wbGVzOiBzdHJpbmc7IC8vIFBhcmEgdXNhciBubyBTbmFja0JhclxyXG4gIG1lbnNhZ2VtSHRtbDogc3RyaW5nOyAgICAvLyBQYXJhIHVzYXIgbm8gQWxlcnRTZXJ2aWNlIChjb20gPHVsPiwgPGxpPiwgPHN0cm9uZz4pXHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFVuQlBlc3NvYVNlcnZpY2Uge1xyXG5cclxuICAvLyBBcm1hemVuYSBhcGVuYXMgYSBzdHJpbmcgZGEgVVJMLiBJbmljaWFsaXphIHZhemlvLlxyXG4gIHByaXZhdGUgYmFja2VuZFVybFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xyXG4gIC8vIEV4cG9zdGEgY29tbyBPYnNlcnZhYmxlIChjYXNvIGFsZ3VtIGNvbXBvbmVudGUgcXVlaXJhIHNlIGluc2NyZXZlcilcclxuICBiYWNrZW5kVXJsJCA9IHRoaXMuYmFja2VuZFVybFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCkgeyB9XHJcblxyXG4gIC8vIFNldHRlciBhZ29yYSByZWNlYmUgc3RyaW5nIGRpcmV0YVxyXG4gIHNldEJhY2tlbmRVcmwodXJsOiBzdHJpbmcpIHtcclxuICAgIC8vIFRyYXRhbWVudG8gcmVtb3ZlIGJhcnJhIG5vIGZpbmFsIHBhcmEgcGFkcm9uaXphclxyXG4gICAgaWYgKHVybC5lbmRzV2l0aCgnLycpKSB7XHJcbiAgICAgIHVybCA9IHVybC5zbGljZSgwLCAtMSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmJhY2tlbmRVcmxTdWJqZWN0Lm5leHQodXJsKTtcclxuICB9XHJcblxyXG4gIC8vIEdldHRlciByZXRvcm5hIHN0cmluZyBkaXJldGFcclxuICBnZXRCYWNrZW5kVXJsKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5iYWNrZW5kVXJsU3ViamVjdC5nZXRWYWx1ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gSGVhZGVycyBwYWRyw6NvXHJcbiAgcHJpdmF0ZSBnZXRIZWFkZXJzKCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXHJcbiAgICAgIH0pXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLy8gTcOpdG9kb3MgZGUgYnVzY2FcclxuICBmaW5kQnlDcGYoY3BmOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFVuYlBlc3NvYU1vZGVsPiB7XHJcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmdldEJhY2tlbmRVcmwoKX0vcGVzc29hLWFwaS9wZXNzb2FzL2Zpc2ljYXM/Y3BmPSR7Y3BmfWA7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxVbmJQZXNzb2FNb2RlbD4odXJsLCB0aGlzLmdldEhlYWRlcnMoKSkucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGZpbmRCeUNucGooY25wajogc3RyaW5nIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxVbmJQZXNzb2FNb2RlbD4ge1xyXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5nZXRCYWNrZW5kVXJsKCl9L3Blc3NvYS1hcGkvcGVzc29hcy9qdXJpZGljYXM/Y25waj0ke2NucGp9YDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFVuYlBlc3NvYU1vZGVsPih1cmwsIHRoaXMuZ2V0SGVhZGVycygpKS5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZmluZEJ5UGFzc2Fwb3J0ZShwYXNzYXBvcnRlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFVuYlBlc3NvYU1vZGVsPiB7XHJcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmdldEJhY2tlbmRVcmwoKX0vcGVzc29hLWFwaS9wZXNzb2FzL2Zpc2ljYXM/cGFzc2Fwb3J0ZT0ke3Bhc3NhcG9ydGV9YDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFVuYlBlc3NvYU1vZGVsPih1cmwsIHRoaXMuZ2V0SGVhZGVycygpKS5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZmluZFBlc3NvYUZpc2ljYUJ5SWQoaWQ6IG51bWJlcik6IE9ic2VydmFibGU8VW5iUGVzc29hTW9kZWw+IHtcclxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZ2V0QmFja2VuZFVybCgpfS9wZXNzb2EtYXBpL3Blc3NvYXMvZmlzaWNhcy8ke2lkfWA7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxVbmJQZXNzb2FNb2RlbD4odXJsLCB0aGlzLmdldEhlYWRlcnMoKSkucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHBlc3F1aXNhckNlcChjZXA6IHN0cmluZykge1xyXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5nZXRCYWNrZW5kVXJsKCl9L3Blc3NvYS1hcGkvcHVibGljL2J1c2NhLWNlcC9zZXJ2aWNvLTEvJHtjZXB9YDtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFVuYlBlc3NvYUVuZGVyZWNvPih1cmwsIHRoaXMuZ2V0SGVhZGVycygpKS5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8gU2FsdmFyIChkZWNpZGUgZmlzaWNhIG91IGp1cmlkaWNhKVxyXG4gIHNhbHZhcihwYXlsb2FkOiBhbnksIHRpcG9QZXNzb2E6IFRpcG9QZXNzb2FFbnVtKTogT2JzZXJ2YWJsZTxVbmJQZXNzb2FNb2RlbCB8IG51bGw+IHtcclxuXHJcbiAgICAvLyAoUGFyYSBvIGNvbXBvbmVudGUgY29uc2VndWlyIGxlciAubWVuc2FnZW1TaW1wbGVzIGUgLm1lbnNhZ2VtSHRtbClcclxuICAgIGlmICghcGF5bG9hZCkge1xyXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiAoe1xyXG4gICAgICAgIHN0YXR1czogNDAwLFxyXG4gICAgICAgIG1lbnNhZ2VtU2ltcGxlczogJ0Vycm8gaW50ZXJubzogRGFkb3MgcGFyYSBzYWx2YW1lbnRvIGludsOhbGlkb3MgKFBheWxvYWQgbnVsbCkuJyxcclxuICAgICAgICBtZW5zYWdlbUh0bWw6ICc8c3Ryb25nPkVycm8gaW50ZXJubzo8L3N0cm9uZz4gVGVudGF0aXZhIGRlIHNhbHZhciBkYWRvcyB2YXppb3MuJ1xyXG4gICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aXBvUGVzc29hKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+ICh7XHJcbiAgICAgICAgc3RhdHVzOiA0MDAsXHJcbiAgICAgICAgbWVuc2FnZW1TaW1wbGVzOiAnRXJybyBpbnRlcm5vOiBUaXBvIGRlIHBlc3NvYSBuw6NvIGRlZmluaWRvLicsXHJcbiAgICAgICAgbWVuc2FnZW1IdG1sOiAnPHN0cm9uZz5FcnJvIGludGVybm86PC9zdHJvbmc+IE8gdGlwbyBkZSBwZXNzb2Egw6kgb2JyaWdhdMOzcmlvIHBhcmEgc2FsdmFyLidcclxuICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIDIuIERlbGVnYcOnw6NvXHJcbiAgICAvLyBDb21vIHNhdmVQZXNzb2FGaXNpY2EgZSBzYXZlUGVzc29hSnVyaWRpY2EgSsOBIFTDik0gbyAucGlwZShjYXRjaEVycm9yKSxcclxuICAgIC8vIGFxdWkgbsOzcyBhcGVuYXMgcmV0b3JuYW1vcyBvIE9ic2VydmFibGUgZGVsZXMuIE8gZXJybyBzdWJpcsOhIHRyYXRhZG8uXHJcbiAgICBpZiAodGlwb1Blc3NvYSA9PSBUaXBvUGVzc29hRW51bS5GSVNJQ0EgfHwgdGlwb1Blc3NvYSA9PSBUaXBvUGVzc29hRW51bS5FU1RSQU5HRUlSQSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5zYXZlUGVzc29hRmlzaWNhKHBheWxvYWQpO1xyXG4gICAgfSBlbHNlIGlmICh0aXBvUGVzc29hID09IFRpcG9QZXNzb2FFbnVtLkpVUklESUNBKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnNhdmVQZXNzb2FKdXJpZGljYShwYXlsb2FkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb2YobnVsbCk7XHJcbiAgfVxyXG5cclxuICAvLyBTYWx2YXIgUGVzc29hIEbDrXNpY2FcclxuICBwcml2YXRlIHNhdmVQZXNzb2FGaXNpY2EocGVzc29hOiBVbmJQZXNzb2FNb2RlbCk6IE9ic2VydmFibGU8VW5iUGVzc29hTW9kZWw+IHtcclxuICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0QmFja2VuZFVybCgpO1xyXG4gICAgY29uc3QgaHR0cE9wdGlvbnMgPSB0aGlzLmdldEhlYWRlcnMoKTtcclxuICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShwZXNzb2EpO1xyXG5cclxuICAgIC8vIFZhcmnDoXZlbCBwYXJhIGFybWF6ZW5hciBvIE9ic2VydmFibGUgYW50ZXMgZGUgcmV0b3JuYXJcclxuICAgIGxldCByZXF1ZXN0JDogT2JzZXJ2YWJsZTxVbmJQZXNzb2FNb2RlbD47XHJcblxyXG4gICAgaWYgKHBlc3NvYS5jb2RpZ29QZXNzb2EgPT0gbnVsbCkge1xyXG4gICAgICByZXF1ZXN0JCA9IHRoaXMuaHR0cC5wb3N0PFVuYlBlc3NvYU1vZGVsPihgJHt1cmx9L3Blc3NvYS1hcGkvcGVzc29hcy9maXNpY2FzYCwgYm9keSwgaHR0cE9wdGlvbnMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmVxdWVzdCQgPSB0aGlzLmh0dHAucHV0PFVuYlBlc3NvYU1vZGVsPihgJHt1cmx9L3Blc3NvYS1hcGkvcGVzc29hcy9maXNpY2FzLyR7cGVzc29hLmNvZGlnb1Blc3NvYX1gLCBib2R5LCBodHRwT3B0aW9ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQW50ZXMgZGUgcmV0b3JuYXIsIHBhc3NhbW9zIHBlbG8gJ3BpcGUnIHBhcmEgdHJhdGFyIG8gZXJybyBzZSBlbGUgb2NvcnJlci5cclxuICAgIHJldHVybiByZXF1ZXN0JC5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8gU2FsdmFyIFBlc3NvYSBKdXLDrWRpY2FcclxuICBwcml2YXRlIHNhdmVQZXNzb2FKdXJpZGljYShwZXNzb2E6IFVuYlBlc3NvYU1vZGVsKTogT2JzZXJ2YWJsZTxVbmJQZXNzb2FNb2RlbD4ge1xyXG4gICAgY29uc3QgdXJsID0gdGhpcy5nZXRCYWNrZW5kVXJsKCk7XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHRoaXMuZ2V0SGVhZGVycygpO1xyXG4gICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KHBlc3NvYSk7XHJcbiAgICBsZXQgcmVxdWVzdCQ6IE9ic2VydmFibGU8VW5iUGVzc29hTW9kZWw+O1xyXG5cclxuICAgIGlmIChwZXNzb2EuY29kaWdvUGVzc29hID09IG51bGwpIHtcclxuICAgICAgcmVxdWVzdCQgPSB0aGlzLmh0dHAucG9zdDxVbmJQZXNzb2FNb2RlbD4oYCR7dXJsfS9wZXNzb2EtYXBpL3Blc3NvYXMvanVyaWRpY2FzYCwgYm9keSwgaHR0cE9wdGlvbnMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmVxdWVzdCQgPSB0aGlzLmh0dHAucHV0PFVuYlBlc3NvYU1vZGVsPihgJHt1cmx9L3Blc3NvYS1hcGkvcGVzc29hcy9qdXJpZGljYXMvJHtwZXNzb2EuY29kaWdvUGVzc29hfWAsIGJvZHksIGh0dHBPcHRpb25zKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVxdWVzdCQucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8vIERhZG9zIGF1eGlsaWFyZXMgcMO6YmxpY29zXHJcbiAgcHVibGljIGdldEVzY29sYXJpZGFkZSgpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFVuYlBlc3NvYUVzY29sYXJpZGFkZVtdPihgJHt0aGlzLmdldEJhY2tlbmRVcmwoKX0vcGVzc29hLWFwaS9wdWJsaWMvZXNjb2xhcmlkYWRlcy9saXN0YWdlbWApLnBpcGUoXHJcbiAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcikgLy8gPC0tLSBBZGljaW9uZSBhcXVpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEVzdGFkb0NpdmlsKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VW5iUGVzc29hRXN0YWRvQ2l2aWxbXT4oYCR7dGhpcy5nZXRCYWNrZW5kVXJsKCl9L3Blc3NvYS1hcGkvcHVibGljL2VzdGFkb3MtY2l2aXMvbGlzdGFnZW1gKS5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpIC8vIDwtLS0gQWRpY2lvbmUgYXF1aVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRNdW5pY2lwaW9zKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VW5iUGVzc29hTXVuaW5jaXBpb1tdPihgJHt0aGlzLmdldEJhY2tlbmRVcmwoKX0vcGVzc29hLWFwaS9wdWJsaWMvbXVuaWNpcGlvcy9saXN0YWdlbWApLnBpcGUoXHJcbiAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcikgLy8gPC0tLSBBZGljaW9uZSBhcXVpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFBhaXNlcygpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PHsgY29udGVudDogVW5iUGVzc29hUGFpc1tdIH0+KFxyXG4gICAgICBgJHt0aGlzLmdldEJhY2tlbmRVcmwoKX0vcGVzc29hLWFwaS9wdWJsaWMvcGFpc2VzL2xpc3RhZ2VtPyZwYWdlPTAmc2l6ZT0yMDAmc29ydD1kZW5vbWluYWNhbyxhc2NgXHJcbiAgICApLnBpcGUoXHJcbiAgICAgIG1hcChyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmNvbnRlbnQuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgICAgLy8gLi4uIHN1YSBsw7NnaWNhIGRlIG9yZGVuYcOnw6NvIC4uLlxyXG4gICAgICAgICAgY29uc3Qgbm9tZUEgPSBhPy5kZW5vbWluYWNhbz8udG9VcHBlckNhc2UoKSB8fCAnJztcclxuICAgICAgICAgIGNvbnN0IG5vbWVCID0gYj8uZGVub21pbmFjYW8/LnRvVXBwZXJDYXNlKCkgfHwgJyc7XHJcbiAgICAgICAgICBpZiAobm9tZUEgPT09ICdCUkFTSUwnKSByZXR1cm4gLTE7XHJcbiAgICAgICAgICBpZiAobm9tZUIgPT09ICdCUkFTSUwnKSByZXR1cm4gMTtcclxuICAgICAgICAgIHJldHVybiBub21lQS5sb2NhbGVDb21wYXJlKG5vbWVCKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSksXHJcbiAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcilcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0UmFjYUNvcigpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PHN0cmluZ1tdPihgJHt0aGlzLmdldEJhY2tlbmRVcmwoKX0vcGVzc29hLWFwaS9wdWJsaWMvZXRuaWFzL2xpc3RhZ2VtYCkucGlwZShcclxuICAgICAgbWFwKGxpc3RhID0+IGxpc3RhLm1hcCgoaXRlbSwgaW5kZXgpID0+ICh7XHJcbiAgICAgICAgY29kaWdvOiBpbmRleCwgLy8gZ2VyYSB1bSBjw7NkaWdvIG51bcOpcmljbyBzZXF1ZW5jaWFsXHJcbiAgICAgICAgZGVub21pbmFjYW86IHRoaXMuZm9ybWF0YXJMYWJlbChpdGVtKSAvLyBmb3JtYXRhIHNlIHF1aXNlclxyXG4gICAgICB9KSkpLFxyXG4gICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFRpcG9FbWFpbCgpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PHN0cmluZ1tdPihgJHt0aGlzLmdldEJhY2tlbmRVcmwoKX0vcGVzc29hLWFwaS90aXBvcy1lbWFpbC9wdWJsaWMvbGlzdGFnZW1gKS5waXBlKFxyXG4gICAgICBtYXAobGlzdGEgPT4gbGlzdGEubWFwKChpdGVtLCBpbmRleCkgPT4gKHtcclxuICAgICAgICBjb2RpZ286IGluZGV4LCAvLyBnZXJhIHVtIGPDs2RpZ28gbnVtw6lyaWNvIHNlcXVlbmNpYWxcclxuICAgICAgICBkZW5vbWluYWNhbzogdGhpcy5mb3JtYXRhckxhYmVsKGl0ZW0pIC8vIGZvcm1hdGEgc2UgcXVpc2VyXHJcbiAgICAgIH0pKSksXHJcbiAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcilcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0VGlwb0VuZGVyZWNvKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8c3RyaW5nW10+KGAke3RoaXMuZ2V0QmFja2VuZFVybCgpfS9wZXNzb2EtYXBpL3RpcG9zLWVuZGVyZWNvL3B1YmxpYy9saXN0YWdlbWApLnBpcGUoXHJcbiAgICAgIG1hcChsaXN0YSA9PiBsaXN0YS5tYXAoKGl0ZW0sIGluZGV4KSA9PiAoe1xyXG4gICAgICAgIGNvZGlnbzogaW5kZXgsIC8vIGdlcmEgdW0gY8OzZGlnbyBudW3DqXJpY28gc2VxdWVuY2lhbFxyXG4gICAgICAgIGRlbm9taW5hY2FvOiB0aGlzLmZvcm1hdGFyTGFiZWwoaXRlbSkgLy8gZm9ybWF0YSBzZSBxdWlzZXJcclxuICAgICAgfSkpKSxcclxuICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRUaXBvVGVsZWZvbmUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxzdHJpbmdbXT4oYCR7dGhpcy5nZXRCYWNrZW5kVXJsKCl9L3Blc3NvYS1hcGkvdGlwb3MtdGVsZWZvbmUvcHVibGljL2xpc3RhZ2VtYCkucGlwZShcclxuICAgICAgbWFwKGxpc3RhID0+IGxpc3RhLm1hcCgoaXRlbSwgaW5kZXgpID0+ICh7XHJcbiAgICAgICAgY29kaWdvOiBpbmRleCwgLy8gZ2VyYSB1bSBjw7NkaWdvIG51bcOpcmljbyBzZXF1ZW5jaWFsXHJcbiAgICAgICAgZGVub21pbmFjYW86IHRoaXMuZm9ybWF0YXJMYWJlbChpdGVtKSAvLyBmb3JtYXRhIHNlIHF1aXNlclxyXG4gICAgICB9KSkpLFxyXG4gICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmb3JtYXRhckxhYmVsKHRleHQ6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIHRleHRcclxuICAgICAgLnRvTG93ZXJDYXNlKClcclxuICAgICAgLnJlcGxhY2UoL18vZywgJyAnKVxyXG4gICAgICAucmVwbGFjZSgvXFxiXFx3L2csIGwgPT4gbC50b1VwcGVyQ2FzZSgpKTtcclxuICB9XHJcblxyXG5cclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gSEFORExFIEVSUk9SIFBBRFJPTklaQURPIFxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuIHByaXZhdGUgaGFuZGxlRXJyb3IgPSAoZXJyb3I6IGFueSkgPT4geyAgICBcclxuICAgIGxldCBtZW5zYWdlbVNpbXBsZXMgPSAnT2NvcnJldSB1bSBlcnJvIGFvIHByb2Nlc3NhciBhIHJlcXVpc2nDp8OjbyEnO1xyXG4gICAgbGV0IG1lbnNhZ2VtSHRtbCA9ICc8c3Ryb25nPk9jb3JyZXUgdW0gZXJybyBkZXNjb25oZWNpZG8uPC9zdHJvbmc+JztcclxuICAgIFxyXG4gICAgLy8gMi4gRGVzY29icmUgcXVlbSDDqSBvIGNvcnBvIGRvIGVycm9cclxuICAgIGxldCBlcnJvckJvZHk6IGFueTtcclxuXHJcbiAgICBpZiAoZXJyb3IuZGV0YWxoZXMgfHwgZXJyb3IuY29kaWdvU3RhdHVzKSB7XHJcbiAgICAgICAgLy8gQ0FTTyAxOiBPIEludGVyY2VwdG9yIGrDoSBkZXNlbWJydWxob3UgbyBlcnJvICjDqSBvIEpTT04gcHVybylcclxuICAgICAgICBlcnJvckJvZHkgPSBlcnJvcjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gQ0FTTyAyOiDDiSB1bSBIdHRwRXJyb3JSZXNwb25zZSBwYWRyw6NvICh0ZW0gYSBwcm9wcmllZGFkZSAuZXJyb3IpXHJcbiAgICAgICAgZXJyb3JCb2R5ID0gZXJyb3IuZXJyb3IgfHwgZXJyb3I7IFxyXG4gICAgfVxyXG5cclxuICAgIC8vIDMuIEzDs2dpY2EgZGUgTGltcGV6YSBlIFBhcnNlIChzZSBmb3Igc3RyaW5nIHN1amEpXHJcbiAgICBpZiAodHlwZW9mIGVycm9yQm9keSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBlcnJvckJvZHkgPSBKU09OLnBhcnNlKGVycm9yQm9keSk7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICBjb25zdCBzdGFydCA9IGVycm9yQm9keS5pbmRleE9mKCd7Jyk7XHJcbiAgICAgICAgY29uc3QgZW5kID0gZXJyb3JCb2R5Lmxhc3RJbmRleE9mKCd9Jyk7XHJcbiAgICAgICAgaWYgKHN0YXJ0ID4gLTEgJiYgZW5kID4gc3RhcnQpIHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGVycm9yQm9keSA9IEpTT04ucGFyc2UoZXJyb3JCb2R5LnN1YnN0cmluZyhzdGFydCwgZW5kICsgMSkpO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZTIpIHtcclxuICAgICAgICAgICAgIC8vIFNlIGZhbGhhciBvIHBhcnNlLCB1c2EgbyB0ZXh0byBjb21vIG1lbnNhZ2VtXHJcbiAgICAgICAgICAgICBtZW5zYWdlbVNpbXBsZXMgPSBlcnJvckJvZHkuc3Vic3RyaW5nKDAsIDIwMCk7IFxyXG4gICAgICAgICAgICAgbWVuc2FnZW1IdG1sID0gYDxzdHJvbmc+JHtlcnJvckJvZHl9PC9zdHJvbmc+YDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyA0LiBGb3JtYXRhw6fDo28gYmFzZWFkYSBubyBKU09OIGlkZW50aWZpY2Fkb1xyXG4gICAgaWYgKGVycm9yQm9keSAmJiB0eXBlb2YgZXJyb3JCb2R5ID09PSAnb2JqZWN0Jykge1xyXG4gICAgICBcclxuICAgICAgLy8gQTogRXJyb3MgZGUgVmFsaWRhw6fDo29cclxuICAgICAgaWYgKGVycm9yQm9keS5kZXRhbGhlcyAmJiBBcnJheS5pc0FycmF5KGVycm9yQm9keS5kZXRhbGhlcykgJiYgZXJyb3JCb2R5LmRldGFsaGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBtZW5zYWdlbVNpbXBsZXMgPSBcIk8gZm9ybXVsw6FyaW8gcG9zc3VpIGVycm9zIGRlIHZhbGlkYcOnw6NvLlwiO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IGxpc3RhRXJyb3MgPSBlcnJvckJvZHkuZGV0YWxoZXMubWFwKChkOiBhbnkpID0+IFxyXG4gICAgICAgICAgYDxsaT48c3Ryb25nPiR7ZC5ub21lQ2FtcG8gfHwgJ0NhbXBvJ306PC9zdHJvbmc+ICR7ZC5jcml0aWNhIHx8IGQubWVuc2FnZW19PC9saT5gXHJcbiAgICAgICAgKS5qb2luKCcnKTtcclxuICAgICAgICBcclxuICAgICAgICBtZW5zYWdlbUh0bWwgPSBgPHN0cm9uZz5FcnJvcyBkZSBWYWxpZGHDp8Ojbzo8L3N0cm9uZz4gPHVsPiR7bGlzdGFFcnJvc308L3VsPmA7XHJcbiAgICAgIH0gXHJcbiAgICAgIC8vIEI6IEVycm8gR2Vuw6lyaWNvIGNvbSBtZW5zYWdlbVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBjb25zdCBtc2dCYWNrZW5kID0gZXJyb3JCb2R5Lm1lbnNhZ2VtIHx8IGVycm9yQm9keS5tZXNzYWdlIHx8IGVycm9yQm9keS5kZXRhaWw7XHJcbiAgICAgICAgaWYgKG1zZ0JhY2tlbmQpIHtcclxuICAgICAgICAgIG1lbnNhZ2VtU2ltcGxlcyA9IG1zZ0JhY2tlbmQ7XHJcbiAgICAgICAgICBtZW5zYWdlbUh0bWwgPSBgPHN0cm9uZz4ke21zZ0JhY2tlbmR9PC9zdHJvbmc+YDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyA1LiBUcmF0YW1lbnRvcyBkZSBTdGF0dXMgSFRUUCAoU2UgbyB3cmFwcGVyIG9yaWdpbmFsIHRpdmVyIHN0YXR1cylcclxuICAgIC8vIE5vdGE6IFNlIG8gaW50ZXJjZXB0b3IgZGVzZW1icnVsaG91LCAnZXJyb3Iuc3RhdHVzJyBwb2RlIG7Do28gZXhpc3RpciwgXHJcbiAgICAvLyBtYXMgJ2Vycm9yQm9keS5jb2RpZ29TdGF0dXMnIChkbyBKYXZhKSBwb2RlIGV4aXN0aXIuXHJcbiAgICBjb25zdCBzdGF0dXMgPSBlcnJvci5zdGF0dXMgfHwgZXJyb3JCb2R5Py5jb2RpZ29TdGF0dXMgfHwgMDtcclxuXHJcbiAgICBpZiAoc3RhdHVzID09PSA0MDEpIHtcclxuICAgICAgbWVuc2FnZW1TaW1wbGVzID0gXCJTZXNzw6NvIGV4cGlyYWRhLlwiO1xyXG4gICAgICBtZW5zYWdlbUh0bWwgPSBcIjxzdHJvbmc+U2Vzc8OjbyBleHBpcmFkYS4gRmHDp2EgbG9naW4gbm92YW1lbnRlLjwvc3Ryb25nPlwiO1xyXG4gICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMykge1xyXG4gICAgICBtZW5zYWdlbVNpbXBsZXMgPSBcIkFjZXNzbyBOZWdhZG8uXCI7XHJcbiAgICAgIG1lbnNhZ2VtSHRtbCA9IFwiPHN0cm9uZz5Wb2PDqiBuw6NvIHRlbSBwZXJtaXNzw6NvIHBhcmEgcmVhbGl6YXIgZXN0YSBhw6fDo28uPC9zdHJvbmc+XCI7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZXJyb0Zvcm1hdGFkbzogVW5iUGVzc29hRXJyb1BhZHJhbyA9IHtcclxuICAgICAgc3RhdHVzOiBzdGF0dXMsXHJcbiAgICAgIG1lbnNhZ2VtU2ltcGxlcyxcclxuICAgICAgbWVuc2FnZW1IdG1sXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnNvbGUud2FybignW1VuQlBlc3NvYVNlcnZpY2VdIEVycm8gZm9ybWF0YWRvIGZpbmFsOicsIGVycm9Gb3JtYXRhZG8pO1xyXG4gICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb0Zvcm1hdGFkbyk7XHJcbiAgfVxyXG59Il19