@praxisui/files-upload 0.0.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"praxisui-files-upload.mjs","sources":["../../../projects/praxis-files-upload/src/lib/types/enums/ErrorCode.ts","../../../projects/praxis-files-upload/src/lib/types/enums/ScanStatus.ts","../../../projects/praxis-files-upload/src/lib/types/enums/BulkUploadResultStatus.ts","../../../projects/praxis-files-upload/src/lib/config/config.service.ts","../../../projects/praxis-files-upload/src/lib/config/use-effective-upload-config.ts","../../../projects/praxis-files-upload/src/lib/services/error-catalog.ts","../../../projects/praxis-files-upload/src/lib/config/praxis-files-upload-config-editor.ts","../../../projects/praxis-files-upload/src/lib/i18n/files-upload.i18n.ts","../../../projects/praxis-files-upload/src/lib/services/error-mapper.service.ts","../../../projects/praxis-files-upload/src/lib/validators/file-upload.validators.ts","../../../projects/praxis-files-upload/src/lib/services/drag-proximity.service.ts","../../../projects/praxis-files-upload/src/lib/services/files-api-client.service.ts","../../../projects/praxis-files-upload/src/lib/services/presigned-uploader.service.ts","../../../projects/praxis-files-upload/src/lib/components/files-upload/praxis-files-upload.component.ts","../../../projects/praxis-files-upload/src/lib/components/files-upload-field/pdx-files-upload-field.component.ts","../../../projects/praxis-files-upload/src/lib/i18n/files-upload.pt.ts","../../../projects/praxis-files-upload/src/lib/praxis-files-upload.metadata.ts","../../../projects/praxis-files-upload/src/lib/index.ts","../../../projects/praxis-files-upload/src/praxisui-files-upload.ts"],"sourcesContent":["export enum ErrorCode {\n INVALID_FILE_TYPE = 'INVALID_FILE_TYPE',\n FILE_TOO_LARGE = 'FILE_TOO_LARGE',\n NOT_FOUND = 'NOT_FOUND',\n UNAUTHORIZED = 'UNAUTHORIZED',\n RATE_LIMIT_EXCEEDED = 'RATE_LIMIT_EXCEEDED',\n INTERNAL_ERROR = 'INTERNAL_ERROR',\n QUOTA_EXCEEDED = 'QUOTA_EXCEEDED',\n SEC_VIRUS_DETECTED = 'SEC_VIRUS_DETECTED',\n SEC_MALICIOUS_CONTENT = 'SEC_MALICIOUS_CONTENT',\n SEC_DANGEROUS_TYPE = 'SEC_DANGEROUS_TYPE',\n FMT_MAGIC_MISMATCH = 'FMT_MAGIC_MISMATCH',\n FMT_CORRUPTED = 'FMT_CORRUPTED',\n FMT_UNSUPPORTED = 'FMT_UNSUPPORTED',\n SYS_STORAGE_ERROR = 'SYS_STORAGE_ERROR',\n SYS_SERVICE_DOWN = 'SYS_SERVICE_DOWN',\n SYS_RATE_LIMIT = 'SYS_RATE_LIMIT'\n}\n\n","export enum ScanStatus {\n PENDING = 'PENDING',\n SCANNING = 'SCANNING',\n CLEAN = 'CLEAN',\n INFECTED = 'INFECTED',\n FAILED = 'FAILED'\n}\n\n","/** Result status for each file in a bulk upload operation. */\nexport enum BulkUploadResultStatus {\n SUCCESS = 'SUCCESS',\n FAILED = 'FAILED'\n}\n\n","import { Injectable } from '@angular/core';\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { Observable, of, throwError } from 'rxjs';\nimport { map, catchError } from 'rxjs/operators';\nimport { EffectiveUploadConfig } from '../types/Config';\n\ninterface ResponseEnvelope<T> {\n success: boolean;\n timestamp: string;\n data: T;\n}\n\ninterface CacheEntry {\n etag?: string;\n timestamp: number;\n data: EffectiveUploadConfig;\n}\n\n/**\n * Service responsible for retrieving the effective upload configuration\n * from the backend and caching it for a short period (60s).\n */\n@Injectable({ providedIn: 'root' })\nexport class ConfigService {\n private cache = new Map<string, CacheEntry>();\n\n constructor(private http: HttpClient) {}\n\n private buildCacheKey(\n baseUrl: string,\n headers: Record<string, string>,\n ): string {\n const headerKey = JSON.stringify(headers);\n return `${baseUrl}|${headerKey}`;\n }\n\n /**\n * Fetches the effective configuration from the server.\n * @param baseUrl Base URL for the files API (default: `/api/files`).\n * @param headersProvider Optional callback providing additional headers such as tenant/user.\n */\n getEffectiveConfig(\n baseUrl = '/api/files',\n headersProvider?: () => Record<string, string>,\n ): Observable<EffectiveUploadConfig> {\n const now = Date.now();\n const headersObj = headersProvider ? headersProvider() : {};\n const key = this.buildCacheKey(baseUrl, headersObj);\n const entry = this.cache.get(key);\n\n if (entry && now - entry.timestamp < 60_000) {\n return of(entry.data);\n }\n\n const url = `${baseUrl}/config`;\n if (entry?.etag) {\n headersObj['If-None-Match'] = entry.etag;\n }\n const headers = new HttpHeaders(headersObj);\n\n return this.http\n .get<ResponseEnvelope<EffectiveUploadConfig>>(url, {\n observe: 'response',\n headers,\n })\n .pipe(\n map((resp) => {\n const etag = resp.headers.get('ETag') || undefined;\n if (resp.status === 304 && entry) {\n entry.timestamp = now;\n this.cache.set(key, entry);\n return entry.data;\n }\n const data = resp.body?.data as EffectiveUploadConfig;\n this.cache.set(key, { etag, data, timestamp: now });\n return data;\n }),\n catchError((err) => {\n // HttpClient trata 304 como erro; reaproveitamos cache existente\n if (err?.status === 304 && entry) {\n entry.timestamp = Date.now();\n this.cache.set(key, entry);\n return of(entry.data);\n }\n return throwError(() => err);\n }),\n );\n }\n}\n","import { inject, Signal, signal } from '@angular/core';\nimport { ConfigService } from './config.service';\nimport { EffectiveUploadConfig } from '../types/Config';\n\n/** State returned by {@link useEffectiveUploadConfig}. */\nexport interface EffectiveConfigState {\n loading: Signal<boolean>;\n data: Signal<EffectiveUploadConfig | undefined>;\n error: Signal<unknown | undefined>;\n context: Signal<Record<string, string> | undefined>;\n refetch: () => void;\n}\n\n/**\n * Angular composable that retrieves the effective upload configuration\n * and exposes reactive signals for template binding.\n */\nexport function useEffectiveUploadConfig(\n baseUrl?: string,\n headersProvider?: () => Record<string, string>,\n): EffectiveConfigState {\n const service = inject(ConfigService, { optional: true });\n const loading = signal<boolean>(!!service);\n const data = signal<EffectiveUploadConfig | undefined>(undefined);\n const error = signal<unknown | undefined>(undefined);\n const context = signal<Record<string, string> | undefined>(undefined);\n\n const fetch = () => {\n if (!service) {\n loading.set(false);\n return;\n }\n loading.set(true);\n const headers = headersProvider ? headersProvider() : undefined;\n context.set(headers);\n service\n .getEffectiveConfig(baseUrl, () => headers ?? {})\n .subscribe({\n next: (cfg) => {\n data.set(cfg);\n error.set(undefined);\n loading.set(false);\n },\n error: (err) => {\n error.set(err);\n loading.set(false);\n },\n });\n };\n\n if (service) fetch(); else loading.set(false);\n\n return { loading, data, error, context, refetch: fetch };\n}\n","// Catálogo central de erros e metadados de apresentação\nimport { ErrorCode } from '../types';\n\nexport type ErrorSeverity = 'info' | 'warn' | 'error';\nexport type ErrorCategory =\n | 'validacao'\n | 'seguranca'\n | 'armazenamento'\n | 'rede'\n | 'limites'\n | 'conflito'\n | 'config'\n | 'operacional';\nexport type ErrorPhase =\n | 'cliente'\n | 'pre-upload'\n | 'analise'\n | 'armazenamento'\n | 'pos-processo'\n | 'lote'\n | 'operacional';\n\nexport interface ErrorMeta {\n title: string;\n description?: string;\n userAction?: string;\n severity?: ErrorSeverity;\n category?: ErrorCategory;\n phase?: ErrorPhase;\n retriable?: boolean;\n docsLink?: string;\n}\n\n// Catálogo padrão por código (aceita string genérica para cobrir códigos não presentes no enum)\nconst DEFAULT_CATALOG: Record<string, ErrorMeta> = {\n [ErrorCode.FILE_TOO_LARGE]: {\n title: 'Arquivo muito grande',\n category: 'validacao',\n phase: 'pre-upload',\n severity: 'error',\n userAction: 'Reduza o tamanho ou aumente o limite permitido.',\n },\n [ErrorCode.INVALID_FILE_TYPE]: {\n title: 'Tipo de arquivo inválido',\n category: 'validacao',\n phase: 'pre-upload',\n severity: 'error',\n userAction: 'Ajuste a extensão/MIME conforme a política.',\n },\n [ErrorCode.FMT_UNSUPPORTED]: {\n title: 'Formato não suportado',\n category: 'validacao',\n phase: 'analise',\n severity: 'error',\n },\n [ErrorCode.FMT_MAGIC_MISMATCH]: {\n title: 'Conteúdo incompatível',\n category: 'validacao',\n phase: 'analise',\n severity: 'error',\n },\n [ErrorCode.FMT_CORRUPTED]: {\n title: 'Arquivo corrompido',\n category: 'validacao',\n phase: 'analise',\n severity: 'error',\n },\n [ErrorCode.SEC_DANGEROUS_TYPE]: {\n title: 'Tipo perigoso bloqueado',\n category: 'seguranca',\n phase: 'pre-upload',\n severity: 'error',\n },\n [ErrorCode.SEC_VIRUS_DETECTED]: {\n title: 'Vírus detectado',\n category: 'seguranca',\n phase: 'analise',\n severity: 'error',\n },\n [ErrorCode.SEC_MALICIOUS_CONTENT]: {\n title: 'Malware detectado',\n category: 'seguranca',\n phase: 'analise',\n severity: 'error',\n },\n [ErrorCode.SYS_STORAGE_ERROR]: {\n title: 'Erro de armazenamento',\n category: 'armazenamento',\n phase: 'armazenamento',\n severity: 'error',\n retriable: true,\n },\n [ErrorCode.RATE_LIMIT_EXCEEDED]: {\n title: 'Limite de taxa excedido',\n category: 'limites',\n phase: 'operacional',\n severity: 'warn',\n retriable: true,\n },\n [ErrorCode.SYS_RATE_LIMIT]: {\n title: 'Limite de requisições excedido',\n category: 'limites',\n phase: 'operacional',\n severity: 'warn',\n retriable: true,\n },\n [ErrorCode.QUOTA_EXCEEDED]: {\n title: 'Cota excedida',\n category: 'limites',\n phase: 'operacional',\n severity: 'warn',\n },\n [ErrorCode.INTERNAL_ERROR]: {\n title: 'Erro interno',\n category: 'operacional',\n phase: 'operacional',\n severity: 'error',\n retriable: true,\n },\n [ErrorCode.UNAUTHORIZED]: {\n title: 'Não autorizado',\n category: 'operacional',\n phase: 'operacional',\n severity: 'error',\n },\n [ErrorCode.NOT_FOUND]: {\n title: 'Não encontrado',\n category: 'operacional',\n phase: 'operacional',\n severity: 'warn',\n },\n\n // Alias de mensagens de config (strings do backend fora do enum)\n INVALID_TYPE: { title: 'Tipo de arquivo inválido', category: 'validacao', phase: 'pre-upload', severity: 'error' },\n UNSUPPORTED_FILE_TYPE: { title: 'Tipo não suportado', category: 'validacao', phase: 'analise', severity: 'error' },\n MAGIC_NUMBER_MISMATCH: { title: 'Assinatura incompatível', category: 'validacao', phase: 'analise', severity: 'error' },\n CORRUPTED_FILE: { title: 'Arquivo corrompido', category: 'validacao', phase: 'analise', severity: 'error' },\n DANGEROUS_FILE_TYPE: { title: 'Tipo perigoso bloqueado', category: 'seguranca', phase: 'pre-upload', severity: 'error' },\n DANGEROUS_EXECUTABLE: { title: 'Executável bloqueado', category: 'seguranca', phase: 'analise', severity: 'error' },\n MALWARE_DETECTED: { title: 'Malware detectado', category: 'seguranca', phase: 'analise', severity: 'error' },\n VIRUS_DETECTED: { title: 'Vírus detectado', category: 'seguranca', phase: 'analise', severity: 'error' },\n FILE_STORE_ERROR: { title: 'Erro ao armazenar arquivo', category: 'armazenamento', phase: 'armazenamento', severity: 'error', retriable: true },\n FILE_STORAGE_FAILED: { title: 'Falha ao armazenar arquivo', category: 'armazenamento', phase: 'armazenamento', severity: 'error', retriable: true },\n VIRUS_SCAN_ERROR: { title: 'Erro no antivírus', category: 'seguranca', phase: 'analise', severity: 'warn', retriable: true },\n VIRUS_SCAN_FAILED: { title: 'Antivírus falhou', category: 'seguranca', phase: 'analise', severity: 'warn', retriable: true },\n VIRUS_SCAN_UNAVAILABLE: { title: 'Antivírus indisponível', category: 'seguranca', phase: 'analise', severity: 'warn', retriable: true },\n IO_ERROR: { title: 'Erro de entrada/saída', category: 'rede', phase: 'operacional', severity: 'error', retriable: true },\n UPLOAD_TIMEOUT: { title: 'Tempo esgotado no upload', category: 'operacional', phase: 'operacional', severity: 'warn', retriable: true },\n BULK_UPLOAD_TIMEOUT: { title: 'Tempo esgotado no upload em lote', category: 'operacional', phase: 'lote', severity: 'warn', retriable: true },\n BULK_UPLOAD_CANCELLED: { title: 'Upload em lote cancelado', category: 'operacional', phase: 'lote', severity: 'warn' },\n MIME_TYPE_MISMATCH: { title: 'MIME não corresponde', category: 'validacao', phase: 'analise', severity: 'error' },\n FILE_STRUCTURE_ERROR: { title: 'Estrutura inválida', category: 'validacao', phase: 'analise', severity: 'error' },\n STRUCTURE_VALIDATION_FAILED: { title: 'Validação de estrutura falhou', category: 'validacao', phase: 'analise', severity: 'error' },\n EMPTY_FILE: { title: 'Arquivo vazio', category: 'validacao', phase: 'pre-upload', severity: 'error' },\n INVALID_JSON_OPTIONS: { title: 'JSON de opções inválido', category: 'config', phase: 'operacional', severity: 'error' },\n OPCOES_JSON_INVALIDAS: { title: 'JSON de opções inválido', category: 'config', phase: 'operacional', severity: 'error', userAction: 'Corrija a sintaxe do JSON enviado no campo options.' },\n EMPTY_FILENAME: { title: 'Nome do arquivo obrigatório', category: 'validacao', phase: 'pre-upload', severity: 'error' },\n FILE_ANALYSIS_ERROR: { title: 'Erro na análise do arquivo', category: 'operacional', phase: 'analise', severity: 'error', retriable: true },\n CONFIGURATION_ERROR: { title: 'Erro de configuração', category: 'config', phase: 'operacional', severity: 'error' },\n SECURITY_VIOLATION: { title: 'Violação de segurança', category: 'seguranca', phase: 'pre-upload', severity: 'error' },\n CONFLICT_POLICY_ERROR: { title: 'Erro de política de conflito', category: 'conflito', phase: 'operacional', severity: 'error' },\n CONFLICT_POLICY_SKIP: { title: 'Arquivo ignorado por política', category: 'conflito', phase: 'operacional', severity: 'info' },\n FILE_EXISTS: { title: 'Arquivo já existe', category: 'conflito', phase: 'operacional', severity: 'warn' },\n PATH_TRAVERSAL: { title: 'Path traversal detectado', category: 'seguranca', phase: 'pre-upload', severity: 'error' },\n INSUFFICIENT_STORAGE: { title: 'Sem espaço em disco', category: 'armazenamento', phase: 'armazenamento', severity: 'error' },\n SIGNATURE_MISMATCH: { title: 'Assinatura não corresponde', category: 'validacao', phase: 'analise', severity: 'error' },\n SUSPICIOUS_STRUCTURE: { title: 'Estrutura suspeita', category: 'seguranca', phase: 'analise', severity: 'warn' },\n INVALID_FILE_SIZE_CONFIG: { title: 'Configuração de tamanho inválida', category: 'config', phase: 'operacional', severity: 'error' },\n USER_CANCELLED: { title: 'Upload cancelado pelo usuário', category: 'operacional', phase: 'operacional', severity: 'info' },\n SYSTEM_POLICY_BLOCKED: { title: 'Bloqueado por política do sistema', category: 'operacional', phase: 'operacional', severity: 'error' },\n SUSPICIOUS_EXTENSION_BLOCKED: { title: 'Extensão suspeita bloqueada', category: 'seguranca', phase: 'pre-upload', severity: 'warn' },\n DANGEROUS_SCRIPT: { title: 'Script perigoso detectado', category: 'seguranca', phase: 'analise', severity: 'error' },\n BATCH_SIZE_EXCEEDED: { title: 'Quantidade por lote excedida', category: 'validacao', phase: 'pre-upload', severity: 'error' },\n EMBEDDED_EXECUTABLE: { title: 'Executável incorporado', category: 'seguranca', phase: 'analise', severity: 'warn' },\n INVALID_PATH: { title: 'Caminho inválido', category: 'validacao', phase: 'pre-upload', severity: 'error' },\n FAILED_TO_ANALYZE: { title: 'Falha ao analisar', category: 'operacional', phase: 'analise', severity: 'error', retriable: true },\n ZIP_BOMB_DETECTED: { title: 'Possível zip bomb', category: 'seguranca', phase: 'analise', severity: 'error' },\n UNKNOWN_ERROR: { title: 'Erro desconhecido', category: 'operacional', phase: 'operacional', severity: 'error', retriable: true },\n\n // Aliases PT-BR adicionais para os códigos específicos do backend\n ARQUIVO_VAZIO: { title: 'Arquivo vazio', category: 'validacao', phase: 'pre-upload', severity: 'error' },\n ASSINATURA_INVALIDA: { title: 'Assinatura não corresponde', category: 'validacao', phase: 'analise', severity: 'error' },\n ARQUIVO_EXECUTAVEL_PERIGOSO: { title: 'Executável bloqueado', category: 'seguranca', phase: 'analise', severity: 'error' },\n SCRIPT_PERIGOSO: { title: 'Script perigoso detectado', category: 'seguranca', phase: 'analise', severity: 'error' },\n ARQUIVO_CORROMPIDO: { title: 'Arquivo corrompido', category: 'validacao', phase: 'analise', severity: 'error' },\n ESTRUTURA_SUSPEITA: { title: 'Estrutura suspeita', category: 'seguranca', phase: 'analise', severity: 'warn' },\n MAGIC_NUMBER_INCOMPATIVEL: { title: 'Assinatura incompatível', category: 'validacao', phase: 'analise', severity: 'error' },\n TIPO_ARQUIVO_PERIGOSO: { title: 'Tipo perigoso bloqueado', category: 'seguranca', phase: 'pre-upload', severity: 'error' },\n SCANNER_VIRUS_INDISPONIVEL: { title: 'Antivírus indisponível', category: 'seguranca', phase: 'analise', severity: 'warn', retriable: true },\n EXTENSAO_SUSPEITA_BLOQUEADA: { title: 'Extensão suspeita bloqueada', category: 'seguranca', phase: 'pre-upload', severity: 'warn' },\n TIPO_NAO_SUPORTADO: { title: 'Tipo não suportado', category: 'validacao', phase: 'analise', severity: 'error' },\n NOME_ARQUIVO_INVALIDO: { title: 'Nome de arquivo inválido', category: 'validacao', phase: 'pre-upload', severity: 'error' },\n TEMPO_ESGOTADO_UPLOAD: { title: 'Tempo esgotado no upload', category: 'operacional', phase: 'operacional', severity: 'warn', retriable: true },\n TEMPO_ESGOTADO_UPLOAD_LOTE: { title: 'Tempo esgotado no upload em lote', category: 'operacional', phase: 'lote', severity: 'warn', retriable: true },\n ERRO_IO: { title: 'Erro de entrada/saída', category: 'rede', phase: 'operacional', severity: 'error', retriable: true },\n ESPAÇO_INSUFICIENTE: { title: 'Sem espaço em disco', category: 'armazenamento', phase: 'armazenamento', severity: 'error' },\n UPLOAD_LOTE_CANCELADO: { title: 'Upload em lote cancelado', category: 'operacional', phase: 'lote', severity: 'warn' },\n UPLOAD_CANCELADO_USUARIO: { title: 'Upload cancelado pelo usuário', category: 'operacional', phase: 'operacional', severity: 'info' },\n TAMANHO_LOTE_EXCEDIDO: { title: 'Quantidade por lote excedida', category: 'validacao', phase: 'pre-upload', severity: 'error' },\n TIPO_MIME_INCOMPATIVEL: { title: 'MIME não corresponde', category: 'validacao', phase: 'analise', severity: 'error' },\n VIOLACAO_SEGURANCA: { title: 'Violação de segurança', category: 'seguranca', phase: 'pre-upload', severity: 'error' },\n ERRO_DESCONHECIDO: { title: 'Erro interno do sistema', category: 'operacional', phase: 'operacional', severity: 'error' },\n BLOQUEADO_POLITICA_SISTEMA: { title: 'Bloqueado por política do sistema', category: 'operacional', phase: 'operacional', severity: 'error' },\n FALHA_ESCANEAMENTO_VIRUS: { title: 'Antivírus falhou', category: 'seguranca', phase: 'analise', severity: 'warn', retriable: true },\n FALHA_VALIDACAO_ESTRUTURA: { title: 'Validação de estrutura falhou', category: 'validacao', phase: 'analise', severity: 'error' },\n CONFIGURACAO_TAMANHO_INVALIDA: { title: 'Configuração de tamanho inválida', category: 'config', phase: 'operacional', severity: 'error' },\n FALHA_ARMAZENAMENTO: { title: 'Falha ao armazenar arquivo', category: 'armazenamento', phase: 'armazenamento', severity: 'error', retriable: true },\n ERRO_ARMAZENAMENTO_ARQUIVO: { title: 'Erro ao armazenar arquivo', category: 'armazenamento', phase: 'armazenamento', severity: 'error', retriable: true },\n NOME_ARQUIVO_VAZIO: { title: 'Nome do arquivo obrigatório', category: 'validacao', phase: 'pre-upload', severity: 'error' },\n ERRO_ANALISE_ARQUIVO: { title: 'Erro na análise do arquivo', category: 'operacional', phase: 'analise', severity: 'error', retriable: true },\n ERRO_ESTRUTURA_ARQUIVO: { title: 'Erro na estrutura do arquivo', category: 'validacao', phase: 'analise', severity: 'error' },\n CAMINHO_INVALIDO: { title: 'Caminho inválido', category: 'validacao', phase: 'pre-upload', severity: 'error' },\n ERRO_CONFIGURACAO: { title: 'Erro de configuração', category: 'config', phase: 'operacional', severity: 'error' },\n ERRO_ESCANEAMENTO_VIRUS: { title: 'Erro no antivírus', category: 'seguranca', phase: 'analise', severity: 'warn', retriable: true },\n FALHA_ANALISE_ARQUIVO: { title: 'Falha ao analisar', category: 'operacional', phase: 'analise', severity: 'error', retriable: true },\n ERRO_POLITICA_CONFLITO: { title: 'Erro de política de conflito', category: 'conflito', phase: 'operacional', severity: 'error' },\n POLITICA_CONFLITO_IGNORAR: { title: 'Arquivo ignorado por política', category: 'conflito', phase: 'operacional', severity: 'info' },\n};\n\nexport function getErrorMeta(code: string): ErrorMeta {\n return DEFAULT_CATALOG[code] ?? { title: code };\n}\n","import { Component, DestroyRef, Inject, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n FormBuilder,\n FormGroup,\n FormsModule,\n ReactiveFormsModule,\n} from '@angular/forms';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatSnackBarModule, MatSnackBar } from '@angular/material/snack-bar';\nimport { toObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { BehaviorSubject, map, startWith, Observable } from 'rxjs';\nimport {\n SETTINGS_PANEL_DATA,\n SettingsValueProvider,\n} from '@praxisui/settings-panel';\nimport { FilesUploadConfig } from '../models';\nimport { ErrorCode } from '../types';\nimport { useEffectiveUploadConfig } from './use-effective-upload-config';\nimport { getErrorMeta } from '../services/error-catalog';\n\n@Component({\n selector: 'praxis-files-upload-config-editor',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MatTabsModule,\n MatFormFieldModule,\n MatInputModule,\n MatCheckboxModule,\n MatSelectModule,\n MatButtonModule,\n MatIconModule,\n MatSnackBarModule,\n FormsModule,\n ],\n template: `\n <mat-tab-group>\n <mat-tab label=\"Comportamento\">\n <form [formGroup]=\"form\">\n <mat-form-field appearance=\"fill\">\n <mat-label>Estratégia de envio <span class=\"opt-tag\">opcional</span></mat-label>\n <mat-select formControlName=\"strategy\">\n <mat-option value=\"direct\">Direto (HTTP padrão)</mat-option>\n <mat-option value=\"presign\">URL pré-assinada (S3/GCS)</mat-option>\n <mat-option value=\"auto\"\n >Automático (tenta pré-assinada e volta ao direto)</mat-option\n >\n </mat-select>\n <mat-hint>Como os arquivos serão enviados ao servidor.</mat-hint>\n </mat-form-field>\n </form>\n <form [formGroup]=\"bulkGroup\">\n <h4 class=\"section-subtitle\">\n <mat-icon aria-hidden=\"true\">build</mat-icon>\n Opções configuráveis — Lote\n </h4>\n <mat-form-field appearance=\"fill\">\n <mat-label>Uploads paralelos <span class=\"opt-tag\">opcional</span></mat-label>\n <input matInput type=\"number\" formControlName=\"parallelUploads\" />\n <mat-hint>Quantos arquivos enviar ao mesmo tempo.</mat-hint>\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>Número de tentativas <span class=\"opt-tag\">opcional</span></mat-label>\n <input matInput type=\"number\" formControlName=\"retryCount\" />\n <mat-hint>Tentativas automáticas em caso de falha.</mat-hint>\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>Intervalo entre tentativas (ms) <span class=\"opt-tag\">opcional</span></mat-label>\n <input matInput type=\"number\" formControlName=\"retryBackoffMs\" />\n <mat-hint>Tempo de espera entre tentativas.</mat-hint>\n </mat-form-field>\n </form>\n </mat-tab>\n <mat-tab label=\"Interface\">\n <form [formGroup]=\"uiGroup\">\n <h4 class=\"section-subtitle\">\n <mat-icon aria-hidden=\"true\">edit</mat-icon>\n Opções configuráveis — Interface\n </h4>\n <mat-checkbox formControlName=\"showDropzone\"\n >Exibir área de soltar</mat-checkbox\n >\n <mat-checkbox formControlName=\"showProgress\"\n >Exibir barra de progresso</mat-checkbox\n >\n <mat-checkbox formControlName=\"showConflictPolicySelector\"\n >Permitir escolher a política de conflito</mat-checkbox\n >\n <mat-checkbox formControlName=\"manualUpload\"\n >Exigir clique em “Enviar” (modo manual)</mat-checkbox\n >\n <mat-checkbox formControlName=\"dense\">Layout compacto</mat-checkbox>\n <mat-form-field appearance=\"fill\">\n <mat-label>Tipos permitidos (accept) <span class=\"opt-tag\">opcional</span></mat-label>\n <input\n matInput\n formControlName=\"accept\"\n placeholder=\"ex.: pdf,jpg,png\"\n />\n <mat-hint>Lista separada por vírgula (opcional).</mat-hint>\n </mat-form-field>\n <mat-checkbox formControlName=\"showMetadataForm\"\n >Exibir formulário de metadados (JSON)</mat-checkbox\n >\n\n <!-- NOVO: Grupo Dropzone -->\n <fieldset [formGroup]=\"dropzoneGroup\" class=\"subgroup\">\n <legend>\n <mat-icon aria-hidden=\"true\">download</mat-icon>\n Dropzone (expansão por proximidade)\n </legend>\n <mat-checkbox formControlName=\"expandOnDragProximity\">\n Expandir ao aproximar arquivo durante arraste\n </mat-checkbox>\n <mat-form-field appearance=\"fill\">\n <mat-label>Raio de proximidade (px) <span class=\"opt-tag\">opcional</span></mat-label>\n <input matInput type=\"number\" formControlName=\"proximityPx\" />\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>Modo de expansão</mat-label>\n <mat-select formControlName=\"expandMode\">\n <mat-option value=\"overlay\">Overlay (recomendado)</mat-option>\n <mat-option value=\"inline\">Inline</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>Altura do overlay (px) <span class=\"opt-tag\">opcional</span></mat-label>\n <input matInput type=\"number\" formControlName=\"expandHeight\" />\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>Debounce de arraste (ms) <span class=\"opt-tag\">opcional</span></mat-label>\n <input matInput type=\"number\" formControlName=\"expandDebounceMs\" />\n </mat-form-field>\n </fieldset>\n\n <!-- NOVO: Grupo Lista/Detalhes -->\n <fieldset [formGroup]=\"listGroup\" class=\"subgroup\">\n <legend>\n <mat-icon aria-hidden=\"true\">view_list</mat-icon>\n Lista e detalhes\n </legend>\n <mat-form-field appearance=\"fill\">\n <mat-label>Colapsar após (itens) <span class=\"opt-tag\">opcional</span></mat-label>\n <input matInput type=\"number\" formControlName=\"collapseAfter\" />\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>Modo de detalhes</mat-label>\n <mat-select formControlName=\"detailsMode\">\n <mat-option value=\"auto\">Automático</mat-option>\n <mat-option value=\"card\">Card (overlay)</mat-option>\n <mat-option value=\"sidesheet\">Side-sheet</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>Largura máxima do card (px) <span class=\"opt-tag\">opcional</span></mat-label>\n <input matInput type=\"number\" formControlName=\"detailsMaxWidth\" />\n </mat-form-field>\n <mat-checkbox formControlName=\"detailsShowTechnical\">\n Mostrar detalhes técnicos por padrão\n </mat-checkbox>\n <mat-form-field appearance=\"fill\">\n <mat-label>Campos de metadados (whitelist) <span class=\"opt-tag\">opcional</span></mat-label>\n <input matInput formControlName=\"detailsFields\" placeholder=\"ex.: id,fileName,contentType\" />\n <mat-hint>Lista separada por vírgula; vazio = todos.</mat-hint>\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>Âncora do overlay</mat-label>\n <mat-select formControlName=\"detailsAnchor\">\n <mat-option value=\"item\">Item</mat-option>\n <mat-option value=\"field\">Campo</mat-option>\n </mat-select>\n </mat-form-field>\n </fieldset>\n </form>\n </mat-tab>\n <mat-tab label=\"Validações\">\n <form [formGroup]=\"limitsGroup\">\n <h4 class=\"section-subtitle\">\n <mat-icon aria-hidden=\"true\">build</mat-icon>\n Opções configuráveis — Validações\n </h4>\n <mat-form-field appearance=\"fill\">\n <mat-label>Tamanho máximo do arquivo (bytes) <span class=\"opt-tag\">opcional</span></mat-label>\n <input matInput type=\"number\" formControlName=\"maxFileSizeBytes\" />\n <mat-hint>Limite de validação no cliente (opcional).</mat-hint>\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>Máx. arquivos por lote <span class=\"opt-tag\">opcional</span></mat-label>\n <input matInput type=\"number\" formControlName=\"maxFilesPerBulk\" />\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>Tamanho máximo do lote (bytes) <span class=\"opt-tag\">opcional</span></mat-label>\n <input matInput type=\"number\" formControlName=\"maxBulkSizeBytes\" />\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>Política de conflito (padrão) <span class=\"opt-tag\">opcional</span></mat-label>\n <mat-select formControlName=\"defaultConflictPolicy\">\n <mat-option value=\"RENAME\">Renomear automaticamente</mat-option>\n <mat-option value=\"MAKE_UNIQUE\">Gerar nome único</mat-option>\n <mat-option value=\"OVERWRITE\">Sobrescrever arquivo existente</mat-option>\n <mat-option value=\"SKIP\">Pular se já existir</mat-option>\n <mat-option value=\"ERROR\">Falhar (erro)</mat-option>\n </mat-select>\n <mat-hint>O que fazer quando o nome do arquivo já existe.</mat-hint>\n <div class=\"warn\" *ngIf=\"limitsGroup.get('defaultConflictPolicy')?.value === 'OVERWRITE'\">\n <mat-icon color=\"warn\" aria-hidden=\"true\">warning</mat-icon>\n Atenção: OVERWRITE pode sobrescrever arquivos existentes.\n </div>\n </mat-form-field>\n <mat-checkbox formControlName=\"failFast\"\n >Parar no primeiro erro (fail-fast)</mat-checkbox\n >\n <mat-checkbox formControlName=\"strictValidation\"\n >Validação rigorosa (backend)</mat-checkbox\n >\n <mat-form-field appearance=\"fill\">\n <mat-label>Tamanho máx. por arquivo (MB) <span class=\"req-tag\">mandatório</span></mat-label>\n <input matInput type=\"number\" formControlName=\"maxUploadSizeMb\" required />\n <mat-hint>Validado pelo backend (1–500 MB).</mat-hint>\n </mat-form-field>\n </form>\n <form [formGroup]=\"optionsGroup\">\n <h4 class=\"section-subtitle\">\n <mat-icon aria-hidden=\"true\">tune</mat-icon>\n Opções configuráveis — Avançado\n </h4>\n <mat-form-field appearance=\"fill\">\n <mat-label>Extensões permitidas <span class=\"opt-tag\">opcional</span></mat-label>\n <input\n matInput\n formControlName=\"allowedExtensions\"\n placeholder=\"ex.: pdf,docx,xlsx\"\n />\n <mat-hint>Lista separada por vírgula (opcional).</mat-hint>\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>MIME types aceitos <span class=\"opt-tag\">opcional</span></mat-label>\n <input\n matInput\n formControlName=\"acceptMimeTypes\"\n placeholder=\"ex.: application/pdf,image/png\"\n />\n <mat-hint>Lista separada por vírgula (opcional).</mat-hint>\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>Diretório destino <span class=\"opt-tag\">opcional</span></mat-label>\n <input\n matInput\n formControlName=\"targetDirectory\"\n placeholder=\"ex.: documentos/notas\"\n />\n </mat-form-field>\n <mat-checkbox formControlName=\"enableVirusScanning\">\n Forçar antivírus (quando disponível)\n </mat-checkbox>\n <div class=\"warn\" *ngIf=\"optionsGroup.get('enableVirusScanning')?.value === true\">\n <mat-icon color=\"warn\" aria-hidden=\"true\">warning</mat-icon>\n Pode impactar desempenho e latência de upload.\n </div>\n </form>\n <form [formGroup]=\"quotasGroup\">\n <h4 class=\"section-subtitle\">\n <mat-icon aria-hidden=\"true\">edit</mat-icon>\n Opções configuráveis — Quotas (UI)\n </h4>\n <mat-checkbox formControlName=\"showQuotaWarnings\"\n >Exibir avisos de cota</mat-checkbox\n >\n <mat-checkbox formControlName=\"blockOnExceed\"\n >Bloquear ao exceder cota</mat-checkbox\n >\n </form>\n <form [formGroup]=\"rateLimitGroup\">\n <h4 class=\"section-subtitle\">\n <mat-icon aria-hidden=\"true\">edit</mat-icon>\n Opções configuráveis — Rate Limit (UI)\n </h4>\n <mat-checkbox formControlName=\"showBannerOn429\"\n >Exibir banner quando atingir o limite</mat-checkbox\n >\n <mat-checkbox formControlName=\"autoRetryOn429\"\n >Tentar novamente automaticamente</mat-checkbox\n >\n <mat-form-field appearance=\"fill\">\n <mat-label>Máximo de tentativas automáticas <span class=\"opt-tag\">opcional</span></mat-label>\n <input matInput type=\"number\" formControlName=\"maxAutoRetry\" />\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>Intervalo base entre tentativas (ms) <span class=\"opt-tag\">opcional</span></mat-label>\n <input matInput type=\"number\" formControlName=\"baseBackoffMs\" />\n </mat-form-field>\n </form>\n </mat-tab>\n <mat-tab label=\"Mensagens\">\n <form [formGroup]=\"messagesGroup\">\n <h4 class=\"section-subtitle\">\n <mat-icon aria-hidden=\"true\">edit</mat-icon>\n Opções configuráveis — Mensagens (UI)\n </h4>\n <mat-form-field appearance=\"fill\">\n <mat-label>Sucesso (individual) <span class=\"opt-tag\">opcional</span></mat-label>\n <input\n matInput\n formControlName=\"successSingle\"\n placeholder=\"ex.: Arquivo enviado com sucesso\"\n />\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>Sucesso (em lote) <span class=\"opt-tag\">opcional</span></mat-label>\n <input\n matInput\n formControlName=\"successBulk\"\n placeholder=\"ex.: Upload concluído\"\n />\n </mat-form-field>\n <div [formGroup]=\"errorsGroup\">\n <ng-container *ngFor=\"let e of errorEntries\">\n <mat-form-field appearance=\"fill\">\n <mat-label>{{ e.label }} <span class=\"opt-tag\">opcional</span></mat-label>\n <input matInput [formControlName]=\"e.code\" />\n <mat-hint class=\"code-hint\">{{ e.code }}</mat-hint>\n </mat-form-field>\n </ng-container>\n </div>\n </form>\n </mat-tab>\n <mat-tab label=\"Cabeçalhos\">\n <form [formGroup]=\"headersGroup\">\n <h4 class=\"section-subtitle\">\n <mat-icon aria-hidden=\"true\">edit</mat-icon>\n Opções configuráveis — Cabeçalhos (consulta)\n </h4>\n <mat-form-field appearance=\"fill\">\n <mat-label>Cabeçalho de tenant <span class=\"opt-tag\">opcional</span></mat-label>\n <input\n matInput\n formControlName=\"tenantHeader\"\n placeholder=\"X-Tenant-Id\"\n />\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>Valor do tenant <span class=\"opt-tag\">opcional</span></mat-label>\n <input\n matInput\n formControlName=\"tenantValue\"\n placeholder=\"ex.: demo-tenant\"\n />\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>Cabeçalho de usuário <span class=\"opt-tag\">opcional</span></mat-label>\n <input\n matInput\n formControlName=\"userHeader\"\n placeholder=\"X-User-Id\"\n />\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>Valor do usuário <span class=\"opt-tag\">opcional</span></mat-label>\n <input matInput formControlName=\"userValue\" placeholder=\"ex.: 42\" />\n </mat-form-field>\n </form>\n </mat-tab>\n <mat-tab label=\"Servidor\">\n <div class=\"server-tab\">\n <div class=\"toolbar\">\n <h4 class=\"section-subtitle ro\">\n <mat-icon aria-hidden=\"true\">info</mat-icon>\n Servidor (somente leitura)\n <span class=\"badge\">read-only</span>\n </h4>\n <button type=\"button\" (click)=\"refetchServerConfig()\">\n Recarregar do servidor\n </button>\n <span class=\"hint\" *ngIf=\"!baseUrl\"\n >Defina a baseUrl no componente pai para consultar\n /api/files/config.</span\n >\n </div>\n <div *ngIf=\"serverLoading(); else serverLoaded\">\n Carregando configuração do servidor…\n </div>\n <ng-template #serverLoaded>\n <div *ngIf=\"serverError(); else serverOk\" class=\"error\">\n Falha ao carregar: {{ serverError() | json }}\n </div>\n <ng-template #serverOk>\n <section *ngIf=\"serverData() as _\">\n <h3>Resumo da configuração ativa</h3>\n <ul class=\"summary\">\n <li>\n <strong>Max por arquivo (MB):</strong>\n {{ serverData()?.options?.maxUploadSizeMb }}\n </li>\n <li>\n <strong>Validação rigorosa:</strong>\n {{ serverData()?.options?.strictValidation }}\n </li>\n <li>\n <strong>Antivírus:</strong>\n {{ serverData()?.options?.enableVirusScanning }}\n </li>\n <li>\n <strong>Conflito de nome (padrão):</strong>\n {{ serverData()?.options?.nameConflictPolicy }}\n </li>\n <li>\n <strong>MIME aceitos:</strong>\n {{\n (serverData()?.options?.acceptMimeTypes || []).join(', ')\n }}\n </li>\n <li>\n <strong>Bulk - fail-fast padrão:</strong>\n {{ serverData()?.bulk?.failFastModeDefault }}\n </li>\n <li>\n <strong>Rate limit:</strong>\n {{ serverData()?.rateLimit?.enabled }} ({{\n serverData()?.rateLimit?.perMinute\n }}/min, {{ serverData()?.rateLimit?.perHour }}/h)\n </li>\n <li>\n <strong>Quotas:</strong> {{ serverData()?.quotas?.enabled }}\n </li>\n <li>\n <strong>Servidor:</strong> v{{\n serverData()?.metadata?.version\n }}\n • {{ serverData()?.metadata?.locale }}\n </li>\n </ul>\n <details>\n <summary>Ver JSON</summary>\n <button\n mat-icon-button\n aria-label=\"Copiar JSON\"\n (click)=\"copyServerConfig()\"\n type=\"button\"\n title=\"Copiar JSON\"\n >\n <mat-icon>content_copy</mat-icon>\n </button>\n <pre>{{ serverData() | json }}</pre>\n </details>\n <p class=\"note\">\n As opções acima que podem ser alteradas via payload são:\n conflito de nome, validação rigorosa, tamanho máximo (MB),\n extensões/MIME aceitos, diretório destino, antivírus,\n metadados personalizados e fail-fast (no bulk).\n </p>\n </section>\n </ng-template>\n </ng-template>\n </div>\n </mat-tab>\n <mat-tab label=\"JSON\">\n <textarea\n rows=\"10\"\n [ngModel]=\"form.value | json\"\n (ngModelChange)=\"onJsonChange($event)\"\n ></textarea>\n <div class=\"error\" *ngIf=\"jsonError\">{{ jsonError }}</div>\n </mat-tab>\n </mat-tab-group>\n `,\n})\nexport class PraxisFilesUploadConfigEditor\n implements OnInit, SettingsValueProvider\n{\n form: FormGroup;\n\n // Integração com backend: baseUrl e sinais de configuração efetiva\n baseUrl?: string;\n private state!: ReturnType<typeof useEffectiveUploadConfig>;\n serverLoading = () => (this.state ? this.state.loading() : false);\n serverData = () => (this.state ? this.state.data() : undefined);\n serverError = () => (this.state ? this.state.error() : undefined);\n\n get uiGroup(): FormGroup {\n return this.form.get('ui') as FormGroup;\n }\n get dropzoneGroup(): FormGroup {\n return (this.form.get('ui') as FormGroup).get('dropzone') as FormGroup;\n }\n get listGroup(): FormGroup {\n return (this.form.get('ui') as FormGroup).get('list') as FormGroup;\n }\n get limitsGroup(): FormGroup {\n return this.form.get('limits') as FormGroup;\n }\n get optionsGroup(): FormGroup {\n return this.form.get('options') as FormGroup;\n }\n get quotasGroup(): FormGroup {\n return this.form.get('quotas') as FormGroup;\n }\n get rateLimitGroup(): FormGroup {\n return this.form.get('rateLimit') as FormGroup;\n }\n get bulkGroup(): FormGroup {\n return this.form.get('bulk') as FormGroup;\n }\n get messagesGroup(): FormGroup {\n return this.form.get('messages') as FormGroup;\n }\n get headersGroup(): FormGroup {\n return this.form.get('headers') as FormGroup;\n }\n get errorsGroup(): FormGroup {\n return this.messagesGroup.get('errors') as FormGroup;\n }\n\n errorCodes = Object.values(ErrorCode);\n errorEntries: Array<{ code: string; label: string }> = [];\n\n isDirty$ = new BehaviorSubject<boolean>(false);\n isValid$!: Observable<boolean>;\n isBusy$ = new BehaviorSubject<boolean>(false);\n jsonError: string | null = null;\n\n constructor(\n private fb: FormBuilder,\n @Inject(SETTINGS_PANEL_DATA) private panelData: any,\n private snackBar: MatSnackBar,\n private destroyRef: DestroyRef,\n ) {\n this.form = this.fb.group({\n strategy: ['direct'],\n ui: this.fb.group({\n showDropzone: [true],\n showProgress: [true],\n showConflictPolicySelector: [true],\n manualUpload: [false],\n dense: [false],\n accept: [''],\n showMetadataForm: [false],\n // NOVO: grupos específicos\n dropzone: this.fb.group({\n expandOnDragProximity: [true],\n proximityPx: [64],\n expandMode: ['overlay'],\n expandHeight: [200],\n expandDebounceMs: [120],\n }),\n list: this.fb.group({\n collapseAfter: [5],\n detailsMode: ['auto'],\n detailsMaxWidth: [480],\n detailsShowTechnical: [false],\n detailsFields: [''], // CSV na UI\n detailsAnchor: ['item'],\n }),\n }),\n limits: this.fb.group({\n maxFileSizeBytes: [null],\n maxFilesPerBulk: [null],\n maxBulkSizeBytes: [null],\n defaultConflictPolicy: ['RENAME'],\n failFast: [false],\n strictValidation: [true],\n maxUploadSizeMb: [50],\n }),\n options: this.fb.group({\n allowedExtensions: [''],\n acceptMimeTypes: [''],\n targetDirectory: [''],\n enableVirusScanning: [false],\n }),\n bulk: this.fb.group({\n parallelUploads: [1],\n retryCount: [0],\n retryBackoffMs: [0],\n }),\n quotas: this.fb.group({\n showQuotaWarnings: [false],\n blockOnExceed: [false],\n }),\n rateLimit: this.fb.group({\n autoRetryOn429: [false],\n showBannerOn429: [true],\n maxAutoRetry: [0],\n baseBackoffMs: [0],\n }),\n headers: this.fb.group({\n tenantHeader: ['X-Tenant-Id'],\n userHeader: ['X-User-Id'],\n // novos campos: valores para consulta do servidor\n tenantValue: [''],\n userValue: [''],\n }),\n messages: this.fb.group({\n successSingle: [''],\n successBulk: [''],\n errors: this.fb.group({}),\n }),\n });\n\n // Inicializa labels mais didáticos para os códigos de erro\n const FRIENDLY: Partial<Record<ErrorCode, string>> = {\n INVALID_FILE_TYPE: 'Tipo de arquivo inválido',\n FILE_TOO_LARGE: 'Arquivo muito grande',\n NOT_FOUND: 'Arquivo não encontrado',\n UNAUTHORIZED: 'Acesso não autorizado',\n RATE_LIMIT_EXCEEDED: 'Limite de requisições excedido',\n INTERNAL_ERROR: 'Erro interno do servidor',\n QUOTA_EXCEEDED: 'Cota de upload excedida',\n SEC_VIRUS_DETECTED: 'Vírus detectado no arquivo',\n SEC_MALICIOUS_CONTENT: 'Conteúdo malicioso detectado',\n SEC_DANGEROUS_TYPE: 'Tipo de arquivo perigoso',\n FMT_MAGIC_MISMATCH: 'Conteúdo do arquivo incompatível',\n FMT_CORRUPTED: 'Arquivo corrompido',\n FMT_UNSUPPORTED: 'Formato não suportado',\n SYS_STORAGE_ERROR: 'Erro no armazenamento',\n SYS_SERVICE_DOWN: 'Serviço indisponível',\n SYS_RATE_LIMIT: 'Limite de requisições (sistema) excedido',\n };\n this.errorEntries = this.errorCodes.map((code) => ({\n code,\n label: FRIENDLY[code as ErrorCode] ?? String(code),\n }));\n\n const errorsGroup = this.errorsGroup;\n this.errorCodes.forEach((code) => {\n errorsGroup.addControl(code as string, this.fb.control(''));\n });\n\n this.isValid$ = this.form.statusChanges.pipe(\n map((s) => s === 'VALID'),\n startWith(this.form.valid),\n );\n\n // Definir baseUrl e inicializar hook em contexto de injeção\n this.baseUrl = this.panelData?.baseUrl ?? this.panelData?.__baseUrl;\n this.state = useEffectiveUploadConfig(this.baseUrl ?? '/api/files', () =>\n this.getHeadersForFetch(),\n );\n\n // Observa mudanças na configuração efetiva do servidor (em contexto de injeção)\n toObservable(this.state.data)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((cfg) => this.applyServerConfig(cfg));\n }\n\n ngOnInit(): void {\n // baseUrl opcional vinda do componente pai (Settings Panel inputs)\n // (já definida no construtor)\n\n if (this.panelData) {\n const patch = { ...this.panelData } as FilesUploadConfig;\n if (patch.ui?.accept) {\n patch.ui = { ...patch.ui, accept: patch.ui.accept.join(',') } as any;\n }\n // NOVO: normalizar lista de detalhes para CSV\n if (patch.ui?.list?.detailsFields) {\n patch.ui = {\n ...patch.ui,\n list: {\n ...(patch.ui.list as any),\n detailsFields: (patch.ui.list.detailsFields as string[]).join(','),\n } as any,\n } as any;\n }\n if (patch.options?.allowedExtensions) {\n patch.options = {\n ...patch.options,\n allowedExtensions: patch.options.allowedExtensions.join(','),\n } as any;\n }\n if (patch.options?.acceptMimeTypes) {\n patch.options = {\n ...patch.options,\n acceptMimeTypes: patch.options.acceptMimeTypes.join(','),\n } as any;\n }\n this.form.patchValue(patch);\n }\n\n // Sempre que cabeçalhos mudarem, atualiza contexto da consulta (e refaz fetch)\n this.headersGroup.valueChanges.subscribe(() => {\n this.state.refetch();\n });\n\n this.form.valueChanges.subscribe(() => this.isDirty$.next(true));\n }\n\n private applyServerConfig(cfg: any): void {\n if (!cfg) return;\n // Options mapeadas para \"Validações\" e \"Opções\"\n const options = cfg.options ?? {};\n const bulk = cfg.bulk ?? {};\n\n // limits\n this.limitsGroup.patchValue(\n {\n defaultConflictPolicy: options.nameConflictPolicy ?? null,\n strictValidation: options.strictValidation ?? null,\n maxUploadSizeMb: options.maxUploadSizeMb ?? null,\n // failFast padrão do servidor pode influenciar a UI de validação em lote\n failFast: bulk.failFastModeDefault ?? false,\n // preencher máx. arquivos por lote a partir do backend\n maxFilesPerBulk:\n typeof bulk.maxFilesPerBatch === 'number'\n ? bulk.maxFilesPerBatch\n : null,\n },\n { emitEvent: false },\n );\n\n // options (normalizar arrays em string CSV)\n const allowed = Array.isArray(options.allowedExtensions)\n ? options.allowedExtensions.join(',')\n : '';\n const mimes = Array.isArray(options.acceptMimeTypes)\n ? options.acceptMimeTypes.join(',')\n : '';\n this.optionsGroup.patchValue(\n {\n allowedExtensions: allowed,\n acceptMimeTypes: mimes,\n targetDirectory: options.targetDirectory ?? '',\n enableVirusScanning: !!options.enableVirusScanning,\n },\n { emitEvent: false },\n );\n\n // bulk (UI)\n this.bulkGroup.patchValue(\n {\n parallelUploads:\n typeof bulk.maxConcurrentUploads === 'number'\n ? bulk.maxConcurrentUploads\n : 1,\n },\n { emitEvent: false },\n );\n\n // rate limit (somente leitura na UI)\n this.rateLimitGroup.patchValue(\n {\n // Mantemos flags de UI; os números vêm do servidor e são mostrados no resumo\n },\n { emitEvent: false },\n );\n\n // quotas (somente preferências de UI)\n this.quotasGroup.patchValue({}, { emitEvent: false });\n\n // Mensagens de erro do servidor\n const serverMessages: Record<string, string> = cfg.messages ?? {};\n const errorsGroup = this.errorsGroup;\n const alias: Record<string, ErrorCode> = {\n INVALID_TYPE: ErrorCode.INVALID_FILE_TYPE,\n UNSUPPORTED_FILE_TYPE: ErrorCode.FMT_UNSUPPORTED,\n MAGIC_NUMBER_MISMATCH: ErrorCode.FMT_MAGIC_MISMATCH,\n CORRUPTED_FILE: ErrorCode.FMT_CORRUPTED,\n FILE_TOO_LARGE: ErrorCode.FILE_TOO_LARGE,\n RATE_LIMIT_EXCEEDED: ErrorCode.RATE_LIMIT_EXCEEDED,\n QUOTA_EXCEEDED: ErrorCode.QUOTA_EXCEEDED,\n INTERNAL_ERROR: ErrorCode.INTERNAL_ERROR,\n UNKNOWN_ERROR: ErrorCode.INTERNAL_ERROR,\n MALWARE_DETECTED: ErrorCode.SEC_MALICIOUS_CONTENT,\n VIRUS_DETECTED: ErrorCode.SEC_VIRUS_DETECTED,\n DANGEROUS_FILE_TYPE: ErrorCode.SEC_DANGEROUS_TYPE,\n DANGEROUS_EXECUTABLE: ErrorCode.SEC_DANGEROUS_TYPE,\n FILE_STORE_ERROR: ErrorCode.SYS_STORAGE_ERROR,\n SYS_STORAGE_ERROR: ErrorCode.SYS_STORAGE_ERROR,\n };\n Object.keys(serverMessages).forEach((rawCode) => {\n const mapped = alias[rawCode] ?? (ErrorCode as any)[rawCode];\n const ctrlName = mapped ? String(mapped) : rawCode;\n if (!errorsGroup.get(ctrlName)) {\n errorsGroup.addControl(ctrlName, this.fb.control(''));\n }\n if (!this.errorEntries.some((e) => e.code === ctrlName)) {\n const meta = getErrorMeta(rawCode);\n const label = meta.title || ctrlName;\n this.errorEntries.push({ code: ctrlName, label });\n }\n errorsGroup\n .get(ctrlName)\n ?.patchValue(serverMessages[rawCode], { emitEvent: false });\n });\n }\n\n getSettingsValue(): FilesUploadConfig {\n const value = this.form.value as FilesUploadConfig;\n // accept (UI)\n const accept = this.uiGroup.get('accept')?.value as string;\n if (accept !== undefined) {\n value.ui = value.ui ?? {};\n value.ui.accept = accept\n .split(',')\n .map((s) => s.trim())\n .filter((s) => !!s);\n }\n // NOVO: detailsFields (UI)\n const df = (this.uiGroup.get('list') as FormGroup)?.get('detailsFields')\n ?.value as string;\n if (df !== undefined) {\n value.ui = value.ui ?? {};\n (value.ui as any).list = (value.ui as any).list ?? {};\n (value.ui as any).list.detailsFields = df\n .split(',')\n .map((s: string) => s.trim())\n .filter((s: string) => !!s);\n }\n // options.allowedExtensions\n const allowedExt = this.optionsGroup.get('allowedExtensions')\n ?.value as string;\n if (allowedExt !== undefined) {\n value.options = value.options ?? {};\n (value.options as any).allowedExtensions = allowedExt\n .split(',')\n .map((s) => s.trim())\n .filter((s) => !!s);\n }\n // options.acceptMimeTypes\n const mime = this.optionsGroup.get('acceptMimeTypes')?.value as string;\n if (mime !== undefined) {\n value.options = value.options ?? {};\n (value.options as any).acceptMimeTypes = mime\n .split(',')\n .map((s) => s.trim())\n .filter((s) => !!s);\n }\n return value;\n }\n\n copyServerConfig(): void {\n const data = this.serverData();\n if (!data) {\n return;\n }\n const json = JSON.stringify(data, null, 2);\n if (navigator?.clipboard?.writeText) {\n navigator.clipboard.writeText(json);\n this.snackBar.open('Configuração copiada', undefined, {\n duration: 2000,\n });\n }\n }\n\n onJsonChange(json: string): void {\n try {\n const parsed = JSON.parse(json);\n this.form.patchValue(parsed);\n this.jsonError = null;\n } catch {\n this.jsonError = 'JSON inválido: verifique a sintaxe.';\n this.snackBar.open('JSON inválido', undefined, { duration: 2000 });\n }\n }\n\n private getHeadersForFetch(): Record<string, string> {\n const h = this.headersGroup.value as {\n tenantHeader: string;\n userHeader: string;\n tenantValue?: string;\n userValue?: string;\n };\n const headers: Record<string, string> = {};\n if (h?.tenantHeader && h?.tenantValue)\n headers[h.tenantHeader] = h.tenantValue;\n if (h?.userHeader && h?.userValue) headers[h.userHeader] = h.userValue;\n return headers;\n }\n\n refetchServerConfig(): void {\n this.state.refetch();\n }\n}\n","import { InjectionToken } from '@angular/core';\n\nexport interface FilesUploadTexts {\n settingsAriaLabel: string;\n dropzoneLabel: string;\n dropzoneButton: string;\n conflictPolicyLabel: string;\n metadataLabel: string;\n progressAriaLabel: string;\n rateLimitBanner: string;\n}\n\nexport const FILES_UPLOAD_TEXTS = new InjectionToken<FilesUploadTexts>(\n 'FILES_UPLOAD_TEXTS',\n {\n providedIn: 'root',\n factory: () => ({\n settingsAriaLabel: 'Abrir configurações',\n dropzoneLabel: 'Arraste arquivos ou',\n dropzoneButton: 'selecionar',\n conflictPolicyLabel: 'Política de conflito',\n metadataLabel: 'Metadados (JSON)',\n progressAriaLabel: 'Progresso do upload',\n rateLimitBanner: 'Limite de requisições excedido. Tente novamente às',\n }),\n },\n);\n","import { HttpHeaders } from '@angular/common/http';\nimport { Inject, Injectable, InjectionToken, Optional } from '@angular/core';\nimport { ErrorResponse } from '../types';\nimport { getErrorMeta } from './error-catalog';\n\nexport interface RateLimitInfo {\n limit: number;\n remaining: number;\n resetEpochSeconds: number;\n}\n\nexport interface MappedError {\n message: string;\n rateLimit?: RateLimitInfo;\n // metadados opcionais\n title?: string;\n severity?: 'info' | 'warn' | 'error';\n category?: string;\n phase?: string;\n userAction?: string;\n}\n\n// Tipo local para tradução opcional\nexport interface TranslateLike {\n instant(key: string): string;\n}\n\nexport const TRANSLATE_LIKE = new InjectionToken<TranslateLike>('TRANSLATE_LIKE');\n\nexport const FILES_UPLOAD_ERROR_MESSAGES = new InjectionToken<\n Partial<Record<string, string>>\n>('FILES_UPLOAD_ERROR_MESSAGES');\n\nconst DEFAULT_MESSAGES: Record<string, string> = {\n INVALID_FILE_TYPE: 'Tipo de arquivo inválido.',\n FILE_TOO_LARGE: 'Arquivo muito grande.',\n NOT_FOUND: 'Arquivo não encontrado.',\n UNAUTHORIZED: 'Requisição não autorizada.',\n RATE_LIMIT_EXCEEDED: 'Limite de requisições excedido.',\n INTERNAL_ERROR: 'Erro interno do servidor.',\n QUOTA_EXCEEDED: 'Cota excedida.',\n SEC_VIRUS_DETECTED: 'Vírus detectado no arquivo.',\n SEC_MALICIOUS_CONTENT: 'Conteúdo malicioso detectado.',\n SEC_DANGEROUS_TYPE: 'Tipo de arquivo perigoso.',\n FMT_MAGIC_MISMATCH: 'Conteúdo do arquivo incompatível.',\n FMT_CORRUPTED: 'Arquivo corrompido.',\n FMT_UNSUPPORTED: 'Formato de arquivo não suportado.',\n SYS_STORAGE_ERROR: 'Erro de armazenamento.',\n SYS_SERVICE_DOWN: 'Serviço indisponível.',\n SYS_RATE_LIMIT: 'Limite de requisições excedido.',\n\n // aliases em português vindos do backend\n ARQUIVO_MUITO_GRANDE: 'Arquivo muito grande.',\n TIPO_ARQUIVO_INVALIDO: 'Tipo de arquivo inválido.',\n TIPO_MIDIA_NAO_SUPORTADO: 'Tipo de mídia não suportado.',\n CAMPO_OBRIGATORIO_AUSENTE: 'Campo obrigatório ausente.',\n OPCOES_JSON_INVALIDAS: 'JSON de opções inválido.',\n ARGUMENTO_INVALIDO: 'Argumento inválido.',\n NAO_AUTORIZADO: 'Autenticação necessária.',\n ERRO_INTERNO: 'Erro interno do servidor.',\n LIMITE_TAXA_EXCEDIDO: 'Limite de taxa excedido.',\n COTA_EXCEDIDA: 'Cota excedida.',\n ARQUIVO_JA_EXISTE: 'Arquivo já existe.',\n};\n\n@Injectable({ providedIn: 'root' })\nexport class ErrorMapperService {\n constructor(\n @Optional()\n @Inject(FILES_UPLOAD_ERROR_MESSAGES)\n private readonly customMessages?: Partial<Record<string, string>>,\n @Optional() @Inject(TRANSLATE_LIKE) private readonly translate?: TranslateLike,\n ) {}\n\n map(error: ErrorResponse, headers?: HttpHeaders): MappedError {\n const code = String(error.code || 'UNKNOWN_ERROR');\n const key = `praxis.filesUpload.errors.${code}`;\n const translated = this.translate?.instant(key);\n const message =\n (translated && translated !== key ? translated : undefined) ??\n this.customMessages?.[code] ??\n DEFAULT_MESSAGES[code] ??\n error.message ??\n 'Erro desconhecido.';\n\n // metadados do catálogo\n const meta = getErrorMeta(code);\n const mapped: MappedError = {\n message,\n title: meta.title,\n severity: meta.severity,\n category: meta.category,\n phase: meta.phase,\n userAction: meta.userAction,\n };\n\n const isRateLimit =\n code === 'LIMITE_TAXA_EXCEDIDO' ||\n code === 'RATE_LIMIT_EXCEEDED' ||\n code === 'SYS_RATE_LIMIT';\n\n if (isRateLimit) {\n const limit = Number(headers?.get('X-RateLimit-Limit'));\n const remaining = Number(headers?.get('X-RateLimit-Remaining'));\n const resetEpochSeconds = Number(headers?.get('X-RateLimit-Reset'));\n if (\n !Number.isNaN(limit) &&\n !Number.isNaN(remaining) &&\n !Number.isNaN(resetEpochSeconds)\n ) {\n mapped.rateLimit = { limit, remaining, resetEpochSeconds };\n }\n }\n\n return mapped;\n }\n}\n","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\n\nfunction toError(key: string, info: any): ValidationErrors {\n return { [key]: info } as ValidationErrors;\n}\n\nfunction ensureFiles(value: any): File[] {\n if (!value) return [];\n return Array.isArray(value) ? value : [value];\n}\n\nexport function acceptValidator(allowed: string[]): ValidatorFn {\n const normalized = (allowed || []).map((a) => a.toLowerCase());\n const acceptAll = normalized.includes('*');\n return (control: AbstractControl): ValidationErrors | null => {\n if (acceptAll) return null;\n const files = ensureFiles(control.value);\n if (!files.length) return null;\n const invalid = files.find((f) => {\n const type = (f as any).type ? String((f as any).type).toLowerCase() : '';\n const name = (f as any).name ? String((f as any).name).toLowerCase() : '';\n const ext = name.includes('.')\n ? name.substring(name.lastIndexOf('.'))\n : '';\n return !normalized.some((a) => {\n if (a.endsWith('/*')) {\n return type.startsWith(a.slice(0, -1));\n }\n if (a.startsWith('.')) {\n return ext === a;\n }\n return type === a;\n });\n });\n return invalid ? toError('accept', { allowed }) : null;\n };\n}\n\nexport function maxFileSizeValidator(maxBytes: number): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const files = ensureFiles(control.value);\n if (!files.length) return null;\n const tooBig = files.find((f) => (f as any).size > maxBytes);\n return tooBig ? toError('maxFileSize', { max: maxBytes }) : null;\n };\n}\n\nexport function maxFilesPerBulkValidator(maxFiles: number): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const files = ensureFiles(control.value);\n if (!files.length) return null;\n return files.length > maxFiles\n ? toError('maxFilesPerBulk', { max: maxFiles, actual: files.length })\n : null;\n };\n}\n\nexport function maxBulkSizeValidator(maxBytes: number): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const files = ensureFiles(control.value);\n if (!files.length) return null;\n const total = files.reduce((sum, f) => sum + ((f as any).size || 0), 0);\n return total > maxBytes\n ? toError('maxBulkSize', { max: maxBytes, actual: total })\n : null;\n };\n}\n","import { Injectable, NgZone, OnDestroy } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\nexport interface DragPointer {\n x: number;\n y: number;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class DragProximityService implements OnDestroy {\n private draggingWithFiles$ = new BehaviorSubject<boolean>(false);\n private pointer$ = new BehaviorSubject<DragPointer>({ x: -9999, y: -9999 });\n private dragCounter = 0;\n\n constructor(private zone: NgZone) {\n this.zone.runOutsideAngular(() => {\n window.addEventListener('dragenter', this.onDragEnter, { passive: true });\n window.addEventListener('dragleave', this.onDragLeave, { passive: true });\n window.addEventListener('dragover', this.onDragOver, { passive: true });\n window.addEventListener('drop', this.onDrop, { passive: true });\n });\n }\n\n ngOnDestroy(): void {\n window.removeEventListener('dragenter', this.onDragEnter as any);\n window.removeEventListener('dragleave', this.onDragLeave as any);\n window.removeEventListener('dragover', this.onDragOver as any);\n window.removeEventListener('drop', this.onDrop as any);\n }\n\n isDraggingWithFiles(): Observable<boolean> {\n return this.draggingWithFiles$.asObservable();\n }\n\n pointer(): Observable<DragPointer> {\n return this.pointer$.asObservable();\n }\n\n withinProximity(rect: DOMRect, proximityPx: number, pt: DragPointer | null = null): boolean {\n const p = pt ?? this.pointer$.value;\n const left = rect.left - proximityPx;\n const top = rect.top - proximityPx;\n const right = rect.right + proximityPx;\n const bottom = rect.bottom + proximityPx;\n return p.x >= left && p.x <= right && p.y >= top && p.y <= bottom;\n }\n\n private onDragEnter = (e: DragEvent) => {\n this.dragCounter++;\n const hasFiles = !!e.dataTransfer && Array.from(e.dataTransfer.types || []).includes('Files');\n if (hasFiles) this.draggingWithFiles$.next(true);\n };\n\n private onDragLeave = (_e: DragEvent) => {\n this.dragCounter = Math.max(0, this.dragCounter - 1);\n if (this.dragCounter === 0) {\n this.draggingWithFiles$.next(false);\n this.pointer$.next({ x: -9999, y: -9999 });\n }\n };\n\n private onDragOver = (e: DragEvent) => {\n this.pointer$.next({ x: e.clientX, y: e.clientY });\n };\n\n private onDrop = (_e: DragEvent) => {\n this.dragCounter = 0;\n this.draggingWithFiles$.next(false);\n this.pointer$.next({ x: -9999, y: -9999 });\n };\n}\n\n","import { HttpClient, HttpEvent } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { Observable, retry } from 'rxjs';\n\nexport interface PresignResponse {\n uploadUrl: string;\n headers?: Record<string, string>;\n fields?: Record<string, string>;\n}\n\n/**\n * Options for a single file upload.\n */\nexport interface UploadOptions {\n /** Backend options JSON (FileUploadOptionsRecord), enviado no campo 'options'. */\n optionsJson?: string;\n /** Metadados por arquivo (serializado em 'metadata'). */\n metadata?: Record<string, unknown>;\n /** Política de conflito (serializada em 'conflictPolicy'). */\n conflictPolicy?: string;\n /** Número de tentativas de retry. */\n retryCount?: number;\n}\n\n/**\n * Represents a file for bulk uploads.\n */\nexport interface BulkUploadFile {\n file: File;\n metadata?: Record<string, unknown>;\n conflictPolicy?: string;\n}\n\n/**\n * Options applied to a bulk upload request.\n */\nexport interface BulkUploadOptions {\n /** Backend options JSON (FileUploadOptionsRecord), enviado no campo 'options'. */\n optionsJson?: string;\n /** failFast (alias de failFastMode) conforme backend. */\n failFast?: boolean;\n /** failFastMode legado. */\n failFastMode?: boolean;\n /** Número de tentativas de retry. */\n retryCount?: number;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class FilesApiClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Upload a single file com metadata/conflictPolicy (compat) e/ou options JSON.\n */\n upload(\n baseUrl: string,\n file: File,\n options: UploadOptions = {},\n ): Observable<HttpEvent<unknown>> {\n const formData = new FormData();\n formData.append('file', file);\n if (options.optionsJson) formData.append('options', options.optionsJson);\n if (options.metadata) formData.append('metadata', JSON.stringify(options.metadata));\n if (options.conflictPolicy) formData.append('conflictPolicy', options.conflictPolicy);\n\n return this.http\n .post<unknown>(`${baseUrl}/upload`, formData, {\n reportProgress: true,\n observe: 'events',\n })\n .pipe(retry(options.retryCount ?? 0));\n }\n\n /**\n * Upload múltiplo com arrays de metadata/conflictPolicy (compat) e/ou options JSON.\n */\n bulkUpload(\n baseUrl: string,\n files: BulkUploadFile[],\n options: BulkUploadOptions = {},\n ): Observable<HttpEvent<unknown>> {\n const formData = new FormData();\n\n files.forEach((f) => {\n formData.append('files', f.file);\n });\n\n if (options.optionsJson) formData.append('options', options.optionsJson);\n\n // Suporte a failFast/failFastMode\n const ff = options.failFast ?? options.failFastMode;\n if (ff !== undefined) formData.append('failFast', String(ff));\n\n // Arrays de metadata/políticas quando presentes\n const metas = files.map((f) => f.metadata ?? null);\n if (metas.some((m) => m !== null)) {\n formData.append('metadata', JSON.stringify(metas));\n }\n const policies = files.map((f) => f.conflictPolicy ?? null);\n if (policies.some((p) => p !== null)) {\n formData.append('conflictPolicy', JSON.stringify(policies));\n }\n\n return this.http\n .post<unknown>(`${baseUrl}/bulk`, formData, {\n reportProgress: true,\n observe: 'events',\n })\n .pipe(retry(options.retryCount ?? 0));\n }\n\n presign(baseUrl: string, fileName: string): Observable<PresignResponse> {\n // Backend: POST /upload/presign?filename=...\n const url = `${baseUrl}/upload/presign?filename=${encodeURIComponent(\n fileName,\n )}`;\n return this.http.post<PresignResponse>(url, null, { observe: 'body' });\n }\n}\n","import { HttpClient, HttpEvent } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { Observable, retry } from 'rxjs';\nimport { PresignResponse } from './files-api-client.service';\n\n@Injectable({ providedIn: 'root' })\nexport class PresignedUploaderService {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Uploads a file to a presigned URL and retries when configured.\n */\n upload(\n target: PresignResponse,\n file: File,\n retryCount = 0,\n ): Observable<HttpEvent<unknown>> {\n const formData = new FormData();\n if (target.fields) {\n Object.entries(target.fields).forEach(([key, value]) => {\n formData.append(key, value);\n });\n }\n formData.append('file', file);\n return this.http\n .post<unknown>(target.uploadUrl, formData, {\n headers: target.headers,\n observe: 'events',\n reportProgress: true,\n withCredentials: false,\n })\n .pipe(retry(retryCount));\n }\n}\n","import {\n Component,\n EventEmitter,\n Inject,\n Input,\n OnInit,\n Optional,\n Output,\n ViewChild,\n ElementRef,\n AfterViewInit,\n OnDestroy,\n TemplateRef,\n ViewContainerRef,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormControl, ValidatorFn } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatMenuModule } from '@angular/material/menu';\nimport {\n HttpEvent,\n HttpEventType,\n HttpErrorResponse,\n} from '@angular/common/http';\nimport { CONFIG_STORAGE, ConfigStorage, PraxisIconDirective } from '@praxisui/core';\nimport { SettingsPanelService } from '@praxisui/settings-panel';\nimport {\n ErrorResponse,\n FileMetadata,\n UploadResponse,\n BulkUploadResponse,\n BulkUploadFileResult,\n BulkUploadResultStatus,\n ScanStatus,\n} from '../../types';\nimport { PraxisFilesUploadConfigEditor } from '../../config/praxis-files-upload-config-editor';\nimport {\n FilesApiClient,\n BulkUploadFile,\n UploadOptions,\n} from '../../services/files-api-client.service';\nimport { PresignedUploaderService } from '../../services/presigned-uploader.service';\nimport {\n ErrorMapperService,\n RateLimitInfo,\n} from '../../services/error-mapper.service';\nimport {\n FILES_UPLOAD_TEXTS,\n FilesUploadTexts,\n} from '../../i18n/files-upload.i18n';\nimport {\n TRANSLATE_LIKE,\n TranslateLike,\n} from '../../services/error-mapper.service';\nimport {\n acceptValidator,\n maxBulkSizeValidator,\n maxFileSizeValidator,\n maxFilesPerBulkValidator,\n} from '../../validators/file-upload.validators';\nimport { DragProximityService } from '../../services/drag-proximity.service';\nimport { Subscription, debounceTime } from 'rxjs';\n\nimport { FilesUploadConfig } from '../../models';\n// Removido import do ConfigService (injeção direta)\nimport { EffectiveUploadConfig } from '../../types';\n\n// Novos imports CDK Overlay/Portal e Tooltip\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\n@Component({\n selector: 'praxis-files-upload',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MatButtonModule,\n MatIconModule,\n PraxisIconDirective,\n MatProgressBarModule,\n MatMenuModule,\n MatTooltipModule,\n ],\n styleUrl: './praxis-files-upload.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"praxis-files-upload\" [class.dense]=\"config?.ui?.dense\" #host>\n <!-- Proximity overlay inline (fallback quando expandMode === 'inline') -->\n <div\n class=\"proximity-overlay\"\n *ngIf=\"\n showProximityOverlay &&\n (config?.ui?.dropzone?.expandMode ?? 'overlay') === 'inline'\n \"\n [style.height.px]=\"config?.ui?.dropzone?.expandHeight ?? 200\"\n aria-hidden=\"true\"\n >\n <mat-icon class=\"dz-icon\" aria-hidden=\"true\" [praxisIcon]=\"'cloud_upload'\"></mat-icon>\n <p class=\"dz-title\">{{ texts.dropzoneLabel }}</p>\n <p class=\"dz-hint\">Solte aqui para enviar</p>\n </div>\n <!-- Template do overlay de proximidade (renderizado via CDK Overlay) -->\n <ng-template #proximityOverlayTmpl>\n <div class=\"proximity-overlay\" aria-hidden=\"true\">\n <mat-icon class=\"dz-icon\" aria-hidden=\"true\" [praxisIcon]=\"'cloud_upload'\"></mat-icon>\n <p class=\"dz-title\">{{ texts.dropzoneLabel }}</p>\n <p class=\"dz-hint\">Solte aqui para enviar</p>\n </div>\n </ng-template>\n\n <!-- Overlay de seleção (lista de arquivos selecionados + ações) -->\n <ng-container *ngIf=\"displayMode === 'full'\">\n <ng-template #selectedOverlayTmpl>\n <div\n class=\"selected-overlay\"\n role=\"dialog\"\n aria-label=\"Arquivos selecionados\"\n >\n <header class=\"sel-header\">\n <span class=\"title\">Selecionados ({{ pendingCount }})</span>\n <span class=\"spacer\"></span>\n <button\n mat-stroked-button\n color=\"primary\"\n (click)=\"triggerUpload()\"\n [disabled]=\"!baseUrl || isUploading\"\n >\n Enviar\n </button>\n <button mat-button type=\"button\" (click)=\"clearSelection()\">\n Cancelar\n </button>\n </header>\n <ul class=\"sel-list\">\n <li *ngFor=\"let f of pendingFiles\" class=\"sel-item\">\n <mat-icon class=\"file-icon\" aria-hidden=\"true\"\n >insert_drive_file</mat-icon\n >\n <div class=\"info\">\n <div class=\"name\" [matTooltip]=\"displayFileName(f)\">\n {{ displayFileName(f) }}\n </div>\n <div class=\"meta\">\n {{ f.type || '—' }} • {{ formatBytes(f.size) }}\n </div>\n </div>\n <button\n mat-icon-button\n class=\"remove-btn\"\n [matTooltip]=\"t('remove', 'Remover')\"\n (click)=\"removePendingFile(f)\"\n [attr.aria-label]=\"t('remove', 'Remover')\"\n >\n <mat-icon [praxisIcon]=\"'close'\"></mat-icon>\n </button>\n <button\n mat-icon-button\n class=\"more-btn\"\n [matMenuTriggerFor]=\"fileMenu\"\n [matMenuTriggerData]=\"{ file: f }\"\n aria-haspopup=\"menu\"\n [matTooltip]=\"t('moreActions', 'Mais ações')\"\n [attr.aria-label]=\"t('moreActions', 'Mais ações')\"\n >\n <mat-icon [praxisIcon]=\"'more_horiz'\"></mat-icon>\n </button>\n <mat-menu\n #fileMenu=\"matMenu\"\n xPosition=\"before\"\n yPosition=\"below\"\n >\n <button mat-menu-item (click)=\"onRetry(f)\">\n <mat-icon [praxisIcon]=\"'refresh'\"></mat-icon>\n <span>{{ t('retry', 'Reenviar') }}</span>\n </button>\n <button mat-menu-item (click)=\"onDownload(f)\">\n <mat-icon [praxisIcon]=\"'download'\"></mat-icon>\n <span>{{ t('download', 'Baixar') }}</span>\n </button>\n <button mat-menu-item (click)=\"onCopyLink(f)\">\n <mat-icon [praxisIcon]=\"'link'\"></mat-icon>\n <span>{{ t('copyLink', 'Copiar link') }}</span>\n </button>\n </mat-menu>\n </li>\n </ul>\n </div>\n </ng-template>\n </ng-container>\n\n <button\n type=\"button\"\n mat-icon-button\n class=\"settings-btn\"\n (click)=\"openSettings()\"\n [attr.aria-label]=\"texts.settingsAriaLabel\"\n >\n <mat-icon [praxisIcon]=\"'settings'\"></mat-icon>\n </button>\n <div\n class=\"rate-limit-banner\"\n *ngIf=\"rateLimit && config?.rateLimit?.showBannerOn429 !== false\"\n >\n {{ texts.rateLimitBanner }}\n {{ rateLimit.resetEpochSeconds * 1000 | date: 'shortTime' }}.\n </div>\n <div\n class=\"quota-banner\"\n *ngIf=\"quotaExceeded && config?.quotas?.showQuotaWarnings !== false\"\n >\n {{ errorMessage }}\n </div>\n <div class=\"error\" *ngIf=\"errorMessage && !quotaExceeded\">\n {{ errorMessage }}\n </div>\n <div class=\"error\" *ngIf=\"!baseUrl\">\n Base URL não configurada. Informe [baseUrl] para habilitar o envio.\n </div>\n <div\n class=\"dropzone\"\n *ngIf=\"config?.ui?.showDropzone !== false\"\n [attr.role]=\"\n !baseUrl ||\n (quotaExceeded && config?.quotas?.blockOnExceed) ||\n isUploading\n ? null\n : 'button'\n \"\n [attr.tabindex]=\"\n !baseUrl ||\n (quotaExceeded && config?.quotas?.blockOnExceed) ||\n isUploading\n ? -1\n : 0\n \"\n [class.dragover]=\"isDragging\"\n [class.disabled]=\"\n !baseUrl ||\n (quotaExceeded && config?.quotas?.blockOnExceed) ||\n isUploading\n \"\n [attr.aria-disabled]=\"\n !baseUrl ||\n (quotaExceeded && config?.quotas?.blockOnExceed) ||\n isUploading\n ? 'true'\n : 'false'\n \"\n [attr.aria-label]=\"texts.dropzoneLabel + ' ' + texts.dropzoneButton\"\n (click)=\"\n !baseUrl ||\n (quotaExceeded && config?.quotas?.blockOnExceed) ||\n isUploading\n ? null\n : openFile(fileInput)\n \"\n (drop)=\"onDrop($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (keydown.enter)=\"\n $event.preventDefault();\n !baseUrl ||\n (quotaExceeded && config?.quotas?.blockOnExceed) ||\n isUploading\n ? null\n : openFile(fileInput)\n \"\n (keydown.space)=\"\n $event.preventDefault();\n !baseUrl ||\n (quotaExceeded && config?.quotas?.blockOnExceed) ||\n isUploading\n ? null\n : openFile(fileInput)\n \"\n >\n <!-- Ações internas (ícones) -->\n <div class=\"field-actions\" aria-hidden=\"false\">\n <button\n mat-icon-button\n [matTooltip]=\"'Selecionar arquivo(s)'\"\n (click)=\"$event.stopPropagation(); openFile(fileInput)\"\n [disabled]=\"!baseUrl || isUploading\"\n >\n <mat-icon [praxisIcon]=\"'attach_file'\"></mat-icon>\n </button>\n <button\n mat-icon-button\n [matTooltip]=\"policiesSummary\"\n (click)=\"$event.stopPropagation()\"\n [disabled]=\"false\"\n >\n <mat-icon [praxisIcon]=\"'info'\"></mat-icon>\n </button>\n </div>\n\n <mat-icon class=\"dz-icon\" aria-hidden=\"true\" [praxisIcon]=\"'cloud_upload'\"></mat-icon>\n <p class=\"dz-title\">{{ texts.dropzoneLabel }}</p>\n <p class=\"dz-hint\">\n Arraste e solte arquivos aqui ou clique para selecionar\n </p>\n <button type=\"button\" mat-stroked-button (click)=\"openFile(fileInput)\">\n {{ texts.dropzoneButton }}\n </button>\n </div>\n\n <input\n type=\"file\"\n #fileInput\n (change)=\"onFilesSelected($event)\"\n [attr.multiple]=\"allowMultiple ? '' : null\"\n [accept]=\"acceptString\"\n hidden\n />\n\n <!-- Removido bloco pending-files: substituído por overlay de seleção -->\n\n <div\n class=\"conflict-policy\"\n *ngIf=\"config?.ui?.showConflictPolicySelector\"\n >\n <label for=\"conflictPolicy\">{{ texts.conflictPolicyLabel }}</label>\n <select id=\"conflictPolicy\" [formControl]=\"conflictPolicy\">\n <option *ngFor=\"let p of conflictPolicies\" [value]=\"p\">\n {{ p }}\n </option>\n </select>\n </div>\n\n <div class=\"metadata\" *ngIf=\"config?.ui?.showMetadataForm\">\n <label for=\"metadata\">{{ texts.metadataLabel }}</label>\n <textarea id=\"metadata\" [formControl]=\"metadata\"></textarea>\n <div class=\"error\" *ngIf=\"metadataError\">{{ metadataError }}</div>\n </div>\n\n <div class=\"progress\" *ngIf=\"showProgress\">\n <mat-progress-bar\n mode=\"determinate\"\n [value]=\"uploadProgress\"\n [attr.aria-label]=\"texts.progressAriaLabel\"\n ></mat-progress-bar>\n <span class=\"sr-only\">{{ uploadProgress }}%</span>\n </div>\n\n <ul class=\"file-feedback\" *ngIf=\"hasUploadedFiles\">\n <li *ngFor=\"let f of uploadedFiles\">\n {{ f.fileName }} -\n {{\n f.success ? t('statusSuccess', 'Enviado') : t('statusError', 'Erro')\n }}\n </li>\n </ul>\n\n <section class=\"bulk-results\" *ngIf=\"hasLastResults\">\n <header class=\"bulk-summary\" *ngIf=\"lastStats\">\n <div class=\"stat\">\n <span class=\"label\">Total</span>\n <span class=\"value\">{{ lastStats.total }}</span>\n </div>\n <div class=\"stat success\">\n <mat-icon [praxisIcon]=\"'check_circle'\"></mat-icon>\n <span class=\"label\">Sucesso</span>\n <span class=\"value\">{{ lastStats.succeeded }}</span>\n </div>\n <div class=\"stat failed\">\n <mat-icon [praxisIcon]=\"'error'\"></mat-icon>\n <span class=\"label\">Falhas</span>\n <span class=\"value\">{{ lastStats.failed }}</span>\n </div>\n </header>\n <ul class=\"results-list\">\n <li\n class=\"result-item\"\n *ngFor=\"let r of visibleResults\"\n [class.ok]=\"r.status === BulkUploadResultStatus.SUCCESS\"\n [class.err]=\"r.status === BulkUploadResultStatus.FAILED\"\n >\n <mat-icon class=\"status-icon\">{{\n r.status === BulkUploadResultStatus.SUCCESS\n ? 'check_circle'\n : 'error'\n }}</mat-icon>\n <div class=\"main\">\n <div class=\"title\">\n <span class=\"name\">{{ r.fileName }}</span>\n <span\n class=\"badge\"\n *ngIf=\"r.status === BulkUploadResultStatus.SUCCESS\"\n >{{ t('statusSuccess', 'Enviado') }}</span\n >\n <span\n class=\"badge err\"\n *ngIf=\"r.status === BulkUploadResultStatus.FAILED\"\n >{{ t('statusError', 'Erro') }}</span\n >\n </div>\n <div class=\"meta\" *ngIf=\"r.file\">\n <span *ngIf=\"r.file.id\">ID: {{ r.file.id }}</span>\n <span *ngIf=\"r.file.contentType\"\n >Tipo: {{ r.file.contentType }}</span\n >\n <span *ngIf=\"r.file.fileSize\"\n >Tamanho: {{ formatBytes(r.file.fileSize) }}</span\n >\n <span *ngIf=\"r.file.uploadedAt\"\n >Enviado em: {{ r.file.uploadedAt | date: 'short' }}</span\n >\n </div>\n <div class=\"error\" *ngIf=\"r.error as e\">\n <span class=\"code\">{{ e.code }}</span>\n <ng-container *ngIf=\"mapErrorFull(e) as me\">\n <span class=\"title\" *ngIf=\"me.title\">{{ me.title }}:</span>\n <span class=\"msg\">{{ me.message }}</span>\n <span class=\"action\" *ngIf=\"me.userAction\">\n — {{ me.userAction }}</span\n >\n </ng-container>\n <span class=\"trace\" *ngIf=\"e.traceId\"\n >(trace {{ e.traceId }})</span\n >\n </div>\n <div class=\"extra\" *ngIf=\"r.file?.metadata as m\">\n <details (toggle)=\"onDetailsToggle($event, r)\">\n <summary>Metadados</summary>\n <pre>{{ m | json }}</pre>\n </details>\n </div>\n </div>\n <div class=\"item-actions\">\n <button\n mat-icon-button\n [matTooltip]=\"'Detalhes'\"\n (click)=\"toggleDetailsFor(r)\"\n >\n <mat-icon [praxisIcon]=\"'info'\"></mat-icon>\n </button>\n <button\n mat-icon-button\n [matTooltip]=\"'Reenviar'\"\n (click)=\"onRetry(r)\"\n [disabled]=\"isUploading\"\n >\n <mat-icon [praxisIcon]=\"'refresh'\"></mat-icon>\n </button>\n <button\n mat-icon-button\n [matTooltip]=\"'Baixar'\"\n (click)=\"onDownload(r)\"\n [disabled]=\"r.status !== BulkUploadResultStatus.SUCCESS\"\n >\n <mat-icon [praxisIcon]=\"'download'\"></mat-icon>\n </button>\n <button\n mat-icon-button\n [matTooltip]=\"'Copiar link'\"\n (click)=\"onCopyLink(r)\"\n [disabled]=\"r.status !== BulkUploadResultStatus.SUCCESS\"\n >\n <mat-icon [praxisIcon]=\"'link'\"></mat-icon>\n </button>\n <button\n mat-icon-button\n [matTooltip]=\"'Remover'\"\n (click)=\"removeResult(r)\"\n >\n <mat-icon [praxisIcon]=\"'close'\"></mat-icon>\n </button>\n </div>\n </li>\n </ul>\n <div\n class=\"list-footer\"\n *ngIf=\"\n !showAllResults &&\n lastResults &&\n lastResults.length > (config?.ui?.list?.collapseAfter ?? 0)\n \"\n >\n <button mat-button type=\"button\" (click)=\"showAllResults = true\">\n Ver todos\n </button>\n </div>\n <div\n class=\"list-footer\"\n *ngIf=\"\n showAllResults &&\n (config?.ui?.list?.collapseAfter ?? 0) > 0 &&\n lastResults &&\n lastResults.length > (config?.ui?.list?.collapseAfter ?? 0)\n \"\n >\n <button mat-button type=\"button\" (click)=\"showAllResults = false\">\n Ver menos\n </button>\n </div>\n </section>\n\n <ng-content></ng-content>\n </div>\n `,\n})\nexport class PraxisFilesUpload implements OnInit, AfterViewInit, OnDestroy {\n @Input() config: FilesUploadConfig | null = null;\n @Input() componentId = 'default';\n @Input() baseUrl?: string;\n @Input() displayMode: 'full' | 'compact' = 'full';\n\n @Output() uploadSuccess = new EventEmitter<{ file: FileMetadata }>();\n @Output() bulkComplete = new EventEmitter<BulkUploadResponse>();\n @Output() error = new EventEmitter<ErrorResponse>();\n @Output() rateLimited = new EventEmitter<RateLimitInfo>();\n // Novos outputs Sub-issue 4\n @Output() retry = new EventEmitter<BulkUploadFileResult>();\n @Output() download = new EventEmitter<BulkUploadFileResult>();\n @Output() copyLink = new EventEmitter<BulkUploadFileResult>();\n @Output() detailsOpened = new EventEmitter<BulkUploadFileResult>();\n @Output() detailsClosed = new EventEmitter<BulkUploadFileResult>();\n @Output() pendingFilesChange = new EventEmitter<File[]>();\n @Output() proximityChange = new EventEmitter<boolean>();\n\n @ViewChild('fileInput') private fileInput?: ElementRef<HTMLInputElement>;\n @ViewChild('host', { static: true })\n private hostRef?: ElementRef<HTMLElement>;\n @ViewChild('proximityOverlayTmpl') private overlayTmpl?: TemplateRef<any>;\n // Novo: template do overlay de seleção\n @ViewChild('selectedOverlayTmpl')\n private selectedOverlayTmpl?: TemplateRef<any>;\n\n conflictPolicies: Array<\n 'ERROR' | 'SKIP' | 'OVERWRITE' | 'MAKE_UNIQUE' | 'RENAME'\n > = ['RENAME', 'ERROR', 'OVERWRITE', 'SKIP', 'MAKE_UNIQUE'];\n conflictPolicy = new FormControl<string>('RENAME');\n uploadProgress = 0;\n allowMultiple = false;\n rateLimit: RateLimitInfo | null = null;\n quotaExceeded = false;\n errorMessage = '';\n acceptString = '';\n metadata = new FormControl('');\n uploadedFiles: Array<{ fileName: string; success: boolean }> = [];\n texts: FilesUploadTexts;\n\n // Estados para lista rica de resultados\n lastResults: BulkUploadFileResult[] | null = null;\n lastStats: { total: number; succeeded: number; failed: number } | null = null;\n\n // Expor enum no template\n BulkUploadResultStatus = BulkUploadResultStatus;\n\n private uploading = false;\n isDragging = false;\n private currentFiles: File[] = [];\n\n // Config efetiva do servidor para fallbacks\n private serverEffective?: EffectiveUploadConfig;\n\n // Proximidade/overlay\n showProximityOverlay = false;\n private proxSub?: Subscription;\n private proxPtrSub?: Subscription;\n private hostRect?: DOMRect;\n private draggingFiles = false;\n\n // CDK Overlay state\n private overlayRef?: OverlayRef;\n private escListener = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n this.hideProximityOverlay();\n this.hideSelectedOverlay();\n }\n };\n private windowDropListener = (_e: DragEvent) => {\n this.hideProximityOverlay();\n };\n private windowDragEndListener = (_e: DragEvent) => {\n this.hideProximityOverlay();\n };\n\n // Novo: overlay para seleção\n private selectedOverlayRef?: OverlayRef;\n\n // Lista: colapso\n showAllResults = false;\n\n constructor(\n private settingsPanel: SettingsPanelService,\n private dragProx: DragProximityService,\n @Inject(FILES_UPLOAD_TEXTS) private defaultTexts: FilesUploadTexts,\n private overlay: Overlay,\n private viewContainerRef: ViewContainerRef,\n private cdr: ChangeDetectorRef,\n @Optional() private api?: FilesApiClient,\n @Optional() private presign?: PresignedUploaderService,\n @Optional() private errors?: ErrorMapperService,\n @Optional() @Inject(TRANSLATE_LIKE) private translate?: TranslateLike,\n @Optional() @Inject(CONFIG_STORAGE) private configStorage?: ConfigStorage,\n ) {\n this.texts = defaultTexts;\n }\n\n // Helpers de UI\n get showProgress(): boolean {\n return this.uploading;\n }\n // Getter público para binding existente\n get isUploading(): boolean {\n return this.uploading;\n }\n get hasUploadedFiles(): boolean {\n return this.uploadedFiles.length > 0;\n }\n get pendingFiles(): File[] {\n return this.currentFiles;\n }\n get pendingCount(): number {\n return this.currentFiles.length;\n }\n get hasLastResults(): boolean {\n return Array.isArray(this.lastResults) && this.lastResults.length > 0;\n }\n\n // Abre o seletor de arquivo\n openFile(input: HTMLInputElement): void {\n if (!this.uploading) {\n input.click();\n }\n }\n\n // Expor método público para pais (wrapper) abrirem o seletor\n triggerSelect(): void {\n const el = this.fileInput?.nativeElement;\n if (el) this.openFile(el);\n }\n\n // Exibe nome de arquivo de forma segura\n displayFileName(f: any): string {\n return f && typeof f === 'object' && 'name' in f ? String(f.name) : '';\n }\n\n formatBytes(bytes: number | undefined | null): string {\n const b = typeof bytes === 'number' ? bytes : 0;\n if (b < 1024) return `${b} B`;\n const units = ['KB', 'MB', 'GB', 'TB'];\n let v = b / 1024;\n let i = 0;\n while (v >= 1024 && i < units.length - 1) {\n v /= 1024;\n i++;\n }\n return `${v.toFixed(1)} ${units[i]}`;\n }\n\n // Novo helper com metadados\n mapErrorFull(err: unknown) {\n if (!err) return { message: '' } as any;\n return this.errors ? this.errors.map(err as ErrorResponse) : (err as any);\n }\n\n get metadataError(): string | null {\n if (!this.config?.ui?.showMetadataForm) return null;\n const val = this.metadata.value;\n if (!val) return null;\n try {\n JSON.parse(val);\n return null;\n } catch {\n return this.t('invalidMetadata', 'Metadados inválidos.');\n }\n }\n\n ngOnInit(): void {\n const stored =\n this.configStorage?.loadConfig<FilesUploadConfig>(\n `files-upload-config:${this.componentId}`,\n ) ?? this.loadLocalConfig();\n if (stored) {\n this.config = stored;\n }\n this.applyConfig(this.config ?? {});\n this.resolveTexts();\n\n // Nota: carregamento da configuração efetiva do servidor foi desabilitado aqui\n // para evitar dependência de HttpClient em testes. O fallback permanece opcional.\n }\n\n ngAfterViewInit(): void {\n // Calcular retângulo do host\n this.hostRect = this.hostRef?.nativeElement.getBoundingClientRect();\n // Atualizar em resize/scroll simples (MVP)\n window.addEventListener('resize', this.updateHostRect, { passive: true });\n window.addEventListener('scroll', this.updateHostRect, { passive: true });\n\n const debounceMs = this.config?.ui?.dropzone?.expandDebounceMs ?? 120;\n this.proxSub = this.dragProx\n .isDraggingWithFiles()\n .pipe(debounceTime(debounceMs))\n .subscribe((dragging) => {\n this.draggingFiles = dragging;\n this.evalProximity();\n });\n this.proxPtrSub = this.dragProx\n .pointer()\n .pipe(debounceTime(debounceMs))\n .subscribe(() => this.evalProximity());\n\n // Listeners globais para fechar overlay\n window.addEventListener('keydown', this.escListener, { passive: true });\n window.addEventListener('drop', this.windowDropListener, { passive: true });\n window.addEventListener('dragend', this.windowDragEndListener, {\n passive: true,\n });\n // Garantir que overlay de seleção sincronize se já houver arquivos pendentes\n this.manageSelectedOverlay();\n }\n\n ngOnDestroy(): void {\n window.removeEventListener('resize', this.updateHostRect as any);\n window.removeEventListener('scroll', this.updateHostRect as any);\n this.proxSub?.unsubscribe();\n this.proxPtrSub?.unsubscribe();\n window.removeEventListener('keydown', this.escListener as any);\n window.removeEventListener('drop', this.windowDropListener as any);\n window.removeEventListener('dragend', this.windowDragEndListener as any);\n this.disposeOverlay();\n this.disposeSelectedOverlay();\n }\n\n private updateHostRect = () => {\n this.hostRect = this.hostRef?.nativeElement.getBoundingClientRect();\n this.syncOverlayGeometry();\n };\n\n private evalProximity(): void {\n const oldValue = this.showProximityOverlay;\n let newValue = false;\n\n const cfg = this.config?.ui?.dropzone;\n const enabled = cfg?.expandOnDragProximity !== false; // default true\n const blocked =\n !this.baseUrl ||\n (this.quotaExceeded && this.config?.quotas?.blockOnExceed) ||\n this.isUploading;\n\n if (enabled && this.hostRect && !blocked) {\n const proxPx = cfg?.proximityPx ?? 64;\n const near = this.dragProx.withinProximity(this.hostRect, proxPx);\n newValue = this.draggingFiles && near;\n }\n\n this.showProximityOverlay = newValue;\n this.manageOverlay();\n\n if (oldValue !== this.showProximityOverlay) {\n this.proximityChange.emit(this.showProximityOverlay);\n }\n }\n\n private manageOverlay(): void {\n const mode = this.config?.ui?.dropzone?.expandMode ?? 'overlay';\n if (mode !== 'overlay') {\n this.disposeOverlay();\n return;\n }\n if (this.showProximityOverlay) {\n this.ensureOverlay();\n } else {\n this.disposeOverlay();\n }\n }\n\n private ensureOverlay(): void {\n if (this.overlayRef || !this.hostRef || !this.overlayTmpl) {\n this.syncOverlayGeometry();\n return;\n }\n const hostEl = this.hostRef.nativeElement;\n const positionStrategy = this.overlay\n .position()\n .flexibleConnectedTo(hostEl)\n .withLockedPosition(true)\n .withPositions([\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'top',\n },\n ]);\n\n this.overlayRef = this.overlay.create({\n positionStrategy,\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n hasBackdrop: false,\n panelClass: 'praxis-files-upload-overlay-panel',\n });\n\n this.syncOverlayGeometry();\n\n const portal = new TemplatePortal(this.overlayTmpl, this.viewContainerRef);\n this.overlayRef.attach(portal);\n }\n\n private syncOverlayGeometry(): void {\n if (!this.overlayRef || !this.hostRef) return;\n const rect = this.hostRef.nativeElement.getBoundingClientRect();\n const height = this.config?.ui?.dropzone?.expandHeight ?? 200;\n this.overlayRef.updateSize({ width: rect.width, height });\n try {\n this.overlayRef.updatePosition();\n } catch {}\n }\n\n private disposeOverlay(): void {\n if (this.overlayRef) {\n try {\n this.overlayRef.detach();\n } catch {}\n try {\n this.overlayRef.dispose();\n } catch {}\n this.overlayRef = undefined;\n }\n }\n\n // Novo: gerenciamento do overlay de seleção\n private manageSelectedOverlay(): void {\n if (!this.hostRef || !this.selectedOverlayTmpl) return;\n if (this.pendingCount > 0 && !this.isUploading) {\n this.ensureSelectedOverlay();\n } else {\n this.hideSelectedOverlay();\n }\n this.cdr.markForCheck();\n }\n\n private ensureSelectedOverlay(): void {\n if (!this.hostRef || !this.selectedOverlayTmpl) return;\n if (!this.selectedOverlayRef) {\n const hostEl = this.hostRef.nativeElement;\n const positionStrategy = this.overlay\n .position()\n .flexibleConnectedTo(hostEl)\n .withLockedPosition(true)\n .withPositions([\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'top',\n },\n ]);\n this.selectedOverlayRef = this.overlay.create({\n positionStrategy,\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n hasBackdrop: false,\n panelClass: 'praxis-files-selected-overlay-panel',\n });\n // Tamanho acompanha o host, altura auto com limite via CSS\n const rect = hostEl.getBoundingClientRect();\n this.selectedOverlayRef.updateSize({ width: rect.width });\n try {\n this.selectedOverlayRef.updatePosition();\n } catch {}\n\n const portal = new TemplatePortal(\n this.selectedOverlayTmpl,\n this.viewContainerRef,\n );\n this.selectedOverlayRef.attach(portal);\n } else {\n this.syncSelectedOverlayGeometry();\n }\n }\n\n private syncSelectedOverlayGeometry(): void {\n if (!this.selectedOverlayRef || !this.hostRef) return;\n const rect = this.hostRef.nativeElement.getBoundingClientRect();\n this.selectedOverlayRef.updateSize({ width: rect.width });\n try {\n this.selectedOverlayRef.updatePosition();\n } catch {}\n }\n\n private hideSelectedOverlay(): void {\n if (this.selectedOverlayRef) {\n try {\n this.selectedOverlayRef.detach();\n } catch {}\n try {\n this.selectedOverlayRef.dispose();\n } catch {}\n this.selectedOverlayRef = undefined;\n }\n }\n\n private disposeSelectedOverlay(): void {\n this.hideSelectedOverlay();\n }\n\n private hideProximityOverlay(): void {\n if (this.showProximityOverlay) {\n this.showProximityOverlay = false;\n this.manageOverlay();\n }\n }\n\n // Helpers de configuração e armazenamento\n private resolveTexts(): void {\n this.texts = {\n settingsAriaLabel: this.t(\n 'settingsAriaLabel',\n this.defaultTexts.settingsAriaLabel,\n ),\n dropzoneLabel: this.t('dropzoneLabel', this.defaultTexts.dropzoneLabel),\n dropzoneButton: this.t(\n 'dropzoneButton',\n this.defaultTexts.dropzoneButton,\n ),\n conflictPolicyLabel: this.t(\n 'conflictPolicyLabel',\n this.defaultTexts.conflictPolicyLabel,\n ),\n metadataLabel: this.t('metadataLabel', this.defaultTexts.metadataLabel),\n progressAriaLabel: this.t(\n 'progressAriaLabel',\n this.defaultTexts.progressAriaLabel,\n ),\n rateLimitBanner: this.t(\n 'rateLimitBanner',\n this.defaultTexts.rateLimitBanner,\n ),\n };\n }\n\n t(key: string, fallback: string): string {\n const k = `praxis.filesUpload.${key}`;\n const v = this.translate?.instant(k);\n return v && v !== k ? v : fallback;\n }\n\n openSettings(): void {\n const configCopy = JSON.parse(JSON.stringify(this.config ?? {}));\n const ref = this.settingsPanel.open({\n id: `files-upload.${this.componentId}`,\n title: this.t('settingsTitle', 'Configuração de Upload de Arquivos'),\n content: {\n component: PraxisFilesUploadConfigEditor,\n inputs: { ...configCopy, baseUrl: this.baseUrl },\n },\n });\n\n ref.applied$.subscribe((cfg: FilesUploadConfig) => this.applyConfig(cfg));\n ref.saved$.subscribe((cfg: FilesUploadConfig) => {\n if (this.configStorage) {\n this.configStorage.saveConfig(\n `files-upload-config:${this.componentId}`,\n cfg,\n );\n } else {\n this.saveLocalConfig(cfg);\n }\n this.applyConfig(cfg);\n });\n ref.reset$.subscribe(() => {\n this.applyConfig(this.config ?? {});\n });\n }\n\n private applyConfig(cfg: FilesUploadConfig): void {\n this.config = { ...cfg };\n this.conflictPolicy.setValue(\n (cfg.limits?.defaultConflictPolicy ?? 'RENAME') as string,\n );\n this.allowMultiple = (cfg.limits?.maxFilesPerBulk ?? 1) > 1;\n const acc = cfg.ui?.accept ?? [];\n this.acceptString = acc.includes('*') ? '' : acc.join(',');\n }\n\n private loadLocalConfig(): FilesUploadConfig | null {\n try {\n const raw = localStorage.getItem(\n `files-upload-config:${this.componentId}`,\n );\n return raw ? (JSON.parse(raw) as FilesUploadConfig) : null;\n } catch {\n return null;\n }\n }\n\n private saveLocalConfig(cfg: FilesUploadConfig): void {\n try {\n localStorage.setItem(\n `files-upload-config:${this.componentId}`,\n JSON.stringify(cfg),\n );\n } catch {}\n }\n\n onDragOver(evt: DragEvent): void {\n evt.preventDefault();\n this.isDragging = true;\n }\n\n onDragLeave(_evt: DragEvent): void {\n this.isDragging = false;\n }\n\n onDrop(evt: DragEvent): void {\n evt.preventDefault();\n this.isDragging = false;\n this.hideProximityOverlay();\n if (evt.dataTransfer?.files?.length) {\n const files = Array.from(evt.dataTransfer.files);\n if (this.config?.ui?.manualUpload) {\n this.currentFiles = files;\n this.manageSelectedOverlay();\n this.pendingFilesChange.emit(this.currentFiles);\n } else {\n this.startUpload(files);\n }\n }\n }\n\n onFilesSelected(evt: Event): void {\n const input = evt.target as HTMLInputElement;\n if (input.files?.length) {\n const files = Array.from(input.files);\n if (this.config?.ui?.manualUpload) {\n this.currentFiles = files;\n this.manageSelectedOverlay();\n this.pendingFilesChange.emit(this.currentFiles);\n } else {\n this.startUpload(files);\n }\n input.value = '';\n }\n }\n\n triggerUpload(): void {\n if (this.currentFiles.length) {\n this.hideSelectedOverlay();\n this.startUpload(this.currentFiles);\n }\n }\n\n clearSelection(): void {\n this.currentFiles = [];\n this.pendingFilesChange.emit(this.currentFiles);\n this.errorMessage = '';\n this.hideSelectedOverlay();\n }\n\n // Remoção individual dentro do overlay de seleção\n removePendingFile(file: File): void {\n this.currentFiles = this.currentFiles.filter((f) => f !== file);\n this.pendingFilesChange.emit(this.currentFiles);\n this.manageSelectedOverlay();\n }\n\n private startUpload(files: File[]): void {\n if (\n !this.baseUrl ||\n (this.quotaExceeded && this.config?.quotas?.blockOnExceed)\n ) {\n return;\n }\n if (!this.api) {\n this.errorMessage = this.t(\n 'serviceUnavailable',\n 'Serviço de upload indisponível.',\n );\n return;\n }\n this.errorMessage = '';\n // Limpa resultados anteriores\n this.lastResults = null;\n this.lastStats = null;\n\n if (!this.validateFiles(files)) {\n return;\n }\n this.uploading = true;\n this.uploadProgress = 0;\n this.rateLimit = null;\n this.uploadedFiles = [];\n this.currentFiles = files;\n this.hideSelectedOverlay();\n\n let metadataObj: Record<string, unknown> | undefined;\n if (this.config?.ui?.showMetadataForm && this.metadata.value) {\n try {\n metadataObj = JSON.parse(this.metadata.value);\n } catch {\n const map = this.config?.messages?.errors || {};\n this.errorMessage =\n map['metadata'] || this.t('invalidMetadata', 'Metadados inválidos.');\n this.error.emit({} as ErrorResponse);\n this.uploading = false;\n return;\n }\n }\n\n const optionsJson = this.buildOptionsJson(metadataObj);\n\n const strategy = this.config?.strategy ?? 'direct';\n if (files.length > 1 && this.allowMultiple) {\n const policy = this.conflictPolicy.value || 'RENAME';\n const bulkFiles: BulkUploadFile[] = files.map((f) => ({\n file: f,\n metadata: metadataObj,\n conflictPolicy: policy,\n }));\n this.api!.bulkUpload(this.baseUrl, bulkFiles, {\n optionsJson,\n failFastMode: this.config?.limits?.failFast,\n retryCount: this.config?.bulk?.retryCount,\n }).subscribe({\n next: (event) => {\n if (event.type === HttpEventType.Response) {\n const resp = event.body as BulkUploadResponse;\n this.bulkComplete.emit(resp);\n // Preenche estados ricos\n this.lastResults = resp?.results ?? null;\n this.lastStats = resp?.stats ?? null;\n this.finishUpload(true, undefined, resp.results);\n } else {\n this.handleProgress(event);\n }\n },\n error: (err) => this.handleError(err),\n });\n } else if (strategy === 'presign' || strategy === 'auto') {\n const file = files[0];\n if (!this.presign) {\n // Fallback para envio direto\n this.directUpload(file, {\n optionsJson,\n retryCount: this.config?.bulk?.retryCount,\n });\n return;\n }\n this.api.presign(this.baseUrl, file.name).subscribe({\n next: (target) => {\n this.presign!.upload(\n target,\n file,\n this.config?.bulk?.retryCount ?? 0,\n ).subscribe({\n next: (event) => {\n if (event.type === HttpEventType.Response) {\n this.finishUpload(true, {\n id: '',\n fileName: file.name,\n contentType: file.type,\n fileSize: file.size,\n uploadedAt: new Date().toISOString(),\n tenantId: '',\n scanStatus: ScanStatus.PENDING,\n });\n } else {\n this.handleProgress(event);\n }\n },\n error: (err) => {\n if (strategy === 'auto') {\n this.directUpload(file, {\n optionsJson,\n retryCount: this.config?.bulk?.retryCount,\n });\n } else {\n this.handleError(err);\n }\n },\n });\n },\n error: (err) => {\n if (strategy === 'auto') {\n this.directUpload(file, {\n optionsJson,\n retryCount: this.config?.bulk?.retryCount,\n });\n } else {\n this.handleError(err);\n }\n },\n });\n } else {\n const file = files[0];\n this.directUpload(file, {\n optionsJson,\n retryCount: this.config?.bulk?.retryCount,\n metadata: metadataObj,\n conflictPolicy: this.conflictPolicy.value || 'RENAME',\n });\n }\n }\n\n private directUpload(file: File, options: UploadOptions): void {\n this.api!.upload(this.baseUrl!, file, options).subscribe({\n next: (event) => {\n if (event.type === HttpEventType.Response) {\n const resp = event.body as UploadResponse;\n this.finishUpload(true, resp.file);\n } else {\n this.handleProgress(event);\n }\n },\n error: (err) => this.handleError(err),\n });\n }\n\n private buildOptionsJson(\n customMeta?: Record<string, unknown>,\n ): string | undefined {\n const effective = this.serverEffective?.options;\n const nameConflictPolicy =\n this.conflictPolicy.value ||\n this.config?.limits?.defaultConflictPolicy ||\n effective?.nameConflictPolicy ||\n 'RENAME';\n\n const limits = this.config?.limits ?? {};\n const advanced = this.config?.options ?? {};\n\n // Garantir maxUploadSizeMb positivo usando fallback do servidor ou default 50\n const maxUploadSizeMb =\n typeof limits.maxUploadSizeMb === 'number'\n ? limits.maxUploadSizeMb\n : typeof effective?.maxUploadSizeMb === 'number'\n ? effective?.maxUploadSizeMb\n : 50;\n\n const options: any = { nameConflictPolicy };\n\n if (typeof maxUploadSizeMb === 'number' && maxUploadSizeMb > 0) {\n options.maxUploadSizeMb = maxUploadSizeMb;\n }\n // strictValidation: fallback para server\n if (typeof limits.strictValidation === 'boolean') {\n options.strictValidation = limits.strictValidation;\n } else if (typeof effective?.strictValidation === 'boolean') {\n options.strictValidation = effective.strictValidation;\n }\n\n // Arrays/strings opcionais: usar config ou fallback do servidor quando disponível\n const allowed = advanced.allowedExtensions?.length\n ? advanced.allowedExtensions\n : effective?.allowedExtensions && effective.allowedExtensions.length\n ? effective.allowedExtensions\n : undefined;\n if (allowed) options.allowedExtensions = allowed;\n\n const mimes = advanced.acceptMimeTypes?.length\n ? advanced.acceptMimeTypes\n : effective?.acceptMimeTypes && effective.acceptMimeTypes.length\n ? effective.acceptMimeTypes\n : undefined;\n if (mimes) options.acceptMimeTypes = mimes;\n\n const targetDir = advanced.targetDirectory ?? effective?.targetDirectory;\n if (targetDir) options.targetDirectory = targetDir;\n\n if (typeof advanced.enableVirusScanning === 'boolean') {\n options.enableVirusScanning = advanced.enableVirusScanning;\n } else if (typeof effective?.enableVirusScanning === 'boolean') {\n options.enableVirusScanning = effective.enableVirusScanning;\n }\n\n // Mapear metadados para Map<String,String>\n if (customMeta && typeof customMeta === 'object') {\n const mapped: Record<string, string> = {};\n for (const [k, v] of Object.entries(customMeta)) {\n if (v !== undefined && v !== null) mapped[k] = String(v as any);\n }\n if (Object.keys(mapped).length) options.customMetadata = mapped;\n }\n\n try {\n return JSON.stringify(options);\n } catch {\n return undefined;\n }\n }\n\n private handleProgress(event: HttpEvent<unknown>): void {\n if (event.type === HttpEventType.UploadProgress && event.total) {\n this.uploadProgress = Math.round((event.loaded / event.total) * 100);\n }\n }\n\n private handleError(err: unknown): void {\n this.uploading = false;\n if (this.currentFiles.length) {\n this.uploadedFiles = this.currentFiles.map((f) => ({\n fileName: f.name,\n success: false,\n }));\n this.currentFiles = [];\n }\n if (err instanceof HttpErrorResponse && err.error) {\n const mapped =\n this.errors?.map(err.error as ErrorResponse, err.headers) ||\n (err.error as any);\n this.errorMessage =\n mapped.message ||\n this.t('genericUploadError', 'Erro no envio de arquivo.');\n if (mapped.rateLimit) {\n this.rateLimit = mapped.rateLimit;\n this.rateLimited.emit(mapped.rateLimit);\n }\n const code = String((err.error as ErrorResponse).code || '');\n if (code === 'QUOTA_EXCEEDED' || code === 'COTA_EXCEDIDA') {\n this.quotaExceeded = true;\n }\n this.error.emit(err.error as ErrorResponse);\n } else {\n this.errorMessage = this.t(\n 'genericUploadError',\n 'Erro no envio de arquivo.',\n );\n this.error.emit(err as ErrorResponse);\n }\n }\n\n private finishUpload(\n success: boolean,\n meta?: FileMetadata,\n results?: BulkUploadFileResult[],\n ): void {\n this.uploading = false;\n this.uploadProgress = 100;\n if (success) {\n if (meta) {\n this.uploadedFiles.push({ fileName: meta.fileName, success: true });\n this.uploadSuccess.emit({ file: meta });\n // Opcional: preencher lista rica também para single\n this.lastResults = [\n {\n fileName: meta.fileName,\n status: BulkUploadResultStatus.SUCCESS,\n file: meta,\n },\n ];\n this.lastStats = { total: 1, succeeded: 1, failed: 0 };\n }\n if (results) {\n // Mantém lista simples para compatibilidade\n for (const r of results) {\n if (r.status === BulkUploadResultStatus.SUCCESS) {\n this.uploadedFiles.push({ fileName: r.fileName, success: true });\n } else {\n this.uploadedFiles.push({ fileName: r.fileName, success: false });\n }\n }\n // Se stats não vieram do servidor, calcula minimamente\n if (!this.lastStats) {\n const succeeded = results.filter(\n (r) => r.status === BulkUploadResultStatus.SUCCESS,\n ).length;\n const failed = results.length - succeeded;\n this.lastStats = { total: results.length, succeeded, failed };\n }\n if (!this.lastResults) {\n this.lastResults = results;\n }\n }\n } else {\n this.uploadedFiles = this.currentFiles.map((f) => ({\n fileName: f.name,\n success: false,\n }));\n }\n this.currentFiles = [];\n this.hideSelectedOverlay();\n this.cdr.markForCheck();\n }\n\n // Lista rica - helpers/ações\n get visibleResults(): BulkUploadFileResult[] {\n if (!this.lastResults) return [];\n const cap = this.config?.ui?.list?.collapseAfter ?? 0;\n if (this.showAllResults || cap <= 0) return this.lastResults;\n return this.lastResults.slice(0, cap);\n }\n\n // Função utilitária para conversão\n private fileToBulkUploadFileResult(file: File): BulkUploadFileResult {\n return {\n fileName: file.name,\n status: BulkUploadResultStatus.FAILED,\n file: {\n id: '',\n fileName: file.name,\n contentType: file.type,\n fileSize: file.size,\n uploadedAt: new Date().toISOString(),\n tenantId: '',\n scanStatus: ScanStatus.PENDING,\n metadata: {}\n }\n };\n }\n\n onRetry(file: File | BulkUploadFileResult) {\n const bulkFile = 'fileName' in file && 'status' in file ? file : this.fileToBulkUploadFileResult(file as File);\n this.retry.emit(bulkFile);\n }\n onDownload(file: File | BulkUploadFileResult) {\n const bulkFile = 'fileName' in file && 'status' in file ? file : this.fileToBulkUploadFileResult(file as File);\n this.download.emit(bulkFile);\n }\n onCopyLink(file: File | BulkUploadFileResult) {\n const bulkFile = 'fileName' in file && 'status' in file ? file : this.fileToBulkUploadFileResult(file as File);\n this.copyLink.emit(bulkFile);\n }\n removeResult(item: BulkUploadFileResult): void {\n if (!this.lastResults) return;\n const idx = this.lastResults.indexOf(item);\n if (idx >= 0)\n this.lastResults = this.lastResults.filter((_, i) => i !== idx);\n // Atualiza stats mínimas\n if (this.lastStats) {\n this.lastStats.total = Math.max(0, this.lastStats.total - 1);\n if (item.status === BulkUploadResultStatus.SUCCESS)\n this.lastStats.succeeded = Math.max(0, this.lastStats.succeeded - 1);\n if (item.status === BulkUploadResultStatus.FAILED)\n this.lastStats.failed = Math.max(0, this.lastStats.failed - 1);\n }\n }\n toggleDetailsFor(item: BulkUploadFileResult): void {\n // Emite aberto/fechado com base em presença de seção extra\n // Como usamos <details>, delegamos ao usuário abrir via UI.\n // Aqui apenas emitimos um evento de intenção.\n this.detailsOpened.emit(item);\n }\n onDetailsToggle(ev: Event, item: BulkUploadFileResult): void {\n const opened = (ev.target as HTMLDetailsElement)?.open;\n if (opened) this.detailsOpened.emit(item);\n else this.detailsClosed.emit(item);\n }\n\n private validateFiles(files: File[]): boolean {\n const validators: ValidatorFn[] = [];\n if (this.config?.ui?.accept?.length) {\n validators.push(acceptValidator(this.config.ui.accept));\n }\n if (this.config?.limits?.maxFileSizeBytes) {\n validators.push(\n maxFileSizeValidator(this.config.limits.maxFileSizeBytes),\n );\n }\n if (this.config?.limits?.maxFilesPerBulk) {\n validators.push(\n maxFilesPerBulkValidator(this.config.limits.maxFilesPerBulk),\n );\n }\n if (this.config?.limits?.maxBulkSizeBytes) {\n validators.push(\n maxBulkSizeValidator(this.config.limits.maxBulkSizeBytes),\n );\n }\n if (!validators.length) {\n return true;\n }\n\n const control = new FormControl(files, validators);\n if (control.invalid) {\n const errors = control.errors || {};\n const map = this.config?.messages?.errors || {};\n if (errors['accept']) {\n this.errorMessage =\n map['accept'] ||\n this.t('acceptError', 'Tipo de arquivo não permitido.');\n } else if (errors['maxFileSize']) {\n this.errorMessage =\n map['maxFileSize'] ||\n this.t('maxFileSizeError', 'Arquivo excede o tamanho máximo.');\n } else if (errors['maxFilesPerBulk']) {\n this.errorMessage =\n map['maxFilesPerBulk'] ||\n this.t('maxFilesPerBulkError', 'Quantidade de arquivos excedida.');\n } else if (errors['maxBulkSize']) {\n this.errorMessage =\n map['maxBulkSize'] ||\n this.t('maxBulkSizeError', 'Tamanho total dos arquivos excedido.');\n }\n this.error.emit(errors as any);\n return false;\n }\n return true;\n }\n\n // Resumo de políticas para tooltip do ícone de informações\n get policiesSummary(): string {\n const acc = this.config?.ui?.accept?.length\n ? this.config.ui.accept.join(', ')\n : this.acceptString || 'qualquer';\n const maxFile = this.config?.limits?.maxFileSizeBytes\n ? this.formatBytes(this.config.limits.maxFileSizeBytes)\n : '—';\n const maxCount =\n this.config?.limits?.maxFilesPerBulk ?? (this.allowMultiple ? 99 : 1);\n return `Tipos: ${acc} • Máx. por arquivo: ${maxFile} • Qtde: ${maxCount}`;\n }\n}\n","import { Component, Input, inject, ViewChild } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { SimpleBaseInputComponent } from '@praxisui/dynamic-fields';\nimport { FileMetadata, ErrorResponse, BulkUploadResponse } from '../../types';\n\nimport { PraxisFilesUpload } from '../files-upload/praxis-files-upload.component';\nimport { FilesUploadConfig } from '../../models';\nimport { ErrorMapperService, TRANSLATE_LIKE, TranslateLike } from '../../services/error-mapper.service';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\n@Component({\n selector: 'pdx-material-files-upload',\n standalone: true,\n imports: [CommonModule, PraxisFilesUpload, MatIconModule, MatMenuModule, MatTooltipModule],\n template: `\n <!-- Casca compacta tipo input -->\n <div class=\"pdx-upload-field-shell\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-describedby]=\"componentId() + '-messages'\"\n [class.error]=\"showUploadError\"\n [class.disabled]=\"isShellDisabled()\"\n [attr.aria-disabled]=\"isShellDisabled() ? 'true' : null\"\n [class.proximity-active]=\"isProximityActive\"\n (click)=\"pendingFiles.length === 0 && openFromShell()\"\n (keydown.enter)=\"pendingFiles.length === 0 && openFromShell(); $event.preventDefault()\"\n (keydown.space)=\"pendingFiles.length === 0 && openFromShell(); $event.preventDefault()\">\n <mat-icon class=\"prefix\" aria-hidden=\"true\">attach_file</mat-icon>\n <div class=\"content\">\n <!-- ESTADO 1: Sem arquivos pendentes -->\n <ng-container *ngIf=\"pendingFiles.length === 0; else pendingState\">\n <span class=\"placeholder\" *ngIf=\"!lastFileName\">{{ t('placeholder','Selecione ou solte arquivos…') }}</span>\n <span class=\"value\" *ngIf=\"lastFileName\" [title]=\"lastFileName\">{{ lastFileName }}</span>\n <span class=\"chip\" *ngIf=\"batchCount > 1\">+{{ batchCount - 1 }}</span>\n </ng-container>\n\n <!-- ESTADO 2: Com arquivos pendentes -->\n <ng-template #pendingState>\n <button type=\"button\" class=\"pending-text-btn\" [matMenuTriggerFor]=\"pendingFilesMenu\">\n <span>{{ pendingFiles.length }} arquivo(s) selecionado(s)</span>\n <mat-icon>arrow_drop_down</mat-icon>\n </button>\n </ng-template>\n </div>\n <div class=\"suffixes\">\n <!-- Ações para arquivos pendentes -->\n <ng-container *ngIf=\"pendingFiles.length > 0\">\n <button type=\"button\" class=\"icon-btn\" color=\"primary\" title=\"Enviar\" aria-label=\"Enviar\" (click)=\"onTriggerUpload(); $event.stopPropagation()\">\n <mat-icon>upload</mat-icon>\n </button>\n <button type=\"button\" class=\"icon-btn\" color=\"warn\" title=\"Cancelar Seleção\" aria-label=\"Cancelar Seleção\" (click)=\"onClearSelection(); $event.stopPropagation()\">\n <mat-icon>cancel</mat-icon>\n </button>\n </ng-container>\n\n <!-- Ações padrão -->\n <button type=\"button\" class=\"icon-btn\" title=\"Informações\" aria-label=\"Informações\" (click)=\"$event.stopPropagation()\" [disabled]=\"isShellDisabled()\" [matTooltip]=\"policySummary\">\n <mat-icon>info</mat-icon>\n </button>\n <button type=\"button\" class=\"icon-btn\" title=\"Mais ações\" aria-label=\"Mais ações\" (click)=\"$event.stopPropagation()\" [disabled]=\"isShellDisabled()\" [matMenuTriggerFor]=\"moreMenu\">\n <mat-icon>more_horiz</mat-icon>\n </button>\n <mat-menu #moreMenu=\"matMenu\">\n <button mat-menu-item (click)=\"openFromShell()\">\n <mat-icon>upload_file</mat-icon>\n <span>Selecionar arquivo(s)</span>\n </button>\n <button mat-menu-item (click)=\"onClear()\" [disabled]=\"!lastFileName && batchCount === 0\">\n <mat-icon>clear</mat-icon>\n <span>Limpar</span>\n </button>\n </mat-menu>\n </div>\n </div>\n\n <!-- Menu para exibir arquivos pendentes -->\n <mat-menu #pendingFilesMenu=\"matMenu\" class=\"pending-files-menu\">\n <ng-template matMenuContent>\n <button mat-menu-item *ngFor=\"let file of pendingFiles\" (click)=\"$event.stopPropagation(); $event.preventDefault();\" [title]=\"file.name\">\n <div class=\"pending-file-item\">\n <div class=\"file-info\">\n <span class=\"file-name\">{{ file.name }}</span>\n <span class=\"file-size\">({{ formatBytes(file.size) }})</span>\n </div>\n <span class=\"spacer\"></span>\n <button mat-icon-button class=\"remove-pending-btn\" (click)=\"onRemovePendingFile(file, $event)\" [attr.aria-label]=\"'Remover ' + file.name\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </button>\n </ng-template>\n </mat-menu>\n\n <!-- Mensagens do campo (hint/erro) -->\n <div class=\"field-messages\" [id]=\"componentId() + '-messages'\">\n <div class=\"hint\" *ngIf=\"metadata()?.hint && !showUploadError\">{{ metadata()?.hint }}</div>\n <div class=\"error\" *ngIf=\"showUploadError\">{{ uploadError || t('genericUploadError','Erro no envio de arquivo.') }}</div>\n </div>\n\n <!-- Componente principal de upload (agora para lógica, não para UI) -->\n <praxis-files-upload\n #uploader\n displayMode=\"compact\"\n style=\"display: none;\"\n [config]=\"config\"\n [componentId]=\"componentId()\"\n [baseUrl]=\"baseUrl\"\n (uploadSuccess)=\"onUploadSuccess($event)\"\n (bulkComplete)=\"onBulkComplete($event)\"\n (error)=\"onUploadError($event)\"\n (pendingFilesChange)=\"handlePendingFiles($event)\"\n />\n `,\n styles: [\n `:host{position:relative}\n .pdx-upload-field-shell{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;border:1px solid var(--pfx-surface-border, #ccc);border-radius:8px;background:var(--pfx-surface, var(--md-sys-color-surface));color:var(--md-sys-color-on-surface);min-height:40px;cursor:pointer}\n .pdx-upload-field-shell:focus-within{outline:2px solid var(--md-sys-color-primary,#1976d2);outline-offset:2px;}\n .pdx-upload-field-shell.error{border-color:var(--md-sys-color-error,#b00020)}\n .pdx-upload-field-shell.disabled{opacity:.6;cursor:not-allowed}\n .pdx-upload-field-shell .prefix{color:var(--md-sys-color-primary,#1976d2)}\n .pdx-upload-field-shell .content{flex:1;min-width:0;display:flex;align-items:center;gap:.5rem}\n .pdx-upload-field-shell .placeholder{color: var(--md-sys-color-on-surface-variant)}\n .pdx-upload-field-shell .value{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n .pdx-upload-field-shell .chip{font-size:.75rem;padding:0 .4rem;border-radius:999px;background:color-mix(in oklab, var(--mat-sys-color-primary,#1976d2) 15%, transparent);color:var(--mat-sys-color-primary,#1976d2)}\n .pdx-upload-field-shell .suffixes{display:flex;align-items:center;gap:.25rem}\n .pdx-upload-field-shell .icon-btn{border:0;background:transparent;padding:.25rem;border-radius:6px;cursor:pointer; color: var(--md-sys-color-on-surface-variant);}\n .pdx-upload-field-shell .icon-btn:hover{background:rgba(255,255,255,0.05)}\n .pdx-upload-field-shell.disabled .icon-btn{cursor:not-allowed}\n .field-messages{font-size:.82rem;margin-top:.25rem}\n .field-messages .hint{opacity:.8}\n .field-messages .error{color:var(--md-sys-color-error,#b00020)}\n .pending-text-btn{display:flex;align-items:center;gap:.25rem;background:0;border:0;color:var(--md-sys-color-on-surface);font-family:inherit;font-size:inherit;padding:0;margin:0;cursor:pointer}\n .pending-text-btn span, .pending-text-btn mat-icon { color: inherit; }\n .pending-files-menu .mat-mdc-menu-content{padding:0}\n .pending-file-item{display:flex;align-items:center;width:100%;gap:.5rem;padding:8px 16px;}\n .pending-file-item .file-info{flex:1;min-width:0;text-align:left;}\n .pending-file-item .file-name{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}\n .pending-file-item .file-size{font-size:.8rem;opacity:.7;}\n .pending-file-item .spacer{flex:1 1 auto}\n .pending-file-item .remove-pending-btn{color:var(--md-sys-color-on-surface-variant)}\n .pdx-upload-field-shell.proximity-active {\n border-style: dashed;\n border-color: var(--md-sys-color-primary);\n transform: scale(1.02);\n background: color-mix(in oklab, var(--pfx-surface) 85%, var(--md-sys-color-primary) 15%);\n transition: all 0.2s ease-in-out;\n }\n `\n ],\n host: {\n '[class]': 'componentCssClasses()',\n '[attr.data-field-type]': '\"files-upload\"',\n '[attr.data-field-name]': 'metadata()?.name',\n '[attr.data-component-id]': 'componentId()',\n },\n})\nexport class PdxFilesUploadFieldComponent extends SimpleBaseInputComponent {\n @Input() config: FilesUploadConfig | null = null;\n @Input() valueMode: 'metadata' | 'id' = 'metadata';\n @Input() baseUrl?: string;\n uploadError: string | null = null;\n\n @ViewChild('uploader') private uploader?: PraxisFilesUpload;\n\n // Estado para UI de seleção manual\n public pendingFiles: File[] = [];\n\n // Ações para UI de seleção manual\n public onTriggerUpload(): void {\n this.uploader?.triggerUpload();\n }\n\n public onClearSelection(): void {\n this.uploader?.clearSelection();\n }\n\n // Recebe o estado do componente filho\n public handlePendingFiles(files: File[]): void {\n this.pendingFiles = files;\n if (files.length > 0) {\n this.control().markAsTouched(); // Garante que validação de 'required' seja reavaliada\n }\n }\n\n // Estado visual do campo compacto\n lastFileName: string | null = null;\n batchCount = 0;\n public isProximityActive = false;\n\n private readonly errors = inject(ErrorMapperService);\n private readonly translate = inject<TranslateLike | null>(TRANSLATE_LIKE, { optional: true }) ?? null;\n\n get showUploadError(): boolean {\n const c = this.control();\n return c.touched && c.invalid;\n }\n\n t(key: string, fallback: string): string {\n const k = `praxis.filesUpload.${key}`;\n const v = this.translate?.instant(k);\n return v && v !== k ? v : fallback;\n }\n\n onUploadSuccess(event: { file: FileMetadata }): void {\n const value = this.valueMode === 'id' ? event.file.id : event.file;\n this.setValue(value);\n this.control().setErrors(null);\n this.uploadError = null;\n // Atualiza visual\n this.lastFileName = event.file.fileName || null;\n this.batchCount = 1;\n }\n\n onBulkComplete(resp: BulkUploadResponse): void {\n // Atualiza contador e último nome (primeiro sucesso se houver)\n const total = Array.isArray(resp?.results) ? resp.results.length : 0;\n this.batchCount = total;\n const firstOk = resp?.results?.find((r: any) => r?.file?.fileName)?.file?.fileName;\n if (firstOk) {\n this.lastFileName = String(firstOk);\n }\n }\n\n // When an error occurs, mark the control invalid and show message\n onUploadError(event: unknown): void {\n this.control().setErrors({ upload: true });\n this.control().markAsTouched();\n this.control().markAsDirty();\n\n if (event && typeof event === 'object' && 'code' in (event as any)) {\n this.uploadError = this.errors.map(event as ErrorResponse).message;\n } else if (event && typeof (event as any).message === 'string') {\n this.uploadError = (event as any).message;\n } else {\n this.uploadError = this.t(\n 'genericUploadError',\n 'Erro no envio de arquivo.',\n );\n }\n }\n\n isShellDisabled(): boolean {\n try {\n return !!(this.control()?.disabled || this.uploader?.isUploading || !this.baseUrl);\n } catch { return false; }\n }\n\n public onProximityChange(isActive: boolean): void {\n this.isProximityActive = isActive;\n }\n\n openFromShell(): void {\n if (this.isShellDisabled()) return;\n this.uploader?.triggerSelect();\n }\n\n // Ações dos ícones (placeholders para próxima sub-issue)\n onOpenInfo(): void {}\n onOpenMenu(): void {}\n\n onClear(): void {\n this.lastFileName = null;\n this.batchCount = 0;\n this.uploadError = null;\n try {\n this.setValue(null as any);\n const c = this.control();\n c.markAsPristine();\n c.markAsUntouched();\n c.setErrors(null);\n } catch {}\n }\n\n get policySummary(): string {\n const a = this.config?.ui?.accept?.length ? this.config!.ui!.accept!.join(', ') : '—';\n const maxB = this.config?.limits?.maxFileSizeBytes;\n const maxMb = maxB ? `${(maxB/1024/1024).toFixed(1)} MB` : '—';\n const maxN = this.config?.limits?.maxFilesPerBulk ?? 1;\n return `Tipos: ${a} • Máx/arquivo: ${maxMb} • Máx/itens: ${maxN}`;\n }\n\n public onRemovePendingFile(file: File, event: MouseEvent): void {\n event.stopPropagation(); // Impede que o menu feche ao clicar no botão\n this.uploader?.removePendingFile(file);\n }\n\n public formatBytes(bytes: number): string {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n }\n}\n","export const FILES_UPLOAD_PT_BR = {\n 'praxis.filesUpload.settingsAriaLabel': 'Abrir configurações',\n 'praxis.filesUpload.dropzoneLabel': 'Arraste arquivos ou',\n 'praxis.filesUpload.dropzoneButton': 'selecionar',\n 'praxis.filesUpload.conflictPolicyLabel': 'Política de conflito',\n 'praxis.filesUpload.metadataLabel': 'Metadados (JSON)',\n 'praxis.filesUpload.progressAriaLabel': 'Progresso do upload',\n 'praxis.filesUpload.rateLimitBanner':\n 'Limite de requisições excedido. Tente novamente às',\n 'praxis.filesUpload.settingsTitle': 'Configuração de Upload de Arquivos',\n 'praxis.filesUpload.statusSuccess': 'Enviado',\n 'praxis.filesUpload.statusError': 'Erro',\n 'praxis.filesUpload.invalidMetadata': 'Metadados inválidos.',\n 'praxis.filesUpload.genericUploadError': 'Erro no envio de arquivo.',\n 'praxis.filesUpload.acceptError': 'Tipo de arquivo não permitido.',\n 'praxis.filesUpload.maxFileSizeError': 'Arquivo excede o tamanho máximo.',\n 'praxis.filesUpload.maxFilesPerBulkError': 'Quantidade de arquivos excedida.',\n 'praxis.filesUpload.maxBulkSizeError': 'Tamanho total dos arquivos excedido.',\n 'praxis.filesUpload.errors.INVALID_FILE_TYPE': 'Tipo de arquivo inválido.',\n 'praxis.filesUpload.errors.FILE_TOO_LARGE': 'Arquivo muito grande.',\n 'praxis.filesUpload.errors.NOT_FOUND': 'Arquivo não encontrado.',\n 'praxis.filesUpload.errors.UNAUTHORIZED': 'Requisição não autorizada.',\n 'praxis.filesUpload.errors.RATE_LIMIT_EXCEEDED':\n 'Limite de requisições excedido.',\n 'praxis.filesUpload.errors.INTERNAL_ERROR': 'Erro interno do servidor.',\n 'praxis.filesUpload.errors.QUOTA_EXCEEDED': 'Cota excedida.',\n 'praxis.filesUpload.errors.SEC_VIRUS_DETECTED': 'Vírus detectado no arquivo.',\n 'praxis.filesUpload.errors.SEC_MALICIOUS_CONTENT':\n 'Conteúdo malicioso detectado.',\n 'praxis.filesUpload.errors.SEC_DANGEROUS_TYPE': 'Tipo de arquivo perigoso.',\n 'praxis.filesUpload.errors.FMT_MAGIC_MISMATCH':\n 'Conteúdo do arquivo incompatível.',\n 'praxis.filesUpload.errors.FMT_CORRUPTED': 'Arquivo corrompido.',\n 'praxis.filesUpload.errors.FMT_UNSUPPORTED':\n 'Formato de arquivo não suportado.',\n 'praxis.filesUpload.errors.SYS_STORAGE_ERROR': 'Erro de armazenamento.',\n 'praxis.filesUpload.errors.SYS_SERVICE_DOWN': 'Serviço indisponível.',\n 'praxis.filesUpload.errors.SYS_RATE_LIMIT': 'Limite de requisições excedido.',\n // Aliases PT-BR do backend e códigos adicionais\n 'praxis.filesUpload.errors.ARQUIVO_MUITO_GRANDE': 'Arquivo muito grande.',\n 'praxis.filesUpload.errors.TIPO_ARQUIVO_INVALIDO': 'Tipo de arquivo inválido.',\n 'praxis.filesUpload.errors.TIPO_MIDIA_NAO_SUPORTADO': 'Tipo de mídia não suportado.',\n 'praxis.filesUpload.errors.CAMPO_OBRIGATORIO_AUSENTE': 'Campo obrigatório ausente.',\n 'praxis.filesUpload.errors.OPCOES_JSON_INVALIDAS': 'JSON de opções inválido.',\n 'praxis.filesUpload.errors.ARGUMENTO_INVALIDO': 'Argumento inválido.',\n 'praxis.filesUpload.errors.NAO_AUTORIZADO': 'Autenticação necessária.',\n 'praxis.filesUpload.errors.ERRO_INTERNO': 'Erro interno do servidor.',\n 'praxis.filesUpload.errors.LIMITE_TAXA_EXCEDIDO': 'Limite de taxa excedido.',\n 'praxis.filesUpload.errors.COTA_EXCEDIDA': 'Cota excedida.',\n 'praxis.filesUpload.errors.ARQUIVO_JA_EXISTE': 'Arquivo já existe.',\n // Outros possíveis códigos mapeados no catálogo\n 'praxis.filesUpload.errors.INVALID_JSON_OPTIONS': 'JSON de opções inválido.',\n 'praxis.filesUpload.errors.EMPTY_FILENAME': 'Nome do arquivo obrigatório.',\n 'praxis.filesUpload.errors.FILE_EXISTS': 'Arquivo já existe.',\n 'praxis.filesUpload.errors.PATH_TRAVERSAL': 'Path traversal detectado.',\n 'praxis.filesUpload.errors.INSUFFICIENT_STORAGE': 'Sem espaço em disco.',\n 'praxis.filesUpload.errors.UPLOAD_TIMEOUT': 'Tempo esgotado no upload.',\n 'praxis.filesUpload.errors.BULK_UPLOAD_TIMEOUT': 'Tempo esgotado no upload em lote.',\n 'praxis.filesUpload.errors.BULK_UPLOAD_CANCELLED': 'Upload em lote cancelado.',\n 'praxis.filesUpload.errors.USER_CANCELLED': 'Upload cancelado pelo usuário.',\n 'praxis.filesUpload.errors.UNKNOWN_ERROR': 'Erro desconhecido.',\n};\n","import { ComponentDocMeta, ComponentMetadataRegistry } from '@praxisui/core';\nimport { ENVIRONMENT_INITIALIZER, Provider } from '@angular/core';\nimport { PraxisFilesUpload } from './components/files-upload/praxis-files-upload.component';\n\n/** Metadata for PraxisFilesUpload component */\nexport const PRAXIS_FILES_UPLOAD_COMPONENT_METADATA: ComponentDocMeta = {\n id: 'praxis-files-upload',\n selector: 'praxis-files-upload',\n component: PraxisFilesUpload,\n friendlyName: 'Praxis Files Upload',\n description: 'Upload de arquivos com dropzone, envio em lote e lista de resultados rica.',\n icon: 'upload_file',\n inputs: [\n { name: 'config', type: 'FilesUploadConfig | null', description: 'Configuração de UI/limites/opções/bulk/quotas/rateLimit/messages' },\n { name: 'componentId', type: 'string', default: 'default', description: 'Identificador do componente (ex.: storage de preferências)' },\n { name: 'baseUrl', type: 'string', description: 'Base URL da API de arquivos' },\n { name: 'displayMode', type: \"'full' | 'compact'\", default: 'full', description: 'Modo de exibição do componente' },\n ],\n outputs: [\n { name: 'uploadSuccess', type: '{ file: FileMetadata }', description: 'Emite após upload único com sucesso' },\n { name: 'bulkComplete', type: 'BulkUploadResponse', description: 'Emite após upload em lote completar' },\n { name: 'error', type: 'ErrorResponse', description: 'Erros de upload' },\n { name: 'rateLimited', type: 'RateLimitInfo', description: 'Sinaliza rate limiting' },\n { name: 'retry', type: 'BulkUploadFileResult', description: 'Usuário acionou reenvio' },\n { name: 'download', type: 'BulkUploadFileResult', description: 'Usuário solicitou download' },\n { name: 'copyLink', type: 'BulkUploadFileResult', description: 'Usuário copiou link' },\n { name: 'detailsOpened', type: 'BulkUploadFileResult', description: 'Detalhes do item abertos' },\n { name: 'detailsClosed', type: 'BulkUploadFileResult', description: 'Detalhes do item fechados' },\n { name: 'pendingFilesChange', type: 'File[]', description: 'Mudança na lista de arquivos pendentes' },\n { name: 'proximityChange', type: 'boolean', description: 'Mudança de estado de proximidade (drag-over expand)' },\n ],\n tags: ['widget', 'upload', 'configurable', 'hasWizard', 'stable'],\n lib: '@praxisui/files-upload',\n};\n\n/** Provider para auto-registrar metadados do componente Files Upload. */\nexport function providePraxisFilesUploadMetadata(): Provider {\n return {\n provide: ENVIRONMENT_INITIALIZER,\n multi: true,\n useFactory: (registry: ComponentMetadataRegistry) => () => {\n registry.register(PRAXIS_FILES_UPLOAD_COMPONENT_METADATA);\n },\n deps: [ComponentMetadataRegistry],\n } as Provider;\n}\n","// Export all public API from subdirectories\nexport * from './models';\nexport * from './components';\nexport * from './services';\nexport * from './validators';\nexport * from './config';\nexport * from './i18n';\nexport * from './types';\nexport * from './praxis-files-upload.metadata';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["map","i1","i7","i3","i2.DragProximityService","i4.FilesApiClient","i5.PresignedUploaderService","i6.ErrorMapperService","i8","i2","i4"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAAY;AAAZ,CAAA,UAAY,SAAS,EAAA;AACnB,IAAA,SAAA,CAAA,mBAAA,CAAA,GAAA,mBAAuC;AACvC,IAAA,SAAA,CAAA,gBAAA,CAAA,GAAA,gBAAiC;AACjC,IAAA,SAAA,CAAA,WAAA,CAAA,GAAA,WAAuB;AACvB,IAAA,SAAA,CAAA,cAAA,CAAA,GAAA,cAA6B;AAC7B,IAAA,SAAA,CAAA,qBAAA,CAAA,GAAA,qBAA2C;AAC3C,IAAA,SAAA,CAAA,gBAAA,CAAA,GAAA,gBAAiC;AACjC,IAAA,SAAA,CAAA,gBAAA,CAAA,GAAA,gBAAiC;AACjC,IAAA,SAAA,CAAA,oBAAA,CAAA,GAAA,oBAAyC;AACzC,IAAA,SAAA,CAAA,uBAAA,CAAA,GAAA,uBAA+C;AAC/C,IAAA,SAAA,CAAA,oBAAA,CAAA,GAAA,oBAAyC;AACzC,IAAA,SAAA,CAAA,oBAAA,CAAA,GAAA,oBAAyC;AACzC,IAAA,SAAA,CAAA,eAAA,CAAA,GAAA,eAA+B;AAC/B,IAAA,SAAA,CAAA,iBAAA,CAAA,GAAA,iBAAmC;AACnC,IAAA,SAAA,CAAA,mBAAA,CAAA,GAAA,mBAAuC;AACvC,IAAA,SAAA,CAAA,kBAAA,CAAA,GAAA,kBAAqC;AACrC,IAAA,SAAA,CAAA,gBAAA,CAAA,GAAA,gBAAiC;AACnC,CAAC,EAjBW,SAAS,KAAT,SAAS,GAAA,EAAA,CAAA,CAAA;;ICAT;AAAZ,CAAA,UAAY,UAAU,EAAA;AACpB,IAAA,UAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,UAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACrB,IAAA,UAAA,CAAA,OAAA,CAAA,GAAA,OAAe;AACf,IAAA,UAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACrB,IAAA,UAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACnB,CAAC,EANW,UAAU,KAAV,UAAU,GAAA,EAAA,CAAA,CAAA;;ACAtB;IACY;AAAZ,CAAA,UAAY,sBAAsB,EAAA;AAChC,IAAA,sBAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,sBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACnB,CAAC,EAHW,sBAAsB,KAAtB,sBAAsB,GAAA,EAAA,CAAA,CAAA;;ACiBlC;;;AAGG;MAEU,aAAa,CAAA;AAGJ,IAAA,IAAA;AAFZ,IAAA,KAAK,GAAG,IAAI,GAAG,EAAsB;AAE7C,IAAA,WAAA,CAAoB,IAAgB,EAAA;QAAhB,IAAA,CAAA,IAAI,GAAJ,IAAI;;IAEhB,aAAa,CACnB,OAAe,EACf,OAA+B,EAAA;QAE/B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;AACzC,QAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,SAAS,EAAE;;AAGlC;;;;AAIG;AACH,IAAA,kBAAkB,CAChB,OAAO,GAAG,YAAY,EACtB,eAA8C,EAAA;AAE9C,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AACtB,QAAA,MAAM,UAAU,GAAG,eAAe,GAAG,eAAe,EAAE,GAAG,EAAE;QAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,UAAU,CAAC;QACnD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;QAEjC,IAAI,KAAK,IAAI,GAAG,GAAG,KAAK,CAAC,SAAS,GAAG,MAAM,EAAE;AAC3C,YAAA,OAAO,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;;AAGvB,QAAA,MAAM,GAAG,GAAG,CAAA,EAAG,OAAO,SAAS;AAC/B,QAAA,IAAI,KAAK,EAAE,IAAI,EAAE;AACf,YAAA,UAAU,CAAC,eAAe,CAAC,GAAG,KAAK,CAAC,IAAI;;AAE1C,QAAA,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,UAAU,CAAC;QAE3C,OAAO,IAAI,CAAC;aACT,GAAG,CAA0C,GAAG,EAAE;AACjD,YAAA,OAAO,EAAE,UAAU;YACnB,OAAO;SACR;AACA,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,IAAI,KAAI;AACX,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,SAAS;YAClD,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE;AAChC,gBAAA,KAAK,CAAC,SAAS,GAAG,GAAG;gBACrB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;gBAC1B,OAAO,KAAK,CAAC,IAAI;;AAEnB,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,IAA6B;AACrD,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;AACnD,YAAA,OAAO,IAAI;AACb,SAAC,CAAC,EACF,UAAU,CAAC,CAAC,GAAG,KAAI;;YAEjB,IAAI,GAAG,EAAE,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE;AAChC,gBAAA,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;AAC1B,gBAAA,OAAO,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;;AAEvB,YAAA,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC;SAC7B,CAAC,CACH;;uGA/DM,aAAa,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,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,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,cADA,MAAM,EAAA,CAAA;;2FACnB,aAAa,EAAA,UAAA,EAAA,CAAA;kBADzB,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACTlC;;;AAGG;AACG,SAAU,wBAAwB,CACtC,OAAgB,EAChB,eAA8C,EAAA;AAE9C,IAAA,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACzD,MAAM,OAAO,GAAG,MAAM,CAAU,CAAC,CAAC,OAAO,mDAAC;AAC1C,IAAA,MAAM,IAAI,GAAG,MAAM,CAAoC,SAAS,gDAAC;AACjE,IAAA,MAAM,KAAK,GAAG,MAAM,CAAsB,SAAS,iDAAC;AACpD,IAAA,MAAM,OAAO,GAAG,MAAM,CAAqC,SAAS,mDAAC;IAErE,MAAM,KAAK,GAAG,MAAK;QACjB,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YAClB;;AAEF,QAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACjB,QAAA,MAAM,OAAO,GAAG,eAAe,GAAG,eAAe,EAAE,GAAG,SAAS;AAC/D,QAAA,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;QACpB;aACG,kBAAkB,CAAC,OAAO,EAAE,MAAM,OAAO,IAAI,EAAE;AAC/C,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,GAAG,KAAI;AACZ,gBAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AACb,gBAAA,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;AACpB,gBAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;aACnB;AACD,YAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACb,gBAAA,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;AACd,gBAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;aACnB;AACF,SAAA,CAAC;AACN,KAAC;AAED,IAAA,IAAI,OAAO;AAAE,QAAA,KAAK,EAAE;;AAAO,QAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AAE7C,IAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE;AAC1D;;ACrDA;AAiCA;AACA,MAAM,eAAe,GAA8B;AACjD,IAAA,CAAC,SAAS,CAAC,cAAc,GAAG;AAC1B,QAAA,KAAK,EAAE,sBAAsB;AAC7B,QAAA,QAAQ,EAAE,WAAW;AACrB,QAAA,KAAK,EAAE,YAAY;AACnB,QAAA,QAAQ,EAAE,OAAO;AACjB,QAAA,UAAU,EAAE,iDAAiD;AAC9D,KAAA;AACD,IAAA,CAAC,SAAS,CAAC,iBAAiB,GAAG;AAC7B,QAAA,KAAK,EAAE,0BAA0B;AACjC,QAAA,QAAQ,EAAE,WAAW;AACrB,QAAA,KAAK,EAAE,YAAY;AACnB,QAAA,QAAQ,EAAE,OAAO;AACjB,QAAA,UAAU,EAAE,6CAA6C;AAC1D,KAAA;AACD,IAAA,CAAC,SAAS,CAAC,eAAe,GAAG;AAC3B,QAAA,KAAK,EAAE,uBAAuB;AAC9B,QAAA,QAAQ,EAAE,WAAW;AACrB,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,QAAQ,EAAE,OAAO;AAClB,KAAA;AACD,IAAA,CAAC,SAAS,CAAC,kBAAkB,GAAG;AAC9B,QAAA,KAAK,EAAE,uBAAuB;AAC9B,QAAA,QAAQ,EAAE,WAAW;AACrB,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,QAAQ,EAAE,OAAO;AAClB,KAAA;AACD,IAAA,CAAC,SAAS,CAAC,aAAa,GAAG;AACzB,QAAA,KAAK,EAAE,oBAAoB;AAC3B,QAAA,QAAQ,EAAE,WAAW;AACrB,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,QAAQ,EAAE,OAAO;AAClB,KAAA;AACD,IAAA,CAAC,SAAS,CAAC,kBAAkB,GAAG;AAC9B,QAAA,KAAK,EAAE,yBAAyB;AAChC,QAAA,QAAQ,EAAE,WAAW;AACrB,QAAA,KAAK,EAAE,YAAY;AACnB,QAAA,QAAQ,EAAE,OAAO;AAClB,KAAA;AACD,IAAA,CAAC,SAAS,CAAC,kBAAkB,GAAG;AAC9B,QAAA,KAAK,EAAE,iBAAiB;AACxB,QAAA,QAAQ,EAAE,WAAW;AACrB,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,QAAQ,EAAE,OAAO;AAClB,KAAA;AACD,IAAA,CAAC,SAAS,CAAC,qBAAqB,GAAG;AACjC,QAAA,KAAK,EAAE,mBAAmB;AAC1B,QAAA,QAAQ,EAAE,WAAW;AACrB,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,QAAQ,EAAE,OAAO;AAClB,KAAA;AACD,IAAA,CAAC,SAAS,CAAC,iBAAiB,GAAG;AAC7B,QAAA,KAAK,EAAE,uBAAuB;AAC9B,QAAA,QAAQ,EAAE,eAAe;AACzB,QAAA,KAAK,EAAE,eAAe;AACtB,QAAA,QAAQ,EAAE,OAAO;AACjB,QAAA,SAAS,EAAE,IAAI;AAChB,KAAA;AACD,IAAA,CAAC,SAAS,CAAC,mBAAmB,GAAG;AAC/B,QAAA,KAAK,EAAE,yBAAyB;AAChC,QAAA,QAAQ,EAAE,SAAS;AACnB,QAAA,KAAK,EAAE,aAAa;AACpB,QAAA,QAAQ,EAAE,MAAM;AAChB,QAAA,SAAS,EAAE,IAAI;AAChB,KAAA;AACD,IAAA,CAAC,SAAS,CAAC,cAAc,GAAG;AAC1B,QAAA,KAAK,EAAE,gCAAgC;AACvC,QAAA,QAAQ,EAAE,SAAS;AACnB,QAAA,KAAK,EAAE,aAAa;AACpB,QAAA,QAAQ,EAAE,MAAM;AAChB,QAAA,SAAS,EAAE,IAAI;AAChB,KAAA;AACD,IAAA,CAAC,SAAS,CAAC,cAAc,GAAG;AAC1B,QAAA,KAAK,EAAE,eAAe;AACtB,QAAA,QAAQ,EAAE,SAAS;AACnB,QAAA,KAAK,EAAE,aAAa;AACpB,QAAA,QAAQ,EAAE,MAAM;AACjB,KAAA;AACD,IAAA,CAAC,SAAS,CAAC,cAAc,GAAG;AAC1B,QAAA,KAAK,EAAE,cAAc;AACrB,QAAA,QAAQ,EAAE,aAAa;AACvB,QAAA,KAAK,EAAE,aAAa;AACpB,QAAA,QAAQ,EAAE,OAAO;AACjB,QAAA,SAAS,EAAE,IAAI;AAChB,KAAA;AACD,IAAA,CAAC,SAAS,CAAC,YAAY,GAAG;AACxB,QAAA,KAAK,EAAE,gBAAgB;AACvB,QAAA,QAAQ,EAAE,aAAa;AACvB,QAAA,KAAK,EAAE,aAAa;AACpB,QAAA,QAAQ,EAAE,OAAO;AAClB,KAAA;AACD,IAAA,CAAC,SAAS,CAAC,SAAS,GAAG;AACrB,QAAA,KAAK,EAAE,gBAAgB;AACvB,QAAA,QAAQ,EAAE,aAAa;AACvB,QAAA,KAAK,EAAE,aAAa;AACpB,QAAA,QAAQ,EAAE,MAAM;AACjB,KAAA;;AAGD,IAAA,YAAY,EAAE,EAAE,KAAK,EAAE,0BAA0B,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE;AAClH,IAAA,qBAAqB,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE;AAClH,IAAA,qBAAqB,EAAE,EAAE,KAAK,EAAE,yBAAyB,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE;AACvH,IAAA,cAAc,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE;AAC3G,IAAA,mBAAmB,EAAE,EAAE,KAAK,EAAE,yBAAyB,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE;AACxH,IAAA,oBAAoB,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE;AACnH,IAAA,gBAAgB,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE;AAC5G,IAAA,cAAc,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE;IACxG,gBAAgB,EAAE,EAAE,KAAK,EAAE,2BAA2B,EAAE,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE;IAC/I,mBAAmB,EAAE,EAAE,KAAK,EAAE,4BAA4B,EAAE,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE;IACnJ,gBAAgB,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE;IAC5H,iBAAiB,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE;IAC5H,sBAAsB,EAAE,EAAE,KAAK,EAAE,wBAAwB,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE;IACvI,QAAQ,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE;IACxH,cAAc,EAAE,EAAE,KAAK,EAAE,0BAA0B,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE;IACvI,mBAAmB,EAAE,EAAE,KAAK,EAAE,kCAAkC,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE;AAC7I,IAAA,qBAAqB,EAAE,EAAE,KAAK,EAAE,0BAA0B,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE;AACtH,IAAA,kBAAkB,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE;AACjH,IAAA,oBAAoB,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE;AACjH,IAAA,2BAA2B,EAAE,EAAE,KAAK,EAAE,+BAA+B,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE;AACnI,IAAA,UAAU,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE;AACrG,IAAA,oBAAoB,EAAE,EAAE,KAAK,EAAE,yBAAyB,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE;IACvH,qBAAqB,EAAE,EAAE,KAAK,EAAE,yBAAyB,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,qDAAqD,EAAE;AAC3L,IAAA,cAAc,EAAE,EAAE,KAAK,EAAE,6BAA6B,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE;IACvH,mBAAmB,EAAE,EAAE,KAAK,EAAE,4BAA4B,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE;AAC3I,IAAA,mBAAmB,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE;AACnH,IAAA,kBAAkB,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE;AACrH,IAAA,qBAAqB,EAAE,EAAE,KAAK,EAAE,8BAA8B,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE;AAC/H,IAAA,oBAAoB,EAAE,EAAE,KAAK,EAAE,+BAA+B,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE;AAC9H,IAAA,WAAW,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE;AACzG,IAAA,cAAc,EAAE,EAAE,KAAK,EAAE,0BAA0B,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE;AACpH,IAAA,oBAAoB,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,EAAE;AAC5H,IAAA,kBAAkB,EAAE,EAAE,KAAK,EAAE,4BAA4B,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE;AACvH,IAAA,oBAAoB,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE;AAChH,IAAA,wBAAwB,EAAE,EAAE,KAAK,EAAE,kCAAkC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE;AACpI,IAAA,cAAc,EAAE,EAAE,KAAK,EAAE,+BAA+B,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE;AAC3H,IAAA,qBAAqB,EAAE,EAAE,KAAK,EAAE,mCAAmC,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE;AACvI,IAAA,4BAA4B,EAAE,EAAE,KAAK,EAAE,6BAA6B,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE;AACpI,IAAA,gBAAgB,EAAE,EAAE,KAAK,EAAE,2BAA2B,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE;AACpH,IAAA,mBAAmB,EAAE,EAAE,KAAK,EAAE,8BAA8B,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE;AAC7H,IAAA,mBAAmB,EAAE,EAAE,KAAK,EAAE,wBAAwB,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE;AACnH,IAAA,YAAY,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE;IAC1G,iBAAiB,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE;AAChI,IAAA,iBAAiB,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE;IAC7G,aAAa,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE;;AAGhI,IAAA,aAAa,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE;AACxG,IAAA,mBAAmB,EAAE,EAAE,KAAK,EAAE,4BAA4B,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE;AACxH,IAAA,2BAA2B,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE;AAC1H,IAAA,eAAe,EAAE,EAAE,KAAK,EAAE,2BAA2B,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE;AACnH,IAAA,kBAAkB,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE;AAC/G,IAAA,kBAAkB,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE;AAC9G,IAAA,yBAAyB,EAAE,EAAE,KAAK,EAAE,yBAAyB,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE;AAC3H,IAAA,qBAAqB,EAAE,EAAE,KAAK,EAAE,yBAAyB,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE;IAC1H,0BAA0B,EAAE,EAAE,KAAK,EAAE,wBAAwB,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE;AAC3I,IAAA,2BAA2B,EAAE,EAAE,KAAK,EAAE,6BAA6B,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE;AACnI,IAAA,kBAAkB,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE;AAC/G,IAAA,qBAAqB,EAAE,EAAE,KAAK,EAAE,0BAA0B,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE;IAC3H,qBAAqB,EAAE,EAAE,KAAK,EAAE,0BAA0B,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE;IAC9I,0BAA0B,EAAE,EAAE,KAAK,EAAE,kCAAkC,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE;IACpJ,OAAO,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE;AACvH,IAAA,mBAAmB,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,EAAE;AAC3H,IAAA,qBAAqB,EAAE,EAAE,KAAK,EAAE,0BAA0B,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE;AACtH,IAAA,wBAAwB,EAAE,EAAE,KAAK,EAAE,+BAA+B,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE;AACrI,IAAA,qBAAqB,EAAE,EAAE,KAAK,EAAE,8BAA8B,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE;AAC/H,IAAA,sBAAsB,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE;AACrH,IAAA,kBAAkB,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE;AACrH,IAAA,iBAAiB,EAAE,EAAE,KAAK,EAAE,yBAAyB,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE;AACzH,IAAA,0BAA0B,EAAE,EAAE,KAAK,EAAE,mCAAmC,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE;IAC5I,wBAAwB,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE;AACnI,IAAA,yBAAyB,EAAE,EAAE,KAAK,EAAE,+BAA+B,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE;AACjI,IAAA,6BAA6B,EAAE,EAAE,KAAK,EAAE,kCAAkC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE;IACzI,mBAAmB,EAAE,EAAE,KAAK,EAAE,4BAA4B,EAAE,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE;IACnJ,0BAA0B,EAAE,EAAE,KAAK,EAAE,2BAA2B,EAAE,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE;AACzJ,IAAA,kBAAkB,EAAE,EAAE,KAAK,EAAE,6BAA6B,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE;IAC3H,oBAAoB,EAAE,EAAE,KAAK,EAAE,4BAA4B,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE;AAC5I,IAAA,sBAAsB,EAAE,EAAE,KAAK,EAAE,8BAA8B,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE;AAC7H,IAAA,gBAAgB,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE;AAC9G,IAAA,iBAAiB,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE;IACjH,uBAAuB,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE;IACnI,qBAAqB,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE;AACpI,IAAA,sBAAsB,EAAE,EAAE,KAAK,EAAE,8BAA8B,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE;AAChI,IAAA,yBAAyB,EAAE,EAAE,KAAK,EAAE,+BAA+B,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE;CACpI;AAEK,SAAU,YAAY,CAAC,IAAY,EAAA;IACvC,OAAO,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;AACjD;;MC6Pa,6BAA6B,CAAA;AAuD9B,IAAA,EAAA;AAC6B,IAAA,SAAA;AAC7B,IAAA,QAAA;AACA,IAAA,UAAA;AAvDV,IAAA,IAAI;;AAGJ,IAAA,OAAO;AACC,IAAA,KAAK;IACb,aAAa,GAAG,OAAO,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC;IACjE,UAAU,GAAG,OAAO,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,SAAS,CAAC;IAC/D,WAAW,GAAG,OAAO,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,SAAS,CAAC;AAEjE,IAAA,IAAI,OAAO,GAAA;QACT,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAc;;AAEzC,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAQ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAe,CAAC,GAAG,CAAC,UAAU,CAAc;;AAExE,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAQ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAe,CAAC,GAAG,CAAC,MAAM,CAAc;;AAEpE,IAAA,IAAI,WAAW,GAAA;QACb,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAc;;AAE7C,IAAA,IAAI,YAAY,GAAA;QACd,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAc;;AAE9C,IAAA,IAAI,WAAW,GAAA;QACb,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAc;;AAE7C,IAAA,IAAI,cAAc,GAAA;QAChB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAc;;AAEhD,IAAA,IAAI,SAAS,GAAA;QACX,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAc;;AAE3C,IAAA,IAAI,aAAa,GAAA;QACf,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAc;;AAE/C,IAAA,IAAI,YAAY,GAAA;QACd,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAc;;AAE9C,IAAA,IAAI,WAAW,GAAA;QACb,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAc;;AAGtD,IAAA,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;IACrC,YAAY,GAA2C,EAAE;AAEzD,IAAA,QAAQ,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC;AAC9C,IAAA,QAAQ;AACR,IAAA,OAAO,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC;IAC7C,SAAS,GAAkB,IAAI;AAE/B,IAAA,WAAA,CACU,EAAe,EACc,SAAc,EAC3C,QAAqB,EACrB,UAAsB,EAAA;QAHtB,IAAA,CAAA,EAAE,GAAF,EAAE;QAC2B,IAAA,CAAA,SAAS,GAAT,SAAS;QACtC,IAAA,CAAA,QAAQ,GAAR,QAAQ;QACR,IAAA,CAAA,UAAU,GAAV,UAAU;QAElB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;YACxB,QAAQ,EAAE,CAAC,QAAQ,CAAC;AACpB,YAAA,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;gBAChB,YAAY,EAAE,CAAC,IAAI,CAAC;gBACpB,YAAY,EAAE,CAAC,IAAI,CAAC;gBACpB,0BAA0B,EAAE,CAAC,IAAI,CAAC;gBAClC,YAAY,EAAE,CAAC,KAAK,CAAC;gBACrB,KAAK,EAAE,CAAC,KAAK,CAAC;gBACd,MAAM,EAAE,CAAC,EAAE,CAAC;gBACZ,gBAAgB,EAAE,CAAC,KAAK,CAAC;;AAEzB,gBAAA,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;oBACtB,qBAAqB,EAAE,CAAC,IAAI,CAAC;oBAC7B,WAAW,EAAE,CAAC,EAAE,CAAC;oBACjB,UAAU,EAAE,CAAC,SAAS,CAAC;oBACvB,YAAY,EAAE,CAAC,GAAG,CAAC;oBACnB,gBAAgB,EAAE,CAAC,GAAG,CAAC;iBACxB,CAAC;AACF,gBAAA,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;oBAClB,aAAa,EAAE,CAAC,CAAC,CAAC;oBAClB,WAAW,EAAE,CAAC,MAAM,CAAC;oBACrB,eAAe,EAAE,CAAC,GAAG,CAAC;oBACtB,oBAAoB,EAAE,CAAC,KAAK,CAAC;AAC7B,oBAAA,aAAa,EAAE,CAAC,EAAE,CAAC;oBACnB,aAAa,EAAE,CAAC,MAAM,CAAC;iBACxB,CAAC;aACH,CAAC;AACF,YAAA,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;gBACpB,gBAAgB,EAAE,CAAC,IAAI,CAAC;gBACxB,eAAe,EAAE,CAAC,IAAI,CAAC;gBACvB,gBAAgB,EAAE,CAAC,IAAI,CAAC;gBACxB,qBAAqB,EAAE,CAAC,QAAQ,CAAC;gBACjC,QAAQ,EAAE,CAAC,KAAK,CAAC;gBACjB,gBAAgB,EAAE,CAAC,IAAI,CAAC;gBACxB,eAAe,EAAE,CAAC,EAAE,CAAC;aACtB,CAAC;AACF,YAAA,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;gBACrB,iBAAiB,EAAE,CAAC,EAAE,CAAC;gBACvB,eAAe,EAAE,CAAC,EAAE,CAAC;gBACrB,eAAe,EAAE,CAAC,EAAE,CAAC;gBACrB,mBAAmB,EAAE,CAAC,KAAK,CAAC;aAC7B,CAAC;AACF,YAAA,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;gBAClB,eAAe,EAAE,CAAC,CAAC,CAAC;gBACpB,UAAU,EAAE,CAAC,CAAC,CAAC;gBACf,cAAc,EAAE,CAAC,CAAC,CAAC;aACpB,CAAC;AACF,YAAA,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;gBACpB,iBAAiB,EAAE,CAAC,KAAK,CAAC;gBAC1B,aAAa,EAAE,CAAC,KAAK,CAAC;aACvB,CAAC;AACF,YAAA,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;gBACvB,cAAc,EAAE,CAAC,KAAK,CAAC;gBACvB,eAAe,EAAE,CAAC,IAAI,CAAC;gBACvB,YAAY,EAAE,CAAC,CAAC,CAAC;gBACjB,aAAa,EAAE,CAAC,CAAC,CAAC;aACnB,CAAC;AACF,YAAA,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;gBACrB,YAAY,EAAE,CAAC,aAAa,CAAC;gBAC7B,UAAU,EAAE,CAAC,WAAW,CAAC;;gBAEzB,WAAW,EAAE,CAAC,EAAE,CAAC;gBACjB,SAAS,EAAE,CAAC,EAAE,CAAC;aAChB,CAAC;AACF,YAAA,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;gBACtB,aAAa,EAAE,CAAC,EAAE,CAAC;gBACnB,WAAW,EAAE,CAAC,EAAE,CAAC;gBACjB,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;aAC1B,CAAC;AACH,SAAA,CAAC;;AAGF,QAAA,MAAM,QAAQ,GAAuC;AACnD,YAAA,iBAAiB,EAAE,0BAA0B;AAC7C,YAAA,cAAc,EAAE,sBAAsB;AACtC,YAAA,SAAS,EAAE,wBAAwB;AACnC,YAAA,YAAY,EAAE,uBAAuB;AACrC,YAAA,mBAAmB,EAAE,gCAAgC;AACrD,YAAA,cAAc,EAAE,0BAA0B;AAC1C,YAAA,cAAc,EAAE,yBAAyB;AACzC,YAAA,kBAAkB,EAAE,4BAA4B;AAChD,YAAA,qBAAqB,EAAE,8BAA8B;AACrD,YAAA,kBAAkB,EAAE,0BAA0B;AAC9C,YAAA,kBAAkB,EAAE,kCAAkC;AACtD,YAAA,aAAa,EAAE,oBAAoB;AACnC,YAAA,eAAe,EAAE,uBAAuB;AACxC,YAAA,iBAAiB,EAAE,uBAAuB;AAC1C,YAAA,gBAAgB,EAAE,sBAAsB;AACxC,YAAA,cAAc,EAAE,0CAA0C;SAC3D;AACD,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM;YACjD,IAAI;YACJ,KAAK,EAAE,QAAQ,CAAC,IAAiB,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC;AACnD,SAAA,CAAC,CAAC;AAEH,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW;QACpC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AAC/B,YAAA,WAAW,CAAC,UAAU,CAAC,IAAc,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAC7D,SAAC,CAAC;AAEF,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAC1CA,KAAG,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,EACzB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAC3B;;AAGD,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,IAAI,IAAI,CAAC,SAAS,EAAE,SAAS;AACnE,QAAA,IAAI,CAAC,KAAK,GAAG,wBAAwB,CAAC,IAAI,CAAC,OAAO,IAAI,YAAY,EAAE,MAClE,IAAI,CAAC,kBAAkB,EAAE,CAC1B;;AAGD,QAAA,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI;AACzB,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;;IAGpD,QAAQ,GAAA;;;AAIN,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,MAAM,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,EAAuB;AACxD,YAAA,IAAI,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE;gBACpB,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAS;;;YAGtE,IAAI,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;gBACjC,KAAK,CAAC,EAAE,GAAG;oBACT,GAAG,KAAK,CAAC,EAAE;AACX,oBAAA,IAAI,EAAE;AACJ,wBAAA,GAAI,KAAK,CAAC,EAAE,CAAC,IAAY;AACzB,wBAAA,aAAa,EAAG,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,aAA0B,CAAC,IAAI,CAAC,GAAG,CAAC;AAC5D,qBAAA;iBACF;;AAEV,YAAA,IAAI,KAAK,CAAC,OAAO,EAAE,iBAAiB,EAAE;gBACpC,KAAK,CAAC,OAAO,GAAG;oBACd,GAAG,KAAK,CAAC,OAAO;oBAChB,iBAAiB,EAAE,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC;iBACtD;;AAEV,YAAA,IAAI,KAAK,CAAC,OAAO,EAAE,eAAe,EAAE;gBAClC,KAAK,CAAC,OAAO,GAAG;oBACd,GAAG,KAAK,CAAC,OAAO;oBAChB,eAAe,EAAE,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;iBAClD;;AAEV,YAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;;;QAI7B,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,SAAS,CAAC,MAAK;AAC5C,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;AACtB,SAAC,CAAC;AAEF,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;AAG1D,IAAA,iBAAiB,CAAC,GAAQ,EAAA;AAChC,QAAA,IAAI,CAAC,GAAG;YAAE;;AAEV,QAAA,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE;AACjC,QAAA,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE;;AAG3B,QAAA,IAAI,CAAC,WAAW,CAAC,UAAU,CACzB;AACE,YAAA,qBAAqB,EAAE,OAAO,CAAC,kBAAkB,IAAI,IAAI;AACzD,YAAA,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,IAAI,IAAI;AAClD,YAAA,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,IAAI;;AAEhD,YAAA,QAAQ,EAAE,IAAI,CAAC,mBAAmB,IAAI,KAAK;;AAE3C,YAAA,eAAe,EACb,OAAO,IAAI,CAAC,gBAAgB,KAAK;kBAC7B,IAAI,CAAC;AACP,kBAAE,IAAI;AACX,SAAA,EACD,EAAE,SAAS,EAAE,KAAK,EAAE,CACrB;;QAGD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB;cACnD,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG;cAClC,EAAE;QACN,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe;cAC/C,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG;cAChC,EAAE;AACN,QAAA,IAAI,CAAC,YAAY,CAAC,UAAU,CAC1B;AACE,YAAA,iBAAiB,EAAE,OAAO;AAC1B,YAAA,eAAe,EAAE,KAAK;AACtB,YAAA,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,EAAE;AAC9C,YAAA,mBAAmB,EAAE,CAAC,CAAC,OAAO,CAAC,mBAAmB;AACnD,SAAA,EACD,EAAE,SAAS,EAAE,KAAK,EAAE,CACrB;;AAGD,QAAA,IAAI,CAAC,SAAS,CAAC,UAAU,CACvB;AACE,YAAA,eAAe,EACb,OAAO,IAAI,CAAC,oBAAoB,KAAK;kBACjC,IAAI,CAAC;AACP,kBAAE,CAAC;AACR,SAAA,EACD,EAAE,SAAS,EAAE,KAAK,EAAE,CACrB;;AAGD,QAAA,IAAI,CAAC,cAAc,CAAC,UAAU,CAC5B;;AAEC,SAAA,EACD,EAAE,SAAS,EAAE,KAAK,EAAE,CACrB;;AAGD,QAAA,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;;AAGrD,QAAA,MAAM,cAAc,GAA2B,GAAG,CAAC,QAAQ,IAAI,EAAE;AACjE,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW;AACpC,QAAA,MAAM,KAAK,GAA8B;YACvC,YAAY,EAAE,SAAS,CAAC,iBAAiB;YACzC,qBAAqB,EAAE,SAAS,CAAC,eAAe;YAChD,qBAAqB,EAAE,SAAS,CAAC,kBAAkB;YACnD,cAAc,EAAE,SAAS,CAAC,aAAa;YACvC,cAAc,EAAE,SAAS,CAAC,cAAc;YACxC,mBAAmB,EAAE,SAAS,CAAC,mBAAmB;YAClD,cAAc,EAAE,SAAS,CAAC,cAAc;YACxC,cAAc,EAAE,SAAS,CAAC,cAAc;YACxC,aAAa,EAAE,SAAS,CAAC,cAAc;YACvC,gBAAgB,EAAE,SAAS,CAAC,qBAAqB;YACjD,cAAc,EAAE,SAAS,CAAC,kBAAkB;YAC5C,mBAAmB,EAAE,SAAS,CAAC,kBAAkB;YACjD,oBAAoB,EAAE,SAAS,CAAC,kBAAkB;YAClD,gBAAgB,EAAE,SAAS,CAAC,iBAAiB;YAC7C,iBAAiB,EAAE,SAAS,CAAC,iBAAiB;SAC/C;QACD,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,KAAI;YAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAK,SAAiB,CAAC,OAAO,CAAC;AAC5D,YAAA,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,OAAO;YAClD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;AAC9B,gBAAA,WAAW,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;;AAEvD,YAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE;AACvD,gBAAA,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC;AAClC,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,QAAQ;AACpC,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;;YAEnD;iBACG,GAAG,CAAC,QAAQ;AACb,kBAAE,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC/D,SAAC,CAAC;;IAGJ,gBAAgB,GAAA;AACd,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAA0B;;AAElD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAe;AAC1D,QAAA,IAAI,MAAM,KAAK,SAAS,EAAE;YACxB,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,IAAI,EAAE;AACzB,YAAA,KAAK,CAAC,EAAE,CAAC,MAAM,GAAG;iBACf,KAAK,CAAC,GAAG;iBACT,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE;iBACnB,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;;;AAGvB,QAAA,MAAM,EAAE,GAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAe,EAAE,GAAG,CAAC,eAAe;AACrE,cAAE,KAAe;AACnB,QAAA,IAAI,EAAE,KAAK,SAAS,EAAE;YACpB,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,IAAI,EAAE;AACxB,YAAA,KAAK,CAAC,EAAU,CAAC,IAAI,GAAI,KAAK,CAAC,EAAU,CAAC,IAAI,IAAI,EAAE;AACpD,YAAA,KAAK,CAAC,EAAU,CAAC,IAAI,CAAC,aAAa,GAAG;iBACpC,KAAK,CAAC,GAAG;iBACT,GAAG,CAAC,CAAC,CAAS,KAAK,CAAC,CAAC,IAAI,EAAE;iBAC3B,MAAM,CAAC,CAAC,CAAS,KAAK,CAAC,CAAC,CAAC,CAAC;;;QAG/B,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,mBAAmB;AAC1D,cAAE,KAAe;AACnB,QAAA,IAAI,UAAU,KAAK,SAAS,EAAE;YAC5B,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE;AAClC,YAAA,KAAK,CAAC,OAAe,CAAC,iBAAiB,GAAG;iBACxC,KAAK,CAAC,GAAG;iBACT,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE;iBACnB,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;;;AAGvB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,KAAe;AACtE,QAAA,IAAI,IAAI,KAAK,SAAS,EAAE;YACtB,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE;AAClC,YAAA,KAAK,CAAC,OAAe,CAAC,eAAe,GAAG;iBACtC,KAAK,CAAC,GAAG;iBACT,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE;iBACnB,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;;AAEvB,QAAA,OAAO,KAAK;;IAGd,gBAAgB,GAAA;AACd,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;QAC9B,IAAI,CAAC,IAAI,EAAE;YACT;;AAEF,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AAC1C,QAAA,IAAI,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE;AACnC,YAAA,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC;YACnC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,sBAAsB,EAAE,SAAS,EAAE;AACpD,gBAAA,QAAQ,EAAE,IAAI;AACf,aAAA,CAAC;;;AAIN,IAAA,YAAY,CAAC,IAAY,EAAA;AACvB,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;AAC/B,YAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;AAC5B,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;;AACrB,QAAA,MAAM;AACN,YAAA,IAAI,CAAC,SAAS,GAAG,qCAAqC;AACtD,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;;IAI9D,kBAAkB,GAAA;AACxB,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,KAK3B;QACD,MAAM,OAAO,GAA2B,EAAE;AAC1C,QAAA,IAAI,CAAC,EAAE,YAAY,IAAI,CAAC,EAAE,WAAW;YACnC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW;AACzC,QAAA,IAAI,CAAC,EAAE,UAAU,IAAI,CAAC,EAAE,SAAS;YAAE,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS;AACtE,QAAA,OAAO,OAAO;;IAGhB,mBAAmB,GAAA;AACjB,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;;AAlZX,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,6BAA6B,+CAwD9B,mBAAmB,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAxDlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA/a9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6aT,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAzbC,YAAY,+PACZ,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,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,mBAAA,EAAA,QAAA,EAAA,iGAAA,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,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,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,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,WAAA,EAAA,IAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,oBAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,kBAAkB,kYAClB,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,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,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,eAAe,+sBACf,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,EACf,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,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,iBAAiB,8BACjB,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAE,EAAA,CAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA;;2FAibF,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBA/bzC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,mCAAmC;AAC7C,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,OAAO,EAAE;wBACP,YAAY;wBACZ,mBAAmB;wBACnB,aAAa;wBACb,kBAAkB;wBAClB,cAAc;wBACd,iBAAiB;wBACjB,eAAe;wBACf,eAAe;wBACf,aAAa;wBACb,iBAAiB;wBACjB,WAAW;AACZ,qBAAA;AACD,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6aT,EAAA,CAAA;AACF,iBAAA;;0BAyDI,MAAM;2BAAC,mBAAmB;;;MCtgBlB,kBAAkB,GAAG,IAAI,cAAc,CAClD,oBAAoB,EACpB;AACE,IAAA,UAAU,EAAE,MAAM;AAClB,IAAA,OAAO,EAAE,OAAO;AACd,QAAA,iBAAiB,EAAE,qBAAqB;AACxC,QAAA,aAAa,EAAE,qBAAqB;AACpC,QAAA,cAAc,EAAE,YAAY;AAC5B,QAAA,mBAAmB,EAAE,sBAAsB;AAC3C,QAAA,aAAa,EAAE,kBAAkB;AACjC,QAAA,iBAAiB,EAAE,qBAAqB;AACxC,QAAA,eAAe,EAAE,oDAAoD;KACtE,CAAC;AACH,CAAA;;MCEU,cAAc,GAAG,IAAI,cAAc,CAAgB,gBAAgB;MAEnE,2BAA2B,GAAG,IAAI,cAAc,CAE3D,6BAA6B;AAE/B,MAAM,gBAAgB,GAA2B;AAC/C,IAAA,iBAAiB,EAAE,2BAA2B;AAC9C,IAAA,cAAc,EAAE,uBAAuB;AACvC,IAAA,SAAS,EAAE,yBAAyB;AACpC,IAAA,YAAY,EAAE,4BAA4B;AAC1C,IAAA,mBAAmB,EAAE,iCAAiC;AACtD,IAAA,cAAc,EAAE,2BAA2B;AAC3C,IAAA,cAAc,EAAE,gBAAgB;AAChC,IAAA,kBAAkB,EAAE,6BAA6B;AACjD,IAAA,qBAAqB,EAAE,+BAA+B;AACtD,IAAA,kBAAkB,EAAE,2BAA2B;AAC/C,IAAA,kBAAkB,EAAE,mCAAmC;AACvD,IAAA,aAAa,EAAE,qBAAqB;AACpC,IAAA,eAAe,EAAE,mCAAmC;AACpD,IAAA,iBAAiB,EAAE,wBAAwB;AAC3C,IAAA,gBAAgB,EAAE,uBAAuB;AACzC,IAAA,cAAc,EAAE,iCAAiC;;AAGjD,IAAA,oBAAoB,EAAE,uBAAuB;AAC7C,IAAA,qBAAqB,EAAE,2BAA2B;AAClD,IAAA,wBAAwB,EAAE,8BAA8B;AACxD,IAAA,yBAAyB,EAAE,4BAA4B;AACvD,IAAA,qBAAqB,EAAE,0BAA0B;AACjD,IAAA,kBAAkB,EAAE,qBAAqB;AACzC,IAAA,cAAc,EAAE,0BAA0B;AAC1C,IAAA,YAAY,EAAE,2BAA2B;AACzC,IAAA,oBAAoB,EAAE,0BAA0B;AAChD,IAAA,aAAa,EAAE,gBAAgB;AAC/B,IAAA,iBAAiB,EAAE,oBAAoB;CACxC;MAGY,kBAAkB,CAAA;AAIV,IAAA,cAAA;AACoC,IAAA,SAAA;IAJvD,WAAA,CAGmB,cAAgD,EACZ,SAAyB,EAAA;QAD7D,IAAA,CAAA,cAAc,GAAd,cAAc;QACsB,IAAA,CAAA,SAAS,GAAT,SAAS;;IAGhE,GAAG,CAAC,KAAoB,EAAE,OAAqB,EAAA;QAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,eAAe,CAAC;AAClD,QAAA,MAAM,GAAG,GAAG,CAAA,0BAAA,EAA6B,IAAI,EAAE;QAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC;AAC/C,QAAA,MAAM,OAAO,GACX,CAAC,UAAU,IAAI,UAAU,KAAK,GAAG,GAAG,UAAU,GAAG,SAAS;AAC1D,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC3B,gBAAgB,CAAC,IAAI,CAAC;AACtB,YAAA,KAAK,CAAC,OAAO;AACb,YAAA,oBAAoB;;AAGtB,QAAA,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC;AAC/B,QAAA,MAAM,MAAM,GAAgB;YAC1B,OAAO;YACP,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B;AAED,QAAA,MAAM,WAAW,GACf,IAAI,KAAK,sBAAsB;AAC/B,YAAA,IAAI,KAAK,qBAAqB;YAC9B,IAAI,KAAK,gBAAgB;QAE3B,IAAI,WAAW,EAAE;YACf,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACvD,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,uBAAuB,CAAC,CAAC;YAC/D,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,mBAAmB,CAAC,CAAC;AACnE,YAAA,IACE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;AACpB,gBAAA,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;AACxB,gBAAA,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAChC;gBACA,MAAM,CAAC,SAAS,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE;;;AAI9D,QAAA,OAAO,MAAM;;uGAhDJ,kBAAkB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAGnB,2BAA2B,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,KAAA,EAEf,cAAc,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AALzB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cADL,MAAM,EAAA,CAAA;;2FACnB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAD9B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;0BAG7B;;0BACA,MAAM;2BAAC,2BAA2B;;0BAElC;;0BAAY,MAAM;2BAAC,cAAc;;;ACrEtC,SAAS,OAAO,CAAC,GAAW,EAAE,IAAS,EAAA;AACrC,IAAA,OAAO,EAAE,CAAC,GAAG,GAAG,IAAI,EAAsB;AAC5C;AAEA,SAAS,WAAW,CAAC,KAAU,EAAA;AAC7B,IAAA,IAAI,CAAC,KAAK;AAAE,QAAA,OAAO,EAAE;AACrB,IAAA,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,CAAC;AAC/C;AAEM,SAAU,eAAe,CAAC,OAAiB,EAAA;IAC/C,MAAM,UAAU,GAAG,CAAC,OAAO,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IAC9D,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC;IAC1C,OAAO,CAAC,OAAwB,KAA6B;AAC3D,QAAA,IAAI,SAAS;AAAE,YAAA,OAAO,IAAI;QAC1B,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,MAAM;AAAE,YAAA,OAAO,IAAI;QAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAI;YAC/B,MAAM,IAAI,GAAI,CAAS,CAAC,IAAI,GAAG,MAAM,CAAE,CAAS,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,GAAG,EAAE;YACzE,MAAM,IAAI,GAAI,CAAS,CAAC,IAAI,GAAG,MAAM,CAAE,CAAS,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,GAAG,EAAE;AACzE,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG;kBACzB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;kBACpC,EAAE;YACN,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,KAAI;AAC5B,gBAAA,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AACpB,oBAAA,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;;AAExC,gBAAA,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;oBACrB,OAAO,GAAG,KAAK,CAAC;;gBAElB,OAAO,IAAI,KAAK,CAAC;AACnB,aAAC,CAAC;AACJ,SAAC,CAAC;AACF,QAAA,OAAO,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI;AACxD,KAAC;AACH;AAEM,SAAU,oBAAoB,CAAC,QAAgB,EAAA;IACnD,OAAO,CAAC,OAAwB,KAA6B;QAC3D,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,MAAM;AAAE,YAAA,OAAO,IAAI;AAC9B,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAM,CAAS,CAAC,IAAI,GAAG,QAAQ,CAAC;AAC5D,QAAA,OAAO,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI;AAClE,KAAC;AACH;AAEM,SAAU,wBAAwB,CAAC,QAAgB,EAAA;IACvD,OAAO,CAAC,OAAwB,KAA6B;QAC3D,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,MAAM;AAAE,YAAA,OAAO,IAAI;AAC9B,QAAA,OAAO,KAAK,CAAC,MAAM,GAAG;AACpB,cAAE,OAAO,CAAC,iBAAiB,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE;cAClE,IAAI;AACV,KAAC;AACH;AAEM,SAAU,oBAAoB,CAAC,QAAgB,EAAA;IACnD,OAAO,CAAC,OAAwB,KAA6B;QAC3D,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,MAAM;AAAE,YAAA,OAAO,IAAI;QAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,IAAK,CAAS,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;QACvE,OAAO,KAAK,GAAG;AACb,cAAE,OAAO,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE;cACvD,IAAI;AACV,KAAC;AACH;;MCzDa,oBAAoB,CAAA;AAKX,IAAA,IAAA;AAJZ,IAAA,kBAAkB,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC;AACxD,IAAA,QAAQ,GAAG,IAAI,eAAe,CAAc,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;IACnE,WAAW,GAAG,CAAC;AAEvB,IAAA,WAAA,CAAoB,IAAY,EAAA;QAAZ,IAAA,CAAA,IAAI,GAAJ,IAAI;AACtB,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAK;AAC/B,YAAA,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACzE,YAAA,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACzE,YAAA,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACvE,YAAA,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACjE,SAAC,CAAC;;IAGJ,WAAW,GAAA;QACT,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,WAAkB,CAAC;QAChE,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,WAAkB,CAAC;QAChE,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,UAAiB,CAAC;QAC9D,MAAM,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAa,CAAC;;IAGxD,mBAAmB,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE;;IAG/C,OAAO,GAAA;AACL,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE;;AAGrC,IAAA,eAAe,CAAC,IAAa,EAAE,WAAmB,EAAE,KAAyB,IAAI,EAAA;QAC/E,MAAM,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK;AACnC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,WAAW;AACpC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,WAAW;AAClC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,WAAW;AACtC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,WAAW;QACxC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM;;AAG3D,IAAA,WAAW,GAAG,CAAC,CAAY,KAAI;QACrC,IAAI,CAAC,WAAW,EAAE;QAClB,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;AAC7F,QAAA,IAAI,QAAQ;AAAE,YAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;AAClD,KAAC;AAEO,IAAA,WAAW,GAAG,CAAC,EAAa,KAAI;AACtC,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;AACpD,QAAA,IAAI,IAAI,CAAC,WAAW,KAAK,CAAC,EAAE;AAC1B,YAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC;AACnC,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;;AAE9C,KAAC;AAEO,IAAA,UAAU,GAAG,CAAC,CAAY,KAAI;AACpC,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;AACpD,KAAC;AAEO,IAAA,MAAM,GAAG,CAAC,EAAa,KAAI;AACjC,QAAA,IAAI,CAAC,WAAW,GAAG,CAAC;AACpB,QAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC;AACnC,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;AAC5C,KAAC;uGA5DU,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,CAAA,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,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,cADP,MAAM,EAAA,CAAA;;2FACnB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBADhC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCwCrB,cAAc,CAAA;AACI,IAAA,IAAA;AAA7B,IAAA,WAAA,CAA6B,IAAgB,EAAA;QAAhB,IAAA,CAAA,IAAI,GAAJ,IAAI;;AAEjC;;AAEG;AACH,IAAA,MAAM,CACJ,OAAe,EACf,IAAU,EACV,UAAyB,EAAE,EAAA;AAE3B,QAAA,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE;AAC/B,QAAA,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC;QAC7B,IAAI,OAAO,CAAC,WAAW;YAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC;QACxE,IAAI,OAAO,CAAC,QAAQ;AAAE,YAAA,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnF,IAAI,OAAO,CAAC,cAAc;YAAE,QAAQ,CAAC,MAAM,CAAC,gBAAgB,EAAE,OAAO,CAAC,cAAc,CAAC;QAErF,OAAO,IAAI,CAAC;AACT,aAAA,IAAI,CAAU,CAAA,EAAG,OAAO,CAAA,OAAA,CAAS,EAAE,QAAQ,EAAE;AAC5C,YAAA,cAAc,EAAE,IAAI;AACpB,YAAA,OAAO,EAAE,QAAQ;SAClB;aACA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC;;AAGzC;;AAEG;AACH,IAAA,UAAU,CACR,OAAe,EACf,KAAuB,EACvB,UAA6B,EAAE,EAAA;AAE/B,QAAA,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE;AAE/B,QAAA,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAI;YAClB,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC;AAClC,SAAC,CAAC;QAEF,IAAI,OAAO,CAAC,WAAW;YAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC;;QAGxE,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,YAAY;QACnD,IAAI,EAAE,KAAK,SAAS;YAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;;AAG7D,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC;AAClD,QAAA,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,EAAE;AACjC,YAAA,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;;AAEpD,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,cAAc,IAAI,IAAI,CAAC;AAC3D,QAAA,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,EAAE;AACpC,YAAA,QAAQ,CAAC,MAAM,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;;QAG7D,OAAO,IAAI,CAAC;AACT,aAAA,IAAI,CAAU,CAAA,EAAG,OAAO,CAAA,KAAA,CAAO,EAAE,QAAQ,EAAE;AAC1C,YAAA,cAAc,EAAE,IAAI;AACpB,YAAA,OAAO,EAAE,QAAQ;SAClB;aACA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC;;IAGzC,OAAO,CAAC,OAAe,EAAE,QAAgB,EAAA;;QAEvC,MAAM,GAAG,GAAG,CAAA,EAAG,OAAO,CAAA,yBAAA,EAA4B,kBAAkB,CAClE,QAAQ,CACT,CAAA,CAAE;AACH,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAkB,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;;uGApE7D,cAAc,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAd,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,cADD,MAAM,EAAA,CAAA;;2FACnB,cAAc,EAAA,UAAA,EAAA,CAAA;kBAD1B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCzCrB,wBAAwB,CAAA;AACN,IAAA,IAAA;AAA7B,IAAA,WAAA,CAA6B,IAAgB,EAAA;QAAhB,IAAA,CAAA,IAAI,GAAJ,IAAI;;AAEjC;;AAEG;AACH,IAAA,MAAM,CACJ,MAAuB,EACvB,IAAU,EACV,UAAU,GAAG,CAAC,EAAA;AAEd,QAAA,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE;AAC/B,QAAA,IAAI,MAAM,CAAC,MAAM,EAAE;AACjB,YAAA,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;AACrD,gBAAA,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC;AAC7B,aAAC,CAAC;;AAEJ,QAAA,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC;QAC7B,OAAO,IAAI,CAAC;AACT,aAAA,IAAI,CAAU,MAAM,CAAC,SAAS,EAAE,QAAQ,EAAE;YACzC,OAAO,EAAE,MAAM,CAAC,OAAO;AACvB,YAAA,OAAO,EAAE,QAAQ;AACjB,YAAA,cAAc,EAAE,IAAI;AACpB,YAAA,eAAe,EAAE,KAAK;SACvB;AACA,aAAA,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;;uGAzBjB,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,wBAAwB,cADX,MAAM,EAAA,CAAA;;2FACnB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBADpC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCsfrB,iBAAiB,CAAA;AAoFlB,IAAA,aAAA;AACA,IAAA,QAAA;AAC4B,IAAA,YAAA;AAC5B,IAAA,OAAA;AACA,IAAA,gBAAA;AACA,IAAA,GAAA;AACY,IAAA,GAAA;AACA,IAAA,OAAA;AACA,IAAA,MAAA;AACwB,IAAA,SAAA;AACA,IAAA,aAAA;IA7FrC,MAAM,GAA6B,IAAI;IACvC,WAAW,GAAG,SAAS;AACvB,IAAA,OAAO;IACP,WAAW,GAAuB,MAAM;AAEvC,IAAA,aAAa,GAAG,IAAI,YAAY,EAA0B;AAC1D,IAAA,YAAY,GAAG,IAAI,YAAY,EAAsB;AACrD,IAAA,KAAK,GAAG,IAAI,YAAY,EAAiB;AACzC,IAAA,WAAW,GAAG,IAAI,YAAY,EAAiB;;AAE/C,IAAA,KAAK,GAAG,IAAI,YAAY,EAAwB;AAChD,IAAA,QAAQ,GAAG,IAAI,YAAY,EAAwB;AACnD,IAAA,QAAQ,GAAG,IAAI,YAAY,EAAwB;AACnD,IAAA,aAAa,GAAG,IAAI,YAAY,EAAwB;AACxD,IAAA,aAAa,GAAG,IAAI,YAAY,EAAwB;AACxD,IAAA,kBAAkB,GAAG,IAAI,YAAY,EAAU;AAC/C,IAAA,eAAe,GAAG,IAAI,YAAY,EAAW;AAEvB,IAAA,SAAS;AAEjC,IAAA,OAAO;AAC4B,IAAA,WAAW;;AAG9C,IAAA,mBAAmB;AAE3B,IAAA,gBAAgB,GAEZ,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,CAAC;AAC3D,IAAA,cAAc,GAAG,IAAI,WAAW,CAAS,QAAQ,CAAC;IAClD,cAAc,GAAG,CAAC;IAClB,aAAa,GAAG,KAAK;IACrB,SAAS,GAAyB,IAAI;IACtC,aAAa,GAAG,KAAK;IACrB,YAAY,GAAG,EAAE;IACjB,YAAY,GAAG,EAAE;AACjB,IAAA,QAAQ,GAAG,IAAI,WAAW,CAAC,EAAE,CAAC;IAC9B,aAAa,GAAkD,EAAE;AACjE,IAAA,KAAK;;IAGL,WAAW,GAAkC,IAAI;IACjD,SAAS,GAAgE,IAAI;;IAG7E,sBAAsB,GAAG,sBAAsB;IAEvC,SAAS,GAAG,KAAK;IACzB,UAAU,GAAG,KAAK;IACV,YAAY,GAAW,EAAE;;AAGzB,IAAA,eAAe;;IAGvB,oBAAoB,GAAG,KAAK;AACpB,IAAA,OAAO;AACP,IAAA,UAAU;AACV,IAAA,QAAQ;IACR,aAAa,GAAG,KAAK;;AAGrB,IAAA,UAAU;AACV,IAAA,WAAW,GAAG,CAAC,CAAgB,KAAI;AACzC,QAAA,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE;YACtB,IAAI,CAAC,oBAAoB,EAAE;YAC3B,IAAI,CAAC,mBAAmB,EAAE;;AAE9B,KAAC;AACO,IAAA,kBAAkB,GAAG,CAAC,EAAa,KAAI;QAC7C,IAAI,CAAC,oBAAoB,EAAE;AAC7B,KAAC;AACO,IAAA,qBAAqB,GAAG,CAAC,EAAa,KAAI;QAChD,IAAI,CAAC,oBAAoB,EAAE;AAC7B,KAAC;;AAGO,IAAA,kBAAkB;;IAG1B,cAAc,GAAG,KAAK;IAEtB,WAAA,CACU,aAAmC,EACnC,QAA8B,EACF,YAA8B,EAC1D,OAAgB,EAChB,gBAAkC,EAClC,GAAsB,EACV,GAAoB,EACpB,OAAkC,EAClC,MAA2B,EACH,SAAyB,EACzB,aAA6B,EAAA;QAVjE,IAAA,CAAA,aAAa,GAAb,aAAa;QACb,IAAA,CAAA,QAAQ,GAAR,QAAQ;QACoB,IAAA,CAAA,YAAY,GAAZ,YAAY;QACxC,IAAA,CAAA,OAAO,GAAP,OAAO;QACP,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;QAChB,IAAA,CAAA,GAAG,GAAH,GAAG;QACS,IAAA,CAAA,GAAG,GAAH,GAAG;QACH,IAAA,CAAA,OAAO,GAAP,OAAO;QACP,IAAA,CAAA,MAAM,GAAN,MAAM;QACkB,IAAA,CAAA,SAAS,GAAT,SAAS;QACT,IAAA,CAAA,aAAa,GAAb,aAAa;AAEzD,QAAA,IAAI,CAAC,KAAK,GAAG,YAAY;;;AAI3B,IAAA,IAAI,YAAY,GAAA;QACd,OAAO,IAAI,CAAC,SAAS;;;AAGvB,IAAA,IAAI,WAAW,GAAA;QACb,OAAO,IAAI,CAAC,SAAS;;AAEvB,IAAA,IAAI,gBAAgB,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;;AAEtC,IAAA,IAAI,YAAY,GAAA;QACd,OAAO,IAAI,CAAC,YAAY;;AAE1B,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM;;AAEjC,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;;;AAIvE,IAAA,QAAQ,CAAC,KAAuB,EAAA;AAC9B,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB,KAAK,CAAC,KAAK,EAAE;;;;IAKjB,aAAa,GAAA;AACX,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa;AACxC,QAAA,IAAI,EAAE;AAAE,YAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;;;AAI3B,IAAA,eAAe,CAAC,CAAM,EAAA;QACpB,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;;AAGxE,IAAA,WAAW,CAAC,KAAgC,EAAA;AAC1C,QAAA,MAAM,CAAC,GAAG,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,GAAG,CAAC;QAC/C,IAAI,CAAC,GAAG,IAAI;YAAE,OAAO,CAAA,EAAG,CAAC,CAAA,EAAA,CAAI;QAC7B,MAAM,KAAK,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;AACtC,QAAA,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI;QAChB,IAAI,CAAC,GAAG,CAAC;AACT,QAAA,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;YACxC,CAAC,IAAI,IAAI;AACT,YAAA,CAAC,EAAE;;AAEL,QAAA,OAAO,CAAA,EAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA,CAAA,EAAI,KAAK,CAAC,CAAC,CAAC,EAAE;;;AAItC,IAAA,YAAY,CAAC,GAAY,EAAA;AACvB,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,EAAE,OAAO,EAAE,EAAE,EAAS;AACvC,QAAA,OAAO,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAoB,CAAC,GAAI,GAAW;;AAG3E,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,gBAAgB;AAAE,YAAA,OAAO,IAAI;AACnD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK;AAC/B,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,IAAI;AACrB,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AACf,YAAA,OAAO,IAAI;;AACX,QAAA,MAAM;YACN,OAAO,IAAI,CAAC,CAAC,CAAC,iBAAiB,EAAE,sBAAsB,CAAC;;;IAI5D,QAAQ,GAAA;AACN,QAAA,MAAM,MAAM,GACV,IAAI,CAAC,aAAa,EAAE,UAAU,CAC5B,CAAA,oBAAA,EAAuB,IAAI,CAAC,WAAW,EAAE,CAC1C,IAAI,IAAI,CAAC,eAAe,EAAE;QAC7B,IAAI,MAAM,EAAE;AACV,YAAA,IAAI,CAAC,MAAM,GAAG,MAAM;;QAEtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,YAAY,EAAE;;;;IAMrB,eAAe,GAAA;;QAEb,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,qBAAqB,EAAE;;AAEnE,QAAA,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACzE,QAAA,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAEzE,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,gBAAgB,IAAI,GAAG;AACrE,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;AACjB,aAAA,mBAAmB;AACnB,aAAA,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC;AAC7B,aAAA,SAAS,CAAC,CAAC,QAAQ,KAAI;AACtB,YAAA,IAAI,CAAC,aAAa,GAAG,QAAQ;YAC7B,IAAI,CAAC,aAAa,EAAE;AACtB,SAAC,CAAC;AACJ,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;AACpB,aAAA,OAAO;AACP,aAAA,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC;aAC7B,SAAS,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;;AAGxC,QAAA,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACvE,QAAA,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3E,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,qBAAqB,EAAE;AAC7D,YAAA,OAAO,EAAE,IAAI;AACd,SAAA,CAAC;;QAEF,IAAI,CAAC,qBAAqB,EAAE;;IAG9B,WAAW,GAAA;QACT,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAqB,CAAC;QAChE,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAqB,CAAC;AAChE,QAAA,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE;AAC3B,QAAA,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE;QAC9B,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,WAAkB,CAAC;QAC9D,MAAM,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,kBAAyB,CAAC;QAClE,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,qBAA4B,CAAC;QACxE,IAAI,CAAC,cAAc,EAAE;QACrB,IAAI,CAAC,sBAAsB,EAAE;;IAGvB,cAAc,GAAG,MAAK;QAC5B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,qBAAqB,EAAE;QACnE,IAAI,CAAC,mBAAmB,EAAE;AAC5B,KAAC;IAEO,aAAa,GAAA;AACnB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB;QAC1C,IAAI,QAAQ,GAAG,KAAK;QAEpB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,QAAQ;QACrC,MAAM,OAAO,GAAG,GAAG,EAAE,qBAAqB,KAAK,KAAK,CAAC;AACrD,QAAA,MAAM,OAAO,GACX,CAAC,IAAI,CAAC,OAAO;aACZ,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC;YAC1D,IAAI,CAAC,WAAW;QAElB,IAAI,OAAO,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE;AACxC,YAAA,MAAM,MAAM,GAAG,GAAG,EAAE,WAAW,IAAI,EAAE;AACrC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC;AACjE,YAAA,QAAQ,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI;;AAGvC,QAAA,IAAI,CAAC,oBAAoB,GAAG,QAAQ;QACpC,IAAI,CAAC,aAAa,EAAE;AAEpB,QAAA,IAAI,QAAQ,KAAK,IAAI,CAAC,oBAAoB,EAAE;YAC1C,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC;;;IAIhD,aAAa,GAAA;AACnB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,IAAI,SAAS;AAC/D,QAAA,IAAI,IAAI,KAAK,SAAS,EAAE;YACtB,IAAI,CAAC,cAAc,EAAE;YACrB;;AAEF,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE;YAC7B,IAAI,CAAC,aAAa,EAAE;;aACf;YACL,IAAI,CAAC,cAAc,EAAE;;;IAIjB,aAAa,GAAA;AACnB,QAAA,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACzD,IAAI,CAAC,mBAAmB,EAAE;YAC1B;;AAEF,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa;AACzC,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC3B,aAAA,QAAQ;aACR,mBAAmB,CAAC,MAAM;aAC1B,kBAAkB,CAAC,IAAI;AACvB,aAAA,aAAa,CAAC;AACb,YAAA;AACE,gBAAA,OAAO,EAAE,OAAO;AAChB,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,QAAQ,EAAE,OAAO;AACjB,gBAAA,QAAQ,EAAE,KAAK;AAChB,aAAA;AACF,SAAA,CAAC;QAEJ,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YACpC,gBAAgB;YAChB,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,EAAE;AAC1D,YAAA,WAAW,EAAE,KAAK;AAClB,YAAA,UAAU,EAAE,mCAAmC;AAChD,SAAA,CAAC;QAEF,IAAI,CAAC,mBAAmB,EAAE;AAE1B,QAAA,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC;AAC1E,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC;;IAGxB,mBAAmB,GAAA;QACzB,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,qBAAqB,EAAE;AAC/D,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,YAAY,IAAI,GAAG;AAC7D,QAAA,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;AACzD,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE;;QAChC,MAAM;;IAGF,cAAc,GAAA;AACpB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,IAAI;AACF,gBAAA,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;;YACxB,MAAM;AACR,YAAA,IAAI;AACF,gBAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;;YACzB,MAAM;AACR,YAAA,IAAI,CAAC,UAAU,GAAG,SAAS;;;;IAKvB,qBAAqB,GAAA;QAC3B,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,mBAAmB;YAAE;QAChD,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAC9C,IAAI,CAAC,qBAAqB,EAAE;;aACvB;YACL,IAAI,CAAC,mBAAmB,EAAE;;AAE5B,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;;IAGjB,qBAAqB,GAAA;QAC3B,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,mBAAmB;YAAE;AAChD,QAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;AAC5B,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa;AACzC,YAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC3B,iBAAA,QAAQ;iBACR,mBAAmB,CAAC,MAAM;iBAC1B,kBAAkB,CAAC,IAAI;AACvB,iBAAA,aAAa,CAAC;AACb,gBAAA;AACE,oBAAA,OAAO,EAAE,OAAO;AAChB,oBAAA,OAAO,EAAE,KAAK;AACd,oBAAA,QAAQ,EAAE,OAAO;AACjB,oBAAA,QAAQ,EAAE,KAAK;AAChB,iBAAA;AACF,aAAA,CAAC;YACJ,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;gBAC5C,gBAAgB;gBAChB,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,EAAE;AAC1D,gBAAA,WAAW,EAAE,KAAK;AAClB,gBAAA,UAAU,EAAE,qCAAqC;AAClD,aAAA,CAAC;;AAEF,YAAA,MAAM,IAAI,GAAG,MAAM,CAAC,qBAAqB,EAAE;AAC3C,YAAA,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;AACzD,YAAA,IAAI;AACF,gBAAA,IAAI,CAAC,kBAAkB,CAAC,cAAc,EAAE;;YACxC,MAAM;AAER,YAAA,MAAM,MAAM,GAAG,IAAI,cAAc,CAC/B,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,gBAAgB,CACtB;AACD,YAAA,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC;;aACjC;YACL,IAAI,CAAC,2BAA2B,EAAE;;;IAI9B,2BAA2B,GAAA;QACjC,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,qBAAqB,EAAE;AAC/D,QAAA,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;AACzD,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,kBAAkB,CAAC,cAAc,EAAE;;QACxC,MAAM;;IAGF,mBAAmB,GAAA;AACzB,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAC3B,YAAA,IAAI;AACF,gBAAA,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE;;YAChC,MAAM;AACR,YAAA,IAAI;AACF,gBAAA,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE;;YACjC,MAAM;AACR,YAAA,IAAI,CAAC,kBAAkB,GAAG,SAAS;;;IAI/B,sBAAsB,GAAA;QAC5B,IAAI,CAAC,mBAAmB,EAAE;;IAGpB,oBAAoB,GAAA;AAC1B,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE;AAC7B,YAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK;YACjC,IAAI,CAAC,aAAa,EAAE;;;;IAKhB,YAAY,GAAA;QAClB,IAAI,CAAC,KAAK,GAAG;AACX,YAAA,iBAAiB,EAAE,IAAI,CAAC,CAAC,CACvB,mBAAmB,EACnB,IAAI,CAAC,YAAY,CAAC,iBAAiB,CACpC;AACD,YAAA,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC;AACvE,YAAA,cAAc,EAAE,IAAI,CAAC,CAAC,CACpB,gBAAgB,EAChB,IAAI,CAAC,YAAY,CAAC,cAAc,CACjC;AACD,YAAA,mBAAmB,EAAE,IAAI,CAAC,CAAC,CACzB,qBAAqB,EACrB,IAAI,CAAC,YAAY,CAAC,mBAAmB,CACtC;AACD,YAAA,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC;AACvE,YAAA,iBAAiB,EAAE,IAAI,CAAC,CAAC,CACvB,mBAAmB,EACnB,IAAI,CAAC,YAAY,CAAC,iBAAiB,CACpC;AACD,YAAA,eAAe,EAAE,IAAI,CAAC,CAAC,CACrB,iBAAiB,EACjB,IAAI,CAAC,YAAY,CAAC,eAAe,CAClC;SACF;;IAGH,CAAC,CAAC,GAAW,EAAE,QAAgB,EAAA;AAC7B,QAAA,MAAM,CAAC,GAAG,CAAA,mBAAA,EAAsB,GAAG,EAAE;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;AACpC,QAAA,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ;;IAGpC,YAAY,GAAA;AACV,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;AAChE,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;AAClC,YAAA,EAAE,EAAE,CAAA,aAAA,EAAgB,IAAI,CAAC,WAAW,CAAA,CAAE;YACtC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,oCAAoC,CAAC;AACpE,YAAA,OAAO,EAAE;AACP,gBAAA,SAAS,EAAE,6BAA6B;gBACxC,MAAM,EAAE,EAAE,GAAG,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;AACjD,aAAA;AACF,SAAA,CAAC;AAEF,QAAA,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,GAAsB,KAAK,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACzE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAsB,KAAI;AAC9C,YAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,gBAAA,IAAI,CAAC,aAAa,CAAC,UAAU,CAC3B,CAAA,oBAAA,EAAuB,IAAI,CAAC,WAAW,CAAA,CAAE,EACzC,GAAG,CACJ;;iBACI;AACL,gBAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;;AAE3B,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;AACvB,SAAC,CAAC;AACF,QAAA,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,MAAK;YACxB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;AACrC,SAAC,CAAC;;AAGI,IAAA,WAAW,CAAC,GAAsB,EAAA;AACxC,QAAA,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,GAAG,EAAE;AACxB,QAAA,IAAI,CAAC,cAAc,CAAC,QAAQ,EACzB,GAAG,CAAC,MAAM,EAAE,qBAAqB,IAAI,QAAQ,EAC/C;AACD,QAAA,IAAI,CAAC,aAAa,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,eAAe,IAAI,CAAC,IAAI,CAAC;QAC3D,MAAM,GAAG,GAAG,GAAG,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE;QAChC,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;;IAGpD,eAAe,GAAA;AACrB,QAAA,IAAI;AACF,YAAA,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAC9B,CAAA,oBAAA,EAAuB,IAAI,CAAC,WAAW,CAAA,CAAE,CAC1C;AACD,YAAA,OAAO,GAAG,GAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAuB,GAAG,IAAI;;AAC1D,QAAA,MAAM;AACN,YAAA,OAAO,IAAI;;;AAIP,IAAA,eAAe,CAAC,GAAsB,EAAA;AAC5C,QAAA,IAAI;AACF,YAAA,YAAY,CAAC,OAAO,CAClB,CAAA,oBAAA,EAAuB,IAAI,CAAC,WAAW,CAAA,CAAE,EACzC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CACpB;;QACD,MAAM;;AAGV,IAAA,UAAU,CAAC,GAAc,EAAA;QACvB,GAAG,CAAC,cAAc,EAAE;AACpB,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;;AAGxB,IAAA,WAAW,CAAC,IAAe,EAAA;AACzB,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK;;AAGzB,IAAA,MAAM,CAAC,GAAc,EAAA;QACnB,GAAG,CAAC,cAAc,EAAE;AACpB,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK;QACvB,IAAI,CAAC,oBAAoB,EAAE;QAC3B,IAAI,GAAG,CAAC,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE;AACnC,YAAA,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC;YAChD,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE;AACjC,gBAAA,IAAI,CAAC,YAAY,GAAG,KAAK;gBACzB,IAAI,CAAC,qBAAqB,EAAE;gBAC5B,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;;iBAC1C;AACL,gBAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;;;;AAK7B,IAAA,eAAe,CAAC,GAAU,EAAA;AACxB,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,MAA0B;AAC5C,QAAA,IAAI,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE;YACvB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;YACrC,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE;AACjC,gBAAA,IAAI,CAAC,YAAY,GAAG,KAAK;gBACzB,IAAI,CAAC,qBAAqB,EAAE;gBAC5B,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;;iBAC1C;AACL,gBAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;;AAEzB,YAAA,KAAK,CAAC,KAAK,GAAG,EAAE;;;IAIpB,aAAa,GAAA;AACX,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;YAC5B,IAAI,CAAC,mBAAmB,EAAE;AAC1B,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC;;;IAIvC,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE;QACtB,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;AAC/C,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE;QACtB,IAAI,CAAC,mBAAmB,EAAE;;;AAI5B,IAAA,iBAAiB,CAAC,IAAU,EAAA;AAC1B,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;QAC/D,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;QAC/C,IAAI,CAAC,qBAAqB,EAAE;;AAGtB,IAAA,WAAW,CAAC,KAAa,EAAA;QAC/B,IACE,CAAC,IAAI,CAAC,OAAO;AACb,aAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,EAC1D;YACA;;AAEF,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACb,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,CACxB,oBAAoB,EACpB,iCAAiC,CAClC;YACD;;AAEF,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE;;AAEtB,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;QAErB,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE;YAC9B;;AAEF,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,IAAI,CAAC,cAAc,GAAG,CAAC;AACvB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE;AACvB,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;QACzB,IAAI,CAAC,mBAAmB,EAAE;AAE1B,QAAA,IAAI,WAAgD;AACpD,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,gBAAgB,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;AAC5D,YAAA,IAAI;gBACF,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;;AAC7C,YAAA,MAAM;gBACN,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,EAAE;AAC/C,gBAAA,IAAI,CAAC,YAAY;AACf,oBAAA,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,iBAAiB,EAAE,sBAAsB,CAAC;AACtE,gBAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAmB,CAAC;AACpC,gBAAA,IAAI,CAAC,SAAS,GAAG,KAAK;gBACtB;;;QAIJ,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC;QAEtD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,IAAI,QAAQ;QAClD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE;YAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,IAAI,QAAQ;YACpD,MAAM,SAAS,GAAqB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;AACpD,gBAAA,IAAI,EAAE,CAAC;AACP,gBAAA,QAAQ,EAAE,WAAW;AACrB,gBAAA,cAAc,EAAE,MAAM;AACvB,aAAA,CAAC,CAAC;YACH,IAAI,CAAC,GAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE;gBAC5C,WAAW;AACX,gBAAA,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ;AAC3C,gBAAA,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU;aAC1C,CAAC,CAAC,SAAS,CAAC;AACX,gBAAA,IAAI,EAAE,CAAC,KAAK,KAAI;oBACd,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,QAAQ,EAAE;AACzC,wBAAA,MAAM,IAAI,GAAG,KAAK,CAAC,IAA0B;AAC7C,wBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;;wBAE5B,IAAI,CAAC,WAAW,GAAG,IAAI,EAAE,OAAO,IAAI,IAAI;wBACxC,IAAI,CAAC,SAAS,GAAG,IAAI,EAAE,KAAK,IAAI,IAAI;wBACpC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC;;yBAC3C;AACL,wBAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;;iBAE7B;gBACD,KAAK,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;AACtC,aAAA,CAAC;;aACG,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,MAAM,EAAE;AACxD,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;AACrB,YAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;;AAEjB,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;oBACtB,WAAW;AACX,oBAAA,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU;AAC1C,iBAAA,CAAC;gBACF;;AAEF,YAAA,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC;AAClD,gBAAA,IAAI,EAAE,CAAC,MAAM,KAAI;oBACf,IAAI,CAAC,OAAQ,CAAC,MAAM,CAClB,MAAM,EACN,IAAI,EACJ,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,IAAI,CAAC,CACnC,CAAC,SAAS,CAAC;AACV,wBAAA,IAAI,EAAE,CAAC,KAAK,KAAI;4BACd,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,QAAQ,EAAE;AACzC,gCAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;AACtB,oCAAA,EAAE,EAAE,EAAE;oCACN,QAAQ,EAAE,IAAI,CAAC,IAAI;oCACnB,WAAW,EAAE,IAAI,CAAC,IAAI;oCACtB,QAAQ,EAAE,IAAI,CAAC,IAAI;AACnB,oCAAA,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;AACpC,oCAAA,QAAQ,EAAE,EAAE;oCACZ,UAAU,EAAE,UAAU,CAAC,OAAO;AAC/B,iCAAA,CAAC;;iCACG;AACL,gCAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;;yBAE7B;AACD,wBAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACb,4BAAA,IAAI,QAAQ,KAAK,MAAM,EAAE;AACvB,gCAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;oCACtB,WAAW;AACX,oCAAA,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU;AAC1C,iCAAA,CAAC;;iCACG;AACL,gCAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;;yBAExB;AACF,qBAAA,CAAC;iBACH;AACD,gBAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACb,oBAAA,IAAI,QAAQ,KAAK,MAAM,EAAE;AACvB,wBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;4BACtB,WAAW;AACX,4BAAA,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU;AAC1C,yBAAA,CAAC;;yBACG;AACL,wBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;;iBAExB;AACF,aAAA,CAAC;;aACG;AACL,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;AACrB,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;gBACtB,WAAW;AACX,gBAAA,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU;AACzC,gBAAA,QAAQ,EAAE,WAAW;AACrB,gBAAA,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,IAAI,QAAQ;AACtD,aAAA,CAAC;;;IAIE,YAAY,CAAC,IAAU,EAAE,OAAsB,EAAA;AACrD,QAAA,IAAI,CAAC,GAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC;AACvD,YAAA,IAAI,EAAE,CAAC,KAAK,KAAI;gBACd,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,QAAQ,EAAE;AACzC,oBAAA,MAAM,IAAI,GAAG,KAAK,CAAC,IAAsB;oBACzC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;;qBAC7B;AACL,oBAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;;aAE7B;YACD,KAAK,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;AACtC,SAAA,CAAC;;AAGI,IAAA,gBAAgB,CACtB,UAAoC,EAAA;AAEpC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,OAAO;AAC/C,QAAA,MAAM,kBAAkB,GACtB,IAAI,CAAC,cAAc,CAAC,KAAK;AACzB,YAAA,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,qBAAqB;AAC1C,YAAA,SAAS,EAAE,kBAAkB;AAC7B,YAAA,QAAQ;QAEV,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI,EAAE;;AAG3C,QAAA,MAAM,eAAe,GACnB,OAAO,MAAM,CAAC,eAAe,KAAK;cAC9B,MAAM,CAAC;AACT,cAAE,OAAO,SAAS,EAAE,eAAe,KAAK;kBACpC,SAAS,EAAE;kBACX,EAAE;AAEV,QAAA,MAAM,OAAO,GAAQ,EAAE,kBAAkB,EAAE;QAE3C,IAAI,OAAO,eAAe,KAAK,QAAQ,IAAI,eAAe,GAAG,CAAC,EAAE;AAC9D,YAAA,OAAO,CAAC,eAAe,GAAG,eAAe;;;AAG3C,QAAA,IAAI,OAAO,MAAM,CAAC,gBAAgB,KAAK,SAAS,EAAE;AAChD,YAAA,OAAO,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB;;AAC7C,aAAA,IAAI,OAAO,SAAS,EAAE,gBAAgB,KAAK,SAAS,EAAE;AAC3D,YAAA,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,gBAAgB;;;AAIvD,QAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,iBAAiB,EAAE;cACxC,QAAQ,CAAC;cACT,SAAS,EAAE,iBAAiB,IAAI,SAAS,CAAC,iBAAiB,CAAC;kBAC1D,SAAS,CAAC;kBACV,SAAS;AACf,QAAA,IAAI,OAAO;AAAE,YAAA,OAAO,CAAC,iBAAiB,GAAG,OAAO;AAEhD,QAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,eAAe,EAAE;cACpC,QAAQ,CAAC;cACT,SAAS,EAAE,eAAe,IAAI,SAAS,CAAC,eAAe,CAAC;kBACtD,SAAS,CAAC;kBACV,SAAS;AACf,QAAA,IAAI,KAAK;AAAE,YAAA,OAAO,CAAC,eAAe,GAAG,KAAK;QAE1C,MAAM,SAAS,GAAG,QAAQ,CAAC,eAAe,IAAI,SAAS,EAAE,eAAe;AACxE,QAAA,IAAI,SAAS;AAAE,YAAA,OAAO,CAAC,eAAe,GAAG,SAAS;AAElD,QAAA,IAAI,OAAO,QAAQ,CAAC,mBAAmB,KAAK,SAAS,EAAE;AACrD,YAAA,OAAO,CAAC,mBAAmB,GAAG,QAAQ,CAAC,mBAAmB;;AACrD,aAAA,IAAI,OAAO,SAAS,EAAE,mBAAmB,KAAK,SAAS,EAAE;AAC9D,YAAA,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,mBAAmB;;;AAI7D,QAAA,IAAI,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;YAChD,MAAM,MAAM,GAA2B,EAAE;AACzC,YAAA,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;AAC/C,gBAAA,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;oBAAE,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAQ,CAAC;;AAEjE,YAAA,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM;AAAE,gBAAA,OAAO,CAAC,cAAc,GAAG,MAAM;;AAGjE,QAAA,IAAI;AACF,YAAA,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;;AAC9B,QAAA,MAAM;AACN,YAAA,OAAO,SAAS;;;AAIZ,IAAA,cAAc,CAAC,KAAyB,EAAA;AAC9C,QAAA,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9D,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,IAAI,GAAG,CAAC;;;AAIhE,IAAA,WAAW,CAAC,GAAY,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;AAC5B,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;gBACjD,QAAQ,EAAE,CAAC,CAAC,IAAI;AAChB,gBAAA,OAAO,EAAE,KAAK;AACf,aAAA,CAAC,CAAC;AACH,YAAA,IAAI,CAAC,YAAY,GAAG,EAAE;;QAExB,IAAI,GAAG,YAAY,iBAAiB,IAAI,GAAG,CAAC,KAAK,EAAE;AACjD,YAAA,MAAM,MAAM,GACV,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,KAAsB,EAAE,GAAG,CAAC,OAAO,CAAC;gBACxD,GAAG,CAAC,KAAa;AACpB,YAAA,IAAI,CAAC,YAAY;AACf,gBAAA,MAAM,CAAC,OAAO;AACd,oBAAA,IAAI,CAAC,CAAC,CAAC,oBAAoB,EAAE,2BAA2B,CAAC;AAC3D,YAAA,IAAI,MAAM,CAAC,SAAS,EAAE;AACpB,gBAAA,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS;gBACjC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;;AAEzC,YAAA,MAAM,IAAI,GAAG,MAAM,CAAE,GAAG,CAAC,KAAuB,CAAC,IAAI,IAAI,EAAE,CAAC;YAC5D,IAAI,IAAI,KAAK,gBAAgB,IAAI,IAAI,KAAK,eAAe,EAAE;AACzD,gBAAA,IAAI,CAAC,aAAa,GAAG,IAAI;;YAE3B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAsB,CAAC;;aACtC;YACL,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,CACxB,oBAAoB,EACpB,2BAA2B,CAC5B;AACD,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAoB,CAAC;;;AAIjC,IAAA,YAAY,CAClB,OAAgB,EAChB,IAAmB,EACnB,OAAgC,EAAA;AAEhC,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,QAAA,IAAI,CAAC,cAAc,GAAG,GAAG;QACzB,IAAI,OAAO,EAAE;YACX,IAAI,IAAI,EAAE;AACR,gBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;gBACnE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;;gBAEvC,IAAI,CAAC,WAAW,GAAG;AACjB,oBAAA;wBACE,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,MAAM,EAAE,sBAAsB,CAAC,OAAO;AACtC,wBAAA,IAAI,EAAE,IAAI;AACX,qBAAA;iBACF;AACD,gBAAA,IAAI,CAAC,SAAS,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;;YAExD,IAAI,OAAO,EAAE;;AAEX,gBAAA,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE;oBACvB,IAAI,CAAC,CAAC,MAAM,KAAK,sBAAsB,CAAC,OAAO,EAAE;AAC/C,wBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;yBAC3D;AACL,wBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;;;;AAIrE,gBAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;oBACnB,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAC9B,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,sBAAsB,CAAC,OAAO,CACnD,CAAC,MAAM;AACR,oBAAA,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS;AACzC,oBAAA,IAAI,CAAC,SAAS,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE;;AAE/D,gBAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AACrB,oBAAA,IAAI,CAAC,WAAW,GAAG,OAAO;;;;aAGzB;AACL,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;gBACjD,QAAQ,EAAE,CAAC,CAAC,IAAI;AAChB,gBAAA,OAAO,EAAE,KAAK;AACf,aAAA,CAAC,CAAC;;AAEL,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE;QACtB,IAAI,CAAC,mBAAmB,EAAE;AAC1B,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;;;AAIzB,IAAA,IAAI,cAAc,GAAA;QAChB,IAAI,CAAC,IAAI,CAAC,WAAW;AAAE,YAAA,OAAO,EAAE;AAChC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,IAAI,CAAC;AACrD,QAAA,IAAI,IAAI,CAAC,cAAc,IAAI,GAAG,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,WAAW;QAC5D,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;;;AAI/B,IAAA,0BAA0B,CAAC,IAAU,EAAA;QAC3C,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,MAAM,EAAE,sBAAsB,CAAC,MAAM;AACrC,YAAA,IAAI,EAAE;AACJ,gBAAA,EAAE,EAAE,EAAE;gBACN,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,WAAW,EAAE,IAAI,CAAC,IAAI;gBACtB,QAAQ,EAAE,IAAI,CAAC,IAAI;AACnB,gBAAA,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;AACpC,gBAAA,QAAQ,EAAE,EAAE;gBACZ,UAAU,EAAE,UAAU,CAAC,OAAO;AAC9B,gBAAA,QAAQ,EAAE;AACX;SACF;;AAGH,IAAA,OAAO,CAAC,IAAiC,EAAA;QACvC,MAAM,QAAQ,GAAG,UAAU,IAAI,IAAI,IAAI,QAAQ,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,0BAA0B,CAAC,IAAY,CAAC;AAC9G,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;;AAE3B,IAAA,UAAU,CAAC,IAAiC,EAAA;QAC1C,MAAM,QAAQ,GAAG,UAAU,IAAI,IAAI,IAAI,QAAQ,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,0BAA0B,CAAC,IAAY,CAAC;AAC9G,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;;AAE9B,IAAA,UAAU,CAAC,IAAiC,EAAA;QAC1C,MAAM,QAAQ,GAAG,UAAU,IAAI,IAAI,IAAI,QAAQ,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,0BAA0B,CAAC,IAAY,CAAC;AAC9G,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;;AAE9B,IAAA,YAAY,CAAC,IAA0B,EAAA;QACrC,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;QAC1C,IAAI,GAAG,IAAI,CAAC;YACV,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC;;AAEjE,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC;AAC5D,YAAA,IAAI,IAAI,CAAC,MAAM,KAAK,sBAAsB,CAAC,OAAO;AAChD,gBAAA,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,CAAC,CAAC;AACtE,YAAA,IAAI,IAAI,CAAC,MAAM,KAAK,sBAAsB,CAAC,MAAM;AAC/C,gBAAA,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;;;AAGpE,IAAA,gBAAgB,CAAC,IAA0B,EAAA;;;;AAIzC,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;;IAE/B,eAAe,CAAC,EAAS,EAAE,IAA0B,EAAA;AACnD,QAAA,MAAM,MAAM,GAAI,EAAE,CAAC,MAA6B,EAAE,IAAI;AACtD,QAAA,IAAI,MAAM;AAAE,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;;AACpC,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;;AAG5B,IAAA,aAAa,CAAC,KAAa,EAAA;QACjC,MAAM,UAAU,GAAkB,EAAE;QACpC,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;AACnC,YAAA,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;;QAEzD,IAAI,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE;AACzC,YAAA,UAAU,CAAC,IAAI,CACb,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAC1D;;QAEH,IAAI,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE;AACxC,YAAA,UAAU,CAAC,IAAI,CACb,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAC7D;;QAEH,IAAI,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE;AACzC,YAAA,UAAU,CAAC,IAAI,CACb,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAC1D;;AAEH,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;AACtB,YAAA,OAAO,IAAI;;QAGb,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC;AAClD,QAAA,IAAI,OAAO,CAAC,OAAO,EAAE;AACnB,YAAA,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE;YACnC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,EAAE;AAC/C,YAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE;AACpB,gBAAA,IAAI,CAAC,YAAY;oBACf,GAAG,CAAC,QAAQ,CAAC;AACb,wBAAA,IAAI,CAAC,CAAC,CAAC,aAAa,EAAE,gCAAgC,CAAC;;AACpD,iBAAA,IAAI,MAAM,CAAC,aAAa,CAAC,EAAE;AAChC,gBAAA,IAAI,CAAC,YAAY;oBACf,GAAG,CAAC,aAAa,CAAC;AAClB,wBAAA,IAAI,CAAC,CAAC,CAAC,kBAAkB,EAAE,kCAAkC,CAAC;;AAC3D,iBAAA,IAAI,MAAM,CAAC,iBAAiB,CAAC,EAAE;AACpC,gBAAA,IAAI,CAAC,YAAY;oBACf,GAAG,CAAC,iBAAiB,CAAC;AACtB,wBAAA,IAAI,CAAC,CAAC,CAAC,sBAAsB,EAAE,kCAAkC,CAAC;;AAC/D,iBAAA,IAAI,MAAM,CAAC,aAAa,CAAC,EAAE;AAChC,gBAAA,IAAI,CAAC,YAAY;oBACf,GAAG,CAAC,aAAa,CAAC;AAClB,wBAAA,IAAI,CAAC,CAAC,CAAC,kBAAkB,EAAE,sCAAsC,CAAC;;AAEtE,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAa,CAAC;AAC9B,YAAA,OAAO,KAAK;;AAEd,QAAA,OAAO,IAAI;;;AAIb,IAAA,IAAI,eAAe,GAAA;QACjB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE;AACnC,cAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI;AACjC,cAAE,IAAI,CAAC,YAAY,IAAI,UAAU;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE;AACnC,cAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB;cACpD,GAAG;QACP,MAAM,QAAQ,GACZ,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC,aAAa,GAAG,EAAE,GAAG,CAAC,CAAC;AACvE,QAAA,OAAO,UAAU,GAAG,CAAA,qBAAA,EAAwB,OAAO,CAAA,SAAA,EAAY,QAAQ,EAAE;;AAz+BhE,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAF,IAAA,CAAA,oBAAA,EAAA,EAAA,EAAA,KAAA,EAAAG,oBAAA,EAAA,EAAA,EAAA,KAAA,EAsFlB,kBAAkB,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,OAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,wBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,KAAA,EAON,cAAc,6BACd,cAAc,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AA9FzB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,WAAA,EAAA,aAAA,EAAA,OAAA,EAAA,SAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,OAAA,EAAA,WAAA,EAAA,aAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,aAAA,EAAA,eAAA,EAAA,aAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,oBAAA,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,EAAA,EAAA,YAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,MAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,qBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAhalB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8ZT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,slOAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAzaC,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,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,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,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,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,EAAA,GAAA,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,WAAA,EAAA,IAAA,EACb,mBAAmB,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,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,aAAa,mwBACb,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,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,EAAA,EAAA,CAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAoaP,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBA/a7B,SAAS;+BACE,qBAAqB,EAAA,UAAA,EACnB,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,mBAAmB;wBACnB,eAAe;wBACf,aAAa;wBACb,mBAAmB;wBACnB,oBAAoB;wBACpB,aAAa;wBACb,gBAAgB;qBACjB,EAAA,eAAA,EAEgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8ZT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,slOAAA,CAAA,EAAA;;0BAwFE,MAAM;2BAAC,kBAAkB;;0BAIzB;;0BACA;;0BACA;;0BACA;;0BAAY,MAAM;2BAAC,cAAc;;0BACjC;;0BAAY,MAAM;2BAAC,cAAc;yCA7F3B,MAAM,EAAA,CAAA;sBAAd;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBACQ,OAAO,EAAA,CAAA;sBAAf;gBACQ,WAAW,EAAA,CAAA;sBAAnB;gBAES,aAAa,EAAA,CAAA;sBAAtB;gBACS,YAAY,EAAA,CAAA;sBAArB;gBACS,KAAK,EAAA,CAAA;sBAAd;gBACS,WAAW,EAAA,CAAA;sBAApB;gBAES,KAAK,EAAA,CAAA;sBAAd;gBACS,QAAQ,EAAA,CAAA;sBAAjB;gBACS,QAAQ,EAAA,CAAA;sBAAjB;gBACS,aAAa,EAAA,CAAA;sBAAtB;gBACS,aAAa,EAAA,CAAA;sBAAtB;gBACS,kBAAkB,EAAA,CAAA;sBAA3B;gBACS,eAAe,EAAA,CAAA;sBAAxB;gBAE+B,SAAS,EAAA,CAAA;sBAAxC,SAAS;uBAAC,WAAW;gBAEd,OAAO,EAAA,CAAA;sBADd,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;gBAEQ,WAAW,EAAA,CAAA;sBAArD,SAAS;uBAAC,sBAAsB;gBAGzB,mBAAmB,EAAA,CAAA;sBAD1B,SAAS;uBAAC,qBAAqB;;;ACpX5B,MAAO,4BAA6B,SAAQ,wBAAwB,CAAA;IAC/D,MAAM,GAA6B,IAAI;IACvC,SAAS,GAAsB,UAAU;AACzC,IAAA,OAAO;IAChB,WAAW,GAAkB,IAAI;AAEF,IAAA,QAAQ;;IAGhC,YAAY,GAAW,EAAE;;IAGzB,eAAe,GAAA;AACpB,QAAA,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE;;IAGzB,gBAAgB,GAAA;AACrB,QAAA,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE;;;AAI1B,IAAA,kBAAkB,CAAC,KAAa,EAAA;AACrC,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;AACzB,QAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;YACpB,IAAI,CAAC,OAAO,EAAE,CAAC,aAAa,EAAE,CAAC;;;;IAKnC,YAAY,GAAkB,IAAI;IAClC,UAAU,GAAG,CAAC;IACP,iBAAiB,GAAG,KAAK;AAEf,IAAA,MAAM,GAAG,MAAM,CAAC,kBAAkB,CAAC;AACnC,IAAA,SAAS,GAAG,MAAM,CAAuB,cAAc,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,IAAI;AAErG,IAAA,IAAI,eAAe,GAAA;AACjB,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;AACxB,QAAA,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO;;IAG/B,CAAC,CAAC,GAAW,EAAE,QAAgB,EAAA;AAC7B,QAAA,MAAM,CAAC,GAAG,CAAA,mBAAA,EAAsB,GAAG,EAAE;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;AACpC,QAAA,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ;;AAGpC,IAAA,eAAe,CAAC,KAA6B,EAAA;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,KAAK,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,IAAI;AAClE,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QACpB,IAAI,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC;AAC9B,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;;QAEvB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI;AAC/C,QAAA,IAAI,CAAC,UAAU,GAAG,CAAC;;AAGrB,IAAA,cAAc,CAAC,IAAwB,EAAA;;QAErC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;AACpE,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK;QACvB,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAM,KAAK,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ;QAClF,IAAI,OAAO,EAAE;AACX,YAAA,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC;;;;AAKvC,IAAA,aAAa,CAAC,KAAc,EAAA;AAC1B,QAAA,IAAI,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC1C,QAAA,IAAI,CAAC,OAAO,EAAE,CAAC,aAAa,EAAE;AAC9B,QAAA,IAAI,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE;QAE5B,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAK,KAAa,EAAE;AAClE,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAsB,CAAC,CAAC,OAAO;;aAC7D,IAAI,KAAK,IAAI,OAAQ,KAAa,CAAC,OAAO,KAAK,QAAQ,EAAE;AAC9D,YAAA,IAAI,CAAC,WAAW,GAAI,KAAa,CAAC,OAAO;;aACpC;YACL,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,CACvB,oBAAoB,EACpB,2BAA2B,CAC5B;;;IAIL,eAAe,GAAA;AACb,QAAA,IAAI;YACF,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,WAAW,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;;AAClF,QAAA,MAAM;AAAE,YAAA,OAAO,KAAK;;;AAGjB,IAAA,iBAAiB,CAAC,QAAiB,EAAA;AACxC,QAAA,IAAI,CAAC,iBAAiB,GAAG,QAAQ;;IAGnC,aAAa,GAAA;QACX,IAAI,IAAI,CAAC,eAAe,EAAE;YAAE;AAC5B,QAAA,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE;;;AAIhC,IAAA,UAAU;AACV,IAAA,UAAU;IAEV,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,QAAA,IAAI,CAAC,UAAU,GAAG,CAAC;AACnB,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAW,CAAC;AAC1B,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;YACxB,CAAC,CAAC,cAAc,EAAE;YAClB,CAAC,CAAC,eAAe,EAAE;AACnB,YAAA,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC;;QACjB,MAAM;;AAGV,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,MAAO,CAAC,EAAG,CAAC,MAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG;QACrF,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,gBAAgB;QAClD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAA,EAAG,CAAC,IAAI,GAAC,IAAI,GAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG;QAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,IAAI,CAAC;AACtD,QAAA,OAAO,UAAU,CAAC,CAAA,gBAAA,EAAmB,KAAK,CAAA,cAAA,EAAiB,IAAI,EAAE;;IAG5D,mBAAmB,CAAC,IAAU,EAAE,KAAiB,EAAA;AACtD,QAAA,KAAK,CAAC,eAAe,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,IAAI,CAAC;;AAGjC,IAAA,WAAW,CAAC,KAAa,EAAA;QAC9B,IAAI,KAAK,KAAK,CAAC;AAAE,YAAA,OAAO,SAAS;QACjC,MAAM,CAAC,GAAG,IAAI;AACd,QAAA,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;QAC/C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACnD,OAAO,UAAU,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC;;uGAvI9D,4BAA4B,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA5B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,uBAAA,EAAA,sBAAA,EAAA,kBAAA,EAAA,sBAAA,EAAA,kBAAA,EAAA,wBAAA,EAAA,eAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,UAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA9I7B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkGT,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,yiFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAnGS,YAAY,gQAAE,iBAAiB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,SAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,cAAA,EAAA,OAAA,EAAA,aAAA,EAAA,OAAA,EAAA,UAAA,EAAA,UAAA,EAAA,eAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,GAAA,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,aAAa,81BAAE,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,GAAA,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;;2FA+I9E,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAlJxC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,2BAA2B,EAAA,UAAA,EACzB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,aAAa,EAAE,gBAAgB,CAAC,EAAA,QAAA,EAChF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkGT,EAAA,IAAA,EAqCK;AACJ,wBAAA,SAAS,EAAE,uBAAuB;AAClC,wBAAA,wBAAwB,EAAE,gBAAgB;AAC1C,wBAAA,wBAAwB,EAAE,kBAAkB;AAC5C,wBAAA,0BAA0B,EAAE,eAAe;AAC5C,qBAAA,EAAA,MAAA,EAAA,CAAA,yiFAAA,CAAA,EAAA;8BAGQ,MAAM,EAAA,CAAA;sBAAd;gBACQ,SAAS,EAAA,CAAA;sBAAjB;gBACQ,OAAO,EAAA,CAAA;sBAAf;gBAG8B,QAAQ,EAAA,CAAA;sBAAtC,SAAS;uBAAC,UAAU;;;ACrKhB,MAAM,kBAAkB,GAAG;AAChC,IAAA,sCAAsC,EAAE,qBAAqB;AAC7D,IAAA,kCAAkC,EAAE,qBAAqB;AACzD,IAAA,mCAAmC,EAAE,YAAY;AACjD,IAAA,wCAAwC,EAAE,sBAAsB;AAChE,IAAA,kCAAkC,EAAE,kBAAkB;AACtD,IAAA,sCAAsC,EAAE,qBAAqB;AAC7D,IAAA,oCAAoC,EAClC,oDAAoD;AACtD,IAAA,kCAAkC,EAAE,oCAAoC;AACxE,IAAA,kCAAkC,EAAE,SAAS;AAC7C,IAAA,gCAAgC,EAAE,MAAM;AACxC,IAAA,oCAAoC,EAAE,sBAAsB;AAC5D,IAAA,uCAAuC,EAAE,2BAA2B;AACpE,IAAA,gCAAgC,EAAE,gCAAgC;AAClE,IAAA,qCAAqC,EAAE,kCAAkC;AACzE,IAAA,yCAAyC,EAAE,kCAAkC;AAC7E,IAAA,qCAAqC,EAAE,sCAAsC;AAC7E,IAAA,6CAA6C,EAAE,2BAA2B;AAC1E,IAAA,0CAA0C,EAAE,uBAAuB;AACnE,IAAA,qCAAqC,EAAE,yBAAyB;AAChE,IAAA,wCAAwC,EAAE,4BAA4B;AACtE,IAAA,+CAA+C,EAC7C,iCAAiC;AACnC,IAAA,0CAA0C,EAAE,2BAA2B;AACvE,IAAA,0CAA0C,EAAE,gBAAgB;AAC5D,IAAA,8CAA8C,EAAE,6BAA6B;AAC7E,IAAA,iDAAiD,EAC/C,+BAA+B;AACjC,IAAA,8CAA8C,EAAE,2BAA2B;AAC3E,IAAA,8CAA8C,EAC5C,mCAAmC;AACrC,IAAA,yCAAyC,EAAE,qBAAqB;AAChE,IAAA,2CAA2C,EACzC,mCAAmC;AACrC,IAAA,6CAA6C,EAAE,wBAAwB;AACvE,IAAA,4CAA4C,EAAE,uBAAuB;AACrE,IAAA,0CAA0C,EAAE,iCAAiC;;AAE7E,IAAA,gDAAgD,EAAE,uBAAuB;AACzE,IAAA,iDAAiD,EAAE,2BAA2B;AAC9E,IAAA,oDAAoD,EAAE,8BAA8B;AACpF,IAAA,qDAAqD,EAAE,4BAA4B;AACnF,IAAA,iDAAiD,EAAE,0BAA0B;AAC7E,IAAA,8CAA8C,EAAE,qBAAqB;AACrE,IAAA,0CAA0C,EAAE,0BAA0B;AACtE,IAAA,wCAAwC,EAAE,2BAA2B;AACrE,IAAA,gDAAgD,EAAE,0BAA0B;AAC5E,IAAA,yCAAyC,EAAE,gBAAgB;AAC3D,IAAA,6CAA6C,EAAE,oBAAoB;;AAEnE,IAAA,gDAAgD,EAAE,0BAA0B;AAC5E,IAAA,0CAA0C,EAAE,8BAA8B;AAC1E,IAAA,uCAAuC,EAAE,oBAAoB;AAC7D,IAAA,0CAA0C,EAAE,2BAA2B;AACvE,IAAA,gDAAgD,EAAE,sBAAsB;AACxE,IAAA,0CAA0C,EAAE,2BAA2B;AACvE,IAAA,+CAA+C,EAAE,mCAAmC;AACpF,IAAA,iDAAiD,EAAE,2BAA2B;AAC9E,IAAA,0CAA0C,EAAE,gCAAgC;AAC5E,IAAA,yCAAyC,EAAE,oBAAoB;;;ACxDjE;AACO,MAAM,sCAAsC,GAAqB;AACtE,IAAA,EAAE,EAAE,qBAAqB;AACzB,IAAA,QAAQ,EAAE,qBAAqB;AAC/B,IAAA,SAAS,EAAE,iBAAiB;AAC5B,IAAA,YAAY,EAAE,qBAAqB;AACnC,IAAA,WAAW,EAAE,4EAA4E;AACzF,IAAA,IAAI,EAAE,aAAa;AACnB,IAAA,MAAM,EAAE;QACN,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,0BAA0B,EAAE,WAAW,EAAE,kEAAkE,EAAE;AACrI,QAAA,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,4DAA4D,EAAE;QACtI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6BAA6B,EAAE;AAC/E,QAAA,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,gCAAgC,EAAE;AACpH,KAAA;AACD,IAAA,OAAO,EAAE;QACP,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,wBAAwB,EAAE,WAAW,EAAE,qCAAqC,EAAE;QAC7G,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,oBAAoB,EAAE,WAAW,EAAE,qCAAqC,EAAE;QACxG,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,WAAW,EAAE,iBAAiB,EAAE;QACxE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,eAAe,EAAE,WAAW,EAAE,wBAAwB,EAAE;QACrF,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,sBAAsB,EAAE,WAAW,EAAE,yBAAyB,EAAE;QACvF,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,sBAAsB,EAAE,WAAW,EAAE,4BAA4B,EAAE;QAC7F,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,sBAAsB,EAAE,WAAW,EAAE,qBAAqB,EAAE;QACtF,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,sBAAsB,EAAE,WAAW,EAAE,0BAA0B,EAAE;QAChG,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,sBAAsB,EAAE,WAAW,EAAE,2BAA2B,EAAE;QACjG,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,wCAAwC,EAAE;QACrG,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,qDAAqD,EAAE;AACjH,KAAA;IACD,IAAI,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAE,QAAQ,CAAC;AACjE,IAAA,GAAG,EAAE,wBAAwB;;AAG/B;SACgB,gCAAgC,GAAA;IAC9C,OAAO;AACL,QAAA,OAAO,EAAE,uBAAuB;AAChC,QAAA,KAAK,EAAE,IAAI;AACX,QAAA,UAAU,EAAE,CAAC,QAAmC,KAAK,MAAK;AACxD,YAAA,QAAQ,CAAC,QAAQ,CAAC,sCAAsC,CAAC;SAC1D;QACD,IAAI,EAAE,CAAC,yBAAyB,CAAC;KACtB;AACf;;AC7CA;;ACAA;;AAEG;;;;"}