wm-menu 1.4.0 → 1.6.0

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.
@@ -1,11 +1,13 @@
1
- import { __decorate } from "tslib";
1
+ import { __awaiter, __decorate } from "tslib";
2
2
  import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
3
3
  import { ReconocimientoVozService } from './reconocimiento-voz.service';
4
4
  import { AsistenteDatosApiService } from './asistente-datos-api.service';
5
+ import { TablaExportService } from './tabla-export.service';
5
6
  let AsistenteDatosComponent = class AsistenteDatosComponent {
6
- constructor(asistenteDatosApiService, reconocimientoVoz) {
7
+ constructor(asistenteDatosApiService, reconocimientoVoz, tablaExport) {
7
8
  this.asistenteDatosApiService = asistenteDatosApiService;
8
9
  this.reconocimientoVoz = reconocimientoVoz;
10
+ this.tablaExport = tablaExport;
9
11
  // La apertura/cierre del panel la controla el padre (el menú). El panel solo se renderiza
10
12
  // cuando `abierto` es true y avisa, vía `cerrarChange`, cuando el usuario toca la X.
11
13
  this.abierto = false;
@@ -23,6 +25,12 @@ let AsistenteDatosComponent = class AsistenteDatosComponent {
23
25
  this.proveedorSeleccionado = 'Gemini';
24
26
  // Dictado por voz (Web Speech API) — sin soporte en Firefox, inconsistente en Safari.
25
27
  this.escuchando = false;
28
+ // Tabla abierta en el modal "ampliar" (null = modal cerrado). El panel del chat es angosto y
29
+ // recorta las columnas; el modal muestra la misma tabla a todo el ancho de la pantalla.
30
+ this.tablaAmpliada = null;
31
+ this.descripcionAmpliada = '';
32
+ // Aviso efímero "Tabla copiada" tras copiar al portapapeles.
33
+ this.copiadoAviso = false;
26
34
  // Preguntas ya verificadas como respondibles hoy (whitelist + contrato de la IA — ver
27
35
  // ChatConsultaWhitelistServicio/ChatConsultaPromptServicio en el backend), mostradas como chips
28
36
  // de sugerencia en el estado vacío del chat.
@@ -147,10 +155,50 @@ let AsistenteDatosComponent = class AsistenteDatosComponent {
147
155
  const columna = this.columnasDe(resultado)[0];
148
156
  return resultado.map((fila) => fila[columna]).join(', ');
149
157
  }
158
+ // --- Acciones sobre la tabla de resultados (ampliar / copiar / exportar) ---
159
+ ampliar(resultado, descripcion) {
160
+ this.tablaAmpliada = resultado;
161
+ this.descripcionAmpliada = descripcion || '';
162
+ }
163
+ cerrarAmpliada() {
164
+ this.tablaAmpliada = null;
165
+ this.descripcionAmpliada = '';
166
+ }
167
+ copiar(resultado) {
168
+ return __awaiter(this, void 0, void 0, function* () {
169
+ try {
170
+ yield this.tablaExport.copiar(resultado);
171
+ this.copiadoAviso = true;
172
+ setTimeout(() => (this.copiadoAviso = false), 1800);
173
+ }
174
+ catch (_a) {
175
+ // Copiar puede fallar por permisos del portapapeles; se ignora en silencio (el usuario
176
+ // aún puede ampliar y exportar).
177
+ }
178
+ });
179
+ }
180
+ exportarCsv(resultado) {
181
+ this.tablaExport.descargarCsv(resultado, this.nombreArchivo());
182
+ }
183
+ exportarXlsx(resultado) {
184
+ this.tablaExport.descargarXlsx(resultado, this.nombreArchivo());
185
+ }
186
+ nombreArchivo() {
187
+ const ahora = new Date();
188
+ const dos = (n) => String(n).padStart(2, '0');
189
+ return ('asistente-datos-' +
190
+ ahora.getFullYear() +
191
+ dos(ahora.getMonth() + 1) +
192
+ dos(ahora.getDate()) +
193
+ '-' +
194
+ dos(ahora.getHours()) +
195
+ dos(ahora.getMinutes()));
196
+ }
150
197
  };
151
198
  AsistenteDatosComponent.ctorParameters = () => [
152
199
  { type: AsistenteDatosApiService },
153
- { type: ReconocimientoVozService }
200
+ { type: ReconocimientoVozService },
201
+ { type: TablaExportService }
154
202
  ];
155
203
  __decorate([
156
204
  ViewChild('mensajesContainer')
@@ -170,9 +218,9 @@ __decorate([
170
218
  AsistenteDatosComponent = __decorate([
171
219
  Component({
172
220
  selector: 'wm-asistente-datos',
173
- template: "<!-- Panel (abierto) -->\r\n<div class=\"chat-ia-panel\" *ngIf=\"abierto\">\r\n <div class=\"chat-ia-header\">\r\n <div class=\"chat-ia-header-info\">\r\n <div class=\"chat-ia-header-icono\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#fff\" stroke-width=\"1.8\">\r\n <path d=\"M4 5h16v10H9l-4 4V15H4z\"></path>\r\n </svg>\r\n </div>\r\n <div>\r\n <div class=\"chat-ia-titulo\">Preg\u00FAntale a tus Datos</div>\r\n <div class=\"chat-ia-subtitulo\">Consulta tus reportes en lenguaje natural</div>\r\n </div>\r\n </div>\r\n <div class=\"chat-ia-cerrar\" (click)=\"cerrar()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" stroke=\"#fff\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\">\r\n <path d=\"M6 6l12 12M18 6L6 18\"></path>\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <div class=\"chat-ia-mensajes\" #mensajesContainer>\r\n <div class=\"chat-ia-bienvenida-texto\">Hola, soy tu asistente de datos de Snap Forms. Preg\u00FAntame lo que quieras saber sobre tu operaci\u00F3n.</div>\r\n\r\n <div class=\"chat-ia-mensaje\" *ngFor=\"let mensaje of mensajes\" [class.chat-ia-mensaje-usuario]=\"mensaje.deUsuario\">\r\n <div class=\"chat-ia-burbuja\" [class.chat-ia-burbuja-error]=\"mensaje.esError\">\r\n <span *ngIf=\"mensaje.texto\">{{ mensaje.texto }}</span>\r\n\r\n <ng-container *ngIf=\"mensaje.resultado\">\r\n <div class=\"chat-ia-descripcion\" *ngIf=\"mensaje.descripcion\">{{ mensaje.descripcion }}</div>\r\n\r\n <div class=\"chat-ia-sin-resultados\" *ngIf=\"mensaje.resultado.length === 0\">La consulta no encontr\u00F3 resultados.</div>\r\n\r\n <div class=\"chat-ia-stat\" *ngIf=\"esConteo(mensaje.resultado)\">\r\n <div class=\"chat-ia-stat-valor\">{{ mensaje.resultado[0].Resultado | number }}</div>\r\n </div>\r\n\r\n <div class=\"chat-ia-lista-simple\" *ngIf=\"esListaSimple(mensaje.resultado)\">{{ textoListaSimple(mensaje.resultado) }}</div>\r\n\r\n <div class=\"chat-ia-tabla-resultado\" *ngIf=\"mensaje.resultado.length > 0 && !esConteo(mensaje.resultado) && !esListaSimple(mensaje.resultado)\">\r\n <table mat-table [dataSource]=\"mensaje.resultado\">\r\n <ng-container *ngFor=\"let columna of columnasDe(mensaje.resultado)\" [matColumnDef]=\"columna\">\r\n <th mat-header-cell *matHeaderCellDef>{{ columna }}</th>\r\n <td mat-cell *matCellDef=\"let fila\">{{ fila[columna] }}</td>\r\n </ng-container>\r\n <tr mat-header-row *matHeaderRowDef=\"columnasDe(mensaje.resultado)\"></tr>\r\n <tr mat-row *matRowDef=\"let fila; columns: columnasDe(mensaje.resultado);\"></tr>\r\n </table>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"chat-ia-pensando\" *ngIf=\"consultando\">\r\n <span class=\"chat-ia-dot\"></span><span class=\"chat-ia-dot\"></span><span class=\"chat-ia-dot\"></span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"chips-chat-ia\">\r\n <span class=\"chip-chat-ia\" *ngFor=\"let chip of chipsSugeridos\"\r\n (click)=\"onClickEnviar(chip)\">{{ chip }}</span>\r\n </div>\r\n\r\n <div class=\"chat-ia-entrada\">\r\n <div class=\"chat-ia-caja-entrada\">\r\n <mat-icon class=\"chat-ia-expandir\" (click)=\"onClickExpandirBorrador()\">{{ borradorExpandido ? 'close_fullscreen' : 'open_in_full' }}</mat-icon>\r\n <textarea [rows]=\"filasBorrador\" [(ngModel)]=\"borrador\" (keydown.enter)=\"$event.preventDefault(); onClickEnviar()\"\r\n [class.chat-ia-textarea-expandido]=\"borradorExpandido\"\r\n placeholder=\"Escribe tu pregunta...\"></textarea>\r\n <div class=\"chat-ia-pie-entrada\">\r\n <button class=\"chat-ia-selector-modelo\" [matMenuTriggerFor]=\"menuModeloChatIA\" type=\"button\">\r\n <span *ngIf=\"proveedorSeleccionado === 'Gemini'\">Gemini</span>\r\n <span *ngIf=\"proveedorSeleccionado === 'Groq'\">Groq</span>\r\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M6 9l6 6 6-6\"></path>\r\n </svg>\r\n </button>\r\n <button class=\"chat-ia-microfono\" [class.chat-ia-microfono-activo]=\"escuchando\" *ngIf=\"micDisponible\"\r\n (click)=\"onClickMicrofono()\" type=\"button\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z\"></path>\r\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\"></path>\r\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"23\"></line>\r\n </svg>\r\n </button>\r\n <button class=\"chat-ia-enviar\" [disabled]=\"!borrador.trim() || consultando\" (click)=\"onClickEnviar()\" type=\"button\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 19V6\"></path>\r\n <path d=\"M5 13l7-7 7 7\"></path>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<mat-menu #menuModeloChatIA=\"matMenu\" class=\"menu-modelo-chat-ia\">\r\n <button mat-menu-item [class.opcion-activa]=\"proveedorSeleccionado === 'Gemini'\"\r\n (click)=\"proveedorSeleccionado = 'Gemini'\">\r\n <span>Gemini</span>\r\n <svg *ngIf=\"proveedorSeleccionado === 'Gemini'\" class=\"chat-ia-check\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M20 6L9 17l-5-5\"></path>\r\n </svg>\r\n </button>\r\n <button mat-menu-item [class.opcion-activa]=\"proveedorSeleccionado === 'Groq'\"\r\n (click)=\"proveedorSeleccionado = 'Groq'\">\r\n <span>Groq</span>\r\n <svg *ngIf=\"proveedorSeleccionado === 'Groq'\" class=\"chat-ia-check\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M20 6L9 17l-5-5\"></path>\r\n </svg>\r\n </button>\r\n</mat-menu>\r\n",
174
- styles: [":host{position:fixed;right:32px;bottom:32px;z-index:1000;font-family:Roboto,sans-serif}.chat-ia-panel{width:450px;height:650px;max-width:calc(100vw - 48px);max-height:calc(100vh - 96px);background:#fff;border-radius:18px;box-shadow:0 24px 60px rgba(20,25,30,.28);display:flex;flex-direction:column;overflow:hidden}.chat-ia-header{background:linear-gradient(135deg,#7c5ce0,#5f42bd);padding:16px 18px;display:flex;align-items:center;justify-content:space-between;flex-shrink:0}.chat-ia-header-info{display:flex;align-items:center;gap:10px;min-width:0}.chat-ia-header-icono{width:32px;height:32px;border-radius:50%;background:rgba(255,255,255,.22);display:flex;align-items:center;justify-content:center;flex:none}.chat-ia-titulo{color:#fff;font-size:14px;font-weight:500}.chat-ia-subtitulo{color:rgba(255,255,255,.75);font-size:11px;margin-top:1px}.chat-ia-cerrar{width:24px;height:24px;display:flex;align-items:center;justify-content:center;cursor:pointer;opacity:.85;flex:none}.chat-ia-cerrar:hover{opacity:1}.chat-ia-mensajes{flex:1;min-height:0;overflow-y:auto;display:flex;flex-direction:column;gap:12px;padding:16px;background:#fbfafc}.chat-ia-mensaje{display:flex}.chat-ia-mensaje .chat-ia-burbuja{max-width:88%;background:#f2eefb;color:#26313a;border-radius:14px 14px 14px 3px;padding:10px 13px;font-size:13px;line-height:1.5}.chat-ia-mensaje .chat-ia-burbuja-error{background:#fdecea;color:#7a1f14}.chat-ia-mensaje.chat-ia-mensaje-usuario{justify-content:flex-end}.chat-ia-mensaje.chat-ia-mensaje-usuario .chat-ia-burbuja{background:#7c5ce0;color:#fff;border-radius:14px 14px 3px}.chat-ia-bienvenida-texto{align-self:flex-start;max-width:88%;background:#f2eefb;color:#26313a;border-radius:14px 14px 14px 3px;padding:10px 13px;font-size:13px;line-height:1.5}.chips-chat-ia{flex:none;display:flex;flex-wrap:wrap;gap:6px;padding:0 16px 10px}.chip-chat-ia{border:1px solid #e7e2f5;background:#f2eefb;color:#5f42bd;border-radius:14px;padding:5px 10px;font-size:11px;cursor:pointer}.chip-chat-ia:hover{background:#e7ddfa}.chat-ia-descripcion{font-size:13px;line-height:1.5;margin-bottom:6px}.chat-ia-sin-resultados{color:#5a5a5a;font-style:italic}.chat-ia-stat{margin-top:4px}.chat-ia-stat-valor{font-size:30px;font-weight:600;color:#5f42bd;line-height:1.15;font-variant-numeric:proportional-nums}.chat-ia-lista-simple,.chat-ia-tabla-resultado{margin-top:4px;background:#fff;border-radius:10px;padding:8px 10px}.chat-ia-lista-simple{font-size:13px;line-height:1.5}.chat-ia-tabla-resultado{overflow-x:auto;max-width:100%;padding:4px 10px}.chat-ia-tabla-resultado table{font-size:12px;background:0 0}.chat-ia-tabla-resultado th.mat-header-cell{color:#6b6478;font-weight:600;padding:0 14px 5px 0;border-bottom:1px solid #f0edf7;white-space:nowrap}.chat-ia-tabla-resultado td.mat-cell{padding:7px 14px 0 0;white-space:nowrap;font-variant-numeric:tabular-nums}.chat-ia-pensando{align-self:flex-start;background:#f2eefb;padding:12px 16px;border-radius:14px 14px 14px 3px;display:flex;gap:5px;flex-shrink:0}.chat-ia-dot{width:6px;height:6px;border-radius:50%;background:#9a93ae;-webkit-animation:1.1s ease-in-out infinite chatIaBlink;animation:1.1s ease-in-out infinite chatIaBlink}.chat-ia-dot:nth-child(2){-webkit-animation-delay:.15s;animation-delay:.15s}.chat-ia-dot:nth-child(3){-webkit-animation-delay:.3s;animation-delay:.3s}@-webkit-keyframes chatIaBlink{0%,100%,80%{opacity:.25}40%{opacity:1}}@keyframes chatIaBlink{0%,100%,80%{opacity:.25}40%{opacity:1}}.chat-ia-entrada{padding:10px 14px 14px;border-top:1px solid #e9f2ee;flex-shrink:0}.chat-ia-caja-entrada{position:relative;background:#f2f7f5;border:1px solid #e6efea;border-radius:18px;padding:10px 12px 8px}.chat-ia-caja-entrada textarea{border:none;outline:0;background:0 0;width:100%;font:inherit;font-size:13.5px;color:#26313a;resize:none;line-height:1.45;max-height:110px;overflow-y:auto;display:block;padding:0 28px 0 0}.chat-ia-caja-entrada textarea.chat-ia-textarea-expandido{max-height:160px}.chat-ia-caja-entrada textarea::-webkit-input-placeholder{color:#9a93ae}.chat-ia-caja-entrada textarea::-moz-placeholder{color:#9a93ae}.chat-ia-caja-entrada textarea:-ms-input-placeholder{color:#9a93ae}.chat-ia-caja-entrada textarea::-ms-input-placeholder{color:#9a93ae}.chat-ia-caja-entrada textarea::placeholder{color:#9a93ae}.chat-ia-expandir{position:absolute;top:8px;right:10px;font-size:17px;height:17px;width:17px;color:#9a9a9a;cursor:pointer}.chat-ia-pie-entrada{display:flex;align-items:center;justify-content:flex-end;gap:8px;margin-top:8px}.chat-ia-selector-modelo{display:inline-flex;align-items:center;gap:4px;border:none;background:0 0;color:#4e5d57;border-radius:14px;padding:5px 9px;font-size:11.5px;font-weight:600;cursor:pointer}.chat-ia-enviar{width:32px;height:32px;border-radius:50%;border:none;background:#7c5ce0;color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;flex:none}.chat-ia-enviar:disabled{background:#dce6e1;color:#a9bab3;cursor:default}.chat-ia-microfono{width:28px;height:28px;border-radius:50%;border:none;background:0 0;color:#6b6478;display:flex;align-items:center;justify-content:center;cursor:pointer;flex:none}.chat-ia-microfono:hover{background:#f2eefb}.chat-ia-microfono.chat-ia-microfono-activo{color:#fff;background:#e05a5a;-webkit-animation:1.1s ease-in-out infinite chatIaBlink;animation:1.1s ease-in-out infinite chatIaBlink}::ng-deep .mat-menu-panel.menu-modelo-chat-ia{min-width:132px;border:1px solid #e6efea;border-radius:10px;box-shadow:0 12px 26px rgba(20,25,30,.16)}::ng-deep .mat-menu-panel.menu-modelo-chat-ia .mat-menu-content{padding:4px}::ng-deep .mat-menu-panel.menu-modelo-chat-ia .mat-menu-item{display:flex;align-items:center;justify-content:space-between;gap:8px;height:auto;line-height:normal;padding:7px 10px;font-size:12px;color:#26313a;border-radius:7px}::ng-deep .mat-menu-panel.menu-modelo-chat-ia .mat-menu-item.opcion-activa{background:#f2f7f5}::ng-deep .mat-menu-panel.menu-modelo-chat-ia .mat-menu-item .chat-ia-check{color:#7c5ce0}"]
221
+ template: "<!-- Panel (abierto) -->\r\n<div class=\"chat-ia-panel\" *ngIf=\"abierto\">\r\n <div class=\"chat-ia-header\">\r\n <div class=\"chat-ia-header-info\">\r\n <div class=\"chat-ia-header-icono\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#fff\" stroke-width=\"1.8\">\r\n <path d=\"M4 5h16v10H9l-4 4V15H4z\"></path>\r\n </svg>\r\n </div>\r\n <div>\r\n <div class=\"chat-ia-titulo\">Preg\u00FAntale a tus Datos</div>\r\n <div class=\"chat-ia-subtitulo\">Consulta tus reportes en lenguaje natural</div>\r\n </div>\r\n </div>\r\n <div class=\"chat-ia-cerrar\" (click)=\"cerrar()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" stroke=\"#fff\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\">\r\n <path d=\"M6 6l12 12M18 6L6 18\"></path>\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <div class=\"chat-ia-mensajes\" #mensajesContainer>\r\n <div class=\"chat-ia-bienvenida-texto\">Hola, soy tu asistente de datos de Snap Forms. Preg\u00FAntame lo que quieras saber sobre tu operaci\u00F3n.</div>\r\n\r\n <div class=\"chat-ia-mensaje\" *ngFor=\"let mensaje of mensajes\" [class.chat-ia-mensaje-usuario]=\"mensaje.deUsuario\">\r\n <div class=\"chat-ia-burbuja\" [class.chat-ia-burbuja-error]=\"mensaje.esError\">\r\n <span *ngIf=\"mensaje.texto\">{{ mensaje.texto }}</span>\r\n\r\n <ng-container *ngIf=\"mensaje.resultado\">\r\n <div class=\"chat-ia-descripcion\" *ngIf=\"mensaje.descripcion\">{{ mensaje.descripcion }}</div>\r\n\r\n <div class=\"chat-ia-sin-resultados\" *ngIf=\"mensaje.resultado.length === 0\">La consulta no encontr\u00F3 resultados.</div>\r\n\r\n <div class=\"chat-ia-stat\" *ngIf=\"esConteo(mensaje.resultado)\">\r\n <div class=\"chat-ia-stat-valor\">{{ mensaje.resultado[0].Resultado | number }}</div>\r\n </div>\r\n\r\n <div class=\"chat-ia-lista-simple\" *ngIf=\"esListaSimple(mensaje.resultado)\">{{ textoListaSimple(mensaje.resultado) }}</div>\r\n\r\n <div class=\"chat-ia-tabla-bloque\" *ngIf=\"mensaje.resultado.length > 0 && !esConteo(mensaje.resultado) && !esListaSimple(mensaje.resultado)\">\r\n <div class=\"chat-ia-tabla-acciones\">\r\n <button type=\"button\" class=\"chat-ia-accion\" matTooltip=\"Ampliar\"\r\n (click)=\"ampliar(mensaje.resultado, mensaje.descripcion)\">\r\n <mat-icon>open_in_full</mat-icon>\r\n </button>\r\n <button type=\"button\" class=\"chat-ia-accion\" matTooltip=\"Copiar\"\r\n (click)=\"copiar(mensaje.resultado)\">\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n <button type=\"button\" class=\"chat-ia-accion\" matTooltip=\"Exportar\"\r\n [matMenuTriggerFor]=\"menuExport\">\r\n <mat-icon>download</mat-icon>\r\n </button>\r\n <mat-menu #menuExport=\"matMenu\" class=\"menu-export-chat-ia\">\r\n <button mat-menu-item type=\"button\" (click)=\"exportarCsv(mensaje.resultado)\">CSV (.csv)</button>\r\n <button mat-menu-item type=\"button\" (click)=\"exportarXlsx(mensaje.resultado)\">Excel (.xlsx)</button>\r\n </mat-menu>\r\n </div>\r\n <div class=\"chat-ia-tabla-resultado\">\r\n <table mat-table [dataSource]=\"mensaje.resultado\">\r\n <ng-container *ngFor=\"let columna of columnasDe(mensaje.resultado)\" [matColumnDef]=\"columna\">\r\n <th mat-header-cell *matHeaderCellDef>{{ columna }}</th>\r\n <td mat-cell *matCellDef=\"let fila\">{{ fila[columna] }}</td>\r\n </ng-container>\r\n <tr mat-header-row *matHeaderRowDef=\"columnasDe(mensaje.resultado)\"></tr>\r\n <tr mat-row *matRowDef=\"let fila; columns: columnasDe(mensaje.resultado);\"></tr>\r\n </table>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"chat-ia-pensando\" *ngIf=\"consultando\">\r\n <span class=\"chat-ia-dot\"></span><span class=\"chat-ia-dot\"></span><span class=\"chat-ia-dot\"></span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"chips-chat-ia\">\r\n <span class=\"chip-chat-ia\" *ngFor=\"let chip of chipsSugeridos\"\r\n (click)=\"onClickEnviar(chip)\">{{ chip }}</span>\r\n </div>\r\n\r\n <div class=\"chat-ia-entrada\">\r\n <div class=\"chat-ia-caja-entrada\">\r\n <mat-icon fontSet=\"wm-menu-iconos\" class=\"chat-ia-expandir\" (click)=\"onClickExpandirBorrador()\">{{ borradorExpandido ? 'close_fullscreen' : 'open_in_full' }}</mat-icon>\r\n <textarea [rows]=\"filasBorrador\" [(ngModel)]=\"borrador\" (keydown.enter)=\"$event.preventDefault(); onClickEnviar()\"\r\n [class.chat-ia-textarea-expandido]=\"borradorExpandido\"\r\n placeholder=\"Escribe tu pregunta...\"></textarea>\r\n <div class=\"chat-ia-pie-entrada\">\r\n <button class=\"chat-ia-selector-modelo\" [matMenuTriggerFor]=\"menuModeloChatIA\" type=\"button\">\r\n <span *ngIf=\"proveedorSeleccionado === 'Gemini'\">Gemini</span>\r\n <span *ngIf=\"proveedorSeleccionado === 'Groq'\">Groq</span>\r\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M6 9l6 6 6-6\"></path>\r\n </svg>\r\n </button>\r\n <button class=\"chat-ia-microfono\" [class.chat-ia-microfono-activo]=\"escuchando\" *ngIf=\"micDisponible\"\r\n (click)=\"onClickMicrofono()\" type=\"button\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z\"></path>\r\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\"></path>\r\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"23\"></line>\r\n </svg>\r\n </button>\r\n <button class=\"chat-ia-enviar\" [disabled]=\"!borrador.trim() || consultando\" (click)=\"onClickEnviar()\" type=\"button\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 19V6\"></path>\r\n <path d=\"M5 13l7-7 7 7\"></path>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<mat-menu #menuModeloChatIA=\"matMenu\" class=\"menu-modelo-chat-ia\">\r\n <button mat-menu-item [class.opcion-activa]=\"proveedorSeleccionado === 'Gemini'\"\r\n (click)=\"proveedorSeleccionado = 'Gemini'\">\r\n <span>Gemini</span>\r\n <svg *ngIf=\"proveedorSeleccionado === 'Gemini'\" class=\"chat-ia-check\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M20 6L9 17l-5-5\"></path>\r\n </svg>\r\n </button>\r\n <button mat-menu-item [class.opcion-activa]=\"proveedorSeleccionado === 'Groq'\"\r\n (click)=\"proveedorSeleccionado = 'Groq'\">\r\n <span>Groq</span>\r\n <svg *ngIf=\"proveedorSeleccionado === 'Groq'\" class=\"chat-ia-check\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M20 6L9 17l-5-5\"></path>\r\n </svg>\r\n </button>\r\n</mat-menu>\r\n\r\n<!-- Modal \"ampliar\": muestra la tabla a todo el ancho de la pantalla (el panel la recorta). Overlay\r\n propio (no CDK) porque el componente se monta como web-component y el overlay de CDK queda fuera\r\n de su contexto de estilos. -->\r\n<div class=\"chat-ia-modal-overlay\" *ngIf=\"tablaAmpliada\" (click)=\"cerrarAmpliada()\">\r\n <div class=\"chat-ia-modal\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"chat-ia-modal-header\">\r\n <div class=\"chat-ia-modal-titulo\">{{ descripcionAmpliada || 'Resultados' }}</div>\r\n <div class=\"chat-ia-modal-acciones\">\r\n <button type=\"button\" class=\"chat-ia-accion chat-ia-accion-clara\" matTooltip=\"Copiar\"\r\n (click)=\"copiar(tablaAmpliada)\">\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n <button type=\"button\" class=\"chat-ia-accion chat-ia-accion-clara\" matTooltip=\"Exportar\"\r\n [matMenuTriggerFor]=\"menuExportModal\">\r\n <mat-icon>download</mat-icon>\r\n </button>\r\n <mat-menu #menuExportModal=\"matMenu\" class=\"menu-export-chat-ia\">\r\n <button mat-menu-item type=\"button\" (click)=\"exportarCsv(tablaAmpliada)\">CSV (.csv)</button>\r\n <button mat-menu-item type=\"button\" (click)=\"exportarXlsx(tablaAmpliada)\">Excel (.xlsx)</button>\r\n </mat-menu>\r\n <button type=\"button\" class=\"chat-ia-accion chat-ia-accion-clara\" matTooltip=\"Cerrar\"\r\n (click)=\"cerrarAmpliada()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"chat-ia-modal-tabla\">\r\n <table mat-table [dataSource]=\"tablaAmpliada\">\r\n <ng-container *ngFor=\"let columna of columnasDe(tablaAmpliada)\" [matColumnDef]=\"columna\">\r\n <th mat-header-cell *matHeaderCellDef>{{ columna }}</th>\r\n <td mat-cell *matCellDef=\"let fila\">{{ fila[columna] }}</td>\r\n </ng-container>\r\n <tr mat-header-row *matHeaderRowDef=\"columnasDe(tablaAmpliada)\"></tr>\r\n <tr mat-row *matRowDef=\"let fila; columns: columnasDe(tablaAmpliada);\"></tr>\r\n </table>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Aviso ef\u00EDmero tras copiar al portapapeles. -->\r\n<div class=\"chat-ia-copiado-aviso\" *ngIf=\"copiadoAviso\">Tabla copiada</div>\r\n",
222
+ styles: [":host{position:fixed;right:32px;bottom:32px;z-index:1000;font-family:Roboto,sans-serif}.chat-ia-panel{width:450px;height:650px;max-width:calc(100vw - 48px);max-height:calc(100vh - 96px);background:#fff;border-radius:18px;box-shadow:0 24px 60px rgba(20,25,30,.28);display:flex;flex-direction:column;overflow:hidden}.chat-ia-header{background:linear-gradient(135deg,#7c5ce0,#5f42bd);padding:16px 18px;display:flex;align-items:center;justify-content:space-between;flex-shrink:0}.chat-ia-header-info{display:flex;align-items:center;gap:10px;min-width:0}.chat-ia-header-icono{width:32px;height:32px;border-radius:50%;background:rgba(255,255,255,.22);display:flex;align-items:center;justify-content:center;flex:none}.chat-ia-titulo{color:#fff;font-size:14px;font-weight:500}.chat-ia-subtitulo{color:rgba(255,255,255,.75);font-size:11px;margin-top:1px}.chat-ia-cerrar{width:24px;height:24px;display:flex;align-items:center;justify-content:center;cursor:pointer;opacity:.85;flex:none}.chat-ia-cerrar:hover{opacity:1}.chat-ia-mensajes{flex:1;min-height:0;overflow-y:auto;display:flex;flex-direction:column;gap:12px;padding:16px;background:#fbfafc}.chat-ia-mensaje{display:flex}.chat-ia-mensaje .chat-ia-burbuja{max-width:88%;background:#f2eefb;color:#26313a;border-radius:14px 14px 14px 3px;padding:10px 13px;font-size:13px;line-height:1.5}.chat-ia-mensaje .chat-ia-burbuja-error{background:#fdecea;color:#7a1f14}.chat-ia-mensaje.chat-ia-mensaje-usuario{justify-content:flex-end}.chat-ia-mensaje.chat-ia-mensaje-usuario .chat-ia-burbuja{background:#7c5ce0;color:#fff;border-radius:14px 14px 3px}.chat-ia-bienvenida-texto{align-self:flex-start;max-width:88%;background:#f2eefb;color:#26313a;border-radius:14px 14px 14px 3px;padding:10px 13px;font-size:13px;line-height:1.5}.chips-chat-ia{flex:none;display:flex;flex-wrap:wrap;gap:6px;padding:0 16px 10px}.chip-chat-ia{border:1px solid #e7e2f5;background:#f2eefb;color:#5f42bd;border-radius:14px;padding:5px 10px;font-size:11px;cursor:pointer}.chip-chat-ia:hover{background:#e7ddfa}.chat-ia-descripcion{font-size:13px;line-height:1.5;margin-bottom:6px}.chat-ia-sin-resultados{color:#5a5a5a;font-style:italic}.chat-ia-stat{margin-top:4px}.chat-ia-stat-valor{font-size:30px;font-weight:600;color:#5f42bd;line-height:1.15;font-variant-numeric:proportional-nums}.chat-ia-lista-simple,.chat-ia-tabla-bloque{margin-top:4px;background:#fff;border-radius:10px;padding:8px 10px}.chat-ia-lista-simple{font-size:13px;line-height:1.5}.chat-ia-tabla-acciones{display:flex;justify-content:flex-end;align-items:center;gap:2px;margin-bottom:2px}.chat-ia-accion{width:26px;height:26px;border:none;background:0 0;color:#6b6478;border-radius:7px;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;padding:0;flex:none}.chat-ia-accion:hover{background:#f2eefb}.chat-ia-accion .mat-icon{font-size:17px;width:17px;height:17px;line-height:17px}.chat-ia-accion.chat-ia-accion-clara{color:rgba(255,255,255,.9)}.chat-ia-accion.chat-ia-accion-clara:hover{background:rgba(255,255,255,.18);color:#fff}.chat-ia-tabla-resultado{overflow-x:auto;max-width:100%}.chat-ia-tabla-resultado table{font-size:12px;background:0 0}.chat-ia-tabla-resultado th.mat-header-cell{color:#6b6478;font-weight:600;padding:0 14px 5px 0;border-bottom:1px solid #f0edf7;white-space:nowrap}.chat-ia-tabla-resultado td.mat-cell{padding:7px 14px 0 0;white-space:nowrap;font-variant-numeric:tabular-nums}.chat-ia-pensando{align-self:flex-start;background:#f2eefb;padding:12px 16px;border-radius:14px 14px 14px 3px;display:flex;gap:5px;flex-shrink:0}.chat-ia-dot{width:6px;height:6px;border-radius:50%;background:#9a93ae;-webkit-animation:1.1s ease-in-out infinite chatIaBlink;animation:1.1s ease-in-out infinite chatIaBlink}.chat-ia-dot:nth-child(2){-webkit-animation-delay:.15s;animation-delay:.15s}.chat-ia-dot:nth-child(3){-webkit-animation-delay:.3s;animation-delay:.3s}@-webkit-keyframes chatIaBlink{0%,100%,80%{opacity:.25}40%{opacity:1}}@keyframes chatIaBlink{0%,100%,80%{opacity:.25}40%{opacity:1}}.chat-ia-entrada{padding:10px 14px 14px;border-top:1px solid #e9f2ee;flex-shrink:0}.chat-ia-caja-entrada{position:relative;background:#f2f7f5;border:1px solid #e6efea;border-radius:18px;padding:10px 12px 8px}.chat-ia-caja-entrada textarea{border:none;outline:0;background:0 0;width:100%;font:inherit;font-size:13.5px;color:#26313a;resize:none;line-height:1.45;max-height:110px;overflow-y:auto;display:block;padding:0 28px 0 0}.chat-ia-caja-entrada textarea.chat-ia-textarea-expandido{max-height:160px}.chat-ia-caja-entrada textarea::-webkit-input-placeholder{color:#9a93ae}.chat-ia-caja-entrada textarea::-moz-placeholder{color:#9a93ae}.chat-ia-caja-entrada textarea:-ms-input-placeholder{color:#9a93ae}.chat-ia-caja-entrada textarea::-ms-input-placeholder{color:#9a93ae}.chat-ia-caja-entrada textarea::placeholder{color:#9a93ae}.chat-ia-expandir{position:absolute;top:8px;right:10px;font-size:17px;height:17px;width:17px;color:#9a9a9a;cursor:pointer}.chat-ia-pie-entrada{display:flex;align-items:center;justify-content:flex-end;gap:8px;margin-top:8px}.chat-ia-selector-modelo{display:inline-flex;align-items:center;gap:4px;border:none;background:0 0;color:#4e5d57;border-radius:14px;padding:5px 9px;font-size:11.5px;font-weight:600;cursor:pointer}.chat-ia-enviar{width:32px;height:32px;border-radius:50%;border:none;background:#7c5ce0;color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;flex:none}.chat-ia-enviar:disabled{background:#dce6e1;color:#a9bab3;cursor:default}.chat-ia-microfono{width:28px;height:28px;border-radius:50%;border:none;background:0 0;color:#6b6478;display:flex;align-items:center;justify-content:center;cursor:pointer;flex:none}.chat-ia-microfono:hover{background:#f2eefb}.chat-ia-microfono.chat-ia-microfono-activo{color:#fff;background:#e05a5a;-webkit-animation:1.1s ease-in-out infinite chatIaBlink;animation:1.1s ease-in-out infinite chatIaBlink}::ng-deep .mat-menu-panel.menu-modelo-chat-ia{min-width:132px;border:1px solid #e6efea;border-radius:10px;box-shadow:0 12px 26px rgba(20,25,30,.16)}::ng-deep .mat-menu-panel.menu-modelo-chat-ia .mat-menu-content{padding:4px}::ng-deep .mat-menu-panel.menu-modelo-chat-ia .mat-menu-item{display:flex;align-items:center;justify-content:space-between;gap:8px;height:auto;line-height:normal;padding:7px 10px;font-size:12px;color:#26313a;border-radius:7px}::ng-deep .mat-menu-panel.menu-modelo-chat-ia .mat-menu-item.opcion-activa{background:#f2f7f5}::ng-deep .mat-menu-panel.menu-modelo-chat-ia .mat-menu-item .chat-ia-check{color:#7c5ce0}.chat-ia-modal-overlay{position:fixed;inset:0;background:rgba(20,25,30,.5);display:flex;align-items:center;justify-content:center;padding:24px;z-index:1100}.chat-ia-modal{background:#fff;border-radius:16px;box-shadow:0 24px 60px rgba(20,25,30,.32);width:auto;max-width:92vw;max-height:86vh;display:flex;flex-direction:column;overflow:hidden}.chat-ia-modal-header{background:linear-gradient(135deg,#7c5ce0,#5f42bd);padding:12px 16px;display:flex;align-items:center;justify-content:space-between;gap:16px;flex-shrink:0}.chat-ia-modal-titulo{color:#fff;font-size:14px;font-weight:500;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chat-ia-modal-acciones{display:flex;align-items:center;gap:2px;flex:none}.chat-ia-modal-tabla{flex:1;min-height:0;overflow:auto;padding:10px 16px 16px}.chat-ia-modal-tabla table{font-size:13px;background:0 0;width:100%}.chat-ia-modal-tabla th.mat-header-cell{color:#6b6478;font-weight:600;padding:0 18px 8px 0;border-bottom:1px solid #f0edf7;white-space:nowrap}.chat-ia-modal-tabla td.mat-cell{padding:9px 18px 9px 0;white-space:nowrap;color:#26313a;border-bottom:1px solid #f6f4fb;font-variant-numeric:tabular-nums}.chat-ia-copiado-aviso{position:fixed;top:24px;left:50%;transform:translateX(-50%);background:#26313a;color:#fff;font-size:12.5px;padding:8px 16px;border-radius:20px;box-shadow:0 8px 20px rgba(20,25,30,.25);z-index:1200;-webkit-animation:.15s ease-out chatIaAvisoEntrada;animation:.15s ease-out chatIaAvisoEntrada}@-webkit-keyframes chatIaAvisoEntrada{from{opacity:0;transform:translate(-50%,-6px)}to{opacity:1;transform:translate(-50%,0)}}@keyframes chatIaAvisoEntrada{from{opacity:0;transform:translate(-50%,-6px)}to{opacity:1;transform:translate(-50%,0)}}::ng-deep .mat-menu-panel.menu-export-chat-ia{min-width:132px;border:1px solid #e6efea;border-radius:10px;box-shadow:0 12px 26px rgba(20,25,30,.16)}::ng-deep .mat-menu-panel.menu-export-chat-ia .mat-menu-content{padding:4px}::ng-deep .mat-menu-panel.menu-export-chat-ia .mat-menu-item{height:auto;line-height:normal;padding:8px 12px;font-size:12px;color:#26313a;border-radius:7px}::ng-deep .mat-menu-panel.menu-export-chat-ia .mat-menu-item:hover{background:#f2f7f5}"]
175
223
  })
176
224
  ], AsistenteDatosComponent);
177
225
  export { AsistenteDatosComponent };
178
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpc3RlbnRlLWRhdG9zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL3dtLW1lbnUvIiwic291cmNlcyI6WyJsaWIvd20tbWVudS9hc2lzdGVudGUtZGF0b3MvYXNpc3RlbnRlLWRhdG9zLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFnQnpFLElBQWEsdUJBQXVCLEdBQXBDLE1BQWEsdUJBQXVCO0lBd0NoQyxZQUNZLHdCQUFrRCxFQUNsRCxpQkFBMkM7UUFEM0MsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQUNsRCxzQkFBaUIsR0FBakIsaUJBQWlCLENBQTBCO1FBdkN2RCwwRkFBMEY7UUFDMUYscUZBQXFGO1FBQzVFLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFTekIseURBQXlEO1FBQ2hELFdBQU0sR0FBRyxPQUFPLENBQUM7UUFFaEIsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRTNDLGFBQVEsR0FBNEIsRUFBRSxDQUFDO1FBQ3ZDLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFDckIsOEZBQThGO1FBQzlGLGtHQUFrRztRQUMzRixzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDMUIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDM0IsbUZBQW1GO1FBQ25GLDJDQUEyQztRQUNwQywwQkFBcUIsR0FBc0IsUUFBUSxDQUFDO1FBQzNELHNGQUFzRjtRQUMvRSxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBRTFCLHNGQUFzRjtRQUN0RixnR0FBZ0c7UUFDaEcsNkNBQTZDO1FBQ3RDLG1CQUFjLEdBQWE7WUFDOUIsNENB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QWtCO0FBRWhCO0lBQVQsTUFBTSxFQUFFOzZEQUF5QztBQWpCekMsdUJBQXVCO0lBTG5DLFNBQVMsQ0FBQztRQUNQLFFBQVEsRUFBRSxvQkFBb0I7UUFDOUIsMmxPQUErQzs7S0FFbEQsQ0FBQztHQUNXLHVCQUF1QixDQXlLbkM7U0F6S1ksdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBSZWNvbm9jaW1pZW50b1ZvelNlcnZpY2UgfSBmcm9tICcuL3JlY29ub2NpbWllbnRvLXZvei5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXNpc3RlbnRlRGF0b3NBcGlTZXJ2aWNlIH0gZnJvbSAnLi9hc2lzdGVudGUtZGF0b3MtYXBpLnNlcnZpY2UnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBNZW5zYWplQXNpc3RlbnRlRGF0b3Mge1xyXG4gICAgZGVVc3VhcmlvOiBib29sZWFuO1xyXG4gICAgdGV4dG8/OiBzdHJpbmc7XHJcbiAgICBkZXNjcmlwY2lvbj86IHN0cmluZztcclxuICAgIHJlc3VsdGFkbz86IGFueVtdO1xyXG4gICAgcHJvdmVlZG9yPzogc3RyaW5nO1xyXG4gICAgZXNFcnJvcj86IGJvb2xlYW47XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICd3bS1hc2lzdGVudGUtZGF0b3MnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2FzaXN0ZW50ZS1kYXRvcy5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9hc2lzdGVudGUtZGF0b3MuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEFzaXN0ZW50ZURhdG9zQ29tcG9uZW50IHtcclxuICAgIEBWaWV3Q2hpbGQoJ21lbnNhamVzQ29udGFpbmVyJykgcHJpdmF0ZSBtZW5zYWplc0NvbnRhaW5lcj86IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xyXG5cclxuICAgIC8vIExhIGFwZXJ0dXJhL2NpZXJyZSBkZWwgcGFuZWwgbGEgY29udHJvbGEgZWwgcGFkcmUgKGVsIG1lbsO6KS4gRWwgcGFuZWwgc29sbyBzZSByZW5kZXJpemFcclxuICAgIC8vIGN1YW5kbyBgYWJpZXJ0b2AgZXMgdHJ1ZSB5IGF2aXNhLCB2w61hIGBjZXJyYXJDaGFuZ2VgLCBjdWFuZG8gZWwgdXN1YXJpbyB0b2NhIGxhIFguXHJcbiAgICBASW5wdXQoKSBhYmllcnRvID0gZmFsc2U7XHJcblxyXG4gICAgLy8gVVJMIGRlbCBQT1NUIGRlIGNvbnN1bHRhLiBTZSByZWZsZWphIGVuIGVsIGFwaSBzZXJ2aWNlIChwcm9waWVkYWQgYHVybGApLCBxdWUgZXMgZG9uZGUgc2UgdXNhLlxyXG4gICAgQElucHV0KCkgc2V0IHVybENvbnN1bHRhcih2YWxvcjogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHZhbG9yKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXNpc3RlbnRlRGF0b3NBcGlTZXJ2aWNlLnVybCA9IHZhbG9yO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBJZGlvbWEgcGFyYSBlbCByZWNvbm9jaW1pZW50byBkZSB2b3ogKFdlYiBTcGVlY2ggQVBJKS5cclxuICAgIEBJbnB1dCgpIGlkaW9tYSA9ICdlcy1DTyc7XHJcblxyXG4gICAgQE91dHB1dCgpIGNlcnJhckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgICBwdWJsaWMgbWVuc2FqZXM6IE1lbnNhamVBc2lzdGVudGVEYXRvc1tdID0gW107XHJcbiAgICBwdWJsaWMgYm9ycmFkb3IgPSAnJztcclxuICAgIC8vIEFsdGVybmEgZWwgYWx0byBkZSBsYSBjYWphIGRlbCBtZW5zYWplIChjb21wYWN0YSDihpQgZXhwYW5kaWRhKSwgaWd1YWwgcXVlIGVsIFwicGVkaXIgY2FtYmlvc1wiXHJcbiAgICAvLyBkZWwgYXNpc3RlbnRlIGRlIElBIGRlbCBnZW5lcmFkb3IgZGUgZm9ybXVsYXJpb3MgKHZlciBmaWxhc0JvcnJhZG9yIC8gb25DbGlja0V4cGFuZGlyQm9ycmFkb3IpLlxyXG4gICAgcHVibGljIGJvcnJhZG9yRXhwYW5kaWRvID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgY29uc3VsdGFuZG8gPSBmYWxzZTtcclxuICAgIC8vIFwiR2VtaW5pXCIgbyBcIkdyb3FcIiDigJQgbWlzbW8gc2VsZWN0b3IgcXVlIGVsIGFzaXN0ZW50ZSBkZSBnZW5lcmFjacOzbiBkZSBmb3JtdWxhcmlvc1xyXG4gICAgLy8gKHZlciBQcm92ZWVkb3JJQVNlcnZpY2lvIGVuIGVsIGJhY2tlbmQpLlxyXG4gICAgcHVibGljIHByb3ZlZWRvclNlbGVjY2lvbmFkbzogJ0dlbWluaScgfCAnR3JvcScgPSAnR2VtaW5pJztcclxuICAgIC8vIERpY3RhZG8gcG9yIHZveiAoV2ViIFNwZWVjaCBBUEkpIOKAlCBzaW4gc29wb3J0ZSBlbiBGaXJlZm94LCBpbmNvbnNpc3RlbnRlIGVuIFNhZmFyaS5cclxuICAgIHB1YmxpYyBlc2N1Y2hhbmRvID0gZmFsc2U7XHJcblxyXG4gICAgLy8gUHJlZ3VudGFzIHlhIHZlcmlmaWNhZGFzIGNvbW8gcmVzcG9uZGlibGVzIGhveSAod2hpdGVsaXN0ICsgY29udHJhdG8gZGUgbGEgSUEg4oCUIHZlclxyXG4gICAgLy8gQ2hhdENvbnN1bHRhV2hpdGVsaXN0U2VydmljaW8vQ2hhdENvbnN1bHRhUHJvbXB0U2VydmljaW8gZW4gZWwgYmFja2VuZCksIG1vc3RyYWRhcyBjb21vIGNoaXBzXHJcbiAgICAvLyBkZSBzdWdlcmVuY2lhIGVuIGVsIGVzdGFkbyB2YWPDrW8gZGVsIGNoYXQuXHJcbiAgICBwdWJsaWMgY2hpcHNTdWdlcmlkb3M6IHN0cmluZ1tdID0gW1xyXG4gICAgICAgICfCv0N1w6FudG9zIGZvcm11bGFyaW9zIHNlIGRpbGlnZW5jaWFyb24gaG95PycsXHJcbiAgICAgICAgJ8K/Q3XDoW50b3MgZm9ybXVsYXJpb3Mgc2UgZGlsaWdlbmNpYXJvbiBlc3RhIHNlbWFuYT8nLFxyXG4gICAgICAgICdNdcOpc3RyYW1lIGxvcyDDumx0aW1vcyAxMCBmb3JtdWxhcmlvcyBkaWxpZ2VuY2lhZG9zJyxcclxuICAgIF07XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBhc2lzdGVudGVEYXRvc0FwaVNlcnZpY2U6IEFzaXN0ZW50ZURhdG9zQXBpU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHJlY29ub2NpbWllbnRvVm96OiBSZWNvbm9jaW1pZW50b1ZvelNlcnZpY2VcclxuICAgICkge31cclxuXHJcbiAgICAvLyBFbCBwYWRyZSBhYnJlL2NpZXJyYSBlbCBwYW5lbDsgYXF1w60gc29sbyBzZSBhdmlzYSBxdWUgZWwgdXN1YXJpbyBwaWRpw7MgY2VycmFybG8gKGJvdMOzbiBYKS5cclxuICAgIGNlcnJhcigpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNlcnJhckNoYW5nZS5lbWl0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2FqYSBkZWwgbWVuc2FqZSBjb21wYWN0YSAoMSBmaWxhLCBjb21vIGVyYSBlbCBjaGF0IG9yaWdpbmFsbWVudGUpIOKGlCBleHBhbmRpZGEgKDYgZmlsYXMpLlxyXG4gICAgLy8gRWwgYm90w7NuIGRlIGV4cGFuZGlyIGVzIGVsIG1pc21vIHBhdHLDs24gZGVsIFwicGVkaXIgY2FtYmlvc1wiIGRlbCBnZW5lcmFkb3IuXHJcbiAgICBnZXQgZmlsYXNCb3JyYWRvcigpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmJvcnJhZG9yRXhwYW5kaWRvID8gNiA6IDE7XHJcbiAgICB9XHJcblxyXG4gICAgb25DbGlja0V4cGFuZGlyQm9ycmFkb3IoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5ib3JyYWRvckV4cGFuZGlkbyA9ICF0aGlzLmJvcnJhZG9yRXhwYW5kaWRvO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBtaWNEaXNwb25pYmxlKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlY29ub2NpbWllbnRvVm96LmVzdGFTb3BvcnRhZG8oKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrTWljcm9mb25vKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmVzY3VjaGFuZG8pIHtcclxuICAgICAgICAgICAgdGhpcy5yZWNvbm9jaW1pZW50b1Zvei5kZXRlbmVyKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZXNjdWNoYW5kbyA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMucmVjb25vY2ltaWVudG9Wb3ouZXN0YVNvcG9ydGFkbygpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEVsIHJlc3VsdGFkbyBkZWwgcmVjb25vY2ltaWVudG8gbm8gaW5jbHV5ZSBsbyBxdWUgeWEgZXN0YWJhIGVzY3JpdG8g4oCUIHNlIGd1YXJkYSBhbnRlcyBkZVxyXG4gICAgICAgIC8vIGVtcGV6YXIgeSBzZSBhbnRlcG9uZSBlbiBjYWRhIGFjdHVhbGl6YWNpw7NuIChxdWUgbGxlZ2EgY29uIGxhIHRyYW5zY3JpcGNpw7NuIENPTVBMRVRBIGRlXHJcbiAgICAgICAgLy8gZXN0YSBzZXNpw7NuIGRlIGVzY3VjaGEsIG5vIHVuIGluY3JlbWVudG8pIHBhcmEgbm8gcGVyZGVyIGxvIHF1ZSB5YSBoYWLDrWEgZW4gZWwgY2FtcG8uXHJcbiAgICAgICAgY29uc3QgdGV4dG9QcmV2aW8gPSB0aGlzLmJvcnJhZG9yLnRyaW0oKTtcclxuICAgICAgICB0aGlzLmVzY3VjaGFuZG8gPSB0cnVlO1xyXG4gICAgICAgIHRoaXMucmVjb25vY2ltaWVudG9Wb3ouaW5pY2lhcihcclxuICAgICAgICAgICAgdGhpcy5pZGlvbWEsXHJcbiAgICAgICAgICAgICh0ZXh0bykgPT4gKHRoaXMuYm9ycmFkb3IgPSB0ZXh0b1ByZXZpbyA/IGAke3RleHRvUHJldmlvfSAke3RleHRvfWAgOiB0ZXh0byksXHJcbiAgICAgICAgICAgICgpID0+ICh0aGlzLmVzY3VjaGFuZG8gPSBmYWxzZSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2xpY2tFbnZpYXIodGV4dG9QcmVzZXQ/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBwcmVndW50YSA9ICh0ZXh0b1ByZXNldCA/PyB0aGlzLmJvcnJhZG9yKS50cmltKCk7XHJcbiAgICAgICAgaWYgKCFwcmVndW50YSB8fCB0aGlzLmNvbnN1bHRhbmRvKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubWVuc2FqZXMucHVzaCh7IGRlVXN1YXJpbzogdHJ1ZSwgdGV4dG86IHByZWd1bnRhIH0pO1xyXG4gICAgICAgIHRoaXMuYm9ycmFkb3IgPSAnJztcclxuXHJcbiAgICAgICAgLy8gU2luIHVybCBkZSBjb25zdWx0YSBubyBzZSBoYWNlIGxhIHBldGljacOzbjogZWwgdXN1YXJpbyB2ZSBlbCBtaXNtbyBlcnJvciBnZW7DqXJpY28gcXVlXHJcbiAgICAgICAgLy8gY3VhbmRvIGxhIEFQSSBmYWxsYS5cclxuICAgICAgICBpZiAoIXRoaXMuYXNpc3RlbnRlRGF0b3NBcGlTZXJ2aWNlLnVybCkge1xyXG4gICAgICAgICAgICB0aGlzLm1lbnNhamVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgZGVVc3VhcmlvOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHRleHRvOiAnTm8gc2UgcHVkbyBwcm9jZXNhciBsYSBjb25zdWx0YS4nLFxyXG4gICAgICAgICAgICAgICAgZXNFcnJvcjogdHJ1ZSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQWxGaW5hbCgpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNvbnN1bHRhbmRvID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNjcm9sbEFsRmluYWwoKTtcclxuXHJcbiAgICAgICAgdGhpcy5hc2lzdGVudGVEYXRvc0FwaVNlcnZpY2UuY29uc3VsdGFyKHByZWd1bnRhLCB0aGlzLnByb3ZlZWRvclNlbGVjY2lvbmFkbykuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgLy8gRWwgdGlwbyAoUmVzcHVlc3RhQXNpc3RlbnRlRGF0b3MpIHNlIGluZmllcmUgZGVsIE9ic2VydmFibGU6IGltcG9ydGFyIGxhIGludGVyZmF6XHJcbiAgICAgICAgICAgIC8vIGRlamFiYSB1biBpbXBvcnQgYSB1biBzw61tYm9sbyBpbmV4aXN0ZW50ZSBlbiBlbCBKUyBkZSBsYSBsaWJyZXLDrWEgKGF2aXNvIGRlIHJvbGx1cCkuXHJcbiAgICAgICAgICAgIG5leHQ6IChyZXNwdWVzdGEpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29uc3VsdGFuZG8gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVuc2FqZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVVc3VhcmlvOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwY2lvbjogcmVzcHVlc3RhLkRlc2NyaXBjaW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdGFkbzogcmVzcHVlc3RhLlJlc3VsdGFkbyA/PyBbXSxcclxuICAgICAgICAgICAgICAgICAgICBwcm92ZWVkb3I6IHJlc3B1ZXN0YS5Qcm92ZWVkb3IsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsQWxGaW5hbCgpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnN1bHRhbmRvID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lbnNhamVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIGRlVXN1YXJpbzogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgdGV4dG86IGVycm9yPy5NZW5zYWplIHx8ICdObyBzZSBwdWRvIHByb2Nlc2FyIGxhIGNvbnN1bHRhLicsXHJcbiAgICAgICAgICAgICAgICAgICAgZXNFcnJvcjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxBbEZpbmFsKCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRWwgbnVldm8gbWVuc2FqZSByZWNpw6luIHNlIHJlZmxlamEgZW4gZWwgRE9NIGRlc3B1w6lzIGRlbCBzaWd1aWVudGUgY2ljbG8gZGUgZGV0ZWNjacOzbiBkZVxyXG4gICAgLy8gY2FtYmlvcyDigJQgcG9yIGVzbyBlbCBzY3JvbGxUb3Agc2UgYWp1c3RhIGVuIHVuIHNldFRpbWVvdXQoMCksIG5vIGlubWVkaWF0YW1lbnRlIGRlc3B1w6lzIGRlbFxyXG4gICAgLy8gcHVzaCwgcGFyYSBxdWUgc2Nyb2xsSGVpZ2h0IHlhIGluY2x1eWEgZWwgbWVuc2FqZSBhZ3JlZ2Fkby5cclxuICAgIHByaXZhdGUgc2Nyb2xsQWxGaW5hbCgpOiB2b2lkIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudG8gPSB0aGlzLm1lbnNhamVzQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgICAgICBpZiAoZWxlbWVudG8pIHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnRvLnNjcm9sbFRvcCA9IGVsZW1lbnRvLnNjcm9sbEhlaWdodDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbHVtbmFzRGUocmVzdWx0YWRvOiBhbnlbXSk6IHN0cmluZ1tdIHtcclxuICAgICAgICByZXR1cm4gcmVzdWx0YWRvLmxlbmd0aCA/IE9iamVjdC5rZXlzKHJlc3VsdGFkb1swXSkgOiBbXTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBFbCBiYWNrZW5kIGRldnVlbHZlIHVuIGNvbnRlbyAoQ2hhdENvbnN1bHRhSUFTZXJ2aWNpby5FamVjdXRhckNvbnRlbykgY29tbyB1bmEgc29sYSBmaWxhIGNvblxyXG4gICAgLy8gdW5hIHNvbGEgY29sdW1uYSBsbGFtYWRhIGxpdGVyYWxtZW50ZSBcIlJlc3VsdGFkb1wiIOKAlCBzZSBtdWVzdHJhIGNvbW8gbsO6bWVybyBncmFuZGUgZW4gdmV6IGRlXHJcbiAgICAvLyBjb21vIHRhYmxhIGRlIHVuYSBjZWxkYS5cclxuICAgIGVzQ29udGVvKHJlc3VsdGFkbzogYW55W10pOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gcmVzdWx0YWRvPy5sZW5ndGggPT09IDEgJiYgT2JqZWN0LmtleXMocmVzdWx0YWRvWzBdKS5sZW5ndGggPT09IDEgJiYgJ1Jlc3VsdGFkbycgaW4gcmVzdWx0YWRvWzBdO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIExpc3RhZG8gY29uIHVuYSBzb2xhIGNvbHVtbmEgKGVqLiB1bmEgbGlzdGEgZGUgbm9tYnJlcy9pZHMpIOKAlCBzZSBtdWVzdHJhIGNvbW8gdGV4dG8gc2ltcGxlXHJcbiAgICAvLyBlbiB2ZXogZGUgdW5hIHRhYmxhIGRlIHVuYSBzb2xhIGNvbHVtbmEgcmVwZXRpZGEuXHJcbiAgICBlc0xpc3RhU2ltcGxlKHJlc3VsdGFkbzogYW55W10pOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gcmVzdWx0YWRvPy5sZW5ndGggPiAwICYmICF0aGlzLmVzQ29udGVvKHJlc3VsdGFkbykgJiYgdGhpcy5jb2x1bW5hc0RlKHJlc3VsdGFkbykubGVuZ3RoID09PSAxO1xyXG4gICAgfVxyXG5cclxuICAgIHRleHRvTGlzdGFTaW1wbGUocmVzdWx0YWRvOiBhbnlbXSk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgY29sdW1uYSA9IHRoaXMuY29sdW1uYXNEZShyZXN1bHRhZG8pWzBdO1xyXG4gICAgICAgIHJldHVybiByZXN1bHRhZG8ubWFwKChmaWxhKSA9PiBmaWxhW2NvbHVtbmFdKS5qb2luKCcsICcpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
226
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpc3RlbnRlLWRhdG9zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL3dtLW1lbnUvIiwic291cmNlcyI6WyJsaWIvd20tbWVudS9hc2lzdGVudGUtZGF0b3MvYXNpc3RlbnRlLWRhdG9zLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDekUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFnQjVELElBQWEsdUJBQXVCLEdBQXBDLE1BQWEsdUJBQXVCO0lBK0NoQyxZQUNZLHdCQUFrRCxFQUNsRCxpQkFBMkMsRUFDM0MsV0FBK0I7UUFGL0IsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQUNsRCxzQkFBaUIsR0FBakIsaUJBQWlCLENBQTBCO1FBQzNDLGdCQUFXLEdBQVgsV0FBVyxDQUFvQjtRQS9DM0MsMEZBQTBGO1FBQzFGLHFGQUFxRjtRQUM1RSxZQUFPLEdBQUcsS0FBSyxDQUFDO1FBU3pCLHlEQUF5RDtRQUNoRCxXQUFNLEdBQUcsT0FBTyxDQUFDO1FBRWhCLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUUzQyxhQUFRLEdBQTRCLEVBQUUsQ0FBQztRQUN2QyxhQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLDhGQUE4RjtRQUM5RixrR0FBa0c7UUFDM0Ysc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQzFCLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBQzNCLG1GQUFtRjtRQUNuRiwyQ0FBMkM7UUFDcEMsMEJBQXFCLEdBQXNCLFFBQVEsQ0FBQztRQUMzRCxzRkFBc0Y7UUFDL0Us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USxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN0RCxPQUFPLENBQ0gsa0JBQWtCO1lBQ2xCLEtBQUssQ0FBQyxXQUFXLEVBQUU7WUFDbkIsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDekIsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNwQixHQUFHO1lBQ0gsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNyQixHQUFHLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQzFCLENBQUM7SUFDTixDQUFDO0NBQ0osQ0FBQTs7WUE5S3lDLHdCQUF3QjtZQUMvQix3QkFBd0I7WUFDOUIsa0JBQWtCOztBQWpEWDtJQUEvQixTQUFTLENBQUMsbUJBQW1CLENBQUM7a0VBQXdEO0FBSTlFO0lBQVIsS0FBSyxFQUFFO3dEQUFpQjtBQUdoQjtJQUFSLEtBQUssRUFBRTsyREFJUDtBQUdRO0lBQVIsS0FBSyxFQUFFO3VEQUFrQjtBQUVoQjtJQUFULE1BQU0sRUFBRTs2REFBeUM7QUFqQnpDLHVCQUF1QjtJQUxuQyxTQUFTLENBQUM7UUFDUCxRQUFRLEVBQUUsb0JBQW9CO1FBQzlCLDBwV0FBK0M7O0tBRWxELENBQUM7R0FDVyx1QkFBdUIsQ0E4Tm5DO1NBOU5ZLHVCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUmVjb25vY2ltaWVudG9Wb3pTZXJ2aWNlIH0gZnJvbSAnLi9yZWNvbm9jaW1pZW50by12b3ouc2VydmljZSc7XHJcbmltcG9ydCB7IEFzaXN0ZW50ZURhdG9zQXBpU2VydmljZSB9IGZyb20gJy4vYXNpc3RlbnRlLWRhdG9zLWFwaS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVGFibGFFeHBvcnRTZXJ2aWNlIH0gZnJvbSAnLi90YWJsYS1leHBvcnQuc2VydmljZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE1lbnNhamVBc2lzdGVudGVEYXRvcyB7XHJcbiAgICBkZVVzdWFyaW86IGJvb2xlYW47XHJcbiAgICB0ZXh0bz86IHN0cmluZztcclxuICAgIGRlc2NyaXBjaW9uPzogc3RyaW5nO1xyXG4gICAgcmVzdWx0YWRvPzogYW55W107XHJcbiAgICBwcm92ZWVkb3I/OiBzdHJpbmc7XHJcbiAgICBlc0Vycm9yPzogYm9vbGVhbjtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3dtLWFzaXN0ZW50ZS1kYXRvcycsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vYXNpc3RlbnRlLWRhdG9zLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2FzaXN0ZW50ZS1kYXRvcy5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXNpc3RlbnRlRGF0b3NDb21wb25lbnQge1xyXG4gICAgQFZpZXdDaGlsZCgnbWVuc2FqZXNDb250YWluZXInKSBwcml2YXRlIG1lbnNhamVzQ29udGFpbmVyPzogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XHJcblxyXG4gICAgLy8gTGEgYXBlcnR1cmEvY2llcnJlIGRlbCBwYW5lbCBsYSBjb250cm9sYSBlbCBwYWRyZSAoZWwgbWVuw7opLiBFbCBwYW5lbCBzb2xvIHNlIHJlbmRlcml6YVxyXG4gICAgLy8gY3VhbmRvIGBhYmllcnRvYCBlcyB0cnVlIHkgYXZpc2EsIHbDrWEgYGNlcnJhckNoYW5nZWAsIGN1YW5kbyBlbCB1c3VhcmlvIHRvY2EgbGEgWC5cclxuICAgIEBJbnB1dCgpIGFiaWVydG8gPSBmYWxzZTtcclxuXHJcbiAgICAvLyBVUkwgZGVsIFBPU1QgZGUgY29uc3VsdGEuIFNlIHJlZmxlamEgZW4gZWwgYXBpIHNlcnZpY2UgKHByb3BpZWRhZCBgdXJsYCksIHF1ZSBlcyBkb25kZSBzZSB1c2EuXHJcbiAgICBASW5wdXQoKSBzZXQgdXJsQ29uc3VsdGFyKHZhbG9yOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAodmFsb3IpIHtcclxuICAgICAgICAgICAgdGhpcy5hc2lzdGVudGVEYXRvc0FwaVNlcnZpY2UudXJsID0gdmFsb3I7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIElkaW9tYSBwYXJhIGVsIHJlY29ub2NpbWllbnRvIGRlIHZveiAoV2ViIFNwZWVjaCBBUEkpLlxyXG4gICAgQElucHV0KCkgaWRpb21hID0gJ2VzLUNPJztcclxuXHJcbiAgICBAT3V0cHV0KCkgY2VycmFyQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAgIHB1YmxpYyBtZW5zYWplczogTWVuc2FqZUFzaXN0ZW50ZURhdG9zW10gPSBbXTtcclxuICAgIHB1YmxpYyBib3JyYWRvciA9ICcnO1xyXG4gICAgLy8gQWx0ZXJuYSBlbCBhbHRvIGRlIGxhIGNhamEgZGVsIG1lbnNhamUgKGNvbXBhY3RhIOKGlCBleHBhbmRpZGEpLCBpZ3VhbCBxdWUgZWwgXCJwZWRpciBjYW1iaW9zXCJcclxuICAgIC8vIGRlbCBhc2lzdGVudGUgZGUgSUEgZGVsIGdlbmVyYWRvciBkZSBmb3JtdWxhcmlvcyAodmVyIGZpbGFzQm9ycmFkb3IgLyBvbkNsaWNrRXhwYW5kaXJCb3JyYWRvcikuXHJcbiAgICBwdWJsaWMgYm9ycmFkb3JFeHBhbmRpZG8gPSBmYWxzZTtcclxuICAgIHB1YmxpYyBjb25zdWx0YW5kbyA9IGZhbHNlO1xyXG4gICAgLy8gXCJHZW1pbmlcIiBvIFwiR3JvcVwiIOKAlCBtaXNtbyBzZWxlY3RvciBxdWUgZWwgYXNpc3RlbnRlIGRlIGdlbmVyYWNpw7NuIGRlIGZvcm11bGFyaW9zXHJcbiAgICAvLyAodmVyIFByb3ZlZWRvcklBU2VydmljaW8gZW4gZWwgYmFja2VuZCkuXHJcbiAgICBwdWJsaWMgcHJvdmVlZG9yU2VsZWNjaW9uYWRvOiAnR2VtaW5pJyB8ICdHcm9xJyA9ICdHZW1pbmknO1xyXG4gICAgLy8gRGljdGFkbyBwb3Igdm96IChXZWIgU3BlZWNoIEFQSSkg4oCUIHNpbiBzb3BvcnRlIGVuIEZpcmVmb3gsIGluY29uc2lzdGVudGUgZW4gU2FmYXJpLlxyXG4gICAgcHVibGljIGVzY3VjaGFuZG8gPSBmYWxzZTtcclxuXHJcbiAgICAvLyBUYWJsYSBhYmllcnRhIGVuIGVsIG1vZGFsIFwiYW1wbGlhclwiIChudWxsID0gbW9kYWwgY2VycmFkbykuIEVsIHBhbmVsIGRlbCBjaGF0IGVzIGFuZ29zdG8geVxyXG4gICAgLy8gcmVjb3J0YSBsYXMgY29sdW1uYXM7IGVsIG1vZGFsIG11ZXN0cmEgbGEgbWlzbWEgdGFibGEgYSB0b2RvIGVsIGFuY2hvIGRlIGxhIHBhbnRhbGxhLlxyXG4gICAgcHVibGljIHRhYmxhQW1wbGlhZGE6IGFueVtdIHwgbnVsbCA9IG51bGw7XHJcbiAgICBwdWJsaWMgZGVzY3JpcGNpb25BbXBsaWFkYSA9ICcnO1xyXG4gICAgLy8gQXZpc28gZWbDrW1lcm8gXCJUYWJsYSBjb3BpYWRhXCIgdHJhcyBjb3BpYXIgYWwgcG9ydGFwYXBlbGVzLlxyXG4gICAgcHVibGljIGNvcGlhZG9BdmlzbyA9IGZhbHNlO1xyXG5cclxuICAgIC8vIFByZWd1bnRhcyB5YSB2ZXJpZmljYWRhcyBjb21vIHJlc3BvbmRpYmxlcyBob3kgKHdoaXRlbGlzdCArIGNvbnRyYXRvIGRlIGxhIElBIOKAlCB2ZXJcclxuICAgIC8vIENoYXRDb25zdWx0YVdoaXRlbGlzdFNlcnZpY2lvL0NoYXRDb25zdWx0YVByb21wdFNlcnZpY2lvIGVuIGVsIGJhY2tlbmQpLCBtb3N0cmFkYXMgY29tbyBjaGlwc1xyXG4gICAgLy8gZGUgc3VnZXJlbmNpYSBlbiBlbCBlc3RhZG8gdmFjw61vIGRlbCBjaGF0LlxyXG4gICAgcHVibGljIGNoaXBzU3VnZXJpZG9zOiBzdHJpbmdbXSA9IFtcclxuICAgICAgICAnwr9DdcOhbnRvcyBmb3JtdWxhcmlvcyBzZSBkaWxpZ2VuY2lhcm9uIGhveT8nLFxyXG4gICAgICAgICfCv0N1w6FudG9zIGZvcm11bGFyaW9zIHNlIGRpbGlnZW5jaWFyb24gZXN0YSBzZW1hbmE/JyxcclxuICAgICAgICAnTXXDqXN0cmFtZSBsb3Mgw7psdGltb3MgMTAgZm9ybXVsYXJpb3MgZGlsaWdlbmNpYWRvcycsXHJcbiAgICBdO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgYXNpc3RlbnRlRGF0b3NBcGlTZXJ2aWNlOiBBc2lzdGVudGVEYXRvc0FwaVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSByZWNvbm9jaW1pZW50b1ZvejogUmVjb25vY2ltaWVudG9Wb3pTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgdGFibGFFeHBvcnQ6IFRhYmxhRXhwb3J0U2VydmljZVxyXG4gICAgKSB7fVxyXG5cclxuICAgIC8vIEVsIHBhZHJlIGFicmUvY2llcnJhIGVsIHBhbmVsOyBhcXXDrSBzb2xvIHNlIGF2aXNhIHF1ZSBlbCB1c3VhcmlvIHBpZGnDsyBjZXJyYXJsbyAoYm90w7NuIFgpLlxyXG4gICAgY2VycmFyKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY2VycmFyQ2hhbmdlLmVtaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDYWphIGRlbCBtZW5zYWplIGNvbXBhY3RhICgxIGZpbGEsIGNvbW8gZXJhIGVsIGNoYXQgb3JpZ2luYWxtZW50ZSkg4oaUIGV4cGFuZGlkYSAoNiBmaWxhcykuXHJcbiAgICAvLyBFbCBib3TDs24gZGUgZXhwYW5kaXIgZXMgZWwgbWlzbW8gcGF0csOzbiBkZWwgXCJwZWRpciBjYW1iaW9zXCIgZGVsIGdlbmVyYWRvci5cclxuICAgIGdldCBmaWxhc0JvcnJhZG9yKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYm9ycmFkb3JFeHBhbmRpZG8gPyA2IDogMTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrRXhwYW5kaXJCb3JyYWRvcigpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmJvcnJhZG9yRXhwYW5kaWRvID0gIXRoaXMuYm9ycmFkb3JFeHBhbmRpZG87XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG1pY0Rpc3BvbmlibGUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVjb25vY2ltaWVudG9Wb3ouZXN0YVNvcG9ydGFkbygpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2xpY2tNaWNyb2Zvbm8oKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuZXNjdWNoYW5kbykge1xyXG4gICAgICAgICAgICB0aGlzLnJlY29ub2NpbWllbnRvVm96LmRldGVuZXIoKTtcclxuICAgICAgICAgICAgdGhpcy5lc2N1Y2hhbmRvID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5yZWNvbm9jaW1pZW50b1Zvei5lc3RhU29wb3J0YWRvKCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gRWwgcmVzdWx0YWRvIGRlbCByZWNvbm9jaW1pZW50byBubyBpbmNsdXllIGxvIHF1ZSB5YSBlc3RhYmEgZXNjcml0byDigJQgc2UgZ3VhcmRhIGFudGVzIGRlXHJcbiAgICAgICAgLy8gZW1wZXphciB5IHNlIGFudGVwb25lIGVuIGNhZGEgYWN0dWFsaXphY2nDs24gKHF1ZSBsbGVnYSBjb24gbGEgdHJhbnNjcmlwY2nDs24gQ09NUExFVEEgZGVcclxuICAgICAgICAvLyBlc3RhIHNlc2nDs24gZGUgZXNjdWNoYSwgbm8gdW4gaW5jcmVtZW50bykgcGFyYSBubyBwZXJkZXIgbG8gcXVlIHlhIGhhYsOtYSBlbiBlbCBjYW1wby5cclxuICAgICAgICBjb25zdCB0ZXh0b1ByZXZpbyA9IHRoaXMuYm9ycmFkb3IudHJpbSgpO1xyXG4gICAgICAgIHRoaXMuZXNjdWNoYW5kbyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5yZWNvbm9jaW1pZW50b1Zvei5pbmljaWFyKFxyXG4gICAgICAgICAgICB0aGlzLmlkaW9tYSxcclxuICAgICAgICAgICAgKHRleHRvKSA9PiAodGhpcy5ib3JyYWRvciA9IHRleHRvUHJldmlvID8gYCR7dGV4dG9QcmV2aW99ICR7dGV4dG99YCA6IHRleHRvKSxcclxuICAgICAgICAgICAgKCkgPT4gKHRoaXMuZXNjdWNoYW5kbyA9IGZhbHNlKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DbGlja0Vudmlhcih0ZXh0b1ByZXNldD86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHByZWd1bnRhID0gKHRleHRvUHJlc2V0ID8/IHRoaXMuYm9ycmFkb3IpLnRyaW0oKTtcclxuICAgICAgICBpZiAoIXByZWd1bnRhIHx8IHRoaXMuY29uc3VsdGFuZG8pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5tZW5zYWplcy5wdXNoKHsgZGVVc3VhcmlvOiB0cnVlLCB0ZXh0bzogcHJlZ3VudGEgfSk7XHJcbiAgICAgICAgdGhpcy5ib3JyYWRvciA9ICcnO1xyXG5cclxuICAgICAgICAvLyBTaW4gdXJsIGRlIGNvbnN1bHRhIG5vIHNlIGhhY2UgbGEgcGV0aWNpw7NuOiBlbCB1c3VhcmlvIHZlIGVsIG1pc21vIGVycm9yIGdlbsOpcmljbyBxdWVcclxuICAgICAgICAvLyBjdWFuZG8gbGEgQVBJIGZhbGxhLlxyXG4gICAgICAgIGlmICghdGhpcy5hc2lzdGVudGVEYXRvc0FwaVNlcnZpY2UudXJsKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWVuc2FqZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBkZVVzdWFyaW86IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgdGV4dG86ICdObyBzZSBwdWRvIHByb2Nlc2FyIGxhIGNvbnN1bHRhLicsXHJcbiAgICAgICAgICAgICAgICBlc0Vycm9yOiB0cnVlLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxBbEZpbmFsKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY29uc3VsdGFuZG8gPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsQWxGaW5hbCgpO1xyXG5cclxuICAgICAgICB0aGlzLmFzaXN0ZW50ZURhdG9zQXBpU2VydmljZS5jb25zdWx0YXIocHJlZ3VudGEsIHRoaXMucHJvdmVlZG9yU2VsZWNjaW9uYWRvKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAvLyBFbCB0aXBvIChSZXNwdWVzdGFBc2lzdGVudGVEYXRvcykgc2UgaW5maWVyZSBkZWwgT2JzZXJ2YWJsZTogaW1wb3J0YXIgbGEgaW50ZXJmYXpcclxuICAgICAgICAgICAgLy8gZGVqYWJhIHVuIGltcG9ydCBhIHVuIHPDrW1ib2xvIGluZXhpc3RlbnRlIGVuIGVsIEpTIGRlIGxhIGxpYnJlcsOtYSAoYXZpc28gZGUgcm9sbHVwKS5cclxuICAgICAgICAgICAgbmV4dDogKHJlc3B1ZXN0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25zdWx0YW5kbyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tZW5zYWplcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICBkZVVzdWFyaW86IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXBjaW9uOiByZXNwdWVzdGEuRGVzY3JpcGNpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0YWRvOiByZXNwdWVzdGEuUmVzdWx0YWRvID8/IFtdLFxyXG4gICAgICAgICAgICAgICAgICAgIHByb3ZlZWRvcjogcmVzcHVlc3RhLlByb3ZlZWRvcixcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxBbEZpbmFsKCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29uc3VsdGFuZG8gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVuc2FqZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVVc3VhcmlvOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0bzogZXJyb3I/Lk1lbnNhamUgfHwgJ05vIHNlIHB1ZG8gcHJvY2VzYXIgbGEgY29uc3VsdGEuJyxcclxuICAgICAgICAgICAgICAgICAgICBlc0Vycm9yOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbEFsRmluYWwoKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBFbCBudWV2byBtZW5zYWplIHJlY2nDqW4gc2UgcmVmbGVqYSBlbiBlbCBET00gZGVzcHXDqXMgZGVsIHNpZ3VpZW50ZSBjaWNsbyBkZSBkZXRlY2Npw7NuIGRlXHJcbiAgICAvLyBjYW1iaW9zIOKAlCBwb3IgZXNvIGVsIHNjcm9sbFRvcCBzZSBhanVzdGEgZW4gdW4gc2V0VGltZW91dCgwKSwgbm8gaW5tZWRpYXRhbWVudGUgZGVzcHXDqXMgZGVsXHJcbiAgICAvLyBwdXNoLCBwYXJhIHF1ZSBzY3JvbGxIZWlnaHQgeWEgaW5jbHV5YSBlbCBtZW5zYWplIGFncmVnYWRvLlxyXG4gICAgcHJpdmF0ZSBzY3JvbGxBbEZpbmFsKCk6IHZvaWQge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50byA9IHRoaXMubWVuc2FqZXNDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGlmIChlbGVtZW50bykge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudG8uc2Nyb2xsVG9wID0gZWxlbWVudG8uc2Nyb2xsSGVpZ2h0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29sdW1uYXNEZShyZXN1bHRhZG86IGFueVtdKTogc3RyaW5nW10ge1xyXG4gICAgICAgIHJldHVybiByZXN1bHRhZG8ubGVuZ3RoID8gT2JqZWN0LmtleXMocmVzdWx0YWRvWzBdKSA6IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEVsIGJhY2tlbmQgZGV2dWVsdmUgdW4gY29udGVvIChDaGF0Q29uc3VsdGFJQVNlcnZpY2lvLkVqZWN1dGFyQ29udGVvKSBjb21vIHVuYSBzb2xhIGZpbGEgY29uXHJcbiAgICAvLyB1bmEgc29sYSBjb2x1bW5hIGxsYW1hZGEgbGl0ZXJhbG1lbnRlIFwiUmVzdWx0YWRvXCIg4oCUIHNlIG11ZXN0cmEgY29tbyBuw7ptZXJvIGdyYW5kZSBlbiB2ZXogZGVcclxuICAgIC8vIGNvbW8gdGFibGEgZGUgdW5hIGNlbGRhLlxyXG4gICAgZXNDb250ZW8ocmVzdWx0YWRvOiBhbnlbXSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiByZXN1bHRhZG8/Lmxlbmd0aCA9PT0gMSAmJiBPYmplY3Qua2V5cyhyZXN1bHRhZG9bMF0pLmxlbmd0aCA9PT0gMSAmJiAnUmVzdWx0YWRvJyBpbiByZXN1bHRhZG9bMF07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTGlzdGFkbyBjb24gdW5hIHNvbGEgY29sdW1uYSAoZWouIHVuYSBsaXN0YSBkZSBub21icmVzL2lkcykg4oCUIHNlIG11ZXN0cmEgY29tbyB0ZXh0byBzaW1wbGVcclxuICAgIC8vIGVuIHZleiBkZSB1bmEgdGFibGEgZGUgdW5hIHNvbGEgY29sdW1uYSByZXBldGlkYS5cclxuICAgIGVzTGlzdGFTaW1wbGUocmVzdWx0YWRvOiBhbnlbXSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiByZXN1bHRhZG8/Lmxlbmd0aCA+IDAgJiYgIXRoaXMuZXNDb250ZW8ocmVzdWx0YWRvKSAmJiB0aGlzLmNvbHVtbmFzRGUocmVzdWx0YWRvKS5sZW5ndGggPT09IDE7XHJcbiAgICB9XHJcblxyXG4gICAgdGV4dG9MaXN0YVNpbXBsZShyZXN1bHRhZG86IGFueVtdKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBjb2x1bW5hID0gdGhpcy5jb2x1bW5hc0RlKHJlc3VsdGFkbylbMF07XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdGFkby5tYXAoKGZpbGEpID0+IGZpbGFbY29sdW1uYV0pLmpvaW4oJywgJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gLS0tIEFjY2lvbmVzIHNvYnJlIGxhIHRhYmxhIGRlIHJlc3VsdGFkb3MgKGFtcGxpYXIgLyBjb3BpYXIgLyBleHBvcnRhcikgLS0tXHJcblxyXG4gICAgYW1wbGlhcihyZXN1bHRhZG86IGFueVtdLCBkZXNjcmlwY2lvbj86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudGFibGFBbXBsaWFkYSA9IHJlc3VsdGFkbztcclxuICAgICAgICB0aGlzLmRlc2NyaXBjaW9uQW1wbGlhZGEgPSBkZXNjcmlwY2lvbiB8fCAnJztcclxuICAgIH1cclxuXHJcbiAgICBjZXJyYXJBbXBsaWFkYSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnRhYmxhQW1wbGlhZGEgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZGVzY3JpcGNpb25BbXBsaWFkYSA9ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGNvcGlhcihyZXN1bHRhZG86IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy50YWJsYUV4cG9ydC5jb3BpYXIocmVzdWx0YWRvKTtcclxuICAgICAgICAgICAgdGhpcy5jb3BpYWRvQXZpc28gPSB0cnVlO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+ICh0aGlzLmNvcGlhZG9BdmlzbyA9IGZhbHNlKSwgMTgwMCk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIC8vIENvcGlhciBwdWVkZSBmYWxsYXIgcG9yIHBlcm1pc29zIGRlbCBwb3J0YXBhcGVsZXM7IHNlIGlnbm9yYSBlbiBzaWxlbmNpbyAoZWwgdXN1YXJpb1xyXG4gICAgICAgICAgICAvLyBhw7puIHB1ZWRlIGFtcGxpYXIgeSBleHBvcnRhcikuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydGFyQ3N2KHJlc3VsdGFkbzogYW55W10pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnRhYmxhRXhwb3J0LmRlc2NhcmdhckNzdihyZXN1bHRhZG8sIHRoaXMubm9tYnJlQXJjaGl2bygpKTtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnRhclhsc3gocmVzdWx0YWRvOiBhbnlbXSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudGFibGFFeHBvcnQuZGVzY2FyZ2FyWGxzeChyZXN1bHRhZG8sIHRoaXMubm9tYnJlQXJjaGl2bygpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG5vbWJyZUFyY2hpdm8oKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBhaG9yYSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgY29uc3QgZG9zID0gKG46IG51bWJlcikgPT4gU3RyaW5nKG4pLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgJ2FzaXN0ZW50ZS1kYXRvcy0nICtcclxuICAgICAgICAgICAgYWhvcmEuZ2V0RnVsbFllYXIoKSArXHJcbiAgICAgICAgICAgIGRvcyhhaG9yYS5nZXRNb250aCgpICsgMSkgK1xyXG4gICAgICAgICAgICBkb3MoYWhvcmEuZ2V0RGF0ZSgpKSArXHJcbiAgICAgICAgICAgICctJyArXHJcbiAgICAgICAgICAgIGRvcyhhaG9yYS5nZXRIb3VycygpKSArXHJcbiAgICAgICAgICAgIGRvcyhhaG9yYS5nZXRNaW51dGVzKCkpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufVxyXG4iXX0=
@@ -0,0 +1,98 @@
1
+ import { __awaiter, __decorate } from "tslib";
2
+ import { Injectable } from '@angular/core';
3
+ import * as XLSX from 'xlsx';
4
+ import * as i0 from "@angular/core";
5
+ // Exporta/copia el resultado tabular del asistente ("Pregúntale a tus Datos"). El resultado ya
6
+ // llega como arreglo de objetos (una clave por columna, ver RespuestaAsistenteDatos.Resultado), así
7
+ // que no hay que parsear HTML: se recorre directo.
8
+ let TablaExportService = class TablaExportService {
9
+ constructor() {
10
+ // Separador del CSV: punto y coma. Excel en configuración regional ES (la de los usuarios WM)
11
+ // usa ';' como separador de lista, así que al abrir el .csv las columnas quedan separadas sin
12
+ // tener que importar con asistente. El TSV del portapapeles usa TAB, que Excel pega en columnas
13
+ // sin depender de la config regional.
14
+ this.SEPARADOR_CSV = ';';
15
+ }
16
+ columnas(filas) {
17
+ return filas && filas.length ? Object.keys(filas[0]) : [];
18
+ }
19
+ valorCelda(valor) {
20
+ if (valor === null || valor === undefined) {
21
+ return '';
22
+ }
23
+ return String(valor);
24
+ }
25
+ // TSV para el portapapeles: se pega directo en Excel/Sheets en columnas. Los TAB y saltos de
26
+ // línea dentro de una celda se neutralizan a espacio para no romper la cuadrícula al pegar.
27
+ aTsv(filas) {
28
+ const cols = this.columnas(filas);
29
+ const limpiar = (v) => v.replace(/\t/g, ' ').replace(/\r?\n/g, ' ');
30
+ const encabezado = cols.map(limpiar).join('\t');
31
+ const cuerpo = filas.map((fila) => cols.map((c) => limpiar(this.valorCelda(fila[c]))).join('\t'));
32
+ return [encabezado, ...cuerpo].join('\n');
33
+ }
34
+ copiar(filas) {
35
+ return __awaiter(this, void 0, void 0, function* () {
36
+ const tsv = this.aTsv(filas);
37
+ if (navigator.clipboard && navigator.clipboard.writeText) {
38
+ yield navigator.clipboard.writeText(tsv);
39
+ return;
40
+ }
41
+ // Fallback para contextos sin Clipboard API (http no seguro, navegadores viejos).
42
+ const area = document.createElement('textarea');
43
+ area.value = tsv;
44
+ area.style.position = 'fixed';
45
+ area.style.left = '-9999px';
46
+ document.body.appendChild(area);
47
+ area.select();
48
+ try {
49
+ document.execCommand('copy');
50
+ }
51
+ finally {
52
+ document.body.removeChild(area);
53
+ }
54
+ });
55
+ }
56
+ escaparCsv(valor) {
57
+ if (valor.indexOf('"') >= 0 || valor.indexOf(this.SEPARADOR_CSV) >= 0 || /[\r\n]/.test(valor)) {
58
+ return '"' + valor.replace(/"/g, '""') + '"';
59
+ }
60
+ return valor;
61
+ }
62
+ descargarCsv(filas, nombreBase) {
63
+ const cols = this.columnas(filas);
64
+ const lineas = [
65
+ cols.map((c) => this.escaparCsv(c)).join(this.SEPARADOR_CSV),
66
+ ...filas.map((fila) => cols.map((c) => this.escaparCsv(this.valorCelda(fila[c]))).join(this.SEPARADOR_CSV)),
67
+ ];
68
+ // BOM UTF-8 () para que Excel muestre tildes y ñ correctamente.
69
+ const contenido = '' + lineas.join('\r\n');
70
+ const blob = new Blob([contenido], { type: 'text/csv;charset=utf-8;' });
71
+ this.descargarBlob(blob, nombreBase + '.csv');
72
+ }
73
+ descargarXlsx(filas, nombreBase) {
74
+ const hoja = XLSX.utils.json_to_sheet(filas);
75
+ const libro = XLSX.utils.book_new();
76
+ XLSX.utils.book_append_sheet(libro, hoja, 'Datos');
77
+ // XLSX.writeFile arma el Blob y dispara la descarga en el navegador.
78
+ XLSX.writeFile(libro, nombreBase + '.xlsx');
79
+ }
80
+ descargarBlob(blob, nombreArchivo) {
81
+ const url = URL.createObjectURL(blob);
82
+ const enlace = document.createElement('a');
83
+ enlace.href = url;
84
+ enlace.download = nombreArchivo;
85
+ document.body.appendChild(enlace);
86
+ enlace.click();
87
+ document.body.removeChild(enlace);
88
+ setTimeout(() => URL.revokeObjectURL(url));
89
+ }
90
+ };
91
+ TablaExportService.ɵprov = i0.ɵɵdefineInjectable({ factory: function TablaExportService_Factory() { return new TablaExportService(); }, token: TablaExportService, providedIn: "root" });
92
+ TablaExportService = __decorate([
93
+ Injectable({
94
+ providedIn: 'root',
95
+ })
96
+ ], TablaExportService);
97
+ export { TablaExportService };
98
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGEtZXhwb3J0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly93bS1tZW51LyIsInNvdXJjZXMiOlsibGliL3dtLW1lbnUvYXNpc3RlbnRlLWRhdG9zL3RhYmxhLWV4cG9ydC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDOztBQUU3QiwrRkFBK0Y7QUFDL0Ysb0dBQW9HO0FBQ3BHLG1EQUFtRDtBQUluRCxJQUFhLGtCQUFrQixHQUEvQixNQUFhLGtCQUFrQjtJQUEvQjtRQUNJLDhGQUE4RjtRQUM5Riw4RkFBOEY7UUFDOUYsZ0dBQWdHO1FBQ2hHLHNDQUFzQztRQUNyQixrQkFBYSxHQUFHLEdBQUcsQ0FBQztLQWtGeEM7SUFoRkcsUUFBUSxDQUFDLEtBQVk7UUFDakIsT0FBTyxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzlELENBQUM7SUFFTyxVQUFVLENBQUMsS0FBVTtRQUN6QixJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUN2QyxPQUFPLEVBQUUsQ0FBQztTQUNiO1FBQ0QsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELDZGQUE2RjtJQUM3Riw0RkFBNEY7SUFDcEYsSUFBSSxDQUFDLEtBQVk7UUFDckIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQyxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM1RSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoRCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDbEcsT0FBTyxDQUFDLFVBQVUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUssTUFBTSxDQUFDLEtBQVk7O1lBQ3JCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFN0IsSUFBSSxTQUFTLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFO2dCQUN0RCxNQUFNLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN6QyxPQUFPO2FBQ1Y7WUFFRCxrRkFBa0Y7WUFDbEYsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNoRCxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztZQUNqQixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7WUFDOUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO1lBQzVCLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNkLElBQUk7Z0JBQ0EsUUFBUSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNoQztvQkFBUztnQkFDTixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNuQztRQUNMLENBQUM7S0FBQTtJQUVPLFVBQVUsQ0FBQyxLQUFhO1FBQzVCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDM0YsT0FBTyxHQUFHLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDO1NBQ2hEO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFZLEVBQUUsVUFBa0I7UUFDekMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQyxNQUFNLE1BQU0sR0FBRztZQUNYLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUM1RCxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUM5RyxDQUFDO1FBQ0YsaUVBQWlFO1FBQ2pFLE1BQU0sU0FBUyxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVDLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUseUJBQXlCLEVBQUUsQ0FBQyxDQUFDO1FBQ3hFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLFVBQVUsR0FBRyxNQUFNLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQVksRUFBRSxVQUFrQjtRQUMxQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNuRCxxRUFBcUU7UUFDckUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsVUFBVSxHQUFHLE9BQU8sQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFTyxhQUFhLENBQUMsSUFBVSxFQUFFLGFBQXFCO1FBQ25ELE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQyxNQUFNLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztRQUNsQixNQUFNLENBQUMsUUFBUSxHQUFHLGFBQWEsQ0FBQztRQUNoQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDZixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7Q0FDSixDQUFBOztBQXZGWSxrQkFBa0I7SUFIOUIsVUFBVSxDQUFDO1FBQ1IsVUFBVSxFQUFFLE1BQU07S0FDckIsQ0FBQztHQUNXLGtCQUFrQixDQXVGOUI7U0F2Rlksa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgKiBhcyBYTFNYIGZyb20gJ3hsc3gnO1xyXG5cclxuLy8gRXhwb3J0YS9jb3BpYSBlbCByZXN1bHRhZG8gdGFidWxhciBkZWwgYXNpc3RlbnRlIChcIlByZWfDum50YWxlIGEgdHVzIERhdG9zXCIpLiBFbCByZXN1bHRhZG8geWFcclxuLy8gbGxlZ2EgY29tbyBhcnJlZ2xvIGRlIG9iamV0b3MgKHVuYSBjbGF2ZSBwb3IgY29sdW1uYSwgdmVyIFJlc3B1ZXN0YUFzaXN0ZW50ZURhdG9zLlJlc3VsdGFkbyksIGFzw61cclxuLy8gcXVlIG5vIGhheSBxdWUgcGFyc2VhciBIVE1MOiBzZSByZWNvcnJlIGRpcmVjdG8uXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFRhYmxhRXhwb3J0U2VydmljZSB7XHJcbiAgICAvLyBTZXBhcmFkb3IgZGVsIENTVjogcHVudG8geSBjb21hLiBFeGNlbCBlbiBjb25maWd1cmFjacOzbiByZWdpb25hbCBFUyAobGEgZGUgbG9zIHVzdWFyaW9zIFdNKVxyXG4gICAgLy8gdXNhICc7JyBjb21vIHNlcGFyYWRvciBkZSBsaXN0YSwgYXPDrSBxdWUgYWwgYWJyaXIgZWwgLmNzdiBsYXMgY29sdW1uYXMgcXVlZGFuIHNlcGFyYWRhcyBzaW5cclxuICAgIC8vIHRlbmVyIHF1ZSBpbXBvcnRhciBjb24gYXNpc3RlbnRlLiBFbCBUU1YgZGVsIHBvcnRhcGFwZWxlcyB1c2EgVEFCLCBxdWUgRXhjZWwgcGVnYSBlbiBjb2x1bW5hc1xyXG4gICAgLy8gc2luIGRlcGVuZGVyIGRlIGxhIGNvbmZpZyByZWdpb25hbC5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgU0VQQVJBRE9SX0NTViA9ICc7JztcclxuXHJcbiAgICBjb2x1bW5hcyhmaWxhczogYW55W10pOiBzdHJpbmdbXSB7XHJcbiAgICAgICAgcmV0dXJuIGZpbGFzICYmIGZpbGFzLmxlbmd0aCA/IE9iamVjdC5rZXlzKGZpbGFzWzBdKSA6IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdmFsb3JDZWxkYSh2YWxvcjogYW55KTogc3RyaW5nIHtcclxuICAgICAgICBpZiAodmFsb3IgPT09IG51bGwgfHwgdmFsb3IgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBTdHJpbmcodmFsb3IpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRTViBwYXJhIGVsIHBvcnRhcGFwZWxlczogc2UgcGVnYSBkaXJlY3RvIGVuIEV4Y2VsL1NoZWV0cyBlbiBjb2x1bW5hcy4gTG9zIFRBQiB5IHNhbHRvcyBkZVxyXG4gICAgLy8gbMOtbmVhIGRlbnRybyBkZSB1bmEgY2VsZGEgc2UgbmV1dHJhbGl6YW4gYSBlc3BhY2lvIHBhcmEgbm8gcm9tcGVyIGxhIGN1YWRyw61jdWxhIGFsIHBlZ2FyLlxyXG4gICAgcHJpdmF0ZSBhVHN2KGZpbGFzOiBhbnlbXSk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgY29scyA9IHRoaXMuY29sdW1uYXMoZmlsYXMpO1xyXG4gICAgICAgIGNvbnN0IGxpbXBpYXIgPSAodjogc3RyaW5nKSA9PiB2LnJlcGxhY2UoL1xcdC9nLCAnICcpLnJlcGxhY2UoL1xccj9cXG4vZywgJyAnKTtcclxuICAgICAgICBjb25zdCBlbmNhYmV6YWRvID0gY29scy5tYXAobGltcGlhcikuam9pbignXFx0Jyk7XHJcbiAgICAgICAgY29uc3QgY3VlcnBvID0gZmlsYXMubWFwKChmaWxhKSA9PiBjb2xzLm1hcCgoYykgPT4gbGltcGlhcih0aGlzLnZhbG9yQ2VsZGEoZmlsYVtjXSkpKS5qb2luKCdcXHQnKSk7XHJcbiAgICAgICAgcmV0dXJuIFtlbmNhYmV6YWRvLCAuLi5jdWVycG9dLmpvaW4oJ1xcbicpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGNvcGlhcihmaWxhczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBjb25zdCB0c3YgPSB0aGlzLmFUc3YoZmlsYXMpO1xyXG5cclxuICAgICAgICBpZiAobmF2aWdhdG9yLmNsaXBib2FyZCAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCkge1xyXG4gICAgICAgICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0c3YpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBGYWxsYmFjayBwYXJhIGNvbnRleHRvcyBzaW4gQ2xpcGJvYXJkIEFQSSAoaHR0cCBubyBzZWd1cm8sIG5hdmVnYWRvcmVzIHZpZWpvcykuXHJcbiAgICAgICAgY29uc3QgYXJlYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7XHJcbiAgICAgICAgYXJlYS52YWx1ZSA9IHRzdjtcclxuICAgICAgICBhcmVhLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcclxuICAgICAgICBhcmVhLnN0eWxlLmxlZnQgPSAnLTk5OTlweCc7XHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhcmVhKTtcclxuICAgICAgICBhcmVhLnNlbGVjdCgpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhcmVhKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBlc2NhcGFyQ3N2KHZhbG9yOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGlmICh2YWxvci5pbmRleE9mKCdcIicpID49IDAgfHwgdmFsb3IuaW5kZXhPZih0aGlzLlNFUEFSQURPUl9DU1YpID49IDAgfHwgL1tcXHJcXG5dLy50ZXN0KHZhbG9yKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ1wiJyArIHZhbG9yLnJlcGxhY2UoL1wiL2csICdcIlwiJykgKyAnXCInO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdmFsb3I7XHJcbiAgICB9XHJcblxyXG4gICAgZGVzY2FyZ2FyQ3N2KGZpbGFzOiBhbnlbXSwgbm9tYnJlQmFzZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgY29scyA9IHRoaXMuY29sdW1uYXMoZmlsYXMpO1xyXG4gICAgICAgIGNvbnN0IGxpbmVhcyA9IFtcclxuICAgICAgICAgICAgY29scy5tYXAoKGMpID0+IHRoaXMuZXNjYXBhckNzdihjKSkuam9pbih0aGlzLlNFUEFSQURPUl9DU1YpLFxyXG4gICAgICAgICAgICAuLi5maWxhcy5tYXAoKGZpbGEpID0+IGNvbHMubWFwKChjKSA9PiB0aGlzLmVzY2FwYXJDc3YodGhpcy52YWxvckNlbGRhKGZpbGFbY10pKSkuam9pbih0aGlzLlNFUEFSQURPUl9DU1YpKSxcclxuICAgICAgICBdO1xyXG4gICAgICAgIC8vIEJPTSBVVEYtOCAo77u/KSBwYXJhIHF1ZSBFeGNlbCBtdWVzdHJlIHRpbGRlcyB5IMOxIGNvcnJlY3RhbWVudGUuXHJcbiAgICAgICAgY29uc3QgY29udGVuaWRvID0gJ++7vycgKyBsaW5lYXMuam9pbignXFxyXFxuJyk7XHJcbiAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtjb250ZW5pZG9dLCB7IHR5cGU6ICd0ZXh0L2NzdjtjaGFyc2V0PXV0Zi04OycgfSk7XHJcbiAgICAgICAgdGhpcy5kZXNjYXJnYXJCbG9iKGJsb2IsIG5vbWJyZUJhc2UgKyAnLmNzdicpO1xyXG4gICAgfVxyXG5cclxuICAgIGRlc2Nhcmdhclhsc3goZmlsYXM6IGFueVtdLCBub21icmVCYXNlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBob2phID0gWExTWC51dGlscy5qc29uX3RvX3NoZWV0KGZpbGFzKTtcclxuICAgICAgICBjb25zdCBsaWJybyA9IFhMU1gudXRpbHMuYm9va19uZXcoKTtcclxuICAgICAgICBYTFNYLnV0aWxzLmJvb2tfYXBwZW5kX3NoZWV0KGxpYnJvLCBob2phLCAnRGF0b3MnKTtcclxuICAgICAgICAvLyBYTFNYLndyaXRlRmlsZSBhcm1hIGVsIEJsb2IgeSBkaXNwYXJhIGxhIGRlc2NhcmdhIGVuIGVsIG5hdmVnYWRvci5cclxuICAgICAgICBYTFNYLndyaXRlRmlsZShsaWJybywgbm9tYnJlQmFzZSArICcueGxzeCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZGVzY2FyZ2FyQmxvYihibG9iOiBCbG9iLCBub21icmVBcmNoaXZvOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG4gICAgICAgIGNvbnN0IGVubGFjZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgICAgICBlbmxhY2UuaHJlZiA9IHVybDtcclxuICAgICAgICBlbmxhY2UuZG93bmxvYWQgPSBub21icmVBcmNoaXZvO1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZW5sYWNlKTtcclxuICAgICAgICBlbmxhY2UuY2xpY2soKTtcclxuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGVubGFjZSk7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCkpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,58 @@
1
+ import { __decorate } from "tslib";
2
+ import { Injectable } from '@angular/core';
3
+ import * as i0 from "@angular/core";
4
+ // Material Symbols Outlined (rellena) registrada con un nombre propio para que no choque con la
5
+ // versión de Material Symbols o Material Icons que cargue la página que aloja el menú.
6
+ const FAMILIA = 'WM Menu Symbols';
7
+ const URL_CSS = 'https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,1,0';
8
+ let WmMenuFuenteIconosService = class WmMenuFuenteIconosService {
9
+ constructor() {
10
+ this.iniciada = false;
11
+ }
12
+ cargar() {
13
+ if (this.iniciada) {
14
+ return;
15
+ }
16
+ this.iniciada = true;
17
+ const estilo = document.createElement('style');
18
+ estilo.textContent = `.wm-menu-iconos {
19
+ font-family: '${FAMILIA}';
20
+ font-weight: normal;
21
+ font-style: normal;
22
+ font-size: 24px;
23
+ line-height: 1;
24
+ letter-spacing: normal;
25
+ text-transform: none;
26
+ display: inline-block;
27
+ white-space: nowrap;
28
+ word-wrap: normal;
29
+ direction: ltr;
30
+ font-feature-settings: 'liga';
31
+ -webkit-font-smoothing: antialiased;
32
+ }`;
33
+ document.head.appendChild(estilo);
34
+ // Oculta los iconos mientras carga la fuente para que no se vea el nombre del icono como texto.
35
+ const ocultar = document.createElement('style');
36
+ ocultar.textContent = '.wm-menu-iconos { visibility: hidden; }';
37
+ document.head.appendChild(ocultar);
38
+ // Se lee la URL del archivo desde el CSS de Google Fonts en lugar de fijarla, porque cambia con cada versión.
39
+ fetch(URL_CSS)
40
+ .then(resp => resp.text())
41
+ .then(css => {
42
+ const urlFuente = /url\(([^)]+)\)/.exec(css)[1];
43
+ const fuente = new window.FontFace(FAMILIA, `url(${urlFuente})`);
44
+ document.fonts.add(fuente);
45
+ return fuente.load();
46
+ })
47
+ .catch(error => console.error('wm-menu: no se pudo cargar la fuente de iconos', error))
48
+ .then(() => document.head.removeChild(ocultar));
49
+ }
50
+ };
51
+ WmMenuFuenteIconosService.ɵprov = i0.ɵɵdefineInjectable({ factory: function WmMenuFuenteIconosService_Factory() { return new WmMenuFuenteIconosService(); }, token: WmMenuFuenteIconosService, providedIn: "root" });
52
+ WmMenuFuenteIconosService = __decorate([
53
+ Injectable({
54
+ providedIn: 'root'
55
+ })
56
+ ], WmMenuFuenteIconosService);
57
+ export { WmMenuFuenteIconosService };
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid20tbWVudS1mdWVudGUtaWNvbm9zLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly93bS1tZW51LyIsInNvdXJjZXMiOlsibGliL3dtLW1lbnUvc2VydmljZXMvd20tbWVudS1mdWVudGUtaWNvbm9zLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRTNDLGdHQUFnRztBQUNoRyx1RkFBdUY7QUFDdkYsTUFBTSxPQUFPLEdBQUcsaUJBQWlCLENBQUM7QUFDbEMsTUFBTSxPQUFPLEdBQUcsbUdBQW1HLENBQUM7QUFLcEgsSUFBYSx5QkFBeUIsR0FBdEMsTUFBYSx5QkFBeUI7SUFBdEM7UUFFVSxhQUFRLEdBQUcsS0FBSyxDQUFDO0tBMkMxQjtJQXpDQyxNQUFNO1FBQ0osSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBRXJCLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0MsTUFBTSxDQUFDLFdBQVcsR0FBRztzQkFDSCxPQUFPOzs7Ozs7Ozs7Ozs7O01BYXZCLENBQUM7UUFDSCxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVsQyxnR0FBZ0c7UUFDaEcsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoRCxPQUFPLENBQUMsV0FBVyxHQUFHLHlDQUF5QyxDQUFDO1FBQ2hFLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRW5DLDhHQUE4RztRQUM5RyxLQUFLLENBQUMsT0FBTyxDQUFDO2FBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2FBQ3pCLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNWLE1BQU0sU0FBUyxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoRCxNQUFNLE1BQU0sR0FBRyxJQUFLLE1BQWMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLE9BQU8sU0FBUyxHQUFHLENBQUMsQ0FBQztZQUN6RSxRQUFnQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDcEMsT0FBTyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkIsQ0FBQyxDQUFDO2FBQ0QsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxnREFBZ0QsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUN0RixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0NBQ0YsQ0FBQTs7QUE3Q1kseUJBQXlCO0lBSHJDLFVBQVUsQ0FBQztRQUNWLFVBQVUsRUFBRSxNQUFNO0tBQ25CLENBQUM7R0FDVyx5QkFBeUIsQ0E2Q3JDO1NBN0NZLHlCQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbi8vIE1hdGVyaWFsIFN5bWJvbHMgT3V0bGluZWQgKHJlbGxlbmEpIHJlZ2lzdHJhZGEgY29uIHVuIG5vbWJyZSBwcm9waW8gcGFyYSBxdWUgbm8gY2hvcXVlIGNvbiBsYVxyXG4vLyB2ZXJzacOzbiBkZSBNYXRlcmlhbCBTeW1ib2xzIG8gTWF0ZXJpYWwgSWNvbnMgcXVlIGNhcmd1ZSBsYSBww6FnaW5hIHF1ZSBhbG9qYSBlbCBtZW7Dui5cclxuY29uc3QgRkFNSUxJQSA9ICdXTSBNZW51IFN5bWJvbHMnO1xyXG5jb25zdCBVUkxfQ1NTID0gJ2h0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9TWF0ZXJpYWwrU3ltYm9scytPdXRsaW5lZDpvcHN6LHdnaHQsRklMTCxHUkFEQDI0LDQwMCwxLDAnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgV21NZW51RnVlbnRlSWNvbm9zU2VydmljZSB7XHJcblxyXG4gIHByaXZhdGUgaW5pY2lhZGEgPSBmYWxzZTtcclxuXHJcbiAgY2FyZ2FyKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaW5pY2lhZGEpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pbmljaWFkYSA9IHRydWU7XHJcblxyXG4gICAgY29uc3QgZXN0aWxvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcclxuICAgIGVzdGlsby50ZXh0Q29udGVudCA9IGAud20tbWVudS1pY29ub3Mge1xyXG4gICAgICBmb250LWZhbWlseTogJyR7RkFNSUxJQX0nO1xyXG4gICAgICBmb250LXdlaWdodDogbm9ybWFsO1xyXG4gICAgICBmb250LXN0eWxlOiBub3JtYWw7XHJcbiAgICAgIGZvbnQtc2l6ZTogMjRweDtcclxuICAgICAgbGluZS1oZWlnaHQ6IDE7XHJcbiAgICAgIGxldHRlci1zcGFjaW5nOiBub3JtYWw7XHJcbiAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lO1xyXG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XHJcbiAgICAgIHdvcmQtd3JhcDogbm9ybWFsO1xyXG4gICAgICBkaXJlY3Rpb246IGx0cjtcclxuICAgICAgZm9udC1mZWF0dXJlLXNldHRpbmdzOiAnbGlnYSc7XHJcbiAgICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkO1xyXG4gICAgfWA7XHJcbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGVzdGlsbyk7XHJcblxyXG4gICAgLy8gT2N1bHRhIGxvcyBpY29ub3MgbWllbnRyYXMgY2FyZ2EgbGEgZnVlbnRlIHBhcmEgcXVlIG5vIHNlIHZlYSBlbCBub21icmUgZGVsIGljb25vIGNvbW8gdGV4dG8uXHJcbiAgICBjb25zdCBvY3VsdGFyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcclxuICAgIG9jdWx0YXIudGV4dENvbnRlbnQgPSAnLndtLW1lbnUtaWNvbm9zIHsgdmlzaWJpbGl0eTogaGlkZGVuOyB9JztcclxuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQob2N1bHRhcik7XHJcblxyXG4gICAgLy8gU2UgbGVlIGxhIFVSTCBkZWwgYXJjaGl2byBkZXNkZSBlbCBDU1MgZGUgR29vZ2xlIEZvbnRzIGVuIGx1Z2FyIGRlIGZpamFybGEsIHBvcnF1ZSBjYW1iaWEgY29uIGNhZGEgdmVyc2nDs24uXHJcbiAgICBmZXRjaChVUkxfQ1NTKVxyXG4gICAgICAudGhlbihyZXNwID0+IHJlc3AudGV4dCgpKVxyXG4gICAgICAudGhlbihjc3MgPT4ge1xyXG4gICAgICAgIGNvbnN0IHVybEZ1ZW50ZSA9IC91cmxcXCgoW14pXSspXFwpLy5leGVjKGNzcylbMV07XHJcbiAgICAgICAgY29uc3QgZnVlbnRlID0gbmV3ICh3aW5kb3cgYXMgYW55KS5Gb250RmFjZShGQU1JTElBLCBgdXJsKCR7dXJsRnVlbnRlfSlgKTtcclxuICAgICAgICAoZG9jdW1lbnQgYXMgYW55KS5mb250cy5hZGQoZnVlbnRlKTtcclxuICAgICAgICByZXR1cm4gZnVlbnRlLmxvYWQoKTtcclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKGVycm9yID0+IGNvbnNvbGUuZXJyb3IoJ3dtLW1lbnU6IG5vIHNlIHB1ZG8gY2FyZ2FyIGxhIGZ1ZW50ZSBkZSBpY29ub3MnLCBlcnJvcikpXHJcbiAgICAgIC50aGVuKCgpID0+IGRvY3VtZW50LmhlYWQucmVtb3ZlQ2hpbGQob2N1bHRhcikpO1xyXG4gIH1cclxufVxyXG4iXX0=