{"version":3,"file":"sdcorejs-angular-components-upload-file.mjs","sources":["../../../projects/sdcorejs-angular/components/upload-file/src/configurations/upload-file.configuration.ts","../../../projects/sdcorejs-angular/components/upload-file/src/components/preview/preview.component.ts","../../../projects/sdcorejs-angular/components/upload-file/src/components/preview/preview.component.html","../../../projects/sdcorejs-angular/components/upload-file/src/pipes/image.pipe.ts","../../../projects/sdcorejs-angular/components/upload-file/src/pipes/document.pipe.ts","../../../projects/sdcorejs-angular/components/upload-file/src/services/upload-file.model.ts","../../../projects/sdcorejs-angular/components/upload-file/src/services/upload-file.service.ts","../../../projects/sdcorejs-angular/components/upload-file/src/upload-file.component.ts","../../../projects/sdcorejs-angular/components/upload-file/src/upload-file.component.html","../../../projects/sdcorejs-angular/components/upload-file/sdcorejs-angular-components-upload-file.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\n/**\n * Contract cấu hình cho cơ chế upload file của sd-angular.\n *\n * Cách dùng phổ biến:\n * - Portal có thể provide cấu hình mặc định ở tầng global.\n * - Mỗi module có thể provide thêm cấu hình riêng (thường với `multi: true`).\n * - Khi có nhiều cấu hình cùng lúc, dùng `key` để chọn đúng provider.\n *\n * Luồng xử lý:\n * 1) `upload`: upload file mới, trả về danh sách id/key.\n * 2) `details`: lấy metadata để render danh sách file từ id/key.\n * 3) `download` (optional): tải file theo id/key.\n */\n\nexport interface ISdUploadFileConfiguration<TArgs = any> {\n  /**\n   * Định danh cấu hình upload.\n   * Bắt buộc khi app có nhiều provider upload để tránh mapping nhầm.\n   */\n  key?: string;\n\n  /** Upload file và trả về danh sách id/key dùng cho lưu trữ. */\n  upload: SdUploadFileFuncUpload<TArgs>;\n\n  /** Nhận danh sách id/key và trả về dữ liệu hiển thị file trong UI. */\n  details: SdUploadFileFuncDetails<TArgs>;\n\n  /** Tùy chọn: tải file về theo id/key. */\n  download?: SdUploadFileFuncDownload<TArgs>;\n}\n\n/**\n * Token DI cho upload configuration.\n * Khuyến nghị provide dạng `multi: true` để hỗ trợ nhiều nguồn upload trong cùng app/module.\n */\nexport const SD_UPLOAD_FILE_CONFIGURATION = new InjectionToken<ISdUploadFileConfiguration>('sd.upload-file.configuration');\n\n/** Hàm upload file và trả về danh sách id/key tương ứng. */\nexport type SdUploadFileFuncUpload<TArgs> = (files: File[], args?: TArgs) => Promise<string[]>;\n\n/** Hàm lấy thông tin file phục vụ hiển thị từ danh sách id/key. */\nexport type SdUploadFileFuncDetails<TArgs> = (idOrKey: (string | number)[], args?: TArgs) => Promise<SdUploadFileDetail[]>;\n\n/** Hàm tải file theo id/key. */\nexport type SdUploadFileFuncDownload<TArgs> = (idOrKey: string | number, args?: TArgs) => Promise<void>;\n\nexport interface SdUploadFileDetail {\n  /** Định danh file được backend trả về sau upload. */\n  idOrKey: string;\n\n  /** URL truy cập file (CDN hoặc direct URL). */\n  cdn: string;\n\n  /** Tên hiển thị file. */\n  name?: string;\n\n  /** Đuôi file: png, jpg, pdf... */\n  extension?: string;\n\n  /** Dung lượng file tính theo MB (nếu backend có trả về). */\n  size?: number;\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, ViewChild, inject, output } from '@angular/core';\nimport { SdButton } from '@sdcorejs/angular/components/button';\nimport { SdModal } from '@sdcorejs/angular/components/modal';\nimport { PreviewFile } from '../../services';\nimport { MatIcon } from '@angular/material/icon';\nimport { I18nService, TranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n  selector: 'preview',\n  templateUrl: './preview.component.html',\n  styleUrl: './preview.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [SdIcon, SdModal, SdButton, CommonModule, MatIcon, TranslatePipe],\n})\nexport class PreviewComponent {\n  private cd = inject(ChangeDetectorRef);\n\n  @ViewChild(SdModal) modal!: SdModal;\n  readonly download = output<PreviewFile>();\n  readonly close = output<void>();\n\n  readonly #i18n = inject(I18nService);\n  title: string = this.#i18n.t('core.component.upload-file.preview-title');\n  thumbnailPosition: 'right' | 'left' | 'bottom' | 'top' = 'right';\n  activeIndex = 0;\n  previewFiles: PreviewFile[] = [];\n\n  /** Inserted by Angular inject() migration for backwards compatibility */\n  constructor(...args: unknown[]);\n  constructor() {}\n\n  // Nên sử dụng urlOrFiles ở tham số khi open thay vì dùng @Input để component sử dụng sẽ chỉ cần map ở hàm khi gọi open thay vì phải mất công map mọi lúc để binding vào @Input\n  open = async (previewFiles: PreviewFile[] | undefined | null, index?: number) => {\n    if (!Array.isArray(previewFiles) || previewFiles.length === 0) {\n      return;\n    }\n    this.previewFiles = previewFiles;\n    this.activeIndex = index || 0;\n    this.modal?.open();\n    this.cd.markForCheck();\n  };\n\n  onClickThumbnailImage = (index: number) => {\n    this.activeIndex = index;\n    this.cd.markForCheck();\n  };\n\n  updateCurrentImage = (direction: 1 | -1) => {\n    this.activeIndex = (this.activeIndex + direction + this.previewFiles.length) % this.previewFiles.length;\n    this.#scrollView(this.activeIndex, direction === 1 ? 'start' : 'end');\n    this.cd.markForCheck();\n  };\n\n  onClose = () => {\n    this.close.emit();\n  };\n\n  #scrollView = (index: number, type?: 'center' | 'end' | 'nearest' | 'start') => {\n    const nameId: string = 'thumbnailImage' + index;\n    const element = document.getElementById(nameId);\n    if (!element) {\n      return;\n    }\n    const blockType: ScrollLogicalPosition = type || 'start';\n    element.scrollIntoView({ behavior: 'smooth', block: blockType });\n  };\n\n  onDownload = (previewFile: PreviewFile) => {\n    this.download.emit(previewFile);\n    this.cd.markForCheck();\n  };\n}\n","<sd-modal [title]=\"title\" (sdClosed)=\"close.emit()\" #modal>\n  <div class=\"p-16\" style=\"overflow: hidden; height: 100%\">\n    <div style=\"gap: 8px\" class=\"image-gallery\">\n      <div class=\"thumbnail-container\">\n        @for (file of previewFiles; track $index; let i = $index) {\n          <button\n            type=\"button\"\n            class=\"thumbnail-wrapper\"\n            [class.c-image-error]=\"file.isImgError\"\n            (click)=\"onClickThumbnailImage(i)\"\n            [ngStyle]=\"{\n              border: activeIndex === i ? '2px solid var(--sd-primary, #005cbb)' : 'none'\n            }\">\n            @if(file.isImgError) {\n              <img fill alt=\"thumbnail\" class=\"thumbnail-img sd-image-image-error\" style=\"width: 24px; height: 24px; justify-self: center;\" />\n            } @else if (file.isPreviewImage && (file.previewSrc || file.src)) {\n              <img fill [src]=\"file.previewSrc || file.src\" alt=\"thumbnail\" class=\"thumbnail-img\" />\n            } @else {\n              <img\n                class=\"thumbnail-img file\"\n                [class]=\"{\n                  png: file.extension === 'png',\n                  jpg: file.extension === 'jpg',\n                  pdf: file.extension === 'pdf',\n                  doc: file.extension === 'doc',\n                  docx: file.extension === 'docx',\n                  xls: file.extension === 'xls',\n                  xlsx: file.extension === 'xlsx',\n                  ppt: file.extension === 'ppt',\n                  pptx: file.extension === 'pptx',\n                  csv: file.extension === 'csv',\n                  psd: file.extension === 'psd',\n                  xml: file.extension === 'xml',\n                  zip: file.extension === 'zip'\n                }\"\n                alt=\"thumbnail\" />\n            }\n          </button>\n        }\n      </div>\n      <div class=\"main-image-container\" #mainImage>\n        @let selectedFile = previewFiles[activeIndex];\n        @if(selectedFile) {\n          @if(selectedFile.isImgError) {\n            <div class=\"c-image-error\">\n              <sd-icon name=\"warning_amber\"></sd-icon>\n              <div class=\"T14R\">{{ 'core.component.upload-file.error-occurred' | translate }}</div>\n            </div>\n          } @else if (selectedFile.isPreviewImage && (selectedFile.previewSrc || selectedFile.src)) {\n            <img fill priority [src]=\"selectedFile.previewSrc || selectedFile.src\" class=\"main-image\" alt=\"Main display image\" />\n          } @else {\n            <img\n              class=\"main-document file\"\n              [class]=\"{\n                png: selectedFile.extension === 'png',\n                jpg: selectedFile.extension === 'jpg',\n                pdf: selectedFile.extension === 'pdf',\n                doc: selectedFile.extension === 'doc',\n                docx: selectedFile.extension === 'docx',\n                xls: selectedFile.extension === 'xls',\n                xlsx: selectedFile.extension === 'xlsx',\n                ppt: selectedFile.extension === 'ppt',\n                pptx: selectedFile.extension === 'pptx',\n                csv: selectedFile.extension === 'csv',\n                psd: selectedFile.extension === 'psd',\n                xml: selectedFile.extension === 'xml',\n                zip: selectedFile.extension === 'zip'\n              }\"\n              alt=\"Main display image\" />\n              @if(selectedFile.fileName) {\n                <div class=\"T14M\">{{selectedFile.fileName}}</div>\n              }\n              <sd-button [title]=\"'core.component.upload-file.upload' | translate\" (click)=\"onDownload(selectedFile)\" type=\"fill\" color=\"primary\"></sd-button>\n          }\n        }\n        <sd-button prefixIcon=\"arrow_forward_ios\" class=\"next-icon\" (click)=\"updateCurrentImage(1)\"></sd-button>\n        <sd-button prefixIcon=\"arrow_back_ios_new\" class=\"back-icon\" (click)=\"updateCurrentImage(-1)\"></sd-button>\n      </div>\n    </div>\n  </div>\n</sd-modal>\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { PreviewFile } from '../services';\n@Pipe({\n  name: 'filterImage',\n  standalone: true,\n})\nexport class FilterImagePipe implements PipeTransform {\n  transform(files: PreviewFile[]) {\n    return files.filter(e => e.isPreviewImage && (e.file || e.src));\n  }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { PreviewFile } from '../services';\n@Pipe({\n  name: 'filterDocument',\n  standalone: true,\n})\nexport class FilterDocumentPipe implements PipeTransform {\n  transform(files: PreviewFile[]) {\n    return files.filter(e => !e.isPreviewImage || (!e.file && !e.src));\n  }\n}\n","const IMAGE_EXTENSIONS = ['png', 'jpg', 'jpeg', 'heic', 'heif'];\nexport const IsImage = (extension: string | undefined | null) => {\n  if (!extension) {\n    return false;\n  }\n  return IMAGE_EXTENSIONS.includes(extension?.toLowerCase());\n};\n\nexport interface PreviewFile {\n  idOrKey?: string | number;\n  file?: File | null;\n  src?: string | null;\n  previewSrc: string | ArrayBuffer | null;\n  isPreviewImage: boolean; // Chỉ preview nếu là ảnh, ngoại trừ định dạng ảnh TIFF (fileType: TIFF hoặc mimeType: image/tiff) do thẻ img không hỗ trợ\n  fileName?: string | null;\n  fileSize?: number | null;\n  extension?: string | null;\n  isImgError?: boolean;\n}\n","import { Injectable } from '@angular/core';\nimport { Utilities } from '@sdcorejs/utils/fns';\n\n@Injectable({ providedIn: 'root' })\nexport class UploadFileService {\n  #cache: Record<string, File> = {};\n\n  #hash = (file: File) => {\n    if (!file) {\n      return null;\n    }\n    return Utilities.hash(file);\n  };\n\n  isHashedKey = (key: string) => {\n    if (!key) {\n      return false;\n    }\n    return !!this.#cache[key];\n  };\n\n  get = (key: string) => {\n    if (!this.isHashedKey(key)) {\n      return null;\n    }\n    return this.#cache[key];\n  };\n\n  add = (file: File) => {\n    const key = this.#hash(file);\n    if (key) {\n      this.#cache[key] = file;\n    }\n    return key;\n  };\n\n  remove = (fileOrKey: File | string) => {\n    if (!fileOrKey) {\n      return;\n    }\n    if (typeof fileOrKey === 'string') {\n      if (this.isHashedKey(fileOrKey)) {\n        delete this.#cache[fileOrKey];\n      }\n      return;\n    }\n    const key = this.#hash(fileOrKey);\n    if (key) {\n      delete this.#cache[key];\n    }\n  };\n}\n","import { CdkDragDrop, DragDropModule, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { CommonModule } from '@angular/common';\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  DestroyRef,\n  ElementRef,\n  afterNextRender,\n  computed,\n  contentChild,\n  effect,\n  inject,\n  input,\n  model,\n  output,\n  signal,\n  viewChild,\n  viewChildren,\n} from '@angular/core';\nimport { FormGroup, NgForm, Validators } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\nimport { SdLabelDefDirective } from '@sdcorejs/angular/forms/directives';\nimport { SdLabel } from '@sdcorejs/angular/forms/label';\nimport { SdFormControl, sdFormControlState, ɵsdFormControlConnector } from '@sdcorejs/angular/forms/models';\nimport { SdFormatNumberPipe } from '@sdcorejs/angular/pipes';\nimport { SdConfirmService, SdNotifyService } from '@sdcorejs/angular/services';\nimport { BrowserUtilities, Utilities } from '@sdcorejs/utils/fns';\nimport { sdIsEmpty } from '@sdcorejs/angular/utilities/data-state';\nimport { PreviewComponent } from './components/preview/preview.component';\nimport {\n  ISdUploadFileConfiguration,\n  SD_UPLOAD_FILE_CONFIGURATION,\n  SdUploadFileDetail,\n  SdUploadFileFuncDownload,\n  SdUploadFileFuncDetails,\n  SdUploadFileFuncUpload,\n} from './configurations';\nimport { FilterDocumentPipe, FilterImagePipe } from './pipes';\nimport { IsImage, PreviewFile, UploadFileService } from './services';\nimport { I18nService, TranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n// https://stackoverflow.com/questions/4459379/preview-an-image-before-it-is-uploaded\n@Component({\n  selector: 'sd-upload-file',\n  templateUrl: './upload-file.component.html',\n  styleUrl: './upload-file.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    SdIcon,\n    CommonModule,\n    MatButtonModule,\n    DragDropModule,\n    SdLabel,\n    PreviewComponent,\n    FilterImagePipe,\n    FilterDocumentPipe,\n    SdFormatNumberPipe,\n    MatProgressSpinner,\n    TranslatePipe,\n  ],\n})\nexport class SdUploadFile<TArgs = any> {\n  // ─── Injected Services ────────────────────────────────────────────────\n  readonly #notifyService = inject(SdNotifyService);\n  readonly #confirmService = inject(SdConfirmService);\n  readonly #configuration = inject<ISdUploadFileConfiguration | ISdUploadFileConfiguration[]>(SD_UPLOAD_FILE_CONFIGURATION, {\n    optional: true,\n  });\n  readonly #uploadFileService = inject(UploadFileService);\n  readonly #destroyRef = inject(DestroyRef);\n  readonly #i18n = inject(I18nService);\n\n  // ─── Internal State ───────────────────────────────────────────────────\n  readonly id = `I${Utilities.generateUuid()}`;\n  readonly #isMobileOrTablet = BrowserUtilities.isMobile();\n  readonly #canvas1 = `C${Utilities.generateUuid()}`;\n  readonly #canvas2 = `C${Utilities.generateUuid()}`;\n  readonly formControl = new SdFormControl();\n\n  // why: component là OnPush nhưng template đọc formControl.touched/errors như thuộc tính\n  // THƯỜNG (không reactive). Khi cha submit (markAllAsTouched) hoặc validator gắn lỗi, không\n  // có gì markForCheck → view không re-render → message lỗi required không hiện. sdFormControlState\n  // bọc formControl thành signal tick mỗi control event (value/status/touched) → showRequiredError\n  // (computed) đọc signal này → template đọc computed → OnPush tự refresh khi state đổi.\n  readonly #state = sdFormControlState(computed(() => this.formControl));\n  /** Hiển thị message \"vui lòng upload\": không disabled + đã touched + còn lỗi required. */\n  readonly showRequiredError = computed<boolean>(() => {\n    void this.#state(); // phụ thuộc control events để re-eval (OnPush refresh)\n    return !this.formControl.disabled && this.formControl.touched && !!this.formControl.errors?.['required'];\n  });\n\n  // ─── Signals (state) ──────────────────────────────────────────────────\n  readonly previewFiles = signal<PreviewFile[]>([]);\n  readonly selectedFile = signal<PreviewFile | null | undefined>(undefined);\n\n  // ─── Query Signals ────────────────────────────────────────────────────\n  readonly previewFileComponent = viewChild(PreviewComponent);\n  readonly dropElements = viewChildren<ElementRef>('dropElement');\n  readonly sdLabelDef = contentChild(SdLabelDefDirective);\n\n  // ─── Input Signals ────────────────────────────────────────────────────\n  // autoId prefix `upload-file-`. Mỗi nút remove dùng index-based suffix để ổn định khi filename trùng nhau.\n  readonly autoIdInput = input<string | undefined | null>(undefined, { alias: 'autoId' });\n  readonly autoId = computed(() => (this.autoIdInput() ? `components-upload-file-${this.autoIdInput()}` : undefined));\n  readonly removeAutoId = (index: number): string | undefined => (this.autoId() ? `${this.autoId()}-remove-${index}` : undefined);\n\n  // ─── E2E data attributes ──────────────────────────────────────────────\n  readonly dataDisabled = computed(() => (this.disabled() ? 'true' : 'false'));\n  readonly dataEmpty = computed(() => (sdIsEmpty(this.previewFiles()) ? 'true' : 'false'));\n  readonly dataCount = computed(() => String(this.previewFiles()?.length ?? 0));\n\n  readonly args = input<TArgs>();\n  readonly label = input<string>();\n  readonly key = input<string | undefined>(undefined);\n  readonly description = input<string>();\n  readonly previewWidth = input<string>('50px');\n  readonly previewHeight = input<string>('50px');\n  readonly align = input<'left' | 'center'>('left');\n  readonly uploadInput = input<SdUploadFileFuncUpload<any> | undefined>(undefined, { alias: 'upload' });\n  readonly details = input<SdUploadFileFuncDetails<any>>();\n  readonly downloadInput = input<SdUploadFileFuncDownload<any> | undefined>(undefined, { alias: 'download' });\n  readonly imageValidator = input<(image: HTMLImageElement) => string>();\n  readonly maxSize = input<number>();\n  readonly maxWidth = input<number>();\n  readonly maxHeight = input<number>();\n  readonly scaleToPixel = input<number>();\n\n  // ─── Inputs with transform (null/undefined → default value) ─────────\n  form = input<FormGroup | undefined, any>(undefined, {\n    transform: (val: any): FormGroup | undefined => {\n      if (!val) return undefined;\n      // Nếu cha truyền vào NgForm (template-driven) -> Bóc lấy FormGroup bên trong\n      if (val instanceof NgForm) return val.form;\n      // Nếu cha truyền sẵn FormGroup (reactive) -> Lấy luôn\n      if (val instanceof FormGroup) return val;\n      // Fallback an toàn phòng trường hợp cha truyền 1 object chứa form\n      if (val?.form instanceof FormGroup) return val.form;\n      return undefined;\n    },\n  });\n\n  readonly nameInput = input<string, string | undefined>(Utilities.generateUuid(), {\n    alias: 'name',\n    transform: (val): string => val || Utilities.generateUuid(),\n  });\n\n  readonly required = input<boolean, boolean | '' | undefined | null>(false, {\n    alias: 'required',\n    transform: (val): boolean => val === '' || !!val,\n  });\n\n  readonly type = input<'image' | 'document' | 'file', 'image' | 'document' | 'file' | undefined | null>('file', {\n    alias: 'type',\n    transform: (val): 'image' | 'document' | 'file' => val || 'file',\n  });\n\n  readonly helperText = input<string | undefined>(undefined, { alias: 'helperText' });\n\n  readonly max = input<number, number | undefined | null>(10, {\n    alias: 'max',\n    transform: (val): number => val ?? 10,\n  });\n\n  readonly maxOfImage = input<number, number | undefined | null>(3, {\n    alias: 'maxOfImage',\n    transform: (val): number => val ?? 3,\n  });\n\n  readonly extensions = input<string[], string[] | undefined | null>([], {\n    alias: 'extensions',\n    transform: (val): string[] => val?.filter(Boolean) ?? [],\n  });\n\n  readonly disabled = input<boolean, boolean | '' | undefined | null>(false, {\n    alias: 'disabled',\n    transform: (val): boolean => val === '' || !!val,\n  });\n\n  // ─── Computed ─────────────────────────────────────────────────────────\n  readonly generatedDescription = computed(() => {\n    const desc = this.description();\n    if (desc) return desc;\n    const exts = this.extensions();\n    const maxSz = this.maxSize();\n    if (exts.length && maxSz) {\n      return this.#i18n.t('core.component.upload-file.desc-format-and-size', { exts: exts.join(', '), maxSize: maxSz });\n    } else if (exts.length) {\n      return this.#i18n.t('core.component.upload-file.desc-format', { exts: exts.join(', ') });\n    } else if (maxSz) {\n      return this.#i18n.t('core.component.upload-file.desc-max-size', { maxSize: maxSz });\n    }\n    return undefined;\n  });\n\n  // ─── Output Signals ───────────────────────────────────────────────────\n  readonly loaded = output<PreviewFile[]>();\n  readonly filesChanged = output<(string | File)[]>();\n\n  // ─── Model Signal (two-way binding support: [(model)]) ────────────────\n  readonly model = model<(string | number)[]>([]);\n  readonly #formConnector = ɵsdFormControlConnector<unknown, unknown>({\n    form: this.form,\n    name: this.nameInput,\n    control: computed(() => this.formControl),\n  });\n\n  constructor() {\n    this.#validateDuplicateConfigurationKeys();\n\n    // Sync form group & register form control\n    afterNextRender(() => {\n      // Drag & drop setup\n      if (!this.#isMobileOrTablet) {\n        this.#setupDropContainer();\n      }\n    });\n\n    // Reactive sync for model changes\n    effect(() => {\n      const values = this.model() || [];\n      this.formControl.setValue(values);\n\n      if (Array.isArray(values)) {\n        this.#details(values).then(previewFiles => {\n          this.previewFiles.set(previewFiles);\n          this.filesChanged.emit(\n            this.previewFiles()\n              .map(e => e.file || e.idOrKey || e.src)\n              .filter(val => !!val) as (string | File)[]\n          );\n          this.#preview();\n        });\n      } else {\n        this.previewFiles.set([]);\n      }\n    });\n\n    // Reactive disabled state via effect (runs whenever disabled input changes)\n    effect(() => {\n      if (this.disabled()) {\n        this.formControl.disable();\n      } else {\n        this.formControl.enable();\n      }\n    });\n\n    // why: required() là signal input — phải đăng ký validator qua effect để bắt thay\n    // đổi runtime. Validators.required nhận biết array rỗng (length === 0) là empty\n    // nên file array hoạt động đúng. updateValueAndValidity để chip lỗi xuất hiện\n    // ngay khi required toggle true mà chưa upload file nào.\n    effect(() => {\n      if (this.required()) {\n        this.formControl.setValidators(Validators.required);\n      } else {\n        this.formControl.clearValidators();\n      }\n      this.formControl.updateValueAndValidity({ emitEvent: false });\n    });\n\n    // Cleanup on destroy\n    this.#destroyRef.onDestroy(() => {\n      this.#revokePreviewBlobURLs();\n    });\n  }\n\n  // ─── Drop container setup ─────────────────────────────────────────────\n  #setupDropContainer() {\n    const dropEls = this.dropElements();\n    if (dropEls?.length > 0) {\n      const dropContainer = dropEls[0].nativeElement;\n      this.#bindDropEvents(dropContainer);\n    }\n  }\n\n  #bindDropEvents(dropContainer: HTMLElement) {\n    dropContainer.addEventListener('dragover', (evt: Event) => {\n      evt.preventDefault();\n      (dropContainer as any).style.opacity = 0.9;\n      dropContainer.style.border = '2px solid grey';\n    });\n    dropContainer.addEventListener('dragenter', (evt: Event) => {\n      evt.preventDefault();\n    });\n    dropContainer.addEventListener('dragleave', () => {\n      (dropContainer as any).style.opacity = 0.6;\n      dropContainer.style.border = '2px dashed grey';\n    });\n    dropContainer.addEventListener('drop', async (evt: DragEvent) => {\n      evt.preventDefault();\n      (dropContainer as any).style.opacity = 0.6;\n      dropContainer.style.border = '2px dashed grey';\n      const files: File[] = [];\n      for (const file of evt.dataTransfer?.files || []) {\n        files.push(file);\n      }\n      await this.#uploadFile(files);\n    });\n  }\n\n  // ─── Private Methods ──────────────────────────────────────────────────\n  #touch = () => {\n    this.formControl.markAsTouched();\n    this.formControl.setValue(this.model() || []);\n  };\n\n  #getConfigurations = (): ISdUploadFileConfiguration[] => {\n    const config = this.#configuration;\n    if (!config) {\n      return [];\n    }\n    return Array.isArray(config) ? config : [config];\n  };\n\n  #validateDuplicateConfigurationKeys = (): void => {\n    const configurations = this.#getConfigurations();\n    if (!configurations.length) {\n      return;\n    }\n\n    const seen = new Set<string>();\n    for (const configuration of configurations) {\n      const key = configuration.key;\n      const normalizedKey = key === undefined ? '__undefined__' : key;\n      if (seen.has(normalizedKey)) {\n        const label = key === undefined ? 'undefined' : key;\n        throw new Error(`[sd-upload-file] Duplicate upload configuration key detected: ${label}`);\n      }\n      seen.add(normalizedKey);\n    }\n  };\n\n  #getSelectedConfiguration = (): ISdUploadFileConfiguration | undefined => {\n    const configurations = this.#getConfigurations();\n    if (!configurations.length) {\n      return undefined;\n    }\n    const key = this.key();\n    return configurations.find(configuration => configuration.key === key);\n  };\n\n  #getUploadHandler = (): SdUploadFileFuncUpload<any> | undefined => {\n    return this.uploadInput() || this.#getSelectedConfiguration()?.upload;\n  };\n\n  #getDetailsHandler = (): SdUploadFileFuncDetails<any> | undefined => {\n    return this.details() || this.#getSelectedConfiguration()?.details;\n  };\n\n  #getDownloadHandler = (): SdUploadFileFuncDownload<any> | undefined => {\n    return this.downloadInput() || this.#getSelectedConfiguration()?.download;\n  };\n\n  #validate = async (file: File): Promise<string | null> => {\n    if (this.type() === 'image') {\n      if (file.type.split('/')[0] !== 'image') {\n        return this.#i18n.t('core.component.upload-file.not-image', { name: file.name });\n      }\n    }\n    const exts = this.extensions();\n    if (exts?.length) {\n      const lastDot = file.name.lastIndexOf('.');\n      const extension = file.name.substring(lastDot + 1);\n      if (!exts.some(e => e.toUpperCase() === extension.toUpperCase())) {\n        return this.#i18n.t('core.component.upload-file.invalid-format', { name: file.name, exts: exts.join(', ') });\n      }\n    }\n    const maxSz = this.maxSize();\n    if (maxSz) {\n      if (maxSz * 1024 * 1024 < file.size) {\n        return this.#i18n.t('core.component.upload-file.size-exceeded', { name: file.name, maxSize: maxSz });\n      }\n    }\n    if (this.type() === 'image' && (this.maxWidth() || this.maxHeight() || this.imageValidator())) {\n      const message: string | null = await new Promise(resolve => {\n        const URL = window.URL || window.webkitURL;\n        const img = new Image();\n        img.onload = () => {\n          const mw = this.maxWidth();\n          const mh = this.maxHeight();\n          const imgVal = this.imageValidator();\n          if (mw && img.width > mw) {\n            resolve(`[${file.name}] Max image width ${mw}px`);\n            return;\n          }\n          if (mh && img.height > mh) {\n            resolve(`[${file.name}] Max image height ${mh}px`);\n            return;\n          }\n          if (imgVal) {\n            resolve(imgVal(img));\n            return;\n          }\n          resolve(null);\n        };\n        img.src = URL.createObjectURL(file);\n      });\n      if (message) {\n        return message;\n      }\n    }\n    return null;\n  };\n\n  #preview = () => {\n    for (const previewFile of this.previewFiles().filter(e => e.file)) {\n      const reader = new FileReader();\n      reader.onload = evt => {\n        previewFile.previewSrc = evt.target!.result;\n        previewFile.isPreviewImage = previewFile.file?.type.split('/')[0] === 'image' && previewFile.file?.type !== 'image/tiff';\n        // trigger signal update\n        this.previewFiles.set([...this.previewFiles()]);\n      };\n      reader.readAsDataURL(previewFile.file!);\n    }\n  };\n\n  // ─── Public Event Handlers ────────────────────────────────────────────\n  onUpload = () => {\n    BrowserUtilities.upload({\n      maxSizeInMb: this.maxSize(),\n      extensions: this.extensions(),\n      multiple: this.max() > 1,\n    })\n      .then(async result => {\n        if (result) {\n          if (Array.isArray(result)) {\n            await this.#uploadFile(result);\n          } else {\n            await this.#uploadFile([result]);\n          }\n        }\n      })\n      .catch(error => {\n        console.error(error);\n        this.#notifyService.error(error?.message || this.#i18n.t('core.component.upload-file.upload-failed'));\n      });\n  };\n\n  #uploadFile = async (originFiles: File[]) => {\n    const currentModel = [...(this.model() || [])];\n    if (originFiles.length + currentModel.length > this.max()) {\n      this.#notifyService.warning(this.#i18n.t('core.component.upload-file.too-many-files'));\n      return;\n    }\n    for (let file of originFiles) {\n      const isImage = file.type.split('/')[0] === 'image' && file.type !== 'image/tiff';\n      if (isImage && (this.scaleToPixel() ?? 0) > 0) {\n        file = await this.#resize(file!);\n      }\n      const message = await this.#validate(file!);\n      if (message) {\n        this.#notifyService.warning(message);\n        return;\n      }\n      const hashedKey = this.#uploadFileService.add(file);\n      if (hashedKey) {\n        currentModel.push(hashedKey);\n      }\n    }\n    this.model.set(currentModel);\n    this.#touch();\n  };\n\n  onRemove = (file: PreviewFile) => {\n    const files = this.previewFiles();\n    const idx = files.indexOf(file);\n    if (idx >= 0) {\n      this.#confirmService\n        .confirm(this.#i18n.t('core.component.upload-file.confirm-delete-message'), {\n          title: this.#i18n.t('core.component.upload-file.confirm-delete-title'),\n          yesTitle: this.#i18n.t('core.component.upload-file.confirm-yes'),\n          noTitle: this.#i18n.t('core.component.upload-file.confirm-no'),\n          yesButtonColor: 'primary',\n          noButtonColor: 'primary',\n        })\n        .then(() => {\n          const updated = [...files];\n          updated.splice(idx, 1);\n          this.previewFiles.set(updated);\n          const currentModel = [...(this.model() || [])];\n          currentModel.splice(idx, 1);\n          this.model.set(currentModel);\n          this.filesChanged.emit(\n            this.previewFiles()\n              .map(e => e.file || e.idOrKey || e.src)\n              .filter(val => !!val) as (string | File)[]\n          );\n          this.#touch();\n        });\n    }\n  };\n\n  onDrop = (event: CdkDragDrop<string[]>) => {\n    const currentModel = [...(this.model() || [])];\n    moveItemInArray(currentModel, event.previousIndex, event.currentIndex);\n    this.model.set(currentModel);\n    this.#touch();\n  };\n\n  onImgError = (previewFile: PreviewFile) => {\n    previewFile.isImgError = true;\n    this.previewFiles.set([...this.previewFiles()]);\n  };\n\n  onSelect = (file: PreviewFile) => {\n    if (!this.#isMobileOrTablet) {\n      return;\n    }\n    this.selectedFile.set(this.selectedFile() !== file ? file : null);\n  };\n\n  // ─── Resize ───────────────────────────────────────────────────────────\n  #resize = async (file: File): Promise<File> => {\n    if (!this.scaleToPixel()) {\n      return file;\n    }\n    const lastDot = file.name.lastIndexOf('.');\n    if (lastDot === -1) {\n      return file;\n    }\n    return await new Promise((resolve, reject) => {\n      const URL = window.URL || window.webkitURL;\n      const img = new Image();\n      img.onload = () => {\n        try {\n          if (img.width * img.height <= this.scaleToPixel()!) {\n            return resolve(file);\n          }\n          const canvas1 = document.createElement('canvas');\n          canvas1.setAttribute('id', this.#canvas1);\n          const ctx1 = canvas1.getContext('2d');\n          const { width, height } = this.#scale(img.width, img.height, this.scaleToPixel()!);\n          canvas1.width = width;\n          canvas1.height = height;\n\n          const canvas2 = document.createElement('canvas');\n          canvas2.setAttribute('id', this.#canvas2);\n          const ctx2 = canvas2.getContext('2d');\n          canvas2.width = width;\n          canvas2.height = height;\n          ctx2!.drawImage(img, 0, 0, canvas2.width, canvas2.height);\n          ctx2!.drawImage(canvas2, 0, 0, canvas2.width * 0.5, canvas2.height * 0.5);\n          ctx1!.drawImage(canvas2, 0, 0, canvas2.width * 0.5, canvas2.height * 0.5, 0, 0, canvas1.width, canvas1.height);\n          canvas1.toBlob(blob => {\n            resolve(this.#blobToFile(blob!, `${file.name.substring(0, lastDot)}.png`));\n          });\n        } catch (err) {\n          reject(err);\n        } finally {\n          document.getElementById(this.#canvas1)?.remove();\n          document.getElementById(this.#canvas2)?.remove();\n        }\n      };\n      img.src = URL.createObjectURL(file);\n    });\n  };\n\n  #scale = (width: number, height: number, scaleToPixcel: number) => {\n    if (!width || !height || !scaleToPixcel) {\n      return { width, height };\n    }\n    const ratio = width / height;\n    for (let i = 0; i < width; i++) {\n      width -= i;\n      height = Math.trunc(width / ratio);\n      if (width * height <= scaleToPixcel) {\n        break;\n      }\n    }\n    return { width, height };\n  };\n\n  #blobToFile = (blob: Blob, fileName: string): File => {\n    const temp: any = blob;\n    temp.lastModifiedDate = new Date();\n    temp.name = fileName;\n    return blob as File;\n  };\n\n  // ─── Public API ───────────────────────────────────────────────────────\n  /**\n   * Lấy danh sách các File từ previewFiles (chưa upload).\n   */\n  getFiles = async () => {\n    const items = this.previewFiles()?.filter(val => !!val) || [];\n    return items.map(e => e?.file).filter(file => !!file);\n  };\n\n  /**\n   * Thực hiện upload các file và gán giá trị, output trả ra mảng idOrKeys.\n   * HÀM NÀY BẮT BUỘC PHẢI GỌI TRƯỚC KHI GỌI VỀ SERVER.\n   */\n  upload = async () => {\n    const items = this.previewFiles()?.filter(val => !!val) || [];\n    if (!Array.isArray(items)) {\n      this.model.set([]);\n      return;\n    }\n    const results: (string | number)[] = [];\n    const uploadedFiles = items.map(e => e?.file).filter(file => !!file);\n    let idOrKeys: string[] = [];\n    if (uploadedFiles.length) {\n      const uploadHandler = this.#getUploadHandler();\n      if (uploadHandler) {\n        idOrKeys = await uploadHandler(uploadedFiles, this.args()).then(results => {\n          for (const uploadedFile of uploadedFiles) {\n            this.#uploadFileService.remove(uploadedFile);\n          }\n          return results;\n        });\n      } else {\n        const key = this.key();\n        this.#notifyService.error(\n          key === undefined\n            ? this.#i18n.t('core.component.upload-file.no-configuration')\n            : this.#i18n.t('core.component.upload-file.no-configuration-key', { key })\n        );\n      }\n    }\n    let idx = 0;\n    for (const item of items) {\n      if (!item.file) {\n        if (item.idOrKey) {\n          results.push(item.idOrKey);\n        }\n      } else {\n        if (idOrKeys?.[idx]) {\n          results.push(idOrKeys[idx]);\n          idx++;\n        }\n      }\n    }\n    this.model.set(results);\n  };\n\n  /**\n   * Mở popup preview ảnh.\n   */\n  preview = async () => {\n    this.previewFileComponent()?.open(this.previewFiles());\n  };\n\n  /**\n   * Tải xuống một tệp tin dựa trên đối tượng PreviewFile.\n   *\n   * Ưu tiên:\n   * 1. Nếu consumer CÓ implement hàm download (input `download` hoặc configuration) VÀ file có\n   *    `idOrKey` (file đã lưu trên server) → LUÔN gọi hàm download. KHÔNG mở `src` (URL lấy từ detail).\n   *    Dùng cho trường hợp tải file qua API có xác thực thay vì truy cập trực tiếp URL.\n   * 2. Ngược lại (không có hàm download, hoặc file local chưa upload nên chưa có `idOrKey`) →\n   *    tải trực tiếp từ `file` (blob) hoặc `src` (URL).\n   *\n   * @param previewFile Đối tượng PreviewFile chứa thông tin tệp tin.\n   */\n  onDownload = (previewFile: PreviewFile) => {\n    const downloadHandler = this.#getDownloadHandler();\n\n    // (1) Có hàm download + file đã lưu (idOrKey) → luôn trigger hàm download, bỏ qua URL từ detail.\n    if (downloadHandler && previewFile.idOrKey) {\n      downloadHandler(previewFile.idOrKey, this.args());\n      return;\n    }\n\n    // (2) Không có hàm download (hoặc file local chưa có idOrKey) → tải trực tiếp từ blob/URL.\n    if (previewFile.file || previewFile.src) {\n      BrowserUtilities.download(previewFile.file! || previewFile.src!, previewFile.fileName);\n      return;\n    }\n\n    console.error('Invalid preview file (no download handler / file / src)', previewFile);\n  };\n\n  isLastVisibleOverlay(fileIndex: number): boolean {\n    return this.formControl.disabled && fileIndex === this.maxOfImage() - 1 && this.previewFiles().length > this.maxOfImage();\n  }\n\n  // ─── Details ──────────────────────────────────────────────────────────\n  /**\n   * Khi binding model, đầu vào thường là id/key/cdn,\n   * cần render ra ảnh/tệp tương ứng.\n   */\n  #details = async (keys: (string | number)[]) => {\n    if (!Array.isArray(keys) || !keys.length) {\n      return [];\n    }\n    const idOrKeys = keys.filter(key => !!key && !this.#isCdn(key) && !this.#isHashedKey(key)) as (string | number)[];\n    let detailsList: SdUploadFileDetail[] = [];\n    const detailsHandler = this.#getDetailsHandler();\n    if (idOrKeys.length && detailsHandler) {\n      detailsList = await detailsHandler(idOrKeys, this.args()).catch(error => {\n        console.error(error);\n        return [];\n      });\n    }\n    const results: PreviewFile[] = [];\n    for (const key of keys.filter(val => !!val)) {\n      if (this.#isCdn(key)) {\n        const cdn = key?.toString();\n        const extension = this.#getExtension(cdn);\n        const isPreviewImage = this.type() === 'image' || IsImage(extension);\n        results.push({\n          idOrKey: cdn,\n          fileName: cdn,\n          file: null,\n          previewSrc: null,\n          src: cdn,\n          isPreviewImage,\n          extension,\n        });\n      } else if (this.#isHashedKey(key)) {\n        const hashedKey = key?.toString();\n        const file = this.#uploadFileService.get(hashedKey)!;\n        const lastDot = file.name.lastIndexOf('.');\n        const extension = file.name.substring(lastDot + 1);\n        const isPreviewImage = (file.type.split('/')[0] === 'image' && file.type !== 'image/tiff') || IsImage(extension);\n        results.push({\n          file,\n          isPreviewImage,\n          previewSrc: null,\n          src: null,\n          fileName: file.name,\n          fileSize: file.size,\n          extension,\n        });\n      } else {\n        const detail = detailsList.find(e => e.idOrKey === key);\n        if (detail) {\n          const { idOrKey, cdn, name, size } = detail;\n          const extension = detail.extension || this.#getExtension(name) || this.#getExtension(cdn);\n          const isPreviewImage = this.type() === 'image' || IsImage(extension);\n          results.push({\n            idOrKey: idOrKey || cdn,\n            fileName: name,\n            fileSize: size,\n            file: null,\n            previewSrc: null,\n            src: cdn,\n            isPreviewImage,\n            extension,\n          });\n        }\n      }\n    }\n    return results;\n  };\n\n  // ─── Helpers ──────────────────────────────────────────────────────────\n  #isCdn = (idOrKey: string | number) => {\n    if (typeof idOrKey !== 'string') return false;\n    return idOrKey.startsWith('http');\n  };\n\n  #isHashedKey = (idOrKey: string | number) => {\n    if (typeof idOrKey !== 'string') return false;\n    return this.#uploadFileService.isHashedKey(idOrKey);\n  };\n\n  #getExtension = (cdn: string | undefined) => {\n    if (!cdn) return undefined;\n    const baseSrc = cdn?.split?.('?')?.[0];\n    const lastDot = baseSrc?.lastIndexOf?.('.');\n    if (lastDot > 0) {\n      return baseSrc.substring(lastDot + 1);\n    }\n    return undefined;\n  };\n\n  /**\n   * Giải phóng các URL blob đã tạo để tránh rò rỉ bộ nhớ.\n   * Chỉ nên gọi khi không còn sử dụng previewFiles nữa.\n   */\n  #revokePreviewBlobURLs = (): void => {\n    const files = this.previewFiles();\n    if (!Array.isArray(files) || !files?.length) return;\n    files.forEach(p => {\n      if (typeof p?.previewSrc === 'string' && p?.previewSrc?.startsWith('blob')) {\n        URL.revokeObjectURL(p.previewSrc);\n      }\n      if (typeof p?.src === 'string' && p?.src?.startsWith('blob')) {\n        URL.revokeObjectURL(p.src);\n      }\n    });\n  };\n}\n","<div class=\"d-flex flex-column\" style=\"gap: 4px\">\n  @let _sdLabelDef = sdLabelDef();\n  @let _label = label();\n  @let _align = align();\n  @let _previewFiles = previewFiles();\n  @let _previewWidth = previewWidth();\n  @let _previewHeight = previewHeight();\n  @let _maxOfImage = maxOfImage();\n  @if (!!_sdLabelDef?.templateRef) {\n    <ng-container *ngTemplateOutlet=\"_sdLabelDef?.templateRef!\"> </ng-container>\n  } @else if (_label) {\n    <sd-label [label]=\"_label!\" [description]=\"generatedDescription()\" [helperText]=\"helperText()\" [required]=\"required()\"></sd-label>\n  }\n  <div\n    cdkDropList\n    (cdkDropListDropped)=\"onDrop($event)\"\n    cdkDropListOrientation=\"horizontal\"\n    class=\"d-flex\"\n    [class.justify-content-center]=\"_align === 'center'\"\n    [class.justify-content-start]=\"_align === 'left'\">\n    @if (_previewFiles.length < max() && !formControl.disabled) {\n      <div\n        class=\"d-flex justify-content-center align-items-center cursor-pointer c-area-upload\"\n        [style.width]=\"_previewWidth\"\n        [style.height]=\"_previewHeight\"\n        (click)=\"onUpload()\"\n        aria-hidden=\"true\"\n        [attr.data-autoId]=\"autoId()\"\n        [attr.data-disabled]=\"dataDisabled()\"\n        [attr.data-empty]=\"dataEmpty()\"\n        [attr.data-count]=\"dataCount()\"\n        #dropElement>\n        <sd-icon class=\"c-upload\" name=\"file_upload\"></sd-icon>\n      </div>\n    }\n    @let previewImages = _previewFiles | filterImage;\n    @for (image of previewImages; track $index; let idx = $index) {\n      @if (!formControl.disabled || idx < _maxOfImage) {\n        <div class=\"c-area c-view\" [class.c-loading]=\"!image.previewSrc && !image.src\" [class.c-area-error]=\"image.isImgError\" [style.width]=\"_previewWidth\" [style.height]=\"_previewHeight\" cdkDrag>\n          <div class=\"c-drag-placeholder\" [style.width]=\"_previewWidth\" [style.height]=\"_previewHeight\" *cdkDragPlaceholder></div>\n          <div *cdkDragPreview [style]=\"{ width: _previewWidth, height: _previewHeight }\" class=\"c-drag-preview\">\n            <div class=\"c-container\">\n              <sd-icon name=\"image\"></sd-icon>\n            </div>\n          </div>\n          <div class=\"c-preview\">\n            <div\n              class=\"c-img-container\"\n              [class.c-disabled]=\"formControl.disabled\"\n              [class.c-selected]=\"selectedFile() === image\"\n              [class.has-overlay]=\"idx === _maxOfImage - 1 && formControl.disabled\"\n              (click)=\"onSelect(image)\"\n              aria-hidden=\"true\">\n              @if (image.isImgError) {\n                <img class=\"sd-image-image-error\" alt=\"Image Error\" style=\"max-width: 100%;\" [style.max-height]=\"_previewHeight\" />\n              } @else if(image.previewSrc) {\n                <img class=\"c-img\" [src]=\"image.previewSrc\" alt=\"Preview\" [style.max-height]=\"_previewHeight\" (error)=\"onImgError(image)\" />\n              } @else if(image.src) {\n                <img class=\"c-img\" [src]=\"image.src\" alt=\"Preview\" [style.max-height]=\"_previewHeight\" (error)=\"onImgError(image)\" />\n              } @else {\n                <mat-spinner style=\"justify-self: center;\" strokeWidth=\"2\" mode=\"indeterminate\" diameter=\"18\" value=\"100\"></mat-spinner>\n              }\n              @if (idx === _maxOfImage - 1 && formControl.disabled && previewImages.length > _maxOfImage) {\n                <div class=\"c-overlay-count\" (click)=\"preview()\">\n                  <div class=\"c-overlay-text\">+{{ previewImages.length - _maxOfImage }}</div>\n                </div>\n              }\n              <div class=\"c-action\">\n                <sd-icon class=\"c-zoom\" (click)=\"preview()\" name=\"zoom_in\"></sd-icon>\n              </div>\n              @if (!formControl.disabled) {\n                <button class=\"c-btn-remove\" (click)=\"onRemove(image)\" mat-icon-button aria-label=\"Close\" [attr.data-autoId]=\"removeAutoId(idx)\">\n                  <sd-icon name=\"close\"></sd-icon>\n                </button>\n              }\n            </div>\n          </div>\n        </div>\n      }\n    }\n  </div>\n  @let previewDocuments = _previewFiles | filterDocument;\n  @for (document of previewDocuments; track $index; let docIdx = $index) {\n    <div class=\"c-document-container\">\n      <img\n        [style.max-height]=\"_previewHeight\"\n        class=\"c-document-image\"\n        [class]=\"{\n          png: document.extension === 'png',\n          jpg: document.extension === 'jpg',\n          pdf: document.extension === 'pdf',\n          doc: document.extension === 'doc',\n          docx: document.extension === 'docx',\n          xls: document.extension === 'xls',\n          xlsx: document.extension === 'xlsx',\n          ppt: document.extension === 'ppt',\n          pptx: document.extension === 'pptx',\n          csv: document.extension === 'csv',\n          psd: document.extension === 'psd',\n          xml: document.extension === 'xml',\n          zip: document.extension === 'zip',\n          tiff: document.extension === 'tiff'\n        }\"\n        alt=\"Preview\" />\n      <a href=\"javascript:;\" class=\"c-file-name T14M\" (click)=\"onDownload(document)\">{{ document.fileName || 'file' }}</a>\n      @if (document.fileSize) {\n        <span class=\"T12R text-secondary\"> - </span>\n        <span class=\"T12R text-secondary flex-shrink-0\">{{ document.fileSize / 1024 | sdFormatNumber }}KB</span>\n      }\n\n      @if (!formControl.disabled) {\n        <sd-icon class=\"c-close\" (click)=\"onRemove(document)\" [attr.data-autoId]=\"removeAutoId(docIdx)\" name=\"close\"></sd-icon>\n      }\n    </div>\n  }\n  @if (showRequiredError()) {\n    <div class=\"text-error T12R\" style=\"padding: 4px 8px\">{{ ('core.component.upload-file.please-upload' | translate) }}</div>\n  }\n</div>\n<preview (download)=\"onDownload($event)\"></preview>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["ɵsdFormControlConnector"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAiCA;;;AAGG;MACU,4BAA4B,GAAG,IAAI,cAAc,CAA6B,8BAA8B;;MCrB5G,gBAAgB,CAAA;AACnB,IAAA,EAAE,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAElB,IAAA,KAAK;IAChB,QAAQ,GAAG,MAAM,EAAe;IAChC,KAAK,GAAG,MAAM,EAAQ;AAEtB,IAAA,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;IACpC,KAAK,GAAW,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,0CAA0C,CAAC;IACxE,iBAAiB,GAAwC,OAAO;IAChE,WAAW,GAAG,CAAC;IACf,YAAY,GAAkB,EAAE;AAIhC,IAAA,WAAA,GAAA,EAAe;;AAGf,IAAA,IAAI,GAAG,OAAO,YAA8C,EAAE,KAAc,KAAI;AAC9E,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;YAC7D;QACF;AACA,QAAA,IAAI,CAAC,YAAY,GAAG,YAAY;AAChC,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK,IAAI,CAAC;AAC7B,QAAA,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;AAClB,QAAA,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE;AACxB,IAAA,CAAC;AAED,IAAA,qBAAqB,GAAG,CAAC,KAAa,KAAI;AACxC,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK;AACxB,QAAA,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE;AACxB,IAAA,CAAC;AAED,IAAA,kBAAkB,GAAG,CAAC,SAAiB,KAAI;QACzC,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM;AACvG,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,KAAK,CAAC,GAAG,OAAO,GAAG,KAAK,CAAC;AACrE,QAAA,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE;AACxB,IAAA,CAAC;IAED,OAAO,GAAG,MAAK;AACb,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;AACnB,IAAA,CAAC;AAED,IAAA,WAAW,GAAG,CAAC,KAAa,EAAE,IAA6C,KAAI;AAC7E,QAAA,MAAM,MAAM,GAAW,gBAAgB,GAAG,KAAK;QAC/C,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC;QAC/C,IAAI,CAAC,OAAO,EAAE;YACZ;QACF;AACA,QAAA,MAAM,SAAS,GAA0B,IAAI,IAAI,OAAO;AACxD,QAAA,OAAO,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAClE,IAAA,CAAC;AAED,IAAA,UAAU,GAAG,CAAC,WAAwB,KAAI;AACxC,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC;AAC/B,QAAA,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE;AACxB,IAAA,CAAC;wGAxDU,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,SAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,OAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAGhB,OAAO,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnBpB,89HAiFA,EAAA,MAAA,EAAA,CAAA,iw2NAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDnEY,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,KAAA,EAAA,SAAA,EAAA,MAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,OAAA,EAAA,OAAA,EAAA,OAAA,EAAA,QAAA,EAAA,MAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,sBAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,QAAQ,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,EAAA,OAAA,EAAA,SAAA,EAAA,YAAA,EAAA,YAAA,EAAA,UAAA,EAAA,SAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,YAAY,+GAAW,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAE9D,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAP5B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,SAAS,mBAGF,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,CAAC,EAAA,QAAA,EAAA,89HAAA,EAAA,MAAA,EAAA,CAAA,iw2NAAA,CAAA,EAAA;;sBAKzE,SAAS;uBAAC,OAAO;;;MEbP,eAAe,CAAA;AAC1B,IAAA,SAAS,CAAC,KAAoB,EAAA;QAC5B,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACjE;wGAHW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;sGAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,aAAA,EAAA,CAAA;;4FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAJ3B,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,aAAa;AACnB,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;;MCCY,kBAAkB,CAAA;AAC7B,IAAA,SAAS,CAAC,KAAoB,EAAA;QAC5B,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACpE;wGAHW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;sGAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,gBAAA,EAAA,CAAA;;4FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAJ9B,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,gBAAgB;AACtB,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;;ACLD,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;AACxD,MAAM,OAAO,GAAG,CAAC,SAAoC,KAAI;IAC9D,IAAI,CAAC,SAAS,EAAE;AACd,QAAA,OAAO,KAAK;IACd;IACA,OAAO,gBAAgB,CAAC,QAAQ,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC;AAC5D,CAAC;;MCFY,iBAAiB,CAAA;IAC5B,MAAM,GAAyB,EAAE;AAEjC,IAAA,KAAK,GAAG,CAAC,IAAU,KAAI;QACrB,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,OAAO,IAAI;QACb;AACA,QAAA,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;AAC7B,IAAA,CAAC;AAED,IAAA,WAAW,GAAG,CAAC,GAAW,KAAI;QAC5B,IAAI,CAAC,GAAG,EAAE;AACR,YAAA,OAAO,KAAK;QACd;QACA,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;AAC3B,IAAA,CAAC;AAED,IAAA,GAAG,GAAG,CAAC,GAAW,KAAI;QACpB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE;AAC1B,YAAA,OAAO,IAAI;QACb;AACA,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;AACzB,IAAA,CAAC;AAED,IAAA,GAAG,GAAG,CAAC,IAAU,KAAI;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAC5B,IAAI,GAAG,EAAE;AACP,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI;QACzB;AACA,QAAA,OAAO,GAAG;AACZ,IAAA,CAAC;AAED,IAAA,MAAM,GAAG,CAAC,SAAwB,KAAI;QACpC,IAAI,CAAC,SAAS,EAAE;YACd;QACF;AACA,QAAA,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE;AACjC,YAAA,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE;AAC/B,gBAAA,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;YAC/B;YACA;QACF;QACA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;QACjC,IAAI,GAAG,EAAE;AACP,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;QACzB;AACF,IAAA,CAAC;wGA9CU,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cADJ,MAAM,EAAA,CAAA;;4FACnB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAD7B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACwClC;MAoBa,YAAY,CAAA;;AAEd,IAAA,cAAc,GAAG,MAAM,CAAC,eAAe,CAAC;AACxC,IAAA,eAAe,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC1C,IAAA,cAAc,GAAG,MAAM,CAA4D,4BAA4B,EAAE;AACxH,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA,CAAC;AACO,IAAA,kBAAkB,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC9C,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAChC,IAAA,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;;AAG3B,IAAA,EAAE,GAAG,CAAA,CAAA,EAAI,SAAS,CAAC,YAAY,EAAE,EAAE;AACnC,IAAA,iBAAiB,GAAG,gBAAgB,CAAC,QAAQ,EAAE;AAC/C,IAAA,QAAQ,GAAG,CAAA,CAAA,EAAI,SAAS,CAAC,YAAY,EAAE,EAAE;AACzC,IAAA,QAAQ,GAAG,CAAA,CAAA,EAAI,SAAS,CAAC,YAAY,EAAE,EAAE;AACzC,IAAA,WAAW,GAAG,IAAI,aAAa,EAAE;;;;;;AAOjC,IAAA,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC;;AAE7D,IAAA,iBAAiB,GAAG,QAAQ,CAAU,MAAK;AAClD,QAAA,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,UAAU,CAAC;AAC1G,IAAA,CAAC,6DAAC;;AAGO,IAAA,YAAY,GAAG,MAAM,CAAgB,EAAE,wDAAC;AACxC,IAAA,YAAY,GAAG,MAAM,CAAiC,SAAS,wDAAC;;AAGhE,IAAA,oBAAoB,GAAG,SAAS,CAAC,gBAAgB,gEAAC;AAClD,IAAA,YAAY,GAAG,YAAY,CAAa,aAAa,wDAAC;AACtD,IAAA,UAAU,GAAG,YAAY,CAAC,mBAAmB,sDAAC;;;AAI9C,IAAA,WAAW,GAAG,KAAK,CAA4B,SAAS,+CAAI,KAAK,EAAE,QAAQ,EAAA,CAAA,GAAA,CAAjB,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAC;IAC9E,MAAM,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,WAAW,EAAE,GAAG,CAAA,uBAAA,EAA0B,IAAI,CAAC,WAAW,EAAE,CAAA,CAAE,GAAG,SAAS,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;IAC1G,YAAY,GAAG,CAAC,KAAa,MAA0B,IAAI,CAAC,MAAM,EAAE,GAAG,CAAA,EAAG,IAAI,CAAC,MAAM,EAAE,CAAA,QAAA,EAAW,KAAK,CAAA,CAAE,GAAG,SAAS,CAAC;;IAGtH,YAAY,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;IACnE,SAAS,GAAG,QAAQ,CAAC,OAAO,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,MAAM,GAAG,OAAO,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AAC/E,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,IAAI,CAAC,CAAC,qDAAC;IAEpE,IAAI,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAS;IACrB,KAAK,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AACvB,IAAA,GAAG,GAAG,KAAK,CAAqB,SAAS,+CAAC;IAC1C,WAAW,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AAC7B,IAAA,YAAY,GAAG,KAAK,CAAS,MAAM,wDAAC;AACpC,IAAA,aAAa,GAAG,KAAK,CAAS,MAAM,yDAAC;AACrC,IAAA,KAAK,GAAG,KAAK,CAAoB,MAAM,iDAAC;AACxC,IAAA,WAAW,GAAG,KAAK,CAA0C,SAAS,+CAAI,KAAK,EAAE,QAAQ,EAAA,CAAA,GAAA,CAAjB,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAC;IAC5F,OAAO,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAgC;AAC/C,IAAA,aAAa,GAAG,KAAK,CAA4C,SAAS,iDAAI,KAAK,EAAE,UAAU,EAAA,CAAA,GAAA,CAAnB,EAAE,KAAK,EAAE,UAAU,EAAE,GAAC;IAClG,cAAc,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAuC;IAC7D,OAAO,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;IACzB,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;IAC1B,SAAS,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;IAC3B,YAAY,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;;IAGvC,IAAI,GAAG,KAAK,CAA6B,SAAS,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,MAAA,EAChD,SAAS,EAAE,CAAC,GAAQ,KAA2B;AAC7C,gBAAA,IAAI,CAAC,GAAG;AAAE,oBAAA,OAAO,SAAS;;gBAE1B,IAAI,GAAG,YAAY,MAAM;oBAAE,OAAO,GAAG,CAAC,IAAI;;gBAE1C,IAAI,GAAG,YAAY,SAAS;AAAE,oBAAA,OAAO,GAAG;;AAExC,gBAAA,IAAI,GAAG,EAAE,IAAI,YAAY,SAAS;oBAAE,OAAO,GAAG,CAAC,IAAI;AACnD,gBAAA,OAAO,SAAS;AAClB,YAAA,CAAC,EAAA,CAAA,GAAA,CAViD;AAClD,YAAA,SAAS,EAAE,CAAC,GAAQ,KAA2B;AAC7C,gBAAA,IAAI,CAAC,GAAG;AAAE,oBAAA,OAAO,SAAS;;gBAE1B,IAAI,GAAG,YAAY,MAAM;oBAAE,OAAO,GAAG,CAAC,IAAI;;gBAE1C,IAAI,GAAG,YAAY,SAAS;AAAE,oBAAA,OAAO,GAAG;;AAExC,gBAAA,IAAI,GAAG,EAAE,IAAI,YAAY,SAAS;oBAAE,OAAO,GAAG,CAAC,IAAI;AACnD,gBAAA,OAAO,SAAS;YAClB,CAAC;AACF,SAAA,CAAA,CAAA,CAAC;IAEO,SAAS,GAAG,KAAK,CAA6B,SAAS,CAAC,YAAY,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAC7E,KAAK,EAAE,MAAM;AACb,YAAA,SAAS,EAAE,CAAC,GAAG,KAAa,GAAG,IAAI,SAAS,CAAC,YAAY,EAAE,EAAA,CAAA,GAAA,CAFoB;AAC/E,YAAA,KAAK,EAAE,MAAM;YACb,SAAS,EAAE,CAAC,GAAG,KAAa,GAAG,IAAI,SAAS,CAAC,YAAY,EAAE;AAC5D,SAAA,CAAA,CAAA,CAAC;AAEO,IAAA,QAAQ,GAAG,KAAK,CAA2C,KAAK,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EACvE,KAAK,EAAE,UAAU;AACjB,YAAA,SAAS,EAAE,CAAC,GAAG,KAAc,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,EAAA,CAAA,GAAA,CAFyB;AACzE,YAAA,KAAK,EAAE,UAAU;AACjB,YAAA,SAAS,EAAE,CAAC,GAAG,KAAc,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG;AACjD,SAAA,CAAA,CAAA,CAAC;AAEO,IAAA,IAAI,GAAG,KAAK,CAAkF,MAAM,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,MAAA,EAC3G,KAAK,EAAE,MAAM;YACb,SAAS,EAAE,CAAC,GAAG,KAAoC,GAAG,IAAI,MAAM,EAAA,CAAA,GAAA,CAF6C;AAC7G,YAAA,KAAK,EAAE,MAAM;YACb,SAAS,EAAE,CAAC,GAAG,KAAoC,GAAG,IAAI,MAAM;AACjE,SAAA,CAAA,CAAA,CAAC;AAEO,IAAA,UAAU,GAAG,KAAK,CAAqB,SAAS,8CAAI,KAAK,EAAE,YAAY,EAAA,CAAA,GAAA,CAArB,EAAE,KAAK,EAAE,YAAY,EAAE,GAAC;AAE1E,IAAA,GAAG,GAAG,KAAK,CAAoC,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,KAAA,EACxD,KAAK,EAAE,KAAK;YACZ,SAAS,EAAE,CAAC,GAAG,KAAa,GAAG,IAAI,EAAE,EAAA,CAAA,GAAA,CAFqB;AAC1D,YAAA,KAAK,EAAE,KAAK;YACZ,SAAS,EAAE,CAAC,GAAG,KAAa,GAAG,IAAI,EAAE;AACtC,SAAA,CAAA,CAAA,CAAC;AAEO,IAAA,UAAU,GAAG,KAAK,CAAoC,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,YAAA,EAC9D,KAAK,EAAE,YAAY;YACnB,SAAS,EAAE,CAAC,GAAG,KAAa,GAAG,IAAI,CAAC,EAAA,CAAA,GAAA,CAF4B;AAChE,YAAA,KAAK,EAAE,YAAY;YACnB,SAAS,EAAE,CAAC,GAAG,KAAa,GAAG,IAAI,CAAC;AACrC,SAAA,CAAA,CAAA,CAAC;AAEO,IAAA,UAAU,GAAG,KAAK,CAAwC,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,YAAA,EACnE,KAAK,EAAE,YAAY;AACnB,YAAA,SAAS,EAAE,CAAC,GAAG,KAAe,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAA,CAAA,GAAA,CAFa;AACrE,YAAA,KAAK,EAAE,YAAY;AACnB,YAAA,SAAS,EAAE,CAAC,GAAG,KAAe,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE;AACzD,SAAA,CAAA,CAAA,CAAC;AAEO,IAAA,QAAQ,GAAG,KAAK,CAA2C,KAAK,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EACvE,KAAK,EAAE,UAAU;AACjB,YAAA,SAAS,EAAE,CAAC,GAAG,KAAc,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,EAAA,CAAA,GAAA,CAFyB;AACzE,YAAA,KAAK,EAAE,UAAU;AACjB,YAAA,SAAS,EAAE,CAAC,GAAG,KAAc,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG;AACjD,SAAA,CAAA,CAAA,CAAC;;AAGO,IAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAK;AAC5C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;AAC/B,QAAA,IAAI,IAAI;AAAE,YAAA,OAAO,IAAI;AACrB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;AAC9B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE;AAC5B,QAAA,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK,EAAE;YACxB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,iDAAiD,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACnH;AAAO,aAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACtB,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,wCAAwC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1F;aAAO,IAAI,KAAK,EAAE;AAChB,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,0CAA0C,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACrF;AACA,QAAA,OAAO,SAAS;AAClB,IAAA,CAAC,gEAAC;;IAGO,MAAM,GAAG,MAAM,EAAiB;IAChC,YAAY,GAAG,MAAM,EAAqB;;AAG1C,IAAA,KAAK,GAAG,KAAK,CAAsB,EAAE,iDAAC;IACtC,cAAc,GAAGA,uBAAuB,CAAmB;QAClE,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,IAAI,CAAC,SAAS;QACpB,OAAO,EAAE,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC;AAC1C,KAAA,CAAC;AAEF,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,mCAAmC,EAAE;;QAG1C,eAAe,CAAC,MAAK;;AAEnB,YAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;gBAC3B,IAAI,CAAC,mBAAmB,EAAE;YAC5B;AACF,QAAA,CAAC,CAAC;;QAGF,MAAM,CAAC,MAAK;YACV,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;AACjC,YAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC;AAEjC,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;gBACzB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,IAAG;AACxC,oBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC;oBACnC,IAAI,CAAC,YAAY,CAAC,IAAI,CACpB,IAAI,CAAC,YAAY;AACd,yBAAA,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG;yBACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAsB,CAC7C;oBACD,IAAI,CAAC,QAAQ,EAAE;AACjB,gBAAA,CAAC,CAAC;YACJ;iBAAO;AACL,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B;AACF,QAAA,CAAC,CAAC;;QAGF,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;AACnB,gBAAA,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;YAC5B;iBAAO;AACL,gBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;YAC3B;AACF,QAAA,CAAC,CAAC;;;;;QAMF,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;gBACnB,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,UAAU,CAAC,QAAQ,CAAC;YACrD;iBAAO;AACL,gBAAA,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE;YACpC;YACA,IAAI,CAAC,WAAW,CAAC,sBAAsB,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC/D,QAAA,CAAC,CAAC;;AAGF,QAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAK;YAC9B,IAAI,CAAC,sBAAsB,EAAE;AAC/B,QAAA,CAAC,CAAC;IACJ;;IAGA,mBAAmB,GAAA;AACjB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE;AACnC,QAAA,IAAI,OAAO,EAAE,MAAM,GAAG,CAAC,EAAE;YACvB,MAAM,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa;AAC9C,YAAA,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC;QACrC;IACF;AAEA,IAAA,eAAe,CAAC,aAA0B,EAAA;QACxC,aAAa,CAAC,gBAAgB,CAAC,UAAU,EAAE,CAAC,GAAU,KAAI;YACxD,GAAG,CAAC,cAAc,EAAE;AACnB,YAAA,aAAqB,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;AAC1C,YAAA,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,gBAAgB;AAC/C,QAAA,CAAC,CAAC;QACF,aAAa,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,GAAU,KAAI;YACzD,GAAG,CAAC,cAAc,EAAE;AACtB,QAAA,CAAC,CAAC;AACF,QAAA,aAAa,CAAC,gBAAgB,CAAC,WAAW,EAAE,MAAK;AAC9C,YAAA,aAAqB,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;AAC1C,YAAA,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,iBAAiB;AAChD,QAAA,CAAC,CAAC;QACF,aAAa,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,GAAc,KAAI;YAC9D,GAAG,CAAC,cAAc,EAAE;AACnB,YAAA,aAAqB,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG;AAC1C,YAAA,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,iBAAiB;YAC9C,MAAM,KAAK,GAAW,EAAE;YACxB,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE,EAAE;AAChD,gBAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YAClB;AACA,YAAA,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC/B,QAAA,CAAC,CAAC;IACJ;;IAGA,MAAM,GAAG,MAAK;AACZ,QAAA,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE;AAChC,QAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;AAC/C,IAAA,CAAC;IAED,kBAAkB,GAAG,MAAmC;AACtD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc;QAClC,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,EAAE;QACX;AACA,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC;AAClD,IAAA,CAAC;IAED,mCAAmC,GAAG,MAAW;AAC/C,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,EAAE;AAChD,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE;YAC1B;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU;AAC9B,QAAA,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE;AAC1C,YAAA,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG;AAC7B,YAAA,MAAM,aAAa,GAAG,GAAG,KAAK,SAAS,GAAG,eAAe,GAAG,GAAG;AAC/D,YAAA,IAAI,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE;AAC3B,gBAAA,MAAM,KAAK,GAAG,GAAG,KAAK,SAAS,GAAG,WAAW,GAAG,GAAG;AACnD,gBAAA,MAAM,IAAI,KAAK,CAAC,iEAAiE,KAAK,CAAA,CAAE,CAAC;YAC3F;AACA,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;QACzB;AACF,IAAA,CAAC;IAED,yBAAyB,GAAG,MAA6C;AACvE,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,EAAE;AAChD,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE;AAC1B,YAAA,OAAO,SAAS;QAClB;AACA,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AACtB,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,GAAG,KAAK,GAAG,CAAC;AACxE,IAAA,CAAC;IAED,iBAAiB,GAAG,MAA8C;QAChE,OAAO,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,yBAAyB,EAAE,EAAE,MAAM;AACvE,IAAA,CAAC;IAED,kBAAkB,GAAG,MAA+C;QAClE,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,yBAAyB,EAAE,EAAE,OAAO;AACpE,IAAA,CAAC;IAED,mBAAmB,GAAG,MAAgD;QACpE,OAAO,IAAI,CAAC,aAAa,EAAE,IAAI,IAAI,CAAC,yBAAyB,EAAE,EAAE,QAAQ;AAC3E,IAAA,CAAC;AAED,IAAA,SAAS,GAAG,OAAO,IAAU,KAA4B;AACvD,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,OAAO,EAAE;AAC3B,YAAA,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE;AACvC,gBAAA,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,sCAAsC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;YAClF;QACF;AACA,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;AAC9B,QAAA,IAAI,IAAI,EAAE,MAAM,EAAE;YAChB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;AAC1C,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,GAAG,CAAC,CAAC;YAClD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,SAAS,CAAC,WAAW,EAAE,CAAC,EAAE;gBAChE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,2CAA2C,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9G;QACF;AACA,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE;QAC5B,IAAI,KAAK,EAAE;YACT,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;gBACnC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,0CAA0C,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YACtG;QACF;QACA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,OAAO,KAAK,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC,EAAE;YAC7F,MAAM,OAAO,GAAkB,MAAM,IAAI,OAAO,CAAC,OAAO,IAAG;gBACzD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,SAAS;AAC1C,gBAAA,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE;AACvB,gBAAA,GAAG,CAAC,MAAM,GAAG,MAAK;AAChB,oBAAA,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC1B,oBAAA,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE;AAC3B,oBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE;oBACpC,IAAI,EAAE,IAAI,GAAG,CAAC,KAAK,GAAG,EAAE,EAAE;wBACxB,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,CAAA,kBAAA,EAAqB,EAAE,CAAA,EAAA,CAAI,CAAC;wBACjD;oBACF;oBACA,IAAI,EAAE,IAAI,GAAG,CAAC,MAAM,GAAG,EAAE,EAAE;wBACzB,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,CAAA,mBAAA,EAAsB,EAAE,CAAA,EAAA,CAAI,CAAC;wBAClD;oBACF;oBACA,IAAI,MAAM,EAAE;AACV,wBAAA,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;wBACpB;oBACF;oBACA,OAAO,CAAC,IAAI,CAAC;AACf,gBAAA,CAAC;gBACD,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;AACrC,YAAA,CAAC,CAAC;YACF,IAAI,OAAO,EAAE;AACX,gBAAA,OAAO,OAAO;YAChB;QACF;AACA,QAAA,OAAO,IAAI;AACb,IAAA,CAAC;IAED,QAAQ,GAAG,MAAK;AACd,QAAA,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE;AACjE,YAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE;AAC/B,YAAA,MAAM,CAAC,MAAM,GAAG,GAAG,IAAG;gBACpB,WAAW,CAAC,UAAU,GAAG,GAAG,CAAC,MAAO,CAAC,MAAM;gBAC3C,WAAW,CAAC,cAAc,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,WAAW,CAAC,IAAI,EAAE,IAAI,KAAK,YAAY;;AAExH,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;AACjD,YAAA,CAAC;AACD,YAAA,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,IAAK,CAAC;QACzC;AACF,IAAA,CAAC;;IAGD,QAAQ,GAAG,MAAK;QACd,gBAAgB,CAAC,MAAM,CAAC;AACtB,YAAA,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE;AAC3B,YAAA,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;AAC7B,YAAA,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC;SACzB;AACE,aAAA,IAAI,CAAC,OAAM,MAAM,KAAG;YACnB,IAAI,MAAM,EAAE;AACV,gBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AACzB,oBAAA,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;gBAChC;qBAAO;oBACL,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;gBAClC;YACF;AACF,QAAA,CAAC;aACA,KAAK,CAAC,KAAK,IAAG;AACb,YAAA,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;AACpB,YAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,0CAA0C,CAAC,CAAC;AACvG,QAAA,CAAC,CAAC;AACN,IAAA,CAAC;AAED,IAAA,WAAW,GAAG,OAAO,WAAmB,KAAI;AAC1C,QAAA,MAAM,YAAY,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9C,QAAA,IAAI,WAAW,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE;AACzD,YAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,2CAA2C,CAAC,CAAC;YACtF;QACF;AACA,QAAA,KAAK,IAAI,IAAI,IAAI,WAAW,EAAE;YAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY;AACjF,YAAA,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;gBAC7C,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAK,CAAC;YAClC;YACA,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAK,CAAC;YAC3C,IAAI,OAAO,EAAE;AACX,gBAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC;gBACpC;YACF;YACA,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;YACnD,IAAI,SAAS,EAAE;AACb,gBAAA,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;YAC9B;QACF;AACA,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;QAC5B,IAAI,CAAC,MAAM,EAAE;AACf,IAAA,CAAC;AAED,IAAA,QAAQ,GAAG,CAAC,IAAiB,KAAI;AAC/B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE;QACjC,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;AAC/B,QAAA,IAAI,GAAG,IAAI,CAAC,EAAE;AACZ,YAAA,IAAI,CAAC;iBACF,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,mDAAmD,CAAC,EAAE;gBAC1E,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,iDAAiD,CAAC;gBACtE,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,wCAAwC,CAAC;gBAChE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,uCAAuC,CAAC;AAC9D,gBAAA,cAAc,EAAE,SAAS;AACzB,gBAAA,aAAa,EAAE,SAAS;aACzB;iBACA,IAAI,CAAC,MAAK;AACT,gBAAA,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC;AAC1B,gBAAA,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;AACtB,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC;AAC9B,gBAAA,MAAM,YAAY,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9C,gBAAA,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;AAC3B,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;gBAC5B,IAAI,CAAC,YAAY,CAAC,IAAI,CACpB,IAAI,CAAC,YAAY;AACd,qBAAA,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG;qBACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAsB,CAC7C;gBACD,IAAI,CAAC,MAAM,EAAE;AACf,YAAA,CAAC,CAAC;QACN;AACF,IAAA,CAAC;AAED,IAAA,MAAM,GAAG,CAAC,KAA4B,KAAI;AACxC,QAAA,MAAM,YAAY,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,eAAe,CAAC,YAAY,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,CAAC;AACtE,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;QAC5B,IAAI,CAAC,MAAM,EAAE;AACf,IAAA,CAAC;AAED,IAAA,UAAU,GAAG,CAAC,WAAwB,KAAI;AACxC,QAAA,WAAW,CAAC,UAAU,GAAG,IAAI;AAC7B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;AACjD,IAAA,CAAC;AAED,IAAA,QAAQ,GAAG,CAAC,IAAiB,KAAI;AAC/B,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;YAC3B;QACF;QACA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AACnE,IAAA,CAAC;;AAGD,IAAA,OAAO,GAAG,OAAO,IAAU,KAAmB;AAC5C,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE;AACxB,YAAA,OAAO,IAAI;QACb;QACA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;AAC1C,QAAA,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE;AAClB,YAAA,OAAO,IAAI;QACb;QACA,OAAO,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;YAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,SAAS;AAC1C,YAAA,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE;AACvB,YAAA,GAAG,CAAC,MAAM,GAAG,MAAK;AAChB,gBAAA,IAAI;AACF,oBAAA,IAAI,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,EAAG,EAAE;AAClD,wBAAA,OAAO,OAAO,CAAC,IAAI,CAAC;oBACtB;oBACA,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;oBAChD,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC;oBACzC,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;oBACrC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAG,CAAC;AAClF,oBAAA,OAAO,CAAC,KAAK,GAAG,KAAK;AACrB,oBAAA,OAAO,CAAC,MAAM,GAAG,MAAM;oBAEvB,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;oBAChD,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC;oBACzC,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;AACrC,oBAAA,OAAO,CAAC,KAAK,GAAG,KAAK;AACrB,oBAAA,OAAO,CAAC,MAAM,GAAG,MAAM;AACvB,oBAAA,IAAK,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC;oBACzD,IAAK,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,KAAK,GAAG,GAAG,EAAE,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC;AACzE,oBAAA,IAAK,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,KAAK,GAAG,GAAG,EAAE,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC;AAC9G,oBAAA,OAAO,CAAC,MAAM,CAAC,IAAI,IAAG;wBACpB,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,IAAK,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA,IAAA,CAAM,CAAC,CAAC;AAC5E,oBAAA,CAAC,CAAC;gBACJ;gBAAE,OAAO,GAAG,EAAE;oBACZ,MAAM,CAAC,GAAG,CAAC;gBACb;wBAAU;oBACR,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE;oBAChD,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE;gBAClD;AACF,YAAA,CAAC;YACD,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;AACrC,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;IAED,MAAM,GAAG,CAAC,KAAa,EAAE,MAAc,EAAE,aAAqB,KAAI;QAChE,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE;AACvC,YAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE;QAC1B;AACA,QAAA,MAAM,KAAK,GAAG,KAAK,GAAG,MAAM;AAC5B,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;YAC9B,KAAK,IAAI,CAAC;YACV,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AAClC,YAAA,IAAI,KAAK,GAAG,MAAM,IAAI,aAAa,EAAE;gBACnC;YACF;QACF;AACA,QAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE;AAC1B,IAAA,CAAC;AAED,IAAA,WAAW,GAAG,CAAC,IAAU,EAAE,QAAgB,KAAU;QACnD,MAAM,IAAI,GAAQ,IAAI;AACtB,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,IAAI,EAAE;AAClC,QAAA,IAAI,CAAC,IAAI,GAAG,QAAQ;AACpB,QAAA,OAAO,IAAY;AACrB,IAAA,CAAC;;AAGD;;AAEG;IACH,QAAQ,GAAG,YAAW;AACpB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE;QAC7D,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC;AACvD,IAAA,CAAC;AAED;;;AAGG;IACH,MAAM,GAAG,YAAW;AAClB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE;QAC7D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACzB,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB;QACF;QACA,MAAM,OAAO,GAAwB,EAAE;QACvC,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC;QACpE,IAAI,QAAQ,GAAa,EAAE;AAC3B,QAAA,IAAI,aAAa,CAAC,MAAM,EAAE;AACxB,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,iBAAiB,EAAE;YAC9C,IAAI,aAAa,EAAE;AACjB,gBAAA,QAAQ,GAAG,MAAM,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,IAAG;AACxE,oBAAA,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE;AACxC,wBAAA,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC;oBAC9C;AACA,oBAAA,OAAO,OAAO;AAChB,gBAAA,CAAC,CAAC;YACJ;iBAAO;AACL,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AACtB,gBAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CACvB,GAAG,KAAK;sBACJ,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,6CAA6C;AAC5D,sBAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,iDAAiD,EAAE,EAAE,GAAG,EAAE,CAAC,CAC7E;YACH;QACF;QACA,IAAI,GAAG,GAAG,CAAC;AACX,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;AACd,gBAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,oBAAA,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;gBAC5B;YACF;iBAAO;AACL,gBAAA,IAAI,QAAQ,GAAG,GAAG,CAAC,EAAE;oBACnB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC3B,oBAAA,GAAG,EAAE;gBACP;YACF;QACF;AACA,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC;AACzB,IAAA,CAAC;AAED;;AAEG;IACH,OAAO,GAAG,YAAW;QACnB,IAAI,CAAC,oBAAoB,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;AACxD,IAAA,CAAC;AAED;;;;;;;;;;;AAWG;AACH,IAAA,UAAU,GAAG,CAAC,WAAwB,KAAI;AACxC,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,mBAAmB,EAAE;;AAGlD,QAAA,IAAI,eAAe,IAAI,WAAW,CAAC,OAAO,EAAE;YAC1C,eAAe,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;YACjD;QACF;;QAGA,IAAI,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,GAAG,EAAE;AACvC,YAAA,gBAAgB,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAK,IAAI,WAAW,CAAC,GAAI,EAAE,WAAW,CAAC,QAAQ,CAAC;YACtF;QACF;AAEA,QAAA,OAAO,CAAC,KAAK,CAAC,yDAAyD,EAAE,WAAW,CAAC;AACvF,IAAA,CAAC;AAED,IAAA,oBAAoB,CAAC,SAAiB,EAAA;QACpC,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,IAAI,SAAS,KAAK,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;IAC3H;;AAGA;;;AAGG;AACH,IAAA,QAAQ,GAAG,OAAO,IAAyB,KAAI;AAC7C,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AACxC,YAAA,OAAO,EAAE;QACX;AACA,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAwB;QACjH,IAAI,WAAW,GAAyB,EAAE;AAC1C,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,EAAE;AAChD,QAAA,IAAI,QAAQ,CAAC,MAAM,IAAI,cAAc,EAAE;AACrC,YAAA,WAAW,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,IAAG;AACtE,gBAAA,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;AACpB,gBAAA,OAAO,EAAE;AACX,YAAA,CAAC,CAAC;QACJ;QACA,MAAM,OAAO,GAAkB,EAAE;AACjC,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE;AAC3C,YAAA,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;AACpB,gBAAA,MAAM,GAAG,GAAG,GAAG,EAAE,QAAQ,EAAE;gBAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AACzC,gBAAA,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC;gBACpE,OAAO,CAAC,IAAI,CAAC;AACX,oBAAA,OAAO,EAAE,GAAG;AACZ,oBAAA,QAAQ,EAAE,GAAG;AACb,oBAAA,IAAI,EAAE,IAAI;AACV,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,GAAG,EAAE,GAAG;oBACR,cAAc;oBACd,SAAS;AACV,iBAAA,CAAC;YACJ;AAAO,iBAAA,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE;AACjC,gBAAA,MAAM,SAAS,GAAG,GAAG,EAAE,QAAQ,EAAE;gBACjC,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAE;gBACpD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;AAC1C,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,GAAG,CAAC,CAAC;AAClD,gBAAA,MAAM,cAAc,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,KAAK,OAAO,CAAC,SAAS,CAAC;gBAChH,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI;oBACJ,cAAc;AACd,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,GAAG,EAAE,IAAI;oBACT,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,SAAS;AACV,iBAAA,CAAC;YACJ;iBAAO;AACL,gBAAA,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,GAAG,CAAC;gBACvD,IAAI,MAAM,EAAE;oBACV,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM;AAC3C,oBAAA,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AACzF,oBAAA,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC;oBACpE,OAAO,CAAC,IAAI,CAAC;wBACX,OAAO,EAAE,OAAO,IAAI,GAAG;AACvB,wBAAA,QAAQ,EAAE,IAAI;AACd,wBAAA,QAAQ,EAAE,IAAI;AACd,wBAAA,IAAI,EAAE,IAAI;AACV,wBAAA,UAAU,EAAE,IAAI;AAChB,wBAAA,GAAG,EAAE,GAAG;wBACR,cAAc;wBACd,SAAS;AACV,qBAAA,CAAC;gBACJ;YACF;QACF;AACA,QAAA,OAAO,OAAO;AAChB,IAAA,CAAC;;AAGD,IAAA,MAAM,GAAG,CAAC,OAAwB,KAAI;QACpC,IAAI,OAAO,OAAO,KAAK,QAAQ;AAAE,YAAA,OAAO,KAAK;AAC7C,QAAA,OAAO,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;AACnC,IAAA,CAAC;AAED,IAAA,YAAY,GAAG,CAAC,OAAwB,KAAI;QAC1C,IAAI,OAAO,OAAO,KAAK,QAAQ;AAAE,YAAA,OAAO,KAAK;QAC7C,OAAO,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,OAAO,CAAC;AACrD,IAAA,CAAC;AAED,IAAA,aAAa,GAAG,CAAC,GAAuB,KAAI;AAC1C,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,SAAS;AAC1B,QAAA,MAAM,OAAO,GAAG,GAAG,EAAE,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,OAAO,EAAE,WAAW,GAAG,GAAG,CAAC;AAC3C,QAAA,IAAI,OAAO,GAAG,CAAC,EAAE;YACf,OAAO,OAAO,CAAC,SAAS,CAAC,OAAO,GAAG,CAAC,CAAC;QACvC;AACA,QAAA,OAAO,SAAS;AAClB,IAAA,CAAC;AAED;;;AAGG;IACH,sBAAsB,GAAG,MAAW;AAClC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE;QACjC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM;YAAE;AAC7C,QAAA,KAAK,CAAC,OAAO,CAAC,CAAC,IAAG;AAChB,YAAA,IAAI,OAAO,CAAC,EAAE,UAAU,KAAK,QAAQ,IAAI,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE;AAC1E,gBAAA,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC;YACnC;AACA,YAAA,IAAI,OAAO,CAAC,EAAE,GAAG,KAAK,QAAQ,IAAI,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE;AAC5D,gBAAA,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC;YAC5B;AACF,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;wGAjtBU,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAZ,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,aAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAqCY,mBAAmB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,sBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAFZ,gBAAgB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClG5D,u2LAwHA,EAAA,MAAA,EAAA,CAAA,4yscAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDtEI,MAAM,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,KAAA,EAAA,SAAA,EAAA,MAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACN,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,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,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,wBAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,IAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,4BAAA,EAAA,2BAAA,EAAA,0BAAA,EAAA,+BAAA,EAAA,2BAAA,EAAA,6BAAA,EAAA,sBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,yBAAA,EAAA,iBAAA,EAAA,0BAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACd,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACP,gBAAgB,EAAA,QAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAIhB,kBAAkB,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAHlB,eAAe,EAAA,IAAA,EAAA,aAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACf,kBAAkB,EAAA,IAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAClB,kBAAkB,EAAA,IAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAElB,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAGJ,YAAY,EAAA,UAAA,EAAA,CAAA;kBAnBxB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EAAA,eAAA,EAGT,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACP,MAAM;wBACN,YAAY;wBACZ,eAAe;wBACf,cAAc;wBACd,OAAO;wBACP,gBAAgB;wBAChB,eAAe;wBACf,kBAAkB;wBAClB,kBAAkB;wBAClB,kBAAkB;wBAClB,aAAa;AACd,qBAAA,EAAA,QAAA,EAAA,u2LAAA,EAAA,MAAA,EAAA,CAAA,4yscAAA,CAAA,EAAA;gIAqCyC,gBAAgB,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CACT,aAAa,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAC3B,mBAAmB,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,GAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,KAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,eAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,GAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,KAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,cAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEpGxD;;AAEG;;;;"}