UNPKG

@openmeteo/file-reader

Version:

JavaScript reader for the om file format using WebAssembly

1 lines 99.9 kB
{"version":3,"file":"index.browser.cjs","sources":["../../src/lib/types.ts","../../src/lib/utils.ts","../../src/lib/wasm.ts","../../src/lib/OmFileReader.ts","../../src/lib/backends/FileBackend.ts","../../src/lib/backends/MemoryHttpBackend.ts","../../src/lib/BlockCache.ts","../../src/lib/backends/BlockCacheBackend.ts","../../src/lib/backends/OmHttpBackend.ts"],"sourcesContent":["export interface Range {\n  start: number;\n  end: number;\n}\n\nexport interface OffsetSize {\n  offset: number;\n  size: number;\n}\n\nexport enum CompressionType {\n  /// Lossy compression using 2D delta coding and scale-factor.\n  /// Only supports float and scales to 16-bit signed integer.\n  PforDelta2dInt16 = 0,\n  /// Lossless float/double compression using 2D xor coding.\n  FpxXor2d = 1,\n  /// PFor integer compression.\n  /// f32 values are scaled to u32, f64 are scaled to u64.\n  PforDelta2d = 2,\n  /// Similar to `PforDelta2dInt16` but applies `log10(1+x)` before.\n  PforDelta2dInt16Logarithmic = 3,\n  None = 4,\n}\n\nexport enum OmDataType {\n  None = 0,\n  Int8 = 1,\n  Uint8 = 2,\n  Int16 = 3,\n  Uint16 = 4,\n  Int32 = 5,\n  Uint32 = 6,\n  Int64 = 7,\n  Uint64 = 8,\n  Float = 9,\n  Double = 10,\n  String = 11,\n  Int8Array = 12,\n  Uint8Array = 13,\n  Int16Array = 14,\n  Uint16Array = 15,\n  Int32Array = 16,\n  Uint32Array = 17,\n  Int64Array = 18,\n  Uint64Array = 19,\n  FloatArray = 20,\n  DoubleArray = 21,\n  StringArray = 22,\n}\n\nexport type TypedArray =\n  | Int8Array\n  | Uint8Array\n  | Int16Array\n  | Uint16Array\n  | Int32Array\n  | Uint32Array\n  | Float32Array\n  | Float64Array\n  | BigInt64Array\n  | BigUint64Array;\n","/**\n * FNV-1a 64-bit hash implementation\n */\nexport function fnv1aHash64(str: string): bigint {\n  const FNV_OFFSET_BASIS = 0xcbf29ce484222325n;\n  const FNV_PRIME = 0x100000001b3n;\n\n  let hash = FNV_OFFSET_BASIS;\n  const bytes = new TextEncoder().encode(str);\n\n  for (const byte of bytes) {\n    hash ^= BigInt(byte);\n    hash = (hash * FNV_PRIME) & 0xffffffffffffffffn;\n  }\n\n  return hash;\n}\n\n/**\n * Fetch with exponential backoff retry on server-side errors (HTTP 5xx) and per-attempt timeout.\n */\nexport async function fetchRetry(\n  input: RequestInfo,\n  init?: RequestInit,\n  timeoutMs: number = 5000,\n  retries: number = 3\n): Promise<Response> {\n  let lastError: Error;\n\n  function withTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {\n    return Promise.race([\n      promise,\n      new Promise<T>((_, reject) => setTimeout(() => reject(new Error(`Timeout after ${ms}ms`)), ms)),\n    ]);\n  }\n\n  for (let attempt = 0; attempt < retries; attempt++) {\n    try {\n      const response = await withTimeout(fetch(input, init), timeoutMs);\n      if (response.status >= 500 && response.status < 600) {\n        throw new Error(`Server error: ${response.status}`);\n      }\n      return response;\n    } catch (error) {\n      lastError = error instanceof Error ? error : new Error(String(error));\n      if (attempt < retries - 1) {\n        const delay = Math.min(500 * Math.pow(2, attempt), 5000);\n        console.debug(`Attempt ${attempt + 1} failed, retrying in ${delay}ms: ${lastError.message}`);\n        await new Promise((resolve) => setTimeout(resolve, delay));\n      }\n    }\n  }\n  throw lastError!;\n}\n\nexport async function runLimited<T>(tasks: (() => Promise<T>)[], limit: number): Promise<T[]> {\n  const results: T[] = new Array(tasks.length);\n\n  for (let i = 0; i < tasks.length; i += limit) {\n    const batch = tasks.slice(i, i + limit);\n    const batchResults = await Promise.all(batch.map((task) => task()));\n\n    for (let j = 0; j < batchResults.length; j++) {\n      results[i + j] = batchResults[j];\n    }\n  }\n\n  return results;\n}\n","export interface WasmModule {\n  _malloc(size: number): number;\n  _free(ptr: number): void;\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  setValue(ptr: number, value: any, type: string): void;\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  getValue(ptr: number, type: string): any;\n  HEAPU8: Uint8Array;\n\n  // C-API functions\n  om_header_size(): number;\n  om_header_type(ptr: number): number;\n  om_trailer_size(): number;\n  om_trailer_read(trailerPtr: number, offsetPtr: number, sizePtr: number): boolean;\n  om_variable_init(dataPtr: number): number;\n  om_variable_get_type(variable: number): number;\n  om_variable_get_compression(variable: number): number;\n  om_variable_get_scale_factor(variable: number): number;\n  om_variable_get_add_offset(variable: number): number;\n  om_variable_get_dimension_count(variable: number): number;\n  om_variable_get_dimension_value(variable: number, index: bigint): number;\n  om_variable_get_chunk_count(variable: number): number;\n  om_variable_get_chunk_value(variable: number, index: bigint): number;\n  om_variable_get_name_count(variable: number): number;\n  om_variable_get_name_ptr(variable: number): number;\n  om_variable_get_children_count(variable: number): number;\n  om_variable_get_children(variable: number, index: number, count: number, offsetPtr: number, sizePtr: number): boolean;\n  om_variable_get_scalar(variable: number, ptrPtr: number, sizePtr: number): number;\n  om_decoder_init(\n    decoderPtr: number,\n    variable: number,\n    nDims: bigint,\n    readOffsetPtr: number,\n    readCountPtr: number,\n    intoCubeOffsetPtr: number,\n    intoCubeDimensionPtr: number,\n    ioSizeMerge: bigint,\n    ioSizeMax: bigint\n  ): number;\n  om_decoder_init_index_read(decoder: number, indexReadPtr: number): void;\n  om_decoder_init_data_read(dataReadPtr: number, indexReadPtr: number): void;\n  om_decoder_read_buffer_size(decoderPtr: number): number;\n  om_decoder_next_index_read(decoder: number, indexRead: number): boolean;\n  om_decoder_next_data_read(\n    decoder: number,\n    dataRead: number,\n    indexData: number,\n    indexCount: bigint,\n    error: number\n  ): boolean;\n  om_decoder_decode_chunks(\n    decoder: number,\n    chunkIndex: number,\n    data: number,\n    count: bigint,\n    output: number,\n    chunkBuffer: number,\n    error: number\n  ): boolean;\n\n  // Constants\n  OM_HEADER_INVALID: number;\n  OM_HEADER_LEGACY: number;\n  OM_HEADER_READ_TRAILER: number;\n  ERROR_OK: number;\n  DATA_TYPE_INT8_ARRAY: number;\n  DATA_TYPE_UINT8_ARRAY: number;\n  DATA_TYPE_INT16_ARRAY: number;\n  DATA_TYPE_UINT16_ARRAY: number;\n  DATA_TYPE_INT32_ARRAY: number;\n  DATA_TYPE_UINT32_ARRAY: number;\n  DATA_TYPE_INT64_ARRAY: number;\n  DATA_TYPE_UINT64_ARRAY: number;\n  DATA_TYPE_FLOAT_ARRAY: number;\n  DATA_TYPE_DOUBLE_ARRAY: number;\n\n  // Additional info\n  sizeof_decoder: number;\n}\n\n// Constants mapping\nconst DATA_TYPES = {\n  DATA_TYPE_NONE: 0,\n  DATA_TYPE_INT8: 1,\n  DATA_TYPE_UINT8: 2,\n  DATA_TYPE_INT16: 3,\n  DATA_TYPE_UINT16: 4,\n  DATA_TYPE_INT32: 5,\n  DATA_TYPE_UINT32: 6,\n  DATA_TYPE_INT64: 7,\n  DATA_TYPE_UINT64: 8,\n  DATA_TYPE_FLOAT: 9,\n  DATA_TYPE_DOUBLE: 10,\n  DATA_TYPE_STRING: 11,\n  DATA_TYPE_INT8_ARRAY: 12,\n  DATA_TYPE_UINT8_ARRAY: 13,\n  DATA_TYPE_INT16_ARRAY: 14,\n  DATA_TYPE_UINT16_ARRAY: 15,\n  DATA_TYPE_INT32_ARRAY: 16,\n  DATA_TYPE_UINT32_ARRAY: 17,\n  DATA_TYPE_INT64_ARRAY: 18,\n  DATA_TYPE_UINT64_ARRAY: 19,\n  DATA_TYPE_FLOAT_ARRAY: 20,\n  DATA_TYPE_DOUBLE_ARRAY: 21,\n  DATA_TYPE_STRING_ARRAY: 22,\n};\n\nconst HEADER_TYPES = {\n  OM_HEADER_INVALID: 0,\n  OM_HEADER_LEGACY: 1,\n  OM_HEADER_READ_TRAILER: 2,\n};\n\nconst ERROR_CODES = {\n  ERROR_OK: 0,\n};\n\n// Size of the decoder structure\nconst SIZEOF_DECODER = 104;\n\nlet wasmModuleWrapped: WasmModule | null = null;\n\nexport async function initWasm(): Promise<WasmModule> {\n  if (wasmModuleWrapped) return wasmModuleWrapped;\n\n  try {\n    // Import the factory function that creates the module\n    // @ts-expect-error module not found\n    const OmFileFormat = await import(\"@openmeteo/file-format-wasm\");\n    // Initialize the module by calling the factory function\n    const wasmModuleRaw = await OmFileFormat.default();\n\n    // Create our wrapped module with the expected interface\n    wasmModuleWrapped = createWrappedModule(wasmModuleRaw);\n\n    return wasmModuleWrapped;\n  } catch (error) {\n    throw new Error(`Failed to initialize WASM module: ${error}`);\n  }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction createWrappedModule(rawModule: any): WasmModule {\n  // Create a wrapper that maps the prefixed function names to our interface\n  return {\n    // Memory management functions\n    _malloc: rawModule._malloc,\n    _free: rawModule._free,\n    setValue: rawModule.setValue,\n    getValue: rawModule.getValue,\n    HEAPU8: rawModule.HEAPU8,\n\n    // Map all the C functions to their prefixed versions\n    om_header_size: rawModule._om_header_size,\n    om_header_type: rawModule._om_header_type,\n    om_trailer_size: rawModule._om_trailer_size,\n    om_trailer_read: rawModule._om_trailer_read,\n    om_variable_init: rawModule._om_variable_init,\n    om_variable_get_type: rawModule._om_variable_get_type,\n    om_variable_get_compression: rawModule._om_variable_get_compression,\n    om_variable_get_scale_factor: rawModule._om_variable_get_scale_factor,\n    om_variable_get_add_offset: rawModule._om_variable_get_add_offset,\n    om_variable_get_dimension_count: rawModule._om_variable_get_dimension_count,\n    om_variable_get_dimension_value: rawModule._om_variable_get_dimension_value,\n    om_variable_get_chunk_count: rawModule._om_variable_get_chunk_count,\n    om_variable_get_chunk_value: rawModule._om_variable_get_chunk_value,\n    om_variable_get_name_count: rawModule._om_variable_get_name_count,\n    om_variable_get_name_ptr: rawModule._om_variable_get_name_ptr,\n    om_variable_get_children_count: rawModule._om_variable_get_children_count,\n    om_variable_get_children: rawModule._om_variable_get_children,\n    om_variable_get_scalar: rawModule._om_variable_get_scalar,\n    om_decoder_init: rawModule._om_decoder_init,\n    om_decoder_init_index_read: rawModule._om_decoder_init_index_read,\n    om_decoder_init_data_read: rawModule._om_decoder_init_data_read,\n    om_decoder_read_buffer_size: rawModule._om_decoder_read_buffer_size,\n    om_decoder_next_index_read: rawModule._om_decoder_next_index_read,\n    om_decoder_next_data_read: rawModule._om_decoder_next_data_read,\n    om_decoder_decode_chunks: rawModule._om_decoder_decode_chunks,\n\n    // Constants\n    ...HEADER_TYPES,\n    ...ERROR_CODES,\n    ...DATA_TYPES,\n\n    // Additional info\n    sizeof_decoder: SIZEOF_DECODER,\n  };\n}\n\nexport function getWasmModule() {\n  if (!wasmModuleWrapped) {\n    throw new Error(\"WASM module not initialized. Call initWasm() first.\");\n  }\n  return wasmModuleWrapped;\n}\n","import { OmFileReaderBackend } from \"./backends/OmFileReaderBackend\";\nimport { OffsetSize, OmDataType, TypedArray, Range } from \"./types\";\nimport { runLimited } from \"./utils\";\nimport { WasmModule, initWasm, getWasmModule } from \"./wasm\";\n\nexport class OmFileReader {\n  private backend: OmFileReaderBackend;\n  private wasm: WasmModule;\n  private variable: number | null;\n  private variableDataPtr: number | null;\n  private metadataCache: Map<string, OffsetSize | null>;\n\n  constructor(backend: OmFileReaderBackend, wasm?: WasmModule) {\n    this.backend = backend;\n    this.wasm = wasm || getWasmModule();\n    this.variable = null;\n    this.variableDataPtr = null;\n    this.metadataCache = new Map();\n  }\n\n  /**\n   * Static factory method to create and initialize an OmFileReader\n   */\n  static async create(backend: OmFileReaderBackend): Promise<OmFileReader> {\n    // Make sure WASM is initialized\n    const wasm = await initWasm();\n    const reader = new OmFileReader(backend, wasm);\n    await reader.initialize();\n    return reader;\n  }\n\n  async initialize(): Promise<OmFileReader> {\n    // Similar to the 'new' method in Rust\n    const headerSize = this.wasm.om_header_size();\n\n    const headerData = await this.backend.getBytes(0, headerSize);\n    const headerPtr = this.wasm._malloc(headerData.length);\n    this.wasm.HEAPU8.set(headerData, headerPtr);\n\n    const headerType = this.wasm.om_header_type(headerPtr);\n\n    if (headerType === this.wasm.OM_HEADER_INVALID) {\n      this.wasm._free(headerPtr);\n      throw new Error(\"Not a valid OM file\");\n    }\n\n    let variableData: Uint8Array;\n\n    if (headerType === this.wasm.OM_HEADER_LEGACY) {\n      variableData = headerData;\n    } else if (headerType === this.wasm.OM_HEADER_READ_TRAILER) {\n      const fileSize = await this.backend.count();\n      const trailerSize = this.wasm.om_trailer_size();\n      const trailerOffset = fileSize - trailerSize;\n\n      const trailerPtr = await this.readDataBlock(trailerOffset, trailerSize);\n\n      // Create pointers for offset and size (out parameters)\n      const offsetPtr = this.wasm._malloc(8); // 64-bit value = 8 bytes\n      const sizePtr = this.wasm._malloc(8);\n\n      const success = this.wasm.om_trailer_read(trailerPtr, offsetPtr, sizePtr);\n\n      if (!success) {\n        this.wasm._free(headerPtr);\n        this.wasm._free(trailerPtr);\n        this.wasm._free(offsetPtr);\n        this.wasm._free(sizePtr);\n        throw new Error(\"Failed to read trailer\");\n      }\n\n      // Read values from memory\n      const offset = Number(this.wasm.getValue(offsetPtr, \"i64\"));\n      const size = Number(this.wasm.getValue(sizePtr, \"i64\"));\n\n      // Free memory\n      this.wasm._free(trailerPtr);\n      this.wasm._free(offsetPtr);\n      this.wasm._free(sizePtr);\n\n      // Get variable data\n      variableData = await this.backend.getBytes(offset, size);\n    } else {\n      this.wasm._free(headerPtr);\n      throw new Error(\"Unknown header type\");\n    }\n\n    // Initialize variable\n    const variableDataPtr = this.wasm._malloc(variableData.length);\n    this.wasm.HEAPU8.set(variableData, variableDataPtr);\n    this.variable = this.wasm.om_variable_init(variableDataPtr);\n    this.variableDataPtr = variableDataPtr;\n\n    this.wasm._free(headerPtr);\n\n    return this;\n  }\n\n  // Helper method to convert C strings to JS strings\n  private _getString(strPtr: number, strLen: number): string {\n    const bytes = this.wasm.HEAPU8.subarray(strPtr, strPtr + strLen);\n    return new TextDecoder(\"utf8\").decode(bytes);\n  }\n\n  dataType(): number {\n    if (this.variable === null) throw new Error(\"Reader not initialized\");\n    return this.wasm.om_variable_get_type(this.variable);\n  }\n\n  compression(): number {\n    if (this.variable === null) throw new Error(\"Reader not initialized\");\n    return this.wasm.om_variable_get_compression(this.variable);\n  }\n\n  scaleFactor(): number {\n    if (this.variable === null) throw new Error(\"Reader not initialized\");\n    return this.wasm.om_variable_get_scale_factor(this.variable);\n  }\n\n  addOffset(): number {\n    if (this.variable === null) throw new Error(\"Reader not initialized\");\n    return this.wasm.om_variable_get_add_offset(this.variable);\n  }\n\n  getDimensions(): number[] {\n    if (this.variable === null) throw new Error(\"Reader not initialized\");\n\n    // Get count using the wrapper function\n    const count = Number(this.wasm.om_variable_get_dimension_count(this.variable));\n\n    // Get each dimension individually\n    const dimensions: number[] = [];\n    for (let i = 0; i < count; i++) {\n      dimensions.push(Number(this.wasm.om_variable_get_dimension_value(this.variable, BigInt(i))));\n    }\n\n    return dimensions;\n  }\n\n  getChunkDimensions(): number[] {\n    if (this.variable === null) throw new Error(\"Reader not initialized\");\n\n    // Get count using the wrapper function\n    const count = Number(this.wasm.om_variable_get_chunk_count(this.variable));\n\n    // Get each chunk dimension individually\n    const chunks: number[] = [];\n    for (let i = 0; i < count; i++) {\n      chunks.push(Number(this.wasm.om_variable_get_chunk_value(this.variable, BigInt(i))));\n    }\n\n    return chunks;\n  }\n\n  getName(): string | null {\n    if (this.variable === null) throw new Error(\"Reader not initialized\");\n\n    const size = this.wasm.om_variable_get_name_count(this.variable);\n    if (size === 0) {\n      return null;\n    }\n\n    const valuePtr = this.wasm.om_variable_get_name_ptr(this.variable);\n    if (valuePtr === 0) {\n      return null;\n    }\n    return this._getString(valuePtr, size);\n  }\n\n  numberOfChildren(): number {\n    if (this.variable === null) throw new Error(\"Reader not initialized\");\n    return this.wasm.om_variable_get_children_count(this.variable);\n  }\n\n  async getChild(index: number): Promise<OmFileReader | null> {\n    if (this.variable === null) throw new Error(\"Reader not initialized\");\n\n    // Allocate memory for the output parameters\n    const offsetPtr = this.wasm._malloc(8);\n    const sizePtr = this.wasm._malloc(8);\n\n    const success = this.wasm.om_variable_get_children(this.variable, index, 1, offsetPtr, sizePtr);\n\n    if (!success) {\n      this.wasm._free(offsetPtr);\n      this.wasm._free(sizePtr);\n      return null;\n    }\n\n    const offset = Number(this.wasm.getValue(offsetPtr, \"i64\"));\n    const size = Number(this.wasm.getValue(sizePtr, \"i64\"));\n\n    this.wasm._free(offsetPtr);\n    this.wasm._free(sizePtr);\n\n    return this.initChildFromOffsetSize({ offset, size });\n  }\n\n  /**\n   * Searches direct children by name. Does not search recursively.\n   */\n  async getChildByName(name: string): Promise<OmFileReader | null> {\n    // Check cache first\n    const cachedMetadata = this.metadataCache.get(name);\n    if (cachedMetadata === null) {\n      return null;\n    }\n    if (cachedMetadata) {\n      return await this.initChildFromOffsetSize(cachedMetadata);\n    }\n\n    // Search through children and cache metadata\n    const numChildren = this.numberOfChildren();\n    for (let i = 0; i < numChildren; i++) {\n      const metadata = this._getChildMetadata(i);\n      if (metadata) {\n        const child = await this.initChildFromOffsetSize(metadata);\n        const childName = child.getName();\n        if (childName) {\n          // Cache the metadata\n          this.metadataCache.set(childName, metadata);\n\n          if (childName === name) {\n            return child;\n          }\n        }\n      }\n    }\n    // also remember invalid names\n    this.metadataCache.set(name, null);\n    return null;\n  }\n\n  async initChildFromOffsetSize(offsetSize: OffsetSize): Promise<OmFileReader> {\n    const childDataPtr = await this.readDataBlock(offsetSize.offset, offsetSize.size);\n\n    const childReader = new OmFileReader(this.backend, this.wasm);\n\n    childReader.variable = this.wasm.om_variable_init(childDataPtr);\n    childReader.variableDataPtr = childDataPtr;\n\n    return childReader;\n  }\n\n  /**\n   * Get child metadata by index.\n   */\n  _getChildMetadata(index: number): OffsetSize | null {\n    if (this.variable === null) throw new Error(\"Reader not initialized\");\n\n    // Allocate memory for the output parameters\n    const offsetPtr = this.wasm._malloc(8);\n    const sizePtr = this.wasm._malloc(8);\n\n    const success = this.wasm.om_variable_get_children(this.variable, index, 1, offsetPtr, sizePtr);\n\n    if (!success) {\n      this.wasm._free(offsetPtr);\n      this.wasm._free(sizePtr);\n      return null;\n    }\n\n    const offset = Number(this.wasm.getValue(offsetPtr, \"i64\"));\n    const size = Number(this.wasm.getValue(sizePtr, \"i64\"));\n\n    this.wasm._free(offsetPtr);\n    this.wasm._free(sizePtr);\n\n    return { offset, size };\n  }\n\n  /**\n   * Find a variable by its path (e.g., \"parent/child/grandchild\")\n   */\n  async findByPath(path: string): Promise<OmFileReader | null> {\n    const parts = path.split(\"/\").filter((s) => s.length > 0);\n    return await this.navigatePath(parts);\n  }\n\n  /**\n   * Navigate through a path recursively\n   */\n  async navigatePath(parts: string[]): Promise<OmFileReader | null> {\n    if (parts.length === 0) {\n      return null;\n    }\n\n    const child = await this.getChildByName(parts[0]);\n    if (child) {\n      if (parts.length === 1) {\n        return child;\n      } else {\n        return await child.navigatePath(parts.slice(1));\n      }\n    }\n    return null;\n  }\n\n  // Method to read scalar values\n  readScalar<T>(dataType: OmDataType): T | null {\n    if (this.variable === null) throw new Error(\"Reader not initialized\");\n\n    if (this.dataType() !== dataType) {\n      return null;\n    }\n\n    // Allocate memory for output parameters\n    const ptrPtr = this.wasm._malloc(4); // pointer to pointer\n    const sizePtr = this.wasm._malloc(8); // u64\n\n    try {\n      const error = this.wasm.om_variable_get_scalar(this.variable, ptrPtr, sizePtr);\n\n      if (error !== this.wasm.ERROR_OK) {\n        return null;\n      }\n\n      const dataPtr = this.wasm.getValue(ptrPtr, \"*\");\n\n      if (dataPtr === 0) {\n        return null;\n      }\n\n      // Read data based on type\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      let result: any;\n\n      switch (dataType) {\n        case OmDataType.Int8:\n          result = this.wasm.getValue(dataPtr, \"i8\");\n          break;\n        case OmDataType.Uint8:\n          result = this.wasm.getValue(dataPtr, \"i8\") & 0xff;\n          break;\n        case OmDataType.Int16:\n          result = this.wasm.getValue(dataPtr, \"i16\");\n          break;\n        case OmDataType.Uint16:\n          result = this.wasm.getValue(dataPtr, \"i16\") & 0xffff;\n          break;\n        case OmDataType.Int32:\n          result = this.wasm.getValue(dataPtr, \"i32\");\n          break;\n        case OmDataType.Uint32:\n          result = this.wasm.getValue(dataPtr, \"i32\") >>> 0;\n          break;\n        case OmDataType.Float:\n          result = this.wasm.getValue(dataPtr, \"float\");\n          break;\n        case OmDataType.Double:\n          result = this.wasm.getValue(dataPtr, \"double\");\n          break;\n        default:\n          result = null;\n      }\n\n      return result as T;\n    } finally {\n      this.wasm._free(ptrPtr);\n      this.wasm._free(sizePtr);\n    }\n  }\n\n  private newIndexRead(decoderPtr: number): number {\n    // Calculate proper size for OmDecoder_indexRead_t\n    const sizeOfRange = 16; // 8 bytes for lowerBound + 8 bytes for upperBound\n    const sizeOfIndexRead = 8 + 8 + sizeOfRange * 3; // offset + count + 3 range structs\n\n    // Allocate and zero the memory\n    const indexReadPtr = this.wasm._malloc(sizeOfIndexRead);\n\n    // Zero out the memory (equivalent to std::mem::zeroed())\n    const zeroBuffer = new Uint8Array(sizeOfIndexRead);\n    this.wasm.HEAPU8.set(zeroBuffer, indexReadPtr);\n\n    // Initialize the structure using C function\n    this.wasm.om_decoder_init_index_read(decoderPtr, indexReadPtr);\n\n    return indexReadPtr;\n  }\n\n  private newDataRead(indexReadPtr: number): number {\n    // Size of OmDecoder_dataRead_t\n    const sizeOfRange = 16; // 8 bytes for lowerBound + 8 bytes for upperBound\n    const sizeOfDataRead = 8 + 8 + sizeOfRange * 3; // offset + count + 3 range structs\n\n    // Allocate and zero the memory\n    const dataReadPtr = this.wasm._malloc(sizeOfDataRead);\n\n    // Zero out the memory (equivalent to std::mem::zeroed())\n    const zeroBuffer = new Uint8Array(sizeOfDataRead);\n    this.wasm.HEAPU8.set(zeroBuffer, dataReadPtr);\n\n    // Initialize the structure using C function\n    this.wasm.om_decoder_init_data_read(dataReadPtr, indexReadPtr);\n\n    return dataReadPtr;\n  }\n\n  async read(\n    dataType: OmDataType,\n    dimRanges: Range[],\n    ioSizeMax: bigint = BigInt(65536),\n    ioSizeMerge: bigint = BigInt(512),\n    prefetch: boolean = true\n  ): Promise<TypedArray> {\n    if (this.variable === null) throw new Error(\"Reader not initialized\");\n\n    if (this.dataType() !== dataType) {\n      throw new Error(`Invalid data type: expected ${this.dataType()}, got ${dataType}`);\n    }\n\n    // Calculate output dimensions\n    const outDims = dimRanges.map((range) => Number(range.end - range.start));\n    const totalSize = outDims.reduce((a, b) => a * b, 1);\n\n    // Create output TypedArray based on data type\n    let output: TypedArray;\n    switch (dataType) {\n      case this.wasm.DATA_TYPE_INT8_ARRAY:\n        output = new Int8Array(totalSize);\n        break;\n      case this.wasm.DATA_TYPE_UINT8_ARRAY:\n        output = new Uint8Array(totalSize);\n        break;\n      case this.wasm.DATA_TYPE_INT16_ARRAY:\n        output = new Int16Array(totalSize);\n        break;\n      case this.wasm.DATA_TYPE_UINT16_ARRAY:\n        output = new Uint16Array(totalSize);\n        break;\n      case this.wasm.DATA_TYPE_INT32_ARRAY:\n        output = new Int32Array(totalSize);\n        break;\n      case this.wasm.DATA_TYPE_UINT32_ARRAY:\n        output = new Uint32Array(totalSize);\n        break;\n      case this.wasm.DATA_TYPE_FLOAT_ARRAY:\n        output = new Float32Array(totalSize);\n        break;\n      case this.wasm.DATA_TYPE_DOUBLE_ARRAY:\n        output = new Float64Array(totalSize);\n        break;\n      default:\n        throw new Error(\"Unsupported data type\");\n    }\n\n    await this.readInto(dataType, output, dimRanges, ioSizeMax, ioSizeMerge, prefetch);\n    return output;\n  }\n\n  /**\n   * Read data into an existing TypedArray with specified dimension ranges\n   * @param dataType The data type to read\n   * @param output The TypedArray to read data into\n   * @param dimRanges Ranges for each dimension to read\n   * @param ioSizeMax Maximum I/O size (default: 65536)\n   * @param ioSizeMerge Merge threshold for I/O operations (default: 512)\n   */\n  async readInto(\n    dataType: OmDataType,\n    output: TypedArray,\n    dimRanges: Range[],\n    ioSizeMax: bigint = BigInt(65536),\n    ioSizeMerge: bigint = BigInt(512),\n    prefetch: boolean = true\n  ): Promise<void> {\n    if (this.variable === null) throw new Error(\"Reader not initialized\");\n\n    if (this.dataType() !== dataType) {\n      throw new Error(`Invalid data type: expected ${this.dataType()}, got ${dataType}`);\n    }\n\n    const nDims = dimRanges.length;\n    const fileDims = this.getDimensions();\n\n    // Validate dimension counts\n    if (fileDims.length !== nDims) {\n      throw new Error(`Mismatched dimensions: file has ${fileDims.length}, request has ${nDims}`);\n    }\n\n    // Calculate output dimensions and prepare arrays for WASM\n    const outDims = dimRanges.map((range) => range.end - range.start);\n\n    // Calculate total elements to ensure output array has correct size\n    const totalElements = outDims.reduce((a, b) => a * Number(b), 1);\n    if (output.length < totalElements) {\n      throw new Error(`Output array is too small: needs ${totalElements} elements, has ${output.length}`);\n    }\n\n    // Allocate memory for arrays\n    const readOffsetPtr = this.wasm._malloc(nDims * 8); // u64 array\n    const readCountPtr = this.wasm._malloc(nDims * 8);\n    const intoCubeOffsetPtr = this.wasm._malloc(nDims * 8);\n    const intoCubeDimensionPtr = this.wasm._malloc(nDims * 8);\n\n    try {\n      // Fill arrays\n      for (let i = 0; i < nDims; i++) {\n        // Validate ranges\n        if (dimRanges[i].start < 0 || dimRanges[i].end > fileDims[i] || dimRanges[i].start >= dimRanges[i].end) {\n          throw new Error(`Invalid range for dimension ${i}: ${JSON.stringify(dimRanges[i])}`);\n        }\n\n        this.wasm.setValue(readOffsetPtr + i * 8, BigInt(dimRanges[i].start), \"i64\");\n        this.wasm.setValue(readCountPtr + i * 8, BigInt(outDims[i]), \"i64\");\n        this.wasm.setValue(intoCubeOffsetPtr + i * 8, BigInt(0), \"i64\");\n        this.wasm.setValue(intoCubeDimensionPtr + i * 8, BigInt(outDims[i]), \"i64\");\n      }\n      // Create decoder\n      const decoderPtr = this.wasm._malloc(this.wasm.sizeof_decoder);\n\n      try {\n        // Initialize decoder\n        const error = this.wasm.om_decoder_init(\n          decoderPtr,\n          this.variable,\n          BigInt(nDims),\n          readOffsetPtr,\n          readCountPtr,\n          intoCubeOffsetPtr,\n          intoCubeDimensionPtr,\n          ioSizeMerge,\n          ioSizeMax\n        );\n\n        if (error !== this.wasm.ERROR_OK) {\n          throw new Error(`Decoder initialization failed: error code ${error}`);\n        }\n        if (prefetch) {\n          await this.decodePrefetch(decoderPtr);\n        }\n        await this.decode(decoderPtr, output);\n      } finally {\n        this.wasm._free(decoderPtr);\n      }\n    } finally {\n      // Clean up input arrays\n      this.wasm._free(readOffsetPtr);\n      this.wasm._free(readCountPtr);\n      this.wasm._free(intoCubeOffsetPtr);\n      this.wasm._free(intoCubeDimensionPtr);\n    }\n  }\n\n  async decodePrefetch(decoderPtr: number): Promise<void> {\n    if (!this.backend.prefetchData) {\n      // Prefetch not supported by backend\n      return;\n    }\n\n    const indexReadPtr = this.newIndexRead(decoderPtr);\n    const errorPtr = this.wasm._malloc(4);\n    this.wasm.setValue(errorPtr, this.wasm.ERROR_OK, \"i32\");\n\n    try {\n      // Loop over index blocks\n      while (this.wasm.om_decoder_next_index_read(decoderPtr, indexReadPtr)) {\n        const indexOffset = Number(this.wasm.getValue(indexReadPtr, \"i64\"));\n        const indexCount = Number(this.wasm.getValue(indexReadPtr + 8, \"i64\"));\n\n        // Get bytes for index-read\n        const indexDataPtr = await this.readDataBlock(indexOffset, indexCount);\n        const dataReadPtr = this.newDataRead(indexReadPtr);\n\n        try {\n          // Collect prefetch tasks\n          const prefetchTasks: (() => Promise<void>)[] = [];\n          while (\n            this.wasm.om_decoder_next_data_read(decoderPtr, dataReadPtr, indexDataPtr, BigInt(indexCount), errorPtr)\n          ) {\n            const dataOffset = Number(this.wasm.getValue(dataReadPtr, \"i64\"));\n            const dataCount = Number(this.wasm.getValue(dataReadPtr + 8, \"i64\"));\n            prefetchTasks.push(() => this.backend.prefetchData(dataOffset, dataCount));\n          }\n\n          // Run prefetches in parallel\n          await runLimited(prefetchTasks, 5000);\n\n          // Check for errors after data_read loop\n          const error = this.wasm.getValue(errorPtr, \"i32\");\n          if (error !== this.wasm.ERROR_OK) {\n            throw new Error(`Data read error: ${error}`);\n          }\n        } finally {\n          this.wasm._free(dataReadPtr);\n          this.wasm._free(indexDataPtr);\n        }\n      }\n    } finally {\n      this.wasm._free(indexReadPtr);\n      this.wasm._free(errorPtr);\n    }\n  }\n\n  private async decode(decoderPtr: number, outputArray: TypedArray): Promise<void> {\n    const outputPtr = this.wasm._malloc(outputArray.byteLength);\n    const chunkBufferSize = Number(this.wasm.om_decoder_read_buffer_size(decoderPtr));\n    const chunkBufferPtr = this.wasm._malloc(chunkBufferSize);\n    // Create index_read struct\n    const indexReadPtr = this.newIndexRead(decoderPtr);\n    const errorPtr = this.wasm._malloc(4);\n    // Initialize error to OK\n    this.wasm.setValue(errorPtr, this.wasm.ERROR_OK, \"i32\");\n\n    try {\n      // Loop over index blocks\n      while (this.wasm.om_decoder_next_index_read(decoderPtr, indexReadPtr)) {\n        // Get index_read parameters\n        const indexOffset = Number(this.wasm.getValue(indexReadPtr, \"i64\"));\n        const indexCount = Number(this.wasm.getValue(indexReadPtr + 8, \"i64\"));\n        // Get bytes for index-read\n        const indexDataPtr = await this.readDataBlock(indexOffset, indexCount);\n        const dataReadPtr = this.newDataRead(indexReadPtr);\n\n        try {\n          // Loop over data blocks and read compressed data chunks\n          while (\n            this.wasm.om_decoder_next_data_read(decoderPtr, dataReadPtr, indexDataPtr, BigInt(indexCount), errorPtr)\n          ) {\n            // Get data_read parameters\n            const dataOffset = Number(this.wasm.getValue(dataReadPtr, \"i64\"));\n            const dataCount = Number(this.wasm.getValue(dataReadPtr + 8, \"i64\"));\n            const chunkIndexPtr = dataReadPtr + 32; // offset(8), count(8), indexRange(16)\n\n            // Get bytes for data-read\n            const dataBlockPtr = await this.readDataBlock(dataOffset, dataCount);\n\n            try {\n              // Decode chunks\n              const success = this.wasm.om_decoder_decode_chunks(\n                decoderPtr,\n                chunkIndexPtr,\n                dataBlockPtr,\n                BigInt(dataCount),\n                outputPtr,\n                chunkBufferPtr,\n                errorPtr\n              );\n\n              // Check for error\n              if (!success) {\n                const error = this.wasm.getValue(errorPtr, \"i32\");\n                throw new Error(`Decoder failed to decode chunks: error ${error}`);\n              }\n            } finally {\n              this.wasm._free(dataBlockPtr);\n            }\n          }\n\n          // Check for errors after data_read loop\n          const error = this.wasm.getValue(errorPtr, \"i32\");\n          if (error !== this.wasm.ERROR_OK) {\n            throw new Error(`Data read error: ${error}`);\n          }\n        } finally {\n          this.wasm._free(dataReadPtr);\n          this.wasm._free(indexDataPtr);\n        }\n      }\n\n      // Copy the data back to the output array with the correct type\n      this.copyToTypedArray(outputPtr, outputArray);\n    } finally {\n      this.wasm._free(errorPtr);\n      this.wasm._free(indexReadPtr);\n      this.wasm._free(chunkBufferPtr);\n      this.wasm._free(outputPtr);\n    }\n  }\n\n  private async readDataBlock(offset: number, size: number): Promise<number> {\n    const data = await this.backend.getBytes(offset, size);\n    const ptr = this.wasm._malloc(data.length);\n    this.wasm.HEAPU8.set(data, ptr);\n    return ptr;\n  }\n\n  /**\n   * Helper method to copy data from WASM memory to a TypedArray with the correct type\n   */\n  private copyToTypedArray(sourcePtr: number, targetArray: TypedArray): void {\n    switch (targetArray.constructor) {\n      case Float32Array:\n        (targetArray as Float32Array).set(new Float32Array(this.wasm.HEAPU8.buffer, sourcePtr, targetArray.length));\n        break;\n      case Float64Array:\n        (targetArray as Float64Array).set(new Float64Array(this.wasm.HEAPU8.buffer, sourcePtr, targetArray.length));\n        break;\n      case Int8Array:\n        (targetArray as Int8Array).set(new Int8Array(this.wasm.HEAPU8.buffer, sourcePtr, targetArray.length));\n        break;\n      case Uint8Array:\n        (targetArray as Uint8Array).set(new Uint8Array(this.wasm.HEAPU8.buffer, sourcePtr, targetArray.length));\n        break;\n      case Int16Array:\n        (targetArray as Int16Array).set(new Int16Array(this.wasm.HEAPU8.buffer, sourcePtr, targetArray.length));\n        break;\n      case Uint16Array:\n        (targetArray as Uint16Array).set(new Uint16Array(this.wasm.HEAPU8.buffer, sourcePtr, targetArray.length));\n        break;\n      case Int32Array:\n        (targetArray as Int32Array).set(new Int32Array(this.wasm.HEAPU8.buffer, sourcePtr, targetArray.length));\n        break;\n      case Uint32Array:\n        (targetArray as Uint32Array).set(new Uint32Array(this.wasm.HEAPU8.buffer, sourcePtr, targetArray.length));\n        break;\n      case BigInt64Array:\n        (targetArray as BigInt64Array).set(new BigInt64Array(this.wasm.HEAPU8.buffer, sourcePtr, targetArray.length));\n        break;\n      case BigUint64Array:\n        (targetArray as BigUint64Array).set(new BigUint64Array(this.wasm.HEAPU8.buffer, sourcePtr, targetArray.length));\n        break;\n      default:\n        throw new Error(\"Unsupported TypedArray type in copyToTypedArray\");\n    }\n  }\n\n  // Clean up resources when done\n  dispose(): void {\n    if (this.variableDataPtr !== null) {\n      this.wasm._free(this.variableDataPtr);\n      this.variableDataPtr = null;\n    }\n    this.variable = null;\n  }\n}\n","import { OmFileReaderBackend } from \"./OmFileReaderBackend\";\n\nexport class FileBackend implements OmFileReaderBackend {\n  private fileObj: File | Blob | null = null;\n  private memory: Uint8Array | null = null;\n  private fileSize: number = 0;\n\n  constructor(source: File | Blob | Uint8Array | ArrayBuffer) {\n    if (typeof File !== \"undefined\" && source instanceof File) {\n      this.fileObj = source;\n      this.fileSize = source.size;\n    } else if (typeof Blob !== \"undefined\" && source instanceof Blob) {\n      this.fileObj = source;\n      this.fileSize = source.size;\n    } else if (source instanceof ArrayBuffer) {\n      this.memory = new Uint8Array(source);\n      this.fileSize = this.memory.length;\n    } else if (source instanceof Uint8Array) {\n      this.memory = source;\n      this.fileSize = source.length;\n    } else {\n      throw new Error(\"Unsupported file source type for browser FileBackend\");\n    }\n  }\n\n  async count(): Promise<number> {\n    return this.fileSize;\n  }\n\n  async getBytes(offset: number, size: number): Promise<Uint8Array> {\n    if (this.memory) {\n      return this.memory.slice(offset, offset + size);\n    }\n    if (this.fileObj) {\n      const blob = this.fileObj.slice(offset, offset + size);\n      const buffer = await blob.arrayBuffer();\n      return new Uint8Array(buffer);\n    }\n    throw new Error(\"No file or memory buffer available\");\n  }\n\n  async prefetchData(_offset: number, _bytes: number): Promise<void> {\n    // No-op for now!\n  }\n\n  async close(): Promise<void> {\n    // Nothing to clean up in browser\n  }\n}\n","import { OmFileReaderBackend } from \"./OmFileReaderBackend\";\n\nexport class MemoryHttpBackend implements OmFileReaderBackend {\n  private url: string;\n  private fileSize: number | null = null;\n  private fileData: Uint8Array | null = null;\n  private loadPromise: Promise<void> | null = null;\n  private countPromise: Promise<number> | null = null;\n  private maxFileSize: number;\n  private onProgress?: (loaded: number, total: number) => void;\n  private debug: boolean;\n\n  /**\n   * Create a new MemoryHttpBackend\n   * @param options Configuration options\n   */\n  constructor(options: {\n    url: string;\n    maxFileSize?: number;\n    onProgress?: (loaded: number, total: number) => void;\n    debug?: boolean;\n  }) {\n    this.url = options.url;\n    this.maxFileSize = options.maxFileSize ?? 200 * 1024 * 1024; // 200 MB default\n    this.onProgress = options.onProgress;\n    this.debug = options.debug ?? false;\n\n    // Start loading the file in the background\n    this.loadFile().catch((err) => {\n      if (this.debug) console.error(\"Background file load failed:\", err);\n    });\n  }\n\n  /**\n   * Get the total size of the file\n   */\n  async count(): Promise<number> {\n    if (this.fileSize !== null) {\n      return this.fileSize;\n    }\n\n    if (!this.countPromise) {\n      if (this.debug) console.log(`Making HEAD request to ${this.url}`);\n\n      this.countPromise = (async () => {\n        try {\n          const response = await fetch(this.url, {\n            method: \"HEAD\",\n          });\n\n          if (!response.ok) {\n            throw new Error(`HTTP error: ${response.status}`);\n          }\n\n          const contentLength = response.headers.get(\"content-length\");\n          if (!contentLength) {\n            throw new Error(\"Content-Length header not available\");\n          }\n\n          this.fileSize = parseInt(contentLength, 10);\n\n          if (this.fileSize > this.maxFileSize) {\n            throw new Error(\n              `File size (${this.fileSize} bytes) exceeds maximum allowed size (${this.maxFileSize} bytes)`\n            );\n          }\n\n          if (this.debug) console.log(`File size: ${this.fileSize} bytes`);\n          return this.fileSize;\n        } catch (error) {\n          this.countPromise = null;\n          throw new Error(`Failed to get file size: ${error instanceof Error ? error.message : String(error)}`);\n        }\n      })();\n    }\n\n    return this.countPromise;\n  }\n\n  /**\n   * Load the entire file into memory\n   */\n  async loadFile(): Promise<void> {\n    // If already loaded or loading, return that promise\n    if (this.fileData) {\n      return Promise.resolve();\n    }\n\n    if (this.loadPromise) {\n      return this.loadPromise;\n    }\n\n    this.loadPromise = (async () => {\n      try {\n        // First get the file size\n        const size = await this.count();\n\n        if (this.debug) console.log(`Fetching entire file (${size} bytes) from ${this.url}`);\n\n        // Use fetch with streaming and progress tracking\n        const response = await fetch(this.url);\n\n        if (!response.ok) {\n          throw new Error(`HTTP error: ${response.status}`);\n        }\n\n        // Check if ReadableStream is supported and if progress tracking is needed\n        if (this.onProgress && response.body && \"getReader\" in response.body) {\n          // Stream the response with progress tracking\n          const contentLength = Number(response.headers.get(\"content-length\") || size);\n          const reader = response.body.getReader();\n          const chunks: Uint8Array[] = [];\n\n          let receivedLength = 0;\n          let lastProgressUpdate = 0;\n\n          while (true) {\n            const { done, value } = await reader.read();\n\n            if (done) {\n              break;\n            }\n\n            chunks.push(value);\n            receivedLength += value.length;\n\n            // Don't update progress too frequently (throttle updates)\n            const now = Date.now();\n            if (now - lastProgressUpdate > 100) {\n              // update every 100ms\n              this.onProgress(receivedLength, contentLength);\n              lastProgressUpdate = now;\n            }\n          }\n\n          // Concatenate chunks into a single Uint8Array\n          this.fileData = new Uint8Array(receivedLength);\n          let position = 0;\n          for (const chunk of chunks) {\n            this.fileData.set(chunk, position);\n            position += chunk.length;\n          }\n\n          // Final progress update\n          this.onProgress(receivedLength, contentLength);\n        } else {\n          // Simple approach without streaming\n          const buffer = await response.arrayBuffer();\n          this.fileData = new Uint8Array(buffer);\n\n          if (this.onProgress) {\n            this.onProgress(this.fileData.length, size);\n          }\n        }\n\n        if (this.debug) console.log(`File loaded successfully (${this.fileData.length} bytes)`);\n        return;\n      } catch (error) {\n        this.loadPromise = null;\n        throw new Error(`Failed to load file: ${error instanceof Error ? error.message : String(error)}`);\n      }\n    })();\n\n    return this.loadPromise;\n  }\n\n  /**\n   * Get bytes from the file\n   * @param offset The starting position in the file\n   * @param size The number of bytes to read\n   */\n  async getBytes(offset: number, size: number): Promise<Uint8Array> {\n    try {\n      // Make sure the file is loaded\n      if (!this.fileData) {\n        if (this.debug) console.log(`getBytes(${offset}, ${size}): Waiting for file to load...`);\n        await this.loadFile();\n        if (this.debug) console.log(`getBytes(${offset}, ${size}): File loaded`);\n      }\n\n      // At this point, fileData should be available\n      if (!this.fileData) {\n        throw new Error(\"File data is not available after load\");\n      }\n\n      // Bounds check\n      if (offset < 0 || offset + size > this.fileData.length) {\n        throw new Error(`Requested range (${offset}:${offset + size}) is out of bounds (0:${this.fileData.length})`);\n      }\n\n      if (this.debug) console.log(`Serving ${size} bytes from offset ${offset} from memory`);\n\n      // Return the requested slice of data\n      return this.fileData.slice(offset, offset + size);\n    } catch (error) {\n      throw new Error(`Error in getBytes: ${error instanceof Error ? error.message : String(error)}`);\n    }\n  }\n\n  /**\n   * Check if the file is fully loaded\n   */\n  isLoaded(): boolean {\n    return !!this.fileData;\n  }\n\n  /**\n   * Get the current loaded data or null if not loaded\n   */\n  getFileData(): Uint8Array | null {\n    return this.fileData;\n  }\n\n  /**\n   * Force a reload of the file\n   */\n  async reload(): Promise<void> {\n    this.fileData = null;\n    this.loadPromise = null;\n    return this.loadFile();\n  }\n\n  async prefetchData(_offset: number, _bytes: number): Promise<void> {\n    // No-op for now!\n  }\n\n  /**\n   * Close the backend and release any resources\n   */\n  async close(): Promise<void> {\n    this.fileData = null;\n    this.loadPromise = null;\n  }\n}\n","type BlockKey = bigint;\n\nexport class BlockCacheCoordinator {\n  private cache: SharedBlockCache;\n\n  // constructor(cache: SharedBlockCache) {\n  //   this.cache = cache;\n  // }\n\n  constructor(blockSize: number, maxBlocks: number) {\n    this.cache = new SharedBlockCache(blockSize, maxBlocks);\n  }\n\n  blockSize(): number {\n    return this.cache.blockSize;\n  }\n\n  maxBlocks(): number {\n    return this.cache.maxBlocks;\n  }\n\n  async get(key: BlockKey, fetchFn: () => Promise<Uint8Array>): Promise<Uint8Array> {\n    const cached = this.cache.get(key);\n    if (cached) return cached;\n\n    let inflight = this.cache.getInflight(key);\n    if (!inflight) {\n      inflight = fetchFn();\n      this.cache.setInflight(key, inflight);\n      inflight.then((data) => this.cache.set(key, data));\n    }\n    return inflight;\n  }\n\n  prefetch(key: BlockKey, fetchFn: () => Promise<Uint8Array>) {\n    if (!this.cache.get(key) && !this.cache.getInflight(key)) {\n      const inflight = fetchFn();\n      this.cache.setInflight(key, inflight);\n      inflight.then((data) => this.cache.set(key, data));\n    }\n  }\n\n  clear() {\n    this.cache.clear();\n  }\n}\n\ninterface BlockEntry {\n  data: Uint8Array;\n  timestamp: number;\n}\n\nexport class SharedBlockCache {\n  blockSize: number;\n  maxBlocks: number;\n  private cache: Map<BlockKey, BlockEntry>;\n  private lru: BlockKey[];\n  private inflight: Map<BlockKey, Promise<Uint8Array>>;\n\n  constructor(blockSize: number, maxBlocks: number) {\n    this.blockSize = blockSize;\n    this.maxBlocks = maxBlocks;\n    this.cache = new Map();\n    this.lru = [];\n    this.inflight = new Map();\n  }\n\n  get(key: BlockKey): Uint8Array | undefined {\n    const entry = this.cache.get(key);\n    if (entry) {\n      entry.timestamp = Date.now();\n      // Move to end of LRU\n      this.lru = this.lru.filter((k) => k !== key);\n      this.lru.push(key);\n      return entry.data;\n    }\n    return undefined;\n  }\n\n  set(key: BlockKey, data: Uint8Array) {\n    if (this.cache.size >= this.maxBlocks) {\n      // Evict LRU\n      const oldestKey = this.lru.shift();\n      if (oldestKey !== undefined) this.cache.delete(oldestKey);\n    }\n    this.cache.set(key, { data, timestamp: Date.now() });\n    this.lru.push(key);\n  }\n\n  getInflight(key: BlockKey): Promise<Uint8Array> | undefined {\n    return this.inflight.get(key);\n  }\n\n  setInflight(key: BlockKey, promise: Promise<Uint8Array>) {\n    this.inflight.set(key, promise);\n    promise.finally(() => this.inflight.delete(key));\n  }\n\n  clear() {\n    this.cache.clear();\n    this.lru = [];\n    this.inflight.clear();\n  }\n}\n","import { BlockCacheCoordinator } from \"../BlockCache\";\nimport { OmFileReaderBackend } from \"./OmFileReaderBackend\";\n\n/**\n * Wraps a backend for caching blocks of data.\n */\nexport class BlockCacheBackend implements OmFileReaderBackend {\n  private backend: OmFileReaderBackend;\n  private cacheCoordinator: BlockCacheCoordinator;\n  private cacheKey: bigint;\n\n  constructor(backend: OmFileReaderBackend, cacheCoordinator: BlockCacheCoordinator, cacheKey: bigint) {\n    this.backend = backend;\n    this.cacheKey = cacheKey;\n    this.cacheCoordinator = cacheCoordinator;\n  }\n\n  async count(): Promise<number> {\n    return this.backend.count();\n  }\n\n  async prefetchData(offset: number, count: number): Promise<void> {\n    const blockSize = this.cacheCoordinator.blockSize();\n    const fileSize = await this.count();\n    const startBlock = Math.floor(offset / blockSize);\n    const endBlock = Math.floor((offset + count - 1) / blockSize);\n\n    for (let blockIdx = startBlock; blockIdx <= endBlock; blockIdx++) {\n      const blockKey = this.cacheKey + BigInt(blockIdx);\n      this.cacheCoordinator.prefetch(blockKey, () =>\n        this.backend.getBytes(blockIdx * blockSize, Math.min(blockSize, fileSize - blockIdx * blockSize))\n      );\n    }\n  }\n\n  async getBytes(offset: number, size: number): Promise<Uint8Array> {\n    const blockSize = this.cacheCoordinator.blockSize();\n    const fileSize = await this.count();\n    const startBlock = Math.floor(offset / blockSize);\n    const endBlock = Math.floor((offset + size - 1) / blockSize);\n\n    const output = new Uint8Array(size);\n\n    // Fetch all blocks in parallel\n    const tasks: (() => Promise<{ blockIdx: number; block: Uint8Array }>)[] = [];\n    for (let blockIdx = startBlock; blockIdx <= endBlock; blockIdx++) {\n      const blockKey = this.cacheKey + BigInt(blockIdx);\n      tasks.push(async () => {\n        const blockStart = blockIdx * blockSize;\n        const blockEnd = Math.min(blockStart + blockSize, fileSize);\n        const block = await this.cacheCoordinator.get(blockKey, () =>\n          this.backend.getBytes(blockStart, blockEnd - blockStart)\n        );\n        return { blockIdx, block };\n      });\n    }\n\n    const fetchedBlocks = await Promise.all(tasks.map((task) => task()));\n\n    const blocks = new Map<number, Uint8Array>();\n    for (const { blockIdx, block } of fetchedBlocks) {\n      blocks.set(blockIdx, block);\n    }\n\n    // Copy relevant parts of each block to output\n    for (let blockIdx = startBlock; blockIdx <= endBlock; blockIdx++) {\n      const block = blocks.get(blockIdx)!;\n      const blockOffset = Math.max(offset, blockIdx * blockSize) - blockIdx * blockSize;\n      const outOffset = Math.max(blockIdx * blockSize, offset) - offset;\n      const copyLen = Math.min(blockSize - blockOffset, size - outOffset);\n\n      output.set(block.subarray(blockOffset, blockOffset + copyLen), outOffset);\n    }\n\n    return output;\n  }\n\n  async close(): Promise<void> {\n    this.cacheCoordinator.clear();\n    await this.backend.close();\n  }\n}\n","import { BlockCacheCoordinator } from \"../BlockCache\";\nimport { OmFileReader } from \"../OmFileReader\";\nimport { fetchRetry, fnv1aHash64 } from \"../utils\";\nimport { BlockCacheBackend } from \"./BlockCacheBackend\";\nimport { OmFileReaderBackend } from \"./OmFileReaderBackend\";\n\nlet globalCache: BlockCacheCoordinator | null = null;\n\nexport function setupGlobalCache(blockSize: number = 64 * 1024, maxBlocks: number = 256) {\n  if (!globalCache) {\n    globalCache = new BlockCacheCoordinator(blockSize, maxBlocks);\n  } else {\n    if (globalCache.blockSize() !== blockSize || globalCache.maxBlocks() !== maxBlocks) {\n      throw new Error(\"Global cache already set up with configuration \" + blockSize + \" \" + maxBlocks);\n    }\n  }\n}\n\nexport interface OmHttpBackendOptions {\n  url: string;\n  debug?: boolean;\n  timeoutMs?: number;\n  retries?: number;\n}\n\nexport class OmHttpBackendError extends Error {\n  constructor(\n    message: string,\n    public readonly statusCode?: number\n  ) {\n    super(message);\n    this.name = \"OmHttpBackendError\";\n  }\n}\n\n/**\n * Backend for reading from HTTP servers with partial read support using Range requests.\n * Checks last modified header and ETag.\n */\nexport class OmHttpBackend implements OmFileReaderBackend {\n  private readonly url: string;\n  private readonly debug: boolean;\n  private readonly timeoutMs: number;\n  private readonly retries: number;\n\n  private fileSize: number | null = null;\n  private lastModified: string | null = null;\n  private eTag: string | null = null;\n  private metadataPromise: Promise<void> | null = null;\n\n  constructor(options: OmHttpBackendOptions) {\n    this.url = options.url;\n    this.debug = options.debug ?? false;\n    this.timeoutMs = options.timeoutMs ?? 30000;\n    this.retries = options.retries ?? 1;\n  }\n\n  /**\n   * Get cache key based on URL, ETag, and Last-Modified\n   */\n  get cacheKey(): bigint {\n    const urlHash = fnv1aHash64(this.url);\n    const eTagHash = this.eTag ? fnv1aHash64(this.eTag) : 0n;\n    const lastModifiedHash = this.lastModified ? fnv1aHash64(this.lastModified) : 0n;\n\n    return urlHash ^ eTagHash ^ lastModifiedHash;\n  }\n\n  /**\n   * Fetch metadata using HEAD request\n   */\n  private async fetchMetadata(): Promise<void> {\n    if (this.metadataPromise) {\n      return this.metadataPromise;\n    }\n\n    this.metadataPromise = (async () => {\n      const response = await fetchRetry(this.url, { method: \"HEAD\" }, this.timeoutMs ?? 5000, this.retries);\n\n      if (!response.ok) {\n        throw new OmHttpBackendError(\n          response.status === 404 ? \"File not found\" : `HTTP error: ${response.status}`,\n          response.status\n        );\n      }\n\n      const contentLength = response.headers.get(\"content-length\");\n      if (!contentLength) throw new OmHttpBackendError(\"Content-Length header missing\");\n\n      this.fileSize = parseInt(contentLength, 10);\n      this.lastModified = response.headers.get(\"last-modified\");\n      this.eTag = response.headers.get(\"etag\");\n    })();\n\n    return this.metadataPromise;\n  }\n\n  /**\n   * Get the total size of the file\n   */\n  async count(): Promise<number> {\n    if (this.fileSize !== null) {\n      return this.fileSize;\n    }\n\n    await this.fetchMetadata();\n    return this.fileSize!;\n  }\n\n  /**\n   * Get bytes from the file using Range requests\n   */\n  async getBytes(offset: number, size: number): Promise<Uint8Array> {\n    if (offset < 0 || size <= 0) {\n      throw new OmHttpBackendError(\"Invalid offset or size\");\n    }\n\n    // Ensure we have metadata\n    await this.fetchMetadata();\n\n    if (offset + size > this.fileSize!) {\n      throw new OmHttpBackendError(`Requested range (${offset}:${offset + size}) exceeds file size (${this.fileSize})`);\n    }\n\n    // Prepare request\n    const headers: Record<string, string> = {\n      Range: `bytes=${offset}-${offset + size - 1}`,\n    };\n    // Add conditional headers for cache validation\n    if (this.lastModified) {\n      headers[\"If-Unmodified-Since\"] = this.lastModified;\n    }\n    if (this.eTag) {\n      headers[\"If-Match\"] = this.eTag;\n    }\n\n    if (this.debug) {\n      console.log(`Getting data range ${offset}-${offset + size - 1} from ${this.url}`);\n    }\n\n    const response = await fetchRetry(this.url, { headers }, this.timeoutMs, this.retries);\n\n    const buffer = await response.arrayBuffer();\n    const data = new Uint8Array(buffer);\n\n    if (data.length !== size) {\n      throw new OmHttpBackendError(`Received ${data.length} bytes, expected ${size}`);\n    }\n    return data;\n  }\n\n  async prefetchData(_offset: number, _bytes: number): Promise<void> {\n    // No-op for now!\n  }\n\n  async asCachedReader(): Promise<OmFileReader> {\n    if (globalCache) {\n      const cachedBackend = new BlockCacheBackend(this, globalCache, this.cacheKey);\n      return await OmFileReader.create(cachedBackend);\n    } else {\n      throw new OmHttpBackendError(\"No global cache set up! Configure it with setupGlobalCache first!\");\n    }\n  }\n\n  /**\n   * Close the backend and release resources\n   */\n  async close(): Promise<void> {\n    this.metadataPromise = null;\n    this.fileSize = null;\n    this.lastModified = null;\n    this.eTag = null;\n  }\n}\n"],"names":["CompressionType","OmDataType"],"mappings":";;AAUYA;AAAZ,CAAA,UAAY,eAAe,EAAA;;;AAGzB,IAAA,eAAA,CAAA,eAAA,CAAA,kBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,kBAAoB;;AAEpB,IAAA,eAAA,CAAA,eAAA,CAAA,UAAA,CAAA,GAAA,CAAA,CAAA,GAAA,UAAY;;;AAGZ,IAAA,eAAA,CAAA,eAAA,CAAA,aAAA,CAAA,GAAA,CAAA,CAAA,GAAA,aAAe;;AAEf,IAAA,eAAA,CAAA,eAAA,CAAA,6BAAA,CAAA,GAAA,CAAA,CAAA,GAAA,6BAA+B;AAC/B,IAAA,eAAA,CAAA,eAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAQ;AACV,CAAC,EAZWA,uBAAe,KAAfA,uBAAe,GAY1B,EAAA,CAAA,CAAA;AAEWC;AAAZ,CAAA,UAAY,UAAU,EAAA;AACpB,IAAA,UAAA,CAAA,UAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAQ;AACR,IAAA,UAAA,CAAA,UAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAQ;AACR,IAAA,UAAA,CAAA,UAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAS;AACT,IAAA,UAAA,CAAA,UAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAS;AACT,IAAA,UAAA,CAAA,UAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAU;AACV,IAAA,UAAA,CAAA,UAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAS;AACT,IAAA,UAAA,CAAA,UAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAU;AACV,IAAA,UAAA,CAAA,UAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAS;AACT,IAAA,UAAA,CAAA,UAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAU;AACV,IAAA,UAAA,CAAA,UAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAS;AACT,IAAA,UAAA,CAAA,UAAA,CAAA,QAAA,CAAA,GAAA,EAAA,CAAA,GAAA,QAAW;AACX,IAAA,UAAA,CAAA,UAAA,CAAA,QAAA,CAAA,GAAA,EAAA,CAAA,GAAA,QAAW;AACX,IAAA,UAAA,CAAA,UAAA,CAAA,WAAA,CAAA,GAAA,EAAA,CAAA,GAAA,WAAc;AACd,IAAA,UAAA,CAAA,UAAA,CAAA,YAAA,CAAA,GAAA,EAAA,CAAA,GAAA,YAAe;AACf,IAAA,UAAA,CAAA,UAAA,CAAA,YAAA,CAAA,GAAA,EAAA,CAAA,GAAA,YAAe;AACf,IAAA,UAAA,CAAA,UAAA,CAAA,aAAA,CAAA,GAAA,EAAA,CAAA,GAAA,aAAgB;AAChB,IAAA,UAAA,CAAA,UAAA,CAAA,YAAA,CAAA,GAAA,EAAA,CAAA,GAAA,YAAe;AACf,IAAA,UAAA,CAAA,UAAA,CAAA,aAAA,CAAA,GAAA,EAAA,CAAA,GAAA,aAAgB;AAChB,IAAA,UAAA,CAAA,UAAA,CAAA,YAAA,CAAA,GAAA,EAAA,CAAA,GAAA,YAAe;AACf,IAAA,UAAA,CAAA,UAAA,CAAA,aAAA,CAAA,GAAA,EAAA,CAAA,GAAA,aAAgB;AAChB,IAAA,UAAA,CAAA,UAAA,CAAA,YAAA,CAAA,GAAA,EAAA,CAAA,GAAA,YAAe;AACf,IAAA,UAAA,CAAA,UAAA,CAAA,aAAA,CAAA,GAAA,EAAA,CAAA,GAAA,aAAgB;AAChB,IAAA,UAAA,CAAA,UAAA,CAAA,aAAA,CAAA,GAAA,EAAA,CAAA,GAAA,aAAgB;AAClB,CAAC,EAxBWA,kBAAU,KAAVA,kBAAU,GAwBrB,EAAA,CAAA,CAAA;;AChDD;;AAEG;AACG,SAAU,WAAW,CAAC,GAAW,EAAA;IACrC,MAAM,gBAAgB,GAAG,mBAAmB;IAC5C,MAAM,SAAS,GAAG,cAAc;IAEhC,IAAI,IAAI,GAAG,gBAAgB;IAC3B,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC;AAE3C,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,QAAA,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC;QACpB,IAAI,GAAG,CAAC,IAAI,GAAG,SAAS,IAAI,mBAAmB;;AAGjD,IAAA,OAAO,IAAI;AACb;AAEA;;AAEG;AACI,eAAe,UAAU,CAC9B,KAAkB,EAClB,IAAkB,EAClB,SAAA,GAAoB,IAAI,EACxB,UAAkB,CAAC,EAAA;AAEnB,IAAA,IAAI,SAAgB;AAEpB,IAAA,SAAS,WAAW,CAAI,OAAmB,EAAE,EAAU,EAAA;QACrD,OAAO,OAAO,CAAC,IAAI,CAAC;YAClB,OAAO;YACP,IAAI,OAAO,CAAI,CAAC,CAAC,EAAE,MAAM,KAAK,UAAU,CAAC,MAAM,MAAM,CAAC,IAAI,KAAK,CAAC,CAAiB,cAAA,EAAA,EAAE,CAAI,EAAA,CAAA,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAChG,SAAA,CAAC;;AAGJ,IAAA,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,OAAO,EAAE,OAAO,EAAE,EAAE;AAClD,QAAA,IAAI;AACF,YAAA,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,CAAC;AACjE,YAAA,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE;gBACnD,MAAM,IAAI,KAAK,CAAC,CAAA,cAAA,EAAiB,QAAQ,CAAC,MAAM,CAAE,CAAA,CAAC;;AAErD,YAAA,OAAO,QAAQ;;QACf,OAAO,KAAK,EAAE;AACd,YAAA,SAAS,GAAG,KAAK,YAAY,KAAK,GAAG,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACrE,YAAA,IAAI,OAAO,GAAG,OAAO,GAAG,CAAC,EAAE;AACzB,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC;AACxD,gBAAA,OAAO,CAAC,KAAK,CAAC,CAAA,QAAA,EAAW,OAAO,GAAG,CAAC,CAAwB,qBAAA,EAAA,KAAK,OAAO,SAAS,CAAC,OAAO,CAAA,CAAE,CAAC;AAC5F,gBAAA,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;;;;AAIhE,IAAA,MAAM,SAAU;AAClB;AAEO,eAAe,UAAU,CAAI,KAA2B,EAAE,KAAa,EAAA;IAC5E,MAAM,OAAO,GAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;AAE5C,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,KAAK,EAAE;AAC5C,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC;QACvC,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC;AAEnE,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC5C,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;;;AAIpC,IAAA,OAAO,OAAO;AAChB;;ACYA;AACA,MAAM,UAAU,GAAG;AACjB,IAAA,cAAc,EAAE,CAAC;AACjB,IAAA,cAAc,EAAE,CAAC;AACjB,IAAA,eAAe,EAAE,CAAC;AAClB,IAAA,eAAe,EAAE,CAAC;AAClB,IAAA,gBAAgB,EAAE,CAAC;AACnB,IAAA,eAAe,EAAE,CAAC;AAClB,IAAA,gBAAgB,EAAE,CAAC;AACnB,IAAA,eAAe,EAAE,CAAC;AAClB,IAAA,gBAAgB,EAAE,CAAC;AACnB,IAAA,eAAe,EAAE,CAAC;AAClB,IAAA,gBAAgB,EAAE,EAAE;AACpB,IAAA,gBAAgB,EAAE,EAAE;AACpB,IAAA,oBAAoB,EAAE,EAAE;AACxB,IAAA,qBAAqB,EAAE,EAAE;AACzB,IAAA,qBAAqB,EAAE,EAAE;AACzB,IAAA,sBAAsB,EAAE,EAAE;AAC1B,IAAA,qBAAqB,EAAE,EAAE;AACzB,IAAA,sBAAsB,EAAE,EAAE;AAC1B,IAAA,qBAAqB,EAAE,EAAE;AACzB,IAAA,sBAAsB,EAAE,EAAE;AAC1B,IAAA,qBAAqB,EAAE,EAAE;AACzB,IAAA,sBAAsB,EAAE,EAAE;AAC1B,IAAA,sBAAsB,EAAE,EAAE;CAC3B;AAED,MAAM,YAAY,GAAG;AACnB,IAAA,iBAAiB,EAAE,CAAC;AACpB,IAAA,gBAAgB,EAAE,CAAC;AACnB,IAAA,sBAAsB,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,GAAG;AAClB,IAAA,QAAQ,EAAE,CAAC;CACZ;AAED;AACA,MAAM,cAAc,GAAG,GAAG;AAE1B,IAAI,iBAAiB,GAAsB,IAAI;AAExC,eAAe,QAAQ,GAAA;AAC5B,IAAA,IAAI,iBAAiB;AAAE,QAAA,OAAO,iBAAiB;AAE/C,IAAA,IAAI;;;AAGF,QAAA,MAAM,YAAY,GAAG,MAAM,OAAO,6BAA6B,CAAC;;AAEhE,QAAA,MAAM,aAAa,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE;;AAGlD,QAAA,iBAAiB,GAAG,mBAAmB,CAAC,aAAa,CAAC;AAEtD,QAAA,OAAO,iBAAiB;;IACxB,OAAO,KAAK,EAAE;AACd,QAAA,MAAM,IAAI,KAAK,CAAC,qCAAqC,KAAK,CAAA,CAAE,CAAC;;AAEjE;AAEA;AACA,SAAS,mBAAmB,CAAC,SAAc,EAAA;;IAEzC,OAAO;;QAEL,OAAO,EAAE,SAAS,CAAC,OAAO;QAC1B,KAAK,EAAE,SAAS,CAAC,KAAK;QACtB,QAAQ,EAAE,SAAS,CAAC,QAAQ;QAC5B,QAAQ,EAAE,SAAS,CAAC,QAAQ;QAC5B,MAAM,EAAE,SAAS,CAAC,MAAM;;QAGxB,cAAc,EAAE,SAAS,CAAC,eAAe;QACzC,cAAc,EAAE,SAAS,CAAC,eAAe;QACzC,eAAe,EAAE,SAAS,CAAC,gBAAgB;QAC3C,eAAe,EAAE,SAAS,CAAC,gBAAgB;QAC3C,gBAAgB,EAAE,SAAS,CAAC,iBAAiB;QAC7C,oBAAoB,EAAE,SAAS,CAAC,qBAAqB;QACrD,2BAA2B,EAAE,SAAS,CAAC,4BAA4B;QACnE,4BAA4B,EAAE,SAAS,CAAC,6BAA6B;QACrE,0BAA0B,EAAE,SAAS,CAAC,2BAA2B;QACjE,+BAA+B,EAAE,SAAS,CAAC,gCAAgC;QAC3E,+BAA+B,EAAE,SAAS,CAAC,gCAAgC;QAC3E,2BAA2B,EAAE,SAAS,CAAC,4BAA4B;QACnE,2BAA2B,EAAE,SAAS,CAAC,4BAA4B;QACnE,0BAA0B,EAAE,SAAS,CAAC,2BAA2B;QACjE,wBAAwB,EAAE,SAAS,CAAC,yBAAyB;QAC7D,8BAA8B,EAAE,SAAS,CAAC,+BAA+B;QACzE,wBAAwB,EAAE,SAAS,CAAC,yBAAyB;QAC7D,sBAAsB,EAAE,SAAS,CAAC,uBAAuB;QACzD,eAAe,EAAE,SAAS,CAAC,gBAAgB;QAC3C,0BAA0B,EAAE,SAAS,CAAC,2BAA2B;QACjE,yBAAyB,EAAE,SAAS,CAAC,0BAA0B;QAC/D,2BAA2B,EAAE,SAAS,CAAC,4BAA4B;QACnE,0BAA0B,EAAE,SAAS,CAAC,2BAA2B;QACjE,yBAAyB,EAAE,SAAS,CAAC,0BAA0B;QAC/D,wBAAwB,EAAE,SAAS,CAAC,yBAAyB;;AAG7D,QAAA,GAAG,YAAY;AACf,QAAA,GAAG,WAAW;AACd,QAAA,GAAG,UAAU;;AAGb,QAAA,cAAc,EAAE,cAAc;KAC/B;AACH;SAEgB,aAAa,GAAA;IAC3B,IAAI,CAAC,iBAAiB,EAAE;AACtB,QAAA,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC;;AAExE,IAAA,OAAO,iBAAiB;AAC1B;;MC7La,YAAY,CAAA;IAOvB,WAAY,CAAA,OAA4B,EAAE,IAAiB,EAAA;AACzD,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO;AACtB,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,aAAa,EAAE;AACnC,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,GAAG,EAAE;;AAGhC;;AAEG;AACH,IAAA,aAAa,MAAM,CAAC,OAA4B,EAAA;;AAE9C,QAAA,MAAM,IAAI,GAAG,MAAM,QAAQ,EAAE;QAC7B,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC;AAC9C,QAAA,MAAM,MAAM,CAAC,UAAU,EAAE;AACzB,QAAA,OAAO,MAAM;;AAGf,IAAA,MAAM,UAAU,GAAA;;QAEd,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AAE7C,QAAA,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC;AAC7D,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;QACtD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,CAAC;QAE3C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;QAEtD,IAAI,UAAU,KAAK,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;AAC9C,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;AAC1B,YAAA,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC;;AAGxC,QAAA,IAAI,YAAwB;QAE5B,IAAI,UAAU,KAAK,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAC7C,YAAY,GAAG,UAAU;;aACpB,IAAI,UAAU,KAAK,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE;YAC1D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;YAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;AAC/C,YAAA,MAAM,aAAa,GAAG,QAAQ,GAAG,WAAW;YAE5C,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,WAAW,CAAC;;AAGvE,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AAEpC,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC;YAEzE,IAAI,CAAC,OAAO,EAAE;AACZ,gBAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;AAC1B,gBAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;AAC3B,gBAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;AAC1B,gBAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;AACxB,gBAAA,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC;;;AAI3C,YAAA,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AAC3D,YAAA,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;;AAGvD,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;AAC3B,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;AAC1B,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;;AAGxB,YAAA,YAAY,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;;aACnD;AACL,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;AAC1B,YAAA,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC;;;AAIxC,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC;QAC9D,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,eAAe,CAAC;QACnD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC;AAC3D,QAAA,IAAI,CAAC,eAAe,GAAG,eAAe;AAEtC,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;AAE1B,QAAA,OAAO,IAAI;;;IAIL,UAAU,CAAC,MAAc,EAAE,MAAc,EAAA;AAC/C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QAChE,OAAO,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;;IAG9C,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC;QACrE,OAAO,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC;;IAGtD,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC;QACrE,OAAO,IAAI,CAAC,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,QAAQ,CAAC;;IAG7D,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC;QACrE,OAAO,IAAI,CAAC,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,QAAQ,CAAC;;IAG9D,SAAS,GAAA;AACP,QAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC;QACrE,OAAO,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,QAAQ,CAAC;;IAG5D,aAAa,GAAA;AACX,QAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC;;AAGrE,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;;QAG9E,MAAM,UAAU,GAAa,EAAE;AAC/B,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;YAC9B,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;;AAG9F,QAAA,OAAO,UAAU;;IAGnB,kBAAkB,GAAA;AAChB,QAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC;;AAGrE,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;;QAG1E,MAAM,MAAM,GAAa,EAAE;AAC3B,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;YAC9B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;;AAGtF,QAAA,OAAO,MAAM;;IAGf,OAAO,GAAA;AACL,QAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC;AAErE,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,QAAQ,CAAC;AAChE,QAAA,IAAI,IAAI,KAAK,CAAC,EAAE;AACd,YAAA,OAAO,IAAI;;AAGb,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC;AAClE,QAAA,IAAI,QAAQ,KAAK,CAAC,EAAE;AAClB,YAAA,OAAO,IAAI;;QAEb,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC;;IAGxC,gBAAgB,GAAA;AACd,QAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC;QACrE,OAAO,IAAI,CAAC,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,QAAQ,CAAC;;IAGhE,MAAM,QAAQ,CAAC,KAAa,EAAA;AAC1B,QAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC;;QAGrE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QAEpC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC;QAE/F,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;AAC1B,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;AACxB,YAAA,OAAO,IAAI;;AAGb,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AAC3D,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAEvD,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;AAC1B,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;QAExB,OAAO,IAAI,CAAC,uBAAuB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;AAGvD;;AAEG;IACH,MAAM,cAAc,CAAC,IAAY,EAAA;;QAE/B,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AACnD,QAAA,IAAI,cAAc,KAAK,IAAI,EAAE;AAC3B,YAAA,OAAO,IAAI;;QAEb,IAAI,cAAc,EAAE;AAClB,YAAA,OAAO,MAAM,IAAI,CAAC,uBAAuB,CAAC,cAAc,CAAC;;;AAI3D,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,EAAE;AAC3C,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;YACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;YAC1C,IAAI,QAAQ,EAAE;gBACZ,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC;AAC1D,gBAAA,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,EAAE;gBACjC,IAAI,SAAS,EAAE;;oBAEb,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC;AAE3C,oBAAA,IAAI,SAAS,KAAK,IAAI,EAAE;AACtB,wBAAA,OAAO,KAAK;;;;;;QAMpB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC;AAClC,QAAA,OAAO,IAAI;;IAGb,MAAM,uBAAuB,CAAC,UAAsB,EAAA;AAClD,QAAA,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC;AAEjF,QAAA,MAAM,WAAW,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC;QAE7D,WAAW,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC;AAC/D,QAAA,WAAW,CAAC,eAAe,GAAG,YAAY;AAE1C,QAAA,OAAO,WAAW;;AAGpB;;AAEG;AACH,IAAA,iBAAiB,CAAC,KAAa,EAAA;AAC7B,QAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC;;QAGrE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QAEpC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC;QAE/F,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;AAC1B,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;AACxB,YAAA,OAAO,IAAI;;AAGb,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AAC3D,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAEvD,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;AAC1B,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;AAExB,QAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE;;AAGzB;;AAEG;IACH,MAAM,UAAU,CAAC,IAAY,EAAA;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AACzD,QAAA,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;;AAGvC;;AAEG;IACH,MAAM,YAAY,CAAC,KAAe,EAAA;AAChC,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,YAAA,OAAO,IAAI;;AAGb,QAAA,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjD,IAAI,KAAK,EAAE;AACT,YAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,gBAAA,OAAO,KAAK;;iBACP;AACL,gBAAA,OAAO,MAAM,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;;;AAGnD,QAAA,OAAO,IAAI;;;AAIb,IAAA,UAAU,CAAI,QAAoB,EAAA;AAChC,QAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC;AAErE,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,KAAK,QAAQ,EAAE;AAChC,YAAA,OAAO,IAAI;;;AAIb,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACpC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAErC,QAAA,IAAI;AACF,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC;YAE9E,IAAI,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AAChC,gBAAA,OAAO,IAAI;;AAGb,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC;AAE/C,YAAA,IAAI,OAAO,KAAK,CAAC,EAAE;AACjB,gBAAA,OAAO,IAAI;;;;AAKb,YAAA,IAAI,MAAW;YAEf,QAAQ,QAAQ;gBACd,KAAKA,kBAAU,CAAC,IAAI;oBAClB,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;oBAC1C;gBACF,KAAKA,kBAAU,CAAC,KAAK;AACnB,oBAAA,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,IAAI;oBACjD;gBACF,KAAKA,kBAAU,CAAC,KAAK;oBACnB,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;oBAC3C;gBACF,KAAKA,kBAAU,CAAC,MAAM;AACpB,oBAAA,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM;oBACpD;gBACF,KAAKA,kBAAU,CAAC,KAAK;oBACnB,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;oBAC3C;gBACF,KAAKA,kBAAU,CAAC,MAAM;AACpB,oBAAA,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC;oBACjD;gBACF,KAAKA,kBAAU,CAAC,KAAK;oBACnB,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;oBAC7C;gBACF,KAAKA,kBAAU,CAAC,MAAM;oBACpB,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;oBAC9C;AACF,gBAAA;oBACE,MAAM,GAAG,IAAI;;AAGjB,YAAA,OAAO,MAAW;;gBACV;AACR,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;AACvB,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;;;AAIpB,IAAA,YAAY,CAAC,UAAkB,EAAA;;AAErC,QAAA,MAAM,WAAW,GAAG,EAAE,CAAC;QACvB,MAAM,eAAe,GAAG,CAAC,GAAG,CAAC,GAAG,WAAW,GAAG,CAAC,CAAC;;QAGhD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;;AAGvD,QAAA,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,eAAe,CAAC;QAClD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,YAAY,CAAC;;QAG9C,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,UAAU,EAAE,YAAY,CAAC;AAE9D,QAAA,OAAO,YAAY;;AAGb,IAAA,WAAW,CAAC,YAAoB,EAAA;;AAEtC,QAAA,MAAM,WAAW,GAAG,EAAE,CAAC;QACvB,MAAM,cAAc,GAAG,CAAC,GAAG,CAAC,GAAG,WAAW,GAAG,CAAC,CAAC;;QAG/C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;;AAGrD,QAAA,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,cAAc,CAAC;QACjD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC;;QAG7C,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,WAAW,EAAE,YAAY,CAAC;AAE9D,QAAA,OAAO,WAAW;;IAGpB,MAAM,IAAI,CACR,QAAoB,EACpB,SAAkB,EAClB,YAAoB,MAAM,CAAC,KAAK,CAAC,EACjC,cAAsB,MAAM,CAAC,GAAG,CAAC,EACjC,WAAoB,IAAI,EAAA;AAExB,QAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC;AAErE,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,KAAK,QAAQ,EAAE;AAChC,YAAA,MAAM,IAAI,KAAK,CAAC,CAAA,4BAAA,EAA+B,IAAI,CAAC,QAAQ,EAAE,CAAS,MAAA,EAAA,QAAQ,CAAE,CAAA,CAAC;;;QAIpF,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;AACzE,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;;AAGpD,QAAA,IAAI,MAAkB;QACtB,QAAQ,QAAQ;AACd,YAAA,KAAK,IAAI,CAAC,IAAI,CAAC,oBAAoB;AACjC,gBAAA,MAAM,GAAG,IAAI,SAAS,CAAC,SAAS,CAAC;gBACjC;AACF,YAAA,KAAK,IAAI,CAAC,IAAI,CAAC,qBAAqB;AAClC,gBAAA,MAAM,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC;gBAClC;AACF,YAAA,KAAK,IAAI,CAAC,IAAI,CAAC,qBAAqB;AAClC,gBAAA,MAAM,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC;gBAClC;AACF,YAAA,KAAK,IAAI,CAAC,IAAI,CAAC,sBAAsB;AACnC,gBAAA,MAAM,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC;gBACnC;AACF,YAAA,KAAK,IAAI,CAAC,IAAI,CAAC,qBAAqB;AAClC,gBAAA,MAAM,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC;gBAClC;AACF,YAAA,KAAK,IAAI,CAAC,IAAI,CAAC,sBAAsB;AACnC,gBAAA,MAAM,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC;gBACnC;AACF,YAAA,KAAK,IAAI,CAAC,IAAI,CAAC,qBAAqB;AAClC,gBAAA,MAAM,GAAG,IAAI,YAAY,CAAC,SAAS,CAAC;gBACpC;AACF,YAAA,KAAK,IAAI,CAAC,IAAI,CAAC,sBAAsB;AACnC,gBAAA,MAAM,GAAG,IAAI,YAAY,CAAC,SAAS,CAAC;gBACpC;AACF,YAAA;AACE,gBAAA,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC;;AAG5C,QAAA,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,CAAC;AAClF,QAAA,OAAO,MAAM;;AAGf;;;;;;;AAOG;IACH,MAAM,QAAQ,CACZ,QAAoB,EACpB,MAAkB,EAClB,SAAkB,EAClB,SAAoB,GAAA,MAAM,CAAC,KAAK,CAAC,EACjC,WAAsB,GAAA,MAAM,CAAC,GAAG,CAAC,EACjC,QAAA,GAAoB,IAAI,EAAA;AAExB,QAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC;AAErE,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,KAAK,QAAQ,EAAE;AAChC,YAAA,MAAM,IAAI,KAAK,CAAC,CAAA,4BAAA,EAA+B,IAAI,CAAC,QAAQ,EAAE,CAAS,MAAA,EAAA,QAAQ,CAAE,CAAA,CAAC;;AAGpF,QAAA,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM;AAC9B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE;;AAGrC,QAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,KAAK,EAAE;YAC7B,MAAM,IAAI,KAAK,CAAC,CAAmC,gCAAA,EAAA,QAAQ,CAAC,MAAM,CAAiB,cAAA,EAAA,KAAK,CAAE,CAAA,CAAC;;;AAI7F,QAAA,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC;;QAGjE,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAChE,QAAA,IAAI,MAAM,CAAC,MAAM,GAAG,aAAa,EAAE;YACjC,MAAM,IAAI,KAAK,CAAC,CAAoC,iCAAA,EAAA,aAAa,CAAkB,eAAA,EAAA,MAAM,CAAC,MAAM,CAAE,CAAA,CAAC;;;AAIrG,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AACnD,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;AACjD,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;AACtD,QAAA,MAAM,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;AAEzD,QAAA,IAAI;;AAEF,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;;AAE9B,gBAAA,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE;AACtG,oBAAA,MAAM,IAAI,KAAK,CAAC,CAA+B,4BAAA,EAAA,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC;;gBAGtF,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;gBAC5E,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;AACnE,gBAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;gBAC/D,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,oBAAoB,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;;;AAG7E,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;AAE9D,YAAA,IAAI;;AAEF,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,CACrC,UAAU,EACV,IAAI,CAAC,QAAQ,EACb,MAAM,CAAC,KAAK,CAAC,EACb,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,EACpB,WAAW,EACX,SAAS,CACV;gBAED,IAAI,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AAChC,oBAAA,MAAM,IAAI,KAAK,CAAC,6CAA6C,KAAK,CAAA,CAAE,CAAC;;gBAEvE,IAAI,QAAQ,EAAE;AACZ,oBAAA,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC;;gBAEvC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC;;oBAC7B;AACR,gBAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;;;gBAErB;;AAER,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;AAC9B,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;AAC7B,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC;AAClC,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC;;;IAIzC,MAAM,cAAc,CAAC,UAAkB,EAAA;AACrC,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;;YAE9B;;QAGF,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AACrC,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC;AAEvD,QAAA,IAAI;;YAEF,OAAO,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE;AACrE,gBAAA,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;AACnE,gBAAA,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;;gBAGtE,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,UAAU,CAAC;gBACtE,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC;AAElD,gBAAA,IAAI;;oBAEF,MAAM,aAAa,GAA4B,EAAE;oBACjD,OACE,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,EACxG;AACA,wBAAA,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;AACjE,wBAAA,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;AACpE,wBAAA,aAAa,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;;;AAI5E,oBAAA,MAAM,UAAU,CAAC,aAAa,EAAE,IAAI,CAAC;;AAGrC,oBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC;oBACjD,IAAI,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AAChC,wBAAA,MAAM,IAAI,KAAK,CAAC,oBAAoB,KAAK,CAAA,CAAE,CAAC;;;wBAEtC;AACR,oBAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;AAC5B,oBAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;;;;gBAGzB;AACR,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;AAC7B,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;;;AAIrB,IAAA,MAAM,MAAM,CAAC,UAAkB,EAAE,WAAuB,EAAA;AAC9D,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC;AAC3D,QAAA,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,2BAA2B,CAAC,UAAU,CAAC,CAAC;QACjF,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;;QAEzD,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;;AAErC,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC;AAEvD,QAAA,IAAI;;YAEF,OAAO,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE;;AAErE,gBAAA,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;AACnE,gBAAA,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;;gBAEtE,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,UAAU,CAAC;gBACtE,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC;AAElD,gBAAA,IAAI;;oBAEF,OACE,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,EACxG;;AAEA,wBAAA,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;AACjE,wBAAA,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;AACpE,wBAAA,MAAM,aAAa,GAAG,WAAW,GAAG,EAAE,CAAC;;wBAGvC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,SAAS,CAAC;AAEpE,wBAAA,IAAI;;4BAEF,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAChD,UAAU,EACV,aAAa,EACb,YAAY,EACZ,MAAM,CAAC,SAAS,CAAC,EACjB,SAAS,EACT,cAAc,EACd,QAAQ,CACT;;4BAGD,IAAI,CAAC,OAAO,EAAE;AACZ,gCAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC;AACjD,gCAAA,MAAM,IAAI,KAAK,CAAC,0CAA0C,KAAK,CAAA,CAAE,CAAC;;;gCAE5D;AACR,4BAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;;;;AAKjC,oBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC;oBACjD,IAAI,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AAChC,wBAAA,MAAM,IAAI,KAAK,CAAC,oBAAoB,KAAK,CAAA,CAAE,CAAC;;;wBAEtC;AACR,oBAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;AAC5B,oBAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;;;;AAKjC,YAAA,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,WAAW,CAAC;;gBACrC;AACR,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;AACzB,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;AAC7B,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC;AAC/B,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;;;AAItB,IAAA,MAAM,aAAa,CAAC,MAAc,EAAE,IAAY,EAAA;AACtD,QAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;AACtD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC;AAC/B,QAAA,OAAO,GAAG;;AAGZ;;AAEG;IACK,gBAAgB,CAAC,SAAiB,EAAE,WAAuB,EAAA;AACjE,QAAA,QAAQ,WAAW,CAAC,WAAW;AAC7B,YAAA,KAAK,YAAY;gBACd,WAA4B,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;gBAC3G;AACF,YAAA,KAAK,YAAY;gBACd,WAA4B,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;gBAC3G;AACF,YAAA,KAAK,SAAS;gBACX,WAAyB,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;gBACrG;AACF,YAAA,KAAK,UAAU;gBACZ,WAA0B,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;gBACvG;AACF,YAAA,KAAK,UAAU;gBACZ,WAA0B,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;gBACvG;AACF,YAAA,KAAK,WAAW;gBACb,WAA2B,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;gBACzG;AACF,YAAA,KAAK,UAAU;gBACZ,WAA0B,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;gBACvG;AACF,YAAA,KAAK,WAAW;gBACb,WAA2B,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;gBACzG;AACF,YAAA,KAAK,aAAa;gBACf,WAA6B,CAAC,GAAG,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;gBAC7G;AACF,YAAA,KAAK,cAAc;gBAChB,WAA8B,CAAC,GAAG,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;gBAC/G;AACF,YAAA;AACE,gBAAA,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC;;;;IAKxE,OAAO,GAAA;AACL,QAAA,IAAI,IAAI,CAAC,eAAe,KAAK,IAAI,EAAE;YACjC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC;AACrC,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI;;AAE7B,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;;AAEvB;;MCptBY,WAAW,CAAA;AAKtB,IAAA,WAAA,CAAY,MAA8C,EAAA;QAJlD,IAAO,CAAA,OAAA,GAAuB,IAAI;QAClC,IAAM,CAAA,MAAA,GAAsB,IAAI;QAChC,IAAQ,CAAA,QAAA,GAAW,CAAC;QAG1B,IAAI,OAAO,IAAI,KAAK,WAAW,IAAI,MAAM,YAAY,IAAI,EAAE;AACzD,YAAA,IAAI,CAAC,OAAO,GAAG,MAAM;AACrB,YAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,IAAI;;aACtB,IAAI,OAAO,IAAI,KAAK,WAAW,IAAI,MAAM,YAAY,IAAI,EAAE;AAChE,YAAA,IAAI,CAAC,OAAO,GAAG,MAAM;AACrB,YAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,IAAI;;AACtB,aAAA,IAAI,MAAM,YAAY,WAAW,EAAE;YACxC,IAAI,CAAC,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC;YACpC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM;;AAC7B,aAAA,IAAI,MAAM,YAAY,UAAU,EAAE;AACvC,YAAA,IAAI,CAAC,MAAM,GAAG,MAAM;AACpB,YAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM;;aACxB;AACL,YAAA,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC;;;AAI3E,IAAA,MAAM,KAAK,GAAA;QACT,OAAO,IAAI,CAAC,QAAQ;;AAGtB,IAAA,MAAM,QAAQ,CAAC,MAAc,EAAE,IAAY,EAAA;AACzC,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;;AAEjD,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;AACtD,YAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE;AACvC,YAAA,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC;;AAE/B,QAAA,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC;;AAGvD,IAAA,MAAM,YAAY,CAAC,OAAe,EAAE,MAAc,EAAA;;;AAIlD,IAAA,MAAM,KAAK,GAAA;;;AAGZ;;MC9CY,iBAAiB,CAAA;AAU5B;;;AAGG;AACH,IAAA,WAAA,CAAY,OAKX,EAAA;QAjBO,IAAQ,CAAA,QAAA,GAAkB,IAAI;QAC9B,IAAQ,CAAA,QAAA,GAAsB,IAAI;QAClC,IAAW,CAAA,WAAA,GAAyB,IAAI;QACxC,IAAY,CAAA,YAAA,GAA2B,IAAI;AAejD,QAAA,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG;AACtB,QAAA,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AAC5D,QAAA,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU;QACpC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK;;QAGnC,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,KAAI;YAC5B,IAAI,IAAI,CAAC,KAAK;AAAE,gBAAA,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,CAAC;AACpE,SAAC,CAAC;;AAGJ;;AAEG;AACH,IAAA,MAAM,KAAK,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE;YAC1B,OAAO,IAAI,CAAC,QAAQ;;AAGtB,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACtB,IAAI,IAAI,CAAC,KAAK;gBAAE,OAAO,CAAC,GAAG,CAAC,CAAA,uBAAA,EAA0B,IAAI,CAAC,GAAG,CAAE,CAAA,CAAC;AAEjE,YAAA,IAAI,CAAC,YAAY,GAAG,CAAC,YAAW;AAC9B,gBAAA,IAAI;oBACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE;AACrC,wBAAA,MAAM,EAAE,MAAM;AACf,qBAAA,CAAC;AAEF,oBAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;wBAChB,MAAM,IAAI,KAAK,CAAC,CAAA,YAAA,EAAe,QAAQ,CAAC,MAAM,CAAE,CAAA,CAAC;;oBAGnD,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;oBAC5D,IAAI,CAAC,aAAa,EAAE;AAClB,wBAAA,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC;;oBAGxD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,aAAa,EAAE,EAAE,CAAC;oBAE3C,IAAI,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE;AACpC,wBAAA,MAAM,IAAI,KAAK,CACb,CAAA,WAAA,EAAc,IAAI,CAAC,QAAQ,CAAA,sCAAA,EAAyC,IAAI,CAAC,WAAW,CAAA,OAAA,CAAS,CAC9F;;oBAGH,IAAI,IAAI,CAAC,KAAK;wBAAE,OAAO,CAAC,GAAG,CAAC,CAAA,WAAA,EAAc,IAAI,CAAC,QAAQ,CAAQ,MAAA,CAAA,CAAC;oBAChE,OAAO,IAAI,CAAC,QAAQ;;gBACpB,OAAO,KAAK,EAAE;AACd,oBAAA,IAAI,CAAC,YAAY,GAAG,IAAI;oBACxB,MAAM,IAAI,KAAK,CAAC,CAAA,yBAAA,EAA4B,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAE,CAAA,CAAC;;aAExG,GAAG;;QAGN,OAAO,IAAI,CAAC,YAAY;;AAG1B;;AAEG;AACH,IAAA,MAAM,QAAQ,GAAA;;AAEZ,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,YAAA,OAAO,OAAO,CAAC,OAAO,EAAE;;AAG1B,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,OAAO,IAAI,CAAC,WAAW;;AAGzB,QAAA,IAAI,CAAC,WAAW,GAAG,CAAC,YAAW;AAC7B,YAAA,IAAI;;AAEF,gBAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE;gBAE/B,IAAI,IAAI,CAAC,KAAK;oBAAE,OAAO,CAAC,GAAG,CAAC,CAAyB,sBAAA,EAAA,IAAI,CAAgB,aAAA,EAAA,IAAI,CAAC,GAAG,CAAE,CAAA,CAAC;;gBAGpF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;AAEtC,gBAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;oBAChB,MAAM,IAAI,KAAK,CAAC,CAAA,YAAA,EAAe,QAAQ,CAAC,MAAM,CAAE,CAAA,CAAC;;;AAInD,gBAAA,IAAI,IAAI,CAAC,UAAU,IAAI,QAAQ,CAAC,IAAI,IAAI,WAAW,IAAI,QAAQ,CAAC,IAAI,EAAE;;AAEpE,oBAAA,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC;oBAC5E,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE;oBACxC,MAAM,MAAM,GAAiB,EAAE;oBAE/B,IAAI,cAAc,GAAG,CAAC;oBACtB,IAAI,kBAAkB,GAAG,CAAC;oBAE1B,OAAO,IAAI,EAAE;wBACX,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE;wBAE3C,IAAI,IAAI,EAAE;4BACR;;AAGF,wBAAA,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;AAClB,wBAAA,cAAc,IAAI,KAAK,CAAC,MAAM;;AAG9B,wBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AACtB,wBAAA,IAAI,GAAG,GAAG,kBAAkB,GAAG,GAAG,EAAE;;AAElC,4BAAA,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,aAAa,CAAC;4BAC9C,kBAAkB,GAAG,GAAG;;;;oBAK5B,IAAI,CAAC,QAAQ,GAAG,IAAI,UAAU,CAAC,cAAc,CAAC;oBAC9C,IAAI,QAAQ,GAAG,CAAC;AAChB,oBAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;wBAC1B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC;AAClC,wBAAA,QAAQ,IAAI,KAAK,CAAC,MAAM;;;AAI1B,oBAAA,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,aAAa,CAAC;;qBACzC;;AAEL,oBAAA,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE;oBAC3C,IAAI,CAAC,QAAQ,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC;AAEtC,oBAAA,IAAI,IAAI,CAAC,UAAU,EAAE;wBACnB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;;;gBAI/C,IAAI,IAAI,CAAC,KAAK;oBAAE,OAAO,CAAC,GAAG,CAAC,CAA6B,0BAAA,EAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAS,OAAA,CAAA,CAAC;gBACvF;;YACA,OAAO,KAAK,EAAE;AACd,gBAAA,IAAI,CAAC,WAAW,GAAG,IAAI;gBACvB,MAAM,IAAI,KAAK,CAAC,CAAA,qBAAA,EAAwB,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAE,CAAA,CAAC;;SAEpG,GAAG;QAEJ,OAAO,IAAI,CAAC,WAAW;;AAGzB;;;;AAIG;AACH,IAAA,MAAM,QAAQ,CAAC,MAAc,EAAE,IAAY,EAAA;AACzC,QAAA,IAAI;;AAEF,YAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;gBAClB,IAAI,IAAI,CAAC,KAAK;oBAAE,OAAO,CAAC,GAAG,CAAC,CAAA,SAAA,EAAY,MAAM,CAAK,EAAA,EAAA,IAAI,CAAgC,8BAAA,CAAA,CAAC;AACxF,gBAAA,MAAM,IAAI,CAAC,QAAQ,EAAE;gBACrB,IAAI,IAAI,CAAC,KAAK;oBAAE,OAAO,CAAC,GAAG,CAAC,CAAA,SAAA,EAAY,MAAM,CAAK,EAAA,EAAA,IAAI,CAAgB,cAAA,CAAA,CAAC;;;AAI1E,YAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AAClB,gBAAA,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC;;;AAI1D,YAAA,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;AACtD,gBAAA,MAAM,IAAI,KAAK,CAAC,CAAoB,iBAAA,EAAA,MAAM,IAAI,MAAM,GAAG,IAAI,CAAA,sBAAA,EAAyB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAA,CAAA,CAAG,CAAC;;YAG9G,IAAI,IAAI,CAAC,KAAK;gBAAE,OAAO,CAAC,GAAG,CAAC,CAAA,QAAA,EAAW,IAAI,CAAsB,mBAAA,EAAA,MAAM,CAAc,YAAA,CAAA,CAAC;;AAGtF,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;;QACjD,OAAO,KAAK,EAAE;YACd,MAAM,IAAI,KAAK,CAAC,CAAA,mBAAA,EAAsB,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAE,CAAA,CAAC;;;AAInG;;AAEG;IACH,QAAQ,GAAA;AACN,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ;;AAGxB;;AAEG;IACH,WAAW,GAAA;QACT,OAAO,IAAI,CAAC,QAAQ;;AAGtB;;AAEG;AACH,IAAA,MAAM,MAAM,GAAA;AACV,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE;;AAGxB,IAAA,MAAM,YAAY,CAAC,OAAe,EAAE,MAAc,EAAA;;;AAIlD;;AAEG;AACH,IAAA,MAAM,KAAK,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;;AAE1B;;MCvOY,qBAAqB,CAAA;;;;IAOhC,WAAY,CAAA,SAAiB,EAAE,SAAiB,EAAA;QAC9C,IAAI,CAAC,KAAK,GAAG,IAAI,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC;;IAGzD,SAAS,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS;;IAG7B,SAAS,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS;;AAG7B,IAAA,MAAM,GAAG,CAAC,GAAa,EAAE,OAAkC,EAAA;QACzD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;AAClC,QAAA,IAAI,MAAM;AAAE,YAAA,OAAO,MAAM;QAEzB,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC;QAC1C,IAAI,CAAC,QAAQ,EAAE;YACb,QAAQ,GAAG,OAAO,EAAE;YACpB,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC;AACrC,YAAA,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;;AAEpD,QAAA,OAAO,QAAQ;;IAGjB,QAAQ,CAAC,GAAa,EAAE,OAAkC,EAAA;QACxD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE;AACxD,YAAA,MAAM,QAAQ,GAAG,OAAO,EAAE;YAC1B,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC;AACrC,YAAA,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;;;IAItD,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;;AAErB;MAOY,gBAAgB,CAAA;IAO3B,WAAY,CAAA,SAAiB,EAAE,SAAiB,EAAA;AAC9C,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;AAC1B,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;AAC1B,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,EAAE;AACtB,QAAA,IAAI,CAAC,GAAG,GAAG,EAAE;AACb,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,EAAE;;AAG3B,IAAA,GAAG,CAAC,GAAa,EAAA;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;QACjC,IAAI,KAAK,EAAE;AACT,YAAA,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE;;AAE5B,YAAA,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC;AAC5C,YAAA,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;YAClB,OAAO,KAAK,CAAC,IAAI;;AAEnB,QAAA,OAAO,SAAS;;IAGlB,GAAG,CAAC,GAAa,EAAE,IAAgB,EAAA;QACjC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE;;YAErC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;YAClC,IAAI,SAAS,KAAK,SAAS;AAAE,gBAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC;;AAE3D,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;AACpD,QAAA,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;;AAGpB,IAAA,WAAW,CAAC,GAAa,EAAA;QACvB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;;IAG/B,WAAW,CAAC,GAAa,EAAE,OAA4B,EAAA;QACrD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC;AAC/B,QAAA,OAAO,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;;IAGlD,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;AAClB,QAAA,IAAI,CAAC,GAAG,GAAG,EAAE;AACb,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;;AAExB;;ACpGD;;AAEG;MACU,iBAAiB,CAAA;AAK5B,IAAA,WAAA,CAAY,OAA4B,EAAE,gBAAuC,EAAE,QAAgB,EAAA;AACjG,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO;AACtB,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;AACxB,QAAA,IAAI,CAAC,gBAAgB,GAAG,gBAAgB;;AAG1C,IAAA,MAAM,KAAK,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;;AAG7B,IAAA,MAAM,YAAY,CAAC,MAAc,EAAE,KAAa,EAAA;QAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE;AACnD,QAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;AACjD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,KAAK,GAAG,CAAC,IAAI,SAAS,CAAC;AAE7D,QAAA,KAAK,IAAI,QAAQ,GAAG,UAAU,EAAE,QAAQ,IAAI,QAAQ,EAAE,QAAQ,EAAE,EAAE;YAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AACjD,YAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,EAAE,MACvC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,GAAG,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC,CAAC,CAClG;;;AAIL,IAAA,MAAM,QAAQ,CAAC,MAAc,EAAE,IAAY,EAAA;QACzC,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE;AACnD,QAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;AACjD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,SAAS,CAAC;AAE5D,QAAA,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC;;QAGnC,MAAM,KAAK,GAA+D,EAAE;AAC5E,QAAA,KAAK,IAAI,QAAQ,GAAG,UAAU,EAAE,QAAQ,IAAI,QAAQ,EAAE,QAAQ,EAAE,EAAE;YAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AACjD,YAAA,KAAK,CAAC,IAAI,CAAC,YAAW;AACpB,gBAAA,MAAM,UAAU,GAAG,QAAQ,GAAG,SAAS;AACvC,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,SAAS,EAAE,QAAQ,CAAC;gBAC3D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,MACtD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,GAAG,UAAU,CAAC,CACzD;AACD,gBAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE;AAC5B,aAAC,CAAC;;QAGJ,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC;AAEpE,QAAA,MAAM,MAAM,GAAG,IAAI,GAAG,EAAsB;QAC5C,KAAK,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,aAAa,EAAE;AAC/C,YAAA,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC;;;AAI7B,QAAA,KAAK,IAAI,QAAQ,GAAG,UAAU,EAAE,QAAQ,IAAI,QAAQ,EAAE,QAAQ,EAAE,EAAE;YAChE,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAE;AACnC,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC,GAAG,QAAQ,GAAG,SAAS;AACjF,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,SAAS,EAAE,MAAM,CAAC,GAAG,MAAM;AACjE,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,WAAW,EAAE,IAAI,GAAG,SAAS,CAAC;AAEnE,YAAA,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,EAAE,SAAS,CAAC;;AAG3E,QAAA,OAAO,MAAM;;AAGf,IAAA,MAAM,KAAK,GAAA;AACT,QAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE;AAC7B,QAAA,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;;AAE7B;;AC3ED,IAAI,WAAW,GAAiC,IAAI;AAE9C,SAAU,gBAAgB,CAAC,SAAA,GAAoB,EAAE,GAAG,IAAI,EAAE,SAAA,GAAoB,GAAG,EAAA;IACrF,IAAI,CAAC,WAAW,EAAE;QAChB,WAAW,GAAG,IAAI,qBAAqB,CAAC,SAAS,EAAE,SAAS,CAAC;;SACxD;AACL,QAAA,IAAI,WAAW,CAAC,SAAS,EAAE,KAAK,SAAS,IAAI,WAAW,CAAC,SAAS,EAAE,KAAK,SAAS,EAAE;YAClF,MAAM,IAAI,KAAK,CAAC,iDAAiD,GAAG,SAAS,GAAG,GAAG,GAAG,SAAS,CAAC;;;AAGtG;AASM,MAAO,kBAAmB,SAAQ,KAAK,CAAA;IAC3C,WACE,CAAA,OAAe,EACC,UAAmB,EAAA;QAEnC,KAAK,CAAC,OAAO,CAAC;QAFE,IAAU,CAAA,UAAA,GAAV,UAAU;AAG1B,QAAA,IAAI,CAAC,IAAI,GAAG,oBAAoB;;AAEnC;AAED;;;AAGG;MACU,aAAa,CAAA;AAWxB,IAAA,WAAA,CAAY,OAA6B,EAAA;QALjC,IAAQ,CAAA,QAAA,GAAkB,IAAI;QAC9B,IAAY,CAAA,YAAA,GAAkB,IAAI;QAClC,IAAI,CAAA,IAAA,GAAkB,IAAI;QAC1B,IAAe,CAAA,eAAA,GAAyB,IAAI;AAGlD,QAAA,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG;QACtB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK;QACnC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK;QAC3C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC;;AAGrC;;AAEG;AACH,IAAA,IAAI,QAAQ,GAAA;QACV,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC;AACrC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;AACxD,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE;AAEhF,QAAA,OAAO,OAAO,GAAG,QAAQ,GAAG,gBAAgB;;AAG9C;;AAEG;AACK,IAAA,MAAM,aAAa,GAAA;AACzB,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE;YACxB,OAAO,IAAI,CAAC,eAAe;;AAG7B,QAAA,IAAI,CAAC,eAAe,GAAG,CAAC,YAAW;YACjC,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC;AAErG,YAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;gBAChB,MAAM,IAAI,kBAAkB,CAC1B,QAAQ,CAAC,MAAM,KAAK,GAAG,GAAG,gBAAgB,GAAG,CAAe,YAAA,EAAA,QAAQ,CAAC,MAAM,CAAE,CAAA,EAC7E,QAAQ,CAAC,MAAM,CAChB;;YAGH,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;AAC5D,YAAA,IAAI,CAAC,aAAa;AAAE,gBAAA,MAAM,IAAI,kBAAkB,CAAC,+BAA+B,CAAC;YAEjF,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,aAAa,EAAE,EAAE,CAAC;YAC3C,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;YACzD,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;SACzC,GAAG;QAEJ,OAAO,IAAI,CAAC,eAAe;;AAG7B;;AAEG;AACH,IAAA,MAAM,KAAK,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE;YAC1B,OAAO,IAAI,CAAC,QAAQ;;AAGtB,QAAA,MAAM,IAAI,CAAC,aAAa,EAAE;QAC1B,OAAO,IAAI,CAAC,QAAS;;AAGvB;;AAEG;AACH,IAAA,MAAM,QAAQ,CAAC,MAAc,EAAE,IAAY,EAAA;QACzC,IAAI,MAAM,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE;AAC3B,YAAA,MAAM,IAAI,kBAAkB,CAAC,wBAAwB,CAAC;;;AAIxD,QAAA,MAAM,IAAI,CAAC,aAAa,EAAE;QAE1B,IAAI,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,QAAS,EAAE;AAClC,YAAA,MAAM,IAAI,kBAAkB,CAAC,CAAA,iBAAA,EAAoB,MAAM,CAAI,CAAA,EAAA,MAAM,GAAG,IAAI,wBAAwB,IAAI,CAAC,QAAQ,CAAA,CAAA,CAAG,CAAC;;;AAInH,QAAA,MAAM,OAAO,GAA2B;YACtC,KAAK,EAAE,SAAS,MAAM,CAAA,CAAA,EAAI,MAAM,GAAG,IAAI,GAAG,CAAC,CAAE,CAAA;SAC9C;;AAED,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,OAAO,CAAC,qBAAqB,CAAC,GAAG,IAAI,CAAC,YAAY;;AAEpD,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE;AACb,YAAA,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,IAAI;;AAGjC,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,GAAG,CAAC,CAAsB,mBAAA,EAAA,MAAM,IAAI,MAAM,GAAG,IAAI,GAAG,CAAC,CAAS,MAAA,EAAA,IAAI,CAAC,GAAG,CAAA,CAAE,CAAC;;QAGnF,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC;AAEtF,QAAA,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE;AAC3C,QAAA,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC;AAEnC,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE;YACxB,MAAM,IAAI,kBAAkB,CAAC,CAAY,SAAA,EAAA,IAAI,CAAC,MAAM,CAAoB,iBAAA,EAAA,IAAI,CAAE,CAAA,CAAC;;AAEjF,QAAA,OAAO,IAAI;;AAGb,IAAA,MAAM,YAAY,CAAC,OAAe,EAAE,MAAc,EAAA;;;AAIlD,IAAA,MAAM,cAAc,GAAA;QAClB,IAAI,WAAW,EAAE;AACf,YAAA,MAAM,aAAa,GAAG,IAAI,iBAAiB,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC;AAC7E,YAAA,OAAO,MAAM,YAAY,CAAC,MAAM,CAAC,aAAa,CAAC;;aAC1C;AACL,YAAA,MAAM,IAAI,kBAAkB,CAAC,mEAAmE,CAAC;;;AAIrG;;AAEG;AACH,IAAA,MAAM,KAAK,GAAA;AACT,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;;AAEnB;;;;;;;;;;;"}