{"version":3,"file":"index.cjs","names":["Container","Container","GifSprite","Sprite","TilingSprite","AnimatedSprite","GifSprite","Sprite","Container","Text","Graphics","Container","MeshGeometry","Mesh","Texture","Rectangle","Texture","Container","Rectangle","Graphics","extensions","GifAsset","pixiPath","ExtensionType","Assets"],"sources":["../src/parser/decodeData.ts","../src/types/index.ts","../src/parser/decodeGid.ts","../src/parser/xmlHelpers.ts","../src/parser/tmxData.ts","../src/parser/tmxProperties.ts","../src/parser/tmxObjects.ts","../src/parser/tilesetHelpers.ts","../src/parser/tmxTilesets.ts","../src/parser/parseTmx.ts","../src/parser/mergeTemplate.ts","../src/parser/resolveMap.ts","../src/renderer/parseColor.ts","../src/renderer/renderableLayer.ts","../src/renderer/GroupLayerRenderer.ts","../src/renderer/ImageLayerRenderer.ts","../src/renderer/tileSpriteFactory.ts","../src/renderer/ObjectLayerRenderer.ts","../src/renderer/mapGeometry.ts","../src/renderer/PackedTileLayerRenderer.ts","../src/renderer/TileLayerRenderer.ts","../src/renderer/layerTreeRenderer.ts","../src/renderer/createLayerRenderer.ts","../src/renderer/TileSetRenderer.ts","../src/renderer/TiledMap.ts","../src/renderer/tiledAssetLoader.ts"],"sourcesContent":["import type { TiledCompression, TiledEncoding } from '../types'\n\nexport function csvToGids(csv: string): number[] {\n  const out: number[] = []\n  let cur = 0\n  let hasDigit = false\n  for (let i = 0; i < csv.length; i++) {\n    const code = csv.charCodeAt(i)\n    if (code >= 48 && code <= 57) {\n      cur = cur * 10 + (code - 48)\n      hasDigit = true\n    } else if (code === 44) {\n      // ','\n      if (hasDigit) out.push(cur)\n      cur = 0\n      hasDigit = false\n    }\n    // whitespace / newlines: ignore\n  }\n  if (hasDigit) out.push(cur)\n  return out\n}\n\nfunction base64ToBytes(base64: string): Uint8Array {\n  const binary = globalThis.atob(base64.trim())\n  const bytes = new Uint8Array(binary.length)\n  for (let i = 0; i < binary.length; i++) {\n    bytes[i] = binary.charCodeAt(i)\n  }\n  return bytes\n}\n\nfunction bytesToGids(bytes: Uint8Array): number[] {\n  const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength)\n  const count = bytes.byteLength / 4\n  const gids: number[] = new Array(count)\n\n  for (let i = 0; i < count; i++) {\n    gids[i] = view.getUint32(i * 4, true)\n  }\n\n  return gids\n}\n\nasync function decompressBytesAsync(\n  bytes: Uint8Array,\n  compression: 'gzip' | 'zlib'\n): Promise<Uint8Array> {\n  const format = compression === 'gzip' ? 'gzip' : 'deflate'\n  const ds = new DecompressionStream(format)\n  const writer = ds.writable.getWriter()\n  writer.write(bytes as Uint8Array<ArrayBuffer>)\n  writer.close()\n\n  const reader = ds.readable.getReader()\n  const chunks: Uint8Array[] = []\n  let totalLength = 0\n\n  for (;;) {\n    const { done, value } = await reader.read()\n    if (done) break\n    chunks.push(value)\n    totalLength += value.byteLength\n  }\n\n  const result = new Uint8Array(totalLength)\n  let offset = 0\n  for (const chunk of chunks) {\n    result.set(chunk, offset)\n    offset += chunk.byteLength\n  }\n  return result\n}\n\nfunction decodeBase64Sync(data: string, compression?: TiledCompression): number[] {\n  const bytes = base64ToBytes(data)\n\n  if (compression === 'gzip' || compression === 'zlib') {\n    throw new Error(\n      `Compressed tile data (${compression}) requires the async parser. ` +\n        'Use parseMapAsync() instead of parseMap() for compressed maps.'\n    )\n  }\n\n  if (compression === 'zstd') {\n    throw new Error('zstd compression is not supported in the browser')\n  }\n\n  return bytesToGids(bytes)\n}\n\nasync function decodeBase64Async(data: string, compression?: TiledCompression): Promise<number[]> {\n  const bytes = base64ToBytes(data)\n\n  if (compression === 'gzip' || compression === 'zlib') {\n    const decompressed = await decompressBytesAsync(bytes, compression)\n    return bytesToGids(decompressed)\n  }\n\n  if (compression === 'zstd') {\n    throw new Error('zstd compression is not supported in the browser')\n  }\n\n  return bytesToGids(bytes)\n}\n\nexport function decodeLayerData(\n  data: number[] | string,\n  encoding?: TiledEncoding,\n  compression?: TiledCompression\n): number[] {\n  if (Array.isArray(data)) return data\n  if (encoding === 'csv') return csvToGids(data)\n  if (encoding === 'base64') return decodeBase64Sync(data, compression)\n  throw new Error(`Unsupported encoding: ${encoding ?? 'unknown'}`)\n}\n\nexport async function decodeLayerDataAsync(\n  data: number[] | string,\n  encoding?: TiledEncoding,\n  compression?: TiledCompression\n): Promise<number[]> {\n  if (Array.isArray(data)) return data\n  if (encoding === 'csv') return csvToGids(data)\n  if (encoding === 'base64') return decodeBase64Async(data, compression)\n  throw new Error(`Unsupported encoding: ${encoding ?? 'unknown'}`)\n}\n","// ─── Tiled JSON Map Format Types ─────────────────────────────────────────────\n// Based on Tiled 1.11 JSON Map Format specification\n// https://doc.mapeditor.org/en/stable/reference/json-map-format/\n\nimport type { Container, Texture } from 'pixi.js'\nimport type { GifSource } from 'pixi.js/gif'\n\n// ─── Enums / String Unions ───────────────────────────────────────────────────\n\nexport type TiledOrientation = 'orthogonal' | 'isometric' | 'staggered' | 'hexagonal'\n\nexport type TiledRenderOrder = 'right-down' | 'right-up' | 'left-down' | 'left-up'\n\nexport type TiledStaggerAxis = 'x' | 'y'\n\nexport type TiledStaggerIndex = 'odd' | 'even'\n\nexport type TiledLayerType = 'tilelayer' | 'objectgroup' | 'imagelayer' | 'group'\n\nexport type TiledDrawOrder = 'topdown' | 'index'\n\nexport type TiledEncoding = 'csv' | 'base64'\n\nexport type TiledCompression = 'zlib' | 'gzip' | 'zstd' | ''\n\nexport type TiledPropertyType =\n  | 'string'\n  | 'int'\n  | 'float'\n  | 'bool'\n  | 'color'\n  | 'file'\n  | 'object'\n  | 'class'\n\nexport type TiledObjectAlignment =\n  | 'unspecified'\n  | 'topleft'\n  | 'top'\n  | 'topright'\n  | 'left'\n  | 'center'\n  | 'right'\n  | 'bottomleft'\n  | 'bottom'\n  | 'bottomright'\n\nexport type TiledTileRenderSize = 'tile' | 'grid'\n\nexport type TiledFillMode = 'stretch' | 'preserve-aspect-fit'\n\nexport type TiledGridOrientation = 'orthogonal' | 'isometric'\n\nexport type TiledWangSetType = 'corner' | 'edge' | 'mixed'\n\nexport type TiledHAlign = 'center' | 'right' | 'justify' | 'left'\n\nexport type TiledVAlign = 'center' | 'bottom' | 'top'\n\n// ─── Property ────────────────────────────────────────────────────────────────\n\nexport interface TiledProperty {\n  name: string\n  type: TiledPropertyType\n  propertytype?: string\n  value: string | number | boolean\n}\n\n// ─── Point ───────────────────────────────────────────────────────────────────\n\nexport interface TiledPoint {\n  x: number\n  y: number\n}\n\n// ─── Text ────────────────────────────────────────────────────────────────────\n\nexport interface TiledText {\n  bold?: boolean\n  color?: string\n  fontfamily?: string\n  halign?: TiledHAlign\n  italic?: boolean\n  kerning?: boolean\n  pixelsize?: number\n  strikeout?: boolean\n  text: string\n  underline?: boolean\n  valign?: TiledVAlign\n  wrap?: boolean\n}\n\n// ─── Object ──────────────────────────────────────────────────────────────────\n\nexport interface TiledObject {\n  ellipse?: boolean\n  gid?: number\n  height: number\n  id: number\n  name: string\n  point?: boolean\n  polygon?: TiledPoint[]\n  polyline?: TiledPoint[]\n  properties?: TiledProperty[]\n  rotation: number\n  template?: string\n  text?: TiledText\n  type: string\n  visible: boolean\n  width: number\n  x: number\n  y: number\n}\n\n// ─── Chunk (infinite maps) ───────────────────────────────────────────────────\n\nexport interface TiledChunk {\n  data: number[] | string\n  height: number\n  width: number\n  x: number\n  y: number\n}\n\n// ─── Layer ───────────────────────────────────────────────────────────────────\n\nexport interface TiledLayer {\n  chunks?: TiledChunk[]\n  class?: string\n  compression?: TiledCompression\n  data?: number[] | string\n  draworder?: TiledDrawOrder\n  encoding?: TiledEncoding\n  height?: number\n  id: number\n  image?: string\n  imageheight?: number\n  imagewidth?: number\n  layers?: TiledLayer[]\n  locked?: boolean\n  name: string\n  objects?: TiledObject[]\n  offsetx?: number\n  offsety?: number\n  opacity: number\n  parallaxx?: number\n  parallaxy?: number\n  properties?: TiledProperty[]\n  repeatx?: boolean\n  repeaty?: boolean\n  startx?: number\n  starty?: number\n  tintcolor?: string\n  transparentcolor?: string\n  type: TiledLayerType\n  visible: boolean\n  width?: number\n  x: number\n  y: number\n}\n\n// ─── Frame (tile animation) ──────────────────────────────────────────────────\n\nexport interface TiledFrame {\n  duration: number\n  tileid: number\n}\n\n// ─── Tile Offset ─────────────────────────────────────────────────────────────\n\nexport interface TiledTileOffset {\n  x: number\n  y: number\n}\n\n// ─── Grid ────────────────────────────────────────────────────────────────────\n\nexport interface TiledGrid {\n  height: number\n  orientation: TiledGridOrientation\n  width: number\n}\n\n// ─── Transformations ─────────────────────────────────────────────────────────\n\nexport interface TiledTransformations {\n  hflip: boolean\n  vflip: boolean\n  rotate: boolean\n  preferuntransformed: boolean\n}\n\n// ─── Terrain ─────────────────────────────────────────────────────────────────\n\nexport interface TiledTerrain {\n  name: string\n  properties?: TiledProperty[]\n  tile: number\n}\n\n// ─── Wang Color ──────────────────────────────────────────────────────────────\n\nexport interface TiledWangColor {\n  class?: string\n  color: string\n  name: string\n  probability: number\n  properties?: TiledProperty[]\n  tile: number\n}\n\n// ─── Wang Tile ───────────────────────────────────────────────────────────────\n\nexport interface TiledWangTile {\n  tileid: number\n  wangid: number[]\n}\n\n// ─── Wang Set ────────────────────────────────────────────────────────────────\n\nexport interface TiledWangSet {\n  class?: string\n  colors: TiledWangColor[]\n  name: string\n  properties?: TiledProperty[]\n  tile: number\n  type: TiledWangSetType\n  wangtiles: TiledWangTile[]\n}\n\n// ─── Tile Definition ─────────────────────────────────────────────────────────\n\nexport interface TiledTileDefinition {\n  animation?: TiledFrame[]\n  id: number\n  image?: string\n  imageheight?: number\n  imagewidth?: number\n  x?: number\n  y?: number\n  width?: number\n  height?: number\n  objectgroup?: TiledLayer\n  probability?: number\n  properties?: TiledProperty[]\n  terrain?: number[]\n  type?: string\n}\n\n// ─── Tileset ─────────────────────────────────────────────────────────────────\n\nexport interface TiledTileset {\n  backgroundcolor?: string\n  class?: string\n  columns: number\n  fillmode?: TiledFillMode\n  firstgid: number\n  grid?: TiledGrid\n  image?: string\n  imageheight?: number\n  imagewidth?: number\n  margin: number\n  name: string\n  objectalignment?: TiledObjectAlignment\n  properties?: TiledProperty[]\n  source?: string\n  spacing: number\n  terrains?: TiledTerrain[]\n  tilecount: number\n  tiledversion?: string\n  tileheight: number\n  tileoffset?: TiledTileOffset\n  tilerendersize?: TiledTileRenderSize\n  tiles?: TiledTileDefinition[]\n  tilewidth: number\n  transformations?: TiledTransformations\n  transparentcolor?: string\n  type?: string\n  version?: string\n  wangsets?: TiledWangSet[]\n}\n\n// ─── External tileset reference (before resolution) ──────────────────────────\n\nexport interface TiledTilesetRef {\n  firstgid: number\n  source: string\n}\n\n// ─── Map ─────────────────────────────────────────────────────────────────────\n\nexport interface TiledMap {\n  backgroundcolor?: string\n  class?: string\n  compressionlevel?: number\n  height: number\n  hexsidelength?: number\n  infinite: boolean\n  layers: TiledLayer[]\n  nextlayerid: number\n  nextobjectid: number\n  orientation: TiledOrientation\n  parallaxoriginx?: number\n  parallaxoriginy?: number\n  properties?: TiledProperty[]\n  renderorder?: TiledRenderOrder\n  staggeraxis?: TiledStaggerAxis\n  staggerindex?: TiledStaggerIndex\n  tiledversion?: string\n  tileheight: number\n  tilesets: (TiledTileset | TiledTilesetRef)[]\n  tilewidth: number\n  type: 'map'\n  version: string\n  width: number\n}\n\n// ─── Object Template ─────────────────────────────────────────────────────────\n\nexport interface TiledObjectTemplate {\n  type: 'template'\n  tileset?: TiledTileset | TiledTilesetRef\n  object: TiledObject\n}\n\n// ─── GID Bit Flags ───────────────────────────────────────────────────────────\n\nexport const FLIPPED_HORIZONTALLY_FLAG = 0x80000000\nexport const FLIPPED_VERTICALLY_FLAG = 0x40000000\nexport const FLIPPED_DIAGONALLY_FLAG = 0x20000000\nexport const ROTATED_HEXAGONAL_120_FLAG = 0x10000000\nexport const GID_MASK = 0x0fffffff\n\n// ─── Resolved types (post-parse, used by renderer) ──────────────────────────\n\nexport interface ResolvedTile {\n  gid: number\n  localId: number\n  tilesetIndex: number\n  horizontalFlip: boolean\n  verticalFlip: boolean\n  diagonalFlip: boolean\n}\n\nexport interface ResolvedObject {\n  id: number\n  name: string\n  type: string\n  x: number\n  y: number\n  width: number\n  height: number\n  rotation: number\n  visible: boolean\n  properties?: TiledProperty[]\n  tile?: ResolvedTile\n  text?: TiledText\n  ellipse?: boolean\n  point?: boolean\n  polygon?: TiledPoint[]\n  polyline?: TiledPoint[]\n}\n\nexport interface ResolvedChunk {\n  x: number\n  y: number\n  width: number\n  height: number\n  tiles: (ResolvedTile | null)[]\n}\n\nexport interface ResolvedTileLayer {\n  type: 'tilelayer'\n  id: number\n  name: string\n  opacity: number\n  visible: boolean\n  offsetx: number\n  offsety: number\n  parallaxx: number\n  parallaxy: number\n  tintcolor?: string\n  properties: TiledProperty[]\n  width: number\n  height: number\n  infinite: boolean\n  tiles: (ResolvedTile | null)[]\n  chunks?: ResolvedChunk[]\n}\n\nexport interface ResolvedImageLayer {\n  type: 'imagelayer'\n  id: number\n  name: string\n  opacity: number\n  visible: boolean\n  offsetx: number\n  offsety: number\n  parallaxx: number\n  parallaxy: number\n  tintcolor?: string\n  properties: TiledProperty[]\n  image: string\n  imagewidth?: number\n  imageheight?: number\n  repeatx: boolean\n  repeaty: boolean\n  transparentcolor?: string\n}\n\nexport interface ResolvedObjectLayer {\n  type: 'objectgroup'\n  id: number\n  name: string\n  opacity: number\n  visible: boolean\n  offsetx: number\n  offsety: number\n  parallaxx: number\n  parallaxy: number\n  tintcolor?: string\n  properties: TiledProperty[]\n  draworder: TiledDrawOrder\n  objects: ResolvedObject[]\n}\n\nexport interface ResolvedGroupLayer {\n  type: 'group'\n  id: number\n  name: string\n  opacity: number\n  visible: boolean\n  offsetx: number\n  offsety: number\n  parallaxx: number\n  parallaxy: number\n  tintcolor?: string\n  properties: TiledProperty[]\n  layers: ResolvedLayer[]\n}\n\nexport type ResolvedLayer =\n  | ResolvedTileLayer\n  | ResolvedImageLayer\n  | ResolvedObjectLayer\n  | ResolvedGroupLayer\n\nexport interface ResolvedTileset {\n  firstgid: number\n  name: string\n  source?: string\n  tilewidth: number\n  tileheight: number\n  columns: number\n  tilecount: number\n  margin: number\n  spacing: number\n  image?: string\n  imagewidth?: number\n  imageheight?: number\n  tileoffset: TiledTileOffset\n  objectalignment: TiledObjectAlignment\n  tilerendersize: TiledTileRenderSize\n  fillmode: TiledFillMode\n  tiles: Map<number, TiledTileDefinition>\n  properties: TiledProperty[]\n  transformations?: TiledTransformations\n  grid?: TiledGrid\n  wangsets?: TiledWangSet[]\n  terrains?: TiledTerrain[]\n}\n\nexport interface ResolvedMap {\n  orientation: TiledOrientation\n  renderorder: TiledRenderOrder\n  width: number\n  height: number\n  tilewidth: number\n  tileheight: number\n  infinite: boolean\n  backgroundcolor?: string\n  hexsidelength?: number\n  staggeraxis?: TiledStaggerAxis\n  staggerindex?: TiledStaggerIndex\n  parallaxoriginx: number\n  parallaxoriginy: number\n  properties: TiledProperty[]\n  tilesets: ResolvedTileset[]\n  layers: ResolvedLayer[]\n  version: string\n  tiledversion?: string\n}\n\n// ─── Parser options ──────────────────────────────────────────────────────────\n\nexport interface ParseOptions {\n  externalTilesets?: Map<string, TiledTileset>\n  templates?: Map<string, TiledObjectTemplate>\n}\n\n// ─── Renderer options ────────────────────────────────────────────────────────\n\nexport interface TiledMapOptions {\n  tilesetTextures?: Map<string, Texture>\n  imageLayerTextures?: Map<string, Texture>\n  tileImageTextures?: Map<string, Texture>\n  tileImageGifSources?: Map<string, GifSource>\n  imageLayerGifSources?: Map<string, GifSource>\n  /**\n   * Render only layers accepted by this predicate. Group layers are kept when\n   * they match directly or contain a matching descendant.\n   */\n  layerFilter?: TiledLayerFilter\n  /**\n   * Extra pixels added to full-size orthogonal tile sprites to hide subpixel\n   * seams when the map container is scaled by a fractional amount.\n   *\n   * Set to 0 to disable.\n   */\n  tileSpritePadding?: number\n}\n\nexport type TiledLayerFilter = (layer: ResolvedLayer) => boolean\n\nexport interface TiledMapAsset {\n  mapData: ResolvedMap\n  container: Container\n}\n\n// ─── Tile placement ──────────────────────────────────────────────────────────\n\nexport interface MapContext {\n  orientation: TiledOrientation\n  renderorder: TiledRenderOrder\n  tilewidth: number\n  tileheight: number\n  hexsidelength?: number\n  staggeraxis?: TiledStaggerAxis\n  staggerindex?: TiledStaggerIndex\n  /** Map width in pixels; used by image layers when tiling (repeatx/repeaty). */\n  mapPixelWidth?: number\n  /** Map height in pixels; used by image layers when tiling (repeatx/repeaty). */\n  mapPixelHeight?: number\n  tileSpritePadding?: number\n}\n\nexport interface TilePosition {\n  x: number\n  y: number\n}\n","import type { ResolvedTile } from '../types'\nimport {\n  FLIPPED_DIAGONALLY_FLAG,\n  FLIPPED_HORIZONTALLY_FLAG,\n  FLIPPED_VERTICALLY_FLAG,\n  GID_MASK\n} from '../types'\n\nexport function decodeGid(raw: number): ResolvedTile | null {\n  const gid = raw & GID_MASK\n  if (gid === 0) return null\n\n  return {\n    gid,\n    localId: 0,\n    tilesetIndex: 0,\n    horizontalFlip: (raw & FLIPPED_HORIZONTALLY_FLAG) !== 0,\n    verticalFlip: (raw & FLIPPED_VERTICALLY_FLAG) !== 0,\n    diagonalFlip: (raw & FLIPPED_DIAGONALLY_FLAG) !== 0\n  }\n}\n","export function str(el: Element, name: string, fallback = ''): string {\n  return el.getAttribute(name) ?? fallback\n}\n\nexport function int(el: Element, name: string, fallback = 0): number {\n  const value = el.getAttribute(name)\n  return value != null ? parseInt(value, 10) : fallback\n}\n\nexport function float(el: Element, name: string, fallback = 0): number {\n  const value = el.getAttribute(name)\n  return value != null ? parseFloat(value) : fallback\n}\n\nexport function bool(el: Element, name: string, fallback = false): boolean {\n  const value = el.getAttribute(name)\n  if (value == null) return fallback\n  return value === '1' || value === 'true'\n}\n\nexport function optStr(el: Element, name: string): string | undefined {\n  const value = el.getAttribute(name)\n  return value != null ? value : undefined\n}\n\nexport function optInt(el: Element, name: string): number | undefined {\n  const value = el.getAttribute(name)\n  return value != null ? parseInt(value, 10) : undefined\n}\n\nexport function optFloat(el: Element, name: string): number | undefined {\n  const value = el.getAttribute(name)\n  return value != null ? parseFloat(value) : undefined\n}\n\nexport function children(el: Element, tag: string): Element[] {\n  const result: Element[] = []\n  for (let i = 0; i < el.children.length; i++) {\n    const child = el.children[i]!\n    if (child.tagName === tag) result.push(child)\n  }\n  return result\n}\n\nexport function child(el: Element, tag: string): Element | null {\n  for (let i = 0; i < el.children.length; i++) {\n    const current = el.children[i]!\n    if (current.tagName === tag) return current\n  }\n  return null\n}\n","import type { TiledChunk, TiledCompression, TiledEncoding } from '../types'\nimport { csvToGids } from './decodeData.js'\nimport { children, int, optStr } from './xmlHelpers.js'\n\nexport function parseData(dataEl: Element): {\n  data?: number[] | string\n  encoding?: TiledEncoding\n  compression?: TiledCompression\n  chunks?: TiledChunk[]\n} {\n  const encoding = optStr(dataEl, 'encoding') as TiledEncoding | undefined\n  const compression = optStr(dataEl, 'compression') as TiledCompression | undefined\n\n  const chunkEls = children(dataEl, 'chunk')\n  if (chunkEls.length > 0) {\n    const chunks: TiledChunk[] = chunkEls.map((c) => ({\n      x: int(c, 'x'),\n      y: int(c, 'y'),\n      width: int(c, 'width'),\n      height: int(c, 'height'),\n      data: parseDataContent(c, encoding)\n    }))\n    return { encoding, compression, chunks }\n  }\n\n  return {\n    data: parseDataContent(dataEl, encoding),\n    encoding,\n    compression\n  }\n}\n\nfunction parseDataContent(el: Element, encoding: TiledEncoding | undefined): number[] | string {\n  if (encoding === 'base64') {\n    return (el.textContent ?? '').trim()\n  }\n\n  if (encoding === 'csv') {\n    return csvToGids(el.textContent ?? '')\n  }\n\n  const tileEls = children(el, 'tile')\n  return tileEls.map((t) => int(t, 'gid'))\n}\n","import type { TiledProperty, TiledPropertyType } from '../types'\nimport { child, children, str } from './xmlHelpers.js'\n\nexport function parseProperties(el: Element): TiledProperty[] | undefined {\n  const propsEl = child(el, 'properties')\n  if (!propsEl) return undefined\n\n  const props: TiledProperty[] = []\n  for (const pEl of children(propsEl, 'property')) {\n    const type = str(pEl, 'type', 'string') as TiledPropertyType\n    let value: string | number | boolean = str(pEl, 'value', '')\n    if (!pEl.hasAttribute('value')) {\n      value = pEl.textContent ?? ''\n    }\n    if (type === 'int') value = parseInt(value as string, 10)\n    else if (type === 'float') value = parseFloat(value as string)\n    else if (type === 'bool') value = value === 'true'\n\n    props.push({\n      name: str(pEl, 'name'),\n      type,\n      propertytype: pEl.getAttribute('propertytype') ?? undefined,\n      value\n    })\n  }\n  return props.length > 0 ? props : undefined\n}\n","import type { TiledHAlign, TiledObject, TiledPoint, TiledText, TiledVAlign } from '../types'\nimport { parseProperties } from './tmxProperties.js'\nimport { bool, child, float, int, optInt, optStr, str } from './xmlHelpers.js'\n\nexport function parseObject(el: Element): TiledObject {\n  const obj: TiledObject = {\n    id: int(el, 'id'),\n    name: str(el, 'name'),\n    type: str(el, 'type') || str(el, 'class'),\n    x: float(el, 'x'),\n    y: float(el, 'y'),\n    width: float(el, 'width'),\n    height: float(el, 'height'),\n    rotation: float(el, 'rotation'),\n    visible: el.hasAttribute('visible') ? bool(el, 'visible', true) : true,\n    properties: parseProperties(el)\n  }\n\n  const gid = optInt(el, 'gid')\n  if (gid != null) obj.gid = gid\n\n  const template = optStr(el, 'template')\n  if (template) obj.template = template\n\n  if (child(el, 'ellipse')) obj.ellipse = true\n  if (child(el, 'point')) obj.point = true\n\n  const polygonEl = child(el, 'polygon')\n  if (polygonEl) {\n    obj.polygon = parsePoints(str(polygonEl, 'points'))\n  }\n\n  const polylineEl = child(el, 'polyline')\n  if (polylineEl) {\n    obj.polyline = parsePoints(str(polylineEl, 'points'))\n  }\n\n  const textEl = child(el, 'text')\n  if (textEl) {\n    obj.text = parseTextObject(textEl)\n  }\n\n  return obj\n}\n\nfunction parsePoints(pointStr: string): TiledPoint[] {\n  return pointStr\n    .trim()\n    .split(/\\s+/)\n    .map((pair) => {\n      const [x, y] = pair.split(',').map(Number)\n      return { x: x!, y: y! }\n    })\n}\n\nfunction parseTextObject(el: Element): TiledText {\n  return {\n    text: el.textContent ?? '',\n    fontfamily: optStr(el, 'fontfamily'),\n    pixelsize: optInt(el, 'pixelsize'),\n    wrap: bool(el, 'wrap') ? true : undefined,\n    color: optStr(el, 'color'),\n    bold: bool(el, 'bold') ? true : undefined,\n    italic: bool(el, 'italic') ? true : undefined,\n    underline: bool(el, 'underline') ? true : undefined,\n    strikeout: bool(el, 'strikeout') ? true : undefined,\n    kerning: el.hasAttribute('kerning') ? bool(el, 'kerning', true) : undefined,\n    halign: optStr(el, 'halign') as TiledHAlign | undefined,\n    valign: optStr(el, 'valign') as TiledVAlign | undefined\n  }\n}\n","import type { TiledTileset, TiledTilesetRef } from '../types'\n\nexport function isTilesetRef(ts: TiledTileset | TiledTilesetRef): ts is TiledTilesetRef {\n  return 'source' in ts && !('name' in ts)\n}\n\ninterface ColumnsSource {\n  columns?: number\n  imagewidth?: number\n  tilewidth: number\n  margin: number\n  spacing: number\n}\n\nexport function computeTilesetColumns(ts: ColumnsSource): number {\n  if (ts.columns && ts.columns > 0) return ts.columns\n  if (!ts.imagewidth || ts.tilewidth <= 0) return 0\n  return Math.floor((ts.imagewidth - 2 * ts.margin + ts.spacing) / (ts.tilewidth + ts.spacing))\n}\n\n/**\n * Finds the index of the tileset whose firstgid range contains `gid`.\n * Works with any array where each element exposes `firstgid`.\n * Returns -1 when no tileset matches.\n */\nexport function findTilesetIndexForGid(gid: number, tilesets: { firstgid: number }[]): number {\n  for (let i = tilesets.length - 1; i >= 0; i--) {\n    const ts = tilesets[i]\n    if (ts && ts.firstgid <= gid) return i\n  }\n  return -1\n}\n\n/**\n * Finds the tileset entry whose firstgid range contains `gid`.\n * Accepts a key function to extract firstgid from arbitrary element types.\n * Returns undefined when no tileset matches.\n */\nexport function findTilesetForGid<T>(\n  gid: number,\n  tilesets: T[],\n  getFirstGid: (t: T) => number\n): T | undefined {\n  for (let i = tilesets.length - 1; i >= 0; i--) {\n    const ts = tilesets[i]\n    if (ts && getFirstGid(ts) <= gid) return ts\n  }\n  return undefined\n}\n","import type {\n  TiledFillMode,\n  TiledFrame,\n  TiledGrid,\n  TiledGridOrientation,\n  TiledLayer,\n  TiledObjectAlignment,\n  TiledTerrain,\n  TiledTileDefinition,\n  TiledTileOffset,\n  TiledTileRenderSize,\n  TiledTileset,\n  TiledTilesetRef,\n  TiledTransformations,\n  TiledWangColor,\n  TiledWangSet,\n  TiledWangSetType,\n  TiledWangTile\n} from '../types'\nimport { computeTilesetColumns } from './tilesetHelpers.js'\nimport { parseProperties } from './tmxProperties.js'\nimport { bool, child, children, float, int, optFloat, optInt, optStr, str } from './xmlHelpers.js'\n\nexport interface ImageInfo {\n  image?: string\n  imagewidth?: number\n  imageheight?: number\n  transparentcolor?: string\n}\n\nexport type ObjectGroupParser = (el: Element) => TiledLayer\n\nexport function parseImage(el: Element): ImageInfo {\n  const imgEl = child(el, 'image')\n  if (!imgEl) return {}\n  return {\n    image: optStr(imgEl, 'source'),\n    imagewidth: optInt(imgEl, 'width'),\n    imageheight: optInt(imgEl, 'height'),\n    transparentcolor: optStr(imgEl, 'trans')\n  }\n}\n\nexport function parseTileset(\n  el: Element,\n  parseObjectGroup?: ObjectGroupParser\n): TiledTileset | TiledTilesetRef {\n  const source = optStr(el, 'source')\n  if (source) {\n    return {\n      firstgid: int(el, 'firstgid'),\n      source\n    } satisfies TiledTilesetRef\n  }\n\n  const img = parseImage(el)\n  const tiles = parseTileDefinitions(el, parseObjectGroup)\n\n  const tilewidth = int(el, 'tilewidth')\n  const spacing = int(el, 'spacing')\n  const margin = int(el, 'margin')\n  const columns = computeTilesetColumns({\n    columns: int(el, 'columns'),\n    imagewidth: img.imagewidth,\n    tilewidth,\n    margin,\n    spacing\n  })\n\n  return {\n    backgroundcolor: optStr(el, 'backgroundcolor'),\n    class: optStr(el, 'class'),\n    columns,\n    fillmode: optStr(el, 'fillmode') as TiledFillMode | undefined,\n    firstgid: int(el, 'firstgid'),\n    grid: parseGrid(el),\n    margin,\n    name: str(el, 'name'),\n    objectalignment: optStr(el, 'objectalignment') as TiledObjectAlignment | undefined,\n    properties: parseProperties(el),\n    spacing,\n    terrains: parseTerrains(el),\n    tilecount: int(el, 'tilecount'),\n    tileheight: int(el, 'tileheight'),\n    tileoffset: parseTileOffset(el),\n    tilerendersize: optStr(el, 'tilerendersize') as TiledTileRenderSize | undefined,\n    tiles,\n    tilewidth,\n    transformations: parseTransformations(el),\n    wangsets: parseWangSets(el),\n    ...img\n  } satisfies TiledTileset\n}\n\nfunction parseTileOffset(el: Element): TiledTileOffset | undefined {\n  const to = child(el, 'tileoffset')\n  if (!to) return undefined\n  return { x: int(to, 'x'), y: int(to, 'y') }\n}\n\nfunction parseGrid(el: Element): TiledGrid | undefined {\n  const g = child(el, 'grid')\n  if (!g) return undefined\n  return {\n    orientation: str(g, 'orientation', 'orthogonal') as TiledGridOrientation,\n    width: int(g, 'width'),\n    height: int(g, 'height')\n  }\n}\n\nfunction parseTransformations(el: Element): TiledTransformations | undefined {\n  const t = child(el, 'transformations')\n  if (!t) return undefined\n  return {\n    hflip: bool(t, 'hflip'),\n    vflip: bool(t, 'vflip'),\n    rotate: bool(t, 'rotate'),\n    preferuntransformed: bool(t, 'preferuntransformed')\n  }\n}\n\nfunction parseTerrains(el: Element): TiledTerrain[] | undefined {\n  const ttEl = child(el, 'terraintypes')\n  if (!ttEl) return undefined\n  return children(ttEl, 'terrain').map((t) => ({\n    name: str(t, 'name'),\n    tile: int(t, 'tile'),\n    properties: parseProperties(t)\n  }))\n}\n\nfunction parseWangSets(el: Element): TiledWangSet[] | undefined {\n  const wsEl = child(el, 'wangsets')\n  if (!wsEl) return undefined\n\n  return children(wsEl, 'wangset').map((ws) => {\n    const colors: TiledWangColor[] = children(ws, 'wangcolor').map((wc) => ({\n      class: optStr(wc, 'class'),\n      color: str(wc, 'color'),\n      name: str(wc, 'name'),\n      probability: float(wc, 'probability'),\n      tile: int(wc, 'tile'),\n      properties: parseProperties(wc)\n    }))\n\n    const tiles: TiledWangTile[] = children(ws, 'wangtile').map((wt) => ({\n      tileid: int(wt, 'tileid'),\n      wangid: str(wt, 'wangid').split(',').map(Number)\n    }))\n\n    return {\n      class: optStr(ws, 'class'),\n      colors,\n      name: str(ws, 'name'),\n      properties: parseProperties(ws),\n      tile: int(ws, 'tile'),\n      type: str(ws, 'type', 'corner') as TiledWangSetType,\n      wangtiles: tiles\n    } satisfies TiledWangSet\n  })\n}\n\nfunction parseAnimation(el: Element): TiledFrame[] | undefined {\n  const animEl = child(el, 'animation')\n  if (!animEl) return undefined\n  return children(animEl, 'frame').map((f) => ({\n    tileid: int(f, 'tileid'),\n    duration: int(f, 'duration')\n  }))\n}\n\nfunction parseTileDefinitions(\n  el: Element,\n  parseObjectGroup?: ObjectGroupParser\n): TiledTileDefinition[] | undefined {\n  const tileEls = children(el, 'tile')\n  if (tileEls.length === 0) return undefined\n\n  return tileEls.map((t) => {\n    const img = parseImage(t)\n    const terrainAttr = optStr(t, 'terrain')\n    const terrain = terrainAttr\n      ? terrainAttr.split(',').map((v) => (v === '' ? -1 : parseInt(v, 10)))\n      : undefined\n\n    const ogEl = child(t, 'objectgroup')\n    const objectgroup = ogEl && parseObjectGroup ? parseObjectGroup(ogEl) : undefined\n\n    return {\n      id: int(t, 'id'),\n      type: optStr(t, 'type') ?? optStr(t, 'class'),\n      probability: optFloat(t, 'probability'),\n      x: optInt(t, 'x'),\n      y: optInt(t, 'y'),\n      width: optInt(t, 'width'),\n      height: optInt(t, 'height'),\n      properties: parseProperties(t),\n      animation: parseAnimation(t),\n      terrain,\n      objectgroup,\n      ...img\n    }\n  })\n}\n","import type {\n  TiledDrawOrder,\n  TiledLayer,\n  TiledLayerType,\n  TiledMap,\n  TiledObjectTemplate,\n  TiledOrientation,\n  TiledRenderOrder,\n  TiledStaggerAxis,\n  TiledStaggerIndex,\n  TiledTileset,\n  TiledTilesetRef\n} from '../types'\nimport { parseData } from './tmxData.js'\nimport { parseObject } from './tmxObjects.js'\nimport { parseProperties } from './tmxProperties.js'\nimport { parseImage, parseTileset } from './tmxTilesets.js'\nimport { bool, child, children, float, int, optFloat, optInt, optStr, str } from './xmlHelpers.js'\n\n// ─── Layers ─────────────────────────────────────────────────────────────────\n\nfunction parseLayerCommon(el: Element): Partial<TiledLayer> {\n  return {\n    id: int(el, 'id'),\n    name: str(el, 'name'),\n    class: optStr(el, 'class'),\n    opacity: float(el, 'opacity', 1),\n    visible: el.hasAttribute('visible') ? bool(el, 'visible', true) : true,\n    tintcolor: optStr(el, 'tintcolor'),\n    offsetx: optFloat(el, 'offsetx'),\n    offsety: optFloat(el, 'offsety'),\n    parallaxx: optFloat(el, 'parallaxx'),\n    parallaxy: optFloat(el, 'parallaxy'),\n    locked: el.hasAttribute('locked') ? bool(el, 'locked') : undefined,\n    properties: parseProperties(el),\n    x: int(el, 'x'),\n    y: int(el, 'y')\n  }\n}\n\nfunction parseTileLayer(el: Element): TiledLayer {\n  const dataEl = child(el, 'data')\n  const dataInfo = dataEl ? parseData(dataEl) : {}\n\n  return {\n    ...parseLayerCommon(el),\n    type: 'tilelayer' as TiledLayerType,\n    width: optInt(el, 'width'),\n    height: optInt(el, 'height'),\n    startx: optInt(el, 'startx'),\n    starty: optInt(el, 'starty'),\n    ...dataInfo\n  } as TiledLayer\n}\n\nfunction parseObjectGroup(el: Element): TiledLayer {\n  return {\n    ...parseLayerCommon(el),\n    type: 'objectgroup' as TiledLayerType,\n    draworder: optStr(el, 'draworder') as TiledDrawOrder | undefined,\n    objects: children(el, 'object').map(parseObject)\n  } as TiledLayer\n}\n\nfunction parseImageLayer(el: Element): TiledLayer {\n  const img = parseImage(el)\n  return {\n    ...parseLayerCommon(el),\n    type: 'imagelayer' as TiledLayerType,\n    repeatx: el.hasAttribute('repeatx') ? bool(el, 'repeatx') : undefined,\n    repeaty: el.hasAttribute('repeaty') ? bool(el, 'repeaty') : undefined,\n    transparentcolor: img.transparentcolor,\n    image: img.image,\n    imagewidth: img.imagewidth,\n    imageheight: img.imageheight\n  } as TiledLayer\n}\n\nfunction parseGroupLayer(el: Element): TiledLayer {\n  return {\n    ...parseLayerCommon(el),\n    type: 'group' as TiledLayerType,\n    layers: parseLayers(el)\n  } as TiledLayer\n}\n\nfunction parseLayers(parentEl: Element): TiledLayer[] {\n  const layers: TiledLayer[] = []\n  for (let i = 0; i < parentEl.children.length; i++) {\n    const el = parentEl.children[i]!\n    switch (el.tagName) {\n      case 'layer':\n        layers.push(parseTileLayer(el))\n        break\n      case 'objectgroup':\n        layers.push(parseObjectGroup(el))\n        break\n      case 'imagelayer':\n        layers.push(parseImageLayer(el))\n        break\n      case 'group':\n        layers.push(parseGroupLayer(el))\n        break\n    }\n  }\n  return layers\n}\n\n// ─── Map ────────────────────────────────────────────────────────────────────\n\nexport function parseTmx(xml: string): TiledMap {\n  const parser = new DOMParser()\n  const doc = parser.parseFromString(xml, 'text/xml')\n\n  const errorNode = doc.querySelector('parsererror')\n  if (errorNode) {\n    throw new Error(`TMX XML parse error: ${errorNode.textContent}`)\n  }\n\n  const mapEl = doc.documentElement\n  if (mapEl.tagName !== 'map') {\n    throw new Error(`Expected root <map> element, got <${mapEl.tagName}>`)\n  }\n\n  const tilesets: (TiledTileset | TiledTilesetRef)[] = children(mapEl, 'tileset').map((el) =>\n    parseTileset(el, parseObjectGroup)\n  )\n\n  const layers = parseLayers(mapEl)\n\n  return {\n    backgroundcolor: optStr(mapEl, 'backgroundcolor'),\n    class: optStr(mapEl, 'class'),\n    compressionlevel: optInt(mapEl, 'compressionlevel'),\n    height: int(mapEl, 'height'),\n    hexsidelength: optInt(mapEl, 'hexsidelength'),\n    infinite: bool(mapEl, 'infinite'),\n    layers,\n    nextlayerid: int(mapEl, 'nextlayerid'),\n    nextobjectid: int(mapEl, 'nextobjectid'),\n    orientation: str(mapEl, 'orientation', 'orthogonal') as TiledOrientation,\n    parallaxoriginx: optFloat(mapEl, 'parallaxoriginx'),\n    parallaxoriginy: optFloat(mapEl, 'parallaxoriginy'),\n    properties: parseProperties(mapEl),\n    renderorder: optStr(mapEl, 'renderorder') as TiledRenderOrder | undefined,\n    staggeraxis: optStr(mapEl, 'staggeraxis') as TiledStaggerAxis | undefined,\n    staggerindex: optStr(mapEl, 'staggerindex') as TiledStaggerIndex | undefined,\n    tiledversion: optStr(mapEl, 'tiledversion'),\n    tileheight: int(mapEl, 'tileheight'),\n    tilesets,\n    tilewidth: int(mapEl, 'tilewidth'),\n    type: 'map',\n    version: str(mapEl, 'version', '1.0'),\n    width: int(mapEl, 'width')\n  }\n}\n\nexport function parseTsx(xml: string): TiledTileset {\n  const parser = new DOMParser()\n  const doc = parser.parseFromString(xml, 'text/xml')\n\n  const errorNode = doc.querySelector('parsererror')\n  if (errorNode) {\n    throw new Error(`TSX XML parse error: ${errorNode.textContent}`)\n  }\n\n  const tsEl = doc.documentElement\n  if (tsEl.tagName !== 'tileset') {\n    throw new Error(`Expected root <tileset> element, got <${tsEl.tagName}>`)\n  }\n\n  const result = parseTileset(tsEl, parseObjectGroup)\n  if ('source' in result) {\n    throw new Error('TSX file should not contain a source reference')\n  }\n  return result\n}\n\n// ─── Template (TX) ──────────────────────────────────────────────────────────\n\nexport function parseTx(xml: string): TiledObjectTemplate {\n  const parser = new DOMParser()\n  const doc = parser.parseFromString(xml, 'text/xml')\n\n  const errorNode = doc.querySelector('parsererror')\n  if (errorNode) {\n    throw new Error(`TX XML parse error: ${errorNode.textContent}`)\n  }\n\n  const tplEl = doc.documentElement\n  if (tplEl.tagName !== 'template') {\n    throw new Error(`Expected root <template> element, got <${tplEl.tagName}>`)\n  }\n\n  const tilesetEl = child(tplEl, 'tileset')\n  const objectEl = child(tplEl, 'object')\n  if (!objectEl) {\n    throw new Error('Template is missing <object>')\n  }\n\n  return {\n    type: 'template',\n    tileset: tilesetEl ? parseTileset(tilesetEl, parseObjectGroup) : undefined,\n    object: parseObject(objectEl)\n  }\n}\n","import type { ResolvedTileset, TiledObject, TiledObjectTemplate } from '../types'\nimport { GID_MASK } from '../types'\n\n/**\n * Merges a template into an object instance. The template provides default\n * field values; the instance's own fields win. After merging, any GID that\n * originated from the template is remapped from the template's firstgid space\n * into the map's firstgid space so it points at the correct tile.\n */\nexport function mergeTemplate(\n  obj: TiledObject,\n  template: TiledObjectTemplate,\n  tilesets: ResolvedTileset[]\n): TiledObject {\n  const base: TiledObject = {\n    ...template.object,\n    id: obj.id,\n    x: obj.x,\n    y: obj.y,\n    rotation: obj.rotation,\n    visible: obj.visible\n  }\n\n  // Non-optional string fields: prefer instance only when non-empty (Tiled\n  // stores empty string when the instance didn't set the field).\n  if (obj.name) base.name = obj.name\n  if (obj.type) base.type = obj.type\n  if (obj.width) base.width = obj.width\n  if (obj.height) base.height = obj.height\n  if (obj.properties) base.properties = obj.properties\n  if (obj.text) base.text = obj.text\n  const gidComesFromInstance = obj.gid !== undefined\n  if (gidComesFromInstance) base.gid = obj.gid\n  if (obj.polygon) base.polygon = obj.polygon\n  if (obj.polyline) base.polyline = obj.polyline\n  if (obj.ellipse) base.ellipse = obj.ellipse\n  if (obj.point) base.point = obj.point\n\n  // GID remapping: the template's gid is relative to the template's own\n  // embedded tileset firstgid. If the template carried an external tileset\n  // ref (with a source path) and the map contains the same tileset (matched\n  // by source), translate the gid into the map's firstgid space.\n  if (\n    base.gid !== undefined &&\n    !gidComesFromInstance &&\n    template.tileset &&\n    'source' in template.tileset &&\n    template.tileset.source\n  ) {\n    const src = template.tileset.source\n    const mapTs = tilesets.find((t) => t.source === src)\n    if (mapTs) {\n      const templateFirstGid = template.tileset.firstgid ?? 1\n      const flipBits = base.gid & ~GID_MASK\n      const localId = (base.gid & GID_MASK) - templateFirstGid\n      if (localId >= 0) {\n        base.gid = (mapTs.firstgid + localId) | flipBits\n      }\n    }\n  }\n\n  return base\n}\n","import type {\n  ParseOptions,\n  ResolvedChunk,\n  ResolvedGroupLayer,\n  ResolvedImageLayer,\n  ResolvedLayer,\n  ResolvedMap,\n  ResolvedObject,\n  ResolvedObjectLayer,\n  ResolvedTile,\n  ResolvedTileLayer,\n  ResolvedTileset,\n  TiledChunk,\n  TiledDrawOrder,\n  TiledLayer,\n  TiledMap,\n  TiledObject,\n  TiledObjectTemplate,\n  TiledRenderOrder,\n  TiledTileDefinition,\n  TiledTileset,\n  TiledTilesetRef\n} from '../types'\nimport { decodeLayerData, decodeLayerDataAsync } from './decodeData.js'\nimport { decodeGid } from './decodeGid.js'\nimport { mergeTemplate } from './mergeTemplate.js'\nimport { computeTilesetColumns, findTilesetIndexForGid, isTilesetRef } from './tilesetHelpers.js'\n\n// ─── Resolve tileset ─────────────────────────────────────────────────────────\n\nfunction resolveTileset(raw: TiledTileset, source?: string): ResolvedTileset {\n  const tiles = new Map<number, TiledTileDefinition>()\n  if (raw.tiles) {\n    for (const tile of raw.tiles) {\n      tiles.set(tile.id, tile)\n    }\n  }\n\n  return {\n    firstgid: raw.firstgid,\n    name: raw.name,\n    source,\n    tilewidth: raw.tilewidth,\n    tileheight: raw.tileheight,\n    columns: computeTilesetColumns(raw),\n    tilecount: raw.tilecount,\n    margin: raw.margin,\n    spacing: raw.spacing,\n    image: raw.image,\n    imagewidth: raw.imagewidth,\n    imageheight: raw.imageheight,\n    tileoffset: raw.tileoffset ?? { x: 0, y: 0 },\n    objectalignment: raw.objectalignment ?? 'unspecified',\n    tilerendersize: raw.tilerendersize ?? 'tile',\n    fillmode: raw.fillmode ?? 'stretch',\n    tiles,\n    properties: raw.properties ?? [],\n    transformations: raw.transformations,\n    grid: raw.grid,\n    wangsets: raw.wangsets,\n    terrains: raw.terrains\n  }\n}\n\n// ─── Resolve tile data ───────────────────────────────────────────────────────\n\nfunction resolveGids(rawGids: number[], tilesets: ResolvedTileset[]): (ResolvedTile | null)[] {\n  const result: (ResolvedTile | null)[] = new Array(rawGids.length)\n\n  for (let i = 0; i < rawGids.length; i++) {\n    result[i] = resolveTileGid(rawGids[i], tilesets)\n  }\n\n  return result\n}\n\nfunction resolveTileGid(\n  rawGid: number | undefined,\n  tilesets: ResolvedTileset[],\n  options?: { requireTileset: boolean }\n): ResolvedTile | null {\n  if (rawGid === undefined || rawGid === 0) return null\n\n  const decoded = decodeGid(rawGid)\n  if (!decoded) return null\n\n  const tsIdx = findTilesetIndexForGid(decoded.gid, tilesets)\n  const ts = tsIdx >= 0 ? tilesets[tsIdx] : undefined\n  if (!ts) return options?.requireTileset ? null : decoded\n\n  decoded.tilesetIndex = tsIdx\n  decoded.localId = decoded.gid - ts.firstgid\n  return decoded\n}\n\n// ─── Layer defaults ──────────────────────────────────────────────────────────\n\nfunction layerDefaults(layer: TiledLayer) {\n  return {\n    id: layer.id,\n    name: layer.name,\n    opacity: layer.opacity,\n    visible: layer.visible,\n    offsetx: layer.offsetx ?? 0,\n    offsety: layer.offsety ?? 0,\n    parallaxx: layer.parallaxx ?? 1,\n    parallaxy: layer.parallaxy ?? 1,\n    tintcolor: layer.tintcolor,\n    properties: layer.properties ?? []\n  }\n}\n\nfunction resolveObjects(\n  objects: TiledObject[],\n  tilesets: ResolvedTileset[],\n  templates?: Map<string, TiledObjectTemplate>\n): ResolvedObject[] {\n  return objects.map((raw): ResolvedObject => {\n    let merged: TiledObject = raw\n    if (raw.template && templates) {\n      const tpl = templates.get(raw.template)\n      if (tpl) merged = mergeTemplate(raw, tpl, tilesets)\n    }\n\n    const { gid, template: _template, ...rest } = merged\n    const resolved: ResolvedObject = rest\n\n    if (gid !== undefined) {\n      const tile = resolveTileGid(gid, tilesets, { requireTileset: true })\n      if (tile) resolved.tile = tile\n    }\n\n    return resolved\n  })\n}\n\n// ─── Shared non-tilelayer resolution (sync — no data decoding needed) ───────\n\nfunction resolveImageLayer(layer: TiledLayer): ResolvedImageLayer {\n  return {\n    type: 'imagelayer',\n    ...layerDefaults(layer),\n    image: layer.image ?? '',\n    imagewidth: layer.imagewidth,\n    imageheight: layer.imageheight,\n    repeatx: layer.repeatx ?? false,\n    repeaty: layer.repeaty ?? false,\n    transparentcolor: layer.transparentcolor\n  }\n}\n\nfunction resolveObjectLayer(\n  layer: TiledLayer,\n  tilesets: ResolvedTileset[],\n  templates?: Map<string, TiledObjectTemplate>\n): ResolvedObjectLayer {\n  return {\n    type: 'objectgroup',\n    ...layerDefaults(layer),\n    draworder: (layer.draworder ?? 'topdown') as TiledDrawOrder,\n    objects: resolveObjects(layer.objects ?? [], tilesets, templates)\n  }\n}\n\nfunction resolveTileLayerBase(layer: TiledLayer) {\n  return {\n    type: 'tilelayer' as const,\n    ...layerDefaults(layer),\n    width: layer.width ?? 0,\n    height: layer.height ?? 0\n  }\n}\n\n// ─── Resolve layers (sync) ──────────────────────────────────────────────────\n\nfunction resolveLayer(\n  layer: TiledLayer,\n  tilesets: ResolvedTileset[],\n  templates?: Map<string, TiledObjectTemplate>\n): ResolvedLayer {\n  switch (layer.type) {\n    case 'tilelayer':\n      return resolveTileLayerSync(layer, tilesets)\n\n    default:\n      return resolveNonTileLayer(layer, tilesets, templates, (child) =>\n        resolveLayer(child, tilesets, templates)\n      )\n  }\n}\n\n// ─── Resolve layers (async — needed for compressed data) ─────────────────────\n\nasync function resolveLayerAsync(\n  layer: TiledLayer,\n  tilesets: ResolvedTileset[],\n  templates?: Map<string, TiledObjectTemplate>\n): Promise<ResolvedLayer> {\n  switch (layer.type) {\n    case 'tilelayer':\n      return resolveTileLayerAsync(layer, tilesets)\n\n    default:\n      return resolveNonTileLayerAsync(layer, tilesets, templates)\n  }\n}\n\n// ─── Public API ──────────────────────────────────────────────────────────────\n\nexport function parseMap(data: TiledMap, options?: ParseOptions): ResolvedMap {\n  const resolvedTilesets = resolveTilesets(data.tilesets, options)\n  const layers = data.layers.map((l) => resolveLayer(l, resolvedTilesets, options?.templates))\n\n  return buildResolvedMap(data, resolvedTilesets, layers)\n}\n\nexport async function parseMapAsync(data: TiledMap, options?: ParseOptions): Promise<ResolvedMap> {\n  const resolvedTilesets = resolveTilesets(data.tilesets, options)\n  const layers = await Promise.all(\n    data.layers.map((l) => resolveLayerAsync(l, resolvedTilesets, options?.templates))\n  )\n\n  return buildResolvedMap(data, resolvedTilesets, layers)\n}\n\n// ─── Chunk resolution ────────────────────────────────────────────────────────\n\nfunction resolveChunksSync(\n  chunks: TiledChunk[],\n  encoding: TiledLayer['encoding'],\n  compression: TiledLayer['compression'],\n  tilesets: ResolvedTileset[]\n): ResolvedChunk[] {\n  return chunks.map((chunk) => {\n    const rawGids = decodeLayerData(chunk.data, encoding, compression)\n    return {\n      x: chunk.x,\n      y: chunk.y,\n      width: chunk.width,\n      height: chunk.height,\n      tiles: resolveGids(rawGids, tilesets)\n    }\n  })\n}\n\nasync function resolveChunksAsync(\n  chunks: TiledChunk[],\n  encoding: TiledLayer['encoding'],\n  compression: TiledLayer['compression'],\n  tilesets: ResolvedTileset[]\n): Promise<ResolvedChunk[]> {\n  return Promise.all(\n    chunks.map(async (chunk) => {\n      const rawGids = await decodeLayerDataAsync(chunk.data, encoding, compression)\n      return {\n        x: chunk.x,\n        y: chunk.y,\n        width: chunk.width,\n        height: chunk.height,\n        tiles: resolveGids(rawGids, tilesets)\n      }\n    })\n  )\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction resolveTilesets(\n  raw: (TiledTileset | TiledTilesetRef)[],\n  options?: ParseOptions\n): ResolvedTileset[] {\n  return raw.map((ts) => {\n    if (isTilesetRef(ts)) {\n      const external = options?.externalTilesets?.get(ts.source)\n      if (!external) {\n        throw new Error(\n          `External tileset \"${ts.source}\" not provided. Pass it via options.externalTilesets.`\n        )\n      }\n      return resolveTileset({ ...external, firstgid: ts.firstgid }, ts.source)\n    }\n    return resolveTileset(ts)\n  })\n}\n\nfunction resolveTileLayerSync(layer: TiledLayer, tilesets: ResolvedTileset[]): ResolvedTileLayer {\n  if (layer.chunks && layer.chunks.length > 0) {\n    return resolveInfiniteTileLayer(\n      layer,\n      resolveChunksSync(layer.chunks, layer.encoding, layer.compression, tilesets)\n    )\n  }\n\n  return resolveFiniteTileLayer(\n    layer,\n    decodeLayerData(layer.data ?? [], layer.encoding, layer.compression),\n    tilesets\n  )\n}\n\nasync function resolveTileLayerAsync(\n  layer: TiledLayer,\n  tilesets: ResolvedTileset[]\n): Promise<ResolvedTileLayer> {\n  if (layer.chunks && layer.chunks.length > 0) {\n    return resolveInfiniteTileLayer(\n      layer,\n      await resolveChunksAsync(layer.chunks, layer.encoding, layer.compression, tilesets)\n    )\n  }\n\n  return resolveFiniteTileLayer(\n    layer,\n    await decodeLayerDataAsync(layer.data ?? [], layer.encoding, layer.compression),\n    tilesets\n  )\n}\n\nfunction resolveFiniteTileLayer(\n  layer: TiledLayer,\n  rawGids: number[],\n  tilesets: ResolvedTileset[]\n): ResolvedTileLayer {\n  return {\n    ...resolveTileLayerBase(layer),\n    infinite: false,\n    tiles: resolveGids(rawGids, tilesets)\n  }\n}\n\nfunction resolveInfiniteTileLayer(layer: TiledLayer, chunks: ResolvedChunk[]): ResolvedTileLayer {\n  return {\n    ...resolveTileLayerBase(layer),\n    infinite: true,\n    tiles: [],\n    chunks\n  }\n}\n\nfunction resolveNonTileLayer(\n  layer: TiledLayer,\n  tilesets: ResolvedTileset[],\n  templates: Map<string, TiledObjectTemplate> | undefined,\n  resolveChild: (layer: TiledLayer) => ResolvedLayer\n): ResolvedLayer {\n  switch (layer.type) {\n    case 'imagelayer':\n      return resolveImageLayer(layer)\n\n    case 'objectgroup':\n      return resolveObjectLayer(layer, tilesets, templates)\n\n    case 'group':\n      return {\n        type: 'group',\n        ...layerDefaults(layer),\n        layers: (layer.layers ?? []).map(resolveChild)\n      } satisfies ResolvedGroupLayer\n\n    case 'tilelayer':\n      throw new Error('resolveNonTileLayer received a tile layer')\n\n    default:\n      return assertUnhandledLayer(layer)\n  }\n}\n\nasync function resolveNonTileLayerAsync(\n  layer: TiledLayer,\n  tilesets: ResolvedTileset[],\n  templates?: Map<string, TiledObjectTemplate>\n): Promise<ResolvedLayer> {\n  if (layer.type !== 'group') {\n    return resolveNonTileLayer(layer, tilesets, templates, (child) =>\n      resolveLayer(child, tilesets, templates)\n    )\n  }\n\n  const resolvedChildren = await Promise.all(\n    (layer.layers ?? []).map((l) => resolveLayerAsync(l, tilesets, templates))\n  )\n  return {\n    type: 'group',\n    ...layerDefaults(layer),\n    layers: resolvedChildren\n  } satisfies ResolvedGroupLayer\n}\n\nfunction assertUnhandledLayer(layer: TiledLayer): never {\n  throw new Error(`Unhandled layer type: ${(layer as TiledLayer).type}`)\n}\n\nfunction buildResolvedMap(\n  data: TiledMap,\n  tilesets: ResolvedTileset[],\n  layers: ResolvedLayer[]\n): ResolvedMap {\n  return {\n    orientation: data.orientation,\n    renderorder: (data.renderorder ?? 'right-down') as TiledRenderOrder,\n    width: data.width,\n    height: data.height,\n    tilewidth: data.tilewidth,\n    tileheight: data.tileheight,\n    infinite: data.infinite,\n    backgroundcolor: data.backgroundcolor,\n    hexsidelength: data.hexsidelength,\n    staggeraxis: data.staggeraxis,\n    staggerindex: data.staggerindex,\n    parallaxoriginx: data.parallaxoriginx ?? 0,\n    parallaxoriginy: data.parallaxoriginy ?? 0,\n    properties: data.properties ?? [],\n    tilesets,\n    layers,\n    version: data.version,\n    tiledversion: data.tiledversion\n  }\n}\n","export function parseTintColor(hex: string): number {\n  const clean = hex.replace('#', '')\n  // #AARRGGBB → strip alpha, use RRGGBB\n  if (clean.length === 8) {\n    return parseInt(clean.slice(2), 16)\n  }\n  // #RRGGBB\n  return parseInt(clean, 16)\n}\n","import type { Container } from 'pixi.js'\nimport type {\n  ResolvedGroupLayer,\n  ResolvedImageLayer,\n  ResolvedObjectLayer,\n  ResolvedTileLayer\n} from '../types'\nimport { parseTintColor } from './parseColor.js'\n\nexport type ResolvedRenderableLayer =\n  | ResolvedTileLayer\n  | ResolvedImageLayer\n  | ResolvedObjectLayer\n  | ResolvedGroupLayer\n\nconst renderableLayerMarker = Symbol('renderableLayer')\n\nexport interface RenderableLayer extends Container {\n  readonly layerBaseOffsetX: number\n  readonly layerBaseOffsetY: number\n  readonly layerParallaxX: number\n  readonly layerParallaxY: number\n  readonly [renderableLayerMarker]: true\n}\n\nexport function applyLayerState(container: Container, layer: ResolvedRenderableLayer): void {\n  container.label = layer.name\n  container.alpha = layer.opacity\n  container.visible = layer.visible\n  container.position.set(layer.offsetx, layer.offsety)\n  if (layer.tintcolor) {\n    container.tint = parseTintColor(layer.tintcolor)\n  }\n\n  Object.defineProperties(container, {\n    layerBaseOffsetX: { value: layer.offsetx, enumerable: true },\n    layerBaseOffsetY: { value: layer.offsety, enumerable: true },\n    layerParallaxX: { value: layer.parallaxx, enumerable: true },\n    layerParallaxY: { value: layer.parallaxy, enumerable: true },\n    [renderableLayerMarker]: { value: true }\n  })\n}\n\nexport function isRenderableLayer(container: Container): container is RenderableLayer {\n  return (container as unknown as Partial<RenderableLayer>)[renderableLayerMarker] === true\n}\n","import { Container } from 'pixi.js'\nimport type { ResolvedGroupLayer } from '../types'\nimport {\n  createLayerRendererFromContext,\n  type LayerTreeRendererContext\n} from './layerTreeRenderer.js'\nimport { applyLayerState } from './renderableLayer.js'\n\nexport class GroupLayerRenderer extends Container {\n  readonly layerData: ResolvedGroupLayer\n\n  constructor(layerData: ResolvedGroupLayer, context: LayerTreeRendererContext) {\n    super()\n\n    this.layerData = layerData\n    applyLayerState(this, layerData)\n\n    for (const child of layerData.layers) {\n      const renderer = createLayerRendererFromContext(child, context)\n      if (renderer) this.addChild(renderer)\n    }\n  }\n}\n","import { Container, Sprite, type Texture, TilingSprite } from 'pixi.js'\nimport { type GifSource, GifSprite } from 'pixi.js/gif'\nimport type { MapContext, ResolvedImageLayer } from '../types'\nimport { applyLayerState } from './renderableLayer.js'\n\nexport class ImageLayerRenderer extends Container {\n  readonly layerData: ResolvedImageLayer\n\n  constructor(\n    layerData: ResolvedImageLayer,\n    texture: Texture | null,\n    ctx?: MapContext,\n    gifSource?: GifSource | null\n  ) {\n    super()\n\n    this.layerData = layerData\n    applyLayerState(this, layerData)\n\n    if (texture) {\n      this._buildImage(texture, ctx, gifSource ?? null)\n    }\n  }\n\n  private _buildImage(texture: Texture, ctx?: MapContext, gifSource?: GifSource | null): void {\n    const { repeatx, repeaty } = this.layerData\n\n    if (!repeatx && !repeaty) {\n      if (gifSource) {\n        this.addChild(new GifSprite({ source: gifSource }))\n      } else {\n        this.addChild(new Sprite(texture))\n      }\n      return\n    }\n\n    // Repeating layers use TilingSprite which requires a static texture.\n    // Animated GIFs fall back to the first frame for tiling.\n    const spanW = ctx?.mapPixelWidth && ctx.mapPixelWidth > 0 ? ctx.mapPixelWidth : texture.width\n    const spanH =\n      ctx?.mapPixelHeight && ctx.mapPixelHeight > 0 ? ctx.mapPixelHeight : texture.height\n\n    this.addChild(\n      new TilingSprite({\n        texture,\n        width: repeatx ? spanW : texture.width,\n        height: repeaty ? spanH : texture.height\n      })\n    )\n  }\n}\n","import { AnimatedSprite, Sprite, type Texture } from 'pixi.js'\nimport { GifSprite } from 'pixi.js/gif'\nimport type { MapContext, ResolvedTile } from '../types'\nimport type { TileSetRenderer } from './TileSetRenderer.js'\n\nexport interface TileSpritePlacement {\n  x: number\n  y: number\n}\n\nexport interface TileObjectPlacement extends TileSpritePlacement {\n  width: number\n  height: number\n  rotation: number\n  visible: boolean\n}\n\nexport type TileVisualRequest =\n  | {\n      kind: 'map'\n      tile: ResolvedTile\n      tsRenderer: TileSetRenderer\n      placement: TileSpritePlacement\n      ctx: MapContext\n    }\n  | {\n      kind: 'object'\n      tile: ResolvedTile\n      tsRenderer: TileSetRenderer\n      placement: TileObjectPlacement\n    }\n\nexport function createTileSprite(\n  tile: ResolvedTile,\n  tsRenderer: TileSetRenderer,\n  px: number,\n  py: number,\n  ctx: MapContext\n): Sprite | null {\n  return createMapTileVisualAt(tile, tsRenderer, px, py, ctx)\n}\n\nexport function createMapTileSprite(\n  tile: ResolvedTile,\n  tsRenderer: TileSetRenderer,\n  placement: TileSpritePlacement,\n  ctx: MapContext\n): Sprite | null {\n  return createMapTileVisualAt(tile, tsRenderer, placement.x, placement.y, ctx)\n}\n\nexport function createTileVisual(request: TileVisualRequest): Sprite | null {\n  return request.kind === 'map' ? createMapTileVisual(request) : createObjectTileVisual(request)\n}\n\nfunction createMapTileVisual(request: Extract<TileVisualRequest, { kind: 'map' }>): Sprite | null {\n  const { tile, tsRenderer, placement, ctx } = request\n  return createMapTileVisualAt(tile, tsRenderer, placement.x, placement.y, ctx)\n}\n\nfunction createMapTileVisualAt(\n  tile: ResolvedTile,\n  tsRenderer: TileSetRenderer,\n  x: number,\n  y: number,\n  ctx: MapContext\n): Sprite | null {\n  const offset = tsRenderer.tileset.tileoffset\n  const animFrames = tsRenderer.getAnimationFrames(tile.localId)\n\n  if (animFrames && animFrames.length > 1) {\n    const textures: { texture: Texture; time: number }[] = []\n    for (const frame of animFrames) {\n      const tex = tsRenderer.getTexture(frame.tileid)\n      if (!tex) return null\n      textures.push({ texture: tex, time: frame.duration })\n    }\n    const renderW = tsRenderer.getRenderWidth(tile.localId, ctx)\n    const renderH = tsRenderer.getRenderHeight(tile.localId, ctx)\n    const padding = getTileSpritePadding(renderW, renderH, ctx)\n    const sprite = new AnimatedSprite(textures)\n    sprite.width = renderW + padding\n    sprite.height = renderH + padding\n    sprite.position.set(x + offset.x, y + offset.y + ctx.tileheight - renderH)\n    sprite.play()\n    applyFlip(sprite, tile)\n    return sprite\n  }\n\n  const texture = tsRenderer.getTexture(tile.localId)\n  if (!texture) return null\n\n  const gifSource = tsRenderer.getGifSource(tile.localId)\n  const renderW = tsRenderer.getRenderWidth(tile.localId, ctx)\n  const renderH = tsRenderer.getRenderHeight(tile.localId, ctx)\n  const padding = getTileSpritePadding(renderW, renderH, ctx)\n  const sprite = gifSource ? new GifSprite({ source: gifSource }) : new Sprite(texture)\n  sprite.width = renderW + padding\n  sprite.height = renderH + padding\n  sprite.position.set(x + offset.x, y + offset.y + ctx.tileheight - renderH)\n  applyFlip(sprite, tile)\n  return sprite\n}\n\nexport function createObjectTileSprite(\n  tile: ResolvedTile,\n  tsRenderer: TileSetRenderer,\n  placement: TileObjectPlacement\n): Sprite | null {\n  return createTileVisual({ kind: 'object', tile, tsRenderer, placement })\n}\n\nfunction createObjectTileVisual(\n  request: Extract<TileVisualRequest, { kind: 'object' }>\n): Sprite | null {\n  const { tile, tsRenderer, placement } = request\n  const texture = tsRenderer.getTexture(tile.localId)\n  if (!texture) return null\n\n  const gifSource = tsRenderer.getGifSource(tile.localId)\n  const sprite = gifSource ? new GifSprite({ source: gifSource }) : new Sprite(texture)\n  const offset = tsRenderer.tileset.tileoffset\n  const sized = fitObjectTileSize(tsRenderer, tile.localId, placement.width, placement.height)\n  sprite.width = sized.width\n  sprite.height = sized.height\n  sprite.position.set(placement.x + offset.x, placement.y - sized.height + offset.y)\n  sprite.angle = placement.rotation\n  sprite.visible = placement.visible\n  applyFlip(sprite, tile)\n\n  return sprite\n}\n\nexport function fitObjectTileSize(\n  tsRenderer: TileSetRenderer,\n  localId: number,\n  objWidth: number,\n  objHeight: number\n): { width: number; height: number } {\n  if (objWidth <= 0 || objHeight <= 0) {\n    return tsRenderer.getTileSize(localId)\n  }\n  if (tsRenderer.tileset.fillmode !== 'preserve-aspect-fit') {\n    return { width: objWidth, height: objHeight }\n  }\n  const intrinsic = tsRenderer.getTileSize(localId)\n  if (intrinsic.width === 0 || intrinsic.height === 0) {\n    return { width: objWidth, height: objHeight }\n  }\n  const scale = Math.min(objWidth / intrinsic.width, objHeight / intrinsic.height)\n  return { width: intrinsic.width * scale, height: intrinsic.height * scale }\n}\n\nexport function applyFlip(sprite: Sprite, tile: ResolvedTile): void {\n  if (tile.diagonalFlip) {\n    // Tiled encodes rotations via the diagonal (anti-diagonal) flip bit combined\n    // with H/V bits. For all diagonal cases rotation is PI/2 (CW); the anchor and\n    // scale vary by H/V to produce the four distinct transforms:\n    //   D      → transpose     anchor(0,0) scale( 1,−1)\n    //   D+H    → 90° CW        anchor(0,1) scale( 1, 1)\n    //   D+V    → 90° CCW       anchor(1,0) scale(−1,−1)\n    //   D+H+V  → 270° CW       anchor(1,1) scale(−1, 1)\n    sprite.rotation += Math.PI / 2\n    sprite.scale.x = tile.verticalFlip ? -1 : 1\n    sprite.scale.y = tile.horizontalFlip ? 1 : -1\n    sprite.anchor.set(tile.verticalFlip ? 1 : 0, tile.horizontalFlip ? 1 : 0)\n  } else {\n    if (tile.horizontalFlip) {\n      sprite.scale.x = -1\n      sprite.anchor.x = 1\n    }\n    if (tile.verticalFlip) {\n      sprite.scale.y = -1\n      sprite.anchor.y = 1\n    }\n  }\n}\n\nfunction getTileSpritePadding(renderW: number, renderH: number, ctx: MapContext): number {\n  if (ctx.orientation !== 'orthogonal') return 0\n  if (renderW !== ctx.tilewidth || renderH !== ctx.tileheight) return 0\n  return ctx.tileSpritePadding ?? 0\n}\n","import { Container, Graphics, type Sprite, Text } from 'pixi.js'\nimport type { ResolvedObject, ResolvedObjectLayer, TiledPoint, TiledText } from '../types'\nimport { applyLayerState } from './renderableLayer.js'\nimport type { TileSetRenderer } from './TileSetRenderer.js'\nimport { createObjectTileSprite } from './tileSpriteFactory.js'\n\nexport class ObjectLayerRenderer extends Container {\n  readonly layerData: ResolvedObjectLayer\n\n  constructor(layerData: ResolvedObjectLayer, tilesets: TileSetRenderer[]) {\n    super()\n\n    this.layerData = layerData\n    applyLayerState(this, layerData)\n\n    this._buildObjects(tilesets)\n  }\n\n  private _buildObjects(tilesets: TileSetRenderer[]): void {\n    for (const obj of this.layerData.objects) {\n      const child = this._createObject(obj, tilesets)\n      if (child) {\n        child.label = obj.name || `object_${obj.id}`\n        this.addChild(child)\n      }\n    }\n  }\n\n  private _createObject(obj: ResolvedObject, tilesets: TileSetRenderer[]): Container | null {\n    if (obj.tile) {\n      return this._createTileObject(obj, tilesets)\n    }\n\n    if (obj.text) {\n      return this._createTextObject(obj)\n    }\n\n    if (obj.ellipse) {\n      return this._createEllipse(obj)\n    }\n\n    if (obj.point) {\n      return this._createPoint(obj)\n    }\n\n    if (obj.polygon) {\n      return this._createPolygon(obj, obj.polygon, true)\n    }\n\n    if (obj.polyline) {\n      return this._createPolygon(obj, obj.polyline, false)\n    }\n\n    if (obj.width > 0 && obj.height > 0) {\n      return this._createRectangle(obj)\n    }\n\n    return null\n  }\n\n  private _createTileObject(obj: ResolvedObject, tilesets: TileSetRenderer[]): Sprite | null {\n    const tile = obj.tile!\n    const ts = tilesets[tile.tilesetIndex]\n    if (!ts) return null\n\n    return createObjectTileSprite(tile, ts, {\n      x: obj.x,\n      y: obj.y,\n      width: obj.width,\n      height: obj.height,\n      rotation: obj.rotation,\n      visible: obj.visible\n    })\n  }\n\n  private _createTextObject(obj: ResolvedObject): Container {\n    const td = obj.text as TiledText\n    const color = td.color ?? '#000000'\n    const text = new Text({\n      text: td.text,\n      style: {\n        fontFamily: td.fontfamily ?? 'sans-serif',\n        fontSize: td.pixelsize ?? 16,\n        fill: color,\n        fontWeight: td.bold ? 'bold' : 'normal',\n        fontStyle: td.italic ? 'italic' : 'normal',\n        wordWrap: td.wrap ?? false,\n        wordWrapWidth: obj.width,\n        align: td.halign ?? 'left'\n      }\n    })\n\n    // PixiJS Text has no built-in underline/strikeout — draw them manually.\n    // Wrap in a Container only when decorations are present so simple text\n    // stays a single Text node.\n    if (!td.underline && !td.strikeout) {\n      text.position.set(obj.x, obj.y)\n      text.angle = obj.rotation\n      text.visible = obj.visible\n      return text\n    }\n\n    const container = new Container()\n    container.addChild(text)\n\n    const metrics = text.getSize()\n    const lineThickness = Math.max(1, (td.pixelsize ?? 16) / 16)\n    if (td.underline) {\n      const ul = new Graphics()\n        .moveTo(0, metrics.height - lineThickness)\n        .lineTo(metrics.width, metrics.height - lineThickness)\n        .stroke({ color, width: lineThickness })\n      container.addChild(ul)\n    }\n    if (td.strikeout) {\n      const y = metrics.height / 2\n      const so = new Graphics()\n        .moveTo(0, y)\n        .lineTo(metrics.width, y)\n        .stroke({ color, width: lineThickness })\n      container.addChild(so)\n    }\n\n    container.position.set(obj.x, obj.y)\n    container.angle = obj.rotation\n    container.visible = obj.visible\n    return container\n  }\n\n  private _createRectangle(obj: ResolvedObject): Container {\n    const g = new Graphics().rect(0, 0, obj.width, obj.height).stroke({ color: 0xffffff, width: 1 })\n    g.position.set(obj.x, obj.y)\n    g.angle = obj.rotation\n    g.visible = obj.visible\n    return g\n  }\n\n  private _createEllipse(obj: ResolvedObject): Container {\n    const rx = obj.width / 2\n    const ry = obj.height / 2\n    const g = new Graphics().ellipse(rx, ry, rx, ry).stroke({ color: 0xffffff, width: 1 })\n    g.position.set(obj.x, obj.y)\n    g.angle = obj.rotation\n    g.visible = obj.visible\n    return g\n  }\n\n  private _createPoint(obj: ResolvedObject): Container {\n    const g = new Graphics().circle(0, 0, 3).fill(0xffffff)\n    g.position.set(obj.x, obj.y)\n    g.visible = obj.visible\n    return g\n  }\n\n  private _createPolygon(obj: ResolvedObject, points: TiledPoint[], closed: boolean): Container {\n    const g = new Graphics()\n\n    if (points.length > 0) {\n      const first = points[0]!\n      g.moveTo(first.x, first.y)\n      for (let i = 1; i < points.length; i++) {\n        const pt = points[i]!\n        g.lineTo(pt.x, pt.y)\n      }\n      if (closed) {\n        g.closePath()\n      }\n      g.stroke({ color: 0xffffff, width: 1 })\n    }\n\n    g.position.set(obj.x, obj.y)\n    g.angle = obj.rotation\n    g.visible = obj.visible\n    return g\n  }\n}\n","import type { MapContext, ResolvedMap, TilePosition } from '../types'\n\nexport interface MapPixelSize {\n  width: number\n  height: number\n}\n\nexport interface TileIterationPlan {\n  rowStart: number\n  rowEnd: number\n  rowStep: number\n  colStart: number\n  colEnd: number\n  colStep: number\n}\n\n// Reusable output object - avoids allocating a { x, y } per tile.\n// Safe because callers consume the values before the next call.\nconst _pos: TilePosition = { x: 0, y: 0 }\n\nexport function computeMapPixelSize(mapData: ResolvedMap): MapPixelSize {\n  const { orientation, width, height, tilewidth, tileheight, staggeraxis } = mapData\n\n  switch (orientation) {\n    case 'isometric':\n      return {\n        width: (width + height) * (tilewidth / 2),\n        height: (width + height) * (tileheight / 2)\n      }\n    case 'staggered':\n    case 'hexagonal':\n      return staggeraxis === 'x'\n        ? {\n            width: (width + 1) * (tilewidth / 2),\n            height: height * tileheight + tileheight / 2\n          }\n        : {\n            width: width * tilewidth + tilewidth / 2,\n            height: (height + 1) * (tileheight / 2)\n          }\n    default:\n      return { width: width * tilewidth, height: height * tileheight }\n  }\n}\n\nexport function tileToPixel(col: number, row: number, ctx: MapContext): TilePosition {\n  switch (ctx.orientation) {\n    case 'orthogonal':\n      _pos.x = col * ctx.tilewidth\n      _pos.y = row * ctx.tileheight\n      return _pos\n    case 'isometric': {\n      const halfW = ctx.tilewidth / 2\n      const halfH = ctx.tileheight / 2\n      _pos.x = (col - row) * halfW\n      _pos.y = (col + row) * halfH\n      return _pos\n    }\n    case 'staggered':\n      return staggeredToPixel(col, row, ctx)\n    case 'hexagonal':\n      return hexagonalToPixel(col, row, ctx)\n  }\n}\n\nexport function getTileIterationPlan(\n  layerWidth: number,\n  layerHeight: number,\n  ctx: Pick<MapContext, 'renderorder'>\n): TileIterationPlan {\n  const order = ctx.renderorder\n  const rightToLeft = order === 'left-down' || order === 'left-up'\n  const bottomToTop = order === 'right-up' || order === 'left-up'\n\n  return {\n    rowStart: bottomToTop ? layerHeight - 1 : 0,\n    rowEnd: bottomToTop ? -1 : layerHeight,\n    rowStep: bottomToTop ? -1 : 1,\n    colStart: rightToLeft ? layerWidth - 1 : 0,\n    colEnd: rightToLeft ? -1 : layerWidth,\n    colStep: rightToLeft ? -1 : 1\n  }\n}\n\nfunction staggeredToPixel(col: number, row: number, ctx: MapContext): TilePosition {\n  const staggerX = ctx.staggeraxis === 'x'\n  const staggerEven = ctx.staggerindex === 'even'\n\n  if (staggerX) {\n    const isStaggered = staggerEven ? col % 2 === 0 : col % 2 !== 0\n    _pos.x = col * (ctx.tilewidth / 2)\n    _pos.y = row * ctx.tileheight + (isStaggered ? ctx.tileheight / 2 : 0)\n  } else {\n    const isStaggered = staggerEven ? row % 2 === 0 : row % 2 !== 0\n    _pos.x = col * ctx.tilewidth + (isStaggered ? ctx.tilewidth / 2 : 0)\n    _pos.y = row * (ctx.tileheight / 2)\n  }\n  return _pos\n}\n\nfunction hexagonalToPixel(col: number, row: number, ctx: MapContext): TilePosition {\n  const hexSide = ctx.hexsidelength ?? 0\n  const staggerX = ctx.staggeraxis === 'x'\n  const staggerEven = ctx.staggerindex === 'even'\n\n  if (staggerX) {\n    const colWidth = (ctx.tilewidth + hexSide) / 2\n    const isStaggered = staggerEven ? col % 2 === 0 : col % 2 !== 0\n    _pos.x = col * colWidth\n    _pos.y = row * ctx.tileheight + (isStaggered ? ctx.tileheight / 2 : 0)\n  } else {\n    const rowHeight = (ctx.tileheight + hexSide) / 2\n    const isStaggered = staggerEven ? row % 2 === 0 : row % 2 !== 0\n    _pos.x = col * ctx.tilewidth + (isStaggered ? ctx.tilewidth / 2 : 0)\n    _pos.y = row * rowHeight\n  }\n  return _pos\n}\n","import { Container, Mesh, MeshGeometry, Texture, type TextureSource } from 'pixi.js'\nimport type { MapContext, ResolvedTile } from '../types'\nimport type { TileSetRenderer } from './TileSetRenderer.js'\nimport { createTileSprite } from './tileSpriteFactory.js'\n\nconst MAX_TILES_PER_MESH = 2_000\n\ninterface PackedTileBatch {\n  texture: Texture\n  positions: Float32Array\n  uvs: Float32Array\n  indices: Uint16Array\n  positionCursor: number\n  uvCursor: number\n  indexCursor: number\n  vertexCount: number\n  tileCapacity: number\n}\n\nexport class PackedTileLayerRenderer extends Container {\n  private readonly _batches = new Map<TextureSource, PackedTileBatch[]>()\n  private readonly _initialTileCapacity: number\n\n  constructor(initialTileCapacity = 256) {\n    super()\n    this._initialTileCapacity = Math.max(1, Math.min(initialTileCapacity, MAX_TILES_PER_MESH))\n  }\n\n  addTile(\n    tile: ResolvedTile,\n    tsRenderer: TileSetRenderer,\n    x: number,\n    y: number,\n    ctx: MapContext\n  ): void {\n    if (this._needsSpriteTile(tile, tsRenderer)) {\n      const sprite = createTileSprite(tile, tsRenderer, x, y, ctx)\n      if (sprite) this.addChild(sprite)\n      return\n    }\n\n    const texture = tsRenderer.getTexture(tile.localId)\n    if (!texture) return\n\n    const renderW = tsRenderer.getRenderWidth(tile.localId, ctx)\n    const renderH = tsRenderer.getRenderHeight(tile.localId, ctx)\n    const padding = getTileMeshPadding(renderW, renderH, ctx)\n    const offset = tsRenderer.tileset.tileoffset\n    const left = x + offset.x\n    const top = y + offset.y + ctx.tileheight - renderH\n    const right = left + renderW + padding\n    const bottom = top + renderH + padding\n    const batch = this._getBatch(texture)\n    ensureBatchCapacity(batch, batch.vertexCount / 4 + 1)\n    const vertexOffset = batch.vertexCount\n\n    batch.positions[batch.positionCursor++] = left\n    batch.positions[batch.positionCursor++] = top\n    batch.positions[batch.positionCursor++] = right\n    batch.positions[batch.positionCursor++] = top\n    batch.positions[batch.positionCursor++] = right\n    batch.positions[batch.positionCursor++] = bottom\n    batch.positions[batch.positionCursor++] = left\n    batch.positions[batch.positionCursor++] = bottom\n    pushTileUvs(batch, texture, tile)\n    batch.indices[batch.indexCursor++] = vertexOffset\n    batch.indices[batch.indexCursor++] = vertexOffset + 1\n    batch.indices[batch.indexCursor++] = vertexOffset + 2\n    batch.indices[batch.indexCursor++] = vertexOffset\n    batch.indices[batch.indexCursor++] = vertexOffset + 2\n    batch.indices[batch.indexCursor++] = vertexOffset + 3\n    batch.vertexCount += 4\n  }\n\n  finalize(): void {\n    for (const batches of this._batches.values()) {\n      for (const batch of batches) {\n        if (batch.vertexCount === 0) continue\n\n        const geometry = new MeshGeometry({\n          positions: batch.positions.slice(0, batch.positionCursor),\n          uvs: batch.uvs.slice(0, batch.uvCursor),\n          indices: batch.indices.slice(0, batch.indexCursor) as unknown as Uint32Array\n        })\n        geometry.batchMode = 'batch'\n\n        this.addChild(new Mesh({ geometry, texture: batch.texture }))\n      }\n    }\n\n    this._batches.clear()\n  }\n\n  private _getBatch(texture: Texture): PackedTileBatch {\n    const source = texture.source\n    let batches = this._batches.get(source)\n    let batch = batches?.[batches.length - 1]\n\n    if (batch && batch.vertexCount / 4 >= MAX_TILES_PER_MESH) {\n      batch = undefined\n    }\n\n    if (!batch) {\n      if (!batches) {\n        batches = []\n        this._batches.set(source, batches)\n      }\n      batch = {\n        texture: new Texture({ source }),\n        positions: new Float32Array(this._initialTileCapacity * 8),\n        uvs: new Float32Array(this._initialTileCapacity * 8),\n        indices: new Uint16Array(this._initialTileCapacity * 6),\n        positionCursor: 0,\n        uvCursor: 0,\n        indexCursor: 0,\n        vertexCount: 0,\n        tileCapacity: this._initialTileCapacity\n      }\n      batches.push(batch)\n    }\n\n    return batch\n  }\n\n  private _needsSpriteTile(tile: ResolvedTile, tsRenderer: TileSetRenderer): boolean {\n    const animation = tsRenderer.getAnimationFrames(tile.localId)\n    if (animation && animation.length > 1) return true\n    return !!tsRenderer.getGifSource(tile.localId)\n  }\n}\n\nfunction ensureBatchCapacity(batch: PackedTileBatch, tileCount: number): void {\n  if (tileCount <= batch.tileCapacity) return\n\n  let nextCapacity = batch.tileCapacity\n  while (nextCapacity < tileCount) nextCapacity *= 2\n\n  const positions = new Float32Array(nextCapacity * 8)\n  positions.set(batch.positions)\n  batch.positions = positions\n\n  const uvs = new Float32Array(nextCapacity * 8)\n  uvs.set(batch.uvs)\n  batch.uvs = uvs\n\n  const indices = new Uint16Array(nextCapacity * 6)\n  indices.set(batch.indices)\n  batch.indices = indices\n\n  batch.tileCapacity = nextCapacity\n}\n\nfunction getTileMeshPadding(renderW: number, renderH: number, ctx: MapContext): number {\n  if (ctx.orientation !== 'orthogonal') return 0\n  if (renderW !== ctx.tilewidth || renderH !== ctx.tileheight) return 0\n  return ctx.tileSpritePadding ?? 0\n}\n\nfunction pushTileUvs(batch: PackedTileBatch, texture: Texture, tile: ResolvedTile): void {\n  const { x0, y0, x1, y1, x2, y2, x3, y3 } = texture.uvs\n  const corners: [[number, number], [number, number], [number, number], [number, number]] = [\n    [x0, y0],\n    [x1, y1],\n    [x2, y2],\n    [x3, y3]\n  ]\n\n  for (const index of getUvOrder(tile)) {\n    const corner = corners[index]!\n    batch.uvs[batch.uvCursor++] = corner[0]\n    batch.uvs[batch.uvCursor++] = corner[1]\n  }\n}\n\nfunction getUvOrder(tile: ResolvedTile): [number, number, number, number] {\n  const h = tile.horizontalFlip\n  const v = tile.verticalFlip\n  const d = tile.diagonalFlip\n\n  if (d) {\n    if (h && v) return [2, 1, 0, 3]\n    if (h) return [3, 0, 1, 2]\n    if (v) return [1, 2, 3, 0]\n    return [0, 3, 2, 1]\n  }\n\n  if (h && v) return [2, 3, 0, 1]\n  if (h) return [1, 0, 3, 2]\n  if (v) return [3, 2, 1, 0]\n  return [0, 1, 2, 3]\n}\n","import type { MapContext, ResolvedChunk, ResolvedTile, ResolvedTileLayer } from '../types'\nimport { getTileIterationPlan, tileToPixel } from './mapGeometry.js'\nimport { PackedTileLayerRenderer } from './PackedTileLayerRenderer.js'\nimport { applyLayerState } from './renderableLayer.js'\nimport type { TileSetRenderer } from './TileSetRenderer.js'\n\nexport class TileLayerRenderer extends PackedTileLayerRenderer {\n  readonly layerData: ResolvedTileLayer\n\n  constructor(layerData: ResolvedTileLayer, tilesets: TileSetRenderer[], ctx: MapContext) {\n    super(estimateTileCapacity(layerData))\n\n    this.layerData = layerData\n    applyLayerState(this, layerData)\n\n    if (layerData.infinite && layerData.chunks) {\n      this._buildChunks(layerData.chunks, tilesets, ctx)\n    } else {\n      this._buildTiles(\n        layerData.tiles,\n        layerData.width,\n        Math.floor(layerData.tiles.length / (layerData.width || 1)),\n        0,\n        0,\n        tilesets,\n        ctx\n      )\n    }\n\n    this.finalize()\n  }\n\n  private _buildChunks(\n    chunks: ResolvedChunk[],\n    tilesets: TileSetRenderer[],\n    ctx: MapContext\n  ): void {\n    for (const chunk of chunks) {\n      this._buildTiles(chunk.tiles, chunk.width, chunk.height, chunk.x, chunk.y, tilesets, ctx)\n    }\n  }\n\n  private _buildTiles(\n    tiles: (ResolvedTile | null)[],\n    layerWidth: number,\n    layerHeight: number,\n    originCol: number,\n    originRow: number,\n    tilesets: TileSetRenderer[],\n    ctx: MapContext\n  ): void {\n    const plan = getTileIterationPlan(layerWidth, layerHeight, ctx)\n\n    for (let row = plan.rowStart; row !== plan.rowEnd; row += plan.rowStep) {\n      const rowOffset = row * layerWidth\n      for (let col = plan.colStart; col !== plan.colEnd; col += plan.colStep) {\n        const tile = tiles[rowOffset + col]\n        if (!tile) continue\n\n        const tsRenderer = tilesets[tile.tilesetIndex]\n        if (!tsRenderer) continue\n\n        // Read x/y immediately - tileToPixel returns a reusable object.\n        const pos = tileToPixel(originCol + col, originRow + row, ctx)\n        this.addTile(tile, tsRenderer, pos.x, pos.y, ctx)\n      }\n    }\n  }\n}\n\nfunction estimateTileCapacity(layerData: ResolvedTileLayer): number {\n  if (layerData.infinite && layerData.chunks) {\n    let count = 0\n    for (const chunk of layerData.chunks) count += chunk.tiles.length\n    return count\n  }\n\n  return layerData.tiles.length\n}\n","import type { Container, Texture } from 'pixi.js'\nimport type { GifSource } from 'pixi.js/gif'\nimport type { MapContext, ResolvedLayer, TiledLayerFilter } from '../types'\nimport { GroupLayerRenderer } from './GroupLayerRenderer.js'\nimport { ImageLayerRenderer } from './ImageLayerRenderer.js'\nimport { ObjectLayerRenderer } from './ObjectLayerRenderer.js'\nimport { isRenderableLayer, type RenderableLayer } from './renderableLayer.js'\nimport { TileLayerRenderer } from './TileLayerRenderer.js'\nimport type { TileSetRenderer } from './TileSetRenderer.js'\n\nexport interface LayerTreeRendererContext {\n  tilesets: TileSetRenderer[]\n  mapContext: MapContext\n  imageTextures: Map<string, Texture>\n  imageGifSources?: Map<string, GifSource>\n  layerFilter?: TiledLayerFilter\n}\n\nexport function createLayerRendererFromContext(\n  layer: ResolvedLayer,\n  context: LayerTreeRendererContext\n): Container | null {\n  const layerMatches = !context.layerFilter || context.layerFilter(layer)\n  if (!layerMatches && !hasMatchingDescendant(layer, context.layerFilter)) return null\n\n  switch (layer.type) {\n    case 'tilelayer':\n      if (!layerMatches) return null\n      return new TileLayerRenderer(layer, context.tilesets, context.mapContext)\n\n    case 'imagelayer': {\n      if (!layerMatches) return null\n      const texture = layer.image ? (context.imageTextures.get(layer.image) ?? null) : null\n      const gifSource = layer.image ? (context.imageGifSources?.get(layer.image) ?? null) : null\n      return new ImageLayerRenderer(layer, texture, context.mapContext, gifSource)\n    }\n\n    case 'objectgroup':\n      if (!layerMatches) return null\n      return new ObjectLayerRenderer(layer, context.tilesets)\n\n    case 'group':\n      return new GroupLayerRenderer(layer, context)\n\n    default:\n      return assertNever(layer)\n  }\n}\n\nexport function renderLayerTree(\n  layers: ResolvedLayer[],\n  context: LayerTreeRendererContext\n): Container[] {\n  const renderers: Container[] = []\n  for (const layer of layers) {\n    const renderer = createLayerRendererFromContext(layer, context)\n    if (renderer) renderers.push(renderer)\n  }\n  return renderers\n}\n\nexport function applyParallaxToLayerTree(\n  children: Iterable<Container>,\n  cameraX: number,\n  cameraY: number,\n  originX: number,\n  originY: number\n): void {\n  for (const child of children) {\n    if (isRenderableLayer(child)) {\n      applyParallaxRecursive(child, cameraX, cameraY, originX, originY, 1, 1)\n    }\n  }\n}\n\nfunction assertNever(x: never): never {\n  throw new Error(`Unhandled layer type: ${(x as { type: string }).type}`)\n}\n\nfunction hasMatchingDescendant(layer: ResolvedLayer, layerFilter?: TiledLayerFilter): boolean {\n  if (!layerFilter || layer.type !== 'group') return false\n  return layer.layers.some(\n    (child) => layerFilter(child) || hasMatchingDescendant(child, layerFilter)\n  )\n}\n\nfunction applyParallaxRecursive(\n  layer: RenderableLayer,\n  cameraX: number,\n  cameraY: number,\n  originX: number,\n  originY: number,\n  parentParallaxX: number,\n  parentParallaxY: number\n): void {\n  const px = layer.layerParallaxX * parentParallaxX\n  const py = layer.layerParallaxY * parentParallaxY\n\n  layer.position.set(\n    layer.layerBaseOffsetX + (cameraX - originX) * (1 - px),\n    layer.layerBaseOffsetY + (cameraY - originY) * (1 - py)\n  )\n\n  for (const child of layer.children) {\n    if (isRenderableLayer(child)) {\n      applyParallaxRecursive(child, cameraX, cameraY, originX, originY, px, py)\n    }\n  }\n}\n","import type { Container, Texture } from 'pixi.js'\nimport type { GifSource } from 'pixi.js/gif'\nimport type { MapContext, ResolvedLayer, TiledLayerFilter } from '../types'\nimport { createLayerRendererFromContext } from './layerTreeRenderer.js'\nimport type { TileSetRenderer } from './TileSetRenderer.js'\n\nexport function createLayerRenderer(\n  layer: ResolvedLayer,\n  tilesets: TileSetRenderer[],\n  ctx: MapContext,\n  imageTextures: Map<string, Texture>,\n  imageGifSources?: Map<string, GifSource>,\n  layerFilter?: TiledLayerFilter\n): Container | null {\n  return createLayerRendererFromContext(layer, {\n    tilesets,\n    mapContext: ctx,\n    imageTextures,\n    imageGifSources,\n    layerFilter\n  })\n}\n","import { Rectangle, Texture } from 'pixi.js'\nimport type { GifSource } from 'pixi.js/gif'\nimport type { MapContext, ResolvedTileset, TiledTileDefinition } from '../types'\n\nexport class TileSetRenderer {\n  readonly tileset: ResolvedTileset\n  readonly baseTexture: Texture | null\n  private readonly _ownedTextures = new Map<number, Texture>()\n  private readonly _externalTextures = new Map<number, Texture>()\n  private readonly _gifSources = new Map<number, GifSource>()\n  // Per-localId cached render dimensions (keyed by localId, value = width | height<<32\n  // is not feasible for floats, so we use two parallel maps).\n  private _renderWidthCache: Map<number, number> | null = null\n  private _renderHeightCache: Map<number, number> | null = null\n  private _cachedCtxTileWidth = 0\n  private _cachedCtxTileHeight = 0\n\n  constructor(tileset: ResolvedTileset, baseTexture: Texture | null) {\n    this.tileset = tileset\n    this.baseTexture = baseTexture\n  }\n\n  getTexture(localId: number): Texture | null {\n    const external = this._externalTextures.get(localId)\n    if (external) return external\n\n    const owned = this._ownedTextures.get(localId)\n    if (owned) return owned\n\n    const tileDef = this.tileset.tiles.get(localId)\n\n    // Image-collection tile with no externally supplied texture yet.\n    if (tileDef?.image) return null\n\n    // Single-image tileset: cut sub-rectangle from baseTexture\n    if (!this.baseTexture) return null\n\n    const { tilewidth, tileheight, columns, margin, spacing } = this.tileset\n    if (columns <= 0) return null\n\n    const col = localId % columns\n    const row = Math.floor(localId / columns)\n    const x = margin + col * (tilewidth + spacing)\n    const y = margin + row * (tileheight + spacing)\n\n    const frame = new Rectangle(x, y, tilewidth, tileheight)\n    const texture = new Texture({ source: this.baseTexture.source, frame })\n\n    this._ownedTextures.set(localId, texture)\n    return texture\n  }\n\n  setTileTexture(localId: number, texture: Texture): void {\n    this._externalTextures.set(localId, texture)\n  }\n\n  setGifSource(localId: number, source: GifSource): void {\n    this._gifSources.set(localId, source)\n  }\n\n  getGifSource(localId: number): GifSource | null {\n    return this._gifSources.get(localId) ?? null\n  }\n\n  getAnimationFrames(localId: number): TiledTileDefinition['animation'] | undefined {\n    return this.tileset.tiles.get(localId)?.animation\n  }\n\n  /**\n   * Returns the intrinsic pixel size of a tile based on tileset metadata.\n   * For image-collection tilesets, each tile has its own image dimensions.\n   * For regular tilesets, all tiles share the tileset's tilewidth/tileheight.\n   */\n  getTileSize(localId: number): { width: number; height: number } {\n    const tileDef = this.tileset.tiles.get(localId)\n    if (tileDef?.image) {\n      return {\n        width: tileDef.imagewidth ?? this.tileset.tilewidth,\n        height: tileDef.imageheight ?? this.tileset.tileheight\n      }\n    }\n    return { width: this.tileset.tilewidth, height: this.tileset.tileheight }\n  }\n\n  /**\n   * Returns the pixel size a tile should be drawn at on the map grid.\n   * Allocates a new object — prefer `getRenderWidth`/`getRenderHeight`\n   * in hot loops to avoid GC pressure.\n   */\n  getRenderSize(localId: number, ctx: MapContext): { width: number; height: number } {\n    return {\n      width: this.getRenderWidth(localId, ctx),\n      height: this.getRenderHeight(localId, ctx)\n    }\n  }\n\n  /**\n   * Returns the rendered width of a tile (scalar, no allocation).\n   * Results are cached per localId for the lifetime of a single map context.\n   */\n  getRenderWidth(localId: number, ctx: MapContext): number {\n    this._ensureRenderCache(ctx)\n    const cached = this._renderWidthCache!.get(localId)\n    if (cached !== undefined) return cached\n    const size = this._computeRenderSize(localId, ctx)\n    this._renderWidthCache!.set(localId, size.width)\n    this._renderHeightCache!.set(localId, size.height)\n    return size.width\n  }\n\n  /**\n   * Returns the rendered height of a tile (scalar, no allocation).\n   */\n  getRenderHeight(localId: number, ctx: MapContext): number {\n    this._ensureRenderCache(ctx)\n    const cached = this._renderHeightCache!.get(localId)\n    if (cached !== undefined) return cached\n    const size = this._computeRenderSize(localId, ctx)\n    this._renderWidthCache!.set(localId, size.width)\n    this._renderHeightCache!.set(localId, size.height)\n    return size.height\n  }\n\n  private _ensureRenderCache(ctx: MapContext): void {\n    if (\n      this._renderWidthCache &&\n      this._cachedCtxTileWidth === ctx.tilewidth &&\n      this._cachedCtxTileHeight === ctx.tileheight\n    ) {\n      return\n    }\n    this._renderWidthCache = new Map()\n    this._renderHeightCache = new Map()\n    this._cachedCtxTileWidth = ctx.tilewidth\n    this._cachedCtxTileHeight = ctx.tileheight\n  }\n\n  private _computeRenderSize(localId: number, ctx: MapContext): { width: number; height: number } {\n    const intrinsic = this.getTileSize(localId)\n    if (this.tileset.tilerendersize !== 'grid') return intrinsic\n\n    const gridW = ctx.tilewidth\n    const gridH = ctx.tileheight\n\n    if (this.tileset.fillmode === 'preserve-aspect-fit') {\n      if (intrinsic.width === 0 || intrinsic.height === 0) {\n        return { width: gridW, height: gridH }\n      }\n      const scale = Math.min(gridW / intrinsic.width, gridH / intrinsic.height)\n      return { width: intrinsic.width * scale, height: intrinsic.height * scale }\n    }\n\n    return { width: gridW, height: gridH }\n  }\n\n  destroy(): void {\n    for (const tex of this._ownedTextures.values()) {\n      tex.destroy()\n    }\n    this._ownedTextures.clear()\n    this._externalTextures.clear()\n    this._gifSources.clear()\n    this._renderWidthCache = null\n    this._renderHeightCache = null\n  }\n}\n","import { Container, Graphics, Rectangle } from 'pixi.js'\nimport type { GifSource } from 'pixi.js/gif'\nimport type { MapContext, ResolvedMap, TiledMapOptions } from '../types'\nimport { applyParallaxToLayerTree, renderLayerTree } from './layerTreeRenderer.js'\nimport { computeMapPixelSize } from './mapSize.js'\nimport { parseTintColor } from './parseColor.js'\nimport { TileSetRenderer } from './TileSetRenderer.js'\n\nexport class TiledMap extends Container {\n  readonly mapData: ResolvedMap\n  readonly tileSetRenderers: TileSetRenderer[]\n\n  private _background: Graphics | null = null\n\n  constructor(mapData: ResolvedMap, options?: TiledMapOptions) {\n    super()\n\n    this.mapData = mapData\n    this.label = 'TiledMap'\n\n    const pixelSize = computeMapPixelSize(mapData)\n\n    // Force local bounds to the logical map size. Without this, pixi's\n    // .width/.height setters (and getLocalBounds) would use the extent of\n    // the rendered children — which misbehaves when the map has empty\n    // top/left rows (bounds.minY > 0, causing content to overflow the\n    // canvas when scaling via `.height = ...`) or when tall decoration\n    // tiles extend beyond the grid.\n    this.boundsArea = new Rectangle(0, 0, pixelSize.width, pixelSize.height)\n\n    // Build tileset renderers\n    const tilesetTextures = options?.tilesetTextures ?? new Map()\n    const imageLayerTextures = options?.imageLayerTextures ?? new Map()\n    const tileImageTextures = options?.tileImageTextures ?? new Map()\n    const tileImageGifSources = options?.tileImageGifSources ?? new Map<string, GifSource>()\n    const imageLayerGifSources = options?.imageLayerGifSources ?? new Map<string, GifSource>()\n\n    this.tileSetRenderers = mapData.tilesets.map((ts) => {\n      const baseTex = ts.image ? (tilesetTextures.get(ts.image) ?? null) : null\n      const renderer = new TileSetRenderer(ts, baseTex)\n\n      // Supply individual tile images for image-collection tilesets\n      for (const [localId, tileDef] of ts.tiles) {\n        if (tileDef.image) {\n          const tex = tileImageTextures.get(tileDef.image)\n          if (tex) renderer.setTileTexture(localId, tex)\n          const gifSource = tileImageGifSources.get(tileDef.image)\n          if (gifSource) renderer.setGifSource(localId, gifSource)\n        }\n      }\n\n      return renderer\n    })\n\n    // Build map context for orientation-aware tile placement\n    const ctx: MapContext = {\n      orientation: mapData.orientation,\n      renderorder: mapData.renderorder,\n      tilewidth: mapData.tilewidth,\n      tileheight: mapData.tileheight,\n      hexsidelength: mapData.hexsidelength,\n      staggeraxis: mapData.staggeraxis,\n      staggerindex: mapData.staggerindex,\n      mapPixelWidth: pixelSize.width,\n      mapPixelHeight: pixelSize.height,\n      tileSpritePadding: options?.tileSpritePadding ?? 0.01\n    }\n\n    // Render background\n    if (mapData.backgroundcolor) {\n      this._buildBackground(pixelSize.width, pixelSize.height, mapData.backgroundcolor)\n    }\n\n    // Render layers\n    const layerContext = {\n      tilesets: this.tileSetRenderers,\n      mapContext: ctx,\n      imageTextures: imageLayerTextures,\n      imageGifSources: imageLayerGifSources,\n      layerFilter: options?.layerFilter\n    }\n    this.addChild(...renderLayerTree(mapData.layers, layerContext))\n  }\n\n  get orientation() {\n    return this.mapData.orientation\n  }\n  get mapWidth() {\n    return this.mapData.width\n  }\n  get mapHeight() {\n    return this.mapData.height\n  }\n  get tileWidth() {\n    return this.mapData.tilewidth\n  }\n  get tileHeight() {\n    return this.mapData.tileheight\n  }\n\n  getLayer(name: string): Container | undefined {\n    return this.children.find((c) => c.label === name) as Container | undefined\n  }\n\n  /**\n   * Reposition layers to reflect the camera's current position through the\n   * map's parallax factors. Call after moving the camera.\n   *\n   * Effective layer screen position (after your camera transform) is:\n   *   base_offset - parallax_origin * (1 - parallax) - camera * parallax\n   *\n   * so a layer with parallax 1 moves normally with the camera and a layer\n   * with parallax 0 is pinned in screen space. Nested group layers compose\n   * parallax multiplicatively per the Tiled spec.\n   */\n  applyParallax(cameraX: number, cameraY: number): void {\n    const ox = this.mapData.parallaxoriginx\n    const oy = this.mapData.parallaxoriginy\n    applyParallaxToLayerTree(this.children, cameraX, cameraY, ox, oy)\n  }\n\n  private _buildBackground(pixelWidth: number, pixelHeight: number, colorHex: string): void {\n    const color = parseTintColor(colorHex)\n    this._background = new Graphics().rect(0, 0, pixelWidth, pixelHeight).fill(color)\n    this._background.label = 'background'\n    this.addChild(this._background)\n  }\n\n  override destroy(options?: Parameters<Container['destroy']>[0]): void {\n    for (const ts of this.tileSetRenderers) {\n      ts.destroy()\n    }\n    super.destroy(options)\n  }\n}\n","import {\n  Assets,\n  ExtensionType,\n  extensions,\n  type LoaderParser,\n  path as pixiPath,\n  type Texture\n} from 'pixi.js'\nimport type { GifSource } from 'pixi.js/gif'\nimport { GifAsset } from 'pixi.js/gif'\nimport { parseMapAsync, parseTmx, parseTsx, parseTx } from '../parser'\nimport { isTilesetRef } from '../parser/tilesetHelpers.js'\nimport type {\n  ResolvedMap,\n  TiledLayer,\n  TiledMapAsset,\n  TiledMap as TiledMapData,\n  TiledObject,\n  TiledObjectTemplate,\n  TiledTileset\n} from '../types'\nimport { TiledMap } from './TiledMap.js'\n\nextensions.add(GifAsset)\n\ntype FetchFn = (url: string) => Promise<{ text(): Promise<string>; json(): Promise<unknown> }>\ntype LoadAssetFn = <T>(url: string) => Promise<T>\n\ninterface TiledAssetPipelineOptions {\n  fetchFn?: FetchFn\n  loadAsset?: LoadAssetFn\n}\n\ninterface TextureManifestEntry {\n  source: string\n  url: string\n}\n\ninterface TextureManifest {\n  tilesetImages: TextureManifestEntry[]\n  tileImages: TextureManifestEntry[]\n  imageLayerImages: TextureManifestEntry[]\n}\n\ninterface LoadedTextureSets {\n  tilesetTextures: Map<string, Texture>\n  imageLayerTextures: Map<string, Texture>\n  tileImageTextures: Map<string, Texture>\n  tileImageGifSources: Map<string, GifSource>\n  imageLayerGifSources: Map<string, GifSource>\n}\n\nexport async function fetchMapDependencies(\n  data: TiledMapData,\n  basePath: string,\n  fetchFn: FetchFn = fetch\n): Promise<{\n  externalTilesets: Map<string, TiledTileset>\n  templates: Map<string, TiledObjectTemplate>\n}> {\n  const externalTilesets = new Map<string, TiledTileset>()\n  for (const ts of data.tilesets) {\n    if (!isTilesetRef(ts)) continue\n    const tsUrl = pixiPath.join(basePath, ts.source)\n    const tsResponse = await fetchFn(tsUrl)\n    const tsExt = pixiPath.extname(ts.source).toLowerCase()\n    externalTilesets.set(\n      ts.source,\n      tsExt === '.tsx'\n        ? parseTsx(await tsResponse.text())\n        : ((await tsResponse.json()) as TiledTileset)\n    )\n  }\n\n  const templates = new Map<string, TiledObjectTemplate>()\n  const templateSources = new Set<string>()\n  for (const obj of walkObjects(data.layers)) {\n    if (obj.template) templateSources.add(obj.template)\n  }\n  await Promise.all(\n    Array.from(templateSources).map(async (src) => {\n      const tplUrl = pixiPath.join(basePath, src)\n      const tplResponse = await fetchFn(tplUrl)\n      const tplExt = pixiPath.extname(src).toLowerCase()\n      templates.set(\n        src,\n        tplExt === '.tx'\n          ? parseTx(await tplResponse.text())\n          : ((await tplResponse.json()) as TiledObjectTemplate)\n      )\n    })\n  )\n\n  return { externalTilesets, templates }\n}\n\nexport const tiledMapLoader: LoaderParser<TiledMapAsset> = {\n  extension: {\n    type: ExtensionType.LoadParser,\n    name: 'tiledmap-loader'\n  },\n\n  id: 'tiledmap-loader',\n  name: 'tiledmap-loader',\n\n  test(url: string): boolean {\n    const ext = pixiPath.extname(url).toLowerCase()\n    return ext === '.tmx' || ext === '.tmj'\n  },\n\n  async load(url: string): Promise<TiledMapAsset> {\n    return loadTiledMapAsset(url)\n  }\n}\n\nexport async function loadTiledMapAsset(\n  url: string,\n  options?: TiledAssetPipelineOptions\n): Promise<TiledMapAsset> {\n  const fetchFn = options?.fetchFn ?? fetch\n  const loadAsset = options?.loadAsset\n  const data = await fetchTiledMapData(url, fetchFn)\n  const basePath = pixiPath.dirname(url)\n  const { externalTilesets, templates } = await fetchMapDependencies(data, basePath, fetchFn)\n  const mapData = await parseMapAsync(data, { externalTilesets, templates })\n  const textures = await loadTextureManifest(collectTextureManifest(mapData, basePath), loadAsset)\n  const container = new TiledMap(mapData, {\n    tilesetTextures: textures.tilesetTextures,\n    imageLayerTextures: textures.imageLayerTextures,\n    tileImageTextures: textures.tileImageTextures,\n    tileImageGifSources: textures.tileImageGifSources,\n    imageLayerGifSources: textures.imageLayerGifSources\n  })\n\n  return { mapData, container }\n}\n\nasync function fetchTiledMapData(url: string, fetchFn: FetchFn): Promise<TiledMapData> {\n  const ext = pixiPath.extname(url).toLowerCase()\n  const response = await fetchFn(url)\n\n  if (ext === '.tmx') {\n    return parseTmx(await response.text())\n  }\n\n  return (await response.json()) as TiledMapData\n}\n\nexport function collectTextureManifest(mapData: ResolvedMap, basePath: string): TextureManifest {\n  const tilesetImages: TextureManifestEntry[] = []\n  const tileImages: TextureManifestEntry[] = []\n  const imageLayerImages: TextureManifestEntry[] = []\n\n  for (const ts of mapData.tilesets) {\n    if (ts.image) {\n      tilesetImages.push({ source: ts.image, url: pixiPath.join(basePath, ts.image) })\n    }\n\n    for (const [_localId, tileDef] of ts.tiles) {\n      if (tileDef.image) {\n        tileImages.push({ source: tileDef.image, url: pixiPath.join(basePath, tileDef.image) })\n      }\n    }\n  }\n\n  for (const layer of flattenLayers(mapData.layers)) {\n    if (layer.type === 'imagelayer' && layer.image) {\n      imageLayerImages.push({ source: layer.image, url: pixiPath.join(basePath, layer.image) })\n    }\n  }\n\n  return { tilesetImages, tileImages, imageLayerImages }\n}\n\nexport async function loadTextureManifest(\n  manifest: TextureManifest,\n  loadAsset: LoadAssetFn = (url) => Assets.load(url)\n): Promise<LoadedTextureSets> {\n  const loaded: LoadedTextureSets = {\n    tilesetTextures: new Map(),\n    imageLayerTextures: new Map(),\n    tileImageTextures: new Map(),\n    tileImageGifSources: new Map(),\n    imageLayerGifSources: new Map()\n  }\n\n  await Promise.all([\n    ...manifest.tilesetImages.map((entry) =>\n      loadAsset<Texture | GifSource>(entry.url).then((asset) => {\n        loaded.tilesetTextures.set(entry.source, firstTexture(asset, entry.url))\n      })\n    ),\n    ...manifest.tileImages.map((entry) =>\n      loadAsset<Texture | GifSource>(entry.url).then((asset) => {\n        if (isGifUrl(entry.url)) {\n          const gifSource = asset as GifSource\n          loaded.tileImageTextures.set(entry.source, gifSource.textures[0] as Texture)\n          loaded.tileImageGifSources.set(entry.source, gifSource)\n        } else {\n          loaded.tileImageTextures.set(entry.source, asset as Texture)\n        }\n      })\n    ),\n    ...manifest.imageLayerImages.map((entry) =>\n      loadAsset<Texture | GifSource>(entry.url).then((asset) => {\n        if (isGifUrl(entry.url)) {\n          const gifSource = asset as GifSource\n          loaded.imageLayerTextures.set(entry.source, gifSource.textures[0] as Texture)\n          loaded.imageLayerGifSources.set(entry.source, gifSource)\n        } else {\n          loaded.imageLayerTextures.set(entry.source, asset as Texture)\n        }\n      })\n    )\n  ])\n\n  return loaded\n}\n\nfunction firstTexture(asset: Texture | GifSource, url: string): Texture {\n  return isGifUrl(url) ? ((asset as GifSource).textures[0] as Texture) : (asset as Texture)\n}\n\nfunction isGifUrl(url: string): boolean {\n  return url.toLowerCase().endsWith('.gif')\n}\n\nfunction flattenLayers<L extends { type: string; layers?: L[] }>(layers: L[]): L[] {\n  const result: L[] = []\n  for (const layer of layers) {\n    result.push(layer)\n    if (layer.type === 'group' && layer.layers) {\n      result.push(...flattenLayers(layer.layers))\n    }\n  }\n  return result\n}\n\nfunction* walkObjects(layers: TiledLayer[]): Generator<TiledObject> {\n  for (const layer of flattenLayers(layers)) {\n    if (layer.type === 'objectgroup' && layer.objects) {\n      for (const obj of layer.objects) yield obj\n    }\n  }\n}\n"],"mappings":";;;;AAEA,SAAgB,UAAU,KAAuB;CAC/C,MAAM,MAAgB,EAAE;CACxB,IAAI,MAAM;CACV,IAAI,WAAW;AACf,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;EACnC,MAAM,OAAO,IAAI,WAAW,EAAE;AAC9B,MAAI,QAAQ,MAAM,QAAQ,IAAI;AAC5B,SAAM,MAAM,MAAM,OAAO;AACzB,cAAW;aACF,SAAS,IAAI;AAEtB,OAAI,SAAU,KAAI,KAAK,IAAI;AAC3B,SAAM;AACN,cAAW;;;AAIf,KAAI,SAAU,KAAI,KAAK,IAAI;AAC3B,QAAO;;AAGT,SAAS,cAAc,QAA4B;CACjD,MAAM,SAAS,WAAW,KAAK,OAAO,MAAM,CAAC;CAC7C,MAAM,QAAQ,IAAI,WAAW,OAAO,OAAO;AAC3C,MAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,IACjC,OAAM,KAAK,OAAO,WAAW,EAAE;AAEjC,QAAO;;AAGT,SAAS,YAAY,OAA6B;CAChD,MAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,WAAW;CAC3E,MAAM,QAAQ,MAAM,aAAa;CACjC,MAAM,OAAiB,IAAI,MAAM,MAAM;AAEvC,MAAK,IAAI,IAAI,GAAG,IAAI,OAAO,IACzB,MAAK,KAAK,KAAK,UAAU,IAAI,GAAG,KAAK;AAGvC,QAAO;;AAGT,eAAe,qBACb,OACA,aACqB;CACrB,MAAM,SAAS,gBAAgB,SAAS,SAAS;CACjD,MAAM,KAAK,IAAI,oBAAoB,OAAO;CAC1C,MAAM,SAAS,GAAG,SAAS,WAAW;AACtC,QAAO,MAAM,MAAiC;AAC9C,QAAO,OAAO;CAEd,MAAM,SAAS,GAAG,SAAS,WAAW;CACtC,MAAM,SAAuB,EAAE;CAC/B,IAAI,cAAc;AAElB,UAAS;EACP,MAAM,EAAE,MAAM,UAAU,MAAM,OAAO,MAAM;AAC3C,MAAI,KAAM;AACV,SAAO,KAAK,MAAM;AAClB,iBAAe,MAAM;;CAGvB,MAAM,SAAS,IAAI,WAAW,YAAY;CAC1C,IAAI,SAAS;AACb,MAAK,MAAM,SAAS,QAAQ;AAC1B,SAAO,IAAI,OAAO,OAAO;AACzB,YAAU,MAAM;;AAElB,QAAO;;AAGT,SAAS,iBAAiB,MAAc,aAA0C;CAChF,MAAM,QAAQ,cAAc,KAAK;AAEjC,KAAI,gBAAgB,UAAU,gBAAgB,OAC5C,OAAM,IAAI,MACR,yBAAyB,YAAY,6FAEtC;AAGH,KAAI,gBAAgB,OAClB,OAAM,IAAI,MAAM,mDAAmD;AAGrE,QAAO,YAAY,MAAM;;AAG3B,eAAe,kBAAkB,MAAc,aAAmD;CAChG,MAAM,QAAQ,cAAc,KAAK;AAEjC,KAAI,gBAAgB,UAAU,gBAAgB,OAE5C,QAAO,YADc,MAAM,qBAAqB,OAAO,YAAY,CACnC;AAGlC,KAAI,gBAAgB,OAClB,OAAM,IAAI,MAAM,mDAAmD;AAGrE,QAAO,YAAY,MAAM;;AAG3B,SAAgB,gBACd,MACA,UACA,aACU;AACV,KAAI,MAAM,QAAQ,KAAK,CAAE,QAAO;AAChC,KAAI,aAAa,MAAO,QAAO,UAAU,KAAK;AAC9C,KAAI,aAAa,SAAU,QAAO,iBAAiB,MAAM,YAAY;AACrE,OAAM,IAAI,MAAM,yBAAyB,YAAY,YAAY;;AAGnE,eAAsB,qBACpB,MACA,UACA,aACmB;AACnB,KAAI,MAAM,QAAQ,KAAK,CAAE,QAAO;AAChC,KAAI,aAAa,MAAO,QAAO,UAAU,KAAK;AAC9C,KAAI,aAAa,SAAU,QAAO,kBAAkB,MAAM,YAAY;AACtE,OAAM,IAAI,MAAM,yBAAyB,YAAY,YAAY;;;;AC0MnE,MAAa,4BAA4B;AACzC,MAAa,0BAA0B;AACvC,MAAa,0BAA0B;AACvC,MAAa,6BAA6B;AAC1C,MAAa,WAAW;;;ACnUxB,SAAgB,UAAU,KAAkC;CAC1D,MAAM,MAAM,MAAM;AAClB,KAAI,QAAQ,EAAG,QAAO;AAEtB,QAAO;EACL;EACA,SAAS;EACT,cAAc;EACd,iBAAiB,MAAM,+BAA+B;EACtD,eAAe,MAAM,6BAA6B;EAClD,eAAe,MAAM,6BAA6B;EACnD;;;;ACnBH,SAAgB,IAAI,IAAa,MAAc,WAAW,IAAY;AACpE,QAAO,GAAG,aAAa,KAAK,IAAI;;AAGlC,SAAgB,IAAI,IAAa,MAAc,WAAW,GAAW;CACnE,MAAM,QAAQ,GAAG,aAAa,KAAK;AACnC,QAAO,SAAS,OAAO,SAAS,OAAO,GAAG,GAAG;;AAG/C,SAAgB,MAAM,IAAa,MAAc,WAAW,GAAW;CACrE,MAAM,QAAQ,GAAG,aAAa,KAAK;AACnC,QAAO,SAAS,OAAO,WAAW,MAAM,GAAG;;AAG7C,SAAgB,KAAK,IAAa,MAAc,WAAW,OAAgB;CACzE,MAAM,QAAQ,GAAG,aAAa,KAAK;AACnC,KAAI,SAAS,KAAM,QAAO;AAC1B,QAAO,UAAU,OAAO,UAAU;;AAGpC,SAAgB,OAAO,IAAa,MAAkC;CACpE,MAAM,QAAQ,GAAG,aAAa,KAAK;AACnC,QAAO,SAAS,OAAO,QAAQ,KAAA;;AAGjC,SAAgB,OAAO,IAAa,MAAkC;CACpE,MAAM,QAAQ,GAAG,aAAa,KAAK;AACnC,QAAO,SAAS,OAAO,SAAS,OAAO,GAAG,GAAG,KAAA;;AAG/C,SAAgB,SAAS,IAAa,MAAkC;CACtE,MAAM,QAAQ,GAAG,aAAa,KAAK;AACnC,QAAO,SAAS,OAAO,WAAW,MAAM,GAAG,KAAA;;AAG7C,SAAgB,SAAS,IAAa,KAAwB;CAC5D,MAAM,SAAoB,EAAE;AAC5B,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,SAAS,QAAQ,KAAK;EAC3C,MAAM,QAAQ,GAAG,SAAS;AAC1B,MAAI,MAAM,YAAY,IAAK,QAAO,KAAK,MAAM;;AAE/C,QAAO;;AAGT,SAAgB,MAAM,IAAa,KAA6B;AAC9D,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,SAAS,QAAQ,KAAK;EAC3C,MAAM,UAAU,GAAG,SAAS;AAC5B,MAAI,QAAQ,YAAY,IAAK,QAAO;;AAEtC,QAAO;;;;AC7CT,SAAgB,UAAU,QAKxB;CACA,MAAM,WAAW,OAAO,QAAQ,WAAW;CAC3C,MAAM,cAAc,OAAO,QAAQ,cAAc;CAEjD,MAAM,WAAW,SAAS,QAAQ,QAAQ;AAC1C,KAAI,SAAS,SAAS,EAQpB,QAAO;EAAE;EAAU;EAAa,QAPH,SAAS,KAAK,OAAO;GAChD,GAAG,IAAI,GAAG,IAAI;GACd,GAAG,IAAI,GAAG,IAAI;GACd,OAAO,IAAI,GAAG,QAAQ;GACtB,QAAQ,IAAI,GAAG,SAAS;GACxB,MAAM,iBAAiB,GAAG,SAAS;GACpC,EAAE;EACqC;AAG1C,QAAO;EACL,MAAM,iBAAiB,QAAQ,SAAS;EACxC;EACA;EACD;;AAGH,SAAS,iBAAiB,IAAa,UAAwD;AAC7F,KAAI,aAAa,SACf,SAAQ,GAAG,eAAe,IAAI,MAAM;AAGtC,KAAI,aAAa,MACf,QAAO,UAAU,GAAG,eAAe,GAAG;AAIxC,QADgB,SAAS,IAAI,OAAO,CACrB,KAAK,MAAM,IAAI,GAAG,MAAM,CAAC;;;;ACvC1C,SAAgB,gBAAgB,IAA0C;CACxE,MAAM,UAAU,MAAM,IAAI,aAAa;AACvC,KAAI,CAAC,QAAS,QAAO,KAAA;CAErB,MAAM,QAAyB,EAAE;AACjC,MAAK,MAAM,OAAO,SAAS,SAAS,WAAW,EAAE;EAC/C,MAAM,OAAO,IAAI,KAAK,QAAQ,SAAS;EACvC,IAAI,QAAmC,IAAI,KAAK,SAAS,GAAG;AAC5D,MAAI,CAAC,IAAI,aAAa,QAAQ,CAC5B,SAAQ,IAAI,eAAe;AAE7B,MAAI,SAAS,MAAO,SAAQ,SAAS,OAAiB,GAAG;WAChD,SAAS,QAAS,SAAQ,WAAW,MAAgB;WACrD,SAAS,OAAQ,SAAQ,UAAU;AAE5C,QAAM,KAAK;GACT,MAAM,IAAI,KAAK,OAAO;GACtB;GACA,cAAc,IAAI,aAAa,eAAe,IAAI,KAAA;GAClD;GACD,CAAC;;AAEJ,QAAO,MAAM,SAAS,IAAI,QAAQ,KAAA;;;;ACrBpC,SAAgB,YAAY,IAA0B;CACpD,MAAM,MAAmB;EACvB,IAAI,IAAI,IAAI,KAAK;EACjB,MAAM,IAAI,IAAI,OAAO;EACrB,MAAM,IAAI,IAAI,OAAO,IAAI,IAAI,IAAI,QAAQ;EACzC,GAAG,MAAM,IAAI,IAAI;EACjB,GAAG,MAAM,IAAI,IAAI;EACjB,OAAO,MAAM,IAAI,QAAQ;EACzB,QAAQ,MAAM,IAAI,SAAS;EAC3B,UAAU,MAAM,IAAI,WAAW;EAC/B,SAAS,GAAG,aAAa,UAAU,GAAG,KAAK,IAAI,WAAW,KAAK,GAAG;EAClE,YAAY,gBAAgB,GAAG;EAChC;CAED,MAAM,MAAM,OAAO,IAAI,MAAM;AAC7B,KAAI,OAAO,KAAM,KAAI,MAAM;CAE3B,MAAM,WAAW,OAAO,IAAI,WAAW;AACvC,KAAI,SAAU,KAAI,WAAW;AAE7B,KAAI,MAAM,IAAI,UAAU,CAAE,KAAI,UAAU;AACxC,KAAI,MAAM,IAAI,QAAQ,CAAE,KAAI,QAAQ;CAEpC,MAAM,YAAY,MAAM,IAAI,UAAU;AACtC,KAAI,UACF,KAAI,UAAU,YAAY,IAAI,WAAW,SAAS,CAAC;CAGrD,MAAM,aAAa,MAAM,IAAI,WAAW;AACxC,KAAI,WACF,KAAI,WAAW,YAAY,IAAI,YAAY,SAAS,CAAC;CAGvD,MAAM,SAAS,MAAM,IAAI,OAAO;AAChC,KAAI,OACF,KAAI,OAAO,gBAAgB,OAAO;AAGpC,QAAO;;AAGT,SAAS,YAAY,UAAgC;AACnD,QAAO,SACJ,MAAM,CACN,MAAM,MAAM,CACZ,KAAK,SAAS;EACb,MAAM,CAAC,GAAG,KAAK,KAAK,MAAM,IAAI,CAAC,IAAI,OAAO;AAC1C,SAAO;GAAK;GAAO;GAAI;GACvB;;AAGN,SAAS,gBAAgB,IAAwB;AAC/C,QAAO;EACL,MAAM,GAAG,eAAe;EACxB,YAAY,OAAO,IAAI,aAAa;EACpC,WAAW,OAAO,IAAI,YAAY;EAClC,MAAM,KAAK,IAAI,OAAO,GAAG,OAAO,KAAA;EAChC,OAAO,OAAO,IAAI,QAAQ;EAC1B,MAAM,KAAK,IAAI,OAAO,GAAG,OAAO,KAAA;EAChC,QAAQ,KAAK,IAAI,SAAS,GAAG,OAAO,KAAA;EACpC,WAAW,KAAK,IAAI,YAAY,GAAG,OAAO,KAAA;EAC1C,WAAW,KAAK,IAAI,YAAY,GAAG,OAAO,KAAA;EAC1C,SAAS,GAAG,aAAa,UAAU,GAAG,KAAK,IAAI,WAAW,KAAK,GAAG,KAAA;EAClE,QAAQ,OAAO,IAAI,SAAS;EAC5B,QAAQ,OAAO,IAAI,SAAS;EAC7B;;;;ACnEH,SAAgB,aAAa,IAA2D;AACtF,QAAO,YAAY,MAAM,EAAE,UAAU;;AAWvC,SAAgB,sBAAsB,IAA2B;AAC/D,KAAI,GAAG,WAAW,GAAG,UAAU,EAAG,QAAO,GAAG;AAC5C,KAAI,CAAC,GAAG,cAAc,GAAG,aAAa,EAAG,QAAO;AAChD,QAAO,KAAK,OAAO,GAAG,aAAa,IAAI,GAAG,SAAS,GAAG,YAAY,GAAG,YAAY,GAAG,SAAS;;;;;;;AAQ/F,SAAgB,uBAAuB,KAAa,UAA0C;AAC5F,MAAK,IAAI,IAAI,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;EAC7C,MAAM,KAAK,SAAS;AACpB,MAAI,MAAM,GAAG,YAAY,IAAK,QAAO;;AAEvC,QAAO;;;;ACET,SAAgB,WAAW,IAAwB;CACjD,MAAM,QAAQ,MAAM,IAAI,QAAQ;AAChC,KAAI,CAAC,MAAO,QAAO,EAAE;AACrB,QAAO;EACL,OAAO,OAAO,OAAO,SAAS;EAC9B,YAAY,OAAO,OAAO,QAAQ;EAClC,aAAa,OAAO,OAAO,SAAS;EACpC,kBAAkB,OAAO,OAAO,QAAQ;EACzC;;AAGH,SAAgB,aACd,IACA,kBACgC;CAChC,MAAM,SAAS,OAAO,IAAI,SAAS;AACnC,KAAI,OACF,QAAO;EACL,UAAU,IAAI,IAAI,WAAW;EAC7B;EACD;CAGH,MAAM,MAAM,WAAW,GAAG;CAC1B,MAAM,QAAQ,qBAAqB,IAAI,iBAAiB;CAExD,MAAM,YAAY,IAAI,IAAI,YAAY;CACtC,MAAM,UAAU,IAAI,IAAI,UAAU;CAClC,MAAM,SAAS,IAAI,IAAI,SAAS;CAChC,MAAM,UAAU,sBAAsB;EACpC,SAAS,IAAI,IAAI,UAAU;EAC3B,YAAY,IAAI;EAChB;EACA;EACA;EACD,CAAC;AAEF,QAAO;EACL,iBAAiB,OAAO,IAAI,kBAAkB;EAC9C,OAAO,OAAO,IAAI,QAAQ;EAC1B;EACA,UAAU,OAAO,IAAI,WAAW;EAChC,UAAU,IAAI,IAAI,WAAW;EAC7B,MAAM,UAAU,GAAG;EACnB;EACA,MAAM,IAAI,IAAI,OAAO;EACrB,iBAAiB,OAAO,IAAI,kBAAkB;EAC9C,YAAY,gBAAgB,GAAG;EAC/B;EACA,UAAU,cAAc,GAAG;EAC3B,WAAW,IAAI,IAAI,YAAY;EAC/B,YAAY,IAAI,IAAI,aAAa;EACjC,YAAY,gBAAgB,GAAG;EAC/B,gBAAgB,OAAO,IAAI,iBAAiB;EAC5C;EACA;EACA,iBAAiB,qBAAqB,GAAG;EACzC,UAAU,cAAc,GAAG;EAC3B,GAAG;EACJ;;AAGH,SAAS,gBAAgB,IAA0C;CACjE,MAAM,KAAK,MAAM,IAAI,aAAa;AAClC,KAAI,CAAC,GAAI,QAAO,KAAA;AAChB,QAAO;EAAE,GAAG,IAAI,IAAI,IAAI;EAAE,GAAG,IAAI,IAAI,IAAI;EAAE;;AAG7C,SAAS,UAAU,IAAoC;CACrD,MAAM,IAAI,MAAM,IAAI,OAAO;AAC3B,KAAI,CAAC,EAAG,QAAO,KAAA;AACf,QAAO;EACL,aAAa,IAAI,GAAG,eAAe,aAAa;EAChD,OAAO,IAAI,GAAG,QAAQ;EACtB,QAAQ,IAAI,GAAG,SAAS;EACzB;;AAGH,SAAS,qBAAqB,IAA+C;CAC3E,MAAM,IAAI,MAAM,IAAI,kBAAkB;AACtC,KAAI,CAAC,EAAG,QAAO,KAAA;AACf,QAAO;EACL,OAAO,KAAK,GAAG,QAAQ;EACvB,OAAO,KAAK,GAAG,QAAQ;EACvB,QAAQ,KAAK,GAAG,SAAS;EACzB,qBAAqB,KAAK,GAAG,sBAAsB;EACpD;;AAGH,SAAS,cAAc,IAAyC;CAC9D,MAAM,OAAO,MAAM,IAAI,eAAe;AACtC,KAAI,CAAC,KAAM,QAAO,KAAA;AAClB,QAAO,SAAS,MAAM,UAAU,CAAC,KAAK,OAAO;EAC3C,MAAM,IAAI,GAAG,OAAO;EACpB,MAAM,IAAI,GAAG,OAAO;EACpB,YAAY,gBAAgB,EAAE;EAC/B,EAAE;;AAGL,SAAS,cAAc,IAAyC;CAC9D,MAAM,OAAO,MAAM,IAAI,WAAW;AAClC,KAAI,CAAC,KAAM,QAAO,KAAA;AAElB,QAAO,SAAS,MAAM,UAAU,CAAC,KAAK,OAAO;EAC3C,MAAM,SAA2B,SAAS,IAAI,YAAY,CAAC,KAAK,QAAQ;GACtE,OAAO,OAAO,IAAI,QAAQ;GAC1B,OAAO,IAAI,IAAI,QAAQ;GACvB,MAAM,IAAI,IAAI,OAAO;GACrB,aAAa,MAAM,IAAI,cAAc;GACrC,MAAM,IAAI,IAAI,OAAO;GACrB,YAAY,gBAAgB,GAAG;GAChC,EAAE;EAEH,MAAM,QAAyB,SAAS,IAAI,WAAW,CAAC,KAAK,QAAQ;GACnE,QAAQ,IAAI,IAAI,SAAS;GACzB,QAAQ,IAAI,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,IAAI,OAAO;GACjD,EAAE;AAEH,SAAO;GACL,OAAO,OAAO,IAAI,QAAQ;GAC1B;GACA,MAAM,IAAI,IAAI,OAAO;GACrB,YAAY,gBAAgB,GAAG;GAC/B,MAAM,IAAI,IAAI,OAAO;GACrB,MAAM,IAAI,IAAI,QAAQ,SAAS;GAC/B,WAAW;GACZ;GACD;;AAGJ,SAAS,eAAe,IAAuC;CAC7D,MAAM,SAAS,MAAM,IAAI,YAAY;AACrC,KAAI,CAAC,OAAQ,QAAO,KAAA;AACpB,QAAO,SAAS,QAAQ,QAAQ,CAAC,KAAK,OAAO;EAC3C,QAAQ,IAAI,GAAG,SAAS;EACxB,UAAU,IAAI,GAAG,WAAW;EAC7B,EAAE;;AAGL,SAAS,qBACP,IACA,kBACmC;CACnC,MAAM,UAAU,SAAS,IAAI,OAAO;AACpC,KAAI,QAAQ,WAAW,EAAG,QAAO,KAAA;AAEjC,QAAO,QAAQ,KAAK,MAAM;EACxB,MAAM,MAAM,WAAW,EAAE;EACzB,MAAM,cAAc,OAAO,GAAG,UAAU;EACxC,MAAM,UAAU,cACZ,YAAY,MAAM,IAAI,CAAC,KAAK,MAAO,MAAM,KAAK,KAAK,SAAS,GAAG,GAAG,CAAE,GACpE,KAAA;EAEJ,MAAM,OAAO,MAAM,GAAG,cAAc;EACpC,MAAM,cAAc,QAAQ,mBAAmB,iBAAiB,KAAK,GAAG,KAAA;AAExE,SAAO;GACL,IAAI,IAAI,GAAG,KAAK;GAChB,MAAM,OAAO,GAAG,OAAO,IAAI,OAAO,GAAG,QAAQ;GAC7C,aAAa,SAAS,GAAG,cAAc;GACvC,GAAG,OAAO,GAAG,IAAI;GACjB,GAAG,OAAO,GAAG,IAAI;GACjB,OAAO,OAAO,GAAG,QAAQ;GACzB,QAAQ,OAAO,GAAG,SAAS;GAC3B,YAAY,gBAAgB,EAAE;GAC9B,WAAW,eAAe,EAAE;GAC5B;GACA;GACA,GAAG;GACJ;GACD;;;;ACrLJ,SAAS,iBAAiB,IAAkC;AAC1D,QAAO;EACL,IAAI,IAAI,IAAI,KAAK;EACjB,MAAM,IAAI,IAAI,OAAO;EACrB,OAAO,OAAO,IAAI,QAAQ;EAC1B,SAAS,MAAM,IAAI,WAAW,EAAE;EAChC,SAAS,GAAG,aAAa,UAAU,GAAG,KAAK,IAAI,WAAW,KAAK,GAAG;EAClE,WAAW,OAAO,IAAI,YAAY;EAClC,SAAS,SAAS,IAAI,UAAU;EAChC,SAAS,SAAS,IAAI,UAAU;EAChC,WAAW,SAAS,IAAI,YAAY;EACpC,WAAW,SAAS,IAAI,YAAY;EACpC,QAAQ,GAAG,aAAa,SAAS,GAAG,KAAK,IAAI,SAAS,GAAG,KAAA;EACzD,YAAY,gBAAgB,GAAG;EAC/B,GAAG,IAAI,IAAI,IAAI;EACf,GAAG,IAAI,IAAI,IAAI;EAChB;;AAGH,SAAS,eAAe,IAAyB;CAC/C,MAAM,SAAS,MAAM,IAAI,OAAO;CAChC,MAAM,WAAW,SAAS,UAAU,OAAO,GAAG,EAAE;AAEhD,QAAO;EACL,GAAG,iBAAiB,GAAG;EACvB,MAAM;EACN,OAAO,OAAO,IAAI,QAAQ;EAC1B,QAAQ,OAAO,IAAI,SAAS;EAC5B,QAAQ,OAAO,IAAI,SAAS;EAC5B,QAAQ,OAAO,IAAI,SAAS;EAC5B,GAAG;EACJ;;AAGH,SAAS,iBAAiB,IAAyB;AACjD,QAAO;EACL,GAAG,iBAAiB,GAAG;EACvB,MAAM;EACN,WAAW,OAAO,IAAI,YAAY;EAClC,SAAS,SAAS,IAAI,SAAS,CAAC,IAAI,YAAY;EACjD;;AAGH,SAAS,gBAAgB,IAAyB;CAChD,MAAM,MAAM,WAAW,GAAG;AAC1B,QAAO;EACL,GAAG,iBAAiB,GAAG;EACvB,MAAM;EACN,SAAS,GAAG,aAAa,UAAU,GAAG,KAAK,IAAI,UAAU,GAAG,KAAA;EAC5D,SAAS,GAAG,aAAa,UAAU,GAAG,KAAK,IAAI,UAAU,GAAG,KAAA;EAC5D,kBAAkB,IAAI;EACtB,OAAO,IAAI;EACX,YAAY,IAAI;EAChB,aAAa,IAAI;EAClB;;AAGH,SAAS,gBAAgB,IAAyB;AAChD,QAAO;EACL,GAAG,iBAAiB,GAAG;EACvB,MAAM;EACN,QAAQ,YAAY,GAAG;EACxB;;AAGH,SAAS,YAAY,UAAiC;CACpD,MAAM,SAAuB,EAAE;AAC/B,MAAK,IAAI,IAAI,GAAG,IAAI,SAAS,SAAS,QAAQ,KAAK;EACjD,MAAM,KAAK,SAAS,SAAS;AAC7B,UAAQ,GAAG,SAAX;GACE,KAAK;AACH,WAAO,KAAK,eAAe,GAAG,CAAC;AAC/B;GACF,KAAK;AACH,WAAO,KAAK,iBAAiB,GAAG,CAAC;AACjC;GACF,KAAK;AACH,WAAO,KAAK,gBAAgB,GAAG,CAAC;AAChC;GACF,KAAK;AACH,WAAO,KAAK,gBAAgB,GAAG,CAAC;AAChC;;;AAGN,QAAO;;AAKT,SAAgB,SAAS,KAAuB;CAE9C,MAAM,MADS,IAAI,WAAW,CACX,gBAAgB,KAAK,WAAW;CAEnD,MAAM,YAAY,IAAI,cAAc,cAAc;AAClD,KAAI,UACF,OAAM,IAAI,MAAM,wBAAwB,UAAU,cAAc;CAGlE,MAAM,QAAQ,IAAI;AAClB,KAAI,MAAM,YAAY,MACpB,OAAM,IAAI,MAAM,qCAAqC,MAAM,QAAQ,GAAG;CAGxE,MAAM,WAA+C,SAAS,OAAO,UAAU,CAAC,KAAK,OACnF,aAAa,IAAI,iBAAiB,CACnC;CAED,MAAM,SAAS,YAAY,MAAM;AAEjC,QAAO;EACL,iBAAiB,OAAO,OAAO,kBAAkB;EACjD,OAAO,OAAO,OAAO,QAAQ;EAC7B,kBAAkB,OAAO,OAAO,mBAAmB;EACnD,QAAQ,IAAI,OAAO,SAAS;EAC5B,eAAe,OAAO,OAAO,gBAAgB;EAC7C,UAAU,KAAK,OAAO,WAAW;EACjC;EACA,aAAa,IAAI,OAAO,cAAc;EACtC,cAAc,IAAI,OAAO,eAAe;EACxC,aAAa,IAAI,OAAO,eAAe,aAAa;EACpD,iBAAiB,SAAS,OAAO,kBAAkB;EACnD,iBAAiB,SAAS,OAAO,kBAAkB;EACnD,YAAY,gBAAgB,MAAM;EAClC,aAAa,OAAO,OAAO,cAAc;EACzC,aAAa,OAAO,OAAO,cAAc;EACzC,cAAc,OAAO,OAAO,eAAe;EAC3C,cAAc,OAAO,OAAO,eAAe;EAC3C,YAAY,IAAI,OAAO,aAAa;EACpC;EACA,WAAW,IAAI,OAAO,YAAY;EAClC,MAAM;EACN,SAAS,IAAI,OAAO,WAAW,MAAM;EACrC,OAAO,IAAI,OAAO,QAAQ;EAC3B;;AAGH,SAAgB,SAAS,KAA2B;CAElD,MAAM,MADS,IAAI,WAAW,CACX,gBAAgB,KAAK,WAAW;CAEnD,MAAM,YAAY,IAAI,cAAc,cAAc;AAClD,KAAI,UACF,OAAM,IAAI,MAAM,wBAAwB,UAAU,cAAc;CAGlE,MAAM,OAAO,IAAI;AACjB,KAAI,KAAK,YAAY,UACnB,OAAM,IAAI,MAAM,yCAAyC,KAAK,QAAQ,GAAG;CAG3E,MAAM,SAAS,aAAa,MAAM,iBAAiB;AACnD,KAAI,YAAY,OACd,OAAM,IAAI,MAAM,iDAAiD;AAEnE,QAAO;;AAKT,SAAgB,QAAQ,KAAkC;CAExD,MAAM,MADS,IAAI,WAAW,CACX,gBAAgB,KAAK,WAAW;CAEnD,MAAM,YAAY,IAAI,cAAc,cAAc;AAClD,KAAI,UACF,OAAM,IAAI,MAAM,uBAAuB,UAAU,cAAc;CAGjE,MAAM,QAAQ,IAAI;AAClB,KAAI,MAAM,YAAY,WACpB,OAAM,IAAI,MAAM,0CAA0C,MAAM,QAAQ,GAAG;CAG7E,MAAM,YAAY,MAAM,OAAO,UAAU;CACzC,MAAM,WAAW,MAAM,OAAO,SAAS;AACvC,KAAI,CAAC,SACH,OAAM,IAAI,MAAM,+BAA+B;AAGjD,QAAO;EACL,MAAM;EACN,SAAS,YAAY,aAAa,WAAW,iBAAiB,GAAG,KAAA;EACjE,QAAQ,YAAY,SAAS;EAC9B;;;;;;;;;;ACnMH,SAAgB,cACd,KACA,UACA,UACa;CACb,MAAM,OAAoB;EACxB,GAAG,SAAS;EACZ,IAAI,IAAI;EACR,GAAG,IAAI;EACP,GAAG,IAAI;EACP,UAAU,IAAI;EACd,SAAS,IAAI;EACd;AAID,KAAI,IAAI,KAAM,MAAK,OAAO,IAAI;AAC9B,KAAI,IAAI,KAAM,MAAK,OAAO,IAAI;AAC9B,KAAI,IAAI,MAAO,MAAK,QAAQ,IAAI;AAChC,KAAI,IAAI,OAAQ,MAAK,SAAS,IAAI;AAClC,KAAI,IAAI,WAAY,MAAK,aAAa,IAAI;AAC1C,KAAI,IAAI,KAAM,MAAK,OAAO,IAAI;CAC9B,MAAM,uBAAuB,IAAI,QAAQ,KAAA;AACzC,KAAI,qBAAsB,MAAK,MAAM,IAAI;AACzC,KAAI,IAAI,QAAS,MAAK,UAAU,IAAI;AACpC,KAAI,IAAI,SAAU,MAAK,WAAW,IAAI;AACtC,KAAI,IAAI,QAAS,MAAK,UAAU,IAAI;AACpC,KAAI,IAAI,MAAO,MAAK,QAAQ,IAAI;AAMhC,KACE,KAAK,QAAQ,KAAA,KACb,CAAC,wBACD,SAAS,WACT,YAAY,SAAS,WACrB,SAAS,QAAQ,QACjB;EACA,MAAM,MAAM,SAAS,QAAQ;EAC7B,MAAM,QAAQ,SAAS,MAAM,MAAM,EAAE,WAAW,IAAI;AACpD,MAAI,OAAO;GACT,MAAM,mBAAmB,SAAS,QAAQ,YAAY;GACtD,MAAM,WAAW,KAAK,MAAM,CAAC;GAC7B,MAAM,WAAW,KAAK,MAAM,YAAY;AACxC,OAAI,WAAW,EACb,MAAK,MAAO,MAAM,WAAW,UAAW;;;AAK9C,QAAO;;;;AC/BT,SAAS,eAAe,KAAmB,QAAkC;CAC3E,MAAM,wBAAQ,IAAI,KAAkC;AACpD,KAAI,IAAI,MACN,MAAK,MAAM,QAAQ,IAAI,MACrB,OAAM,IAAI,KAAK,IAAI,KAAK;AAI5B,QAAO;EACL,UAAU,IAAI;EACd,MAAM,IAAI;EACV;EACA,WAAW,IAAI;EACf,YAAY,IAAI;EAChB,SAAS,sBAAsB,IAAI;EACnC,WAAW,IAAI;EACf,QAAQ,IAAI;EACZ,SAAS,IAAI;EACb,OAAO,IAAI;EACX,YAAY,IAAI;EAChB,aAAa,IAAI;EACjB,YAAY,IAAI,cAAc;GAAE,GAAG;GAAG,GAAG;GAAG;EAC5C,iBAAiB,IAAI,mBAAmB;EACxC,gBAAgB,IAAI,kBAAkB;EACtC,UAAU,IAAI,YAAY;EAC1B;EACA,YAAY,IAAI,cAAc,EAAE;EAChC,iBAAiB,IAAI;EACrB,MAAM,IAAI;EACV,UAAU,IAAI;EACd,UAAU,IAAI;EACf;;AAKH,SAAS,YAAY,SAAmB,UAAsD;CAC5F,MAAM,SAAkC,IAAI,MAAM,QAAQ,OAAO;AAEjE,MAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,IAClC,QAAO,KAAK,eAAe,QAAQ,IAAI,SAAS;AAGlD,QAAO;;AAGT,SAAS,eACP,QACA,UACA,SACqB;AACrB,KAAI,WAAW,KAAA,KAAa,WAAW,EAAG,QAAO;CAEjD,MAAM,UAAU,UAAU,OAAO;AACjC,KAAI,CAAC,QAAS,QAAO;CAErB,MAAM,QAAQ,uBAAuB,QAAQ,KAAK,SAAS;CAC3D,MAAM,KAAK,SAAS,IAAI,SAAS,SAAS,KAAA;AAC1C,KAAI,CAAC,GAAI,QAAO,SAAS,iBAAiB,OAAO;AAEjD,SAAQ,eAAe;AACvB,SAAQ,UAAU,QAAQ,MAAM,GAAG;AACnC,QAAO;;AAKT,SAAS,cAAc,OAAmB;AACxC,QAAO;EACL,IAAI,MAAM;EACV,MAAM,MAAM;EACZ,SAAS,MAAM;EACf,SAAS,MAAM;EACf,SAAS,MAAM,WAAW;EAC1B,SAAS,MAAM,WAAW;EAC1B,WAAW,MAAM,aAAa;EAC9B,WAAW,MAAM,aAAa;EAC9B,WAAW,MAAM;EACjB,YAAY,MAAM,cAAc,EAAE;EACnC;;AAGH,SAAS,eACP,SACA,UACA,WACkB;AAClB,QAAO,QAAQ,KAAK,QAAwB;EAC1C,IAAI,SAAsB;AAC1B,MAAI,IAAI,YAAY,WAAW;GAC7B,MAAM,MAAM,UAAU,IAAI,IAAI,SAAS;AACvC,OAAI,IAAK,UAAS,cAAc,KAAK,KAAK,SAAS;;EAGrD,MAAM,EAAE,KAAK,UAAU,WAAW,GAAG,SAAS;EAC9C,MAAM,WAA2B;AAEjC,MAAI,QAAQ,KAAA,GAAW;GACrB,MAAM,OAAO,eAAe,KAAK,UAAU,EAAE,gBAAgB,MAAM,CAAC;AACpE,OAAI,KAAM,UAAS,OAAO;;AAG5B,SAAO;GACP;;AAKJ,SAAS,kBAAkB,OAAuC;AAChE,QAAO;EACL,MAAM;EACN,GAAG,cAAc,MAAM;EACvB,OAAO,MAAM,SAAS;EACtB,YAAY,MAAM;EAClB,aAAa,MAAM;EACnB,SAAS,MAAM,WAAW;EAC1B,SAAS,MAAM,WAAW;EAC1B,kBAAkB,MAAM;EACzB;;AAGH,SAAS,mBACP,OACA,UACA,WACqB;AACrB,QAAO;EACL,MAAM;EACN,GAAG,cAAc,MAAM;EACvB,WAAY,MAAM,aAAa;EAC/B,SAAS,eAAe,MAAM,WAAW,EAAE,EAAE,UAAU,UAAU;EAClE;;AAGH,SAAS,qBAAqB,OAAmB;AAC/C,QAAO;EACL,MAAM;EACN,GAAG,cAAc,MAAM;EACvB,OAAO,MAAM,SAAS;EACtB,QAAQ,MAAM,UAAU;EACzB;;AAKH,SAAS,aACP,OACA,UACA,WACe;AACf,SAAQ,MAAM,MAAd;EACE,KAAK,YACH,QAAO,qBAAqB,OAAO,SAAS;EAE9C,QACE,QAAO,oBAAoB,OAAO,UAAU,YAAY,UACtD,aAAa,OAAO,UAAU,UAAU,CACzC;;;AAMP,eAAe,kBACb,OACA,UACA,WACwB;AACxB,SAAQ,MAAM,MAAd;EACE,KAAK,YACH,QAAO,sBAAsB,OAAO,SAAS;EAE/C,QACE,QAAO,yBAAyB,OAAO,UAAU,UAAU;;;AAMjE,SAAgB,SAAS,MAAgB,SAAqC;CAC5E,MAAM,mBAAmB,gBAAgB,KAAK,UAAU,QAAQ;AAGhE,QAAO,iBAAiB,MAAM,kBAFf,KAAK,OAAO,KAAK,MAAM,aAAa,GAAG,kBAAkB,SAAS,UAAU,CAAC,CAErC;;AAGzD,eAAsB,cAAc,MAAgB,SAA8C;CAChG,MAAM,mBAAmB,gBAAgB,KAAK,UAAU,QAAQ;AAKhE,QAAO,iBAAiB,MAAM,kBAJf,MAAM,QAAQ,IAC3B,KAAK,OAAO,KAAK,MAAM,kBAAkB,GAAG,kBAAkB,SAAS,UAAU,CAAC,CACnF,CAEsD;;AAKzD,SAAS,kBACP,QACA,UACA,aACA,UACiB;AACjB,QAAO,OAAO,KAAK,UAAU;EAC3B,MAAM,UAAU,gBAAgB,MAAM,MAAM,UAAU,YAAY;AAClE,SAAO;GACL,GAAG,MAAM;GACT,GAAG,MAAM;GACT,OAAO,MAAM;GACb,QAAQ,MAAM;GACd,OAAO,YAAY,SAAS,SAAS;GACtC;GACD;;AAGJ,eAAe,mBACb,QACA,UACA,aACA,UAC0B;AAC1B,QAAO,QAAQ,IACb,OAAO,IAAI,OAAO,UAAU;EAC1B,MAAM,UAAU,MAAM,qBAAqB,MAAM,MAAM,UAAU,YAAY;AAC7E,SAAO;GACL,GAAG,MAAM;GACT,GAAG,MAAM;GACT,OAAO,MAAM;GACb,QAAQ,MAAM;GACd,OAAO,YAAY,SAAS,SAAS;GACtC;GACD,CACH;;AAKH,SAAS,gBACP,KACA,SACmB;AACnB,QAAO,IAAI,KAAK,OAAO;AACrB,MAAI,aAAa,GAAG,EAAE;GACpB,MAAM,WAAW,SAAS,kBAAkB,IAAI,GAAG,OAAO;AAC1D,OAAI,CAAC,SACH,OAAM,IAAI,MACR,qBAAqB,GAAG,OAAO,uDAChC;AAEH,UAAO,eAAe;IAAE,GAAG;IAAU,UAAU,GAAG;IAAU,EAAE,GAAG,OAAO;;AAE1E,SAAO,eAAe,GAAG;GACzB;;AAGJ,SAAS,qBAAqB,OAAmB,UAAgD;AAC/F,KAAI,MAAM,UAAU,MAAM,OAAO,SAAS,EACxC,QAAO,yBACL,OACA,kBAAkB,MAAM,QAAQ,MAAM,UAAU,MAAM,aAAa,SAAS,CAC7E;AAGH,QAAO,uBACL,OACA,gBAAgB,MAAM,QAAQ,EAAE,EAAE,MAAM,UAAU,MAAM,YAAY,EACpE,SACD;;AAGH,eAAe,sBACb,OACA,UAC4B;AAC5B,KAAI,MAAM,UAAU,MAAM,OAAO,SAAS,EACxC,QAAO,yBACL,OACA,MAAM,mBAAmB,MAAM,QAAQ,MAAM,UAAU,MAAM,aAAa,SAAS,CACpF;AAGH,QAAO,uBACL,OACA,MAAM,qBAAqB,MAAM,QAAQ,EAAE,EAAE,MAAM,UAAU,MAAM,YAAY,EAC/E,SACD;;AAGH,SAAS,uBACP,OACA,SACA,UACmB;AACnB,QAAO;EACL,GAAG,qBAAqB,MAAM;EAC9B,UAAU;EACV,OAAO,YAAY,SAAS,SAAS;EACtC;;AAGH,SAAS,yBAAyB,OAAmB,QAA4C;AAC/F,QAAO;EACL,GAAG,qBAAqB,MAAM;EAC9B,UAAU;EACV,OAAO,EAAE;EACT;EACD;;AAGH,SAAS,oBACP,OACA,UACA,WACA,cACe;AACf,SAAQ,MAAM,MAAd;EACE,KAAK,aACH,QAAO,kBAAkB,MAAM;EAEjC,KAAK,cACH,QAAO,mBAAmB,OAAO,UAAU,UAAU;EAEvD,KAAK,QACH,QAAO;GACL,MAAM;GACN,GAAG,cAAc,MAAM;GACvB,SAAS,MAAM,UAAU,EAAE,EAAE,IAAI,aAAa;GAC/C;EAEH,KAAK,YACH,OAAM,IAAI,MAAM,4CAA4C;EAE9D,QACE,QAAO,qBAAqB,MAAM;;;AAIxC,eAAe,yBACb,OACA,UACA,WACwB;AACxB,KAAI,MAAM,SAAS,QACjB,QAAO,oBAAoB,OAAO,UAAU,YAAY,UACtD,aAAa,OAAO,UAAU,UAAU,CACzC;CAGH,MAAM,mBAAmB,MAAM,QAAQ,KACpC,MAAM,UAAU,EAAE,EAAE,KAAK,MAAM,kBAAkB,GAAG,UAAU,UAAU,CAAC,CAC3E;AACD,QAAO;EACL,MAAM;EACN,GAAG,cAAc,MAAM;EACvB,QAAQ;EACT;;AAGH,SAAS,qBAAqB,OAA0B;AACtD,OAAM,IAAI,MAAM,yBAA0B,MAAqB,OAAO;;AAGxE,SAAS,iBACP,MACA,UACA,QACa;AACb,QAAO;EACL,aAAa,KAAK;EAClB,aAAc,KAAK,eAAe;EAClC,OAAO,KAAK;EACZ,QAAQ,KAAK;EACb,WAAW,KAAK;EAChB,YAAY,KAAK;EACjB,UAAU,KAAK;EACf,iBAAiB,KAAK;EACtB,eAAe,KAAK;EACpB,aAAa,KAAK;EAClB,cAAc,KAAK;EACnB,iBAAiB,KAAK,mBAAmB;EACzC,iBAAiB,KAAK,mBAAmB;EACzC,YAAY,KAAK,cAAc,EAAE;EACjC;EACA;EACA,SAAS,KAAK;EACd,cAAc,KAAK;EACpB;;;;AChaH,SAAgB,eAAe,KAAqB;CAClD,MAAM,QAAQ,IAAI,QAAQ,KAAK,GAAG;AAElC,KAAI,MAAM,WAAW,EACnB,QAAO,SAAS,MAAM,MAAM,EAAE,EAAE,GAAG;AAGrC,QAAO,SAAS,OAAO,GAAG;;;;ACQ5B,MAAM,wBAAwB,OAAO,kBAAkB;AAUvD,SAAgB,gBAAgB,WAAsB,OAAsC;AAC1F,WAAU,QAAQ,MAAM;AACxB,WAAU,QAAQ,MAAM;AACxB,WAAU,UAAU,MAAM;AAC1B,WAAU,SAAS,IAAI,MAAM,SAAS,MAAM,QAAQ;AACpD,KAAI,MAAM,UACR,WAAU,OAAO,eAAe,MAAM,UAAU;AAGlD,QAAO,iBAAiB,WAAW;EACjC,kBAAkB;GAAE,OAAO,MAAM;GAAS,YAAY;GAAM;EAC5D,kBAAkB;GAAE,OAAO,MAAM;GAAS,YAAY;GAAM;EAC5D,gBAAgB;GAAE,OAAO,MAAM;GAAW,YAAY;GAAM;EAC5D,gBAAgB;GAAE,OAAO,MAAM;GAAW,YAAY;GAAM;GAC3D,wBAAwB,EAAE,OAAO,MAAM;EACzC,CAAC;;AAGJ,SAAgB,kBAAkB,WAAoD;AACpF,QAAQ,UAAkD,2BAA2B;;;;ACpCvF,IAAa,qBAAb,cAAwCA,QAAAA,UAAU;CAGhD,YAAY,WAA+B,SAAmC;AAC5E,SAAO;AAEP,OAAK,YAAY;AACjB,kBAAgB,MAAM,UAAU;AAEhC,OAAK,MAAM,SAAS,UAAU,QAAQ;GACpC,MAAM,WAAW,+BAA+B,OAAO,QAAQ;AAC/D,OAAI,SAAU,MAAK,SAAS,SAAS;;;;;;ACd3C,IAAa,qBAAb,cAAwCC,QAAAA,UAAU;CAGhD,YACE,WACA,SACA,KACA,WACA;AACA,SAAO;AAEP,OAAK,YAAY;AACjB,kBAAgB,MAAM,UAAU;AAEhC,MAAI,QACF,MAAK,YAAY,SAAS,KAAK,aAAa,KAAK;;CAIrD,YAAoB,SAAkB,KAAkB,WAAoC;EAC1F,MAAM,EAAE,SAAS,YAAY,KAAK;AAElC,MAAI,CAAC,WAAW,CAAC,SAAS;AACxB,OAAI,UACF,MAAK,SAAS,IAAIC,YAAAA,UAAU,EAAE,QAAQ,WAAW,CAAC,CAAC;OAEnD,MAAK,SAAS,IAAIC,QAAAA,OAAO,QAAQ,CAAC;AAEpC;;EAKF,MAAM,QAAQ,KAAK,iBAAiB,IAAI,gBAAgB,IAAI,IAAI,gBAAgB,QAAQ;EACxF,MAAM,QACJ,KAAK,kBAAkB,IAAI,iBAAiB,IAAI,IAAI,iBAAiB,QAAQ;AAE/E,OAAK,SACH,IAAIC,QAAAA,aAAa;GACf;GACA,OAAO,UAAU,QAAQ,QAAQ;GACjC,QAAQ,UAAU,QAAQ,QAAQ;GACnC,CAAC,CACH;;;;;AChBL,SAAgB,iBACd,MACA,YACA,IACA,IACA,KACe;AACf,QAAO,sBAAsB,MAAM,YAAY,IAAI,IAAI,IAAI;;AAY7D,SAAgB,iBAAiB,SAA2C;AAC1E,QAAO,QAAQ,SAAS,QAAQ,oBAAoB,QAAQ,GAAG,uBAAuB,QAAQ;;AAGhG,SAAS,oBAAoB,SAAqE;CAChG,MAAM,EAAE,MAAM,YAAY,WAAW,QAAQ;AAC7C,QAAO,sBAAsB,MAAM,YAAY,UAAU,GAAG,UAAU,GAAG,IAAI;;AAG/E,SAAS,sBACP,MACA,YACA,GACA,GACA,KACe;CACf,MAAM,SAAS,WAAW,QAAQ;CAClC,MAAM,aAAa,WAAW,mBAAmB,KAAK,QAAQ;AAE9D,KAAI,cAAc,WAAW,SAAS,GAAG;EACvC,MAAM,WAAiD,EAAE;AACzD,OAAK,MAAM,SAAS,YAAY;GAC9B,MAAM,MAAM,WAAW,WAAW,MAAM,OAAO;AAC/C,OAAI,CAAC,IAAK,QAAO;AACjB,YAAS,KAAK;IAAE,SAAS;IAAK,MAAM,MAAM;IAAU,CAAC;;EAEvD,MAAM,UAAU,WAAW,eAAe,KAAK,SAAS,IAAI;EAC5D,MAAM,UAAU,WAAW,gBAAgB,KAAK,SAAS,IAAI;EAC7D,MAAM,UAAU,qBAAqB,SAAS,SAAS,IAAI;EAC3D,MAAM,SAAS,IAAIC,QAAAA,eAAe,SAAS;AAC3C,SAAO,QAAQ,UAAU;AACzB,SAAO,SAAS,UAAU;AAC1B,SAAO,SAAS,IAAI,IAAI,OAAO,GAAG,IAAI,OAAO,IAAI,IAAI,aAAa,QAAQ;AAC1E,SAAO,MAAM;AACb,YAAU,QAAQ,KAAK;AACvB,SAAO;;CAGT,MAAM,UAAU,WAAW,WAAW,KAAK,QAAQ;AACnD,KAAI,CAAC,QAAS,QAAO;CAErB,MAAM,YAAY,WAAW,aAAa,KAAK,QAAQ;CACvD,MAAM,UAAU,WAAW,eAAe,KAAK,SAAS,IAAI;CAC5D,MAAM,UAAU,WAAW,gBAAgB,KAAK,SAAS,IAAI;CAC7D,MAAM,UAAU,qBAAqB,SAAS,SAAS,IAAI;CAC3D,MAAM,SAAS,YAAY,IAAIC,YAAAA,UAAU,EAAE,QAAQ,WAAW,CAAC,GAAG,IAAIC,QAAAA,OAAO,QAAQ;AACrF,QAAO,QAAQ,UAAU;AACzB,QAAO,SAAS,UAAU;AAC1B,QAAO,SAAS,IAAI,IAAI,OAAO,GAAG,IAAI,OAAO,IAAI,IAAI,aAAa,QAAQ;AAC1E,WAAU,QAAQ,KAAK;AACvB,QAAO;;AAGT,SAAgB,uBACd,MACA,YACA,WACe;AACf,QAAO,iBAAiB;EAAE,MAAM;EAAU;EAAM;EAAY;EAAW,CAAC;;AAG1E,SAAS,uBACP,SACe;CACf,MAAM,EAAE,MAAM,YAAY,cAAc;CACxC,MAAM,UAAU,WAAW,WAAW,KAAK,QAAQ;AACnD,KAAI,CAAC,QAAS,QAAO;CAErB,MAAM,YAAY,WAAW,aAAa,KAAK,QAAQ;CACvD,MAAM,SAAS,YAAY,IAAID,YAAAA,UAAU,EAAE,QAAQ,WAAW,CAAC,GAAG,IAAIC,QAAAA,OAAO,QAAQ;CACrF,MAAM,SAAS,WAAW,QAAQ;CAClC,MAAM,QAAQ,kBAAkB,YAAY,KAAK,SAAS,UAAU,OAAO,UAAU,OAAO;AAC5F,QAAO,QAAQ,MAAM;AACrB,QAAO,SAAS,MAAM;AACtB,QAAO,SAAS,IAAI,UAAU,IAAI,OAAO,GAAG,UAAU,IAAI,MAAM,SAAS,OAAO,EAAE;AAClF,QAAO,QAAQ,UAAU;AACzB,QAAO,UAAU,UAAU;AAC3B,WAAU,QAAQ,KAAK;AAEvB,QAAO;;AAGT,SAAgB,kBACd,YACA,SACA,UACA,WACmC;AACnC,KAAI,YAAY,KAAK,aAAa,EAChC,QAAO,WAAW,YAAY,QAAQ;AAExC,KAAI,WAAW,QAAQ,aAAa,sBAClC,QAAO;EAAE,OAAO;EAAU,QAAQ;EAAW;CAE/C,MAAM,YAAY,WAAW,YAAY,QAAQ;AACjD,KAAI,UAAU,UAAU,KAAK,UAAU,WAAW,EAChD,QAAO;EAAE,OAAO;EAAU,QAAQ;EAAW;CAE/C,MAAM,QAAQ,KAAK,IAAI,WAAW,UAAU,OAAO,YAAY,UAAU,OAAO;AAChF,QAAO;EAAE,OAAO,UAAU,QAAQ;EAAO,QAAQ,UAAU,SAAS;EAAO;;AAG7E,SAAgB,UAAU,QAAgB,MAA0B;AAClE,KAAI,KAAK,cAAc;AAQrB,SAAO,YAAY,KAAK,KAAK;AAC7B,SAAO,MAAM,IAAI,KAAK,eAAe,KAAK;AAC1C,SAAO,MAAM,IAAI,KAAK,iBAAiB,IAAI;AAC3C,SAAO,OAAO,IAAI,KAAK,eAAe,IAAI,GAAG,KAAK,iBAAiB,IAAI,EAAE;QACpE;AACL,MAAI,KAAK,gBAAgB;AACvB,UAAO,MAAM,IAAI;AACjB,UAAO,OAAO,IAAI;;AAEpB,MAAI,KAAK,cAAc;AACrB,UAAO,MAAM,IAAI;AACjB,UAAO,OAAO,IAAI;;;;AAKxB,SAAS,qBAAqB,SAAiB,SAAiB,KAAyB;AACvF,KAAI,IAAI,gBAAgB,aAAc,QAAO;AAC7C,KAAI,YAAY,IAAI,aAAa,YAAY,IAAI,WAAY,QAAO;AACpE,QAAO,IAAI,qBAAqB;;;;AC/KlC,IAAa,sBAAb,cAAyCC,QAAAA,UAAU;CAGjD,YAAY,WAAgC,UAA6B;AACvE,SAAO;AAEP,OAAK,YAAY;AACjB,kBAAgB,MAAM,UAAU;AAEhC,OAAK,cAAc,SAAS;;CAG9B,cAAsB,UAAmC;AACvD,OAAK,MAAM,OAAO,KAAK,UAAU,SAAS;GACxC,MAAM,QAAQ,KAAK,cAAc,KAAK,SAAS;AAC/C,OAAI,OAAO;AACT,UAAM,QAAQ,IAAI,QAAQ,UAAU,IAAI;AACxC,SAAK,SAAS,MAAM;;;;CAK1B,cAAsB,KAAqB,UAA+C;AACxF,MAAI,IAAI,KACN,QAAO,KAAK,kBAAkB,KAAK,SAAS;AAG9C,MAAI,IAAI,KACN,QAAO,KAAK,kBAAkB,IAAI;AAGpC,MAAI,IAAI,QACN,QAAO,KAAK,eAAe,IAAI;AAGjC,MAAI,IAAI,MACN,QAAO,KAAK,aAAa,IAAI;AAG/B,MAAI,IAAI,QACN,QAAO,KAAK,eAAe,KAAK,IAAI,SAAS,KAAK;AAGpD,MAAI,IAAI,SACN,QAAO,KAAK,eAAe,KAAK,IAAI,UAAU,MAAM;AAGtD,MAAI,IAAI,QAAQ,KAAK,IAAI,SAAS,EAChC,QAAO,KAAK,iBAAiB,IAAI;AAGnC,SAAO;;CAGT,kBAA0B,KAAqB,UAA4C;EACzF,MAAM,OAAO,IAAI;EACjB,MAAM,KAAK,SAAS,KAAK;AACzB,MAAI,CAAC,GAAI,QAAO;AAEhB,SAAO,uBAAuB,MAAM,IAAI;GACtC,GAAG,IAAI;GACP,GAAG,IAAI;GACP,OAAO,IAAI;GACX,QAAQ,IAAI;GACZ,UAAU,IAAI;GACd,SAAS,IAAI;GACd,CAAC;;CAGJ,kBAA0B,KAAgC;EACxD,MAAM,KAAK,IAAI;EACf,MAAM,QAAQ,GAAG,SAAS;EAC1B,MAAM,OAAO,IAAIC,QAAAA,KAAK;GACpB,MAAM,GAAG;GACT,OAAO;IACL,YAAY,GAAG,cAAc;IAC7B,UAAU,GAAG,aAAa;IAC1B,MAAM;IACN,YAAY,GAAG,OAAO,SAAS;IAC/B,WAAW,GAAG,SAAS,WAAW;IAClC,UAAU,GAAG,QAAQ;IACrB,eAAe,IAAI;IACnB,OAAO,GAAG,UAAU;IACrB;GACF,CAAC;AAKF,MAAI,CAAC,GAAG,aAAa,CAAC,GAAG,WAAW;AAClC,QAAK,SAAS,IAAI,IAAI,GAAG,IAAI,EAAE;AAC/B,QAAK,QAAQ,IAAI;AACjB,QAAK,UAAU,IAAI;AACnB,UAAO;;EAGT,MAAM,YAAY,IAAID,QAAAA,WAAW;AACjC,YAAU,SAAS,KAAK;EAExB,MAAM,UAAU,KAAK,SAAS;EAC9B,MAAM,gBAAgB,KAAK,IAAI,IAAI,GAAG,aAAa,MAAM,GAAG;AAC5D,MAAI,GAAG,WAAW;GAChB,MAAM,KAAK,IAAIE,QAAAA,UAAU,CACtB,OAAO,GAAG,QAAQ,SAAS,cAAc,CACzC,OAAO,QAAQ,OAAO,QAAQ,SAAS,cAAc,CACrD,OAAO;IAAE;IAAO,OAAO;IAAe,CAAC;AAC1C,aAAU,SAAS,GAAG;;AAExB,MAAI,GAAG,WAAW;GAChB,MAAM,IAAI,QAAQ,SAAS;GAC3B,MAAM,KAAK,IAAIA,QAAAA,UAAU,CACtB,OAAO,GAAG,EAAE,CACZ,OAAO,QAAQ,OAAO,EAAE,CACxB,OAAO;IAAE;IAAO,OAAO;IAAe,CAAC;AAC1C,aAAU,SAAS,GAAG;;AAGxB,YAAU,SAAS,IAAI,IAAI,GAAG,IAAI,EAAE;AACpC,YAAU,QAAQ,IAAI;AACtB,YAAU,UAAU,IAAI;AACxB,SAAO;;CAGT,iBAAyB,KAAgC;EACvD,MAAM,IAAI,IAAIA,QAAAA,UAAU,CAAC,KAAK,GAAG,GAAG,IAAI,OAAO,IAAI,OAAO,CAAC,OAAO;GAAE,OAAO;GAAU,OAAO;GAAG,CAAC;AAChG,IAAE,SAAS,IAAI,IAAI,GAAG,IAAI,EAAE;AAC5B,IAAE,QAAQ,IAAI;AACd,IAAE,UAAU,IAAI;AAChB,SAAO;;CAGT,eAAuB,KAAgC;EACrD,MAAM,KAAK,IAAI,QAAQ;EACvB,MAAM,KAAK,IAAI,SAAS;EACxB,MAAM,IAAI,IAAIA,QAAAA,UAAU,CAAC,QAAQ,IAAI,IAAI,IAAI,GAAG,CAAC,OAAO;GAAE,OAAO;GAAU,OAAO;GAAG,CAAC;AACtF,IAAE,SAAS,IAAI,IAAI,GAAG,IAAI,EAAE;AAC5B,IAAE,QAAQ,IAAI;AACd,IAAE,UAAU,IAAI;AAChB,SAAO;;CAGT,aAAqB,KAAgC;EACnD,MAAM,IAAI,IAAIA,QAAAA,UAAU,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,KAAK,SAAS;AACvD,IAAE,SAAS,IAAI,IAAI,GAAG,IAAI,EAAE;AAC5B,IAAE,UAAU,IAAI;AAChB,SAAO;;CAGT,eAAuB,KAAqB,QAAsB,QAA4B;EAC5F,MAAM,IAAI,IAAIA,QAAAA,UAAU;AAExB,MAAI,OAAO,SAAS,GAAG;GACrB,MAAM,QAAQ,OAAO;AACrB,KAAE,OAAO,MAAM,GAAG,MAAM,EAAE;AAC1B,QAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;IACtC,MAAM,KAAK,OAAO;AAClB,MAAE,OAAO,GAAG,GAAG,GAAG,EAAE;;AAEtB,OAAI,OACF,GAAE,WAAW;AAEf,KAAE,OAAO;IAAE,OAAO;IAAU,OAAO;IAAG,CAAC;;AAGzC,IAAE,SAAS,IAAI,IAAI,GAAG,IAAI,EAAE;AAC5B,IAAE,QAAQ,IAAI;AACd,IAAE,UAAU,IAAI;AAChB,SAAO;;;;;AC3JX,MAAM,OAAqB;CAAE,GAAG;CAAG,GAAG;CAAG;AAEzC,SAAgB,oBAAoB,SAAoC;CACtE,MAAM,EAAE,aAAa,OAAO,QAAQ,WAAW,YAAY,gBAAgB;AAE3E,SAAQ,aAAR;EACE,KAAK,YACH,QAAO;GACL,QAAQ,QAAQ,WAAW,YAAY;GACvC,SAAS,QAAQ,WAAW,aAAa;GAC1C;EACH,KAAK;EACL,KAAK,YACH,QAAO,gBAAgB,MACnB;GACE,QAAQ,QAAQ,MAAM,YAAY;GAClC,QAAQ,SAAS,aAAa,aAAa;GAC5C,GACD;GACE,OAAO,QAAQ,YAAY,YAAY;GACvC,SAAS,SAAS,MAAM,aAAa;GACtC;EACP,QACE,QAAO;GAAE,OAAO,QAAQ;GAAW,QAAQ,SAAS;GAAY;;;AAItE,SAAgB,YAAY,KAAa,KAAa,KAA+B;AACnF,SAAQ,IAAI,aAAZ;EACE,KAAK;AACH,QAAK,IAAI,MAAM,IAAI;AACnB,QAAK,IAAI,MAAM,IAAI;AACnB,UAAO;EACT,KAAK,aAAa;GAChB,MAAM,QAAQ,IAAI,YAAY;GAC9B,MAAM,QAAQ,IAAI,aAAa;AAC/B,QAAK,KAAK,MAAM,OAAO;AACvB,QAAK,KAAK,MAAM,OAAO;AACvB,UAAO;;EAET,KAAK,YACH,QAAO,iBAAiB,KAAK,KAAK,IAAI;EACxC,KAAK,YACH,QAAO,iBAAiB,KAAK,KAAK,IAAI;;;AAI5C,SAAgB,qBACd,YACA,aACA,KACmB;CACnB,MAAM,QAAQ,IAAI;CAClB,MAAM,cAAc,UAAU,eAAe,UAAU;CACvD,MAAM,cAAc,UAAU,cAAc,UAAU;AAEtD,QAAO;EACL,UAAU,cAAc,cAAc,IAAI;EAC1C,QAAQ,cAAc,KAAK;EAC3B,SAAS,cAAc,KAAK;EAC5B,UAAU,cAAc,aAAa,IAAI;EACzC,QAAQ,cAAc,KAAK;EAC3B,SAAS,cAAc,KAAK;EAC7B;;AAGH,SAAS,iBAAiB,KAAa,KAAa,KAA+B;CACjF,MAAM,WAAW,IAAI,gBAAgB;CACrC,MAAM,cAAc,IAAI,iBAAiB;AAEzC,KAAI,UAAU;EACZ,MAAM,cAAc,cAAc,MAAM,MAAM,IAAI,MAAM,MAAM;AAC9D,OAAK,IAAI,OAAO,IAAI,YAAY;AAChC,OAAK,IAAI,MAAM,IAAI,cAAc,cAAc,IAAI,aAAa,IAAI;QAC/D;EACL,MAAM,cAAc,cAAc,MAAM,MAAM,IAAI,MAAM,MAAM;AAC9D,OAAK,IAAI,MAAM,IAAI,aAAa,cAAc,IAAI,YAAY,IAAI;AAClE,OAAK,IAAI,OAAO,IAAI,aAAa;;AAEnC,QAAO;;AAGT,SAAS,iBAAiB,KAAa,KAAa,KAA+B;CACjF,MAAM,UAAU,IAAI,iBAAiB;CACrC,MAAM,WAAW,IAAI,gBAAgB;CACrC,MAAM,cAAc,IAAI,iBAAiB;AAEzC,KAAI,UAAU;EACZ,MAAM,YAAY,IAAI,YAAY,WAAW;EAC7C,MAAM,cAAc,cAAc,MAAM,MAAM,IAAI,MAAM,MAAM;AAC9D,OAAK,IAAI,MAAM;AACf,OAAK,IAAI,MAAM,IAAI,cAAc,cAAc,IAAI,aAAa,IAAI;QAC/D;EACL,MAAM,aAAa,IAAI,aAAa,WAAW;EAC/C,MAAM,cAAc,cAAc,MAAM,MAAM,IAAI,MAAM,MAAM;AAC9D,OAAK,IAAI,MAAM,IAAI,aAAa,cAAc,IAAI,YAAY,IAAI;AAClE,OAAK,IAAI,MAAM;;AAEjB,QAAO;;;;AC/GT,MAAM,qBAAqB;AAc3B,IAAa,0BAAb,cAA6CC,QAAAA,UAAU;CAIrD,YAAY,sBAAsB,KAAK;AACrC,SAAO;kCAJmB,IAAI,KAAuC;AAKrE,OAAK,uBAAuB,KAAK,IAAI,GAAG,KAAK,IAAI,qBAAqB,mBAAmB,CAAC;;CAG5F,QACE,MACA,YACA,GACA,GACA,KACM;AACN,MAAI,KAAK,iBAAiB,MAAM,WAAW,EAAE;GAC3C,MAAM,SAAS,iBAAiB,MAAM,YAAY,GAAG,GAAG,IAAI;AAC5D,OAAI,OAAQ,MAAK,SAAS,OAAO;AACjC;;EAGF,MAAM,UAAU,WAAW,WAAW,KAAK,QAAQ;AACnD,MAAI,CAAC,QAAS;EAEd,MAAM,UAAU,WAAW,eAAe,KAAK,SAAS,IAAI;EAC5D,MAAM,UAAU,WAAW,gBAAgB,KAAK,SAAS,IAAI;EAC7D,MAAM,UAAU,mBAAmB,SAAS,SAAS,IAAI;EACzD,MAAM,SAAS,WAAW,QAAQ;EAClC,MAAM,OAAO,IAAI,OAAO;EACxB,MAAM,MAAM,IAAI,OAAO,IAAI,IAAI,aAAa;EAC5C,MAAM,QAAQ,OAAO,UAAU;EAC/B,MAAM,SAAS,MAAM,UAAU;EAC/B,MAAM,QAAQ,KAAK,UAAU,QAAQ;AACrC,sBAAoB,OAAO,MAAM,cAAc,IAAI,EAAE;EACrD,MAAM,eAAe,MAAM;AAE3B,QAAM,UAAU,MAAM,oBAAoB;AAC1C,QAAM,UAAU,MAAM,oBAAoB;AAC1C,QAAM,UAAU,MAAM,oBAAoB;AAC1C,QAAM,UAAU,MAAM,oBAAoB;AAC1C,QAAM,UAAU,MAAM,oBAAoB;AAC1C,QAAM,UAAU,MAAM,oBAAoB;AAC1C,QAAM,UAAU,MAAM,oBAAoB;AAC1C,QAAM,UAAU,MAAM,oBAAoB;AAC1C,cAAY,OAAO,SAAS,KAAK;AACjC,QAAM,QAAQ,MAAM,iBAAiB;AACrC,QAAM,QAAQ,MAAM,iBAAiB,eAAe;AACpD,QAAM,QAAQ,MAAM,iBAAiB,eAAe;AACpD,QAAM,QAAQ,MAAM,iBAAiB;AACrC,QAAM,QAAQ,MAAM,iBAAiB,eAAe;AACpD,QAAM,QAAQ,MAAM,iBAAiB,eAAe;AACpD,QAAM,eAAe;;CAGvB,WAAiB;AACf,OAAK,MAAM,WAAW,KAAK,SAAS,QAAQ,CAC1C,MAAK,MAAM,SAAS,SAAS;AAC3B,OAAI,MAAM,gBAAgB,EAAG;GAE7B,MAAM,WAAW,IAAIC,QAAAA,aAAa;IAChC,WAAW,MAAM,UAAU,MAAM,GAAG,MAAM,eAAe;IACzD,KAAK,MAAM,IAAI,MAAM,GAAG,MAAM,SAAS;IACvC,SAAS,MAAM,QAAQ,MAAM,GAAG,MAAM,YAAY;IACnD,CAAC;AACF,YAAS,YAAY;AAErB,QAAK,SAAS,IAAIC,QAAAA,KAAK;IAAE;IAAU,SAAS,MAAM;IAAS,CAAC,CAAC;;AAIjE,OAAK,SAAS,OAAO;;CAGvB,UAAkB,SAAmC;EACnD,MAAM,SAAS,QAAQ;EACvB,IAAI,UAAU,KAAK,SAAS,IAAI,OAAO;EACvC,IAAI,QAAQ,UAAU,QAAQ,SAAS;AAEvC,MAAI,SAAS,MAAM,cAAc,KAAK,mBACpC,SAAQ,KAAA;AAGV,MAAI,CAAC,OAAO;AACV,OAAI,CAAC,SAAS;AACZ,cAAU,EAAE;AACZ,SAAK,SAAS,IAAI,QAAQ,QAAQ;;AAEpC,WAAQ;IACN,SAAS,IAAIC,QAAAA,QAAQ,EAAE,QAAQ,CAAC;IAChC,WAAW,IAAI,aAAa,KAAK,uBAAuB,EAAE;IAC1D,KAAK,IAAI,aAAa,KAAK,uBAAuB,EAAE;IACpD,SAAS,IAAI,YAAY,KAAK,uBAAuB,EAAE;IACvD,gBAAgB;IAChB,UAAU;IACV,aAAa;IACb,aAAa;IACb,cAAc,KAAK;IACpB;AACD,WAAQ,KAAK,MAAM;;AAGrB,SAAO;;CAGT,iBAAyB,MAAoB,YAAsC;EACjF,MAAM,YAAY,WAAW,mBAAmB,KAAK,QAAQ;AAC7D,MAAI,aAAa,UAAU,SAAS,EAAG,QAAO;AAC9C,SAAO,CAAC,CAAC,WAAW,aAAa,KAAK,QAAQ;;;AAIlD,SAAS,oBAAoB,OAAwB,WAAyB;AAC5E,KAAI,aAAa,MAAM,aAAc;CAErC,IAAI,eAAe,MAAM;AACzB,QAAO,eAAe,UAAW,iBAAgB;CAEjD,MAAM,YAAY,IAAI,aAAa,eAAe,EAAE;AACpD,WAAU,IAAI,MAAM,UAAU;AAC9B,OAAM,YAAY;CAElB,MAAM,MAAM,IAAI,aAAa,eAAe,EAAE;AAC9C,KAAI,IAAI,MAAM,IAAI;AAClB,OAAM,MAAM;CAEZ,MAAM,UAAU,IAAI,YAAY,eAAe,EAAE;AACjD,SAAQ,IAAI,MAAM,QAAQ;AAC1B,OAAM,UAAU;AAEhB,OAAM,eAAe;;AAGvB,SAAS,mBAAmB,SAAiB,SAAiB,KAAyB;AACrF,KAAI,IAAI,gBAAgB,aAAc,QAAO;AAC7C,KAAI,YAAY,IAAI,aAAa,YAAY,IAAI,WAAY,QAAO;AACpE,QAAO,IAAI,qBAAqB;;AAGlC,SAAS,YAAY,OAAwB,SAAkB,MAA0B;CACvF,MAAM,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,OAAO,QAAQ;CACnD,MAAM,UAAoF;EACxF,CAAC,IAAI,GAAG;EACR,CAAC,IAAI,GAAG;EACR,CAAC,IAAI,GAAG;EACR,CAAC,IAAI,GAAG;EACT;AAED,MAAK,MAAM,SAAS,WAAW,KAAK,EAAE;EACpC,MAAM,SAAS,QAAQ;AACvB,QAAM,IAAI,MAAM,cAAc,OAAO;AACrC,QAAM,IAAI,MAAM,cAAc,OAAO;;;AAIzC,SAAS,WAAW,MAAsD;CACxE,MAAM,IAAI,KAAK;CACf,MAAM,IAAI,KAAK;AAGf,KAFU,KAAK,cAER;AACL,MAAI,KAAK,EAAG,QAAO;GAAC;GAAG;GAAG;GAAG;GAAE;AAC/B,MAAI,EAAG,QAAO;GAAC;GAAG;GAAG;GAAG;GAAE;AAC1B,MAAI,EAAG,QAAO;GAAC;GAAG;GAAG;GAAG;GAAE;AAC1B,SAAO;GAAC;GAAG;GAAG;GAAG;GAAE;;AAGrB,KAAI,KAAK,EAAG,QAAO;EAAC;EAAG;EAAG;EAAG;EAAE;AAC/B,KAAI,EAAG,QAAO;EAAC;EAAG;EAAG;EAAG;EAAE;AAC1B,KAAI,EAAG,QAAO;EAAC;EAAG;EAAG;EAAG;EAAE;AAC1B,QAAO;EAAC;EAAG;EAAG;EAAG;EAAE;;;;ACvLrB,IAAa,oBAAb,cAAuC,wBAAwB;CAG7D,YAAY,WAA8B,UAA6B,KAAiB;AACtF,QAAM,qBAAqB,UAAU,CAAC;AAEtC,OAAK,YAAY;AACjB,kBAAgB,MAAM,UAAU;AAEhC,MAAI,UAAU,YAAY,UAAU,OAClC,MAAK,aAAa,UAAU,QAAQ,UAAU,IAAI;MAElD,MAAK,YACH,UAAU,OACV,UAAU,OACV,KAAK,MAAM,UAAU,MAAM,UAAU,UAAU,SAAS,GAAG,EAC3D,GACA,GACA,UACA,IACD;AAGH,OAAK,UAAU;;CAGjB,aACE,QACA,UACA,KACM;AACN,OAAK,MAAM,SAAS,OAClB,MAAK,YAAY,MAAM,OAAO,MAAM,OAAO,MAAM,QAAQ,MAAM,GAAG,MAAM,GAAG,UAAU,IAAI;;CAI7F,YACE,OACA,YACA,aACA,WACA,WACA,UACA,KACM;EACN,MAAM,OAAO,qBAAqB,YAAY,aAAa,IAAI;AAE/D,OAAK,IAAI,MAAM,KAAK,UAAU,QAAQ,KAAK,QAAQ,OAAO,KAAK,SAAS;GACtE,MAAM,YAAY,MAAM;AACxB,QAAK,IAAI,MAAM,KAAK,UAAU,QAAQ,KAAK,QAAQ,OAAO,KAAK,SAAS;IACtE,MAAM,OAAO,MAAM,YAAY;AAC/B,QAAI,CAAC,KAAM;IAEX,MAAM,aAAa,SAAS,KAAK;AACjC,QAAI,CAAC,WAAY;IAGjB,MAAM,MAAM,YAAY,YAAY,KAAK,YAAY,KAAK,IAAI;AAC9D,SAAK,QAAQ,MAAM,YAAY,IAAI,GAAG,IAAI,GAAG,IAAI;;;;;AAMzD,SAAS,qBAAqB,WAAsC;AAClE,KAAI,UAAU,YAAY,UAAU,QAAQ;EAC1C,IAAI,QAAQ;AACZ,OAAK,MAAM,SAAS,UAAU,OAAQ,UAAS,MAAM,MAAM;AAC3D,SAAO;;AAGT,QAAO,UAAU,MAAM;;;;AC3DzB,SAAgB,+BACd,OACA,SACkB;CAClB,MAAM,eAAe,CAAC,QAAQ,eAAe,QAAQ,YAAY,MAAM;AACvE,KAAI,CAAC,gBAAgB,CAAC,sBAAsB,OAAO,QAAQ,YAAY,CAAE,QAAO;AAEhF,SAAQ,MAAM,MAAd;EACE,KAAK;AACH,OAAI,CAAC,aAAc,QAAO;AAC1B,UAAO,IAAI,kBAAkB,OAAO,QAAQ,UAAU,QAAQ,WAAW;EAE3E,KAAK,cAAc;AACjB,OAAI,CAAC,aAAc,QAAO;GAC1B,MAAM,UAAU,MAAM,QAAS,QAAQ,cAAc,IAAI,MAAM,MAAM,IAAI,OAAQ;GACjF,MAAM,YAAY,MAAM,QAAS,QAAQ,iBAAiB,IAAI,MAAM,MAAM,IAAI,OAAQ;AACtF,UAAO,IAAI,mBAAmB,OAAO,SAAS,QAAQ,YAAY,UAAU;;EAG9E,KAAK;AACH,OAAI,CAAC,aAAc,QAAO;AAC1B,UAAO,IAAI,oBAAoB,OAAO,QAAQ,SAAS;EAEzD,KAAK,QACH,QAAO,IAAI,mBAAmB,OAAO,QAAQ;EAE/C,QACE,QAAO,YAAY,MAAM;;;AAI/B,SAAgB,gBACd,QACA,SACa;CACb,MAAM,YAAyB,EAAE;AACjC,MAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,WAAW,+BAA+B,OAAO,QAAQ;AAC/D,MAAI,SAAU,WAAU,KAAK,SAAS;;AAExC,QAAO;;AAGT,SAAgB,yBACd,UACA,SACA,SACA,SACA,SACM;AACN,MAAK,MAAM,SAAS,SAClB,KAAI,kBAAkB,MAAM,CAC1B,wBAAuB,OAAO,SAAS,SAAS,SAAS,SAAS,GAAG,EAAE;;AAK7E,SAAS,YAAY,GAAiB;AACpC,OAAM,IAAI,MAAM,yBAA0B,EAAuB,OAAO;;AAG1E,SAAS,sBAAsB,OAAsB,aAAyC;AAC5F,KAAI,CAAC,eAAe,MAAM,SAAS,QAAS,QAAO;AACnD,QAAO,MAAM,OAAO,MACjB,UAAU,YAAY,MAAM,IAAI,sBAAsB,OAAO,YAAY,CAC3E;;AAGH,SAAS,uBACP,OACA,SACA,SACA,SACA,SACA,iBACA,iBACM;CACN,MAAM,KAAK,MAAM,iBAAiB;CAClC,MAAM,KAAK,MAAM,iBAAiB;AAElC,OAAM,SAAS,IACb,MAAM,oBAAoB,UAAU,YAAY,IAAI,KACpD,MAAM,oBAAoB,UAAU,YAAY,IAAI,IACrD;AAED,MAAK,MAAM,SAAS,MAAM,SACxB,KAAI,kBAAkB,MAAM,CAC1B,wBAAuB,OAAO,SAAS,SAAS,SAAS,SAAS,IAAI,GAAG;;;;ACnG/E,SAAgB,oBACd,OACA,UACA,KACA,eACA,iBACA,aACkB;AAClB,QAAO,+BAA+B,OAAO;EAC3C;EACA,YAAY;EACZ;EACA;EACA;EACD,CAAC;;;;AChBJ,IAAa,kBAAb,MAA6B;CAa3B,YAAY,SAA0B,aAA6B;wCAVjC,IAAI,KAAsB;2CACvB,IAAI,KAAsB;qCAChC,IAAI,KAAwB;2BAGH;4BACC;6BAC3B;8BACC;AAG7B,OAAK,UAAU;AACf,OAAK,cAAc;;CAGrB,WAAW,SAAiC;EAC1C,MAAM,WAAW,KAAK,kBAAkB,IAAI,QAAQ;AACpD,MAAI,SAAU,QAAO;EAErB,MAAM,QAAQ,KAAK,eAAe,IAAI,QAAQ;AAC9C,MAAI,MAAO,QAAO;AAKlB,MAHgB,KAAK,QAAQ,MAAM,IAAI,QAAQ,EAGlC,MAAO,QAAO;AAG3B,MAAI,CAAC,KAAK,YAAa,QAAO;EAE9B,MAAM,EAAE,WAAW,YAAY,SAAS,QAAQ,YAAY,KAAK;AACjE,MAAI,WAAW,EAAG,QAAO;EAEzB,MAAM,MAAM,UAAU;EACtB,MAAM,MAAM,KAAK,MAAM,UAAU,QAAQ;EAIzC,MAAM,QAAQ,IAAIC,QAAAA,UAHR,SAAS,OAAO,YAAY,UAC5B,SAAS,OAAO,aAAa,UAEL,WAAW,WAAW;EACxD,MAAM,UAAU,IAAIC,QAAAA,QAAQ;GAAE,QAAQ,KAAK,YAAY;GAAQ;GAAO,CAAC;AAEvE,OAAK,eAAe,IAAI,SAAS,QAAQ;AACzC,SAAO;;CAGT,eAAe,SAAiB,SAAwB;AACtD,OAAK,kBAAkB,IAAI,SAAS,QAAQ;;CAG9C,aAAa,SAAiB,QAAyB;AACrD,OAAK,YAAY,IAAI,SAAS,OAAO;;CAGvC,aAAa,SAAmC;AAC9C,SAAO,KAAK,YAAY,IAAI,QAAQ,IAAI;;CAG1C,mBAAmB,SAA+D;AAChF,SAAO,KAAK,QAAQ,MAAM,IAAI,QAAQ,EAAE;;;;;;;CAQ1C,YAAY,SAAoD;EAC9D,MAAM,UAAU,KAAK,QAAQ,MAAM,IAAI,QAAQ;AAC/C,MAAI,SAAS,MACX,QAAO;GACL,OAAO,QAAQ,cAAc,KAAK,QAAQ;GAC1C,QAAQ,QAAQ,eAAe,KAAK,QAAQ;GAC7C;AAEH,SAAO;GAAE,OAAO,KAAK,QAAQ;GAAW,QAAQ,KAAK,QAAQ;GAAY;;;;;;;CAQ3E,cAAc,SAAiB,KAAoD;AACjF,SAAO;GACL,OAAO,KAAK,eAAe,SAAS,IAAI;GACxC,QAAQ,KAAK,gBAAgB,SAAS,IAAI;GAC3C;;;;;;CAOH,eAAe,SAAiB,KAAyB;AACvD,OAAK,mBAAmB,IAAI;EAC5B,MAAM,SAAS,KAAK,kBAAmB,IAAI,QAAQ;AACnD,MAAI,WAAW,KAAA,EAAW,QAAO;EACjC,MAAM,OAAO,KAAK,mBAAmB,SAAS,IAAI;AAClD,OAAK,kBAAmB,IAAI,SAAS,KAAK,MAAM;AAChD,OAAK,mBAAoB,IAAI,SAAS,KAAK,OAAO;AAClD,SAAO,KAAK;;;;;CAMd,gBAAgB,SAAiB,KAAyB;AACxD,OAAK,mBAAmB,IAAI;EAC5B,MAAM,SAAS,KAAK,mBAAoB,IAAI,QAAQ;AACpD,MAAI,WAAW,KAAA,EAAW,QAAO;EACjC,MAAM,OAAO,KAAK,mBAAmB,SAAS,IAAI;AAClD,OAAK,kBAAmB,IAAI,SAAS,KAAK,MAAM;AAChD,OAAK,mBAAoB,IAAI,SAAS,KAAK,OAAO;AAClD,SAAO,KAAK;;CAGd,mBAA2B,KAAuB;AAChD,MACE,KAAK,qBACL,KAAK,wBAAwB,IAAI,aACjC,KAAK,yBAAyB,IAAI,WAElC;AAEF,OAAK,oCAAoB,IAAI,KAAK;AAClC,OAAK,qCAAqB,IAAI,KAAK;AACnC,OAAK,sBAAsB,IAAI;AAC/B,OAAK,uBAAuB,IAAI;;CAGlC,mBAA2B,SAAiB,KAAoD;EAC9F,MAAM,YAAY,KAAK,YAAY,QAAQ;AAC3C,MAAI,KAAK,QAAQ,mBAAmB,OAAQ,QAAO;EAEnD,MAAM,QAAQ,IAAI;EAClB,MAAM,QAAQ,IAAI;AAElB,MAAI,KAAK,QAAQ,aAAa,uBAAuB;AACnD,OAAI,UAAU,UAAU,KAAK,UAAU,WAAW,EAChD,QAAO;IAAE,OAAO;IAAO,QAAQ;IAAO;GAExC,MAAM,QAAQ,KAAK,IAAI,QAAQ,UAAU,OAAO,QAAQ,UAAU,OAAO;AACzE,UAAO;IAAE,OAAO,UAAU,QAAQ;IAAO,QAAQ,UAAU,SAAS;IAAO;;AAG7E,SAAO;GAAE,OAAO;GAAO,QAAQ;GAAO;;CAGxC,UAAgB;AACd,OAAK,MAAM,OAAO,KAAK,eAAe,QAAQ,CAC5C,KAAI,SAAS;AAEf,OAAK,eAAe,OAAO;AAC3B,OAAK,kBAAkB,OAAO;AAC9B,OAAK,YAAY,OAAO;AACxB,OAAK,oBAAoB;AACzB,OAAK,qBAAqB;;;;;AC3J9B,IAAa,WAAb,cAA8BC,QAAAA,UAAU;CAMtC,YAAY,SAAsB,SAA2B;AAC3D,SAAO;qBAH8B;AAKrC,OAAK,UAAU;AACf,OAAK,QAAQ;EAEb,MAAM,YAAY,oBAAoB,QAAQ;AAQ9C,OAAK,aAAa,IAAIC,QAAAA,UAAU,GAAG,GAAG,UAAU,OAAO,UAAU,OAAO;EAGxE,MAAM,kBAAkB,SAAS,mCAAmB,IAAI,KAAK;EAC7D,MAAM,qBAAqB,SAAS,sCAAsB,IAAI,KAAK;EACnE,MAAM,oBAAoB,SAAS,qCAAqB,IAAI,KAAK;EACjE,MAAM,sBAAsB,SAAS,uCAAuB,IAAI,KAAwB;EACxF,MAAM,uBAAuB,SAAS,wCAAwB,IAAI,KAAwB;AAE1F,OAAK,mBAAmB,QAAQ,SAAS,KAAK,OAAO;GAEnD,MAAM,WAAW,IAAI,gBAAgB,IADrB,GAAG,QAAS,gBAAgB,IAAI,GAAG,MAAM,IAAI,OAAQ,KACpB;AAGjD,QAAK,MAAM,CAAC,SAAS,YAAY,GAAG,MAClC,KAAI,QAAQ,OAAO;IACjB,MAAM,MAAM,kBAAkB,IAAI,QAAQ,MAAM;AAChD,QAAI,IAAK,UAAS,eAAe,SAAS,IAAI;IAC9C,MAAM,YAAY,oBAAoB,IAAI,QAAQ,MAAM;AACxD,QAAI,UAAW,UAAS,aAAa,SAAS,UAAU;;AAI5D,UAAO;IACP;EAGF,MAAM,MAAkB;GACtB,aAAa,QAAQ;GACrB,aAAa,QAAQ;GACrB,WAAW,QAAQ;GACnB,YAAY,QAAQ;GACpB,eAAe,QAAQ;GACvB,aAAa,QAAQ;GACrB,cAAc,QAAQ;GACtB,eAAe,UAAU;GACzB,gBAAgB,UAAU;GAC1B,mBAAmB,SAAS,qBAAqB;GAClD;AAGD,MAAI,QAAQ,gBACV,MAAK,iBAAiB,UAAU,OAAO,UAAU,QAAQ,QAAQ,gBAAgB;EAInF,MAAM,eAAe;GACnB,UAAU,KAAK;GACf,YAAY;GACZ,eAAe;GACf,iBAAiB;GACjB,aAAa,SAAS;GACvB;AACD,OAAK,SAAS,GAAG,gBAAgB,QAAQ,QAAQ,aAAa,CAAC;;CAGjE,IAAI,cAAc;AAChB,SAAO,KAAK,QAAQ;;CAEtB,IAAI,WAAW;AACb,SAAO,KAAK,QAAQ;;CAEtB,IAAI,YAAY;AACd,SAAO,KAAK,QAAQ;;CAEtB,IAAI,YAAY;AACd,SAAO,KAAK,QAAQ;;CAEtB,IAAI,aAAa;AACf,SAAO,KAAK,QAAQ;;CAGtB,SAAS,MAAqC;AAC5C,SAAO,KAAK,SAAS,MAAM,MAAM,EAAE,UAAU,KAAK;;;;;;;;;;;;;CAcpD,cAAc,SAAiB,SAAuB;EACpD,MAAM,KAAK,KAAK,QAAQ;EACxB,MAAM,KAAK,KAAK,QAAQ;AACxB,2BAAyB,KAAK,UAAU,SAAS,SAAS,IAAI,GAAG;;CAGnE,iBAAyB,YAAoB,aAAqB,UAAwB;EACxF,MAAM,QAAQ,eAAe,SAAS;AACtC,OAAK,cAAc,IAAIC,QAAAA,UAAU,CAAC,KAAK,GAAG,GAAG,YAAY,YAAY,CAAC,KAAK,MAAM;AACjF,OAAK,YAAY,QAAQ;AACzB,OAAK,SAAS,KAAK,YAAY;;CAGjC,QAAiB,SAAqD;AACpE,OAAK,MAAM,MAAM,KAAK,iBACpB,IAAG,SAAS;AAEd,QAAM,QAAQ,QAAQ;;;;;AC7G1BC,QAAAA,WAAW,IAAIC,YAAAA,SAAS;AA6BxB,eAAsB,qBACpB,MACA,UACA,UAAmB,OAIlB;CACD,MAAM,mCAAmB,IAAI,KAA2B;AACxD,MAAK,MAAM,MAAM,KAAK,UAAU;AAC9B,MAAI,CAAC,aAAa,GAAG,CAAE;EAEvB,MAAM,aAAa,MAAM,QADXC,QAAAA,KAAS,KAAK,UAAU,GAAG,OAAO,CACT;EACvC,MAAM,QAAQA,QAAAA,KAAS,QAAQ,GAAG,OAAO,CAAC,aAAa;AACvD,mBAAiB,IACf,GAAG,QACH,UAAU,SACN,SAAS,MAAM,WAAW,MAAM,CAAC,GAC/B,MAAM,WAAW,MAAM,CAC9B;;CAGH,MAAM,4BAAY,IAAI,KAAkC;CACxD,MAAM,kCAAkB,IAAI,KAAa;AACzC,MAAK,MAAM,OAAO,YAAY,KAAK,OAAO,CACxC,KAAI,IAAI,SAAU,iBAAgB,IAAI,IAAI,SAAS;AAErD,OAAM,QAAQ,IACZ,MAAM,KAAK,gBAAgB,CAAC,IAAI,OAAO,QAAQ;EAE7C,MAAM,cAAc,MAAM,QADXA,QAAAA,KAAS,KAAK,UAAU,IAAI,CACF;EACzC,MAAM,SAASA,QAAAA,KAAS,QAAQ,IAAI,CAAC,aAAa;AAClD,YAAU,IACR,KACA,WAAW,QACP,QAAQ,MAAM,YAAY,MAAM,CAAC,GAC/B,MAAM,YAAY,MAAM,CAC/B;GACD,CACH;AAED,QAAO;EAAE;EAAkB;EAAW;;AAGxC,MAAa,iBAA8C;CACzD,WAAW;EACT,MAAMC,QAAAA,cAAc;EACpB,MAAM;EACP;CAED,IAAI;CACJ,MAAM;CAEN,KAAK,KAAsB;EACzB,MAAM,MAAMD,QAAAA,KAAS,QAAQ,IAAI,CAAC,aAAa;AAC/C,SAAO,QAAQ,UAAU,QAAQ;;CAGnC,MAAM,KAAK,KAAqC;AAC9C,SAAO,kBAAkB,IAAI;;CAEhC;AAED,eAAsB,kBACpB,KACA,SACwB;CACxB,MAAM,UAAU,SAAS,WAAW;CACpC,MAAM,YAAY,SAAS;CAC3B,MAAM,OAAO,MAAM,kBAAkB,KAAK,QAAQ;CAClD,MAAM,WAAWA,QAAAA,KAAS,QAAQ,IAAI;CACtC,MAAM,EAAE,kBAAkB,cAAc,MAAM,qBAAqB,MAAM,UAAU,QAAQ;CAC3F,MAAM,UAAU,MAAM,cAAc,MAAM;EAAE;EAAkB;EAAW,CAAC;CAC1E,MAAM,WAAW,MAAM,oBAAoB,uBAAuB,SAAS,SAAS,EAAE,UAAU;AAShG,QAAO;EAAE;EAAS,WARA,IAAI,SAAS,SAAS;GACtC,iBAAiB,SAAS;GAC1B,oBAAoB,SAAS;GAC7B,mBAAmB,SAAS;GAC5B,qBAAqB,SAAS;GAC9B,sBAAsB,SAAS;GAChC,CAAC;EAE2B;;AAG/B,eAAe,kBAAkB,KAAa,SAAyC;CACrF,MAAM,MAAMA,QAAAA,KAAS,QAAQ,IAAI,CAAC,aAAa;CAC/C,MAAM,WAAW,MAAM,QAAQ,IAAI;AAEnC,KAAI,QAAQ,OACV,QAAO,SAAS,MAAM,SAAS,MAAM,CAAC;AAGxC,QAAQ,MAAM,SAAS,MAAM;;AAG/B,SAAgB,uBAAuB,SAAsB,UAAmC;CAC9F,MAAM,gBAAwC,EAAE;CAChD,MAAM,aAAqC,EAAE;CAC7C,MAAM,mBAA2C,EAAE;AAEnD,MAAK,MAAM,MAAM,QAAQ,UAAU;AACjC,MAAI,GAAG,MACL,eAAc,KAAK;GAAE,QAAQ,GAAG;GAAO,KAAKA,QAAAA,KAAS,KAAK,UAAU,GAAG,MAAM;GAAE,CAAC;AAGlF,OAAK,MAAM,CAAC,UAAU,YAAY,GAAG,MACnC,KAAI,QAAQ,MACV,YAAW,KAAK;GAAE,QAAQ,QAAQ;GAAO,KAAKA,QAAAA,KAAS,KAAK,UAAU,QAAQ,MAAM;GAAE,CAAC;;AAK7F,MAAK,MAAM,SAAS,cAAc,QAAQ,OAAO,CAC/C,KAAI,MAAM,SAAS,gBAAgB,MAAM,MACvC,kBAAiB,KAAK;EAAE,QAAQ,MAAM;EAAO,KAAKA,QAAAA,KAAS,KAAK,UAAU,MAAM,MAAM;EAAE,CAAC;AAI7F,QAAO;EAAE;EAAe;EAAY;EAAkB;;AAGxD,eAAsB,oBACpB,UACA,aAA0B,QAAQE,QAAAA,OAAO,KAAK,IAAI,EACtB;CAC5B,MAAM,SAA4B;EAChC,iCAAiB,IAAI,KAAK;EAC1B,oCAAoB,IAAI,KAAK;EAC7B,mCAAmB,IAAI,KAAK;EAC5B,qCAAqB,IAAI,KAAK;EAC9B,sCAAsB,IAAI,KAAK;EAChC;AAED,OAAM,QAAQ,IAAI;EAChB,GAAG,SAAS,cAAc,KAAK,UAC7B,UAA+B,MAAM,IAAI,CAAC,MAAM,UAAU;AACxD,UAAO,gBAAgB,IAAI,MAAM,QAAQ,aAAa,OAAO,MAAM,IAAI,CAAC;IACxE,CACH;EACD,GAAG,SAAS,WAAW,KAAK,UAC1B,UAA+B,MAAM,IAAI,CAAC,MAAM,UAAU;AACxD,OAAI,SAAS,MAAM,IAAI,EAAE;IACvB,MAAM,YAAY;AAClB,WAAO,kBAAkB,IAAI,MAAM,QAAQ,UAAU,SAAS,GAAc;AAC5E,WAAO,oBAAoB,IAAI,MAAM,QAAQ,UAAU;SAEvD,QAAO,kBAAkB,IAAI,MAAM,QAAQ,MAAiB;IAE9D,CACH;EACD,GAAG,SAAS,iBAAiB,KAAK,UAChC,UAA+B,MAAM,IAAI,CAAC,MAAM,UAAU;AACxD,OAAI,SAAS,MAAM,IAAI,EAAE;IACvB,MAAM,YAAY;AAClB,WAAO,mBAAmB,IAAI,MAAM,QAAQ,UAAU,SAAS,GAAc;AAC7E,WAAO,qBAAqB,IAAI,MAAM,QAAQ,UAAU;SAExD,QAAO,mBAAmB,IAAI,MAAM,QAAQ,MAAiB;IAE/D,CACH;EACF,CAAC;AAEF,QAAO;;AAGT,SAAS,aAAa,OAA4B,KAAsB;AACtE,QAAO,SAAS,IAAI,GAAK,MAAoB,SAAS,KAAkB;;AAG1E,SAAS,SAAS,KAAsB;AACtC,QAAO,IAAI,aAAa,CAAC,SAAS,OAAO;;AAG3C,SAAS,cAAwD,QAAkB;CACjF,MAAM,SAAc,EAAE;AACtB,MAAK,MAAM,SAAS,QAAQ;AAC1B,SAAO,KAAK,MAAM;AAClB,MAAI,MAAM,SAAS,WAAW,MAAM,OAClC,QAAO,KAAK,GAAG,cAAc,MAAM,OAAO,CAAC;;AAG/C,QAAO;;AAGT,UAAU,YAAY,QAA8C;AAClE,MAAK,MAAM,SAAS,cAAc,OAAO,CACvC,KAAI,MAAM,SAAS,iBAAiB,MAAM,QACxC,MAAK,MAAM,OAAO,MAAM,QAAS,OAAM"}