ngx-eiffage-material 0.3.0 → 0.4.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 +1 @@
1
- {"version":3,"file":"ngx-eiffage-material.mjs","sources":["../../../projects/ngx-eiffage-material/src/lib/i18n/ngx-tables.ts","../../../projects/ngx-eiffage-material/src/lib/i18n/ngx-eiffage-texts.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-loading-button/ngx-loading-button.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-loading-button/ngx-loading-button.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-input-file/input-file-utils.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-input-file/ngx-input-file.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-input-file/ngx-input-file.component.html","../../../projects/ngx-eiffage-material/src/lib/utils/string-operations.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-basic-select/ngx-basic-select.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-basic-select/ngx-basic-select.component.html","../../../projects/ngx-eiffage-material/src/lib/models/dialog-config.ts","../../../projects/ngx-eiffage-material/src/lib/directives/dynamic-host.directive.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-dialog/ngx-dialog.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-dialog/ngx-dialog.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-confirm-dialog/ngx-confirm-dialog.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-confirm-dialog/ngx-confirm-dialog.component.html","../../../projects/ngx-eiffage-material/src/lib/directives/dynamic-cell-host.directive.ts","../../../projects/ngx-eiffage-material/src/lib/pipes/only-upper-first-character.pipe.ts","../../../projects/ngx-eiffage-material/src/lib/models/paginated-table-config.ts","../../../projects/ngx-eiffage-material/src/lib/models/advanced-filter-utils.ts","../../../projects/ngx-eiffage-material/src/lib/models/user-id-factory.ts","../../../projects/ngx-eiffage-material/src/lib/models/advanced-filter.ts","../../../projects/ngx-eiffage-material/src/lib/services/advanced-filter.service.ts","../../../projects/ngx-eiffage-material/src/lib/services/column-config.service.ts","../../../projects/ngx-eiffage-material/src/lib/services/datos-pantalla.service.ts","../../../projects/ngx-eiffage-material/src/lib/services/ngx-dialog.service.ts","../../../projects/ngx-eiffage-material/src/lib/common/components/configure-table-columns/configure-table-columns.component.ts","../../../projects/ngx-eiffage-material/src/lib/common/components/configure-table-columns/configure-table-columns.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-searchable-select/ngx-paginated-searchable-select.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-searchable-select/ngx-paginated-searchable-select.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-searchable-select/ngx-searchable-select.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-searchable-select/ngx-searchable-select.component.html","../../../projects/ngx-eiffage-material/src/lib/common/components/advanced-filter-rule/advanced-filter-rule.component.ts","../../../projects/ngx-eiffage-material/src/lib/common/components/advanced-filter-rule/advanced-filter-rule.component.html","../../../projects/ngx-eiffage-material/src/lib/common/components/advanced-filter-group/advanced-filter-group.component.ts","../../../projects/ngx-eiffage-material/src/lib/common/components/advanced-filter-group/advanced-filter-group.component.html","../../../projects/ngx-eiffage-material/src/lib/common/components/configure-advanced-filter/configure-advanced-filter.component.ts","../../../projects/ngx-eiffage-material/src/lib/common/components/configure-advanced-filter/configure-advanced-filter.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-table/ngx-paginated-table.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-table/ngx-paginated-table.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-basic-table/ngx-basic-table.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-basic-table/ngx-basic-table.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-alert/ngx-alert.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-alert/ngx-alert.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-select/bottom-sheet/ngx-paginated-select-bottom-sheet.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-select/bottom-sheet/ngx-paginated-select-bottom-sheet.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-select/ngx-paginated-select.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-select/ngx-paginated-select.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-skeleton/ngx-skeleton.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-skeleton/ngx-skeleton.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-file-input/ngx-file-input.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-file-input/ngx-file-input.component.html","../../../projects/ngx-eiffage-material/src/ngx-eiffage-material.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\n\r\n/**\r\n * @deprecated Usa `provideNgxEiffageTexts()`: solo hay que indicar los textos que cambian, se agrupan\r\n * por componente y se actualizan solos al cambiar de idioma (signals). Mientras tanto, una subclase de\r\n * NgxTablesIntl provista en la app se sigue respetando. Esta clase no recibirá textos nuevos y se\r\n * eliminará en una versión mayor.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class NgxTablesIntl {\r\n /**\r\n * Stream que emite cuando las etiquetas cambian.\r\n * Los componentes deben reaccionar a estos cambios.\r\n */\r\n readonly changes = new Subject<void>();\r\n\r\n // ========================================\r\n // === NGX-PAGINATED-TABLE ===\r\n // ========================================\r\n\r\n // === Botones de acciones ===\r\n /** Etiqueta del botón de crear/nuevo */\r\n createButtonLabel: string = 'Nuevo';\r\n\r\n /** Tooltip del botón de editar */\r\n editTooltip: string = 'Editar';\r\n\r\n /** Tooltip del botón de eliminar */\r\n deleteTooltip: string = 'Eliminar';\r\n\r\n /** Etiqueta del botón de confirmar eliminación */\r\n confirmDeleteLabel: string = 'Eliminar';\r\n\r\n // === Búsqueda y filtros ===\r\n /** Placeholder del campo de búsqueda */\r\n searchPlaceholder: string = 'Buscar...';\r\n\r\n /** Tooltip del botón de limpiar búsqueda */\r\n clearSearchTooltip: string = 'Limpiar búsqueda';\r\n\r\n /** Tooltip del botón de editar columnas */\r\n editColumnsTooltip: string = 'Visualizar y ordenar columnas';\r\n\r\n /** Etiqueta para filtros avanzados */\r\n advancedFiltersLabel: string = 'Filtros avanzados';\r\n\r\n /** Etiqueta para nuevo filtro avanzado */\r\n newAdvancedFilterLabel: string = 'Nuevo filtro';\r\n\r\n /** Tooltip del botón de editar filtro avanzado - usa función getEditAdvancedFilterTooltip() */\r\n editAdvancedFilterTooltip: string = 'Editar filtro';\r\n\r\n /** Tooltip del botón de eliminar filtro avanzado - usa función getDeleteAdvancedFilterTooltip() */\r\n deleteAdvancedFilterTooltip: string = 'Eliminar filtro';\r\n\r\n /** Tooltip del botón de quitar filtro avanzado aplicado */\r\n removeAdvancedFilterTooltip: string = 'Quitar filtros avanzados';\r\n\r\n /** Texto cuando no hay filtros avanzados */\r\n noAdvancedFiltersLabel: string = 'No hay filtros guardados';\r\n\r\n /** Etiqueta para quitar filtro en select */\r\n removeFilterLabel: string = '-- Quitar filtro --';\r\n\r\n // === Selección de filas ===\r\n /** Tooltip del checkbox de seleccionar todas las filas */\r\n selectAllTooltip: string = 'Seleccionar todo';\r\n\r\n /** Tooltip del checkbox de deseleccionar todas las filas */\r\n deselectAllTooltip: string = 'Deseleccionar todo';\r\n\r\n /** Etiqueta del botón de deseleccionar todos */\r\n deselectAllLabel: string = 'Desmarcar todos los registros';\r\n\r\n /** Tooltip del menú de acciones de selección */\r\n selectionActionsTooltip: string = 'Operaciones sobre los registros seleccionados';\r\n\r\n // === Exportación ===\r\n /** Tooltip del botón de exportar */\r\n exportTooltip: string = 'Exportar datos';\r\n\r\n /** Etiqueta para exportar a Excel */\r\n exportToExcelLabel: string = 'Exportar a XLSX la página actual';\r\n\r\n /** Etiqueta para exportar a PDF */\r\n exportToPdfLabel: string = 'Exportar a PDF la página actual';\r\n\r\n // === Pantalla completa ===\r\n /** Tooltip para entrar en pantalla completa */\r\n enterFullscreenTooltip: string = 'Pantalla completa';\r\n\r\n /** Tooltip para salir de pantalla completa */\r\n exitFullscreenTooltip: string = 'Salir del modo de pantalla completa';\r\n\r\n // === Mensajes ===\r\n /** Mensaje cuando no hay datos */\r\n noDataMessage: string = 'No se han encontrado resultados...';\r\n\r\n /** Mensaje mientras se cargan los datos */\r\n loadingMessage: string = 'Cargando...';\r\n\r\n /** Título del diálogo de confirmación de eliminación por defecto */\r\n deleteConfirmTitle: string = 'Eliminar';\r\n\r\n /** Cuerpo del diálogo de confirmación de eliminación por defecto */\r\n deleteConfirmBody: string = 'Vas a eliminar el registro seleccionado. ¿Estas seguro?';\r\n\r\n /** Título del diálogo de eliminación de filtro avanzado */\r\n deleteAdvancedFilterTitle: string = 'Eliminar plantilla de filtro avanzado';\r\n\r\n // === Columnas ===\r\n /** Etiqueta para la columna de acciones */\r\n actionsLabel: string = 'Acciones';\r\n\r\n // === Filtros de columna ===\r\n /** Placeholder para filtros de fecha */\r\n datePlaceholder: string = 'Fecha';\r\n\r\n /** Placeholder para filtro de rango de fechas - inicio */\r\n dateRangeStartPlaceholder: string = 'Desde';\r\n\r\n /** Placeholder para filtro de rango de fechas - fin */\r\n dateRangeEndPlaceholder: string = 'Hasta';\r\n\r\n // === Filas expandibles ===\r\n /** Tooltip para expandir detalles */\r\n expandDetailsTooltip: string = 'Ver detalles';\r\n\r\n /** Tooltip para contraer detalles */\r\n collapseDetailsTooltip: string = 'Ocultar detalles';\r\n\r\n // === Totales en pie de tabla ===\r\n /** Etiqueta para total por página */\r\n totalPerPageLabel: string = 'Total parcial (por página)';\r\n\r\n /** Etiqueta para total general */\r\n totalGeneralLabel: string = 'Total (todos los registros)';\r\n\r\n // === Diálogos ===\r\n /** Botón de cancelar en diálogos */\r\n cancelButtonLabel: string = 'Cancelar';\r\n\r\n /** Botón de confirmar en diálogos */\r\n confirmButtonLabel: string = 'Confirmar';\r\n\r\n /** Botón de cerrar en diálogos */\r\n closeButtonLabel: string = 'Cerrar';\r\n\r\n /** Botón de guardar en diálogos */\r\n saveButtonLabel: string = 'Guardar';\r\n\r\n /** Botón de guardar y aplicar en diálogos */\r\n saveAndApplyButtonLabel: string = 'Guardar y aplicar';\r\n\r\n // === Diálogo de configurar columnas ===\r\n /** Título del diálogo de configurar columnas */\r\n configureColumnsTitle: string = 'Ordenar y visualizar columnas de la tabla';\r\n\r\n /** Tooltip para anclar columna */\r\n pinColumnTooltip: string = 'Anclar columna';\r\n\r\n /** Tooltip para desanclar columna */\r\n unpinColumnTooltip: string = 'Desanclar';\r\n\r\n /** Tooltip para subir columna */\r\n moveUpTooltip: string = 'Subir';\r\n\r\n /** Tooltip para bajar columna */\r\n moveDownTooltip: string = 'Bajar';\r\n\r\n /** Texto para columnas con filtros aplicados */\r\n hasFiltersAppliedText: string = '(hay filtros aplicados)';\r\n\r\n /** Nota sobre ocultar columnas con filtros */\r\n hideColumnWithFiltersNote: string = 'Para ocultar una columna, primero debes quitar los filtros que tenga aplicados';\r\n\r\n /** Etiqueta de nota */\r\n noteLabel: string = 'Nota:';\r\n\r\n /** Botón de restablecer configuración de columnas */\r\n resetColumnsButtonLabel: string = 'Reestablecer orden y visualización';\r\n\r\n // === Diálogo de filtros avanzados ===\r\n /** Título del diálogo de filtros avanzados */\r\n advancedFiltersDialogTitle: string = 'Filtros avanzados para la tabla';\r\n\r\n /** Label del campo de nombre de plantilla */\r\n templateNameLabel: string = 'Nombre de la plantilla';\r\n\r\n /** Error de nombre obligatorio */\r\n templateNameRequiredError: string = 'El nombre es obligatorio';\r\n\r\n /** Título de ayuda de filtros avanzados */\r\n advancedFiltersHelpTitle: string = 'Uso de filtros avanzados';\r\n\r\n /** Texto de ayuda sobre grupos */\r\n advancedFiltersGroupHelp: string = 'Un conjunto de filtros que se evalúan juntos. Todos los filtros dentro de un grupo usan el mismo conector (“Y” u “O”). Cada rectángulo representa un grupo y dentro de ellos puede haber filtros u otros grupos';\r\n\r\n /** Texto de ayuda sobre filtros */\r\n advancedFiltersRuleHelp: string = 'Una regla individual que compara un campo con un valor (por ejemplo: “Precio > 100”)';\r\n\r\n /** Label de grupo en ayuda */\r\n groupLabel: string = 'Grupo:';\r\n\r\n /** Label de filtro en ayuda */\r\n filterLabel: string = 'Filtro:';\r\n\r\n /** Botón añadir filtro */\r\n addFilterButtonLabel: string = 'Añadir filtro';\r\n\r\n /** Botón añadir grupo */\r\n addGroupButtonLabel: string = 'Añadir grupo';\r\n\r\n /** Tooltip eliminar grupo */\r\n deleteGroupTooltip: string = 'Eliminar grupo';\r\n\r\n /** Tooltip eliminar filtro */\r\n deleteFilterTooltip: string = 'Eliminar filtro';\r\n\r\n // === Reglas de filtros avanzados ===\r\n /** Label de campo */\r\n fieldLabel: string = 'Campo';\r\n\r\n /** Label de condición */\r\n conditionLabel: string = 'Condición';\r\n\r\n /** Label de valor */\r\n valueLabel: string = 'Valor';\r\n\r\n /** Placeholder de seleccionar opción */\r\n selectOptionPlaceholder: string = 'Selecciona una opción';\r\n\r\n /** Opción para quitar campo */\r\n removeFieldOption: string = '-- Quitar campo --';\r\n\r\n /** Opción para quitar condición */\r\n removeConditionOption: string = '-- Quitar condición --';\r\n\r\n /** Opción para quitar valor */\r\n removeValueOption: string = '-- Quitar valor --';\r\n\r\n /** Error de campo obligatorio */\r\n requiredFieldError: string = 'Obligatorio';\r\n\r\n // === Conectores y operadores de filtros ===\r\n /** Conector AND */\r\n connectorAnd: string = 'Y';\r\n\r\n /** Conector OR */\r\n connectorOr: string = 'O';\r\n\r\n /** Operador igual a */\r\n operatorEquals: string = 'Igual a';\r\n\r\n /** Operador distinto de */\r\n operatorNotEquals: string = 'Distinto de';\r\n\r\n /** Operador mayor que */\r\n operatorGreaterThan: string = 'Mayor que';\r\n\r\n /** Operador mayor o igual que */\r\n operatorGreaterOrEquals: string = 'Mayor o igual que';\r\n\r\n /** Operador menor que */\r\n operatorLessThan: string = 'Menor que';\r\n\r\n /** Operador menor o igual que */\r\n operatorLessOrEquals: string = 'Menor o igual que';\r\n\r\n /** Operador contiene */\r\n operatorLike: string = 'Contiene';\r\n\r\n // ========================================\r\n // === NGX-SEARCHABLE-SELECT ===\r\n // ========================================\r\n\r\n /** Mensaje cuando no hay resultados en select */\r\n noResultsMessage: string = 'No se han encontrado resultados...';\r\n\r\n // ========================================\r\n // === NGX-PAGINATED-SEARCHABLE-SELECT ===\r\n // ========================================\r\n\r\n /** Etiqueta del botón de ver más resultados */\r\n showMoreLabel: string = 'Ver más';\r\n\r\n // ========================================\r\n // === NGX-PAGINATED-SELECT ===\r\n // ========================================\r\n\r\n /** Botón de confirmar selección (modo múltiple) */\r\n paginatedSelectConfirmLabel: string = 'Confirmar';\r\n\r\n /** Botón de limpiar selección (modo múltiple) */\r\n paginatedSelectResetLabel: string = 'Limpiar';\r\n\r\n /** Etiqueta del toggle \"Seleccionar todo\" */\r\n paginatedSelectSelectAllLabel: string = 'Seleccionar todo';\r\n\r\n /** Fila \"cargando más…\" al paginar por scroll */\r\n paginatedSelectLoadingMoreLabel: string = 'Cargando más…';\r\n\r\n /** Fila de fin de lista cuando ya no quedan más resultados */\r\n paginatedSelectEndOfListLabel: string = 'No hay más resultados';\r\n\r\n /** Ayuda bajo el mensaje de \"sin resultados\" cuando hay búsqueda activa */\r\n paginatedSelectNoResultsHint: string = 'Prueba con otro término de búsqueda';\r\n\r\n /** Botón para limpiar la búsqueda desde el estado vacío */\r\n paginatedSelectClearSearchLabel: string = 'Limpiar búsqueda';\r\n\r\n /** Título del estado de error al fallar la carga */\r\n paginatedSelectErrorTitle: string = 'No se pudieron cargar los datos';\r\n\r\n /** Ayuda del estado de error */\r\n paginatedSelectErrorHint: string = 'Revisa tu conexión e inténtalo de nuevo';\r\n\r\n /** Botón de reintentar la carga */\r\n paginatedSelectRetryLabel: string = 'Reintentar';\r\n\r\n // ========================================\r\n // === FUNCIONES AUXILIARES ===\r\n // ========================================\r\n\r\n /**\r\n * Función para obtener el mensaje de confirmación de eliminación\r\n * @param itemName Nombre del elemento a eliminar (opcional)\r\n */\r\n getDeleteConfirmMessage(itemName?: string): string {\r\n if (itemName) {\r\n return `Vas a eliminar '${itemName}'. ¿Estas seguro?`;\r\n }\r\n return this.deleteConfirmBody;\r\n }\r\n\r\n /**\r\n * Función para obtener el mensaje de eliminación de filtro avanzado\r\n * @param filterName Nombre del filtro\r\n */\r\n getDeleteAdvancedFilterMessage(filterName: string): string {\r\n return `Vas a eliminar la plantilla de filtro avanzado '${filterName}'. ¿Estas seguro?`;\r\n }\r\n\r\n /**\r\n * Función para obtener el tooltip de editar filtro avanzado con nombre\r\n * @param filterName Nombre del filtro\r\n */\r\n getEditAdvancedFilterTooltip(filterName: string): string {\r\n return `Editar '${filterName}'`;\r\n }\r\n\r\n /**\r\n * Función para obtener el tooltip de eliminar filtro avanzado con nombre\r\n * @param filterName Nombre del filtro\r\n */\r\n getDeleteAdvancedFilterTooltip(filterName: string): string {\r\n return `Eliminar '${filterName}'`;\r\n }\r\n\r\n /**\r\n * Función para obtener el label de elementos seleccionados\r\n * @param count Número de elementos seleccionados\r\n */\r\n getSelectedItemsLabel(count: number): string {\r\n return count === 1\r\n ? `${count} elemento seleccionado`\r\n : `${count} elementos seleccionados`;\r\n }\r\n\r\n /**\r\n * Función para obtener el texto de quitar selección en selects\r\n * @param optionName Nombre de la opción (opcional)\r\n */\r\n getRemoveOptionText(optionName: string): string {\r\n return `-- Quitar ${optionName} --`;\r\n }\r\n\r\n /**\r\n * Mensaje anunciado por lectores de pantalla (aria-live) con el número de\r\n * resultados tras filtrar en un select buscable.\r\n * @param count Número de resultados visibles\r\n */\r\n getSearchResultsCountMessage(count: number): string {\r\n return count === 1 ? '1 resultado' : `${count} resultados`;\r\n }\r\n\r\n /**\r\n * Footer del ngx-paginated-select en modo múltiple: elementos seleccionados\r\n * sobre el total disponible.\r\n */\r\n getPaginatedSelectSelectedCountLabel(selected: number, total: number): string {\r\n return `${selected} de ${total} seleccionados`;\r\n }\r\n\r\n /**\r\n * Footer del ngx-paginated-select en modo simple: número total de resultados.\r\n */\r\n getPaginatedSelectResultsCountLabel(total: number): string {\r\n return total === 1 ? '1 resultado' : `${total} resultados`;\r\n }\r\n}\r\n","import {\r\n computed,\r\n EnvironmentProviders,\r\n inject,\r\n Injectable,\r\n InjectionToken,\r\n isSignal,\r\n makeEnvironmentProviders,\r\n Signal,\r\n signal,\r\n} from '@angular/core';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { NgxTablesIntl } from './ngx-tables';\r\n\r\n/**\r\n * Todos los textos de la librería, agrupados por componente.\r\n * Los que dependen de un dato (nombre, número…) son funciones.\r\n */\r\nexport interface NgxEiffageTexts {\r\n /** Textos compartidos por varios componentes. */\r\n common: {\r\n search: string;\r\n clearSearch: string;\r\n noData: string;\r\n loading: string;\r\n cancel: string;\r\n confirm: string;\r\n close: string;\r\n save: string;\r\n saveAndApply: string;\r\n };\r\n /** ngx-basic-table y ngx-paginated-table. */\r\n table: {\r\n create: string;\r\n edit: string;\r\n delete: string;\r\n confirmDelete: string;\r\n deleteConfirmTitle: string;\r\n deleteConfirmBody: string;\r\n editColumns: string;\r\n deselectAll: string;\r\n selectionActions: string;\r\n export: string;\r\n exportExcel: string;\r\n exportPdf: string;\r\n enterFullscreen: string;\r\n exitFullscreen: string;\r\n actions: string;\r\n dateRangeStart: string;\r\n dateRangeEnd: string;\r\n totalPerPage: string;\r\n totalGeneral: string;\r\n };\r\n /** Diálogo de ordenar y mostrar columnas de las tablas. */\r\n columnsDialog: {\r\n title: string;\r\n pin: string;\r\n unpin: string;\r\n moveUp: string;\r\n moveDown: string;\r\n hasFiltersApplied: string;\r\n hideColumnWithFiltersNote: string;\r\n note: string;\r\n reset: string;\r\n };\r\n /** Filtros avanzados de ngx-paginated-table. */\r\n advancedFilters: {\r\n label: string;\r\n new: string;\r\n remove: string;\r\n editTooltip: (filterName: string) => string;\r\n deleteTooltip: (filterName: string) => string;\r\n deleteTitle: string;\r\n deleteMessage: (filterName: string) => string;\r\n dialogTitle: string;\r\n templateName: string;\r\n templateNameRequired: string;\r\n helpTitle: string;\r\n groupHelp: string;\r\n ruleHelp: string;\r\n group: string;\r\n filter: string;\r\n addFilter: string;\r\n addGroup: string;\r\n deleteGroup: string;\r\n deleteFilter: string;\r\n field: string;\r\n condition: string;\r\n value: string;\r\n selectOption: string;\r\n required: string;\r\n and: string;\r\n or: string;\r\n operators: {\r\n equals: string;\r\n notEquals: string;\r\n greaterThan: string;\r\n greaterOrEquals: string;\r\n lessThan: string;\r\n lessOrEquals: string;\r\n like: string;\r\n };\r\n };\r\n /** ngx-basic-select, ngx-searchable-select y ngx-paginated-searchable-select. */\r\n select: {\r\n noResults: string;\r\n showMore: string;\r\n removeOption: (optionName: string) => string;\r\n resultsCount: (count: number) => string;\r\n };\r\n /** ngx-paginated-select. */\r\n paginatedSelect: {\r\n confirm: string;\r\n reset: string;\r\n selectAll: string;\r\n loadingMore: string;\r\n endOfList: string;\r\n noResultsHint: string;\r\n clearSearch: string;\r\n errorTitle: string;\r\n errorHint: string;\r\n retry: string;\r\n selectedCount: (selected: number, total: number) => string;\r\n resultsCount: (total: number) => string;\r\n };\r\n /** NgxDialogService y ngx-dialog (botones por defecto). */\r\n dialog: {\r\n cancel: string;\r\n /** Botón de confirmar de NgxDialogService.confirm(). */\r\n confirm: string;\r\n /** Botón de aceptar de NgxDialogService.info() y de ngx-dialog. */\r\n accept: string;\r\n /** Etiqueta accesible y tooltip del botón X de cerrar. */\r\n close: string;\r\n };\r\n /** ngx-file-input. */\r\n fileInput: {\r\n dropLabel: string;\r\n browse: string;\r\n remove: (fileName: string) => string;\r\n removed: (fileName: string) => string;\r\n added: (count: number) => string;\r\n maxFiles: (max: number) => string;\r\n typeNotAllowed: (type: string) => string;\r\n tooLarge: (maxSize: string) => string;\r\n };\r\n /** ngx-input-file. */\r\n inputFile: {\r\n label: string;\r\n /** Texto del campo vacío. */\r\n placeholder: string;\r\n /** Pista mientras se arrastran ficheros encima. */\r\n dropping: string;\r\n /** Etiqueta accesible y tooltip del botón de examinar. */\r\n browse: string;\r\n remove: (fileName: string) => string;\r\n /** Fichero descartado por no cumplir `accept`. */\r\n rejectedType: (fileName: string) => string;\r\n /** Fichero descartado por superar `maxSize` (ya formateado: «2 MB»). */\r\n rejectedSize: (fileName: string, maxSize: string) => string;\r\n /** Ficheros descartados por superar `maxFiles`. */\r\n rejectedCount: (max: number) => string;\r\n };\r\n skeleton: {\r\n loading: string;\r\n };\r\n alert: {\r\n dismiss: string;\r\n };\r\n loadingButton: {\r\n busy: string;\r\n };\r\n}\r\n\r\n/** Igual que T pero con todo opcional, a cualquier profundidad (las funciones se quedan como están). */\r\ntype DeepPartial<T> = {\r\n [K in keyof T]?: T[K] extends (...args: never[]) => unknown ? T[K] : T[K] extends object ? DeepPartial<T[K]> : T[K];\r\n};\r\n\r\n/** Textos que la app quiere cambiar: solo los que difieren de los valores por defecto. */\r\nexport type NgxEiffageTextsOverrides = DeepPartial<NgxEiffageTexts>;\r\n\r\nconst plural = (count: number, one: string, many: string) => (count === 1 ? one : many);\r\n\r\n/** Valores por defecto (castellano). */\r\nexport const NGX_EIFFAGE_DEFAULT_TEXTS: NgxEiffageTexts = {\r\n common: {\r\n search: 'Buscar...',\r\n clearSearch: 'Limpiar búsqueda',\r\n noData: 'No se han encontrado resultados...',\r\n loading: 'Cargando...',\r\n cancel: 'Cancelar',\r\n confirm: 'Confirmar',\r\n close: 'Cerrar',\r\n save: 'Guardar',\r\n saveAndApply: 'Guardar y aplicar',\r\n },\r\n table: {\r\n create: 'Nuevo',\r\n edit: 'Editar',\r\n delete: 'Eliminar',\r\n confirmDelete: 'Eliminar',\r\n deleteConfirmTitle: 'Eliminar',\r\n deleteConfirmBody: 'Vas a eliminar el registro seleccionado. ¿Estas seguro?',\r\n editColumns: 'Visualizar y ordenar columnas',\r\n deselectAll: 'Desmarcar todos los registros',\r\n selectionActions: 'Operaciones sobre los registros seleccionados',\r\n export: 'Exportar datos',\r\n exportExcel: 'Exportar a XLSX la página actual',\r\n exportPdf: 'Exportar a PDF la página actual',\r\n enterFullscreen: 'Pantalla completa',\r\n exitFullscreen: 'Salir del modo de pantalla completa',\r\n actions: 'Acciones',\r\n dateRangeStart: 'Desde',\r\n dateRangeEnd: 'Hasta',\r\n totalPerPage: 'Total parcial (por página)',\r\n totalGeneral: 'Total (todos los registros)',\r\n },\r\n columnsDialog: {\r\n title: 'Ordenar y visualizar columnas de la tabla',\r\n pin: 'Anclar columna',\r\n unpin: 'Desanclar',\r\n moveUp: 'Subir',\r\n moveDown: 'Bajar',\r\n hasFiltersApplied: '(hay filtros aplicados)',\r\n hideColumnWithFiltersNote: 'Para ocultar una columna, primero debes quitar los filtros que tenga aplicados',\r\n note: 'Nota:',\r\n reset: 'Reestablecer orden y visualización',\r\n },\r\n advancedFilters: {\r\n label: 'Filtros avanzados',\r\n new: 'Nuevo filtro',\r\n remove: 'Quitar filtros avanzados',\r\n editTooltip: name => `Editar '${name}'`,\r\n deleteTooltip: name => `Eliminar '${name}'`,\r\n deleteTitle: 'Eliminar plantilla de filtro avanzado',\r\n deleteMessage: name => `Vas a eliminar la plantilla de filtro avanzado '${name}'. ¿Estas seguro?`,\r\n dialogTitle: 'Filtros avanzados para la tabla',\r\n templateName: 'Nombre de la plantilla',\r\n templateNameRequired: 'El nombre es obligatorio',\r\n helpTitle: 'Uso de filtros avanzados',\r\n groupHelp: 'Un conjunto de filtros que se evalúan juntos. Todos los filtros dentro de un grupo usan el mismo conector (“Y” u “O”). Cada rectángulo representa un grupo y dentro de ellos puede haber filtros u otros grupos',\r\n ruleHelp: 'Una regla individual que compara un campo con un valor (por ejemplo: “Precio > 100”)',\r\n group: 'Grupo:',\r\n filter: 'Filtro:',\r\n addFilter: 'Añadir filtro',\r\n addGroup: 'Añadir grupo',\r\n deleteGroup: 'Eliminar grupo',\r\n deleteFilter: 'Eliminar filtro',\r\n field: 'Campo',\r\n condition: 'Condición',\r\n value: 'Valor',\r\n selectOption: 'Selecciona una opción',\r\n required: 'Obligatorio',\r\n and: 'Y',\r\n or: 'O',\r\n operators: {\r\n equals: 'Igual a',\r\n notEquals: 'Distinto de',\r\n greaterThan: 'Mayor que',\r\n greaterOrEquals: 'Mayor o igual que',\r\n lessThan: 'Menor que',\r\n lessOrEquals: 'Menor o igual que',\r\n like: 'Contiene',\r\n },\r\n },\r\n select: {\r\n noResults: 'No se han encontrado resultados...',\r\n showMore: 'Ver más',\r\n removeOption: name => `-- Quitar ${name} --`,\r\n resultsCount: count => plural(count, '1 resultado', `${count} resultados`),\r\n },\r\n paginatedSelect: {\r\n confirm: 'Confirmar',\r\n reset: 'Limpiar',\r\n selectAll: 'Seleccionar todo',\r\n loadingMore: 'Cargando más…',\r\n endOfList: 'No hay más resultados',\r\n noResultsHint: 'Prueba con otro término de búsqueda',\r\n clearSearch: 'Limpiar búsqueda',\r\n errorTitle: 'No se pudieron cargar los datos',\r\n errorHint: 'Revisa tu conexión e inténtalo de nuevo',\r\n retry: 'Reintentar',\r\n selectedCount: (selected, total) => `${selected} de ${total} seleccionados`,\r\n resultsCount: total => plural(total, '1 resultado', `${total} resultados`),\r\n },\r\n dialog: {\r\n cancel: 'Cancelar',\r\n confirm: 'Confirmar',\r\n accept: 'Aceptar',\r\n close: 'Cerrar',\r\n },\r\n fileInput: {\r\n dropLabel: 'Arrastra archivos aquí',\r\n browse: 'o haz clic para seleccionar',\r\n remove: name => `Eliminar ${name}`,\r\n removed: name => `Archivo ${name} eliminado`,\r\n added: count => plural(count, '1 archivo añadido', `${count} archivos añadidos`),\r\n maxFiles: max => `Máximo ${max} archivos permitidos`,\r\n typeNotAllowed: type => `Tipo no permitido: ${type}`,\r\n tooLarge: maxSize => `Excede el tamaño máximo (${maxSize})`,\r\n },\r\n inputFile: {\r\n label: 'Seleccionar archivo',\r\n placeholder: 'Haz clic o arrastra aquí',\r\n dropping: 'Suelta los archivos para añadirlos',\r\n browse: 'Examinar',\r\n remove: name => `Eliminar ${name}`,\r\n rejectedType: name => `«${name}»: tipo de archivo no permitido`,\r\n rejectedSize: (name, maxSize) => `«${name}» supera el tamaño máximo (${maxSize})`,\r\n rejectedCount: max => plural(max, 'Solo se permite 1 archivo', `Solo se permiten ${max} archivos`),\r\n },\r\n skeleton: {\r\n loading: 'Cargando…',\r\n },\r\n alert: {\r\n dismiss: 'Cerrar aviso',\r\n },\r\n loadingButton: {\r\n busy: 'Cargando…',\r\n },\r\n};\r\n\r\n/** Lo que acepta provideNgxEiffageTexts: un objeto fijo o un signal (para cambiar de idioma en caliente). */\r\nexport type NgxEiffageTextsSource = NgxEiffageTextsOverrides | Signal<NgxEiffageTextsOverrides>;\r\n\r\n/** Textos que la app consumidora sustituye. Se provee con provideNgxEiffageTexts(). */\r\nexport const NGX_EIFFAGE_TEXTS = new InjectionToken<Signal<NgxEiffageTextsOverrides>>('NGX_EIFFAGE_TEXTS');\r\n\r\n/**\r\n * Cambia los textos de la librería. Solo hay que indicar los que difieren de los valores por defecto.\r\n *\r\n * ```ts\r\n * // Textos fijos\r\n * provideNgxEiffageTexts({ alert: { dismiss: 'Dismiss' } })\r\n *\r\n * // Según el idioma de la app: una función (se ejecuta en contexto de inyección) que devuelve un signal\r\n * provideNgxEiffageTexts(() => {\r\n * const language = inject(LanguageService);\r\n * return computed(() => language.current() === 'en' ? EN_TEXTS : {});\r\n * })\r\n * ```\r\n */\r\nexport function provideNgxEiffageTexts(\r\n texts: NgxEiffageTextsSource | (() => NgxEiffageTextsSource),\r\n): EnvironmentProviders {\r\n return makeEnvironmentProviders([\r\n {\r\n provide: NGX_EIFFAGE_TEXTS,\r\n useFactory: (): Signal<NgxEiffageTextsOverrides> => {\r\n const source = typeof texts === 'function' && !isSignal(texts) ? texts() : texts;\r\n return isSignal(source) ? source : signal(source);\r\n },\r\n },\r\n ]);\r\n}\r\n\r\n/** Textos efectivos de la librería: valores por defecto + NgxTablesIntl (obsoleto) + provideNgxEiffageTexts. */\r\n@Injectable({ providedIn: 'root' })\r\nexport class NgxTexts {\r\n private readonly _overrides = inject(NGX_EIFFAGE_TEXTS, { optional: true });\r\n private readonly _legacyIntl = inject(NgxTablesIntl);\r\n private readonly _legacyChanges = toSignal(this._legacyIntl.changes);\r\n\r\n /** Todos los textos ya combinados. En plantilla: `texts().alert.dismiss`. */\r\n readonly texts: Signal<NgxEiffageTexts> = computed(() => {\r\n this._legacyChanges();\r\n const legacy = isCustomizedLegacyIntl(this._legacyIntl) ? textsFromLegacyIntl(this._legacyIntl) : {};\r\n return deepMerge(deepMerge(NGX_EIFFAGE_DEFAULT_TEXTS, legacy), this._overrides?.() ?? {});\r\n });\r\n}\r\n\r\n// ── Compatibilidad con NgxTablesIntl ────────────────────────────────────────\r\n\r\n/** Solo se leen los valores de NgxTablesIntl si el consumidor la ha sustituido (subclase o useValue). */\r\nfunction isCustomizedLegacyIntl(intl: NgxTablesIntl): boolean {\r\n return Object.getPrototypeOf(intl) !== NgxTablesIntl.prototype;\r\n}\r\n\r\n/** Traduce una NgxTablesIntl personalizada al formato nuevo. */\r\nfunction textsFromLegacyIntl(intl: NgxTablesIntl): NgxEiffageTextsOverrides {\r\n return {\r\n common: {\r\n search: intl.searchPlaceholder,\r\n clearSearch: intl.clearSearchTooltip,\r\n noData: intl.noDataMessage,\r\n loading: intl.loadingMessage,\r\n cancel: intl.cancelButtonLabel,\r\n confirm: intl.confirmButtonLabel,\r\n close: intl.closeButtonLabel,\r\n save: intl.saveButtonLabel,\r\n saveAndApply: intl.saveAndApplyButtonLabel,\r\n },\r\n table: {\r\n create: intl.createButtonLabel,\r\n edit: intl.editTooltip,\r\n delete: intl.deleteTooltip,\r\n confirmDelete: intl.confirmDeleteLabel,\r\n deleteConfirmTitle: intl.deleteConfirmTitle,\r\n deleteConfirmBody: intl.deleteConfirmBody,\r\n editColumns: intl.editColumnsTooltip,\r\n deselectAll: intl.deselectAllLabel,\r\n selectionActions: intl.selectionActionsTooltip,\r\n export: intl.exportTooltip,\r\n exportExcel: intl.exportToExcelLabel,\r\n exportPdf: intl.exportToPdfLabel,\r\n enterFullscreen: intl.enterFullscreenTooltip,\r\n exitFullscreen: intl.exitFullscreenTooltip,\r\n actions: intl.actionsLabel,\r\n dateRangeStart: intl.dateRangeStartPlaceholder,\r\n dateRangeEnd: intl.dateRangeEndPlaceholder,\r\n totalPerPage: intl.totalPerPageLabel,\r\n totalGeneral: intl.totalGeneralLabel,\r\n },\r\n columnsDialog: {\r\n title: intl.configureColumnsTitle,\r\n pin: intl.pinColumnTooltip,\r\n unpin: intl.unpinColumnTooltip,\r\n moveUp: intl.moveUpTooltip,\r\n moveDown: intl.moveDownTooltip,\r\n hasFiltersApplied: intl.hasFiltersAppliedText,\r\n hideColumnWithFiltersNote: intl.hideColumnWithFiltersNote,\r\n note: intl.noteLabel,\r\n reset: intl.resetColumnsButtonLabel,\r\n },\r\n advancedFilters: {\r\n label: intl.advancedFiltersLabel,\r\n new: intl.newAdvancedFilterLabel,\r\n remove: intl.removeAdvancedFilterTooltip,\r\n editTooltip: name => intl.getEditAdvancedFilterTooltip(name),\r\n deleteTooltip: name => intl.getDeleteAdvancedFilterTooltip(name),\r\n deleteTitle: intl.deleteAdvancedFilterTitle,\r\n deleteMessage: name => intl.getDeleteAdvancedFilterMessage(name),\r\n dialogTitle: intl.advancedFiltersDialogTitle,\r\n templateName: intl.templateNameLabel,\r\n templateNameRequired: intl.templateNameRequiredError,\r\n helpTitle: intl.advancedFiltersHelpTitle,\r\n groupHelp: intl.advancedFiltersGroupHelp,\r\n ruleHelp: intl.advancedFiltersRuleHelp,\r\n group: intl.groupLabel,\r\n filter: intl.filterLabel,\r\n addFilter: intl.addFilterButtonLabel,\r\n addGroup: intl.addGroupButtonLabel,\r\n deleteGroup: intl.deleteGroupTooltip,\r\n deleteFilter: intl.deleteFilterTooltip,\r\n field: intl.fieldLabel,\r\n condition: intl.conditionLabel,\r\n value: intl.valueLabel,\r\n selectOption: intl.selectOptionPlaceholder,\r\n required: intl.requiredFieldError,\r\n and: intl.connectorAnd,\r\n or: intl.connectorOr,\r\n operators: {\r\n equals: intl.operatorEquals,\r\n notEquals: intl.operatorNotEquals,\r\n greaterThan: intl.operatorGreaterThan,\r\n greaterOrEquals: intl.operatorGreaterOrEquals,\r\n lessThan: intl.operatorLessThan,\r\n lessOrEquals: intl.operatorLessOrEquals,\r\n like: intl.operatorLike,\r\n },\r\n },\r\n select: {\r\n noResults: intl.noResultsMessage,\r\n showMore: intl.showMoreLabel,\r\n removeOption: name => intl.getRemoveOptionText(name),\r\n resultsCount: count => intl.getSearchResultsCountMessage(count),\r\n },\r\n paginatedSelect: {\r\n confirm: intl.paginatedSelectConfirmLabel,\r\n reset: intl.paginatedSelectResetLabel,\r\n selectAll: intl.paginatedSelectSelectAllLabel,\r\n loadingMore: intl.paginatedSelectLoadingMoreLabel,\r\n endOfList: intl.paginatedSelectEndOfListLabel,\r\n noResultsHint: intl.paginatedSelectNoResultsHint,\r\n clearSearch: intl.paginatedSelectClearSearchLabel,\r\n errorTitle: intl.paginatedSelectErrorTitle,\r\n errorHint: intl.paginatedSelectErrorHint,\r\n retry: intl.paginatedSelectRetryLabel,\r\n selectedCount: (selected, total) => intl.getPaginatedSelectSelectedCountLabel(selected, total),\r\n resultsCount: total => intl.getPaginatedSelectResultsCountLabel(total),\r\n },\r\n };\r\n}\r\n\r\n// ── Utilidades ──────────────────────────────────────────────────────────────\r\n\r\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\r\n return typeof value === 'object' && value !== null && !Array.isArray(value) && !isSignal(value);\r\n}\r\n\r\n/** Copia profunda de `base` con los valores de `overrides` encima; ignora los undefined. */\r\nfunction deepMerge<T>(base: T, overrides: DeepPartial<T>): T {\r\n const result: Record<string, unknown> = { ...(base as Record<string, unknown>) };\r\n for (const [key, value] of Object.entries(overrides as Record<string, unknown>)) {\r\n if (value === undefined) continue;\r\n const current = result[key];\r\n result[key] = isPlainObject(current) && isPlainObject(value)\r\n ? deepMerge(current, value as DeepPartial<typeof current>)\r\n : value;\r\n }\r\n return result as T;\r\n}\r\n","import {\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n inject,\r\n input,\r\n numberAttribute,\r\n} from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { LoadingButtonAppearance, LoadingButtonColor } from '../../models';\r\nimport { NgxTexts } from '../../i18n';\r\n\r\n/**\r\n * Botón de Material que muestra un spinner mientras dura una acción y no deja volver a pulsarlo.\r\n *\r\n * El clic se escucha en el propio selector: `<ngx-loading-button (click)=\"save()\" />`.\r\n * Mientras `isLoading` es true el clic no llega (ni el submit del formulario, ni con Enter).\r\n */\r\n@Component({\r\n selector: 'ngx-loading-button',\r\n imports: [MatButtonModule, MatProgressSpinnerModule],\r\n templateUrl: './ngx-loading-button.component.html',\r\n styleUrl: './ngx-loading-button.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n '[class.ngx-loading-button--secondary]': 'color() === \"secondary\"',\r\n '[class.ngx-loading-button--tertiary]': 'color() === \"tertiary\"',\r\n '[class.ngx-loading-button--error]': 'color() === \"error\"',\r\n '[class.ngx-loading-button--loading]': 'isLoading() && !disabled()',\r\n },\r\n})\r\nexport class NgxLoadingButton {\r\n private readonly _texts = inject(NgxTexts).texts;\r\n\r\n /** Muestra el spinner y bloquea el botón. */\r\n readonly isLoading = input(false, { transform: booleanAttribute });\r\n\r\n /** Texto del botón. Para iconos o contenido con formato, proyéctalo en su lugar. */\r\n readonly label = input<string>();\r\n\r\n /**\r\n * Texto que sustituye al contenido mientras carga, con un spinner pequeño delante\r\n * (p. ej. «Guardando…»). Sin él, el spinner se superpone y el botón mantiene su ancho.\r\n */\r\n readonly loadingText = input<string>();\r\n\r\n /** Apariencia de Material: text, filled, elevated, outlined o tonal. */\r\n readonly matButton = input<LoadingButtonAppearance>('filled');\r\n\r\n /** Tipo nativo del botón. */\r\n readonly type = input<'button' | 'submit' | 'reset'>('button');\r\n\r\n /** Deshabilita el botón (independiente de isLoading). */\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n\r\n /** Color. Sin valor, el primary del tema. */\r\n readonly color = input<LoadingButtonColor>();\r\n\r\n /** Diámetro en px del spinner superpuesto. */\r\n readonly spinnerDiameter = input(24, { transform: numberAttribute });\r\n\r\n /** Grosor en px del trazo del spinner. */\r\n readonly spinnerStrokeWidth = input(3, { transform: numberAttribute });\r\n\r\n /** Lo que anuncia el lector de pantalla mientras carga. Por defecto, el texto `loadingButton.busy` de la librería. */\r\n readonly busyLabel = input<string>();\r\n\r\n /** El spinner va encima del contenido (que se oculta sin cambiar el ancho). */\r\n protected readonly overlaySpinner = computed(() => this.isLoading() && !this.loadingText());\r\n\r\n /** El spinner va en línea, delante de loadingText. */\r\n protected readonly inlineSpinner = computed(() => this.isLoading() && !!this.loadingText());\r\n\r\n protected readonly resolvedBusyLabel = computed(() => {\r\n return this.busyLabel() ?? this._texts().loadingButton.busy;\r\n });\r\n\r\n /**\r\n * Mientras carga, anula el clic en el propio botón: preventDefault evita el submit del formulario\r\n * (también el implícito al pulsar Enter en un campo) y stopImmediatePropagation evita que llegue\r\n * al (click) que el consumidor escucha en <ngx-loading-button>.\r\n */\r\n protected blockWhileLoading(event: Event): void {\r\n if (!this.isLoading()) return;\r\n event.preventDefault();\r\n event.stopImmediatePropagation();\r\n }\r\n}\r\n","<!--\r\n Mientras carga: disabledInteractive mantiene el foco en el botón (el lector de pantalla sigue en él\r\n y oye aria-busy). Material NO bloquea el clic de un <button> en ese estado: lo hace blockWhileLoading.\r\n Con disabled, el botón se deshabilita del todo y el navegador ya no emite clics.\r\n-->\r\n<button\r\n class=\"loadingButton\"\r\n [matButton]=\"matButton()\"\r\n [type]=\"type()\"\r\n [disabled]=\"disabled() || isLoading()\"\r\n [disabledInteractive]=\"isLoading() && !disabled()\"\r\n [attr.aria-busy]=\"isLoading() || null\"\r\n (click)=\"blockWhileLoading($event)\"\r\n>\r\n <span class=\"loadingButton__content\" [class.loadingButton__content--hidden]=\"overlaySpinner()\" [class.loadingButton__content--gone]=\"inlineSpinner()\">\r\n {{ label() }}\r\n <ng-content />\r\n </span>\r\n\r\n @if (inlineSpinner()) {\r\n <span class=\"loadingButton__content\">\r\n <mat-spinner class=\"loadingButton__inlineSpinner\" diameter=\"18\" strokeWidth=\"2.5\" aria-hidden=\"true\" />\r\n {{ loadingText() }}\r\n </span>\r\n }\r\n\r\n @if (overlaySpinner()) {\r\n <mat-spinner\r\n class=\"loadingButton__overlaySpinner\"\r\n [diameter]=\"spinnerDiameter()\"\r\n [strokeWidth]=\"spinnerStrokeWidth()\"\r\n [attr.aria-label]=\"resolvedBusyLabel()\"\r\n />\r\n }\r\n</button>\r\n","// Utilidades internas de ngx-input-file (no se exportan en el barril).\n\n/** Normaliza `accept` (array o cadena separada por comas) a patrones en minúsculas. `*` o vacío = sin filtro. */\nexport function parseAccept(accept: string | readonly string[] | null | undefined): string[] {\n const parts = Array.isArray(accept) ? accept : String(accept ?? '').split(',');\n return parts.map(part => part.trim().toLowerCase()).filter(part => part && part !== '*' && part !== '*/*');\n}\n\n/** ¿Cumple el fichero alguno de los patrones? Admite extensiones (`.pdf`), MIME (`application/pdf`) y comodines (`image/*`). */\nexport function matchesAccept(file: File, patterns: readonly string[]): boolean {\n if (!patterns.length) return true;\n const type = file.type.toLowerCase();\n const name = file.name.toLowerCase();\n\n return patterns.some(pattern => {\n if (pattern.startsWith('.')) return name.endsWith(pattern);\n if (pattern.endsWith('/*')) return type.startsWith(pattern.slice(0, -1));\n return type === pattern;\n });\n}\n\n/** Mismo fichero = mismo nombre, tamaño y fecha de modificación (el navegador da objetos File distintos en cada selección). */\nexport function isSameFile(a: File, b: File): boolean {\n return a.name === b.name && a.size === b.size && a.lastModified === b.lastModified;\n}\n\nconst UNITS = ['B', 'KB', 'MB', 'GB'];\n\n/** Tamaño legible con el formato numérico del idioma: 845 B, 12 KB, 1,4 MB. */\nexport function formatFileSize(bytes: number, locale: string): string {\n let value = bytes;\n let unit = 0;\n while (value >= 1024 && unit < UNITS.length - 1) {\n value /= 1024;\n unit++;\n }\n const digits = unit === 0 || value >= 10 ? 0 : 1;\n return `${new Intl.NumberFormat(locale, { maximumFractionDigits: digits }).format(value)} ${UNITS[unit]}`;\n}\n\n/** Icono de Material Symbols según el tipo; si el navegador no da MIME (pasa con .docx, .dwg…), según la extensión. */\nexport function fileIcon(file: File): string {\n const type = file.type.toLowerCase();\n const extension = file.name.toLowerCase().split('.').pop() ?? '';\n\n if (type.startsWith('image/')) return 'image';\n if (type === 'application/pdf' || extension === 'pdf') return 'picture_as_pdf';\n if (type.startsWith('video/')) return 'videocam';\n if (type.startsWith('audio/')) return 'audio_file';\n if (/spreadsheet|excel|csv/.test(type) || ['xls', 'xlsx', 'csv', 'ods'].includes(extension)) return 'table_chart';\n if (/word|document|text\\//.test(type) || ['doc', 'docx', 'odt', 'txt', 'rtf'].includes(extension)) return 'description';\n if (/zip|compressed|tar|rar|7z/.test(type) || ['zip', 'rar', '7z', 'tar', 'gz'].includes(extension)) return 'folder_zip';\n return 'draft';\n}\n","import {\r\n AfterViewInit,\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n DoCheck,\r\n ChangeDetectorRef,\r\n Component,\r\n computed,\r\n DestroyRef,\r\n ElementRef,\r\n inject,\r\n input,\r\n LOCALE_ID,\r\n model,\r\n output,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport {\r\n AbstractControl,\r\n ControlValueAccessor,\r\n FormGroupDirective,\r\n NgControl,\r\n NgForm,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatChipGrid, MatChipsModule } from '@angular/material/chips';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\nimport { MatFormFieldAppearance, MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { EMPTY, merge, Observable, Subscription } from 'rxjs';\r\nimport { NgxTexts } from '../../i18n';\r\nimport { NgxFileError, NgxFileErrorCode } from '../../models/file-input-types';\r\nimport { fileIcon, formatFileSize, isSameFile, matchesAccept, parseAccept } from './input-file-utils';\r\n\r\n/**\r\n * Selector de ficheros con forma de campo de formulario: un `mat-form-field` con los ficheros como chips.\r\n * Se usa con `formControlName` / `[formControl]` / `ngModel` (valor: `File[]`) o con `[(files)]`.\r\n */\r\n@Component({\r\n selector: 'ngx-input-file',\r\n imports: [MatButtonModule, MatChipsModule, MatFormFieldModule, MatIconModule, MatTooltipModule],\r\n templateUrl: './ngx-input-file.component.html',\r\n styleUrl: './ngx-input-file.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'ngx-input-file',\r\n '[class.ngx-input-file--disabled]': 'isDisabled()',\r\n '[class.ngx-input-file--dropping]': 'isDropping()',\r\n '[class.ngx-input-file--has-files]': 'files().length > 0',\r\n '(dragover)': 'onDragOver($event)',\r\n '(dragleave)': 'onDragLeave($event)',\r\n '(drop)': 'onDrop($event)',\r\n },\r\n})\r\nexport class NgxInputFile implements ControlValueAccessor, AfterViewInit, DoCheck {\r\n // Se registra como value accessor a mano (en vez de con NG_VALUE_ACCESSOR) para poder leer el\r\n // control del formulario: su estado decide el asterisco de obligatorio y cuándo se ve el error.\r\n private readonly _ngControl = inject(NgControl, { self: true, optional: true });\r\n private readonly _parentForm = inject(FormGroupDirective, { optional: true }) ?? inject(NgForm, { optional: true });\r\n private readonly _cdr = inject(ChangeDetectorRef);\r\n private readonly _host: ElementRef<HTMLElement> = inject(ElementRef);\r\n private readonly _locale = inject(LOCALE_ID);\r\n private readonly _nativeInput = viewChild.required<ElementRef<HTMLInputElement>>('nativeInput');\r\n private readonly _chipGrid = viewChild(MatChipGrid);\r\n protected readonly texts = inject(NgxTexts).texts;\r\n\r\n /** Etiqueta del campo. Por defecto, el texto `inputFile.label` de la librería. */\r\n readonly label = input<string>();\r\n /** Texto del campo vacío. Por defecto, el texto `inputFile.placeholder` de la librería. */\r\n readonly placeholder = input<string>();\r\n /** Texto de ayuda bajo el campo. */\r\n readonly hint = input<string>('');\r\n /** Mensaje de error. Se ve cuando el control es inválido y está tocado o el formulario se ha enviado. */\r\n readonly error = input<string>('');\r\n /** Tipos admitidos: extensiones (`.pdf`), MIME (`application/pdf`) o comodines (`image/*`). Se comprueba también al arrastrar. */\r\n readonly accept = input<string | string[]>([]);\r\n /** Permite varios ficheros; cada selección se añade a los que ya hay. */\r\n readonly multiple = input(false, { transform: booleanAttribute });\r\n /** Tamaño máximo por fichero, en bytes. Los mayores se descartan. */\r\n readonly maxSize = input<number | null>(null);\r\n /** Número máximo de ficheros (con `multiple`). Los que no caben se descartan. */\r\n readonly maxFiles = input<number | null>(null);\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n /** Apariencia del `mat-form-field`. */\r\n readonly appearance = input<MatFormFieldAppearance>('outline');\r\n /** Ficheros seleccionados. Admite `[(files)]` para usarlo sin formularios. */\r\n readonly files = model<File[]>([]);\r\n /** Fichero descartado al seleccionar o arrastrar (tipo, tamaño o número), con el mismo formato que ngx-file-input. */\r\n readonly validationError = output<NgxFileError>();\r\n\r\n protected readonly resolvedLabel = computed(() => this.label() ?? this.texts().inputFile.label);\r\n protected readonly resolvedPlaceholder = computed(() =>\r\n this.files().length ? '' : (this.placeholder() ?? this.texts().inputFile.placeholder)\r\n );\r\n protected readonly acceptAttr = computed(() => parseAccept(this.accept()).join(','));\r\n protected readonly items = computed(() =>\r\n this.files().map(file => ({ file, icon: fileIcon(file), size: formatFileSize(file.size, this._locale) }))\r\n );\r\n\r\n private readonly _cvaDisabled = signal(false);\r\n /** Deshabilitado por el input `disabled` o por el control del formulario. */\r\n readonly isDisabled = computed(() => this.disabled() || this._cvaDisabled());\r\n protected readonly isDropping = signal(false);\r\n protected readonly isRequired = signal(false);\r\n\r\n /** Ficheros descartados en la última selección; el mensaje se recalcula si cambia el idioma. */\r\n private readonly _rejected = signal<{ file: File; code: NgxFileErrorCode }[]>([]);\r\n protected readonly rejectionMessage = computed(() => {\r\n const messages = this._rejected().map(({ file, code }) => this._message(file, code));\r\n return [...new Set(messages)].join(' · ');\r\n });\r\n\r\n /** Error con el estado del control del formulario (inválido y tocado, o formulario enviado). */\r\n protected readonly errorStateMatcher: ErrorStateMatcher = {\r\n isErrorState: () => {\r\n const control = this._control();\r\n return !!control && control.invalid && (control.touched || !!this._parentForm?.submitted);\r\n },\r\n };\r\n protected readonly noSeparators: number[] = [];\r\n\r\n private _onChange: (files: File[]) => void = () => {};\r\n private _onTouched: () => void = () => {};\r\n private _controlSub?: Subscription;\r\n\r\n constructor() {\r\n if (this._ngControl) this._ngControl.valueAccessor = this;\r\n inject(DestroyRef).onDestroy(() => this._controlSub?.unsubscribe());\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n // formControlName asigna su control después de registerOnChange: aquí ya está\r\n if (this._ngControl?.control) this._bindControl(this._ngControl.control);\r\n }\r\n\r\n ngDoCheck(): void {\r\n // Como hacen los campos de Material: hay cambios sin evento (resetForm quita el «enviado» después del reset)\r\n this._chipGrid()?.updateErrorState();\r\n }\r\n\r\n /** Abre el selector de ficheros del sistema. */\r\n openPicker(): void {\r\n if (!this.isDisabled()) this._nativeInput().nativeElement.click();\r\n }\r\n\r\n /** Quita un fichero de la selección. */\r\n remove(file: File): void {\r\n this._rejected.set([]);\r\n this._commit(this.files().filter(item => item !== file));\r\n }\r\n\r\n // ── Eventos de la plantilla ─────────────────────────────────────────────────\r\n\r\n protected onFieldClick(event: MouseEvent): void {\r\n // Pulsar un chip (o su botón de quitar) no abre el selector\r\n if ((event.target as Element).closest('.mat-mdc-chip, .ngx-input-file__browse')) return;\r\n this.openPicker();\r\n }\r\n\r\n protected onTriggerKeydown(event: KeyboardEvent): void {\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault();\r\n this.openPicker();\r\n }\r\n }\r\n\r\n protected onTriggerBlur(): void {\r\n // Al abrir el diálogo del sistema la ventana pierde el foco: eso no cuenta como salir del campo\r\n if (typeof document !== 'undefined' && document.hasFocus()) this._markTouched();\r\n }\r\n\r\n protected onNativeChange(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n this._addFiles(input.files);\r\n input.value = '';\r\n }\r\n\r\n protected onNativeCancel(): void {\r\n this._markTouched();\r\n }\r\n\r\n protected onDragOver(event: DragEvent): void {\r\n // Siempre: si no, el navegador abre el fichero al soltarlo\r\n event.preventDefault();\r\n if (event.dataTransfer) event.dataTransfer.dropEffect = this.isDisabled() ? 'none' : 'copy';\r\n if (!this.isDisabled()) this.isDropping.set(true);\r\n }\r\n\r\n protected onDragLeave(event: DragEvent): void {\r\n // dragleave también salta al pasar por encima de un hijo: solo cuenta si sale del componente\r\n if (!this._host.nativeElement.contains(event.relatedTarget as Node | null)) this.isDropping.set(false);\r\n }\r\n\r\n protected onDrop(event: DragEvent): void {\r\n event.preventDefault();\r\n this.isDropping.set(false);\r\n if (!this.isDisabled()) this._addFiles(event.dataTransfer?.files);\r\n }\r\n\r\n // ── ControlValueAccessor ────────────────────────────────────────────────────\r\n\r\n writeValue(files: File[] | null | undefined): void {\r\n this.files.set(Array.isArray(files) ? files : []);\r\n this._rejected.set([]);\r\n }\r\n\r\n registerOnChange(fn: (files: File[]) => void): void {\r\n this._onChange = fn;\r\n // [formControl] ya tiene aquí su control (también si se cambia por otro); formControlName, en ngAfterViewInit\r\n if (this._ngControl?.control) this._bindControl(this._ngControl.control);\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this._onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this._cvaDisabled.set(isDisabled);\r\n }\r\n\r\n // ── Privado ─────────────────────────────────────────────────────────────────\r\n\r\n private _control(): AbstractControl | null {\r\n return this._ngControl?.control ?? null;\r\n }\r\n\r\n /** Escucha el control (y el envío del formulario) para refrescar el asterisco y el estado de error con OnPush. */\r\n private _bindControl(control: AbstractControl | null): void {\r\n this._controlSub?.unsubscribe();\r\n if (!control) return;\r\n const submit$: Observable<unknown> = this._parentForm?.ngSubmit ?? EMPTY;\r\n\r\n this._controlSub = merge(control.events, submit$).subscribe(() => this._syncFormState(control));\r\n this._syncFormState(control);\r\n }\r\n\r\n private _syncFormState(control: AbstractControl): void {\r\n this.isRequired.set(control.hasValidator(Validators.required));\r\n // mat-chip-grid solo recalcula su error en ngDoCheck y si tiene NgControl propio, que aquí no tiene\r\n this._chipGrid()?.updateErrorState();\r\n this._cdr.markForCheck();\r\n }\r\n\r\n private _addFiles(list: FileList | null | undefined): void {\r\n const incoming = Array.from(list ?? []);\r\n if (!incoming.length) return;\r\n\r\n const patterns = parseAccept(this.accept());\r\n const maxSize = this.maxSize();\r\n const rejected: { file: File; code: NgxFileErrorCode }[] = [];\r\n const valid: File[] = [];\r\n\r\n for (const file of incoming) {\r\n if (!matchesAccept(file, patterns)) rejected.push({ file, code: 'TYPE_NOT_ALLOWED' });\r\n else if (maxSize != null && file.size > maxSize) rejected.push({ file, code: 'SIZE_EXCEEDED' });\r\n else valid.push(file);\r\n }\r\n\r\n let next = this.files();\r\n if (!this.multiple()) {\r\n if (valid.length) next = [valid[0]];\r\n } else {\r\n // Los repetidos (ya seleccionados o dos veces en la misma tanda) se ignoran sin avisar\r\n const fresh = valid.filter((file, index) =>\r\n !next.some(current => isSameFile(current, file)) && valid.findIndex(other => isSameFile(other, file)) === index\r\n );\r\n const max = this.maxFiles();\r\n const room = max == null ? fresh.length : Math.max(max - next.length, 0);\r\n fresh.slice(room).forEach(file => rejected.push({ file, code: 'MAX_FILES_EXCEEDED' }));\r\n if (room > 0 && fresh.length) next = [...next, ...fresh.slice(0, room)];\r\n }\r\n\r\n this._rejected.set(rejected);\r\n for (const { file, code } of rejected) this.validationError.emit({ file, code, message: this._message(file, code) });\r\n\r\n if (next !== this.files()) this._commit(next);\r\n else this._markTouched();\r\n }\r\n\r\n private _commit(files: File[]): void {\r\n this.files.set(files);\r\n this._onChange(files);\r\n this._markTouched();\r\n }\r\n\r\n private _markTouched(): void {\r\n this._onTouched();\r\n this._chipGrid()?.updateErrorState();\r\n this._cdr.markForCheck();\r\n }\r\n\r\n private _message(file: File, code: NgxFileErrorCode): string {\r\n const texts = this.texts().inputFile;\r\n switch (code) {\r\n case 'TYPE_NOT_ALLOWED':\r\n return texts.rejectedType(file.name);\r\n case 'SIZE_EXCEEDED':\r\n return texts.rejectedSize(file.name, formatFileSize(this.maxSize() ?? 0, this._locale));\r\n case 'MAX_FILES_EXCEEDED':\r\n return texts.rejectedCount(this.maxFiles() ?? 0);\r\n }\r\n }\r\n}\r\n","<mat-form-field\r\n class=\"ngx-input-file__field\"\r\n [appearance]=\"appearance()\"\r\n floatLabel=\"always\"\r\n subscriptSizing=\"dynamic\"\r\n (click)=\"onFieldClick($event)\">\r\n <mat-label>{{ resolvedLabel() }}</mat-label>\r\n\r\n <mat-chip-grid\r\n #chipGrid\r\n class=\"ngx-input-file__chips\"\r\n [disabled]=\"isDisabled()\"\r\n [required]=\"isRequired()\"\r\n [errorStateMatcher]=\"errorStateMatcher\">\r\n @for (item of items(); track item.file) {\r\n <mat-chip-row class=\"ngx-input-file__chip\" [title]=\"item.file.name + ' · ' + item.size\" (removed)=\"remove(item.file)\">\r\n <mat-icon matChipAvatar aria-hidden=\"true\">{{ item.icon }}</mat-icon>\r\n <span class=\"ngx-input-file__chip-name\">{{ item.file.name }}</span>\r\n <span class=\"ngx-input-file__chip-size\">{{ item.size }}</span>\r\n <button matChipRemove type=\"button\" [attr.aria-label]=\"texts().inputFile.remove(item.file.name)\">\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip-row>\r\n }\r\n\r\n <!-- Entrada de texto de solo lectura: da el foco con Tab, el placeholder y abre el selector con Intro o Espacio -->\r\n <input\r\n class=\"ngx-input-file__trigger\"\r\n readonly\r\n [matChipInputFor]=\"chipGrid\"\r\n [matChipInputSeparatorKeyCodes]=\"noSeparators\"\r\n [placeholder]=\"resolvedPlaceholder()\"\r\n (keydown)=\"onTriggerKeydown($event)\"\r\n (blur)=\"onTriggerBlur()\" />\r\n </mat-chip-grid>\r\n\r\n <button\r\n matIconSuffix\r\n matIconButton\r\n type=\"button\"\r\n class=\"ngx-input-file__browse\"\r\n [disabled]=\"isDisabled()\"\r\n [attr.aria-label]=\"texts().inputFile.browse\"\r\n [matTooltip]=\"texts().inputFile.browse\"\r\n (click)=\"openPicker()\">\r\n <mat-icon>attach_file</mat-icon>\r\n </button>\r\n\r\n <input\r\n #nativeInput\r\n type=\"file\"\r\n hidden\r\n tabindex=\"-1\"\r\n [accept]=\"acceptAttr()\"\r\n [multiple]=\"multiple()\"\r\n (change)=\"onNativeChange($event)\"\r\n (cancel)=\"onNativeCancel()\" />\r\n\r\n <mat-hint>\r\n @if (isDropping()) {\r\n {{ texts().inputFile.dropping }}\r\n } @else if (rejectionMessage()) {\r\n <span class=\"ngx-input-file__rejection\">{{ rejectionMessage() }}</span>\r\n } @else {\r\n {{ hint() }}\r\n }\r\n </mat-hint>\r\n\r\n @if (error()) {\r\n <mat-error>{{ error() }}</mat-error>\r\n }\r\n</mat-form-field>\r\n\r\n<!-- Región viva fija: los descartes se anuncian aunque el lector esté en otro sitio -->\r\n<div class=\"ngx-input-file__live\" aria-live=\"polite\">{{ rejectionMessage() }}</div>\r\n","export const includeNoSensible = (cadena: string, query: string): boolean => {\r\n const nomalizadoCadena = cadena\r\n .toLowerCase()\r\n .normalize('NFD')\r\n .replace(/[\\u0300-\\u036f]/g, '');\r\n const nomalizadoQuery = query\r\n .toLowerCase()\r\n .normalize('NFD')\r\n .replace(/[\\u0300-\\u036f]/g, '');\r\n return nomalizadoCadena.includes(nomalizadoQuery);\r\n};\r\n\r\nexport const base64ToUtf8 = (str: string): string => {\r\n return decodeURIComponent(\r\n atob(str)\r\n .split('')\r\n .map(function (c) {\r\n return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\r\n })\r\n .join('')\r\n );\r\n};\r\n","import {\r\n afterRenderEffect,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n computed,\r\n ElementRef,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport {\r\n ControlValueAccessor,\r\n FormControl,\r\n FormGroupDirective,\r\n NgControl,\r\n NgForm,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule, SubscriptSizing } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatSelect, MatSelectModule } from '@angular/material/select';\r\nimport { BasicSelectConfig } from '../../models';\r\nimport { includeNoSensible } from '../../utils';\r\nimport { NgxTexts } from '../../i18n';\r\n\r\n/** Opción ya resuelta (valor, etiqueta, disabled y visibilidad según el buscador). */\r\ninterface ResolvedOption<T> {\r\n value: T[keyof T];\r\n label: string;\r\n disabled: boolean;\r\n visible: boolean;\r\n}\r\n\r\n/** Teclas que deben llegar al mat-select para navegar/seleccionar desde el buscador. */\r\nconst NAVIGATION_KEYS = new Set([\r\n 'ArrowDown',\r\n 'ArrowUp',\r\n 'Enter',\r\n 'Escape',\r\n 'Home',\r\n 'End',\r\n 'Tab',\r\n]);\r\n\r\n@Component({\r\n selector: 'ngx-basic-select',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n MatInputModule,\r\n MatSelectModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n ReactiveFormsModule,\r\n MatProgressSpinnerModule,\r\n ],\r\n templateUrl: './ngx-basic-select.component.html',\r\n styleUrl: './ngx-basic-select.component.scss',\r\n})\r\nexport class NgxBasicSelect<T> implements ControlValueAccessor {\r\n\r\n // Servicio de internacionalización (placeholder del buscador, mensajes de estado…)\r\n readonly texts = inject(NgxTexts).texts;\r\n\r\n /**\r\n * Se auto-registra como ControlValueAccessor del control del formulario.\r\n * Se usa `self`/`optional` para poder leer el estado de validación (invalid/touched)\r\n * y para no fallar cuando el componente se usa sin formulario.\r\n */\r\n private readonly _ngControl = inject(NgControl, { self: true, optional: true });\r\n /** Formulario contenedor, para saber si ya se intentó enviar (reactive o template-driven). */\r\n private readonly _parentFormGroup = inject(FormGroupDirective, { optional: true });\r\n private readonly _parentForm = inject(NgForm, { optional: true });\r\n private readonly _changeDetectorRef = inject(ChangeDetectorRef);\r\n\r\n // ─── Inputs ──────────────────────────────────────────────────────────────\r\n readonly label = input.required<string>();\r\n readonly options = input.required<T[]>();\r\n readonly basicSelectConfig = input.required<BasicSelectConfig<T>>();\r\n readonly isLoading = input<boolean>(false);\r\n readonly placeholder = input<string>('');\r\n readonly subscriptSizing = input<SubscriptSizing>('fixed');\r\n readonly appearance = input<'fill' | 'outline'>('fill');\r\n readonly multiple = input<boolean>(false);\r\n readonly disabled = input<boolean>(false);\r\n readonly clearable = input<boolean>(false);\r\n readonly error = input<string>('');\r\n readonly class = input<string>('');\r\n\r\n // ─── Outputs ─────────────────────────────────────────────────────────────\r\n /** Emite el/los valor(es) de `valueKey` al cambiar la selección. */\r\n selectionChange = output<T[keyof T] | T[keyof T][] | null>();\r\n\r\n // ─── ViewChilds ──────────────────────────────────────────────────────────\r\n readonly matSelect = viewChild.required<MatSelect>('matSelect');\r\n readonly searchInput = viewChild<ElementRef<HTMLInputElement>>('searchInput');\r\n\r\n // ─── Estado interno ──────────────────────────────────────────────────────\r\n /** FormControl interno que gobierna el mat-select (independiente del control del form). */\r\n protected readonly innerControl = new FormControl<any>(null);\r\n /** Copia del valor como signal, para leerlo reactivamente en plantilla (OnPush). */\r\n protected readonly value = signal<any>(null);\r\n /** Deshabilitado que llega vía setDisabledState (reactive forms). */\r\n private readonly cvaDisabled = signal(false);\r\n /** Estado del buscador (signal, no el DOM, para funcionar en zoneless). */\r\n protected readonly searchQuery = signal('');\r\n\r\n private onChange: (value: any) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n /** Deshabilitado efectivo: input `disabled` o el que llega del formulario. */\r\n protected readonly isDisabled = computed(() => this.disabled() || this.cvaDisabled());\r\n\r\n /**\r\n * Opciones resueltas y marcadas con `visible` según el buscador. Las no visibles\r\n * NO se quitan del DOM (se ocultan con display:none) para que el mat-select siga\r\n * pudiendo pintar la etiqueta del valor seleccionado aunque esté filtrado.\r\n */\r\n protected readonly resolvedOptions = computed<ResolvedOption<T>[]>(() => {\r\n const query = this.searchQuery();\r\n const options = this.options();\r\n const config = this.basicSelectConfig();\r\n\r\n return options.map(option => {\r\n const label = String(config.displayedLabel(option));\r\n return {\r\n value: option[config.valueKey],\r\n label,\r\n disabled: config.disabled ? config.disabled(option) : false,\r\n visible: includeNoSensible(label, query),\r\n };\r\n });\r\n });\r\n\r\n /** Hay datos de entrada (con independencia del buscador). */\r\n protected readonly hasData = computed(() => this.resolvedOptions().length > 0);\r\n\r\n /**\r\n * Opciones que se renderizan realmente: las que casan con el buscador MÁS las que\r\n * estén seleccionadas (aunque no casen). Se quitan del DOM las que no casan para que\r\n * el ListKeyManager de mat-select no las pueda enfocar con las flechas —marcarlas\r\n * `disabled` no basta: con el panel abierto Material permite enfocar deshabilitadas\r\n * (recomendación WAI-ARIA)—. Las seleccionadas se conservan para que el trigger\r\n * pueda pintar su etiqueta y no se pierda el valor al filtrar.\r\n */\r\n protected readonly displayedOptions = computed<ResolvedOption<T>[]>(() => {\r\n const value = this.value();\r\n const selected = new Set(Array.isArray(value) ? value : (value != null ? [value] : []));\r\n return this.resolvedOptions().filter(o => o.visible || selected.has(o.value));\r\n });\r\n\r\n /** No hay ninguna opción que mostrar (ni coincidencia ni seleccionada). */\r\n protected readonly showNoOptionsMessage = computed(() => this.displayedOptions().length === 0);\r\n\r\n /** Mensaje aria-live con el recuento de resultados al filtrar. */\r\n protected readonly searchAnnouncement = computed(() => {\r\n const query = this.searchQuery();\r\n if (!query)\r\n return '';\r\n\r\n const count = this.resolvedOptions().filter(o => o.visible).length;\r\n return this.texts().select.resultsCount(count);\r\n });\r\n\r\n /**\r\n * ErrorStateMatcher que refleja el estado del control del formulario.\r\n * Replica el criterio por defecto de Material: se muestra el error si el\r\n * control es inválido y además ha sido tocado O ya se ha enviado el\r\n * formulario. Sin la parte de `submitted`, al pulsar \"Guardar\" los campos\r\n * obligatorios que el usuario no llegó a tocar no se marcaban en rojo.\r\n */\r\n protected readonly errorStateMatcher: ErrorStateMatcher = {\r\n isErrorState: () =>\r\n !!(this._ngControl?.invalid && (this._ngControl?.touched || this._isParentFormSubmitted())),\r\n };\r\n\r\n /**\r\n * Obligatorio si el control del formulario tiene el validador `required`.\r\n * Se propaga al mat-select interno para que el mat-form-field pinte el\r\n * asterisco, igual que hace Material con un `<input matInput>`.\r\n */\r\n protected isRequired(): boolean {\r\n return this._ngControl?.control?.hasValidator(Validators.required) ?? false;\r\n }\r\n\r\n /** true cuando el formulario contenedor ya ha intentado enviarse. */\r\n private _isParentFormSubmitted(): boolean {\r\n return this._parentFormGroup?.submitted || this._parentForm?.submitted || false;\r\n }\r\n\r\n constructor() {\r\n // Auto-registro como CVA (evita el provider NG_VALUE_ACCESSOR y su DI circular).\r\n if (this._ngControl)\r\n this._ngControl.valueAccessor = this;\r\n\r\n // Sincroniza el deshabilitado efectivo con el control interno.\r\n afterRenderEffect(() => {\r\n const disabled = this.isDisabled();\r\n if (disabled && this.innerControl.enabled)\r\n this.innerControl.disable({ emitEvent: false });\r\n else if (!disabled && this.innerControl.disabled)\r\n this.innerControl.enable({ emitEvent: false });\r\n });\r\n\r\n // Propaga los cambios del control interno al formulario, al output y al signal de valor.\r\n this.innerControl.valueChanges\r\n .pipe(takeUntilDestroyed())\r\n .subscribe(value => {\r\n this.value.set(value);\r\n this.onChange(value);\r\n this.selectionChange.emit(value);\r\n });\r\n\r\n /**\r\n * `submitted` del formulario padre es una propiedad normal, no una señal:\r\n * al enviar, nada marca este componente (OnPush) para revisión, así que el\r\n * mat-select no reevaluaba su errorStateMatcher y el campo no se pintaba en\r\n * rojo. Al enviarse el formulario se fuerza la revisión.\r\n */\r\n const parentSubmit = this._parentFormGroup?.ngSubmit ?? this._parentForm?.ngSubmit;\r\n parentSubmit?.pipe(takeUntilDestroyed()).subscribe(() => {\r\n this.innerControl.markAsTouched();\r\n this._changeDetectorRef.markForCheck();\r\n });\r\n }\r\n\r\n // ─── ControlValueAccessor ─────────────────────────────────────────────────\r\n writeValue(value: any): void {\r\n this.innerControl.setValue(value, { emitEvent: false });\r\n this.value.set(value);\r\n }\r\n\r\n registerOnChange(fn: (value: any) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.cvaDisabled.set(isDisabled);\r\n }\r\n\r\n // ─── Interacción ──────────────────────────────────────────────────────────\r\n onOpenedChange(opened: boolean): void {\r\n if (opened) {\r\n this.searchQuery.set('');\r\n setTimeout(() => {\r\n this.searchInput()?.nativeElement.focus();\r\n const panel = this.matSelect().panel?.nativeElement;\r\n if (panel)\r\n panel.scrollTop = 0;\r\n });\r\n } else {\r\n // Al cerrar marcamos como tocado para que salte la validación\r\n this.onTouched();\r\n this._ngControl?.control?.markAsTouched();\r\n }\r\n }\r\n\r\n onSearchInput(value: string): void {\r\n this.searchQuery.set(value);\r\n }\r\n\r\n /**\r\n * Deja pasar al mat-select las teclas de navegación (flechas, Enter, Escape…) para\r\n * poder moverse por la lista sin salir del buscador, y detiene las de carácter para\r\n * que no disparen el typeahead nativo del mat-select.\r\n */\r\n onSearchKeydown(event: KeyboardEvent): void {\r\n if (!NAVIGATION_KEYS.has(event.key))\r\n event.stopPropagation();\r\n }\r\n\r\n clearSearch(): void {\r\n this.searchQuery.set('');\r\n this.searchInput()?.nativeElement.focus();\r\n }\r\n\r\n onClearClick(): void {\r\n const newValue = this.multiple() ? [] : null;\r\n this.innerControl.setValue(newValue); // emite → onChange + output + signal\r\n this.innerControl.markAsTouched();\r\n this._ngControl?.control?.markAsTouched();\r\n }\r\n}\r\n","\r\n<mat-form-field [appearance]=\"appearance()\" [className]=\"class()\" [subscriptSizing]=\"subscriptSizing()\">\r\n <mat-label>{{ label() }}</mat-label>\r\n <mat-select\r\n #matSelect\r\n [formControl]=\"innerControl\"\r\n [errorStateMatcher]=\"errorStateMatcher\"\r\n [required]=\"isRequired()\"\r\n [multiple]=\"multiple()\"\r\n [placeholder]=\"placeholder()\"\r\n (openedChange)=\"onOpenedChange($event)\"\r\n >\r\n @if(isLoading()) {\r\n <!--\r\n Opcion deshabilitada (no un div): mat-select no abre el panel si no\r\n tiene ninguna mat-option (_canOpen exige options.length > 0). Asi el\r\n panel abre tambien durante la carga y se ve el indicador.\r\n -->\r\n <mat-option disabled class=\"stateOption loadingOption\">\r\n <mat-spinner diameter=\"18\" />\r\n <span>{{ texts().common.loading }}</span>\r\n </mat-option>\r\n } @else {\r\n <div class=\"searchFilter\">\r\n <mat-icon class=\"searchIcon\">search</mat-icon>\r\n <input\r\n matInput\r\n #searchInput\r\n type=\"text\"\r\n [attr.aria-label]=\"texts().common.search\"\r\n [placeholder]=\"texts().common.search\"\r\n [value]=\"searchQuery()\"\r\n (input)=\"onSearchInput($any($event.target).value)\"\r\n (keydown)=\"onSearchKeydown($event)\"\r\n />\r\n <button type=\"button\" matIconButton [attr.aria-label]=\"texts().common.clearSearch\" (click)=\"clearSearch()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n <!--\r\n Solo se renderizan las opciones que casan con el buscador (mas las\r\n seleccionadas). Las que no casan se quitan del DOM para que no se puedan\r\n enfocar con las flechas: con el panel abierto mat-select permite navegar\r\n a opciones deshabilitadas, asi que ocultarlas + disabled no bastaria.\r\n -->\r\n @for(option of displayedOptions(); track option.value) {\r\n <mat-option [value]=\"option.value\" [disabled]=\"option.disabled\">\r\n {{ option.label }}\r\n </mat-option>\r\n }\r\n @if(showNoOptionsMessage()) {\r\n <mat-option disabled class=\"stateOption noResults\">\r\n {{ hasData() ? texts().select.noResults : texts().common.noData }}\r\n </mat-option>\r\n }\r\n }\r\n </mat-select>\r\n @if(isLoading()) {\r\n <mat-icon matSuffix><mat-spinner diameter=\"20\" /></mat-icon>\r\n } @else if(clearable() && (multiple() ? value()?.length : value())) {\r\n <button\r\n matIconButton\r\n matSuffix\r\n [attr.aria-label]=\"texts().common.clearSearch\"\r\n (click)=\"onClearClick(); $event.stopPropagation()\"\r\n >\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <mat-error>{{ error() }}</mat-error>\r\n</mat-form-field>\r\n\r\n<!-- Anuncio para lectores de pantalla del numero de resultados al filtrar -->\r\n<div class=\"srOnly\" aria-live=\"polite\">{{ searchAnnouncement() }}</div>\r\n","import { TemplateRef, Type, WritableSignal } from \"@angular/core\";\r\n\r\nexport enum DialogBodyType {\r\n TEXT = 'text',\r\n HTML = 'html',\r\n COMPONENT = 'component',\r\n TEMPLATE = 'template'\r\n}\r\n\r\nexport interface DialogBodyConfig<T = any> {\r\n type: DialogBodyType;\r\n content: string | Type<T> | TemplateRef<any>;\r\n data?: T;\r\n}\r\n\r\nexport interface DialogConfig<T = any> {\r\n title: string;\r\n icon?: string;\r\n iconColor?: string;\r\n subtitle?: string;\r\n body: DialogBodyConfig<T>;\r\n showCancel?: boolean;\r\n showConfirm?: boolean;\r\n cancelText?: string;\r\n confirmText?: string;\r\n /** El botón de confirmar se pinta en el color de error (eliminar, descartar…). */\r\n destructive?: boolean;\r\n /** Muestra la X de cerrar en el encabezado (cierra devolviendo undefined). Por defecto true, salvo con disableClose. */\r\n showClose?: boolean;\r\n}\r\n\r\n/**\r\n * Lo que un componente o plantilla dentro de un diálogo de NgxDialogService puede controlar.\r\n *\r\n * - En un componente: `inject(NgxDialogContext)`.\r\n * - En una plantilla: viene en el contexto como `dialog` (`let-dialog=\"dialog\"`).\r\n */\r\nexport abstract class NgxDialogContext<R = unknown> {\r\n /** Resultado que se devuelve al pulsar confirmar. Si se queda sin valor, se devuelve `true`. */\r\n abstract readonly result: WritableSignal<R | undefined>;\r\n\r\n /** Deshabilita el botón de confirmar (p. ej. mientras un formulario no es válido). */\r\n abstract readonly confirmDisabled: WritableSignal<boolean>;\r\n\r\n /** Cierra el diálogo devolviendo `result` (o `false`/`undefined` para cancelar). */\r\n abstract close(result?: R | boolean): void;\r\n}\r\n\r\n/** Contexto que recibe una plantilla usada como cuerpo de un diálogo. */\r\nexport interface NgxDialogTemplateContext<T = any, R = unknown> {\r\n /** Los datos que se pasaron en `templateData`. */\r\n $implicit: T;\r\n /** Para cerrar el diálogo, fijar el resultado o deshabilitar el botón de confirmar. */\r\n dialog: NgxDialogContext<R>;\r\n}\r\n","import { ComponentRef, Directive, effect, inject, input, signal, Type, ViewContainerRef } from \"@angular/core\";\r\n\r\n@Directive({\r\n selector: '[ngxDynamicHost]'\r\n})\r\nexport class DynamicHostDirective<T> {\r\n private _vcr = inject(ViewContainerRef);\r\n private _currentRef: ComponentRef<any> | null = null;\r\n\r\n component = input<Type<any>>();\r\n data = input<T>();\r\n\r\n constructor() {\r\n effect(() => {\r\n const componentType = this.component();\r\n \r\n // 1. Gestión de la creación/destrucción del componente\r\n if (!componentType) {\r\n this._vcr.clear();\r\n this._currentRef = null;\r\n return;\r\n }\r\n\r\n // Si el componente es diferente al que tenemos, lo recreamos\r\n if (this._currentRef?.componentType !== componentType) {\r\n this._vcr.clear();\r\n this._currentRef = this._vcr.createComponent(componentType);\r\n }\r\n \r\n // 2. Actualización de datos (siempre, tanto si es nuevo como si ya existía)\r\n const data = this.data();\r\n if (this._currentRef && data !== undefined) {\r\n // La forma correcta de setear un input en Angular moderno\r\n this._currentRef.setInput('data', data); \r\n }\r\n });\r\n }\r\n}","import { ChangeDetectionStrategy, Component, forwardRef, inject, signal } from '@angular/core';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MAT_DIALOG_DATA, MatDialogActions, MatDialogContent, MatDialogRef, MatDialogTitle } from '@angular/material/dialog';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { DialogBodyType, DialogConfig, NgxDialogContext, NgxDialogTemplateContext } from '../../models/dialog-config';\r\nimport { DynamicHostDirective } from '../../directives';\r\nimport { NgxTexts } from '../../i18n';\r\n\r\n/**\r\n * Diálogo genérico que abre NgxDialogService. El contenido (texto, HTML, componente o plantilla)\r\n * puede usar NgxDialogContext para devolver un resultado o deshabilitar el botón de confirmar.\r\n */\r\n@Component({\r\n selector: 'ngx-dialog',\r\n imports: [\r\n MatDialogTitle,\r\n MatDialogContent,\r\n MatDialogActions,\r\n MatButtonModule,\r\n MatIconModule,\r\n MatTooltipModule,\r\n NgTemplateOutlet,\r\n DynamicHostDirective,\r\n ],\r\n templateUrl: './ngx-dialog.component.html',\r\n styleUrl: './ngx-dialog.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n // El contenido (componente o plantilla) inyecta el diálogo como NgxDialogContext\r\n providers: [{ provide: NgxDialogContext, useExisting: forwardRef(() => NgxDialog) }],\r\n})\r\nexport class NgxDialog<T = any, R = unknown> implements NgxDialogContext<R> {\r\n private readonly _dialogRef = inject(MatDialogRef<NgxDialog<T, R>>);\r\n private readonly _data = inject<DialogConfig<T>>(MAT_DIALOG_DATA);\r\n private readonly _texts = inject(NgxTexts).texts;\r\n\r\n readonly title = this._data.title;\r\n readonly icon = this._data.icon;\r\n readonly iconColor = this._data.iconColor;\r\n readonly subtitle = this._data.subtitle;\r\n readonly body = this._data.body;\r\n readonly showCancel = this._data.showCancel ?? true;\r\n readonly showConfirm = this._data.showConfirm ?? true;\r\n readonly destructive = this._data.destructive ?? false;\r\n /** La X no tiene sentido en un diálogo con disableClose (está pensado para no poder cerrarse sin decidir). */\r\n readonly showClose = this._data.showClose ?? !this._dialogRef.disableClose;\r\n readonly closeLabel = this._texts().dialog.close;\r\n readonly cancelText = this._data.cancelText ?? this._texts().dialog.cancel;\r\n readonly confirmText = this._data.confirmText ?? this._texts().dialog.accept;\r\n\r\n // ── NgxDialogContext ──────────────────────────────────────────────────────\r\n readonly result = signal<R | undefined>(undefined);\r\n readonly confirmDisabled = signal(false);\r\n\r\n close(result?: R | boolean): void {\r\n this._dialogRef.close(result);\r\n }\r\n\r\n // ── Plantilla ─────────────────────────────────────────────────────────────\r\n protected readonly DialogBodyType = DialogBodyType;\r\n protected readonly templateContext: NgxDialogTemplateContext<T, R> = {\r\n $implicit: this.body.data as T,\r\n dialog: this,\r\n };\r\n\r\n onCancelClick(): void {\r\n this._dialogRef.close(false);\r\n }\r\n\r\n onConfirmClick(): void {\r\n if (this.confirmDisabled()) return;\r\n const result = this.result();\r\n this._dialogRef.close(result === undefined ? true : result);\r\n }\r\n}\r\n","<!--\r\n Encabezado: el h2 (mat-dialog-title) da el nombre accesible al diálogo, así que la X va fuera de él,\r\n posicionada encima, para que no forme parte de ese nombre.\r\n-->\r\n<div class=\"ngx-dialog__header\" [class.ngx-dialog__header--closable]=\"showClose\">\r\n <h2 mat-dialog-title class=\"ngx-dialog__title\">\r\n @if (icon) {\r\n <mat-icon class=\"ngx-dialog__icon\" [style.color]=\"iconColor || null\" aria-hidden=\"true\">{{ icon }}</mat-icon>\r\n }\r\n <span class=\"ngx-dialog__heading\">\r\n <span class=\"ngx-dialog__title-text\">{{ title }}</span>\r\n @if (subtitle) {\r\n <span class=\"ngx-dialog__subtitle\">{{ subtitle }}</span>\r\n }\r\n </span>\r\n </h2>\r\n\r\n @if (showClose) {\r\n <button\r\n type=\"button\"\r\n matIconButton\r\n class=\"ngx-dialog__close\"\r\n [attr.aria-label]=\"closeLabel\"\r\n [matTooltip]=\"closeLabel\"\r\n (click)=\"close()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n</div>\r\n\r\n<mat-dialog-content>\r\n <div class=\"ngx-dialog__content\">\r\n @switch (body.type) {\r\n @case (DialogBodyType.TEXT) {\r\n <p class=\"ngx-dialog__text\">{{ body.content }}</p>\r\n }\r\n @case (DialogBodyType.HTML) {\r\n <div [innerHTML]=\"body.content\"></div>\r\n }\r\n @case (DialogBodyType.COMPONENT) {\r\n <ng-container\r\n ngxDynamicHost\r\n [component]=\"$any(body.content)\"\r\n [data]=\"body.data\"\r\n />\r\n }\r\n @case (DialogBodyType.TEMPLATE) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"$any(body.content)\"\r\n [ngTemplateOutletContext]=\"templateContext\"\r\n />\r\n }\r\n }\r\n </div>\r\n</mat-dialog-content>\r\n\r\n@if (showCancel || showConfirm) {\r\n <mat-dialog-actions align=\"end\" class=\"ngx-dialog__actions\">\r\n @if (showCancel) {\r\n <button type=\"button\" matButton=\"outlined\" (click)=\"onCancelClick()\">\r\n {{ cancelText }}\r\n </button>\r\n }\r\n @if (showConfirm) {\r\n <button\r\n type=\"button\"\r\n matButton=\"filled\"\r\n class=\"ngx-dialog__confirm\"\r\n [class.ngx-dialog__confirm--destructive]=\"destructive\"\r\n [disabled]=\"confirmDisabled()\"\r\n (click)=\"onConfirmClick()\">\r\n {{ confirmText }}\r\n </button>\r\n }\r\n </mat-dialog-actions>\r\n}\r\n","import { Component, inject } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle } from '@angular/material/dialog';\r\nimport { ConfirmDialogData } from '../../models/confirm-dialog-data';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { NgxTexts } from '../../i18n';\r\n\r\n/**\r\n * @deprecated Usar `NgxDialogService.confirm()` (o `template()` con contenido propio), que tiene el\r\n * encabezado, el botón X y la opción `destructive` de ngx-dialog. Las tablas ya no lo usan; se\r\n * mantiene solo por compatibilidad con quien lo abra directamente.\r\n */\r\n@Component({\r\n selector: 'ngx-confirm-dialog',\r\n imports: [\r\n MatButtonModule,\r\n MatDialogTitle,\r\n MatDialogContent,\r\n MatDialogActions,\r\n MatDialogClose,\r\n CommonModule\r\n ],\r\n templateUrl: './ngx-confirm-dialog.component.html',\r\n styleUrl: './ngx-confirm-dialog.component.scss'\r\n})\r\nexport class NgxConfirmDialogComponent {\r\n dialogRef = inject(MatDialogRef<NgxConfirmDialogComponent>);\r\n data = inject<ConfirmDialogData>(MAT_DIALOG_DATA);\r\n readonly texts = inject(NgxTexts).texts;\r\n}\r\n","<h2 mat-dialog-title>{{data.title}}</h2>\r\n<mat-dialog-content>\r\n @if(data.body) {\r\n <p>{{data.body}}</p>\r\n }\r\n \r\n @if (data.template) {\r\n <ng-container *ngTemplateOutlet=\"data.template; context: { $implicit: data.row }\"></ng-container>\r\n }\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <button matButton [mat-dialog-close]=\"false\">{{ data.denyButtonLabel ?? texts().common.cancel }}</button>\r\n <button matButton [mat-dialog-close]=\"true\">{{ data.confirmButtonLabel ?? texts().common.confirm }}</button>\r\n</mat-dialog-actions>","import { ComponentRef, Directive, effect, inject, input, signal, Type, ViewContainerRef, WritableSignal } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[ngxDynamicCellHost]',\r\n})\r\nexport class DynamicCellHostDirective<T> {\r\n vcr = inject(ViewContainerRef);\r\n\r\n component = input<Type<any>>();\r\n row = input<T>();\r\n key = input<keyof T>();\r\n\r\n private _currentRef: ComponentRef<any> | null = null;\r\n private _rowSignal?: WritableSignal<T>;\r\n private _keySignal?: WritableSignal<keyof T>;\r\n\r\n effect = effect(() => {\r\n const component = this.component();\r\n const row = this.row();\r\n const key = this.key();\r\n\r\n //Si no hay componente, limpiamos lo que hubiera\r\n if (!component) {\r\n this.vcr.clear();\r\n this._currentRef = null;\r\n this._rowSignal = undefined;\r\n this._keySignal = undefined;\r\n return;\r\n }\r\n\r\n //Solo se recrea si cambia el tipo de componente. En caso contrario se reutiliza\r\n //la instancia y se actualizan sus signals, evitando apilar componentes en el DOM\r\n //cada vez que cambian los datos de la fila.\r\n if (this._currentRef?.componentType !== component) {\r\n this.vcr.clear();\r\n this._currentRef = this.vcr.createComponent(component);\r\n this._rowSignal = undefined;\r\n this._keySignal = undefined;\r\n }\r\n\r\n if (row === undefined || key === undefined)\r\n return;\r\n\r\n if (!this._rowSignal || !this._keySignal) {\r\n this._rowSignal = signal(row);\r\n this._keySignal = signal(key);\r\n this._currentRef!.instance.row = this._rowSignal;\r\n this._currentRef!.instance.key = this._keySignal;\r\n } else {\r\n this._rowSignal.set(row);\r\n this._keySignal.set(key);\r\n }\r\n });\r\n}\r\n","import { Pipe, type PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'ngxOnlyUpperFirstCharacter',\r\n})\r\nexport class OnlyUpperFirstCharacterPipe implements PipeTransform {\r\n\r\n transform(value: string): string {\r\n if (!value)\r\n return '';\r\n\r\n value = value.toLowerCase();\r\n return `${value.charAt(0).toUpperCase()}${value.slice(1)}`;\r\n }\r\n\r\n}\r\n","import { PipeTransform, TemplateRef, Type, WritableSignal } from \"@angular/core\";\r\nimport jsPDF from \"jspdf\";\r\nimport { Observable } from \"rxjs\";\r\nimport { PaginatedFilter } from \"./paginated-filter\";\r\nimport { PaginatedItems } from \"./paginated-items\";\r\n\r\nexport type FilterType = 'number' | 'text' | 'option' | 'option-multiple' | 'date' | 'date-range';\r\n\r\n//IMPORTANTE Si se añade aqui un color, hay que añadirlo tambien en paginated-table.component.scss\r\nexport type RowActionIconColor = 'Yellow' | 'Orange' | 'Pink' | 'Purple' | 'Green' | 'Blue' | 'Sky' | 'Brown';\r\n\r\nexport interface PaginatedTableConfig<T> {\r\n tableId: string;\r\n primaryKey: keyof T | Array<keyof T>;\r\n title: () => string;\r\n columns: PaginatedTableColumn<T>[];\r\n showQueryFilter?: boolean; //Filtro query para toda la tabla\r\n queryFilterPlaceholder?: string; //Placeholder del filtro query para toda la tabla\r\n create?: TableBasicAction<T>;\r\n update?: TableBasicAction<T>;\r\n clickOnRowForUpdate?: boolean; //Si esto se pone a true (desaparece el icono de acciones de update y toda la columna es el update) => Si expandableDetail true, esto se cancela y el editar se pone en acciones\r\n delete?: TableBasicAction<T>;\r\n deleteConfirm?: DeleteConfirm<T>;\r\n rowActions?: TableRowAction<T>[];\r\n showAdvancedFilters?: boolean;\r\n expandableDetail?: boolean;\r\n expandableDetailTemplateRef?: () => TemplateRef<{ $implicit: T }>; //Para crear la vista desde un template\r\n enableRowSelection?: boolean;\r\n showRowSelection?: (row: T) => boolean; //Para mostrar o no el checkbox de seleccion por fila\r\n rowSelectionAction?: RowSelectionAction<T>[]; //Para poner botones que actuen frente a una seleccion multiple,\r\n exportFileName?: () => string;\r\n mapperForExportData?: (row: T) => Partial<Record<keyof T, any>>;\r\n pdfConfig?: jsPDF;\r\n maxHeight?: string;\r\n defaultStickyColumn?: keyof T;\r\n showActions?: () => boolean; //Para mostrar o no la columna de acciones, en caso de que se tengan acciones de fila o clickOnRowForUpdate, esta propiedad se pondrá a true automaticamente, pero si no se quieren mostrar las acciones, se puede poner a false esta propiedad. En caso de que clickOnRowForUpdate sea true y expandableDetail sea true, entonces clickOnRowForUpdate se cancelará y las acciones de editar se pondrán en acciones de fila, por lo que en ese caso, showActions se pondrá a true automaticamente. Si se quieren ocultar las acciones en ese caso, habrá que poner showActions a false.\r\n hideExportData?: () => boolean; //Para mostrar o no el boton de exportar datos, en caso de que se tenga acciones de exportacion, esta propiedad se pondrá a false automaticamente, pero si no se quieren mostrar el boton de exportar datos, se puede poner a true esta propiedad.\r\n hideColumnConfig?: () => boolean; //Para ocultar el boton de configurar/visualizar columnas\r\n hideFullScreen?: () => boolean; //Para ocultar el boton de pantalla completa\r\n}\r\n\r\n/*\r\n PRIORIDAD DE CREACION DE LA VISTA \r\n 1 => componente\r\n 2 => template\r\n 3 => valueGetter\r\n 4 => valor de la columna por defecto aplicando pipes (en caso de que se especifiquen)\r\n*/\r\nexport interface PaginatedTableColumn<T> {\r\n key: keyof T;\r\n label: string;\r\n isSortable?: boolean; //Los datos de la columna se pueden ordenar\r\n filterType?: FilterType; //Los datos de la columna se pueden filtrar\r\n filterOptions?: FilterOption[]; //En caso de filterType = option o filterType = option-multiple entonces, se pintara un select y habra que mandar las opciones\r\n endpointForPaginatedFilterOptions?: (filters: PaginatedFilter<FilterOption>) => Observable<PaginatedItems<FilterOption>>;\r\n filtersForEndpointPaginatedFilterOptions?: WritableSignal<PaginatedFilter<FilterOption>>;\r\n component?: Type<any>; //Para crear la vista desde un component\r\n templateRef?: () => TemplateRef<{ $implicit: T }>; //Para crear la vista desde un template\r\n valueGetter?: (row: T) => string;\r\n pipes?: ColumnPipe | ColumnPipe[];\r\n showTotalPerPage?: boolean;\r\n showTotalGeneral?: boolean;\r\n getTotalGeneral?: () => number;\r\n totalFooterFormatter?: (total: number) => string;\r\n style?: string;\r\n footerStyle?: string;\r\n}\r\n\r\nexport interface TableBasicAction<T> {\r\n show?: (row?: T) => boolean;\r\n disabled?: (row?: T) => boolean;\r\n tooltip?: (row?: T) => string;\r\n}\r\n\r\nexport interface TableRowAction<T> {\r\n id: string;\r\n show?: (row: T) => boolean;\r\n disabled?: (row: T) => boolean;\r\n icon: string;\r\n iconColor?: RowActionIconColor;\r\n tooltip: (row: T) => string;\r\n}\r\n\r\nexport interface FilterOption {\r\n value: string;\r\n label: string;\r\n}\r\n\r\nexport function isFilterOption(obj: unknown): obj is FilterOption {\r\n return (\r\n typeof obj === 'object' &&\r\n obj !== null &&\r\n 'value' in obj &&\r\n 'label' in obj &&\r\n typeof (obj as any).value === 'string' &&\r\n typeof (obj as any).label === 'string'\r\n );\r\n}\r\n\r\nexport interface ColumnPipe {\r\n pipe: PipeTransform;\r\n args?: any[];\r\n}\r\n\r\nexport interface DeleteConfirm<T> {\r\n title: (row: T) => string;\r\n body?: (row: T) => string;\r\n templateRef?: () => TemplateRef<{ $implicit: T }>;\r\n}\r\n\r\nexport interface RowSelectionAction<T> {\r\n id: string;\r\n icon: string;\r\n label: (row: T[], totalSelected: number) => string;\r\n}","import { AbstractControl, FormArray, FormBuilder, FormGroup, Validators } from \"@angular/forms\";\r\nimport { ColumnValue } from \"./column-value\";\r\nimport { DatePipe } from \"@angular/common\";\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { isFilterOption, PaginatedTableColumn } from \"./paginated-table-config\";\r\nimport { DynamicFilter } from \"./dynamic-filter\";\r\nimport { AdvancedFilter, FilterGroup, FilterRule, FilterConnector, FilterOperator } from \"./advanced-filter\";\r\nimport { NgxEiffageTexts } from \"../i18n\";\r\n\r\nexport class AdvancedFilterUtils {\r\n static createAdvancedFilter = <T>(fb: FormBuilder, advancedFilter: AdvancedFilter<T>): FormGroup => {\r\n return fb.group({\r\n name: [advancedFilter.name, Validators.required],\r\n groups: fb.array(advancedFilter.groups.map(g => this.createFilterGroup(fb, g)))\r\n });\r\n }\r\n\r\n static createFilterGroup = <T>(fb: FormBuilder, group: FilterGroup<T>): FormGroup => {\r\n return fb.group({\r\n id: [group.id ?? uuidv4()],\r\n connector: [group.connector, Validators.required],\r\n filters: fb.array(group.filters.map(f => {\r\n return this.isFilterGroup<T>(f)\r\n ? this.createFilterGroup(fb, f)\r\n : this.createFilterRule(fb, f);\r\n }), [Validators.required])\r\n });\r\n }\r\n\r\n static createFilterRule = <T>(fb: FormBuilder, rule: FilterRule<T>): FormGroup => {\r\n return fb.group({\r\n id: [rule.id ?? uuidv4()],\r\n key: [rule.key ?? null, Validators.required],\r\n operator: [rule.operator ?? null, Validators.required],\r\n value: [rule.value ?? null, Validators.required]\r\n });\r\n }\r\n\r\n static isFilterGroup = <T>(obj: any): obj is FilterGroup<T> => {\r\n return obj &&\r\n typeof obj === 'object' &&\r\n 'connector' in obj &&\r\n 'filters' in obj;\r\n }\r\n\r\n private static isFilterRule<T>(obj: any): obj is FilterRule<T> {\r\n return obj && typeof obj === 'object' && 'key' in obj;\r\n }\r\n\r\n static addGroupToGroup<T>(fb: FormBuilder, form: FormGroup, groupId: string, group: FilterGroup<T>) {\r\n const groupFound = this.findGroupFormById(form.get('groups') as FormArray, groupId);\r\n if (groupFound) {\r\n const filters = groupFound.get('filters') as FormArray;\r\n const formGroup = this.createFilterGroup(fb, group);\r\n filters.push(formGroup);\r\n }\r\n }\r\n\r\n static deleteGroup<T>(form: FormGroup, groupId: string): boolean {\r\n const groupsArray = form.get('groups') as FormArray;\r\n return this.deleteByIdRecursive(groupsArray, groupId);\r\n }\r\n\r\n static addRuleToGroup = <T>(fb: FormBuilder, form: FormGroup, groupId: string, rule: FilterRule<T>) => {\r\n const group = this.findGroupFormById(form.get('groups') as FormArray, groupId);\r\n if (group) {\r\n const filters = group.get('filters') as FormArray;\r\n const formRule = this.createFilterRule(fb, rule);\r\n filters.push(formRule);\r\n }\r\n }\r\n\r\n static deleteRule<T>(form: FormGroup, ruleId: string): boolean {\r\n const groupsArray = form.get('groups') as FormArray;\r\n return this.deleteByIdRecursive(groupsArray, ruleId);\r\n }\r\n\r\n private static deleteByIdRecursive(array: FormArray, id: string): boolean {\r\n for (let i = 0; i < array.length; i++) {\r\n const control = array.at(i) as FormGroup;\r\n\r\n // Si el id coincide, eliminar directamente (da igual si es rule o group)\r\n if (control.get('id')?.value === id) {\r\n array.removeAt(i);\r\n return true;\r\n }\r\n\r\n // Si es un grupo, seguir buscando dentro de sus filtros\r\n const filters = control.get('filters');\r\n if (filters instanceof FormArray) {\r\n const deleted = this.deleteByIdRecursive(filters, id);\r\n if (deleted) return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n\r\n static findGroupFormById(array: FormArray, id: string): FormGroup | null {\r\n for (const control of array.controls) {\r\n const group = control as FormGroup;\r\n if (group.get('id')?.value === id)\r\n return group;\r\n\r\n const filters = group.get('filters') as FormArray;\r\n if (filters) {\r\n const found = this.findGroupFormById(filters, id);\r\n if (found)\r\n return found;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n static isFilterGroupForm(group: AbstractControl): boolean {\r\n return (\r\n group instanceof FormGroup &&\r\n group.contains('connector') &&\r\n group.contains('filters')\r\n );\r\n }\r\n\r\n /*static isFilterRuleForm(group: AbstractControl): boolean {\r\n return (\r\n group instanceof FormGroup &&\r\n group.contains('key') &&\r\n group.contains('operator') &&\r\n group.contains('value') &&\r\n !group.contains('filters')\r\n );\r\n }*/\r\n\r\n static mapFormToAdvancedFilter<T>(form: FormGroup): AdvancedFilter<T> {\r\n return {\r\n name: form.get('name')?.value,\r\n groups: (form.get('groups') as FormArray).controls\r\n .map(g => this.mapFormGroupToFilterGroup<T>(g as FormGroup))\r\n .filter(g => this.isNonEmptyGroup(g))\r\n };\r\n }\r\n\r\n\r\n private static mapFormGroupToFilterGroup<T>(groupForm: FormGroup): FilterGroup<T> {\r\n const id = groupForm.get('id')?.value as string;\r\n const connector = groupForm.get('connector')?.value as FilterConnector;\r\n const filtersArray = groupForm.get('filters') as FormArray;\r\n\r\n const filters = filtersArray.controls\r\n .map(control => {\r\n const value = control.value;\r\n if ('filters' in value)\r\n return this.mapFormGroupToFilterGroup<T>(control as FormGroup);\r\n else\r\n return this.mapFormGroupToFilterRule<T>(control as FormGroup);\r\n })\r\n .filter(f => this.isNonEmptyFilter(f));\r\n\r\n return {\r\n id: id,\r\n connector: connector,\r\n filters: filters\r\n };\r\n }\r\n\r\n\r\n private static mapFormGroupToFilterRule<T>(ruleForm: FormGroup): FilterRule<T> {\r\n return {\r\n id: ruleForm.get('id')?.value,\r\n key: ruleForm.get('key')?.value,\r\n operator: ruleForm.get('operator')?.value,\r\n value: ruleForm.get('value')?.value\r\n };\r\n }\r\n\r\n private static isNonEmptyFilter<T>(filter: FilterRule<T> | FilterGroup<T>): boolean {\r\n if (this.isFilterGroup(filter))\r\n return this.isNonEmptyGroup(filter);\r\n\r\n return this.isNonEmptyRule(filter);\r\n }\r\n\r\n private static isNonEmptyGroup<T>(group: FilterGroup<T>): boolean {\r\n return Array.isArray(group.filters) && group.filters.some(f => this.isNonEmptyFilter(f));\r\n }\r\n\r\n private static isNonEmptyRule<T>(rule: FilterRule<T>): boolean {\r\n return !!(rule.key && rule.operator && rule.value !== undefined && rule.value !== null && rule.value !== '');\r\n }\r\n\r\n static groupsToReadableHtml<T>(groups: FilterGroup<T>[], columns: PaginatedTableColumn<T>[], texts: NgxEiffageTexts): string {\r\n return this.groupToHtml(groups[0], columns, texts);\r\n //return groups.map(g => this.groupToString(g)).join(' OR ');\r\n }\r\n\r\n private static groupToHtml<T>(group: FilterGroup<T>, columns: PaginatedTableColumn<T>[], texts: NgxEiffageTexts): string {\r\n const connectorLabel = group.connector === 'AND' ? texts.advancedFilters.and : texts.advancedFilters.or;\r\n const connector = ` <strong>${connectorLabel}</strong> `;\r\n\r\n const parts = group.filters.map(filter => {\r\n if (this.isFilterGroup<T>(filter))\r\n return `<strong>[ </strong>${this.groupToHtml(filter, columns, texts)}<strong> ]</strong>`;\r\n else\r\n return this.ruleToHtml(filter, columns, texts);\r\n });\r\n\r\n return parts.join(connector);\r\n }\r\n\r\n private static ruleToHtml<T>(rule: FilterRule<T>, columns: PaginatedTableColumn<T>[], texts: NgxEiffageTexts): string {\r\n const column = columns.find(column => column.key == rule.key);\r\n\r\n if (!column)\r\n return \"\";\r\n\r\n const key = `<i>${column.label}</i>`;\r\n const operator = rule.operator ? this.getOperatorLabel(rule.operator, texts).toLowerCase() : '';\r\n //const operator = rule.operator ?? '';\r\n const value = this.valueToHtml(rule.value, column);\r\n return `${key} ${operator} \"${value}\"`;\r\n }\r\n\r\n private static getOperatorLabel(operator: FilterOperator, texts: NgxEiffageTexts): string {\r\n const operatorLabels: Record<FilterOperator, string> = {\r\n '=': texts.advancedFilters.operators.equals,\r\n '<>': texts.advancedFilters.operators.notEquals,\r\n '>': texts.advancedFilters.operators.greaterThan,\r\n '>=': texts.advancedFilters.operators.greaterOrEquals,\r\n '<': texts.advancedFilters.operators.lessThan,\r\n '<=': texts.advancedFilters.operators.lessOrEquals,\r\n 'LIKE': texts.advancedFilters.operators.like\r\n };\r\n return operatorLabels[operator];\r\n }\r\n\r\n private static valueToHtml<T>(value: ColumnValue, column: PaginatedTableColumn<T>): string {\r\n switch (column.filterType) {\r\n case 'option':\r\n case 'option-multiple':\r\n if (isFilterOption(value))\r\n return value.label;\r\n\r\n const optionSelected = column.filterOptions?.find(option => option.value == value);\r\n return optionSelected?.label ?? '';\r\n case 'date':\r\n case 'date-range':\r\n const pipe = new DatePipe('es-ES');\r\n return pipe.transform(value as string, 'dd/MM/yyyy') ?? '';\r\n }\r\n\r\n return value as string;\r\n }\r\n\r\n static mapToDynamicFilter<T>(advancedFilter: AdvancedFilter<T>): DynamicFilter<T>[] {\r\n const result: DynamicFilter<T>[] = [];\r\n\r\n for (const group of advancedFilter.groups) {\r\n result.push(...this.mapGroupToDynamicFilters(group));\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private static mapGroupToDynamicFilters<T>(group: FilterGroup<T>): DynamicFilter<T>[] {\r\n const filters: DynamicFilter<T>[] = [];\r\n\r\n for (const f of group.filters) {\r\n if (this.isFilterGroup<T>(f)) {\r\n filters.push(...this.mapGroupToDynamicFilters(f));\r\n } else if (this.isFilterRule<T>(f) && f.key && f.operator && f.value !== undefined && f.value !== null) {\r\n filters.push({\r\n campo: f.key,\r\n operador: f.operator,\r\n valor: f.value?.toString(),\r\n conector: group.connector,\r\n grupo: group.id ?? 'root'\r\n });\r\n }\r\n }\r\n\r\n return filters;\r\n }\r\n\r\n\r\n static normalizeAdvancedFilterForBackend<T>(filter: AdvancedFilter<T>): AdvancedFilter<T> {\r\n return {\r\n ...filter,\r\n groups: filter.groups.map(group => this.normalizeGroupForBackend(group))\r\n };\r\n }\r\n\r\n private static normalizeGroupForBackend<T>(group: FilterGroup<T>): FilterGroup<T> {\r\n return {\r\n ...group,\r\n filters: group.filters.map(f => {\r\n if (this.isFilterGroup(f)) {\r\n return this.normalizeGroupForBackend(f);\r\n }\r\n\r\n return this.normalizeRuleForBackend(f);\r\n })\r\n };\r\n }\r\n\r\n private static normalizeRuleForBackend<T>(rule: FilterRule<T>): FilterRule<T> {\r\n if (isFilterOption(rule.value)) {\r\n return {\r\n ...rule,\r\n value: rule.value.value\r\n };\r\n }\r\n\r\n return rule;\r\n }\r\n}\r\n","import { InjectionToken, Signal, signal } from \"@angular/core\";\r\n\r\n/**\r\n * Signal con el identificador del usuario actual. Se usa para aislar por usuario\r\n * la configuracion de columnas y los filtros avanzados guardados en localStorage.\r\n *\r\n * Si la aplicacion no lo provee, el valor por defecto es `undefined`, lo que\r\n * desactiva la persistencia: las tablas siguen funcionando, pero no recuerdan\r\n * la configuracion entre sesiones.\r\n */\r\nexport const USER_ID_FACTORY = new InjectionToken<Signal<string | null | undefined>>(\r\n 'USER_ID_FACTORY',\r\n {\r\n providedIn: 'root',\r\n factory: () => signal<string | null | undefined>(undefined)\r\n }\r\n);\r\n","import { FilterOption, FilterType } from \"./paginated-table-config\";\r\nimport { ColumnValue } from \"../models/column-value\";\r\n\r\nexport type FilterConnector = 'AND' | 'OR';\r\n\r\nexport type FilterOperator = '=' | '<>' | '>' | '>=' | '<' | '<=' | 'LIKE';\r\n\r\nexport interface AdvancedFilter<T> {\r\n name: string;\r\n groups: FilterGroup<T>[];\r\n}\r\n\r\nexport interface FilterGroup<T> {\r\n id?: string;\r\n connector: FilterConnector;\r\n filters: (FilterRule<T> | FilterGroup<T>)[];\r\n}\r\n\r\nexport interface FilterRule<T> {\r\n id?: string;\r\n key?: keyof T;\r\n operator?: FilterOperator;\r\n value?: ColumnValue;\r\n}\r\n\r\nexport const OPERATOR_BY_FILTER_TYPE: Record<FilterType, FilterOperator[]> = {\r\n number: ['=', '<>', '>', '>=', '<', '<='],\r\n text: ['=', 'LIKE', '<>'],\r\n option: ['=', '<>'],\r\n 'option-multiple': ['=', '<>'], //Actuara como un option\r\n date: ['=', '<>', '>', '>=', '<', '<='],\r\n 'date-range': ['=', '<>', '>', '>=', '<', '<='] //Actuara como un date normal\r\n}","import { computed, effect, inject, Injectable, signal } from '@angular/core';\r\nimport { USER_ID_FACTORY } from '../models';\r\nimport { AdvancedFilter } from '../models/advanced-filter';\r\nimport { AdvancedFilterUtils } from '../models/advanced-filter-utils';\r\nimport { DynamicFilter } from '../models/dynamic-filter';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AdvancedFilterService {\r\n private userIdFactory = inject(USER_ID_FACTORY);\r\n\r\n private readonly PARTIAL_KEY_STORAGE_ADVANCED_FILTER_CONFIG = 'advanced_filter';\r\n private fullKey = computed(() => {\r\n const userId = this.userIdFactory();\r\n\r\n if (!userId)\r\n return undefined;\r\n\r\n return `${this.PARTIAL_KEY_STORAGE_ADVANCED_FILTER_CONFIG}_${userId}`;\r\n });\r\n\r\n private _advancedFilters = signal<Record<string, AdvancedFilter<any>[]>>({});\r\n advancedFilters = this._advancedFilters.asReadonly();\r\n\r\n private setAdvancedFiltersEffect = effect(() => {\r\n this.setAdvancedFilter();\r\n });\r\n\r\n constructor() {\r\n this.setAdvancedFilter();\r\n }\r\n\r\n private setAdvancedFilter() {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey) {\r\n this._advancedFilters.set({});\r\n return;\r\n }\r\n\r\n const recordAdvancedFitler = localStorage.getItem(localStorageKey);\r\n\r\n if (!recordAdvancedFitler) {\r\n this._advancedFilters.set({});\r\n return;\r\n }\r\n\r\n const advancedFilters: Record<string, AdvancedFilter<any>[]> = JSON.parse(recordAdvancedFitler);\r\n\r\n this._advancedFilters.set(advancedFilters);\r\n }\r\n\r\n saveAdvancedFilter(tableId: string, advancedFilter: AdvancedFilter<any>): boolean {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey)\r\n return false;\r\n\r\n this._advancedFilters.update(currentValue => {\r\n const currentArray = currentValue[tableId] ?? [];\r\n\r\n const index = currentArray.findIndex(f => f.groups[0].id === advancedFilter.groups[0].id);\r\n let newArray: AdvancedFilter<any>[];\r\n if (index >= 0) { //Si existe, lo reemplazamos\r\n newArray = [...currentArray];\r\n newArray[index] = advancedFilter;\r\n } else { // Si no existe, lo añadimos\r\n newArray = [...currentArray, advancedFilter];\r\n }\r\n\r\n const newValue: Record<string, AdvancedFilter<any>[]> = {\r\n ...currentValue,\r\n [tableId]: newArray\r\n };\r\n localStorage.setItem(localStorageKey, JSON.stringify(newValue));\r\n return newValue;\r\n });\r\n\r\n return true;\r\n }\r\n\r\n deleteAdvancedFilter(tableId: string, advancedFilter: AdvancedFilter<any>): boolean {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey)\r\n return false;\r\n\r\n this._advancedFilters.update(currentValue => {\r\n const currentArray = currentValue[tableId] ?? [];\r\n\r\n const newArray = currentArray.filter(f => f.groups[0].id !== advancedFilter.groups[0].id);\r\n\r\n const newValue: Record<string, AdvancedFilter<any>[]> = {\r\n ...currentValue,\r\n [tableId]: newArray\r\n };\r\n localStorage.setItem(localStorageKey, JSON.stringify(newValue));\r\n\r\n return newValue;\r\n });\r\n\r\n return true;\r\n }\r\n\r\n getAdvancedFilterById(tableId: string, advancedFilterId: string, normalizeForBackend: boolean = true): AdvancedFilter<any> | undefined {\r\n const allAdvancedFiltersByTable = this._advancedFilters()[tableId];\r\n\r\n if (!allAdvancedFiltersByTable)\r\n return undefined;\r\n\r\n const advancedFilter = allAdvancedFiltersByTable.find(advancedFilter => {\r\n return advancedFilter.groups?.[0].id !== undefined && advancedFilter.groups[0].id == advancedFilterId;\r\n });\r\n\r\n if (!normalizeForBackend)\r\n return advancedFilter;\r\n\r\n if (!advancedFilter)\r\n return undefined;\r\n\r\n return AdvancedFilterUtils.normalizeAdvancedFilterForBackend(advancedFilter);\r\n }\r\n\r\n getDynamicFiltersById(tableId: string, advancedFilterId: string): DynamicFilter<any>[] {\r\n const advancedFilter = this.getAdvancedFilterById(tableId, advancedFilterId);\r\n\r\n if (!advancedFilter)\r\n return [];\r\n\r\n return AdvancedFilterUtils.mapToDynamicFilter(advancedFilter);\r\n }\r\n}\r\n","import { computed, effect, inject, Injectable, signal } from '@angular/core';\r\nimport { ColumnConfig } from '../models/configure-table-column-data';\r\nimport { USER_ID_FACTORY } from '../models';\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ColumnConfigService {\r\n private userIdFactory = inject(USER_ID_FACTORY);\r\n\r\n private readonly PARTIAL_KEY_STORAGE_COLUMN_CONFIG = 'column_config';\r\n private fullKey = computed(() => {\r\n const userId = this.userIdFactory();\r\n\r\n if (!userId)\r\n return undefined;\r\n\r\n return `${this.PARTIAL_KEY_STORAGE_COLUMN_CONFIG}_${userId}`;\r\n });\r\n\r\n private _columnConfigs = signal<Record<string, ColumnConfig<any>[]>>({});\r\n columnConfigs = this._columnConfigs.asReadonly();\r\n\r\n private setColumnConfigEffect = effect(() => {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey) {\r\n this._columnConfigs.set({});\r\n return;\r\n }\r\n\r\n const recordColumnConfig = localStorage.getItem(localStorageKey);\r\n\r\n if (!recordColumnConfig) {\r\n this._columnConfigs.set({});\r\n return;\r\n }\r\n\r\n const columnConfigs: Record<string, ColumnConfig<any>[]> = JSON.parse(recordColumnConfig);\r\n\r\n this._columnConfigs.set(columnConfigs);\r\n });\r\n\r\n saveColumnConfig(tableId: string, columnConfig: ColumnConfig<any>[]): boolean {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey)\r\n return false;\r\n\r\n this._columnConfigs.update(currentValue => {\r\n const newValue = {\r\n ...currentValue,\r\n [tableId]: columnConfig\r\n };\r\n localStorage.setItem(localStorageKey, JSON.stringify(newValue));\r\n return newValue;\r\n });\r\n\r\n return true;\r\n }\r\n\r\n deleteColumnConfig(tableId: string): boolean {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey)\r\n return false;\r\n\r\n this._columnConfigs.update(currentValue => {\r\n const newValue: Record<string, ColumnConfig<any>[]> = { ...currentValue };\r\n delete newValue[tableId];\r\n localStorage.setItem(localStorageKey, JSON.stringify(newValue));\r\n return newValue;\r\n });\r\n\r\n return true;\r\n }\r\n}\r\n","import { inject, Injectable, PLATFORM_ID, Signal, signal } from '@angular/core';\r\nimport { fromEvent, map, startWith } from 'rxjs';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { Pantalla } from '../models/pantalla';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DatosPantallaService {\r\n\r\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\r\n\r\n //En servidor no existe window, asi que se devuelve undefined en lugar de romper\r\n pantalla: Signal<Pantalla | undefined> = this.isBrowser\r\n ? toSignal(\r\n fromEvent(window, 'resize').pipe(\r\n startWith(this.obtenerDatosPantalla()),\r\n map(() => this.obtenerDatosPantalla())\r\n )\r\n )\r\n : signal<Pantalla | undefined>(undefined);\r\n\r\n private obtenerDatosPantalla(): Pantalla {\r\n let pantalla: Pantalla = {\r\n tipo: 'escritorio',\r\n ancho: window.innerWidth,\r\n alto: window.innerHeight\r\n }\r\n\r\n if (pantalla.ancho < 600) {\r\n pantalla.tipo = 'movil';\r\n return pantalla;\r\n }\r\n\r\n if (pantalla.ancho < 950) {\r\n pantalla.tipo = 'tablet';\r\n return pantalla;\r\n }\r\n\r\n return pantalla;\r\n }\r\n\r\n}\r\n","import { inject, Injectable, TemplateRef, Type } from \"@angular/core\";\nimport { MatDialog, MatDialogConfig } from \"@angular/material/dialog\";\nimport { Observable } from \"rxjs\";\nimport { DialogBodyConfig, DialogBodyType, DialogConfig, NgxDialogTemplateContext } from \"../models/dialog-config\";\nimport { NgxDialog } from \"../components\";\nimport { NgxTexts } from \"../i18n\";\n\n/** Opciones comunes a todos los diálogos. */\ninterface DialogHeaderOptions {\n title: string;\n subtitle?: string;\n icon?: string;\n iconColor?: string;\n cancelText?: string;\n confirmText?: string;\n showCancel?: boolean;\n showConfirm?: boolean;\n /** El botón de confirmar se pinta en el color de error (eliminar, descartar…). */\n destructive?: boolean;\n /**\n * Muestra la X de cerrar en el encabezado; cerrar con ella devuelve undefined, igual que Esc.\n * Por defecto true, salvo si dialogConfig.disableClose es true.\n */\n showClose?: boolean;\n}\n\n/**\n * Ancho mínimo por defecto: 400px, pero nunca más que la pantalla menos un margen\n * (un 400px fijo se salía de los móviles).\n */\nconst DEFAULT_MIN_WIDTH = 'min(400px, calc(100vw - 32px))';\n\n/**\n * Abre diálogos de Material con una estructura común: título con icono opcional, subtítulo,\n * cuerpo (texto, HTML, componente o plantilla) y botones de cancelar/confirmar.\n *\n * Todos devuelven un Observable que emite al cerrarse y completa:\n * - `true` (o el resultado fijado por el contenido) si se confirma,\n * - `false` si se cancela,\n * - `undefined` si se cierra sin pulsar ningún botón (Esc o clic fuera).\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class NgxDialogService {\n private readonly _dialog = inject(MatDialog);\n private readonly _texts = inject(NgxTexts).texts;\n\n /** Diálogo con un texto. Base de `confirm()` e `info()`. */\n openText(\n config: DialogHeaderOptions & { content: string },\n dialogConfig?: MatDialogConfig\n ): Observable<boolean | undefined> {\n const { content, ...header } = config;\n return this._open<boolean>(header, { type: DialogBodyType.TEXT, content }, dialogConfig);\n }\n\n /** Pregunta de confirmación con botones de cancelar y confirmar. */\n confirm(\n config: Omit<DialogHeaderOptions, 'showCancel' | 'showConfirm'> & { message: string },\n dialogConfig?: MatDialogConfig\n ): Observable<boolean | undefined> {\n const { message, ...header } = config;\n return this.openText({\n ...header,\n content: message,\n cancelText: config.cancelText ?? this._texts().dialog.cancel,\n confirmText: config.confirmText ?? this._texts().dialog.confirm,\n }, dialogConfig);\n }\n\n /** Aviso informativo con un único botón. */\n info(\n config: Omit<DialogHeaderOptions, 'showCancel' | 'showConfirm' | 'cancelText'> & { message: string },\n dialogConfig?: MatDialogConfig\n ): Observable<boolean | undefined> {\n const { message, ...header } = config;\n return this.openText({\n ...header,\n content: message,\n showCancel: false,\n confirmText: config.confirmText ?? this._texts().dialog.accept,\n }, dialogConfig);\n }\n\n /**\n * Diálogo con HTML. Angular sanea el HTML: se quitan scripts, estilos en línea y atributos\n * peligrosos. Para contenido con interacción, usa `component()` o `template()`.\n */\n html(\n config: DialogHeaderOptions & { html: string },\n dialogConfig?: MatDialogConfig\n ): Observable<boolean | undefined> {\n const { html, ...header } = config;\n return this._open<boolean>(header, { type: DialogBodyType.HTML, content: html }, dialogConfig);\n }\n\n /**\n * Diálogo con un componente propio. El componente recibe `componentData` por su input `data`\n * y puede inyectar `NgxDialogContext<R>` para devolver un resultado (`result`), cerrar\n * (`close()`) o deshabilitar el botón de confirmar (`confirmDisabled`).\n */\n component<T = any, R = boolean>(\n config: DialogHeaderOptions & { component: Type<any>; componentData?: T },\n dialogConfig?: MatDialogConfig\n ): Observable<R | boolean | undefined> {\n const { component, componentData, ...header } = config;\n return this._open<R>(header, { type: DialogBodyType.COMPONENT, content: component, data: componentData }, dialogConfig);\n }\n\n /**\n * Diálogo con una plantilla. La plantilla recibe `templateData` como `$implicit` y el contexto\n * del diálogo como `dialog` (`let-data let-dialog=\"dialog\"`).\n */\n template<T = any, R = boolean>(\n config: DialogHeaderOptions & { template: TemplateRef<NgxDialogTemplateContext<T, R>> | TemplateRef<{ $implicit: T }> | TemplateRef<T>; templateData?: T },\n dialogConfig?: MatDialogConfig\n ): Observable<R | boolean | undefined> {\n const { template, templateData, ...header } = config;\n return this._open<R>(header, { type: DialogBodyType.TEMPLATE, content: template, data: templateData }, dialogConfig);\n }\n\n private _open<R>(\n header: DialogHeaderOptions,\n body: DialogBodyConfig,\n dialogConfig?: MatDialogConfig\n ): Observable<R | boolean | undefined> {\n const data: DialogConfig = { ...header, body };\n return this._dialog.open<NgxDialog, DialogConfig, R | boolean>(NgxDialog, {\n ...dialogConfig,\n data,\n minWidth: dialogConfig?.minWidth ?? DEFAULT_MIN_WIDTH,\n autoFocus: dialogConfig?.autoFocus ?? false,\n }).afterClosed();\n }\n}\n","import { CdkDrag, CdkDragDrop, CdkDropList, moveItemInArray } from '@angular/cdk/drag-drop';\r\nimport { Component, computed, inject, signal } from '@angular/core';\r\nimport { DateRange } from '@angular/material/datepicker';\r\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle } from '@angular/material/dialog';\r\nimport moment from 'moment';\r\nimport { ConfigureTableColumnData, ColumnConfig } from '../../../models/configure-table-column-data';\r\nimport { ColumnConfigService } from '../../../services/column-config.service';\r\nimport { LowerCasePipe } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { NgxTexts } from '../../../i18n';\r\nimport { isFilterOption } from '../../../models';\r\n\r\n@Component({\r\n selector: 'lib-configure-table-columns',\r\n imports: [\r\n MatButtonModule,\r\n MatDialogTitle,\r\n MatDialogContent,\r\n MatDialogActions,\r\n MatDialogClose,\r\n LowerCasePipe,\r\n MatIconModule,\r\n MatSlideToggleModule,\r\n CdkDropList,\r\n CdkDrag,\r\n MatTooltipModule\r\n ],\r\n templateUrl: './configure-table-columns.component.html',\r\n styleUrl: './configure-table-columns.component.scss',\r\n})\r\nexport class ConfigureTableColumnsComponent<T> {\r\n columnConfigService = inject(ColumnConfigService);\r\n dialogRef = inject(MatDialogRef<ConfigureTableColumnsComponent<T>>);\r\n data = inject<ConfigureTableColumnData<T>>(MAT_DIALOG_DATA);\r\n readonly texts = inject(NgxTexts).texts;\r\n columns = signal(this.data.columns);\r\n isConfirmDisabled = computed(() => {\r\n const allDisabled = this.columns().every(column => !column.show);\r\n const someHasFilter = this.columns().some(column => this.hasFilterAndDisabled(column));\r\n return allDisabled || someHasFilter;\r\n });\r\n\r\n startAnimationTimeout?: number = undefined;\r\n endAnimationTimeout?: number = undefined;\r\n animationTime: number = 250;\r\n animationIndex = signal<number | undefined>(undefined);\r\n\r\n hasFilterAndDisabled(column: ColumnConfig<T>): boolean {\r\n const value = this.data.filtersValue[column.key];\r\n if (Array.isArray(value))\r\n return value.length > 0 && !column.show;\r\n\r\n if (typeof value === 'string')\r\n return value.length > 0 && !column.show;\r\n\r\n if (value instanceof DateRange)\r\n return (value.start != null || value.end != null) && !column.show;\r\n\r\n if (moment.isMoment(value))\r\n return !column.show;\r\n\r\n if (isFilterOption(value))\r\n return !column.show;\r\n\r\n return false;\r\n }\r\n\r\n onUpClick(index: number) {\r\n const cols = [...this.columns()];\r\n if (index > 0) {\r\n [cols[index - 1], cols[index]] = [cols[index], cols[index - 1]];\r\n this.columns.set(cols);\r\n }\r\n }\r\n\r\n onDownClick(index: number) {\r\n const cols = [...this.columns()];\r\n if (index < cols.length - 1) {\r\n [cols[index], cols[index + 1]] = [cols[index + 1], cols[index]];\r\n this.columns.set(cols);\r\n }\r\n }\r\n\r\n onDrop(event: CdkDragDrop<any, any, any>) {\r\n const cols = [...this.columns()];\r\n moveItemInArray(cols, event.previousIndex, event.currentIndex);\r\n this.columns.set(cols);\r\n }\r\n\r\n onToggleChange(columnClicked: ColumnConfig<T>) {\r\n this.columns.update(value => {\r\n return value.map(column => {\r\n if (column.key == columnClicked.key)\r\n return { ...column, show: !column.show };\r\n else\r\n return column;\r\n });\r\n });\r\n }\r\n\r\n onPinClick(columnConfig: ColumnConfig<T>, index: number) {\r\n const columns = [...this.columns()];\r\n const currentSticky = columns.find(c => c.isSticky);\r\n\r\n if (columnConfig.key == currentSticky?.key) {\r\n const newColumns = columns.map(c => {\r\n return {\r\n ...c,\r\n isSticky: false\r\n }\r\n });\r\n this.columns.set(newColumns);\r\n return;\r\n }\r\n\r\n clearTimeout(this.startAnimationTimeout);\r\n clearTimeout(this.endAnimationTimeout);\r\n this.animationIndex.set(undefined);\r\n\r\n this.animationIndex.set(index);\r\n\r\n this.startAnimationTimeout = setTimeout(() => {\r\n moveItemInArray(columns, index, 0);\r\n const newColumns = columns.map(c => {\r\n return {\r\n ...c,\r\n isSticky: c.key == columnConfig.key\r\n }\r\n });\r\n this.columns.set(newColumns);\r\n this.animationIndex.set(0);\r\n this.endAnimationTimeout = setTimeout(() => this.animationIndex.set(undefined), this.animationTime)\r\n }, this.animationTime);\r\n }\r\n\r\n onConfirmClick() {\r\n this.columnConfigService.saveColumnConfig(this.data.tableId, this.columns());\r\n this.dialogRef.close();\r\n }\r\n\r\n onResetClick() {\r\n this.columnConfigService.deleteColumnConfig(this.data.tableId);\r\n this.dialogRef.close();\r\n }\r\n}\r\n","<h2 mat-dialog-title>{{texts().columnsDialog.title}} {{data.tableName| lowercase}}</h2>\r\n<mat-dialog-content>\r\n\r\n <div class=\"columnsList\" cdkDropList (cdkDropListDropped)=\"onDrop($event)\">\r\n @for (column of columns(); track $index; let first = $first; let last = $last;) {\r\n <div \r\n class=\"columnContainer\" \r\n cdkDrag \r\n [class.pinned]=\"$index == animationIndex()\"\r\n [style]=\"{ transition: `background-color ${animationTime}ms ease` }\">\r\n\r\n <div class=\"labelContainer\">\r\n <mat-icon>drag_indicator</mat-icon>\r\n <p class=\"label\">\r\n {{data.columnsLabels[column.key] ?? ''}}\r\n @if(hasFilterAndDisabled(column)) {\r\n <span> {{texts().columnsDialog.hasFiltersApplied}}</span>\r\n }\r\n </p>\r\n </div>\r\n\r\n <div class=\"actions\">\r\n <button \r\n matIconButton\r\n [matTooltip]=\"column.isSticky ? texts().columnsDialog.unpin : texts().columnsDialog.pin\"\r\n (click)=\"onPinClick(column, $index)\">\r\n <mat-icon>{{column.isSticky ? 'keep_off' : 'keep'}}</mat-icon>\r\n </button>\r\n\r\n <button [matTooltip]=\"texts().columnsDialog.moveUp\" matIconButton [disabled]=\"$first\" (click)=\"onUpClick($index)\"><mat-icon>keyboard_arrow_up</mat-icon></button>\r\n <button [matTooltip]=\"texts().columnsDialog.moveDown\" matIconButton [disabled]=\"$last\" (click)=\"onDownClick($index)\"><mat-icon>keyboard_arrow_down</mat-icon></button>\r\n <mat-slide-toggle [checked]=\"column.show\" (toggleChange)=\"onToggleChange(column)\"></mat-slide-toggle>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <p class=\"note\"><span>{{texts().columnsDialog.note}}</span> {{texts().columnsDialog.hideColumnWithFiltersNote}}</p>\r\n \r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <button matButton [mat-dialog-close]=\"undefined\">{{texts().common.close}}</button>\r\n <button matButton (click)=\"onResetClick()\">{{texts().columnsDialog.reset}}</button>\r\n <button matButton [disabled]=\"isConfirmDisabled()\" (click)=\"onConfirmClick()\">{{texts().common.confirm}}</button>\r\n</mat-dialog-actions>","import { CommonModule } from '@angular/common';\r\nimport { AfterViewInit, Component, ElementRef, OnDestroy, WritableSignal, computed, effect, inject, input, output, signal, untracked, viewChild } from '@angular/core';\r\nimport { ControlValueAccessor, FormControl, FormGroupDirective, NgControl, NgForm, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule, SubscriptSizing } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\r\n\r\nimport { Observable } from 'rxjs';\r\nimport { PaginatedFilter, PaginatedItems } from '../../models';\r\nimport { rxResource } from '@angular/core/rxjs-interop';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { isFilterOption } from '../../models/paginated-table-config';\r\nimport { NgxTexts } from '../../i18n';\r\n\r\n@Component({\r\n selector: 'ngx-paginated-searchable-select',\r\n imports: [\r\n MatIconModule,\r\n MatFormFieldModule,\r\n MatSelectModule,\r\n MatInputModule,\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n CommonModule,\r\n MatProgressBarModule\r\n ],\r\n templateUrl: './ngx-paginated-searchable-select.component.html',\r\n styleUrl: './ngx-paginated-searchable-select.component.scss',\r\n})\r\nexport class PaginatedSearchableSelectComponent<T, U extends PaginatedFilter<T>> implements ControlValueAccessor, AfterViewInit, OnDestroy {\r\n\r\n // Inyectar el servicio de internacionalización.\r\n // inject() resuelve tambien los providers a nivel de componente/ruta, por lo que\r\n // el override sigue siendo posible.\r\n readonly texts = inject(NgxTexts).texts;\r\n\r\n endpoint = input.required<(filters: U) => Observable<PaginatedItems<T>>>();\r\n filters = input<WritableSignal<U>>(\r\n signal<U>(\r\n {\r\n pageNumber: 1,\r\n pageSize: 20,\r\n query: undefined\r\n } as U\r\n )\r\n );\r\n optionLabel = input<((option: T) => string)>(\r\n (o: T) => {\r\n if (isFilterOption(o))\r\n return o.label;\r\n\r\n throw new Error(\"Si el option no es de tipo FilterOption, es necesario especeficar el input optionLabel\");\r\n }\r\n );\r\n compareWith = input<(o1: T, o2: T) => boolean>(\r\n (o1: T, o2: T) => {\r\n if (!o2)\r\n return false;\r\n\r\n if (isFilterOption(o1) && isFilterOption(o2))\r\n return o1.value == o2.value;\r\n\r\n throw new Error(\"Si el option no es de tipo FilterOption, es necesario especeficar el input optionLabel\");\r\n }\r\n );\r\n multiple = input<boolean>(false);\r\n searchInputPlaceholder = input<string>();\r\n selectLabel = input<string | undefined>();\r\n selectPlaceholder = input<string>('');\r\n clearableOptionLabel = input<string>();\r\n subscriptSizing = input<SubscriptSizing>('fixed');\r\n clearable = input<boolean>(true);\r\n error = input<string>('');\r\n\r\n // Sin formulario (p. ej. los filtros de columna de las tablas): valor con [selected] y cambios con (optionChange).\r\n // En un formulario: formControlName / [formControl] / ngModel, como cualquier campo.\r\n selected = input<T | T[] | undefined>();\r\n disabled = input<boolean>(false);\r\n optionChange = output<T | T[] | undefined>();\r\n\r\n protected searcher = viewChild<ElementRef>('htmlSearcher');\r\n\r\n protected innerControl = signal<FormControl>(new FormControl(undefined));\r\n\r\n private queryTimeout: number | undefined = undefined;\r\n private readonly debounceTime = 300;\r\n\r\n /** Control del formulario si se usa con formControlName / [formControl] / ngModel (se registra como su value accessor). */\r\n private readonly _ngControl = inject(NgControl, { self: true, optional: true });\r\n private readonly _parentForm = inject(FormGroupDirective, { optional: true }) ?? inject(NgForm, { optional: true });\r\n private readonly _cvaDisabled = signal(false);\r\n private _onChange: (value: T | T[] | undefined) => void = () => {};\r\n private _onTouched: () => void = () => {};\r\n\r\n /** Asterisco de obligatorio: lo decide el control del formulario. */\r\n protected readonly isRequired = signal(false);\r\n /** Error con el estado del control del formulario (inválido y tocado, o formulario enviado). */\r\n protected readonly errorStateMatcher: ErrorStateMatcher = {\r\n isErrorState: () => {\r\n const control = this._ngControl?.control;\r\n return !!control && control.invalid && (control.touched || !!this._parentForm?.submitted);\r\n },\r\n };\r\n\r\n constructor() {\r\n if (this._ngControl) this._ngControl.valueAccessor = this;\r\n }\r\n\r\n selectedEffect = effect(() => {\r\n const disabled = this.disabled() || this._cvaDisabled();\r\n\r\n // En un formulario el control interno se conserva: el valor llega por writeValue\r\n if (this._ngControl) {\r\n const innerControl = untracked(this.innerControl);\r\n if (disabled) innerControl.disable({ emitEvent: false });\r\n else innerControl.enable({ emitEvent: false });\r\n return;\r\n }\r\n\r\n const selected = this.selected();\r\n this.innerControl.set(new FormControl({ value: selected, disabled: disabled }));\r\n });\r\n\r\n ngAfterViewInit(): void {\r\n // formControlName asigna su control después de registrar el value accessor: aquí ya está\r\n this.isRequired.set(this._ngControl?.control?.hasValidator(Validators.required) ?? false);\r\n }\r\n\r\n // ── ControlValueAccessor ──────────────────────────────────────────────────\r\n\r\n writeValue(value: T | T[] | undefined | null): void {\r\n this.innerControl().setValue(value ?? undefined, { emitEvent: false });\r\n }\r\n\r\n registerOnChange(fn: (value: T | T[] | undefined) => void): void {\r\n this._onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this._onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this._cvaDisabled.set(isDisabled);\r\n }\r\n\r\n dataResource = rxResource<PaginatedItems<T>, U>({\r\n params: () => this.filters()(),\r\n stream: ({ params }) => {\r\n const endpointPaginated = this.endpoint();\r\n return endpointPaginated(params);\r\n },\r\n defaultValue: { total: 0, items: [] }\r\n });\r\n\r\n protected options = signal<T[]>([]);\r\n\r\n setOptions = effect(() => {\r\n const paginatedRecords = this.dataResource.value();\r\n const pageNumber = this.filters()().pageNumber;\r\n\r\n if (!paginatedRecords)\r\n return;\r\n\r\n if (pageNumber > 1)\r\n this.options.update((oldValue: T[]) => [...oldValue, ...paginatedRecords.items]);\r\n else\r\n this.options.set(paginatedRecords.items);\r\n });\r\n /*protected options = computed(() => {\r\n if (this.dataResource.error())\r\n return [];\r\n\r\n const value = this.dataResource.value();\r\n return value.records;\r\n });*/\r\n\r\n protected total = computed(() => {\r\n if (this.dataResource.error())\r\n return 0;\r\n\r\n const value = this.dataResource.value();\r\n return value.total\r\n });\r\n\r\n ngOnDestroy(): void {\r\n //Limpiamos timeout de filtro query\r\n if (this.queryTimeout !== undefined)\r\n clearTimeout(this.queryTimeout);\r\n }\r\n\r\n protected openedChange(open: boolean) {\r\n if (!open)\r\n this._onTouched();\r\n\r\n if (!open)\r\n return;\r\n\r\n const searcher = this.searcher();\r\n\r\n if (!searcher)\r\n return;\r\n\r\n setTimeout(() => { searcher.nativeElement.focus(); });\r\n }\r\n\r\n protected cleanQuery() {\r\n const searcher = this.searcher();\r\n\r\n if (!searcher)\r\n return;\r\n\r\n searcher.nativeElement.value = \"\";\r\n this.onQueryChange();\r\n setTimeout(() => { searcher.nativeElement.focus(); });\r\n }\r\n\r\n protected onQueryChange() {\r\n const searcher = this.searcher();\r\n\r\n if (!searcher)\r\n return;\r\n\r\n const query = searcher.nativeElement.value;\r\n\r\n if (this.queryTimeout !== undefined)\r\n clearTimeout(this.queryTimeout);\r\n\r\n this.queryTimeout = setTimeout(() => {\r\n this.filters().update((value: U) => {\r\n return { ...value, query: query, pageNumber: 1 };\r\n });\r\n }, this.debounceTime);\r\n }\r\n\r\n protected getClearableOptionName(): string {\r\n const clearableOptionLabel = this.clearableOptionLabel();\r\n if (clearableOptionLabel)\r\n return clearableOptionLabel.toLowerCase();\r\n\r\n const selectLabel = this.selectLabel();\r\n if (selectLabel)\r\n return selectLabel.toLowerCase();\r\n\r\n const selectPlaceholder = this.selectPlaceholder();\r\n return selectPlaceholder.toLowerCase();\r\n }\r\n\r\n protected onOptionChange(event: MatSelectChange<T | T[] | undefined>) {\r\n this._onChange(event.value);\r\n this.optionChange.emit(event.value);\r\n }\r\n\r\n protected optionsSelectedForView(): T[] {\r\n const innerControl = this.innerControl();\r\n\r\n if (!innerControl.value)\r\n return [];\r\n\r\n if (Array.isArray(innerControl.value))\r\n return innerControl.value;\r\n\r\n return [innerControl.value];\r\n };\r\n\r\n protected onMoreClick() {\r\n this.filters().update((value: U) => {\r\n return {\r\n ...value,\r\n pageNumber: value.pageNumber + 1\r\n };\r\n });\r\n }\r\n}\r\n","<mat-form-field [subscriptSizing]=\"subscriptSizing()\">\r\n @if (selectLabel()) {\r\n <mat-label>{{ selectLabel() }}</mat-label>\r\n }\r\n\r\n <mat-select\r\n [formControl]=\"innerControl()\"\r\n [errorStateMatcher]=\"errorStateMatcher\"\r\n [required]=\"isRequired()\"\r\n [multiple]=\"multiple()\"\r\n (openedChange)=\"openedChange($event)\" \r\n [placeholder]=\"selectPlaceholder()\"\r\n panelClass=\"searchableSelectPanelClass\"\r\n (selectionChange)=\"onOptionChange($event)\"\r\n [compareWith]=\"compareWith()\">\r\n\r\n <div class=\"searcherContainer\">\r\n <mat-icon class=\"searchIcon\">search</mat-icon>\r\n\r\n @if (htmlSearcher.value.length == 0) {\r\n <span>{{ searchInputPlaceholder() || texts().common.search }}</span> \r\n }\r\n\r\n <input \r\n #htmlSearcher \r\n type=\"text\" \r\n matInput \r\n (keydown)=\"$event.stopPropagation()\"\r\n [value]=\"filters()().query ?? ''\" \r\n (input)=\"onQueryChange()\">\r\n\r\n @if (htmlSearcher.value.length > 0) {\r\n <button mat-icon-button (click)=\"cleanQuery()\"><mat-icon>close</mat-icon></button>\r\n }\r\n </div>\r\n\r\n <mat-progress-bar mode=\"indeterminate\" [style.visibility]=\"dataResource.isLoading() ? 'visible': 'hidden'\" />\r\n\r\n @if(clearable() && !multiple()) {\r\n <mat-option>{{ texts().select.removeOption(getClearableOptionName()) }}</mat-option>\r\n }\r\n \r\n @for (option of options(); track $index) {\r\n <mat-option [value]=\"option\">\r\n {{ optionLabel()(option) }}\r\n </mat-option>\r\n }\r\n\r\n <!-- Es MUY importante que estos vayan los ultimos (al final de todas las opciones). -->\r\n @for (option of optionsSelectedForView(); track $index) {\r\n <mat-option [value]=\"option\" class=\"hideOption\">\r\n {{ optionLabel()(option) }}\r\n </mat-option>\r\n }\r\n\r\n <!-- Si es multiple, como no esta el option de resetear, si filtran y no hay opciones, y luego cierran el select el desplegable no se abre y queda inutilizado, por eso, ponemos esta opcion dummy, que siempre esta oculta, y no hace nada, pero ya hace que haya un item, y el desplegable se abra -->\r\n @if(multiple()) {\r\n <mat-option class=\"hideOption\" dummyOption></mat-option>\r\n }\r\n\r\n @if (total() == 0) {\r\n <p class=\"withoutResults\">{{ texts().select.noResults }}</p>\r\n }\r\n\r\n @if((filters()().pageNumber * filters()().pageSize) < total() && !dataResource.isLoading()) {\r\n <button matButton=\"text\" class=\"showMore\" (click)=\"onMoreClick()\">\r\n {{ texts().select.showMore }}\r\n </button>\r\n }\r\n </mat-select>\r\n\r\n <mat-error>{{ error() }}</mat-error>\r\n</mat-form-field>","import { AfterViewInit, Component, ElementRef, effect, inject, input, output, signal, untracked, viewChild } from '@angular/core';\r\nimport { ControlValueAccessor, FormControl, FormGroupDirective, NgControl, NgForm, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule, SubscriptSizing } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\r\nimport { includeNoSensible } from '../../utils/string-operations';\r\nimport { CommonModule } from '@angular/common';\r\nimport { isFilterOption } from '../../models/paginated-table-config';\r\nimport { NgxTexts } from '../../i18n';\r\n\r\n\r\n@Component({\r\n selector: 'ngx-searchable-select',\r\n imports: [\r\n MatIconModule,\r\n MatFormFieldModule,\r\n MatSelectModule,\r\n MatInputModule,\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n CommonModule\r\n ],\r\n templateUrl: './ngx-searchable-select.component.html',\r\n styleUrl: './ngx-searchable-select.component.scss',\r\n})\r\nexport class SearchableSelectComponent<T> implements ControlValueAccessor, AfterViewInit {\r\n\r\n // Inyectar el servicio de internacionalización.\r\n // inject() resuelve tambien los providers a nivel de componente/ruta, por lo que\r\n // el override sigue siendo posible.\r\n readonly texts = inject(NgxTexts).texts;\r\n\r\n options = input.required<T[]>();\r\n optionLabel = input<(option: T) => string>(\r\n (option: T) => {\r\n if (isFilterOption(option))\r\n return option.label;\r\n\r\n throw new Error(\"Si el option no es de tipo FilterOption, es necesario especeficar el input optionLabel\");\r\n }\r\n );\r\n optionValue = input<(option: T) => string>(\r\n (option: T) => {\r\n if (isFilterOption(option))\r\n return option.value;\r\n\r\n throw new Error(\"Si el option no es de tipo FilterOption, es necesario especeficar el input optionValue\");\r\n }\r\n );\r\n multiple = input<boolean>(false);\r\n searchInputPlaceholder = input<string>();\r\n selectLabel = input<string | undefined>();\r\n selectPlaceholder = input<string>('');\r\n clearableOptionLabel = input<string>();\r\n subscriptSizing = input<SubscriptSizing>('fixed');\r\n clearable = input<boolean>(true);\r\n error = input<string>('');\r\n\r\n // Sin formulario (p. ej. los filtros de columna de las tablas): valor con [selected] y cambios con (optionChange).\r\n // En un formulario: formControlName / [formControl] / ngModel, como cualquier campo.\r\n selected = input<string | string[] | undefined>();\r\n disabled = input<boolean>(false);\r\n optionChange = output<string | string[] | undefined>();\r\n\r\n protected searcher = viewChild<ElementRef>('htmlSearcher');\r\n\r\n protected innerControl = signal<FormControl>(new FormControl(undefined));\r\n\r\n /** Control del formulario si se usa con formControlName / [formControl] / ngModel (se registra como su value accessor). */\r\n private readonly _ngControl = inject(NgControl, { self: true, optional: true });\r\n private readonly _parentForm = inject(FormGroupDirective, { optional: true }) ?? inject(NgForm, { optional: true });\r\n private readonly _cvaDisabled = signal(false);\r\n private _onChange: (value: string | string[] | undefined) => void = () => {};\r\n private _onTouched: () => void = () => {};\r\n\r\n /** Asterisco de obligatorio: lo decide el control del formulario. */\r\n protected readonly isRequired = signal(false);\r\n /** Error con el estado del control del formulario (inválido y tocado, o formulario enviado). */\r\n protected readonly errorStateMatcher: ErrorStateMatcher = {\r\n isErrorState: () => {\r\n const control = this._ngControl?.control;\r\n return !!control && control.invalid && (control.touched || !!this._parentForm?.submitted);\r\n },\r\n };\r\n\r\n constructor() {\r\n if (this._ngControl) this._ngControl.valueAccessor = this;\r\n }\r\n\r\n selectedEffect = effect(() => {\r\n const disabled = this.disabled() || this._cvaDisabled();\r\n\r\n // En un formulario el control interno se conserva: el valor llega por writeValue\r\n if (this._ngControl) {\r\n const innerControl = untracked(this.innerControl);\r\n if (disabled) innerControl.disable({ emitEvent: false });\r\n else innerControl.enable({ emitEvent: false });\r\n return;\r\n }\r\n\r\n const selected = this.selected();\r\n this.innerControl.set(new FormControl({ value: selected, disabled: disabled }));\r\n });\r\n\r\n ngAfterViewInit(): void {\r\n // formControlName asigna su control después de registrar el value accessor: aquí ya está\r\n this.isRequired.set(this._ngControl?.control?.hasValidator(Validators.required) ?? false);\r\n }\r\n\r\n // ── ControlValueAccessor ──────────────────────────────────────────────────\r\n\r\n writeValue(value: string | string[] | undefined | null): void {\r\n this.innerControl().setValue(value ?? undefined, { emitEvent: false });\r\n }\r\n\r\n registerOnChange(fn: (value: string | string[] | undefined) => void): void {\r\n this._onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this._onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this._cvaDisabled.set(isDisabled);\r\n }\r\n\r\n protected openedChange(open: boolean) {\r\n if (!open)\r\n this._onTouched();\r\n\r\n /*if (open)\r\n this.cleanQuery();*/\r\n if (!open)\r\n return;\r\n\r\n const searcher = this.searcher();\r\n\r\n if (!searcher)\r\n return;\r\n\r\n setTimeout(() => { searcher.nativeElement.focus(); });\r\n }\r\n\r\n protected cleanQuery() {\r\n const searcher = this.searcher();\r\n\r\n if (!searcher)\r\n return;\r\n\r\n searcher.nativeElement.value = \"\";\r\n setTimeout(() => {\r\n searcher.nativeElement.focus();\r\n });\r\n }\r\n\r\n protected getClearableOptionName(): string {\r\n const clearableOptionLabel = this.clearableOptionLabel();\r\n if (clearableOptionLabel)\r\n return clearableOptionLabel.toLowerCase();\r\n\r\n const selectLabel = this.selectLabel();\r\n if (selectLabel)\r\n return selectLabel.toLowerCase();\r\n\r\n const selectPlaceholder = this.selectPlaceholder();\r\n return selectPlaceholder.toLowerCase();\r\n }\r\n\r\n protected showOption(option: T): boolean {\r\n const query: string = this.searcher()?.nativeElement?.value ?? '';\r\n const label = this.optionLabel()(option);\r\n return includeNoSensible(label, query);\r\n }\r\n\r\n protected onOptionChange(event: MatSelectChange<string | string[] | undefined>) {\r\n this._onChange(event.value);\r\n this.optionChange.emit(event.value);\r\n }\r\n\r\n protected numberOfResults(): number {\r\n const query: string = this.searcher()?.nativeElement?.value ?? '';\r\n const optionLabel = this.optionLabel();\r\n const results = this.options().filter((option) => {\r\n const label = optionLabel(option);\r\n return includeNoSensible(label, query);\r\n });\r\n return results.length;\r\n }\r\n}\r\n","<mat-form-field [subscriptSizing]=\"subscriptSizing()\">\r\n @if (selectLabel()) {\r\n <mat-label>{{selectLabel()}}</mat-label>\r\n }\r\n\r\n <mat-select\r\n [formControl]=\"innerControl()\"\r\n [errorStateMatcher]=\"errorStateMatcher\"\r\n [required]=\"isRequired()\"\r\n [multiple]=\"multiple()\"\r\n (openedChange)=\"openedChange($event)\" \r\n [placeholder]=\"selectPlaceholder()\"\r\n panelClass=\"searchableSelectPanelClass\"\r\n (selectionChange)=\"onOptionChange($event)\">\r\n\r\n <div class=\"searcherContainer\">\r\n <mat-icon class=\"searchIcon\">search</mat-icon>\r\n\r\n @if (htmlSearcher.value.length == 0) {\r\n <span>{{ searchInputPlaceholder() || texts().common.search }}</span> \r\n }\r\n\r\n <input \r\n #htmlSearcher \r\n type=\"text\" \r\n matInput \r\n (keydown)=\"$event.stopPropagation()\">\r\n\r\n @if (htmlSearcher.value.length > 0) {\r\n <button mat-icon-button (click)=\"cleanQuery()\"><mat-icon>close</mat-icon></button>\r\n }\r\n </div>\r\n\r\n @if(clearable() && !multiple()) {\r\n <mat-option>{{ texts().select.removeOption(getClearableOptionName()) }}</mat-option>\r\n }\r\n \r\n @for (option of options(); track $index) {\r\n <mat-option \r\n [value]=\"optionValue()(option)\"\r\n [class.hideOption]=\"!showOption(option)\">\r\n {{optionLabel()(option)}}\r\n </mat-option>\r\n }\r\n\r\n @if (numberOfResults() == 0) {\r\n <p class=\"withoutResults\">{{ texts().select.noResults }}</p>\r\n }\r\n </mat-select>\r\n\r\n <mat-error>{{error()}}</mat-error>\r\n</mat-form-field>","import { Component, computed, inject, input, output, signal } from '@angular/core';\r\nimport { FormGroup, FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\r\nimport { PaginatedTableConfig, OPERATOR_BY_FILTER_TYPE, FilterOperator, FilterType, PaginatedTableColumn, FilterOption, PaginatedFilter } from '../../../models';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { NgxTexts } from '../../../i18n';\r\nimport { PaginatedSearchableSelectComponent } from '../../../components/ngx-paginated-searchable-select/ngx-paginated-searchable-select.component';\r\nimport { SearchableSelectComponent } from '../../../components/ngx-searchable-select/ngx-searchable-select.component';\r\n\r\n@Component({\r\n selector: 'lib-advanced-filter-rule',\r\n imports: [\r\n MatButtonModule,\r\n MatIconModule,\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatDatepickerModule,\r\n MatTooltipModule,\r\n SearchableSelectComponent,\r\n PaginatedSearchableSelectComponent\r\n ],\r\n templateUrl: './advanced-filter-rule.component.html',\r\n styleUrl: './advanced-filter-rule.component.scss',\r\n})\r\nexport class AdvancedFilterRuleComponent<T> {\r\n rule = input.required<FormGroup>();\r\n config = input.required<PaginatedTableConfig<T>>();\r\n deleteFilter = output<string>();\r\n\r\n readonly texts = inject(NgxTexts).texts;\r\n columns = computed(() => this.config().columns.filter(column => column.filterType != undefined));\r\n operatorByFilterType = OPERATOR_BY_FILTER_TYPE;\r\n \r\n filterOperatorLabel = computed<Record<FilterOperator, string>>(() => ({\r\n '=': this.texts().advancedFilters.operators.equals,\r\n '<>': this.texts().advancedFilters.operators.notEquals,\r\n '>': this.texts().advancedFilters.operators.greaterThan,\r\n '>=': this.texts().advancedFilters.operators.greaterOrEquals,\r\n '<': this.texts().advancedFilters.operators.lessThan,\r\n '<=': this.texts().advancedFilters.operators.lessOrEquals,\r\n 'LIKE': this.texts().advancedFilters.operators.like\r\n }));\r\n\r\n protected defaultFiltersForPaginatedFilterOptions = signal<PaginatedFilter<FilterOption>>(\r\n {\r\n pageNumber: 1,\r\n pageSize: 20,\r\n query: undefined\r\n }\r\n );\r\n\r\n getRuleId(): string {\r\n return (this.rule().get('id')! as FormControl).value;\r\n }\r\n\r\n getKey(): FormControl {\r\n return this.rule().get('key')! as FormControl\r\n }\r\n\r\n getOperator(): FormControl {\r\n return this.rule().get('operator')! as FormControl\r\n }\r\n\r\n getValue(): FormControl {\r\n return this.rule().get('value')! as FormControl\r\n }\r\n\r\n getColumnSelected(value: keyof T): PaginatedTableColumn<T> | undefined {\r\n return this.columns().find(column => column.key == value);\r\n }\r\n\r\n getOperatorsOption(value: keyof T): FilterOperator[] {\r\n const columnSelected = this.getColumnSelected(value);\r\n\r\n if (!columnSelected || !columnSelected.filterType)\r\n return [];\r\n\r\n return this.operatorByFilterType[columnSelected.filterType];\r\n }\r\n\r\n getFilterType(value: keyof T): FilterType | undefined {\r\n const columnSelected = this.getColumnSelected(value);\r\n return columnSelected?.filterType;\r\n }\r\n\r\n onKeyChange(_?: string | string[]) {\r\n this.getOperator().setValue(null);\r\n this.getValue().setValue(null);\r\n }\r\n\r\n keyOptionLabel = (column: PaginatedTableColumn<T>): string => column.label\r\n keyOptionValue = (column: PaginatedTableColumn<T>): string => column.key as string\r\n\r\n operatorOptionLabel = (filterOperator: FilterOperator): string => this.filterOperatorLabel()[filterOperator];\r\n operatorOptionValue = (filterOperator: FilterOperator): string => filterOperator;\r\n}\r\n\r\n","<button \n matIconButton \n [matTooltip]=\"texts().advancedFilters.deleteFilter\" \n (click)=\"deleteFilter.emit(getRuleId())\"\n class=\"deleteButton\"\n type=\"button\">\n <mat-icon>delete</mat-icon>\n</button>\n\n<ngx-searchable-select\n [formControl]=\"getKey()\"\n [options]=\"columns()\"\n [optionLabel]=\"keyOptionLabel\"\n [optionValue]=\"keyOptionValue\"\n (optionChange)=\"onKeyChange($event)\"\n [selectLabel]=\"texts().advancedFilters.field\"\n [selectPlaceholder]=\"texts().advancedFilters.selectOption\"\n [error]=\"texts().advancedFilters.required\"\n/>\n\n<ngx-searchable-select\n [formControl]=\"getOperator()\"\n [options]=\"getOperatorsOption(getKey().value)\"\n [optionLabel]=\"operatorOptionLabel\"\n [optionValue]=\"operatorOptionValue\"\n [selectLabel]=\"texts().advancedFilters.condition\"\n [selectPlaceholder]=\"texts().advancedFilters.selectOption\"\n [error]=\"texts().advancedFilters.required\"\n/>\n\n@if (getFilterType(getKey().value) == 'text' || getFilterType(getKey().value) == 'number') {\n <mat-form-field>\n <mat-label>{{texts().advancedFilters.value}}</mat-label>\n <input [formControl]=\"getValue()\" [type]=\"getFilterType(getKey().value) ?? 'text'\" matInput>\n <mat-error>{{texts().advancedFilters.required}}</mat-error>\n </mat-form-field>\n}\n\n@if (getFilterType(getKey().value) == 'option' || getFilterType(getKey().value) == 'option-multiple') {\n @if(getColumnSelected(getKey().value)?.endpointForPaginatedFilterOptions) {\n <ngx-paginated-searchable-select \n [formControl]=\"getValue()\"\n [endpoint]=\"getColumnSelected(getKey().value)!.endpointForPaginatedFilterOptions!\"\n [filters]=\"getColumnSelected(getKey().value)!.filtersForEndpointPaginatedFilterOptions ?? defaultFiltersForPaginatedFilterOptions\"\n [selectLabel]=\"texts().advancedFilters.value\"\n [selectPlaceholder]=\"texts().advancedFilters.selectOption\"\n [error]=\"texts().advancedFilters.required\"\n />\n } @else {\n <ngx-searchable-select\n [formControl]=\"getValue()\"\n [options]=\"getColumnSelected(getKey().value)?.filterOptions ?? []\"\n [selectLabel]=\"texts().advancedFilters.value\"\n [selectPlaceholder]=\"texts().advancedFilters.selectOption\"\n [error]=\"texts().advancedFilters.required\"\n />\n }\n}\n\n@if(getFilterType(getKey().value) == 'date' || getFilterType(getKey().value) == 'date-range') {\n <mat-form-field>\n <mat-label>{{texts().advancedFilters.value}}</mat-label>\n <input\n [formControl]=\"getValue()\"\n matInput \n [matDatepicker]=\"picker\">\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n <mat-error>{{texts().advancedFilters.required}}</mat-error>\n </mat-form-field>\n}\n\n\n","import { Component, computed, inject, input, output } from '@angular/core';\r\nimport { ReactiveFormsModule, FormGroup, AbstractControl, FormControl, FormArray } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { PaginatedTableConfig, FilterOption } from '../../../models';\r\nimport { AdvancedFilterUtils } from '../../../models/advanced-filter-utils';\r\nimport { DatosPantallaService } from '../../../services/datos-pantalla.service';\r\nimport { AdvancedFilterRuleComponent } from '../advanced-filter-rule/advanced-filter-rule.component';\r\nimport { NgxTexts } from '../../../i18n';\r\n\r\n@Component({\r\n selector: 'lib-advanced-filter-group',\r\n imports: [\r\n MatButtonModule,\r\n MatIconModule,\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatDatepickerModule,\r\n AdvancedFilterRuleComponent,\r\n MatButtonToggleModule,\r\n MatTooltipModule\r\n ],\r\n templateUrl: './advanced-filter-group.component.html',\r\n styleUrl: './advanced-filter-group.component.scss',\r\n})\r\nexport class AdvancedFilterGroupComponent<T> {\r\n isRootNode = input.required<boolean>();\r\n group = input.required<FormGroup>();\r\n config = input.required<PaginatedTableConfig<T>>();\r\n addGroup = output<string>();\r\n addFilter = output<string>();\r\n deleteGroup = output<string>();\r\n deleteFilter = output<string>();\r\n\r\n private readonly datosPantallaService = inject(DatosPantallaService);\r\n readonly texts = inject(NgxTexts).texts;\r\n isDesktop = computed<boolean>(() => this.datosPantallaService.pantalla()?.tipo == 'escritorio');\r\n\r\n optionsFilterConnector = computed<FilterOption[]>(() => [\r\n { value: 'AND', label: this.texts().advancedFilters.and },\r\n { value: 'OR', label: this.texts().advancedFilters.or }\r\n ]);\r\n\r\n isFilterGroupForm(group: AbstractControl): boolean {\r\n return AdvancedFilterUtils.isFilterGroupForm(group);\r\n }\r\n\r\n getConnector(): FormControl {\r\n return this.group().get('connector')! as FormControl\r\n }\r\n\r\n getGroupId(): string {\r\n return (this.group().get('id')! as FormControl).value;\r\n }\r\n\r\n getFilters(): FormGroup[] {\r\n return (this.group().get('filters') as FormArray).controls as FormGroup[];\r\n }\r\n}\r\n","<div class=\"grupo\" [formGroup]=\"group()\">\r\n \r\n <mat-button-toggle-group [formControl]=\"getConnector()\">\r\n @for (option of optionsFilterConnector(); track option.value) {\r\n <mat-button-toggle [value]=\"option.value\">{{option.label}}</mat-button-toggle>\r\n }\r\n </mat-button-toggle-group>\r\n\r\n @if (isDesktop()) {\r\n <button \r\n matButton=\"outlined\" \r\n (click)=\"addFilter.emit(getGroupId())\"\r\n class=\"addFilterButton\"\r\n type=\"button\">\r\n <mat-icon>add</mat-icon>\r\n {{texts().advancedFilters.addFilter}}\r\n </button>\r\n\r\n <button \r\n matButton=\"outlined\"\r\n (click)=\"addGroup.emit(getGroupId())\"\r\n class=\"addGroupButton\"\r\n type=\"button\">\r\n <mat-icon>data_array</mat-icon>\r\n {{texts().advancedFilters.addGroup}}\r\n </button>\r\n } @else {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"texts().advancedFilters.addFilter\" \r\n (click)=\"addFilter.emit(getGroupId())\"\r\n class=\"addFilterButton\"\r\n type=\"button\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n\r\n <button \r\n matIconButton \r\n [matTooltip]=\"texts().advancedFilters.addGroup\" \r\n (click)=\"addGroup.emit(getGroupId())\"\r\n class=\"addGroupButton\"\r\n type=\"button\">\r\n <mat-icon>data_array</mat-icon>\r\n </button>\r\n }\r\n \r\n\r\n @if(!isRootNode()) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"texts().advancedFilters.deleteGroup\" \r\n (click)=\"deleteGroup.emit(getGroupId())\"\r\n class=\"deleteGroupButton\"\r\n type=\"button\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n }\r\n\r\n @for (group of getFilters(); track $index) {\r\n @if(isFilterGroupForm(group)) {\r\n <lib-advanced-filter-group \r\n [group]=\"group\"\r\n [config]=\"config()\"\r\n [isRootNode]=\"false\"\r\n (addGroup)=\"addGroup.emit($event)\"\r\n (addFilter)=\"addFilter.emit($event)\"\r\n (deleteGroup)=\"deleteGroup.emit($event)\"\r\n (deleteFilter)=\"deleteFilter.emit($event)\"\r\n />\r\n } @else {\r\n <lib-advanced-filter-rule \r\n [rule]=\"group\"\r\n [config]=\"config()\"\r\n (deleteFilter)=\"deleteFilter.emit($event)\"\r\n />\r\n }\r\n }\r\n\r\n</div>","import { Component, effect, inject, signal } from '@angular/core';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { FormBuilder, FormGroup, FormArray, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle } from '@angular/material/dialog';\r\nimport { FilterGroup, FilterRule } from '../../../models';\r\nimport { AdvancedFilterUtils } from '../../../models/advanced-filter-utils';\r\nimport { ConfigureAdvancedFilterData } from '../../../models/configure-advanced-filter-data';\r\nimport { AdvancedFilterService } from '../../../services/advanced-filter.service';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { LowerCasePipe } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { SendType } from '../../../models/send-type';\r\nimport { AdvancedFilterGroupComponent } from '../advanced-filter-group/advanced-filter-group.component';\r\nimport { NgxTexts } from '../../../i18n';\r\n\r\n@Component({\r\n selector: 'lib-configure-advanced-filter',\r\n imports: [\r\n MatDialogTitle,\r\n MatDialogContent,\r\n MatDialogActions,\r\n MatDialogClose,\r\n LowerCasePipe,\r\n MatButtonModule,\r\n MatIconModule,\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n AdvancedFilterGroupComponent\r\n ],\r\n templateUrl: './configure-advanced-filter.component.html',\r\n styleUrl: './configure-advanced-filter.component.scss',\r\n})\r\nexport class ConfigureAdvancedFilterComponent<T> { \r\n private readonly fb = inject(FormBuilder);\r\n private readonly advancedFilterService = inject(AdvancedFilterService);\r\n dialogRef = inject(MatDialogRef<ConfigureAdvancedFilterComponent<T>>);\r\n data = inject<ConfigureAdvancedFilterData<T>>(MAT_DIALOG_DATA);\r\n readonly texts = inject(NgxTexts).texts;\r\n\r\n query = signal('');\r\n\r\n form = AdvancedFilterUtils.createAdvancedFilter<T>(this.fb, this.data.advancedFilter);\r\n formChanges = toSignal(this.form.valueChanges);\r\n\r\n mapFormToAdvancedFilterEffect = effect(() => {\r\n const values = this.formChanges();\r\n\r\n if (this.form.invalid) {\r\n this.query.set('');\r\n return;\r\n }\r\n\r\n const advancedFilter = AdvancedFilterUtils.mapFormToAdvancedFilter<T>(this.form);\r\n const queryString = AdvancedFilterUtils.groupsToReadableHtml(advancedFilter.groups, this.data.config.columns, this.texts());\r\n this.query.set(queryString);\r\n });\r\n\r\n getRootGroup(): FormGroup {\r\n return (this.form.get('groups') as FormArray).controls[0] as FormGroup;\r\n }\r\n\r\n addGroup(groupId: string) {\r\n const newGroup: FilterGroup<T> = {\r\n id: uuidv4(),\r\n connector: 'AND',\r\n filters: [\r\n { id: uuidv4() }\r\n ]\r\n };\r\n AdvancedFilterUtils.addGroupToGroup<T>(this.fb, this.form, groupId, newGroup);\r\n }\r\n\r\n addFilter(groupId: string) {\r\n const newRule: FilterRule<T> = { id: uuidv4() };\r\n AdvancedFilterUtils.addRuleToGroup<T>(this.fb, this.form, groupId, newRule);\r\n }\r\n\r\n deleteGroup(groupId: string) {\r\n AdvancedFilterUtils.deleteGroup<T>(this.form, groupId);\r\n }\r\n\r\n deleteFilter(ruleId: string) {\r\n AdvancedFilterUtils.deleteRule<T>(this.form, ruleId);\r\n }\r\n\r\n onSubmit(sendType: SendType) {\r\n const advancedFilter = AdvancedFilterUtils.mapFormToAdvancedFilter<T>(this.form);\r\n const tableId = this.data.config.tableId;\r\n this.advancedFilterService.saveAdvancedFilter(tableId, advancedFilter);\r\n switch (sendType) {\r\n case 'save':\r\n this.dialogRef.close();\r\n break;\r\n case 'save_and_apply':\r\n this.dialogRef.close(advancedFilter);\r\n break;\r\n }\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (ngSubmit)=\"onSubmit('save_and_apply')\">\r\n\r\n <h2 mat-dialog-title>{{texts().advancedFilters.dialogTitle}} {{data.config.title() | lowercase}}</h2>\r\n <mat-dialog-content>\r\n\r\n <p class=\"advancedFilterResult\" [innerHTML]=\"query()\" [style.visibility]=\"query() ? 'visible': 'hidden'\"></p>\r\n\r\n <mat-form-field>\r\n <mat-label>{{texts().advancedFilters.templateName}}</mat-label>\r\n <input matInput formControlName=\"name\" [maxlength]=\"16\">\r\n <mat-hint>{{form.get('name')?.value.length ?? 0}}/16</mat-hint>\r\n <mat-error>{{texts().advancedFilters.templateNameRequired}}</mat-error>\r\n </mat-form-field>\r\n\r\n <lib-advanced-filter-group \r\n [group]=\"getRootGroup()\"\r\n [config]=\"data.config\"\r\n [isRootNode]=\"true\"\r\n (addGroup)=\"addGroup($event)\"\r\n (addFilter)=\"addFilter($event)\"\r\n (deleteGroup)=\"deleteGroup($event)\"\r\n (deleteFilter)=\"deleteFilter($event)\"\r\n />\r\n\r\n <div class=\"helperContainer\">\r\n <p class=\"helperTitle\"><strong>{{texts().advancedFilters.helpTitle}}</strong></p>\r\n <p class=\"helper\">\r\n <strong>{{texts().advancedFilters.group}} </strong>{{texts().advancedFilters.groupHelp}}<br>\r\n <strong>{{texts().advancedFilters.filter}} </strong>{{texts().advancedFilters.ruleHelp}}\r\n </p>\r\n </div>\r\n \r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button matButton [mat-dialog-close]=\"undefined\">{{texts().common.close}}</button>\r\n <button matButton [disabled]=\"form.invalid\" type=\"button\" (click)=\"onSubmit('save')\">{{texts().common.save}}</button>\r\n <button matButton [disabled]=\"form.invalid\" type=\"button\" (click)=\"onSubmit('save_and_apply')\">{{texts().common.saveAndApply}}</button>\r\n </mat-dialog-actions>\r\n\r\n\r\n</form>","import { CommonModule } from '@angular/common';\nimport { Component, computed, HostListener, inject, input, OnDestroy, output, Signal, signal, TemplateRef, viewChild, ViewContainerRef, WritableSignal } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { DateRange, MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatMenuModule, MatMenuTrigger } from '@angular/material/menu';\nimport { MatPaginatorModule, PageEvent } from '@angular/material/paginator';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\nimport { MatSortModule, Sort } from '@angular/material/sort';\nimport { MatTableModule } from '@angular/material/table';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { DynamicCellHostDirective } from '../../directives/dynamic-cell-host.directive';\nimport { OnlyUpperFirstCharacterPipe } from '../../pipes/only-upper-first-character.pipe';\nimport { Observable } from 'rxjs';\nimport { ColumnPipe, FilterOption, isFilterOption, PaginatedTableColumn, PaginatedTableConfig, RowSelectionAction, TableRowAction } from '../../models/paginated-table-config';\nimport moment from 'moment';\nimport { Overlay, OverlayContainer, OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { rxResource } from '@angular/core/rxjs-interop';\nimport { MatDialog } from '@angular/material/dialog';\nimport jsPDF from 'jspdf';\nimport autoTable from 'jspdf-autotable';\nimport { utils, writeFileXLSX } from 'xlsx';\nimport { AdvancedFilter, PaginatedFilter, PaginatedItems } from '../../models';\nimport { AdvancedFilterUtils } from '../../models/advanced-filter-utils';\nimport { ColumnValue } from '../../models/column-value';\nimport { ColumnConfig, ConfigureTableColumnData } from '../../models/configure-table-column-data';\nimport { AdvancedFilterService } from '../../services/advanced-filter.service';\nimport { ColumnConfigService } from '../../services/column-config.service';\nimport { DatosPantallaService } from '../../services/datos-pantalla.service';\nimport { RowActionClickEvent } from '../../models/row-action-click-event';\nimport { SelectionActionEvent } from '../../models/selection-action-event';\nimport { v4 as uuidv4 } from 'uuid';\nimport { NgxDialogService } from '../../services/ngx-dialog.service';\nimport { ConfigureTableColumnsComponent } from '../../common/components/configure-table-columns/configure-table-columns.component';\nimport { ConfigureAdvancedFilterData } from '../../models/configure-advanced-filter-data';\nimport { ConfigureAdvancedFilterComponent } from '../../common/components/configure-advanced-filter/configure-advanced-filter.component';\nimport { NgxTexts } from '../../i18n';\nimport { PaginatedSearchableSelectComponent } from '../ngx-paginated-searchable-select/ngx-paginated-searchable-select.component';\nimport { SearchableSelectComponent } from '../ngx-searchable-select/ngx-searchable-select.component';\n\n@Component({\n selector: 'ngx-paginated-table',\n imports: [\n MatTableModule,\n MatSortModule,\n MatPaginatorModule,\n MatIconModule,\n MatButtonModule,\n MatProgressBarModule,\n MatTooltipModule,\n MatFormFieldModule,\n MatInputModule,\n MatSelectModule,\n MatDatepickerModule,\n CommonModule,\n DynamicCellHostDirective,\n MatMenuModule,\n MatDividerModule,\n OnlyUpperFirstCharacterPipe,\n MatCheckboxModule,\n PaginatedSearchableSelectComponent,\n SearchableSelectComponent\n ],\n templateUrl: './ngx-paginated-table.component.html',\n styleUrl: './ngx-paginated-table.component.scss',\n host: { class: 'contenedorDefecto' }\n})\nexport class NgxPaginatedTable<T, U extends PaginatedFilter<T>> implements OnDestroy {\n \n private readonly columnConfigService = inject(ColumnConfigService);\n private readonly advancedFilterService = inject(AdvancedFilterService);\n private readonly dialog = inject(MatDialog);\n private readonly dialogService = inject(NgxDialogService);\n private readonly datosPantallaService = inject(DatosPantallaService);\n\n // Inyectar el servicio de internacionalización.\n // inject() resuelve tambien los providers a nivel de componente/ruta, por lo que\n // el override sigue siendo posible sin necesidad de instanciarlo a mano.\n readonly texts = inject(NgxTexts).texts;\n\n protected isDesktop = computed<boolean>(() => this.datosPantallaService.pantalla()?.tipo == 'escritorio');\n\n endpoint = input.required<(filters: U) => Observable<PaginatedItems<T>>>();\n filters = input<WritableSignal<U>>(\n signal<U>(\n {\n pageNumber: 1,\n pageSize: 10,\n query: undefined,\n sortBy: undefined,\n columnsFiltersValue: undefined,\n advancedFilterId: undefined\n } as U\n )\n );\n\n config = input.required<WritableSignal<PaginatedTableConfig<T>>>();\n\n protected createClick = output<void>();\n protected updateClick = output<T>();\n protected deleteClick = output<T>();\n protected rowActionClick = output<RowActionClickEvent<T>>();\n protected expandedItemChange = output<T | null>();\n protected selectionActionEvent = output<SelectionActionEvent<T>>();\n\n\n protected readonly filterKeyPrefix = 'filter';\n protected readonly nameOfActionsColumn = 'actionsPerRow';\n protected readonly generalFooterKeyPrefix = 'footer';\n protected readonly nameOfRowSelectionColumn = 'rowSelectionColumn';\n protected readonly debounceTime = 300;\n dataResource = rxResource<PaginatedItems<T>, U>({\n params: () => this.filters()(),\n stream: ({ params }) => {\n const endpointPaginated = this.endpoint();\n return endpointPaginated(params);\n },\n defaultValue: { total: 0, items: [] }\n });\n protected data = computed(() => {\n if (this.dataResource.error())\n return [];\n\n const value = this.dataResource.value();\n return value.items;\n });\n protected total = computed(() => {\n if (this.dataResource.error())\n return 0;\n\n const value = this.dataResource.value();\n return value.total\n });\n\n protected columnConfig = computed(() => {\n const columnConfigs = this.columnConfigService.columnConfigs();\n const configValue = this.config()();\n const columnConfig: ColumnConfig<T>[] | undefined = columnConfigs[configValue.tableId];\n const defaultColumnConfig: ColumnConfig<T>[] = configValue.columns.map(column => {\n return {\n key: column.key,\n show: true,\n isSticky: configValue.defaultStickyColumn == column.key\n }\n });\n\n if (!columnConfig)\n return defaultColumnConfig;\n\n //Por si acaso se quitan columnas a posteriori, hay que filtrarlas para que no aparezcan\n const filteredColumns = columnConfig.filter(column => this.includeInColumnConfig(column, defaultColumnConfig));\n\n //Por si a posteriori se añaden nuevas columnas\n const columnsAdded = defaultColumnConfig.filter(defaultColumn => !this.includeInColumnConfig(defaultColumn, columnConfig));\n\n return [...filteredColumns, ...columnsAdded];\n });\n\n protected stickyColumnKey = computed(() => this.columnConfig().find(c => c.isSticky)?.key);\n\n protected keys = computed(() => {\n const configValue = this.config()();\n const columnConfig = this.columnConfig();\n\n let keys: (string | keyof T)[] = [...columnConfig]\n .filter(column => column.show)\n .map(column => column.key);\n\n if ((configValue.showActions?.() ?? true) &&\n ((configValue.update && !configValue.clickOnRowForUpdate)\n || configValue.delete\n || (configValue.rowActions && configValue.rowActions.length > 0)\n || configValue.expandableDetail)\n ) {\n keys = [...keys, this.nameOfActionsColumn];\n }\n\n if (configValue.enableRowSelection)\n keys = [this.nameOfRowSelectionColumn, ...keys];\n\n return keys;\n });\n protected keysWithFilter = computed(() => this.keys().map(key => `${this.filterKeyPrefix}${this.getKeyAsString(key)}`));\n protected keysWithGeneralFooter = computed(() => this.keys().map(key => `${this.generalFooterKeyPrefix}${this.getKeyAsString(key)}`));\n protected showFiltersRow = computed(() => {\n const configValue = this.config()();\n return [...configValue.columns].some(column => column.filterType) && !configValue.showAdvancedFilters;\n });\n protected showActionsColumn = computed(() => this.keys().includes(this.nameOfActionsColumn));\n protected showTotalPerPageFooter = computed(() => {\n const columns = this.config()().columns;\n const keys = this.keys();\n return keys.some(key => columns.find(column => key == column.key)?.showTotalPerPage);\n });\n protected showTotalGeneralFooter = computed(() => {\n const columns = this.config()().columns;\n const keys = this.keys();\n //En la tabla paginada el total general solo puede calcularlo el consumidor,\n //asi que sin getTotalGeneral la fila quedaria vacia\n return keys.some(key => {\n const column = columns.find(column => key == column.key);\n return column?.showTotalGeneral && !!column.getTotalGeneral;\n });\n });\n\n protected queryTimeout: number | undefined = undefined;\n\n protected timeoutsByKey: Partial<Record<keyof T, number>> = {}\n\n protected advancedFilters: Signal<AdvancedFilter<T>[]> = computed(() => {\n const allTablesAdvancedFilters = this.advancedFilterService.advancedFilters();\n const tableId = this.config()().tableId;\n //Si la tabla todavia no tiene filtros guardados, la clave no existe en el record\n return allTablesAdvancedFilters[tableId] ?? [];\n });\n\n protected readonly expandableColumnDef = 'expandedDetail';\n protected expandedItem = signal<T | null>(null);\n\n protected selection = signal<T[]>([]);\n\n protected isFullScreen = signal(false);\n private readonly overlay = inject(Overlay);\n private readonly overlayContainer = inject(OverlayContainer);\n private readonly viewContainerRef = inject(ViewContainerRef);\n tableContentTemplate = viewChild<TemplateRef<any>>('tableContent');\n private overlayRef?: OverlayRef;\n private portal?: TemplatePortal;\n\n protected defaultFiltersForPaginatedFilterOptions = signal<PaginatedFilter<FilterOption>>(\n {\n pageNumber: 1,\n pageSize: 20,\n query: undefined\n }\n );\n\n @HostListener('document:keydown.escape')\n onEscape() {\n if (this.overlayRef && this.isMyOverlayOnTop())\n this.exitFullscreen();\n }\n\n ngOnDestroy(): void {\n //Limpiamos timeout de filtro query\n if (this.queryTimeout !== undefined)\n clearTimeout(this.queryTimeout);\n\n //Limpiamos todos los timeouts de filtros tipo texto de columnas\n Object.keys(this.timeoutsByKey).forEach((key) => {\n const timeout = this.timeoutsByKey[key as keyof T]\n clearTimeout(timeout);\n });\n }\n\n private includeInColumnConfig(searchedColumn: ColumnConfig<T>, allColumns: ColumnConfig<T>[]): boolean {\n return allColumns.some(column => searchedColumn.key == column.key);\n }\n\n protected getKeyAsString = (columnKey: keyof T | string): string => columnKey as string\n\n protected onPageChange(event: PageEvent) {\n this.filters().update(value => {\n return {\n ...value,\n pageNumber: value.pageSize == event.pageSize ? event.pageIndex + 1 : 1,\n pageSize: event.pageSize\n };\n });\n }\n\n protected onQueryChange(inputElement: HTMLInputElement) {\n const query = inputElement.value;\n\n if (this.queryTimeout !== undefined)\n clearTimeout(this.queryTimeout);\n\n this.queryTimeout = setTimeout(() => {\n this.filters().update((value: U) => {\n return { ...value, query: query, pageNumber: 1 };\n });\n }, this.debounceTime)\n }\n\n protected onQueryReset(inputElement: HTMLInputElement) {\n inputElement.value = '';\n this.onQueryChange(inputElement);\n }\n\n protected onSortChange(sort: Sort) {\n this.filters().update(value => {\n return {\n ...value,\n pageNumber: 1,\n sortBy: sort.direction ? { key: sort.active, direction: sort.direction } : undefined\n };\n });\n }\n\n protected onNewClick() {\n this.createClick.emit();\n }\n\n protected onUpdateClick(row: T, event: Event) {\n this.updateClick.emit(row);\n event.stopPropagation();\n }\n\n protected onRowClick(row: T) {\n if (this.isRowEnabled(row))\n this.updateClick.emit(row);\n }\n\n protected isRowEnabled(row: T): boolean | undefined {\n return this.config()().update\n && this.config()().clickOnRowForUpdate\n && (!this.config()().update?.show || this.config()().update?.show?.(row))\n && !this.config()().update?.disabled?.(row);\n }\n\n protected onDeleteClick(row: T, event: Event) {\n event.stopPropagation();\n\n const texts = this.texts();\n const header = {\n title: this.config()().deleteConfirm?.title?.(row) ?? texts.table.deleteConfirmTitle,\n confirmText: texts.table.confirmDelete,\n cancelText: texts.common.cancel,\n destructive: true,\n };\n const template = this.config()().deleteConfirm?.templateRef?.();\n const confirm$ = template\n ? this.dialogService.template({ ...header, template, templateData: row })\n : this.dialogService.confirm({ ...header, message: this.config()().deleteConfirm?.body?.(row) ?? texts.table.deleteConfirmBody });\n\n confirm$.subscribe(confirm => {\n if (confirm === true)\n this.deleteClick.emit(row);\n });\n }\n\n protected onRowActionClick(row: T, rowAction: TableRowAction<T>, event: Event) {\n this.rowActionClick.emit({ id: rowAction.id, row: row })\n event.stopPropagation();\n }\n\n protected onTextFilterColumnChange(column: PaginatedTableColumn<T>, event: Event) {\n const query = (event.target as HTMLInputElement).value;\n\n //Si existe, limpio el anterior\n if (column.key in this.timeoutsByKey)\n clearTimeout(this.timeoutsByKey[column.key]);\n\n this.timeoutsByKey[column.key] = setTimeout(() => {\n this.onColumnFilterChange(column.key, query);\n }, this.debounceTime);\n }\n\n protected onPaginatedOptionFilterColumnChange(column: PaginatedTableColumn<T>, option?: FilterOption | FilterOption[]) {\n this.onColumnFilterChange(column.key, option);\n }\n\n protected onOptionFilterColumnChange(column: PaginatedTableColumn<T>, value?: string | string[]) {\n this.onColumnFilterChange(column.key, value);\n }\n\n protected onDateFilterChange(column: PaginatedTableColumn<T>, value: moment.Moment | null) {\n this.onColumnFilterChange(column.key, value);\n }\n\n protected onDateRangeFilterChange(column: PaginatedTableColumn<T>, value: DateRange<moment.Moment | null> | null) {\n this.onColumnFilterChange(column.key, value);\n }\n\n private onColumnFilterChange(columnKey: keyof T, value: ColumnValue) {\n this.filters().update(currentValue => {\n //Se clona para no mutar el estado anterior de la signal\n const columnsFiltersValue: Partial<Record<keyof T, ColumnValue>> = {\n ...(currentValue.columnsFiltersValue ?? {}),\n [columnKey]: value\n };\n return {\n ...currentValue,\n pageNumber: 1,\n columnsFiltersValue: columnsFiltersValue\n }\n });\n }\n\n protected getValueOfColumnFilter(key: keyof T): ColumnValue {\n return this.filters()().columnsFiltersValue?.[key];\n }\n\n protected getPaginatedSearchableSelectValueOfColumnFilter(key: keyof T): FilterOption | FilterOption[] | undefined {\n const value = this.getValueOfColumnFilter(key);\n\n if (isFilterOption(value) || (Array.isArray(value) && value.every(v => isFilterOption(v))))\n return value;\n\n return undefined;\n }\n\n protected getSearchableSelectValueOfColumnFilter(key: keyof T): string | string[] | undefined {\n const value = this.getValueOfColumnFilter(key);\n\n if (typeof value === 'string' || (Array.isArray(value) && value.every(v => typeof v === 'string')))\n return value;\n\n return undefined;\n }\n\n protected getDateRangeValueOfColumnFilter(key: keyof T, type: 'start' | 'end'): moment.Moment | null {\n const value = this.getValueOfColumnFilter(key) as DateRange<moment.Moment | null>;\n\n if (!value)\n return null;\n\n return type == 'start' ? value.start : value.end\n }\n\n protected onEditColumns() {\n const config = this.config()();\n const filters = this.filters()();\n const columnConfig = this.columnConfig();\n\n const columnsLabel = Object.fromEntries(\n config.columns.map(column => [column.key, column.label])\n ) as Record<keyof T, string>;\n\n const data: ConfigureTableColumnData<T> = {\n tableId: config.tableId,\n tableName: config.title(),\n columns: columnConfig,\n filtersValue: filters.columnsFiltersValue ?? {},\n columnsLabels: columnsLabel\n };\n this.dialog.open(ConfigureTableColumnsComponent, { data: data });\n }\n\n protected applyColumnPipes(value: any, pipes?: ColumnPipe | ColumnPipe[]): any {\n if (!pipes)\n return value;\n\n const pipesArray = Array.isArray(pipes) ? pipes : [pipes];\n\n return pipesArray.reduce((v, p) => p.pipe.transform(v, ...(p.args || [])), value);\n }\n\n\n protected onNewAdvancedFiltersClick() {\n const data: ConfigureAdvancedFilterData<T> = {\n config: this.config()(),\n advancedFilter: {\n name: '',\n groups: [\n {\n id: uuidv4(),\n connector: 'AND',\n filters: [{ id: uuidv4() }]\n }\n ]\n }\n };\n const dialogRef = this.dialog.open(ConfigureAdvancedFilterComponent, { data: data });\n\n dialogRef.afterClosed().subscribe((advancedFilter?: AdvancedFilter<T>) => {\n if (advancedFilter)\n this.onApplyTemplateClick(advancedFilter);\n });\n }\n\n protected onApplyTemplateClick(advancedFilter?: AdvancedFilter<T>) {\n const advancedFilterId: string | undefined = advancedFilter?.groups?.[0].id;\n this.filters().update(currentValue => {\n return {\n ...currentValue,\n advancedFilterId: advancedFilterId,\n pageNumber: 1\n };\n });\n }\n\n protected onSelectedAdvancedFilterUpdate(event: Event) {\n const advancedFilterId = this.filters()().advancedFilterId;\n if (!advancedFilterId)\n return;\n\n const tableId = this.config()().tableId;\n const advancedFilter = this.advancedFilterService.getAdvancedFilterById(tableId, advancedFilterId, false);\n\n if (!advancedFilter)\n return;\n\n this.onAdvancedFilterUpdate(event, advancedFilter);\n }\n\n protected onAdvancedFilterUpdate(event: Event, advancedFilter: AdvancedFilter<T>, advancedFiltersMenuTrigger?: MatMenuTrigger) {\n event.stopPropagation();\n advancedFiltersMenuTrigger?.closeMenu();\n\n const data: ConfigureAdvancedFilterData<T> = {\n config: this.config()(),\n advancedFilter: advancedFilter\n };\n\n const dialogRef = this.dialog.open(ConfigureAdvancedFilterComponent, { data: data });\n\n dialogRef.afterClosed().subscribe((advancedFilter?: AdvancedFilter<T>) => {\n if (advancedFilter)\n this.onApplyTemplateClick(advancedFilter);\n });\n }\n\n protected onAdvancedFilterDelete(event: Event, advancedFiltersMenuTrigger: MatMenuTrigger, advancedFilter: AdvancedFilter<T>) {\n event.stopPropagation();\n advancedFiltersMenuTrigger.closeMenu();\n\n const texts = this.texts();\n this.dialogService.confirm({\n title: texts.advancedFilters.deleteTitle,\n message: texts.advancedFilters.deleteMessage(advancedFilter.name),\n confirmText: texts.table.confirmDelete,\n cancelText: texts.common.cancel,\n destructive: true,\n }).subscribe(confirm => {\n if (confirm === true) {\n if (this.filters()().advancedFilterId == advancedFilter.groups[0].id)\n this.onApplyTemplateClick();\n\n this.advancedFilterService.deleteAdvancedFilter(this.config()().tableId, advancedFilter);\n }\n });\n }\n\n protected onQuitAdvancedFilter(event: Event) {\n event.stopPropagation();\n this.onApplyTemplateClick();\n }\n\n protected getAdvancedFilterLabel(): string {\n const advancedFilterId = this.filters()().advancedFilterId;\n if (!advancedFilterId)\n return '';\n\n const tableId = this.config()().tableId;\n const advancedFilter = this.advancedFilterService.getAdvancedFilterById(tableId, advancedFilterId, false);\n\n if (!advancedFilter)\n return '';\n\n return AdvancedFilterUtils.groupsToReadableHtml<T>(advancedFilter.groups, this.config()().columns, this.texts());\n }\n\n protected rowIsExpanded(row: T): boolean {\n return this.expandedItem() == row;\n }\n\n protected expandableToggle(row: T) {\n this.expandedItem.update(currentValue => {\n const newValue = currentValue != row ? row : null;\n this.expandedItemChange.emit(newValue);\n return newValue;\n });\n }\n\n protected getTotalOfColum(columnKey: keyof T): number {\n const result = this.data().reduce((previous, item) => (previous + Number(item[columnKey])), 0);\n return result;\n }\n\n protected areEqualByKeys(record1: T, record2: T): boolean {\n const primaryKey = this.config()().primaryKey;\n\n if (Array.isArray(primaryKey))\n return primaryKey.every(key => record1[key] === record2[key]);\n else\n return record1[primaryKey] === record2[primaryKey];\n }\n\n protected isRowSelected(row: T): boolean {\n return this.selection().some(row2 => this.areEqualByKeys(row, row2));\n }\n\n protected toggleRowSelection(row: T) {\n if (this.isRowSelected(row)) {\n this.selection.update(recordsSelected => {\n return recordsSelected.filter(record => !this.areEqualByKeys(row, record));\n });\n } else {\n this.selection.update(recordsSelected => [...recordsSelected, row]);\n }\n }\n\n protected isAllPageRowSelected(): boolean {\n const records = this.getSelectableRows();\n return records.length > 0 && records.every(record => this.isRowSelected(record));\n }\n\n protected toggleAllPageRowSelection() {\n const records = this.getSelectableRows();\n\n if (this.isAllPageRowSelected()) {\n //Deseleccionar todas las filas seleccionables de la página actual\n this.selection.update(recordsSelected => {\n return recordsSelected.filter(\n record => !records.some(row2 => this.areEqualByKeys(record, row2))\n );\n });\n } else {\n //Seleccionar todas las filas seleccionables visibles que aún no estén seleccionadas\n const notSelected = records.filter(record => !this.isRowSelected(record));\n\n this.selection.update(recordsSelected => {\n // Evitar duplicados por si ya hay seleccionadas\n const nuevas = notSelected.filter(\n row => !recordsSelected.some(sel => this.areEqualByKeys(sel, row))\n );\n return [...recordsSelected, ...nuevas];\n });\n }\n }\n\n private getSelectableRows(): T[] {\n const showRowSelection = this.config()().showRowSelection;\n return showRowSelection ? this.data().filter(row => showRowSelection(row)) : this.data();\n }\n\n protected getRowSelectionAction(): RowSelectionAction<T>[] {\n return this.config()().rowSelectionAction ?? [];\n }\n\n protected uncheckAllSelection() {\n this.selection.set([]);\n }\n\n protected onRowSelectionActionClick(actionId: string) {\n this.selectionActionEvent.emit(\n {\n id: actionId,\n rows: this.selection()\n }\n );\n }\n\n private getDocumentHeaders(): string[] {\n const config = this.config()();\n return config.columns.map(c => c.label);\n }\n\n private getDocumentRows(): Partial<Record<keyof T, any>>[keyof T][][] {\n const config = this.config()();\n const columns = config.columns;\n\n const data = this.data();\n\n return data.map(row => {\n if (config.mapperForExportData) {\n const mapped = config.mapperForExportData(row);\n return columns.map(c => mapped[c.key]);\n }\n\n return columns.map(c => row[c.key] ?? '');\n });\n }\n\n protected exportToCsvCurrentPage() {\n const config = this.config()();\n\n const title = config.title();\n const fileName = config.exportFileName?.() ?? title;\n\n\n const headers = this.getDocumentHeaders();\n const rows = this.getDocumentRows();\n\n const aoaData = [headers, ...rows];\n\n //const workSheet = utils.json_to_sheet(data);\n\n const workSheet = utils.aoa_to_sheet(aoaData);\n const workBook = utils.book_new();\n\n //El nombre de la hoja no puede exceder de 31 caracteres\n const name = title.substring(0, 31);\n utils.book_append_sheet(workBook, workSheet, name);\n writeFileXLSX(workBook, `${fileName}.xlsx`);\n }\n\n protected exportToPdfCurrentPage() {\n const config = this.config()();\n\n const title = config.title();\n const fileName = config.exportFileName?.() ?? title;\n\n const headers = this.getDocumentHeaders();\n const rows = this.getDocumentRows();\n\n const doc = config.pdfConfig ?? new jsPDF({\n orientation: 'landscape',\n unit: 'pt',\n format: 'A4'\n });\n\n doc.setFontSize(14);\n doc.text(title, 40, 40);\n\n autoTable(doc, {\n startY: 60,\n head: [headers],\n body: rows,\n styles: { fontSize: 9, cellPadding: 4 },\n headStyles: { fillColor: [192, 0, 28], textColor: 255 },\n alternateRowStyles: { fillColor: [245, 245, 245] },\n tableLineColor: [200, 200, 200],\n tableLineWidth: 0.1,\n });\n\n doc.save(`${fileName}.pdf`);\n }\n\n protected onToggleFullScreen() {\n if (this.isFullScreen())\n this.exitFullscreen()\n else\n this.enterFullscreen();\n }\n\n private enterFullscreen() {\n if (this.overlayRef)\n return;\n\n this.overlayRef = this.overlay.create({\n hasBackdrop: false,\n scrollStrategy: this.overlay.scrollStrategies.block(),\n positionStrategy: this.overlay.position().global().top('0').left('0').right('0').bottom('0'),\n });\n\n this.portal = new TemplatePortal(this.tableContentTemplate()!, this.viewContainerRef);\n this.overlayRef.attach(this.portal);\n\n this.isFullScreen.set(true);\n }\n\n private exitFullscreen() {\n if (!this.overlayRef)\n return;\n\n this.overlayRef.detach();\n this.overlayRef.dispose();\n this.overlayRef = undefined;\n this.portal = undefined;\n\n this.isFullScreen.set(false);\n }\n\n private isMyOverlayOnTop(): boolean {\n if (!this.overlayRef)\n return false;\n\n //Contenedor principal de overlays en el DOM\n const containerElement = this.overlayContainer.getContainerElement();\n // Los overlays se añaden como hijos dentro de este contenedor\n const overlays = Array.from(containerElement.children);\n // El último hijo es el overlay más \"arriba\"\n const topOverlay = overlays[overlays.length - 1] as HTMLElement | undefined;\n\n return topOverlay === this.overlayRef.hostElement;\n }\n \n}\n","@if(!isFullScreen()) {\r\n <ng-container *ngTemplateOutlet=\"tableContentTemplate()\"></ng-container>\r\n}\r\n\r\n<ng-template #tableContent>\r\n <div class=\"tableContainer\" [class.inFullScreenMode]=\"isFullScreen()\">\r\n <div class=\"headerContainer\">\r\n <div class=\"titleAndButtonContainer\">\r\n <p class=\"title\">{{ config()().title() }}</p>\r\n <div class=\"buttonContainer\">\r\n @if(config()().create && (!config()().create?.show || config()().create?.show())) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"config()().create?.tooltip?.() ?? texts().table.create\" \r\n [disabled]=\"config()().create?.disabled?.()\" \r\n class=\"newButtonIcon\"\r\n (click)=\"onNewClick()\">\r\n <mat-icon>add_circle</mat-icon>\r\n </button>\r\n }\r\n\r\n @if(config()().hideColumnConfig?.() !== true) {\r\n <button matIconButton [matTooltip]=\"texts().table.editColumns\" class=\"editColumnsButtonIcon\" (click)=\"onEditColumns()\">\r\n <mat-icon>table_edit</mat-icon>\r\n </button>\r\n }\r\n\r\n @if(config()().showAdvancedFilters) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"texts().advancedFilters.label\"\r\n [matMenuTriggerFor]=\"advancedFiltersMenu\" \r\n #advancedFiltersMenuTrigger=\"matMenuTrigger\">\r\n\r\n <mat-icon>filter_alt</mat-icon>\r\n </button>\r\n\r\n <mat-menu #advancedFiltersMenu=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\r\n <button mat-menu-item (click)=\"onNewAdvancedFiltersClick()\">\r\n <mat-icon>filter_alt</mat-icon>\r\n <span>{{ texts().advancedFilters.new }}</span>\r\n </button>\r\n\r\n @for (advancedFilter of advancedFilters(); track $index; let first = $first) {\r\n @if (first) {\r\n <mat-divider />\r\n }\r\n\r\n <div mat-menu-item (click)=\"onApplyTemplateClick(advancedFilter)\">\r\n <div class=\"templateContainer\"> \r\n <span>{{advancedFilter.name | ngxOnlyUpperFirstCharacter}}</span>\r\n\r\n <div class=\"buttonTemplateContainer\">\r\n <button\r\n matIconButton \r\n [matTooltip]=\"texts().advancedFilters.editTooltip(advancedFilter.name | ngxOnlyUpperFirstCharacter)\"\r\n (click)=\"onAdvancedFilterUpdate($event, advancedFilter, advancedFiltersMenuTrigger)\">\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n\r\n <button\r\n matIconButton \r\n [matTooltip]=\"texts().advancedFilters.deleteTooltip(advancedFilter.name | ngxOnlyUpperFirstCharacter)\"\r\n (click)=\"onAdvancedFilterDelete($event, advancedFiltersMenuTrigger, advancedFilter)\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </mat-menu>\r\n }\r\n\r\n @if(selection().length > 0) {\r\n @if(getRowSelectionAction().length > 0) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"texts().table.selectionActions\"\r\n [matMenuTriggerFor]=\"selectedRecordsMenu\">\r\n <mat-icon>event_list</mat-icon>\r\n </button>\r\n\r\n <mat-menu #selectedRecordsMenu=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\r\n <button mat-menu-item (click)=\"uncheckAllSelection()\">\r\n <mat-icon>deselect</mat-icon>\r\n <span>{{ texts().table.deselectAll }}</span>\r\n </button>\r\n\r\n @for (action of getRowSelectionAction(); track $index) {\r\n <button mat-menu-item (click)=\"onRowSelectionActionClick(action.id)\">\r\n <mat-icon>{{action.icon}}</mat-icon>\r\n <span>{{action.label(selection(), selection().length)}}</span>\r\n </button>\r\n }\r\n </mat-menu>\r\n } @else {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"texts().table.deselectAll\"\r\n (click)=\"uncheckAllSelection()\">\r\n <mat-icon>deselect</mat-icon>\r\n </button>\r\n }\r\n }\r\n @if(config()().hideExportData?.() !== true) {\r\n <button matIconButton [matTooltip]=\"texts().table.export\" [matMenuTriggerFor]=\"exportMenu\">\r\n <mat-icon>download</mat-icon>\r\n </button>\r\n <mat-menu #exportMenu=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\r\n <button mat-menu-item (click)=\"exportToCsvCurrentPage()\">\r\n <mat-icon>csv</mat-icon>\r\n <span>{{ texts().table.exportExcel }}</span>\r\n </button>\r\n\r\n <button mat-menu-item (click)=\"exportToPdfCurrentPage()\">\r\n <mat-icon>picture_as_pdf</mat-icon>\r\n <span>{{ texts().table.exportPdf }}</span>\r\n </button>\r\n </mat-menu>\r\n }\r\n @if(config()().hideFullScreen?.() !== true) {\r\n <button matIconButton [matTooltip]=\"isFullScreen() ? texts().table.exitFullscreen : texts().table.enterFullscreen\" (click)=\"onToggleFullScreen()\">\r\n <mat-icon>{{isFullScreen() ? 'fullscreen_exit': 'fullscreen'}}</mat-icon>\r\n </button>\r\n }\r\n\r\n <ng-content select=\"[icon-buttons]\"></ng-content>\r\n </div>\r\n </div>\r\n\r\n <div class=\"filterContainer\">\r\n <div class=\"moreFiltersContainer\">\r\n <ng-content select=\"[more-filters]\"></ng-content>\r\n </div>\r\n\r\n @if(config()().showQueryFilter) {\r\n <mat-form-field subscriptSizing=\"dynamic\">\r\n <mat-icon matPrefix>search</mat-icon>\r\n <input #queryElement matInput [placeholder]=\"config()().queryFilterPlaceholder ?? texts().common.search\" [value]=\"filters()().query ?? ''\" (input)=\"onQueryChange(queryElement)\">\r\n <button matIconButton matSuffix (click)=\"onQueryReset(queryElement)\" [style.visibility]=\"queryElement.value ? 'visible': 'hidden'\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n }\r\n </div>\r\n\r\n <ng-content select=\"[extra-header-content]\"></ng-content>\r\n </div>\r\n\r\n @if(filters()().advancedFilterId) {\r\n <div class=\"advancedFiltersApplied\" (click)=\"onSelectedAdvancedFilterUpdate($event)\">\r\n <p [innerHTML]=\"getAdvancedFilterLabel()\"></p>\r\n <button matIconButton [matTooltip]=\"texts().advancedFilters.remove\" class=\"\" (click)=\"onQuitAdvancedFilter($event)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n\r\n <mat-progress-bar mode=\"indeterminate\" [style.visibility]=\"dataResource.isLoading() ? 'visible': 'hidden'\"/>\r\n\r\n <div class=\"tableOverflow\" [style.max-height]=\"config()().maxHeight && !isFullScreen() ? config()().maxHeight : null\">\r\n <table\r\n mat-table \r\n matSort\r\n [multiTemplateDataRows]=\"config()().expandableDetail\"\r\n [dataSource]=\"data()\" \r\n [matSortActive]=\"filters()().sortBy?.key ?? ''\" \r\n [matSortDirection]=\"filters()().sortBy?.direction ?? ''\"\r\n (matSortChange)=\"onSortChange($event)\">\r\n\r\n @if(config()().enableRowSelection) {\r\n @if(showFiltersRow()) {\r\n <ng-container [matColumnDef]=\"`${filterKeyPrefix}${nameOfRowSelectionColumn}`\" [sticky]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef class=\"celdaSelection\"></th>\r\n </ng-container>\r\n } \r\n\r\n <ng-container [matColumnDef]=\"nameOfRowSelectionColumn\" [sticky]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <mat-checkbox \r\n class=\"headerCheckbox\"\r\n (change)=\"$event ? toggleAllPageRowSelection() : null\"\r\n [checked]=\"selection().length > 0 && isAllPageRowSelected()\"\r\n [indeterminate]=\"selection().length > 0 && !isAllPageRowSelected()\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\" (click)=\"$event.stopPropagation()\" class=\"celdaSelection\">\r\n @if(!config()().showRowSelection || config()().showRowSelection?.(row)) {\r\n <mat-checkbox\r\n (change)=\"$event ? toggleRowSelection(row) : null\"\r\n [checked]=\"isRowSelected(row)\">\r\n </mat-checkbox>\r\n }\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <ng-container [matColumnDef]=\"`${generalFooterKeyPrefix}${nameOfRowSelectionColumn}`\" [sticky]=\"isDesktop()\">\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @for (column of config()().columns; track $index) {\r\n <ng-container \r\n [matColumnDef]=\"getKeyAsString(column.key)\" \r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header [disabled]=\"!column.isSortable\" class=\"columnLabel\">\r\n <p class=\"headerTitle\">\r\n @if(stickyColumnKey() == column.key && isDesktop()) {\r\n <mat-icon>keep</mat-icon>\r\n }\r\n {{ column.label }}\r\n </p>\r\n </th>\r\n\r\n <td \r\n mat-cell \r\n *matCellDef=\"let row\" \r\n [class.columnSticky]=\"stickyColumnKey() == column.key && isDesktop()\"\r\n [style]=\"column.style\"\r\n class=\"celdaDatos\">\r\n\r\n @if(column.component) {\r\n <ng-container \r\n ngxDynamicCellHost\r\n [component]=\"column.component\"\r\n [row]=\"row\"\r\n [key]=\"column.key\" />\r\n } @else if(column.templateRef) {\r\n <ng-container \r\n *ngTemplateOutlet=\"column.templateRef(); \r\n context: { $implicit: row }\" />\r\n } @else if(column.valueGetter) {\r\n {{ column.valueGetter(row) }}\r\n } @else {\r\n {{ applyColumnPipes(row[column.key], column.pipes) ?? '-' }}\r\n }\r\n </td>\r\n \r\n <td \r\n mat-footer-cell \r\n *matFooterCellDef \r\n [class.columnSticky]=\"stickyColumnKey() == column.key && isDesktop()\"\r\n [style]=\"column.footerStyle\">\r\n\r\n @if(column.showTotalPerPage) {\r\n @if(column.pipes) {\r\n {{ applyColumnPipes(getTotalOfColum(column.key), column.pipes) }}\r\n } @else if(column.totalFooterFormatter) {\r\n {{ column.totalFooterFormatter(getTotalOfColum(column.key)) }}\r\n } @else {\r\n {{ getTotalOfColum(column.key) }}\r\n }\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n\r\n @if(showTotalGeneralFooter()) {\r\n @for (column of config()().columns; track $index) {\r\n <ng-container \r\n [matColumnDef]=\"`${generalFooterKeyPrefix}${getKeyAsString(column.key)}`\"\r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n\r\n <td mat-footer-cell *matFooterCellDef [style]=\"column.footerStyle\">\r\n @if(column.showTotalGeneral && column.getTotalGeneral) {\r\n @if(column.pipes) {\r\n {{ applyColumnPipes(column.getTotalGeneral(), column.pipes) }}\r\n } @else if(column.totalFooterFormatter) {\r\n {{ column.totalFooterFormatter(column.getTotalGeneral()) }}\r\n } @else {\r\n {{ column.getTotalGeneral() }}\r\n }\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(showFiltersRow()) {\r\n @for (column of config()().columns; track $index) {\r\n <ng-container \r\n [matColumnDef]=\"`${filterKeyPrefix}${getKeyAsString(column.key)}`\" \r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n\r\n <th mat-header-cell *matHeaderCellDef>\r\n @if (column.filterType == 'text' || column.filterType == 'number') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"inputQueryColumn\">\r\n <input [type]=\"column.filterType\" matInput [placeholder]=\"column.label\" [value]=\"getValueOfColumnFilter(column.key) ?? ''\" (input)=\"onTextFilterColumnChange(column, $event)\">\r\n <mat-icon matSuffix>{{ column.filterType == 'text' ? 'search' : 'numbers'}}</mat-icon>\r\n </mat-form-field>\r\n }\r\n\r\n @if (column.filterType == 'option' || column.filterType == 'option-multiple') {\r\n @if(column.endpointForPaginatedFilterOptions) {\r\n <ngx-paginated-searchable-select\r\n class=\"selectColumn\"\r\n [selected]=\"getPaginatedSearchableSelectValueOfColumnFilter(column.key)\"\r\n [endpoint]=\"column.endpointForPaginatedFilterOptions\"\r\n [filters]=\"column.filtersForEndpointPaginatedFilterOptions ?? defaultFiltersForPaginatedFilterOptions\"\r\n [multiple]=\"column.filterType == 'option-multiple'\"\r\n subscriptSizing=\"dynamic\"\r\n [selectPlaceholder]=\"column.label\"\r\n (optionChange)=\"onPaginatedOptionFilterColumnChange(column, $event)\"\r\n clearableOptionLabel=\"filtro\"\r\n />\r\n } @else {\r\n <ngx-searchable-select\r\n class=\"selectColumn\"\r\n [selected]=\"getSearchableSelectValueOfColumnFilter(column.key)\"\r\n [options]=\"column.filterOptions ?? []\"\r\n [multiple]=\"column.filterType == 'option-multiple'\"\r\n subscriptSizing=\"dynamic\"\r\n [selectPlaceholder]=\"column.label\"\r\n (optionChange)=\"onOptionFilterColumnChange(column, $event)\"\r\n clearableOptionLabel=\"filtro\"\r\n />\r\n }\r\n }\r\n \r\n @if(column.filterType == 'date') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"dateColumn\">\r\n <input \r\n matInput \r\n [matDatepicker]=\"picker\" \r\n [placeholder]=\"column.label\"\r\n [value]=\"getValueOfColumnFilter(column.key)\"\r\n (dateChange)=\"onDateFilterChange(column, $event.value)\">\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker></mat-datepicker>\r\n </mat-form-field>\r\n }\r\n\r\n @if(column.filterType == 'date-range') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"dateColumn\">\r\n <mat-date-range-input [rangePicker]=\"picker\" #dateRangeInput>\r\n <input \r\n matStartDate \r\n [placeholder]=\"texts().table.dateRangeStart\"\r\n [value]=\"getDateRangeValueOfColumnFilter(column.key, 'start')\"\r\n (dateChange)=\"onDateRangeFilterChange(column, dateRangeInput.value)\">\r\n <input \r\n matEndDate \r\n [placeholder]=\"texts().table.dateRangeEnd\"\r\n [value]=\"getDateRangeValueOfColumnFilter(column.key, 'end')\"\r\n (dateChange)=\"onDateRangeFilterChange(column, dateRangeInput.value)\">\r\n </mat-date-range-input>\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-date-range-picker #picker></mat-date-range-picker>\r\n </mat-form-field>\r\n }\r\n </th>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(showActionsColumn()) {\r\n @if(showFiltersRow()) {\r\n <ng-container [matColumnDef]=\"`${filterKeyPrefix}${nameOfActionsColumn}`\" [stickyEnd]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef class=\"celdaAcciones\"></th>\r\n </ng-container>\r\n } \r\n\r\n <ng-container [matColumnDef]=\"nameOfActionsColumn\" [stickyEnd]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef>{{ texts().table.actions }}</th>\r\n <td mat-cell *matCellDef=\"let row\" (click)=\"$event.stopPropagation()\" class=\"celdaAcciones\">\r\n <div class=\"contenedorCeldaAcciones\">\r\n @if(config()().expandableDetail) {\r\n <button \r\n matIconButton\r\n (click)=\"expandableToggle(row)\">\r\n <mat-icon>{{ rowIsExpanded(row) ? 'keyboard_arrow_up' : 'keyboard_arrow_down' }}</mat-icon>\r\n </button>\r\n }\r\n\r\n @if(config()().update && !config()().clickOnRowForUpdate && (!config()().update?.show || config()().update?.show(row))) {\r\n <button \r\n matIconButton\r\n [matTooltip]=\"config()().update?.tooltip?.(row) ?? texts().table.edit\" \r\n [disabled]=\"config()().update?.disabled?.(row)\" \r\n class=\"editButtonIcon\"\r\n (click)=\"onUpdateClick(row, $event)\">\r\n <mat-icon>edit_square</mat-icon>\r\n </button>\r\n }\r\n \r\n @if(config()().delete && (!config()().delete?.show || config()().delete?.show(row))) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"config()().delete?.tooltip?.(row) ?? texts().table.delete\" \r\n [disabled]=\"config()().delete?.disabled?.(row)\" \r\n class=\"deleteButtonIcon\"\r\n (click)=\"onDeleteClick(row, $event)\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n }\r\n\r\n @for (rowAction of config()().rowActions; track $index) {\r\n @if(!rowAction.show || rowAction.show(row)) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"rowAction.tooltip(row)\" \r\n [disabled]=\"rowAction.disabled?.(row)\" \r\n [class]=\"rowAction.iconColor ? `rowActionIconColor${rowAction.iconColor}` : ''\"\r\n (click)=\"onRowActionClick(row, rowAction, $event)\">\r\n <mat-icon>{{rowAction.icon}}</mat-icon>\r\n </button>\r\n } \r\n }\r\n </div>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <ng-container [matColumnDef]=\"`${generalFooterKeyPrefix}${nameOfActionsColumn}`\" [stickyEnd]=\"isDesktop()\">\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(config()().expandableDetail) {\r\n <ng-container [matColumnDef]=\"expandableColumnDef\">\r\n <td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"keys().length\">\r\n <div \r\n class=\"detailWrapper\"\r\n [class.detailWrapperExpanded]=\"rowIsExpanded(row)\">\r\n <div class=\"columnDetail\">\r\n @if(config()().expandableDetailTemplateRef) {\r\n <ng-container \r\n *ngTemplateOutlet=\"config()().expandableDetailTemplateRef!(); \r\n context: { $implicit: row }\" />\r\n }\r\n </div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n }\r\n \r\n <tr mat-header-row *matHeaderRowDef=\"keys(); sticky: true\" class=\"tableHeader\"></tr>\r\n \r\n @if(showFiltersRow()) {\r\n <tr mat-header-row *matHeaderRowDef=\"keysWithFilter(); sticky: true\" class=\"filtersByColumn\"></tr>\r\n }\r\n \r\n <tr mat-row *matRowDef=\"let row; columns: keys();\" \r\n (click)=\"onRowClick(row)\" \r\n [class.rowClickEnable]=\"isRowEnabled(row)\"\r\n [class.expandableRow]=\"config()().expandableDetail\">\r\n </tr>\r\n \r\n @if(config()().expandableDetail) {\r\n <tr mat-row *matRowDef=\"let row; columns: [expandableColumnDef]\" class=\"rowDetail\"></tr>\r\n }\r\n\r\n <tr mat-footer-row \r\n *matFooterRowDef=\"showTotalPerPageFooter() ? keys() : []\" \r\n class=\"totalPerPageFooter\"\r\n [class.hideFooter]=\"!showTotalPerPageFooter()\">\r\n </tr>\r\n\r\n <tr mat-footer-row \r\n *matFooterRowDef=\"showTotalGeneralFooter() ? keysWithGeneralFooter() : []\" \r\n class=\"totalFooter\"\r\n [class.hideFooter]=\"!showTotalGeneralFooter()\">\r\n </tr>\r\n\r\n <tr class=\"mat-row\" *matNoDataRow>\r\n <td class=\"noData\" [colSpan]=\"keys().length\">{{ dataResource.isLoading() ? texts().common.loading : texts().common.noData }}</td>\r\n </tr>\r\n </table>\r\n </div>\r\n\r\n <div class=\"paginatorContainer\">\r\n <div class=\"footerLegend\">\r\n @if(showTotalPerPageFooter()) {\r\n <div class=\"legendItem\">\r\n <div class=\"legendSquare\"></div>\r\n <p>{{ texts().table.totalPerPage }}</p> \r\n </div>\r\n }\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <div class=\"legendItem\">\r\n <div class=\"legendSquare totalGeneral\"></div>\r\n <p>{{ texts().table.totalGeneral }}</p>\r\n </div>\r\n }\r\n </div>\r\n <mat-paginator [length]=\"total()\" [pageSize]=\"filters()().pageSize\" [pageIndex]=\"filters()().pageNumber - 1\" (page)=\"onPageChange($event)\"/>\r\n </div>\r\n\r\n <ng-content select=\"[end-container]\"></ng-content>\r\n </div>\r\n</ng-template>","import { Component, computed, effect, HostListener, inject, input, output, signal, TemplateRef, viewChild, ViewContainerRef, WritableSignal } from '@angular/core';\nimport { BasicFilter } from '../../models/basic-filter';\nimport { BasicTableColumn, BasicTableConfig } from '../../models/basic-table-config';\n\nimport { PaginatedFilter, SortBy } from '../../models/paginated-filter';\nimport { CommonModule } from '@angular/common';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { DateRange, MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatPaginator, MatPaginatorModule } from '@angular/material/paginator';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatSortModule, Sort } from '@angular/material/sort';\nimport { MatTableDataSource, MatTableModule } from '@angular/material/table';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { Overlay, OverlayContainer, OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { RowActionClickEvent } from '../../models/row-action-click-event';\nimport { SelectionActionEvent } from '../../models/selection-action-event';\nimport { ColumnConfig, ConfigureTableColumnData } from '../../models/configure-table-column-data';\nimport { ConfigureTableColumnsComponent } from '../../common/components/configure-table-columns/configure-table-columns.component';\nimport { MatDialog } from '@angular/material/dialog';\nimport { ColumnConfigService } from '../../services/column-config.service';\nimport { DatosPantallaService } from '../../services/datos-pantalla.service';\nimport { ColumnPipe, FilterOption, isFilterOption, RowSelectionAction, TableRowAction } from '../../models/paginated-table-config';\nimport jsPDF from 'jspdf';\nimport autoTable from 'jspdf-autotable';\nimport { utils, writeFileXLSX } from 'xlsx';\nimport { ColumnValue } from '../../models/column-value';\nimport { NgxDialogService } from '../../services/ngx-dialog.service';\nimport moment from 'moment';\n\nimport { PaginatedSearchableSelectComponent } from '../ngx-paginated-searchable-select/ngx-paginated-searchable-select.component';\nimport { SearchableSelectComponent } from '../ngx-searchable-select/ngx-searchable-select.component';\nimport { DynamicCellHostDirective } from '../../directives/dynamic-cell-host.directive';\nimport { includeNoSensible } from '../../utils/string-operations';\nimport { NgxTexts } from '../../i18n';\n\n@Component({\n selector: 'ngx-basic-table',\n imports: [\n MatTableModule,\n MatSortModule,\n MatPaginatorModule,\n MatIconModule,\n MatButtonModule,\n MatProgressBarModule,\n MatTooltipModule,\n MatFormFieldModule,\n MatInputModule,\n MatSelectModule,\n MatDatepickerModule,\n CommonModule,\n DynamicCellHostDirective,\n MatMenuModule,\n MatDividerModule,\n MatCheckboxModule,\n SearchableSelectComponent,\n PaginatedSearchableSelectComponent\n ],\n templateUrl: './ngx-basic-table.component.html',\n styleUrl: './ngx-basic-table.component.scss',\n host: { class: 'contenedorDefecto' }\n})\nexport class NgxBasicTable<T, U extends BasicFilter<T>> {\n\n private readonly columnConfigService = inject(ColumnConfigService);\n private readonly dialog = inject(MatDialog);\n private readonly dialogService = inject(NgxDialogService);\n private readonly datosPantallaService = inject(DatosPantallaService);\n \n // Inyectar el servicio de internacionalización\n readonly texts = inject(NgxTexts).texts;\n \n protected isDesktop = computed<boolean>(() => this.datosPantallaService.pantalla()?.tipo == 'escritorio');\n\n filters = input<WritableSignal<U>>(\n signal<U>(\n {\n query: undefined,\n sortBy: undefined,\n columnsFiltersValue: undefined\n } as U\n )\n );\n config = input.required<WritableSignal<BasicTableConfig<T>>>();\n data = input.required<T[]>();\n loading = input<boolean>(false);\n queryFilter = input<(query: string, data: T[]) => T[]>();\n\n moreFilters = input<(data: T[], filters: U) => T[]>(\n (data: T[], _: U) => {\n return data;\n }\n );\n\n protected createClick = output<void>();\n protected updateClick = output<T>();\n protected deleteClick = output<T>();\n protected rowActionClick = output<RowActionClickEvent<T>>();\n protected expandedItemChange = output<T | null>();\n protected selectionActionEvent = output<SelectionActionEvent<T>>();\n\n dataSource = computed(() => {\n const data = this.data();\n const paginator = this.paginator();\n const dataSource = new MatTableDataSource(data);\n\n if (paginator)\n dataSource.paginator = paginator;\n\n return dataSource;\n });\n\n filtersEffect = effect(() => {\n let data = this.data();\n const filters = this.filters()();\n const config = this.config()();\n const queryFilter = this.queryFilter();\n const moreFilters = this.moreFilters();\n\n if (queryFilter)\n data = queryFilter(filters.query ?? '', data);\n else if (this.someColumnFilterable(config.columns))\n data = this.applyInputFilter(config.columns, data, filters.query);\n\n data = this.applySort(data, config.columns, filters.sortBy);\n\n data = this.applyColumnFilter(data, config.columns, filters.columnsFiltersValue);\n\n data = moreFilters(data, filters);\n\n this.dataSource().data = data;\n });\n\n protected columnConfig = computed(() => {\n const columnConfigs = this.columnConfigService.columnConfigs();\n const configValue = this.config()();\n const columnConfig: ColumnConfig<T>[] | undefined = columnConfigs[configValue.tableId];\n const defaultColumnConfig: ColumnConfig<T>[] = configValue.columns.map(column => {\n return {\n key: column.key,\n show: true,\n isSticky: configValue.defaultStickyColumn == column.key\n }\n });\n\n if (!columnConfig)\n return defaultColumnConfig;\n\n //Por si acaso se quitan columnas a posteriori, hay que filtrarlas para que no aparezcan\n const filteredColumns = columnConfig.filter(column => this.includeInColumnConfig(column, defaultColumnConfig));\n\n //Por si a posteriori se añaden nuevas columnas\n const columnsAdded = defaultColumnConfig.filter(defaultColumn => !this.includeInColumnConfig(defaultColumn, columnConfig));\n\n return [...filteredColumns, ...columnsAdded];\n });\n\n protected readonly filterKeyPrefix = 'filter';\n protected readonly nameOfActionsColumn = 'actionsPerRow';\n protected readonly generalFooterKeyPrefix = 'footer';\n protected readonly nameOfRowSelectionColumn = 'rowSelectionColumn';\n\n protected stickyColumnKey = computed(() => this.columnConfig().find(c => c.isSticky)?.key);\n\n protected keys = computed(() => {\n const configValue = this.config()();\n const columnConfig = this.columnConfig();\n\n let keys: (string | keyof T)[] = [...columnConfig]\n .filter(column => column.show)\n .map(column => column.key);\n\n if ((configValue.showActions?.() ?? true) &&\n ((configValue.update && !configValue.clickOnRowForUpdate)\n || configValue.delete\n || (configValue.rowActions && configValue.rowActions.length > 0)\n || configValue.expandableDetail)\n ) {\n keys = [...keys, this.nameOfActionsColumn];\n }\n\n if (configValue.enableRowSelection)\n keys = [this.nameOfRowSelectionColumn, ...keys];\n\n return keys;\n });\n\n protected keysWithFilter = computed(() => this.keys().map(key => `${this.filterKeyPrefix}${this.getKeyAsString(key)}`));\n protected keysWithGeneralFooter = computed(() => this.keys().map(key => `${this.generalFooterKeyPrefix}${this.getKeyAsString(key)}`));\n protected showFiltersRow = computed(() => {\n const configValue = this.config()();\n return [...configValue.columns].some(column => column.filterType);\n });\n protected showActionsColumn = computed(() => this.keys().includes(this.nameOfActionsColumn));\n protected showTotalPerPageFooter = computed(() => {\n const columns = this.config()().columns;\n const keys = this.keys();\n return keys.some(key => columns.find(column => key == column.key)?.showTotalPerPage);\n });\n protected showTotalGeneralFooter = computed(() => {\n const columns = this.config()().columns;\n const keys = this.keys();\n return keys.some(key => columns.find(column => key == column.key)?.showTotalGeneral);\n });\n\n protected showQueryFilter = computed(() => {\n const queryFilter = this.queryFilter();\n const config = this.config()();\n\n if (queryFilter)\n return true;\n\n return this.someColumnFilterable(config.columns);\n });\n\n protected tableContentTemplate = viewChild<TemplateRef<any>>('tableContent');\n protected isFullScreen = signal(false);\n private overlayRef?: OverlayRef;\n private portal?: TemplatePortal;\n private readonly overlay = inject(Overlay);\n private readonly overlayContainer = inject(OverlayContainer);\n private readonly viewContainerRef = inject(ViewContainerRef);\n\n protected selection = signal<T[]>([]);\n\n protected readonly expandableColumnDef = 'expandedDetail';\n protected expandedItem = signal<T | null>(null);\n\n\n protected paginator = viewChild(MatPaginator);\n\n protected defaultFiltersForPaginatedFilterOptions = signal<PaginatedFilter<FilterOption>>(\n {\n pageNumber: 1,\n pageSize: 20,\n query: undefined\n }\n );\n\n\n protected getKeyAsString = (columnKey: keyof T | string): string => columnKey as string\n\n private includeInColumnConfig(searchedColumn: ColumnConfig<T>, allColumns: ColumnConfig<T>[]): boolean {\n return allColumns.some(column => searchedColumn.key == column.key);\n }\n\n @HostListener('document:keydown.escape')\n protected onEscape() {\n if (this.overlayRef && this.isMyOverlayOnTop())\n this.exitFullscreen();\n }\n\n private someColumnFilterable(columns: BasicTableColumn<T>[]): boolean {\n return columns.some((column) => column.isFilterableByInput === true);\n }\n\n private applyInputFilter(columns: BasicTableColumn<T>[], data: T[], query?: string): T[] {\n if (!query)\n return data;\n\n const filterableColumns = columns.filter(c => c.isFilterableByInput);\n\n return data.filter(item =>\n filterableColumns.some(column => {\n const value = item[column.key];\n return typeof value === 'string' && includeNoSensible(value, query);\n })\n );\n }\n\n private applySort(data: T[], columns: BasicTableColumn<T>[], sortBy?: SortBy): T[] {\n if (!sortBy)\n return data;\n\n const column = columns.find(c => c.key === sortBy.key);\n\n if (!column || column.sortType === undefined)\n return data;\n\n const { key, direction } = sortBy;\n const factor = direction === 'asc' ? 1 : -1;\n\n return [...data].sort((a, b) => {\n const aValue = (a as any)[key];\n const bValue = (b as any)[key];\n\n if (aValue == null && bValue == null)\n return 0;\n\n if (aValue == null)\n return -1 * factor;\n\n if (bValue == null)\n return 1 * factor;\n\n switch (column.sortType) {\n case 'number':\n return (Number(aValue) - Number(bValue)) * factor;\n\n case 'date':\n return (Date.parse(aValue) - Date.parse(bValue)) * factor;\n\n case 'string':\n default:\n if(column.sortByKey) {\n const aObjectString = column.sortByKey(a) ?? '';\n const bObjectString = column.sortByKey(b) ?? '';\n return aObjectString.localeCompare(bObjectString) * factor;\n }\n\n return String(aValue).localeCompare(String(bValue)) * factor;\n }\n });\n }\n\n private applyColumnFilter(data: T[], columns: BasicTableColumn<T>[], columnsFiltersValue?: Partial<Record<keyof T, ColumnValue>>): T[] {\n if (!this.showFiltersRow() || !columnsFiltersValue)\n return data;\n\n columns.forEach(column => {\n const columnFilterValue = columnsFiltersValue[column.key];\n\n if (columnFilterValue) {\n switch (column.filterType) {\n case 'number':\n case 'option':\n const filterValue = isFilterOption(columnFilterValue) ? columnFilterValue.value : columnFilterValue\n data = data.filter(d => {\n const columnValue = column.filterByKey?.(d) ?? d[column.key];\n return columnValue == filterValue\n });\n break;\n case 'text':\n const query = columnFilterValue as string;\n data = data.filter(d => {\n const word = (column.filterByKey?.(d) ?? d[column.key] ?? '') as string;\n return includeNoSensible(word, query);\n });\n break;\n case 'option-multiple':\n if (!Array.isArray(columnFilterValue) || columnFilterValue.length <= 0)\n break;\n\n data = data.filter(d => {\n const columnValue = column.filterByKey?.(d) ?? d[column.key];\n return columnFilterValue.some(f => {\n const columnValueString = isFilterOption(f) ? f.value : f;\n return columnValueString == columnValue;\n });\n });\n break;\n case 'date':\n const date = columnFilterValue as moment.Moment\n data = data.filter(d => {\n const value = d[column.key];\n if (typeof value !== 'string')\n return false;\n\n const momentValue = moment.utc(value);\n return date.isSame(momentValue, 'day');\n });\n break;\n case 'date-range':\n const dateRange = columnFilterValue as DateRange<moment.Moment | null>\n if (dateRange.start != null || dateRange.end != null) {\n data = data.filter(d => {\n const value = d[column.key];\n if (typeof value !== 'string')\n return false;\n\n const momentValue = moment.utc(value);\n\n if (dateRange.start && dateRange.end)\n return momentValue.isBetween(dateRange.start, dateRange.end, 'day', '[]');\n\n if (dateRange.start)\n return momentValue.isSameOrAfter(dateRange.start, 'day');\n\n if (dateRange.end)\n return momentValue.isSameOrBefore(dateRange.end, 'day');\n\n return true;\n });\n }\n break;\n }\n }\n });\n\n return data;\n }\n\n protected onToggleFullScreen() {\n if (this.isFullScreen())\n this.exitFullscreen()\n else\n this.enterFullscreen();\n }\n\n private enterFullscreen() {\n if (this.overlayRef)\n return;\n\n this.overlayRef = this.overlay.create({\n hasBackdrop: false,\n scrollStrategy: this.overlay.scrollStrategies.block(),\n positionStrategy: this.overlay.position().global().top('0').left('0').right('0').bottom('0'),\n });\n\n this.portal = new TemplatePortal(this.tableContentTemplate()!, this.viewContainerRef);\n this.overlayRef.attach(this.portal);\n\n this.isFullScreen.set(true);\n }\n\n private exitFullscreen() {\n if (!this.overlayRef)\n return;\n\n this.overlayRef.detach();\n this.overlayRef.dispose();\n this.overlayRef = undefined;\n this.portal = undefined;\n\n this.isFullScreen.set(false);\n }\n\n private isMyOverlayOnTop(): boolean {\n if (!this.overlayRef)\n return false;\n\n //Contenedor principal de overlays en el DOM\n const containerElement = this.overlayContainer.getContainerElement();\n // Los overlays se añaden como hijos dentro de este contenedor\n const overlays = Array.from(containerElement.children);\n // El último hijo es el overlay más \"arriba\"\n const topOverlay = overlays[overlays.length - 1] as HTMLElement | undefined;\n\n return topOverlay === this.overlayRef.hostElement;\n }\n\n protected onNewClick() {\n this.createClick.emit();\n }\n\n protected onUpdateClick(row: T, event: Event) {\n this.updateClick.emit(row);\n event.stopPropagation();\n }\n\n protected onRowClick(row: T) {\n if (this.isRowEnabled(row))\n this.updateClick.emit(row);\n }\n\n protected isRowEnabled(row: T): boolean | undefined {\n return this.config()().update\n && this.config()().clickOnRowForUpdate\n && (!this.config()().update?.show || this.config()().update?.show?.(row))\n && !this.config()().update?.disabled?.(row);\n }\n\n protected onDeleteClick(row: T, event: Event) {\n event.stopPropagation();\n\n const texts = this.texts();\n const header = {\n title: this.config()().deleteConfirm?.title?.(row) ?? texts.table.deleteConfirmTitle,\n confirmText: texts.table.confirmDelete,\n cancelText: texts.common.cancel,\n destructive: true,\n };\n const template = this.config()().deleteConfirm?.templateRef?.();\n const confirm$ = template\n ? this.dialogService.template({ ...header, template, templateData: row })\n : this.dialogService.confirm({ ...header, message: this.config()().deleteConfirm?.body?.(row) ?? texts.table.deleteConfirmBody });\n\n confirm$.subscribe(confirm => {\n if (confirm === true)\n this.deleteClick.emit(row);\n });\n }\n\n protected onRowActionClick(row: T, rowAction: TableRowAction<T>, event: Event) {\n this.rowActionClick.emit({ id: rowAction.id, row: row })\n event.stopPropagation();\n }\n\n protected onEditColumns() {\n const config = this.config()();\n const filters = this.filters()();\n const columnConfig = this.columnConfig();\n\n const columnsLabel = Object.fromEntries(\n config.columns.map(column => [column.key, column.label])\n ) as Record<keyof T, string>;\n\n const data: ConfigureTableColumnData<T> = {\n tableId: config.tableId,\n tableName: config.title(),\n columns: columnConfig,\n filtersValue: filters.columnsFiltersValue ?? {},\n columnsLabels: columnsLabel\n };\n this.dialog.open(ConfigureTableColumnsComponent, { data: data });\n }\n\n protected getRowSelectionAction(): RowSelectionAction<T>[] {\n return this.config()().rowSelectionAction ?? [];\n }\n\n protected uncheckAllSelection() {\n this.selection.set([]);\n }\n\n protected onRowSelectionActionClick(actionId: string) {\n this.selectionActionEvent.emit(\n {\n id: actionId,\n rows: this.selection()\n }\n );\n }\n\n private getDocumentHeaders(): string[] {\n const config = this.config()();\n return config.columns.map(c => c.label);\n }\n\n private getDocumentRows(): Partial<Record<keyof T, any>>[keyof T][][] {\n const config = this.config()();\n const columns = config.columns;\n\n const data = this.dataSource().data;\n\n return data.map(row => {\n if (config.mapperForExportData) {\n const mapped = config.mapperForExportData(row);\n return columns.map(c => mapped[c.key]);\n }\n\n return columns.map(c => row[c.key] ?? '');\n });\n }\n\n protected exportToCsv() {\n const config = this.config()();\n\n const title = config.title();\n const fileName = config.exportFileName?.() ?? title;\n\n const headers = this.getDocumentHeaders();\n const rows = this.getDocumentRows();\n\n const aoaData = [headers, ...rows];\n\n //const workSheet = utils.json_to_sheet(data);\n\n const workSheet = utils.aoa_to_sheet(aoaData);\n const workBook = utils.book_new();\n\n //El nombre de la hoja no puede exceder de 31 caracteres\n const name = title.substring(0, 31);\n utils.book_append_sheet(workBook, workSheet, name);\n writeFileXLSX(workBook, `${fileName}.xlsx`);\n }\n\n protected exportToPdf() {\n const config = this.config()();\n\n const title = config.title();\n const fileName = config.exportFileName?.() ?? title;\n\n const headers = this.getDocumentHeaders();\n const rows = this.getDocumentRows();\n\n const doc = config.pdfConfig ?? new jsPDF({\n orientation: 'landscape',\n unit: 'pt',\n format: 'A4'\n });\n\n doc.setFontSize(14);\n doc.text(title, 40, 40);\n\n autoTable(doc, {\n startY: 60,\n head: [headers],\n body: rows,\n styles: { fontSize: 9, cellPadding: 4 },\n headStyles: { fillColor: [192, 0, 28], textColor: 255 },\n alternateRowStyles: { fillColor: [245, 245, 245] },\n tableLineColor: [200, 200, 200],\n tableLineWidth: 0.1,\n });\n\n doc.save(`${fileName}.pdf`);\n }\n\n protected onQueryChange(inputElement: HTMLInputElement) {\n const query = inputElement.value;\n\n this.filters().update((value: U) => {\n //return { ...value, query: query, pageNumber: 1 };\n //Hay que ver el tema del paginador si hay que volver a la pagina 1\n return { ...value, query: query };\n });\n }\n\n protected onQueryReset(inputElement: HTMLInputElement) {\n inputElement.value = '';\n this.onQueryChange(inputElement);\n }\n\n protected onSortChange(sort: Sort) {\n this.filters().update(value => {\n return {\n ...value,\n //pageNumber: 1,\n sortBy: sort.direction ? { key: sort.active, direction: sort.direction } : undefined\n };\n });\n }\n\n protected toggleAllPageRowSelection() {\n const records = this.getDataOfCurrentPage();\n\n if (this.isAllPageRowSelected()) {\n //Deseleccionar todas las filas de la página actual\n this.selection.update(recordsSelected => {\n return recordsSelected.filter(\n record => !records.some(row2 => this.areEqualByKeys(record, row2))\n );\n });\n } else {\n //Seleccionar todas las filas visibles que aún no estén seleccionadas\n const notSelected = records.filter(record => !this.isRowSelected(record));\n\n this.selection.update(recordsSelected => {\n // Evitar duplicados por si ya hay seleccionadas\n const nuevas = notSelected.filter(\n row => !recordsSelected.some(sel => this.areEqualByKeys(sel, row))\n );\n return [...recordsSelected, ...nuevas];\n });\n }\n }\n\n protected isAllPageRowSelected(): boolean {\n const records = this.getDataOfCurrentPage();\n //Sin registros no hay nada seleccionado (every sobre un array vacio devuelve true)\n return records.length > 0 && records.every(record => this.isRowSelected(record));\n }\n\n protected areEqualByKeys(record1: T, record2: T): boolean {\n const primaryKey = this.config()().primaryKey;\n\n if (Array.isArray(primaryKey))\n return primaryKey.every(key => record1[key] === record2[key]);\n else\n return record1[primaryKey] === record2[primaryKey];\n }\n\n protected isRowSelected(row: T): boolean {\n return this.selection().some(row2 => this.areEqualByKeys(row, row2));\n }\n\n protected toggleRowSelection(row: T) {\n if (this.isRowSelected(row)) {\n this.selection.update(recordsSelected => {\n return recordsSelected.filter(record => !this.areEqualByKeys(row, record));\n });\n } else {\n this.selection.update(recordsSelected => [...recordsSelected, row]);\n }\n }\n\n protected applyColumnPipes(value: any, pipes?: ColumnPipe | ColumnPipe[]): any {\n if (!pipes)\n return value;\n\n const pipesArray = Array.isArray(pipes) ? pipes : [pipes];\n\n return pipesArray.reduce((v, p) => p.pipe.transform(v, ...(p.args || [])), value);\n }\n\n protected getTotalPerPageOfColum(columnKey: keyof T): number {\n const dataOfCurrentPage = this.getDataOfCurrentPage();\n return dataOfCurrentPage.reduce((previous, item) => (previous + Number(item[columnKey])), 0);\n }\n\n protected getDataOfCurrentPage(): T[] {\n const paginator = this.dataSource().paginator;\n\n if (!paginator)\n return [];\n\n const startIndex = paginator.pageIndex * paginator.pageSize;\n const endIndex = startIndex + paginator.pageSize;\n\n return this.dataSource().data.slice(startIndex, endIndex);\n }\n\n protected getTotalOfColum(columnKey: keyof T): number {\n return this.dataSource().data.reduce((previous, item) => (previous + Number(item[columnKey])), 0);\n }\n\n protected getValueOfColumnFilter(key: keyof T): ColumnValue {\n return this.filters()().columnsFiltersValue?.[key];\n }\n\n protected getPaginatedSearchableSelectValueOfColumnFilter(key: keyof T): FilterOption | FilterOption[] | undefined {\n const value = this.getValueOfColumnFilter(key);\n\n if (isFilterOption(value) || (Array.isArray(value) && value.every(v => isFilterOption(v))))\n return value;\n\n return undefined;\n }\n\n protected getSearchableSelectValueOfColumnFilter(key: keyof T): string | string[] | undefined {\n const value = this.getValueOfColumnFilter(key);\n\n if (typeof value === 'string' || (Array.isArray(value) && value.every(v => typeof v === 'string')))\n return value;\n\n return undefined;\n }\n\n protected getDateRangeValueOfColumnFilter(key: keyof T, type: 'start' | 'end'): moment.Moment | null {\n const value = this.getValueOfColumnFilter(key) as DateRange<moment.Moment | null>;\n\n if (!value)\n return null;\n\n return type == 'start' ? value.start : value.end\n }\n\n protected onTextFilterColumnChange(column: BasicTableColumn<T>, event: Event) {\n const query = (event.target as HTMLInputElement).value;\n this.onColumnFilterChange(column.key, query);\n }\n\n protected onPaginatedOptionFilterColumnChange(column: BasicTableColumn<T>, option?: FilterOption | FilterOption[]) {\n this.onColumnFilterChange(column.key, option);\n }\n\n protected onOptionFilterColumnChange(column: BasicTableColumn<T>, value?: string | string[]) {\n this.onColumnFilterChange(column.key, value);\n }\n\n protected onDateFilterChange(column: BasicTableColumn<T>, value: moment.Moment | null) {\n this.onColumnFilterChange(column.key, value);\n }\n\n protected onDateRangeFilterChange(column: BasicTableColumn<T>, value: DateRange<moment.Moment | null> | null) {\n this.onColumnFilterChange(column.key, value);\n }\n\n private onColumnFilterChange(columnKey: keyof T, value: ColumnValue) {\n this.filters().update(currentValue => {\n //Se clona para no mutar el estado anterior de la signal\n const columnsFiltersValue: Partial<Record<keyof T, ColumnValue>> = {\n ...(currentValue.columnsFiltersValue ?? {}),\n [columnKey]: value\n };\n return {\n ...currentValue,\n pageNumber: 1,\n columnsFiltersValue: columnsFiltersValue\n }\n });\n }\n\n protected rowIsExpanded(row: T): boolean {\n return this.expandedItem() == row;\n }\n\n protected expandableToggle(row: T) {\n this.expandedItem.update(currentValue => {\n const newValue = currentValue != row ? row : null;\n this.expandedItemChange.emit(newValue);\n return newValue;\n });\n }\n}\n","@if(!isFullScreen()) {\r\n <ng-container *ngTemplateOutlet=\"tableContentTemplate()\"></ng-container>\r\n}\r\n\r\n<ng-template #tableContent>\r\n <div class=\"tableContainer\" [class.inFullScreenMode]=\"isFullScreen()\">\r\n <div class=\"headerContainer\">\r\n <div class=\"titleAndButtonContainer\">\r\n <p class=\"title\">{{ config()().title() }}</p>\r\n <div class=\"buttonContainer\">\r\n @if(config()().create && (!config()().create?.show || config()().create?.show())) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"config()().create?.tooltip?.() ?? texts().table.create\" \r\n [disabled]=\"config()().create?.disabled?.()\" \r\n class=\"newButtonIcon\"\r\n (click)=\"onNewClick()\">\r\n <mat-icon>add_circle</mat-icon>\r\n </button>\r\n }\r\n\r\n @if(config()().hideColumnConfig?.() !== true) {\r\n <button matIconButton [matTooltip]=\"texts().table.editColumns\" class=\"editColumnsButtonIcon\" (click)=\"onEditColumns()\">\r\n <mat-icon>table_edit</mat-icon>\r\n </button>\r\n }\r\n\r\n @if(selection().length > 0) {\r\n @if(getRowSelectionAction().length > 0) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"texts().table.selectionActions\"\r\n [matMenuTriggerFor]=\"selectedRecordsMenu\">\r\n <mat-icon>event_list</mat-icon>\r\n </button>\r\n\r\n <mat-menu #selectedRecordsMenu=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\r\n <button mat-menu-item (click)=\"uncheckAllSelection()\">\r\n <mat-icon>deselect</mat-icon>\r\n <span>{{ texts().table.deselectAll }}</span>\r\n </button>\r\n\r\n @for (action of getRowSelectionAction(); track $index) {\r\n <button mat-menu-item (click)=\"onRowSelectionActionClick(action.id)\">\r\n <mat-icon>{{action.icon}}</mat-icon>\r\n <span>{{action.label(selection(), selection().length)}}</span>\r\n </button>\r\n }\r\n </mat-menu>\r\n } @else {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"texts().table.deselectAll\"\r\n (click)=\"uncheckAllSelection()\">\r\n <mat-icon>deselect</mat-icon>\r\n </button>\r\n }\r\n }\r\n\r\n @if(config()().hideExportData?.() !== true) {\r\n <button matIconButton [matTooltip]=\"texts().table.export\" [matMenuTriggerFor]=\"exportMenu\">\r\n <mat-icon>download</mat-icon>\r\n </button>\r\n <mat-menu #exportMenu=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\r\n <button mat-menu-item (click)=\"exportToCsv()\">\r\n <mat-icon>csv</mat-icon>\r\n <span>{{ texts().table.exportExcel }}</span>\r\n </button>\r\n\r\n <button mat-menu-item (click)=\"exportToPdf()\">\r\n <mat-icon>picture_as_pdf</mat-icon>\r\n <span>{{ texts().table.exportPdf }}</span>\r\n </button>\r\n </mat-menu>\r\n }\r\n\r\n @if(config()().hideFullScreen?.() !== true) {\r\n <button matIconButton [matTooltip]=\"isFullScreen() ? texts().table.exitFullscreen : texts().table.enterFullscreen\" (click)=\"onToggleFullScreen()\">\r\n <mat-icon>{{isFullScreen() ? 'fullscreen_exit': 'fullscreen'}}</mat-icon>\r\n </button>\r\n }\r\n\r\n <ng-content select=\"[icon-buttons]\"></ng-content>\r\n </div>\r\n </div>\r\n\r\n <div class=\"filterContainer\">\r\n <div class=\"moreFiltersContainer\">\r\n <ng-content select=\"[more-filters]\"></ng-content>\r\n </div>\r\n\r\n @if(showQueryFilter()) {\r\n <mat-form-field subscriptSizing=\"dynamic\">\r\n <mat-icon matPrefix>search</mat-icon>\r\n <input #queryElement matInput [placeholder]=\"config()().queryFilterPlaceholder ?? texts().common.search\" [value]=\"filters()().query ?? ''\" (input)=\"onQueryChange(queryElement)\">\r\n <button matIconButton matSuffix (click)=\"onQueryReset(queryElement)\" [style.visibility]=\"queryElement.value ? 'visible': 'hidden'\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n }\r\n </div>\r\n\r\n <ng-content select=\"[extra-header-content]\"></ng-content>\r\n </div>\r\n\r\n <mat-progress-bar mode=\"indeterminate\" [style.visibility]=\"loading() ? 'visible': 'hidden'\"/>\r\n\r\n <div class=\"tableOverflow\" [style.max-height]=\"config()().maxHeight && !isFullScreen() ? config()().maxHeight : null\">\r\n <table\r\n mat-table \r\n matSort\r\n [multiTemplateDataRows]=\"config()().expandableDetail\"\r\n [dataSource]=\"dataSource()\" \r\n [matSortActive]=\"filters()().sortBy?.key ?? ''\" \r\n [matSortDirection]=\"filters()().sortBy?.direction ?? ''\"\r\n (matSortChange)=\"onSortChange($event)\">\r\n\r\n @if(config()().enableRowSelection) {\r\n @if(showFiltersRow()) {\r\n <ng-container [matColumnDef]=\"`${filterKeyPrefix}${nameOfRowSelectionColumn}`\" [sticky]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef class=\"celdaSelection\"></th>\r\n </ng-container>\r\n } \r\n\r\n <ng-container [matColumnDef]=\"nameOfRowSelectionColumn\" [sticky]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <mat-checkbox \r\n class=\"headerCheckbox\"\r\n (change)=\"$event ? toggleAllPageRowSelection() : null\"\r\n [checked]=\"selection().length > 0 && isAllPageRowSelected()\"\r\n [indeterminate]=\"selection().length > 0 && !isAllPageRowSelected()\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\" (click)=\"$event.stopPropagation()\" class=\"celdaSelection\">\r\n <mat-checkbox\r\n (change)=\"$event ? toggleRowSelection(row) : null\"\r\n [checked]=\"isRowSelected(row)\">\r\n </mat-checkbox>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef class=\"celdaSelection\"></td>\r\n </ng-container>\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <ng-container [matColumnDef]=\"`${generalFooterKeyPrefix}${nameOfRowSelectionColumn}`\" [sticky]=\"isDesktop()\">\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @for (column of config()().columns; track $index) {\r\n <ng-container \r\n [matColumnDef]=\"getKeyAsString(column.key)\" \r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header [disabled]=\"column.sortType === undefined\" class=\"columnLabel\">\r\n <p class=\"headerTitle\">\r\n @if(stickyColumnKey() == column.key && isDesktop()) {\r\n <mat-icon>keep</mat-icon>\r\n }\r\n {{ column.label }}\r\n </p>\r\n </th>\r\n\r\n <td \r\n mat-cell \r\n *matCellDef=\"let row\" \r\n [class.columnSticky]=\"stickyColumnKey() == column.key && isDesktop()\"\r\n [style]=\"column.style\"\r\n class=\"celdaDatos\">\r\n\r\n @if(column.component) {\r\n <ng-container \r\n ngxDynamicCellHost\r\n [component]=\"column.component\"\r\n [row]=\"row\"\r\n [key]=\"column.key\" />\r\n } @else if(column.templateRef) {\r\n <ng-container \r\n *ngTemplateOutlet=\"column.templateRef(); \r\n context: { $implicit: row }\" />\r\n } @else if(column.valueGetter) {\r\n {{ column.valueGetter(row) }}\r\n } @else {\r\n {{ applyColumnPipes(row[column.key], column.pipes) ?? '-' }}\r\n }\r\n </td>\r\n \r\n <td\r\n mat-footer-cell \r\n *matFooterCellDef\r\n [class.columnSticky]=\"stickyColumnKey() == column.key && isDesktop()\"\r\n [style]=\"column.footerStyle\">\r\n\r\n @if(column.showTotalPerPage) {\r\n @if(column.pipes) {\r\n {{ applyColumnPipes(getTotalPerPageOfColum(column.key), column.pipes) }}\r\n } @else if(column.totalFooterFormatter) {\r\n {{ column.totalFooterFormatter(getTotalPerPageOfColum(column.key)) }}\r\n } @else {\r\n {{ getTotalPerPageOfColum(column.key) }}\r\n }\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n\r\n @if(showTotalGeneralFooter()) {\r\n @for (column of config()().columns; track $index) {\r\n <ng-container \r\n [matColumnDef]=\"`${generalFooterKeyPrefix}${getKeyAsString(column.key)}`\"\r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n <td mat-footer-cell *matFooterCellDef [style]=\"column.footerStyle\">\r\n @if(column.showTotalGeneral) {\r\n @if(column.pipes) {\r\n {{ applyColumnPipes(getTotalOfColum(column.key), column.pipes) }}\r\n } @else if(column.totalFooterFormatter) {\r\n {{ column.totalFooterFormatter(getTotalOfColum(column.key)) }}\r\n } @else {\r\n {{ getTotalOfColum(column.key) }}\r\n }\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(showFiltersRow()) {\r\n @for (column of config()().columns; track $index) {\r\n <ng-container \r\n [matColumnDef]=\"`${filterKeyPrefix}${getKeyAsString(column.key)}`\" \r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n\r\n <th mat-header-cell *matHeaderCellDef>\r\n @if (column.filterType == 'text' || column.filterType == 'number') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"inputQueryColumn\">\r\n <input [type]=\"column.filterType\" matInput [placeholder]=\"column.label\" [value]=\"getValueOfColumnFilter(column.key) ?? ''\" (input)=\"onTextFilterColumnChange(column, $event)\">\r\n <mat-icon matSuffix>{{ column.filterType == 'text' ? 'search' : 'numbers'}}</mat-icon>\r\n </mat-form-field>\r\n }\r\n\r\n @if (column.filterType == 'option' || column.filterType == 'option-multiple') {\r\n @if(column.endpointForPaginatedFilterOptions) {\r\n <ngx-paginated-searchable-select\r\n class=\"selectColumn\"\r\n [selected]=\"getPaginatedSearchableSelectValueOfColumnFilter(column.key)\"\r\n [endpoint]=\"column.endpointForPaginatedFilterOptions\"\r\n [filters]=\"column.filtersForEndpointPaginatedFilterOptions ?? defaultFiltersForPaginatedFilterOptions\"\r\n [multiple]=\"column.filterType == 'option-multiple'\"\r\n subscriptSizing=\"dynamic\"\r\n [selectPlaceholder]=\"column.label\"\r\n (optionChange)=\"onPaginatedOptionFilterColumnChange(column, $event)\"\r\n clearableOptionLabel=\"filtro\"\r\n />\r\n } @else {\r\n <ngx-searchable-select\r\n class=\"selectColumn\"\r\n [selected]=\"getSearchableSelectValueOfColumnFilter(column.key)\"\r\n [options]=\"column.filterOptions ?? []\"\r\n [multiple]=\"column.filterType == 'option-multiple'\"\r\n subscriptSizing=\"dynamic\"\r\n [selectPlaceholder]=\"column.label\"\r\n (optionChange)=\"onOptionFilterColumnChange(column, $event)\"\r\n clearableOptionLabel=\"filtro\"\r\n />\r\n } \r\n }\r\n \r\n @if(column.filterType == 'date') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"dateColumn\">\r\n <input \r\n matInput \r\n [matDatepicker]=\"picker\" \r\n [placeholder]=\"column.label\"\r\n [value]=\"getValueOfColumnFilter(column.key)\"\r\n (dateChange)=\"onDateFilterChange(column, $event.value)\">\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker></mat-datepicker>\r\n </mat-form-field>\r\n }\r\n\r\n @if(column.filterType == 'date-range') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"dateColumn\">\r\n <mat-date-range-input [rangePicker]=\"picker\" #dateRangeInput>\r\n <input \r\n matStartDate \r\n [placeholder]=\"texts().table.dateRangeStart\"\r\n [value]=\"getDateRangeValueOfColumnFilter(column.key, 'start')\"\r\n (dateChange)=\"onDateRangeFilterChange(column, dateRangeInput.value)\">\r\n <input \r\n matEndDate \r\n [placeholder]=\"texts().table.dateRangeEnd\"\r\n [value]=\"getDateRangeValueOfColumnFilter(column.key, 'end')\"\r\n (dateChange)=\"onDateRangeFilterChange(column, dateRangeInput.value)\">\r\n </mat-date-range-input>\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-date-range-picker #picker></mat-date-range-picker>\r\n </mat-form-field>\r\n }\r\n </th>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(showActionsColumn()) {\r\n @if(showFiltersRow()) {\r\n <ng-container [matColumnDef]=\"`${filterKeyPrefix}${nameOfActionsColumn}`\" [stickyEnd]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef class=\"celdaAcciones\"></th>\r\n </ng-container>\r\n } \r\n\r\n <ng-container [matColumnDef]=\"nameOfActionsColumn\" [stickyEnd]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef>{{ texts().table.actions }}</th>\r\n <td mat-cell *matCellDef=\"let row\" (click)=\"$event.stopPropagation()\" class=\"celdaAcciones\">\r\n <div class=\"contenedorCeldaAcciones\">\r\n @if(config()().expandableDetail) {\r\n <button \r\n matIconButton\r\n (click)=\"expandableToggle(row)\">\r\n <mat-icon>{{ rowIsExpanded(row) ? 'keyboard_arrow_up' : 'keyboard_arrow_down' }}</mat-icon>\r\n </button>\r\n }\r\n\r\n @for (rowAction of config()().rowActions; track $index) {\r\n @if(!rowAction.show || rowAction.show(row)) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"rowAction.tooltip(row)\" \r\n [disabled]=\"rowAction.disabled?.(row)\" \r\n [class]=\"rowAction.iconColor ? `rowActionIconColor${rowAction.iconColor}` : ''\"\r\n (click)=\"onRowActionClick(row, rowAction, $event)\">\r\n <mat-icon>{{rowAction.icon}}</mat-icon>\r\n </button>\r\n } \r\n }\r\n\r\n @if(config()().update && !config()().clickOnRowForUpdate && (!config()().update?.show || config()().update?.show(row))) {\r\n <button \r\n matIconButton\r\n [matTooltip]=\"config()().update?.tooltip?.(row) ?? texts().table.edit\" \r\n [disabled]=\"config()().update?.disabled?.(row)\" \r\n class=\"editButtonIcon\"\r\n (click)=\"onUpdateClick(row, $event)\">\r\n <mat-icon>edit_square</mat-icon>\r\n </button>\r\n }\r\n \r\n @if(config()().delete && (!config()().delete?.show || config()().delete?.show(row))) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"config()().delete?.tooltip?.(row) ?? texts().table.delete\" \r\n [disabled]=\"config()().delete?.disabled?.(row)\" \r\n class=\"deleteButtonIcon\"\r\n (click)=\"onDeleteClick(row, $event)\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <ng-container [matColumnDef]=\"`${generalFooterKeyPrefix}${nameOfActionsColumn}`\" [stickyEnd]=\"isDesktop()\">\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(config()().expandableDetail) {\r\n <ng-container [matColumnDef]=\"expandableColumnDef\">\r\n <td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"keys().length\">\r\n <div \r\n class=\"detailWrapper\"\r\n [class.detailWrapperExpanded]=\"rowIsExpanded(row)\">\r\n <div class=\"columnDetail\">\r\n @if(config()().expandableDetailTemplateRef) {\r\n <ng-container \r\n *ngTemplateOutlet=\"config()().expandableDetailTemplateRef!(); \r\n context: { $implicit: row }\" />\r\n }\r\n </div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n }\r\n \r\n <tr mat-header-row *matHeaderRowDef=\"keys(); sticky: true\" class=\"tableHeader\"></tr>\r\n \r\n @if(showFiltersRow()) {\r\n <tr mat-header-row *matHeaderRowDef=\"keysWithFilter(); sticky: true\" class=\"filtersByColumn\"></tr>\r\n }\r\n \r\n <tr mat-row *matRowDef=\"let row; columns: keys();\" \r\n (click)=\"onRowClick(row)\" \r\n [class.rowClickEnable]=\"isRowEnabled(row)\"\r\n [class.expandableRow]=\"config()().expandableDetail\">\r\n </tr>\r\n \r\n @if(config()().expandableDetail) {\r\n <tr mat-row *matRowDef=\"let row; columns: [expandableColumnDef]\" class=\"rowDetail\"></tr>\r\n }\r\n\r\n <tr mat-footer-row \r\n *matFooterRowDef=\"showTotalPerPageFooter() ? keys() : []\" \r\n class=\"totalPerPageFooter\"\r\n [class.hideFooter]=\"!showTotalPerPageFooter()\">\r\n </tr>\r\n\r\n <tr mat-footer-row \r\n *matFooterRowDef=\"showTotalGeneralFooter() ? keysWithGeneralFooter() : []\" \r\n class=\"totalFooter\"\r\n [class.hideFooter]=\"!showTotalGeneralFooter()\">\r\n </tr>\r\n\r\n <tr class=\"mat-row\" *matNoDataRow>\r\n <td class=\"noData\" [colSpan]=\"keys().length\">{{ loading() ? texts().common.loading : texts().common.noData }}</td>\r\n </tr>\r\n </table>\r\n </div>\r\n\r\n <div class=\"paginatorContainer\">\r\n <div class=\"footerLegend\">\r\n @if(showTotalPerPageFooter()) {\r\n <div class=\"legendItem\">\r\n <div class=\"legendSquare\"></div>\r\n <p>{{ texts().table.totalPerPage }}</p> \r\n </div>\r\n }\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <div class=\"legendItem\">\r\n <div class=\"legendSquare totalGeneral\"></div>\r\n <p>{{ texts().table.totalGeneral }}</p>\r\n </div>\r\n }\r\n </div>\r\n <mat-paginator />\r\n </div>\r\n\r\n <ng-content select=\"[end-container]\"></ng-content>\r\n </div>\r\n</ng-template>","import { booleanAttribute, ChangeDetectionStrategy, Component, computed, inject, input, output, signal } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { AlertAppearance, AlertType } from '../../models';\r\nimport { NgxTexts } from '../../i18n';\r\n\r\nconst DEFAULT_ICONS: Record<AlertType, string> = {\r\n info: 'info',\r\n success: 'check_circle',\r\n warning: 'warning',\r\n error: 'error',\r\n};\r\n\r\n@Component({\r\n selector: 'ngx-alert',\r\n imports: [MatIconModule, MatButtonModule, MatTooltipModule],\r\n templateUrl: './ngx-alert.component.html',\r\n styleUrl: './ngx-alert.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n '[attr.role]': 'isDismissed() ? null : resolvedRole()',\r\n '[class.ngx-alert--dismissed]': 'isDismissed()',\r\n },\r\n})\r\nexport class NgxAlert {\r\n private readonly _texts = inject(NgxTexts).texts;\r\n\r\n /** Gravedad del mensaje: define color, icono por defecto y cómo se anuncia. */\r\n readonly type = input<AlertType>('info');\r\n\r\n /** Título en negrita sobre el mensaje. */\r\n readonly title = input<string>();\r\n\r\n /** Mensaje en texto plano. Para contenido con formato o enlaces, proyéctalo como contenido. */\r\n readonly message = input<string>();\r\n\r\n /** Estilo visual: standard (fondo + franja lateral), soft (solo fondo) u outlined (solo borde). */\r\n readonly appearance = input<AlertAppearance>('standard');\r\n\r\n /** Icono de Material Symbols. Por defecto, el del tipo (info, check_circle, warning, error). */\r\n readonly icon = input<string>();\r\n\r\n /** Oculta el icono. */\r\n readonly hideIcon = input(false, { transform: booleanAttribute });\r\n\r\n /** Muestra un botón para cerrar el aviso. Al pulsarlo se oculta y emite `dismissed`. */\r\n readonly dismissible = input(false, { transform: booleanAttribute });\r\n\r\n /** Etiqueta accesible del botón de cerrar. Por defecto, el texto `alert.dismiss` de la librería. */\r\n readonly dismissLabel = input<string>();\r\n\r\n /**\r\n * Cómo lo anuncia el lector de pantalla. assertive interrumpe (role=\"alert\"), polite espera\r\n * a que termine (role=\"status\") y off no lo anuncia. Por defecto: assertive para error y\r\n * warning, polite para info y success.\r\n */\r\n readonly politeness = input<'assertive' | 'polite' | 'off'>();\r\n\r\n /** Se emite cuando el usuario cierra el aviso con el botón de cerrar. */\r\n readonly dismissed = output<void>();\r\n\r\n protected readonly isDismissed = signal(false);\r\n\r\n protected readonly resolvedIcon = computed(() => this.icon() || DEFAULT_ICONS[this.type()] || DEFAULT_ICONS.info);\r\n\r\n protected readonly resolvedDismissLabel = computed(() => {\r\n return this.dismissLabel() ?? this._texts().alert.dismiss;\r\n });\r\n\r\n protected readonly resolvedRole = computed(() => {\r\n const politeness = this.politeness()\r\n ?? (this.type() === 'error' || this.type() === 'warning' ? 'assertive' : 'polite');\r\n\r\n switch (politeness) {\r\n case 'assertive': return 'alert';\r\n case 'polite': return 'status';\r\n default: return null;\r\n }\r\n });\r\n\r\n protected dismiss(): void {\r\n this.isDismissed.set(true);\r\n this.dismissed.emit();\r\n }\r\n}\r\n","@if (!isDismissed()) {\n <div class=\"alert\" [class]=\"'alert alert--' + type() + ' alert--' + appearance()\">\n @if (!hideIcon()) {\n <mat-icon class=\"alert__icon\" aria-hidden=\"true\">{{ resolvedIcon() }}</mat-icon>\n }\n\n <div class=\"alert__content\">\n @if (title()) {\n <div class=\"alert__title\">{{ title() }}</div>\n }\n\n <div class=\"alert__description\">\n @if (message()) {\n <p class=\"alert__message\">{{ message() }}</p>\n }\n <ng-content />\n </div>\n\n <div class=\"alert__actions\">\n <ng-content select=\"[alertActions]\" />\n </div>\n </div>\n\n @if (dismissible()) {\n <button\n type=\"button\"\n class=\"alert__dismiss\"\n matIconButton\n [attr.aria-label]=\"resolvedDismissLabel()\"\n [matTooltip]=\"resolvedDismissLabel()\"\n (click)=\"dismiss()\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </div>\n}\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n DestroyRef,\r\n effect,\r\n inject,\r\n signal,\r\n TemplateRef,\r\n untracked,\r\n ViewEncapsulation,\r\n WritableSignal,\r\n} from '@angular/core';\r\nimport { NgxTexts } from '../../../i18n';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { MAT_BOTTOM_SHEET_DATA, MatBottomSheetRef } from '@angular/material/bottom-sheet';\r\nimport { PaginatedFilter } from '../../../models/paginated-filter';\r\nimport { PaginatedItems } from '../../../models/paginated-items';\r\nimport { PaginatedSelectConfig } from '../../../models/select-config';\r\nimport { rxResource } from '@angular/core/rxjs-interop';\r\nimport { toObservable } from '@angular/core/rxjs-interop';\r\nimport { catchError, debounceTime, distinctUntilChanged, merge, Observable, of, skip, Subject } from 'rxjs';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatRippleModule } from '@angular/material/core';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatBadgeModule } from '@angular/material/badge';\r\n\r\nexport interface NgxPaginatedSelectBottomSheetData<T, U extends PaginatedFilter<T>> {\r\n title: string;\r\n config: PaginatedSelectConfig<T>;\r\n endpoint: (filters: U) => Observable<PaginatedItems<T>>;\r\n filters: WritableSignal<U>;\r\n /** Accepts full objects OR partials containing only the valueKey */\r\n selectedItems: Partial<T>[];\r\n multiple: boolean;\r\n showSearch: boolean;\r\n searchPlaceholder: string;\r\n noResultsMessage: string;\r\n confirmLabel: string;\r\n resetLabel: string;\r\n optionTemplate: TemplateRef<{ $implicit: T }> | null;\r\n extraFiltersTemplate: TemplateRef<void> | null;\r\n showSelectAll: boolean;\r\n selectAllLabel: string;\r\n}\r\n\r\n@Component({\r\n selector: 'ngx-paginated-select-bottom-sheet',\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n MatButtonModule,\r\n MatChipsModule,\r\n MatDividerModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatProgressBarModule,\r\n MatRippleModule,\r\n MatCheckboxModule,\r\n MatTooltipModule,\r\n MatBadgeModule,\r\n ],\r\n templateUrl: './ngx-paginated-select-bottom-sheet.component.html',\r\n styleUrl: './ngx-paginated-select-bottom-sheet.component.scss',\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class NgxPaginatedSelectBottomSheetComponent<T, U extends PaginatedFilter<T>> {\r\n // ─── Dependencies ──────────────────────────────────────────────────────────\r\n private readonly _ref = inject(MatBottomSheetRef<NgxPaginatedSelectBottomSheetComponent<T, U>>);\r\n private readonly _destroy = inject(DestroyRef);\r\n readonly data = inject<NgxPaginatedSelectBottomSheetData<T, U>>(MAT_BOTTOM_SHEET_DATA);\r\n readonly texts = inject(NgxTexts).texts;\r\n\r\n // ─── State ─────────────────────────────────────────────────────────────────\r\n /** Raw input value — updates on every keystroke, does NOT trigger the resource */\r\n readonly query = signal(this.data.filters().query);\r\n /** Holds Partial<T> initially; items get upgraded to full T when toggled from the list */\r\n readonly selectedItems = signal<Partial<T>[]>([...this.data.selectedItems]);\r\n\r\n /**\r\n * Subject used to bypass the 400 ms debounce (e.g. when the user clears\r\n * the search field — we want an immediate response).\r\n */\r\n private readonly _immediateQuery$ = new Subject<string>();\r\n\r\n private readonly accumulatedItems = signal<T[]>([]);\r\n\r\n // ─── Resource (single trigger: data.filters) ───────────────────────────────\r\n /**\r\n * IMPORTANT: the resource depends ONLY on `data.filters`.\r\n * The debounce subscription (below) is the only thing that mutates\r\n * `data.filters.query`, so the resource fires at most once per debounce\r\n * period — never on every keystroke.\r\n */\r\n readonly resource = rxResource({\r\n params: () => ({ ...this.data.filters() }),\r\n // Un fallo de red degrada a lista vacía (estado \"sin resultados\") en vez de\r\n // dejar el resource en error —que rompería el render y ensuciaría la consola—.\r\n stream: ({ params }) =>\r\n this.data.endpoint(params).pipe(\r\n catchError(() => of({ items: [], total: 0 } as PaginatedItems<T>))\r\n ),\r\n defaultValue: { items: [], total: 0 } as PaginatedItems<T>,\r\n });\r\n\r\n // ─── Computed ──────────────────────────────────────────────────────────────\r\n readonly isLoading = computed(() => this.resource.isLoading());\r\n readonly options = computed(() => this.accumulatedItems());\r\n readonly hasError = computed(() => !!this.resource.error());\r\n readonly selectedCount = computed(() => this.selectedItems().length);\r\n\r\n /**\r\n * Total como signal, actualizado SOLO cuando el recurso no está cargando. Durante\r\n * la carga por scroll, resource.value() pasa transitoriamente al defaultValue\r\n * (total: 0); leerlo directamente hacía parpadear el footer a \"0 resultados\"\r\n * aunque el total real no cambie. Con este signal el total se mantiene estable\r\n * mientras se cargan más páginas.\r\n */\r\n private readonly _total = signal(0);\r\n readonly total = this._total.asReadonly();\r\n private readonly _totalEffect = effect(() => {\r\n if (this.resource.isLoading())\r\n return;\r\n try {\r\n this._total.set(this.resource.error() ? 0 : this.resource.value().total);\r\n } catch {\r\n // El recurso puede lanzar si está en error o se elimina durante el teardown;\r\n // se conserva el último total y no se rompe el ciclo de detección de cambios.\r\n }\r\n });\r\n\r\n /** Cargando la PRIMERA página (lista vacía) → se muestran skeletons. */\r\n readonly isInitialLoading = computed(() => this.isLoading() && this.options().length === 0);\r\n /** Cargando MÁS páginas (scroll) → fila inline \"cargando más…\", sin barra superior. */\r\n readonly isLoadingMore = computed(() => this.isLoading() && this.options().length > 0);\r\n /** Ya se han cargado todos los resultados disponibles. */\r\n readonly allLoaded = computed(() => this.total() > 0 && this.options().length >= this.total());\r\n /** Cabecera con sombra solo cuando la lista está desplazada. */\r\n readonly headerScrolled = signal(false);\r\n\r\n readonly allSelected = computed(() => {\r\n const items = this.options();\r\n if (items.length === 0) return false;\r\n return items.every(item => this.isSelected(item));\r\n });\r\n\r\n readonly someSelected = computed(() => {\r\n const items = this.options();\r\n if (items.length === 0) return false;\r\n const count = items.filter(item => this.isSelected(item)).length;\r\n return count > 0 && count < items.length;\r\n });\r\n\r\n // ─── Accumulate pages ──────────────────────────────────────────────────────\r\n /**\r\n * Reactively depends ONLY on `resource.value()`. The filter snapshot is read\r\n * via `untracked` so external filter changes (parent-driven, e.g. an extra\r\n * filters panel) do NOT create a reactive dependency here — that would make\r\n * the effect re-run on scroll page increments with stale resource data,\r\n * duplicating items and breaking `onScroll` (see original limitation).\r\n *\r\n * Reset logic:\r\n * - Fingerprint the current filter identity (everything except `pageNumber`).\r\n * - If the fingerprint changed since the previous fetch, this fetch belongs\r\n * to a different filter set → replace the accumulated array.\r\n * - If only `pageNumber` moved, this is a scroll-load-more → append.\r\n *\r\n * This is what allows callers to mutate `data.filters` from outside (extra\r\n * filter selects, checkboxes, etc.) and have the list refresh cleanly\r\n * without the previous page's items lingering.\r\n */\r\n private _lastFilterFingerprint: string | null = null;\r\n private readonly _accumEffect = effect(() => {\r\n // Si el endpoint falla, resource.value() lanza: se trata como lista vacía.\r\n if (this.resource.error()) {\r\n this.accumulatedItems.set([]);\r\n return;\r\n }\r\n\r\n let value: PaginatedItems<T>;\r\n try {\r\n value = this.resource.value();\r\n } catch {\r\n // El recurso puede lanzar si se elimina durante el teardown; se ignora para\r\n // no romper el ciclo de detección de cambios.\r\n return;\r\n }\r\n const { pageNumber, ...rest } = untracked(() => this.data.filters()) as U;\r\n const fingerprint = JSON.stringify(rest);\r\n\r\n // Cambio de filtros, o refetch de la primera pagina (reintento, error que\r\n // devuelve el defaultValue del resource...): se reemplaza en vez de acumular.\r\n if (fingerprint !== this._lastFilterFingerprint || pageNumber <= 1) {\r\n this._lastFilterFingerprint = fingerprint;\r\n this.accumulatedItems.set([...value.items]);\r\n return;\r\n }\r\n\r\n // Scroll: se anaden solo los que no estuvieran ya, para que un refetch de la\r\n // misma pagina no duplique elementos en la lista.\r\n const key = this.data.config.valueKey as keyof T;\r\n this.accumulatedItems.update(acc => {\r\n const known = new Set(acc.map(item => item[key]));\r\n const nuevos = value.items.filter(item => !known.has(item[key]));\r\n return nuevos.length > 0 ? [...acc, ...nuevos] : acc;\r\n });\r\n });\r\n\r\n constructor() {\r\n // Reset to page 1 when the sheet opens\r\n this.accumulatedItems.set([]);\r\n this.data.filters.update(f => ({ ...f, pageNumber: 1 }));\r\n\r\n /**\r\n * Debounce pipeline:\r\n * typed input → wait 400 ms → push into data.filters\r\n * _immediateQuery$ → no wait → push into data.filters (used by clearQuery)\r\n *\r\n * The merged stream has a final distinctUntilChanged so that an immediate\r\n * clear followed by the debounced '' 400 ms later does NOT fire twice.\r\n */\r\n merge(\r\n this._immediateQuery$,\r\n // skip(1) skips the initial BehaviorSubject-like emission from toObservable\r\n // so we don't re-fetch 400ms after the sheet opens with an empty query\r\n toObservable(this.query).pipe(skip(1), debounceTime(400), distinctUntilChanged()),\r\n )\r\n .pipe(distinctUntilChanged(), takeUntilDestroyed(this._destroy))\r\n .subscribe(q => {\r\n this.accumulatedItems.set([]);\r\n this.data.filters.update(f => ({ ...f, query: q, pageNumber: 1 }));\r\n });\r\n\r\n }\r\n\r\n // ─── Helpers ────────────────────────────────────────────────────────────────\r\n\r\n isSelected(item: T): boolean {\r\n const key = this.data.config.valueKey as keyof T;\r\n const val = item[key];\r\n return this.selectedItems().some(s => s[key] === val);\r\n }\r\n\r\n /**\r\n * Safe label: tries displayedLabel(item), falls back to String(item[valueKey]).\r\n * Works for both full objects and partials.\r\n */\r\n getLabel(item: Partial<T>): string {\r\n const cfg = this.data.config;\r\n const keyVal = String(item[cfg.valueKey as keyof T] ?? '');\r\n if (!cfg.displayedLabel) return keyVal;\r\n try {\r\n return cfg.displayedLabel(item as T) ?? keyVal;\r\n } catch {\r\n return keyVal;\r\n }\r\n }\r\n\r\n getAvatarText(item: Partial<T>): string {\r\n if (this.data.config.avatarText) {\r\n try { return this.data.config.avatarText(item as T); } catch { /* fall through */ }\r\n }\r\n return this.getLabel(item).charAt(0).toUpperCase();\r\n }\r\n\r\n /** Claves de items cuya imagen de avatar falló al cargar (para el fallback). */\r\n private readonly failedImages = signal<Set<unknown>>(new Set());\r\n\r\n /** URL de imagen del avatar, o null si no hay o si falló al cargar. */\r\n getAvatarImage(item: Partial<T>): string | null | undefined {\r\n const key = item[this.data.config.valueKey as keyof T];\r\n if (this.failedImages().has(key))\r\n return null;\r\n return this.data.config.avatarImage?.(item as T);\r\n }\r\n\r\n /** Marca la imagen como fallida para caer al texto/icono. */\r\n onAvatarError(item: Partial<T>): void {\r\n const key = item[this.data.config.valueKey as keyof T];\r\n this.failedImages.update(s => new Set(s).add(key));\r\n }\r\n\r\n // ─── Selection ──────────────────────────────────────────────────────────────\r\n\r\n toggleItem(item: T): void {\r\n if (this.data.config.disabled?.(item)) return;\r\n\r\n const key = this.data.config.valueKey as keyof T;\r\n const val = item[key];\r\n\r\n if (this.data.multiple) {\r\n if (this.isSelected(item)) {\r\n this.selectedItems.update(items => items.filter(s => s[key] !== val));\r\n } else {\r\n // Remove any existing partial with the same key, then add the full object\r\n this.selectedItems.update(items => [\r\n ...items.filter(s => s[key] !== val),\r\n item,\r\n ]);\r\n }\r\n } else {\r\n if (this.isSelected(item)) {\r\n this.selectedItems.set([]);\r\n } else {\r\n this.selectedItems.set([item]);\r\n this.confirm();\r\n }\r\n }\r\n }\r\n\r\n removeSelectedChip(item: Partial<T>): void {\r\n const key = this.data.config.valueKey as keyof T;\r\n const val = item[key];\r\n this.selectedItems.update(items => items.filter(s => s[key] !== val));\r\n }\r\n\r\n // ─── Search ──────────────────────────────────────────────────────────────────\r\n\r\n onQueryInput(event: Event, container: HTMLElement): void {\r\n container.scrollTop = 0;\r\n // Only update the raw signal — the debounce subscription handles the rest\r\n this.query.set((event.target as HTMLInputElement).value);\r\n }\r\n\r\n clearQuery(container?: HTMLElement): void {\r\n // El input refleja la query vía [value]=\"query()\", así que basta con resetear\r\n // el signal (no hace falta el ref del DOM, que no está en scope en el estado vacío).\r\n if (container) container.scrollTop = 0;\r\n this.query.set('');\r\n // Emit on the immediate subject to bypass the 400 ms debounce\r\n this._immediateQuery$.next('');\r\n }\r\n\r\n // ─── Scroll ──────────────────────────────────────────────────────────────────\r\n\r\n onScroll(container: HTMLElement): void {\r\n // Sombra bajo la cabecera al desplazar\r\n this.headerScrolled.set(container.scrollTop > 4);\r\n\r\n if (this.isLoading()) return;\r\n const { scrollTop, clientHeight, scrollHeight } = container;\r\n // Prefetch: se pide la siguiente página ~320px antes del final para que la\r\n // fila de \"cargando más\" apenas se vea (scroll infinito fluido).\r\n if (\r\n scrollTop + clientHeight + 320 >= scrollHeight &&\r\n this.options().length < this.total()\r\n ) {\r\n this.data.filters.update(f => ({ ...f, pageNumber: f.pageNumber + 1 }));\r\n }\r\n }\r\n\r\n /** Reintenta la carga tras un error. */\r\n retry(): void {\r\n this.resource.reload();\r\n }\r\n\r\n // ─── Select all ─────────────────────────────────────────────────────────────\r\n\r\n toggleSelectAll(): void {\r\n const key = this.data.config.valueKey as keyof T;\r\n if (this.allSelected()) {\r\n const visibleValues = new Set(this.options().map(item => item[key]));\r\n this.selectedItems.update(items =>\r\n items.filter(s => !visibleValues.has(s[key] as T[keyof T]))\r\n );\r\n } else {\r\n const newItems = this.options().filter(\r\n item => !this.isSelected(item) && !this.data.config.disabled?.(item)\r\n );\r\n this.selectedItems.update(items => [...items, ...newItems]);\r\n }\r\n }\r\n\r\n // ─── Actions ──────────────────────────────────────────────────────────────────\r\n\r\n confirm(): void {\r\n this._ref.dismiss(this.selectedItems());\r\n }\r\n\r\n reset(): void {\r\n this.selectedItems.set([]);\r\n }\r\n\r\n close(): void {\r\n this._ref.dismiss(undefined);\r\n }\r\n}\r\n","<div class=\"ps-bs\">\r\n\r\n <!-- ── Handle bar (mobile) ───────────────────────────────────────────────── -->\r\n <div class=\"ps-bs__handle\">\r\n <div class=\"ps-bs__handle-bar\"></div>\r\n </div>\r\n\r\n <!-- ── Header (pinned: title + search only) ──────────────────────────────── -->\r\n <div class=\"ps-bs__header\" [class.ps-bs__header--scrolled]=\"headerScrolled()\">\r\n <div class=\"ps-bs__header-top\">\r\n <div class=\"ps-bs__title-area\">\r\n <span class=\"ps-bs__title\">{{ data.title }}</span>\r\n @if (data.multiple && selectedCount() > 0) {\r\n <span class=\"ps-bs__badge\">{{ selectedCount() }}</span>\r\n }\r\n </div>\r\n <button mat-icon-button class=\"ps-bs__close-btn\" [attr.aria-label]=\"texts().common.close\" (click)=\"close()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <!-- Pill search -->\r\n @if (data.showSearch) {\r\n <div class=\"ps-bs__search\">\r\n <mat-icon class=\"ps-bs__search-icon\">search</mat-icon>\r\n <input\r\n class=\"ps-bs__search-input\"\r\n #searchInput\r\n type=\"text\"\r\n [value]=\"query() ?? ''\"\r\n [placeholder]=\"data.searchPlaceholder\"\r\n (input)=\"onQueryInput($event, bodyContainer)\"\r\n />\r\n @if (searchInput.value.length > 0) {\r\n <button\r\n class=\"ps-bs__search-clear\"\r\n type=\"button\"\r\n [attr.aria-label]=\"texts().common.clearSearch\"\r\n (click)=\"clearQuery(bodyContainer); $event.stopPropagation()\"\r\n >\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- ── Body (ÚNICA zona de scroll: filtros + chips + select-all + lista) ──── -->\r\n <div class=\"ps-bs__body\" #bodyContainer (scroll)=\"onScroll(bodyContainer)\">\r\n\r\n <!-- Extra filters projection -->\r\n @if (data.extraFiltersTemplate) {\r\n <div class=\"ps-bs__extra-filters\">\r\n <ng-container *ngTemplateOutlet=\"data.extraFiltersTemplate\" />\r\n </div>\r\n }\r\n\r\n <!-- Selected chips (custom lightweight chips) -->\r\n @if (data.multiple && selectedItems().length > 0) {\r\n <div class=\"ps-bs__selected-chips\">\r\n @for (item of selectedItems(); track item[data.config.valueKey]) {\r\n <div class=\"ps-bs__chip\">\r\n <span class=\"ps-bs__chip-label\">{{ getLabel(item) }}</span>\r\n <button class=\"ps-bs__chip-remove\" type=\"button\" [attr.aria-label]=\"texts().common.clearSearch\" (click)=\"removeSelectedChip(item)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Select all (sticky top of the scroll area) -->\r\n @if (data.multiple && data.showSelectAll && options().length > 0) {\r\n <div class=\"ps-bs__select-all\" matRipple (click)=\"toggleSelectAll()\">\r\n <mat-checkbox\r\n [checked]=\"allSelected()\"\r\n [indeterminate]=\"someSelected()\"\r\n (click)=\"$event.preventDefault()\"\r\n />\r\n <span class=\"ps-bs__select-all-label\">{{ data.selectAllLabel }}</span>\r\n </div>\r\n }\r\n\r\n <!-- ── Options list ──────────────────────────────────────────────────── -->\r\n <div class=\"ps-bs__list\">\r\n\r\n <!-- Skeleton loading (only for the first page) -->\r\n @if (isInitialLoading()) {\r\n @for (i of [1, 2, 3, 4, 5, 6]; track i) {\r\n <div class=\"ps-bs__skeleton\">\r\n <div class=\"ps-bs__skeleton-avatar\"></div>\r\n <div class=\"ps-bs__skeleton-content\">\r\n <div class=\"ps-bs__skeleton-line ps-bs__skeleton-line--title\"></div>\r\n <div class=\"ps-bs__skeleton-line ps-bs__skeleton-line--subtitle\"></div>\r\n </div>\r\n </div>\r\n }\r\n }\r\n\r\n <!-- Error state -->\r\n @if (hasError() && !isLoading() && options().length === 0) {\r\n <div class=\"ps-bs__state ps-bs__error\">\r\n <div class=\"ps-bs__state-icon-wrap ps-bs__error-icon-wrap\">\r\n <mat-icon>error_outline</mat-icon>\r\n </div>\r\n <div class=\"ps-bs__state-title\">{{ texts().paginatedSelect.errorTitle }}</div>\r\n <div class=\"ps-bs__state-hint\">{{ texts().paginatedSelect.errorHint }}</div>\r\n <button matButton=\"tonal\" (click)=\"retry()\">\r\n <mat-icon>refresh</mat-icon>\r\n {{ texts().paginatedSelect.retry }}\r\n </button>\r\n </div>\r\n }\r\n\r\n <!-- Empty state -->\r\n @if (!hasError() && options().length === 0 && !isLoading()) {\r\n <div class=\"ps-bs__state ps-bs__empty\">\r\n <div class=\"ps-bs__state-icon-wrap\">\r\n <mat-icon>search_off</mat-icon>\r\n </div>\r\n <div class=\"ps-bs__state-title\">{{ data.noResultsMessage }}</div>\r\n @if (query()) {\r\n <div class=\"ps-bs__state-hint\">{{ texts().paginatedSelect.noResultsHint }}</div>\r\n <button matButton (click)=\"clearQuery(bodyContainer)\">\r\n {{ texts().paginatedSelect.clearSearch }}\r\n </button>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Option rows -->\r\n @for (item of options(); track item[data.config.valueKey]) {\r\n @let disabled = data.config.disabled ? data.config.disabled(item) : false;\r\n @let selected = isSelected(item);\r\n @let avatarImg = getAvatarImage(item);\r\n\r\n <div\r\n class=\"ps-bs__option\"\r\n [class.ps-bs__option--selected]=\"selected\"\r\n [class.ps-bs__option--disabled]=\"disabled\"\r\n matRipple\r\n [matRippleDisabled]=\"disabled\"\r\n (click)=\"toggleItem(item)\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"selected\"\r\n [attr.aria-disabled]=\"disabled\"\r\n >\r\n <!-- Avatar (al seleccionar se voltea a un check, estilo Gmail) -->\r\n <div class=\"ps-bs__option-avatar\" [class.ps-bs__option-avatar--selected]=\"selected\">\r\n @if (selected) {\r\n <mat-icon class=\"ps-bs__option-avatar-check\">check</mat-icon>\r\n } @else if (avatarImg) {\r\n <img [src]=\"avatarImg\" [alt]=\"getLabel(item)\" (error)=\"onAvatarError(item)\" loading=\"lazy\" />\r\n } @else if (data.config.avatarText) {\r\n {{ getAvatarText(item) }}\r\n } @else if (data.config.avatarIcon) {\r\n <mat-icon>{{ data.config.avatarIcon }}</mat-icon>\r\n } @else {\r\n {{ getAvatarText(item) }}\r\n }\r\n </div>\r\n\r\n <!-- Content -->\r\n <div class=\"ps-bs__option-content\">\r\n @if (data.optionTemplate) {\r\n <ng-container *ngTemplateOutlet=\"data.optionTemplate; context: { $implicit: item }\" />\r\n } @else {\r\n <span class=\"ps-bs__option-label\">{{ getLabel(item) }}</span>\r\n @if (data.config.subtitle) {\r\n <span class=\"ps-bs__option-subtitle\">{{ data.config.subtitle(item) }}</span>\r\n }\r\n }\r\n </div>\r\n\r\n <!-- Check indicator -->\r\n @if (data.multiple) {\r\n <mat-checkbox [checked]=\"selected\" [disabled]=\"disabled\" (click)=\"$event.preventDefault()\" />\r\n } @else if (selected) {\r\n <mat-icon class=\"ps-bs__option-check\">check_circle</mat-icon>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Loading more (pagination) / end of list -->\r\n @if (isLoadingMore()) {\r\n <div class=\"ps-bs__loading-more\" aria-live=\"polite\">\r\n <span class=\"ps-bs__loading-more-dot\"></span>\r\n <span class=\"ps-bs__loading-more-dot\"></span>\r\n <span class=\"ps-bs__loading-more-dot\"></span>\r\n <span class=\"ps-bs__loading-more-text\">{{ texts().paginatedSelect.loadingMore }}</span>\r\n </div>\r\n } @else if (allLoaded() && options().length > 0) {\r\n <div class=\"ps-bs__list-end\">{{ texts().paginatedSelect.endOfList }}</div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- ── Footer (ALWAYS VISIBLE — never scrolls) ──────────────────────────── -->\r\n <div class=\"ps-bs__footer\">\r\n <span class=\"ps-bs__footer-count\">\r\n @if (data.multiple) {\r\n {{ texts().paginatedSelect.selectedCount(selectedCount(), total()) }}\r\n } @else {\r\n {{ texts().paginatedSelect.resultsCount(total()) }}\r\n }\r\n </span>\r\n\r\n @if (data.multiple) {\r\n <div class=\"ps-bs__footer-actions\">\r\n @if (selectedCount() > 0) {\r\n <button matButton (click)=\"reset()\">{{ data.resetLabel }}</button>\r\n }\r\n <button matButton=\"filled\" color=\"primary\" (click)=\"confirm()\">{{ data.confirmLabel }}</button>\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n","import {\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n TemplateRef,\r\n untracked,\r\n WritableSignal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { ControlValueAccessor, FormControl, FormGroupDirective, NgControl, NgForm, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { MatBottomSheet, MatBottomSheetModule } from '@angular/material/bottom-sheet';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatChipsModule, MatChipEvent } from '@angular/material/chips';\r\nimport { MatFormFieldModule, SubscriptSizing } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\nimport { Observable } from 'rxjs';\r\nimport { PaginatedFilter } from '../../models/paginated-filter';\r\nimport { PaginatedItems } from '../../models/paginated-items';\r\nimport { PaginatedSelectConfig } from '../../models/select-config';\r\nimport { NgxTexts } from '../../i18n';\r\nimport {\r\n NgxPaginatedSelectBottomSheetComponent,\r\n NgxPaginatedSelectBottomSheetData,\r\n} from './bottom-sheet/ngx-paginated-select-bottom-sheet.component';\r\n\r\n@Component({\r\n selector: 'ngx-paginated-select',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n MatBottomSheetModule,\r\n MatButtonModule,\r\n MatChipsModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatTooltipModule,\r\n MatProgressSpinnerModule,\r\n ],\r\n templateUrl: './ngx-paginated-select.component.html',\r\n styleUrl: './ngx-paginated-select.component.scss',\r\n})\r\nexport class NgxPaginatedSelect<T, U extends PaginatedFilter<T>> implements ControlValueAccessor {\r\n // ─── Dependencies ──────────────────────────────────────────────────────────\r\n private readonly _bottomSheet = inject(MatBottomSheet);\r\n /** Se auto-registra como CVA (self/optional para leer validación y no fallar sin form). */\r\n private readonly _ngControl = inject(NgControl, { self: true, optional: true });\r\n /** Formulario contenedor, para saber si ya se intento enviar (reactive o template-driven). */\r\n private readonly _parentFormGroup = inject(FormGroupDirective, { optional: true });\r\n private readonly _parentForm = inject(NgForm, { optional: true });\r\n private readonly _changeDetectorRef = inject(ChangeDetectorRef);\r\n readonly texts = inject(NgxTexts).texts;\r\n\r\n // ─── Inputs ────────────────────────────────────────────────────────────────\r\n /** Label that floats on the form field */\r\n readonly label = input.required<string>();\r\n /** Title shown in the bottom sheet header */\r\n readonly title = input<string>('');\r\n /** Endpoint to fetch paginated data */\r\n readonly endpoint = input.required<(filters: U) => Observable<PaginatedItems<T>>>();\r\n /** Config for display and value binding */\r\n readonly config = input.required<PaginatedSelectConfig<T>>();\r\n /** Writable signal with the current filter state */\r\n readonly filters = input<WritableSignal<U>>(\r\n signal<U>({\r\n pageNumber: 1,\r\n pageSize: 25,\r\n query: undefined,\r\n sortBy: undefined,\r\n } as U)\r\n );\r\n /** Pre-selected items — accepts full objects OR partials with only the valueKey set */\r\n readonly selectedItems = input<Partial<T>[]>([]);\r\n /** Allow selecting multiple items */\r\n readonly multiple = input(false, { transform: booleanAttribute });\r\n /** Whether the component is disabled */\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n /** Show a clear button when items are selected */\r\n readonly clearable = input(false, { transform: booleanAttribute });\r\n /**\r\n * Controls how selected items are shown in the trigger:\r\n * - 'chips': a chip per selected item (default when multiple=true)\r\n * - 'text': a single comma-joined text line\r\n */\r\n readonly displayMode = input<'chips' | 'text'>('chips');\r\n /** Whether to show the search input inside the bottom sheet */\r\n readonly showSearch = input(true, { transform: booleanAttribute });\r\n /** Placeholder for the search input inside the bottom sheet (defaults to the library texts) */\r\n readonly searchPlaceholder = input<string>();\r\n /** Message when no results are found (defaults to the library texts) */\r\n readonly noResultsMessage = input<string>();\r\n /** Label for the confirm button (multiple mode, defaults to intl) */\r\n readonly confirmLabel = input<string>();\r\n /** Label for the reset button (multiple mode, defaults to intl) */\r\n readonly resetLabel = input<string>();\r\n /** Controls how the subscript wrapper (hint/error) reserves space */\r\n readonly subscriptSizing = input<SubscriptSizing>('fixed');\r\n /** Error message rendered inside mat-error */\r\n readonly error = input<string>('');\r\n /** Hint message rendered inside mat-hint */\r\n readonly hint = input<string>('');\r\n /** Custom template for each option row inside the bottom sheet */\r\n readonly optionTemplate = input<TemplateRef<{ $implicit: T }> | null>(null);\r\n /**\r\n * Optional template projected into the bottom sheet header (e.g. toggle filters).\r\n * Pass an `ng-template` reference from the consumer: `[extraFiltersTemplate]=\"myTpl\"`\r\n */\r\n readonly extraFiltersTemplate = input<TemplateRef<void> | null>(null);\r\n\r\n /** Maximum number of chips to display before showing \"+N more\" */\r\n readonly maxChipsDisplayed = input(5);\r\n /** Layout direction for chips in the trigger: 'row' (horizontal wrap) or 'column' (vertical stack) */\r\n readonly chipsDirection = input<'row' | 'column'>('column');\r\n /** Whether to show a \"Select all\" toggle in the bottom sheet (multiple mode) */\r\n readonly showSelectAll = input(false, { transform: booleanAttribute });\r\n /** Label for the select all toggle (defaults to the library texts) */\r\n readonly selectAllLabel = input<string>();\r\n\r\n // ─── Outputs ───────────────────────────────────────────────────────────────\r\n /** Emits the full T object (single) or T[] (multiple) when selection changes */\r\n readonly valueChange = output<Partial<T> | Partial<T>[] | undefined>();\r\n /** Emits the raw array of selected items (may be partial if never confirmed) */\r\n readonly selectionChange = output<Partial<T>[]>();\r\n\r\n // ─── Internal state ────────────────────────────────────────────────────────\r\n protected readonly _selectedItems = signal<Partial<T>[]>([]);\r\n private readonly _cvaDisabled = signal(false);\r\n protected readonly _isOpen = signal(false);\r\n\r\n /**\r\n * Control interno que gobierna el estado visual del mat-form-field.\r\n * MatInput y MatChipGrid solo reevaluan su errorState (en ngDoCheck) si\r\n * tienen un NgControl asociado; sin el, el campo nunca se pintaba en rojo\r\n * aunque el control real del formulario fuese invalido. El valor real sigue\r\n * viviendo en el CVA: este control solo refleja la etiqueta visible.\r\n */\r\n protected readonly innerControl = new FormControl<string>('');\r\n\r\n private onChange: (value: T[keyof T] | T[keyof T][] | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n /** Evita re-emitir onChange cuando el cambio viene del formulario (writeValue). */\r\n private _suppressEmit = false;\r\n /** Huella de la última selección aplicada desde el input `selectedItems`. */\r\n private _lastSyncedSelection: string | null = null;\r\n\r\n // ─── Computed ──────────────────────────────────────────────────────────────\r\n protected readonly isDisabled = computed(() => this.disabled() || this._cvaDisabled());\r\n\r\n protected readonly selectedLabel = computed(() => {\r\n const items = this._selectedItems();\r\n if (items.length === 0) return '';\r\n return items.map(i => this.getLabel(i)).join(', ');\r\n });\r\n\r\n protected readonly hasSelection = computed(() => this._selectedItems().length > 0);\r\n\r\n protected readonly showChips = computed(() => this.multiple() && this.displayMode() === 'chips');\r\n\r\n protected readonly displayedChips = computed(() =>\r\n this._selectedItems().slice(0, this.maxChipsDisplayed())\r\n );\r\n\r\n protected readonly remainingChipsCount = computed(() =>\r\n Math.max(0, this._selectedItems().length - this.maxChipsDisplayed())\r\n );\r\n\r\n /** ErrorStateMatcher que refleja el estado del control del formulario. */\r\n protected readonly errorStateMatcher: ErrorStateMatcher = {\r\n isErrorState: () =>\r\n !!(this._ngControl?.invalid && (this._ngControl?.touched || this._isParentFormSubmitted())),\r\n };\r\n\r\n /** true cuando el formulario contenedor ya ha intentado enviarse. */\r\n private _isParentFormSubmitted(): boolean {\r\n return this._parentFormGroup?.submitted || this._parentForm?.submitted || false;\r\n }\r\n\r\n /**\r\n * Obligatorio si el control del formulario tiene el validador `required`.\r\n * Se propaga al input interno para que el mat-form-field pinte el asterisco,\r\n * igual que hace Material con un `<input matInput>` normal.\r\n */\r\n protected isRequired(): boolean {\r\n return this._ngControl?.control?.hasValidator(Validators.required) ?? false;\r\n }\r\n\r\n // Etiquetas efectivas (override por input o valor por defecto de NgxTexts)\r\n protected readonly effectiveSearchPlaceholder = computed(() => this.searchPlaceholder() ?? this.texts().common.search);\r\n protected readonly effectiveNoResults = computed(() => this.noResultsMessage() ?? this.texts().select.noResults);\r\n protected readonly effectiveConfirmLabel = computed(() => this.confirmLabel() ?? this.texts().paginatedSelect.confirm);\r\n protected readonly effectiveResetLabel = computed(() => this.resetLabel() ?? this.texts().paginatedSelect.reset);\r\n protected readonly effectiveSelectAllLabel = computed(() => this.selectAllLabel() ?? this.texts().paginatedSelect.selectAll);\r\n\r\n constructor() {\r\n if (this._ngControl)\r\n this._ngControl.valueAccessor = this;\r\n\r\n // Sync selectedItems input → estado interno (solo si el contenido cambia de verdad;\r\n // un literal `[...]` recreado en cada CD no debe borrar la selección del usuario).\r\n effect(() => {\r\n const incoming = this.selectedItems();\r\n const key = this.config().valueKey as keyof T;\r\n const fingerprint = JSON.stringify(incoming.map(item => item?.[key]));\r\n\r\n if (fingerprint === this._lastSyncedSelection)\r\n return;\r\n\r\n this._lastSyncedSelection = fingerprint;\r\n this._selectedItems.set(incoming);\r\n });\r\n\r\n // Estado interno → formulario + outputs (se omite cuando el cambio viene de writeValue).\r\n effect(() => {\r\n const items = this._selectedItems();\r\n if (this._suppressEmit) {\r\n this._suppressEmit = false;\r\n return;\r\n }\r\n untracked(() => this.emitChange(items));\r\n });\r\n\r\n /**\r\n * `submitted` del formulario padre es una propiedad normal, no una senal:\r\n * al enviar, nada marca este componente (OnPush) para revision, asi que el\r\n * control interno no reevaluaba su errorStateMatcher y el campo no se\r\n * pintaba en rojo. Al enviarse el formulario se fuerza la revision.\r\n */\r\n const parentSubmit = this._parentFormGroup?.ngSubmit ?? this._parentForm?.ngSubmit;\r\n parentSubmit?.pipe(takeUntilDestroyed()).subscribe(() => {\r\n this.innerControl.markAsTouched();\r\n this._changeDetectorRef.markForCheck();\r\n });\r\n\r\n // El control interno solo refleja la etiqueta visible y el estado deshabilitado.\r\n effect(() => {\r\n const label = this.selectedLabel();\r\n if (this.innerControl.value !== label)\r\n this.innerControl.setValue(label, { emitEvent: false });\r\n });\r\n\r\n effect(() => {\r\n const disabled = this.isDisabled();\r\n if (disabled && this.innerControl.enabled)\r\n this.innerControl.disable({ emitEvent: false });\r\n else if (!disabled && this.innerControl.disabled)\r\n this.innerControl.enable({ emitEvent: false });\r\n });\r\n }\r\n\r\n // ─── ControlValueAccessor ───────────────────────────────────────────────────\r\n writeValue(value: T[keyof T] | T[keyof T][] | null): void {\r\n const key = this.config().valueKey as keyof T;\r\n const keys = this.keysFromValue(value);\r\n const currentKeys = this._selectedItems().map(i => i[key]);\r\n\r\n // Mismo conjunto de claves → no tocamos el estado (conserva objetos enriquecidos).\r\n if (this.sameKeySet(keys, currentKeys))\r\n return;\r\n\r\n this._suppressEmit = true;\r\n this.applyValueFromKeys(keys);\r\n }\r\n\r\n registerOnChange(fn: (value: T[keyof T] | T[keyof T][] | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this._cvaDisabled.set(isDisabled);\r\n }\r\n\r\n // ─── Helpers de valor ───────────────────────────────────────────────────────\r\n private keysFromValue(value: T[keyof T] | T[keyof T][] | null): T[keyof T][] {\r\n if (value == null) return [];\r\n return Array.isArray(value) ? value : [value];\r\n }\r\n\r\n private applyValueFromKeys(keys: T[keyof T][]): void {\r\n const key = this.config().valueKey as keyof T;\r\n // Se conservan los objetos completos ya conocidos para no perder las etiquetas.\r\n const known = new Map(this._selectedItems().map(i => [i[key], i] as const));\r\n this._selectedItems.set(keys.map(k => known.get(k) ?? ({ [key]: k } as Partial<T>)));\r\n }\r\n\r\n private sameKeySet(a: T[keyof T][], b: (T[keyof T] | undefined)[]): boolean {\r\n if (a.length !== b.length) return false;\r\n const set = new Set(b);\r\n return a.every(k => set.has(k));\r\n }\r\n\r\n private emitChange(items: Partial<T>[]): void {\r\n const key = this.config().valueKey as keyof T;\r\n // Se descartan items sin valueKey (meterían undefined → null en el payload).\r\n const validItems = items.filter(i => i != null && i[key] != null);\r\n\r\n if (this.multiple()) {\r\n // null en vez de [] para que Validators.required marque vacío correctamente\r\n this.onChange(validItems.length > 0 ? validItems.map(i => i[key] as T[keyof T]) : null);\r\n this.valueChange.emit(validItems);\r\n } else {\r\n this.onChange((validItems[0]?.[key] as T[keyof T]) ?? null);\r\n this.valueChange.emit(validItems[0]);\r\n }\r\n this.selectionChange.emit(validItems);\r\n }\r\n\r\n /**\r\n * Safe label resolver: tries `displayedLabel(item)`, falls back to\r\n * `String(item[valueKey])` so partial objects never throw.\r\n */\r\n protected getLabel(item: Partial<T>): string {\r\n const cfg = this.config();\r\n const keyVal = String(item[cfg.valueKey as keyof T] ?? '');\r\n if (!cfg.displayedLabel) return keyVal;\r\n try {\r\n return cfg.displayedLabel(item as T) ?? keyVal;\r\n } catch {\r\n return keyVal;\r\n }\r\n }\r\n\r\n // ─── Bottom sheet ──────────────────────────────────────────────────────────\r\n openBottomSheet(event: Event): void {\r\n event.stopPropagation();\r\n\r\n if (this.isDisabled()) return;\r\n\r\n this.onTouched();\r\n this._ngControl?.control?.markAsTouched();\r\n this._isOpen.set(true);\r\n\r\n const filtersSignal = this.filters();\r\n filtersSignal.update(f => ({ ...f, pageNumber: 1 }));\r\n\r\n const data: NgxPaginatedSelectBottomSheetData<T, U> = {\r\n title: this.title() || this.label(),\r\n config: this.config(),\r\n endpoint: this.endpoint(),\r\n filters: filtersSignal,\r\n selectedItems: [...this._selectedItems()],\r\n multiple: this.multiple(),\r\n showSearch: this.showSearch(),\r\n searchPlaceholder: this.effectiveSearchPlaceholder(),\r\n noResultsMessage: this.effectiveNoResults(),\r\n confirmLabel: this.effectiveConfirmLabel(),\r\n resetLabel: this.effectiveResetLabel(),\r\n optionTemplate: this.optionTemplate(),\r\n extraFiltersTemplate: this.extraFiltersTemplate(),\r\n showSelectAll: this.showSelectAll(),\r\n selectAllLabel: this.effectiveSelectAllLabel(),\r\n };\r\n\r\n this._bottomSheet\r\n .open<NgxPaginatedSelectBottomSheetComponent<T, U>, typeof data, Partial<T>[] | undefined>(\r\n NgxPaginatedSelectBottomSheetComponent,\r\n {\r\n data,\r\n panelClass: 'ngx-paginated-select-panel',\r\n backdropClass: 'ngx-paginated-select-backdrop',\r\n autoFocus: data.showSearch ? '.ps-bs__search-input' : 'first-tabbable',\r\n }\r\n )\r\n .afterDismissed()\r\n .subscribe(result => {\r\n this._isOpen.set(false);\r\n if (result !== undefined) {\r\n this._selectedItems.set(result);\r\n }\r\n this.onTouched();\r\n this._ngControl?.control?.markAsTouched();\r\n });\r\n }\r\n\r\n /** Abrir el bottom sheet desde el teclado (Enter / Espacio / flecha abajo). */\r\n onTriggerKeydown(event: KeyboardEvent): void {\r\n if (this.isDisabled()) return;\r\n if (event.key === 'Enter' || event.key === ' ' || event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n this.openBottomSheet(event);\r\n }\r\n }\r\n\r\n // ─── Chip actions ──────────────────────────────────────────────────────────\r\n // La propagación del click de la \"x\" se detiene en la plantilla para que no\r\n // burbujee al form-field y abra el bottom sheet.\r\n removeChip(item: Partial<T>, _event: MatChipEvent): void {\r\n const key = this.config().valueKey as keyof T;\r\n this._selectedItems.update(items => items.filter(i => i[key] !== item[key]));\r\n this.onTouched();\r\n this._ngControl?.control?.markAsTouched();\r\n }\r\n\r\n clearSelection(event: Event): void {\r\n event.stopPropagation();\r\n this._selectedItems.set([]);\r\n this.onTouched();\r\n this._ngControl?.control?.markAsTouched();\r\n }\r\n}\r\n","<!-- ── Chips mode (multiple + displayMode = 'chips') ─────────────────────── -->\r\n@if (showChips()) {\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n [subscriptSizing]=\"subscriptSizing()\"\r\n class=\"ps-trigger\"\r\n [class.ps-trigger--disabled]=\"isDisabled()\"\r\n [class.ps-trigger--open]=\"_isOpen()\"\r\n [class.ps-trigger--row]=\"chipsDirection() === 'row'\"\r\n (click)=\"openBottomSheet($event)\"\r\n >\r\n <mat-label>{{ label() }}</mat-label>\r\n\r\n <mat-chip-grid\r\n #chipGrid\r\n class=\"ps-trigger__chip-grid\"\r\n [class.ps-trigger__chip-grid--column]=\"chipsDirection() === 'column'\"\r\n [formControl]=\"innerControl\"\r\n [errorStateMatcher]=\"errorStateMatcher\"\r\n [required]=\"isRequired()\"\r\n >\r\n @for (item of displayedChips(); track item[config().valueKey]) {\r\n <mat-chip-row\r\n class=\"ps-trigger__chip\"\r\n [value]=\"item[config().valueKey]\"\r\n [disabled]=\"isDisabled()\"\r\n (removed)=\"removeChip(item, $event)\"\r\n >\r\n {{ getLabel(item) }}\r\n <button matChipRemove [disabled]=\"isDisabled()\" (click)=\"$event.stopPropagation()\">\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip-row>\r\n }\r\n </mat-chip-grid>\r\n\r\n @if (remainingChipsCount() > 0) {\r\n <span class=\"ps-trigger__remaining\">+{{ remainingChipsCount() }}</span>\r\n }\r\n\r\n <!-- Hidden input required for mat-chip-grid; también da foco de teclado al trigger -->\r\n <input\r\n matInput\r\n [matChipInputFor]=\"chipGrid\"\r\n class=\"ps-trigger__kbd-input\"\r\n [required]=\"isRequired()\"\r\n readonly\r\n role=\"combobox\"\r\n [attr.aria-haspopup]=\"'dialog'\"\r\n [attr.aria-expanded]=\"_isOpen()\"\r\n [attr.aria-label]=\"label()\"\r\n (keydown)=\"onTriggerKeydown($event)\"\r\n />\r\n\r\n <div matSuffix class=\"ps-trigger__suffix\">\r\n @if (clearable() && hasSelection() && !isDisabled()) {\r\n <button matIconButton matSuffix [attr.aria-label]=\"texts().common.clearSearch\" (click)=\"clearSelection($event)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <mat-icon [class.ps-trigger__arrow--open]=\"_isOpen()\">arrow_drop_down</mat-icon>\r\n </div>\r\n\r\n @if (error()) {\r\n <mat-error>{{ error() }}</mat-error>\r\n }\r\n @if (hint()) {\r\n <mat-hint>{{ hint() }}</mat-hint>\r\n }\r\n </mat-form-field>\r\n}\r\n\r\n<!-- ── Text mode (single or multiple + displayMode = 'text') ─────────────── -->\r\n@if (!showChips()) {\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n [subscriptSizing]=\"subscriptSizing()\"\r\n class=\"ps-trigger\"\r\n [class.ps-trigger--disabled]=\"isDisabled()\"\r\n [class.ps-trigger--open]=\"_isOpen()\"\r\n (click)=\"openBottomSheet($event)\"\r\n >\r\n <mat-label>{{ label() }}</mat-label>\r\n\r\n <input\r\n matInput\r\n class=\"ps-trigger__input\"\r\n [required]=\"isRequired()\"\r\n readonly\r\n role=\"combobox\"\r\n [attr.aria-haspopup]=\"'dialog'\"\r\n [attr.aria-expanded]=\"_isOpen()\"\r\n [formControl]=\"innerControl\"\r\n [errorStateMatcher]=\"errorStateMatcher\"\r\n (keydown)=\"onTriggerKeydown($event)\"\r\n />\r\n\r\n <div matSuffix class=\"ps-trigger__suffix\">\r\n @if (clearable() && hasSelection() && !isDisabled()) {\r\n <button matIconButton matSuffix [attr.aria-label]=\"texts().common.clearSearch\" (click)=\"clearSelection($event)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <mat-icon [class.ps-trigger__arrow--open]=\"_isOpen()\">arrow_drop_down</mat-icon>\r\n </div>\r\n\r\n @if (error()) {\r\n <mat-error>{{ error() }}</mat-error>\r\n }\r\n @if (hint()) {\r\n <mat-hint>{{ hint() }}</mat-hint>\r\n }\r\n </mat-form-field>\r\n}\r\n","import { booleanAttribute, ChangeDetectionStrategy, Component, computed, inject, input, numberAttribute } from '@angular/core';\r\nimport { SkeletonAnimation, SkeletonVariant } from '../../models';\r\nimport { NgxTexts } from '../../i18n';\r\n\r\nconst UNITLESS_NUMBER = /^-?\\d+(\\.\\d+)?$/;\r\n\r\n/**\r\n * Convierte un tamaño a CSS: un número, o un texto que solo es un número (`height=\"56\"`\r\n * en un atributo estático), se interpreta como píxeles.\r\n */\r\nfunction toCssSize(value: string | number): string {\r\n if (typeof value === 'number') return `${value}px`;\r\n const trimmed = value.trim();\r\n return UNITLESS_NUMBER.test(trimmed) ? `${trimmed}px` : trimmed;\r\n}\r\n\r\nfunction toOptionalCssSize(value: string | number | null | undefined): string | null {\r\n return value === null || value === undefined || value === '' ? null : toCssSize(value);\r\n}\r\n\r\n@Component({\r\n selector: 'ngx-skeleton',\r\n templateUrl: './ngx-skeleton.component.html',\r\n styleUrl: './ngx-skeleton.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n '[attr.role]': 'decorative() ? null : \"status\"',\r\n '[attr.aria-label]': 'decorative() ? null : resolvedAriaLabel()',\r\n '[attr.aria-busy]': 'decorative() ? null : \"true\"',\r\n '[attr.aria-hidden]': 'decorative() ? \"true\" : null',\r\n '[style.--ngx-skeleton-duration]': 'animationDuration() ?? null',\r\n },\r\n})\r\nexport class NgxSkeleton {\r\n private readonly _texts = inject(NgxTexts).texts;\r\n\r\n /** Forma: text (barras de texto), circle, rect o rounded (rectángulo redondeado). */\r\n readonly variant = input<SkeletonVariant>('rect');\r\n\r\n /** Ancho. Cualquier valor CSS; un número se interpreta como px. Se ignora en `circle`. */\r\n readonly width = input<string, string | number>('100%', { transform: toCssSize });\r\n\r\n /** Alto. Cualquier valor CSS; un número se interpreta como px. En `circle` también es el diámetro. */\r\n readonly height = input<string, string | number>('1rem', { transform: toCssSize });\r\n\r\n /** Número de líneas. Solo aplica con `variant=\"text\"`. */\r\n readonly lines = input(1, { transform: numberAttribute });\r\n\r\n /** Separación vertical entre líneas de texto. */\r\n readonly lineSpacing = input<string, string | number>('0.5rem', { transform: toCssSize });\r\n\r\n /** Ancho de la última línea, para que el párrafo parezca real. Solo con varias líneas. */\r\n readonly lastLineWidth = input<string, string | number>('70%', { transform: toCssSize });\r\n\r\n /** Animación: shimmer (brillo que se desliza), pulse (opacidad) o none. */\r\n readonly animation = input<SkeletonAnimation>('shimmer');\r\n\r\n /**\r\n * Duración de un ciclo de animación (cualquier tiempo CSS). Por defecto 1.5s, o el valor\r\n * de la variable CSS `--ngx-skeleton-duration` si el consumidor la define.\r\n */\r\n readonly animationDuration = input<string>();\r\n\r\n /** Sustituye el border-radius que corresponde a la variante. */\r\n readonly borderRadius = input<string | null, string | number | null | undefined>(null, { transform: toOptionalCssSize });\r\n\r\n /** Etiqueta accesible. Por defecto, el texto `skeleton.loading` de la librería. */\r\n readonly ariaLabel = input<string>();\r\n\r\n /**\r\n * Oculta el skeleton a lectores de pantalla (sin role ni etiqueta). Úsalo cuando varios\r\n * skeletons forman una misma pieza: márcalos todos como decorativos y anuncia la carga\r\n * una sola vez en el contenedor (p. ej. con `aria-busy` o un skeleton sin `decorative`).\r\n */\r\n readonly decorative = input(false, { transform: booleanAttribute });\r\n\r\n protected readonly resolvedAriaLabel = computed(() => {\r\n return this.ariaLabel() ?? this._texts().skeleton.loading;\r\n });\r\n\r\n /** Una entrada por línea a pintar (siempre al menos una). */\r\n protected readonly lineIndices = computed(() => {\r\n const count = this.variant() === 'text' ? Math.max(1, Math.floor(this.lines())) : 1;\r\n return Array.from({ length: count }, (_, i) => i);\r\n });\r\n\r\n protected readonly isMultiLine = computed(() => this.lineIndices().length > 1);\r\n\r\n /** border-radius de la variante, salvo que se indique `borderRadius`. */\r\n protected readonly computedBorderRadius = computed(() => {\r\n const override = this.borderRadius();\r\n if (override !== null) return override;\r\n\r\n switch (this.variant()) {\r\n case 'text': return '4px';\r\n case 'circle': return '50%';\r\n case 'rounded': return '12px';\r\n case 'rect':\r\n default: return '0';\r\n }\r\n });\r\n\r\n /** En `circle` el ancho es el alto, para que sea un círculo perfecto. */\r\n protected readonly computedWidth = computed(() => this.variant() === 'circle' ? this.height() : this.width());\r\n}\r\n","<div class=\"ngx-skeleton-lines\" [style.gap]=\"isMultiLine() ? lineSpacing() : null\">\n @for (i of lineIndices(); track i; let last = $last) {\n <div\n class=\"ngx-skeleton-bone\"\n [class.ngx-skeleton-shimmer]=\"animation() === 'shimmer'\"\n [class.ngx-skeleton-pulse]=\"animation() === 'pulse'\"\n [style.width]=\"isMultiLine() && last ? lastLineWidth() : computedWidth()\"\n [style.height]=\"height()\"\n [style.border-radius]=\"computedBorderRadius()\"\n ></div>\n }\n</div>\n","import {\r\n booleanAttribute,\r\n Component,\r\n computed,\r\n ElementRef,\r\n forwardRef,\r\n inject,\r\n input,\r\n output,\r\n PLATFORM_ID,\r\n signal,\r\n viewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { NgxTexts } from '../../i18n';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport {\r\n NgxFileError,\r\n NgxFileInputVariant,\r\n NgxFileItem,\r\n} from '../../models/file-input-types';\r\n\r\nlet _uid = 0;\r\n\r\n@Component({\r\n selector: 'ngx-file-input',\r\n imports: [MatButtonModule, MatIconModule, MatTooltipModule],\r\n templateUrl: './ngx-file-input.component.html',\r\n styleUrl: './ngx-file-input.component.scss',\r\n encapsulation: ViewEncapsulation.None,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => NgxFileInput),\r\n multi: true,\r\n },\r\n ],\r\n host: {\r\n 'class': 'ngx-file-input',\r\n '[class.ngx-fi--disabled]': 'isDisabled()',\r\n '[class.ngx-fi--default]': \"variant() === 'default'\",\r\n '[class.ngx-fi--compact]': \"variant() === 'compact'\",\r\n '[class.ngx-fi--button]': \"variant() === 'button'\",\r\n },\r\n})\r\nexport class NgxFileInput implements ControlValueAccessor {\r\n private readonly _platform = inject(PLATFORM_ID);\r\n private readonly _inputId = `ngx-fi-${++_uid}`;\r\n private readonly _nativeInput = viewChild<ElementRef<HTMLInputElement>>('nativeInput');\r\n\r\n // ── Inputs ──────────────────────────────────────────────────────────────────\r\n\r\n /** Accepted MIME types or extensions (e.g. `'image/*,.pdf'`). */\r\n readonly accept = input<string>('*');\r\n\r\n /** Allow selecting multiple files. */\r\n readonly multiple = input(false, { transform: booleanAttribute });\r\n\r\n /** Maximum file size in bytes per file. `null` means no limit. */\r\n readonly maxSize = input<number | null>(null);\r\n\r\n /** Maximum number of files when `multiple` is true. `null` means no limit. */\r\n readonly maxFiles = input<number | null>(null);\r\n\r\n /** Disables the component. */\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n\r\n /** Label text shown inside the drop zone. Por defecto, el texto `fileInput.dropLabel` de la librería. */\r\n readonly label = input<string>();\r\n\r\n protected readonly texts = inject(NgxTexts).texts;\r\n protected readonly resolvedLabel = computed(() => this.label() ?? this.texts().fileInput.dropLabel);\r\n\r\n /** Secondary hint text (formats, sizes…). */\r\n readonly hint = input<string | null>(null);\r\n\r\n /** Show the file preview list below the drop zone. */\r\n readonly showPreview = input(true, { transform: booleanAttribute });\r\n\r\n /** Visual variant: `'default'` (large zone), `'compact'` (horizontal), or `'button'`. */\r\n readonly variant = input<NgxFileInputVariant>('default');\r\n\r\n // ── Outputs ─────────────────────────────────────────────────────────────────\r\n\r\n /** Emits when valid files are added. */\r\n readonly filesSelected = output<NgxFileItem[]>();\r\n\r\n /** Emits when a file is removed from the list. */\r\n readonly fileRemoved = output<NgxFileItem>();\r\n\r\n /** Emits for each file that fails validation. */\r\n readonly validationError = output<NgxFileError>();\r\n\r\n // ── Internal state ──────────────────────────────────────────────────────────\r\n\r\n /** All file items (valid + invalid). */\r\n readonly items = signal<NgxFileItem[]>([]);\r\n\r\n /** Whether the user is dragging files over the drop zone. */\r\n readonly isDragOver = signal(false);\r\n\r\n /** Brief flash after a successful drop. */\r\n readonly showDropConfirm = signal(false);\r\n\r\n /** Announcement text for screen readers. */\r\n readonly liveAnnouncement = signal('');\r\n\r\n /** Unique id for the hidden file input. */\r\n readonly inputId = this._inputId;\r\n\r\n /** Disabled state coming from `setDisabledState()` (reactive forms). */\r\n private readonly _cvaDisabled = signal(false);\r\n\r\n /**\r\n * Effective disabled state: the `disabled` input OR the state pushed by the\r\n * parent FormControl through `setDisabledState()`.\r\n */\r\n readonly isDisabled = computed(() => this.disabled() || this._cvaDisabled());\r\n\r\n /** Derived: valid files only (used as FormControl value). */\r\n protected readonly validFiles = computed(() =>\r\n this.items().filter(i => i.status === 'valid').map(i => i.file),\r\n );\r\n\r\n // ── ControlValueAccessor ────────────────────────────────────────────────────\r\n\r\n private _onChange: (value: File[]) => void = () => {};\r\n private _onTouched: () => void = () => {};\r\n\r\n writeValue(files: File[] | null): void {\r\n if (!files || files.length === 0) {\r\n this.items.set([]);\r\n return;\r\n }\r\n this.items.set(files.map(f => this._toFileItem(f)));\r\n this._generatePreviews(this.items());\r\n }\r\n\r\n registerOnChange(fn: (value: File[]) => void): void {\r\n this._onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this._onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this._cvaDisabled.set(isDisabled);\r\n }\r\n\r\n // ── Drag & Drop ─────────────────────────────────────────────────────────────\r\n\r\n onDragOver(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n if (!this.isDisabled()) this.isDragOver.set(true);\r\n }\r\n\r\n onDragLeave(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragOver.set(false);\r\n }\r\n\r\n onDrop(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragOver.set(false);\r\n if (this.isDisabled()) return;\r\n\r\n const files = event.dataTransfer?.files;\r\n if (files && files.length > 0) {\r\n this._processFiles(Array.from(files));\r\n this._flashDropConfirm();\r\n }\r\n }\r\n\r\n // ── File input ──────────────────────────────────────────────────────────────\r\n\r\n onFileInputChange(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n if (input.files && input.files.length > 0) {\r\n this._processFiles(Array.from(input.files));\r\n }\r\n input.value = '';\r\n }\r\n\r\n openFilePicker(): void {\r\n if (this.isDisabled()) return;\r\n this._onTouched();\r\n this._nativeInput()?.nativeElement.click();\r\n }\r\n\r\n // ── Remove ──────────────────────────────────────────────────────────────────\r\n\r\n removeFile(item: NgxFileItem): void {\r\n this.items.update(list => list.filter(i => i.id !== item.id));\r\n this.fileRemoved.emit(item);\r\n this._emitChange();\r\n this.liveAnnouncement.set(this.texts().fileInput.removed(item.name));\r\n }\r\n\r\n // ── Helpers ─────────────────────────────────────────────────────────────────\r\n\r\n /** Format bytes to human-readable string. */\r\n formatSize(bytes: number): string {\r\n if (bytes < 1024) return `${bytes} B`;\r\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\r\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\r\n }\r\n\r\n /** Get a Material icon name based on MIME type. */\r\n getFileIcon(type: string): string {\r\n if (type.startsWith('image/')) return 'image';\r\n if (type === 'application/pdf') return 'picture_as_pdf';\r\n if (type.startsWith('video/')) return 'videocam';\r\n if (type.startsWith('audio/')) return 'audiotrack';\r\n if (type.includes('spreadsheet') || type.includes('excel')) return 'table_chart';\r\n if (type.includes('document') || type.includes('word')) return 'description';\r\n if (type.includes('zip') || type.includes('compressed')) return 'folder_zip';\r\n return 'insert_drive_file';\r\n }\r\n\r\n /** Get an accent color class based on MIME type. */\r\n getFileColorClass(type: string): string {\r\n if (type.startsWith('image/')) return 'ngx-fi-icon--image';\r\n if (type === 'application/pdf') return 'ngx-fi-icon--pdf';\r\n if (type.startsWith('video/')) return 'ngx-fi-icon--video';\r\n if (type.startsWith('audio/')) return 'ngx-fi-icon--audio';\r\n return 'ngx-fi-icon--generic';\r\n }\r\n\r\n // ── Private ─────────────────────────────────────────────────────────────────\r\n\r\n private _processFiles(files: File[]): void {\r\n this._onTouched();\r\n\r\n let incoming = files;\r\n const currentCount = this.items().length;\r\n const max = this.maxFiles();\r\n\r\n // Max files check\r\n if (this.multiple() && max !== null && currentCount + incoming.length > max) {\r\n const allowed = Math.max(0, max - currentCount);\r\n const rejected = incoming.slice(allowed);\r\n incoming = incoming.slice(0, allowed);\r\n\r\n for (const f of rejected) {\r\n const err: NgxFileError = {\r\n file: f,\r\n code: 'MAX_FILES_EXCEEDED',\r\n message: this.texts().fileInput.maxFiles(max),\r\n };\r\n this.validationError.emit(err);\r\n }\r\n }\r\n\r\n // Single mode replaces current\r\n if (!this.multiple()) {\r\n incoming = incoming.slice(0, 1);\r\n }\r\n\r\n const newItems = incoming.map(f => this._validateAndCreate(f));\r\n\r\n if (this.multiple()) {\r\n this.items.update(list => [...list, ...newItems]);\r\n } else {\r\n this.items.set(newItems);\r\n }\r\n\r\n this._generatePreviews(newItems);\r\n this._emitChange();\r\n\r\n const validCount = newItems.filter(i => i.status === 'valid').length;\r\n if (validCount > 0) {\r\n this.filesSelected.emit(newItems.filter(i => i.status === 'valid'));\r\n this.liveAnnouncement.set(this.texts().fileInput.added(validCount));\r\n }\r\n }\r\n\r\n private _validateAndCreate(file: File): NgxFileItem {\r\n const item = this._toFileItem(file);\r\n\r\n // Type validation\r\n if (this.accept() !== '*' && !this._isTypeAllowed(file)) {\r\n item.status = 'error';\r\n item.error = this.texts().fileInput.typeNotAllowed(file.type || file.name.split('.').pop() || '');\r\n this.validationError.emit({\r\n file,\r\n code: 'TYPE_NOT_ALLOWED',\r\n message: item.error,\r\n });\r\n return item;\r\n }\r\n\r\n // Size validation\r\n const maxSz = this.maxSize();\r\n if (maxSz !== null && file.size > maxSz) {\r\n item.status = 'error';\r\n item.error = this.texts().fileInput.tooLarge(this.formatSize(maxSz));\r\n this.validationError.emit({\r\n file,\r\n code: 'SIZE_EXCEEDED',\r\n message: item.error,\r\n });\r\n return item;\r\n }\r\n\r\n return item;\r\n }\r\n\r\n private _toFileItem(file: File): NgxFileItem {\r\n return {\r\n file,\r\n id: this._generateId(),\r\n name: file.name,\r\n size: file.size,\r\n type: file.type,\r\n status: 'valid',\r\n };\r\n }\r\n\r\n private _isTypeAllowed(file: File): boolean {\r\n const accept = this.accept();\r\n const parts = accept.split(',').map(p => p.trim().toLowerCase());\r\n const fileType = file.type.toLowerCase();\r\n const fileName = file.name.toLowerCase();\r\n\r\n return parts.some(pattern => {\r\n // Extension pattern like .pdf\r\n if (pattern.startsWith('.')) {\r\n return fileName.endsWith(pattern);\r\n }\r\n // Wildcard MIME like image/*\r\n if (pattern.endsWith('/*')) {\r\n const prefix = pattern.slice(0, -2);\r\n return fileType.startsWith(prefix + '/');\r\n }\r\n // Exact MIME\r\n return fileType === pattern;\r\n });\r\n }\r\n\r\n private _generatePreviews(items: NgxFileItem[]): void {\r\n if (!isPlatformBrowser(this._platform)) return;\r\n\r\n for (const item of items) {\r\n if (item.file.type.startsWith('image/') && item.status === 'valid') {\r\n const reader = new FileReader();\r\n reader.onload = () => {\r\n this.items.update(list =>\r\n list.map(i => i.id === item.id ? { ...i, preview: reader.result as string } : i),\r\n );\r\n };\r\n reader.readAsDataURL(item.file);\r\n }\r\n }\r\n }\r\n\r\n private _emitChange(): void {\r\n this._onChange(this.validFiles());\r\n }\r\n\r\n private _flashDropConfirm(): void {\r\n this.showDropConfirm.set(true);\r\n setTimeout(() => this.showDropConfirm.set(false), 450);\r\n }\r\n\r\n private _generateId(): string {\r\n if (isPlatformBrowser(this._platform) && typeof crypto !== 'undefined' && crypto.randomUUID) {\r\n return crypto.randomUUID();\r\n }\r\n return `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\r\n }\r\n}\r\n","<!-- Hidden native file input — always in DOM for accessibility -->\r\n<input\r\n #nativeInput\r\n [id]=\"inputId\"\r\n class=\"ngx-fi-native-input\"\r\n type=\"file\"\r\n [accept]=\"accept()\"\r\n [multiple]=\"multiple()\"\r\n [disabled]=\"isDisabled()\"\r\n (change)=\"onFileInputChange($event)\"\r\n tabindex=\"-1\"\r\n aria-hidden=\"true\"\r\n/>\r\n\r\n<!-- ═══════════════════════════════════════════════════════════════════════════\r\n VARIANT: DEFAULT — large drop zone\r\n ═══════════════════════════════════════════════════════════════════════════ -->\r\n@if (variant() === 'default') {\r\n <div\r\n class=\"ngx-fi-zone\"\r\n [class.ngx-fi-zone--dragover]=\"isDragOver()\"\r\n [class.ngx-fi-zone--disabled]=\"isDisabled()\"\r\n role=\"region\"\r\n [attr.aria-label]=\"resolvedLabel()\"\r\n [attr.aria-disabled]=\"isDisabled()\"\r\n tabindex=\"0\"\r\n (click)=\"openFilePicker()\"\r\n (keydown.enter)=\"openFilePicker()\"\r\n (keydown.space)=\"openFilePicker(); $event.preventDefault()\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onDrop($event)\"\r\n >\r\n <mat-icon class=\"ngx-fi-zone__icon\">cloud_upload</mat-icon>\r\n <span class=\"ngx-fi-zone__label\">{{ resolvedLabel() }}</span>\r\n @if (hint()) {\r\n <span class=\"ngx-fi-zone__hint\">{{ hint() }}</span>\r\n }\r\n <span class=\"ngx-fi-zone__btn-text\">{{ texts().fileInput.browse }}</span>\r\n\r\n <!-- Drop confirmation flash -->\r\n @if (showDropConfirm()) {\r\n <div class=\"ngx-fi-zone__confirm\">\r\n <mat-icon>check_circle</mat-icon>\r\n </div>\r\n }\r\n </div>\r\n}\r\n\r\n<!-- ═══════════════════════════════════════════════════════════════════════════\r\n VARIANT: COMPACT — horizontal bar\r\n ═══════════════════════════════════════════════════════════════════════════ -->\r\n@if (variant() === 'compact') {\r\n <div\r\n class=\"ngx-fi-compact\"\r\n [class.ngx-fi-compact--dragover]=\"isDragOver()\"\r\n [class.ngx-fi-compact--disabled]=\"isDisabled()\"\r\n role=\"region\"\r\n [attr.aria-label]=\"resolvedLabel()\"\r\n [attr.aria-disabled]=\"isDisabled()\"\r\n tabindex=\"0\"\r\n (click)=\"openFilePicker()\"\r\n (keydown.enter)=\"openFilePicker()\"\r\n (keydown.space)=\"openFilePicker(); $event.preventDefault()\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onDrop($event)\"\r\n >\r\n <mat-icon class=\"ngx-fi-compact__icon\">cloud_upload</mat-icon>\r\n <div class=\"ngx-fi-compact__text\">\r\n <span class=\"ngx-fi-compact__label\">{{ resolvedLabel() }}</span>\r\n @if (hint()) {\r\n <span class=\"ngx-fi-compact__hint\">{{ hint() }}</span>\r\n }\r\n </div>\r\n\r\n @if (showDropConfirm()) {\r\n <div class=\"ngx-fi-zone__confirm\">\r\n <mat-icon>check_circle</mat-icon>\r\n </div>\r\n }\r\n </div>\r\n}\r\n\r\n<!-- ═══════════════════════════════════════════════════════════════════════════\r\n VARIANT: BUTTON — only a button\r\n ═══════════════════════════════════════════════════════════════════════════ -->\r\n@if (variant() === 'button') {\r\n <div\r\n class=\"ngx-fi-button-wrap\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onDrop($event)\"\r\n [class.ngx-fi-button-wrap--dragover]=\"isDragOver()\"\r\n >\r\n <button\r\n mat-raised-button\r\n color=\"primary\"\r\n [disabled]=\"isDisabled()\"\r\n (click)=\"openFilePicker()\"\r\n type=\"button\"\r\n >\r\n <mat-icon>attach_file</mat-icon>\r\n {{ resolvedLabel() }}\r\n </button>\r\n </div>\r\n}\r\n\r\n<!-- ═══════════════════════════════════════════════════════════════════════════\r\n FILE PREVIEW LIST\r\n ═══════════════════════════════════════════════════════════════════════════ -->\r\n@if (showPreview() && items().length > 0) {\r\n <div class=\"ngx-fi-list\">\r\n @for (item of items(); track item.id) {\r\n <div\r\n class=\"ngx-fi-item\"\r\n [class.ngx-fi-item--error]=\"item.status === 'error'\"\r\n >\r\n <!-- Thumbnail / Icon -->\r\n <div class=\"ngx-fi-item__thumb\" [class]=\"getFileColorClass(item.type)\">\r\n @if (item.preview) {\r\n <img [src]=\"item.preview\" [alt]=\"item.name\" />\r\n } @else {\r\n <mat-icon>{{ getFileIcon(item.type) }}</mat-icon>\r\n }\r\n </div>\r\n\r\n <!-- Info -->\r\n <div class=\"ngx-fi-item__info\">\r\n <span class=\"ngx-fi-item__name\" [matTooltip]=\"item.name\">{{ item.name }}</span>\r\n <span class=\"ngx-fi-item__meta\">\r\n {{ formatSize(item.size) }}\r\n @if (item.error) {\r\n <span class=\"ngx-fi-item__error\">\r\n <mat-icon>warning</mat-icon> {{ item.error }}\r\n </span>\r\n }\r\n </span>\r\n </div>\r\n\r\n <!-- Remove -->\r\n <button\r\n class=\"ngx-fi-item__remove\"\r\n type=\"button\"\r\n mat-icon-button\r\n (click)=\"removeFile(item); $event.stopPropagation()\"\r\n [matTooltip]=\"texts().fileInput.remove(item.name)\"\r\n >\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n}\r\n\r\n<!-- Screen reader announcements -->\r\n<div class=\"ngx-fi-sr-only\" aria-live=\"polite\">{{ liveAnnouncement() }}</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i3","i5","i4","i7","uuidv4","i1","i6","i8","i9","i13"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA;;;;;AAKG;MAEU,aAAa,CAAA;AACxB;;;AAGG;AACM,IAAA,OAAO,GAAG,IAAI,OAAO,EAAQ;;;;;;IAQtC,iBAAiB,GAAY,OAAO;;IAGpC,WAAW,GAAW,QAAQ;;IAG9B,aAAa,GAAW,UAAU;;IAGlC,kBAAkB,GAAY,UAAU;;;IAIxC,iBAAiB,GAAW,WAAW;;IAGvC,kBAAkB,GAAW,kBAAkB;;IAG/C,kBAAkB,GAAY,+BAA+B;;IAG7D,oBAAoB,GAAW,mBAAmB;;IAGlD,sBAAsB,GAAW,cAAc;;IAG/C,yBAAyB,GAAW,eAAe;;IAGnD,2BAA2B,GAAW,iBAAiB;;IAGvD,2BAA2B,GAAW,0BAA0B;;IAGhE,sBAAsB,GAAW,0BAA0B;;IAG3D,iBAAiB,GAAW,qBAAqB;;;IAIjD,gBAAgB,GAAW,kBAAkB;;IAG7C,kBAAkB,GAAW,oBAAoB;;IAGjD,gBAAgB,GAAW,+BAA+B;;IAG1D,uBAAuB,GAAW,+CAA+C;;;IAIjF,aAAa,GAAW,gBAAgB;;IAGxC,kBAAkB,GAAW,kCAAkC;;IAG/D,gBAAgB,GAAW,iCAAiC;;;IAI5D,sBAAsB,GAAW,mBAAmB;;IAGpD,qBAAqB,GAAW,qCAAqC;;;IAIrE,aAAa,GAAY,oCAAoC;;IAG7D,cAAc,GAAW,aAAa;;IAGtC,kBAAkB,GAAW,UAAU;;IAGvC,iBAAiB,GAAW,yDAAyD;;IAGrF,yBAAyB,GAAY,uCAAuC;;;IAI5E,YAAY,GAAW,UAAU;;;IAIjC,eAAe,GAAW,OAAO;;IAGjC,yBAAyB,GAAW,OAAO;;IAG3C,uBAAuB,GAAW,OAAO;;;IAIzC,oBAAoB,GAAY,cAAc;;IAG9C,sBAAsB,GAAW,kBAAkB;;;IAInD,iBAAiB,GAAW,4BAA4B;;IAGxD,iBAAiB,GAAW,6BAA6B;;;IAIzD,iBAAiB,GAAW,UAAU;;IAGtC,kBAAkB,GAAW,WAAW;;IAGxC,gBAAgB,GAAW,QAAQ;;IAGnC,eAAe,GAAW,SAAS;;IAGnC,uBAAuB,GAAW,mBAAmB;;;IAIrD,qBAAqB,GAAW,2CAA2C;;IAG3E,gBAAgB,GAAW,gBAAgB;;IAG3C,kBAAkB,GAAW,WAAW;;IAGxC,aAAa,GAAW,OAAO;;IAG/B,eAAe,GAAW,OAAO;;IAGjC,qBAAqB,GAAW,yBAAyB;;IAGzD,yBAAyB,GAAW,gFAAgF;;IAGpH,SAAS,GAAW,OAAO;;IAG3B,uBAAuB,GAAW,oCAAoC;;;IAItE,0BAA0B,GAAW,iCAAiC;;IAGtE,iBAAiB,GAAW,wBAAwB;;IAGpD,yBAAyB,GAAW,0BAA0B;;IAG9D,wBAAwB,GAAW,0BAA0B;;IAG7D,wBAAwB,GAAW,iNAAiN;;IAGpP,uBAAuB,GAAW,sFAAsF;;IAGxH,UAAU,GAAW,QAAQ;;IAG7B,WAAW,GAAW,SAAS;;IAG/B,oBAAoB,GAAW,eAAe;;IAG9C,mBAAmB,GAAW,cAAc;;IAG5C,kBAAkB,GAAW,gBAAgB;;IAG7C,mBAAmB,GAAW,iBAAiB;;;IAI/C,UAAU,GAAW,OAAO;;IAG5B,cAAc,GAAW,WAAW;;IAGpC,UAAU,GAAW,OAAO;;IAG5B,uBAAuB,GAAW,uBAAuB;;IAGzD,iBAAiB,GAAW,oBAAoB;;IAGhD,qBAAqB,GAAW,wBAAwB;;IAGxD,iBAAiB,GAAW,oBAAoB;;IAGhD,kBAAkB,GAAW,aAAa;;;IAI1C,YAAY,GAAW,GAAG;;IAG1B,WAAW,GAAW,GAAG;;IAGzB,cAAc,GAAW,SAAS;;IAGlC,iBAAiB,GAAW,aAAa;;IAGzC,mBAAmB,GAAW,WAAW;;IAGzC,uBAAuB,GAAW,mBAAmB;;IAGrD,gBAAgB,GAAW,WAAW;;IAGtC,oBAAoB,GAAW,mBAAmB;;IAGlD,YAAY,GAAW,UAAU;;;;;IAOjC,gBAAgB,GAAW,oCAAoC;;;;;IAO/D,aAAa,GAAW,SAAS;;;;;IAOjC,2BAA2B,GAAW,WAAW;;IAGjD,yBAAyB,GAAW,SAAS;;IAG7C,6BAA6B,GAAW,kBAAkB;;IAG1D,+BAA+B,GAAW,eAAe;;IAGzD,6BAA6B,GAAW,uBAAuB;;IAG/D,4BAA4B,GAAW,qCAAqC;;IAG5E,+BAA+B,GAAW,kBAAkB;;IAG5D,yBAAyB,GAAW,iCAAiC;;IAGrE,wBAAwB,GAAW,yCAAyC;;IAG5E,yBAAyB,GAAW,YAAY;;;;AAMhD;;;AAGG;AACH,IAAA,uBAAuB,CAAC,QAAiB,EAAA;QACvC,IAAI,QAAQ,EAAE;YACZ,OAAO,CAAA,gBAAA,EAAmB,QAAQ,CAAA,iBAAA,CAAmB;QACvD;QACA,OAAO,IAAI,CAAC,iBAAiB;IAC/B;AAEA;;;AAGG;AACH,IAAA,8BAA8B,CAAC,UAAkB,EAAA;QAC/C,OAAO,CAAA,gDAAA,EAAmD,UAAU,CAAA,iBAAA,CAAmB;IACzF;AAEA;;;AAGG;AACH,IAAA,4BAA4B,CAAC,UAAkB,EAAA;QAC7C,OAAO,CAAA,QAAA,EAAW,UAAU,CAAA,CAAA,CAAG;IACjC;AAEA;;;AAGG;AACH,IAAA,8BAA8B,CAAC,UAAmB,EAAA;QAChD,OAAO,CAAA,UAAA,EAAa,UAAU,CAAA,CAAA,CAAG;IACnC;AAEA;;;AAGG;AACH,IAAA,qBAAqB,CAAC,KAAc,EAAA;QAClC,OAAO,KAAK,KAAK;cACb,CAAA,EAAG,KAAK,CAAA,sBAAA;AACV,cAAE,CAAA,EAAG,KAAK,CAAA,wBAAA,CAA0B;IACxC;AAEA;;;AAGG;AACH,IAAA,mBAAmB,CAAC,UAAkB,EAAA;QACpC,OAAO,CAAA,UAAA,EAAa,UAAU,CAAA,GAAA,CAAK;IACrC;AAEA;;;;AAIG;AACH,IAAA,4BAA4B,CAAC,KAAa,EAAA;AACxC,QAAA,OAAO,KAAK,KAAK,CAAC,GAAG,aAAa,GAAG,CAAA,EAAG,KAAK,aAAa;IAC5D;AAEA;;;AAGG;IACH,oCAAoC,CAAC,QAAgB,EAAE,KAAa,EAAA;AAClE,QAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,IAAA,EAAO,KAAK,gBAAgB;IAChD;AAEA;;AAEG;AACH,IAAA,mCAAmC,CAAC,KAAa,EAAA;AAC/C,QAAA,OAAO,KAAK,KAAK,CAAC,GAAG,aAAa,GAAG,CAAA,EAAG,KAAK,aAAa;IAC5D;wGAtYW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAb,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,cADA,MAAM,EAAA,CAAA;;4FACnB,aAAa,EAAA,UAAA,EAAA,CAAA;kBADzB,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;AC6KlC,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,GAAW,EAAE,IAAY,MAAM,KAAK,KAAK,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC;AAEvF;AACO,MAAM,yBAAyB,GAAoB;AACxD,IAAA,MAAM,EAAE;AACN,QAAA,MAAM,EAAE,WAAW;AACnB,QAAA,WAAW,EAAE,kBAAkB;AAC/B,QAAA,MAAM,EAAE,oCAAoC;AAC5C,QAAA,OAAO,EAAE,aAAa;AACtB,QAAA,MAAM,EAAE,UAAU;AAClB,QAAA,OAAO,EAAE,WAAW;AACpB,QAAA,KAAK,EAAE,QAAQ;AACf,QAAA,IAAI,EAAE,SAAS;AACf,QAAA,YAAY,EAAE,mBAAmB;AAClC,KAAA;AACD,IAAA,KAAK,EAAE;AACL,QAAA,MAAM,EAAE,OAAO;AACf,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,MAAM,EAAE,UAAU;AAClB,QAAA,aAAa,EAAE,UAAU;AACzB,QAAA,kBAAkB,EAAE,UAAU;AAC9B,QAAA,iBAAiB,EAAE,yDAAyD;AAC5E,QAAA,WAAW,EAAE,+BAA+B;AAC5C,QAAA,WAAW,EAAE,+BAA+B;AAC5C,QAAA,gBAAgB,EAAE,+CAA+C;AACjE,QAAA,MAAM,EAAE,gBAAgB;AACxB,QAAA,WAAW,EAAE,kCAAkC;AAC/C,QAAA,SAAS,EAAE,iCAAiC;AAC5C,QAAA,eAAe,EAAE,mBAAmB;AACpC,QAAA,cAAc,EAAE,qCAAqC;AACrD,QAAA,OAAO,EAAE,UAAU;AACnB,QAAA,cAAc,EAAE,OAAO;AACvB,QAAA,YAAY,EAAE,OAAO;AACrB,QAAA,YAAY,EAAE,4BAA4B;AAC1C,QAAA,YAAY,EAAE,6BAA6B;AAC5C,KAAA;AACD,IAAA,aAAa,EAAE;AACb,QAAA,KAAK,EAAE,2CAA2C;AAClD,QAAA,GAAG,EAAE,gBAAgB;AACrB,QAAA,KAAK,EAAE,WAAW;AAClB,QAAA,MAAM,EAAE,OAAO;AACf,QAAA,QAAQ,EAAE,OAAO;AACjB,QAAA,iBAAiB,EAAE,yBAAyB;AAC5C,QAAA,yBAAyB,EAAE,gFAAgF;AAC3G,QAAA,IAAI,EAAE,OAAO;AACb,QAAA,KAAK,EAAE,oCAAoC;AAC5C,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,KAAK,EAAE,mBAAmB;AAC1B,QAAA,GAAG,EAAE,cAAc;AACnB,QAAA,MAAM,EAAE,0BAA0B;AAClC,QAAA,WAAW,EAAE,IAAI,IAAI,CAAA,QAAA,EAAW,IAAI,CAAA,CAAA,CAAG;AACvC,QAAA,aAAa,EAAE,IAAI,IAAI,CAAA,UAAA,EAAa,IAAI,CAAA,CAAA,CAAG;AAC3C,QAAA,WAAW,EAAE,uCAAuC;AACpD,QAAA,aAAa,EAAE,IAAI,IAAI,CAAA,gDAAA,EAAmD,IAAI,CAAA,iBAAA,CAAmB;AACjG,QAAA,WAAW,EAAE,iCAAiC;AAC9C,QAAA,YAAY,EAAE,wBAAwB;AACtC,QAAA,oBAAoB,EAAE,0BAA0B;AAChD,QAAA,SAAS,EAAE,0BAA0B;AACrC,QAAA,SAAS,EAAE,iNAAiN;AAC5N,QAAA,QAAQ,EAAE,sFAAsF;AAChG,QAAA,KAAK,EAAE,QAAQ;AACf,QAAA,MAAM,EAAE,SAAS;AACjB,QAAA,SAAS,EAAE,eAAe;AAC1B,QAAA,QAAQ,EAAE,cAAc;AACxB,QAAA,WAAW,EAAE,gBAAgB;AAC7B,QAAA,YAAY,EAAE,iBAAiB;AAC/B,QAAA,KAAK,EAAE,OAAO;AACd,QAAA,SAAS,EAAE,WAAW;AACtB,QAAA,KAAK,EAAE,OAAO;AACd,QAAA,YAAY,EAAE,uBAAuB;AACrC,QAAA,QAAQ,EAAE,aAAa;AACvB,QAAA,GAAG,EAAE,GAAG;AACR,QAAA,EAAE,EAAE,GAAG;AACP,QAAA,SAAS,EAAE;AACT,YAAA,MAAM,EAAE,SAAS;AACjB,YAAA,SAAS,EAAE,aAAa;AACxB,YAAA,WAAW,EAAE,WAAW;AACxB,YAAA,eAAe,EAAE,mBAAmB;AACpC,YAAA,QAAQ,EAAE,WAAW;AACrB,YAAA,YAAY,EAAE,mBAAmB;AACjC,YAAA,IAAI,EAAE,UAAU;AACjB,SAAA;AACF,KAAA;AACD,IAAA,MAAM,EAAE;AACN,QAAA,SAAS,EAAE,oCAAoC;AAC/C,QAAA,QAAQ,EAAE,SAAS;AACnB,QAAA,YAAY,EAAE,IAAI,IAAI,CAAA,UAAA,EAAa,IAAI,CAAA,GAAA,CAAK;AAC5C,QAAA,YAAY,EAAE,KAAK,IAAI,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,CAAA,EAAG,KAAK,aAAa,CAAC;AAC3E,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,OAAO,EAAE,WAAW;AACpB,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,SAAS,EAAE,kBAAkB;AAC7B,QAAA,WAAW,EAAE,eAAe;AAC5B,QAAA,SAAS,EAAE,uBAAuB;AAClC,QAAA,aAAa,EAAE,qCAAqC;AACpD,QAAA,WAAW,EAAE,kBAAkB;AAC/B,QAAA,UAAU,EAAE,iCAAiC;AAC7C,QAAA,SAAS,EAAE,yCAAyC;AACpD,QAAA,KAAK,EAAE,YAAY;AACnB,QAAA,aAAa,EAAE,CAAC,QAAQ,EAAE,KAAK,KAAK,CAAA,EAAG,QAAQ,CAAA,IAAA,EAAO,KAAK,CAAA,cAAA,CAAgB;AAC3E,QAAA,YAAY,EAAE,KAAK,IAAI,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,CAAA,EAAG,KAAK,aAAa,CAAC;AAC3E,KAAA;AACD,IAAA,MAAM,EAAE;AACN,QAAA,MAAM,EAAE,UAAU;AAClB,QAAA,OAAO,EAAE,WAAW;AACpB,QAAA,MAAM,EAAE,SAAS;AACjB,QAAA,KAAK,EAAE,QAAQ;AAChB,KAAA;AACD,IAAA,SAAS,EAAE;AACT,QAAA,SAAS,EAAE,wBAAwB;AACnC,QAAA,MAAM,EAAE,6BAA6B;AACrC,QAAA,MAAM,EAAE,IAAI,IAAI,CAAA,SAAA,EAAY,IAAI,CAAA,CAAE;AAClC,QAAA,OAAO,EAAE,IAAI,IAAI,CAAA,QAAA,EAAW,IAAI,CAAA,UAAA,CAAY;AAC5C,QAAA,KAAK,EAAE,KAAK,IAAI,MAAM,CAAC,KAAK,EAAE,mBAAmB,EAAE,CAAA,EAAG,KAAK,oBAAoB,CAAC;AAChF,QAAA,QAAQ,EAAE,GAAG,IAAI,CAAA,OAAA,EAAU,GAAG,CAAA,oBAAA,CAAsB;AACpD,QAAA,cAAc,EAAE,IAAI,IAAI,CAAA,mBAAA,EAAsB,IAAI,CAAA,CAAE;AACpD,QAAA,QAAQ,EAAE,OAAO,IAAI,CAAA,yBAAA,EAA4B,OAAO,CAAA,CAAA,CAAG;AAC5D,KAAA;AACD,IAAA,SAAS,EAAE;AACT,QAAA,KAAK,EAAE,qBAAqB;AAC5B,QAAA,WAAW,EAAE,0BAA0B;AACvC,QAAA,QAAQ,EAAE,oCAAoC;AAC9C,QAAA,MAAM,EAAE,UAAU;AAClB,QAAA,MAAM,EAAE,IAAI,IAAI,CAAA,SAAA,EAAY,IAAI,CAAA,CAAE;AAClC,QAAA,YAAY,EAAE,IAAI,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,+BAAA,CAAiC;AAC/D,QAAA,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,2BAAA,EAA8B,OAAO,CAAA,CAAA,CAAG;AACjF,QAAA,aAAa,EAAE,GAAG,IAAI,MAAM,CAAC,GAAG,EAAE,2BAA2B,EAAE,CAAA,iBAAA,EAAoB,GAAG,WAAW,CAAC;AACnG,KAAA;AACD,IAAA,QAAQ,EAAE;AACR,QAAA,OAAO,EAAE,WAAW;AACrB,KAAA;AACD,IAAA,KAAK,EAAE;AACL,QAAA,OAAO,EAAE,cAAc;AACxB,KAAA;AACD,IAAA,aAAa,EAAE;AACb,QAAA,IAAI,EAAE,WAAW;AAClB,KAAA;;AAMH;MACa,iBAAiB,GAAG,IAAI,cAAc,CAAmC,mBAAmB;AAEzG;;;;;;;;;;;;;AAaG;AACG,SAAU,sBAAsB,CACpC,KAA4D,EAAA;AAE5D,IAAA,OAAO,wBAAwB,CAAC;AAC9B,QAAA;AACE,YAAA,OAAO,EAAE,iBAAiB;YAC1B,UAAU,EAAE,MAAuC;gBACjD,MAAM,MAAM,GAAG,OAAO,KAAK,KAAK,UAAU,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,KAAK,EAAE,GAAG,KAAK;AAChF,gBAAA,OAAO,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YACnD,CAAC;AACF,SAAA;AACF,KAAA,CAAC;AACJ;AAEA;MAEa,QAAQ,CAAA;IACF,UAAU,GAAG,MAAM,CAAC,iBAAiB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC1D,IAAA,WAAW,GAAG,MAAM,CAAC,aAAa,CAAC;IACnC,cAAc,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;;AAG3D,IAAA,KAAK,GAA4B,QAAQ,CAAC,MAAK;QACtD,IAAI,CAAC,cAAc,EAAE;QACrB,MAAM,MAAM,GAAG,sBAAsB,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,mBAAmB,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE;AACpG,QAAA,OAAO,SAAS,CAAC,SAAS,CAAC,yBAAyB,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;AAC3F,IAAA,CAAC,iDAAC;wGAVS,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAR,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,QAAQ,cADK,MAAM,EAAA,CAAA;;4FACnB,QAAQ,EAAA,UAAA,EAAA,CAAA;kBADpB,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;AAclC;AAEA;AACA,SAAS,sBAAsB,CAAC,IAAmB,EAAA;IACjD,OAAO,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,aAAa,CAAC,SAAS;AAChE;AAEA;AACA,SAAS,mBAAmB,CAAC,IAAmB,EAAA;IAC9C,OAAO;AACL,QAAA,MAAM,EAAE;YACN,MAAM,EAAE,IAAI,CAAC,iBAAiB;YAC9B,WAAW,EAAE,IAAI,CAAC,kBAAkB;YACpC,MAAM,EAAE,IAAI,CAAC,aAAa;YAC1B,OAAO,EAAE,IAAI,CAAC,cAAc;YAC5B,MAAM,EAAE,IAAI,CAAC,iBAAiB;YAC9B,OAAO,EAAE,IAAI,CAAC,kBAAkB;YAChC,KAAK,EAAE,IAAI,CAAC,gBAAgB;YAC5B,IAAI,EAAE,IAAI,CAAC,eAAe;YAC1B,YAAY,EAAE,IAAI,CAAC,uBAAuB;AAC3C,SAAA;AACD,QAAA,KAAK,EAAE;YACL,MAAM,EAAE,IAAI,CAAC,iBAAiB;YAC9B,IAAI,EAAE,IAAI,CAAC,WAAW;YACtB,MAAM,EAAE,IAAI,CAAC,aAAa;YAC1B,aAAa,EAAE,IAAI,CAAC,kBAAkB;YACtC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,WAAW,EAAE,IAAI,CAAC,kBAAkB;YACpC,WAAW,EAAE,IAAI,CAAC,gBAAgB;YAClC,gBAAgB,EAAE,IAAI,CAAC,uBAAuB;YAC9C,MAAM,EAAE,IAAI,CAAC,aAAa;YAC1B,WAAW,EAAE,IAAI,CAAC,kBAAkB;YACpC,SAAS,EAAE,IAAI,CAAC,gBAAgB;YAChC,eAAe,EAAE,IAAI,CAAC,sBAAsB;YAC5C,cAAc,EAAE,IAAI,CAAC,qBAAqB;YAC1C,OAAO,EAAE,IAAI,CAAC,YAAY;YAC1B,cAAc,EAAE,IAAI,CAAC,yBAAyB;YAC9C,YAAY,EAAE,IAAI,CAAC,uBAAuB;YAC1C,YAAY,EAAE,IAAI,CAAC,iBAAiB;YACpC,YAAY,EAAE,IAAI,CAAC,iBAAiB;AACrC,SAAA;AACD,QAAA,aAAa,EAAE;YACb,KAAK,EAAE,IAAI,CAAC,qBAAqB;YACjC,GAAG,EAAE,IAAI,CAAC,gBAAgB;YAC1B,KAAK,EAAE,IAAI,CAAC,kBAAkB;YAC9B,MAAM,EAAE,IAAI,CAAC,aAAa;YAC1B,QAAQ,EAAE,IAAI,CAAC,eAAe;YAC9B,iBAAiB,EAAE,IAAI,CAAC,qBAAqB;YAC7C,yBAAyB,EAAE,IAAI,CAAC,yBAAyB;YACzD,IAAI,EAAE,IAAI,CAAC,SAAS;YACpB,KAAK,EAAE,IAAI,CAAC,uBAAuB;AACpC,SAAA;AACD,QAAA,eAAe,EAAE;YACf,KAAK,EAAE,IAAI,CAAC,oBAAoB;YAChC,GAAG,EAAE,IAAI,CAAC,sBAAsB;YAChC,MAAM,EAAE,IAAI,CAAC,2BAA2B;YACxC,WAAW,EAAE,IAAI,IAAI,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC;YAC5D,aAAa,EAAE,IAAI,IAAI,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC;YAChE,WAAW,EAAE,IAAI,CAAC,yBAAyB;YAC3C,aAAa,EAAE,IAAI,IAAI,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC;YAChE,WAAW,EAAE,IAAI,CAAC,0BAA0B;YAC5C,YAAY,EAAE,IAAI,CAAC,iBAAiB;YACpC,oBAAoB,EAAE,IAAI,CAAC,yBAAyB;YACpD,SAAS,EAAE,IAAI,CAAC,wBAAwB;YACxC,SAAS,EAAE,IAAI,CAAC,wBAAwB;YACxC,QAAQ,EAAE,IAAI,CAAC,uBAAuB;YACtC,KAAK,EAAE,IAAI,CAAC,UAAU;YACtB,MAAM,EAAE,IAAI,CAAC,WAAW;YACxB,SAAS,EAAE,IAAI,CAAC,oBAAoB;YACpC,QAAQ,EAAE,IAAI,CAAC,mBAAmB;YAClC,WAAW,EAAE,IAAI,CAAC,kBAAkB;YACpC,YAAY,EAAE,IAAI,CAAC,mBAAmB;YACtC,KAAK,EAAE,IAAI,CAAC,UAAU;YACtB,SAAS,EAAE,IAAI,CAAC,cAAc;YAC9B,KAAK,EAAE,IAAI,CAAC,UAAU;YACtB,YAAY,EAAE,IAAI,CAAC,uBAAuB;YAC1C,QAAQ,EAAE,IAAI,CAAC,kBAAkB;YACjC,GAAG,EAAE,IAAI,CAAC,YAAY;YACtB,EAAE,EAAE,IAAI,CAAC,WAAW;AACpB,YAAA,SAAS,EAAE;gBACT,MAAM,EAAE,IAAI,CAAC,cAAc;gBAC3B,SAAS,EAAE,IAAI,CAAC,iBAAiB;gBACjC,WAAW,EAAE,IAAI,CAAC,mBAAmB;gBACrC,eAAe,EAAE,IAAI,CAAC,uBAAuB;gBAC7C,QAAQ,EAAE,IAAI,CAAC,gBAAgB;gBAC/B,YAAY,EAAE,IAAI,CAAC,oBAAoB;gBACvC,IAAI,EAAE,IAAI,CAAC,YAAY;AACxB,aAAA;AACF,SAAA;AACD,QAAA,MAAM,EAAE;YACN,SAAS,EAAE,IAAI,CAAC,gBAAgB;YAChC,QAAQ,EAAE,IAAI,CAAC,aAAa;YAC5B,YAAY,EAAE,IAAI,IAAI,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;YACpD,YAAY,EAAE,KAAK,IAAI,IAAI,CAAC,4BAA4B,CAAC,KAAK,CAAC;AAChE,SAAA;AACD,QAAA,eAAe,EAAE;YACf,OAAO,EAAE,IAAI,CAAC,2BAA2B;YACzC,KAAK,EAAE,IAAI,CAAC,yBAAyB;YACrC,SAAS,EAAE,IAAI,CAAC,6BAA6B;YAC7C,WAAW,EAAE,IAAI,CAAC,+BAA+B;YACjD,SAAS,EAAE,IAAI,CAAC,6BAA6B;YAC7C,aAAa,EAAE,IAAI,CAAC,4BAA4B;YAChD,WAAW,EAAE,IAAI,CAAC,+BAA+B;YACjD,UAAU,EAAE,IAAI,CAAC,yBAAyB;YAC1C,SAAS,EAAE,IAAI,CAAC,wBAAwB;YACxC,KAAK,EAAE,IAAI,CAAC,yBAAyB;AACrC,YAAA,aAAa,EAAE,CAAC,QAAQ,EAAE,KAAK,KAAK,IAAI,CAAC,oCAAoC,CAAC,QAAQ,EAAE,KAAK,CAAC;YAC9F,YAAY,EAAE,KAAK,IAAI,IAAI,CAAC,mCAAmC,CAAC,KAAK,CAAC;AACvE,SAAA;KACF;AACH;AAEA;AAEA,SAAS,aAAa,CAAC,KAAc,EAAA;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;AACjG;AAEA;AACA,SAAS,SAAS,CAAI,IAAO,EAAE,SAAyB,EAAA;AACtD,IAAA,MAAM,MAAM,GAA4B,EAAE,GAAI,IAAgC,EAAE;AAChF,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAoC,CAAC,EAAE;QAC/E,IAAI,KAAK,KAAK,SAAS;YAAE;AACzB,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC;AAC3B,QAAA,MAAM,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,aAAa,CAAC,KAAK;AACzD,cAAE,SAAS,CAAC,OAAO,EAAE,KAAoC;cACvD,KAAK;IACX;AACA,IAAA,OAAO,MAAW;AACpB;;ACxeA;;;;;AAKG;MAcU,gBAAgB,CAAA;AACV,IAAA,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK;;AAGvC,IAAA,SAAS,GAAG,KAAK,CAAC,KAAK,6CAAI,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAA7B,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAC;;IAGzD,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AAEhC;;;AAGG;IACM,WAAW,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;;AAG7B,IAAA,SAAS,GAAG,KAAK,CAA0B,QAAQ,qDAAC;;AAGpD,IAAA,IAAI,GAAG,KAAK,CAAgC,QAAQ,gDAAC;;AAGrD,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,4CAAI,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAA7B,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAC;;IAGxD,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAsB;;AAGnC,IAAA,eAAe,GAAG,KAAK,CAAC,EAAE,mDAAI,SAAS,EAAE,eAAe,EAAA,CAAA,GAAA,CAA5B,EAAE,SAAS,EAAE,eAAe,EAAE,GAAC;;AAG3D,IAAA,kBAAkB,GAAG,KAAK,CAAC,CAAC,sDAAI,SAAS,EAAE,eAAe,EAAA,CAAA,GAAA,CAA5B,EAAE,SAAS,EAAE,eAAe,EAAE,GAAC;;IAG7D,SAAS,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;;AAGjB,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,0DAAC;;AAGxE,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,yDAAC;AAExE,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAK;AACnD,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,aAAa,CAAC,IAAI;AAC7D,IAAA,CAAC,6DAAC;AAEF;;;;AAIG;AACO,IAAA,iBAAiB,CAAC,KAAY,EAAA;AACtC,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE;QACvB,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,wBAAwB,EAAE;IAClC;wGAvDW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,qCAAA,EAAA,2BAAA,EAAA,oCAAA,EAAA,0BAAA,EAAA,iCAAA,EAAA,uBAAA,EAAA,mCAAA,EAAA,4BAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjC7B,y1CAmCA,EAAA,MAAA,EAAA,CAAA,y2JAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDbY,eAAe,mXAAE,wBAAwB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAWxC,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAb5B,SAAS;+BACE,oBAAoB,EAAA,OAAA,EACrB,CAAC,eAAe,EAAE,wBAAwB,CAAC,EAAA,eAAA,EAGnC,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,uCAAuC,EAAE,yBAAyB;AAClE,wBAAA,sCAAsC,EAAE,wBAAwB;AAChE,wBAAA,mCAAmC,EAAE,qBAAqB;AAC1D,wBAAA,qCAAqC,EAAE,4BAA4B;AACpE,qBAAA,EAAA,QAAA,EAAA,y1CAAA,EAAA,MAAA,EAAA,CAAA,y2JAAA,CAAA,EAAA;;;AE/BH;AAEA;AACM,SAAU,WAAW,CAAC,MAAqD,EAAA;IAC/E,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;AAC9E,IAAA,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,KAAK,CAAC;AAC5G;AAEA;AACM,SAAU,aAAa,CAAC,IAAU,EAAE,QAA2B,EAAA;IACnE,IAAI,CAAC,QAAQ,CAAC,MAAM;AAAE,QAAA,OAAO,IAAI;IACjC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;IACpC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AAEpC,IAAA,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,IAAG;AAC7B,QAAA,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;AAC1D,QAAA,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACxE,OAAO,IAAI,KAAK,OAAO;AACzB,IAAA,CAAC,CAAC;AACJ;AAEA;AACM,SAAU,UAAU,CAAC,CAAO,EAAE,CAAO,EAAA;IACzC,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,YAAY;AACpF;AAEA,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;AAErC;AACM,SAAU,cAAc,CAAC,KAAa,EAAE,MAAc,EAAA;IAC1D,IAAI,KAAK,GAAG,KAAK;IACjB,IAAI,IAAI,GAAG,CAAC;AACZ,IAAA,OAAO,KAAK,IAAI,IAAI,IAAI,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;QAC/C,KAAK,IAAI,IAAI;AACb,QAAA,IAAI,EAAE;IACR;AACA,IAAA,MAAM,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC;IAChD,OAAO,CAAA,EAAG,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,qBAAqB,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,CAAA,EAAI,KAAK,CAAC,IAAI,CAAC,CAAA,CAAE;AAC3G;AAEA;AACM,SAAU,QAAQ,CAAC,IAAU,EAAA;IACjC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AACpC,IAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE;AAEhE,IAAA,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;AAAE,QAAA,OAAO,OAAO;AAC7C,IAAA,IAAI,IAAI,KAAK,iBAAiB,IAAI,SAAS,KAAK,KAAK;AAAE,QAAA,OAAO,gBAAgB;AAC9E,IAAA,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;AAAE,QAAA,OAAO,UAAU;AAChD,IAAA,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;AAAE,QAAA,OAAO,YAAY;IAClD,IAAI,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;AAAE,QAAA,OAAO,aAAa;IACjH,IAAI,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;AAAE,QAAA,OAAO,aAAa;IACvH,IAAI,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;AAAE,QAAA,OAAO,YAAY;AACxH,IAAA,OAAO,OAAO;AAChB;;AChBA;;;AAGG;MAiBU,YAAY,CAAA;;;AAGN,IAAA,UAAU,GAAG,MAAM,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC9D,WAAW,GAAG,MAAM,CAAC,kBAAkB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAClG,IAAA,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAChC,IAAA,KAAK,GAA4B,MAAM,CAAC,UAAU,CAAC;AACnD,IAAA,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC;AAC3B,IAAA,YAAY,GAAG,SAAS,CAAC,QAAQ,CAA+B,aAAa,CAAC;AAC9E,IAAA,SAAS,GAAG,SAAS,CAAC,WAAW,qDAAC;AAChC,IAAA,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK;;IAGxC,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;;IAEvB,WAAW,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;;AAE7B,IAAA,IAAI,GAAG,KAAK,CAAS,EAAE,gDAAC;;AAExB,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,iDAAC;;AAEzB,IAAA,MAAM,GAAG,KAAK,CAAoB,EAAE,kDAAC;;AAErC,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,4CAAI,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAA7B,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAC;;AAExD,IAAA,OAAO,GAAG,KAAK,CAAgB,IAAI,mDAAC;;AAEpC,IAAA,QAAQ,GAAG,KAAK,CAAgB,IAAI,oDAAC;AACrC,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,4CAAI,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAA7B,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAC;;AAExD,IAAA,UAAU,GAAG,KAAK,CAAyB,SAAS,sDAAC;;AAErD,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,iDAAC;;IAEzB,eAAe,GAAG,MAAM,EAAgB;IAE9B,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,KAAK,yDAAC;AAC5E,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MAChD,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,GAAG,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,+DACtF;AACkB,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,sDAAC;IACjE,KAAK,GAAG,QAAQ,CAAC,MAClC,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,iDAC1G;AAEgB,IAAA,YAAY,GAAG,MAAM,CAAC,KAAK,wDAAC;;AAEpC,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,sDAAC;AACzD,IAAA,UAAU,GAAG,MAAM,CAAC,KAAK,sDAAC;AAC1B,IAAA,UAAU,GAAG,MAAM,CAAC,KAAK,sDAAC;;AAG5B,IAAA,SAAS,GAAG,MAAM,CAA2C,EAAE,qDAAC;AAC9D,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACpF,QAAA,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;AAC3C,IAAA,CAAC,4DAAC;;AAGiB,IAAA,iBAAiB,GAAsB;QACxD,YAAY,EAAE,MAAK;AACjB,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE;YAC/B,OAAO,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC;QAC3F,CAAC;KACF;IACkB,YAAY,GAAa,EAAE;AAEtC,IAAA,SAAS,GAA4B,MAAK,EAAE,CAAC;AAC7C,IAAA,UAAU,GAAe,MAAK,EAAE,CAAC;AACjC,IAAA,WAAW;AAEnB,IAAA,WAAA,GAAA;QACE,IAAI,IAAI,CAAC,UAAU;AAAE,YAAA,IAAI,CAAC,UAAU,CAAC,aAAa,GAAG,IAAI;AACzD,QAAA,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC;IACrE;IAEA,eAAe,GAAA;;AAEb,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,OAAO;YAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;IAC1E;IAEA,SAAS,GAAA;;AAEP,QAAA,IAAI,CAAC,SAAS,EAAE,EAAE,gBAAgB,EAAE;IACtC;;IAGA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAAE,IAAI,CAAC,YAAY,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE;IACnE;;AAGA,IAAA,MAAM,CAAC,IAAU,EAAA;AACf,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;AACtB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC;IAC1D;;AAIU,IAAA,YAAY,CAAC,KAAiB,EAAA;;AAEtC,QAAA,IAAK,KAAK,CAAC,MAAkB,CAAC,OAAO,CAAC,wCAAwC,CAAC;YAAE;QACjF,IAAI,CAAC,UAAU,EAAE;IACnB;AAEU,IAAA,gBAAgB,CAAC,KAAoB,EAAA;AAC7C,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;YAC9C,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,UAAU,EAAE;QACnB;IACF;IAEU,aAAa,GAAA;;QAErB,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,QAAQ,CAAC,QAAQ,EAAE;YAAE,IAAI,CAAC,YAAY,EAAE;IACjF;AAEU,IAAA,cAAc,CAAC,KAAY,EAAA;AACnC,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B;AAC9C,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;AAC3B,QAAA,KAAK,CAAC,KAAK,GAAG,EAAE;IAClB;IAEU,cAAc,GAAA;QACtB,IAAI,CAAC,YAAY,EAAE;IACrB;AAEU,IAAA,UAAU,CAAC,KAAgB,EAAA;;QAEnC,KAAK,CAAC,cAAc,EAAE;QACtB,IAAI,KAAK,CAAC,YAAY;AAAE,YAAA,KAAK,CAAC,YAAY,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,MAAM,GAAG,MAAM;AAC3F,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AAAE,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;IACnD;AAEU,IAAA,WAAW,CAAC,KAAgB,EAAA;;AAEpC,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,aAA4B,CAAC;AAAE,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;IACxG;AAEU,IAAA,MAAM,CAAC,KAAgB,EAAA;QAC/B,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC;IACnE;;AAIA,IAAA,UAAU,CAAC,KAAgC,EAAA;QACzC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;AACjD,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;IACxB;AAEA,IAAA,gBAAgB,CAAC,EAA2B,EAAA;AAC1C,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;;AAEnB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,OAAO;YAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;IAC1E;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;IACtB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC;IACnC;;IAIQ,QAAQ,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,OAAO,IAAI,IAAI;IACzC;;AAGQ,IAAA,YAAY,CAAC,OAA+B,EAAA;AAClD,QAAA,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE;AAC/B,QAAA,IAAI,CAAC,OAAO;YAAE;QACd,MAAM,OAAO,GAAwB,IAAI,CAAC,WAAW,EAAE,QAAQ,IAAI,KAAK;QAExE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;AAC/F,QAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;IAC9B;AAEQ,IAAA,cAAc,CAAC,OAAwB,EAAA;AAC7C,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;;AAE9D,QAAA,IAAI,CAAC,SAAS,EAAE,EAAE,gBAAgB,EAAE;AACpC,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;IAC1B;AAEQ,IAAA,SAAS,CAAC,IAAiC,EAAA;QACjD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;QACvC,IAAI,CAAC,QAAQ,CAAC,MAAM;YAAE;QAEtB,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;AAC3C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;QAC9B,MAAM,QAAQ,GAA6C,EAAE;QAC7D,MAAM,KAAK,GAAW,EAAE;AAExB,QAAA,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE;AAC3B,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC;gBAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;iBAChF,IAAI,OAAO,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,OAAO;gBAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;;AAC1F,gBAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QACvB;AAEA,QAAA,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;YACpB,IAAI,KAAK,CAAC,MAAM;AAAE,gBAAA,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACrC;aAAO;;YAEL,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,KAAK,KACrC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,CAChH;AACD,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE;YAC3B,MAAM,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YACxE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAAC;AACtF,YAAA,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM;AAAE,gBAAA,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACzE;AAEA,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC5B,QAAA,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,QAAQ;YAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;AAEpH,QAAA,IAAI,IAAI,KAAK,IAAI,CAAC,KAAK,EAAE;AAAE,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;;YACxC,IAAI,CAAC,YAAY,EAAE;IAC1B;AAEQ,IAAA,OAAO,CAAC,KAAa,EAAA;AAC3B,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;AACrB,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QACrB,IAAI,CAAC,YAAY,EAAE;IACrB;IAEQ,YAAY,GAAA;QAClB,IAAI,CAAC,UAAU,EAAE;AACjB,QAAA,IAAI,CAAC,SAAS,EAAE,EAAE,gBAAgB,EAAE;AACpC,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;IAC1B;IAEQ,QAAQ,CAAC,IAAU,EAAE,IAAsB,EAAA;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,SAAS;QACpC,QAAQ,IAAI;AACV,YAAA,KAAK,kBAAkB;gBACrB,OAAO,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;AACtC,YAAA,KAAK,eAAe;gBAClB,OAAO,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;AACzF,YAAA,KAAK,oBAAoB;gBACvB,OAAO,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;;IAEtD;wGAvPW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,aAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,WAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,gCAAA,EAAA,cAAA,EAAA,gCAAA,EAAA,cAAA,EAAA,iCAAA,EAAA,oBAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EASgB,WAAW,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClEpD,8oFA2EA,EAAA,MAAA,EAAA,CAAA,snDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDhCY,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,kCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,WAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,UAAA,EAAA,OAAA,EAAA,mBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,uBAAA,EAAA,+BAAA,EAAA,aAAA,EAAA,IAAA,EAAA,UAAA,EAAA,UAAA,EAAA,iCAAA,CAAA,EAAA,OAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,wEAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,qLAAE,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAcnF,YAAY,EAAA,UAAA,EAAA,CAAA;kBAhBxB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,WACjB,CAAC,eAAe,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,CAAC,EAAA,eAAA,EAG9E,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,KAAK,EAAE,gBAAgB;AACvB,wBAAA,kCAAkC,EAAE,cAAc;AAClD,wBAAA,kCAAkC,EAAE,cAAc;AAClD,wBAAA,mCAAmC,EAAE,oBAAoB;AACzD,wBAAA,YAAY,EAAE,oBAAoB;AAClC,wBAAA,aAAa,EAAE,qBAAqB;AACpC,wBAAA,QAAQ,EAAE,gBAAgB;AAC3B,qBAAA,EAAA,QAAA,EAAA,8oFAAA,EAAA,MAAA,EAAA,CAAA,snDAAA,CAAA,EAAA;AAUgF,SAAA,CAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,aAAa,uFACvD,WAAW,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MElEvC,iBAAiB,GAAG,CAAC,MAAc,EAAE,KAAa,KAAa;IAC1E,MAAM,gBAAgB,GAAG;AACtB,SAAA,WAAW;SACX,SAAS,CAAC,KAAK;AACf,SAAA,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;IAClC,MAAM,eAAe,GAAG;AACrB,SAAA,WAAW;SACX,SAAS,CAAC,KAAK;AACf,SAAA,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;AAClC,IAAA,OAAO,gBAAgB,CAAC,QAAQ,CAAC,eAAe,CAAC;AACnD;AAEO,MAAM,YAAY,GAAG,CAAC,GAAW,KAAY;AAClD,IAAA,OAAO,kBAAkB,CACvB,IAAI,CAAC,GAAG;SACL,KAAK,CAAC,EAAE;SACR,GAAG,CAAC,UAAU,CAAC,EAAA;QACd,OAAO,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AAC9D,IAAA,CAAC;AACA,SAAA,IAAI,CAAC,EAAE,CAAC,CACZ;AACH;;ACqBA;AACA,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,WAAW;IACX,SAAS;IACT,OAAO;IACP,QAAQ;IACR,MAAM;IACN,KAAK;IACL,KAAK;AACN,CAAA,CAAC;MAiBW,cAAc,CAAA;;AAGhB,IAAA,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK;AAEvC;;;;AAIG;AACc,IAAA,UAAU,GAAG,MAAM,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;IAE9D,gBAAgB,GAAG,MAAM,CAAC,kBAAkB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACjE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAChD,IAAA,kBAAkB,GAAG,MAAM,CAAC,iBAAiB,CAAC;;AAGtD,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,gDAAU;AAChC,IAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,kDAAO;AAC/B,IAAA,iBAAiB,GAAG,KAAK,CAAC,QAAQ,4DAAwB;AAC1D,IAAA,SAAS,GAAG,KAAK,CAAU,KAAK,qDAAC;AACjC,IAAA,WAAW,GAAG,KAAK,CAAS,EAAE,uDAAC;AAC/B,IAAA,eAAe,GAAG,KAAK,CAAkB,OAAO,2DAAC;AACjD,IAAA,UAAU,GAAG,KAAK,CAAqB,MAAM,sDAAC;AAC9C,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,oDAAC;AAChC,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,oDAAC;AAChC,IAAA,SAAS,GAAG,KAAK,CAAU,KAAK,qDAAC;AACjC,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,iDAAC;AACzB,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,iDAAC;;;IAIlC,eAAe,GAAG,MAAM,EAAoC;;AAGnD,IAAA,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAY,WAAW,CAAC;AACtD,IAAA,WAAW,GAAG,SAAS,CAA+B,aAAa,uDAAC;;;AAI1D,IAAA,YAAY,GAAG,IAAI,WAAW,CAAM,IAAI,CAAC;;AAEzC,IAAA,KAAK,GAAG,MAAM,CAAM,IAAI,iDAAC;;AAE3B,IAAA,WAAW,GAAG,MAAM,CAAC,KAAK,uDAAC;;AAEzB,IAAA,WAAW,GAAG,MAAM,CAAC,EAAE,uDAAC;AAEnC,IAAA,QAAQ,GAAyB,MAAK,EAAE,CAAC;AACzC,IAAA,SAAS,GAAe,MAAK,EAAE,CAAC;;AAGrB,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,sDAAC;AAErF;;;;AAIG;AACgB,IAAA,eAAe,GAAG,QAAQ,CAAsB,MAAK;AACtE,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE;AAChC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,EAAE;AAEvC,QAAA,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,IAAG;YAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YACnD,OAAO;AACL,gBAAA,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAC9B,KAAK;AACL,gBAAA,QAAQ,EAAE,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,KAAK;AAC3D,gBAAA,OAAO,EAAE,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC;aACzC;AACH,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC,2DAAC;;AAGiB,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,GAAG,CAAC,mDAAC;AAE9E;;;;;;;AAOG;AACgB,IAAA,gBAAgB,GAAG,QAAQ,CAAsB,MAAK;AACvE,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,QAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;QACvF,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAC/E,IAAA,CAAC,4DAAC;;AAGiB,IAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC,MAAM,KAAK,CAAC,gEAAC;;AAG3E,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAK;AACpD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE;AAChC,QAAA,IAAI,CAAC,KAAK;AACR,YAAA,OAAO,EAAE;AAEX,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM;QAClE,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC;AAChD,IAAA,CAAC,8DAAC;AAEF;;;;;;AAMG;AACgB,IAAA,iBAAiB,GAAsB;QACxD,YAAY,EAAE,MACZ,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC,UAAU,EAAE,OAAO,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC;KAC9F;AAED;;;;AAIG;IACO,UAAU,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,KAAK;IAC7E;;IAGQ,sBAAsB,GAAA;AAC5B,QAAA,OAAO,IAAI,CAAC,gBAAgB,EAAE,SAAS,IAAI,IAAI,CAAC,WAAW,EAAE,SAAS,IAAI,KAAK;IACjF;AAEA,IAAA,WAAA,GAAA;;QAEE,IAAI,IAAI,CAAC,UAAU;AACjB,YAAA,IAAI,CAAC,UAAU,CAAC,aAAa,GAAG,IAAI;;QAGtC,iBAAiB,CAAC,MAAK;AACrB,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE;AAClC,YAAA,IAAI,QAAQ,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO;gBACvC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC5C,iBAAA,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ;gBAC9C,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAClD,QAAA,CAAC,CAAC;;QAGF,IAAI,CAAC,YAAY,CAAC;aACf,IAAI,CAAC,kBAAkB,EAAE;aACzB,SAAS,CAAC,KAAK,IAAG;AACjB,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;AACrB,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;AACpB,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;AAClC,QAAA,CAAC,CAAC;AAEJ;;;;;AAKG;AACH,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,EAAE,QAAQ,IAAI,IAAI,CAAC,WAAW,EAAE,QAAQ;QAClF,YAAY,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,SAAS,CAAC,MAAK;AACtD,YAAA,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE;AACjC,YAAA,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE;AACxC,QAAA,CAAC,CAAC;IACJ;;AAGA,IAAA,UAAU,CAAC,KAAU,EAAA;AACnB,QAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACvD,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;IACvB;AAEA,IAAA,gBAAgB,CAAC,EAAwB,EAAA;AACvC,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC;IAClC;;AAGA,IAAA,cAAc,CAAC,MAAe,EAAA;QAC5B,IAAI,MAAM,EAAE;AACV,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,UAAU,CAAC,MAAK;gBACd,IAAI,CAAC,WAAW,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE;gBACzC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,aAAa;AACnD,gBAAA,IAAI,KAAK;AACP,oBAAA,KAAK,CAAC,SAAS,GAAG,CAAC;AACvB,YAAA,CAAC,CAAC;QACJ;aAAO;;YAEL,IAAI,CAAC,SAAS,EAAE;AAChB,YAAA,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE;QAC3C;IACF;AAEA,IAAA,aAAa,CAAC,KAAa,EAAA;AACzB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;IAC7B;AAEA;;;;AAIG;AACH,IAAA,eAAe,CAAC,KAAoB,EAAA;QAClC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;YACjC,KAAK,CAAC,eAAe,EAAE;IAC3B;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC,WAAW,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE;IAC3C;IAEA,YAAY,GAAA;AACV,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,IAAI;QAC5C,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACrC,QAAA,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE;AACjC,QAAA,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE;IAC3C;wGAlOW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAd,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,WAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpE3B,m6GA0EA,EAAA,MAAA,EAAA,CAAA,o5BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDjBI,cAAc,m3BACd,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,2BAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,YAAA,EAAA,0BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,mBAAmB,4hBACnB,wBAAwB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAKf,cAAc,EAAA,UAAA,EAAA,CAAA;kBAf1B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,EAAA,eAAA,EACX,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACP,cAAc;wBACd,eAAe;wBACf,aAAa;wBACb,eAAe;wBACf,kBAAkB;wBAClB,mBAAmB;wBACnB,wBAAwB;AACzB,qBAAA,EAAA,QAAA,EAAA,m6GAAA,EAAA,MAAA,EAAA,CAAA,o5BAAA,CAAA,EAAA;AAuCkD,SAAA,CAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,iBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,WAAW,qEACC,aAAa,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;IEtGlE;AAAZ,CAAA,UAAY,cAAc,EAAA;AACxB,IAAA,cAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,cAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,cAAA,CAAA,WAAA,CAAA,GAAA,WAAuB;AACvB,IAAA,cAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACvB,CAAC,EALW,cAAc,KAAd,cAAc,GAAA,EAAA,CAAA,CAAA;AA6B1B;;;;;AAKG;MACmB,gBAAgB,CAAA;AASrC;;MCzCY,oBAAoB,CAAA;AACrB,IAAA,IAAI,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAC/B,WAAW,GAA6B,IAAI;IAEpD,SAAS,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAa;IAC9B,IAAI,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAK;AAEjB,IAAA,WAAA,GAAA;QACI,MAAM,CAAC,MAAK;AACR,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,EAAE;;YAGtC,IAAI,CAAC,aAAa,EAAE;AAChB,gBAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;AACjB,gBAAA,IAAI,CAAC,WAAW,GAAG,IAAI;gBACvB;YACJ;;YAGA,IAAI,IAAI,CAAC,WAAW,EAAE,aAAa,KAAK,aAAa,EAAE;AACnD,gBAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;gBACjB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC;YAC/D;;AAGA,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;YACxB,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,KAAK,SAAS,EAAE;;gBAExC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;YAC3C;AACJ,QAAA,CAAC,CAAC;IACN;wGA/BS,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAHhC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE;AACb,iBAAA;;;ACMD;;;AAGG;MAmBU,SAAS,CAAA;AACH,IAAA,UAAU,GAAG,MAAM,EAAC,YAA6B,EAAC;AAClD,IAAA,KAAK,GAAG,MAAM,CAAkB,eAAe,CAAC;AAChD,IAAA,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK;AAEvC,IAAA,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK;AACxB,IAAA,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI;AACtB,IAAA,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS;AAChC,IAAA,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ;AAC9B,IAAA,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI;IACtB,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI;IAC1C,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,IAAI;IAC5C,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,KAAK;;AAE7C,IAAA,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY;IACjE,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,KAAK;AACvC,IAAA,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM;AACjE,IAAA,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM;;AAGnE,IAAA,MAAM,GAAG,MAAM,CAAgB,SAAS,kDAAC;AACzC,IAAA,eAAe,GAAG,MAAM,CAAC,KAAK,2DAAC;AAExC,IAAA,KAAK,CAAC,MAAoB,EAAA;AACxB,QAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC;IAC/B;;IAGmB,cAAc,GAAG,cAAc;AAC/B,IAAA,eAAe,GAAmC;AACnE,QAAA,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,IAAS;AAC9B,QAAA,MAAM,EAAE,IAAI;KACb;IAED,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC;IAC9B;IAEA,cAAc,GAAA;QACZ,IAAI,IAAI,CAAC,eAAe,EAAE;YAAE;AAC5B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAC5B,QAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,GAAG,IAAI,GAAG,MAAM,CAAC;IAC7D;wGA1CW,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAT,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,SAAS,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,SAAA,EAFT,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,UAAU,CAAC,MAAM,SAAS,CAAC,EAAE,CAAC,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC9BtF,yyFA4EA,EAAA,MAAA,EAAA,CAAA,qmCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED3DI,cAAc,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,gBAAgB,yGAChB,gBAAgB,EAAA,QAAA,EAAA,8DAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAJ,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,gBAAgB,oJAChB,oBAAoB,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,MAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAQX,SAAS,EAAA,UAAA,EAAA,CAAA;kBAlBrB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,YAAY,EAAA,OAAA,EACb;wBACP,cAAc;wBACd,gBAAgB;wBAChB,gBAAgB;wBAChB,eAAe;wBACf,aAAa;wBACb,gBAAgB;wBAChB,gBAAgB;wBAChB,oBAAoB;AACrB,qBAAA,EAAA,eAAA,EAGgB,uBAAuB,CAAC,MAAM,aAEpC,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,UAAU,CAAC,MAAK,SAAU,CAAC,EAAE,CAAC,EAAA,QAAA,EAAA,yyFAAA,EAAA,MAAA,EAAA,CAAA,qmCAAA,CAAA,EAAA;;;AEvBtF;;;;AAIG;MAcU,yBAAyB,CAAA;AACpC,IAAA,SAAS,GAAG,MAAM,EAAC,YAAuC,EAAC;AAC3D,IAAA,IAAI,GAAG,MAAM,CAAoB,eAAe,CAAC;AACxC,IAAA,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK;wGAH5B,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAzB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECzBtC,mlBAaqB,EAAA,MAAA,EAAA,CAAA,wBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDEjB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,cAAc,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,gBAAgB,EAAA,QAAA,EAAA,8DAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,gBAAgB,EAAA,QAAA,EAAA,8DAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,cAAc,oLACd,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,GAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAKH,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAbrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,EAAA,OAAA,EACrB;wBACP,eAAe;wBACf,cAAc;wBACd,gBAAgB;wBAChB,gBAAgB;wBAChB,cAAc;wBACd;AACD,qBAAA,EAAA,QAAA,EAAA,mlBAAA,EAAA,MAAA,EAAA,CAAA,wBAAA,CAAA,EAAA;;;MEhBU,wBAAwB,CAAA;AACnC,IAAA,GAAG,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAE9B,SAAS,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAa;IAC9B,GAAG,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,KAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAK;IAChB,GAAG,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,KAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAW;IAEd,WAAW,GAA6B,IAAI;AAC5C,IAAA,UAAU;AACV,IAAA,UAAU;AAElB,IAAA,MAAM,GAAG,MAAM,CAAC,MAAK;AACnB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;AAClC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AACtB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;;QAGtB,IAAI,CAAC,SAAS,EAAE;AACd,YAAA,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;AAChB,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,YAAA,IAAI,CAAC,UAAU,GAAG,SAAS;AAC3B,YAAA,IAAI,CAAC,UAAU,GAAG,SAAS;YAC3B;QACF;;;;QAKA,IAAI,IAAI,CAAC,WAAW,EAAE,aAAa,KAAK,SAAS,EAAE;AACjD,YAAA,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;YAChB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC;AACtD,YAAA,IAAI,CAAC,UAAU,GAAG,SAAS;AAC3B,YAAA,IAAI,CAAC,UAAU,GAAG,SAAS;QAC7B;AAEA,QAAA,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS;YACxC;QAEF,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AACxC,YAAA,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC;AAC7B,YAAA,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC;YAC7B,IAAI,CAAC,WAAY,CAAC,QAAQ,CAAC,GAAG,GAAG,IAAI,CAAC,UAAU;YAChD,IAAI,CAAC,WAAY,CAAC,QAAQ,CAAC,GAAG,GAAG,IAAI,CAAC,UAAU;QAClD;aAAO;AACL,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC;AACxB,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC;QAC1B;AACF,IAAA,CAAC,kDAAC;wGA/CS,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAxB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAHpC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,sBAAsB;AACjC,iBAAA;;;MCCY,2BAA2B,CAAA;AAEtC,IAAA,SAAS,CAAC,KAAa,EAAA;AACrB,QAAA,IAAI,CAAC,KAAK;AACR,YAAA,OAAO,EAAE;AAEX,QAAA,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE;AAC3B,QAAA,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA,EAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;IAC5D;wGARW,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;sGAA3B,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,4BAAA,EAAA,CAAA;;4FAA3B,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAHvC,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,4BAA4B;AACnC,iBAAA;;;ACoFK,SAAU,cAAc,CAAC,GAAY,EAAA;AACvC,IAAA,QACI,OAAO,GAAG,KAAK,QAAQ;AACvB,QAAA,GAAG,KAAK,IAAI;AACZ,QAAA,OAAO,IAAI,GAAG;AACd,QAAA,OAAO,IAAI,GAAG;AACd,QAAA,OAAQ,GAAW,CAAC,KAAK,KAAK,QAAQ;AACtC,QAAA,OAAQ,GAAW,CAAC,KAAK,KAAK,QAAQ;AAE9C;;MCxFa,mBAAmB,CAAA;IAC9B,OAAO,oBAAoB,GAAG,CAAI,EAAe,EAAE,cAAiC,KAAe;QACjG,OAAO,EAAE,CAAC,KAAK,CAAC;YACd,IAAI,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC;YAChD,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAC/E,SAAA,CAAC;AACJ,IAAA,CAAC;IAED,OAAO,iBAAiB,GAAG,CAAI,EAAe,EAAE,KAAqB,KAAe;QAClF,OAAO,EAAE,CAAC,KAAK,CAAC;YACd,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,IAAIK,EAAM,EAAE,CAAC;YAC1B,SAAS,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC,QAAQ,CAAC;AACjD,YAAA,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAG;AACtC,gBAAA,OAAO,IAAI,CAAC,aAAa,CAAI,CAAC;sBAC1B,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,CAAC;sBAC5B,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,CAAC,CAAC;AAClC,YAAA,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;AAC1B,SAAA,CAAC;AACJ,IAAA,CAAC;IAED,OAAO,gBAAgB,GAAG,CAAI,EAAe,EAAE,IAAmB,KAAe;QAC/E,OAAO,EAAE,CAAC,KAAK,CAAC;YACd,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,IAAIA,EAAM,EAAE,CAAC;YACzB,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC;YAC5C,QAAQ,EAAE,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC;YACtD,KAAK,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE,UAAU,CAAC,QAAQ;AAChD,SAAA,CAAC;AACJ,IAAA,CAAC;AAED,IAAA,OAAO,aAAa,GAAG,CAAI,GAAQ,KAA2B;AAC5D,QAAA,OAAO,GAAG;YACR,OAAO,GAAG,KAAK,QAAQ;AACvB,YAAA,WAAW,IAAI,GAAG;YAClB,SAAS,IAAI,GAAG;AACpB,IAAA,CAAC;IAEO,OAAO,YAAY,CAAI,GAAQ,EAAA;QACrC,OAAO,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,IAAI,GAAG;IACvD;IAEA,OAAO,eAAe,CAAI,EAAe,EAAE,IAAe,EAAE,OAAe,EAAE,KAAqB,EAAA;AAChG,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAc,EAAE,OAAO,CAAC;QACnF,IAAI,UAAU,EAAE;YACd,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,SAAS,CAAc;YACtD,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,KAAK,CAAC;AACnD,YAAA,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;QACzB;IACF;AAEA,IAAA,OAAO,WAAW,CAAI,IAAe,EAAE,OAAe,EAAA;QACpD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAc;QACnD,OAAO,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,OAAO,CAAC;IACvD;AAEA,IAAA,OAAO,cAAc,GAAG,CAAI,EAAe,EAAE,IAAe,EAAE,OAAe,EAAE,IAAmB,KAAI;AACpG,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAc,EAAE,OAAO,CAAC;QAC9E,IAAI,KAAK,EAAE;YACT,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAc;YACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,IAAI,CAAC;AAChD,YAAA,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;QACxB;AACF,IAAA,CAAC;AAED,IAAA,OAAO,UAAU,CAAI,IAAe,EAAE,MAAc,EAAA;QAClD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAc;QACnD,OAAO,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,MAAM,CAAC;IACtD;AAEQ,IAAA,OAAO,mBAAmB,CAAC,KAAgB,EAAE,EAAU,EAAA;AAC7D,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACrC,MAAM,OAAO,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAc;;YAGxC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,KAAK,EAAE,EAAE;AACnC,gBAAA,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;AACjB,gBAAA,OAAO,IAAI;YACb;;YAGA,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;AACtC,YAAA,IAAI,OAAO,YAAY,SAAS,EAAE;gBAChC,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE,CAAC;AACrD,gBAAA,IAAI,OAAO;AAAE,oBAAA,OAAO,IAAI;YAC1B;QACF;AAEA,QAAA,OAAO,KAAK;IACd;AAGA,IAAA,OAAO,iBAAiB,CAAC,KAAgB,EAAE,EAAU,EAAA;AACnD,QAAA,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE;YACpC,MAAM,KAAK,GAAG,OAAoB;YAClC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,KAAK,EAAE;AAC/B,gBAAA,OAAO,KAAK;YAEd,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAc;YACjD,IAAI,OAAO,EAAE;gBACX,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,EAAE,CAAC;AACjD,gBAAA,IAAI,KAAK;AACP,oBAAA,OAAO,KAAK;YAChB;QACF;AACA,QAAA,OAAO,IAAI;IACb;IAEA,OAAO,iBAAiB,CAAC,KAAsB,EAAA;QAC7C,QACE,KAAK,YAAY,SAAS;AAC1B,YAAA,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;AAC3B,YAAA,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;IAE7B;AAEA;;;;;;;;AAQG;IAEH,OAAO,uBAAuB,CAAI,IAAe,EAAA;QAC/C,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,KAAK;YAC7B,MAAM,EAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAe,CAAC;iBACvC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,yBAAyB,CAAI,CAAc,CAAC;iBAC1D,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;SACvC;IACH;IAGQ,OAAO,yBAAyB,CAAI,SAAoB,EAAA;QAC9D,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAe;QAC/C,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,KAAwB;QACtE,MAAM,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC,SAAS,CAAc;AAE1D,QAAA,MAAM,OAAO,GAAG,YAAY,CAAC;aAC1B,GAAG,CAAC,OAAO,IAAG;AACb,YAAA,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK;YAC3B,IAAI,SAAS,IAAI,KAAK;AACpB,gBAAA,OAAO,IAAI,CAAC,yBAAyB,CAAI,OAAoB,CAAC;;AAE9D,gBAAA,OAAO,IAAI,CAAC,wBAAwB,CAAI,OAAoB,CAAC;AACjE,QAAA,CAAC;AACA,aAAA,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;QAExC,OAAO;AACL,YAAA,EAAE,EAAE,EAAE;AACN,YAAA,SAAS,EAAE,SAAS;AACpB,YAAA,OAAO,EAAE;SACV;IACH;IAGQ,OAAO,wBAAwB,CAAI,QAAmB,EAAA;QAC5D,OAAO;YACL,EAAE,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK;YAC7B,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK;YAC/B,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,KAAK;YACzC,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;SAC/B;IACH;IAEQ,OAAO,gBAAgB,CAAI,MAAsC,EAAA;AACvE,QAAA,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;AAC5B,YAAA,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;AAErC,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;IACpC;IAEQ,OAAO,eAAe,CAAI,KAAqB,EAAA;QACrD,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAC1F;IAEQ,OAAO,cAAc,CAAI,IAAmB,EAAA;AAClD,QAAA,OAAO,CAAC,EAAE,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;IAC9G;AAEA,IAAA,OAAO,oBAAoB,CAAI,MAAwB,EAAE,OAAkC,EAAE,KAAsB,EAAA;AACjH,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC;;IAEpD;AAEQ,IAAA,OAAO,WAAW,CAAI,KAAqB,EAAE,OAAkC,EAAE,KAAsB,EAAA;QAC7G,MAAM,cAAc,GAAG,KAAK,CAAC,SAAS,KAAK,KAAK,GAAG,KAAK,CAAC,eAAe,CAAC,GAAG,GAAG,KAAK,CAAC,eAAe,CAAC,EAAE;AACvG,QAAA,MAAM,SAAS,GAAG,CAAA,SAAA,EAAY,cAAc,YAAY;QAExD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAG;AACvC,YAAA,IAAI,IAAI,CAAC,aAAa,CAAI,MAAM,CAAC;AAC/B,gBAAA,OAAO,CAAA,mBAAA,EAAsB,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA,mBAAA,CAAqB;;gBAE1F,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC;AAClD,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;IAC9B;AAEQ,IAAA,OAAO,UAAU,CAAI,IAAmB,EAAE,OAAkC,EAAE,KAAsB,EAAA;AAC1G,QAAA,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;AAE7D,QAAA,IAAI,CAAC,MAAM;AACT,YAAA,OAAO,EAAE;AAEX,QAAA,MAAM,GAAG,GAAG,CAAA,GAAA,EAAM,MAAM,CAAC,KAAK,MAAM;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,GAAG,EAAE;;AAE/F,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC;AAClD,QAAA,OAAO,GAAG,GAAG,CAAA,CAAA,EAAI,QAAQ,CAAA,EAAA,EAAK,KAAK,GAAG;IACxC;AAEQ,IAAA,OAAO,gBAAgB,CAAC,QAAwB,EAAE,KAAsB,EAAA;AAC9E,QAAA,MAAM,cAAc,GAAmC;AACrD,YAAA,GAAG,EAAE,KAAK,CAAC,eAAe,CAAC,SAAS,CAAC,MAAM;AAC3C,YAAA,IAAI,EAAE,KAAK,CAAC,eAAe,CAAC,SAAS,CAAC,SAAS;AAC/C,YAAA,GAAG,EAAE,KAAK,CAAC,eAAe,CAAC,SAAS,CAAC,WAAW;AAChD,YAAA,IAAI,EAAE,KAAK,CAAC,eAAe,CAAC,SAAS,CAAC,eAAe;AACrD,YAAA,GAAG,EAAE,KAAK,CAAC,eAAe,CAAC,SAAS,CAAC,QAAQ;AAC7C,YAAA,IAAI,EAAE,KAAK,CAAC,eAAe,CAAC,SAAS,CAAC,YAAY;AAClD,YAAA,MAAM,EAAE,KAAK,CAAC,eAAe,CAAC,SAAS,CAAC;SACzC;AACD,QAAA,OAAO,cAAc,CAAC,QAAQ,CAAC;IACjC;AAEQ,IAAA,OAAO,WAAW,CAAI,KAAkB,EAAE,MAA+B,EAAA;AAC/E,QAAA,QAAQ,MAAM,CAAC,UAAU;AACvB,YAAA,KAAK,QAAQ;AACb,YAAA,KAAK,iBAAiB;gBACpB,IAAI,cAAc,CAAC,KAAK,CAAC;oBACvB,OAAO,KAAK,CAAC,KAAK;AAEpB,gBAAA,MAAM,cAAc,GAAG,MAAM,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC;AAClF,gBAAA,OAAO,cAAc,EAAE,KAAK,IAAI,EAAE;AACpC,YAAA,KAAK,MAAM;AACX,YAAA,KAAK,YAAY;AACf,gBAAA,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC;gBAClC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAe,EAAE,YAAY,CAAC,IAAI,EAAE;;AAG9D,QAAA,OAAO,KAAe;IACxB;IAEA,OAAO,kBAAkB,CAAI,cAAiC,EAAA;QAC5D,MAAM,MAAM,GAAuB,EAAE;AAErC,QAAA,KAAK,MAAM,KAAK,IAAI,cAAc,CAAC,MAAM,EAAE;YACzC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;QACtD;AAEA,QAAA,OAAO,MAAM;IACf;IAEQ,OAAO,wBAAwB,CAAI,KAAqB,EAAA;QAC9D,MAAM,OAAO,GAAuB,EAAE;AAEtC,QAAA,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE;AAC7B,YAAA,IAAI,IAAI,CAAC,aAAa,CAAI,CAAC,CAAC,EAAE;gBAC5B,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC;YACnD;iBAAO,IAAI,IAAI,CAAC,YAAY,CAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,EAAE;gBACtG,OAAO,CAAC,IAAI,CAAC;oBACX,KAAK,EAAE,CAAC,CAAC,GAAG;oBACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ;AACpB,oBAAA,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE;oBAC1B,QAAQ,EAAE,KAAK,CAAC,SAAS;AACzB,oBAAA,KAAK,EAAE,KAAK,CAAC,EAAE,IAAI;AACpB,iBAAA,CAAC;YACJ;QACF;AAEA,QAAA,OAAO,OAAO;IAChB;IAGA,OAAO,iCAAiC,CAAI,MAAyB,EAAA;QACnE,OAAO;AACL,YAAA,GAAG,MAAM;AACT,YAAA,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC;SACxE;IACH;IAEQ,OAAO,wBAAwB,CAAI,KAAqB,EAAA;QAC9D,OAAO;AACL,YAAA,GAAG,KAAK;YACR,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAG;AAC7B,gBAAA,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE;AACzB,oBAAA,OAAO,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;gBACzC;AAEA,gBAAA,OAAO,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;AACxC,YAAA,CAAC;SACF;IACH;IAEQ,OAAO,uBAAuB,CAAI,IAAmB,EAAA;AAC3D,QAAA,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YAC9B,OAAO;AACL,gBAAA,GAAG,IAAI;AACP,gBAAA,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC;aACnB;QACH;AAEA,QAAA,OAAO,IAAI;IACb;;;ACvTF;;;;;;;AAOG;MACU,eAAe,GAAG,IAAI,cAAc,CAC7C,iBAAiB,EACjB;AACI,IAAA,UAAU,EAAE,MAAM;AAClB,IAAA,OAAO,EAAE,MAAM,MAAM,CAA4B,SAAS;AAC7D,CAAA;;ACUE,MAAM,uBAAuB,GAAyC;AACzE,IAAA,MAAM,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC;AACzC,IAAA,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC;AACzB,IAAA,MAAM,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC;AACnB,IAAA,iBAAiB,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC;AAC9B,IAAA,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC;AACvC,IAAA,YAAY,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC;;;MCtBtC,qBAAqB,CAAA;AACxB,IAAA,aAAa,GAAG,MAAM,CAAC,eAAe,CAAC;IAE9B,0CAA0C,GAAG,iBAAiB;AACvE,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;AAC9B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE;AAEnC,QAAA,IAAI,CAAC,MAAM;AACT,YAAA,OAAO,SAAS;AAElB,QAAA,OAAO,GAAG,IAAI,CAAC,0CAA0C,CAAA,CAAA,EAAI,MAAM,EAAE;AACvE,IAAA,CAAC,mDAAC;AAEM,IAAA,gBAAgB,GAAG,MAAM,CAAwC,EAAE,4DAAC;AAC5E,IAAA,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE;AAE5C,IAAA,wBAAwB,GAAG,MAAM,CAAC,MAAK;QAC7C,IAAI,CAAC,iBAAiB,EAAE;AAC1B,IAAA,CAAC,oEAAC;AAEF,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,iBAAiB,EAAE;IAC1B;IAEQ,iBAAiB,GAAA;AACvB,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE;QACtC,IAAI,CAAC,eAAe,EAAE;AACpB,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B;QACF;QAEA,MAAM,oBAAoB,GAAG,YAAY,CAAC,OAAO,CAAC,eAAe,CAAC;QAElE,IAAI,CAAC,oBAAoB,EAAE;AACzB,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B;QACF;QAEA,MAAM,eAAe,GAA0C,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC;AAE/F,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,eAAe,CAAC;IAC5C;IAEA,kBAAkB,CAAC,OAAe,EAAE,cAAmC,EAAA;AACrE,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE;AACtC,QAAA,IAAI,CAAC,eAAe;AAClB,YAAA,OAAO,KAAK;AAEd,QAAA,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,YAAY,IAAG;YAC1C,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE;AAEhD,YAAA,MAAM,KAAK,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACzF,YAAA,IAAI,QAA+B;AACnC,YAAA,IAAI,KAAK,IAAI,CAAC,EAAE;AACd,gBAAA,QAAQ,GAAG,CAAC,GAAG,YAAY,CAAC;AAC5B,gBAAA,QAAQ,CAAC,KAAK,CAAC,GAAG,cAAc;YAClC;AAAO,iBAAA;AACL,gBAAA,QAAQ,GAAG,CAAC,GAAG,YAAY,EAAE,cAAc,CAAC;YAC9C;AAEA,YAAA,MAAM,QAAQ,GAA0C;AACtD,gBAAA,GAAG,YAAY;gBACf,CAAC,OAAO,GAAG;aACZ;AACD,YAAA,YAAY,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AAC/D,YAAA,OAAO,QAAQ;AACjB,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,IAAI;IACb;IAEA,oBAAoB,CAAC,OAAe,EAAE,cAAmC,EAAA;AACvE,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE;AACtC,QAAA,IAAI,CAAC,eAAe;AAClB,YAAA,OAAO,KAAK;AAEd,QAAA,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,YAAY,IAAG;YAC1C,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE;AAEhD,YAAA,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAEzF,YAAA,MAAM,QAAQ,GAA0C;AACtD,gBAAA,GAAG,YAAY;gBACf,CAAC,OAAO,GAAG;aACZ;AACD,YAAA,YAAY,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE/D,YAAA,OAAO,QAAQ;AACjB,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,qBAAqB,CAAC,OAAe,EAAE,gBAAwB,EAAE,sBAA+B,IAAI,EAAA;QAClG,MAAM,yBAAyB,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,OAAO,CAAC;AAElE,QAAA,IAAI,CAAC,yBAAyB;AAC5B,YAAA,OAAO,SAAS;QAElB,MAAM,cAAc,GAAG,yBAAyB,CAAC,IAAI,CAAC,cAAc,IAAG;YACrE,OAAO,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,gBAAgB;AACvG,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,mBAAmB;AACtB,YAAA,OAAO,cAAc;AAEvB,QAAA,IAAI,CAAC,cAAc;AACjB,YAAA,OAAO,SAAS;AAElB,QAAA,OAAO,mBAAmB,CAAC,iCAAiC,CAAC,cAAc,CAAC;IAC9E;IAEA,qBAAqB,CAAC,OAAe,EAAE,gBAAwB,EAAA;QAC7D,MAAM,cAAc,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,gBAAgB,CAAC;AAE5E,QAAA,IAAI,CAAC,cAAc;AACjB,YAAA,OAAO,EAAE;AAEX,QAAA,OAAO,mBAAmB,CAAC,kBAAkB,CAAC,cAAc,CAAC;IAC/D;wGAvHW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAArB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cAFpB,MAAM,EAAA,CAAA;;4FAEP,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAHjC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MCAY,mBAAmB,CAAA;AACtB,IAAA,aAAa,GAAG,MAAM,CAAC,eAAe,CAAC;IAE9B,iCAAiC,GAAG,eAAe;AAC5D,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;AAC9B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE;AAEnC,QAAA,IAAI,CAAC,MAAM;AACT,YAAA,OAAO,SAAS;AAElB,QAAA,OAAO,GAAG,IAAI,CAAC,iCAAiC,CAAA,CAAA,EAAI,MAAM,EAAE;AAC9D,IAAA,CAAC,mDAAC;AAEM,IAAA,cAAc,GAAG,MAAM,CAAsC,EAAE,0DAAC;AACxE,IAAA,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE;AAExC,IAAA,qBAAqB,GAAG,MAAM,CAAC,MAAK;AAC1C,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE;QACtC,IAAI,CAAC,eAAe,EAAE;AACpB,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B;QACF;QAEA,MAAM,kBAAkB,GAAG,YAAY,CAAC,OAAO,CAAC,eAAe,CAAC;QAEhE,IAAI,CAAC,kBAAkB,EAAE;AACvB,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B;QACF;QAEA,MAAM,aAAa,GAAwC,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC;AAEzF,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC;AACxC,IAAA,CAAC,iEAAC;IAEF,gBAAgB,CAAC,OAAe,EAAE,YAAiC,EAAA;AACjE,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE;AACtC,QAAA,IAAI,CAAC,eAAe;AAClB,YAAA,OAAO,KAAK;AAEd,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,YAAY,IAAG;AACxC,YAAA,MAAM,QAAQ,GAAG;AACf,gBAAA,GAAG,YAAY;gBACf,CAAC,OAAO,GAAG;aACZ;AACD,YAAA,YAAY,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AAC/D,YAAA,OAAO,QAAQ;AACjB,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,kBAAkB,CAAC,OAAe,EAAA;AAChC,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE;AACtC,QAAA,IAAI,CAAC,eAAe;AAClB,YAAA,OAAO,KAAK;AAEd,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,YAAY,IAAG;AACxC,YAAA,MAAM,QAAQ,GAAwC,EAAE,GAAG,YAAY,EAAE;AACzE,YAAA,OAAO,QAAQ,CAAC,OAAO,CAAC;AACxB,YAAA,YAAY,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AAC/D,YAAA,OAAO,QAAQ;AACjB,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,IAAI;IACb;wGAjEW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cAFlB,MAAM,EAAA,CAAA;;4FAEP,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MCEY,oBAAoB,CAAA;IAEd,SAAS,GAAG,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;;IAGnE,QAAQ,GAAiC,IAAI,CAAC;AAC5C,UAAE,QAAQ,CACR,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,CAC9B,SAAS,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,EACtC,GAAG,CAAC,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC,CACvC;AAEH,UAAE,MAAM,CAAuB,SAAS,CAAC;IAEnC,oBAAoB,GAAA;AAC1B,QAAA,IAAI,QAAQ,GAAa;AACvB,YAAA,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,MAAM,CAAC,UAAU;YACxB,IAAI,EAAE,MAAM,CAAC;SACd;AAED,QAAA,IAAI,QAAQ,CAAC,KAAK,GAAG,GAAG,EAAE;AACxB,YAAA,QAAQ,CAAC,IAAI,GAAG,OAAO;AACvB,YAAA,OAAO,QAAQ;QACjB;AAEA,QAAA,IAAI,QAAQ,CAAC,KAAK,GAAG,GAAG,EAAE;AACxB,YAAA,QAAQ,CAAC,IAAI,GAAG,QAAQ;AACxB,YAAA,OAAO,QAAQ;QACjB;AAEA,QAAA,OAAO,QAAQ;IACjB;wGAhCW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAApB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,cAFnB,MAAM,EAAA,CAAA;;4FAEP,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAHhC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;ACkBD;;;AAGG;AACH,MAAM,iBAAiB,GAAG,gCAAgC;AAE1D;;;;;;;;AAQG;MAIU,gBAAgB,CAAA;AACV,IAAA,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC;AAC3B,IAAA,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK;;IAG9C,QAAQ,CACJ,MAAiD,EACjD,YAA8B,EAAA;QAE9B,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM;AACrC,QAAA,OAAO,IAAI,CAAC,KAAK,CAAU,MAAM,EAAE,EAAE,IAAI,EAAE,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,YAAY,CAAC;IAC5F;;IAGA,OAAO,CACH,MAAqF,EACrF,YAA8B,EAAA;QAE9B,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM;QACrC,OAAO,IAAI,CAAC,QAAQ,CAAC;AACjB,YAAA,GAAG,MAAM;AACT,YAAA,OAAO,EAAE,OAAO;AAChB,YAAA,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM;AAC5D,YAAA,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO;SAClE,EAAE,YAAY,CAAC;IACpB;;IAGA,IAAI,CACA,MAAoG,EACpG,YAA8B,EAAA;QAE9B,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM;QACrC,OAAO,IAAI,CAAC,QAAQ,CAAC;AACjB,YAAA,GAAG,MAAM;AACT,YAAA,OAAO,EAAE,OAAO;AAChB,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM;SACjE,EAAE,YAAY,CAAC;IACpB;AAEA;;;AAGG;IACH,IAAI,CACA,MAA8C,EAC9C,YAA8B,EAAA;QAE9B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM;QAClC,OAAO,IAAI,CAAC,KAAK,CAAU,MAAM,EAAE,EAAE,IAAI,EAAE,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,YAAY,CAAC;IAClG;AAEA;;;;AAIG;IACH,SAAS,CACL,MAAyE,EACzE,YAA8B,EAAA;QAE9B,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM;QACtD,OAAO,IAAI,CAAC,KAAK,CAAI,MAAM,EAAE,EAAE,IAAI,EAAE,cAAc,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,YAAY,CAAC;IAC3H;AAEA;;;AAGG;IACH,QAAQ,CACJ,MAA0J,EAC1J,YAA8B,EAAA;QAE9B,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM;QACpD,OAAO,IAAI,CAAC,KAAK,CAAI,MAAM,EAAE,EAAE,IAAI,EAAE,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,YAAY,CAAC;IACxH;AAEQ,IAAA,KAAK,CACT,MAA2B,EAC3B,IAAsB,EACtB,YAA8B,EAAA;QAE9B,MAAM,IAAI,GAAiB,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE;AAC9C,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAuC,SAAS,EAAE;AACtE,YAAA,GAAG,YAAY;YACf,IAAI;AACJ,YAAA,QAAQ,EAAE,YAAY,EAAE,QAAQ,IAAI,iBAAiB;AACrD,YAAA,SAAS,EAAE,YAAY,EAAE,SAAS,IAAI,KAAK;SAC9C,CAAC,CAAC,WAAW,EAAE;IACpB;wGA1FS,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cAFf,MAAM,EAAA,CAAA;;4FAEP,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAH5B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MCVY,8BAA8B,CAAA;AACzC,IAAA,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACjD,IAAA,SAAS,GAAG,MAAM,EAAC,YAA+C,EAAC;AACnE,IAAA,IAAI,GAAG,MAAM,CAA8B,eAAe,CAAC;AAClD,IAAA,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK;IACvC,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AACnC,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAK;AAChC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QAChE,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACtF,OAAO,WAAW,IAAI,aAAa;AACrC,IAAA,CAAC,6DAAC;IAEF,qBAAqB,GAAY,SAAS;IAC1C,mBAAmB,GAAY,SAAS;IACxC,aAAa,GAAW,GAAG;AAC3B,IAAA,cAAc,GAAG,MAAM,CAAqB,SAAS,0DAAC;AAEtD,IAAA,oBAAoB,CAAC,MAAuB,EAAA;AAC1C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC;AAChD,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YACtB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI;QAEzC,IAAI,OAAO,KAAK,KAAK,QAAQ;YAC3B,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI;QAEzC,IAAI,KAAK,YAAY,SAAS;AAC5B,YAAA,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI;AAEnE,QAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;AACxB,YAAA,OAAO,CAAC,MAAM,CAAC,IAAI;QAErB,IAAI,cAAc,CAAC,KAAK,CAAC;AACvB,YAAA,OAAO,CAAC,MAAM,CAAC,IAAI;AAErB,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,SAAS,CAAC,KAAa,EAAA;QACrB,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;AAChC,QAAA,IAAI,KAAK,GAAG,CAAC,EAAE;YACb,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AAC/D,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QACxB;IACF;AAEA,IAAA,WAAW,CAAC,KAAa,EAAA;QACvB,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAChC,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YAC3B,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;AAC/D,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QACxB;IACF;AAEA,IAAA,MAAM,CAAC,KAAiC,EAAA;QACtC,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAChC,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,CAAC;AAC9D,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IACxB;AAEA,IAAA,cAAc,CAAC,aAA8B,EAAA;AAC3C,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAG;AAC1B,YAAA,OAAO,KAAK,CAAC,GAAG,CAAC,MAAM,IAAG;AACxB,gBAAA,IAAI,MAAM,CAAC,GAAG,IAAI,aAAa,CAAC,GAAG;oBACjC,OAAO,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE;;AAExC,oBAAA,OAAO,MAAM;AACjB,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;IAEA,UAAU,CAAC,YAA6B,EAAE,KAAa,EAAA;QACrD,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;AACnC,QAAA,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC;QAEnD,IAAI,YAAY,CAAC,GAAG,IAAI,aAAa,EAAE,GAAG,EAAE;YAC1C,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAG;gBACjC,OAAO;AACL,oBAAA,GAAG,CAAC;AACJ,oBAAA,QAAQ,EAAE;iBACX;AACH,YAAA,CAAC,CAAC;AACF,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;YAC5B;QACF;AAEA,QAAA,YAAY,CAAC,IAAI,CAAC,qBAAqB,CAAC;AACxC,QAAA,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC;AACtC,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC;AAElC,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;AAE9B,QAAA,IAAI,CAAC,qBAAqB,GAAG,UAAU,CAAC,MAAK;AAC3C,YAAA,eAAe,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YAClC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAG;gBACjC,OAAO;AACL,oBAAA,GAAG,CAAC;AACJ,oBAAA,QAAQ,EAAE,CAAC,CAAC,GAAG,IAAI,YAAY,CAAC;iBACjC;AACH,YAAA,CAAC,CAAC;AACF,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;AAC5B,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,mBAAmB,GAAG,UAAU,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC;AACrG,QAAA,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC;IACxB;IAEA,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;AAC5E,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;IACxB;IAEA,YAAY,GAAA;QACV,IAAI,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;AAC9D,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;IACxB;wGAjHW,8BAA8B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAA9B,8BAA8B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjC3C,k/EA4CqB,EAAA,MAAA,EAAA,CAAA,8hCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED1BjB,eAAe,2iBACf,cAAc,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,gBAAgB,EAAA,QAAA,EAAA,8DAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,gBAAgB,EAAA,QAAA,EAAA,8DAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,cAAc,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,MAAA,EAAA,kBAAA,EAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAEd,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAL,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,eAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACpB,WAAW,shBACX,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,yBAAA,EAAA,iBAAA,EAAA,0BAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACP,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EALhB,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;4FAUJ,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAlB1C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,6BAA6B,EAAA,OAAA,EAC9B;wBACP,eAAe;wBACf,cAAc;wBACd,gBAAgB;wBAChB,gBAAgB;wBAChB,cAAc;wBACd,aAAa;wBACb,aAAa;wBACb,oBAAoB;wBACpB,WAAW;wBACX,OAAO;wBACP;AACD,qBAAA,EAAA,QAAA,EAAA,k/EAAA,EAAA,MAAA,EAAA,CAAA,8hCAAA,CAAA,EAAA;;;MEGU,kCAAkC,CAAA;;;;AAKpC,IAAA,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK;AAEvC,IAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,mDAAiD;AAC1E,IAAA,OAAO,GAAG,KAAK,CACb,MAAM,CACJ;AACE,QAAA,UAAU,EAAE,CAAC;AACb,QAAA,QAAQ,EAAE,EAAE;AACZ,QAAA,KAAK,EAAE;AACH,KAAA,CACP,mDACF;AACD,IAAA,WAAW,GAAG,KAAK,CACjB,CAAC,CAAI,KAAI;QACP,IAAI,cAAc,CAAC,CAAC,CAAC;YACnB,OAAO,CAAC,CAAC,KAAK;AAEhB,QAAA,MAAM,IAAI,KAAK,CAAC,wFAAwF,CAAC;AAC3G,IAAA,CAAC,uDACF;IACD,WAAW,GAAG,KAAK,CACjB,CAAC,EAAK,EAAE,EAAK,KAAI;AACf,QAAA,IAAI,CAAC,EAAE;AACL,YAAA,OAAO,KAAK;QAEd,IAAI,cAAc,CAAC,EAAE,CAAC,IAAI,cAAc,CAAC,EAAE,CAAC;AAC1C,YAAA,OAAO,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK;AAE7B,QAAA,MAAM,IAAI,KAAK,CAAC,wFAAwF,CAAC;AAC3G,IAAA,CAAC,uDACF;AACD,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,oDAAC;IAChC,sBAAsB,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,wBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;IACxC,WAAW,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAsB;AACzC,IAAA,iBAAiB,GAAG,KAAK,CAAS,EAAE,6DAAC;IACrC,oBAAoB,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,sBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AACtC,IAAA,eAAe,GAAG,KAAK,CAAkB,OAAO,2DAAC;AACjD,IAAA,SAAS,GAAG,KAAK,CAAU,IAAI,qDAAC;AAChC,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,iDAAC;;;IAIzB,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAuB;AACvC,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,oDAAC;IAChC,YAAY,GAAG,MAAM,EAAuB;AAElC,IAAA,QAAQ,GAAG,SAAS,CAAa,cAAc,oDAAC;IAEhD,YAAY,GAAG,MAAM,CAAc,IAAI,WAAW,CAAC,SAAS,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;IAEhE,YAAY,GAAuB,SAAS;IACnC,YAAY,GAAG,GAAG;;AAGlB,IAAA,UAAU,GAAG,MAAM,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC9D,WAAW,GAAG,MAAM,CAAC,kBAAkB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAClG,IAAA,YAAY,GAAG,MAAM,CAAC,KAAK,wDAAC;AACrC,IAAA,SAAS,GAAyC,MAAK,EAAE,CAAC;AAC1D,IAAA,UAAU,GAAe,MAAK,EAAE,CAAC;;AAGtB,IAAA,UAAU,GAAG,MAAM,CAAC,KAAK,sDAAC;;AAE1B,IAAA,iBAAiB,GAAsB;QACxD,YAAY,EAAE,MAAK;AACjB,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO;YACxC,OAAO,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC;QAC3F,CAAC;KACF;AAED,IAAA,WAAA,GAAA;QACE,IAAI,IAAI,CAAC,UAAU;AAAE,YAAA,IAAI,CAAC,UAAU,CAAC,aAAa,GAAG,IAAI;IAC3D;AAEA,IAAA,cAAc,GAAG,MAAM,CAAC,MAAK;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE;;AAGvD,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;YACnB,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC;AACjD,YAAA,IAAI,QAAQ;gBAAE,YAAY,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;;gBACnD,YAAY,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YAC9C;QACF;AAEA,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;AACjF,IAAA,CAAC,0DAAC;IAEF,eAAe,GAAA;;QAEb,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC;IAC3F;;AAIA,IAAA,UAAU,CAAC,KAAiC,EAAA;AAC1C,QAAA,IAAI,CAAC,YAAY,EAAE,CAAC,QAAQ,CAAC,KAAK,IAAI,SAAS,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACxE;AAEA,IAAA,gBAAgB,CAAC,EAAwC,EAAA;AACvD,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;IACtB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC;IACnC;IAEA,YAAY,GAAG,UAAU,CAAuB;QAC9C,MAAM,EAAE,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE;AAC9B,QAAA,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAI;AACrB,YAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,QAAQ,EAAE;AACzC,YAAA,OAAO,iBAAiB,CAAC,MAAM,CAAC;QAClC,CAAC;QACD,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE;AACpC,KAAA,CAAC;AAEQ,IAAA,OAAO,GAAG,MAAM,CAAM,EAAE,mDAAC;AAEnC,IAAA,UAAU,GAAG,MAAM,CAAC,MAAK;QACvB,MAAM,gBAAgB,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;QAClD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU;AAE9C,QAAA,IAAI,CAAC,gBAAgB;YACnB;QAEF,IAAI,UAAU,GAAG,CAAC;YAChB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAa,KAAK,CAAC,GAAG,QAAQ,EAAE,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;;YAEhF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,CAAC;AAC5C,IAAA,CAAC,sDAAC;AACF;;;;;;AAMK;AAEK,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAK;AAC9B,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;AAC3B,YAAA,OAAO,CAAC;QAEV,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;QACvC,OAAO,KAAK,CAAC,KAAK;AACpB,IAAA,CAAC,iDAAC;IAEF,WAAW,GAAA;;AAET,QAAA,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS;AACjC,YAAA,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;IACnC;AAEU,IAAA,YAAY,CAAC,IAAa,EAAA;AAClC,QAAA,IAAI,CAAC,IAAI;YACP,IAAI,CAAC,UAAU,EAAE;AAEnB,QAAA,IAAI,CAAC,IAAI;YACP;AAEF,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAEhC,QAAA,IAAI,CAAC,QAAQ;YACX;AAEF,QAAA,UAAU,CAAC,MAAK,EAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACvD;IAEU,UAAU,GAAA;AAClB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAEhC,QAAA,IAAI,CAAC,QAAQ;YACX;AAEF,QAAA,QAAQ,CAAC,aAAa,CAAC,KAAK,GAAG,EAAE;QACjC,IAAI,CAAC,aAAa,EAAE;AACpB,QAAA,UAAU,CAAC,MAAK,EAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACvD;IAEU,aAAa,GAAA;AACrB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAEhC,QAAA,IAAI,CAAC,QAAQ;YACX;AAEF,QAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK;AAE1C,QAAA,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS;AACjC,YAAA,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;AAEjC,QAAA,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,MAAK;YAClC,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,KAAQ,KAAI;AACjC,gBAAA,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE;AAClD,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC;IACvB;IAEU,sBAAsB,GAAA;AAC9B,QAAA,MAAM,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,EAAE;AACxD,QAAA,IAAI,oBAAoB;AACtB,YAAA,OAAO,oBAAoB,CAAC,WAAW,EAAE;AAE3C,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE;AACtC,QAAA,IAAI,WAAW;AACb,YAAA,OAAO,WAAW,CAAC,WAAW,EAAE;AAElC,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,EAAE;AAClD,QAAA,OAAO,iBAAiB,CAAC,WAAW,EAAE;IACxC;AAEU,IAAA,cAAc,CAAC,KAA2C,EAAA;AAClE,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;IACrC;IAEU,sBAAsB,GAAA;AAC9B,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE;QAExC,IAAI,CAAC,YAAY,CAAC,KAAK;AACrB,YAAA,OAAO,EAAE;AAEX,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC;YACnC,OAAO,YAAY,CAAC,KAAK;AAE3B,QAAA,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC;IAC7B;;IAEU,WAAW,GAAA;QACnB,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,KAAQ,KAAI;YACjC,OAAO;AACL,gBAAA,GAAG,KAAK;AACR,gBAAA,UAAU,EAAE,KAAK,CAAC,UAAU,GAAG;aAChC;AACH,QAAA,CAAC,CAAC;IACJ;wGAnPW,kCAAkC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAlC,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kCAAkC,yqEChC/C,8jGAwEiB,EAAA,MAAA,EAAA,CAAA,g1BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDpDb,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAN,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,2BAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,YAAA,EAAA,0BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,cAAc,iYACd,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAK,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,YAAY,8BACZ,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,aAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAKX,kCAAkC,EAAA,UAAA,EAAA,CAAA;kBAf9C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iCAAiC,EAAA,OAAA,EAClC;wBACP,aAAa;wBACb,kBAAkB;wBAClB,eAAe;wBACf,cAAc;wBACd,mBAAmB;wBACnB,eAAe;wBACf,YAAY;wBACZ;AACD,qBAAA,EAAA,QAAA,EAAA,8jGAAA,EAAA,MAAA,EAAA,CAAA,g1BAAA,CAAA,EAAA;4jDAuD0C,cAAc,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MEvD9C,yBAAyB,CAAA;;;;AAK3B,IAAA,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK;AAEvC,IAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,kDAAO;AAC/B,IAAA,WAAW,GAAG,KAAK,CACjB,CAAC,MAAS,KAAI;QACZ,IAAI,cAAc,CAAC,MAAM,CAAC;YACxB,OAAO,MAAM,CAAC,KAAK;AAErB,QAAA,MAAM,IAAI,KAAK,CAAC,wFAAwF,CAAC;AAC3G,IAAA,CAAC,uDACF;AACD,IAAA,WAAW,GAAG,KAAK,CACjB,CAAC,MAAS,KAAI;QACZ,IAAI,cAAc,CAAC,MAAM,CAAC;YACxB,OAAO,MAAM,CAAC,KAAK;AAErB,QAAA,MAAM,IAAI,KAAK,CAAC,wFAAwF,CAAC;AAC3G,IAAA,CAAC,uDACF;AACD,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,oDAAC;IAChC,sBAAsB,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,wBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;IACxC,WAAW,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAsB;AACzC,IAAA,iBAAiB,GAAG,KAAK,CAAS,EAAE,6DAAC;IACrC,oBAAoB,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,sBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AACtC,IAAA,eAAe,GAAG,KAAK,CAAkB,OAAO,2DAAC;AACjD,IAAA,SAAS,GAAG,KAAK,CAAU,IAAI,qDAAC;AAChC,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,iDAAC;;;IAIzB,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAiC;AACjD,IAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,oDAAC;IAChC,YAAY,GAAG,MAAM,EAAiC;AAE5C,IAAA,QAAQ,GAAG,SAAS,CAAa,cAAc,oDAAC;IAEhD,YAAY,GAAG,MAAM,CAAc,IAAI,WAAW,CAAC,SAAS,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;;AAGvD,IAAA,UAAU,GAAG,MAAM,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC9D,WAAW,GAAG,MAAM,CAAC,kBAAkB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAClG,IAAA,YAAY,GAAG,MAAM,CAAC,KAAK,wDAAC;AACrC,IAAA,SAAS,GAAmD,MAAK,EAAE,CAAC;AACpE,IAAA,UAAU,GAAe,MAAK,EAAE,CAAC;;AAGtB,IAAA,UAAU,GAAG,MAAM,CAAC,KAAK,sDAAC;;AAE1B,IAAA,iBAAiB,GAAsB;QACxD,YAAY,EAAE,MAAK;AACjB,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO;YACxC,OAAO,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC;QAC3F,CAAC;KACF;AAED,IAAA,WAAA,GAAA;QACE,IAAI,IAAI,CAAC,UAAU;AAAE,YAAA,IAAI,CAAC,UAAU,CAAC,aAAa,GAAG,IAAI;IAC3D;AAEA,IAAA,cAAc,GAAG,MAAM,CAAC,MAAK;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE;;AAGvD,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;YACnB,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC;AACjD,YAAA,IAAI,QAAQ;gBAAE,YAAY,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;;gBACnD,YAAY,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YAC9C;QACF;AAEA,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;AACjF,IAAA,CAAC,0DAAC;IAEF,eAAe,GAAA;;QAEb,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC;IAC3F;;AAIA,IAAA,UAAU,CAAC,KAA2C,EAAA;AACpD,QAAA,IAAI,CAAC,YAAY,EAAE,CAAC,QAAQ,CAAC,KAAK,IAAI,SAAS,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACxE;AAEA,IAAA,gBAAgB,CAAC,EAAkD,EAAA;AACjE,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;IACtB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC;IACnC;AAEU,IAAA,YAAY,CAAC,IAAa,EAAA;AAClC,QAAA,IAAI,CAAC,IAAI;YACP,IAAI,CAAC,UAAU,EAAE;AAEnB;AACsB;AACtB,QAAA,IAAI,CAAC,IAAI;YACP;AAEF,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAEhC,QAAA,IAAI,CAAC,QAAQ;YACX;AAEF,QAAA,UAAU,CAAC,MAAK,EAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACvD;IAEU,UAAU,GAAA;AAClB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAEhC,QAAA,IAAI,CAAC,QAAQ;YACX;AAEF,QAAA,QAAQ,CAAC,aAAa,CAAC,KAAK,GAAG,EAAE;QACjC,UAAU,CAAC,MAAK;AACd,YAAA,QAAQ,CAAC,aAAa,CAAC,KAAK,EAAE;AAChC,QAAA,CAAC,CAAC;IACJ;IAEU,sBAAsB,GAAA;AAC9B,QAAA,MAAM,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,EAAE;AACxD,QAAA,IAAI,oBAAoB;AACtB,YAAA,OAAO,oBAAoB,CAAC,WAAW,EAAE;AAE3C,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE;AACtC,QAAA,IAAI,WAAW;AACb,YAAA,OAAO,WAAW,CAAC,WAAW,EAAE;AAElC,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,EAAE;AAClD,QAAA,OAAO,iBAAiB,CAAC,WAAW,EAAE;IACxC;AAEU,IAAA,UAAU,CAAC,MAAS,EAAA;AAC5B,QAAA,MAAM,KAAK,GAAW,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC;AACxC,QAAA,OAAO,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC;IACxC;AAEU,IAAA,cAAc,CAAC,KAAqD,EAAA;AAC5E,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;IACrC;IAEU,eAAe,GAAA;AACvB,QAAA,MAAM,KAAK,GAAW,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,KAAK,IAAI,EAAE;AACjE,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE;AACtC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,MAAM,KAAI;AAC/C,YAAA,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC;AACjC,YAAA,OAAO,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC;AACxC,QAAA,CAAC,CAAC;QACF,OAAO,OAAO,CAAC,MAAM;IACvB;wGAnKW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAzB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,sBAAA,EAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,cAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5BtC,03DAmDiB,EAAA,MAAA,EAAA,CAAA,uuBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDlCb,aAAa,qLACb,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAJ,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,2BAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,YAAA,EAAA,0BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,eAAe,qNACf,YAAY,EAAA,CAAA,EAAA,CAAA;;4FAKH,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAdrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,EAAA,OAAA,EACxB;wBACP,aAAa;wBACb,kBAAkB;wBAClB,eAAe;wBACf,cAAc;wBACd,mBAAmB;wBACnB,eAAe;wBACf;AACD,qBAAA,EAAA,QAAA,EAAA,03DAAA,EAAA,MAAA,EAAA,CAAA,uuBAAA,CAAA,EAAA;49CA2C0C,cAAc,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MEpC9C,2BAA2B,CAAA;AACtC,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,+CAAa;AAClC,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,iDAA2B;IAClD,YAAY,GAAG,MAAM,EAAU;AAEtB,IAAA,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK;IACvC,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,IAAI,SAAS,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;IAChG,oBAAoB,GAAG,uBAAuB;AAE9C,IAAA,mBAAmB,GAAG,QAAQ,CAAiC,OAAO;QACpE,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,MAAM;QAClD,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,SAAS;QACtD,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,WAAW;QACvD,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,eAAe;QAC5D,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,QAAQ;QACpD,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,YAAY;QACzD,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC;AAChD,KAAA,CAAC,+DAAC;IAEO,uCAAuC,GAAG,MAAM,CACxD;AACE,QAAA,UAAU,EAAE,CAAC;AACb,QAAA,QAAQ,EAAE,EAAE;AACZ,QAAA,KAAK,EAAE;AACR,KAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,yCAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACF;IAED,SAAS,GAAA;QACP,OAAQ,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,CAAkB,CAAC,KAAK;IACtD;IAEA,MAAM,GAAA;QACJ,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,CAAiB;IAC/C;IAEA,WAAW,GAAA;QACT,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,UAAU,CAAiB;IACpD;IAEA,QAAQ,GAAA;QACN,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,OAAO,CAAiB;IACjD;AAEA,IAAA,iBAAiB,CAAC,KAAc,EAAA;AAC9B,QAAA,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC;IAC3D;AAEA,IAAA,kBAAkB,CAAC,KAAc,EAAA;QAC/B,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;AAEpD,QAAA,IAAI,CAAC,cAAc,IAAI,CAAC,cAAc,CAAC,UAAU;AAC/C,YAAA,OAAO,EAAE;QAEX,OAAO,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC,UAAU,CAAC;IAC7D;AAEA,IAAA,aAAa,CAAC,KAAc,EAAA;QAC1B,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;QACpD,OAAO,cAAc,EAAE,UAAU;IACnC;AAEA,IAAA,WAAW,CAAC,CAAqB,EAAA;QAC/B,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;QACjC,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;IAChC;IAEA,cAAc,GAAG,CAAC,MAA+B,KAAa,MAAM,CAAC,KAAK;IAC1E,cAAc,GAAG,CAAC,MAA+B,KAAa,MAAM,CAAC,GAAa;AAElF,IAAA,mBAAmB,GAAG,CAAC,cAA8B,KAAa,IAAI,CAAC,mBAAmB,EAAE,CAAC,cAAc,CAAC;AAC5G,IAAA,mBAAmB,GAAG,CAAC,cAA8B,KAAa,cAAc;wGAtErE,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAA3B,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC/BxC,09FAyEA,EAAA,MAAA,EAAA,CAAA,6QAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDxDI,eAAe,qNACf,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,kBAAkB,ghBAClB,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,mBAAmB,ogBACnB,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,yBAAyB,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,sBAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,OAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACzB,kCAAkC,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,sBAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,OAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAKzB,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAjBvC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,0BAA0B,EAAA,OAAA,EAC3B;wBACP,eAAe;wBACf,aAAa;wBACb,mBAAmB;wBACnB,kBAAkB;wBAClB,cAAc;wBACd,eAAe;wBACf,mBAAmB;wBACnB,gBAAgB;wBAChB,yBAAyB;wBACzB;AACD,qBAAA,EAAA,QAAA,EAAA,09FAAA,EAAA,MAAA,EAAA,CAAA,6QAAA,CAAA,EAAA;;;MEMU,4BAA4B,CAAA;AACvC,IAAA,UAAU,GAAG,KAAK,CAAC,QAAQ,qDAAW;AACtC,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,gDAAa;AACnC,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,iDAA2B;IAClD,QAAQ,GAAG,MAAM,EAAU;IAC3B,SAAS,GAAG,MAAM,EAAU;IAC5B,WAAW,GAAG,MAAM,EAAU;IAC9B,YAAY,GAAG,MAAM,EAAU;AAEd,IAAA,oBAAoB,GAAG,MAAM,CAAC,oBAAoB,CAAC;AAC3D,IAAA,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK;AACvC,IAAA,SAAS,GAAG,QAAQ,CAAU,MAAM,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,EAAE,IAAI,IAAI,YAAY,qDAAC;AAE/F,IAAA,sBAAsB,GAAG,QAAQ,CAAiB,MAAM;AACtD,QAAA,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE;AACzD,QAAA,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,eAAe,CAAC,EAAE;AACtD,KAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,wBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AAEF,IAAA,iBAAiB,CAAC,KAAsB,EAAA;AACtC,QAAA,OAAO,mBAAmB,CAAC,iBAAiB,CAAC,KAAK,CAAC;IACrD;IAEA,YAAY,GAAA;QACV,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,WAAW,CAAiB;IACtD;IAEA,UAAU,GAAA;QACR,OAAQ,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,IAAI,CAAkB,CAAC,KAAK;IACvD;IAEA,UAAU,GAAA;QACR,OAAQ,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,SAAS,CAAe,CAAC,QAAuB;IAC3E;wGAhCW,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAA5B,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAAA,WAAA,EAAA,WAAA,EAAA,aAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjCzC,otFA8EM,EAAA,MAAA,EAAA,CAAA,2oBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED7CO,4BAA4B,mLAdrC,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,mBAAmB,+BACnB,2BAA2B,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAC3B,qBAAqB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,UAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,8BAAA,EAAA,gCAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,eAAA,EAAA,YAAA,EAAA,SAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACrB,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAKP,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAjBxC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,2BAA2B,EAAA,OAAA,EAC5B;wBACP,eAAe;wBACf,aAAa;wBACb,mBAAmB;wBACnB,kBAAkB;wBAClB,cAAc;wBACd,eAAe;wBACf,mBAAmB;wBACnB,2BAA2B;wBAC3B,qBAAqB;wBACrB;AACD,qBAAA,EAAA,QAAA,EAAA,otFAAA,EAAA,MAAA,EAAA,CAAA,2oBAAA,CAAA,EAAA;;;MEOU,gCAAgC,CAAA;AAC1B,IAAA,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC;AACxB,IAAA,qBAAqB,GAAG,MAAM,CAAC,qBAAqB,CAAC;AACtE,IAAA,SAAS,GAAG,MAAM,EAAC,YAAiD,EAAC;AACrE,IAAA,IAAI,GAAG,MAAM,CAAiC,eAAe,CAAC;AACrD,IAAA,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK;AAEvC,IAAA,KAAK,GAAG,MAAM,CAAC,EAAE,iDAAC;AAElB,IAAA,IAAI,GAAG,mBAAmB,CAAC,oBAAoB,CAAI,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;IACrF,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;AAE9C,IAAA,6BAA6B,GAAG,MAAM,CAAC,MAAK;AAC1C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE;AAEjC,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACrB,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB;QACF;QAEA,MAAM,cAAc,GAAG,mBAAmB,CAAC,uBAAuB,CAAI,IAAI,CAAC,IAAI,CAAC;QAChF,MAAM,WAAW,GAAG,mBAAmB,CAAC,oBAAoB,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;AAC3H,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC;AAC7B,IAAA,CAAC,yEAAC;IAEF,YAAY,GAAA;AACV,QAAA,OAAQ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAe,CAAC,QAAQ,CAAC,CAAC,CAAc;IACxE;AAEA,IAAA,QAAQ,CAAC,OAAe,EAAA;AACtB,QAAA,MAAM,QAAQ,GAAmB;YAC/B,EAAE,EAAEG,EAAM,EAAE;AACZ,YAAA,SAAS,EAAE,KAAK;AAChB,YAAA,OAAO,EAAE;AACP,gBAAA,EAAE,EAAE,EAAEA,EAAM,EAAE;AACf;SACF;AACD,QAAA,mBAAmB,CAAC,eAAe,CAAI,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC;IAC/E;AAEA,IAAA,SAAS,CAAC,OAAe,EAAA;QACvB,MAAM,OAAO,GAAkB,EAAE,EAAE,EAAEA,EAAM,EAAE,EAAE;AAC/C,QAAA,mBAAmB,CAAC,cAAc,CAAI,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC;IAC7E;AAEA,IAAA,WAAW,CAAC,OAAe,EAAA;QACzB,mBAAmB,CAAC,WAAW,CAAI,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC;IACxD;AAEA,IAAA,YAAY,CAAC,MAAc,EAAA;QACzB,mBAAmB,CAAC,UAAU,CAAI,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC;IACtD;AAEA,IAAA,QAAQ,CAAC,QAAkB,EAAA;QACzB,MAAM,cAAc,GAAG,mBAAmB,CAAC,uBAAuB,CAAI,IAAI,CAAC,IAAI,CAAC;QAChF,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO;QACxC,IAAI,CAAC,qBAAqB,CAAC,kBAAkB,CAAC,OAAO,EAAE,cAAc,CAAC;QACtE,QAAQ,QAAQ;AACd,YAAA,KAAK,MAAM;AACT,gBAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;gBACtB;AACF,YAAA,KAAK,gBAAgB;AACnB,gBAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,cAAc,CAAC;gBACpC;;IAEN;wGAjEW,gCAAgC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAhC,gCAAgC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,+BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpC7C,45DAwCO,EAAA,MAAA,EAAA,CAAA,6ZAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDnBH,cAAc,+HACd,gBAAgB,EAAA,QAAA,EAAA,8DAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,gBAAgB,EAAA,QAAA,EAAA,8DAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,cAAc,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,MAAA,EAAA,kBAAA,EAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAEd,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAL,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,4EAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,kBAAkB,ueAClB,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,4BAA4B,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,OAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,WAAA,EAAA,aAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAN5B,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;4FAWJ,gCAAgC,EAAA,UAAA,EAAA,CAAA;kBAlB5C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,+BAA+B,EAAA,OAAA,EAChC;wBACP,cAAc;wBACd,gBAAgB;wBAChB,gBAAgB;wBAChB,cAAc;wBACd,aAAa;wBACb,eAAe;wBACf,aAAa;wBACb,mBAAmB;wBACnB,kBAAkB;wBAClB,cAAc;wBACd;AACD,qBAAA,EAAA,QAAA,EAAA,45DAAA,EAAA,MAAA,EAAA,CAAA,6ZAAA,CAAA,EAAA;;;MEyCU,iBAAiB,CAAA;AAEX,IAAA,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACjD,IAAA,qBAAqB,GAAG,MAAM,CAAC,qBAAqB,CAAC;AACrD,IAAA,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC;AAC1B,IAAA,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACxC,IAAA,oBAAoB,GAAG,MAAM,CAAC,oBAAoB,CAAC;;;;AAK3D,IAAA,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK;AAE7B,IAAA,SAAS,GAAG,QAAQ,CAAU,MAAM,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,EAAE,IAAI,IAAI,YAAY,qDAAC;AAEzG,IAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,mDAAiD;AAC1E,IAAA,OAAO,GAAG,KAAK,CACb,MAAM,CACJ;AACE,QAAA,UAAU,EAAE,CAAC;AACb,QAAA,QAAQ,EAAE,EAAE;AACZ,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,MAAM,EAAE,SAAS;AACjB,QAAA,mBAAmB,EAAE,SAAS;AAC9B,QAAA,gBAAgB,EAAE;AACd,KAAA,CACP,mDACF;AAED,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,iDAA2C;IAExD,WAAW,GAAG,MAAM,EAAQ;IAC5B,WAAW,GAAG,MAAM,EAAK;IACzB,WAAW,GAAG,MAAM,EAAK;IACzB,cAAc,GAAG,MAAM,EAA0B;IACjD,kBAAkB,GAAG,MAAM,EAAY;IACvC,oBAAoB,GAAG,MAAM,EAA2B;IAG/C,eAAe,GAAG,QAAQ;IAC1B,mBAAmB,GAAG,eAAe;IACrC,sBAAsB,GAAG,QAAQ;IACjC,wBAAwB,GAAG,oBAAoB;IAC/C,YAAY,GAAG,GAAG;IACrC,YAAY,GAAG,UAAU,CAAuB;QAC9C,MAAM,EAAE,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE;AAC9B,QAAA,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAI;AACrB,YAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,QAAQ,EAAE;AACzC,YAAA,OAAO,iBAAiB,CAAC,MAAM,CAAC;QAClC,CAAC;QACD,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE;AACpC,KAAA,CAAC;AACQ,IAAA,IAAI,GAAG,QAAQ,CAAC,MAAK;AAC7B,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;AAC3B,YAAA,OAAO,EAAE;QAEX,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;QACvC,OAAO,KAAK,CAAC,KAAK;AACpB,IAAA,CAAC,gDAAC;AACQ,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAK;AAC9B,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;AAC3B,YAAA,OAAO,CAAC;QAEV,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;QACvC,OAAO,KAAK,CAAC,KAAK;AACpB,IAAA,CAAC,iDAAC;AAEQ,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;QACrC,MAAM,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAC,aAAa,EAAE;AAC9D,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;QACnC,MAAM,YAAY,GAAkC,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC;QACtF,MAAM,mBAAmB,GAAsB,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAG;YAC9E,OAAO;gBACL,GAAG,EAAE,MAAM,CAAC,GAAG;AACf,gBAAA,IAAI,EAAE,IAAI;AACV,gBAAA,QAAQ,EAAE,WAAW,CAAC,mBAAmB,IAAI,MAAM,CAAC;aACrD;AACH,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,YAAY;AACf,YAAA,OAAO,mBAAmB;;AAG5B,QAAA,MAAM,eAAe,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;;QAG9G,MAAM,YAAY,GAAG,mBAAmB,CAAC,MAAM,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;AAE1H,QAAA,OAAO,CAAC,GAAG,eAAe,EAAE,GAAG,YAAY,CAAC;AAC9C,IAAA,CAAC,wDAAC;IAEQ,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AAEhF,IAAA,IAAI,GAAG,QAAQ,CAAC,MAAK;AAC7B,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;AACnC,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE;AAExC,QAAA,IAAI,IAAI,GAAyB,CAAC,GAAG,YAAY;aAC9C,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI;aAC5B,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG,CAAC;QAE5B,IAAI,CAAC,WAAW,CAAC,WAAW,IAAI,IAAI,IAAI;aACrC,CAAC,WAAW,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,mBAAmB;AACnD,mBAAA,WAAW,CAAC;oBACX,WAAW,CAAC,UAAU,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;AAC5D,mBAAA,WAAW,CAAC,gBAAgB,CAAC,EAClC;YACA,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,mBAAmB,CAAC;QAC5C;QAEA,IAAI,WAAW,CAAC,kBAAkB;YAChC,IAAI,GAAG,CAAC,IAAI,CAAC,wBAAwB,EAAE,GAAG,IAAI,CAAC;AAEjD,QAAA,OAAO,IAAI;AACb,IAAA,CAAC,gDAAC;AACQ,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA,EAAG,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAA,CAAE,CAAC,0DAAC;AAC7G,IAAA,qBAAqB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA,EAAG,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAA,CAAE,CAAC,iEAAC;AAC3H,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;AACvC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;QACnC,OAAO,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,mBAAmB;AACvG,IAAA,CAAC,0DAAC;AACQ,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,6DAAC;AAClF,IAAA,sBAAsB,GAAG,QAAQ,CAAC,MAAK;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO;AACvC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;QACxB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,gBAAgB,CAAC;AACtF,IAAA,CAAC,kEAAC;AACQ,IAAA,sBAAsB,GAAG,QAAQ,CAAC,MAAK;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO;AACvC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;;;AAGxB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,IAAG;AACrB,YAAA,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC;YACxD,OAAO,MAAM,EAAE,gBAAgB,IAAI,CAAC,CAAC,MAAM,CAAC,eAAe;AAC7D,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC,kEAAC;IAEQ,YAAY,GAAuB,SAAS;IAE5C,aAAa,GAAqC,EAAE;AAEpD,IAAA,eAAe,GAAgC,QAAQ,CAAC,MAAK;QACrE,MAAM,wBAAwB,GAAG,IAAI,CAAC,qBAAqB,CAAC,eAAe,EAAE;QAC7E,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO;;AAEvC,QAAA,OAAO,wBAAwB,CAAC,OAAO,CAAC,IAAI,EAAE;AAChD,IAAA,CAAC,2DAAC;IAEiB,mBAAmB,GAAG,gBAAgB;AAC/C,IAAA,YAAY,GAAG,MAAM,CAAW,IAAI,wDAAC;AAErC,IAAA,SAAS,GAAG,MAAM,CAAM,EAAE,qDAAC;AAE3B,IAAA,YAAY,GAAG,MAAM,CAAC,KAAK,wDAAC;AACrB,IAAA,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;AACzB,IAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC3C,IAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC5D,IAAA,oBAAoB,GAAG,SAAS,CAAmB,cAAc,gEAAC;AAC1D,IAAA,UAAU;AACV,IAAA,MAAM;IAEJ,uCAAuC,GAAG,MAAM,CACxD;AACE,QAAA,UAAU,EAAE,CAAC;AACb,QAAA,QAAQ,EAAE,EAAE;AACZ,QAAA,KAAK,EAAE;AACR,KAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,yCAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACF;IAGD,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,gBAAgB,EAAE;YAC5C,IAAI,CAAC,cAAc,EAAE;IACzB;IAEA,WAAW,GAAA;;AAET,QAAA,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS;AACjC,YAAA,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;;AAGjC,QAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;YAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAc,CAAC;YAClD,YAAY,CAAC,OAAO,CAAC;AACvB,QAAA,CAAC,CAAC;IACJ;IAEQ,qBAAqB,CAAC,cAA+B,EAAE,UAA6B,EAAA;AAC1F,QAAA,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,IAAI,cAAc,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC;IACpE;AAEU,IAAA,cAAc,GAAG,CAAC,SAA2B,KAAa,SAAmB;AAE7E,IAAA,YAAY,CAAC,KAAgB,EAAA;QACrC,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,KAAK,IAAG;YAC5B,OAAO;AACL,gBAAA,GAAG,KAAK;AACR,gBAAA,UAAU,EAAE,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,SAAS,GAAG,CAAC,GAAG,CAAC;gBACtE,QAAQ,EAAE,KAAK,CAAC;aACjB;AACH,QAAA,CAAC,CAAC;IACJ;AAEU,IAAA,aAAa,CAAC,YAA8B,EAAA;AACpD,QAAA,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK;AAEhC,QAAA,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS;AACjC,YAAA,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;AAEjC,QAAA,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,MAAK;YAClC,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,KAAQ,KAAI;AACjC,gBAAA,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE;AAClD,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC;IACvB;AAEU,IAAA,YAAY,CAAC,YAA8B,EAAA;AACnD,QAAA,YAAY,CAAC,KAAK,GAAG,EAAE;AACvB,QAAA,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC;IAClC;AAEU,IAAA,YAAY,CAAC,IAAU,EAAA;QAC/B,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,KAAK,IAAG;YAC5B,OAAO;AACL,gBAAA,GAAG,KAAK;AACR,gBAAA,UAAU,EAAE,CAAC;gBACb,MAAM,EAAE,IAAI,CAAC,SAAS,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG;aAC5E;AACH,QAAA,CAAC,CAAC;IACJ;IAEU,UAAU,GAAA;AAClB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;IACzB;IAEU,aAAa,CAAC,GAAM,EAAE,KAAY,EAAA;AAC1C,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC;QAC1B,KAAK,CAAC,eAAe,EAAE;IACzB;AAEU,IAAA,UAAU,CAAC,GAAM,EAAA;AACzB,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;AACxB,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC;IAC9B;AAEU,IAAA,YAAY,CAAC,GAAM,EAAA;AAC3B,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAClB,eAAA,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;gBACf,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,GAAG,GAAG,CAAC;AACrE,eAAA,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,QAAQ,GAAG,GAAG,CAAC;IAC/C;IAEU,aAAa,CAAC,GAAM,EAAE,KAAY,EAAA;QAC1C,KAAK,CAAC,eAAe,EAAE;AAEvB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,QAAA,MAAM,MAAM,GAAG;AACb,YAAA,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,EAAE,KAAK,GAAG,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,kBAAkB;AACpF,YAAA,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,aAAa;AACtC,YAAA,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM;AAC/B,YAAA,WAAW,EAAE,IAAI;SAClB;AACD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,EAAE,WAAW,IAAI;QAC/D,MAAM,QAAQ,GAAG;AACf,cAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,EAAE;AACxE,cAAE,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,EAAE,IAAI,GAAG,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC;AAEnI,QAAA,QAAQ,CAAC,SAAS,CAAC,OAAO,IAAG;YAC3B,IAAI,OAAO,KAAK,IAAI;AAClB,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC;AAC9B,QAAA,CAAC,CAAC;IACJ;AAEU,IAAA,gBAAgB,CAAC,GAAM,EAAE,SAA4B,EAAE,KAAY,EAAA;AAC3E,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QACxD,KAAK,CAAC,eAAe,EAAE;IACzB;IAEU,wBAAwB,CAAC,MAA+B,EAAE,KAAY,EAAA;AAC9E,QAAA,MAAM,KAAK,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK;;AAGtD,QAAA,IAAI,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,aAAa;YAClC,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAE9C,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,MAAK;YAC/C,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC;AAC9C,QAAA,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC;IACvB;IAEU,mCAAmC,CAAC,MAA+B,EAAE,MAAsC,EAAA;QACnH,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC;IAC/C;IAEU,0BAA0B,CAAC,MAA+B,EAAE,KAAyB,EAAA;QAC7F,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC;IAC9C;IAEU,kBAAkB,CAAC,MAA+B,EAAE,KAA2B,EAAA;QACvF,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC;IAC9C;IAEU,uBAAuB,CAAC,MAA+B,EAAE,KAA6C,EAAA;QAC9G,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC;IAC9C;IAEQ,oBAAoB,CAAC,SAAkB,EAAE,KAAkB,EAAA;QACjE,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,YAAY,IAAG;;AAEnC,YAAA,MAAM,mBAAmB,GAA0C;AACjE,gBAAA,IAAI,YAAY,CAAC,mBAAmB,IAAI,EAAE,CAAC;gBAC3C,CAAC,SAAS,GAAG;aACd;YACD,OAAO;AACL,gBAAA,GAAG,YAAY;AACf,gBAAA,UAAU,EAAE,CAAC;AACb,gBAAA,mBAAmB,EAAE;aACtB;AACH,QAAA,CAAC,CAAC;IACJ;AAEU,IAAA,sBAAsB,CAAC,GAAY,EAAA;QAC3C,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,mBAAmB,GAAG,GAAG,CAAC;IACpD;AAEU,IAAA,+CAA+C,CAAC,GAAY,EAAA;QACpE,MAAM,KAAK,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC;QAE9C,IAAI,cAAc,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;AACxF,YAAA,OAAO,KAAK;AAEd,QAAA,OAAO,SAAS;IAClB;AAEU,IAAA,sCAAsC,CAAC,GAAY,EAAA;QAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC;QAE9C,IAAI,OAAO,KAAK,KAAK,QAAQ,KAAK,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;AAChG,YAAA,OAAO,KAAK;AAEd,QAAA,OAAO,SAAS;IAClB;IAEU,+BAA+B,CAAC,GAAY,EAAE,IAAqB,EAAA;QAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAoC;AAEjF,QAAA,IAAI,CAAC,KAAK;AACR,YAAA,OAAO,IAAI;AAEb,QAAA,OAAO,IAAI,IAAI,OAAO,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG;IAClD;IAEU,aAAa,GAAA;AACrB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;AAC9B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE;AAChC,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE;QAExC,MAAM,YAAY,GAAG,MAAM,CAAC,WAAW,CACrC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAC9B;AAE5B,QAAA,MAAM,IAAI,GAAgC;YACxC,OAAO,EAAE,MAAM,CAAC,OAAO;AACvB,YAAA,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE;AACzB,YAAA,OAAO,EAAE,YAAY;AACrB,YAAA,YAAY,EAAE,OAAO,CAAC,mBAAmB,IAAI,EAAE;AAC/C,YAAA,aAAa,EAAE;SAChB;AACD,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAClE;IAEU,gBAAgB,CAAC,KAAU,EAAE,KAAiC,EAAA;AACtE,QAAA,IAAI,CAAC,KAAK;AACR,YAAA,OAAO,KAAK;AAEd,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,CAAC;AAEzD,QAAA,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC;IACnF;IAGU,yBAAyB,GAAA;AACjC,QAAA,MAAM,IAAI,GAAmC;AAC3C,YAAA,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE;AACvB,YAAA,cAAc,EAAE;AACd,gBAAA,IAAI,EAAE,EAAE;AACR,gBAAA,MAAM,EAAE;AACN,oBAAA;wBACE,EAAE,EAAEK,EAAM,EAAE;AACZ,wBAAA,SAAS,EAAE,KAAK;wBAChB,OAAO,EAAE,CAAC,EAAE,EAAE,EAAEA,EAAM,EAAE,EAAE;AAC3B;AACF;AACF;SACF;AACD,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAEpF,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC,cAAkC,KAAI;AACvE,YAAA,IAAI,cAAc;AAChB,gBAAA,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC;AAC7C,QAAA,CAAC,CAAC;IACJ;AAEU,IAAA,oBAAoB,CAAC,cAAkC,EAAA;QAC/D,MAAM,gBAAgB,GAAuB,cAAc,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE;QAC3E,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,YAAY,IAAG;YACnC,OAAO;AACL,gBAAA,GAAG,YAAY;AACf,gBAAA,gBAAgB,EAAE,gBAAgB;AAClC,gBAAA,UAAU,EAAE;aACb;AACH,QAAA,CAAC,CAAC;IACJ;AAEU,IAAA,8BAA8B,CAAC,KAAY,EAAA;QACnD,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,gBAAgB;AAC1D,QAAA,IAAI,CAAC,gBAAgB;YACnB;QAEF,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO;AACvC,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,OAAO,EAAE,gBAAgB,EAAE,KAAK,CAAC;AAEzG,QAAA,IAAI,CAAC,cAAc;YACjB;AAEF,QAAA,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,cAAc,CAAC;IACpD;AAEU,IAAA,sBAAsB,CAAC,KAAY,EAAE,cAAiC,EAAE,0BAA2C,EAAA;QAC3H,KAAK,CAAC,eAAe,EAAE;QACvB,0BAA0B,EAAE,SAAS,EAAE;AAEvC,QAAA,MAAM,IAAI,GAAmC;AAC3C,YAAA,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE;AACvB,YAAA,cAAc,EAAE;SACjB;AAED,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAEpF,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC,cAAkC,KAAI;AACvE,YAAA,IAAI,cAAc;AAChB,gBAAA,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC;AAC7C,QAAA,CAAC,CAAC;IACJ;AAEU,IAAA,sBAAsB,CAAC,KAAY,EAAE,0BAA0C,EAAE,cAAiC,EAAA;QAC1H,KAAK,CAAC,eAAe,EAAE;QACvB,0BAA0B,CAAC,SAAS,EAAE;AAEtC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,QAAA,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;AACzB,YAAA,KAAK,EAAE,KAAK,CAAC,eAAe,CAAC,WAAW;YACxC,OAAO,EAAE,KAAK,CAAC,eAAe,CAAC,aAAa,CAAC,cAAc,CAAC,IAAI,CAAC;AACjE,YAAA,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,aAAa;AACtC,YAAA,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM;AAC/B,YAAA,WAAW,EAAE,IAAI;AAClB,SAAA,CAAC,CAAC,SAAS,CAAC,OAAO,IAAG;AACrB,YAAA,IAAI,OAAO,KAAK,IAAI,EAAE;AACpB,gBAAA,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,gBAAgB,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;oBAClE,IAAI,CAAC,oBAAoB,EAAE;AAE7B,gBAAA,IAAI,CAAC,qBAAqB,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC;YAC1F;AACF,QAAA,CAAC,CAAC;IACJ;AAEU,IAAA,oBAAoB,CAAC,KAAY,EAAA;QACzC,KAAK,CAAC,eAAe,EAAE;QACvB,IAAI,CAAC,oBAAoB,EAAE;IAC7B;IAEU,sBAAsB,GAAA;QAC9B,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,gBAAgB;AAC1D,QAAA,IAAI,CAAC,gBAAgB;AACnB,YAAA,OAAO,EAAE;QAEX,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO;AACvC,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,OAAO,EAAE,gBAAgB,EAAE,KAAK,CAAC;AAEzG,QAAA,IAAI,CAAC,cAAc;AACjB,YAAA,OAAO,EAAE;QAEX,OAAO,mBAAmB,CAAC,oBAAoB,CAAI,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IAClH;AAEU,IAAA,aAAa,CAAC,GAAM,EAAA;AAC5B,QAAA,OAAO,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG;IACnC;AAEU,IAAA,gBAAgB,CAAC,GAAM,EAAA;AAC/B,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,YAAY,IAAG;AACtC,YAAA,MAAM,QAAQ,GAAG,YAAY,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI;AACjD,YAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC;AACtC,YAAA,OAAO,QAAQ;AACjB,QAAA,CAAC,CAAC;IACJ;AAEU,IAAA,eAAe,CAAC,SAAkB,EAAA;AAC1C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,IAAI,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC9F,QAAA,OAAO,MAAM;IACf;IAEU,cAAc,CAAC,OAAU,EAAE,OAAU,EAAA;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU;AAE7C,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;AAC3B,YAAA,OAAO,UAAU,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;;YAE7D,OAAO,OAAO,CAAC,UAAU,CAAC,KAAK,OAAO,CAAC,UAAU,CAAC;IACtD;AAEU,IAAA,aAAa,CAAC,GAAM,EAAA;QAC5B,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACtE;AAEU,IAAA,kBAAkB,CAAC,GAAM,EAAA;AACjC,QAAA,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE;AAC3B,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,eAAe,IAAG;AACtC,gBAAA,OAAO,eAAe,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAC5E,YAAA,CAAC,CAAC;QACJ;aAAO;AACL,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,eAAe,IAAI,CAAC,GAAG,eAAe,EAAE,GAAG,CAAC,CAAC;QACrE;IACF;IAEU,oBAAoB,GAAA;AAC5B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,EAAE;QACxC,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAClF;IAEU,yBAAyB,GAAA;AACjC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,EAAE;AAExC,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE,EAAE;;AAE/B,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,eAAe,IAAG;gBACtC,OAAO,eAAe,CAAC,MAAM,CAC3B,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CACnE;AACH,YAAA,CAAC,CAAC;QACJ;aAAO;;AAEL,YAAA,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;AAEzE,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,eAAe,IAAG;;AAEtC,gBAAA,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAC/B,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CACnE;AACD,gBAAA,OAAO,CAAC,GAAG,eAAe,EAAE,GAAG,MAAM,CAAC;AACxC,YAAA,CAAC,CAAC;QACJ;IACF;IAEQ,iBAAiB,GAAA;QACvB,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,gBAAgB;QACzD,OAAO,gBAAgB,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE;IAC1F;IAEU,qBAAqB,GAAA;QAC7B,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,kBAAkB,IAAI,EAAE;IACjD;IAEU,mBAAmB,GAAA;AAC3B,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;IACxB;AAEU,IAAA,yBAAyB,CAAC,QAAgB,EAAA;AAClD,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAC5B;AACE,YAAA,EAAE,EAAE,QAAQ;AACZ,YAAA,IAAI,EAAE,IAAI,CAAC,SAAS;AACrB,SAAA,CACF;IACH;IAEQ,kBAAkB,GAAA;AACxB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;AAC9B,QAAA,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC;IACzC;IAEQ,eAAe,GAAA;AACrB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;AAC9B,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO;AAE9B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AAExB,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,IAAG;AACpB,YAAA,IAAI,MAAM,CAAC,mBAAmB,EAAE;gBAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC;AAC9C,gBAAA,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACxC;AAEA,YAAA,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;AAC3C,QAAA,CAAC,CAAC;IACJ;IAEU,sBAAsB,GAAA;AAC9B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;AAE9B,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE;QAC5B,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc,IAAI,IAAI,KAAK;AAGnD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,EAAE;AACzC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE;QAEnC,MAAM,OAAO,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC;;QAIlC,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC;AAC7C,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAE;;QAGjC,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;QACnC,KAAK,CAAC,iBAAiB,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC;AAClD,QAAA,aAAa,CAAC,QAAQ,EAAE,GAAG,QAAQ,CAAA,KAAA,CAAO,CAAC;IAC7C;IAEU,sBAAsB,GAAA;AAC9B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;AAE9B,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE;QAC5B,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc,IAAI,IAAI,KAAK;AAEnD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,EAAE;AACzC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE;QAEnC,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,KAAK,CAAC;AACxC,YAAA,WAAW,EAAE,WAAW;AACxB,YAAA,IAAI,EAAE,IAAI;AACV,YAAA,MAAM,EAAE;AACT,SAAA,CAAC;AAEF,QAAA,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;QACnB,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC;QAEvB,SAAS,CAAC,GAAG,EAAE;AACb,YAAA,MAAM,EAAE,EAAE;YACV,IAAI,EAAE,CAAC,OAAO,CAAC;AACf,YAAA,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE;AACvC,YAAA,UAAU,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE;YACvD,kBAAkB,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE;AAClD,YAAA,cAAc,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;AAC/B,YAAA,cAAc,EAAE,GAAG;AACpB,SAAA,CAAC;AAEF,QAAA,GAAG,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAA,IAAA,CAAM,CAAC;IAC7B;IAEU,kBAAkB,GAAA;QAC1B,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,IAAI,CAAC,cAAc,EAAE;;YAErB,IAAI,CAAC,eAAe,EAAE;IAC1B;IAEQ,eAAe,GAAA;QACrB,IAAI,IAAI,CAAC,UAAU;YACjB;QAEF,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;AACpC,YAAA,WAAW,EAAE,KAAK;YAClB,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,EAAE;AACrD,YAAA,gBAAgB,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;AAC7F,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,oBAAoB,EAAG,EAAE,IAAI,CAAC,gBAAgB,CAAC;QACrF,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;AAEnC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;IAC7B;IAEQ,cAAc,GAAA;QACpB,IAAI,CAAC,IAAI,CAAC,UAAU;YAClB;AAEF,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;AACxB,QAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;AACzB,QAAA,IAAI,CAAC,UAAU,GAAG,SAAS;AAC3B,QAAA,IAAI,CAAC,MAAM,GAAG,SAAS;AAEvB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;IAC9B;IAEQ,gBAAgB,GAAA;QACtB,IAAI,CAAC,IAAI,CAAC,UAAU;AAClB,YAAA,OAAO,KAAK;;QAGd,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,EAAE;;QAEpE,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC;;QAEtD,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAA4B;AAE3E,QAAA,OAAO,UAAU,KAAK,IAAI,CAAC,UAAU,CAAC,WAAW;IACnD;wGA5rBW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,25BCzE9B,sr7BAifc,EAAA,MAAA,EAAA,CAAA,8kLAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDhcV,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,uBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,uBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,oCAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,MAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,oCAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAN,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,eAAA,EAAA,OAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,WAAA,EAAA,QAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,sBAAA,EAAA,cAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,MAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,aAAa,qLACb,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,aAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACpB,gBAAgB,4TAChB,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAM,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,mBAAmB,2lCACnB,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,wBAAwB,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,KAAA,EAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACxB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,WAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,cAAA,EAAA,QAAA,EAAA,6CAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,4BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,YAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,gBAAgB,mIAEhB,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,WAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,WAAA,EAAA,IAAA,EAAA,UAAA,EAAA,eAAA,EAAA,MAAA,EAAA,OAAA,EAAA,eAAA,EAAA,UAAA,EAAA,OAAA,EAAA,qBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,kCAAkC,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,sBAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,OAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClC,yBAAyB,8SAHzB,2BAA2B,EAAA,IAAA,EAAA,4BAAA,EAAA,CAAA,EAAA,CAAA;;4FASlB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBA3B7B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,EAAA,OAAA,EACtB;wBACP,cAAc;wBACd,aAAa;wBACb,kBAAkB;wBAClB,aAAa;wBACb,eAAe;wBACf,oBAAoB;wBACpB,gBAAgB;wBAChB,kBAAkB;wBAClB,cAAc;wBACd,eAAe;wBACf,mBAAmB;wBACnB,YAAY;wBACZ,wBAAwB;wBACxB,aAAa;wBACb,gBAAgB;wBAChB,2BAA2B;wBAC3B,iBAAiB;wBACjB,kCAAkC;wBAClC;AACD,qBAAA,EAAA,IAAA,EAGK,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAA,QAAA,EAAA,sr7BAAA,EAAA,MAAA,EAAA,CAAA,8kLAAA,CAAA,EAAA;kvBAgKe,cAAc,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA;sBAYhE,YAAY;uBAAC,yBAAyB;;;ME9K5B,aAAa,CAAA;AAEP,IAAA,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACjD,IAAA,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC;AAC1B,IAAA,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACxC,IAAA,oBAAoB,GAAG,MAAM,CAAC,oBAAoB,CAAC;;AAG3D,IAAA,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK;AAE7B,IAAA,SAAS,GAAG,QAAQ,CAAU,MAAM,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,EAAE,IAAI,IAAI,YAAY,qDAAC;AAEzG,IAAA,OAAO,GAAG,KAAK,CACb,MAAM,CACJ;AACE,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,MAAM,EAAE,SAAS;AACjB,QAAA,mBAAmB,EAAE;AACjB,KAAA,CACP,mDACF;AACD,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,iDAAuC;AAC9D,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,+CAAO;AAC5B,IAAA,OAAO,GAAG,KAAK,CAAU,KAAK,mDAAC;IAC/B,WAAW,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAqC;IAExD,WAAW,GAAG,KAAK,CACjB,CAAC,IAAS,EAAE,CAAI,KAAI;AAClB,QAAA,OAAO,IAAI;AACb,IAAA,CAAC,uDACF;IAES,WAAW,GAAG,MAAM,EAAQ;IAC5B,WAAW,GAAG,MAAM,EAAK;IACzB,WAAW,GAAG,MAAM,EAAK;IACzB,cAAc,GAAG,MAAM,EAA0B;IACjD,kBAAkB,GAAG,MAAM,EAAY;IACvC,oBAAoB,GAAG,MAAM,EAA2B;AAElE,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;AACzB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;AAClC,QAAA,MAAM,UAAU,GAAG,IAAI,kBAAkB,CAAC,IAAI,CAAC;AAE/C,QAAA,IAAI,SAAS;AACX,YAAA,UAAU,CAAC,SAAS,GAAG,SAAS;AAElC,QAAA,OAAO,UAAU;AACnB,IAAA,CAAC,sDAAC;AAEF,IAAA,aAAa,GAAG,MAAM,CAAC,MAAK;AAC1B,QAAA,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACtB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE;AAChC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;AAC9B,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE;AACtC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE;AAEtC,QAAA,IAAI,WAAW;YACb,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,EAAE,IAAI,CAAC;AAC1C,aAAA,IAAI,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,OAAO,CAAC;AAChD,YAAA,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC;AAEnE,QAAA,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC;AAE3D,QAAA,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,mBAAmB,CAAC;AAEhF,QAAA,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC;AAEjC,QAAA,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,GAAG,IAAI;AAC/B,IAAA,CAAC,yDAAC;AAEQ,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;QACrC,MAAM,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAC,aAAa,EAAE;AAC9D,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;QACnC,MAAM,YAAY,GAAkC,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC;QACtF,MAAM,mBAAmB,GAAsB,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAG;YAC9E,OAAO;gBACL,GAAG,EAAE,MAAM,CAAC,GAAG;AACf,gBAAA,IAAI,EAAE,IAAI;AACV,gBAAA,QAAQ,EAAE,WAAW,CAAC,mBAAmB,IAAI,MAAM,CAAC;aACrD;AACH,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,YAAY;AACf,YAAA,OAAO,mBAAmB;;AAG5B,QAAA,MAAM,eAAe,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;;QAG9G,MAAM,YAAY,GAAG,mBAAmB,CAAC,MAAM,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;AAE1H,QAAA,OAAO,CAAC,GAAG,eAAe,EAAE,GAAG,YAAY,CAAC;AAC9C,IAAA,CAAC,wDAAC;IAEiB,eAAe,GAAG,QAAQ;IAC1B,mBAAmB,GAAG,eAAe;IACrC,sBAAsB,GAAG,QAAQ;IACjC,wBAAwB,GAAG,oBAAoB;IAExD,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AAEhF,IAAA,IAAI,GAAG,QAAQ,CAAC,MAAK;AAC7B,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;AACnC,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE;AAExC,QAAA,IAAI,IAAI,GAAyB,CAAC,GAAG,YAAY;aAC9C,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI;aAC5B,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG,CAAC;QAE5B,IAAI,CAAC,WAAW,CAAC,WAAW,IAAI,IAAI,IAAI;aACrC,CAAC,WAAW,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,mBAAmB;AACnD,mBAAA,WAAW,CAAC;oBACX,WAAW,CAAC,UAAU,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;AAC5D,mBAAA,WAAW,CAAC,gBAAgB,CAAC,EAClC;YACA,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,mBAAmB,CAAC;QAC5C;QAEA,IAAI,WAAW,CAAC,kBAAkB;YAChC,IAAI,GAAG,CAAC,IAAI,CAAC,wBAAwB,EAAE,GAAG,IAAI,CAAC;AAEjD,QAAA,OAAO,IAAI;AACb,IAAA,CAAC,gDAAC;AAEQ,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA,EAAG,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAA,CAAE,CAAC,0DAAC;AAC7G,IAAA,qBAAqB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA,EAAG,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAA,CAAE,CAAC,iEAAC;AAC3H,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;AACvC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;AACnC,QAAA,OAAO,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,CAAC;AACnE,IAAA,CAAC,0DAAC;AACQ,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,6DAAC;AAClF,IAAA,sBAAsB,GAAG,QAAQ,CAAC,MAAK;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO;AACvC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;QACxB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,gBAAgB,CAAC;AACtF,IAAA,CAAC,kEAAC;AACQ,IAAA,sBAAsB,GAAG,QAAQ,CAAC,MAAK;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO;AACvC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;QACxB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,gBAAgB,CAAC;AACtF,IAAA,CAAC,kEAAC;AAEQ,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;AACxC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE;AACtC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;AAE9B,QAAA,IAAI,WAAW;AACb,YAAA,OAAO,IAAI;QAEb,OAAO,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,OAAO,CAAC;AAClD,IAAA,CAAC,2DAAC;AAEQ,IAAA,oBAAoB,GAAG,SAAS,CAAmB,cAAc,gEAAC;AAClE,IAAA,YAAY,GAAG,MAAM,CAAC,KAAK,wDAAC;AAC9B,IAAA,UAAU;AACV,IAAA,MAAM;AACG,IAAA,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;AACzB,IAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC3C,IAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAElD,IAAA,SAAS,GAAG,MAAM,CAAM,EAAE,qDAAC;IAElB,mBAAmB,GAAG,gBAAgB;AAC/C,IAAA,YAAY,GAAG,MAAM,CAAW,IAAI,wDAAC;AAGrC,IAAA,SAAS,GAAG,SAAS,CAAC,YAAY,qDAAC;IAEnC,uCAAuC,GAAG,MAAM,CACxD;AACE,QAAA,UAAU,EAAE,CAAC;AACb,QAAA,QAAQ,EAAE,EAAE;AACZ,QAAA,KAAK,EAAE;AACR,KAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,yCAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACF;AAGS,IAAA,cAAc,GAAG,CAAC,SAA2B,KAAa,SAAmB;IAE/E,qBAAqB,CAAC,cAA+B,EAAE,UAA6B,EAAA;AAC1F,QAAA,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,IAAI,cAAc,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC;IACpE;IAGU,QAAQ,GAAA;AAChB,QAAA,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,gBAAgB,EAAE;YAC5C,IAAI,CAAC,cAAc,EAAE;IACzB;AAEQ,IAAA,oBAAoB,CAAC,OAA8B,EAAA;AACzD,QAAA,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,mBAAmB,KAAK,IAAI,CAAC;IACtE;AAEQ,IAAA,gBAAgB,CAAC,OAA8B,EAAE,IAAS,EAAE,KAAc,EAAA;AAChF,QAAA,IAAI,CAAC,KAAK;AACR,YAAA,OAAO,IAAI;AAEb,QAAA,MAAM,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,mBAAmB,CAAC;AAEpE,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,IACrB,iBAAiB,CAAC,IAAI,CAAC,MAAM,IAAG;YAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;YAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC;QACrE,CAAC,CAAC,CACH;IACH;AAEQ,IAAA,SAAS,CAAC,IAAS,EAAE,OAA8B,EAAE,MAAe,EAAA;AAC1E,QAAA,IAAI,CAAC,MAAM;AACT,YAAA,OAAO,IAAI;AAEb,QAAA,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,CAAC;AAEtD,QAAA,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS;AAC1C,YAAA,OAAO,IAAI;AAEb,QAAA,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,MAAM;AACjC,QAAA,MAAM,MAAM,GAAG,SAAS,KAAK,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;AAE3C,QAAA,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AAC7B,YAAA,MAAM,MAAM,GAAI,CAAS,CAAC,GAAG,CAAC;AAC9B,YAAA,MAAM,MAAM,GAAI,CAAS,CAAC,GAAG,CAAC;AAE9B,YAAA,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI;AAClC,gBAAA,OAAO,CAAC;YAEV,IAAI,MAAM,IAAI,IAAI;AAChB,gBAAA,OAAO,CAAC,CAAC,GAAG,MAAM;YAEpB,IAAI,MAAM,IAAI,IAAI;gBAChB,OAAO,CAAC,GAAG,MAAM;AAEnB,YAAA,QAAQ,MAAM,CAAC,QAAQ;AACrB,gBAAA,KAAK,QAAQ;AACX,oBAAA,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM;AAEnD,gBAAA,KAAK,MAAM;AACT,oBAAA,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM;AAE3D,gBAAA,KAAK,QAAQ;AACb,gBAAA;AACE,oBAAA,IAAG,MAAM,CAAC,SAAS,EAAE;wBACnB,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE;wBAC/C,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE;wBAC/C,OAAO,aAAa,CAAC,aAAa,CAAC,aAAa,CAAC,GAAG,MAAM;oBAC5D;AAEA,oBAAA,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM;;AAElE,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,iBAAiB,CAAC,IAAS,EAAE,OAA8B,EAAE,mBAA2D,EAAA;AAC9H,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,mBAAmB;AAChD,YAAA,OAAO,IAAI;AAEb,QAAA,OAAO,CAAC,OAAO,CAAC,MAAM,IAAG;YACvB,MAAM,iBAAiB,GAAG,mBAAmB,CAAC,MAAM,CAAC,GAAG,CAAC;YAEzD,IAAI,iBAAiB,EAAE;AACrB,gBAAA,QAAQ,MAAM,CAAC,UAAU;AACvB,oBAAA,KAAK,QAAQ;AACb,oBAAA,KAAK,QAAQ;AACX,wBAAA,MAAM,WAAW,GAAG,cAAc,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,CAAC,KAAK,GAAG,iBAAiB;AACnG,wBAAA,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAG;AACrB,4BAAA,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;4BAC5D,OAAO,WAAW,IAAI,WAAW;AACnC,wBAAA,CAAC,CAAC;wBACF;AACF,oBAAA,KAAK,MAAM;wBACT,MAAM,KAAK,GAAG,iBAA2B;AACzC,wBAAA,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAG;4BACrB,MAAM,IAAI,IAAI,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAW;AACvE,4BAAA,OAAO,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC;AACvC,wBAAA,CAAC,CAAC;wBACF;AACF,oBAAA,KAAK,iBAAiB;AACpB,wBAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,iBAAiB,CAAC,MAAM,IAAI,CAAC;4BACpE;AAEF,wBAAA,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAG;AACrB,4BAAA,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;AAC5D,4BAAA,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,IAAG;AAChC,gCAAA,MAAM,iBAAiB,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC;gCACzD,OAAO,iBAAiB,IAAI,WAAW;AACzC,4BAAA,CAAC,CAAC;AACJ,wBAAA,CAAC,CAAC;wBACF;AACF,oBAAA,KAAK,MAAM;wBACT,MAAM,IAAI,GAAG,iBAAkC;AAC/C,wBAAA,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAG;4BACrB,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;4BAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ;AAC3B,gCAAA,OAAO,KAAK;4BAEd,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;4BACrC,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC;AACxC,wBAAA,CAAC,CAAC;wBACF;AACF,oBAAA,KAAK,YAAY;wBACf,MAAM,SAAS,GAAG,iBAAoD;AACtE,wBAAA,IAAI,SAAS,CAAC,KAAK,IAAI,IAAI,IAAI,SAAS,CAAC,GAAG,IAAI,IAAI,EAAE;AACpD,4BAAA,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAG;gCACrB,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;gCAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ;AAC3B,oCAAA,OAAO,KAAK;gCAEd,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AAErC,gCAAA,IAAI,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,GAAG;AAClC,oCAAA,OAAO,WAAW,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC;gCAE3E,IAAI,SAAS,CAAC,KAAK;oCACjB,OAAO,WAAW,CAAC,aAAa,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC;gCAE1D,IAAI,SAAS,CAAC,GAAG;oCACf,OAAO,WAAW,CAAC,cAAc,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC;AAEzD,gCAAA,OAAO,IAAI;AACb,4BAAA,CAAC,CAAC;wBACJ;wBACA;;YAEN;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,IAAI;IACb;IAEU,kBAAkB,GAAA;QAC1B,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,IAAI,CAAC,cAAc,EAAE;;YAErB,IAAI,CAAC,eAAe,EAAE;IAC1B;IAEQ,eAAe,GAAA;QACrB,IAAI,IAAI,CAAC,UAAU;YACjB;QAEF,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;AACpC,YAAA,WAAW,EAAE,KAAK;YAClB,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,EAAE;AACrD,YAAA,gBAAgB,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;AAC7F,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,oBAAoB,EAAG,EAAE,IAAI,CAAC,gBAAgB,CAAC;QACrF,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;AAEnC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;IAC7B;IAEQ,cAAc,GAAA;QACpB,IAAI,CAAC,IAAI,CAAC,UAAU;YAClB;AAEF,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;AACxB,QAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;AACzB,QAAA,IAAI,CAAC,UAAU,GAAG,SAAS;AAC3B,QAAA,IAAI,CAAC,MAAM,GAAG,SAAS;AAEvB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;IAC9B;IAEQ,gBAAgB,GAAA;QACtB,IAAI,CAAC,IAAI,CAAC,UAAU;AAClB,YAAA,OAAO,KAAK;;QAGd,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,EAAE;;QAEpE,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC;;QAEtD,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAA4B;AAE3E,QAAA,OAAO,UAAU,KAAK,IAAI,CAAC,UAAU,CAAC,WAAW;IACnD;IAEU,UAAU,GAAA;AAClB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;IACzB;IAEU,aAAa,CAAC,GAAM,EAAE,KAAY,EAAA;AAC1C,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC;QAC1B,KAAK,CAAC,eAAe,EAAE;IACzB;AAEU,IAAA,UAAU,CAAC,GAAM,EAAA;AACzB,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;AACxB,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC;IAC9B;AAEU,IAAA,YAAY,CAAC,GAAM,EAAA;AAC3B,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAClB,eAAA,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;gBACf,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,GAAG,GAAG,CAAC;AACrE,eAAA,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,QAAQ,GAAG,GAAG,CAAC;IAC/C;IAEU,aAAa,CAAC,GAAM,EAAE,KAAY,EAAA;QAC1C,KAAK,CAAC,eAAe,EAAE;AAEvB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,QAAA,MAAM,MAAM,GAAG;AACb,YAAA,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,EAAE,KAAK,GAAG,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,kBAAkB;AACpF,YAAA,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,aAAa;AACtC,YAAA,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM;AAC/B,YAAA,WAAW,EAAE,IAAI;SAClB;AACD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,EAAE,WAAW,IAAI;QAC/D,MAAM,QAAQ,GAAG;AACf,cAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,EAAE;AACxE,cAAE,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,EAAE,IAAI,GAAG,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC;AAEnI,QAAA,QAAQ,CAAC,SAAS,CAAC,OAAO,IAAG;YAC3B,IAAI,OAAO,KAAK,IAAI;AAClB,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC;AAC9B,QAAA,CAAC,CAAC;IACJ;AAEU,IAAA,gBAAgB,CAAC,GAAM,EAAE,SAA4B,EAAE,KAAY,EAAA;AAC3E,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QACxD,KAAK,CAAC,eAAe,EAAE;IACzB;IAEU,aAAa,GAAA;AACrB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;AAC9B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE;AAChC,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE;QAExC,MAAM,YAAY,GAAG,MAAM,CAAC,WAAW,CACrC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAC9B;AAE5B,QAAA,MAAM,IAAI,GAAgC;YACxC,OAAO,EAAE,MAAM,CAAC,OAAO;AACvB,YAAA,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE;AACzB,YAAA,OAAO,EAAE,YAAY;AACrB,YAAA,YAAY,EAAE,OAAO,CAAC,mBAAmB,IAAI,EAAE;AAC/C,YAAA,aAAa,EAAE;SAChB;AACD,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAClE;IAEU,qBAAqB,GAAA;QAC7B,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,kBAAkB,IAAI,EAAE;IACjD;IAEU,mBAAmB,GAAA;AAC3B,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;IACxB;AAEU,IAAA,yBAAyB,CAAC,QAAgB,EAAA;AAClD,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAC5B;AACE,YAAA,EAAE,EAAE,QAAQ;AACZ,YAAA,IAAI,EAAE,IAAI,CAAC,SAAS;AACrB,SAAA,CACF;IACH;IAEQ,kBAAkB,GAAA;AACxB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;AAC9B,QAAA,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC;IACzC;IAEQ,eAAe,GAAA;AACrB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;AAC9B,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO;QAE9B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI;AAEnC,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,IAAG;AACpB,YAAA,IAAI,MAAM,CAAC,mBAAmB,EAAE;gBAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC;AAC9C,gBAAA,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACxC;AAEA,YAAA,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;AAC3C,QAAA,CAAC,CAAC;IACJ;IAEU,WAAW,GAAA;AACnB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;AAE9B,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE;QAC5B,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc,IAAI,IAAI,KAAK;AAEnD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,EAAE;AACzC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE;QAEnC,MAAM,OAAO,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC;;QAIlC,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC;AAC7C,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAE;;QAGjC,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;QACnC,KAAK,CAAC,iBAAiB,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC;AAClD,QAAA,aAAa,CAAC,QAAQ,EAAE,GAAG,QAAQ,CAAA,KAAA,CAAO,CAAC;IAC7C;IAEU,WAAW,GAAA;AACnB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;AAE9B,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE;QAC5B,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc,IAAI,IAAI,KAAK;AAEnD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,EAAE;AACzC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE;QAEnC,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,KAAK,CAAC;AACxC,YAAA,WAAW,EAAE,WAAW;AACxB,YAAA,IAAI,EAAE,IAAI;AACV,YAAA,MAAM,EAAE;AACT,SAAA,CAAC;AAEF,QAAA,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;QACnB,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC;QAEvB,SAAS,CAAC,GAAG,EAAE;AACb,YAAA,MAAM,EAAE,EAAE;YACV,IAAI,EAAE,CAAC,OAAO,CAAC;AACf,YAAA,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE;AACvC,YAAA,UAAU,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE;YACvD,kBAAkB,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE;AAClD,YAAA,cAAc,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;AAC/B,YAAA,cAAc,EAAE,GAAG;AACpB,SAAA,CAAC;AAEF,QAAA,GAAG,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAA,IAAA,CAAM,CAAC;IAC7B;AAEU,IAAA,aAAa,CAAC,YAA8B,EAAA;AACpD,QAAA,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK;QAEhC,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,KAAQ,KAAI;;;YAGjC,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;AACnC,QAAA,CAAC,CAAC;IACJ;AAEU,IAAA,YAAY,CAAC,YAA8B,EAAA;AACnD,QAAA,YAAY,CAAC,KAAK,GAAG,EAAE;AACvB,QAAA,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC;IAClC;AAEU,IAAA,YAAY,CAAC,IAAU,EAAA;QAC/B,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,KAAK,IAAG;YAC5B,OAAO;AACL,gBAAA,GAAG,KAAK;;gBAER,MAAM,EAAE,IAAI,CAAC,SAAS,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG;aAC5E;AACH,QAAA,CAAC,CAAC;IACJ;IAEU,yBAAyB,GAAA;AACjC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,EAAE;AAE3C,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE,EAAE;;AAE/B,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,eAAe,IAAG;gBACtC,OAAO,eAAe,CAAC,MAAM,CAC3B,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CACnE;AACH,YAAA,CAAC,CAAC;QACJ;aAAO;;AAEL,YAAA,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;AAEzE,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,eAAe,IAAG;;AAEtC,gBAAA,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAC/B,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CACnE;AACD,gBAAA,OAAO,CAAC,GAAG,eAAe,EAAE,GAAG,MAAM,CAAC;AACxC,YAAA,CAAC,CAAC;QACJ;IACF;IAEU,oBAAoB,GAAA;AAC5B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,EAAE;;QAE3C,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAClF;IAEU,cAAc,CAAC,OAAU,EAAE,OAAU,EAAA;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU;AAE7C,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;AAC3B,YAAA,OAAO,UAAU,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;;YAE7D,OAAO,OAAO,CAAC,UAAU,CAAC,KAAK,OAAO,CAAC,UAAU,CAAC;IACtD;AAEU,IAAA,aAAa,CAAC,GAAM,EAAA;QAC5B,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACtE;AAEU,IAAA,kBAAkB,CAAC,GAAM,EAAA;AACjC,QAAA,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE;AAC3B,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,eAAe,IAAG;AACtC,gBAAA,OAAO,eAAe,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAC5E,YAAA,CAAC,CAAC;QACJ;aAAO;AACL,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,eAAe,IAAI,CAAC,GAAG,eAAe,EAAE,GAAG,CAAC,CAAC;QACrE;IACF;IAEU,gBAAgB,CAAC,KAAU,EAAE,KAAiC,EAAA;AACtE,QAAA,IAAI,CAAC,KAAK;AACR,YAAA,OAAO,KAAK;AAEd,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,CAAC;AAEzD,QAAA,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC;IACnF;AAEU,IAAA,sBAAsB,CAAC,SAAkB,EAAA;AACjD,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,EAAE;QACrD,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,IAAI,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC9F;IAEU,oBAAoB,GAAA;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,SAAS;AAE7C,QAAA,IAAI,CAAC,SAAS;AACZ,YAAA,OAAO,EAAE;QAEX,MAAM,UAAU,GAAG,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC,QAAQ;AAC3D,QAAA,MAAM,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC,QAAQ;AAEhD,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC;IAC3D;AAEU,IAAA,eAAe,CAAC,SAAkB,EAAA;AAC1C,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,IAAI,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACnG;AAEU,IAAA,sBAAsB,CAAC,GAAY,EAAA;QAC3C,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,mBAAmB,GAAG,GAAG,CAAC;IACpD;AAEU,IAAA,+CAA+C,CAAC,GAAY,EAAA;QACpE,MAAM,KAAK,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC;QAE9C,IAAI,cAAc,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;AACxF,YAAA,OAAO,KAAK;AAEd,QAAA,OAAO,SAAS;IAClB;AAEU,IAAA,sCAAsC,CAAC,GAAY,EAAA;QAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC;QAE9C,IAAI,OAAO,KAAK,KAAK,QAAQ,KAAK,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;AAChG,YAAA,OAAO,KAAK;AAEd,QAAA,OAAO,SAAS;IAClB;IAEU,+BAA+B,CAAC,GAAY,EAAE,IAAqB,EAAA;QAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAoC;AAEjF,QAAA,IAAI,CAAC,KAAK;AACR,YAAA,OAAO,IAAI;AAEb,QAAA,OAAO,IAAI,IAAI,OAAO,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG;IAClD;IAEU,wBAAwB,CAAC,MAA2B,EAAE,KAAY,EAAA;AAC1E,QAAA,MAAM,KAAK,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK;QACtD,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC;IAC9C;IAEU,mCAAmC,CAAC,MAA2B,EAAE,MAAsC,EAAA;QAC/G,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC;IAC/C;IAEU,0BAA0B,CAAC,MAA2B,EAAE,KAAyB,EAAA;QACzF,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC;IAC9C;IAEU,kBAAkB,CAAC,MAA2B,EAAE,KAA2B,EAAA;QACnF,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC;IAC9C;IAEU,uBAAuB,CAAC,MAA2B,EAAE,KAA6C,EAAA;QAC1G,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC;IAC9C;IAEQ,oBAAoB,CAAC,SAAkB,EAAE,KAAkB,EAAA;QACjE,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,YAAY,IAAG;;AAEnC,YAAA,MAAM,mBAAmB,GAA0C;AACjE,gBAAA,IAAI,YAAY,CAAC,mBAAmB,IAAI,EAAE,CAAC;gBAC3C,CAAC,SAAS,GAAG;aACd;YACD,OAAO;AACL,gBAAA,GAAG,YAAY;AACf,gBAAA,UAAU,EAAE,CAAC;AACb,gBAAA,mBAAmB,EAAE;aACtB;AACH,QAAA,CAAC,CAAC;IACJ;AAEU,IAAA,aAAa,CAAC,GAAM,EAAA;AAC5B,QAAA,OAAO,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG;IACnC;AAEU,IAAA,gBAAgB,CAAC,GAAM,EAAA;AAC/B,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,YAAY,IAAG;AACtC,YAAA,MAAM,QAAQ,GAAG,YAAY,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI;AACjD,YAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC;AACtC,YAAA,OAAO,QAAQ;AACjB,QAAA,CAAC,CAAC;IACJ;wGAltBW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAb,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,aAAa,yzCAuKQ,YAAY,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5O9C,4o0BAybc,EAAA,MAAA,EAAA,CAAA,67KAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED3YV,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,uBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,uBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,oCAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,MAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,oCAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAN,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,eAAA,EAAA,OAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,kBAAkB,qSAClB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,oBAAoB,wNACpB,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAM,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,eAAe,8BACf,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,aAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,KAAA,EAAA,KAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,KAAA,EAAA,UAAA,EAAA,YAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,KAAA,EAAA,KAAA,EAAA,UAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,YAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,UAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,wBAAwB,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,KAAA,EAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACxB,aAAa,gwBACb,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,GAAA,CAAA,WAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,WAAA,EAAA,IAAA,EAAA,UAAA,EAAA,eAAA,EAAA,MAAA,EAAA,OAAA,EAAA,eAAA,EAAA,UAAA,EAAA,OAAA,EAAA,qBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,yBAAyB,mTACzB,kCAAkC,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,sBAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,OAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAMzB,aAAa,EAAA,UAAA,EAAA,CAAA;kBA1BzB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAAA,OAAA,EAClB;wBACP,cAAc;wBACd,aAAa;wBACb,kBAAkB;wBAClB,aAAa;wBACb,eAAe;wBACf,oBAAoB;wBACpB,gBAAgB;wBAChB,kBAAkB;wBAClB,cAAc;wBACd,eAAe;wBACf,mBAAmB;wBACnB,YAAY;wBACZ,wBAAwB;wBACxB,aAAa;wBACb,gBAAgB;wBAChB,iBAAiB;wBACjB,yBAAyB;wBACzB;AACD,qBAAA,EAAA,IAAA,EAGK,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAA,QAAA,EAAA,4o0BAAA,EAAA,MAAA,EAAA,CAAA,67KAAA,CAAA,EAAA;AA2JyB,SAAA,CAAA,EAAA,cAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,kBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,CAAA,EAAA,oBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,CAAA,EAAA,oBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,cAAc,uFAc3C,YAAY,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA;sBAiB3C,YAAY;uBAAC,yBAAyB;;;AEtPzC,MAAM,aAAa,GAA8B;AAC/C,IAAA,IAAI,EAAE,MAAM;AACZ,IAAA,OAAO,EAAE,cAAc;AACvB,IAAA,OAAO,EAAE,SAAS;AAClB,IAAA,KAAK,EAAE,OAAO;CACf;MAaY,QAAQ,CAAA;AACF,IAAA,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK;;AAGvC,IAAA,IAAI,GAAG,KAAK,CAAY,MAAM,gDAAC;;IAG/B,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;;IAGvB,OAAO,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;;AAGzB,IAAA,UAAU,GAAG,KAAK,CAAkB,UAAU,sDAAC;;IAG/C,IAAI,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;;AAGtB,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,4CAAI,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAA7B,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAC;;AAGxD,IAAA,WAAW,GAAG,KAAK,CAAC,KAAK,+CAAI,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAA7B,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAC;;IAG3D,YAAY,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AAEvC;;;;AAIG;IACM,UAAU,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAkC;;IAGpD,SAAS,GAAG,MAAM,EAAQ;AAEhB,IAAA,WAAW,GAAG,MAAM,CAAC,KAAK,uDAAC;IAE3B,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,aAAa,CAAC,IAAI,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AAE9F,IAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAK;AACtD,QAAA,OAAO,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO;AAC3D,IAAA,CAAC,gEAAC;AAEiB,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AAC9C,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU;gBAC5B,IAAI,CAAC,IAAI,EAAE,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;QAEpF,QAAQ,UAAU;AAChB,YAAA,KAAK,WAAW,EAAE,OAAO,OAAO;AAChC,YAAA,KAAK,QAAQ,EAAE,OAAO,QAAQ;AAC9B,YAAA,SAAS,OAAO,IAAI;;AAExB,IAAA,CAAC,wDAAC;IAEQ,OAAO,GAAA;AACf,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;IACvB;wGA3DW,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAR,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,QAAQ,23CCzBrB,o+BAoCA,EAAA,MAAA,EAAA,CAAA,8kDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDpBY,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAJ,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,qNAAE,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAL,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAS/C,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAXpB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,WAAW,EAAA,OAAA,EACZ,CAAC,aAAa,EAAE,eAAe,EAAE,gBAAgB,CAAC,EAAA,eAAA,EAG1C,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,aAAa,EAAE,uCAAuC;AACtD,wBAAA,8BAA8B,EAAE,eAAe;AAChD,qBAAA,EAAA,QAAA,EAAA,o+BAAA,EAAA,MAAA,EAAA,CAAA,8kDAAA,CAAA,EAAA;;;MEsDU,sCAAsC,CAAA;;AAEhC,IAAA,IAAI,GAAM,MAAM,EAAC,iBAA+D,EAAC;AACjF,IAAA,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC;AACrC,IAAA,IAAI,GAAG,MAAM,CAA0C,qBAAqB,CAAC;AAC7E,IAAA,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK;;;AAI9B,IAAA,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;;AAEzC,IAAA,aAAa,GAAG,MAAM,CAAe,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AAE3E;;;AAGG;AACc,IAAA,gBAAgB,GAAG,IAAI,OAAO,EAAU;AAExC,IAAA,gBAAgB,GAAG,MAAM,CAAM,EAAE,4DAAC;;AAGnD;;;;;AAKG;IACM,QAAQ,GAAG,UAAU,CAAC;AAC7B,QAAA,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;;;AAG1C,QAAA,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KACjB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAC7B,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAuB,CAAC,CAAC,CACnE;QACH,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAuB;AAC3D,KAAA,CAAC;;AAGO,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,qDAAC;IACrD,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AACjD,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,oDAAC;AAClD,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,yDAAC;AAEpE;;;;;;AAMG;AACc,IAAA,MAAM,GAAG,MAAM,CAAC,CAAC,kDAAC;AAC1B,IAAA,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;AACxB,IAAA,YAAY,GAAG,MAAM,CAAC,MAAK;AAC1C,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE;YAC3B;AACF,QAAA,IAAI;YACF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC;QAC1E;AAAE,QAAA,MAAM;;;QAGR;AACF,IAAA,CAAC,wDAAC;;IAGO,gBAAgB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,KAAK,CAAC,4DAAC;;IAElF,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,GAAG,CAAC,yDAAC;;IAE7E,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;;AAErF,IAAA,cAAc,GAAG,MAAM,CAAC,KAAK,0DAAC;AAE9B,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AACnC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE;AAC5B,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;AACpC,QAAA,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AACnD,IAAA,CAAC,uDAAC;AAEO,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AACpC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE;AAC5B,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;AACpC,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;QAChE,OAAO,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM;AAC1C,IAAA,CAAC,wDAAC;;AAGF;;;;;;;;;;;;;;;;AAgBG;IACK,sBAAsB,GAAkB,IAAI;AACnC,IAAA,YAAY,GAAG,MAAM,CAAC,MAAK;;AAE1C,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE;AACzB,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B;QACF;AAEA,QAAA,IAAI,KAAwB;AAC5B,QAAA,IAAI;AACF,YAAA,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;QAC/B;AAAE,QAAA,MAAM;;;YAGN;QACF;AACA,QAAA,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,EAAE,GAAG,SAAS,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAM;QACzE,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;;;QAIxC,IAAI,WAAW,KAAK,IAAI,CAAC,sBAAsB,IAAI,UAAU,IAAI,CAAC,EAAE;AAClE,YAAA,IAAI,CAAC,sBAAsB,GAAG,WAAW;AACzC,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;YAC3C;QACF;;;QAIA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAmB;AAChD,QAAA,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,IAAG;AACjC,YAAA,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAChE,YAAA,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,GAAG;AACtD,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC,wDAAC;AAEF,IAAA,WAAA,GAAA;;AAEE,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;AAExD;;;;;;;AAOG;QACH,KAAK,CACH,IAAI,CAAC,gBAAgB;;;QAGrB,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,oBAAoB,EAAE,CAAC;aAEhF,IAAI,CAAC,oBAAoB,EAAE,EAAE,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC;aAC9D,SAAS,CAAC,CAAC,IAAG;AACb,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;AACpE,QAAA,CAAC,CAAC;IAEN;;AAIA,IAAA,UAAU,CAAC,IAAO,EAAA;QAChB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAmB;AAChD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;AACrB,QAAA,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC;IACvD;AAEA;;;AAGG;AACH,IAAA,QAAQ,CAAC,IAAgB,EAAA;AACvB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM;AAC5B,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAmB,CAAC,IAAI,EAAE,CAAC;QAC1D,IAAI,CAAC,GAAG,CAAC,cAAc;AAAE,YAAA,OAAO,MAAM;AACtC,QAAA,IAAI;YACF,OAAO,GAAG,CAAC,cAAc,CAAC,IAAS,CAAC,IAAI,MAAM;QAChD;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,MAAM;QACf;IACF;AAEA,IAAA,aAAa,CAAC,IAAgB,EAAA;QAC5B,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;AAC/B,YAAA,IAAI;gBAAE,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAS,CAAC;YAAE;AAAE,YAAA,MAAM,qBAAqB;QACpF;AACA,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;IACpD;;AAGiB,IAAA,YAAY,GAAG,MAAM,CAAe,IAAI,GAAG,EAAE,wDAAC;;AAG/D,IAAA,cAAc,CAAC,IAAgB,EAAA;AAC7B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAmB,CAAC;QACtD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;AAC9B,YAAA,OAAO,IAAI;QACb,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,IAAS,CAAC;IAClD;;AAGA,IAAA,aAAa,CAAC,IAAgB,EAAA;AAC5B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAmB,CAAC;QACtD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpD;;AAIA,IAAA,UAAU,CAAC,IAAO,EAAA;QAChB,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;YAAE;QAEvC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAmB;AAChD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;AAErB,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AACtB,YAAA,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;gBACzB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;YACvE;iBAAO;;gBAEL,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,IAAI;AACjC,oBAAA,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC;oBACpC,IAAI;AACL,iBAAA,CAAC;YACJ;QACF;aAAO;AACL,YAAA,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;AACzB,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B;iBAAO;gBACL,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC9B,IAAI,CAAC,OAAO,EAAE;YAChB;QACF;IACF;AAEA,IAAA,kBAAkB,CAAC,IAAgB,EAAA;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAmB;AAChD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACrB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;IACvE;;IAIA,YAAY,CAAC,KAAY,EAAE,SAAsB,EAAA;AAC/C,QAAA,SAAS,CAAC,SAAS,GAAG,CAAC;;QAEvB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAE,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC;IAC1D;AAEA,IAAA,UAAU,CAAC,SAAuB,EAAA;;;AAGhC,QAAA,IAAI,SAAS;AAAE,YAAA,SAAS,CAAC,SAAS,GAAG,CAAC;AACtC,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;;AAElB,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;IAChC;;AAIA,IAAA,QAAQ,CAAC,SAAsB,EAAA;;QAE7B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,GAAG,CAAC,CAAC;QAEhD,IAAI,IAAI,CAAC,SAAS,EAAE;YAAE;QACtB,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,SAAS;;;AAG3D,QAAA,IACE,SAAS,GAAG,YAAY,GAAG,GAAG,IAAI,YAAY;YAC9C,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,EACpC;YACA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC,CAAC;QACzE;IACF;;IAGA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;IACxB;;IAIA,eAAe,GAAA;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAmB;AAChD,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;YACtB,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACpE,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,IAC7B,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAe,CAAC,CAAC,CAC5D;QACH;aAAO;AACL,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CACpC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,CACrE;AACD,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,GAAG,QAAQ,CAAC,CAAC;QAC7D;IACF;;IAIA,OAAO,GAAA;QACL,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;IACzC;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;IAC5B;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;IAC9B;wGA/TW,sCAAsC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAtC,sCAAsC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7EnD,60TAyNA,EAAA,MAAA,EAAA,CAAA,68XAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED/JI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAK,GAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAN,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACpB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,kBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,GAAA,CAAA,WAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,WAAA,EAAA,IAAA,EAAA,UAAA,EAAA,eAAA,EAAA,MAAA,EAAA,OAAA,EAAA,eAAA,EAAA,UAAA,EAAA,OAAA,EAAA,qBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjB,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,cAAc,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;4FAOL,sCAAsC,EAAA,UAAA,EAAA,CAAA;kBAtBlD,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mCAAmC,EAAA,OAAA,EACpC;wBACP,YAAY;wBACZ,WAAW;wBACX,eAAe;wBACf,cAAc;wBACd,gBAAgB;wBAChB,kBAAkB;wBAClB,aAAa;wBACb,cAAc;wBACd,oBAAoB;wBACpB,eAAe;wBACf,iBAAiB;wBACjB,gBAAgB;wBAChB,cAAc;AACf,qBAAA,EAAA,aAAA,EAGc,iBAAiB,CAAC,IAAI,EAAA,eAAA,EACpB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,60TAAA,EAAA,MAAA,EAAA,CAAA,68XAAA,CAAA,EAAA;;;MEpBpC,kBAAkB,CAAA;;AAEZ,IAAA,YAAY,GAAG,MAAM,CAAC,cAAc,CAAC;;AAErC,IAAA,UAAU,GAAG,MAAM,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;IAE9D,gBAAgB,GAAG,MAAM,CAAC,kBAAkB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACjE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAChD,IAAA,kBAAkB,GAAG,MAAM,CAAC,iBAAiB,CAAC;AACtD,IAAA,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK;;;AAI9B,IAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,gDAAU;;AAEhC,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,iDAAC;;AAEzB,IAAA,QAAQ,GAAG,KAAK,CAAC,QAAQ,mDAAiD;;AAE1E,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,iDAA4B;;AAEnD,IAAA,OAAO,GAAG,KAAK,CACtB,MAAM,CAAI;AACR,QAAA,UAAU,EAAE,CAAC;AACb,QAAA,QAAQ,EAAE,EAAE;AACZ,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,MAAM,EAAE,SAAS;AACb,KAAA,CAAC,mDACR;;AAEQ,IAAA,aAAa,GAAG,KAAK,CAAe,EAAE,yDAAC;;AAEvC,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,4CAAI,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAA7B,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAC;;AAExD,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,4CAAI,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAA7B,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAC;;AAExD,IAAA,SAAS,GAAG,KAAK,CAAC,KAAK,6CAAI,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAA7B,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAC;AAClE;;;;AAIG;AACM,IAAA,WAAW,GAAG,KAAK,CAAmB,OAAO,uDAAC;;AAE9C,IAAA,UAAU,GAAG,KAAK,CAAC,IAAI,8CAAI,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAA7B,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAC;;IAEzD,iBAAiB,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;;IAEnC,gBAAgB,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;;IAElC,YAAY,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;;IAE9B,UAAU,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;;AAE5B,IAAA,eAAe,GAAG,KAAK,CAAkB,OAAO,2DAAC;;AAEjD,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,iDAAC;;AAEzB,IAAA,IAAI,GAAG,KAAK,CAAS,EAAE,gDAAC;;AAExB,IAAA,cAAc,GAAG,KAAK,CAAuC,IAAI,0DAAC;AAC3E;;;AAGG;AACM,IAAA,oBAAoB,GAAG,KAAK,CAA2B,IAAI,gEAAC;;AAG5D,IAAA,iBAAiB,GAAG,KAAK,CAAC,CAAC,6DAAC;;AAE5B,IAAA,cAAc,GAAG,KAAK,CAAmB,QAAQ,0DAAC;;AAElD,IAAA,aAAa,GAAG,KAAK,CAAC,KAAK,iDAAI,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAA7B,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAC;;IAE7D,cAAc,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;;;IAIhC,WAAW,GAAG,MAAM,EAAyC;;IAE7D,eAAe,GAAG,MAAM,EAAgB;;AAG9B,IAAA,cAAc,GAAG,MAAM,CAAe,EAAE,0DAAC;AAC3C,IAAA,YAAY,GAAG,MAAM,CAAC,KAAK,wDAAC;AAC1B,IAAA,OAAO,GAAG,MAAM,CAAC,KAAK,mDAAC;AAE1C;;;;;;AAMG;AACgB,IAAA,YAAY,GAAG,IAAI,WAAW,CAAS,EAAE,CAAC;AAErD,IAAA,QAAQ,GAAsD,MAAK,EAAE,CAAC;AACtE,IAAA,SAAS,GAAe,MAAK,EAAE,CAAC;;IAEhC,aAAa,GAAG,KAAK;;IAErB,oBAAoB,GAAkB,IAAI;;AAG/B,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,sDAAC;AAEnE,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AAC/C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE;AACnC,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,EAAE;QACjC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AACpD,IAAA,CAAC,yDAAC;AAEiB,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,GAAG,CAAC,wDAAC;AAE/D,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,OAAO,qDAAC;IAE7E,cAAc,GAAG,QAAQ,CAAC,MAC3C,IAAI,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACzD;IAEkB,mBAAmB,GAAG,QAAQ,CAAC,MAChD,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,qBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACrE;;AAGkB,IAAA,iBAAiB,GAAsB;QACxD,YAAY,EAAE,MACZ,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC,UAAU,EAAE,OAAO,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC;KAC9F;;IAGO,sBAAsB,GAAA;AAC5B,QAAA,OAAO,IAAI,CAAC,gBAAgB,EAAE,SAAS,IAAI,IAAI,CAAC,WAAW,EAAE,SAAS,IAAI,KAAK;IACjF;AAEA;;;;AAIG;IACO,UAAU,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,KAAK;IAC7E;;IAGmB,0BAA0B,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,iBAAiB,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,MAAM,sEAAC;IACnG,kBAAkB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,SAAS,8DAAC;IAC7F,qBAAqB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,eAAe,CAAC,OAAO,iEAAC;IACnG,mBAAmB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,eAAe,CAAC,KAAK,+DAAC;IAC7F,uBAAuB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,eAAe,CAAC,SAAS,mEAAC;AAE5H,IAAA,WAAA,GAAA;QACE,IAAI,IAAI,CAAC,UAAU;AACjB,YAAA,IAAI,CAAC,UAAU,CAAC,aAAa,GAAG,IAAI;;;QAItC,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE;YACrC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAmB;YAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;AAErE,YAAA,IAAI,WAAW,KAAK,IAAI,CAAC,oBAAoB;gBAC3C;AAEF,YAAA,IAAI,CAAC,oBAAoB,GAAG,WAAW;AACvC,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC;AACnC,QAAA,CAAC,CAAC;;QAGF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE;AACnC,YAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,gBAAA,IAAI,CAAC,aAAa,GAAG,KAAK;gBAC1B;YACF;YACA,SAAS,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AACzC,QAAA,CAAC,CAAC;AAEF;;;;;AAKG;AACH,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,EAAE,QAAQ,IAAI,IAAI,CAAC,WAAW,EAAE,QAAQ;QAClF,YAAY,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,SAAS,CAAC,MAAK;AACtD,YAAA,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE;AACjC,YAAA,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE;AACxC,QAAA,CAAC,CAAC;;QAGF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE;AAClC,YAAA,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,KAAK,KAAK;AACnC,gBAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC3D,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE;AAClC,YAAA,IAAI,QAAQ,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO;gBACvC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC5C,iBAAA,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ;gBAC9C,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAClD,QAAA,CAAC,CAAC;IACJ;;AAGA,IAAA,UAAU,CAAC,KAAuC,EAAA;QAChD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAmB;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;AACtC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;;AAG1D,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC;YACpC;AAEF,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,QAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;IAC/B;AAEA,IAAA,gBAAgB,CAAC,EAAqD,EAAA;AACpE,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC;IACnC;;AAGQ,IAAA,aAAa,CAAC,KAAuC,EAAA;QAC3D,IAAI,KAAK,IAAI,IAAI;AAAE,YAAA,OAAO,EAAE;AAC5B,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,CAAC;IAC/C;AAEQ,IAAA,kBAAkB,CAAC,IAAkB,EAAA;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAmB;;QAE7C,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAU,CAAC,CAAC;AAC3E,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAK,EAAE,CAAC,GAAG,GAAG,CAAC,EAAiB,CAAC,CAAC;IACtF;IAEQ,UAAU,CAAC,CAAe,EAAE,CAA6B,EAAA;AAC/D,QAAA,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;AAAE,YAAA,OAAO,KAAK;AACvC,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;AACtB,QAAA,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACjC;AAEQ,IAAA,UAAU,CAAC,KAAmB,EAAA;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAmB;;QAE7C,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;AAEjE,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;;AAEnB,YAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAe,CAAC,GAAG,IAAI,CAAC;AACvF,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC;QACnC;aAAO;AACL,YAAA,IAAI,CAAC,QAAQ,CAAE,UAAU,CAAC,CAAC,CAAC,GAAG,GAAG,CAAgB,IAAI,IAAI,CAAC;YAC3D,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACtC;AACA,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC;IACvC;AAEA;;;AAGG;AACO,IAAA,QAAQ,CAAC,IAAgB,EAAA;AACjC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE;AACzB,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAmB,CAAC,IAAI,EAAE,CAAC;QAC1D,IAAI,CAAC,GAAG,CAAC,cAAc;AAAE,YAAA,OAAO,MAAM;AACtC,QAAA,IAAI;YACF,OAAO,GAAG,CAAC,cAAc,CAAC,IAAS,CAAC,IAAI,MAAM;QAChD;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,MAAM;QACf;IACF;;AAGA,IAAA,eAAe,CAAC,KAAY,EAAA;QAC1B,KAAK,CAAC,eAAe,EAAE;QAEvB,IAAI,IAAI,CAAC,UAAU,EAAE;YAAE;QAEvB,IAAI,CAAC,SAAS,EAAE;AAChB,QAAA,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE;AACzC,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AAEtB,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE;AACpC,QAAA,aAAa,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;AAEpD,QAAA,MAAM,IAAI,GAA4C;YACpD,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE;AACnC,YAAA,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;AACrB,YAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;AACzB,YAAA,OAAO,EAAE,aAAa;AACtB,YAAA,aAAa,EAAE,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;AACzC,YAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;AACzB,YAAA,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;AAC7B,YAAA,iBAAiB,EAAE,IAAI,CAAC,0BAA0B,EAAE;AACpD,YAAA,gBAAgB,EAAE,IAAI,CAAC,kBAAkB,EAAE;AAC3C,YAAA,YAAY,EAAE,IAAI,CAAC,qBAAqB,EAAE;AAC1C,YAAA,UAAU,EAAE,IAAI,CAAC,mBAAmB,EAAE;AACtC,YAAA,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE;AACrC,YAAA,oBAAoB,EAAE,IAAI,CAAC,oBAAoB,EAAE;AACjD,YAAA,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE;AACnC,YAAA,cAAc,EAAE,IAAI,CAAC,uBAAuB,EAAE;SAC/C;AAED,QAAA,IAAI,CAAC;aACF,IAAI,CACH,sCAAsC,EACtC;YACE,IAAI;AACJ,YAAA,UAAU,EAAE,4BAA4B;AACxC,YAAA,aAAa,EAAE,+BAA+B;YAC9C,SAAS,EAAE,IAAI,CAAC,UAAU,GAAG,sBAAsB,GAAG,gBAAgB;SACvE;AAEF,aAAA,cAAc;aACd,SAAS,CAAC,MAAM,IAAG;AAClB,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACvB,YAAA,IAAI,MAAM,KAAK,SAAS,EAAE;AACxB,gBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;YACjC;YACA,IAAI,CAAC,SAAS,EAAE;AAChB,YAAA,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE;AAC3C,QAAA,CAAC,CAAC;IACN;;AAGA,IAAA,gBAAgB,CAAC,KAAoB,EAAA;QACnC,IAAI,IAAI,CAAC,UAAU,EAAE;YAAE;AACvB,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE;YAC3E,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;QAC7B;IACF;;;;IAKA,UAAU,CAAC,IAAgB,EAAE,MAAoB,EAAA;QAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAmB;AAC7C,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5E,IAAI,CAAC,SAAS,EAAE;AAChB,QAAA,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE;IAC3C;AAEA,IAAA,cAAc,CAAC,KAAY,EAAA;QACzB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC,SAAS,EAAE;AAChB,QAAA,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE;IAC3C;wGAvWW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvD/B,2rIAoHA,EAAA,MAAA,EAAA,CAAA,2sFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED3EI,YAAY,8BACZ,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACpB,eAAe,qNACf,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAL,IAAA,CAAA,WAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,UAAA,EAAA,OAAA,EAAA,mBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,uBAAA,EAAA,+BAAA,EAAA,aAAA,EAAA,IAAA,EAAA,UAAA,EAAA,UAAA,EAAA,iCAAA,CAAA,EAAA,OAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,wEAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,aAAa,qLACb,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,wBAAwB,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAKf,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAlB9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,EAAA,eAAA,EACf,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACP,YAAY;wBACZ,mBAAmB;wBACnB,oBAAoB;wBACpB,eAAe;wBACf,cAAc;wBACd,kBAAkB;wBAClB,aAAa;wBACb,cAAc;wBACd,gBAAgB;wBAChB,wBAAwB;AACzB,qBAAA,EAAA,QAAA,EAAA,2rIAAA,EAAA,MAAA,EAAA,CAAA,2sFAAA,CAAA,EAAA;;;AE/CH,MAAM,eAAe,GAAG,iBAAiB;AAEzC;;;AAGG;AACH,SAAS,SAAS,CAAC,KAAsB,EAAA;IACvC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,CAAA,EAAG,KAAK,CAAA,EAAA,CAAI;AAClD,IAAA,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE;AAC5B,IAAA,OAAO,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAA,EAAG,OAAO,CAAA,EAAA,CAAI,GAAG,OAAO;AACjE;AAEA,SAAS,iBAAiB,CAAC,KAAyC,EAAA;IAClE,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,GAAG,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC;AACxF;MAea,WAAW,CAAA;AACL,IAAA,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK;;AAGvC,IAAA,OAAO,GAAG,KAAK,CAAkB,MAAM,mDAAC;;AAGxC,IAAA,KAAK,GAAG,KAAK,CAA0B,MAAM,yCAAI,SAAS,EAAE,SAAS,EAAA,CAAA,GAAA,CAAtB,EAAE,SAAS,EAAE,SAAS,EAAE,GAAC;;AAGxE,IAAA,MAAM,GAAG,KAAK,CAA0B,MAAM,0CAAI,SAAS,EAAE,SAAS,EAAA,CAAA,GAAA,CAAtB,EAAE,SAAS,EAAE,SAAS,EAAE,GAAC;;AAGzE,IAAA,KAAK,GAAG,KAAK,CAAC,CAAC,yCAAI,SAAS,EAAE,eAAe,EAAA,CAAA,GAAA,CAA5B,EAAE,SAAS,EAAE,eAAe,EAAE,GAAC;;AAGhD,IAAA,WAAW,GAAG,KAAK,CAA0B,QAAQ,+CAAI,SAAS,EAAE,SAAS,EAAA,CAAA,GAAA,CAAtB,EAAE,SAAS,EAAE,SAAS,EAAE,GAAC;;AAGhF,IAAA,aAAa,GAAG,KAAK,CAA0B,KAAK,iDAAI,SAAS,EAAE,SAAS,EAAA,CAAA,GAAA,CAAtB,EAAE,SAAS,EAAE,SAAS,EAAE,GAAC;;AAG/E,IAAA,SAAS,GAAG,KAAK,CAAoB,SAAS,qDAAC;AAExD;;;AAGG;IACM,iBAAiB,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;;AAGnC,IAAA,YAAY,GAAG,KAAK,CAAoD,IAAI,gDAAI,SAAS,EAAE,iBAAiB,EAAA,CAAA,GAAA,CAA9B,EAAE,SAAS,EAAE,iBAAiB,EAAE,GAAC;;IAG/G,SAAS,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AAEpC;;;;AAIG;AACM,IAAA,UAAU,GAAG,KAAK,CAAC,KAAK,8CAAI,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAA7B,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAC;AAEhD,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAK;AACnD,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO;AAC3D,IAAA,CAAC,6DAAC;;AAGiB,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AAC7C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC;AACnF,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;AACnD,IAAA,CAAC,uDAAC;AAEiB,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,GAAG,CAAC,uDAAC;;AAG3D,IAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAK;AACtD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE;QACpC,IAAI,QAAQ,KAAK,IAAI;AAAE,YAAA,OAAO,QAAQ;AAEtC,QAAA,QAAQ,IAAI,CAAC,OAAO,EAAE;AACpB,YAAA,KAAK,MAAM,EAAE,OAAO,KAAK;AACzB,YAAA,KAAK,QAAQ,EAAE,OAAO,KAAK;AAC3B,YAAA,KAAK,SAAS,EAAE,OAAO,MAAM;AAC7B,YAAA,KAAK,MAAM;AACX,YAAA,SAAS,OAAO,GAAG;;AAEvB,IAAA,CAAC,gEAAC;;IAGiB,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,KAAK,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;wGAtElG,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAX,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,WAAW,o0DCjCxB,0gBAYA,EAAA,MAAA,EAAA,CAAA,kgCAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FDqBa,WAAW,EAAA,UAAA,EAAA,CAAA;kBAbvB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,EAAA,eAAA,EAGP,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,aAAa,EAAE,gCAAgC;AAC/C,wBAAA,mBAAmB,EAAE,2CAA2C;AAChE,wBAAA,kBAAkB,EAAE,8BAA8B;AAClD,wBAAA,oBAAoB,EAAE,8BAA8B;AACpD,wBAAA,iCAAiC,EAAE,6BAA6B;AACjE,qBAAA,EAAA,QAAA,EAAA,0gBAAA,EAAA,MAAA,EAAA,CAAA,kgCAAA,CAAA,EAAA;;;AELH,IAAI,IAAI,GAAG,CAAC;MAuBC,YAAY,CAAA;AACN,IAAA,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC;AAC/B,IAAA,QAAQ,GAAG,CAAA,OAAA,EAAU,EAAE,IAAI,EAAE;AAC7B,IAAA,YAAY,GAAG,SAAS,CAA+B,aAAa,wDAAC;;;AAK7E,IAAA,MAAM,GAAG,KAAK,CAAS,GAAG,kDAAC;;AAG3B,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,4CAAI,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAA7B,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAC;;AAGxD,IAAA,OAAO,GAAG,KAAK,CAAgB,IAAI,mDAAC;;AAGpC,IAAA,QAAQ,GAAG,KAAK,CAAgB,IAAI,oDAAC;;AAGrC,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,4CAAI,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAA7B,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAC;;IAGxD,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AAEb,IAAA,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK;IAC9B,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,SAAS,yDAAC;;AAG1F,IAAA,IAAI,GAAG,KAAK,CAAgB,IAAI,gDAAC;;AAGjC,IAAA,WAAW,GAAG,KAAK,CAAC,IAAI,+CAAI,SAAS,EAAE,gBAAgB,EAAA,CAAA,GAAA,CAA7B,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAC;;AAG1D,IAAA,OAAO,GAAG,KAAK,CAAsB,SAAS,mDAAC;;;IAK/C,aAAa,GAAG,MAAM,EAAiB;;IAGvC,WAAW,GAAG,MAAM,EAAe;;IAGnC,eAAe,GAAG,MAAM,EAAgB;;;AAKxC,IAAA,KAAK,GAAG,MAAM,CAAgB,EAAE,iDAAC;;AAGjC,IAAA,UAAU,GAAG,MAAM,CAAC,KAAK,sDAAC;;AAG1B,IAAA,eAAe,GAAG,MAAM,CAAC,KAAK,2DAAC;;AAG/B,IAAA,gBAAgB,GAAG,MAAM,CAAC,EAAE,4DAAC;;AAG7B,IAAA,OAAO,GAAG,IAAI,CAAC,QAAQ;;AAGf,IAAA,YAAY,GAAG,MAAM,CAAC,KAAK,wDAAC;AAE7C;;;AAGG;AACM,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,sDAAC;;AAGzD,IAAA,UAAU,GAAG,QAAQ,CAAC,MACvC,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,sDAChE;;AAIO,IAAA,SAAS,GAA4B,MAAK,EAAE,CAAC;AAC7C,IAAA,UAAU,GAAe,MAAK,EAAE,CAAC;AAEzC,IAAA,UAAU,CAAC,KAAoB,EAAA;QAC7B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AAChC,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB;QACF;QACA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACtC;AAEA,IAAA,gBAAgB,CAAC,EAA2B,EAAA;AAC1C,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;IACtB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC;IACnC;;AAIA,IAAA,UAAU,CAAC,KAAgB,EAAA;QACzB,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AAAE,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;IACnD;AAEA,IAAA,WAAW,CAAC,KAAgB,EAAA;QAC1B,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;IAC5B;AAEA,IAAA,MAAM,CAAC,KAAgB,EAAA;QACrB,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;QAC1B,IAAI,IAAI,CAAC,UAAU,EAAE;YAAE;AAEvB,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,EAAE,KAAK;QACvC,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;YAC7B,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrC,IAAI,CAAC,iBAAiB,EAAE;QAC1B;IACF;;AAIA,IAAA,iBAAiB,CAAC,KAAY,EAAA;AAC5B,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B;AAC9C,QAAA,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AACzC,YAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7C;AACA,QAAA,KAAK,CAAC,KAAK,GAAG,EAAE;IAClB;IAEA,cAAc,GAAA;QACZ,IAAI,IAAI,CAAC,UAAU,EAAE;YAAE;QACvB,IAAI,CAAC,UAAU,EAAE;QACjB,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE;IAC5C;;AAIA,IAAA,UAAU,CAAC,IAAiB,EAAA;QAC1B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;AAC7D,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;QAC3B,IAAI,CAAC,WAAW,EAAE;AAClB,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE;;;AAKA,IAAA,UAAU,CAAC,KAAa,EAAA;QACtB,IAAI,KAAK,GAAG,IAAI;YAAE,OAAO,CAAA,EAAG,KAAK,CAAA,EAAA,CAAI;AACrC,QAAA,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI;AAAE,YAAA,OAAO,CAAA,EAAG,CAAC,KAAK,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA,GAAA,CAAK;AACjE,QAAA,OAAO,GAAG,CAAC,KAAK,IAAI,IAAI,GAAG,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK;IACnD;;AAGA,IAAA,WAAW,CAAC,IAAY,EAAA;AACtB,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;AAAE,YAAA,OAAO,OAAO;QAC7C,IAAI,IAAI,KAAK,iBAAiB;AAAE,YAAA,OAAO,gBAAgB;AACvD,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;AAAE,YAAA,OAAO,UAAU;AAChD,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;AAAE,YAAA,OAAO,YAAY;AAClD,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;AAAE,YAAA,OAAO,aAAa;AAChF,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;AAAE,YAAA,OAAO,aAAa;AAC5E,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;AAAE,YAAA,OAAO,YAAY;AAC5E,QAAA,OAAO,mBAAmB;IAC5B;;AAGA,IAAA,iBAAiB,CAAC,IAAY,EAAA;AAC5B,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;AAAE,YAAA,OAAO,oBAAoB;QAC1D,IAAI,IAAI,KAAK,iBAAiB;AAAE,YAAA,OAAO,kBAAkB;AACzD,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;AAAE,YAAA,OAAO,oBAAoB;AAC1D,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;AAAE,YAAA,OAAO,oBAAoB;AAC1D,QAAA,OAAO,sBAAsB;IAC/B;;AAIQ,IAAA,aAAa,CAAC,KAAa,EAAA;QACjC,IAAI,CAAC,UAAU,EAAE;QAEjB,IAAI,QAAQ,GAAG,KAAK;QACpB,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM;AACxC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE;;AAG3B,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,GAAG,KAAK,IAAI,IAAI,YAAY,GAAG,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE;AAC3E,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,YAAY,CAAC;YAC/C,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;YACxC,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC;AAErC,YAAA,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE;AACxB,gBAAA,MAAM,GAAG,GAAiB;AACxB,oBAAA,IAAI,EAAE,CAAC;AACP,oBAAA,IAAI,EAAE,oBAAoB;oBAC1B,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC;iBAC9C;AACD,gBAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;YAChC;QACF;;AAGA,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE;YACpB,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QACjC;AAEA,QAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;AAE9D,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;AACnB,YAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC,CAAC;QACnD;aAAO;AACL,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC1B;AAEA,QAAA,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC;QAChC,IAAI,CAAC,WAAW,EAAE;AAElB,QAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,MAAM;AACpE,QAAA,IAAI,UAAU,GAAG,CAAC,EAAE;YAClB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC;AACnE,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACrE;IACF;AAEQ,IAAA,kBAAkB,CAAC,IAAU,EAAA;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;;AAGnC,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE;AACvD,YAAA,IAAI,CAAC,MAAM,GAAG,OAAO;AACrB,YAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;AACjG,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;gBACxB,IAAI;AACJ,gBAAA,IAAI,EAAE,kBAAkB;gBACxB,OAAO,EAAE,IAAI,CAAC,KAAK;AACpB,aAAA,CAAC;AACF,YAAA,OAAO,IAAI;QACb;;AAGA,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE;QAC5B,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,KAAK,EAAE;AACvC,YAAA,IAAI,CAAC,MAAM,GAAG,OAAO;AACrB,YAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AACpE,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;gBACxB,IAAI;AACJ,gBAAA,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,IAAI,CAAC,KAAK;AACpB,aAAA,CAAC;AACF,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,OAAO,IAAI;IACb;AAEQ,IAAA,WAAW,CAAC,IAAU,EAAA;QAC5B,OAAO;YACL,IAAI;AACJ,YAAA,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE;YACtB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,YAAA,MAAM,EAAE,OAAO;SAChB;IACH;AAEQ,IAAA,cAAc,CAAC,IAAU,EAAA;AAC/B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;QAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AAExC,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,IAAG;;AAE1B,YAAA,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AAC3B,gBAAA,OAAO,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;YACnC;;AAEA,YAAA,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;gBAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACnC,OAAO,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC;YAC1C;;YAEA,OAAO,QAAQ,KAAK,OAAO;AAC7B,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,iBAAiB,CAAC,KAAoB,EAAA;AAC5C,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC;YAAE;AAExC,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,YAAA,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE;AAClE,gBAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE;AAC/B,gBAAA,MAAM,CAAC,MAAM,GAAG,MAAK;AACnB,oBAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,IACpB,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAgB,EAAE,GAAG,CAAC,CAAC,CACjF;AACH,gBAAA,CAAC;AACD,gBAAA,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;YACjC;QACF;IACF;IAEQ,WAAW,GAAA;QACjB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;IACnC;IAEQ,iBAAiB,GAAA;AACvB,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;AAC9B,QAAA,UAAU,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC;IACxD;IAEQ,WAAW,GAAA;AACjB,QAAA,IAAI,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,UAAU,EAAE;AAC3F,YAAA,OAAO,MAAM,CAAC,UAAU,EAAE;QAC5B;QACA,OAAO,CAAA,EAAG,IAAI,CAAC,GAAG,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA,CAAE;IAClE;wGAxUW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,WAAA,EAAA,aAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,wBAAA,EAAA,cAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,sBAAA,EAAA,wBAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,SAAA,EAfZ;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,YAAY,CAAC;AAC3C,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACF,SAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxCH,85QA6JA,EAAA,MAAA,EAAA,CAAA,g3NAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED/HY,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,qLAAE,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAN,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;4FAmB/C,YAAY,EAAA,UAAA,EAAA,CAAA;kBArBxB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EAAA,OAAA,EACjB,CAAC,eAAe,EAAE,aAAa,EAAE,gBAAgB,CAAC,EAAA,aAAA,EAG5C,iBAAiB,CAAC,IAAI,EAAA,SAAA,EAC1B;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,kBAAkB,CAAC;AAC3C,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;qBACF,EAAA,IAAA,EACK;AACJ,wBAAA,OAAO,EAAE,gBAAgB;AACzB,wBAAA,0BAA0B,EAAE,cAAc;AAC1C,wBAAA,yBAAyB,EAAE,yBAAyB;AACpD,wBAAA,yBAAyB,EAAE,yBAAyB;AACpD,wBAAA,wBAAwB,EAAE,wBAAwB;AACnD,qBAAA,EAAA,QAAA,EAAA,85QAAA,EAAA,MAAA,EAAA,CAAA,g3NAAA,CAAA,EAAA;0EAKuE,aAAa,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,eAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEpDvF;;AAEG;;;;"}
1
+ {"version":3,"file":"ngx-eiffage-material.mjs","sources":["../../../projects/ngx-eiffage-material/src/lib/i18n/ngx-tables.ts","../../../projects/ngx-eiffage-material/src/lib/i18n/ngx-eiffage-texts.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-loading-button/ngx-loading-button.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-loading-button/ngx-loading-button.component.html","../../../projects/ngx-eiffage-material/src/lib/components/shared/file-utils.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-input-file/ngx-input-file.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-input-file/ngx-input-file.component.html","../../../projects/ngx-eiffage-material/src/lib/utils/string-operations.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-basic-select/ngx-basic-select.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-basic-select/ngx-basic-select.component.html","../../../projects/ngx-eiffage-material/src/lib/models/dialog-config.ts","../../../projects/ngx-eiffage-material/src/lib/directives/dynamic-host.directive.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-dialog/ngx-dialog.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-dialog/ngx-dialog.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-confirm-dialog/ngx-confirm-dialog.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-confirm-dialog/ngx-confirm-dialog.component.html","../../../projects/ngx-eiffage-material/src/lib/directives/dynamic-cell-host.directive.ts","../../../projects/ngx-eiffage-material/src/lib/pipes/only-upper-first-character.pipe.ts","../../../projects/ngx-eiffage-material/src/lib/models/paginated-table-config.ts","../../../projects/ngx-eiffage-material/src/lib/models/advanced-filter-utils.ts","../../../projects/ngx-eiffage-material/src/lib/models/user-id-factory.ts","../../../projects/ngx-eiffage-material/src/lib/models/advanced-filter.ts","../../../projects/ngx-eiffage-material/src/lib/services/advanced-filter.service.ts","../../../projects/ngx-eiffage-material/src/lib/services/column-config.service.ts","../../../projects/ngx-eiffage-material/src/lib/services/datos-pantalla.service.ts","../../../projects/ngx-eiffage-material/src/lib/services/ngx-dialog.service.ts","../../../projects/ngx-eiffage-material/src/lib/common/components/configure-table-columns/configure-table-columns.component.ts","../../../projects/ngx-eiffage-material/src/lib/common/components/configure-table-columns/configure-table-columns.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-searchable-select/ngx-paginated-searchable-select.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-searchable-select/ngx-paginated-searchable-select.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-searchable-select/ngx-searchable-select.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-searchable-select/ngx-searchable-select.component.html","../../../projects/ngx-eiffage-material/src/lib/common/components/advanced-filter-rule/advanced-filter-rule.component.ts","../../../projects/ngx-eiffage-material/src/lib/common/components/advanced-filter-rule/advanced-filter-rule.component.html","../../../projects/ngx-eiffage-material/src/lib/common/components/advanced-filter-group/advanced-filter-group.component.ts","../../../projects/ngx-eiffage-material/src/lib/common/components/advanced-filter-group/advanced-filter-group.component.html","../../../projects/ngx-eiffage-material/src/lib/common/components/configure-advanced-filter/configure-advanced-filter.component.ts","../../../projects/ngx-eiffage-material/src/lib/common/components/configure-advanced-filter/configure-advanced-filter.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-table/ngx-paginated-table.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-table/ngx-paginated-table.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-basic-table/ngx-basic-table.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-basic-table/ngx-basic-table.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-alert/ngx-alert.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-alert/ngx-alert.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-select/bottom-sheet/ngx-paginated-select-bottom-sheet.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-select/bottom-sheet/ngx-paginated-select-bottom-sheet.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-select/ngx-paginated-select.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-paginated-select/ngx-paginated-select.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-skeleton/ngx-skeleton.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-skeleton/ngx-skeleton.component.html","../../../projects/ngx-eiffage-material/src/lib/components/ngx-file-input/ngx-file-input.component.ts","../../../projects/ngx-eiffage-material/src/lib/components/ngx-file-input/ngx-file-input.component.html","../../../projects/ngx-eiffage-material/src/ngx-eiffage-material.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\n\r\n/**\r\n * @deprecated Usa `provideNgxEiffageTexts()`: solo hay que indicar los textos que cambian, se agrupan\r\n * por componente y se actualizan solos al cambiar de idioma (signals). Mientras tanto, una subclase de\r\n * NgxTablesIntl provista en la app se sigue respetando. Esta clase no recibirá textos nuevos y se\r\n * eliminará en una versión mayor.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class NgxTablesIntl {\r\n /**\r\n * Stream que emite cuando las etiquetas cambian.\r\n * Los componentes deben reaccionar a estos cambios.\r\n */\r\n readonly changes = new Subject<void>();\r\n\r\n // ========================================\r\n // === NGX-PAGINATED-TABLE ===\r\n // ========================================\r\n\r\n // === Botones de acciones ===\r\n /** Etiqueta del botón de crear/nuevo */\r\n createButtonLabel: string = 'Nuevo';\r\n\r\n /** Tooltip del botón de editar */\r\n editTooltip: string = 'Editar';\r\n\r\n /** Tooltip del botón de eliminar */\r\n deleteTooltip: string = 'Eliminar';\r\n\r\n /** Etiqueta del botón de confirmar eliminación */\r\n confirmDeleteLabel: string = 'Eliminar';\r\n\r\n // === Búsqueda y filtros ===\r\n /** Placeholder del campo de búsqueda */\r\n searchPlaceholder: string = 'Buscar...';\r\n\r\n /** Tooltip del botón de limpiar búsqueda */\r\n clearSearchTooltip: string = 'Limpiar búsqueda';\r\n\r\n /** Tooltip del botón de editar columnas */\r\n editColumnsTooltip: string = 'Visualizar y ordenar columnas';\r\n\r\n /** Etiqueta para filtros avanzados */\r\n advancedFiltersLabel: string = 'Filtros avanzados';\r\n\r\n /** Etiqueta para nuevo filtro avanzado */\r\n newAdvancedFilterLabel: string = 'Nuevo filtro';\r\n\r\n /** Tooltip del botón de editar filtro avanzado - usa función getEditAdvancedFilterTooltip() */\r\n editAdvancedFilterTooltip: string = 'Editar filtro';\r\n\r\n /** Tooltip del botón de eliminar filtro avanzado - usa función getDeleteAdvancedFilterTooltip() */\r\n deleteAdvancedFilterTooltip: string = 'Eliminar filtro';\r\n\r\n /** Tooltip del botón de quitar filtro avanzado aplicado */\r\n removeAdvancedFilterTooltip: string = 'Quitar filtros avanzados';\r\n\r\n /** Texto cuando no hay filtros avanzados */\r\n noAdvancedFiltersLabel: string = 'No hay filtros guardados';\r\n\r\n /** Etiqueta para quitar filtro en select */\r\n removeFilterLabel: string = '-- Quitar filtro --';\r\n\r\n // === Selección de filas ===\r\n /** Tooltip del checkbox de seleccionar todas las filas */\r\n selectAllTooltip: string = 'Seleccionar todo';\r\n\r\n /** Tooltip del checkbox de deseleccionar todas las filas */\r\n deselectAllTooltip: string = 'Deseleccionar todo';\r\n\r\n /** Etiqueta del botón de deseleccionar todos */\r\n deselectAllLabel: string = 'Desmarcar todos los registros';\r\n\r\n /** Tooltip del menú de acciones de selección */\r\n selectionActionsTooltip: string = 'Operaciones sobre los registros seleccionados';\r\n\r\n // === Exportación ===\r\n /** Tooltip del botón de exportar */\r\n exportTooltip: string = 'Exportar datos';\r\n\r\n /** Etiqueta para exportar a Excel */\r\n exportToExcelLabel: string = 'Exportar a XLSX la página actual';\r\n\r\n /** Etiqueta para exportar a PDF */\r\n exportToPdfLabel: string = 'Exportar a PDF la página actual';\r\n\r\n // === Pantalla completa ===\r\n /** Tooltip para entrar en pantalla completa */\r\n enterFullscreenTooltip: string = 'Pantalla completa';\r\n\r\n /** Tooltip para salir de pantalla completa */\r\n exitFullscreenTooltip: string = 'Salir del modo de pantalla completa';\r\n\r\n // === Mensajes ===\r\n /** Mensaje cuando no hay datos */\r\n noDataMessage: string = 'No se han encontrado resultados...';\r\n\r\n /** Mensaje mientras se cargan los datos */\r\n loadingMessage: string = 'Cargando...';\r\n\r\n /** Título del diálogo de confirmación de eliminación por defecto */\r\n deleteConfirmTitle: string = 'Eliminar';\r\n\r\n /** Cuerpo del diálogo de confirmación de eliminación por defecto */\r\n deleteConfirmBody: string = 'Vas a eliminar el registro seleccionado. ¿Estas seguro?';\r\n\r\n /** Título del diálogo de eliminación de filtro avanzado */\r\n deleteAdvancedFilterTitle: string = 'Eliminar plantilla de filtro avanzado';\r\n\r\n // === Columnas ===\r\n /** Etiqueta para la columna de acciones */\r\n actionsLabel: string = 'Acciones';\r\n\r\n // === Filtros de columna ===\r\n /** Placeholder para filtros de fecha */\r\n datePlaceholder: string = 'Fecha';\r\n\r\n /** Placeholder para filtro de rango de fechas - inicio */\r\n dateRangeStartPlaceholder: string = 'Desde';\r\n\r\n /** Placeholder para filtro de rango de fechas - fin */\r\n dateRangeEndPlaceholder: string = 'Hasta';\r\n\r\n // === Filas expandibles ===\r\n /** Tooltip para expandir detalles */\r\n expandDetailsTooltip: string = 'Ver detalles';\r\n\r\n /** Tooltip para contraer detalles */\r\n collapseDetailsTooltip: string = 'Ocultar detalles';\r\n\r\n // === Totales en pie de tabla ===\r\n /** Etiqueta para total por página */\r\n totalPerPageLabel: string = 'Total parcial (por página)';\r\n\r\n /** Etiqueta para total general */\r\n totalGeneralLabel: string = 'Total (todos los registros)';\r\n\r\n // === Diálogos ===\r\n /** Botón de cancelar en diálogos */\r\n cancelButtonLabel: string = 'Cancelar';\r\n\r\n /** Botón de confirmar en diálogos */\r\n confirmButtonLabel: string = 'Confirmar';\r\n\r\n /** Botón de cerrar en diálogos */\r\n closeButtonLabel: string = 'Cerrar';\r\n\r\n /** Botón de guardar en diálogos */\r\n saveButtonLabel: string = 'Guardar';\r\n\r\n /** Botón de guardar y aplicar en diálogos */\r\n saveAndApplyButtonLabel: string = 'Guardar y aplicar';\r\n\r\n // === Diálogo de configurar columnas ===\r\n /** Título del diálogo de configurar columnas */\r\n configureColumnsTitle: string = 'Ordenar y visualizar columnas de la tabla';\r\n\r\n /** Tooltip para anclar columna */\r\n pinColumnTooltip: string = 'Anclar columna';\r\n\r\n /** Tooltip para desanclar columna */\r\n unpinColumnTooltip: string = 'Desanclar';\r\n\r\n /** Tooltip para subir columna */\r\n moveUpTooltip: string = 'Subir';\r\n\r\n /** Tooltip para bajar columna */\r\n moveDownTooltip: string = 'Bajar';\r\n\r\n /** Texto para columnas con filtros aplicados */\r\n hasFiltersAppliedText: string = '(hay filtros aplicados)';\r\n\r\n /** Nota sobre ocultar columnas con filtros */\r\n hideColumnWithFiltersNote: string = 'Para ocultar una columna, primero debes quitar los filtros que tenga aplicados';\r\n\r\n /** Etiqueta de nota */\r\n noteLabel: string = 'Nota:';\r\n\r\n /** Botón de restablecer configuración de columnas */\r\n resetColumnsButtonLabel: string = 'Reestablecer orden y visualización';\r\n\r\n // === Diálogo de filtros avanzados ===\r\n /** Título del diálogo de filtros avanzados */\r\n advancedFiltersDialogTitle: string = 'Filtros avanzados para la tabla';\r\n\r\n /** Label del campo de nombre de plantilla */\r\n templateNameLabel: string = 'Nombre de la plantilla';\r\n\r\n /** Error de nombre obligatorio */\r\n templateNameRequiredError: string = 'El nombre es obligatorio';\r\n\r\n /** Título de ayuda de filtros avanzados */\r\n advancedFiltersHelpTitle: string = 'Uso de filtros avanzados';\r\n\r\n /** Texto de ayuda sobre grupos */\r\n advancedFiltersGroupHelp: string = 'Un conjunto de filtros que se evalúan juntos. Todos los filtros dentro de un grupo usan el mismo conector (“Y” u “O”). Cada rectángulo representa un grupo y dentro de ellos puede haber filtros u otros grupos';\r\n\r\n /** Texto de ayuda sobre filtros */\r\n advancedFiltersRuleHelp: string = 'Una regla individual que compara un campo con un valor (por ejemplo: “Precio > 100”)';\r\n\r\n /** Label de grupo en ayuda */\r\n groupLabel: string = 'Grupo:';\r\n\r\n /** Label de filtro en ayuda */\r\n filterLabel: string = 'Filtro:';\r\n\r\n /** Botón añadir filtro */\r\n addFilterButtonLabel: string = 'Añadir filtro';\r\n\r\n /** Botón añadir grupo */\r\n addGroupButtonLabel: string = 'Añadir grupo';\r\n\r\n /** Tooltip eliminar grupo */\r\n deleteGroupTooltip: string = 'Eliminar grupo';\r\n\r\n /** Tooltip eliminar filtro */\r\n deleteFilterTooltip: string = 'Eliminar filtro';\r\n\r\n // === Reglas de filtros avanzados ===\r\n /** Label de campo */\r\n fieldLabel: string = 'Campo';\r\n\r\n /** Label de condición */\r\n conditionLabel: string = 'Condición';\r\n\r\n /** Label de valor */\r\n valueLabel: string = 'Valor';\r\n\r\n /** Placeholder de seleccionar opción */\r\n selectOptionPlaceholder: string = 'Selecciona una opción';\r\n\r\n /** Opción para quitar campo */\r\n removeFieldOption: string = '-- Quitar campo --';\r\n\r\n /** Opción para quitar condición */\r\n removeConditionOption: string = '-- Quitar condición --';\r\n\r\n /** Opción para quitar valor */\r\n removeValueOption: string = '-- Quitar valor --';\r\n\r\n /** Error de campo obligatorio */\r\n requiredFieldError: string = 'Obligatorio';\r\n\r\n // === Conectores y operadores de filtros ===\r\n /** Conector AND */\r\n connectorAnd: string = 'Y';\r\n\r\n /** Conector OR */\r\n connectorOr: string = 'O';\r\n\r\n /** Operador igual a */\r\n operatorEquals: string = 'Igual a';\r\n\r\n /** Operador distinto de */\r\n operatorNotEquals: string = 'Distinto de';\r\n\r\n /** Operador mayor que */\r\n operatorGreaterThan: string = 'Mayor que';\r\n\r\n /** Operador mayor o igual que */\r\n operatorGreaterOrEquals: string = 'Mayor o igual que';\r\n\r\n /** Operador menor que */\r\n operatorLessThan: string = 'Menor que';\r\n\r\n /** Operador menor o igual que */\r\n operatorLessOrEquals: string = 'Menor o igual que';\r\n\r\n /** Operador contiene */\r\n operatorLike: string = 'Contiene';\r\n\r\n // ========================================\r\n // === NGX-SEARCHABLE-SELECT ===\r\n // ========================================\r\n\r\n /** Mensaje cuando no hay resultados en select */\r\n noResultsMessage: string = 'No se han encontrado resultados...';\r\n\r\n // ========================================\r\n // === NGX-PAGINATED-SEARCHABLE-SELECT ===\r\n // ========================================\r\n\r\n /** Etiqueta del botón de ver más resultados */\r\n showMoreLabel: string = 'Ver más';\r\n\r\n // ========================================\r\n // === NGX-PAGINATED-SELECT ===\r\n // ========================================\r\n\r\n /** Botón de confirmar selección (modo múltiple) */\r\n paginatedSelectConfirmLabel: string = 'Confirmar';\r\n\r\n /** Botón de limpiar selección (modo múltiple) */\r\n paginatedSelectResetLabel: string = 'Limpiar';\r\n\r\n /** Etiqueta del toggle \"Seleccionar todo\" */\r\n paginatedSelectSelectAllLabel: string = 'Seleccionar todo';\r\n\r\n /** Fila \"cargando más…\" al paginar por scroll */\r\n paginatedSelectLoadingMoreLabel: string = 'Cargando más…';\r\n\r\n /** Fila de fin de lista cuando ya no quedan más resultados */\r\n paginatedSelectEndOfListLabel: string = 'No hay más resultados';\r\n\r\n /** Ayuda bajo el mensaje de \"sin resultados\" cuando hay búsqueda activa */\r\n paginatedSelectNoResultsHint: string = 'Prueba con otro término de búsqueda';\r\n\r\n /** Botón para limpiar la búsqueda desde el estado vacío */\r\n paginatedSelectClearSearchLabel: string = 'Limpiar búsqueda';\r\n\r\n /** Título del estado de error al fallar la carga */\r\n paginatedSelectErrorTitle: string = 'No se pudieron cargar los datos';\r\n\r\n /** Ayuda del estado de error */\r\n paginatedSelectErrorHint: string = 'Revisa tu conexión e inténtalo de nuevo';\r\n\r\n /** Botón de reintentar la carga */\r\n paginatedSelectRetryLabel: string = 'Reintentar';\r\n\r\n // ========================================\r\n // === FUNCIONES AUXILIARES ===\r\n // ========================================\r\n\r\n /**\r\n * Función para obtener el mensaje de confirmación de eliminación\r\n * @param itemName Nombre del elemento a eliminar (opcional)\r\n */\r\n getDeleteConfirmMessage(itemName?: string): string {\r\n if (itemName) {\r\n return `Vas a eliminar '${itemName}'. ¿Estas seguro?`;\r\n }\r\n return this.deleteConfirmBody;\r\n }\r\n\r\n /**\r\n * Función para obtener el mensaje de eliminación de filtro avanzado\r\n * @param filterName Nombre del filtro\r\n */\r\n getDeleteAdvancedFilterMessage(filterName: string): string {\r\n return `Vas a eliminar la plantilla de filtro avanzado '${filterName}'. ¿Estas seguro?`;\r\n }\r\n\r\n /**\r\n * Función para obtener el tooltip de editar filtro avanzado con nombre\r\n * @param filterName Nombre del filtro\r\n */\r\n getEditAdvancedFilterTooltip(filterName: string): string {\r\n return `Editar '${filterName}'`;\r\n }\r\n\r\n /**\r\n * Función para obtener el tooltip de eliminar filtro avanzado con nombre\r\n * @param filterName Nombre del filtro\r\n */\r\n getDeleteAdvancedFilterTooltip(filterName: string): string {\r\n return `Eliminar '${filterName}'`;\r\n }\r\n\r\n /**\r\n * Función para obtener el label de elementos seleccionados\r\n * @param count Número de elementos seleccionados\r\n */\r\n getSelectedItemsLabel(count: number): string {\r\n return count === 1\r\n ? `${count} elemento seleccionado`\r\n : `${count} elementos seleccionados`;\r\n }\r\n\r\n /**\r\n * Función para obtener el texto de quitar selección en selects\r\n * @param optionName Nombre de la opción (opcional)\r\n */\r\n getRemoveOptionText(optionName: string): string {\r\n return `-- Quitar ${optionName} --`;\r\n }\r\n\r\n /**\r\n * Mensaje anunciado por lectores de pantalla (aria-live) con el número de\r\n * resultados tras filtrar en un select buscable.\r\n * @param count Número de resultados visibles\r\n */\r\n getSearchResultsCountMessage(count: number): string {\r\n return count === 1 ? '1 resultado' : `${count} resultados`;\r\n }\r\n\r\n /**\r\n * Footer del ngx-paginated-select en modo múltiple: elementos seleccionados\r\n * sobre el total disponible.\r\n */\r\n getPaginatedSelectSelectedCountLabel(selected: number, total: number): string {\r\n return `${selected} de ${total} seleccionados`;\r\n }\r\n\r\n /**\r\n * Footer del ngx-paginated-select en modo simple: número total de resultados.\r\n */\r\n getPaginatedSelectResultsCountLabel(total: number): string {\r\n return total === 1 ? '1 resultado' : `${total} resultados`;\r\n }\r\n}\r\n","import {\n computed,\n EnvironmentProviders,\n inject,\n Injectable,\n InjectionToken,\n isSignal,\n makeEnvironmentProviders,\n Signal,\n signal,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { NgxTablesIntl } from './ngx-tables';\n\n/**\n * Todos los textos de la librería, agrupados por componente.\n * Los que dependen de un dato (nombre, número…) son funciones.\n */\nexport interface NgxEiffageTexts {\n /** Textos compartidos por varios componentes. */\n common: {\n search: string;\n clearSearch: string;\n noData: string;\n loading: string;\n cancel: string;\n confirm: string;\n close: string;\n save: string;\n saveAndApply: string;\n };\n /** ngx-basic-table y ngx-paginated-table. */\n table: {\n create: string;\n edit: string;\n delete: string;\n confirmDelete: string;\n deleteConfirmTitle: string;\n deleteConfirmBody: string;\n editColumns: string;\n deselectAll: string;\n selectionActions: string;\n export: string;\n exportExcel: string;\n exportPdf: string;\n enterFullscreen: string;\n exitFullscreen: string;\n actions: string;\n dateRangeStart: string;\n dateRangeEnd: string;\n totalPerPage: string;\n totalGeneral: string;\n };\n /** Diálogo de ordenar y mostrar columnas de las tablas. */\n columnsDialog: {\n title: string;\n pin: string;\n unpin: string;\n moveUp: string;\n moveDown: string;\n hasFiltersApplied: string;\n hideColumnWithFiltersNote: string;\n note: string;\n reset: string;\n };\n /** Filtros avanzados de ngx-paginated-table. */\n advancedFilters: {\n label: string;\n new: string;\n remove: string;\n editTooltip: (filterName: string) => string;\n deleteTooltip: (filterName: string) => string;\n deleteTitle: string;\n deleteMessage: (filterName: string) => string;\n dialogTitle: string;\n templateName: string;\n templateNameRequired: string;\n helpTitle: string;\n groupHelp: string;\n ruleHelp: string;\n group: string;\n filter: string;\n addFilter: string;\n addGroup: string;\n deleteGroup: string;\n deleteFilter: string;\n field: string;\n condition: string;\n value: string;\n selectOption: string;\n required: string;\n and: string;\n or: string;\n operators: {\n equals: string;\n notEquals: string;\n greaterThan: string;\n greaterOrEquals: string;\n lessThan: string;\n lessOrEquals: string;\n like: string;\n };\n };\n /** ngx-basic-select, ngx-searchable-select y ngx-paginated-searchable-select. */\n select: {\n noResults: string;\n showMore: string;\n removeOption: (optionName: string) => string;\n resultsCount: (count: number) => string;\n };\n /** ngx-paginated-select. */\n paginatedSelect: {\n confirm: string;\n reset: string;\n selectAll: string;\n loadingMore: string;\n endOfList: string;\n noResultsHint: string;\n clearSearch: string;\n errorTitle: string;\n errorHint: string;\n retry: string;\n selectedCount: (selected: number, total: number) => string;\n resultsCount: (total: number) => string;\n };\n /** NgxDialogService y ngx-dialog (botones por defecto). */\n dialog: {\n cancel: string;\n /** Botón de confirmar de NgxDialogService.confirm(). */\n confirm: string;\n /** Botón de aceptar de NgxDialogService.info() y de ngx-dialog. */\n accept: string;\n /** Etiqueta accesible y tooltip del botón X de cerrar. */\n close: string;\n };\n /** ngx-file-input. */\n fileInput: {\n dropLabel: string;\n browse: string;\n remove: (fileName: string) => string;\n removed: (fileName: string) => string;\n added: (count: number) => string;\n maxFiles: (max: number) => string;\n typeNotAllowed: (type: string) => string;\n tooLarge: (maxSize: string) => string;\n };\n /** ngx-input-file. */\n inputFile: {\n label: string;\n /** Texto del campo vacío. */\n placeholder: string;\n /** Pista mientras se arrastran ficheros encima. */\n dropping: string;\n /** Etiqueta accesible y tooltip del botón de examinar. */\n browse: string;\n remove: (fileName: string) => string;\n /** Fichero descartado por no cumplir `accept`. */\n rejectedType: (fileName: string) => string;\n /** Fichero descartado por superar `maxSize` (ya formateado: «2 MB»). */\n rejectedSize: (fileName: string, maxSize: string) => string;\n /** Ficheros descartados por superar `maxFiles`. */\n rejectedCount: (max: number) => string;\n };\n skeleton: {\n loading: string;\n };\n alert: {\n dismiss: string;\n };\n loadingButton: {\n busy: string;\n };\n}\n\n/** Igual que T pero con todo opcional, a cualquier profundidad (las funciones se quedan como están). */\ntype DeepPartial<T> = {\n [K in keyof T]?: T[K] extends (...args: never[]) => unknown ? T[K] : T[K] extends object ? DeepPartial<T[K]> : T[K];\n};\n\n/** Textos que la app quiere cambiar: solo los que difieren de los valores por defecto. */\nexport type NgxEiffageTextsOverrides = DeepPartial<NgxEiffageTexts>;\n\nconst plural = (count: number, one: string, many: string) => (count === 1 ? one : many);\n\n/** Valores por defecto (castellano). */\nexport const NGX_EIFFAGE_DEFAULT_TEXTS: NgxEiffageTexts = {\n common: {\n search: 'Buscar...',\n clearSearch: 'Limpiar búsqueda',\n noData: 'No se han encontrado resultados...',\n loading: 'Cargando...',\n cancel: 'Cancelar',\n confirm: 'Confirmar',\n close: 'Cerrar',\n save: 'Guardar',\n saveAndApply: 'Guardar y aplicar',\n },\n table: {\n create: 'Nuevo',\n edit: 'Editar',\n delete: 'Eliminar',\n confirmDelete: 'Eliminar',\n deleteConfirmTitle: 'Eliminar',\n deleteConfirmBody: 'Vas a eliminar el registro seleccionado. ¿Estas seguro?',\n editColumns: 'Visualizar y ordenar columnas',\n deselectAll: 'Desmarcar todos los registros',\n selectionActions: 'Operaciones sobre los registros seleccionados',\n export: 'Exportar datos',\n exportExcel: 'Exportar a XLSX la página actual',\n exportPdf: 'Exportar a PDF la página actual',\n enterFullscreen: 'Pantalla completa',\n exitFullscreen: 'Salir del modo de pantalla completa',\n actions: 'Acciones',\n dateRangeStart: 'Desde',\n dateRangeEnd: 'Hasta',\n totalPerPage: 'Total parcial (por página)',\n totalGeneral: 'Total (todos los registros)',\n },\n columnsDialog: {\n title: 'Ordenar y visualizar columnas de la tabla',\n pin: 'Anclar columna',\n unpin: 'Desanclar',\n moveUp: 'Subir',\n moveDown: 'Bajar',\n hasFiltersApplied: '(hay filtros aplicados)',\n hideColumnWithFiltersNote: 'Para ocultar una columna, primero debes quitar los filtros que tenga aplicados',\n note: 'Nota:',\n reset: 'Reestablecer orden y visualización',\n },\n advancedFilters: {\n label: 'Filtros avanzados',\n new: 'Nuevo filtro',\n remove: 'Quitar filtros avanzados',\n editTooltip: name => `Editar '${name}'`,\n deleteTooltip: name => `Eliminar '${name}'`,\n deleteTitle: 'Eliminar plantilla de filtro avanzado',\n deleteMessage: name => `Vas a eliminar la plantilla de filtro avanzado '${name}'. ¿Estas seguro?`,\n dialogTitle: 'Filtros avanzados para la tabla',\n templateName: 'Nombre de la plantilla',\n templateNameRequired: 'El nombre es obligatorio',\n helpTitle: 'Uso de filtros avanzados',\n groupHelp: 'Un conjunto de filtros que se evalúan juntos. Todos los filtros dentro de un grupo usan el mismo conector (“Y” u “O”). Cada rectángulo representa un grupo y dentro de ellos puede haber filtros u otros grupos',\n ruleHelp: 'Una regla individual que compara un campo con un valor (por ejemplo: “Precio > 100”)',\n group: 'Grupo:',\n filter: 'Filtro:',\n addFilter: 'Añadir filtro',\n addGroup: 'Añadir grupo',\n deleteGroup: 'Eliminar grupo',\n deleteFilter: 'Eliminar filtro',\n field: 'Campo',\n condition: 'Condición',\n value: 'Valor',\n selectOption: 'Selecciona una opción',\n required: 'Obligatorio',\n and: 'Y',\n or: 'O',\n operators: {\n equals: 'Igual a',\n notEquals: 'Distinto de',\n greaterThan: 'Mayor que',\n greaterOrEquals: 'Mayor o igual que',\n lessThan: 'Menor que',\n lessOrEquals: 'Menor o igual que',\n like: 'Contiene',\n },\n },\n select: {\n noResults: 'No se han encontrado resultados...',\n showMore: 'Ver más',\n removeOption: name => `-- Quitar ${name} --`,\n resultsCount: count => plural(count, '1 resultado', `${count} resultados`),\n },\n paginatedSelect: {\n confirm: 'Confirmar',\n reset: 'Limpiar',\n selectAll: 'Seleccionar todo',\n loadingMore: 'Cargando más…',\n endOfList: 'No hay más resultados',\n noResultsHint: 'Prueba con otro término de búsqueda',\n clearSearch: 'Limpiar búsqueda',\n errorTitle: 'No se pudieron cargar los datos',\n errorHint: 'Revisa tu conexión e inténtalo de nuevo',\n retry: 'Reintentar',\n selectedCount: (selected, total) => `${selected} de ${total} seleccionados`,\n resultsCount: total => plural(total, '1 resultado', `${total} resultados`),\n },\n dialog: {\n cancel: 'Cancelar',\n confirm: 'Confirmar',\n accept: 'Aceptar',\n close: 'Cerrar',\n },\n fileInput: {\n dropLabel: 'Arrastra archivos aquí',\n browse: 'o haz clic para seleccionar',\n remove: name => `Eliminar ${name}`,\n removed: name => `Archivo ${name} eliminado`,\n added: count => plural(count, '1 archivo añadido', `${count} archivos añadidos`),\n maxFiles: max => plural(max, 'Solo se permite 1 archivo', `Máximo ${max} archivos permitidos`),\n typeNotAllowed: type => `Tipo no permitido: ${type}`,\n tooLarge: maxSize => `Excede el tamaño máximo (${maxSize})`,\n },\n inputFile: {\n label: 'Seleccionar archivo',\n placeholder: 'Haz clic o arrastra aquí',\n dropping: 'Suelta los archivos para añadirlos',\n browse: 'Examinar',\n remove: name => `Eliminar ${name}`,\n rejectedType: name => `«${name}»: tipo de archivo no permitido`,\n rejectedSize: (name, maxSize) => `«${name}» supera el tamaño máximo (${maxSize})`,\n rejectedCount: max => plural(max, 'Solo se permite 1 archivo', `Solo se permiten ${max} archivos`),\n },\n skeleton: {\n loading: 'Cargando…',\n },\n alert: {\n dismiss: 'Cerrar aviso',\n },\n loadingButton: {\n busy: 'Cargando…',\n },\n};\n\n/** Lo que acepta provideNgxEiffageTexts: un objeto fijo o un signal (para cambiar de idioma en caliente). */\nexport type NgxEiffageTextsSource = NgxEiffageTextsOverrides | Signal<NgxEiffageTextsOverrides>;\n\n/** Textos que la app consumidora sustituye. Se provee con provideNgxEiffageTexts(). */\nexport const NGX_EIFFAGE_TEXTS = new InjectionToken<Signal<NgxEiffageTextsOverrides>>('NGX_EIFFAGE_TEXTS');\n\n/**\n * Cambia los textos de la librería. Solo hay que indicar los que difieren de los valores por defecto.\n *\n * ```ts\n * // Textos fijos\n * provideNgxEiffageTexts({ alert: { dismiss: 'Dismiss' } })\n *\n * // Según el idioma de la app: una función (se ejecuta en contexto de inyección) que devuelve un signal\n * provideNgxEiffageTexts(() => {\n * const language = inject(LanguageService);\n * return computed(() => language.current() === 'en' ? EN_TEXTS : {});\n * })\n * ```\n */\nexport function provideNgxEiffageTexts(\n texts: NgxEiffageTextsSource | (() => NgxEiffageTextsSource),\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: NGX_EIFFAGE_TEXTS,\n useFactory: (): Signal<NgxEiffageTextsOverrides> => {\n const source = typeof texts === 'function' && !isSignal(texts) ? texts() : texts;\n return isSignal(source) ? source : signal(source);\n },\n },\n ]);\n}\n\n/** Textos efectivos de la librería: valores por defecto + NgxTablesIntl (obsoleto) + provideNgxEiffageTexts. */\n@Injectable({ providedIn: 'root' })\nexport class NgxTexts {\n private readonly _overrides = inject(NGX_EIFFAGE_TEXTS, { optional: true });\n private readonly _legacyIntl = inject(NgxTablesIntl);\n private readonly _legacyChanges = toSignal(this._legacyIntl.changes);\n\n /** Todos los textos ya combinados. En plantilla: `texts().alert.dismiss`. */\n readonly texts: Signal<NgxEiffageTexts> = computed(() => {\n this._legacyChanges();\n const legacy = isCustomizedLegacyIntl(this._legacyIntl) ? textsFromLegacyIntl(this._legacyIntl) : {};\n return deepMerge(deepMerge(NGX_EIFFAGE_DEFAULT_TEXTS, legacy), this._overrides?.() ?? {});\n });\n}\n\n// ── Compatibilidad con NgxTablesIntl ────────────────────────────────────────\n\n/** Solo se leen los valores de NgxTablesIntl si el consumidor la ha sustituido (subclase o useValue). */\nfunction isCustomizedLegacyIntl(intl: NgxTablesIntl): boolean {\n return Object.getPrototypeOf(intl) !== NgxTablesIntl.prototype;\n}\n\n/** Traduce una NgxTablesIntl personalizada al formato nuevo. */\nfunction textsFromLegacyIntl(intl: NgxTablesIntl): NgxEiffageTextsOverrides {\n return {\n common: {\n search: intl.searchPlaceholder,\n clearSearch: intl.clearSearchTooltip,\n noData: intl.noDataMessage,\n loading: intl.loadingMessage,\n cancel: intl.cancelButtonLabel,\n confirm: intl.confirmButtonLabel,\n close: intl.closeButtonLabel,\n save: intl.saveButtonLabel,\n saveAndApply: intl.saveAndApplyButtonLabel,\n },\n table: {\n create: intl.createButtonLabel,\n edit: intl.editTooltip,\n delete: intl.deleteTooltip,\n confirmDelete: intl.confirmDeleteLabel,\n deleteConfirmTitle: intl.deleteConfirmTitle,\n deleteConfirmBody: intl.deleteConfirmBody,\n editColumns: intl.editColumnsTooltip,\n deselectAll: intl.deselectAllLabel,\n selectionActions: intl.selectionActionsTooltip,\n export: intl.exportTooltip,\n exportExcel: intl.exportToExcelLabel,\n exportPdf: intl.exportToPdfLabel,\n enterFullscreen: intl.enterFullscreenTooltip,\n exitFullscreen: intl.exitFullscreenTooltip,\n actions: intl.actionsLabel,\n dateRangeStart: intl.dateRangeStartPlaceholder,\n dateRangeEnd: intl.dateRangeEndPlaceholder,\n totalPerPage: intl.totalPerPageLabel,\n totalGeneral: intl.totalGeneralLabel,\n },\n columnsDialog: {\n title: intl.configureColumnsTitle,\n pin: intl.pinColumnTooltip,\n unpin: intl.unpinColumnTooltip,\n moveUp: intl.moveUpTooltip,\n moveDown: intl.moveDownTooltip,\n hasFiltersApplied: intl.hasFiltersAppliedText,\n hideColumnWithFiltersNote: intl.hideColumnWithFiltersNote,\n note: intl.noteLabel,\n reset: intl.resetColumnsButtonLabel,\n },\n advancedFilters: {\n label: intl.advancedFiltersLabel,\n new: intl.newAdvancedFilterLabel,\n remove: intl.removeAdvancedFilterTooltip,\n editTooltip: name => intl.getEditAdvancedFilterTooltip(name),\n deleteTooltip: name => intl.getDeleteAdvancedFilterTooltip(name),\n deleteTitle: intl.deleteAdvancedFilterTitle,\n deleteMessage: name => intl.getDeleteAdvancedFilterMessage(name),\n dialogTitle: intl.advancedFiltersDialogTitle,\n templateName: intl.templateNameLabel,\n templateNameRequired: intl.templateNameRequiredError,\n helpTitle: intl.advancedFiltersHelpTitle,\n groupHelp: intl.advancedFiltersGroupHelp,\n ruleHelp: intl.advancedFiltersRuleHelp,\n group: intl.groupLabel,\n filter: intl.filterLabel,\n addFilter: intl.addFilterButtonLabel,\n addGroup: intl.addGroupButtonLabel,\n deleteGroup: intl.deleteGroupTooltip,\n deleteFilter: intl.deleteFilterTooltip,\n field: intl.fieldLabel,\n condition: intl.conditionLabel,\n value: intl.valueLabel,\n selectOption: intl.selectOptionPlaceholder,\n required: intl.requiredFieldError,\n and: intl.connectorAnd,\n or: intl.connectorOr,\n operators: {\n equals: intl.operatorEquals,\n notEquals: intl.operatorNotEquals,\n greaterThan: intl.operatorGreaterThan,\n greaterOrEquals: intl.operatorGreaterOrEquals,\n lessThan: intl.operatorLessThan,\n lessOrEquals: intl.operatorLessOrEquals,\n like: intl.operatorLike,\n },\n },\n select: {\n noResults: intl.noResultsMessage,\n showMore: intl.showMoreLabel,\n removeOption: name => intl.getRemoveOptionText(name),\n resultsCount: count => intl.getSearchResultsCountMessage(count),\n },\n paginatedSelect: {\n confirm: intl.paginatedSelectConfirmLabel,\n reset: intl.paginatedSelectResetLabel,\n selectAll: intl.paginatedSelectSelectAllLabel,\n loadingMore: intl.paginatedSelectLoadingMoreLabel,\n endOfList: intl.paginatedSelectEndOfListLabel,\n noResultsHint: intl.paginatedSelectNoResultsHint,\n clearSearch: intl.paginatedSelectClearSearchLabel,\n errorTitle: intl.paginatedSelectErrorTitle,\n errorHint: intl.paginatedSelectErrorHint,\n retry: intl.paginatedSelectRetryLabel,\n selectedCount: (selected, total) => intl.getPaginatedSelectSelectedCountLabel(selected, total),\n resultsCount: total => intl.getPaginatedSelectResultsCountLabel(total),\n },\n };\n}\n\n// ── Utilidades ──────────────────────────────────────────────────────────────\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value) && !isSignal(value);\n}\n\n/** Copia profunda de `base` con los valores de `overrides` encima; ignora los undefined. */\nfunction deepMerge<T>(base: T, overrides: DeepPartial<T>): T {\n const result: Record<string, unknown> = { ...(base as Record<string, unknown>) };\n for (const [key, value] of Object.entries(overrides as Record<string, unknown>)) {\n if (value === undefined) continue;\n const current = result[key];\n result[key] = isPlainObject(current) && isPlainObject(value)\n ? deepMerge(current, value as DeepPartial<typeof current>)\n : value;\n }\n return result as T;\n}\n","import {\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n inject,\r\n input,\r\n numberAttribute,\r\n} from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { LoadingButtonAppearance, LoadingButtonColor } from '../../models';\r\nimport { NgxTexts } from '../../i18n';\r\n\r\n/**\r\n * Botón de Material que muestra un spinner mientras dura una acción y no deja volver a pulsarlo.\r\n *\r\n * El clic se escucha en el propio selector: `<ngx-loading-button (click)=\"save()\" />`.\r\n * Mientras `isLoading` es true el clic no llega (ni el submit del formulario, ni con Enter).\r\n */\r\n@Component({\r\n selector: 'ngx-loading-button',\r\n imports: [MatButtonModule, MatProgressSpinnerModule],\r\n templateUrl: './ngx-loading-button.component.html',\r\n styleUrl: './ngx-loading-button.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n '[class.ngx-loading-button--secondary]': 'color() === \"secondary\"',\r\n '[class.ngx-loading-button--tertiary]': 'color() === \"tertiary\"',\r\n '[class.ngx-loading-button--error]': 'color() === \"error\"',\r\n '[class.ngx-loading-button--loading]': 'isLoading() && !disabled()',\r\n },\r\n})\r\nexport class NgxLoadingButton {\r\n private readonly _texts = inject(NgxTexts).texts;\r\n\r\n /** Muestra el spinner y bloquea el botón. */\r\n readonly isLoading = input(false, { transform: booleanAttribute });\r\n\r\n /** Texto del botón. Para iconos o contenido con formato, proyéctalo en su lugar. */\r\n readonly label = input<string>();\r\n\r\n /**\r\n * Texto que sustituye al contenido mientras carga, con un spinner pequeño delante\r\n * (p. ej. «Guardando…»). Sin él, el spinner se superpone y el botón mantiene su ancho.\r\n */\r\n readonly loadingText = input<string>();\r\n\r\n /** Apariencia de Material: text, filled, elevated, outlined o tonal. */\r\n readonly matButton = input<LoadingButtonAppearance>('filled');\r\n\r\n /** Tipo nativo del botón. */\r\n readonly type = input<'button' | 'submit' | 'reset'>('button');\r\n\r\n /** Deshabilita el botón (independiente de isLoading). */\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n\r\n /** Color. Sin valor, el primary del tema. */\r\n readonly color = input<LoadingButtonColor>();\r\n\r\n /** Diámetro en px del spinner superpuesto. */\r\n readonly spinnerDiameter = input(24, { transform: numberAttribute });\r\n\r\n /** Grosor en px del trazo del spinner. */\r\n readonly spinnerStrokeWidth = input(3, { transform: numberAttribute });\r\n\r\n /** Lo que anuncia el lector de pantalla mientras carga. Por defecto, el texto `loadingButton.busy` de la librería. */\r\n readonly busyLabel = input<string>();\r\n\r\n /** El spinner va encima del contenido (que se oculta sin cambiar el ancho). */\r\n protected readonly overlaySpinner = computed(() => this.isLoading() && !this.loadingText());\r\n\r\n /** El spinner va en línea, delante de loadingText. */\r\n protected readonly inlineSpinner = computed(() => this.isLoading() && !!this.loadingText());\r\n\r\n protected readonly resolvedBusyLabel = computed(() => {\r\n return this.busyLabel() ?? this._texts().loadingButton.busy;\r\n });\r\n\r\n /**\r\n * Mientras carga, anula el clic en el propio botón: preventDefault evita el submit del formulario\r\n * (también el implícito al pulsar Enter en un campo) y stopImmediatePropagation evita que llegue\r\n * al (click) que el consumidor escucha en <ngx-loading-button>.\r\n */\r\n protected blockWhileLoading(event: Event): void {\r\n if (!this.isLoading()) return;\r\n event.preventDefault();\r\n event.stopImmediatePropagation();\r\n }\r\n}\r\n","<!--\r\n Mientras carga: disabledInteractive mantiene el foco en el botón (el lector de pantalla sigue en él\r\n y oye aria-busy). Material NO bloquea el clic de un <button> en ese estado: lo hace blockWhileLoading.\r\n Con disabled, el botón se deshabilita del todo y el navegador ya no emite clics.\r\n-->\r\n<button\r\n class=\"loadingButton\"\r\n [matButton]=\"matButton()\"\r\n [type]=\"type()\"\r\n [disabled]=\"disabled() || isLoading()\"\r\n [disabledInteractive]=\"isLoading() && !disabled()\"\r\n [attr.aria-busy]=\"isLoading() || null\"\r\n (click)=\"blockWhileLoading($event)\"\r\n>\r\n <span class=\"loadingButton__content\" [class.loadingButton__content--hidden]=\"overlaySpinner()\" [class.loadingButton__content--gone]=\"inlineSpinner()\">\r\n {{ label() }}\r\n <ng-content />\r\n </span>\r\n\r\n @if (inlineSpinner()) {\r\n <span class=\"loadingButton__content\">\r\n <mat-spinner class=\"loadingButton__inlineSpinner\" diameter=\"18\" strokeWidth=\"2.5\" aria-hidden=\"true\" />\r\n {{ loadingText() }}\r\n </span>\r\n }\r\n\r\n @if (overlaySpinner()) {\r\n <mat-spinner\r\n class=\"loadingButton__overlaySpinner\"\r\n [diameter]=\"spinnerDiameter()\"\r\n [strokeWidth]=\"spinnerStrokeWidth()\"\r\n [attr.aria-label]=\"resolvedBusyLabel()\"\r\n />\r\n }\r\n</button>\r\n","// Utilidades internas de ngx-input-file y ngx-file-input (no se exportan en el barril).\n\n/** Normaliza `accept` (array o cadena separada por comas) a patrones en minúsculas. `*` o vacío = sin filtro. */\nexport function parseAccept(accept: string | readonly string[] | null | undefined): string[] {\n const parts = Array.isArray(accept) ? accept : String(accept ?? '').split(',');\n return parts.map(part => part.trim().toLowerCase()).filter(part => part && part !== '*' && part !== '*/*');\n}\n\n/** ¿Cumple el fichero alguno de los patrones? Admite extensiones (`.pdf`), MIME (`application/pdf`) y comodines (`image/*`). */\nexport function matchesAccept(file: File, patterns: readonly string[]): boolean {\n if (!patterns.length) return true;\n const type = file.type.toLowerCase();\n const name = file.name.toLowerCase();\n\n return patterns.some(pattern => {\n if (pattern.startsWith('.')) return name.endsWith(pattern);\n if (pattern.endsWith('/*')) return type.startsWith(pattern.slice(0, -1));\n return type === pattern;\n });\n}\n\n/** Mismo fichero = mismo nombre, tamaño y fecha de modificación (el navegador da objetos File distintos en cada selección). */\nexport function isSameFile(a: File, b: File): boolean {\n return a.name === b.name && a.size === b.size && a.lastModified === b.lastModified;\n}\n\nconst UNITS = ['B', 'KB', 'MB', 'GB'];\n\n/** Tamaño legible con el formato numérico del idioma: 845 B, 12 KB, 1,4 MB. */\nexport function formatFileSize(bytes: number, locale: string): string {\n let value = bytes;\n let unit = 0;\n while (value >= 1024 && unit < UNITS.length - 1) {\n value /= 1024;\n unit++;\n }\n const digits = unit === 0 || value >= 10 ? 0 : 1;\n return `${new Intl.NumberFormat(locale, { maximumFractionDigits: digits }).format(value)} ${UNITS[unit]}`;\n}\n\n/** Icono de Material Symbols según el tipo; si el navegador no da MIME (pasa con .docx, .dwg…), según la extensión. */\nexport function fileIcon(file: File): string {\n const type = file.type.toLowerCase();\n const extension = file.name.toLowerCase().split('.').pop() ?? '';\n\n if (type.startsWith('image/')) return 'image';\n if (type === 'application/pdf' || extension === 'pdf') return 'picture_as_pdf';\n if (type.startsWith('video/')) return 'videocam';\n if (type.startsWith('audio/')) return 'audio_file';\n if (/spreadsheet|excel|csv/.test(type) || ['xls', 'xlsx', 'csv', 'ods'].includes(extension)) return 'table_chart';\n if (/word|document|text\\//.test(type) || ['doc', 'docx', 'odt', 'txt', 'rtf'].includes(extension)) return 'description';\n if (/zip|compressed|tar|rar|7z/.test(type) || ['zip', 'rar', '7z', 'tar', 'gz'].includes(extension)) return 'folder_zip';\n return 'draft';\n}\n\n/** Familia del fichero, para el color de su icono en ngx-file-input. */\nexport type FileKind = 'image' | 'pdf' | 'video' | 'audio' | 'generic';\n\nexport function fileKind(file: File): FileKind {\n const type = file.type.toLowerCase();\n if (type.startsWith('image/')) return 'image';\n if (type === 'application/pdf' || file.name.toLowerCase().endsWith('.pdf')) return 'pdf';\n if (type.startsWith('video/')) return 'video';\n if (type.startsWith('audio/')) return 'audio';\n return 'generic';\n}\n","import {\n AfterViewInit,\n booleanAttribute,\n ChangeDetectionStrategy,\n DoCheck,\n ChangeDetectorRef,\n Component,\n computed,\n DestroyRef,\n ElementRef,\n inject,\n input,\n LOCALE_ID,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport {\n AbstractControl,\n ControlValueAccessor,\n FormGroupDirective,\n NgControl,\n NgForm,\n Validators,\n} from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatChipGrid, MatChipsModule } from '@angular/material/chips';\nimport { ErrorStateMatcher } from '@angular/material/core';\nimport { MatFormFieldAppearance, MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { EMPTY, merge, Observable, Subscription } from 'rxjs';\nimport { NgxTexts } from '../../i18n';\nimport { NgxFileError, NgxFileErrorCode } from '../../models/file-input-types';\nimport { fileIcon, formatFileSize, isSameFile, matchesAccept, parseAccept } from '../shared/file-utils';\n\n/**\n * Selector de ficheros con forma de campo de formulario: un `mat-form-field` con los ficheros como chips.\n * Se usa con `formControlName` / `[formControl]` / `ngModel` (valor: `File[]`) o con `[(files)]`.\n */\n@Component({\n selector: 'ngx-input-file',\n imports: [MatButtonModule, MatChipsModule, MatFormFieldModule, MatIconModule, MatTooltipModule],\n templateUrl: './ngx-input-file.component.html',\n styleUrl: './ngx-input-file.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'ngx-input-file',\n '[class.ngx-input-file--disabled]': 'isDisabled()',\n '[class.ngx-input-file--dropping]': 'isDropping()',\n '[class.ngx-input-file--has-files]': 'files().length > 0',\n '(dragover)': 'onDragOver($event)',\n '(dragleave)': 'onDragLeave($event)',\n '(drop)': 'onDrop($event)',\n },\n})\nexport class NgxInputFile implements ControlValueAccessor, AfterViewInit, DoCheck {\n // Se registra como value accessor a mano (en vez de con NG_VALUE_ACCESSOR) para poder leer el\n // control del formulario: su estado decide el asterisco de obligatorio y cuándo se ve el error.\n private readonly _ngControl = inject(NgControl, { self: true, optional: true });\n private readonly _parentForm = inject(FormGroupDirective, { optional: true }) ?? inject(NgForm, { optional: true });\n private readonly _cdr = inject(ChangeDetectorRef);\n private readonly _host: ElementRef<HTMLElement> = inject(ElementRef);\n private readonly _locale = inject(LOCALE_ID);\n private readonly _nativeInput = viewChild.required<ElementRef<HTMLInputElement>>('nativeInput');\n private readonly _chipGrid = viewChild(MatChipGrid);\n protected readonly texts = inject(NgxTexts).texts;\n\n /** Etiqueta del campo. Por defecto, el texto `inputFile.label` de la librería. */\n readonly label = input<string>();\n /** Texto del campo vacío. Por defecto, el texto `inputFile.placeholder` de la librería. */\n readonly placeholder = input<string>();\n /** Texto de ayuda bajo el campo. */\n readonly hint = input<string>('');\n /** Mensaje de error. Se ve cuando el control es inválido y está tocado o el formulario se ha enviado. */\n readonly error = input<string>('');\n /** Tipos admitidos: extensiones (`.pdf`), MIME (`application/pdf`) o comodines (`image/*`). Se comprueba también al arrastrar. */\n readonly accept = input<string | string[]>([]);\n /** Permite varios ficheros; cada selección se añade a los que ya hay. */\n readonly multiple = input(false, { transform: booleanAttribute });\n /** Tamaño máximo por fichero, en bytes. Los mayores se descartan. */\n readonly maxSize = input<number | null>(null);\n /** Número máximo de ficheros (con `multiple`). Los que no caben se descartan. */\n readonly maxFiles = input<number | null>(null);\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Apariencia del `mat-form-field`. */\n readonly appearance = input<MatFormFieldAppearance>('outline');\n /** Ficheros seleccionados. Admite `[(files)]` para usarlo sin formularios. */\n readonly files = model<File[]>([]);\n /** Fichero descartado al seleccionar o arrastrar (tipo, tamaño o número), con el mismo formato que ngx-file-input. */\n readonly validationError = output<NgxFileError>();\n\n protected readonly resolvedLabel = computed(() => this.label() ?? this.texts().inputFile.label);\n protected readonly resolvedPlaceholder = computed(() =>\n this.files().length ? '' : (this.placeholder() ?? this.texts().inputFile.placeholder)\n );\n protected readonly acceptAttr = computed(() => parseAccept(this.accept()).join(','));\n protected readonly items = computed(() =>\n this.files().map(file => ({ file, icon: fileIcon(file), size: formatFileSize(file.size, this._locale) }))\n );\n\n private readonly _cvaDisabled = signal(false);\n /** Deshabilitado por el input `disabled` o por el control del formulario. */\n readonly isDisabled = computed(() => this.disabled() || this._cvaDisabled());\n protected readonly isDropping = signal(false);\n protected readonly isRequired = signal(false);\n\n /** Ficheros descartados en la última selección; el mensaje se recalcula si cambia el idioma. */\n private readonly _rejected = signal<{ file: File; code: NgxFileErrorCode }[]>([]);\n protected readonly rejectionMessage = computed(() => {\n const messages = this._rejected().map(({ file, code }) => this._message(file, code));\n return [...new Set(messages)].join(' · ');\n });\n\n /** Error con el estado del control del formulario (inválido y tocado, o formulario enviado). */\n protected readonly errorStateMatcher: ErrorStateMatcher = {\n isErrorState: () => {\n const control = this._control();\n return !!control && control.invalid && (control.touched || !!this._parentForm?.submitted);\n },\n };\n protected readonly noSeparators: number[] = [];\n\n private _onChange: (files: File[]) => void = () => {};\n private _onTouched: () => void = () => {};\n private _controlSub?: Subscription;\n\n constructor() {\n if (this._ngControl) this._ngControl.valueAccessor = this;\n inject(DestroyRef).onDestroy(() => this._controlSub?.unsubscribe());\n }\n\n ngAfterViewInit(): void {\n // formControlName asigna su control después de registerOnChange: aquí ya está\n if (this._ngControl?.control) this._bindControl(this._ngControl.control);\n }\n\n ngDoCheck(): void {\n // Como hacen los campos de Material: hay cambios sin evento (resetForm quita el «enviado» después del reset)\n this._chipGrid()?.updateErrorState();\n }\n\n /** Abre el selector de ficheros del sistema. */\n openPicker(): void {\n if (!this.isDisabled()) this._nativeInput().nativeElement.click();\n }\n\n /** Quita un fichero de la selección. */\n remove(file: File): void {\n this._rejected.set([]);\n this._commit(this.files().filter(item => item !== file));\n }\n\n // ── Eventos de la plantilla ─────────────────────────────────────────────────\n\n protected onFieldClick(event: MouseEvent): void {\n // Pulsar un chip (o su botón de quitar) no abre el selector\n if ((event.target as Element).closest('.mat-mdc-chip, .ngx-input-file__browse')) return;\n this.openPicker();\n }\n\n protected onTriggerKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.openPicker();\n }\n }\n\n protected onTriggerBlur(): void {\n // Al abrir el diálogo del sistema la ventana pierde el foco: eso no cuenta como salir del campo\n if (typeof document !== 'undefined' && document.hasFocus()) this._markTouched();\n }\n\n protected onNativeChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n this._addFiles(input.files);\n input.value = '';\n }\n\n protected onNativeCancel(): void {\n this._markTouched();\n }\n\n protected onDragOver(event: DragEvent): void {\n // Siempre: si no, el navegador abre el fichero al soltarlo\n event.preventDefault();\n if (event.dataTransfer) event.dataTransfer.dropEffect = this.isDisabled() ? 'none' : 'copy';\n if (!this.isDisabled()) this.isDropping.set(true);\n }\n\n protected onDragLeave(event: DragEvent): void {\n // dragleave también salta al pasar por encima de un hijo: solo cuenta si sale del componente\n if (!this._host.nativeElement.contains(event.relatedTarget as Node | null)) this.isDropping.set(false);\n }\n\n protected onDrop(event: DragEvent): void {\n event.preventDefault();\n this.isDropping.set(false);\n if (!this.isDisabled()) this._addFiles(event.dataTransfer?.files);\n }\n\n // ── ControlValueAccessor ────────────────────────────────────────────────────\n\n writeValue(files: File[] | null | undefined): void {\n this.files.set(Array.isArray(files) ? files : []);\n this._rejected.set([]);\n }\n\n registerOnChange(fn: (files: File[]) => void): void {\n this._onChange = fn;\n // [formControl] ya tiene aquí su control (también si se cambia por otro); formControlName, en ngAfterViewInit\n if (this._ngControl?.control) this._bindControl(this._ngControl.control);\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._cvaDisabled.set(isDisabled);\n }\n\n // ── Privado ─────────────────────────────────────────────────────────────────\n\n private _control(): AbstractControl | null {\n return this._ngControl?.control ?? null;\n }\n\n /** Escucha el control (y el envío del formulario) para refrescar el asterisco y el estado de error con OnPush. */\n private _bindControl(control: AbstractControl | null): void {\n this._controlSub?.unsubscribe();\n if (!control) return;\n const submit$: Observable<unknown> = this._parentForm?.ngSubmit ?? EMPTY;\n\n this._controlSub = merge(control.events, submit$).subscribe(() => this._syncFormState(control));\n this._syncFormState(control);\n }\n\n private _syncFormState(control: AbstractControl): void {\n this.isRequired.set(control.hasValidator(Validators.required));\n // mat-chip-grid solo recalcula su error en ngDoCheck y si tiene NgControl propio, que aquí no tiene\n this._chipGrid()?.updateErrorState();\n this._cdr.markForCheck();\n }\n\n private _addFiles(list: FileList | null | undefined): void {\n const incoming = Array.from(list ?? []);\n if (!incoming.length) return;\n\n const patterns = parseAccept(this.accept());\n const maxSize = this.maxSize();\n const rejected: { file: File; code: NgxFileErrorCode }[] = [];\n const valid: File[] = [];\n\n for (const file of incoming) {\n if (!matchesAccept(file, patterns)) rejected.push({ file, code: 'TYPE_NOT_ALLOWED' });\n else if (maxSize != null && file.size > maxSize) rejected.push({ file, code: 'SIZE_EXCEEDED' });\n else valid.push(file);\n }\n\n let next = this.files();\n if (!this.multiple()) {\n if (valid.length) next = [valid[0]];\n } else {\n // Los repetidos (ya seleccionados o dos veces en la misma tanda) se ignoran sin avisar\n const fresh = valid.filter((file, index) =>\n !next.some(current => isSameFile(current, file)) && valid.findIndex(other => isSameFile(other, file)) === index\n );\n const max = this.maxFiles();\n const room = max == null ? fresh.length : Math.max(max - next.length, 0);\n fresh.slice(room).forEach(file => rejected.push({ file, code: 'MAX_FILES_EXCEEDED' }));\n if (room > 0 && fresh.length) next = [...next, ...fresh.slice(0, room)];\n }\n\n this._rejected.set(rejected);\n for (const { file, code } of rejected) this.validationError.emit({ file, code, message: this._message(file, code) });\n\n if (next !== this.files()) this._commit(next);\n else this._markTouched();\n }\n\n private _commit(files: File[]): void {\n this.files.set(files);\n this._onChange(files);\n this._markTouched();\n }\n\n private _markTouched(): void {\n this._onTouched();\n this._chipGrid()?.updateErrorState();\n this._cdr.markForCheck();\n }\n\n private _message(file: File, code: NgxFileErrorCode): string {\n const texts = this.texts().inputFile;\n switch (code) {\n case 'TYPE_NOT_ALLOWED':\n return texts.rejectedType(file.name);\n case 'SIZE_EXCEEDED':\n return texts.rejectedSize(file.name, formatFileSize(this.maxSize() ?? 0, this._locale));\n case 'MAX_FILES_EXCEEDED':\n return texts.rejectedCount(this.maxFiles() ?? 0);\n }\n }\n}\n","<mat-form-field\r\n class=\"ngx-input-file__field\"\r\n [appearance]=\"appearance()\"\r\n floatLabel=\"always\"\r\n subscriptSizing=\"dynamic\"\r\n (click)=\"onFieldClick($event)\">\r\n <mat-label>{{ resolvedLabel() }}</mat-label>\r\n\r\n <mat-chip-grid\r\n #chipGrid\r\n class=\"ngx-input-file__chips\"\r\n [disabled]=\"isDisabled()\"\r\n [required]=\"isRequired()\"\r\n [errorStateMatcher]=\"errorStateMatcher\">\r\n @for (item of items(); track item.file) {\r\n <mat-chip-row class=\"ngx-input-file__chip\" [title]=\"item.file.name + ' · ' + item.size\" (removed)=\"remove(item.file)\">\r\n <mat-icon matChipAvatar aria-hidden=\"true\">{{ item.icon }}</mat-icon>\r\n <span class=\"ngx-input-file__chip-name\">{{ item.file.name }}</span>\r\n <span class=\"ngx-input-file__chip-size\">{{ item.size }}</span>\r\n <button matChipRemove type=\"button\" [attr.aria-label]=\"texts().inputFile.remove(item.file.name)\">\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip-row>\r\n }\r\n\r\n <!-- Entrada de texto de solo lectura: da el foco con Tab, el placeholder y abre el selector con Intro o Espacio -->\r\n <input\r\n class=\"ngx-input-file__trigger\"\r\n readonly\r\n [matChipInputFor]=\"chipGrid\"\r\n [matChipInputSeparatorKeyCodes]=\"noSeparators\"\r\n [placeholder]=\"resolvedPlaceholder()\"\r\n (keydown)=\"onTriggerKeydown($event)\"\r\n (blur)=\"onTriggerBlur()\" />\r\n </mat-chip-grid>\r\n\r\n <button\r\n matIconSuffix\r\n matIconButton\r\n type=\"button\"\r\n class=\"ngx-input-file__browse\"\r\n [disabled]=\"isDisabled()\"\r\n [attr.aria-label]=\"texts().inputFile.browse\"\r\n [matTooltip]=\"texts().inputFile.browse\"\r\n (click)=\"openPicker()\">\r\n <mat-icon>attach_file</mat-icon>\r\n </button>\r\n\r\n <input\r\n #nativeInput\r\n type=\"file\"\r\n hidden\r\n tabindex=\"-1\"\r\n [accept]=\"acceptAttr()\"\r\n [multiple]=\"multiple()\"\r\n (change)=\"onNativeChange($event)\"\r\n (cancel)=\"onNativeCancel()\" />\r\n\r\n <mat-hint>\r\n @if (isDropping()) {\r\n {{ texts().inputFile.dropping }}\r\n } @else if (rejectionMessage()) {\r\n <span class=\"ngx-input-file__rejection\">{{ rejectionMessage() }}</span>\r\n } @else {\r\n {{ hint() }}\r\n }\r\n </mat-hint>\r\n\r\n @if (error()) {\r\n <mat-error>{{ error() }}</mat-error>\r\n }\r\n</mat-form-field>\r\n\r\n<!-- Región viva fija: los descartes se anuncian aunque el lector esté en otro sitio -->\r\n<div class=\"ngx-input-file__live\" aria-live=\"polite\">{{ rejectionMessage() }}</div>\r\n","export const includeNoSensible = (cadena: string, query: string): boolean => {\r\n const nomalizadoCadena = cadena\r\n .toLowerCase()\r\n .normalize('NFD')\r\n .replace(/[\\u0300-\\u036f]/g, '');\r\n const nomalizadoQuery = query\r\n .toLowerCase()\r\n .normalize('NFD')\r\n .replace(/[\\u0300-\\u036f]/g, '');\r\n return nomalizadoCadena.includes(nomalizadoQuery);\r\n};\r\n\r\nexport const base64ToUtf8 = (str: string): string => {\r\n return decodeURIComponent(\r\n atob(str)\r\n .split('')\r\n .map(function (c) {\r\n return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\r\n })\r\n .join('')\r\n );\r\n};\r\n","import {\r\n afterRenderEffect,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n computed,\r\n ElementRef,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport {\r\n ControlValueAccessor,\r\n FormControl,\r\n FormGroupDirective,\r\n NgControl,\r\n NgForm,\r\n ReactiveFormsModule,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule, SubscriptSizing } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatSelect, MatSelectModule } from '@angular/material/select';\r\nimport { BasicSelectConfig } from '../../models';\r\nimport { includeNoSensible } from '../../utils';\r\nimport { NgxTexts } from '../../i18n';\r\n\r\n/** Opción ya resuelta (valor, etiqueta, disabled y visibilidad según el buscador). */\r\ninterface ResolvedOption<T> {\r\n value: T[keyof T];\r\n label: string;\r\n disabled: boolean;\r\n visible: boolean;\r\n}\r\n\r\n/** Teclas que deben llegar al mat-select para navegar/seleccionar desde el buscador. */\r\nconst NAVIGATION_KEYS = new Set([\r\n 'ArrowDown',\r\n 'ArrowUp',\r\n 'Enter',\r\n 'Escape',\r\n 'Home',\r\n 'End',\r\n 'Tab',\r\n]);\r\n\r\n@Component({\r\n selector: 'ngx-basic-select',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n MatInputModule,\r\n MatSelectModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n ReactiveFormsModule,\r\n MatProgressSpinnerModule,\r\n ],\r\n templateUrl: './ngx-basic-select.component.html',\r\n styleUrl: './ngx-basic-select.component.scss',\r\n})\r\nexport class NgxBasicSelect<T> implements ControlValueAccessor {\r\n\r\n // Servicio de internacionalización (placeholder del buscador, mensajes de estado…)\r\n readonly texts = inject(NgxTexts).texts;\r\n\r\n /**\r\n * Se auto-registra como ControlValueAccessor del control del formulario.\r\n * Se usa `self`/`optional` para poder leer el estado de validación (invalid/touched)\r\n * y para no fallar cuando el componente se usa sin formulario.\r\n */\r\n private readonly _ngControl = inject(NgControl, { self: true, optional: true });\r\n /** Formulario contenedor, para saber si ya se intentó enviar (reactive o template-driven). */\r\n private readonly _parentFormGroup = inject(FormGroupDirective, { optional: true });\r\n private readonly _parentForm = inject(NgForm, { optional: true });\r\n private readonly _changeDetectorRef = inject(ChangeDetectorRef);\r\n\r\n // ─── Inputs ──────────────────────────────────────────────────────────────\r\n readonly label = input.required<string>();\r\n readonly options = input.required<T[]>();\r\n readonly basicSelectConfig = input.required<BasicSelectConfig<T>>();\r\n readonly isLoading = input<boolean>(false);\r\n readonly placeholder = input<string>('');\r\n readonly subscriptSizing = input<SubscriptSizing>('fixed');\r\n readonly appearance = input<'fill' | 'outline'>('fill');\r\n readonly multiple = input<boolean>(false);\r\n readonly disabled = input<boolean>(false);\r\n readonly clearable = input<boolean>(false);\r\n readonly error = input<string>('');\r\n readonly class = input<string>('');\r\n\r\n // ─── Outputs ─────────────────────────────────────────────────────────────\r\n /** Emite el/los valor(es) de `valueKey` al cambiar la selección. */\r\n selectionChange = output<T[keyof T] | T[keyof T][] | null>();\r\n\r\n // ─── ViewChilds ──────────────────────────────────────────────────────────\r\n readonly matSelect = viewChild.required<MatSelect>('matSelect');\r\n readonly searchInput = viewChild<ElementRef<HTMLInputElement>>('searchInput');\r\n\r\n // ─── Estado interno ──────────────────────────────────────────────────────\r\n /** FormControl interno que gobierna el mat-select (independiente del control del form). */\r\n protected readonly innerControl = new FormControl<any>(null);\r\n /** Copia del valor como signal, para leerlo reactivamente en plantilla (OnPush). */\r\n protected readonly value = signal<any>(null);\r\n /** Deshabilitado que llega vía setDisabledState (reactive forms). */\r\n private readonly cvaDisabled = signal(false);\r\n /** Estado del buscador (signal, no el DOM, para funcionar en zoneless). */\r\n protected readonly searchQuery = signal('');\r\n\r\n private onChange: (value: any) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n /** Deshabilitado efectivo: input `disabled` o el que llega del formulario. */\r\n protected readonly isDisabled = computed(() => this.disabled() || this.cvaDisabled());\r\n\r\n /**\r\n * Opciones resueltas y marcadas con `visible` según el buscador. Las no visibles\r\n * NO se quitan del DOM (se ocultan con display:none) para que el mat-select siga\r\n * pudiendo pintar la etiqueta del valor seleccionado aunque esté filtrado.\r\n */\r\n protected readonly resolvedOptions = computed<ResolvedOption<T>[]>(() => {\r\n const query = this.searchQuery();\r\n const options = this.options();\r\n const config = this.basicSelectConfig();\r\n\r\n return options.map(option => {\r\n const label = String(config.displayedLabel(option));\r\n return {\r\n value: option[config.valueKey],\r\n label,\r\n disabled: config.disabled ? config.disabled(option) : false,\r\n visible: includeNoSensible(label, query),\r\n };\r\n });\r\n });\r\n\r\n /** Hay datos de entrada (con independencia del buscador). */\r\n protected readonly hasData = computed(() => this.resolvedOptions().length > 0);\r\n\r\n /**\r\n * Opciones que se renderizan realmente: las que casan con el buscador MÁS las que\r\n * estén seleccionadas (aunque no casen). Se quitan del DOM las que no casan para que\r\n * el ListKeyManager de mat-select no las pueda enfocar con las flechas —marcarlas\r\n * `disabled` no basta: con el panel abierto Material permite enfocar deshabilitadas\r\n * (recomendación WAI-ARIA)—. Las seleccionadas se conservan para que el trigger\r\n * pueda pintar su etiqueta y no se pierda el valor al filtrar.\r\n */\r\n protected readonly displayedOptions = computed<ResolvedOption<T>[]>(() => {\r\n const value = this.value();\r\n const selected = new Set(Array.isArray(value) ? value : (value != null ? [value] : []));\r\n return this.resolvedOptions().filter(o => o.visible || selected.has(o.value));\r\n });\r\n\r\n /** No hay ninguna opción que mostrar (ni coincidencia ni seleccionada). */\r\n protected readonly showNoOptionsMessage = computed(() => this.displayedOptions().length === 0);\r\n\r\n /** Mensaje aria-live con el recuento de resultados al filtrar. */\r\n protected readonly searchAnnouncement = computed(() => {\r\n const query = this.searchQuery();\r\n if (!query)\r\n return '';\r\n\r\n const count = this.resolvedOptions().filter(o => o.visible).length;\r\n return this.texts().select.resultsCount(count);\r\n });\r\n\r\n /**\r\n * ErrorStateMatcher que refleja el estado del control del formulario.\r\n * Replica el criterio por defecto de Material: se muestra el error si el\r\n * control es inválido y además ha sido tocado O ya se ha enviado el\r\n * formulario. Sin la parte de `submitted`, al pulsar \"Guardar\" los campos\r\n * obligatorios que el usuario no llegó a tocar no se marcaban en rojo.\r\n */\r\n protected readonly errorStateMatcher: ErrorStateMatcher = {\r\n isErrorState: () =>\r\n !!(this._ngControl?.invalid && (this._ngControl?.touched || this._isParentFormSubmitted())),\r\n };\r\n\r\n /**\r\n * Obligatorio si el control del formulario tiene el validador `required`.\r\n * Se propaga al mat-select interno para que el mat-form-field pinte el\r\n * asterisco, igual que hace Material con un `<input matInput>`.\r\n */\r\n protected isRequired(): boolean {\r\n return this._ngControl?.control?.hasValidator(Validators.required) ?? false;\r\n }\r\n\r\n /** true cuando el formulario contenedor ya ha intentado enviarse. */\r\n private _isParentFormSubmitted(): boolean {\r\n return this._parentFormGroup?.submitted || this._parentForm?.submitted || false;\r\n }\r\n\r\n constructor() {\r\n // Auto-registro como CVA (evita el provider NG_VALUE_ACCESSOR y su DI circular).\r\n if (this._ngControl)\r\n this._ngControl.valueAccessor = this;\r\n\r\n // Sincroniza el deshabilitado efectivo con el control interno.\r\n afterRenderEffect(() => {\r\n const disabled = this.isDisabled();\r\n if (disabled && this.innerControl.enabled)\r\n this.innerControl.disable({ emitEvent: false });\r\n else if (!disabled && this.innerControl.disabled)\r\n this.innerControl.enable({ emitEvent: false });\r\n });\r\n\r\n // Propaga los cambios del control interno al formulario, al output y al signal de valor.\r\n this.innerControl.valueChanges\r\n .pipe(takeUntilDestroyed())\r\n .subscribe(value => {\r\n this.value.set(value);\r\n this.onChange(value);\r\n this.selectionChange.emit(value);\r\n });\r\n\r\n /**\r\n * `submitted` del formulario padre es una propiedad normal, no una señal:\r\n * al enviar, nada marca este componente (OnPush) para revisión, así que el\r\n * mat-select no reevaluaba su errorStateMatcher y el campo no se pintaba en\r\n * rojo. Al enviarse el formulario se fuerza la revisión.\r\n */\r\n const parentSubmit = this._parentFormGroup?.ngSubmit ?? this._parentForm?.ngSubmit;\r\n parentSubmit?.pipe(takeUntilDestroyed()).subscribe(() => {\r\n this.innerControl.markAsTouched();\r\n this._changeDetectorRef.markForCheck();\r\n });\r\n }\r\n\r\n // ─── ControlValueAccessor ─────────────────────────────────────────────────\r\n writeValue(value: any): void {\r\n this.innerControl.setValue(value, { emitEvent: false });\r\n this.value.set(value);\r\n }\r\n\r\n registerOnChange(fn: (value: any) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.cvaDisabled.set(isDisabled);\r\n }\r\n\r\n // ─── Interacción ──────────────────────────────────────────────────────────\r\n onOpenedChange(opened: boolean): void {\r\n if (opened) {\r\n this.searchQuery.set('');\r\n setTimeout(() => {\r\n this.searchInput()?.nativeElement.focus();\r\n const panel = this.matSelect().panel?.nativeElement;\r\n if (panel)\r\n panel.scrollTop = 0;\r\n });\r\n } else {\r\n // Al cerrar marcamos como tocado para que salte la validación\r\n this.onTouched();\r\n this._ngControl?.control?.markAsTouched();\r\n }\r\n }\r\n\r\n onSearchInput(value: string): void {\r\n this.searchQuery.set(value);\r\n }\r\n\r\n /**\r\n * Deja pasar al mat-select las teclas de navegación (flechas, Enter, Escape…) para\r\n * poder moverse por la lista sin salir del buscador, y detiene las de carácter para\r\n * que no disparen el typeahead nativo del mat-select.\r\n */\r\n onSearchKeydown(event: KeyboardEvent): void {\r\n if (!NAVIGATION_KEYS.has(event.key))\r\n event.stopPropagation();\r\n }\r\n\r\n clearSearch(): void {\r\n this.searchQuery.set('');\r\n this.searchInput()?.nativeElement.focus();\r\n }\r\n\r\n onClearClick(): void {\r\n const newValue = this.multiple() ? [] : null;\r\n this.innerControl.setValue(newValue); // emite → onChange + output + signal\r\n this.innerControl.markAsTouched();\r\n this._ngControl?.control?.markAsTouched();\r\n }\r\n}\r\n","\r\n<mat-form-field [appearance]=\"appearance()\" [className]=\"class()\" [subscriptSizing]=\"subscriptSizing()\">\r\n <mat-label>{{ label() }}</mat-label>\r\n <mat-select\r\n #matSelect\r\n [formControl]=\"innerControl\"\r\n [errorStateMatcher]=\"errorStateMatcher\"\r\n [required]=\"isRequired()\"\r\n [multiple]=\"multiple()\"\r\n [placeholder]=\"placeholder()\"\r\n (openedChange)=\"onOpenedChange($event)\"\r\n >\r\n @if(isLoading()) {\r\n <!--\r\n Opcion deshabilitada (no un div): mat-select no abre el panel si no\r\n tiene ninguna mat-option (_canOpen exige options.length > 0). Asi el\r\n panel abre tambien durante la carga y se ve el indicador.\r\n -->\r\n <mat-option disabled class=\"stateOption loadingOption\">\r\n <mat-spinner diameter=\"18\" />\r\n <span>{{ texts().common.loading }}</span>\r\n </mat-option>\r\n } @else {\r\n <div class=\"searchFilter\">\r\n <mat-icon class=\"searchIcon\">search</mat-icon>\r\n <input\r\n matInput\r\n #searchInput\r\n type=\"text\"\r\n [attr.aria-label]=\"texts().common.search\"\r\n [placeholder]=\"texts().common.search\"\r\n [value]=\"searchQuery()\"\r\n (input)=\"onSearchInput($any($event.target).value)\"\r\n (keydown)=\"onSearchKeydown($event)\"\r\n />\r\n <button type=\"button\" matIconButton [attr.aria-label]=\"texts().common.clearSearch\" (click)=\"clearSearch()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n <!--\r\n Solo se renderizan las opciones que casan con el buscador (mas las\r\n seleccionadas). Las que no casan se quitan del DOM para que no se puedan\r\n enfocar con las flechas: con el panel abierto mat-select permite navegar\r\n a opciones deshabilitadas, asi que ocultarlas + disabled no bastaria.\r\n -->\r\n @for(option of displayedOptions(); track option.value) {\r\n <mat-option [value]=\"option.value\" [disabled]=\"option.disabled\">\r\n {{ option.label }}\r\n </mat-option>\r\n }\r\n @if(showNoOptionsMessage()) {\r\n <mat-option disabled class=\"stateOption noResults\">\r\n {{ hasData() ? texts().select.noResults : texts().common.noData }}\r\n </mat-option>\r\n }\r\n }\r\n </mat-select>\r\n @if(isLoading()) {\r\n <mat-icon matSuffix><mat-spinner diameter=\"20\" /></mat-icon>\r\n } @else if(clearable() && (multiple() ? value()?.length : value())) {\r\n <button\r\n matIconButton\r\n matSuffix\r\n [attr.aria-label]=\"texts().common.clearSearch\"\r\n (click)=\"onClearClick(); $event.stopPropagation()\"\r\n >\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <mat-error>{{ error() }}</mat-error>\r\n</mat-form-field>\r\n\r\n<!-- Anuncio para lectores de pantalla del numero de resultados al filtrar -->\r\n<div class=\"srOnly\" aria-live=\"polite\">{{ searchAnnouncement() }}</div>\r\n","import { TemplateRef, Type, WritableSignal } from \"@angular/core\";\r\n\r\nexport enum DialogBodyType {\r\n TEXT = 'text',\r\n HTML = 'html',\r\n COMPONENT = 'component',\r\n TEMPLATE = 'template'\r\n}\r\n\r\nexport interface DialogBodyConfig<T = any> {\r\n type: DialogBodyType;\r\n content: string | Type<T> | TemplateRef<any>;\r\n data?: T;\r\n}\r\n\r\nexport interface DialogConfig<T = any> {\r\n title: string;\r\n icon?: string;\r\n iconColor?: string;\r\n subtitle?: string;\r\n body: DialogBodyConfig<T>;\r\n showCancel?: boolean;\r\n showConfirm?: boolean;\r\n cancelText?: string;\r\n confirmText?: string;\r\n /** El botón de confirmar se pinta en el color de error (eliminar, descartar…). */\r\n destructive?: boolean;\r\n /** Muestra la X de cerrar en el encabezado (cierra devolviendo undefined). Por defecto true, salvo con disableClose. */\r\n showClose?: boolean;\r\n}\r\n\r\n/**\r\n * Lo que un componente o plantilla dentro de un diálogo de NgxDialogService puede controlar.\r\n *\r\n * - En un componente: `inject(NgxDialogContext)`.\r\n * - En una plantilla: viene en el contexto como `dialog` (`let-dialog=\"dialog\"`).\r\n */\r\nexport abstract class NgxDialogContext<R = unknown> {\r\n /** Resultado que se devuelve al pulsar confirmar. Si se queda sin valor, se devuelve `true`. */\r\n abstract readonly result: WritableSignal<R | undefined>;\r\n\r\n /** Deshabilita el botón de confirmar (p. ej. mientras un formulario no es válido). */\r\n abstract readonly confirmDisabled: WritableSignal<boolean>;\r\n\r\n /** Cierra el diálogo devolviendo `result` (o `false`/`undefined` para cancelar). */\r\n abstract close(result?: R | boolean): void;\r\n}\r\n\r\n/** Contexto que recibe una plantilla usada como cuerpo de un diálogo. */\r\nexport interface NgxDialogTemplateContext<T = any, R = unknown> {\r\n /** Los datos que se pasaron en `templateData`. */\r\n $implicit: T;\r\n /** Para cerrar el diálogo, fijar el resultado o deshabilitar el botón de confirmar. */\r\n dialog: NgxDialogContext<R>;\r\n}\r\n","import { ComponentRef, Directive, effect, inject, input, signal, Type, ViewContainerRef } from \"@angular/core\";\r\n\r\n@Directive({\r\n selector: '[ngxDynamicHost]'\r\n})\r\nexport class DynamicHostDirective<T> {\r\n private _vcr = inject(ViewContainerRef);\r\n private _currentRef: ComponentRef<any> | null = null;\r\n\r\n component = input<Type<any>>();\r\n data = input<T>();\r\n\r\n constructor() {\r\n effect(() => {\r\n const componentType = this.component();\r\n \r\n // 1. Gestión de la creación/destrucción del componente\r\n if (!componentType) {\r\n this._vcr.clear();\r\n this._currentRef = null;\r\n return;\r\n }\r\n\r\n // Si el componente es diferente al que tenemos, lo recreamos\r\n if (this._currentRef?.componentType !== componentType) {\r\n this._vcr.clear();\r\n this._currentRef = this._vcr.createComponent(componentType);\r\n }\r\n \r\n // 2. Actualización de datos (siempre, tanto si es nuevo como si ya existía)\r\n const data = this.data();\r\n if (this._currentRef && data !== undefined) {\r\n // La forma correcta de setear un input en Angular moderno\r\n this._currentRef.setInput('data', data); \r\n }\r\n });\r\n }\r\n}","import { ChangeDetectionStrategy, Component, forwardRef, inject, signal } from '@angular/core';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MAT_DIALOG_DATA, MatDialogActions, MatDialogContent, MatDialogRef, MatDialogTitle } from '@angular/material/dialog';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { DialogBodyType, DialogConfig, NgxDialogContext, NgxDialogTemplateContext } from '../../models/dialog-config';\r\nimport { DynamicHostDirective } from '../../directives';\r\nimport { NgxTexts } from '../../i18n';\r\n\r\n/**\r\n * Diálogo genérico que abre NgxDialogService. El contenido (texto, HTML, componente o plantilla)\r\n * puede usar NgxDialogContext para devolver un resultado o deshabilitar el botón de confirmar.\r\n */\r\n@Component({\r\n selector: 'ngx-dialog',\r\n imports: [\r\n MatDialogTitle,\r\n MatDialogContent,\r\n MatDialogActions,\r\n MatButtonModule,\r\n MatIconModule,\r\n MatTooltipModule,\r\n NgTemplateOutlet,\r\n DynamicHostDirective,\r\n ],\r\n templateUrl: './ngx-dialog.component.html',\r\n styleUrl: './ngx-dialog.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n // El contenido (componente o plantilla) inyecta el diálogo como NgxDialogContext\r\n providers: [{ provide: NgxDialogContext, useExisting: forwardRef(() => NgxDialog) }],\r\n})\r\nexport class NgxDialog<T = any, R = unknown> implements NgxDialogContext<R> {\r\n private readonly _dialogRef = inject(MatDialogRef<NgxDialog<T, R>>);\r\n private readonly _data = inject<DialogConfig<T>>(MAT_DIALOG_DATA);\r\n private readonly _texts = inject(NgxTexts).texts;\r\n\r\n readonly title = this._data.title;\r\n readonly icon = this._data.icon;\r\n readonly iconColor = this._data.iconColor;\r\n readonly subtitle = this._data.subtitle;\r\n readonly body = this._data.body;\r\n readonly showCancel = this._data.showCancel ?? true;\r\n readonly showConfirm = this._data.showConfirm ?? true;\r\n readonly destructive = this._data.destructive ?? false;\r\n /** La X no tiene sentido en un diálogo con disableClose (está pensado para no poder cerrarse sin decidir). */\r\n readonly showClose = this._data.showClose ?? !this._dialogRef.disableClose;\r\n readonly closeLabel = this._texts().dialog.close;\r\n readonly cancelText = this._data.cancelText ?? this._texts().dialog.cancel;\r\n readonly confirmText = this._data.confirmText ?? this._texts().dialog.accept;\r\n\r\n // ── NgxDialogContext ──────────────────────────────────────────────────────\r\n readonly result = signal<R | undefined>(undefined);\r\n readonly confirmDisabled = signal(false);\r\n\r\n close(result?: R | boolean): void {\r\n this._dialogRef.close(result);\r\n }\r\n\r\n // ── Plantilla ─────────────────────────────────────────────────────────────\r\n protected readonly DialogBodyType = DialogBodyType;\r\n protected readonly templateContext: NgxDialogTemplateContext<T, R> = {\r\n $implicit: this.body.data as T,\r\n dialog: this,\r\n };\r\n\r\n onCancelClick(): void {\r\n this._dialogRef.close(false);\r\n }\r\n\r\n onConfirmClick(): void {\r\n if (this.confirmDisabled()) return;\r\n const result = this.result();\r\n this._dialogRef.close(result === undefined ? true : result);\r\n }\r\n}\r\n","<!--\r\n Encabezado: el h2 (mat-dialog-title) da el nombre accesible al diálogo, así que la X va fuera de él,\r\n posicionada encima, para que no forme parte de ese nombre.\r\n-->\r\n<div class=\"ngx-dialog__header\" [class.ngx-dialog__header--closable]=\"showClose\">\r\n <h2 mat-dialog-title class=\"ngx-dialog__title\">\r\n @if (icon) {\r\n <mat-icon class=\"ngx-dialog__icon\" [style.color]=\"iconColor || null\" aria-hidden=\"true\">{{ icon }}</mat-icon>\r\n }\r\n <span class=\"ngx-dialog__heading\">\r\n <span class=\"ngx-dialog__title-text\">{{ title }}</span>\r\n @if (subtitle) {\r\n <span class=\"ngx-dialog__subtitle\">{{ subtitle }}</span>\r\n }\r\n </span>\r\n </h2>\r\n\r\n @if (showClose) {\r\n <button\r\n type=\"button\"\r\n matIconButton\r\n class=\"ngx-dialog__close\"\r\n [attr.aria-label]=\"closeLabel\"\r\n [matTooltip]=\"closeLabel\"\r\n (click)=\"close()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n</div>\r\n\r\n<mat-dialog-content>\r\n <div class=\"ngx-dialog__content\">\r\n @switch (body.type) {\r\n @case (DialogBodyType.TEXT) {\r\n <p class=\"ngx-dialog__text\">{{ body.content }}</p>\r\n }\r\n @case (DialogBodyType.HTML) {\r\n <div [innerHTML]=\"body.content\"></div>\r\n }\r\n @case (DialogBodyType.COMPONENT) {\r\n <ng-container\r\n ngxDynamicHost\r\n [component]=\"$any(body.content)\"\r\n [data]=\"body.data\"\r\n />\r\n }\r\n @case (DialogBodyType.TEMPLATE) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"$any(body.content)\"\r\n [ngTemplateOutletContext]=\"templateContext\"\r\n />\r\n }\r\n }\r\n </div>\r\n</mat-dialog-content>\r\n\r\n@if (showCancel || showConfirm) {\r\n <mat-dialog-actions align=\"end\" class=\"ngx-dialog__actions\">\r\n @if (showCancel) {\r\n <button type=\"button\" matButton=\"outlined\" (click)=\"onCancelClick()\">\r\n {{ cancelText }}\r\n </button>\r\n }\r\n @if (showConfirm) {\r\n <button\r\n type=\"button\"\r\n matButton=\"filled\"\r\n class=\"ngx-dialog__confirm\"\r\n [class.ngx-dialog__confirm--destructive]=\"destructive\"\r\n [disabled]=\"confirmDisabled()\"\r\n (click)=\"onConfirmClick()\">\r\n {{ confirmText }}\r\n </button>\r\n }\r\n </mat-dialog-actions>\r\n}\r\n","import { Component, inject } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle } from '@angular/material/dialog';\r\nimport { ConfirmDialogData } from '../../models/confirm-dialog-data';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { NgxTexts } from '../../i18n';\r\n\r\n/**\r\n * @deprecated Usar `NgxDialogService.confirm()` (o `template()` con contenido propio), que tiene el\r\n * encabezado, el botón X y la opción `destructive` de ngx-dialog. Las tablas ya no lo usan; se\r\n * mantiene solo por compatibilidad con quien lo abra directamente.\r\n */\r\n@Component({\r\n selector: 'ngx-confirm-dialog',\r\n imports: [\r\n MatButtonModule,\r\n MatDialogTitle,\r\n MatDialogContent,\r\n MatDialogActions,\r\n MatDialogClose,\r\n CommonModule\r\n ],\r\n templateUrl: './ngx-confirm-dialog.component.html',\r\n styleUrl: './ngx-confirm-dialog.component.scss'\r\n})\r\nexport class NgxConfirmDialogComponent {\r\n dialogRef = inject(MatDialogRef<NgxConfirmDialogComponent>);\r\n data = inject<ConfirmDialogData>(MAT_DIALOG_DATA);\r\n readonly texts = inject(NgxTexts).texts;\r\n}\r\n","<h2 mat-dialog-title>{{data.title}}</h2>\r\n<mat-dialog-content>\r\n @if(data.body) {\r\n <p>{{data.body}}</p>\r\n }\r\n \r\n @if (data.template) {\r\n <ng-container *ngTemplateOutlet=\"data.template; context: { $implicit: data.row }\"></ng-container>\r\n }\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <button matButton [mat-dialog-close]=\"false\">{{ data.denyButtonLabel ?? texts().common.cancel }}</button>\r\n <button matButton [mat-dialog-close]=\"true\">{{ data.confirmButtonLabel ?? texts().common.confirm }}</button>\r\n</mat-dialog-actions>","import { ComponentRef, Directive, effect, inject, input, signal, Type, ViewContainerRef, WritableSignal } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[ngxDynamicCellHost]',\r\n})\r\nexport class DynamicCellHostDirective<T> {\r\n vcr = inject(ViewContainerRef);\r\n\r\n component = input<Type<any>>();\r\n row = input<T>();\r\n key = input<keyof T>();\r\n\r\n private _currentRef: ComponentRef<any> | null = null;\r\n private _rowSignal?: WritableSignal<T>;\r\n private _keySignal?: WritableSignal<keyof T>;\r\n\r\n effect = effect(() => {\r\n const component = this.component();\r\n const row = this.row();\r\n const key = this.key();\r\n\r\n //Si no hay componente, limpiamos lo que hubiera\r\n if (!component) {\r\n this.vcr.clear();\r\n this._currentRef = null;\r\n this._rowSignal = undefined;\r\n this._keySignal = undefined;\r\n return;\r\n }\r\n\r\n //Solo se recrea si cambia el tipo de componente. En caso contrario se reutiliza\r\n //la instancia y se actualizan sus signals, evitando apilar componentes en el DOM\r\n //cada vez que cambian los datos de la fila.\r\n if (this._currentRef?.componentType !== component) {\r\n this.vcr.clear();\r\n this._currentRef = this.vcr.createComponent(component);\r\n this._rowSignal = undefined;\r\n this._keySignal = undefined;\r\n }\r\n\r\n if (row === undefined || key === undefined)\r\n return;\r\n\r\n if (!this._rowSignal || !this._keySignal) {\r\n this._rowSignal = signal(row);\r\n this._keySignal = signal(key);\r\n this._currentRef!.instance.row = this._rowSignal;\r\n this._currentRef!.instance.key = this._keySignal;\r\n } else {\r\n this._rowSignal.set(row);\r\n this._keySignal.set(key);\r\n }\r\n });\r\n}\r\n","import { Pipe, type PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'ngxOnlyUpperFirstCharacter',\r\n})\r\nexport class OnlyUpperFirstCharacterPipe implements PipeTransform {\r\n\r\n transform(value: string): string {\r\n if (!value)\r\n return '';\r\n\r\n value = value.toLowerCase();\r\n return `${value.charAt(0).toUpperCase()}${value.slice(1)}`;\r\n }\r\n\r\n}\r\n","import { PipeTransform, TemplateRef, Type, WritableSignal } from \"@angular/core\";\r\nimport jsPDF from \"jspdf\";\r\nimport { Observable } from \"rxjs\";\r\nimport { PaginatedFilter } from \"./paginated-filter\";\r\nimport { PaginatedItems } from \"./paginated-items\";\r\n\r\nexport type FilterType = 'number' | 'text' | 'option' | 'option-multiple' | 'date' | 'date-range';\r\n\r\n//IMPORTANTE Si se añade aqui un color, hay que añadirlo tambien en paginated-table.component.scss\r\nexport type RowActionIconColor = 'Yellow' | 'Orange' | 'Pink' | 'Purple' | 'Green' | 'Blue' | 'Sky' | 'Brown';\r\n\r\nexport interface PaginatedTableConfig<T> {\r\n tableId: string;\r\n primaryKey: keyof T | Array<keyof T>;\r\n title: () => string;\r\n columns: PaginatedTableColumn<T>[];\r\n showQueryFilter?: boolean; //Filtro query para toda la tabla\r\n queryFilterPlaceholder?: string; //Placeholder del filtro query para toda la tabla\r\n create?: TableBasicAction<T>;\r\n update?: TableBasicAction<T>;\r\n clickOnRowForUpdate?: boolean; //Si esto se pone a true (desaparece el icono de acciones de update y toda la columna es el update) => Si expandableDetail true, esto se cancela y el editar se pone en acciones\r\n delete?: TableBasicAction<T>;\r\n deleteConfirm?: DeleteConfirm<T>;\r\n rowActions?: TableRowAction<T>[];\r\n showAdvancedFilters?: boolean;\r\n expandableDetail?: boolean;\r\n expandableDetailTemplateRef?: () => TemplateRef<{ $implicit: T }>; //Para crear la vista desde un template\r\n enableRowSelection?: boolean;\r\n showRowSelection?: (row: T) => boolean; //Para mostrar o no el checkbox de seleccion por fila\r\n rowSelectionAction?: RowSelectionAction<T>[]; //Para poner botones que actuen frente a una seleccion multiple,\r\n exportFileName?: () => string;\r\n mapperForExportData?: (row: T) => Partial<Record<keyof T, any>>;\r\n pdfConfig?: jsPDF;\r\n maxHeight?: string;\r\n defaultStickyColumn?: keyof T;\r\n showActions?: () => boolean; //Para mostrar o no la columna de acciones, en caso de que se tengan acciones de fila o clickOnRowForUpdate, esta propiedad se pondrá a true automaticamente, pero si no se quieren mostrar las acciones, se puede poner a false esta propiedad. En caso de que clickOnRowForUpdate sea true y expandableDetail sea true, entonces clickOnRowForUpdate se cancelará y las acciones de editar se pondrán en acciones de fila, por lo que en ese caso, showActions se pondrá a true automaticamente. Si se quieren ocultar las acciones en ese caso, habrá que poner showActions a false.\r\n hideExportData?: () => boolean; //Para mostrar o no el boton de exportar datos, en caso de que se tenga acciones de exportacion, esta propiedad se pondrá a false automaticamente, pero si no se quieren mostrar el boton de exportar datos, se puede poner a true esta propiedad.\r\n hideColumnConfig?: () => boolean; //Para ocultar el boton de configurar/visualizar columnas\r\n hideFullScreen?: () => boolean; //Para ocultar el boton de pantalla completa\r\n}\r\n\r\n/*\r\n PRIORIDAD DE CREACION DE LA VISTA \r\n 1 => componente\r\n 2 => template\r\n 3 => valueGetter\r\n 4 => valor de la columna por defecto aplicando pipes (en caso de que se especifiquen)\r\n*/\r\nexport interface PaginatedTableColumn<T> {\r\n key: keyof T;\r\n label: string;\r\n isSortable?: boolean; //Los datos de la columna se pueden ordenar\r\n filterType?: FilterType; //Los datos de la columna se pueden filtrar\r\n filterOptions?: FilterOption[]; //En caso de filterType = option o filterType = option-multiple entonces, se pintara un select y habra que mandar las opciones\r\n endpointForPaginatedFilterOptions?: (filters: PaginatedFilter<FilterOption>) => Observable<PaginatedItems<FilterOption>>;\r\n filtersForEndpointPaginatedFilterOptions?: WritableSignal<PaginatedFilter<FilterOption>>;\r\n component?: Type<any>; //Para crear la vista desde un component\r\n templateRef?: () => TemplateRef<{ $implicit: T }>; //Para crear la vista desde un template\r\n valueGetter?: (row: T) => string;\r\n pipes?: ColumnPipe | ColumnPipe[];\r\n showTotalPerPage?: boolean;\r\n showTotalGeneral?: boolean;\r\n getTotalGeneral?: () => number;\r\n totalFooterFormatter?: (total: number) => string;\r\n style?: string;\r\n footerStyle?: string;\r\n}\r\n\r\nexport interface TableBasicAction<T> {\r\n show?: (row?: T) => boolean;\r\n disabled?: (row?: T) => boolean;\r\n tooltip?: (row?: T) => string;\r\n}\r\n\r\nexport interface TableRowAction<T> {\r\n id: string;\r\n show?: (row: T) => boolean;\r\n disabled?: (row: T) => boolean;\r\n icon: string;\r\n iconColor?: RowActionIconColor;\r\n tooltip: (row: T) => string;\r\n}\r\n\r\nexport interface FilterOption {\r\n value: string;\r\n label: string;\r\n}\r\n\r\nexport function isFilterOption(obj: unknown): obj is FilterOption {\r\n return (\r\n typeof obj === 'object' &&\r\n obj !== null &&\r\n 'value' in obj &&\r\n 'label' in obj &&\r\n typeof (obj as any).value === 'string' &&\r\n typeof (obj as any).label === 'string'\r\n );\r\n}\r\n\r\nexport interface ColumnPipe {\r\n pipe: PipeTransform;\r\n args?: any[];\r\n}\r\n\r\nexport interface DeleteConfirm<T> {\r\n title: (row: T) => string;\r\n body?: (row: T) => string;\r\n templateRef?: () => TemplateRef<{ $implicit: T }>;\r\n}\r\n\r\nexport interface RowSelectionAction<T> {\r\n id: string;\r\n icon: string;\r\n label: (row: T[], totalSelected: number) => string;\r\n}","import { AbstractControl, FormArray, FormBuilder, FormGroup, Validators } from \"@angular/forms\";\r\nimport { ColumnValue } from \"./column-value\";\r\nimport { DatePipe } from \"@angular/common\";\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { isFilterOption, PaginatedTableColumn } from \"./paginated-table-config\";\r\nimport { DynamicFilter } from \"./dynamic-filter\";\r\nimport { AdvancedFilter, FilterGroup, FilterRule, FilterConnector, FilterOperator } from \"./advanced-filter\";\r\nimport { NgxEiffageTexts } from \"../i18n\";\r\n\r\nexport class AdvancedFilterUtils {\r\n static createAdvancedFilter = <T>(fb: FormBuilder, advancedFilter: AdvancedFilter<T>): FormGroup => {\r\n return fb.group({\r\n name: [advancedFilter.name, Validators.required],\r\n groups: fb.array(advancedFilter.groups.map(g => this.createFilterGroup(fb, g)))\r\n });\r\n }\r\n\r\n static createFilterGroup = <T>(fb: FormBuilder, group: FilterGroup<T>): FormGroup => {\r\n return fb.group({\r\n id: [group.id ?? uuidv4()],\r\n connector: [group.connector, Validators.required],\r\n filters: fb.array(group.filters.map(f => {\r\n return this.isFilterGroup<T>(f)\r\n ? this.createFilterGroup(fb, f)\r\n : this.createFilterRule(fb, f);\r\n }), [Validators.required])\r\n });\r\n }\r\n\r\n static createFilterRule = <T>(fb: FormBuilder, rule: FilterRule<T>): FormGroup => {\r\n return fb.group({\r\n id: [rule.id ?? uuidv4()],\r\n key: [rule.key ?? null, Validators.required],\r\n operator: [rule.operator ?? null, Validators.required],\r\n value: [rule.value ?? null, Validators.required]\r\n });\r\n }\r\n\r\n static isFilterGroup = <T>(obj: any): obj is FilterGroup<T> => {\r\n return obj &&\r\n typeof obj === 'object' &&\r\n 'connector' in obj &&\r\n 'filters' in obj;\r\n }\r\n\r\n private static isFilterRule<T>(obj: any): obj is FilterRule<T> {\r\n return obj && typeof obj === 'object' && 'key' in obj;\r\n }\r\n\r\n static addGroupToGroup<T>(fb: FormBuilder, form: FormGroup, groupId: string, group: FilterGroup<T>) {\r\n const groupFound = this.findGroupFormById(form.get('groups') as FormArray, groupId);\r\n if (groupFound) {\r\n const filters = groupFound.get('filters') as FormArray;\r\n const formGroup = this.createFilterGroup(fb, group);\r\n filters.push(formGroup);\r\n }\r\n }\r\n\r\n static deleteGroup<T>(form: FormGroup, groupId: string): boolean {\r\n const groupsArray = form.get('groups') as FormArray;\r\n return this.deleteByIdRecursive(groupsArray, groupId);\r\n }\r\n\r\n static addRuleToGroup = <T>(fb: FormBuilder, form: FormGroup, groupId: string, rule: FilterRule<T>) => {\r\n const group = this.findGroupFormById(form.get('groups') as FormArray, groupId);\r\n if (group) {\r\n const filters = group.get('filters') as FormArray;\r\n const formRule = this.createFilterRule(fb, rule);\r\n filters.push(formRule);\r\n }\r\n }\r\n\r\n static deleteRule<T>(form: FormGroup, ruleId: string): boolean {\r\n const groupsArray = form.get('groups') as FormArray;\r\n return this.deleteByIdRecursive(groupsArray, ruleId);\r\n }\r\n\r\n private static deleteByIdRecursive(array: FormArray, id: string): boolean {\r\n for (let i = 0; i < array.length; i++) {\r\n const control = array.at(i) as FormGroup;\r\n\r\n // Si el id coincide, eliminar directamente (da igual si es rule o group)\r\n if (control.get('id')?.value === id) {\r\n array.removeAt(i);\r\n return true;\r\n }\r\n\r\n // Si es un grupo, seguir buscando dentro de sus filtros\r\n const filters = control.get('filters');\r\n if (filters instanceof FormArray) {\r\n const deleted = this.deleteByIdRecursive(filters, id);\r\n if (deleted) return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n\r\n static findGroupFormById(array: FormArray, id: string): FormGroup | null {\r\n for (const control of array.controls) {\r\n const group = control as FormGroup;\r\n if (group.get('id')?.value === id)\r\n return group;\r\n\r\n const filters = group.get('filters') as FormArray;\r\n if (filters) {\r\n const found = this.findGroupFormById(filters, id);\r\n if (found)\r\n return found;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n static isFilterGroupForm(group: AbstractControl): boolean {\r\n return (\r\n group instanceof FormGroup &&\r\n group.contains('connector') &&\r\n group.contains('filters')\r\n );\r\n }\r\n\r\n /*static isFilterRuleForm(group: AbstractControl): boolean {\r\n return (\r\n group instanceof FormGroup &&\r\n group.contains('key') &&\r\n group.contains('operator') &&\r\n group.contains('value') &&\r\n !group.contains('filters')\r\n );\r\n }*/\r\n\r\n static mapFormToAdvancedFilter<T>(form: FormGroup): AdvancedFilter<T> {\r\n return {\r\n name: form.get('name')?.value,\r\n groups: (form.get('groups') as FormArray).controls\r\n .map(g => this.mapFormGroupToFilterGroup<T>(g as FormGroup))\r\n .filter(g => this.isNonEmptyGroup(g))\r\n };\r\n }\r\n\r\n\r\n private static mapFormGroupToFilterGroup<T>(groupForm: FormGroup): FilterGroup<T> {\r\n const id = groupForm.get('id')?.value as string;\r\n const connector = groupForm.get('connector')?.value as FilterConnector;\r\n const filtersArray = groupForm.get('filters') as FormArray;\r\n\r\n const filters = filtersArray.controls\r\n .map(control => {\r\n const value = control.value;\r\n if ('filters' in value)\r\n return this.mapFormGroupToFilterGroup<T>(control as FormGroup);\r\n else\r\n return this.mapFormGroupToFilterRule<T>(control as FormGroup);\r\n })\r\n .filter(f => this.isNonEmptyFilter(f));\r\n\r\n return {\r\n id: id,\r\n connector: connector,\r\n filters: filters\r\n };\r\n }\r\n\r\n\r\n private static mapFormGroupToFilterRule<T>(ruleForm: FormGroup): FilterRule<T> {\r\n return {\r\n id: ruleForm.get('id')?.value,\r\n key: ruleForm.get('key')?.value,\r\n operator: ruleForm.get('operator')?.value,\r\n value: ruleForm.get('value')?.value\r\n };\r\n }\r\n\r\n private static isNonEmptyFilter<T>(filter: FilterRule<T> | FilterGroup<T>): boolean {\r\n if (this.isFilterGroup(filter))\r\n return this.isNonEmptyGroup(filter);\r\n\r\n return this.isNonEmptyRule(filter);\r\n }\r\n\r\n private static isNonEmptyGroup<T>(group: FilterGroup<T>): boolean {\r\n return Array.isArray(group.filters) && group.filters.some(f => this.isNonEmptyFilter(f));\r\n }\r\n\r\n private static isNonEmptyRule<T>(rule: FilterRule<T>): boolean {\r\n return !!(rule.key && rule.operator && rule.value !== undefined && rule.value !== null && rule.value !== '');\r\n }\r\n\r\n static groupsToReadableHtml<T>(groups: FilterGroup<T>[], columns: PaginatedTableColumn<T>[], texts: NgxEiffageTexts): string {\r\n return this.groupToHtml(groups[0], columns, texts);\r\n //return groups.map(g => this.groupToString(g)).join(' OR ');\r\n }\r\n\r\n private static groupToHtml<T>(group: FilterGroup<T>, columns: PaginatedTableColumn<T>[], texts: NgxEiffageTexts): string {\r\n const connectorLabel = group.connector === 'AND' ? texts.advancedFilters.and : texts.advancedFilters.or;\r\n const connector = ` <strong>${connectorLabel}</strong> `;\r\n\r\n const parts = group.filters.map(filter => {\r\n if (this.isFilterGroup<T>(filter))\r\n return `<strong>[ </strong>${this.groupToHtml(filter, columns, texts)}<strong> ]</strong>`;\r\n else\r\n return this.ruleToHtml(filter, columns, texts);\r\n });\r\n\r\n return parts.join(connector);\r\n }\r\n\r\n private static ruleToHtml<T>(rule: FilterRule<T>, columns: PaginatedTableColumn<T>[], texts: NgxEiffageTexts): string {\r\n const column = columns.find(column => column.key == rule.key);\r\n\r\n if (!column)\r\n return \"\";\r\n\r\n const key = `<i>${column.label}</i>`;\r\n const operator = rule.operator ? this.getOperatorLabel(rule.operator, texts).toLowerCase() : '';\r\n //const operator = rule.operator ?? '';\r\n const value = this.valueToHtml(rule.value, column);\r\n return `${key} ${operator} \"${value}\"`;\r\n }\r\n\r\n private static getOperatorLabel(operator: FilterOperator, texts: NgxEiffageTexts): string {\r\n const operatorLabels: Record<FilterOperator, string> = {\r\n '=': texts.advancedFilters.operators.equals,\r\n '<>': texts.advancedFilters.operators.notEquals,\r\n '>': texts.advancedFilters.operators.greaterThan,\r\n '>=': texts.advancedFilters.operators.greaterOrEquals,\r\n '<': texts.advancedFilters.operators.lessThan,\r\n '<=': texts.advancedFilters.operators.lessOrEquals,\r\n 'LIKE': texts.advancedFilters.operators.like\r\n };\r\n return operatorLabels[operator];\r\n }\r\n\r\n private static valueToHtml<T>(value: ColumnValue, column: PaginatedTableColumn<T>): string {\r\n switch (column.filterType) {\r\n case 'option':\r\n case 'option-multiple':\r\n if (isFilterOption(value))\r\n return value.label;\r\n\r\n const optionSelected = column.filterOptions?.find(option => option.value == value);\r\n return optionSelected?.label ?? '';\r\n case 'date':\r\n case 'date-range':\r\n const pipe = new DatePipe('es-ES');\r\n return pipe.transform(value as string, 'dd/MM/yyyy') ?? '';\r\n }\r\n\r\n return value as string;\r\n }\r\n\r\n static mapToDynamicFilter<T>(advancedFilter: AdvancedFilter<T>): DynamicFilter<T>[] {\r\n const result: DynamicFilter<T>[] = [];\r\n\r\n for (const group of advancedFilter.groups) {\r\n result.push(...this.mapGroupToDynamicFilters(group));\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private static mapGroupToDynamicFilters<T>(group: FilterGroup<T>): DynamicFilter<T>[] {\r\n const filters: DynamicFilter<T>[] = [];\r\n\r\n for (const f of group.filters) {\r\n if (this.isFilterGroup<T>(f)) {\r\n filters.push(...this.mapGroupToDynamicFilters(f));\r\n } else if (this.isFilterRule<T>(f) && f.key && f.operator && f.value !== undefined && f.value !== null) {\r\n filters.push({\r\n campo: f.key,\r\n operador: f.operator,\r\n valor: f.value?.toString(),\r\n conector: group.connector,\r\n grupo: group.id ?? 'root'\r\n });\r\n }\r\n }\r\n\r\n return filters;\r\n }\r\n\r\n\r\n static normalizeAdvancedFilterForBackend<T>(filter: AdvancedFilter<T>): AdvancedFilter<T> {\r\n return {\r\n ...filter,\r\n groups: filter.groups.map(group => this.normalizeGroupForBackend(group))\r\n };\r\n }\r\n\r\n private static normalizeGroupForBackend<T>(group: FilterGroup<T>): FilterGroup<T> {\r\n return {\r\n ...group,\r\n filters: group.filters.map(f => {\r\n if (this.isFilterGroup(f)) {\r\n return this.normalizeGroupForBackend(f);\r\n }\r\n\r\n return this.normalizeRuleForBackend(f);\r\n })\r\n };\r\n }\r\n\r\n private static normalizeRuleForBackend<T>(rule: FilterRule<T>): FilterRule<T> {\r\n if (isFilterOption(rule.value)) {\r\n return {\r\n ...rule,\r\n value: rule.value.value\r\n };\r\n }\r\n\r\n return rule;\r\n }\r\n}\r\n","import { InjectionToken, Signal, signal } from \"@angular/core\";\r\n\r\n/**\r\n * Signal con el identificador del usuario actual. Se usa para aislar por usuario\r\n * la configuracion de columnas y los filtros avanzados guardados en localStorage.\r\n *\r\n * Si la aplicacion no lo provee, el valor por defecto es `undefined`, lo que\r\n * desactiva la persistencia: las tablas siguen funcionando, pero no recuerdan\r\n * la configuracion entre sesiones.\r\n */\r\nexport const USER_ID_FACTORY = new InjectionToken<Signal<string | null | undefined>>(\r\n 'USER_ID_FACTORY',\r\n {\r\n providedIn: 'root',\r\n factory: () => signal<string | null | undefined>(undefined)\r\n }\r\n);\r\n","import { FilterOption, FilterType } from \"./paginated-table-config\";\r\nimport { ColumnValue } from \"../models/column-value\";\r\n\r\nexport type FilterConnector = 'AND' | 'OR';\r\n\r\nexport type FilterOperator = '=' | '<>' | '>' | '>=' | '<' | '<=' | 'LIKE';\r\n\r\nexport interface AdvancedFilter<T> {\r\n name: string;\r\n groups: FilterGroup<T>[];\r\n}\r\n\r\nexport interface FilterGroup<T> {\r\n id?: string;\r\n connector: FilterConnector;\r\n filters: (FilterRule<T> | FilterGroup<T>)[];\r\n}\r\n\r\nexport interface FilterRule<T> {\r\n id?: string;\r\n key?: keyof T;\r\n operator?: FilterOperator;\r\n value?: ColumnValue;\r\n}\r\n\r\nexport const OPERATOR_BY_FILTER_TYPE: Record<FilterType, FilterOperator[]> = {\r\n number: ['=', '<>', '>', '>=', '<', '<='],\r\n text: ['=', 'LIKE', '<>'],\r\n option: ['=', '<>'],\r\n 'option-multiple': ['=', '<>'], //Actuara como un option\r\n date: ['=', '<>', '>', '>=', '<', '<='],\r\n 'date-range': ['=', '<>', '>', '>=', '<', '<='] //Actuara como un date normal\r\n}","import { computed, effect, inject, Injectable, signal } from '@angular/core';\r\nimport { USER_ID_FACTORY } from '../models';\r\nimport { AdvancedFilter } from '../models/advanced-filter';\r\nimport { AdvancedFilterUtils } from '../models/advanced-filter-utils';\r\nimport { DynamicFilter } from '../models/dynamic-filter';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AdvancedFilterService {\r\n private userIdFactory = inject(USER_ID_FACTORY);\r\n\r\n private readonly PARTIAL_KEY_STORAGE_ADVANCED_FILTER_CONFIG = 'advanced_filter';\r\n private fullKey = computed(() => {\r\n const userId = this.userIdFactory();\r\n\r\n if (!userId)\r\n return undefined;\r\n\r\n return `${this.PARTIAL_KEY_STORAGE_ADVANCED_FILTER_CONFIG}_${userId}`;\r\n });\r\n\r\n private _advancedFilters = signal<Record<string, AdvancedFilter<any>[]>>({});\r\n advancedFilters = this._advancedFilters.asReadonly();\r\n\r\n private setAdvancedFiltersEffect = effect(() => {\r\n this.setAdvancedFilter();\r\n });\r\n\r\n constructor() {\r\n this.setAdvancedFilter();\r\n }\r\n\r\n private setAdvancedFilter() {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey) {\r\n this._advancedFilters.set({});\r\n return;\r\n }\r\n\r\n const recordAdvancedFitler = localStorage.getItem(localStorageKey);\r\n\r\n if (!recordAdvancedFitler) {\r\n this._advancedFilters.set({});\r\n return;\r\n }\r\n\r\n const advancedFilters: Record<string, AdvancedFilter<any>[]> = JSON.parse(recordAdvancedFitler);\r\n\r\n this._advancedFilters.set(advancedFilters);\r\n }\r\n\r\n saveAdvancedFilter(tableId: string, advancedFilter: AdvancedFilter<any>): boolean {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey)\r\n return false;\r\n\r\n this._advancedFilters.update(currentValue => {\r\n const currentArray = currentValue[tableId] ?? [];\r\n\r\n const index = currentArray.findIndex(f => f.groups[0].id === advancedFilter.groups[0].id);\r\n let newArray: AdvancedFilter<any>[];\r\n if (index >= 0) { //Si existe, lo reemplazamos\r\n newArray = [...currentArray];\r\n newArray[index] = advancedFilter;\r\n } else { // Si no existe, lo añadimos\r\n newArray = [...currentArray, advancedFilter];\r\n }\r\n\r\n const newValue: Record<string, AdvancedFilter<any>[]> = {\r\n ...currentValue,\r\n [tableId]: newArray\r\n };\r\n localStorage.setItem(localStorageKey, JSON.stringify(newValue));\r\n return newValue;\r\n });\r\n\r\n return true;\r\n }\r\n\r\n deleteAdvancedFilter(tableId: string, advancedFilter: AdvancedFilter<any>): boolean {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey)\r\n return false;\r\n\r\n this._advancedFilters.update(currentValue => {\r\n const currentArray = currentValue[tableId] ?? [];\r\n\r\n const newArray = currentArray.filter(f => f.groups[0].id !== advancedFilter.groups[0].id);\r\n\r\n const newValue: Record<string, AdvancedFilter<any>[]> = {\r\n ...currentValue,\r\n [tableId]: newArray\r\n };\r\n localStorage.setItem(localStorageKey, JSON.stringify(newValue));\r\n\r\n return newValue;\r\n });\r\n\r\n return true;\r\n }\r\n\r\n getAdvancedFilterById(tableId: string, advancedFilterId: string, normalizeForBackend: boolean = true): AdvancedFilter<any> | undefined {\r\n const allAdvancedFiltersByTable = this._advancedFilters()[tableId];\r\n\r\n if (!allAdvancedFiltersByTable)\r\n return undefined;\r\n\r\n const advancedFilter = allAdvancedFiltersByTable.find(advancedFilter => {\r\n return advancedFilter.groups?.[0].id !== undefined && advancedFilter.groups[0].id == advancedFilterId;\r\n });\r\n\r\n if (!normalizeForBackend)\r\n return advancedFilter;\r\n\r\n if (!advancedFilter)\r\n return undefined;\r\n\r\n return AdvancedFilterUtils.normalizeAdvancedFilterForBackend(advancedFilter);\r\n }\r\n\r\n getDynamicFiltersById(tableId: string, advancedFilterId: string): DynamicFilter<any>[] {\r\n const advancedFilter = this.getAdvancedFilterById(tableId, advancedFilterId);\r\n\r\n if (!advancedFilter)\r\n return [];\r\n\r\n return AdvancedFilterUtils.mapToDynamicFilter(advancedFilter);\r\n }\r\n}\r\n","import { computed, effect, inject, Injectable, signal } from '@angular/core';\r\nimport { ColumnConfig } from '../models/configure-table-column-data';\r\nimport { USER_ID_FACTORY } from '../models';\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ColumnConfigService {\r\n private userIdFactory = inject(USER_ID_FACTORY);\r\n\r\n private readonly PARTIAL_KEY_STORAGE_COLUMN_CONFIG = 'column_config';\r\n private fullKey = computed(() => {\r\n const userId = this.userIdFactory();\r\n\r\n if (!userId)\r\n return undefined;\r\n\r\n return `${this.PARTIAL_KEY_STORAGE_COLUMN_CONFIG}_${userId}`;\r\n });\r\n\r\n private _columnConfigs = signal<Record<string, ColumnConfig<any>[]>>({});\r\n columnConfigs = this._columnConfigs.asReadonly();\r\n\r\n private setColumnConfigEffect = effect(() => {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey) {\r\n this._columnConfigs.set({});\r\n return;\r\n }\r\n\r\n const recordColumnConfig = localStorage.getItem(localStorageKey);\r\n\r\n if (!recordColumnConfig) {\r\n this._columnConfigs.set({});\r\n return;\r\n }\r\n\r\n const columnConfigs: Record<string, ColumnConfig<any>[]> = JSON.parse(recordColumnConfig);\r\n\r\n this._columnConfigs.set(columnConfigs);\r\n });\r\n\r\n saveColumnConfig(tableId: string, columnConfig: ColumnConfig<any>[]): boolean {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey)\r\n return false;\r\n\r\n this._columnConfigs.update(currentValue => {\r\n const newValue = {\r\n ...currentValue,\r\n [tableId]: columnConfig\r\n };\r\n localStorage.setItem(localStorageKey, JSON.stringify(newValue));\r\n return newValue;\r\n });\r\n\r\n return true;\r\n }\r\n\r\n deleteColumnConfig(tableId: string): boolean {\r\n const localStorageKey = this.fullKey();\r\n if (!localStorageKey)\r\n return false;\r\n\r\n this._columnConfigs.update(currentValue => {\r\n const newValue: Record<string, ColumnConfig<any>[]> = { ...currentValue };\r\n delete newValue[tableId];\r\n localStorage.setItem(localStorageKey, JSON.stringify(newValue));\r\n return newValue;\r\n });\r\n\r\n return true;\r\n }\r\n}\r\n","import { inject, Injectable, PLATFORM_ID, Signal, signal } from '@angular/core';\r\nimport { fromEvent, map, startWith } from 'rxjs';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { Pantalla } from '../models/pantalla';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DatosPantallaService {\r\n\r\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\r\n\r\n //En servidor no existe window, asi que se devuelve undefined en lugar de romper\r\n pantalla: Signal<Pantalla | undefined> = this.isBrowser\r\n ? toSignal(\r\n fromEvent(window, 'resize').pipe(\r\n startWith(this.obtenerDatosPantalla()),\r\n map(() => this.obtenerDatosPantalla())\r\n )\r\n )\r\n : signal<Pantalla | undefined>(undefined);\r\n\r\n private obtenerDatosPantalla(): Pantalla {\r\n let pantalla: Pantalla = {\r\n tipo: 'escritorio',\r\n ancho: window.innerWidth,\r\n alto: window.innerHeight\r\n }\r\n\r\n if (pantalla.ancho < 600) {\r\n pantalla.tipo = 'movil';\r\n return pantalla;\r\n }\r\n\r\n if (pantalla.ancho < 950) {\r\n pantalla.tipo = 'tablet';\r\n return pantalla;\r\n }\r\n\r\n return pantalla;\r\n }\r\n\r\n}\r\n","import { inject, Injectable, TemplateRef, Type } from \"@angular/core\";\nimport { MatDialog, MatDialogConfig } from \"@angular/material/dialog\";\nimport { Observable } from \"rxjs\";\nimport { DialogBodyConfig, DialogBodyType, DialogConfig, NgxDialogTemplateContext } from \"../models/dialog-config\";\nimport { NgxDialog } from \"../components\";\nimport { NgxTexts } from \"../i18n\";\n\n/** Opciones comunes a todos los diálogos. */\ninterface DialogHeaderOptions {\n title: string;\n subtitle?: string;\n icon?: string;\n iconColor?: string;\n cancelText?: string;\n confirmText?: string;\n showCancel?: boolean;\n showConfirm?: boolean;\n /** El botón de confirmar se pinta en el color de error (eliminar, descartar…). */\n destructive?: boolean;\n /**\n * Muestra la X de cerrar en el encabezado; cerrar con ella devuelve undefined, igual que Esc.\n * Por defecto true, salvo si dialogConfig.disableClose es true.\n */\n showClose?: boolean;\n}\n\n/**\n * Ancho mínimo por defecto: 400px, pero nunca más que la pantalla menos un margen\n * (un 400px fijo se salía de los móviles).\n */\nconst DEFAULT_MIN_WIDTH = 'min(400px, calc(100vw - 32px))';\n\n/**\n * Abre diálogos de Material con una estructura común: título con icono opcional, subtítulo,\n * cuerpo (texto, HTML, componente o plantilla) y botones de cancelar/confirmar.\n *\n * Todos devuelven un Observable que emite al cerrarse y completa:\n * - `true` (o el resultado fijado por el contenido) si se confirma,\n * - `false` si se cancela,\n * - `undefined` si se cierra sin pulsar ningún botón (Esc o clic fuera).\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class NgxDialogService {\n private readonly _dialog = inject(MatDialog);\n private readonly _texts = inject(NgxTexts).texts;\n\n /** Diálogo con un texto. Base de `confirm()` e `info()`. */\n openText(\n config: DialogHeaderOptions & { content: string },\n dialogConfig?: MatDialogConfig\n ): Observable<boolean | undefined> {\n const { content, ...header } = config;\n return this._open<boolean>(header, { type: DialogBodyType.TEXT, content }, dialogConfig);\n }\n\n /** Pregunta de confirmación con botones de cancelar y confirmar. */\n confirm(\n config: Omit<DialogHeaderOptions, 'showCancel' | 'showConfirm'> & { message: string },\n dialogConfig?: MatDialogConfig\n ): Observable<boolean | undefined> {\n const { message, ...header } = config;\n return this.openText({\n ...header,\n content: message,\n cancelText: config.cancelText ?? this._texts().dialog.cancel,\n confirmText: config.confirmText ?? this._texts().dialog.confirm,\n }, dialogConfig);\n }\n\n /** Aviso informativo con un único botón. */\n info(\n config: Omit<DialogHeaderOptions, 'showCancel' | 'showConfirm' | 'cancelText'> & { message: string },\n dialogConfig?: MatDialogConfig\n ): Observable<boolean | undefined> {\n const { message, ...header } = config;\n return this.openText({\n ...header,\n content: message,\n showCancel: false,\n confirmText: config.confirmText ?? this._texts().dialog.accept,\n }, dialogConfig);\n }\n\n /**\n * Diálogo con HTML. Angular sanea el HTML: se quitan scripts, estilos en línea y atributos\n * peligrosos. Para contenido con interacción, usa `component()` o `template()`.\n */\n html(\n config: DialogHeaderOptions & { html: string },\n dialogConfig?: MatDialogConfig\n ): Observable<boolean | undefined> {\n const { html, ...header } = config;\n return this._open<boolean>(header, { type: DialogBodyType.HTML, content: html }, dialogConfig);\n }\n\n /**\n * Diálogo con un componente propio. El componente recibe `componentData` por su input `data`\n * y puede inyectar `NgxDialogContext<R>` para devolver un resultado (`result`), cerrar\n * (`close()`) o deshabilitar el botón de confirmar (`confirmDisabled`).\n */\n component<T = any, R = boolean>(\n config: DialogHeaderOptions & { component: Type<any>; componentData?: T },\n dialogConfig?: MatDialogConfig\n ): Observable<R | boolean | undefined> {\n const { component, componentData, ...header } = config;\n return this._open<R>(header, { type: DialogBodyType.COMPONENT, content: component, data: componentData }, dialogConfig);\n }\n\n /**\n * Diálogo con una plantilla. La plantilla recibe `templateData` como `$implicit` y el contexto\n * del diálogo como `dialog` (`let-data let-dialog=\"dialog\"`).\n */\n template<T = any, R = boolean>(\n config: DialogHeaderOptions & { template: TemplateRef<NgxDialogTemplateContext<T, R>> | TemplateRef<{ $implicit: T }> | TemplateRef<T>; templateData?: T },\n dialogConfig?: MatDialogConfig\n ): Observable<R | boolean | undefined> {\n const { template, templateData, ...header } = config;\n return this._open<R>(header, { type: DialogBodyType.TEMPLATE, content: template, data: templateData }, dialogConfig);\n }\n\n private _open<R>(\n header: DialogHeaderOptions,\n body: DialogBodyConfig,\n dialogConfig?: MatDialogConfig\n ): Observable<R | boolean | undefined> {\n const data: DialogConfig = { ...header, body };\n return this._dialog.open<NgxDialog, DialogConfig, R | boolean>(NgxDialog, {\n ...dialogConfig,\n data,\n minWidth: dialogConfig?.minWidth ?? DEFAULT_MIN_WIDTH,\n autoFocus: dialogConfig?.autoFocus ?? false,\n }).afterClosed();\n }\n}\n","import { CdkDrag, CdkDragDrop, CdkDropList, moveItemInArray } from '@angular/cdk/drag-drop';\r\nimport { Component, computed, inject, signal } from '@angular/core';\r\nimport { DateRange } from '@angular/material/datepicker';\r\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle } from '@angular/material/dialog';\r\nimport moment from 'moment';\r\nimport { ConfigureTableColumnData, ColumnConfig } from '../../../models/configure-table-column-data';\r\nimport { ColumnConfigService } from '../../../services/column-config.service';\r\nimport { LowerCasePipe } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { NgxTexts } from '../../../i18n';\r\nimport { isFilterOption } from '../../../models';\r\n\r\n@Component({\r\n selector: 'lib-configure-table-columns',\r\n imports: [\r\n MatButtonModule,\r\n MatDialogTitle,\r\n MatDialogContent,\r\n MatDialogActions,\r\n MatDialogClose,\r\n LowerCasePipe,\r\n MatIconModule,\r\n MatSlideToggleModule,\r\n CdkDropList,\r\n CdkDrag,\r\n MatTooltipModule\r\n ],\r\n templateUrl: './configure-table-columns.component.html',\r\n styleUrl: './configure-table-columns.component.scss',\r\n})\r\nexport class ConfigureTableColumnsComponent<T> {\r\n columnConfigService = inject(ColumnConfigService);\r\n dialogRef = inject(MatDialogRef<ConfigureTableColumnsComponent<T>>);\r\n data = inject<ConfigureTableColumnData<T>>(MAT_DIALOG_DATA);\r\n readonly texts = inject(NgxTexts).texts;\r\n columns = signal(this.data.columns);\r\n isConfirmDisabled = computed(() => {\r\n const allDisabled = this.columns().every(column => !column.show);\r\n const someHasFilter = this.columns().some(column => this.hasFilterAndDisabled(column));\r\n return allDisabled || someHasFilter;\r\n });\r\n\r\n startAnimationTimeout?: number = undefined;\r\n endAnimationTimeout?: number = undefined;\r\n animationTime: number = 250;\r\n animationIndex = signal<number | undefined>(undefined);\r\n\r\n hasFilterAndDisabled(column: ColumnConfig<T>): boolean {\r\n const value = this.data.filtersValue[column.key];\r\n if (Array.isArray(value))\r\n return value.length > 0 && !column.show;\r\n\r\n if (typeof value === 'string')\r\n return value.length > 0 && !column.show;\r\n\r\n if (value instanceof DateRange)\r\n return (value.start != null || value.end != null) && !column.show;\r\n\r\n if (moment.isMoment(value))\r\n return !column.show;\r\n\r\n if (isFilterOption(value))\r\n return !column.show;\r\n\r\n return false;\r\n }\r\n\r\n onUpClick(index: number) {\r\n const cols = [...this.columns()];\r\n if (index > 0) {\r\n [cols[index - 1], cols[index]] = [cols[index], cols[index - 1]];\r\n this.columns.set(cols);\r\n }\r\n }\r\n\r\n onDownClick(index: number) {\r\n const cols = [...this.columns()];\r\n if (index < cols.length - 1) {\r\n [cols[index], cols[index + 1]] = [cols[index + 1], cols[index]];\r\n this.columns.set(cols);\r\n }\r\n }\r\n\r\n onDrop(event: CdkDragDrop<any, any, any>) {\r\n const cols = [...this.columns()];\r\n moveItemInArray(cols, event.previousIndex, event.currentIndex);\r\n this.columns.set(cols);\r\n }\r\n\r\n onToggleChange(columnClicked: ColumnConfig<T>) {\r\n this.columns.update(value => {\r\n return value.map(column => {\r\n if (column.key == columnClicked.key)\r\n return { ...column, show: !column.show };\r\n else\r\n return column;\r\n });\r\n });\r\n }\r\n\r\n onPinClick(columnConfig: ColumnConfig<T>, index: number) {\r\n const columns = [...this.columns()];\r\n const currentSticky = columns.find(c => c.isSticky);\r\n\r\n if (columnConfig.key == currentSticky?.key) {\r\n const newColumns = columns.map(c => {\r\n return {\r\n ...c,\r\n isSticky: false\r\n }\r\n });\r\n this.columns.set(newColumns);\r\n return;\r\n }\r\n\r\n clearTimeout(this.startAnimationTimeout);\r\n clearTimeout(this.endAnimationTimeout);\r\n this.animationIndex.set(undefined);\r\n\r\n this.animationIndex.set(index);\r\n\r\n this.startAnimationTimeout = setTimeout(() => {\r\n moveItemInArray(columns, index, 0);\r\n const newColumns = columns.map(c => {\r\n return {\r\n ...c,\r\n isSticky: c.key == columnConfig.key\r\n }\r\n });\r\n this.columns.set(newColumns);\r\n this.animationIndex.set(0);\r\n this.endAnimationTimeout = setTimeout(() => this.animationIndex.set(undefined), this.animationTime)\r\n }, this.animationTime);\r\n }\r\n\r\n onConfirmClick() {\r\n this.columnConfigService.saveColumnConfig(this.data.tableId, this.columns());\r\n this.dialogRef.close();\r\n }\r\n\r\n onResetClick() {\r\n this.columnConfigService.deleteColumnConfig(this.data.tableId);\r\n this.dialogRef.close();\r\n }\r\n}\r\n","<h2 mat-dialog-title>{{texts().columnsDialog.title}} {{data.tableName| lowercase}}</h2>\r\n<mat-dialog-content>\r\n\r\n <div class=\"columnsList\" cdkDropList (cdkDropListDropped)=\"onDrop($event)\">\r\n @for (column of columns(); track $index; let first = $first; let last = $last;) {\r\n <div \r\n class=\"columnContainer\" \r\n cdkDrag \r\n [class.pinned]=\"$index == animationIndex()\"\r\n [style]=\"{ transition: `background-color ${animationTime}ms ease` }\">\r\n\r\n <div class=\"labelContainer\">\r\n <mat-icon>drag_indicator</mat-icon>\r\n <p class=\"label\">\r\n {{data.columnsLabels[column.key] ?? ''}}\r\n @if(hasFilterAndDisabled(column)) {\r\n <span> {{texts().columnsDialog.hasFiltersApplied}}</span>\r\n }\r\n </p>\r\n </div>\r\n\r\n <div class=\"actions\">\r\n <button \r\n matIconButton\r\n [matTooltip]=\"column.isSticky ? texts().columnsDialog.unpin : texts().columnsDialog.pin\"\r\n (click)=\"onPinClick(column, $index)\">\r\n <mat-icon>{{column.isSticky ? 'keep_off' : 'keep'}}</mat-icon>\r\n </button>\r\n\r\n <button [matTooltip]=\"texts().columnsDialog.moveUp\" matIconButton [disabled]=\"$first\" (click)=\"onUpClick($index)\"><mat-icon>keyboard_arrow_up</mat-icon></button>\r\n <button [matTooltip]=\"texts().columnsDialog.moveDown\" matIconButton [disabled]=\"$last\" (click)=\"onDownClick($index)\"><mat-icon>keyboard_arrow_down</mat-icon></button>\r\n <mat-slide-toggle [checked]=\"column.show\" (toggleChange)=\"onToggleChange(column)\"></mat-slide-toggle>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <p class=\"note\"><span>{{texts().columnsDialog.note}}</span> {{texts().columnsDialog.hideColumnWithFiltersNote}}</p>\r\n \r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <button matButton [mat-dialog-close]=\"undefined\">{{texts().common.close}}</button>\r\n <button matButton (click)=\"onResetClick()\">{{texts().columnsDialog.reset}}</button>\r\n <button matButton [disabled]=\"isConfirmDisabled()\" (click)=\"onConfirmClick()\">{{texts().common.confirm}}</button>\r\n</mat-dialog-actions>","import { CommonModule } from '@angular/common';\r\nimport { AfterViewInit, Component, ElementRef, OnDestroy, WritableSignal, computed, effect, inject, input, output, signal, untracked, viewChild } from '@angular/core';\r\nimport { ControlValueAccessor, FormControl, FormGroupDirective, NgControl, NgForm, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule, SubscriptSizing } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\r\n\r\nimport { Observable } from 'rxjs';\r\nimport { PaginatedFilter, PaginatedItems } from '../../models';\r\nimport { rxResource } from '@angular/core/rxjs-interop';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { isFilterOption } from '../../models/paginated-table-config';\r\nimport { NgxTexts } from '../../i18n';\r\n\r\n@Component({\r\n selector: 'ngx-paginated-searchable-select',\r\n imports: [\r\n MatIconModule,\r\n MatFormFieldModule,\r\n MatSelectModule,\r\n MatInputModule,\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n CommonModule,\r\n MatProgressBarModule\r\n ],\r\n templateUrl: './ngx-paginated-searchable-select.component.html',\r\n styleUrl: './ngx-paginated-searchable-select.component.scss',\r\n})\r\nexport class PaginatedSearchableSelectComponent<T, U extends PaginatedFilter<T>> implements ControlValueAccessor, AfterViewInit, OnDestroy {\r\n\r\n // Inyectar el servicio de internacionalización.\r\n // inject() resuelve tambien los providers a nivel de componente/ruta, por lo que\r\n // el override sigue siendo posible.\r\n readonly texts = inject(NgxTexts).texts;\r\n\r\n endpoint = input.required<(filters: U) => Observable<PaginatedItems<T>>>();\r\n filters = input<WritableSignal<U>>(\r\n signal<U>(\r\n {\r\n pageNumber: 1,\r\n pageSize: 20,\r\n query: undefined\r\n } as U\r\n )\r\n );\r\n optionLabel = input<((option: T) => string)>(\r\n (o: T) => {\r\n if (isFilterOption(o))\r\n return o.label;\r\n\r\n throw new Error(\"Si el option no es de tipo FilterOption, es necesario especeficar el input optionLabel\");\r\n }\r\n );\r\n compareWith = input<(o1: T, o2: T) => boolean>(\r\n (o1: T, o2: T) => {\r\n if (!o2)\r\n return false;\r\n\r\n if (isFilterOption(o1) && isFilterOption(o2))\r\n return o1.value == o2.value;\r\n\r\n throw new Error(\"Si el option no es de tipo FilterOption, es necesario especeficar el input optionLabel\");\r\n }\r\n );\r\n multiple = input<boolean>(false);\r\n searchInputPlaceholder = input<string>();\r\n selectLabel = input<string | undefined>();\r\n selectPlaceholder = input<string>('');\r\n clearableOptionLabel = input<string>();\r\n subscriptSizing = input<SubscriptSizing>('fixed');\r\n clearable = input<boolean>(true);\r\n error = input<string>('');\r\n\r\n // Sin formulario (p. ej. los filtros de columna de las tablas): valor con [selected] y cambios con (optionChange).\r\n // En un formulario: formControlName / [formControl] / ngModel, como cualquier campo.\r\n selected = input<T | T[] | undefined>();\r\n disabled = input<boolean>(false);\r\n optionChange = output<T | T[] | undefined>();\r\n\r\n protected searcher = viewChild<ElementRef>('htmlSearcher');\r\n\r\n protected innerControl = signal<FormControl>(new FormControl(undefined));\r\n\r\n private queryTimeout: number | undefined = undefined;\r\n private readonly debounceTime = 300;\r\n\r\n /** Control del formulario si se usa con formControlName / [formControl] / ngModel (se registra como su value accessor). */\r\n private readonly _ngControl = inject(NgControl, { self: true, optional: true });\r\n private readonly _parentForm = inject(FormGroupDirective, { optional: true }) ?? inject(NgForm, { optional: true });\r\n private readonly _cvaDisabled = signal(false);\r\n private _onChange: (value: T | T[] | undefined) => void = () => {};\r\n private _onTouched: () => void = () => {};\r\n\r\n /** Asterisco de obligatorio: lo decide el control del formulario. */\r\n protected readonly isRequired = signal(false);\r\n /** Error con el estado del control del formulario (inválido y tocado, o formulario enviado). */\r\n protected readonly errorStateMatcher: ErrorStateMatcher = {\r\n isErrorState: () => {\r\n const control = this._ngControl?.control;\r\n return !!control && control.invalid && (control.touched || !!this._parentForm?.submitted);\r\n },\r\n };\r\n\r\n constructor() {\r\n if (this._ngControl) this._ngControl.valueAccessor = this;\r\n }\r\n\r\n selectedEffect = effect(() => {\r\n const disabled = this.disabled() || this._cvaDisabled();\r\n\r\n // En un formulario el control interno se conserva: el valor llega por writeValue\r\n if (this._ngControl) {\r\n const innerControl = untracked(this.innerControl);\r\n if (disabled) innerControl.disable({ emitEvent: false });\r\n else innerControl.enable({ emitEvent: false });\r\n return;\r\n }\r\n\r\n const selected = this.selected();\r\n this.innerControl.set(new FormControl({ value: selected, disabled: disabled }));\r\n });\r\n\r\n ngAfterViewInit(): void {\r\n // formControlName asigna su control después de registrar el value accessor: aquí ya está\r\n this.isRequired.set(this._ngControl?.control?.hasValidator(Validators.required) ?? false);\r\n }\r\n\r\n // ── ControlValueAccessor ──────────────────────────────────────────────────\r\n\r\n writeValue(value: T | T[] | undefined | null): void {\r\n this.innerControl().setValue(value ?? undefined, { emitEvent: false });\r\n }\r\n\r\n registerOnChange(fn: (value: T | T[] | undefined) => void): void {\r\n this._onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this._onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this._cvaDisabled.set(isDisabled);\r\n }\r\n\r\n dataResource = rxResource<PaginatedItems<T>, U>({\r\n params: () => this.filters()(),\r\n stream: ({ params }) => {\r\n const endpointPaginated = this.endpoint();\r\n return endpointPaginated(params);\r\n },\r\n defaultValue: { total: 0, items: [] }\r\n });\r\n\r\n protected options = signal<T[]>([]);\r\n\r\n setOptions = effect(() => {\r\n const paginatedRecords = this.dataResource.value();\r\n const pageNumber = this.filters()().pageNumber;\r\n\r\n if (!paginatedRecords)\r\n return;\r\n\r\n if (pageNumber > 1)\r\n this.options.update((oldValue: T[]) => [...oldValue, ...paginatedRecords.items]);\r\n else\r\n this.options.set(paginatedRecords.items);\r\n });\r\n /*protected options = computed(() => {\r\n if (this.dataResource.error())\r\n return [];\r\n\r\n const value = this.dataResource.value();\r\n return value.records;\r\n });*/\r\n\r\n protected total = computed(() => {\r\n if (this.dataResource.error())\r\n return 0;\r\n\r\n const value = this.dataResource.value();\r\n return value.total\r\n });\r\n\r\n ngOnDestroy(): void {\r\n //Limpiamos timeout de filtro query\r\n if (this.queryTimeout !== undefined)\r\n clearTimeout(this.queryTimeout);\r\n }\r\n\r\n protected openedChange(open: boolean) {\r\n if (!open)\r\n this._onTouched();\r\n\r\n if (!open)\r\n return;\r\n\r\n const searcher = this.searcher();\r\n\r\n if (!searcher)\r\n return;\r\n\r\n setTimeout(() => { searcher.nativeElement.focus(); });\r\n }\r\n\r\n protected cleanQuery() {\r\n const searcher = this.searcher();\r\n\r\n if (!searcher)\r\n return;\r\n\r\n searcher.nativeElement.value = \"\";\r\n this.onQueryChange();\r\n setTimeout(() => { searcher.nativeElement.focus(); });\r\n }\r\n\r\n protected onQueryChange() {\r\n const searcher = this.searcher();\r\n\r\n if (!searcher)\r\n return;\r\n\r\n const query = searcher.nativeElement.value;\r\n\r\n if (this.queryTimeout !== undefined)\r\n clearTimeout(this.queryTimeout);\r\n\r\n this.queryTimeout = setTimeout(() => {\r\n this.filters().update((value: U) => {\r\n return { ...value, query: query, pageNumber: 1 };\r\n });\r\n }, this.debounceTime);\r\n }\r\n\r\n protected getClearableOptionName(): string {\r\n const clearableOptionLabel = this.clearableOptionLabel();\r\n if (clearableOptionLabel)\r\n return clearableOptionLabel.toLowerCase();\r\n\r\n const selectLabel = this.selectLabel();\r\n if (selectLabel)\r\n return selectLabel.toLowerCase();\r\n\r\n const selectPlaceholder = this.selectPlaceholder();\r\n return selectPlaceholder.toLowerCase();\r\n }\r\n\r\n protected onOptionChange(event: MatSelectChange<T | T[] | undefined>) {\r\n this._onChange(event.value);\r\n this.optionChange.emit(event.value);\r\n }\r\n\r\n protected optionsSelectedForView(): T[] {\r\n const innerControl = this.innerControl();\r\n\r\n if (!innerControl.value)\r\n return [];\r\n\r\n if (Array.isArray(innerControl.value))\r\n return innerControl.value;\r\n\r\n return [innerControl.value];\r\n };\r\n\r\n protected onMoreClick() {\r\n this.filters().update((value: U) => {\r\n return {\r\n ...value,\r\n pageNumber: value.pageNumber + 1\r\n };\r\n });\r\n }\r\n}\r\n","<mat-form-field [subscriptSizing]=\"subscriptSizing()\">\r\n @if (selectLabel()) {\r\n <mat-label>{{ selectLabel() }}</mat-label>\r\n }\r\n\r\n <mat-select\r\n [formControl]=\"innerControl()\"\r\n [errorStateMatcher]=\"errorStateMatcher\"\r\n [required]=\"isRequired()\"\r\n [multiple]=\"multiple()\"\r\n (openedChange)=\"openedChange($event)\" \r\n [placeholder]=\"selectPlaceholder()\"\r\n panelClass=\"searchableSelectPanelClass\"\r\n (selectionChange)=\"onOptionChange($event)\"\r\n [compareWith]=\"compareWith()\">\r\n\r\n <div class=\"searcherContainer\">\r\n <mat-icon class=\"searchIcon\">search</mat-icon>\r\n\r\n @if (htmlSearcher.value.length == 0) {\r\n <span>{{ searchInputPlaceholder() || texts().common.search }}</span> \r\n }\r\n\r\n <input \r\n #htmlSearcher \r\n type=\"text\" \r\n matInput \r\n (keydown)=\"$event.stopPropagation()\"\r\n [value]=\"filters()().query ?? ''\" \r\n (input)=\"onQueryChange()\">\r\n\r\n @if (htmlSearcher.value.length > 0) {\r\n <button mat-icon-button (click)=\"cleanQuery()\"><mat-icon>close</mat-icon></button>\r\n }\r\n </div>\r\n\r\n <mat-progress-bar mode=\"indeterminate\" [style.visibility]=\"dataResource.isLoading() ? 'visible': 'hidden'\" />\r\n\r\n @if(clearable() && !multiple()) {\r\n <mat-option>{{ texts().select.removeOption(getClearableOptionName()) }}</mat-option>\r\n }\r\n \r\n @for (option of options(); track $index) {\r\n <mat-option [value]=\"option\">\r\n {{ optionLabel()(option) }}\r\n </mat-option>\r\n }\r\n\r\n <!-- Es MUY importante que estos vayan los ultimos (al final de todas las opciones). -->\r\n @for (option of optionsSelectedForView(); track $index) {\r\n <mat-option [value]=\"option\" class=\"hideOption\">\r\n {{ optionLabel()(option) }}\r\n </mat-option>\r\n }\r\n\r\n <!-- Si es multiple, como no esta el option de resetear, si filtran y no hay opciones, y luego cierran el select el desplegable no se abre y queda inutilizado, por eso, ponemos esta opcion dummy, que siempre esta oculta, y no hace nada, pero ya hace que haya un item, y el desplegable se abra -->\r\n @if(multiple()) {\r\n <mat-option class=\"hideOption\" dummyOption></mat-option>\r\n }\r\n\r\n @if (total() == 0) {\r\n <p class=\"withoutResults\">{{ texts().select.noResults }}</p>\r\n }\r\n\r\n @if((filters()().pageNumber * filters()().pageSize) < total() && !dataResource.isLoading()) {\r\n <button matButton=\"text\" class=\"showMore\" (click)=\"onMoreClick()\">\r\n {{ texts().select.showMore }}\r\n </button>\r\n }\r\n </mat-select>\r\n\r\n <mat-error>{{ error() }}</mat-error>\r\n</mat-form-field>","import { AfterViewInit, Component, ElementRef, effect, inject, input, output, signal, untracked, viewChild } from '@angular/core';\r\nimport { ControlValueAccessor, FormControl, FormGroupDirective, NgControl, NgForm, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule, SubscriptSizing } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\r\nimport { includeNoSensible } from '../../utils/string-operations';\r\nimport { CommonModule } from '@angular/common';\r\nimport { isFilterOption } from '../../models/paginated-table-config';\r\nimport { NgxTexts } from '../../i18n';\r\n\r\n\r\n@Component({\r\n selector: 'ngx-searchable-select',\r\n imports: [\r\n MatIconModule,\r\n MatFormFieldModule,\r\n MatSelectModule,\r\n MatInputModule,\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n CommonModule\r\n ],\r\n templateUrl: './ngx-searchable-select.component.html',\r\n styleUrl: './ngx-searchable-select.component.scss',\r\n})\r\nexport class SearchableSelectComponent<T> implements ControlValueAccessor, AfterViewInit {\r\n\r\n // Inyectar el servicio de internacionalización.\r\n // inject() resuelve tambien los providers a nivel de componente/ruta, por lo que\r\n // el override sigue siendo posible.\r\n readonly texts = inject(NgxTexts).texts;\r\n\r\n options = input.required<T[]>();\r\n optionLabel = input<(option: T) => string>(\r\n (option: T) => {\r\n if (isFilterOption(option))\r\n return option.label;\r\n\r\n throw new Error(\"Si el option no es de tipo FilterOption, es necesario especeficar el input optionLabel\");\r\n }\r\n );\r\n optionValue = input<(option: T) => string>(\r\n (option: T) => {\r\n if (isFilterOption(option))\r\n return option.value;\r\n\r\n throw new Error(\"Si el option no es de tipo FilterOption, es necesario especeficar el input optionValue\");\r\n }\r\n );\r\n multiple = input<boolean>(false);\r\n searchInputPlaceholder = input<string>();\r\n selectLabel = input<string | undefined>();\r\n selectPlaceholder = input<string>('');\r\n clearableOptionLabel = input<string>();\r\n subscriptSizing = input<SubscriptSizing>('fixed');\r\n clearable = input<boolean>(true);\r\n error = input<string>('');\r\n\r\n // Sin formulario (p. ej. los filtros de columna de las tablas): valor con [selected] y cambios con (optionChange).\r\n // En un formulario: formControlName / [formControl] / ngModel, como cualquier campo.\r\n selected = input<string | string[] | undefined>();\r\n disabled = input<boolean>(false);\r\n optionChange = output<string | string[] | undefined>();\r\n\r\n protected searcher = viewChild<ElementRef>('htmlSearcher');\r\n\r\n protected innerControl = signal<FormControl>(new FormControl(undefined));\r\n\r\n /** Control del formulario si se usa con formControlName / [formControl] / ngModel (se registra como su value accessor). */\r\n private readonly _ngControl = inject(NgControl, { self: true, optional: true });\r\n private readonly _parentForm = inject(FormGroupDirective, { optional: true }) ?? inject(NgForm, { optional: true });\r\n private readonly _cvaDisabled = signal(false);\r\n private _onChange: (value: string | string[] | undefined) => void = () => {};\r\n private _onTouched: () => void = () => {};\r\n\r\n /** Asterisco de obligatorio: lo decide el control del formulario. */\r\n protected readonly isRequired = signal(false);\r\n /** Error con el estado del control del formulario (inválido y tocado, o formulario enviado). */\r\n protected readonly errorStateMatcher: ErrorStateMatcher = {\r\n isErrorState: () => {\r\n const control = this._ngControl?.control;\r\n return !!control && control.invalid && (control.touched || !!this._parentForm?.submitted);\r\n },\r\n };\r\n\r\n constructor() {\r\n if (this._ngControl) this._ngControl.valueAccessor = this;\r\n }\r\n\r\n selectedEffect = effect(() => {\r\n const disabled = this.disabled() || this._cvaDisabled();\r\n\r\n // En un formulario el control interno se conserva: el valor llega por writeValue\r\n if (this._ngControl) {\r\n const innerControl = untracked(this.innerControl);\r\n if (disabled) innerControl.disable({ emitEvent: false });\r\n else innerControl.enable({ emitEvent: false });\r\n return;\r\n }\r\n\r\n const selected = this.selected();\r\n this.innerControl.set(new FormControl({ value: selected, disabled: disabled }));\r\n });\r\n\r\n ngAfterViewInit(): void {\r\n // formControlName asigna su control después de registrar el value accessor: aquí ya está\r\n this.isRequired.set(this._ngControl?.control?.hasValidator(Validators.required) ?? false);\r\n }\r\n\r\n // ── ControlValueAccessor ──────────────────────────────────────────────────\r\n\r\n writeValue(value: string | string[] | undefined | null): void {\r\n this.innerControl().setValue(value ?? undefined, { emitEvent: false });\r\n }\r\n\r\n registerOnChange(fn: (value: string | string[] | undefined) => void): void {\r\n this._onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this._onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this._cvaDisabled.set(isDisabled);\r\n }\r\n\r\n protected openedChange(open: boolean) {\r\n if (!open)\r\n this._onTouched();\r\n\r\n /*if (open)\r\n this.cleanQuery();*/\r\n if (!open)\r\n return;\r\n\r\n const searcher = this.searcher();\r\n\r\n if (!searcher)\r\n return;\r\n\r\n setTimeout(() => { searcher.nativeElement.focus(); });\r\n }\r\n\r\n protected cleanQuery() {\r\n const searcher = this.searcher();\r\n\r\n if (!searcher)\r\n return;\r\n\r\n searcher.nativeElement.value = \"\";\r\n setTimeout(() => {\r\n searcher.nativeElement.focus();\r\n });\r\n }\r\n\r\n protected getClearableOptionName(): string {\r\n const clearableOptionLabel = this.clearableOptionLabel();\r\n if (clearableOptionLabel)\r\n return clearableOptionLabel.toLowerCase();\r\n\r\n const selectLabel = this.selectLabel();\r\n if (selectLabel)\r\n return selectLabel.toLowerCase();\r\n\r\n const selectPlaceholder = this.selectPlaceholder();\r\n return selectPlaceholder.toLowerCase();\r\n }\r\n\r\n protected showOption(option: T): boolean {\r\n const query: string = this.searcher()?.nativeElement?.value ?? '';\r\n const label = this.optionLabel()(option);\r\n return includeNoSensible(label, query);\r\n }\r\n\r\n protected onOptionChange(event: MatSelectChange<string | string[] | undefined>) {\r\n this._onChange(event.value);\r\n this.optionChange.emit(event.value);\r\n }\r\n\r\n protected numberOfResults(): number {\r\n const query: string = this.searcher()?.nativeElement?.value ?? '';\r\n const optionLabel = this.optionLabel();\r\n const results = this.options().filter((option) => {\r\n const label = optionLabel(option);\r\n return includeNoSensible(label, query);\r\n });\r\n return results.length;\r\n }\r\n}\r\n","<mat-form-field [subscriptSizing]=\"subscriptSizing()\">\r\n @if (selectLabel()) {\r\n <mat-label>{{selectLabel()}}</mat-label>\r\n }\r\n\r\n <mat-select\r\n [formControl]=\"innerControl()\"\r\n [errorStateMatcher]=\"errorStateMatcher\"\r\n [required]=\"isRequired()\"\r\n [multiple]=\"multiple()\"\r\n (openedChange)=\"openedChange($event)\" \r\n [placeholder]=\"selectPlaceholder()\"\r\n panelClass=\"searchableSelectPanelClass\"\r\n (selectionChange)=\"onOptionChange($event)\">\r\n\r\n <div class=\"searcherContainer\">\r\n <mat-icon class=\"searchIcon\">search</mat-icon>\r\n\r\n @if (htmlSearcher.value.length == 0) {\r\n <span>{{ searchInputPlaceholder() || texts().common.search }}</span> \r\n }\r\n\r\n <input \r\n #htmlSearcher \r\n type=\"text\" \r\n matInput \r\n (keydown)=\"$event.stopPropagation()\">\r\n\r\n @if (htmlSearcher.value.length > 0) {\r\n <button mat-icon-button (click)=\"cleanQuery()\"><mat-icon>close</mat-icon></button>\r\n }\r\n </div>\r\n\r\n @if(clearable() && !multiple()) {\r\n <mat-option>{{ texts().select.removeOption(getClearableOptionName()) }}</mat-option>\r\n }\r\n \r\n @for (option of options(); track $index) {\r\n <mat-option \r\n [value]=\"optionValue()(option)\"\r\n [class.hideOption]=\"!showOption(option)\">\r\n {{optionLabel()(option)}}\r\n </mat-option>\r\n }\r\n\r\n @if (numberOfResults() == 0) {\r\n <p class=\"withoutResults\">{{ texts().select.noResults }}</p>\r\n }\r\n </mat-select>\r\n\r\n <mat-error>{{error()}}</mat-error>\r\n</mat-form-field>","import { Component, computed, inject, input, output, signal } from '@angular/core';\r\nimport { FormGroup, FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\r\nimport { PaginatedTableConfig, OPERATOR_BY_FILTER_TYPE, FilterOperator, FilterType, PaginatedTableColumn, FilterOption, PaginatedFilter } from '../../../models';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { NgxTexts } from '../../../i18n';\r\nimport { PaginatedSearchableSelectComponent } from '../../../components/ngx-paginated-searchable-select/ngx-paginated-searchable-select.component';\r\nimport { SearchableSelectComponent } from '../../../components/ngx-searchable-select/ngx-searchable-select.component';\r\n\r\n@Component({\r\n selector: 'lib-advanced-filter-rule',\r\n imports: [\r\n MatButtonModule,\r\n MatIconModule,\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatDatepickerModule,\r\n MatTooltipModule,\r\n SearchableSelectComponent,\r\n PaginatedSearchableSelectComponent\r\n ],\r\n templateUrl: './advanced-filter-rule.component.html',\r\n styleUrl: './advanced-filter-rule.component.scss',\r\n})\r\nexport class AdvancedFilterRuleComponent<T> {\r\n rule = input.required<FormGroup>();\r\n config = input.required<PaginatedTableConfig<T>>();\r\n deleteFilter = output<string>();\r\n\r\n readonly texts = inject(NgxTexts).texts;\r\n columns = computed(() => this.config().columns.filter(column => column.filterType != undefined));\r\n operatorByFilterType = OPERATOR_BY_FILTER_TYPE;\r\n \r\n filterOperatorLabel = computed<Record<FilterOperator, string>>(() => ({\r\n '=': this.texts().advancedFilters.operators.equals,\r\n '<>': this.texts().advancedFilters.operators.notEquals,\r\n '>': this.texts().advancedFilters.operators.greaterThan,\r\n '>=': this.texts().advancedFilters.operators.greaterOrEquals,\r\n '<': this.texts().advancedFilters.operators.lessThan,\r\n '<=': this.texts().advancedFilters.operators.lessOrEquals,\r\n 'LIKE': this.texts().advancedFilters.operators.like\r\n }));\r\n\r\n protected defaultFiltersForPaginatedFilterOptions = signal<PaginatedFilter<FilterOption>>(\r\n {\r\n pageNumber: 1,\r\n pageSize: 20,\r\n query: undefined\r\n }\r\n );\r\n\r\n getRuleId(): string {\r\n return (this.rule().get('id')! as FormControl).value;\r\n }\r\n\r\n getKey(): FormControl {\r\n return this.rule().get('key')! as FormControl\r\n }\r\n\r\n getOperator(): FormControl {\r\n return this.rule().get('operator')! as FormControl\r\n }\r\n\r\n getValue(): FormControl {\r\n return this.rule().get('value')! as FormControl\r\n }\r\n\r\n getColumnSelected(value: keyof T): PaginatedTableColumn<T> | undefined {\r\n return this.columns().find(column => column.key == value);\r\n }\r\n\r\n getOperatorsOption(value: keyof T): FilterOperator[] {\r\n const columnSelected = this.getColumnSelected(value);\r\n\r\n if (!columnSelected || !columnSelected.filterType)\r\n return [];\r\n\r\n return this.operatorByFilterType[columnSelected.filterType];\r\n }\r\n\r\n getFilterType(value: keyof T): FilterType | undefined {\r\n const columnSelected = this.getColumnSelected(value);\r\n return columnSelected?.filterType;\r\n }\r\n\r\n onKeyChange(_?: string | string[]) {\r\n this.getOperator().setValue(null);\r\n this.getValue().setValue(null);\r\n }\r\n\r\n keyOptionLabel = (column: PaginatedTableColumn<T>): string => column.label\r\n keyOptionValue = (column: PaginatedTableColumn<T>): string => column.key as string\r\n\r\n operatorOptionLabel = (filterOperator: FilterOperator): string => this.filterOperatorLabel()[filterOperator];\r\n operatorOptionValue = (filterOperator: FilterOperator): string => filterOperator;\r\n}\r\n\r\n","<button \n matIconButton \n [matTooltip]=\"texts().advancedFilters.deleteFilter\" \n (click)=\"deleteFilter.emit(getRuleId())\"\n class=\"deleteButton\"\n type=\"button\">\n <mat-icon>delete</mat-icon>\n</button>\n\n<ngx-searchable-select\n [formControl]=\"getKey()\"\n [options]=\"columns()\"\n [optionLabel]=\"keyOptionLabel\"\n [optionValue]=\"keyOptionValue\"\n (optionChange)=\"onKeyChange($event)\"\n [selectLabel]=\"texts().advancedFilters.field\"\n [selectPlaceholder]=\"texts().advancedFilters.selectOption\"\n [error]=\"texts().advancedFilters.required\"\n/>\n\n<ngx-searchable-select\n [formControl]=\"getOperator()\"\n [options]=\"getOperatorsOption(getKey().value)\"\n [optionLabel]=\"operatorOptionLabel\"\n [optionValue]=\"operatorOptionValue\"\n [selectLabel]=\"texts().advancedFilters.condition\"\n [selectPlaceholder]=\"texts().advancedFilters.selectOption\"\n [error]=\"texts().advancedFilters.required\"\n/>\n\n@if (getFilterType(getKey().value) == 'text' || getFilterType(getKey().value) == 'number') {\n <mat-form-field>\n <mat-label>{{texts().advancedFilters.value}}</mat-label>\n <input [formControl]=\"getValue()\" [type]=\"getFilterType(getKey().value) ?? 'text'\" matInput>\n <mat-error>{{texts().advancedFilters.required}}</mat-error>\n </mat-form-field>\n}\n\n@if (getFilterType(getKey().value) == 'option' || getFilterType(getKey().value) == 'option-multiple') {\n @if(getColumnSelected(getKey().value)?.endpointForPaginatedFilterOptions) {\n <ngx-paginated-searchable-select \n [formControl]=\"getValue()\"\n [endpoint]=\"getColumnSelected(getKey().value)!.endpointForPaginatedFilterOptions!\"\n [filters]=\"getColumnSelected(getKey().value)!.filtersForEndpointPaginatedFilterOptions ?? defaultFiltersForPaginatedFilterOptions\"\n [selectLabel]=\"texts().advancedFilters.value\"\n [selectPlaceholder]=\"texts().advancedFilters.selectOption\"\n [error]=\"texts().advancedFilters.required\"\n />\n } @else {\n <ngx-searchable-select\n [formControl]=\"getValue()\"\n [options]=\"getColumnSelected(getKey().value)?.filterOptions ?? []\"\n [selectLabel]=\"texts().advancedFilters.value\"\n [selectPlaceholder]=\"texts().advancedFilters.selectOption\"\n [error]=\"texts().advancedFilters.required\"\n />\n }\n}\n\n@if(getFilterType(getKey().value) == 'date' || getFilterType(getKey().value) == 'date-range') {\n <mat-form-field>\n <mat-label>{{texts().advancedFilters.value}}</mat-label>\n <input\n [formControl]=\"getValue()\"\n matInput \n [matDatepicker]=\"picker\">\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n <mat-error>{{texts().advancedFilters.required}}</mat-error>\n </mat-form-field>\n}\n\n\n","import { Component, computed, inject, input, output } from '@angular/core';\r\nimport { ReactiveFormsModule, FormGroup, AbstractControl, FormControl, FormArray } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { PaginatedTableConfig, FilterOption } from '../../../models';\r\nimport { AdvancedFilterUtils } from '../../../models/advanced-filter-utils';\r\nimport { DatosPantallaService } from '../../../services/datos-pantalla.service';\r\nimport { AdvancedFilterRuleComponent } from '../advanced-filter-rule/advanced-filter-rule.component';\r\nimport { NgxTexts } from '../../../i18n';\r\n\r\n@Component({\r\n selector: 'lib-advanced-filter-group',\r\n imports: [\r\n MatButtonModule,\r\n MatIconModule,\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatDatepickerModule,\r\n AdvancedFilterRuleComponent,\r\n MatButtonToggleModule,\r\n MatTooltipModule\r\n ],\r\n templateUrl: './advanced-filter-group.component.html',\r\n styleUrl: './advanced-filter-group.component.scss',\r\n})\r\nexport class AdvancedFilterGroupComponent<T> {\r\n isRootNode = input.required<boolean>();\r\n group = input.required<FormGroup>();\r\n config = input.required<PaginatedTableConfig<T>>();\r\n addGroup = output<string>();\r\n addFilter = output<string>();\r\n deleteGroup = output<string>();\r\n deleteFilter = output<string>();\r\n\r\n private readonly datosPantallaService = inject(DatosPantallaService);\r\n readonly texts = inject(NgxTexts).texts;\r\n isDesktop = computed<boolean>(() => this.datosPantallaService.pantalla()?.tipo == 'escritorio');\r\n\r\n optionsFilterConnector = computed<FilterOption[]>(() => [\r\n { value: 'AND', label: this.texts().advancedFilters.and },\r\n { value: 'OR', label: this.texts().advancedFilters.or }\r\n ]);\r\n\r\n isFilterGroupForm(group: AbstractControl): boolean {\r\n return AdvancedFilterUtils.isFilterGroupForm(group);\r\n }\r\n\r\n getConnector(): FormControl {\r\n return this.group().get('connector')! as FormControl\r\n }\r\n\r\n getGroupId(): string {\r\n return (this.group().get('id')! as FormControl).value;\r\n }\r\n\r\n getFilters(): FormGroup[] {\r\n return (this.group().get('filters') as FormArray).controls as FormGroup[];\r\n }\r\n}\r\n","<div class=\"grupo\" [formGroup]=\"group()\">\r\n \r\n <mat-button-toggle-group [formControl]=\"getConnector()\">\r\n @for (option of optionsFilterConnector(); track option.value) {\r\n <mat-button-toggle [value]=\"option.value\">{{option.label}}</mat-button-toggle>\r\n }\r\n </mat-button-toggle-group>\r\n\r\n @if (isDesktop()) {\r\n <button \r\n matButton=\"outlined\" \r\n (click)=\"addFilter.emit(getGroupId())\"\r\n class=\"addFilterButton\"\r\n type=\"button\">\r\n <mat-icon>add</mat-icon>\r\n {{texts().advancedFilters.addFilter}}\r\n </button>\r\n\r\n <button \r\n matButton=\"outlined\"\r\n (click)=\"addGroup.emit(getGroupId())\"\r\n class=\"addGroupButton\"\r\n type=\"button\">\r\n <mat-icon>data_array</mat-icon>\r\n {{texts().advancedFilters.addGroup}}\r\n </button>\r\n } @else {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"texts().advancedFilters.addFilter\" \r\n (click)=\"addFilter.emit(getGroupId())\"\r\n class=\"addFilterButton\"\r\n type=\"button\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n\r\n <button \r\n matIconButton \r\n [matTooltip]=\"texts().advancedFilters.addGroup\" \r\n (click)=\"addGroup.emit(getGroupId())\"\r\n class=\"addGroupButton\"\r\n type=\"button\">\r\n <mat-icon>data_array</mat-icon>\r\n </button>\r\n }\r\n \r\n\r\n @if(!isRootNode()) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"texts().advancedFilters.deleteGroup\" \r\n (click)=\"deleteGroup.emit(getGroupId())\"\r\n class=\"deleteGroupButton\"\r\n type=\"button\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n }\r\n\r\n @for (group of getFilters(); track $index) {\r\n @if(isFilterGroupForm(group)) {\r\n <lib-advanced-filter-group \r\n [group]=\"group\"\r\n [config]=\"config()\"\r\n [isRootNode]=\"false\"\r\n (addGroup)=\"addGroup.emit($event)\"\r\n (addFilter)=\"addFilter.emit($event)\"\r\n (deleteGroup)=\"deleteGroup.emit($event)\"\r\n (deleteFilter)=\"deleteFilter.emit($event)\"\r\n />\r\n } @else {\r\n <lib-advanced-filter-rule \r\n [rule]=\"group\"\r\n [config]=\"config()\"\r\n (deleteFilter)=\"deleteFilter.emit($event)\"\r\n />\r\n }\r\n }\r\n\r\n</div>","import { Component, effect, inject, signal } from '@angular/core';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { FormBuilder, FormGroup, FormArray, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle } from '@angular/material/dialog';\r\nimport { FilterGroup, FilterRule } from '../../../models';\r\nimport { AdvancedFilterUtils } from '../../../models/advanced-filter-utils';\r\nimport { ConfigureAdvancedFilterData } from '../../../models/configure-advanced-filter-data';\r\nimport { AdvancedFilterService } from '../../../services/advanced-filter.service';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { LowerCasePipe } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { SendType } from '../../../models/send-type';\r\nimport { AdvancedFilterGroupComponent } from '../advanced-filter-group/advanced-filter-group.component';\r\nimport { NgxTexts } from '../../../i18n';\r\n\r\n@Component({\r\n selector: 'lib-configure-advanced-filter',\r\n imports: [\r\n MatDialogTitle,\r\n MatDialogContent,\r\n MatDialogActions,\r\n MatDialogClose,\r\n LowerCasePipe,\r\n MatButtonModule,\r\n MatIconModule,\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n AdvancedFilterGroupComponent\r\n ],\r\n templateUrl: './configure-advanced-filter.component.html',\r\n styleUrl: './configure-advanced-filter.component.scss',\r\n})\r\nexport class ConfigureAdvancedFilterComponent<T> { \r\n private readonly fb = inject(FormBuilder);\r\n private readonly advancedFilterService = inject(AdvancedFilterService);\r\n dialogRef = inject(MatDialogRef<ConfigureAdvancedFilterComponent<T>>);\r\n data = inject<ConfigureAdvancedFilterData<T>>(MAT_DIALOG_DATA);\r\n readonly texts = inject(NgxTexts).texts;\r\n\r\n query = signal('');\r\n\r\n form = AdvancedFilterUtils.createAdvancedFilter<T>(this.fb, this.data.advancedFilter);\r\n formChanges = toSignal(this.form.valueChanges);\r\n\r\n mapFormToAdvancedFilterEffect = effect(() => {\r\n const values = this.formChanges();\r\n\r\n if (this.form.invalid) {\r\n this.query.set('');\r\n return;\r\n }\r\n\r\n const advancedFilter = AdvancedFilterUtils.mapFormToAdvancedFilter<T>(this.form);\r\n const queryString = AdvancedFilterUtils.groupsToReadableHtml(advancedFilter.groups, this.data.config.columns, this.texts());\r\n this.query.set(queryString);\r\n });\r\n\r\n getRootGroup(): FormGroup {\r\n return (this.form.get('groups') as FormArray).controls[0] as FormGroup;\r\n }\r\n\r\n addGroup(groupId: string) {\r\n const newGroup: FilterGroup<T> = {\r\n id: uuidv4(),\r\n connector: 'AND',\r\n filters: [\r\n { id: uuidv4() }\r\n ]\r\n };\r\n AdvancedFilterUtils.addGroupToGroup<T>(this.fb, this.form, groupId, newGroup);\r\n }\r\n\r\n addFilter(groupId: string) {\r\n const newRule: FilterRule<T> = { id: uuidv4() };\r\n AdvancedFilterUtils.addRuleToGroup<T>(this.fb, this.form, groupId, newRule);\r\n }\r\n\r\n deleteGroup(groupId: string) {\r\n AdvancedFilterUtils.deleteGroup<T>(this.form, groupId);\r\n }\r\n\r\n deleteFilter(ruleId: string) {\r\n AdvancedFilterUtils.deleteRule<T>(this.form, ruleId);\r\n }\r\n\r\n onSubmit(sendType: SendType) {\r\n const advancedFilter = AdvancedFilterUtils.mapFormToAdvancedFilter<T>(this.form);\r\n const tableId = this.data.config.tableId;\r\n this.advancedFilterService.saveAdvancedFilter(tableId, advancedFilter);\r\n switch (sendType) {\r\n case 'save':\r\n this.dialogRef.close();\r\n break;\r\n case 'save_and_apply':\r\n this.dialogRef.close(advancedFilter);\r\n break;\r\n }\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (ngSubmit)=\"onSubmit('save_and_apply')\">\r\n\r\n <h2 mat-dialog-title>{{texts().advancedFilters.dialogTitle}} {{data.config.title() | lowercase}}</h2>\r\n <mat-dialog-content>\r\n\r\n <p class=\"advancedFilterResult\" [innerHTML]=\"query()\" [style.visibility]=\"query() ? 'visible': 'hidden'\"></p>\r\n\r\n <mat-form-field>\r\n <mat-label>{{texts().advancedFilters.templateName}}</mat-label>\r\n <input matInput formControlName=\"name\" [maxlength]=\"16\">\r\n <mat-hint>{{form.get('name')?.value.length ?? 0}}/16</mat-hint>\r\n <mat-error>{{texts().advancedFilters.templateNameRequired}}</mat-error>\r\n </mat-form-field>\r\n\r\n <lib-advanced-filter-group \r\n [group]=\"getRootGroup()\"\r\n [config]=\"data.config\"\r\n [isRootNode]=\"true\"\r\n (addGroup)=\"addGroup($event)\"\r\n (addFilter)=\"addFilter($event)\"\r\n (deleteGroup)=\"deleteGroup($event)\"\r\n (deleteFilter)=\"deleteFilter($event)\"\r\n />\r\n\r\n <div class=\"helperContainer\">\r\n <p class=\"helperTitle\"><strong>{{texts().advancedFilters.helpTitle}}</strong></p>\r\n <p class=\"helper\">\r\n <strong>{{texts().advancedFilters.group}} </strong>{{texts().advancedFilters.groupHelp}}<br>\r\n <strong>{{texts().advancedFilters.filter}} </strong>{{texts().advancedFilters.ruleHelp}}\r\n </p>\r\n </div>\r\n \r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button matButton [mat-dialog-close]=\"undefined\">{{texts().common.close}}</button>\r\n <button matButton [disabled]=\"form.invalid\" type=\"button\" (click)=\"onSubmit('save')\">{{texts().common.save}}</button>\r\n <button matButton [disabled]=\"form.invalid\" type=\"button\" (click)=\"onSubmit('save_and_apply')\">{{texts().common.saveAndApply}}</button>\r\n </mat-dialog-actions>\r\n\r\n\r\n</form>","import { CommonModule } from '@angular/common';\nimport { Component, computed, HostListener, inject, input, OnDestroy, output, Signal, signal, TemplateRef, viewChild, ViewContainerRef, WritableSignal } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { DateRange, MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatMenuModule, MatMenuTrigger } from '@angular/material/menu';\nimport { MatPaginatorModule, PageEvent } from '@angular/material/paginator';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\nimport { MatSortModule, Sort } from '@angular/material/sort';\nimport { MatTableModule } from '@angular/material/table';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { DynamicCellHostDirective } from '../../directives/dynamic-cell-host.directive';\nimport { OnlyUpperFirstCharacterPipe } from '../../pipes/only-upper-first-character.pipe';\nimport { Observable } from 'rxjs';\nimport { ColumnPipe, FilterOption, isFilterOption, PaginatedTableColumn, PaginatedTableConfig, RowSelectionAction, TableRowAction } from '../../models/paginated-table-config';\nimport moment from 'moment';\nimport { Overlay, OverlayContainer, OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { rxResource } from '@angular/core/rxjs-interop';\nimport { MatDialog } from '@angular/material/dialog';\nimport jsPDF from 'jspdf';\nimport autoTable from 'jspdf-autotable';\nimport { utils, writeFileXLSX } from 'xlsx';\nimport { AdvancedFilter, PaginatedFilter, PaginatedItems } from '../../models';\nimport { AdvancedFilterUtils } from '../../models/advanced-filter-utils';\nimport { ColumnValue } from '../../models/column-value';\nimport { ColumnConfig, ConfigureTableColumnData } from '../../models/configure-table-column-data';\nimport { AdvancedFilterService } from '../../services/advanced-filter.service';\nimport { ColumnConfigService } from '../../services/column-config.service';\nimport { DatosPantallaService } from '../../services/datos-pantalla.service';\nimport { RowActionClickEvent } from '../../models/row-action-click-event';\nimport { SelectionActionEvent } from '../../models/selection-action-event';\nimport { v4 as uuidv4 } from 'uuid';\nimport { NgxDialogService } from '../../services/ngx-dialog.service';\nimport { ConfigureTableColumnsComponent } from '../../common/components/configure-table-columns/configure-table-columns.component';\nimport { ConfigureAdvancedFilterData } from '../../models/configure-advanced-filter-data';\nimport { ConfigureAdvancedFilterComponent } from '../../common/components/configure-advanced-filter/configure-advanced-filter.component';\nimport { NgxTexts } from '../../i18n';\nimport { PaginatedSearchableSelectComponent } from '../ngx-paginated-searchable-select/ngx-paginated-searchable-select.component';\nimport { SearchableSelectComponent } from '../ngx-searchable-select/ngx-searchable-select.component';\n\n@Component({\n selector: 'ngx-paginated-table',\n imports: [\n MatTableModule,\n MatSortModule,\n MatPaginatorModule,\n MatIconModule,\n MatButtonModule,\n MatProgressBarModule,\n MatTooltipModule,\n MatFormFieldModule,\n MatInputModule,\n MatSelectModule,\n MatDatepickerModule,\n CommonModule,\n DynamicCellHostDirective,\n MatMenuModule,\n MatDividerModule,\n OnlyUpperFirstCharacterPipe,\n MatCheckboxModule,\n PaginatedSearchableSelectComponent,\n SearchableSelectComponent\n ],\n templateUrl: './ngx-paginated-table.component.html',\n styleUrl: './ngx-paginated-table.component.scss',\n host: { class: 'contenedorDefecto' }\n})\nexport class NgxPaginatedTable<T, U extends PaginatedFilter<T>> implements OnDestroy {\n \n private readonly columnConfigService = inject(ColumnConfigService);\n private readonly advancedFilterService = inject(AdvancedFilterService);\n private readonly dialog = inject(MatDialog);\n private readonly dialogService = inject(NgxDialogService);\n private readonly datosPantallaService = inject(DatosPantallaService);\n\n // Inyectar el servicio de internacionalización.\n // inject() resuelve tambien los providers a nivel de componente/ruta, por lo que\n // el override sigue siendo posible sin necesidad de instanciarlo a mano.\n readonly texts = inject(NgxTexts).texts;\n\n protected isDesktop = computed<boolean>(() => this.datosPantallaService.pantalla()?.tipo == 'escritorio');\n\n endpoint = input.required<(filters: U) => Observable<PaginatedItems<T>>>();\n filters = input<WritableSignal<U>>(\n signal<U>(\n {\n pageNumber: 1,\n pageSize: 10,\n query: undefined,\n sortBy: undefined,\n columnsFiltersValue: undefined,\n advancedFilterId: undefined\n } as U\n )\n );\n\n config = input.required<WritableSignal<PaginatedTableConfig<T>>>();\n\n protected createClick = output<void>();\n protected updateClick = output<T>();\n protected deleteClick = output<T>();\n protected rowActionClick = output<RowActionClickEvent<T>>();\n protected expandedItemChange = output<T | null>();\n protected selectionActionEvent = output<SelectionActionEvent<T>>();\n\n\n protected readonly filterKeyPrefix = 'filter';\n protected readonly nameOfActionsColumn = 'actionsPerRow';\n protected readonly generalFooterKeyPrefix = 'footer';\n protected readonly nameOfRowSelectionColumn = 'rowSelectionColumn';\n protected readonly debounceTime = 300;\n dataResource = rxResource<PaginatedItems<T>, U>({\n params: () => this.filters()(),\n stream: ({ params }) => {\n const endpointPaginated = this.endpoint();\n return endpointPaginated(params);\n },\n defaultValue: { total: 0, items: [] }\n });\n protected data = computed(() => {\n if (this.dataResource.error())\n return [];\n\n const value = this.dataResource.value();\n return value.items;\n });\n protected total = computed(() => {\n if (this.dataResource.error())\n return 0;\n\n const value = this.dataResource.value();\n return value.total\n });\n\n protected columnConfig = computed(() => {\n const columnConfigs = this.columnConfigService.columnConfigs();\n const configValue = this.config()();\n const columnConfig: ColumnConfig<T>[] | undefined = columnConfigs[configValue.tableId];\n const defaultColumnConfig: ColumnConfig<T>[] = configValue.columns.map(column => {\n return {\n key: column.key,\n show: true,\n isSticky: configValue.defaultStickyColumn == column.key\n }\n });\n\n if (!columnConfig)\n return defaultColumnConfig;\n\n //Por si acaso se quitan columnas a posteriori, hay que filtrarlas para que no aparezcan\n const filteredColumns = columnConfig.filter(column => this.includeInColumnConfig(column, defaultColumnConfig));\n\n //Por si a posteriori se añaden nuevas columnas\n const columnsAdded = defaultColumnConfig.filter(defaultColumn => !this.includeInColumnConfig(defaultColumn, columnConfig));\n\n return [...filteredColumns, ...columnsAdded];\n });\n\n protected stickyColumnKey = computed(() => this.columnConfig().find(c => c.isSticky)?.key);\n\n protected keys = computed(() => {\n const configValue = this.config()();\n const columnConfig = this.columnConfig();\n\n let keys: (string | keyof T)[] = [...columnConfig]\n .filter(column => column.show)\n .map(column => column.key);\n\n if ((configValue.showActions?.() ?? true) &&\n ((configValue.update && !configValue.clickOnRowForUpdate)\n || configValue.delete\n || (configValue.rowActions && configValue.rowActions.length > 0)\n || configValue.expandableDetail)\n ) {\n keys = [...keys, this.nameOfActionsColumn];\n }\n\n if (configValue.enableRowSelection)\n keys = [this.nameOfRowSelectionColumn, ...keys];\n\n return keys;\n });\n protected keysWithFilter = computed(() => this.keys().map(key => `${this.filterKeyPrefix}${this.getKeyAsString(key)}`));\n protected keysWithGeneralFooter = computed(() => this.keys().map(key => `${this.generalFooterKeyPrefix}${this.getKeyAsString(key)}`));\n protected showFiltersRow = computed(() => {\n const configValue = this.config()();\n return [...configValue.columns].some(column => column.filterType) && !configValue.showAdvancedFilters;\n });\n protected showActionsColumn = computed(() => this.keys().includes(this.nameOfActionsColumn));\n protected showTotalPerPageFooter = computed(() => {\n const columns = this.config()().columns;\n const keys = this.keys();\n return keys.some(key => columns.find(column => key == column.key)?.showTotalPerPage);\n });\n protected showTotalGeneralFooter = computed(() => {\n const columns = this.config()().columns;\n const keys = this.keys();\n //En la tabla paginada el total general solo puede calcularlo el consumidor,\n //asi que sin getTotalGeneral la fila quedaria vacia\n return keys.some(key => {\n const column = columns.find(column => key == column.key);\n return column?.showTotalGeneral && !!column.getTotalGeneral;\n });\n });\n\n protected queryTimeout: number | undefined = undefined;\n\n protected timeoutsByKey: Partial<Record<keyof T, number>> = {}\n\n protected advancedFilters: Signal<AdvancedFilter<T>[]> = computed(() => {\n const allTablesAdvancedFilters = this.advancedFilterService.advancedFilters();\n const tableId = this.config()().tableId;\n //Si la tabla todavia no tiene filtros guardados, la clave no existe en el record\n return allTablesAdvancedFilters[tableId] ?? [];\n });\n\n protected readonly expandableColumnDef = 'expandedDetail';\n protected expandedItem = signal<T | null>(null);\n\n protected selection = signal<T[]>([]);\n\n protected isFullScreen = signal(false);\n private readonly overlay = inject(Overlay);\n private readonly overlayContainer = inject(OverlayContainer);\n private readonly viewContainerRef = inject(ViewContainerRef);\n tableContentTemplate = viewChild<TemplateRef<any>>('tableContent');\n private overlayRef?: OverlayRef;\n private portal?: TemplatePortal;\n\n protected defaultFiltersForPaginatedFilterOptions = signal<PaginatedFilter<FilterOption>>(\n {\n pageNumber: 1,\n pageSize: 20,\n query: undefined\n }\n );\n\n @HostListener('document:keydown.escape')\n onEscape() {\n if (this.overlayRef && this.isMyOverlayOnTop())\n this.exitFullscreen();\n }\n\n ngOnDestroy(): void {\n //Limpiamos timeout de filtro query\n if (this.queryTimeout !== undefined)\n clearTimeout(this.queryTimeout);\n\n //Limpiamos todos los timeouts de filtros tipo texto de columnas\n Object.keys(this.timeoutsByKey).forEach((key) => {\n const timeout = this.timeoutsByKey[key as keyof T]\n clearTimeout(timeout);\n });\n }\n\n private includeInColumnConfig(searchedColumn: ColumnConfig<T>, allColumns: ColumnConfig<T>[]): boolean {\n return allColumns.some(column => searchedColumn.key == column.key);\n }\n\n protected getKeyAsString = (columnKey: keyof T | string): string => columnKey as string\n\n protected onPageChange(event: PageEvent) {\n this.filters().update(value => {\n return {\n ...value,\n pageNumber: value.pageSize == event.pageSize ? event.pageIndex + 1 : 1,\n pageSize: event.pageSize\n };\n });\n }\n\n protected onQueryChange(inputElement: HTMLInputElement) {\n const query = inputElement.value;\n\n if (this.queryTimeout !== undefined)\n clearTimeout(this.queryTimeout);\n\n this.queryTimeout = setTimeout(() => {\n this.filters().update((value: U) => {\n return { ...value, query: query, pageNumber: 1 };\n });\n }, this.debounceTime)\n }\n\n protected onQueryReset(inputElement: HTMLInputElement) {\n inputElement.value = '';\n this.onQueryChange(inputElement);\n }\n\n protected onSortChange(sort: Sort) {\n this.filters().update(value => {\n return {\n ...value,\n pageNumber: 1,\n sortBy: sort.direction ? { key: sort.active, direction: sort.direction } : undefined\n };\n });\n }\n\n protected onNewClick() {\n this.createClick.emit();\n }\n\n protected onUpdateClick(row: T, event: Event) {\n this.updateClick.emit(row);\n event.stopPropagation();\n }\n\n protected onRowClick(row: T) {\n if (this.isRowEnabled(row))\n this.updateClick.emit(row);\n }\n\n protected isRowEnabled(row: T): boolean | undefined {\n return this.config()().update\n && this.config()().clickOnRowForUpdate\n && (!this.config()().update?.show || this.config()().update?.show?.(row))\n && !this.config()().update?.disabled?.(row);\n }\n\n protected onDeleteClick(row: T, event: Event) {\n event.stopPropagation();\n\n const texts = this.texts();\n const header = {\n title: this.config()().deleteConfirm?.title?.(row) ?? texts.table.deleteConfirmTitle,\n confirmText: texts.table.confirmDelete,\n cancelText: texts.common.cancel,\n destructive: true,\n };\n const template = this.config()().deleteConfirm?.templateRef?.();\n const confirm$ = template\n ? this.dialogService.template({ ...header, template, templateData: row })\n : this.dialogService.confirm({ ...header, message: this.config()().deleteConfirm?.body?.(row) ?? texts.table.deleteConfirmBody });\n\n confirm$.subscribe(confirm => {\n if (confirm === true)\n this.deleteClick.emit(row);\n });\n }\n\n protected onRowActionClick(row: T, rowAction: TableRowAction<T>, event: Event) {\n this.rowActionClick.emit({ id: rowAction.id, row: row })\n event.stopPropagation();\n }\n\n protected onTextFilterColumnChange(column: PaginatedTableColumn<T>, event: Event) {\n const query = (event.target as HTMLInputElement).value;\n\n //Si existe, limpio el anterior\n if (column.key in this.timeoutsByKey)\n clearTimeout(this.timeoutsByKey[column.key]);\n\n this.timeoutsByKey[column.key] = setTimeout(() => {\n this.onColumnFilterChange(column.key, query);\n }, this.debounceTime);\n }\n\n protected onPaginatedOptionFilterColumnChange(column: PaginatedTableColumn<T>, option?: FilterOption | FilterOption[]) {\n this.onColumnFilterChange(column.key, option);\n }\n\n protected onOptionFilterColumnChange(column: PaginatedTableColumn<T>, value?: string | string[]) {\n this.onColumnFilterChange(column.key, value);\n }\n\n protected onDateFilterChange(column: PaginatedTableColumn<T>, value: moment.Moment | null) {\n this.onColumnFilterChange(column.key, value);\n }\n\n protected onDateRangeFilterChange(column: PaginatedTableColumn<T>, value: DateRange<moment.Moment | null> | null) {\n this.onColumnFilterChange(column.key, value);\n }\n\n private onColumnFilterChange(columnKey: keyof T, value: ColumnValue) {\n this.filters().update(currentValue => {\n //Se clona para no mutar el estado anterior de la signal\n const columnsFiltersValue: Partial<Record<keyof T, ColumnValue>> = {\n ...(currentValue.columnsFiltersValue ?? {}),\n [columnKey]: value\n };\n return {\n ...currentValue,\n pageNumber: 1,\n columnsFiltersValue: columnsFiltersValue\n }\n });\n }\n\n protected getValueOfColumnFilter(key: keyof T): ColumnValue {\n return this.filters()().columnsFiltersValue?.[key];\n }\n\n protected getPaginatedSearchableSelectValueOfColumnFilter(key: keyof T): FilterOption | FilterOption[] | undefined {\n const value = this.getValueOfColumnFilter(key);\n\n if (isFilterOption(value) || (Array.isArray(value) && value.every(v => isFilterOption(v))))\n return value;\n\n return undefined;\n }\n\n protected getSearchableSelectValueOfColumnFilter(key: keyof T): string | string[] | undefined {\n const value = this.getValueOfColumnFilter(key);\n\n if (typeof value === 'string' || (Array.isArray(value) && value.every(v => typeof v === 'string')))\n return value;\n\n return undefined;\n }\n\n protected getDateRangeValueOfColumnFilter(key: keyof T, type: 'start' | 'end'): moment.Moment | null {\n const value = this.getValueOfColumnFilter(key) as DateRange<moment.Moment | null>;\n\n if (!value)\n return null;\n\n return type == 'start' ? value.start : value.end\n }\n\n protected onEditColumns() {\n const config = this.config()();\n const filters = this.filters()();\n const columnConfig = this.columnConfig();\n\n const columnsLabel = Object.fromEntries(\n config.columns.map(column => [column.key, column.label])\n ) as Record<keyof T, string>;\n\n const data: ConfigureTableColumnData<T> = {\n tableId: config.tableId,\n tableName: config.title(),\n columns: columnConfig,\n filtersValue: filters.columnsFiltersValue ?? {},\n columnsLabels: columnsLabel\n };\n this.dialog.open(ConfigureTableColumnsComponent, { data: data });\n }\n\n protected applyColumnPipes(value: any, pipes?: ColumnPipe | ColumnPipe[]): any {\n if (!pipes)\n return value;\n\n const pipesArray = Array.isArray(pipes) ? pipes : [pipes];\n\n return pipesArray.reduce((v, p) => p.pipe.transform(v, ...(p.args || [])), value);\n }\n\n\n protected onNewAdvancedFiltersClick() {\n const data: ConfigureAdvancedFilterData<T> = {\n config: this.config()(),\n advancedFilter: {\n name: '',\n groups: [\n {\n id: uuidv4(),\n connector: 'AND',\n filters: [{ id: uuidv4() }]\n }\n ]\n }\n };\n const dialogRef = this.dialog.open(ConfigureAdvancedFilterComponent, { data: data });\n\n dialogRef.afterClosed().subscribe((advancedFilter?: AdvancedFilter<T>) => {\n if (advancedFilter)\n this.onApplyTemplateClick(advancedFilter);\n });\n }\n\n protected onApplyTemplateClick(advancedFilter?: AdvancedFilter<T>) {\n const advancedFilterId: string | undefined = advancedFilter?.groups?.[0].id;\n this.filters().update(currentValue => {\n return {\n ...currentValue,\n advancedFilterId: advancedFilterId,\n pageNumber: 1\n };\n });\n }\n\n protected onSelectedAdvancedFilterUpdate(event: Event) {\n const advancedFilterId = this.filters()().advancedFilterId;\n if (!advancedFilterId)\n return;\n\n const tableId = this.config()().tableId;\n const advancedFilter = this.advancedFilterService.getAdvancedFilterById(tableId, advancedFilterId, false);\n\n if (!advancedFilter)\n return;\n\n this.onAdvancedFilterUpdate(event, advancedFilter);\n }\n\n protected onAdvancedFilterUpdate(event: Event, advancedFilter: AdvancedFilter<T>, advancedFiltersMenuTrigger?: MatMenuTrigger) {\n event.stopPropagation();\n advancedFiltersMenuTrigger?.closeMenu();\n\n const data: ConfigureAdvancedFilterData<T> = {\n config: this.config()(),\n advancedFilter: advancedFilter\n };\n\n const dialogRef = this.dialog.open(ConfigureAdvancedFilterComponent, { data: data });\n\n dialogRef.afterClosed().subscribe((advancedFilter?: AdvancedFilter<T>) => {\n if (advancedFilter)\n this.onApplyTemplateClick(advancedFilter);\n });\n }\n\n protected onAdvancedFilterDelete(event: Event, advancedFiltersMenuTrigger: MatMenuTrigger, advancedFilter: AdvancedFilter<T>) {\n event.stopPropagation();\n advancedFiltersMenuTrigger.closeMenu();\n\n const texts = this.texts();\n this.dialogService.confirm({\n title: texts.advancedFilters.deleteTitle,\n message: texts.advancedFilters.deleteMessage(advancedFilter.name),\n confirmText: texts.table.confirmDelete,\n cancelText: texts.common.cancel,\n destructive: true,\n }).subscribe(confirm => {\n if (confirm === true) {\n if (this.filters()().advancedFilterId == advancedFilter.groups[0].id)\n this.onApplyTemplateClick();\n\n this.advancedFilterService.deleteAdvancedFilter(this.config()().tableId, advancedFilter);\n }\n });\n }\n\n protected onQuitAdvancedFilter(event: Event) {\n event.stopPropagation();\n this.onApplyTemplateClick();\n }\n\n protected getAdvancedFilterLabel(): string {\n const advancedFilterId = this.filters()().advancedFilterId;\n if (!advancedFilterId)\n return '';\n\n const tableId = this.config()().tableId;\n const advancedFilter = this.advancedFilterService.getAdvancedFilterById(tableId, advancedFilterId, false);\n\n if (!advancedFilter)\n return '';\n\n return AdvancedFilterUtils.groupsToReadableHtml<T>(advancedFilter.groups, this.config()().columns, this.texts());\n }\n\n protected rowIsExpanded(row: T): boolean {\n return this.expandedItem() == row;\n }\n\n protected expandableToggle(row: T) {\n this.expandedItem.update(currentValue => {\n const newValue = currentValue != row ? row : null;\n this.expandedItemChange.emit(newValue);\n return newValue;\n });\n }\n\n protected getTotalOfColum(columnKey: keyof T): number {\n const result = this.data().reduce((previous, item) => (previous + Number(item[columnKey])), 0);\n return result;\n }\n\n protected areEqualByKeys(record1: T, record2: T): boolean {\n const primaryKey = this.config()().primaryKey;\n\n if (Array.isArray(primaryKey))\n return primaryKey.every(key => record1[key] === record2[key]);\n else\n return record1[primaryKey] === record2[primaryKey];\n }\n\n protected isRowSelected(row: T): boolean {\n return this.selection().some(row2 => this.areEqualByKeys(row, row2));\n }\n\n protected toggleRowSelection(row: T) {\n if (this.isRowSelected(row)) {\n this.selection.update(recordsSelected => {\n return recordsSelected.filter(record => !this.areEqualByKeys(row, record));\n });\n } else {\n this.selection.update(recordsSelected => [...recordsSelected, row]);\n }\n }\n\n protected isAllPageRowSelected(): boolean {\n const records = this.getSelectableRows();\n return records.length > 0 && records.every(record => this.isRowSelected(record));\n }\n\n protected toggleAllPageRowSelection() {\n const records = this.getSelectableRows();\n\n if (this.isAllPageRowSelected()) {\n //Deseleccionar todas las filas seleccionables de la página actual\n this.selection.update(recordsSelected => {\n return recordsSelected.filter(\n record => !records.some(row2 => this.areEqualByKeys(record, row2))\n );\n });\n } else {\n //Seleccionar todas las filas seleccionables visibles que aún no estén seleccionadas\n const notSelected = records.filter(record => !this.isRowSelected(record));\n\n this.selection.update(recordsSelected => {\n // Evitar duplicados por si ya hay seleccionadas\n const nuevas = notSelected.filter(\n row => !recordsSelected.some(sel => this.areEqualByKeys(sel, row))\n );\n return [...recordsSelected, ...nuevas];\n });\n }\n }\n\n private getSelectableRows(): T[] {\n const showRowSelection = this.config()().showRowSelection;\n return showRowSelection ? this.data().filter(row => showRowSelection(row)) : this.data();\n }\n\n protected getRowSelectionAction(): RowSelectionAction<T>[] {\n return this.config()().rowSelectionAction ?? [];\n }\n\n protected uncheckAllSelection() {\n this.selection.set([]);\n }\n\n protected onRowSelectionActionClick(actionId: string) {\n this.selectionActionEvent.emit(\n {\n id: actionId,\n rows: this.selection()\n }\n );\n }\n\n private getDocumentHeaders(): string[] {\n const config = this.config()();\n return config.columns.map(c => c.label);\n }\n\n private getDocumentRows(): Partial<Record<keyof T, any>>[keyof T][][] {\n const config = this.config()();\n const columns = config.columns;\n\n const data = this.data();\n\n return data.map(row => {\n if (config.mapperForExportData) {\n const mapped = config.mapperForExportData(row);\n return columns.map(c => mapped[c.key]);\n }\n\n return columns.map(c => row[c.key] ?? '');\n });\n }\n\n protected exportToCsvCurrentPage() {\n const config = this.config()();\n\n const title = config.title();\n const fileName = config.exportFileName?.() ?? title;\n\n\n const headers = this.getDocumentHeaders();\n const rows = this.getDocumentRows();\n\n const aoaData = [headers, ...rows];\n\n //const workSheet = utils.json_to_sheet(data);\n\n const workSheet = utils.aoa_to_sheet(aoaData);\n const workBook = utils.book_new();\n\n //El nombre de la hoja no puede exceder de 31 caracteres\n const name = title.substring(0, 31);\n utils.book_append_sheet(workBook, workSheet, name);\n writeFileXLSX(workBook, `${fileName}.xlsx`);\n }\n\n protected exportToPdfCurrentPage() {\n const config = this.config()();\n\n const title = config.title();\n const fileName = config.exportFileName?.() ?? title;\n\n const headers = this.getDocumentHeaders();\n const rows = this.getDocumentRows();\n\n const doc = config.pdfConfig ?? new jsPDF({\n orientation: 'landscape',\n unit: 'pt',\n format: 'A4'\n });\n\n doc.setFontSize(14);\n doc.text(title, 40, 40);\n\n autoTable(doc, {\n startY: 60,\n head: [headers],\n body: rows,\n styles: { fontSize: 9, cellPadding: 4 },\n headStyles: { fillColor: [192, 0, 28], textColor: 255 },\n alternateRowStyles: { fillColor: [245, 245, 245] },\n tableLineColor: [200, 200, 200],\n tableLineWidth: 0.1,\n });\n\n doc.save(`${fileName}.pdf`);\n }\n\n protected onToggleFullScreen() {\n if (this.isFullScreen())\n this.exitFullscreen()\n else\n this.enterFullscreen();\n }\n\n private enterFullscreen() {\n if (this.overlayRef)\n return;\n\n this.overlayRef = this.overlay.create({\n hasBackdrop: false,\n scrollStrategy: this.overlay.scrollStrategies.block(),\n positionStrategy: this.overlay.position().global().top('0').left('0').right('0').bottom('0'),\n });\n\n this.portal = new TemplatePortal(this.tableContentTemplate()!, this.viewContainerRef);\n this.overlayRef.attach(this.portal);\n\n this.isFullScreen.set(true);\n }\n\n private exitFullscreen() {\n if (!this.overlayRef)\n return;\n\n this.overlayRef.detach();\n this.overlayRef.dispose();\n this.overlayRef = undefined;\n this.portal = undefined;\n\n this.isFullScreen.set(false);\n }\n\n private isMyOverlayOnTop(): boolean {\n if (!this.overlayRef)\n return false;\n\n //Contenedor principal de overlays en el DOM\n const containerElement = this.overlayContainer.getContainerElement();\n // Los overlays se añaden como hijos dentro de este contenedor\n const overlays = Array.from(containerElement.children);\n // El último hijo es el overlay más \"arriba\"\n const topOverlay = overlays[overlays.length - 1] as HTMLElement | undefined;\n\n return topOverlay === this.overlayRef.hostElement;\n }\n \n}\n","@if(!isFullScreen()) {\r\n <ng-container *ngTemplateOutlet=\"tableContentTemplate()\"></ng-container>\r\n}\r\n\r\n<ng-template #tableContent>\r\n <div class=\"tableContainer\" [class.inFullScreenMode]=\"isFullScreen()\">\r\n <div class=\"headerContainer\">\r\n <div class=\"titleAndButtonContainer\">\r\n <p class=\"title\">{{ config()().title() }}</p>\r\n <div class=\"buttonContainer\">\r\n @if(config()().create && (!config()().create?.show || config()().create?.show())) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"config()().create?.tooltip?.() ?? texts().table.create\" \r\n [disabled]=\"config()().create?.disabled?.()\" \r\n class=\"newButtonIcon\"\r\n (click)=\"onNewClick()\">\r\n <mat-icon>add_circle</mat-icon>\r\n </button>\r\n }\r\n\r\n @if(config()().hideColumnConfig?.() !== true) {\r\n <button matIconButton [matTooltip]=\"texts().table.editColumns\" class=\"editColumnsButtonIcon\" (click)=\"onEditColumns()\">\r\n <mat-icon>table_edit</mat-icon>\r\n </button>\r\n }\r\n\r\n @if(config()().showAdvancedFilters) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"texts().advancedFilters.label\"\r\n [matMenuTriggerFor]=\"advancedFiltersMenu\" \r\n #advancedFiltersMenuTrigger=\"matMenuTrigger\">\r\n\r\n <mat-icon>filter_alt</mat-icon>\r\n </button>\r\n\r\n <mat-menu #advancedFiltersMenu=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\r\n <button mat-menu-item (click)=\"onNewAdvancedFiltersClick()\">\r\n <mat-icon>filter_alt</mat-icon>\r\n <span>{{ texts().advancedFilters.new }}</span>\r\n </button>\r\n\r\n @for (advancedFilter of advancedFilters(); track $index; let first = $first) {\r\n @if (first) {\r\n <mat-divider />\r\n }\r\n\r\n <div mat-menu-item (click)=\"onApplyTemplateClick(advancedFilter)\">\r\n <div class=\"templateContainer\"> \r\n <span>{{advancedFilter.name | ngxOnlyUpperFirstCharacter}}</span>\r\n\r\n <div class=\"buttonTemplateContainer\">\r\n <button\r\n matIconButton \r\n [matTooltip]=\"texts().advancedFilters.editTooltip(advancedFilter.name | ngxOnlyUpperFirstCharacter)\"\r\n (click)=\"onAdvancedFilterUpdate($event, advancedFilter, advancedFiltersMenuTrigger)\">\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n\r\n <button\r\n matIconButton \r\n [matTooltip]=\"texts().advancedFilters.deleteTooltip(advancedFilter.name | ngxOnlyUpperFirstCharacter)\"\r\n (click)=\"onAdvancedFilterDelete($event, advancedFiltersMenuTrigger, advancedFilter)\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </mat-menu>\r\n }\r\n\r\n @if(selection().length > 0) {\r\n @if(getRowSelectionAction().length > 0) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"texts().table.selectionActions\"\r\n [matMenuTriggerFor]=\"selectedRecordsMenu\">\r\n <mat-icon>event_list</mat-icon>\r\n </button>\r\n\r\n <mat-menu #selectedRecordsMenu=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\r\n <button mat-menu-item (click)=\"uncheckAllSelection()\">\r\n <mat-icon>deselect</mat-icon>\r\n <span>{{ texts().table.deselectAll }}</span>\r\n </button>\r\n\r\n @for (action of getRowSelectionAction(); track $index) {\r\n <button mat-menu-item (click)=\"onRowSelectionActionClick(action.id)\">\r\n <mat-icon>{{action.icon}}</mat-icon>\r\n <span>{{action.label(selection(), selection().length)}}</span>\r\n </button>\r\n }\r\n </mat-menu>\r\n } @else {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"texts().table.deselectAll\"\r\n (click)=\"uncheckAllSelection()\">\r\n <mat-icon>deselect</mat-icon>\r\n </button>\r\n }\r\n }\r\n @if(config()().hideExportData?.() !== true) {\r\n <button matIconButton [matTooltip]=\"texts().table.export\" [matMenuTriggerFor]=\"exportMenu\">\r\n <mat-icon>download</mat-icon>\r\n </button>\r\n <mat-menu #exportMenu=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\r\n <button mat-menu-item (click)=\"exportToCsvCurrentPage()\">\r\n <mat-icon>csv</mat-icon>\r\n <span>{{ texts().table.exportExcel }}</span>\r\n </button>\r\n\r\n <button mat-menu-item (click)=\"exportToPdfCurrentPage()\">\r\n <mat-icon>picture_as_pdf</mat-icon>\r\n <span>{{ texts().table.exportPdf }}</span>\r\n </button>\r\n </mat-menu>\r\n }\r\n @if(config()().hideFullScreen?.() !== true) {\r\n <button matIconButton [matTooltip]=\"isFullScreen() ? texts().table.exitFullscreen : texts().table.enterFullscreen\" (click)=\"onToggleFullScreen()\">\r\n <mat-icon>{{isFullScreen() ? 'fullscreen_exit': 'fullscreen'}}</mat-icon>\r\n </button>\r\n }\r\n\r\n <ng-content select=\"[icon-buttons]\"></ng-content>\r\n </div>\r\n </div>\r\n\r\n <div class=\"filterContainer\">\r\n <div class=\"moreFiltersContainer\">\r\n <ng-content select=\"[more-filters]\"></ng-content>\r\n </div>\r\n\r\n @if(config()().showQueryFilter) {\r\n <mat-form-field subscriptSizing=\"dynamic\">\r\n <mat-icon matPrefix>search</mat-icon>\r\n <input #queryElement matInput [placeholder]=\"config()().queryFilterPlaceholder ?? texts().common.search\" [value]=\"filters()().query ?? ''\" (input)=\"onQueryChange(queryElement)\">\r\n <button matIconButton matSuffix (click)=\"onQueryReset(queryElement)\" [style.visibility]=\"queryElement.value ? 'visible': 'hidden'\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n }\r\n </div>\r\n\r\n <ng-content select=\"[extra-header-content]\"></ng-content>\r\n </div>\r\n\r\n @if(filters()().advancedFilterId) {\r\n <div class=\"advancedFiltersApplied\" (click)=\"onSelectedAdvancedFilterUpdate($event)\">\r\n <p [innerHTML]=\"getAdvancedFilterLabel()\"></p>\r\n <button matIconButton [matTooltip]=\"texts().advancedFilters.remove\" class=\"\" (click)=\"onQuitAdvancedFilter($event)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n\r\n <mat-progress-bar mode=\"indeterminate\" [style.visibility]=\"dataResource.isLoading() ? 'visible': 'hidden'\"/>\r\n\r\n <div class=\"tableOverflow\" [style.max-height]=\"config()().maxHeight && !isFullScreen() ? config()().maxHeight : null\">\r\n <table\r\n mat-table \r\n matSort\r\n [multiTemplateDataRows]=\"config()().expandableDetail\"\r\n [dataSource]=\"data()\" \r\n [matSortActive]=\"filters()().sortBy?.key ?? ''\" \r\n [matSortDirection]=\"filters()().sortBy?.direction ?? ''\"\r\n (matSortChange)=\"onSortChange($event)\">\r\n\r\n @if(config()().enableRowSelection) {\r\n @if(showFiltersRow()) {\r\n <ng-container [matColumnDef]=\"`${filterKeyPrefix}${nameOfRowSelectionColumn}`\" [sticky]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef class=\"celdaSelection\"></th>\r\n </ng-container>\r\n } \r\n\r\n <ng-container [matColumnDef]=\"nameOfRowSelectionColumn\" [sticky]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <mat-checkbox \r\n class=\"headerCheckbox\"\r\n (change)=\"$event ? toggleAllPageRowSelection() : null\"\r\n [checked]=\"selection().length > 0 && isAllPageRowSelected()\"\r\n [indeterminate]=\"selection().length > 0 && !isAllPageRowSelected()\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\" (click)=\"$event.stopPropagation()\" class=\"celdaSelection\">\r\n @if(!config()().showRowSelection || config()().showRowSelection?.(row)) {\r\n <mat-checkbox\r\n (change)=\"$event ? toggleRowSelection(row) : null\"\r\n [checked]=\"isRowSelected(row)\">\r\n </mat-checkbox>\r\n }\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <ng-container [matColumnDef]=\"`${generalFooterKeyPrefix}${nameOfRowSelectionColumn}`\" [sticky]=\"isDesktop()\">\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @for (column of config()().columns; track $index) {\r\n <ng-container \r\n [matColumnDef]=\"getKeyAsString(column.key)\" \r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header [disabled]=\"!column.isSortable\" class=\"columnLabel\">\r\n <p class=\"headerTitle\">\r\n @if(stickyColumnKey() == column.key && isDesktop()) {\r\n <mat-icon>keep</mat-icon>\r\n }\r\n {{ column.label }}\r\n </p>\r\n </th>\r\n\r\n <td \r\n mat-cell \r\n *matCellDef=\"let row\" \r\n [class.columnSticky]=\"stickyColumnKey() == column.key && isDesktop()\"\r\n [style]=\"column.style\"\r\n class=\"celdaDatos\">\r\n\r\n @if(column.component) {\r\n <ng-container \r\n ngxDynamicCellHost\r\n [component]=\"column.component\"\r\n [row]=\"row\"\r\n [key]=\"column.key\" />\r\n } @else if(column.templateRef) {\r\n <ng-container \r\n *ngTemplateOutlet=\"column.templateRef(); \r\n context: { $implicit: row }\" />\r\n } @else if(column.valueGetter) {\r\n {{ column.valueGetter(row) }}\r\n } @else {\r\n {{ applyColumnPipes(row[column.key], column.pipes) ?? '-' }}\r\n }\r\n </td>\r\n \r\n <td \r\n mat-footer-cell \r\n *matFooterCellDef \r\n [class.columnSticky]=\"stickyColumnKey() == column.key && isDesktop()\"\r\n [style]=\"column.footerStyle\">\r\n\r\n @if(column.showTotalPerPage) {\r\n @if(column.pipes) {\r\n {{ applyColumnPipes(getTotalOfColum(column.key), column.pipes) }}\r\n } @else if(column.totalFooterFormatter) {\r\n {{ column.totalFooterFormatter(getTotalOfColum(column.key)) }}\r\n } @else {\r\n {{ getTotalOfColum(column.key) }}\r\n }\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n\r\n @if(showTotalGeneralFooter()) {\r\n @for (column of config()().columns; track $index) {\r\n <ng-container \r\n [matColumnDef]=\"`${generalFooterKeyPrefix}${getKeyAsString(column.key)}`\"\r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n\r\n <td mat-footer-cell *matFooterCellDef [style]=\"column.footerStyle\">\r\n @if(column.showTotalGeneral && column.getTotalGeneral) {\r\n @if(column.pipes) {\r\n {{ applyColumnPipes(column.getTotalGeneral(), column.pipes) }}\r\n } @else if(column.totalFooterFormatter) {\r\n {{ column.totalFooterFormatter(column.getTotalGeneral()) }}\r\n } @else {\r\n {{ column.getTotalGeneral() }}\r\n }\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(showFiltersRow()) {\r\n @for (column of config()().columns; track $index) {\r\n <ng-container \r\n [matColumnDef]=\"`${filterKeyPrefix}${getKeyAsString(column.key)}`\" \r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n\r\n <th mat-header-cell *matHeaderCellDef>\r\n @if (column.filterType == 'text' || column.filterType == 'number') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"inputQueryColumn\">\r\n <input [type]=\"column.filterType\" matInput [placeholder]=\"column.label\" [value]=\"getValueOfColumnFilter(column.key) ?? ''\" (input)=\"onTextFilterColumnChange(column, $event)\">\r\n <mat-icon matSuffix>{{ column.filterType == 'text' ? 'search' : 'numbers'}}</mat-icon>\r\n </mat-form-field>\r\n }\r\n\r\n @if (column.filterType == 'option' || column.filterType == 'option-multiple') {\r\n @if(column.endpointForPaginatedFilterOptions) {\r\n <ngx-paginated-searchable-select\r\n class=\"selectColumn\"\r\n [selected]=\"getPaginatedSearchableSelectValueOfColumnFilter(column.key)\"\r\n [endpoint]=\"column.endpointForPaginatedFilterOptions\"\r\n [filters]=\"column.filtersForEndpointPaginatedFilterOptions ?? defaultFiltersForPaginatedFilterOptions\"\r\n [multiple]=\"column.filterType == 'option-multiple'\"\r\n subscriptSizing=\"dynamic\"\r\n [selectPlaceholder]=\"column.label\"\r\n (optionChange)=\"onPaginatedOptionFilterColumnChange(column, $event)\"\r\n clearableOptionLabel=\"filtro\"\r\n />\r\n } @else {\r\n <ngx-searchable-select\r\n class=\"selectColumn\"\r\n [selected]=\"getSearchableSelectValueOfColumnFilter(column.key)\"\r\n [options]=\"column.filterOptions ?? []\"\r\n [multiple]=\"column.filterType == 'option-multiple'\"\r\n subscriptSizing=\"dynamic\"\r\n [selectPlaceholder]=\"column.label\"\r\n (optionChange)=\"onOptionFilterColumnChange(column, $event)\"\r\n clearableOptionLabel=\"filtro\"\r\n />\r\n }\r\n }\r\n \r\n @if(column.filterType == 'date') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"dateColumn\">\r\n <input \r\n matInput \r\n [matDatepicker]=\"picker\" \r\n [placeholder]=\"column.label\"\r\n [value]=\"getValueOfColumnFilter(column.key)\"\r\n (dateChange)=\"onDateFilterChange(column, $event.value)\">\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker></mat-datepicker>\r\n </mat-form-field>\r\n }\r\n\r\n @if(column.filterType == 'date-range') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"dateColumn\">\r\n <mat-date-range-input [rangePicker]=\"picker\" #dateRangeInput>\r\n <input \r\n matStartDate \r\n [placeholder]=\"texts().table.dateRangeStart\"\r\n [value]=\"getDateRangeValueOfColumnFilter(column.key, 'start')\"\r\n (dateChange)=\"onDateRangeFilterChange(column, dateRangeInput.value)\">\r\n <input \r\n matEndDate \r\n [placeholder]=\"texts().table.dateRangeEnd\"\r\n [value]=\"getDateRangeValueOfColumnFilter(column.key, 'end')\"\r\n (dateChange)=\"onDateRangeFilterChange(column, dateRangeInput.value)\">\r\n </mat-date-range-input>\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-date-range-picker #picker></mat-date-range-picker>\r\n </mat-form-field>\r\n }\r\n </th>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(showActionsColumn()) {\r\n @if(showFiltersRow()) {\r\n <ng-container [matColumnDef]=\"`${filterKeyPrefix}${nameOfActionsColumn}`\" [stickyEnd]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef class=\"celdaAcciones\"></th>\r\n </ng-container>\r\n } \r\n\r\n <ng-container [matColumnDef]=\"nameOfActionsColumn\" [stickyEnd]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef>{{ texts().table.actions }}</th>\r\n <td mat-cell *matCellDef=\"let row\" (click)=\"$event.stopPropagation()\" class=\"celdaAcciones\">\r\n <div class=\"contenedorCeldaAcciones\">\r\n @if(config()().expandableDetail) {\r\n <button \r\n matIconButton\r\n (click)=\"expandableToggle(row)\">\r\n <mat-icon>{{ rowIsExpanded(row) ? 'keyboard_arrow_up' : 'keyboard_arrow_down' }}</mat-icon>\r\n </button>\r\n }\r\n\r\n @if(config()().update && !config()().clickOnRowForUpdate && (!config()().update?.show || config()().update?.show(row))) {\r\n <button \r\n matIconButton\r\n [matTooltip]=\"config()().update?.tooltip?.(row) ?? texts().table.edit\" \r\n [disabled]=\"config()().update?.disabled?.(row)\" \r\n class=\"editButtonIcon\"\r\n (click)=\"onUpdateClick(row, $event)\">\r\n <mat-icon>edit_square</mat-icon>\r\n </button>\r\n }\r\n \r\n @if(config()().delete && (!config()().delete?.show || config()().delete?.show(row))) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"config()().delete?.tooltip?.(row) ?? texts().table.delete\" \r\n [disabled]=\"config()().delete?.disabled?.(row)\" \r\n class=\"deleteButtonIcon\"\r\n (click)=\"onDeleteClick(row, $event)\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n }\r\n\r\n @for (rowAction of config()().rowActions; track $index) {\r\n @if(!rowAction.show || rowAction.show(row)) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"rowAction.tooltip(row)\" \r\n [disabled]=\"rowAction.disabled?.(row)\" \r\n [class]=\"rowAction.iconColor ? `rowActionIconColor${rowAction.iconColor}` : ''\"\r\n (click)=\"onRowActionClick(row, rowAction, $event)\">\r\n <mat-icon>{{rowAction.icon}}</mat-icon>\r\n </button>\r\n } \r\n }\r\n </div>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <ng-container [matColumnDef]=\"`${generalFooterKeyPrefix}${nameOfActionsColumn}`\" [stickyEnd]=\"isDesktop()\">\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(config()().expandableDetail) {\r\n <ng-container [matColumnDef]=\"expandableColumnDef\">\r\n <td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"keys().length\">\r\n <div \r\n class=\"detailWrapper\"\r\n [class.detailWrapperExpanded]=\"rowIsExpanded(row)\">\r\n <div class=\"columnDetail\">\r\n @if(config()().expandableDetailTemplateRef) {\r\n <ng-container \r\n *ngTemplateOutlet=\"config()().expandableDetailTemplateRef!(); \r\n context: { $implicit: row }\" />\r\n }\r\n </div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n }\r\n \r\n <tr mat-header-row *matHeaderRowDef=\"keys(); sticky: true\" class=\"tableHeader\"></tr>\r\n \r\n @if(showFiltersRow()) {\r\n <tr mat-header-row *matHeaderRowDef=\"keysWithFilter(); sticky: true\" class=\"filtersByColumn\"></tr>\r\n }\r\n \r\n <tr mat-row *matRowDef=\"let row; columns: keys();\" \r\n (click)=\"onRowClick(row)\" \r\n [class.rowClickEnable]=\"isRowEnabled(row)\"\r\n [class.expandableRow]=\"config()().expandableDetail\">\r\n </tr>\r\n \r\n @if(config()().expandableDetail) {\r\n <tr mat-row *matRowDef=\"let row; columns: [expandableColumnDef]\" class=\"rowDetail\"></tr>\r\n }\r\n\r\n <tr mat-footer-row \r\n *matFooterRowDef=\"showTotalPerPageFooter() ? keys() : []\" \r\n class=\"totalPerPageFooter\"\r\n [class.hideFooter]=\"!showTotalPerPageFooter()\">\r\n </tr>\r\n\r\n <tr mat-footer-row \r\n *matFooterRowDef=\"showTotalGeneralFooter() ? keysWithGeneralFooter() : []\" \r\n class=\"totalFooter\"\r\n [class.hideFooter]=\"!showTotalGeneralFooter()\">\r\n </tr>\r\n\r\n <tr class=\"mat-row\" *matNoDataRow>\r\n <td class=\"noData\" [colSpan]=\"keys().length\">{{ dataResource.isLoading() ? texts().common.loading : texts().common.noData }}</td>\r\n </tr>\r\n </table>\r\n </div>\r\n\r\n <div class=\"paginatorContainer\">\r\n <div class=\"footerLegend\">\r\n @if(showTotalPerPageFooter()) {\r\n <div class=\"legendItem\">\r\n <div class=\"legendSquare\"></div>\r\n <p>{{ texts().table.totalPerPage }}</p> \r\n </div>\r\n }\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <div class=\"legendItem\">\r\n <div class=\"legendSquare totalGeneral\"></div>\r\n <p>{{ texts().table.totalGeneral }}</p>\r\n </div>\r\n }\r\n </div>\r\n <mat-paginator [length]=\"total()\" [pageSize]=\"filters()().pageSize\" [pageIndex]=\"filters()().pageNumber - 1\" (page)=\"onPageChange($event)\"/>\r\n </div>\r\n\r\n <ng-content select=\"[end-container]\"></ng-content>\r\n </div>\r\n</ng-template>","import { Component, computed, effect, HostListener, inject, input, output, signal, TemplateRef, viewChild, ViewContainerRef, WritableSignal } from '@angular/core';\nimport { BasicFilter } from '../../models/basic-filter';\nimport { BasicTableColumn, BasicTableConfig } from '../../models/basic-table-config';\n\nimport { PaginatedFilter, SortBy } from '../../models/paginated-filter';\nimport { CommonModule } from '@angular/common';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { DateRange, MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatPaginator, MatPaginatorModule } from '@angular/material/paginator';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatSortModule, Sort } from '@angular/material/sort';\nimport { MatTableDataSource, MatTableModule } from '@angular/material/table';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { Overlay, OverlayContainer, OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { RowActionClickEvent } from '../../models/row-action-click-event';\nimport { SelectionActionEvent } from '../../models/selection-action-event';\nimport { ColumnConfig, ConfigureTableColumnData } from '../../models/configure-table-column-data';\nimport { ConfigureTableColumnsComponent } from '../../common/components/configure-table-columns/configure-table-columns.component';\nimport { MatDialog } from '@angular/material/dialog';\nimport { ColumnConfigService } from '../../services/column-config.service';\nimport { DatosPantallaService } from '../../services/datos-pantalla.service';\nimport { ColumnPipe, FilterOption, isFilterOption, RowSelectionAction, TableRowAction } from '../../models/paginated-table-config';\nimport jsPDF from 'jspdf';\nimport autoTable from 'jspdf-autotable';\nimport { utils, writeFileXLSX } from 'xlsx';\nimport { ColumnValue } from '../../models/column-value';\nimport { NgxDialogService } from '../../services/ngx-dialog.service';\nimport moment from 'moment';\n\nimport { PaginatedSearchableSelectComponent } from '../ngx-paginated-searchable-select/ngx-paginated-searchable-select.component';\nimport { SearchableSelectComponent } from '../ngx-searchable-select/ngx-searchable-select.component';\nimport { DynamicCellHostDirective } from '../../directives/dynamic-cell-host.directive';\nimport { includeNoSensible } from '../../utils/string-operations';\nimport { NgxTexts } from '../../i18n';\n\n@Component({\n selector: 'ngx-basic-table',\n imports: [\n MatTableModule,\n MatSortModule,\n MatPaginatorModule,\n MatIconModule,\n MatButtonModule,\n MatProgressBarModule,\n MatTooltipModule,\n MatFormFieldModule,\n MatInputModule,\n MatSelectModule,\n MatDatepickerModule,\n CommonModule,\n DynamicCellHostDirective,\n MatMenuModule,\n MatDividerModule,\n MatCheckboxModule,\n SearchableSelectComponent,\n PaginatedSearchableSelectComponent\n ],\n templateUrl: './ngx-basic-table.component.html',\n styleUrl: './ngx-basic-table.component.scss',\n host: { class: 'contenedorDefecto' }\n})\nexport class NgxBasicTable<T, U extends BasicFilter<T>> {\n\n private readonly columnConfigService = inject(ColumnConfigService);\n private readonly dialog = inject(MatDialog);\n private readonly dialogService = inject(NgxDialogService);\n private readonly datosPantallaService = inject(DatosPantallaService);\n \n // Inyectar el servicio de internacionalización\n readonly texts = inject(NgxTexts).texts;\n \n protected isDesktop = computed<boolean>(() => this.datosPantallaService.pantalla()?.tipo == 'escritorio');\n\n filters = input<WritableSignal<U>>(\n signal<U>(\n {\n query: undefined,\n sortBy: undefined,\n columnsFiltersValue: undefined\n } as U\n )\n );\n config = input.required<WritableSignal<BasicTableConfig<T>>>();\n data = input.required<T[]>();\n loading = input<boolean>(false);\n queryFilter = input<(query: string, data: T[]) => T[]>();\n\n moreFilters = input<(data: T[], filters: U) => T[]>(\n (data: T[], _: U) => {\n return data;\n }\n );\n\n protected createClick = output<void>();\n protected updateClick = output<T>();\n protected deleteClick = output<T>();\n protected rowActionClick = output<RowActionClickEvent<T>>();\n protected expandedItemChange = output<T | null>();\n protected selectionActionEvent = output<SelectionActionEvent<T>>();\n\n dataSource = computed(() => {\n const data = this.data();\n const paginator = this.paginator();\n const dataSource = new MatTableDataSource(data);\n\n if (paginator)\n dataSource.paginator = paginator;\n\n return dataSource;\n });\n\n filtersEffect = effect(() => {\n let data = this.data();\n const filters = this.filters()();\n const config = this.config()();\n const queryFilter = this.queryFilter();\n const moreFilters = this.moreFilters();\n\n if (queryFilter)\n data = queryFilter(filters.query ?? '', data);\n else if (this.someColumnFilterable(config.columns))\n data = this.applyInputFilter(config.columns, data, filters.query);\n\n data = this.applySort(data, config.columns, filters.sortBy);\n\n data = this.applyColumnFilter(data, config.columns, filters.columnsFiltersValue);\n\n data = moreFilters(data, filters);\n\n this.dataSource().data = data;\n });\n\n protected columnConfig = computed(() => {\n const columnConfigs = this.columnConfigService.columnConfigs();\n const configValue = this.config()();\n const columnConfig: ColumnConfig<T>[] | undefined = columnConfigs[configValue.tableId];\n const defaultColumnConfig: ColumnConfig<T>[] = configValue.columns.map(column => {\n return {\n key: column.key,\n show: true,\n isSticky: configValue.defaultStickyColumn == column.key\n }\n });\n\n if (!columnConfig)\n return defaultColumnConfig;\n\n //Por si acaso se quitan columnas a posteriori, hay que filtrarlas para que no aparezcan\n const filteredColumns = columnConfig.filter(column => this.includeInColumnConfig(column, defaultColumnConfig));\n\n //Por si a posteriori se añaden nuevas columnas\n const columnsAdded = defaultColumnConfig.filter(defaultColumn => !this.includeInColumnConfig(defaultColumn, columnConfig));\n\n return [...filteredColumns, ...columnsAdded];\n });\n\n protected readonly filterKeyPrefix = 'filter';\n protected readonly nameOfActionsColumn = 'actionsPerRow';\n protected readonly generalFooterKeyPrefix = 'footer';\n protected readonly nameOfRowSelectionColumn = 'rowSelectionColumn';\n\n protected stickyColumnKey = computed(() => this.columnConfig().find(c => c.isSticky)?.key);\n\n protected keys = computed(() => {\n const configValue = this.config()();\n const columnConfig = this.columnConfig();\n\n let keys: (string | keyof T)[] = [...columnConfig]\n .filter(column => column.show)\n .map(column => column.key);\n\n if ((configValue.showActions?.() ?? true) &&\n ((configValue.update && !configValue.clickOnRowForUpdate)\n || configValue.delete\n || (configValue.rowActions && configValue.rowActions.length > 0)\n || configValue.expandableDetail)\n ) {\n keys = [...keys, this.nameOfActionsColumn];\n }\n\n if (configValue.enableRowSelection)\n keys = [this.nameOfRowSelectionColumn, ...keys];\n\n return keys;\n });\n\n protected keysWithFilter = computed(() => this.keys().map(key => `${this.filterKeyPrefix}${this.getKeyAsString(key)}`));\n protected keysWithGeneralFooter = computed(() => this.keys().map(key => `${this.generalFooterKeyPrefix}${this.getKeyAsString(key)}`));\n protected showFiltersRow = computed(() => {\n const configValue = this.config()();\n return [...configValue.columns].some(column => column.filterType);\n });\n protected showActionsColumn = computed(() => this.keys().includes(this.nameOfActionsColumn));\n protected showTotalPerPageFooter = computed(() => {\n const columns = this.config()().columns;\n const keys = this.keys();\n return keys.some(key => columns.find(column => key == column.key)?.showTotalPerPage);\n });\n protected showTotalGeneralFooter = computed(() => {\n const columns = this.config()().columns;\n const keys = this.keys();\n return keys.some(key => columns.find(column => key == column.key)?.showTotalGeneral);\n });\n\n protected showQueryFilter = computed(() => {\n const queryFilter = this.queryFilter();\n const config = this.config()();\n\n if (queryFilter)\n return true;\n\n return this.someColumnFilterable(config.columns);\n });\n\n protected tableContentTemplate = viewChild<TemplateRef<any>>('tableContent');\n protected isFullScreen = signal(false);\n private overlayRef?: OverlayRef;\n private portal?: TemplatePortal;\n private readonly overlay = inject(Overlay);\n private readonly overlayContainer = inject(OverlayContainer);\n private readonly viewContainerRef = inject(ViewContainerRef);\n\n protected selection = signal<T[]>([]);\n\n protected readonly expandableColumnDef = 'expandedDetail';\n protected expandedItem = signal<T | null>(null);\n\n\n protected paginator = viewChild(MatPaginator);\n\n protected defaultFiltersForPaginatedFilterOptions = signal<PaginatedFilter<FilterOption>>(\n {\n pageNumber: 1,\n pageSize: 20,\n query: undefined\n }\n );\n\n\n protected getKeyAsString = (columnKey: keyof T | string): string => columnKey as string\n\n private includeInColumnConfig(searchedColumn: ColumnConfig<T>, allColumns: ColumnConfig<T>[]): boolean {\n return allColumns.some(column => searchedColumn.key == column.key);\n }\n\n @HostListener('document:keydown.escape')\n protected onEscape() {\n if (this.overlayRef && this.isMyOverlayOnTop())\n this.exitFullscreen();\n }\n\n private someColumnFilterable(columns: BasicTableColumn<T>[]): boolean {\n return columns.some((column) => column.isFilterableByInput === true);\n }\n\n private applyInputFilter(columns: BasicTableColumn<T>[], data: T[], query?: string): T[] {\n if (!query)\n return data;\n\n const filterableColumns = columns.filter(c => c.isFilterableByInput);\n\n return data.filter(item =>\n filterableColumns.some(column => {\n const value = item[column.key];\n return typeof value === 'string' && includeNoSensible(value, query);\n })\n );\n }\n\n private applySort(data: T[], columns: BasicTableColumn<T>[], sortBy?: SortBy): T[] {\n if (!sortBy)\n return data;\n\n const column = columns.find(c => c.key === sortBy.key);\n\n if (!column || column.sortType === undefined)\n return data;\n\n const { key, direction } = sortBy;\n const factor = direction === 'asc' ? 1 : -1;\n\n return [...data].sort((a, b) => {\n const aValue = (a as any)[key];\n const bValue = (b as any)[key];\n\n if (aValue == null && bValue == null)\n return 0;\n\n if (aValue == null)\n return -1 * factor;\n\n if (bValue == null)\n return 1 * factor;\n\n switch (column.sortType) {\n case 'number':\n return (Number(aValue) - Number(bValue)) * factor;\n\n case 'date':\n return (Date.parse(aValue) - Date.parse(bValue)) * factor;\n\n case 'string':\n default:\n if(column.sortByKey) {\n const aObjectString = column.sortByKey(a) ?? '';\n const bObjectString = column.sortByKey(b) ?? '';\n return aObjectString.localeCompare(bObjectString) * factor;\n }\n\n return String(aValue).localeCompare(String(bValue)) * factor;\n }\n });\n }\n\n private applyColumnFilter(data: T[], columns: BasicTableColumn<T>[], columnsFiltersValue?: Partial<Record<keyof T, ColumnValue>>): T[] {\n if (!this.showFiltersRow() || !columnsFiltersValue)\n return data;\n\n columns.forEach(column => {\n const columnFilterValue = columnsFiltersValue[column.key];\n\n if (columnFilterValue) {\n switch (column.filterType) {\n case 'number':\n case 'option':\n const filterValue = isFilterOption(columnFilterValue) ? columnFilterValue.value : columnFilterValue\n data = data.filter(d => {\n const columnValue = column.filterByKey?.(d) ?? d[column.key];\n return columnValue == filterValue\n });\n break;\n case 'text':\n const query = columnFilterValue as string;\n data = data.filter(d => {\n const word = (column.filterByKey?.(d) ?? d[column.key] ?? '') as string;\n return includeNoSensible(word, query);\n });\n break;\n case 'option-multiple':\n if (!Array.isArray(columnFilterValue) || columnFilterValue.length <= 0)\n break;\n\n data = data.filter(d => {\n const columnValue = column.filterByKey?.(d) ?? d[column.key];\n return columnFilterValue.some(f => {\n const columnValueString = isFilterOption(f) ? f.value : f;\n return columnValueString == columnValue;\n });\n });\n break;\n case 'date':\n const date = columnFilterValue as moment.Moment\n data = data.filter(d => {\n const value = d[column.key];\n if (typeof value !== 'string')\n return false;\n\n const momentValue = moment.utc(value);\n return date.isSame(momentValue, 'day');\n });\n break;\n case 'date-range':\n const dateRange = columnFilterValue as DateRange<moment.Moment | null>\n if (dateRange.start != null || dateRange.end != null) {\n data = data.filter(d => {\n const value = d[column.key];\n if (typeof value !== 'string')\n return false;\n\n const momentValue = moment.utc(value);\n\n if (dateRange.start && dateRange.end)\n return momentValue.isBetween(dateRange.start, dateRange.end, 'day', '[]');\n\n if (dateRange.start)\n return momentValue.isSameOrAfter(dateRange.start, 'day');\n\n if (dateRange.end)\n return momentValue.isSameOrBefore(dateRange.end, 'day');\n\n return true;\n });\n }\n break;\n }\n }\n });\n\n return data;\n }\n\n protected onToggleFullScreen() {\n if (this.isFullScreen())\n this.exitFullscreen()\n else\n this.enterFullscreen();\n }\n\n private enterFullscreen() {\n if (this.overlayRef)\n return;\n\n this.overlayRef = this.overlay.create({\n hasBackdrop: false,\n scrollStrategy: this.overlay.scrollStrategies.block(),\n positionStrategy: this.overlay.position().global().top('0').left('0').right('0').bottom('0'),\n });\n\n this.portal = new TemplatePortal(this.tableContentTemplate()!, this.viewContainerRef);\n this.overlayRef.attach(this.portal);\n\n this.isFullScreen.set(true);\n }\n\n private exitFullscreen() {\n if (!this.overlayRef)\n return;\n\n this.overlayRef.detach();\n this.overlayRef.dispose();\n this.overlayRef = undefined;\n this.portal = undefined;\n\n this.isFullScreen.set(false);\n }\n\n private isMyOverlayOnTop(): boolean {\n if (!this.overlayRef)\n return false;\n\n //Contenedor principal de overlays en el DOM\n const containerElement = this.overlayContainer.getContainerElement();\n // Los overlays se añaden como hijos dentro de este contenedor\n const overlays = Array.from(containerElement.children);\n // El último hijo es el overlay más \"arriba\"\n const topOverlay = overlays[overlays.length - 1] as HTMLElement | undefined;\n\n return topOverlay === this.overlayRef.hostElement;\n }\n\n protected onNewClick() {\n this.createClick.emit();\n }\n\n protected onUpdateClick(row: T, event: Event) {\n this.updateClick.emit(row);\n event.stopPropagation();\n }\n\n protected onRowClick(row: T) {\n if (this.isRowEnabled(row))\n this.updateClick.emit(row);\n }\n\n protected isRowEnabled(row: T): boolean | undefined {\n return this.config()().update\n && this.config()().clickOnRowForUpdate\n && (!this.config()().update?.show || this.config()().update?.show?.(row))\n && !this.config()().update?.disabled?.(row);\n }\n\n protected onDeleteClick(row: T, event: Event) {\n event.stopPropagation();\n\n const texts = this.texts();\n const header = {\n title: this.config()().deleteConfirm?.title?.(row) ?? texts.table.deleteConfirmTitle,\n confirmText: texts.table.confirmDelete,\n cancelText: texts.common.cancel,\n destructive: true,\n };\n const template = this.config()().deleteConfirm?.templateRef?.();\n const confirm$ = template\n ? this.dialogService.template({ ...header, template, templateData: row })\n : this.dialogService.confirm({ ...header, message: this.config()().deleteConfirm?.body?.(row) ?? texts.table.deleteConfirmBody });\n\n confirm$.subscribe(confirm => {\n if (confirm === true)\n this.deleteClick.emit(row);\n });\n }\n\n protected onRowActionClick(row: T, rowAction: TableRowAction<T>, event: Event) {\n this.rowActionClick.emit({ id: rowAction.id, row: row })\n event.stopPropagation();\n }\n\n protected onEditColumns() {\n const config = this.config()();\n const filters = this.filters()();\n const columnConfig = this.columnConfig();\n\n const columnsLabel = Object.fromEntries(\n config.columns.map(column => [column.key, column.label])\n ) as Record<keyof T, string>;\n\n const data: ConfigureTableColumnData<T> = {\n tableId: config.tableId,\n tableName: config.title(),\n columns: columnConfig,\n filtersValue: filters.columnsFiltersValue ?? {},\n columnsLabels: columnsLabel\n };\n this.dialog.open(ConfigureTableColumnsComponent, { data: data });\n }\n\n protected getRowSelectionAction(): RowSelectionAction<T>[] {\n return this.config()().rowSelectionAction ?? [];\n }\n\n protected uncheckAllSelection() {\n this.selection.set([]);\n }\n\n protected onRowSelectionActionClick(actionId: string) {\n this.selectionActionEvent.emit(\n {\n id: actionId,\n rows: this.selection()\n }\n );\n }\n\n private getDocumentHeaders(): string[] {\n const config = this.config()();\n return config.columns.map(c => c.label);\n }\n\n private getDocumentRows(): Partial<Record<keyof T, any>>[keyof T][][] {\n const config = this.config()();\n const columns = config.columns;\n\n const data = this.dataSource().data;\n\n return data.map(row => {\n if (config.mapperForExportData) {\n const mapped = config.mapperForExportData(row);\n return columns.map(c => mapped[c.key]);\n }\n\n return columns.map(c => row[c.key] ?? '');\n });\n }\n\n protected exportToCsv() {\n const config = this.config()();\n\n const title = config.title();\n const fileName = config.exportFileName?.() ?? title;\n\n const headers = this.getDocumentHeaders();\n const rows = this.getDocumentRows();\n\n const aoaData = [headers, ...rows];\n\n //const workSheet = utils.json_to_sheet(data);\n\n const workSheet = utils.aoa_to_sheet(aoaData);\n const workBook = utils.book_new();\n\n //El nombre de la hoja no puede exceder de 31 caracteres\n const name = title.substring(0, 31);\n utils.book_append_sheet(workBook, workSheet, name);\n writeFileXLSX(workBook, `${fileName}.xlsx`);\n }\n\n protected exportToPdf() {\n const config = this.config()();\n\n const title = config.title();\n const fileName = config.exportFileName?.() ?? title;\n\n const headers = this.getDocumentHeaders();\n const rows = this.getDocumentRows();\n\n const doc = config.pdfConfig ?? new jsPDF({\n orientation: 'landscape',\n unit: 'pt',\n format: 'A4'\n });\n\n doc.setFontSize(14);\n doc.text(title, 40, 40);\n\n autoTable(doc, {\n startY: 60,\n head: [headers],\n body: rows,\n styles: { fontSize: 9, cellPadding: 4 },\n headStyles: { fillColor: [192, 0, 28], textColor: 255 },\n alternateRowStyles: { fillColor: [245, 245, 245] },\n tableLineColor: [200, 200, 200],\n tableLineWidth: 0.1,\n });\n\n doc.save(`${fileName}.pdf`);\n }\n\n protected onQueryChange(inputElement: HTMLInputElement) {\n const query = inputElement.value;\n\n this.filters().update((value: U) => {\n //return { ...value, query: query, pageNumber: 1 };\n //Hay que ver el tema del paginador si hay que volver a la pagina 1\n return { ...value, query: query };\n });\n }\n\n protected onQueryReset(inputElement: HTMLInputElement) {\n inputElement.value = '';\n this.onQueryChange(inputElement);\n }\n\n protected onSortChange(sort: Sort) {\n this.filters().update(value => {\n return {\n ...value,\n //pageNumber: 1,\n sortBy: sort.direction ? { key: sort.active, direction: sort.direction } : undefined\n };\n });\n }\n\n protected toggleAllPageRowSelection() {\n const records = this.getDataOfCurrentPage();\n\n if (this.isAllPageRowSelected()) {\n //Deseleccionar todas las filas de la página actual\n this.selection.update(recordsSelected => {\n return recordsSelected.filter(\n record => !records.some(row2 => this.areEqualByKeys(record, row2))\n );\n });\n } else {\n //Seleccionar todas las filas visibles que aún no estén seleccionadas\n const notSelected = records.filter(record => !this.isRowSelected(record));\n\n this.selection.update(recordsSelected => {\n // Evitar duplicados por si ya hay seleccionadas\n const nuevas = notSelected.filter(\n row => !recordsSelected.some(sel => this.areEqualByKeys(sel, row))\n );\n return [...recordsSelected, ...nuevas];\n });\n }\n }\n\n protected isAllPageRowSelected(): boolean {\n const records = this.getDataOfCurrentPage();\n //Sin registros no hay nada seleccionado (every sobre un array vacio devuelve true)\n return records.length > 0 && records.every(record => this.isRowSelected(record));\n }\n\n protected areEqualByKeys(record1: T, record2: T): boolean {\n const primaryKey = this.config()().primaryKey;\n\n if (Array.isArray(primaryKey))\n return primaryKey.every(key => record1[key] === record2[key]);\n else\n return record1[primaryKey] === record2[primaryKey];\n }\n\n protected isRowSelected(row: T): boolean {\n return this.selection().some(row2 => this.areEqualByKeys(row, row2));\n }\n\n protected toggleRowSelection(row: T) {\n if (this.isRowSelected(row)) {\n this.selection.update(recordsSelected => {\n return recordsSelected.filter(record => !this.areEqualByKeys(row, record));\n });\n } else {\n this.selection.update(recordsSelected => [...recordsSelected, row]);\n }\n }\n\n protected applyColumnPipes(value: any, pipes?: ColumnPipe | ColumnPipe[]): any {\n if (!pipes)\n return value;\n\n const pipesArray = Array.isArray(pipes) ? pipes : [pipes];\n\n return pipesArray.reduce((v, p) => p.pipe.transform(v, ...(p.args || [])), value);\n }\n\n protected getTotalPerPageOfColum(columnKey: keyof T): number {\n const dataOfCurrentPage = this.getDataOfCurrentPage();\n return dataOfCurrentPage.reduce((previous, item) => (previous + Number(item[columnKey])), 0);\n }\n\n protected getDataOfCurrentPage(): T[] {\n const paginator = this.dataSource().paginator;\n\n if (!paginator)\n return [];\n\n const startIndex = paginator.pageIndex * paginator.pageSize;\n const endIndex = startIndex + paginator.pageSize;\n\n return this.dataSource().data.slice(startIndex, endIndex);\n }\n\n protected getTotalOfColum(columnKey: keyof T): number {\n return this.dataSource().data.reduce((previous, item) => (previous + Number(item[columnKey])), 0);\n }\n\n protected getValueOfColumnFilter(key: keyof T): ColumnValue {\n return this.filters()().columnsFiltersValue?.[key];\n }\n\n protected getPaginatedSearchableSelectValueOfColumnFilter(key: keyof T): FilterOption | FilterOption[] | undefined {\n const value = this.getValueOfColumnFilter(key);\n\n if (isFilterOption(value) || (Array.isArray(value) && value.every(v => isFilterOption(v))))\n return value;\n\n return undefined;\n }\n\n protected getSearchableSelectValueOfColumnFilter(key: keyof T): string | string[] | undefined {\n const value = this.getValueOfColumnFilter(key);\n\n if (typeof value === 'string' || (Array.isArray(value) && value.every(v => typeof v === 'string')))\n return value;\n\n return undefined;\n }\n\n protected getDateRangeValueOfColumnFilter(key: keyof T, type: 'start' | 'end'): moment.Moment | null {\n const value = this.getValueOfColumnFilter(key) as DateRange<moment.Moment | null>;\n\n if (!value)\n return null;\n\n return type == 'start' ? value.start : value.end\n }\n\n protected onTextFilterColumnChange(column: BasicTableColumn<T>, event: Event) {\n const query = (event.target as HTMLInputElement).value;\n this.onColumnFilterChange(column.key, query);\n }\n\n protected onPaginatedOptionFilterColumnChange(column: BasicTableColumn<T>, option?: FilterOption | FilterOption[]) {\n this.onColumnFilterChange(column.key, option);\n }\n\n protected onOptionFilterColumnChange(column: BasicTableColumn<T>, value?: string | string[]) {\n this.onColumnFilterChange(column.key, value);\n }\n\n protected onDateFilterChange(column: BasicTableColumn<T>, value: moment.Moment | null) {\n this.onColumnFilterChange(column.key, value);\n }\n\n protected onDateRangeFilterChange(column: BasicTableColumn<T>, value: DateRange<moment.Moment | null> | null) {\n this.onColumnFilterChange(column.key, value);\n }\n\n private onColumnFilterChange(columnKey: keyof T, value: ColumnValue) {\n this.filters().update(currentValue => {\n //Se clona para no mutar el estado anterior de la signal\n const columnsFiltersValue: Partial<Record<keyof T, ColumnValue>> = {\n ...(currentValue.columnsFiltersValue ?? {}),\n [columnKey]: value\n };\n return {\n ...currentValue,\n pageNumber: 1,\n columnsFiltersValue: columnsFiltersValue\n }\n });\n }\n\n protected rowIsExpanded(row: T): boolean {\n return this.expandedItem() == row;\n }\n\n protected expandableToggle(row: T) {\n this.expandedItem.update(currentValue => {\n const newValue = currentValue != row ? row : null;\n this.expandedItemChange.emit(newValue);\n return newValue;\n });\n }\n}\n","@if(!isFullScreen()) {\r\n <ng-container *ngTemplateOutlet=\"tableContentTemplate()\"></ng-container>\r\n}\r\n\r\n<ng-template #tableContent>\r\n <div class=\"tableContainer\" [class.inFullScreenMode]=\"isFullScreen()\">\r\n <div class=\"headerContainer\">\r\n <div class=\"titleAndButtonContainer\">\r\n <p class=\"title\">{{ config()().title() }}</p>\r\n <div class=\"buttonContainer\">\r\n @if(config()().create && (!config()().create?.show || config()().create?.show())) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"config()().create?.tooltip?.() ?? texts().table.create\" \r\n [disabled]=\"config()().create?.disabled?.()\" \r\n class=\"newButtonIcon\"\r\n (click)=\"onNewClick()\">\r\n <mat-icon>add_circle</mat-icon>\r\n </button>\r\n }\r\n\r\n @if(config()().hideColumnConfig?.() !== true) {\r\n <button matIconButton [matTooltip]=\"texts().table.editColumns\" class=\"editColumnsButtonIcon\" (click)=\"onEditColumns()\">\r\n <mat-icon>table_edit</mat-icon>\r\n </button>\r\n }\r\n\r\n @if(selection().length > 0) {\r\n @if(getRowSelectionAction().length > 0) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"texts().table.selectionActions\"\r\n [matMenuTriggerFor]=\"selectedRecordsMenu\">\r\n <mat-icon>event_list</mat-icon>\r\n </button>\r\n\r\n <mat-menu #selectedRecordsMenu=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\r\n <button mat-menu-item (click)=\"uncheckAllSelection()\">\r\n <mat-icon>deselect</mat-icon>\r\n <span>{{ texts().table.deselectAll }}</span>\r\n </button>\r\n\r\n @for (action of getRowSelectionAction(); track $index) {\r\n <button mat-menu-item (click)=\"onRowSelectionActionClick(action.id)\">\r\n <mat-icon>{{action.icon}}</mat-icon>\r\n <span>{{action.label(selection(), selection().length)}}</span>\r\n </button>\r\n }\r\n </mat-menu>\r\n } @else {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"texts().table.deselectAll\"\r\n (click)=\"uncheckAllSelection()\">\r\n <mat-icon>deselect</mat-icon>\r\n </button>\r\n }\r\n }\r\n\r\n @if(config()().hideExportData?.() !== true) {\r\n <button matIconButton [matTooltip]=\"texts().table.export\" [matMenuTriggerFor]=\"exportMenu\">\r\n <mat-icon>download</mat-icon>\r\n </button>\r\n <mat-menu #exportMenu=\"matMenu\" xPosition=\"before\" yPosition=\"below\">\r\n <button mat-menu-item (click)=\"exportToCsv()\">\r\n <mat-icon>csv</mat-icon>\r\n <span>{{ texts().table.exportExcel }}</span>\r\n </button>\r\n\r\n <button mat-menu-item (click)=\"exportToPdf()\">\r\n <mat-icon>picture_as_pdf</mat-icon>\r\n <span>{{ texts().table.exportPdf }}</span>\r\n </button>\r\n </mat-menu>\r\n }\r\n\r\n @if(config()().hideFullScreen?.() !== true) {\r\n <button matIconButton [matTooltip]=\"isFullScreen() ? texts().table.exitFullscreen : texts().table.enterFullscreen\" (click)=\"onToggleFullScreen()\">\r\n <mat-icon>{{isFullScreen() ? 'fullscreen_exit': 'fullscreen'}}</mat-icon>\r\n </button>\r\n }\r\n\r\n <ng-content select=\"[icon-buttons]\"></ng-content>\r\n </div>\r\n </div>\r\n\r\n <div class=\"filterContainer\">\r\n <div class=\"moreFiltersContainer\">\r\n <ng-content select=\"[more-filters]\"></ng-content>\r\n </div>\r\n\r\n @if(showQueryFilter()) {\r\n <mat-form-field subscriptSizing=\"dynamic\">\r\n <mat-icon matPrefix>search</mat-icon>\r\n <input #queryElement matInput [placeholder]=\"config()().queryFilterPlaceholder ?? texts().common.search\" [value]=\"filters()().query ?? ''\" (input)=\"onQueryChange(queryElement)\">\r\n <button matIconButton matSuffix (click)=\"onQueryReset(queryElement)\" [style.visibility]=\"queryElement.value ? 'visible': 'hidden'\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n }\r\n </div>\r\n\r\n <ng-content select=\"[extra-header-content]\"></ng-content>\r\n </div>\r\n\r\n <mat-progress-bar mode=\"indeterminate\" [style.visibility]=\"loading() ? 'visible': 'hidden'\"/>\r\n\r\n <div class=\"tableOverflow\" [style.max-height]=\"config()().maxHeight && !isFullScreen() ? config()().maxHeight : null\">\r\n <table\r\n mat-table \r\n matSort\r\n [multiTemplateDataRows]=\"config()().expandableDetail\"\r\n [dataSource]=\"dataSource()\" \r\n [matSortActive]=\"filters()().sortBy?.key ?? ''\" \r\n [matSortDirection]=\"filters()().sortBy?.direction ?? ''\"\r\n (matSortChange)=\"onSortChange($event)\">\r\n\r\n @if(config()().enableRowSelection) {\r\n @if(showFiltersRow()) {\r\n <ng-container [matColumnDef]=\"`${filterKeyPrefix}${nameOfRowSelectionColumn}`\" [sticky]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef class=\"celdaSelection\"></th>\r\n </ng-container>\r\n } \r\n\r\n <ng-container [matColumnDef]=\"nameOfRowSelectionColumn\" [sticky]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <mat-checkbox \r\n class=\"headerCheckbox\"\r\n (change)=\"$event ? toggleAllPageRowSelection() : null\"\r\n [checked]=\"selection().length > 0 && isAllPageRowSelected()\"\r\n [indeterminate]=\"selection().length > 0 && !isAllPageRowSelected()\">\r\n </mat-checkbox>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\" (click)=\"$event.stopPropagation()\" class=\"celdaSelection\">\r\n <mat-checkbox\r\n (change)=\"$event ? toggleRowSelection(row) : null\"\r\n [checked]=\"isRowSelected(row)\">\r\n </mat-checkbox>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef class=\"celdaSelection\"></td>\r\n </ng-container>\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <ng-container [matColumnDef]=\"`${generalFooterKeyPrefix}${nameOfRowSelectionColumn}`\" [sticky]=\"isDesktop()\">\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @for (column of config()().columns; track $index) {\r\n <ng-container \r\n [matColumnDef]=\"getKeyAsString(column.key)\" \r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header [disabled]=\"column.sortType === undefined\" class=\"columnLabel\">\r\n <p class=\"headerTitle\">\r\n @if(stickyColumnKey() == column.key && isDesktop()) {\r\n <mat-icon>keep</mat-icon>\r\n }\r\n {{ column.label }}\r\n </p>\r\n </th>\r\n\r\n <td \r\n mat-cell \r\n *matCellDef=\"let row\" \r\n [class.columnSticky]=\"stickyColumnKey() == column.key && isDesktop()\"\r\n [style]=\"column.style\"\r\n class=\"celdaDatos\">\r\n\r\n @if(column.component) {\r\n <ng-container \r\n ngxDynamicCellHost\r\n [component]=\"column.component\"\r\n [row]=\"row\"\r\n [key]=\"column.key\" />\r\n } @else if(column.templateRef) {\r\n <ng-container \r\n *ngTemplateOutlet=\"column.templateRef(); \r\n context: { $implicit: row }\" />\r\n } @else if(column.valueGetter) {\r\n {{ column.valueGetter(row) }}\r\n } @else {\r\n {{ applyColumnPipes(row[column.key], column.pipes) ?? '-' }}\r\n }\r\n </td>\r\n \r\n <td\r\n mat-footer-cell \r\n *matFooterCellDef\r\n [class.columnSticky]=\"stickyColumnKey() == column.key && isDesktop()\"\r\n [style]=\"column.footerStyle\">\r\n\r\n @if(column.showTotalPerPage) {\r\n @if(column.pipes) {\r\n {{ applyColumnPipes(getTotalPerPageOfColum(column.key), column.pipes) }}\r\n } @else if(column.totalFooterFormatter) {\r\n {{ column.totalFooterFormatter(getTotalPerPageOfColum(column.key)) }}\r\n } @else {\r\n {{ getTotalPerPageOfColum(column.key) }}\r\n }\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n\r\n @if(showTotalGeneralFooter()) {\r\n @for (column of config()().columns; track $index) {\r\n <ng-container \r\n [matColumnDef]=\"`${generalFooterKeyPrefix}${getKeyAsString(column.key)}`\"\r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n <td mat-footer-cell *matFooterCellDef [style]=\"column.footerStyle\">\r\n @if(column.showTotalGeneral) {\r\n @if(column.pipes) {\r\n {{ applyColumnPipes(getTotalOfColum(column.key), column.pipes) }}\r\n } @else if(column.totalFooterFormatter) {\r\n {{ column.totalFooterFormatter(getTotalOfColum(column.key)) }}\r\n } @else {\r\n {{ getTotalOfColum(column.key) }}\r\n }\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(showFiltersRow()) {\r\n @for (column of config()().columns; track $index) {\r\n <ng-container \r\n [matColumnDef]=\"`${filterKeyPrefix}${getKeyAsString(column.key)}`\" \r\n [sticky]=\"stickyColumnKey() == column.key && isDesktop()\">\r\n\r\n <th mat-header-cell *matHeaderCellDef>\r\n @if (column.filterType == 'text' || column.filterType == 'number') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"inputQueryColumn\">\r\n <input [type]=\"column.filterType\" matInput [placeholder]=\"column.label\" [value]=\"getValueOfColumnFilter(column.key) ?? ''\" (input)=\"onTextFilterColumnChange(column, $event)\">\r\n <mat-icon matSuffix>{{ column.filterType == 'text' ? 'search' : 'numbers'}}</mat-icon>\r\n </mat-form-field>\r\n }\r\n\r\n @if (column.filterType == 'option' || column.filterType == 'option-multiple') {\r\n @if(column.endpointForPaginatedFilterOptions) {\r\n <ngx-paginated-searchable-select\r\n class=\"selectColumn\"\r\n [selected]=\"getPaginatedSearchableSelectValueOfColumnFilter(column.key)\"\r\n [endpoint]=\"column.endpointForPaginatedFilterOptions\"\r\n [filters]=\"column.filtersForEndpointPaginatedFilterOptions ?? defaultFiltersForPaginatedFilterOptions\"\r\n [multiple]=\"column.filterType == 'option-multiple'\"\r\n subscriptSizing=\"dynamic\"\r\n [selectPlaceholder]=\"column.label\"\r\n (optionChange)=\"onPaginatedOptionFilterColumnChange(column, $event)\"\r\n clearableOptionLabel=\"filtro\"\r\n />\r\n } @else {\r\n <ngx-searchable-select\r\n class=\"selectColumn\"\r\n [selected]=\"getSearchableSelectValueOfColumnFilter(column.key)\"\r\n [options]=\"column.filterOptions ?? []\"\r\n [multiple]=\"column.filterType == 'option-multiple'\"\r\n subscriptSizing=\"dynamic\"\r\n [selectPlaceholder]=\"column.label\"\r\n (optionChange)=\"onOptionFilterColumnChange(column, $event)\"\r\n clearableOptionLabel=\"filtro\"\r\n />\r\n } \r\n }\r\n \r\n @if(column.filterType == 'date') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"dateColumn\">\r\n <input \r\n matInput \r\n [matDatepicker]=\"picker\" \r\n [placeholder]=\"column.label\"\r\n [value]=\"getValueOfColumnFilter(column.key)\"\r\n (dateChange)=\"onDateFilterChange(column, $event.value)\">\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker></mat-datepicker>\r\n </mat-form-field>\r\n }\r\n\r\n @if(column.filterType == 'date-range') {\r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"dateColumn\">\r\n <mat-date-range-input [rangePicker]=\"picker\" #dateRangeInput>\r\n <input \r\n matStartDate \r\n [placeholder]=\"texts().table.dateRangeStart\"\r\n [value]=\"getDateRangeValueOfColumnFilter(column.key, 'start')\"\r\n (dateChange)=\"onDateRangeFilterChange(column, dateRangeInput.value)\">\r\n <input \r\n matEndDate \r\n [placeholder]=\"texts().table.dateRangeEnd\"\r\n [value]=\"getDateRangeValueOfColumnFilter(column.key, 'end')\"\r\n (dateChange)=\"onDateRangeFilterChange(column, dateRangeInput.value)\">\r\n </mat-date-range-input>\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-date-range-picker #picker></mat-date-range-picker>\r\n </mat-form-field>\r\n }\r\n </th>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(showActionsColumn()) {\r\n @if(showFiltersRow()) {\r\n <ng-container [matColumnDef]=\"`${filterKeyPrefix}${nameOfActionsColumn}`\" [stickyEnd]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef class=\"celdaAcciones\"></th>\r\n </ng-container>\r\n } \r\n\r\n <ng-container [matColumnDef]=\"nameOfActionsColumn\" [stickyEnd]=\"isDesktop()\">\r\n <th mat-header-cell *matHeaderCellDef>{{ texts().table.actions }}</th>\r\n <td mat-cell *matCellDef=\"let row\" (click)=\"$event.stopPropagation()\" class=\"celdaAcciones\">\r\n <div class=\"contenedorCeldaAcciones\">\r\n @if(config()().expandableDetail) {\r\n <button \r\n matIconButton\r\n (click)=\"expandableToggle(row)\">\r\n <mat-icon>{{ rowIsExpanded(row) ? 'keyboard_arrow_up' : 'keyboard_arrow_down' }}</mat-icon>\r\n </button>\r\n }\r\n\r\n @for (rowAction of config()().rowActions; track $index) {\r\n @if(!rowAction.show || rowAction.show(row)) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"rowAction.tooltip(row)\" \r\n [disabled]=\"rowAction.disabled?.(row)\" \r\n [class]=\"rowAction.iconColor ? `rowActionIconColor${rowAction.iconColor}` : ''\"\r\n (click)=\"onRowActionClick(row, rowAction, $event)\">\r\n <mat-icon>{{rowAction.icon}}</mat-icon>\r\n </button>\r\n } \r\n }\r\n\r\n @if(config()().update && !config()().clickOnRowForUpdate && (!config()().update?.show || config()().update?.show(row))) {\r\n <button \r\n matIconButton\r\n [matTooltip]=\"config()().update?.tooltip?.(row) ?? texts().table.edit\" \r\n [disabled]=\"config()().update?.disabled?.(row)\" \r\n class=\"editButtonIcon\"\r\n (click)=\"onUpdateClick(row, $event)\">\r\n <mat-icon>edit_square</mat-icon>\r\n </button>\r\n }\r\n \r\n @if(config()().delete && (!config()().delete?.show || config()().delete?.show(row))) {\r\n <button \r\n matIconButton \r\n [matTooltip]=\"config()().delete?.tooltip?.(row) ?? texts().table.delete\" \r\n [disabled]=\"config()().delete?.disabled?.(row)\" \r\n class=\"deleteButtonIcon\"\r\n (click)=\"onDeleteClick(row, $event)\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n </td>\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <ng-container [matColumnDef]=\"`${generalFooterKeyPrefix}${nameOfActionsColumn}`\" [stickyEnd]=\"isDesktop()\">\r\n <td mat-footer-cell *matFooterCellDef></td>\r\n </ng-container>\r\n }\r\n }\r\n\r\n @if(config()().expandableDetail) {\r\n <ng-container [matColumnDef]=\"expandableColumnDef\">\r\n <td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"keys().length\">\r\n <div \r\n class=\"detailWrapper\"\r\n [class.detailWrapperExpanded]=\"rowIsExpanded(row)\">\r\n <div class=\"columnDetail\">\r\n @if(config()().expandableDetailTemplateRef) {\r\n <ng-container \r\n *ngTemplateOutlet=\"config()().expandableDetailTemplateRef!(); \r\n context: { $implicit: row }\" />\r\n }\r\n </div>\r\n </div>\r\n </td>\r\n </ng-container>\r\n }\r\n \r\n <tr mat-header-row *matHeaderRowDef=\"keys(); sticky: true\" class=\"tableHeader\"></tr>\r\n \r\n @if(showFiltersRow()) {\r\n <tr mat-header-row *matHeaderRowDef=\"keysWithFilter(); sticky: true\" class=\"filtersByColumn\"></tr>\r\n }\r\n \r\n <tr mat-row *matRowDef=\"let row; columns: keys();\" \r\n (click)=\"onRowClick(row)\" \r\n [class.rowClickEnable]=\"isRowEnabled(row)\"\r\n [class.expandableRow]=\"config()().expandableDetail\">\r\n </tr>\r\n \r\n @if(config()().expandableDetail) {\r\n <tr mat-row *matRowDef=\"let row; columns: [expandableColumnDef]\" class=\"rowDetail\"></tr>\r\n }\r\n\r\n <tr mat-footer-row \r\n *matFooterRowDef=\"showTotalPerPageFooter() ? keys() : []\" \r\n class=\"totalPerPageFooter\"\r\n [class.hideFooter]=\"!showTotalPerPageFooter()\">\r\n </tr>\r\n\r\n <tr mat-footer-row \r\n *matFooterRowDef=\"showTotalGeneralFooter() ? keysWithGeneralFooter() : []\" \r\n class=\"totalFooter\"\r\n [class.hideFooter]=\"!showTotalGeneralFooter()\">\r\n </tr>\r\n\r\n <tr class=\"mat-row\" *matNoDataRow>\r\n <td class=\"noData\" [colSpan]=\"keys().length\">{{ loading() ? texts().common.loading : texts().common.noData }}</td>\r\n </tr>\r\n </table>\r\n </div>\r\n\r\n <div class=\"paginatorContainer\">\r\n <div class=\"footerLegend\">\r\n @if(showTotalPerPageFooter()) {\r\n <div class=\"legendItem\">\r\n <div class=\"legendSquare\"></div>\r\n <p>{{ texts().table.totalPerPage }}</p> \r\n </div>\r\n }\r\n\r\n @if(showTotalGeneralFooter()) {\r\n <div class=\"legendItem\">\r\n <div class=\"legendSquare totalGeneral\"></div>\r\n <p>{{ texts().table.totalGeneral }}</p>\r\n </div>\r\n }\r\n </div>\r\n <mat-paginator />\r\n </div>\r\n\r\n <ng-content select=\"[end-container]\"></ng-content>\r\n </div>\r\n</ng-template>","import { booleanAttribute, ChangeDetectionStrategy, Component, computed, inject, input, output, signal } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { AlertAppearance, AlertType } from '../../models';\r\nimport { NgxTexts } from '../../i18n';\r\n\r\nconst DEFAULT_ICONS: Record<AlertType, string> = {\r\n info: 'info',\r\n success: 'check_circle',\r\n warning: 'warning',\r\n error: 'error',\r\n};\r\n\r\n@Component({\r\n selector: 'ngx-alert',\r\n imports: [MatIconModule, MatButtonModule, MatTooltipModule],\r\n templateUrl: './ngx-alert.component.html',\r\n styleUrl: './ngx-alert.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n '[attr.role]': 'isDismissed() ? null : resolvedRole()',\r\n '[class.ngx-alert--dismissed]': 'isDismissed()',\r\n },\r\n})\r\nexport class NgxAlert {\r\n private readonly _texts = inject(NgxTexts).texts;\r\n\r\n /** Gravedad del mensaje: define color, icono por defecto y cómo se anuncia. */\r\n readonly type = input<AlertType>('info');\r\n\r\n /** Título en negrita sobre el mensaje. */\r\n readonly title = input<string>();\r\n\r\n /** Mensaje en texto plano. Para contenido con formato o enlaces, proyéctalo como contenido. */\r\n readonly message = input<string>();\r\n\r\n /** Estilo visual: standard (fondo + franja lateral), soft (solo fondo) u outlined (solo borde). */\r\n readonly appearance = input<AlertAppearance>('standard');\r\n\r\n /** Icono de Material Symbols. Por defecto, el del tipo (info, check_circle, warning, error). */\r\n readonly icon = input<string>();\r\n\r\n /** Oculta el icono. */\r\n readonly hideIcon = input(false, { transform: booleanAttribute });\r\n\r\n /** Muestra un botón para cerrar el aviso. Al pulsarlo se oculta y emite `dismissed`. */\r\n readonly dismissible = input(false, { transform: booleanAttribute });\r\n\r\n /** Etiqueta accesible del botón de cerrar. Por defecto, el texto `alert.dismiss` de la librería. */\r\n readonly dismissLabel = input<string>();\r\n\r\n /**\r\n * Cómo lo anuncia el lector de pantalla. assertive interrumpe (role=\"alert\"), polite espera\r\n * a que termine (role=\"status\") y off no lo anuncia. Por defecto: assertive para error y\r\n * warning, polite para info y success.\r\n */\r\n readonly politeness = input<'assertive' | 'polite' | 'off'>();\r\n\r\n /** Se emite cuando el usuario cierra el aviso con el botón de cerrar. */\r\n readonly dismissed = output<void>();\r\n\r\n protected readonly isDismissed = signal(false);\r\n\r\n protected readonly resolvedIcon = computed(() => this.icon() || DEFAULT_ICONS[this.type()] || DEFAULT_ICONS.info);\r\n\r\n protected readonly resolvedDismissLabel = computed(() => {\r\n return this.dismissLabel() ?? this._texts().alert.dismiss;\r\n });\r\n\r\n protected readonly resolvedRole = computed(() => {\r\n const politeness = this.politeness()\r\n ?? (this.type() === 'error' || this.type() === 'warning' ? 'assertive' : 'polite');\r\n\r\n switch (politeness) {\r\n case 'assertive': return 'alert';\r\n case 'polite': return 'status';\r\n default: return null;\r\n }\r\n });\r\n\r\n protected dismiss(): void {\r\n this.isDismissed.set(true);\r\n this.dismissed.emit();\r\n }\r\n}\r\n","@if (!isDismissed()) {\n <div class=\"alert\" [class]=\"'alert alert--' + type() + ' alert--' + appearance()\">\n @if (!hideIcon()) {\n <mat-icon class=\"alert__icon\" aria-hidden=\"true\">{{ resolvedIcon() }}</mat-icon>\n }\n\n <div class=\"alert__content\">\n @if (title()) {\n <div class=\"alert__title\">{{ title() }}</div>\n }\n\n <div class=\"alert__description\">\n @if (message()) {\n <p class=\"alert__message\">{{ message() }}</p>\n }\n <ng-content />\n </div>\n\n <div class=\"alert__actions\">\n <ng-content select=\"[alertActions]\" />\n </div>\n </div>\n\n @if (dismissible()) {\n <button\n type=\"button\"\n class=\"alert__dismiss\"\n matIconButton\n [attr.aria-label]=\"resolvedDismissLabel()\"\n [matTooltip]=\"resolvedDismissLabel()\"\n (click)=\"dismiss()\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </div>\n}\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n DestroyRef,\r\n effect,\r\n inject,\r\n signal,\r\n TemplateRef,\r\n untracked,\r\n ViewEncapsulation,\r\n WritableSignal,\r\n} from '@angular/core';\r\nimport { NgxTexts } from '../../../i18n';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { MAT_BOTTOM_SHEET_DATA, MatBottomSheetRef } from '@angular/material/bottom-sheet';\r\nimport { PaginatedFilter } from '../../../models/paginated-filter';\r\nimport { PaginatedItems } from '../../../models/paginated-items';\r\nimport { PaginatedSelectConfig } from '../../../models/select-config';\r\nimport { rxResource } from '@angular/core/rxjs-interop';\r\nimport { toObservable } from '@angular/core/rxjs-interop';\r\nimport { catchError, debounceTime, distinctUntilChanged, merge, Observable, of, skip, Subject } from 'rxjs';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatRippleModule } from '@angular/material/core';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatBadgeModule } from '@angular/material/badge';\r\n\r\nexport interface NgxPaginatedSelectBottomSheetData<T, U extends PaginatedFilter<T>> {\r\n title: string;\r\n config: PaginatedSelectConfig<T>;\r\n endpoint: (filters: U) => Observable<PaginatedItems<T>>;\r\n filters: WritableSignal<U>;\r\n /** Accepts full objects OR partials containing only the valueKey */\r\n selectedItems: Partial<T>[];\r\n multiple: boolean;\r\n showSearch: boolean;\r\n searchPlaceholder: string;\r\n noResultsMessage: string;\r\n confirmLabel: string;\r\n resetLabel: string;\r\n optionTemplate: TemplateRef<{ $implicit: T }> | null;\r\n extraFiltersTemplate: TemplateRef<void> | null;\r\n showSelectAll: boolean;\r\n selectAllLabel: string;\r\n}\r\n\r\n@Component({\r\n selector: 'ngx-paginated-select-bottom-sheet',\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n MatButtonModule,\r\n MatChipsModule,\r\n MatDividerModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatProgressBarModule,\r\n MatRippleModule,\r\n MatCheckboxModule,\r\n MatTooltipModule,\r\n MatBadgeModule,\r\n ],\r\n templateUrl: './ngx-paginated-select-bottom-sheet.component.html',\r\n styleUrl: './ngx-paginated-select-bottom-sheet.component.scss',\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class NgxPaginatedSelectBottomSheetComponent<T, U extends PaginatedFilter<T>> {\r\n // ─── Dependencies ──────────────────────────────────────────────────────────\r\n private readonly _ref = inject(MatBottomSheetRef<NgxPaginatedSelectBottomSheetComponent<T, U>>);\r\n private readonly _destroy = inject(DestroyRef);\r\n readonly data = inject<NgxPaginatedSelectBottomSheetData<T, U>>(MAT_BOTTOM_SHEET_DATA);\r\n readonly texts = inject(NgxTexts).texts;\r\n\r\n // ─── State ─────────────────────────────────────────────────────────────────\r\n /** Raw input value — updates on every keystroke, does NOT trigger the resource */\r\n readonly query = signal(this.data.filters().query);\r\n /** Holds Partial<T> initially; items get upgraded to full T when toggled from the list */\r\n readonly selectedItems = signal<Partial<T>[]>([...this.data.selectedItems]);\r\n\r\n /**\r\n * Subject used to bypass the 400 ms debounce (e.g. when the user clears\r\n * the search field — we want an immediate response).\r\n */\r\n private readonly _immediateQuery$ = new Subject<string>();\r\n\r\n private readonly accumulatedItems = signal<T[]>([]);\r\n\r\n // ─── Resource (single trigger: data.filters) ───────────────────────────────\r\n /**\r\n * IMPORTANT: the resource depends ONLY on `data.filters`.\r\n * The debounce subscription (below) is the only thing that mutates\r\n * `data.filters.query`, so the resource fires at most once per debounce\r\n * period — never on every keystroke.\r\n */\r\n readonly resource = rxResource({\r\n params: () => ({ ...this.data.filters() }),\r\n // Un fallo de red degrada a lista vacía (estado \"sin resultados\") en vez de\r\n // dejar el resource en error —que rompería el render y ensuciaría la consola—.\r\n stream: ({ params }) =>\r\n this.data.endpoint(params).pipe(\r\n catchError(() => of({ items: [], total: 0 } as PaginatedItems<T>))\r\n ),\r\n defaultValue: { items: [], total: 0 } as PaginatedItems<T>,\r\n });\r\n\r\n // ─── Computed ──────────────────────────────────────────────────────────────\r\n readonly isLoading = computed(() => this.resource.isLoading());\r\n readonly options = computed(() => this.accumulatedItems());\r\n readonly hasError = computed(() => !!this.resource.error());\r\n readonly selectedCount = computed(() => this.selectedItems().length);\r\n\r\n /**\r\n * Total como signal, actualizado SOLO cuando el recurso no está cargando. Durante\r\n * la carga por scroll, resource.value() pasa transitoriamente al defaultValue\r\n * (total: 0); leerlo directamente hacía parpadear el footer a \"0 resultados\"\r\n * aunque el total real no cambie. Con este signal el total se mantiene estable\r\n * mientras se cargan más páginas.\r\n */\r\n private readonly _total = signal(0);\r\n readonly total = this._total.asReadonly();\r\n private readonly _totalEffect = effect(() => {\r\n if (this.resource.isLoading())\r\n return;\r\n try {\r\n this._total.set(this.resource.error() ? 0 : this.resource.value().total);\r\n } catch {\r\n // El recurso puede lanzar si está en error o se elimina durante el teardown;\r\n // se conserva el último total y no se rompe el ciclo de detección de cambios.\r\n }\r\n });\r\n\r\n /** Cargando la PRIMERA página (lista vacía) → se muestran skeletons. */\r\n readonly isInitialLoading = computed(() => this.isLoading() && this.options().length === 0);\r\n /** Cargando MÁS páginas (scroll) → fila inline \"cargando más…\", sin barra superior. */\r\n readonly isLoadingMore = computed(() => this.isLoading() && this.options().length > 0);\r\n /** Ya se han cargado todos los resultados disponibles. */\r\n readonly allLoaded = computed(() => this.total() > 0 && this.options().length >= this.total());\r\n /** Cabecera con sombra solo cuando la lista está desplazada. */\r\n readonly headerScrolled = signal(false);\r\n\r\n readonly allSelected = computed(() => {\r\n const items = this.options();\r\n if (items.length === 0) return false;\r\n return items.every(item => this.isSelected(item));\r\n });\r\n\r\n readonly someSelected = computed(() => {\r\n const items = this.options();\r\n if (items.length === 0) return false;\r\n const count = items.filter(item => this.isSelected(item)).length;\r\n return count > 0 && count < items.length;\r\n });\r\n\r\n // ─── Accumulate pages ──────────────────────────────────────────────────────\r\n /**\r\n * Reactively depends ONLY on `resource.value()`. The filter snapshot is read\r\n * via `untracked` so external filter changes (parent-driven, e.g. an extra\r\n * filters panel) do NOT create a reactive dependency here — that would make\r\n * the effect re-run on scroll page increments with stale resource data,\r\n * duplicating items and breaking `onScroll` (see original limitation).\r\n *\r\n * Reset logic:\r\n * - Fingerprint the current filter identity (everything except `pageNumber`).\r\n * - If the fingerprint changed since the previous fetch, this fetch belongs\r\n * to a different filter set → replace the accumulated array.\r\n * - If only `pageNumber` moved, this is a scroll-load-more → append.\r\n *\r\n * This is what allows callers to mutate `data.filters` from outside (extra\r\n * filter selects, checkboxes, etc.) and have the list refresh cleanly\r\n * without the previous page's items lingering.\r\n */\r\n private _lastFilterFingerprint: string | null = null;\r\n private readonly _accumEffect = effect(() => {\r\n // Si el endpoint falla, resource.value() lanza: se trata como lista vacía.\r\n if (this.resource.error()) {\r\n this.accumulatedItems.set([]);\r\n return;\r\n }\r\n\r\n let value: PaginatedItems<T>;\r\n try {\r\n value = this.resource.value();\r\n } catch {\r\n // El recurso puede lanzar si se elimina durante el teardown; se ignora para\r\n // no romper el ciclo de detección de cambios.\r\n return;\r\n }\r\n const { pageNumber, ...rest } = untracked(() => this.data.filters()) as U;\r\n const fingerprint = JSON.stringify(rest);\r\n\r\n // Cambio de filtros, o refetch de la primera pagina (reintento, error que\r\n // devuelve el defaultValue del resource...): se reemplaza en vez de acumular.\r\n if (fingerprint !== this._lastFilterFingerprint || pageNumber <= 1) {\r\n this._lastFilterFingerprint = fingerprint;\r\n this.accumulatedItems.set([...value.items]);\r\n return;\r\n }\r\n\r\n // Scroll: se anaden solo los que no estuvieran ya, para que un refetch de la\r\n // misma pagina no duplique elementos en la lista.\r\n const key = this.data.config.valueKey as keyof T;\r\n this.accumulatedItems.update(acc => {\r\n const known = new Set(acc.map(item => item[key]));\r\n const nuevos = value.items.filter(item => !known.has(item[key]));\r\n return nuevos.length > 0 ? [...acc, ...nuevos] : acc;\r\n });\r\n });\r\n\r\n constructor() {\r\n // Reset to page 1 when the sheet opens\r\n this.accumulatedItems.set([]);\r\n this.data.filters.update(f => ({ ...f, pageNumber: 1 }));\r\n\r\n /**\r\n * Debounce pipeline:\r\n * typed input → wait 400 ms → push into data.filters\r\n * _immediateQuery$ → no wait → push into data.filters (used by clearQuery)\r\n *\r\n * The merged stream has a final distinctUntilChanged so that an immediate\r\n * clear followed by the debounced '' 400 ms later does NOT fire twice.\r\n */\r\n merge(\r\n this._immediateQuery$,\r\n // skip(1) skips the initial BehaviorSubject-like emission from toObservable\r\n // so we don't re-fetch 400ms after the sheet opens with an empty query\r\n toObservable(this.query).pipe(skip(1), debounceTime(400), distinctUntilChanged()),\r\n )\r\n .pipe(distinctUntilChanged(), takeUntilDestroyed(this._destroy))\r\n .subscribe(q => {\r\n this.accumulatedItems.set([]);\r\n this.data.filters.update(f => ({ ...f, query: q, pageNumber: 1 }));\r\n });\r\n\r\n }\r\n\r\n // ─── Helpers ────────────────────────────────────────────────────────────────\r\n\r\n isSelected(item: T): boolean {\r\n const key = this.data.config.valueKey as keyof T;\r\n const val = item[key];\r\n return this.selectedItems().some(s => s[key] === val);\r\n }\r\n\r\n /**\r\n * Safe label: tries displayedLabel(item), falls back to String(item[valueKey]).\r\n * Works for both full objects and partials.\r\n */\r\n getLabel(item: Partial<T>): string {\r\n const cfg = this.data.config;\r\n const keyVal = String(item[cfg.valueKey as keyof T] ?? '');\r\n if (!cfg.displayedLabel) return keyVal;\r\n try {\r\n return cfg.displayedLabel(item as T) ?? keyVal;\r\n } catch {\r\n return keyVal;\r\n }\r\n }\r\n\r\n getAvatarText(item: Partial<T>): string {\r\n if (this.data.config.avatarText) {\r\n try { return this.data.config.avatarText(item as T); } catch { /* fall through */ }\r\n }\r\n return this.getLabel(item).charAt(0).toUpperCase();\r\n }\r\n\r\n /** Claves de items cuya imagen de avatar falló al cargar (para el fallback). */\r\n private readonly failedImages = signal<Set<unknown>>(new Set());\r\n\r\n /** URL de imagen del avatar, o null si no hay o si falló al cargar. */\r\n getAvatarImage(item: Partial<T>): string | null | undefined {\r\n const key = item[this.data.config.valueKey as keyof T];\r\n if (this.failedImages().has(key))\r\n return null;\r\n return this.data.config.avatarImage?.(item as T);\r\n }\r\n\r\n /** Marca la imagen como fallida para caer al texto/icono. */\r\n onAvatarError(item: Partial<T>): void {\r\n const key = item[this.data.config.valueKey as keyof T];\r\n this.failedImages.update(s => new Set(s).add(key));\r\n }\r\n\r\n // ─── Selection ──────────────────────────────────────────────────────────────\r\n\r\n toggleItem(item: T): void {\r\n if (this.data.config.disabled?.(item)) return;\r\n\r\n const key = this.data.config.valueKey as keyof T;\r\n const val = item[key];\r\n\r\n if (this.data.multiple) {\r\n if (this.isSelected(item)) {\r\n this.selectedItems.update(items => items.filter(s => s[key] !== val));\r\n } else {\r\n // Remove any existing partial with the same key, then add the full object\r\n this.selectedItems.update(items => [\r\n ...items.filter(s => s[key] !== val),\r\n item,\r\n ]);\r\n }\r\n } else {\r\n if (this.isSelected(item)) {\r\n this.selectedItems.set([]);\r\n } else {\r\n this.selectedItems.set([item]);\r\n this.confirm();\r\n }\r\n }\r\n }\r\n\r\n removeSelectedChip(item: Partial<T>): void {\r\n const key = this.data.config.valueKey as keyof T;\r\n const val = item[key];\r\n this.selectedItems.update(items => items.filter(s => s[key] !== val));\r\n }\r\n\r\n // ─── Search ──────────────────────────────────────────────────────────────────\r\n\r\n onQueryInput(event: Event, container: HTMLElement): void {\r\n container.scrollTop = 0;\r\n // Only update the raw signal — the debounce subscription handles the rest\r\n this.query.set((event.target as HTMLInputElement).value);\r\n }\r\n\r\n clearQuery(container?: HTMLElement): void {\r\n // El input refleja la query vía [value]=\"query()\", así que basta con resetear\r\n // el signal (no hace falta el ref del DOM, que no está en scope en el estado vacío).\r\n if (container) container.scrollTop = 0;\r\n this.query.set('');\r\n // Emit on the immediate subject to bypass the 400 ms debounce\r\n this._immediateQuery$.next('');\r\n }\r\n\r\n // ─── Scroll ──────────────────────────────────────────────────────────────────\r\n\r\n onScroll(container: HTMLElement): void {\r\n // Sombra bajo la cabecera al desplazar\r\n this.headerScrolled.set(container.scrollTop > 4);\r\n\r\n if (this.isLoading()) return;\r\n const { scrollTop, clientHeight, scrollHeight } = container;\r\n // Prefetch: se pide la siguiente página ~320px antes del final para que la\r\n // fila de \"cargando más\" apenas se vea (scroll infinito fluido).\r\n if (\r\n scrollTop + clientHeight + 320 >= scrollHeight &&\r\n this.options().length < this.total()\r\n ) {\r\n this.data.filters.update(f => ({ ...f, pageNumber: f.pageNumber + 1 }));\r\n }\r\n }\r\n\r\n /** Reintenta la carga tras un error. */\r\n retry(): void {\r\n this.resource.reload();\r\n }\r\n\r\n // ─── Select all ─────────────────────────────────────────────────────────────\r\n\r\n toggleSelectAll(): void {\r\n const key = this.data.config.valueKey as keyof T;\r\n if (this.allSelected()) {\r\n const visibleValues = new Set(this.options().map(item => item[key]));\r\n this.selectedItems.update(items =>\r\n items.filter(s => !visibleValues.has(s[key] as T[keyof T]))\r\n );\r\n } else {\r\n const newItems = this.options().filter(\r\n item => !this.isSelected(item) && !this.data.config.disabled?.(item)\r\n );\r\n this.selectedItems.update(items => [...items, ...newItems]);\r\n }\r\n }\r\n\r\n // ─── Actions ──────────────────────────────────────────────────────────────────\r\n\r\n confirm(): void {\r\n this._ref.dismiss(this.selectedItems());\r\n }\r\n\r\n reset(): void {\r\n this.selectedItems.set([]);\r\n }\r\n\r\n close(): void {\r\n this._ref.dismiss(undefined);\r\n }\r\n}\r\n","<div class=\"ps-bs\">\r\n\r\n <!-- ── Handle bar (mobile) ───────────────────────────────────────────────── -->\r\n <div class=\"ps-bs__handle\">\r\n <div class=\"ps-bs__handle-bar\"></div>\r\n </div>\r\n\r\n <!-- ── Header (pinned: title + search only) ──────────────────────────────── -->\r\n <div class=\"ps-bs__header\" [class.ps-bs__header--scrolled]=\"headerScrolled()\">\r\n <div class=\"ps-bs__header-top\">\r\n <div class=\"ps-bs__title-area\">\r\n <span class=\"ps-bs__title\">{{ data.title }}</span>\r\n @if (data.multiple && selectedCount() > 0) {\r\n <span class=\"ps-bs__badge\">{{ selectedCount() }}</span>\r\n }\r\n </div>\r\n <button mat-icon-button class=\"ps-bs__close-btn\" [attr.aria-label]=\"texts().common.close\" (click)=\"close()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <!-- Pill search -->\r\n @if (data.showSearch) {\r\n <div class=\"ps-bs__search\">\r\n <mat-icon class=\"ps-bs__search-icon\">search</mat-icon>\r\n <input\r\n class=\"ps-bs__search-input\"\r\n #searchInput\r\n type=\"text\"\r\n [value]=\"query() ?? ''\"\r\n [placeholder]=\"data.searchPlaceholder\"\r\n (input)=\"onQueryInput($event, bodyContainer)\"\r\n />\r\n @if (searchInput.value.length > 0) {\r\n <button\r\n class=\"ps-bs__search-clear\"\r\n type=\"button\"\r\n [attr.aria-label]=\"texts().common.clearSearch\"\r\n (click)=\"clearQuery(bodyContainer); $event.stopPropagation()\"\r\n >\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- ── Body (ÚNICA zona de scroll: filtros + chips + select-all + lista) ──── -->\r\n <div class=\"ps-bs__body\" #bodyContainer (scroll)=\"onScroll(bodyContainer)\">\r\n\r\n <!-- Extra filters projection -->\r\n @if (data.extraFiltersTemplate) {\r\n <div class=\"ps-bs__extra-filters\">\r\n <ng-container *ngTemplateOutlet=\"data.extraFiltersTemplate\" />\r\n </div>\r\n }\r\n\r\n <!-- Selected chips (custom lightweight chips) -->\r\n @if (data.multiple && selectedItems().length > 0) {\r\n <div class=\"ps-bs__selected-chips\">\r\n @for (item of selectedItems(); track item[data.config.valueKey]) {\r\n <div class=\"ps-bs__chip\">\r\n <span class=\"ps-bs__chip-label\">{{ getLabel(item) }}</span>\r\n <button class=\"ps-bs__chip-remove\" type=\"button\" [attr.aria-label]=\"texts().common.clearSearch\" (click)=\"removeSelectedChip(item)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Select all (sticky top of the scroll area) -->\r\n @if (data.multiple && data.showSelectAll && options().length > 0) {\r\n <div class=\"ps-bs__select-all\" matRipple (click)=\"toggleSelectAll()\">\r\n <mat-checkbox\r\n [checked]=\"allSelected()\"\r\n [indeterminate]=\"someSelected()\"\r\n (click)=\"$event.preventDefault()\"\r\n />\r\n <span class=\"ps-bs__select-all-label\">{{ data.selectAllLabel }}</span>\r\n </div>\r\n }\r\n\r\n <!-- ── Options list ──────────────────────────────────────────────────── -->\r\n <div class=\"ps-bs__list\">\r\n\r\n <!-- Skeleton loading (only for the first page) -->\r\n @if (isInitialLoading()) {\r\n @for (i of [1, 2, 3, 4, 5, 6]; track i) {\r\n <div class=\"ps-bs__skeleton\">\r\n <div class=\"ps-bs__skeleton-avatar\"></div>\r\n <div class=\"ps-bs__skeleton-content\">\r\n <div class=\"ps-bs__skeleton-line ps-bs__skeleton-line--title\"></div>\r\n <div class=\"ps-bs__skeleton-line ps-bs__skeleton-line--subtitle\"></div>\r\n </div>\r\n </div>\r\n }\r\n }\r\n\r\n <!-- Error state -->\r\n @if (hasError() && !isLoading() && options().length === 0) {\r\n <div class=\"ps-bs__state ps-bs__error\">\r\n <div class=\"ps-bs__state-icon-wrap ps-bs__error-icon-wrap\">\r\n <mat-icon>error_outline</mat-icon>\r\n </div>\r\n <div class=\"ps-bs__state-title\">{{ texts().paginatedSelect.errorTitle }}</div>\r\n <div class=\"ps-bs__state-hint\">{{ texts().paginatedSelect.errorHint }}</div>\r\n <button matButton=\"tonal\" (click)=\"retry()\">\r\n <mat-icon>refresh</mat-icon>\r\n {{ texts().paginatedSelect.retry }}\r\n </button>\r\n </div>\r\n }\r\n\r\n <!-- Empty state -->\r\n @if (!hasError() && options().length === 0 && !isLoading()) {\r\n <div class=\"ps-bs__state ps-bs__empty\">\r\n <div class=\"ps-bs__state-icon-wrap\">\r\n <mat-icon>search_off</mat-icon>\r\n </div>\r\n <div class=\"ps-bs__state-title\">{{ data.noResultsMessage }}</div>\r\n @if (query()) {\r\n <div class=\"ps-bs__state-hint\">{{ texts().paginatedSelect.noResultsHint }}</div>\r\n <button matButton (click)=\"clearQuery(bodyContainer)\">\r\n {{ texts().paginatedSelect.clearSearch }}\r\n </button>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Option rows -->\r\n @for (item of options(); track item[data.config.valueKey]) {\r\n @let disabled = data.config.disabled ? data.config.disabled(item) : false;\r\n @let selected = isSelected(item);\r\n @let avatarImg = getAvatarImage(item);\r\n\r\n <div\r\n class=\"ps-bs__option\"\r\n [class.ps-bs__option--selected]=\"selected\"\r\n [class.ps-bs__option--disabled]=\"disabled\"\r\n matRipple\r\n [matRippleDisabled]=\"disabled\"\r\n (click)=\"toggleItem(item)\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"selected\"\r\n [attr.aria-disabled]=\"disabled\"\r\n >\r\n <!-- Avatar (al seleccionar se voltea a un check, estilo Gmail) -->\r\n <div class=\"ps-bs__option-avatar\" [class.ps-bs__option-avatar--selected]=\"selected\">\r\n @if (selected) {\r\n <mat-icon class=\"ps-bs__option-avatar-check\">check</mat-icon>\r\n } @else if (avatarImg) {\r\n <img [src]=\"avatarImg\" [alt]=\"getLabel(item)\" (error)=\"onAvatarError(item)\" loading=\"lazy\" />\r\n } @else if (data.config.avatarText) {\r\n {{ getAvatarText(item) }}\r\n } @else if (data.config.avatarIcon) {\r\n <mat-icon>{{ data.config.avatarIcon }}</mat-icon>\r\n } @else {\r\n {{ getAvatarText(item) }}\r\n }\r\n </div>\r\n\r\n <!-- Content -->\r\n <div class=\"ps-bs__option-content\">\r\n @if (data.optionTemplate) {\r\n <ng-container *ngTemplateOutlet=\"data.optionTemplate; context: { $implicit: item }\" />\r\n } @else {\r\n <span class=\"ps-bs__option-label\">{{ getLabel(item) }}</span>\r\n @if (data.config.subtitle) {\r\n <span class=\"ps-bs__option-subtitle\">{{ data.config.subtitle(item) }}</span>\r\n }\r\n }\r\n </div>\r\n\r\n <!-- Check indicator -->\r\n @if (data.multiple) {\r\n <mat-checkbox [checked]=\"selected\" [disabled]=\"disabled\" (click)=\"$event.preventDefault()\" />\r\n } @else if (selected) {\r\n <mat-icon class=\"ps-bs__option-check\">check_circle</mat-icon>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Loading more (pagination) / end of list -->\r\n @if (isLoadingMore()) {\r\n <div class=\"ps-bs__loading-more\" aria-live=\"polite\">\r\n <span class=\"ps-bs__loading-more-dot\"></span>\r\n <span class=\"ps-bs__loading-more-dot\"></span>\r\n <span class=\"ps-bs__loading-more-dot\"></span>\r\n <span class=\"ps-bs__loading-more-text\">{{ texts().paginatedSelect.loadingMore }}</span>\r\n </div>\r\n } @else if (allLoaded() && options().length > 0) {\r\n <div class=\"ps-bs__list-end\">{{ texts().paginatedSelect.endOfList }}</div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- ── Footer (ALWAYS VISIBLE — never scrolls) ──────────────────────────── -->\r\n <div class=\"ps-bs__footer\">\r\n <span class=\"ps-bs__footer-count\">\r\n @if (data.multiple) {\r\n {{ texts().paginatedSelect.selectedCount(selectedCount(), total()) }}\r\n } @else {\r\n {{ texts().paginatedSelect.resultsCount(total()) }}\r\n }\r\n </span>\r\n\r\n @if (data.multiple) {\r\n <div class=\"ps-bs__footer-actions\">\r\n @if (selectedCount() > 0) {\r\n <button matButton (click)=\"reset()\">{{ data.resetLabel }}</button>\r\n }\r\n <button matButton=\"filled\" color=\"primary\" (click)=\"confirm()\">{{ data.confirmLabel }}</button>\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n","import {\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n TemplateRef,\r\n untracked,\r\n WritableSignal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { ControlValueAccessor, FormControl, FormGroupDirective, NgControl, NgForm, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { MatBottomSheet, MatBottomSheetModule } from '@angular/material/bottom-sheet';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatChipsModule, MatChipEvent } from '@angular/material/chips';\r\nimport { MatFormFieldModule, SubscriptSizing } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\nimport { Observable } from 'rxjs';\r\nimport { PaginatedFilter } from '../../models/paginated-filter';\r\nimport { PaginatedItems } from '../../models/paginated-items';\r\nimport { PaginatedSelectConfig } from '../../models/select-config';\r\nimport { NgxTexts } from '../../i18n';\r\nimport {\r\n NgxPaginatedSelectBottomSheetComponent,\r\n NgxPaginatedSelectBottomSheetData,\r\n} from './bottom-sheet/ngx-paginated-select-bottom-sheet.component';\r\n\r\n@Component({\r\n selector: 'ngx-paginated-select',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n MatBottomSheetModule,\r\n MatButtonModule,\r\n MatChipsModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatTooltipModule,\r\n MatProgressSpinnerModule,\r\n ],\r\n templateUrl: './ngx-paginated-select.component.html',\r\n styleUrl: './ngx-paginated-select.component.scss',\r\n})\r\nexport class NgxPaginatedSelect<T, U extends PaginatedFilter<T>> implements ControlValueAccessor {\r\n // ─── Dependencies ──────────────────────────────────────────────────────────\r\n private readonly _bottomSheet = inject(MatBottomSheet);\r\n /** Se auto-registra como CVA (self/optional para leer validación y no fallar sin form). */\r\n private readonly _ngControl = inject(NgControl, { self: true, optional: true });\r\n /** Formulario contenedor, para saber si ya se intento enviar (reactive o template-driven). */\r\n private readonly _parentFormGroup = inject(FormGroupDirective, { optional: true });\r\n private readonly _parentForm = inject(NgForm, { optional: true });\r\n private readonly _changeDetectorRef = inject(ChangeDetectorRef);\r\n readonly texts = inject(NgxTexts).texts;\r\n\r\n // ─── Inputs ────────────────────────────────────────────────────────────────\r\n /** Label that floats on the form field */\r\n readonly label = input.required<string>();\r\n /** Title shown in the bottom sheet header */\r\n readonly title = input<string>('');\r\n /** Endpoint to fetch paginated data */\r\n readonly endpoint = input.required<(filters: U) => Observable<PaginatedItems<T>>>();\r\n /** Config for display and value binding */\r\n readonly config = input.required<PaginatedSelectConfig<T>>();\r\n /** Writable signal with the current filter state */\r\n readonly filters = input<WritableSignal<U>>(\r\n signal<U>({\r\n pageNumber: 1,\r\n pageSize: 25,\r\n query: undefined,\r\n sortBy: undefined,\r\n } as U)\r\n );\r\n /** Pre-selected items — accepts full objects OR partials with only the valueKey set */\r\n readonly selectedItems = input<Partial<T>[]>([]);\r\n /** Allow selecting multiple items */\r\n readonly multiple = input(false, { transform: booleanAttribute });\r\n /** Whether the component is disabled */\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n /** Show a clear button when items are selected */\r\n readonly clearable = input(false, { transform: booleanAttribute });\r\n /**\r\n * Controls how selected items are shown in the trigger:\r\n * - 'chips': a chip per selected item (default when multiple=true)\r\n * - 'text': a single comma-joined text line\r\n */\r\n readonly displayMode = input<'chips' | 'text'>('chips');\r\n /** Whether to show the search input inside the bottom sheet */\r\n readonly showSearch = input(true, { transform: booleanAttribute });\r\n /** Placeholder for the search input inside the bottom sheet (defaults to the library texts) */\r\n readonly searchPlaceholder = input<string>();\r\n /** Message when no results are found (defaults to the library texts) */\r\n readonly noResultsMessage = input<string>();\r\n /** Label for the confirm button (multiple mode, defaults to intl) */\r\n readonly confirmLabel = input<string>();\r\n /** Label for the reset button (multiple mode, defaults to intl) */\r\n readonly resetLabel = input<string>();\r\n /** Controls how the subscript wrapper (hint/error) reserves space */\r\n readonly subscriptSizing = input<SubscriptSizing>('fixed');\r\n /** Error message rendered inside mat-error */\r\n readonly error = input<string>('');\r\n /** Hint message rendered inside mat-hint */\r\n readonly hint = input<string>('');\r\n /** Custom template for each option row inside the bottom sheet */\r\n readonly optionTemplate = input<TemplateRef<{ $implicit: T }> | null>(null);\r\n /**\r\n * Optional template projected into the bottom sheet header (e.g. toggle filters).\r\n * Pass an `ng-template` reference from the consumer: `[extraFiltersTemplate]=\"myTpl\"`\r\n */\r\n readonly extraFiltersTemplate = input<TemplateRef<void> | null>(null);\r\n\r\n /** Maximum number of chips to display before showing \"+N more\" */\r\n readonly maxChipsDisplayed = input(5);\r\n /** Layout direction for chips in the trigger: 'row' (horizontal wrap) or 'column' (vertical stack) */\r\n readonly chipsDirection = input<'row' | 'column'>('column');\r\n /** Whether to show a \"Select all\" toggle in the bottom sheet (multiple mode) */\r\n readonly showSelectAll = input(false, { transform: booleanAttribute });\r\n /** Label for the select all toggle (defaults to the library texts) */\r\n readonly selectAllLabel = input<string>();\r\n\r\n // ─── Outputs ───────────────────────────────────────────────────────────────\r\n /** Emits the full T object (single) or T[] (multiple) when selection changes */\r\n readonly valueChange = output<Partial<T> | Partial<T>[] | undefined>();\r\n /** Emits the raw array of selected items (may be partial if never confirmed) */\r\n readonly selectionChange = output<Partial<T>[]>();\r\n\r\n // ─── Internal state ────────────────────────────────────────────────────────\r\n protected readonly _selectedItems = signal<Partial<T>[]>([]);\r\n private readonly _cvaDisabled = signal(false);\r\n protected readonly _isOpen = signal(false);\r\n\r\n /**\r\n * Control interno que gobierna el estado visual del mat-form-field.\r\n * MatInput y MatChipGrid solo reevaluan su errorState (en ngDoCheck) si\r\n * tienen un NgControl asociado; sin el, el campo nunca se pintaba en rojo\r\n * aunque el control real del formulario fuese invalido. El valor real sigue\r\n * viviendo en el CVA: este control solo refleja la etiqueta visible.\r\n */\r\n protected readonly innerControl = new FormControl<string>('');\r\n\r\n private onChange: (value: T[keyof T] | T[keyof T][] | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n /** Evita re-emitir onChange cuando el cambio viene del formulario (writeValue). */\r\n private _suppressEmit = false;\r\n /** Huella de la última selección aplicada desde el input `selectedItems`. */\r\n private _lastSyncedSelection: string | null = null;\r\n\r\n // ─── Computed ──────────────────────────────────────────────────────────────\r\n protected readonly isDisabled = computed(() => this.disabled() || this._cvaDisabled());\r\n\r\n protected readonly selectedLabel = computed(() => {\r\n const items = this._selectedItems();\r\n if (items.length === 0) return '';\r\n return items.map(i => this.getLabel(i)).join(', ');\r\n });\r\n\r\n protected readonly hasSelection = computed(() => this._selectedItems().length > 0);\r\n\r\n protected readonly showChips = computed(() => this.multiple() && this.displayMode() === 'chips');\r\n\r\n protected readonly displayedChips = computed(() =>\r\n this._selectedItems().slice(0, this.maxChipsDisplayed())\r\n );\r\n\r\n protected readonly remainingChipsCount = computed(() =>\r\n Math.max(0, this._selectedItems().length - this.maxChipsDisplayed())\r\n );\r\n\r\n /** ErrorStateMatcher que refleja el estado del control del formulario. */\r\n protected readonly errorStateMatcher: ErrorStateMatcher = {\r\n isErrorState: () =>\r\n !!(this._ngControl?.invalid && (this._ngControl?.touched || this._isParentFormSubmitted())),\r\n };\r\n\r\n /** true cuando el formulario contenedor ya ha intentado enviarse. */\r\n private _isParentFormSubmitted(): boolean {\r\n return this._parentFormGroup?.submitted || this._parentForm?.submitted || false;\r\n }\r\n\r\n /**\r\n * Obligatorio si el control del formulario tiene el validador `required`.\r\n * Se propaga al input interno para que el mat-form-field pinte el asterisco,\r\n * igual que hace Material con un `<input matInput>` normal.\r\n */\r\n protected isRequired(): boolean {\r\n return this._ngControl?.control?.hasValidator(Validators.required) ?? false;\r\n }\r\n\r\n // Etiquetas efectivas (override por input o valor por defecto de NgxTexts)\r\n protected readonly effectiveSearchPlaceholder = computed(() => this.searchPlaceholder() ?? this.texts().common.search);\r\n protected readonly effectiveNoResults = computed(() => this.noResultsMessage() ?? this.texts().select.noResults);\r\n protected readonly effectiveConfirmLabel = computed(() => this.confirmLabel() ?? this.texts().paginatedSelect.confirm);\r\n protected readonly effectiveResetLabel = computed(() => this.resetLabel() ?? this.texts().paginatedSelect.reset);\r\n protected readonly effectiveSelectAllLabel = computed(() => this.selectAllLabel() ?? this.texts().paginatedSelect.selectAll);\r\n\r\n constructor() {\r\n if (this._ngControl)\r\n this._ngControl.valueAccessor = this;\r\n\r\n // Sync selectedItems input → estado interno (solo si el contenido cambia de verdad;\r\n // un literal `[...]` recreado en cada CD no debe borrar la selección del usuario).\r\n effect(() => {\r\n const incoming = this.selectedItems();\r\n const key = this.config().valueKey as keyof T;\r\n const fingerprint = JSON.stringify(incoming.map(item => item?.[key]));\r\n\r\n if (fingerprint === this._lastSyncedSelection)\r\n return;\r\n\r\n this._lastSyncedSelection = fingerprint;\r\n this._selectedItems.set(incoming);\r\n });\r\n\r\n // Estado interno → formulario + outputs (se omite cuando el cambio viene de writeValue).\r\n effect(() => {\r\n const items = this._selectedItems();\r\n if (this._suppressEmit) {\r\n this._suppressEmit = false;\r\n return;\r\n }\r\n untracked(() => this.emitChange(items));\r\n });\r\n\r\n /**\r\n * `submitted` del formulario padre es una propiedad normal, no una senal:\r\n * al enviar, nada marca este componente (OnPush) para revision, asi que el\r\n * control interno no reevaluaba su errorStateMatcher y el campo no se\r\n * pintaba en rojo. Al enviarse el formulario se fuerza la revision.\r\n */\r\n const parentSubmit = this._parentFormGroup?.ngSubmit ?? this._parentForm?.ngSubmit;\r\n parentSubmit?.pipe(takeUntilDestroyed()).subscribe(() => {\r\n this.innerControl.markAsTouched();\r\n this._changeDetectorRef.markForCheck();\r\n });\r\n\r\n // El control interno solo refleja la etiqueta visible y el estado deshabilitado.\r\n effect(() => {\r\n const label = this.selectedLabel();\r\n if (this.innerControl.value !== label)\r\n this.innerControl.setValue(label, { emitEvent: false });\r\n });\r\n\r\n effect(() => {\r\n const disabled = this.isDisabled();\r\n if (disabled && this.innerControl.enabled)\r\n this.innerControl.disable({ emitEvent: false });\r\n else if (!disabled && this.innerControl.disabled)\r\n this.innerControl.enable({ emitEvent: false });\r\n });\r\n }\r\n\r\n // ─── ControlValueAccessor ───────────────────────────────────────────────────\r\n writeValue(value: T[keyof T] | T[keyof T][] | null): void {\r\n const key = this.config().valueKey as keyof T;\r\n const keys = this.keysFromValue(value);\r\n const currentKeys = this._selectedItems().map(i => i[key]);\r\n\r\n // Mismo conjunto de claves → no tocamos el estado (conserva objetos enriquecidos).\r\n if (this.sameKeySet(keys, currentKeys))\r\n return;\r\n\r\n this._suppressEmit = true;\r\n this.applyValueFromKeys(keys);\r\n }\r\n\r\n registerOnChange(fn: (value: T[keyof T] | T[keyof T][] | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this._cvaDisabled.set(isDisabled);\r\n }\r\n\r\n // ─── Helpers de valor ───────────────────────────────────────────────────────\r\n private keysFromValue(value: T[keyof T] | T[keyof T][] | null): T[keyof T][] {\r\n if (value == null) return [];\r\n return Array.isArray(value) ? value : [value];\r\n }\r\n\r\n private applyValueFromKeys(keys: T[keyof T][]): void {\r\n const key = this.config().valueKey as keyof T;\r\n // Se conservan los objetos completos ya conocidos para no perder las etiquetas.\r\n const known = new Map(this._selectedItems().map(i => [i[key], i] as const));\r\n this._selectedItems.set(keys.map(k => known.get(k) ?? ({ [key]: k } as Partial<T>)));\r\n }\r\n\r\n private sameKeySet(a: T[keyof T][], b: (T[keyof T] | undefined)[]): boolean {\r\n if (a.length !== b.length) return false;\r\n const set = new Set(b);\r\n return a.every(k => set.has(k));\r\n }\r\n\r\n private emitChange(items: Partial<T>[]): void {\r\n const key = this.config().valueKey as keyof T;\r\n // Se descartan items sin valueKey (meterían undefined → null en el payload).\r\n const validItems = items.filter(i => i != null && i[key] != null);\r\n\r\n if (this.multiple()) {\r\n // null en vez de [] para que Validators.required marque vacío correctamente\r\n this.onChange(validItems.length > 0 ? validItems.map(i => i[key] as T[keyof T]) : null);\r\n this.valueChange.emit(validItems);\r\n } else {\r\n this.onChange((validItems[0]?.[key] as T[keyof T]) ?? null);\r\n this.valueChange.emit(validItems[0]);\r\n }\r\n this.selectionChange.emit(validItems);\r\n }\r\n\r\n /**\r\n * Safe label resolver: tries `displayedLabel(item)`, falls back to\r\n * `String(item[valueKey])` so partial objects never throw.\r\n */\r\n protected getLabel(item: Partial<T>): string {\r\n const cfg = this.config();\r\n const keyVal = String(item[cfg.valueKey as keyof T] ?? '');\r\n if (!cfg.displayedLabel) return keyVal;\r\n try {\r\n return cfg.displayedLabel(item as T) ?? keyVal;\r\n } catch {\r\n return keyVal;\r\n }\r\n }\r\n\r\n // ─── Bottom sheet ──────────────────────────────────────────────────────────\r\n openBottomSheet(event: Event): void {\r\n event.stopPropagation();\r\n\r\n if (this.isDisabled()) return;\r\n\r\n this.onTouched();\r\n this._ngControl?.control?.markAsTouched();\r\n this._isOpen.set(true);\r\n\r\n const filtersSignal = this.filters();\r\n filtersSignal.update(f => ({ ...f, pageNumber: 1 }));\r\n\r\n const data: NgxPaginatedSelectBottomSheetData<T, U> = {\r\n title: this.title() || this.label(),\r\n config: this.config(),\r\n endpoint: this.endpoint(),\r\n filters: filtersSignal,\r\n selectedItems: [...this._selectedItems()],\r\n multiple: this.multiple(),\r\n showSearch: this.showSearch(),\r\n searchPlaceholder: this.effectiveSearchPlaceholder(),\r\n noResultsMessage: this.effectiveNoResults(),\r\n confirmLabel: this.effectiveConfirmLabel(),\r\n resetLabel: this.effectiveResetLabel(),\r\n optionTemplate: this.optionTemplate(),\r\n extraFiltersTemplate: this.extraFiltersTemplate(),\r\n showSelectAll: this.showSelectAll(),\r\n selectAllLabel: this.effectiveSelectAllLabel(),\r\n };\r\n\r\n this._bottomSheet\r\n .open<NgxPaginatedSelectBottomSheetComponent<T, U>, typeof data, Partial<T>[] | undefined>(\r\n NgxPaginatedSelectBottomSheetComponent,\r\n {\r\n data,\r\n panelClass: 'ngx-paginated-select-panel',\r\n backdropClass: 'ngx-paginated-select-backdrop',\r\n autoFocus: data.showSearch ? '.ps-bs__search-input' : 'first-tabbable',\r\n }\r\n )\r\n .afterDismissed()\r\n .subscribe(result => {\r\n this._isOpen.set(false);\r\n if (result !== undefined) {\r\n this._selectedItems.set(result);\r\n }\r\n this.onTouched();\r\n this._ngControl?.control?.markAsTouched();\r\n });\r\n }\r\n\r\n /** Abrir el bottom sheet desde el teclado (Enter / Espacio / flecha abajo). */\r\n onTriggerKeydown(event: KeyboardEvent): void {\r\n if (this.isDisabled()) return;\r\n if (event.key === 'Enter' || event.key === ' ' || event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n this.openBottomSheet(event);\r\n }\r\n }\r\n\r\n // ─── Chip actions ──────────────────────────────────────────────────────────\r\n // La propagación del click de la \"x\" se detiene en la plantilla para que no\r\n // burbujee al form-field y abra el bottom sheet.\r\n removeChip(item: Partial<T>, _event: MatChipEvent): void {\r\n const key = this.config().valueKey as keyof T;\r\n this._selectedItems.update(items => items.filter(i => i[key] !== item[key]));\r\n this.onTouched();\r\n this._ngControl?.control?.markAsTouched();\r\n }\r\n\r\n clearSelection(event: Event): void {\r\n event.stopPropagation();\r\n this._selectedItems.set([]);\r\n this.onTouched();\r\n this._ngControl?.control?.markAsTouched();\r\n }\r\n}\r\n","<!-- ── Chips mode (multiple + displayMode = 'chips') ─────────────────────── -->\r\n@if (showChips()) {\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n [subscriptSizing]=\"subscriptSizing()\"\r\n class=\"ps-trigger\"\r\n [class.ps-trigger--disabled]=\"isDisabled()\"\r\n [class.ps-trigger--open]=\"_isOpen()\"\r\n [class.ps-trigger--row]=\"chipsDirection() === 'row'\"\r\n (click)=\"openBottomSheet($event)\"\r\n >\r\n <mat-label>{{ label() }}</mat-label>\r\n\r\n <mat-chip-grid\r\n #chipGrid\r\n class=\"ps-trigger__chip-grid\"\r\n [class.ps-trigger__chip-grid--column]=\"chipsDirection() === 'column'\"\r\n [formControl]=\"innerControl\"\r\n [errorStateMatcher]=\"errorStateMatcher\"\r\n [required]=\"isRequired()\"\r\n >\r\n @for (item of displayedChips(); track item[config().valueKey]) {\r\n <mat-chip-row\r\n class=\"ps-trigger__chip\"\r\n [value]=\"item[config().valueKey]\"\r\n [disabled]=\"isDisabled()\"\r\n (removed)=\"removeChip(item, $event)\"\r\n >\r\n {{ getLabel(item) }}\r\n <button matChipRemove [disabled]=\"isDisabled()\" (click)=\"$event.stopPropagation()\">\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip-row>\r\n }\r\n </mat-chip-grid>\r\n\r\n @if (remainingChipsCount() > 0) {\r\n <span class=\"ps-trigger__remaining\">+{{ remainingChipsCount() }}</span>\r\n }\r\n\r\n <!-- Hidden input required for mat-chip-grid; también da foco de teclado al trigger -->\r\n <input\r\n matInput\r\n [matChipInputFor]=\"chipGrid\"\r\n class=\"ps-trigger__kbd-input\"\r\n [required]=\"isRequired()\"\r\n readonly\r\n role=\"combobox\"\r\n [attr.aria-haspopup]=\"'dialog'\"\r\n [attr.aria-expanded]=\"_isOpen()\"\r\n [attr.aria-label]=\"label()\"\r\n (keydown)=\"onTriggerKeydown($event)\"\r\n />\r\n\r\n <div matSuffix class=\"ps-trigger__suffix\">\r\n @if (clearable() && hasSelection() && !isDisabled()) {\r\n <button matIconButton matSuffix [attr.aria-label]=\"texts().common.clearSearch\" (click)=\"clearSelection($event)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <mat-icon [class.ps-trigger__arrow--open]=\"_isOpen()\">arrow_drop_down</mat-icon>\r\n </div>\r\n\r\n @if (error()) {\r\n <mat-error>{{ error() }}</mat-error>\r\n }\r\n @if (hint()) {\r\n <mat-hint>{{ hint() }}</mat-hint>\r\n }\r\n </mat-form-field>\r\n}\r\n\r\n<!-- ── Text mode (single or multiple + displayMode = 'text') ─────────────── -->\r\n@if (!showChips()) {\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n [subscriptSizing]=\"subscriptSizing()\"\r\n class=\"ps-trigger\"\r\n [class.ps-trigger--disabled]=\"isDisabled()\"\r\n [class.ps-trigger--open]=\"_isOpen()\"\r\n (click)=\"openBottomSheet($event)\"\r\n >\r\n <mat-label>{{ label() }}</mat-label>\r\n\r\n <input\r\n matInput\r\n class=\"ps-trigger__input\"\r\n [required]=\"isRequired()\"\r\n readonly\r\n role=\"combobox\"\r\n [attr.aria-haspopup]=\"'dialog'\"\r\n [attr.aria-expanded]=\"_isOpen()\"\r\n [formControl]=\"innerControl\"\r\n [errorStateMatcher]=\"errorStateMatcher\"\r\n (keydown)=\"onTriggerKeydown($event)\"\r\n />\r\n\r\n <div matSuffix class=\"ps-trigger__suffix\">\r\n @if (clearable() && hasSelection() && !isDisabled()) {\r\n <button matIconButton matSuffix [attr.aria-label]=\"texts().common.clearSearch\" (click)=\"clearSelection($event)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <mat-icon [class.ps-trigger__arrow--open]=\"_isOpen()\">arrow_drop_down</mat-icon>\r\n </div>\r\n\r\n @if (error()) {\r\n <mat-error>{{ error() }}</mat-error>\r\n }\r\n @if (hint()) {\r\n <mat-hint>{{ hint() }}</mat-hint>\r\n }\r\n </mat-form-field>\r\n}\r\n","import { booleanAttribute, ChangeDetectionStrategy, Component, computed, inject, input, numberAttribute } from '@angular/core';\r\nimport { SkeletonAnimation, SkeletonVariant } from '../../models';\r\nimport { NgxTexts } from '../../i18n';\r\n\r\nconst UNITLESS_NUMBER = /^-?\\d+(\\.\\d+)?$/;\r\n\r\n/**\r\n * Convierte un tamaño a CSS: un número, o un texto que solo es un número (`height=\"56\"`\r\n * en un atributo estático), se interpreta como píxeles.\r\n */\r\nfunction toCssSize(value: string | number): string {\r\n if (typeof value === 'number') return `${value}px`;\r\n const trimmed = value.trim();\r\n return UNITLESS_NUMBER.test(trimmed) ? `${trimmed}px` : trimmed;\r\n}\r\n\r\nfunction toOptionalCssSize(value: string | number | null | undefined): string | null {\r\n return value === null || value === undefined || value === '' ? null : toCssSize(value);\r\n}\r\n\r\n@Component({\r\n selector: 'ngx-skeleton',\r\n templateUrl: './ngx-skeleton.component.html',\r\n styleUrl: './ngx-skeleton.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n '[attr.role]': 'decorative() ? null : \"status\"',\r\n '[attr.aria-label]': 'decorative() ? null : resolvedAriaLabel()',\r\n '[attr.aria-busy]': 'decorative() ? null : \"true\"',\r\n '[attr.aria-hidden]': 'decorative() ? \"true\" : null',\r\n '[style.--ngx-skeleton-duration]': 'animationDuration() ?? null',\r\n },\r\n})\r\nexport class NgxSkeleton {\r\n private readonly _texts = inject(NgxTexts).texts;\r\n\r\n /** Forma: text (barras de texto), circle, rect o rounded (rectángulo redondeado). */\r\n readonly variant = input<SkeletonVariant>('rect');\r\n\r\n /** Ancho. Cualquier valor CSS; un número se interpreta como px. Se ignora en `circle`. */\r\n readonly width = input<string, string | number>('100%', { transform: toCssSize });\r\n\r\n /** Alto. Cualquier valor CSS; un número se interpreta como px. En `circle` también es el diámetro. */\r\n readonly height = input<string, string | number>('1rem', { transform: toCssSize });\r\n\r\n /** Número de líneas. Solo aplica con `variant=\"text\"`. */\r\n readonly lines = input(1, { transform: numberAttribute });\r\n\r\n /** Separación vertical entre líneas de texto. */\r\n readonly lineSpacing = input<string, string | number>('0.5rem', { transform: toCssSize });\r\n\r\n /** Ancho de la última línea, para que el párrafo parezca real. Solo con varias líneas. */\r\n readonly lastLineWidth = input<string, string | number>('70%', { transform: toCssSize });\r\n\r\n /** Animación: shimmer (brillo que se desliza), pulse (opacidad) o none. */\r\n readonly animation = input<SkeletonAnimation>('shimmer');\r\n\r\n /**\r\n * Duración de un ciclo de animación (cualquier tiempo CSS). Por defecto 1.5s, o el valor\r\n * de la variable CSS `--ngx-skeleton-duration` si el consumidor la define.\r\n */\r\n readonly animationDuration = input<string>();\r\n\r\n /** Sustituye el border-radius que corresponde a la variante. */\r\n readonly borderRadius = input<string | null, string | number | null | undefined>(null, { transform: toOptionalCssSize });\r\n\r\n /** Etiqueta accesible. Por defecto, el texto `skeleton.loading` de la librería. */\r\n readonly ariaLabel = input<string>();\r\n\r\n /**\r\n * Oculta el skeleton a lectores de pantalla (sin role ni etiqueta). Úsalo cuando varios\r\n * skeletons forman una misma pieza: márcalos todos como decorativos y anuncia la carga\r\n * una sola vez en el contenedor (p. ej. con `aria-busy` o un skeleton sin `decorative`).\r\n */\r\n readonly decorative = input(false, { transform: booleanAttribute });\r\n\r\n protected readonly resolvedAriaLabel = computed(() => {\r\n return this.ariaLabel() ?? this._texts().skeleton.loading;\r\n });\r\n\r\n /** Una entrada por línea a pintar (siempre al menos una). */\r\n protected readonly lineIndices = computed(() => {\r\n const count = this.variant() === 'text' ? Math.max(1, Math.floor(this.lines())) : 1;\r\n return Array.from({ length: count }, (_, i) => i);\r\n });\r\n\r\n protected readonly isMultiLine = computed(() => this.lineIndices().length > 1);\r\n\r\n /** border-radius de la variante, salvo que se indique `borderRadius`. */\r\n protected readonly computedBorderRadius = computed(() => {\r\n const override = this.borderRadius();\r\n if (override !== null) return override;\r\n\r\n switch (this.variant()) {\r\n case 'text': return '4px';\r\n case 'circle': return '50%';\r\n case 'rounded': return '12px';\r\n case 'rect':\r\n default: return '0';\r\n }\r\n });\r\n\r\n /** En `circle` el ancho es el alto, para que sea un círculo perfecto. */\r\n protected readonly computedWidth = computed(() => this.variant() === 'circle' ? this.height() : this.width());\r\n}\r\n","<div class=\"ngx-skeleton-lines\" [style.gap]=\"isMultiLine() ? lineSpacing() : null\">\n @for (i of lineIndices(); track i; let last = $last) {\n <div\n class=\"ngx-skeleton-bone\"\n [class.ngx-skeleton-shimmer]=\"animation() === 'shimmer'\"\n [class.ngx-skeleton-pulse]=\"animation() === 'pulse'\"\n [style.width]=\"isMultiLine() && last ? lastLineWidth() : computedWidth()\"\n [style.height]=\"height()\"\n [style.border-radius]=\"computedBorderRadius()\"\n ></div>\n }\n</div>\n","import {\n AfterViewInit,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n DoCheck,\n effect,\n ElementRef,\n inject,\n input,\n LOCALE_ID,\n model,\n output,\n PLATFORM_ID,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n AbstractControl,\n ControlValueAccessor,\n FormGroupDirective,\n NgControl,\n NgForm,\n Validators,\n} from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { EMPTY, merge, Observable, Subscription } from 'rxjs';\nimport { NgxTexts } from '../../i18n';\nimport { NgxFileError, NgxFileErrorCode, NgxFileInputVariant, NgxFileItem } from '../../models/file-input-types';\nimport { fileIcon, fileKind, formatFileSize, isSameFile, matchesAccept, parseAccept } from '../shared/file-utils';\n\nlet nextId = 0;\n\n/** Entrada interna de la lista: el fichero y, si se rechazó, el motivo (el mensaje se traduce al pintarlo). */\ninterface Entry {\n item: NgxFileItem;\n code?: NgxFileErrorCode;\n}\n\n/**\n * Zona para soltar o seleccionar ficheros, con lista de ficheros y previsualización de imágenes.\n * Se usa con `formControlName` / `[formControl]` / `ngModel` (valor: los `File[]` válidos) o con `[(files)]`.\n */\n@Component({\n selector: 'ngx-file-input',\n imports: [MatButtonModule, MatIconModule, MatTooltipModule],\n templateUrl: './ngx-file-input.component.html',\n styleUrl: './ngx-file-input.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'ngx-file-input',\n '[class.ngx-fi--default]': \"variant() === 'default'\",\n '[class.ngx-fi--compact]': \"variant() === 'compact'\",\n '[class.ngx-fi--button]': \"variant() === 'button'\",\n '[class.ngx-fi--disabled]': 'isDisabled()',\n '[class.ngx-fi--dragover]': 'isDragOver()',\n '[class.ngx-fi--invalid]': 'showError()',\n '(dragover)': 'onDragOver($event)',\n '(dragleave)': 'onDragLeave($event)',\n '(drop)': 'onDrop($event)',\n },\n})\nexport class NgxFileInput implements ControlValueAccessor, AfterViewInit, DoCheck {\n // Se registra como value accessor a mano para poder leer el control (obligatorio y error), como ngx-input-file\n private readonly _ngControl = inject(NgControl, { self: true, optional: true });\n private readonly _parentForm = inject(FormGroupDirective, { optional: true }) ?? inject(NgForm, { optional: true });\n private readonly _host: ElementRef<HTMLElement> = inject(ElementRef);\n private readonly _locale = inject(LOCALE_ID);\n private readonly _isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private readonly _nativeInput = viewChild.required<ElementRef<HTMLInputElement>>('nativeInput');\n protected readonly texts = inject(NgxTexts).texts;\n\n // ── Inputs ──────────────────────────────────────────────────────────────────\n\n /** Tipos admitidos: extensiones (`.pdf`), MIME (`application/pdf`) o comodines (`image/*`). `'*'` = cualquiera. */\n readonly accept = input<string | string[]>('*');\n /** Admite varios ficheros: cada selección se añade a la anterior. */\n readonly multiple = input(false, { transform: booleanAttribute });\n /** Tamaño máximo por fichero, en bytes. `null` = sin límite. */\n readonly maxSize = input<number | null>(null);\n /** Número máximo de ficheros válidos (con `multiple`). `null` = sin límite. */\n readonly maxFiles = input<number | null>(null);\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Texto principal. Por defecto, el texto `fileInput.dropLabel` de la librería. */\n readonly label = input<string>();\n /** Texto secundario (formatos, tamaños…). */\n readonly hint = input<string | null>(null);\n /** Mensaje de error. Se ve cuando el control es inválido y está tocado o el formulario se ha enviado. */\n readonly error = input<string>('');\n /** Muestra la lista de ficheros (con miniatura de las imágenes). */\n readonly showPreview = input(true, { transform: booleanAttribute });\n /** `'default'` (zona grande), `'compact'` (barra horizontal) o `'button'` (solo un botón). */\n readonly variant = input<NgxFileInputVariant>('default');\n\n /** Ficheros válidos seleccionados. Admite `[(files)]` para usarlo sin formularios. */\n readonly files = model<File[]>([]);\n\n // ── Outputs ─────────────────────────────────────────────────────────────────\n\n /** Ficheros válidos añadidos en una selección o al soltar. */\n readonly filesSelected = output<NgxFileItem[]>();\n /** Fichero quitado de la lista (válido o rechazado). */\n readonly fileRemoved = output<NgxFileItem>();\n /** Un fichero rechazado (tipo, tamaño o número). */\n readonly validationError = output<NgxFileError>();\n\n // ── Estado ──────────────────────────────────────────────────────────────────\n\n protected readonly id = `ngx-fi-${nextId++}`;\n private readonly _entries = signal<Entry[]>([]);\n private readonly _cvaDisabled = signal(false);\n /** Deshabilitado por el input `disabled` o por el control del formulario. */\n readonly isDisabled = computed(() => this.disabled() || this._cvaDisabled());\n protected readonly isDragOver = signal(false);\n protected readonly showDropConfirm = signal(false);\n protected readonly announcement = signal('');\n protected readonly isRequired = signal(false);\n protected readonly showError = signal(false);\n\n protected readonly resolvedLabel = computed(() => this.label() ?? this.texts().fileInput.dropLabel);\n protected readonly acceptAttr = computed(() => parseAccept(this.accept()).join(','));\n protected readonly describedBy = computed(() =>\n [this.hint() ? `${this.id}-hint` : '', this.showError() && this.error() ? `${this.id}-error` : ''].filter(Boolean).join(' ') || null\n );\n /** Lo que pinta la lista: icono, color, tamaño legible y mensaje de error ya traducido. */\n protected readonly views = computed(() =>\n this._entries().map(({ item, code }) => ({\n item,\n icon: fileIcon(item.file),\n kind: fileKind(item.file),\n size: formatFileSize(item.size, this._locale),\n error: code ? this._message(item.file, code) : null,\n }))\n );\n\n private _onChange: (files: File[]) => void = () => {};\n private _onTouched: () => void = () => {};\n private _controlSub?: Subscription;\n private _confirmTimer?: ReturnType<typeof setTimeout>;\n\n constructor() {\n if (this._ngControl) this._ngControl.valueAccessor = this;\n\n // [files] o [(files)] desde fuera: reconstruye la lista si no coincide con los válidos actuales\n effect(() => {\n const files = this.files();\n untracked(() => {\n const valid = this._validFiles();\n if (files.length !== valid.length || files.some((file, i) => file !== valid[i])) this._resetFrom(files);\n });\n });\n\n inject(DestroyRef).onDestroy(() => {\n this._controlSub?.unsubscribe();\n clearTimeout(this._confirmTimer);\n this._entries().forEach(({ item }) => this._revokePreview(item));\n });\n }\n\n ngAfterViewInit(): void {\n // formControlName asigna su control después de registerOnChange: aquí ya está\n if (this._ngControl?.control) this._bindControl(this._ngControl.control);\n }\n\n ngDoCheck(): void {\n // resetForm quita el «enviado» sin emitir evento: se recalcula en cada comprobación\n this._syncFormState();\n }\n\n // ── API pública ─────────────────────────────────────────────────────────────\n\n /** Abre el selector de ficheros del sistema (no hace nada si está deshabilitado). */\n openFilePicker(): void {\n if (!this.isDisabled()) this._nativeInput().nativeElement.click();\n }\n\n /** Quita un fichero de la lista, válido o rechazado. */\n removeFile(item: NgxFileItem): void {\n const entry = this._entries().find(e => e.item.id === item.id);\n if (!entry) return;\n this._revokePreview(item);\n this._entries.update(list => list.filter(e => e !== entry));\n this.fileRemoved.emit(item);\n this.announcement.set(this.texts().fileInput.removed(item.name));\n if (!entry.code) this._commit();\n }\n\n // ── Eventos de la plantilla ─────────────────────────────────────────────────\n\n protected onZoneKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.openFilePicker();\n }\n }\n\n protected onZoneBlur(): void {\n // Al abrir el diálogo del sistema la ventana pierde el foco: eso no cuenta como salir del campo\n if (typeof document !== 'undefined' && document.hasFocus()) this._markTouched();\n }\n\n protected onNativeChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n this._addFiles(Array.from(input.files ?? []));\n input.value = '';\n }\n\n protected onDragOver(event: DragEvent): void {\n // Siempre: si no, el navegador abre el fichero al soltarlo\n event.preventDefault();\n if (event.dataTransfer) event.dataTransfer.dropEffect = this.isDisabled() ? 'none' : 'copy';\n if (!this.isDisabled()) this.isDragOver.set(true);\n }\n\n protected onDragLeave(event: DragEvent): void {\n // dragleave también salta al pasar por encima de un hijo: solo cuenta si sale del componente\n if (!this._host.nativeElement.contains(event.relatedTarget as Node | null)) this.isDragOver.set(false);\n }\n\n protected onDrop(event: DragEvent): void {\n event.preventDefault();\n this.isDragOver.set(false);\n if (this.isDisabled()) return;\n const files = Array.from(event.dataTransfer?.files ?? []);\n if (!files.length) return;\n this._addFiles(files);\n this._flashDropConfirm();\n }\n\n // ── ControlValueAccessor ────────────────────────────────────────────────────\n\n writeValue(files: File[] | null | undefined): void {\n this.files.set(Array.isArray(files) ? files : []);\n }\n\n registerOnChange(fn: (files: File[]) => void): void {\n this._onChange = fn;\n if (this._ngControl?.control) this._bindControl(this._ngControl.control);\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._cvaDisabled.set(isDisabled);\n }\n\n // ── Privado ─────────────────────────────────────────────────────────────────\n\n private _validFiles(): File[] {\n return this._entries().filter(e => !e.code).map(e => e.item.file);\n }\n\n private _addFiles(incoming: File[]): void {\n const patterns = parseAccept(this.accept());\n const maxSize = this.maxSize();\n const max = this.multiple() ? this.maxFiles() : 1;\n const current = this.multiple() ? this._entries() : [];\n let validCount = current.filter(e => !e.code).length;\n const added: Entry[] = [];\n\n for (const file of this.multiple() ? incoming : incoming.slice(0, 1)) {\n // Repetidos (ya en la lista o dos veces en la misma tanda): se ignoran\n if ([...current, ...added].some(e => isSameFile(e.item.file, file))) continue;\n\n let code: NgxFileErrorCode | undefined;\n if (!matchesAccept(file, patterns)) code = 'TYPE_NOT_ALLOWED';\n else if (maxSize != null && file.size > maxSize) code = 'SIZE_EXCEEDED';\n else if (max != null && validCount >= max) code = 'MAX_FILES_EXCEEDED';\n else validCount++;\n\n added.push({ item: this._toItem(file, code), code });\n }\n if (!added.length) return;\n\n if (!this.multiple()) this._entries().forEach(({ item }) => this._revokePreview(item));\n this._entries.set([...current, ...added]);\n\n const rejected = added.filter(e => e.code);\n for (const { item, code } of rejected) this.validationError.emit({ file: item.file, code: code!, message: item.error! });\n\n const valid = added.filter(e => !e.code).map(e => e.item);\n if (valid.length) {\n this.filesSelected.emit(valid);\n this.announcement.set(this.texts().fileInput.added(valid.length));\n } else {\n this.announcement.set(rejected.map(e => `${e.item.name}: ${e.item.error}`).join('. '));\n }\n\n this._commit();\n }\n\n /** Publica los ficheros válidos: model, formulario y estado de tocado. */\n private _commit(): void {\n const files = this._validFiles();\n this.files.set(files);\n this._onChange(files);\n this._markTouched();\n }\n\n /** Lista nueva a partir de un valor externo (writeValue o [files]); los rechazados se descartan. */\n private _resetFrom(files: File[]): void {\n const previous = this._entries();\n previous.filter(e => !files.includes(e.item.file)).forEach(({ item }) => this._revokePreview(item));\n this._entries.set(files.map(file => previous.find(e => e.item.file === file && !e.code) ?? { item: this._toItem(file) }));\n }\n\n private _toItem(file: File, code?: NgxFileErrorCode): NgxFileItem {\n const item: NgxFileItem = {\n file,\n id: `${this.id}-file-${nextId++}`,\n name: file.name,\n size: file.size,\n type: file.type,\n status: code ? 'error' : 'valid',\n };\n if (code) item.error = this._message(file, code);\n // URL temporal en vez de leer la imagen entera a base64; se libera al quitarla\n else if (this._isBrowser && file.type.startsWith('image/')) item.preview = URL.createObjectURL(file);\n return item;\n }\n\n private _revokePreview(item: NgxFileItem): void {\n if (item.preview?.startsWith('blob:')) URL.revokeObjectURL(item.preview);\n }\n\n private _message(file: File, code: NgxFileErrorCode): string {\n const texts = this.texts().fileInput;\n switch (code) {\n case 'TYPE_NOT_ALLOWED': {\n // La extensión («.exe») se entiende mejor que el MIME («application/x-msdownload»)\n const dot = file.name.lastIndexOf('.');\n return texts.typeNotAllowed(dot > 0 ? file.name.slice(dot).toLowerCase() : file.type || file.name);\n }\n case 'SIZE_EXCEEDED':\n return texts.tooLarge(formatFileSize(this.maxSize() ?? 0, this._locale));\n case 'MAX_FILES_EXCEEDED':\n return texts.maxFiles(this.maxFiles() ?? 1);\n }\n }\n\n private _bindControl(control: AbstractControl): void {\n this._controlSub?.unsubscribe();\n const submit$: Observable<unknown> = this._parentForm?.ngSubmit ?? EMPTY;\n this._controlSub = merge(control.events, submit$).subscribe(() => this._syncFormState());\n this._syncFormState();\n }\n\n private _syncFormState(): void {\n const control = this._ngControl?.control;\n // Signals con el mismo valor no repintan: se puede llamar en cada ngDoCheck\n this.isRequired.set(control?.hasValidator(Validators.required) ?? false);\n this.showError.set(!!control && control.invalid && (control.touched || !!this._parentForm?.submitted));\n }\n\n private _markTouched(): void {\n this._onTouched();\n this._syncFormState();\n }\n\n private _flashDropConfirm(): void {\n this.showDropConfirm.set(true);\n clearTimeout(this._confirmTimer);\n this._confirmTimer = setTimeout(() => this.showDropConfirm.set(false), 450);\n }\n}\n","<!-- Input nativo oculto: lo abre la zona o el botón -->\n<input\n #nativeInput\n class=\"ngx-fi__native\"\n type=\"file\"\n hidden\n tabindex=\"-1\"\n [accept]=\"acceptAttr()\"\n [multiple]=\"multiple()\"\n [disabled]=\"isDisabled()\"\n (change)=\"onNativeChange($event)\"\n (cancel)=\"onZoneBlur()\" />\n\n@switch (variant()) {\n @case ('button') {\n <button\n matButton=\"filled\"\n type=\"button\"\n class=\"ngx-fi__button\"\n [disabled]=\"isDisabled()\"\n [attr.aria-describedby]=\"describedBy()\"\n (click)=\"openFilePicker()\"\n (blur)=\"onZoneBlur()\">\n <mat-icon>attach_file</mat-icon>\n {{ resolvedLabel() }}@if (isRequired()) {<span class=\"ngx-fi__required\" aria-hidden=\"true\">*</span>}\n </button>\n @if (hint()) {\n <span class=\"ngx-fi__hint\" [id]=\"id + '-hint'\">{{ hint() }}</span>\n }\n }\n\n @default {\n <!-- Zona de arrastre: es un botón (abre el selector) con la etiqueta como nombre accesible -->\n <div\n class=\"ngx-fi__zone\"\n [class.ngx-fi__zone--compact]=\"variant() === 'compact'\"\n role=\"button\"\n [attr.tabindex]=\"isDisabled() ? -1 : 0\"\n [attr.aria-disabled]=\"isDisabled()\"\n [attr.aria-describedby]=\"describedBy()\"\n (click)=\"openFilePicker()\"\n (keydown)=\"onZoneKeydown($event)\"\n (blur)=\"onZoneBlur()\">\n <mat-icon class=\"ngx-fi__zone-icon\" aria-hidden=\"true\">cloud_upload</mat-icon>\n\n <span class=\"ngx-fi__zone-text\">\n <span class=\"ngx-fi__label\">\n {{ resolvedLabel() }}@if (isRequired()) {<span class=\"ngx-fi__required\" aria-hidden=\"true\">*</span>}\n </span>\n @if (hint()) {\n <span class=\"ngx-fi__hint\" [id]=\"id + '-hint'\">{{ hint() }}</span>\n }\n @if (variant() === 'default') {\n <span class=\"ngx-fi__browse\">{{ texts().fileInput.browse }}</span>\n }\n </span>\n\n @if (showDropConfirm()) {\n <span class=\"ngx-fi__confirm\" aria-hidden=\"true\"><mat-icon>check_circle</mat-icon></span>\n }\n </div>\n }\n}\n\n@if (showError() && error()) {\n <span class=\"ngx-fi__error\" [id]=\"id + '-error'\">{{ error() }}</span>\n}\n\n@if (showPreview() && views().length) {\n <ul class=\"ngx-fi__list\">\n @for (view of views(); track view.item.id) {\n <li class=\"ngx-fi__item\" [class.ngx-fi__item--error]=\"view.error\">\n <span class=\"ngx-fi__thumb\" [attr.data-kind]=\"view.kind\">\n @if (view.item.preview) {\n <img [src]=\"view.item.preview\" alt=\"\" />\n } @else {\n <mat-icon aria-hidden=\"true\">{{ view.icon }}</mat-icon>\n }\n </span>\n\n <span class=\"ngx-fi__info\">\n <span class=\"ngx-fi__name\" [title]=\"view.item.name\">{{ view.item.name }}</span>\n <span class=\"ngx-fi__meta\">\n {{ view.size }}\n @if (view.error) {\n <span class=\"ngx-fi__item-error\"><mat-icon aria-hidden=\"true\">error</mat-icon>{{ view.error }}</span>\n }\n </span>\n </span>\n\n <button\n matIconButton\n type=\"button\"\n class=\"ngx-fi__remove\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"texts().fileInput.remove(view.item.name)\"\n [matTooltip]=\"texts().fileInput.remove(view.item.name)\"\n (click)=\"removeFile(view.item)\">\n <mat-icon>close</mat-icon>\n </button>\n </li>\n }\n </ul>\n}\n\n<!-- Región viva fija: añadidos, quitados y rechazados -->\n<div class=\"ngx-fi__live\" aria-live=\"polite\">{{ announcement() }}</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i3","i5","i4","i7","uuidv4","i1","i6","i8","i9","i13"],"mappings":"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"}