{"version":3,"sources":["jsdelivr-header.js","/npm/protomaps-leaflet@5.0.1/src/frontends/static.ts","/npm/protomaps-leaflet@5.0.1/src/attribute.ts","/npm/protomaps-leaflet@5.0.1/src/line.ts","/npm/protomaps-leaflet@5.0.1/src/text.ts","/npm/protomaps-leaflet@5.0.1/src/tilecache.ts","/npm/protomaps-leaflet@5.0.1/src/symbolizer.ts","/npm/protomaps-leaflet@5.0.1/src/default_style/style.ts","/npm/protomaps-leaflet@5.0.1/src/view.ts","/npm/protomaps-leaflet@5.0.1/src/labeler.ts","/npm/protomaps-leaflet@5.0.1/src/painter.ts","/npm/protomaps-leaflet@5.0.1/src/frontends/leaflet.ts","/npm/protomaps-leaflet@5.0.1/src/task.ts"],"names":[],"mappings":"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","file":"/npm/protomaps-leaflet@5.0.1/dist/esm/index.js/+esm","sourceRoot":"","sourcesContent":["/**\n * Bundled by jsDelivr using Rollup v2.79.2 and Terser v5.39.0.\n * Original file: /npm/protomaps-leaflet@5.0.1/dist/esm/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","import Point from \"@mapbox/point-geometry\";\n\nimport { namedFlavor } from \"@protomaps/basemaps\";\nimport { PMTiles } from \"pmtiles\";\nimport { labelRules, paintRules } from \"../default_style/style\";\nimport { LabelRule, Labeler } from \"../labeler\";\nimport { PaintRule, paint } from \"../painter\";\nimport { PreparedTile, SourceOptions, View, sourcesToViews } from \"../view\";\n\nconst R = 6378137;\nconst MAX_LATITUDE = 85.0511287798;\nconst MAXCOORD = R * Math.PI;\n\nconst project = (latlng: Point): Point => {\n  const d = Math.PI / 180;\n  const constrainedLat = Math.max(\n    Math.min(MAX_LATITUDE, latlng.y),\n    -MAX_LATITUDE,\n  );\n  const sin = Math.sin(constrainedLat * d);\n  return new Point(R * latlng.x * d, (R * Math.log((1 + sin) / (1 - sin))) / 2);\n};\n\nconst unproject = (point: Point) => {\n  const d = 180 / Math.PI;\n  return {\n    lat: (2 * Math.atan(Math.exp(point.y / R)) - Math.PI / 2) * d,\n    lng: (point.x * d) / R,\n  };\n};\n\nconst instancedProject = (origin: Point, displayZoom: number) => {\n  return (latlng: Point) => {\n    const projected = project(latlng);\n    const normalized = new Point(\n      (projected.x + MAXCOORD) / (MAXCOORD * 2),\n      1 - (projected.y + MAXCOORD) / (MAXCOORD * 2),\n    );\n    return normalized.mult(2 ** displayZoom * 256).sub(origin);\n  };\n};\n\nconst instancedUnproject = (origin: Point, displayZoom: number) => {\n  return (point: Point) => {\n    const normalized = new Point(point.x, point.y)\n      .add(origin)\n      .div(2 ** displayZoom * 256);\n    const projected = new Point(\n      normalized.x * (MAXCOORD * 2) - MAXCOORD,\n      (1 - normalized.y) * (MAXCOORD * 2) - MAXCOORD,\n    );\n    return unproject(projected);\n  };\n};\n\nexport const getZoom = (degreesLng: number, cssPixels: number): number => {\n  const d = cssPixels * (360 / degreesLng);\n  return Math.log2(d / 256);\n};\n\ninterface StaticOptions {\n  debug?: string;\n  lang?: string;\n  maxDataZoom?: number;\n  url?: PMTiles | string;\n  sources?: Record<string, SourceOptions>;\n  paintRules?: PaintRule[];\n  labelRules?: LabelRule[];\n  backgroundColor?: string;\n  flavor?: string;\n}\n\nexport class Static {\n  paintRules: PaintRule[];\n  labelRules: LabelRule[];\n  views: Map<string, View>;\n  debug?: string;\n  backgroundColor?: string;\n\n  constructor(options: StaticOptions) {\n    if (options.flavor) {\n      const flavor = namedFlavor(options.flavor);\n      this.paintRules = paintRules(flavor);\n      this.labelRules = labelRules(flavor, options.lang || \"en\");\n      this.backgroundColor = flavor.background;\n    } else {\n      this.paintRules = options.paintRules || [];\n      this.labelRules = options.labelRules || [];\n      this.backgroundColor = options.backgroundColor;\n    }\n\n    this.views = sourcesToViews(options);\n    this.debug = options.debug || \"\";\n  }\n\n  async drawContext(\n    ctx: CanvasRenderingContext2D,\n    width: number,\n    height: number,\n    latlng: Point,\n    displayZoom: number,\n  ) {\n    const center = project(latlng);\n    const normalizedCenter = new Point(\n      (center.x + MAXCOORD) / (MAXCOORD * 2),\n      1 - (center.y + MAXCOORD) / (MAXCOORD * 2),\n    );\n\n    // the origin of the painter call in global Z coordinates\n    const origin = normalizedCenter\n      .clone()\n      .mult(2 ** displayZoom * 256)\n      .sub(new Point(width / 2, height / 2));\n\n    // the bounds of the painter call in global Z coordinates\n    const bbox = {\n      minX: origin.x,\n      minY: origin.y,\n      maxX: origin.x + width,\n      maxY: origin.y + height,\n    };\n\n    const promises = [];\n    for (const [k, v] of this.views) {\n      const promise = v.getBbox(displayZoom, bbox);\n      promises.push({ key: k, promise: promise });\n    }\n    const tileResponses = await Promise.all(\n      promises.map((o) => {\n        return o.promise.then(\n          (v: PreparedTile[]) => {\n            return { status: \"fulfilled\", value: v, key: o.key };\n          },\n          (error: Error) => {\n            return { status: \"rejected\", value: [], reason: error, key: o.key };\n          },\n        );\n      }),\n    );\n\n    const preparedTilemap = new Map<string, PreparedTile[]>();\n    for (const tileResponse of tileResponses) {\n      if (tileResponse.status === \"fulfilled\") {\n        preparedTilemap.set(tileResponse.key, tileResponse.value);\n      }\n    }\n\n    const start = performance.now();\n    const labeler = new Labeler(\n      displayZoom,\n      ctx,\n      this.labelRules,\n      16,\n      undefined,\n    ); // because need ctx to measure\n\n    const layoutTime = labeler.add(preparedTilemap);\n\n    if (this.backgroundColor) {\n      ctx.save();\n      ctx.fillStyle = this.backgroundColor;\n      ctx.fillRect(0, 0, width, height);\n      ctx.restore();\n    }\n\n    const paintRules = this.paintRules;\n\n    const p = paint(\n      ctx,\n      displayZoom,\n      preparedTilemap,\n      labeler.index,\n      paintRules,\n      bbox,\n      origin,\n      true,\n      this.debug,\n    );\n\n    if (this.debug) {\n      ctx.save();\n      ctx.translate(-origin.x, -origin.y);\n      ctx.strokeStyle = this.debug;\n      ctx.fillStyle = this.debug;\n      ctx.font = \"12px sans-serif\";\n      let idx = 0;\n      for (const [k, v] of preparedTilemap) {\n        for (const preparedTile of v) {\n          ctx.strokeRect(\n            preparedTile.origin.x,\n            preparedTile.origin.y,\n            preparedTile.dim,\n            preparedTile.dim,\n          );\n          const dt = preparedTile.dataTile;\n          ctx.fillText(\n            `${k + (k ? \" \" : \"\") + dt.z} ${dt.x} ${dt.y}`,\n            preparedTile.origin.x + 4,\n            preparedTile.origin.y + 14 * (1 + idx),\n          );\n        }\n        idx++;\n      }\n      ctx.restore();\n    }\n\n    // TODO this API isn't so elegant\n    return {\n      elapsed: performance.now() - start,\n      project: instancedProject(origin, displayZoom),\n      unproject: instancedUnproject(origin, displayZoom),\n    };\n  }\n\n  async drawCanvas(\n    canvas: HTMLCanvasElement,\n    latlng: Point,\n    displayZoom: number,\n    options: StaticOptions = {},\n  ) {\n    const dpr = window.devicePixelRatio;\n    const width = canvas.clientWidth;\n    const height = canvas.clientHeight;\n    if (!(canvas.width === width * dpr && canvas.height === height * dpr)) {\n      canvas.width = width * dpr;\n      canvas.height = height * dpr;\n    }\n    if (options.lang) canvas.lang = options.lang;\n    const ctx = canvas.getContext(\"2d\");\n    if (!ctx) {\n      console.error(\"Failed to initialize canvas2d context.\");\n      return;\n    }\n    ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n    return this.drawContext(ctx, width, height, latlng, displayZoom);\n  }\n\n  async drawContextBounds(\n    ctx: CanvasRenderingContext2D,\n    topLeft: Point,\n    bottomRight: Point,\n    width: number,\n    height: number,\n  ) {\n    const deltaDegrees = bottomRight.x - topLeft.x;\n    const center = new Point(\n      (topLeft.x + bottomRight.x) / 2,\n      (topLeft.y + bottomRight.y) / 2,\n    );\n    return this.drawContext(\n      ctx,\n      width,\n      height,\n      center,\n      getZoom(deltaDegrees, width),\n    );\n  }\n\n  async drawCanvasBounds(\n    canvas: HTMLCanvasElement,\n    topLeft: Point,\n    bottomRight: Point,\n    width: number,\n    options: StaticOptions = {},\n  ) {\n    const deltaDegrees = bottomRight.x - topLeft.x;\n    const center = new Point(\n      (topLeft.x + bottomRight.x) / 2,\n      (topLeft.y + bottomRight.y) / 2,\n    );\n    return this.drawCanvas(\n      canvas,\n      center,\n      getZoom(deltaDegrees, width),\n      options,\n    );\n  }\n}\n","import { Feature } from \"./tilecache\";\n\nexport type AttrOption<T> = T | ((z: number, f?: Feature) => T);\n\nexport class StringAttr<T extends string = string> {\n  str: AttrOption<T>;\n  perFeature: boolean;\n\n  constructor(c: AttrOption<T> | undefined, defaultValue: T) {\n    this.str = c ?? defaultValue;\n    this.perFeature = typeof this.str === \"function\" && this.str.length === 2;\n  }\n\n  public get(z: number, f?: Feature): T {\n    if (typeof this.str === \"function\") {\n      return this.str(z, f);\n    }\n    return this.str;\n  }\n}\n\nexport class NumberAttr {\n  value: AttrOption<number>;\n  perFeature: boolean;\n\n  constructor(c: AttrOption<number> | undefined, defaultValue = 1) {\n    this.value = c ?? defaultValue;\n    this.perFeature =\n      typeof this.value === \"function\" && this.value.length === 2;\n  }\n\n  public get(z: number, f?: Feature): number {\n    if (typeof this.value === \"function\") {\n      return this.value(z, f);\n    }\n    return this.value;\n  }\n}\n\nexport interface TextAttrOptions {\n  labelProps?: AttrOption<string[]>;\n  textTransform?: AttrOption<string>;\n}\n\nexport class TextAttr {\n  labelProps: AttrOption<string[]>;\n  textTransform?: AttrOption<string>;\n\n  constructor(options?: TextAttrOptions) {\n    this.labelProps = options?.labelProps ?? [\"name\"];\n    this.textTransform = options?.textTransform;\n  }\n\n  public get(z: number, f: Feature): string | undefined {\n    let retval: string | undefined;\n\n    let labelProps: string[];\n    if (typeof this.labelProps === \"function\") {\n      labelProps = this.labelProps(z, f);\n    } else {\n      labelProps = this.labelProps;\n    }\n    for (const property of labelProps) {\n      if (\n        Object.prototype.hasOwnProperty.call(f.props, property) &&\n        typeof f.props[property] === \"string\"\n      ) {\n        retval = f.props[property] as string;\n        break;\n      }\n    }\n    let transform: string | ((z: number, f: Feature) => string) | undefined;\n    if (typeof this.textTransform === \"function\") {\n      transform = this.textTransform(z, f);\n    } else {\n      transform = this.textTransform;\n    }\n    if (retval && transform === \"uppercase\") retval = retval.toUpperCase();\n    else if (retval && transform === \"lowercase\") retval = retval.toLowerCase();\n    else if (retval && transform === \"capitalize\") {\n      const wordsArray = retval.toLowerCase().split(\" \");\n      const capsArray = wordsArray.map((word: string) => {\n        return word[0].toUpperCase() + word.slice(1);\n      });\n      retval = capsArray.join(\" \");\n    }\n    return retval;\n  }\n}\n\nexport interface FontAttrOptions {\n  font?: AttrOption<string>;\n  fontFamily?: AttrOption<string>;\n  fontSize?: AttrOption<number>;\n  fontWeight?: AttrOption<number>;\n  fontStyle?: AttrOption<string>;\n}\n\nexport class FontAttr {\n  family?: AttrOption<string>;\n  size?: AttrOption<number>;\n  weight?: AttrOption<number>;\n  style?: AttrOption<string>;\n  font?: AttrOption<string>;\n\n  constructor(options?: FontAttrOptions) {\n    if (options?.font) {\n      this.font = options.font;\n    } else {\n      this.family = options?.fontFamily ?? \"sans-serif\";\n      this.size = options?.fontSize ?? 12;\n      this.weight = options?.fontWeight;\n      this.style = options?.fontStyle;\n    }\n  }\n\n  public get(z: number, f?: Feature) {\n    if (this.font) {\n      if (typeof this.font === \"function\") {\n        return this.font(z, f);\n      }\n      return this.font;\n    }\n    let style = \"\";\n    if (this.style) {\n      if (typeof this.style === \"function\") {\n        style = `${this.style(z, f)} `;\n      } else {\n        style = `${this.style} `;\n      }\n    }\n\n    let weight = \"\";\n    if (this.weight) {\n      if (typeof this.weight === \"function\") {\n        weight = `${this.weight(z, f)} `;\n      } else {\n        weight = `${this.weight} `;\n      }\n    }\n\n    let size: number | ((z: number, f: Feature) => number) | undefined;\n    if (typeof this.size === \"function\") {\n      size = this.size(z, f);\n    } else {\n      size = this.size;\n    }\n\n    let family: string | ((z: number, f: Feature) => string) | undefined;\n    if (typeof this.family === \"function\") {\n      family = this.family(z, f);\n    } else {\n      family = this.family;\n    }\n\n    return `${style}${weight}${size}px ${family}`;\n  }\n}\n\nexport class ArrayAttr<T = number> {\n  value: AttrOption<T[]>;\n  perFeature: boolean;\n\n  constructor(c: AttrOption<T[]>, defaultValue: T[] = []) {\n    this.value = c ?? defaultValue;\n    this.perFeature =\n      typeof this.value === \"function\" && this.value.length === 2;\n  }\n\n  public get(z: number, f?: Feature): T[] {\n    if (typeof this.value === \"function\") {\n      return this.value(z, f);\n    }\n    return this.value;\n  }\n}\n","import Point from \"@mapbox/point-geometry\";\n\nexport interface LabelableSegment {\n  length: number;\n  beginIndex: number;\n  beginDistance: number;\n  endIndex: number;\n  endDistance: number;\n}\n\n// code from https://github.com/naturalatlas/linelabel (Apache2)\nconst linelabel = (\n  pts: Point[],\n  maxAngleDelta: number,\n  targetLen: number,\n): LabelableSegment[] => {\n  const chunks = [];\n  let a: Point;\n  let b: Point;\n  let c: Point;\n  let i = 0;\n  let n = 0;\n  let d = 0;\n  let abmag = 0;\n  let bcmag = 0;\n  let abx = 0;\n  let aby = 0;\n  let bcx = 0;\n  let bcy = 0;\n  let dt = 0;\n  let iStart = 0;\n  let dStart = 0;\n\n  if (pts.length < 2) return [];\n  if (pts.length === 2) {\n    d = Math.sqrt((pts[1].x - pts[0].x) ** 2 + (pts[1].y - pts[0].y) ** 2);\n\n    return [\n      {\n        length: d,\n        beginIndex: 0,\n        beginDistance: 0,\n        endIndex: 2,\n        endDistance: d,\n      },\n    ];\n  }\n\n  abmag = Math.sqrt((pts[1].x - pts[0].x) ** 2 + (pts[1].y - pts[0].y) ** 2);\n  for (i = 1, n = pts.length - 1; i < n; i++) {\n    a = pts[i - 1];\n    b = pts[i];\n    c = pts[i + 1];\n    abx = b.x - a.x;\n    aby = b.y - a.y;\n    bcx = c.x - b.x;\n    bcy = c.y - b.y;\n    bcmag = Math.sqrt(bcx * bcx + bcy * bcy);\n    d += abmag;\n\n    dt = Math.acos((abx * bcx + aby * bcy) / (abmag * bcmag));\n    if (dt > maxAngleDelta || d - dStart > targetLen) {\n      chunks.push({\n        length: d - dStart,\n        beginDistance: dStart,\n        beginIndex: iStart,\n        endIndex: i + 1,\n        endDistance: d,\n      });\n      iStart = i;\n      dStart = d;\n    }\n    abmag = bcmag;\n  }\n\n  if (i - iStart > 0) {\n    chunks.push({\n      length: d - dStart + bcmag,\n      beginIndex: iStart,\n      beginDistance: dStart,\n      endIndex: i + 1,\n      endDistance: d + bcmag,\n    });\n  }\n  return chunks;\n};\n\nexport interface LabelCandidate {\n  start: Point;\n  end: Point;\n}\n\nexport function simpleLabel(\n  mls: Point[][],\n  minimum: number,\n  repeatDistance: number,\n  cellSize: number,\n): LabelCandidate[] {\n  const candidates = [];\n\n  for (const ls of mls) {\n    const segments = linelabel(ls, Math.PI / 45, minimum); // 4 degrees, close to a straight line\n    for (const segment of segments) {\n      if (segment.length >= minimum + cellSize) {\n        const start = new Point(\n          ls[segment.beginIndex].x,\n          ls[segment.beginIndex].y,\n        );\n        const end = ls[segment.endIndex - 1];\n        const normalized = new Point(\n          (end.x - start.x) / segment.length,\n          (end.y - start.y) / segment.length,\n        );\n\n        // offset from the start by cellSize to allow streets that meet at right angles\n        // to both be labeled.\n        for (\n          let i = cellSize;\n          i < segment.length - minimum;\n          i += repeatDistance\n        ) {\n          candidates.push({\n            start: start.add(normalized.mult(i)),\n            end: start.add(normalized.mult(i + minimum)),\n          });\n        }\n      }\n    }\n  }\n\n  return candidates;\n}\n\nexport function lineCells(a: Point, b: Point, length: number, spacing: number) {\n  // determine function of line\n  const dx = b.x - a.x;\n  const dy = b.y - a.y;\n  const dist = Math.sqrt((b.x - a.x) ** 2 + (b.y - a.y) ** 2);\n\n  const retval = [];\n  // starting from the anchor, generate square cells,\n  // guaranteeing to cover the endpoint\n  for (let i = 0; i < length + spacing; i += 2 * spacing) {\n    const factor = (i * 1) / dist;\n    retval.push({ x: a.x + factor * dx, y: a.y + factor * dy });\n  }\n  return retval;\n}\n","// TODO should be visual length in pixels, not strlen\nexport function linebreak(str: string, maxUnits: number): string[] {\n  if (str.length <= maxUnits) return [str];\n  const endIndex = maxUnits - 1;\n  const spaceBefore = str.lastIndexOf(\" \", endIndex);\n  const spaceAfter = str.indexOf(\" \", endIndex);\n  if (spaceBefore === -1 && spaceAfter === -1) {\n    return [str];\n  }\n  let first: string;\n  let after: string;\n  if (\n    spaceAfter === -1 ||\n    (spaceBefore >= 0 && endIndex - spaceBefore < spaceAfter - endIndex)\n  ) {\n    first = str.substring(0, spaceBefore);\n    after = str.substring(spaceBefore + 1, str.length);\n  } else {\n    first = str.substring(0, spaceAfter);\n    after = str.substring(spaceAfter + 1, str.length);\n  }\n  return [first, ...linebreak(after, maxUnits)];\n}\n\nconst CJK_CHARS =\n  \"\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3220-\\u3229\\u3248-\\u324F\\u3251-\\u325F\\u3280-\\u3289\\u32B1-\\u32BF\\u3400-\\u4DB5\\u4E00-\\u9FEA\\uF900-\\uFA6D\\uFA70-\\uFAD9\\u2000\";\nconst cjkTest = new RegExp(`^[${CJK_CHARS}]+$`);\n\nexport function isCjk(s: string) {\n  return cjkTest.test(s);\n}\n","import Point from \"@mapbox/point-geometry\";\nimport { VectorTile } from \"@mapbox/vector-tile\";\nimport Protobuf from \"pbf\";\nimport { PMTiles } from \"pmtiles\";\n\nexport type JsonValue =\n  | boolean\n  | number\n  | string\n  | null\n  | JsonArray\n  | JsonObject;\nexport interface JsonObject {\n  [key: string]: JsonValue;\n}\nexport interface JsonArray extends Array<JsonValue> {}\n\nexport enum GeomType {\n  Point = 1,\n  Line = 2,\n  Polygon = 3,\n}\n\nexport interface Bbox {\n  minX: number;\n  minY: number;\n  maxX: number;\n  maxY: number;\n}\n\nexport interface Feature {\n  readonly props: JsonObject;\n  readonly bbox: Bbox;\n  readonly geomType: GeomType;\n  readonly geom: Point[][];\n  readonly numVertices: number;\n}\n\nexport interface Zxy {\n  readonly z: number;\n  readonly x: number;\n  readonly y: number;\n}\n\nexport function toIndex(c: Zxy): string {\n  return `${c.x}:${c.y}:${c.z}`;\n}\n\nexport interface TileSource {\n  get(c: Zxy, tileSize: number): Promise<Map<string, Feature[]>>;\n}\n\ninterface ZoomAbort {\n  z: number;\n  controller: AbortController;\n}\n\n// reimplement loadGeometry with a scalefactor\n// so the general tile rendering case does not need rescaling.\nconst loadGeomAndBbox = (pbf: Protobuf, geometry: number, scale: number) => {\n  pbf.pos = geometry;\n  const end = pbf.readVarint() + pbf.pos;\n  let cmd = 1;\n  let length = 0;\n  let x = 0;\n  let y = 0;\n  let x1 = Infinity;\n  let x2 = -Infinity;\n  let y1 = Infinity;\n  let y2 = -Infinity;\n\n  const lines: Point[][] = [];\n  let line: Point[] = [];\n  while (pbf.pos < end) {\n    if (length <= 0) {\n      const cmdLen = pbf.readVarint();\n      cmd = cmdLen & 0x7;\n      length = cmdLen >> 3;\n    }\n    length--;\n    if (cmd === 1 || cmd === 2) {\n      x += pbf.readSVarint() * scale;\n      y += pbf.readSVarint() * scale;\n      if (x < x1) x1 = x;\n      if (x > x2) x2 = x;\n      if (y < y1) y1 = y;\n      if (y > y2) y2 = y;\n      if (cmd === 1) {\n        if (line.length > 0) lines.push(line);\n        line = [];\n      }\n      line.push(new Point(x, y));\n    } else if (cmd === 7) {\n      if (line) line.push(line[0].clone());\n    } else throw new Error(`unknown command ${cmd}`);\n  }\n  if (line) lines.push(line);\n  return { geom: lines, bbox: { minX: x1, minY: y1, maxX: x2, maxY: y2 } };\n};\n\nfunction parseTile(\n  buffer: ArrayBuffer,\n  tileSize: number,\n): Map<string, Feature[]> {\n  const v = new VectorTile(new Protobuf(buffer));\n  const result = new Map<string, Feature[]>();\n  for (const [key, value] of Object.entries(v.layers)) {\n    const features = [];\n    // biome-ignore lint: need to use private fields of vector-tile\n    const layer = value as any;\n    for (let i = 0; i < layer.length; i++) {\n      const loaded = loadGeomAndBbox(\n        layer.feature(i)._pbf,\n        layer.feature(i)._geometry,\n        tileSize / layer.extent,\n      );\n      let numVertices = 0;\n      for (const part of loaded.geom) numVertices += part.length;\n      features.push({\n        id: layer.feature(i).id,\n        geomType: layer.feature(i).type,\n        geom: loaded.geom,\n        numVertices: numVertices,\n        bbox: loaded.bbox,\n        props: layer.feature(i).properties,\n      });\n    }\n    result.set(key, features);\n  }\n  return result;\n}\n\nexport class PmtilesSource implements TileSource {\n  p: PMTiles;\n  zoomaborts: ZoomAbort[];\n  shouldCancelZooms: boolean;\n\n  constructor(url: string | PMTiles, shouldCancelZooms: boolean) {\n    if (typeof url === \"string\") {\n      this.p = new PMTiles(url);\n    } else {\n      this.p = url;\n    }\n    this.zoomaborts = [];\n    this.shouldCancelZooms = shouldCancelZooms;\n  }\n\n  public async get(c: Zxy, tileSize: number): Promise<Map<string, Feature[]>> {\n    if (this.shouldCancelZooms) {\n      this.zoomaborts = this.zoomaborts.filter((za) => {\n        if (za.z !== c.z) {\n          za.controller.abort();\n          return false;\n        }\n        return true;\n      });\n    }\n    const controller = new AbortController();\n    this.zoomaborts.push({ z: c.z, controller: controller });\n    const signal = controller.signal;\n\n    const result = await this.p.getZxy(c.z, c.x, c.y, signal);\n\n    if (result) {\n      return parseTile(result.data, tileSize);\n    }\n    return new Map<string, Feature[]>();\n  }\n}\n\nexport class ZxySource implements TileSource {\n  url: string;\n  zoomaborts: ZoomAbort[];\n  shouldCancelZooms: boolean;\n\n  constructor(url: string, shouldCancelZooms: boolean) {\n    this.url = url;\n    this.zoomaborts = [];\n    this.shouldCancelZooms = shouldCancelZooms;\n  }\n\n  public async get(c: Zxy, tileSize: number): Promise<Map<string, Feature[]>> {\n    if (this.shouldCancelZooms) {\n      this.zoomaborts = this.zoomaborts.filter((za) => {\n        if (za.z !== c.z) {\n          za.controller.abort();\n          return false;\n        }\n        return true;\n      });\n    }\n    const url = this.url\n      .replace(\"{z}\", c.z.toString())\n      .replace(\"{x}\", c.x.toString())\n      .replace(\"{y}\", c.y.toString());\n    const controller = new AbortController();\n    this.zoomaborts.push({ z: c.z, controller: controller });\n    const signal = controller.signal;\n    return new Promise((resolve, reject) => {\n      fetch(url, { signal: signal })\n        .then((resp) => {\n          return resp.arrayBuffer();\n        })\n        .then((buffer) => {\n          const result = parseTile(buffer, tileSize);\n          resolve(result);\n        })\n        .catch((e) => {\n          reject(e);\n        });\n    });\n  }\n}\n\ninterface CacheEntry {\n  used: number;\n  data: Map<string, Feature[]>;\n}\n\ninterface PromiseOptions {\n  resolve: (result: Map<string, Feature[]>) => void;\n  reject: (e: Error) => void;\n}\n\nexport interface PickedFeature {\n  feature: Feature;\n  layerName: string;\n}\n\nconst R = 6378137;\nconst MAX_LATITUDE = 85.0511287798;\nconst MAXCOORD = R * Math.PI;\n\nconst project = (latlng: number[]) => {\n  const d = Math.PI / 180;\n  const constrainedLat = Math.max(\n    Math.min(MAX_LATITUDE, latlng[0]),\n    -MAX_LATITUDE,\n  );\n  const sin = Math.sin(constrainedLat * d);\n  return new Point(\n    R * latlng[1] * d,\n    (R * Math.log((1 + sin) / (1 - sin))) / 2,\n  );\n};\n\nfunction sqr(x: number) {\n  return x * x;\n}\n\nfunction dist2(v: Point, w: Point) {\n  return sqr(v.x - w.x) + sqr(v.y - w.y);\n}\n\nfunction distToSegmentSquared(p: Point, v: Point, w: Point) {\n  const l2 = dist2(v, w);\n  if (l2 === 0) return dist2(p, v);\n  let t = ((p.x - v.x) * (w.x - v.x) + (p.y - v.y) * (w.y - v.y)) / l2;\n  t = Math.max(0, Math.min(1, t));\n  return dist2(p, new Point(v.x + t * (w.x - v.x), v.y + t * (w.y - v.y)));\n}\n\nexport function isInRing(point: Point, ring: Point[]): boolean {\n  let inside = false;\n  for (let i = 0, j = ring.length - 1; i < ring.length; j = i++) {\n    const xi = ring[i].x;\n    const yi = ring[i].y;\n    const xj = ring[j].x;\n    const yj = ring[j].y;\n    const intersect =\n      yi > point.y !== yj > point.y &&\n      point.x < ((xj - xi) * (point.y - yi)) / (yj - yi) + xi;\n    if (intersect) inside = !inside;\n  }\n  return inside;\n}\n\nexport function isCcw(ring: Point[]): boolean {\n  let area = 0;\n  for (let i = 0; i < ring.length; i++) {\n    const j = (i + 1) % ring.length;\n    area += ring[i].x * ring[j].y;\n    area -= ring[j].x * ring[i].y;\n  }\n  return area < 0;\n}\n\nexport function pointInPolygon(point: Point, geom: Point[][]): boolean {\n  let isInCurrentExterior = false;\n  for (const ring of geom) {\n    if (isCcw(ring)) {\n      // it is an interior ring\n      if (isInRing(point, ring)) isInCurrentExterior = false;\n    } else {\n      // it is an exterior ring\n      if (isInCurrentExterior) return true;\n      if (isInRing(point, ring)) isInCurrentExterior = true;\n    }\n  }\n  return isInCurrentExterior;\n}\n\nexport function pointMinDistToPoints(point: Point, geom: Point[][]): number {\n  let min = Infinity;\n  for (const l of geom) {\n    const dist = Math.sqrt(dist2(point, l[0]));\n    if (dist < min) min = dist;\n  }\n  return min;\n}\n\nexport function pointMinDistToLines(point: Point, geom: Point[][]): number {\n  let min = Infinity;\n  for (const l of geom) {\n    for (let i = 0; i < l.length - 1; i++) {\n      const dist = Math.sqrt(distToSegmentSquared(point, l[i], l[i + 1]));\n      if (dist < min) min = dist;\n    }\n  }\n  return min;\n}\n\nexport class TileCache {\n  source: TileSource;\n  cache: Map<string, CacheEntry>;\n  inflight: Map<string, PromiseOptions[]>;\n  tileSize: number;\n\n  constructor(source: TileSource, tileSize: number) {\n    this.source = source;\n    this.cache = new Map<string, CacheEntry>();\n    this.inflight = new Map<string, PromiseOptions[]>();\n    this.tileSize = tileSize;\n  }\n\n  public async get(c: Zxy): Promise<Map<string, Feature[]>> {\n    const idx = toIndex(c);\n    return new Promise((resolve, reject) => {\n      const entry = this.cache.get(idx);\n      if (entry) {\n        entry.used = performance.now();\n        resolve(entry.data);\n      } else {\n        const ifentry = this.inflight.get(idx);\n        if (ifentry) {\n          ifentry.push({ resolve: resolve, reject: reject });\n        } else {\n          this.inflight.set(idx, []);\n          this.source\n            .get(c, this.tileSize)\n            .then((tile) => {\n              this.cache.set(idx, { used: performance.now(), data: tile });\n\n              const ifentry2 = this.inflight.get(idx);\n              if (ifentry2) {\n                for (const f of ifentry2) {\n                  f.resolve(tile);\n                }\n              }\n              this.inflight.delete(idx);\n              resolve(tile);\n\n              if (this.cache.size >= 64) {\n                let minUsed = +Infinity;\n                let minKey = undefined;\n                this.cache.forEach((value, key) => {\n                  if (value.used < minUsed) {\n                    minUsed = value.used;\n                    minKey = key;\n                  }\n                });\n                if (minKey) this.cache.delete(minKey);\n              }\n            })\n            .catch((e) => {\n              const ifentry2 = this.inflight.get(idx);\n              if (ifentry2) {\n                for (const f of ifentry2) {\n                  f.reject(e);\n                }\n              }\n              this.inflight.delete(idx);\n              reject(e);\n            });\n        }\n      }\n    });\n  }\n\n  public queryFeatures(\n    lng: number,\n    lat: number,\n    zoom: number,\n    brushSize: number,\n  ): PickedFeature[] {\n    const projected = project([lat, lng]);\n    const normalized = new Point(\n      (projected.x + MAXCOORD) / (MAXCOORD * 2),\n      1 - (projected.y + MAXCOORD) / (MAXCOORD * 2),\n    );\n    if (normalized.x > 1)\n      normalized.x = normalized.x - Math.floor(normalized.x);\n    const onZoom = normalized.mult(1 << zoom);\n    const tileX = Math.floor(onZoom.x);\n    const tileY = Math.floor(onZoom.y);\n    const idx = toIndex({ z: zoom, x: tileX, y: tileY });\n    const retval: PickedFeature[] = [];\n    const entry = this.cache.get(idx);\n    if (entry) {\n      const center = new Point(\n        (onZoom.x - tileX) * this.tileSize,\n        (onZoom.y - tileY) * this.tileSize,\n      );\n      for (const [layerName, layerArr] of entry.data.entries()) {\n        for (const feature of layerArr) {\n          if (feature.geomType === GeomType.Point) {\n            if (pointMinDistToPoints(center, feature.geom) < brushSize) {\n              retval.push({ feature, layerName: layerName });\n            }\n          } else if (feature.geomType === GeomType.Line) {\n            if (pointMinDistToLines(center, feature.geom) < brushSize) {\n              retval.push({ feature, layerName: layerName });\n            }\n          } else {\n            if (pointInPolygon(center, feature.geom)) {\n              retval.push({ feature, layerName: layerName });\n            }\n          }\n        }\n      }\n    }\n    return retval;\n  }\n}\n","import Point from \"@mapbox/point-geometry\";\nimport {\n  ArrayAttr,\n  AttrOption,\n  FontAttr,\n  FontAttrOptions,\n  NumberAttr,\n  StringAttr,\n  TextAttr,\n  TextAttrOptions,\n} from \"./attribute\";\nimport { Label, Layout } from \"./labeler\";\nimport { lineCells, simpleLabel } from \"./line\";\nimport { Sheet } from \"./task\";\nimport { linebreak } from \"./text\";\nimport { Bbox, Feature, GeomType } from \"./tilecache\";\n\nexport interface PaintSymbolizer {\n  before?(ctx: CanvasRenderingContext2D, z: number): void;\n  draw(\n    ctx: CanvasRenderingContext2D,\n    geom: Point[][],\n    z: number,\n    feature: Feature,\n  ): void;\n}\n\nexport enum Justify {\n  Left = 1,\n  Center = 2,\n  Right = 3,\n}\n\nexport enum TextPlacements {\n  N = 1,\n  Ne = 2,\n  E = 3,\n  Se = 4,\n  S = 5,\n  Sw = 6,\n  W = 7,\n  Nw = 8,\n}\n\nexport interface DrawExtra {\n  justify: Justify;\n}\n\nexport interface LabelSymbolizer {\n  /* the symbolizer can, but does not need to, inspect index to determine the right position\n   * if return undefined, no label is added\n   * return a label, but if the label collides it is not added\n   */\n  place(layout: Layout, geom: Point[][], feature: Feature): Label[] | undefined;\n}\n\nexport const createPattern = (\n  width: number,\n  height: number,\n  fn: (canvas: HTMLCanvasElement, ctx: CanvasRenderingContext2D) => void,\n) => {\n  const canvas = document.createElement(\"canvas\");\n  const ctx = canvas.getContext(\"2d\");\n  canvas.width = width;\n  canvas.height = height;\n  if (ctx !== null) fn(canvas, ctx);\n  return canvas;\n};\n\nexport class PolygonSymbolizer implements PaintSymbolizer {\n  pattern?: CanvasImageSource;\n  fill: StringAttr;\n  opacity: NumberAttr;\n  stroke: StringAttr;\n  width: NumberAttr;\n  perFeature: boolean;\n  doStroke: boolean;\n\n  constructor(options: {\n    pattern?: CanvasImageSource;\n    fill?: AttrOption<string>;\n    opacity?: AttrOption<number>;\n    stroke?: AttrOption<string>;\n    width?: AttrOption<number>;\n    perFeature?: boolean;\n  }) {\n    this.pattern = options.pattern;\n    this.fill = new StringAttr(options.fill, \"black\");\n    this.opacity = new NumberAttr(options.opacity, 1);\n    this.stroke = new StringAttr(options.stroke, \"black\");\n    this.width = new NumberAttr(options.width, 0);\n    this.perFeature =\n      (this.fill.perFeature ||\n        this.opacity.perFeature ||\n        this.stroke.perFeature ||\n        this.width.perFeature ||\n        options.perFeature) ??\n      false;\n    this.doStroke = false;\n  }\n\n  public before(ctx: CanvasRenderingContext2D, z: number) {\n    if (!this.perFeature) {\n      ctx.globalAlpha = this.opacity.get(z);\n      ctx.fillStyle = this.fill.get(z);\n      ctx.strokeStyle = this.stroke.get(z);\n      const width = this.width.get(z);\n      if (width > 0) this.doStroke = true;\n      ctx.lineWidth = width;\n    }\n    if (this.pattern) {\n      const patten = ctx.createPattern(this.pattern, \"repeat\");\n      if (patten) ctx.fillStyle = patten;\n    }\n  }\n\n  public draw(\n    ctx: CanvasRenderingContext2D,\n    geom: Point[][],\n    z: number,\n    f: Feature,\n  ) {\n    let doStroke = false;\n    if (this.perFeature) {\n      ctx.globalAlpha = this.opacity.get(z, f);\n      ctx.fillStyle = this.fill.get(z, f);\n      const width = this.width.get(z, f);\n      if (width) {\n        doStroke = true;\n        ctx.strokeStyle = this.stroke.get(z, f);\n        ctx.lineWidth = width;\n      }\n    }\n\n    const drawPath = () => {\n      ctx.fill();\n      if (doStroke || this.doStroke) {\n        ctx.stroke();\n      }\n    };\n\n    ctx.beginPath();\n    for (const poly of geom) {\n      for (let p = 0; p < poly.length; p++) {\n        const pt = poly[p];\n        if (p === 0) ctx.moveTo(pt.x, pt.y);\n        else ctx.lineTo(pt.x, pt.y);\n      }\n    }\n    drawPath();\n  }\n}\n\nexport function arr(base: number, a: number[]): (z: number) => number {\n  return (z) => {\n    const b = z - base;\n    if (b >= 0 && b < a.length) {\n      return a[b];\n    }\n    return 0;\n  };\n}\n\nfunction getStopIndex(input: number, stops: number[][]): number {\n  let idx = 0;\n  while (stops[idx + 1][0] < input) idx++;\n  return idx;\n}\n\nfunction interpolate(factor: number, start: number, end: number): number {\n  return factor * (end - start) + start;\n}\n\nfunction computeInterpolationFactor(\n  z: number,\n  idx: number,\n  base: number,\n  stops: number[][],\n): number {\n  const difference = stops[idx + 1][0] - stops[idx][0];\n  const progress = z - stops[idx][0];\n  if (difference === 0) return 0;\n  if (base === 1) return progress / difference;\n  return (base ** progress - 1) / (base ** difference - 1);\n}\n\nexport function exp(base: number, stops: number[][]): (z: number) => number {\n  return (z) => {\n    if (stops.length < 1) return 0;\n    if (z <= stops[0][0]) return stops[0][1];\n    if (z >= stops[stops.length - 1][0]) return stops[stops.length - 1][1];\n    const idx = getStopIndex(z, stops);\n    const factor = computeInterpolationFactor(z, idx, base, stops);\n    return interpolate(factor, stops[idx][1], stops[idx + 1][1]);\n  };\n}\n\nexport type Stop = [number, number] | [number, string] | [number, boolean];\nexport function step(\n  output0: number | string | boolean,\n  stops: Stop[],\n): (z: number) => number | string | boolean {\n  // Step computes discrete results by evaluating a piecewise-constant\n  // function defined by stops.\n  // Returns the output value of the stop with a stop input value just less than\n  // the input one. If the input value is less than the input of the first stop,\n  // output0 is returned\n  return (z) => {\n    if (stops.length < 1) return 0;\n    let retval = output0;\n    for (let i = 0; i < stops.length; i++) {\n      if (z >= stops[i][0]) retval = stops[i][1];\n    }\n    return retval;\n  };\n}\n\nexport function linear(stops: number[][]): (z: number) => number {\n  return exp(1, stops);\n}\n\nexport class LineSymbolizer implements PaintSymbolizer {\n  color: StringAttr;\n  width: NumberAttr;\n  opacity: NumberAttr;\n  dash: ArrayAttr<number> | null;\n  dashColor: StringAttr;\n  dashWidth: NumberAttr;\n  skip: boolean;\n  perFeature: boolean;\n  lineCap: StringAttr<CanvasLineCap>;\n  lineJoin: StringAttr<CanvasLineJoin>;\n\n  constructor(options: {\n    color?: AttrOption<string>;\n    width?: AttrOption<number>;\n    opacity?: AttrOption<number>;\n    dash?: number[];\n    dashColor?: AttrOption<string>;\n    dashWidth?: AttrOption<number>;\n    skip?: boolean;\n    perFeature?: boolean;\n    lineCap?: AttrOption<CanvasLineCap>;\n    lineJoin?: AttrOption<CanvasLineJoin>;\n  }) {\n    this.color = new StringAttr(options.color, \"black\");\n    this.width = new NumberAttr(options.width);\n    this.opacity = new NumberAttr(options.opacity);\n    this.dash = options.dash ? new ArrayAttr(options.dash) : null;\n    this.dashColor = new StringAttr(options.dashColor, \"black\");\n    this.dashWidth = new NumberAttr(options.dashWidth, 1.0);\n    this.lineCap = new StringAttr(options.lineCap, \"butt\");\n    this.lineJoin = new StringAttr(options.lineJoin, \"miter\");\n    this.skip = false;\n    this.perFeature = !!(\n      this.dash?.perFeature ||\n      this.color.perFeature ||\n      this.opacity.perFeature ||\n      this.width.perFeature ||\n      this.lineCap.perFeature ||\n      this.lineJoin.perFeature ||\n      options.perFeature\n    );\n  }\n\n  public before(ctx: CanvasRenderingContext2D, z: number) {\n    if (!this.perFeature) {\n      ctx.strokeStyle = this.color.get(z);\n      ctx.lineWidth = this.width.get(z);\n      ctx.globalAlpha = this.opacity.get(z);\n      ctx.lineCap = this.lineCap.get(z);\n      ctx.lineJoin = this.lineJoin.get(z);\n    }\n  }\n\n  public draw(\n    ctx: CanvasRenderingContext2D,\n    geom: Point[][],\n    z: number,\n    f: Feature,\n  ) {\n    if (this.skip) return;\n\n    const strokePath = () => {\n      if (this.perFeature) {\n        ctx.globalAlpha = this.opacity.get(z, f);\n        ctx.lineCap = this.lineCap.get(z, f);\n        ctx.lineJoin = this.lineJoin.get(z, f);\n      }\n      if (this.dash) {\n        ctx.save();\n        if (this.perFeature) {\n          ctx.lineWidth = this.dashWidth.get(z, f);\n          ctx.strokeStyle = this.dashColor.get(z, f);\n          ctx.setLineDash(this.dash.get(z, f));\n        } else {\n          ctx.setLineDash(this.dash.get(z));\n        }\n        ctx.stroke();\n        ctx.restore();\n      } else {\n        ctx.save();\n        if (this.perFeature) {\n          ctx.lineWidth = this.width.get(z, f);\n          ctx.strokeStyle = this.color.get(z, f);\n        }\n        ctx.stroke();\n        ctx.restore();\n      }\n    };\n\n    ctx.beginPath();\n    for (const ls of geom) {\n      for (let p = 0; p < ls.length; p++) {\n        const pt = ls[p];\n        if (p === 0) ctx.moveTo(pt.x, pt.y);\n        else ctx.lineTo(pt.x, pt.y);\n      }\n    }\n    strokePath();\n  }\n}\n\nexport interface IconSymbolizerOptions {\n  name: string;\n  sheet: Sheet;\n}\nexport class IconSymbolizer implements LabelSymbolizer {\n  name: string;\n  sheet: Sheet;\n  dpr: number;\n\n  constructor(options: IconSymbolizerOptions) {\n    this.name = options.name;\n    this.sheet = options.sheet;\n    this.dpr = window.devicePixelRatio;\n  }\n\n  public place(layout: Layout, geom: Point[][], feature: Feature) {\n    const pt = geom[0];\n    const a = new Point(geom[0][0].x, geom[0][0].y);\n    const loc = this.sheet.get(this.name);\n    const width = loc.w / this.dpr;\n    const height = loc.h / this.dpr;\n\n    const bbox = {\n      minX: a.x - width / 2,\n      minY: a.y - height / 2,\n      maxX: a.x + width / 2,\n      maxY: a.y + height / 2,\n    };\n\n    const draw = (ctx: CanvasRenderingContext2D) => {\n      ctx.globalAlpha = 1;\n      ctx.drawImage(\n        this.sheet.canvas,\n        loc.x,\n        loc.y,\n        loc.w,\n        loc.h,\n        -loc.w / 2 / this.dpr,\n        -loc.h / 2 / this.dpr,\n        loc.w / 2,\n        loc.h / 2,\n      );\n    };\n    return [{ anchor: a, bboxes: [bbox], draw: draw }];\n  }\n}\n\nexport class CircleSymbolizer implements LabelSymbolizer, PaintSymbolizer {\n  radius: NumberAttr;\n  fill: StringAttr;\n  stroke: StringAttr;\n  width: NumberAttr;\n  opacity: NumberAttr;\n\n  constructor(options: {\n    radius?: AttrOption<number>;\n    fill?: AttrOption<string>;\n    stroke?: AttrOption<string>;\n    width?: AttrOption<number>;\n    opacity?: AttrOption<number>;\n  }) {\n    this.radius = new NumberAttr(options.radius, 3);\n    this.fill = new StringAttr(options.fill, \"black\");\n    this.stroke = new StringAttr(options.stroke, \"white\");\n    this.width = new NumberAttr(options.width, 0);\n    this.opacity = new NumberAttr(options.opacity);\n  }\n\n  public draw(\n    ctx: CanvasRenderingContext2D,\n    geom: Point[][],\n    z: number,\n    f: Feature,\n  ) {\n    ctx.globalAlpha = this.opacity.get(z, f);\n\n    const radius = this.radius.get(z, f);\n    const width = this.width.get(z, f);\n    if (width > 0) {\n      ctx.strokeStyle = this.stroke.get(z, f);\n      ctx.lineWidth = width;\n      ctx.beginPath();\n      ctx.arc(geom[0][0].x, geom[0][0].y, radius + width / 2, 0, 2 * Math.PI);\n      ctx.stroke();\n    }\n\n    ctx.fillStyle = this.fill.get(z, f);\n    ctx.beginPath();\n    ctx.arc(geom[0][0].x, geom[0][0].y, radius, 0, 2 * Math.PI);\n    ctx.fill();\n  }\n\n  public place(layout: Layout, geom: Point[][], feature: Feature) {\n    const pt = geom[0];\n    const a = new Point(geom[0][0].x, geom[0][0].y);\n    const radius = this.radius.get(layout.zoom, feature);\n    const bbox = {\n      minX: a.x - radius,\n      minY: a.y - radius,\n      maxX: a.x + radius,\n      maxY: a.y + radius,\n    };\n\n    const draw = (ctx: CanvasRenderingContext2D) => {\n      this.draw(ctx, [[new Point(0, 0)]], layout.zoom, feature);\n    };\n    return [{ anchor: a, bboxes: [bbox], draw }];\n  }\n}\n\nexport class ShieldSymbolizer implements LabelSymbolizer {\n  font: FontAttr;\n  text: TextAttr;\n  background: StringAttr;\n  fill: StringAttr;\n  padding: NumberAttr;\n\n  constructor(\n    options: {\n      fill?: AttrOption<string>;\n      background?: AttrOption<string>;\n      padding?: AttrOption<number>;\n    } & FontAttrOptions &\n      TextAttrOptions,\n  ) {\n    this.font = new FontAttr(options);\n    this.text = new TextAttr(options);\n    this.fill = new StringAttr(options.fill, \"black\");\n    this.background = new StringAttr(options.background, \"white\");\n    this.padding = new NumberAttr(options.padding, 0); // TODO check falsy\n  }\n\n  public place(layout: Layout, geom: Point[][], f: Feature) {\n    const property = this.text.get(layout.zoom, f);\n    if (!property) return undefined;\n    const font = this.font.get(layout.zoom, f);\n    layout.scratch.font = font;\n    const metrics = layout.scratch.measureText(property);\n\n    const width = metrics.width;\n    const ascent = metrics.actualBoundingBoxAscent;\n    const descent = metrics.actualBoundingBoxDescent;\n\n    const pt = geom[0];\n    const a = new Point(geom[0][0].x, geom[0][0].y);\n    const p = this.padding.get(layout.zoom, f);\n    const bbox = {\n      minX: a.x - width / 2 - p,\n      minY: a.y - ascent - p,\n      maxX: a.x + width / 2 + p,\n      maxY: a.y + descent + p,\n    };\n\n    const draw = (ctx: CanvasRenderingContext2D) => {\n      ctx.globalAlpha = 1;\n      ctx.fillStyle = this.background.get(layout.zoom, f);\n      ctx.fillRect(\n        -width / 2 - p,\n        -ascent - p,\n        width + 2 * p,\n        ascent + descent + 2 * p,\n      );\n      ctx.fillStyle = this.fill.get(layout.zoom, f);\n      ctx.font = font;\n      ctx.fillText(property, -width / 2, 0);\n    };\n    return [{ anchor: a, bboxes: [bbox], draw: draw }];\n  }\n}\n\n// TODO make me work with multiple anchors\nexport class FlexSymbolizer implements LabelSymbolizer {\n  list: LabelSymbolizer[];\n\n  constructor(list: LabelSymbolizer[]) {\n    this.list = list;\n  }\n\n  public place(layout: Layout, geom: Point[][], feature: Feature) {\n    let labels = this.list[0].place(layout, geom, feature);\n    if (!labels) return undefined;\n    let label = labels[0];\n    const anchor = label.anchor;\n    let bbox = label.bboxes[0];\n    const height = bbox.maxY - bbox.minY;\n    const draws = [{ draw: label.draw, translate: { x: 0, y: 0 } }];\n\n    const newGeom = [[new Point(geom[0][0].x, geom[0][0].y + height)]];\n    for (let i = 1; i < this.list.length; i++) {\n      labels = this.list[i].place(layout, newGeom, feature);\n      if (labels) {\n        label = labels[0];\n        bbox = mergeBbox(bbox, label.bboxes[0]);\n        draws.push({ draw: label.draw, translate: { x: 0, y: height } });\n      }\n    }\n\n    const draw = (ctx: CanvasRenderingContext2D) => {\n      for (const sub of draws) {\n        ctx.save();\n        ctx.translate(sub.translate.x, sub.translate.y);\n        sub.draw(ctx);\n        ctx.restore();\n      }\n    };\n\n    return [{ anchor: anchor, bboxes: [bbox], draw: draw }];\n  }\n}\n\nconst mergeBbox = (b1: Bbox, b2: Bbox) => {\n  return {\n    minX: Math.min(b1.minX, b2.minX),\n    minY: Math.min(b1.minY, b2.minY),\n    maxX: Math.max(b1.maxX, b2.maxX),\n    maxY: Math.max(b1.maxY, b2.maxY),\n  };\n};\n\nexport class GroupSymbolizer implements LabelSymbolizer {\n  list: LabelSymbolizer[];\n\n  constructor(list: LabelSymbolizer[]) {\n    this.list = list;\n  }\n\n  public place(layout: Layout, geom: Point[][], feature: Feature) {\n    const first = this.list[0];\n    if (!first) return undefined;\n    let labels = first.place(layout, geom, feature);\n    if (!labels) return undefined;\n    let label = labels[0];\n    const anchor = label.anchor;\n    let bbox = label.bboxes[0];\n    const draws = [label.draw];\n\n    for (let i = 1; i < this.list.length; i++) {\n      labels = this.list[i].place(layout, geom, feature);\n      if (!labels) return undefined;\n      label = labels[0];\n      bbox = mergeBbox(bbox, label.bboxes[0]);\n      draws.push(label.draw);\n    }\n    const draw = (ctx: CanvasRenderingContext2D) => {\n      for (const d of draws) {\n        d(ctx);\n      }\n    };\n\n    return [{ anchor: anchor, bboxes: [bbox], draw: draw }];\n  }\n}\n\nexport class CenteredSymbolizer implements LabelSymbolizer {\n  symbolizer: LabelSymbolizer;\n\n  constructor(symbolizer: LabelSymbolizer) {\n    this.symbolizer = symbolizer;\n  }\n\n  public place(layout: Layout, geom: Point[][], feature: Feature) {\n    const a = geom[0][0];\n    const placed = this.symbolizer.place(layout, [[new Point(0, 0)]], feature);\n    if (!placed || placed.length === 0) return undefined;\n    const firstLabel = placed[0];\n    const bbox = firstLabel.bboxes[0];\n    const width = bbox.maxX - bbox.minX;\n    const height = bbox.maxY - bbox.minY;\n    const centered = {\n      minX: a.x - width / 2,\n      maxX: a.x + width / 2,\n      minY: a.y - height / 2,\n      maxY: a.y + height / 2,\n    };\n\n    const draw = (ctx: CanvasRenderingContext2D) => {\n      ctx.translate(-width / 2, height / 2 - bbox.maxY);\n      firstLabel.draw(ctx, { justify: Justify.Center });\n    };\n\n    return [{ anchor: a, bboxes: [centered], draw: draw }];\n  }\n}\n\nexport class Padding implements LabelSymbolizer {\n  symbolizer: LabelSymbolizer;\n  padding: NumberAttr;\n\n  constructor(padding: number, symbolizer: LabelSymbolizer) {\n    this.padding = new NumberAttr(padding, 0);\n    this.symbolizer = symbolizer;\n  }\n\n  public place(layout: Layout, geom: Point[][], feature: Feature) {\n    const placed = this.symbolizer.place(layout, geom, feature);\n    if (!placed || placed.length === 0) return undefined;\n    const padding = this.padding.get(layout.zoom, feature);\n    for (const label of placed) {\n      for (const bbox of label.bboxes) {\n        bbox.minX -= padding;\n        bbox.minY -= padding;\n        bbox.maxX += padding;\n        bbox.maxY += padding;\n      }\n    }\n    return placed;\n  }\n}\n\nexport interface TextSymbolizerOptions\n  extends FontAttrOptions,\n    TextAttrOptions {\n  fill?: AttrOption<string>;\n  stroke?: AttrOption<string>;\n  width?: AttrOption<number>;\n  lineHeight?: AttrOption<number>;\n  letterSpacing?: AttrOption<number>;\n  maxLineChars?: AttrOption<number>;\n  justify?: Justify;\n}\n\nexport class TextSymbolizer implements LabelSymbolizer {\n  font: FontAttr;\n  text: TextAttr;\n  fill: StringAttr;\n  stroke: StringAttr;\n  width: NumberAttr;\n  lineHeight: NumberAttr; // in ems\n  letterSpacing: NumberAttr; // in px\n  maxLineCodeUnits: NumberAttr;\n  justify?: Justify;\n\n  constructor(options: TextSymbolizerOptions) {\n    this.font = new FontAttr(options);\n    this.text = new TextAttr(options);\n\n    this.fill = new StringAttr(options.fill, \"black\");\n    this.stroke = new StringAttr(options.stroke, \"black\");\n    this.width = new NumberAttr(options.width, 0);\n    this.lineHeight = new NumberAttr(options.lineHeight, 1);\n    this.letterSpacing = new NumberAttr(options.letterSpacing, 0);\n    this.maxLineCodeUnits = new NumberAttr(options.maxLineChars, 15);\n    this.justify = options.justify;\n  }\n\n  public place(layout: Layout, geom: Point[][], feature: Feature) {\n    const property = this.text.get(layout.zoom, feature);\n    if (!property) return undefined;\n    const font = this.font.get(layout.zoom, feature);\n    layout.scratch.font = font;\n\n    const letterSpacing = this.letterSpacing.get(layout.zoom, feature);\n\n    // line breaking\n    const lines = linebreak(\n      property,\n      this.maxLineCodeUnits.get(layout.zoom, feature),\n    );\n    let longestLine = \"\";\n    let longestLineLen = 0;\n    for (const line of lines) {\n      if (line.length > longestLineLen) {\n        longestLineLen = line.length;\n        longestLine = line;\n      }\n    }\n\n    const metrics = layout.scratch.measureText(longestLine);\n    const width = metrics.width + letterSpacing * (longestLineLen - 1);\n\n    const ascent = metrics.actualBoundingBoxAscent;\n    const descent = metrics.actualBoundingBoxDescent;\n    const lineHeight =\n      (ascent + descent) * this.lineHeight.get(layout.zoom, feature);\n\n    const a = new Point(geom[0][0].x, geom[0][0].y);\n    const bbox = {\n      minX: a.x,\n      minY: a.y - ascent,\n      maxX: a.x + width,\n      maxY: a.y + descent + (lines.length - 1) * lineHeight,\n    };\n\n    // inside draw, the origin is the anchor\n    // and the anchor is the typographic baseline of the first line\n    const draw = (ctx: CanvasRenderingContext2D, extra?: DrawExtra) => {\n      ctx.globalAlpha = 1;\n      ctx.font = font;\n      ctx.fillStyle = this.fill.get(layout.zoom, feature);\n      const textStrokeWidth = this.width.get(layout.zoom, feature);\n\n      let y = 0;\n      for (const line of lines) {\n        let startX = 0;\n        if (\n          this.justify === Justify.Center ||\n          (extra && extra.justify === Justify.Center)\n        ) {\n          startX = (width - ctx.measureText(line).width) / 2;\n        } else if (\n          this.justify === Justify.Right ||\n          (extra && extra.justify === Justify.Right)\n        ) {\n          startX = width - ctx.measureText(line).width;\n        }\n        if (textStrokeWidth) {\n          ctx.lineWidth = textStrokeWidth * 2; // centered stroke\n          ctx.strokeStyle = this.stroke.get(layout.zoom, feature);\n          if (letterSpacing > 0) {\n            let xPos = startX;\n            for (const letter of line) {\n              ctx.strokeText(letter, xPos, y);\n              xPos += ctx.measureText(letter).width + letterSpacing;\n            }\n          } else {\n            ctx.strokeText(line, startX, y);\n          }\n        }\n        if (letterSpacing > 0) {\n          let xPos = startX;\n          for (const letter of line) {\n            ctx.fillText(letter, xPos, y);\n            xPos += ctx.measureText(letter).width + letterSpacing;\n          }\n        } else {\n          ctx.fillText(line, startX, y);\n        }\n        y += lineHeight;\n      }\n    };\n    return [{ anchor: a, bboxes: [bbox], draw: draw }];\n  }\n}\n\nexport class CenteredTextSymbolizer implements LabelSymbolizer {\n  centered: LabelSymbolizer;\n\n  constructor(options: TextSymbolizerOptions) {\n    this.centered = new CenteredSymbolizer(new TextSymbolizer(options));\n  }\n\n  public place(layout: Layout, geom: Point[][], feature: Feature) {\n    return this.centered.place(layout, geom, feature);\n  }\n}\n\nexport interface OffsetSymbolizerValues {\n  offsetX?: number;\n  offsetY?: number;\n  placements?: TextPlacements[];\n  justify?: Justify;\n}\n\nexport type DataDrivenOffsetSymbolizer = (\n  zoom: number,\n  feature: Feature,\n) => OffsetSymbolizerValues;\n\nexport interface OffsetSymbolizerOptions {\n  offsetX?: AttrOption<number>;\n  offsetY?: AttrOption<number>;\n  justify?: Justify;\n  placements?: TextPlacements[];\n  ddValues?: DataDrivenOffsetSymbolizer;\n}\n\nexport class OffsetSymbolizer implements LabelSymbolizer {\n  symbolizer: LabelSymbolizer;\n  offsetX: NumberAttr;\n  offsetY: NumberAttr;\n  justify?: Justify;\n  placements: TextPlacements[];\n  ddValues: DataDrivenOffsetSymbolizer;\n\n  constructor(symbolizer: LabelSymbolizer, options: OffsetSymbolizerOptions) {\n    this.symbolizer = symbolizer;\n    this.offsetX = new NumberAttr(options.offsetX, 0);\n    this.offsetY = new NumberAttr(options.offsetY, 0);\n    this.justify = options.justify ?? undefined;\n    this.placements = options.placements ?? [\n      TextPlacements.Ne,\n      TextPlacements.Sw,\n      TextPlacements.Nw,\n      TextPlacements.Se,\n      TextPlacements.N,\n      TextPlacements.E,\n      TextPlacements.S,\n      TextPlacements.W,\n    ];\n    this.ddValues =\n      options.ddValues ??\n      (() => {\n        return {};\n      });\n  }\n\n  public place(layout: Layout, geom: Point[][], feature: Feature) {\n    if (feature.geomType !== GeomType.Point) return undefined;\n    const anchor = geom[0][0];\n    const placed = this.symbolizer.place(layout, [[new Point(0, 0)]], feature);\n    if (!placed || placed.length === 0) return undefined;\n    const firstLabel = placed[0];\n    const fb = firstLabel.bboxes[0];\n\n    // Overwrite options values via the data driven function if exists\n    let offsetXvalue = this.offsetX;\n    let offsetYvalue = this.offsetY;\n    let justifyValue = this.justify;\n    let placements = this.placements;\n    const {\n      offsetX: ddOffsetX,\n      offsetY: ddOffsetY,\n      justify: ddJustify,\n      placements: ddPlacements,\n    } = this.ddValues(layout.zoom, feature) || {};\n    if (ddOffsetX) offsetXvalue = new NumberAttr(ddOffsetX, 0);\n    if (ddOffsetY) offsetYvalue = new NumberAttr(ddOffsetY, 0);\n    if (ddJustify) justifyValue = ddJustify;\n    if (ddPlacements) placements = ddPlacements;\n\n    const offsetX = offsetXvalue.get(layout.zoom, feature);\n    const offsetY = offsetYvalue.get(layout.zoom, feature);\n\n    const getBbox = (a: Point, o: Point) => {\n      return {\n        minX: a.x + o.x + fb.minX,\n        minY: a.y + o.y + fb.minY,\n        maxX: a.x + o.x + fb.maxX,\n        maxY: a.y + o.y + fb.maxY,\n      };\n    };\n\n    let origin = new Point(offsetX, offsetY);\n    let justify: Justify;\n    const draw = (ctx: CanvasRenderingContext2D) => {\n      ctx.translate(origin.x, origin.y);\n      firstLabel.draw(ctx, { justify: justify });\n    };\n\n    const placeLabelInPoint = (a: Point, o: Point) => {\n      const bbox = getBbox(a, o);\n      if (!layout.index.bboxCollides(bbox, layout.order))\n        return [{ anchor: anchor, bboxes: [bbox], draw: draw }];\n    };\n\n    for (const placement of placements) {\n      const xAxisOffset = this.computeXaxisOffset(offsetX, fb, placement);\n      const yAxisOffset = this.computeYaxisOffset(offsetY, fb, placement);\n      justify = this.computeJustify(justifyValue, placement);\n      origin = new Point(xAxisOffset, yAxisOffset);\n      return placeLabelInPoint(anchor, origin);\n    }\n\n    return undefined;\n  }\n\n  computeXaxisOffset(offsetX: number, fb: Bbox, placement: TextPlacements) {\n    const labelWidth = fb.maxX;\n    const labelHalfWidth = labelWidth / 2;\n    if ([TextPlacements.N, TextPlacements.S].includes(placement))\n      return offsetX - labelHalfWidth;\n    if (\n      [TextPlacements.Nw, TextPlacements.W, TextPlacements.Sw].includes(\n        placement,\n      )\n    )\n      return offsetX - labelWidth;\n    return offsetX;\n  }\n\n  computeYaxisOffset(offsetY: number, fb: Bbox, placement: TextPlacements) {\n    const labelHalfHeight = Math.abs(fb.minY);\n    const labelBottom = fb.maxY;\n    const labelCenterHeight = (fb.minY + fb.maxY) / 2;\n    if ([TextPlacements.E, TextPlacements.W].includes(placement))\n      return offsetY - labelCenterHeight;\n    if (\n      [TextPlacements.Nw, TextPlacements.Ne, TextPlacements.N].includes(\n        placement,\n      )\n    )\n      return offsetY - labelBottom;\n    if (\n      [TextPlacements.Sw, TextPlacements.Se, TextPlacements.S].includes(\n        placement,\n      )\n    )\n      return offsetY + labelHalfHeight;\n    return offsetY;\n  }\n\n  computeJustify(fixedJustify: Justify | undefined, placement: TextPlacements) {\n    if (fixedJustify) return fixedJustify;\n    if ([TextPlacements.N, TextPlacements.S].includes(placement))\n      return Justify.Center;\n    if (\n      [TextPlacements.Ne, TextPlacements.E, TextPlacements.Se].includes(\n        placement,\n      )\n    )\n      return Justify.Left;\n    return Justify.Right;\n  }\n}\n\nexport class OffsetTextSymbolizer implements LabelSymbolizer {\n  symbolizer: LabelSymbolizer;\n\n  constructor(options: OffsetSymbolizerOptions & TextSymbolizerOptions) {\n    this.symbolizer = new OffsetSymbolizer(\n      new TextSymbolizer(options),\n      options,\n    );\n  }\n\n  public place(layout: Layout, geom: Point[][], feature: Feature) {\n    return this.symbolizer.place(layout, geom, feature);\n  }\n}\n\nexport enum LineLabelPlacement {\n  Above = 1,\n  Center = 2,\n  Below = 3,\n}\n\nexport class LineLabelSymbolizer implements LabelSymbolizer {\n  font: FontAttr;\n  text: TextAttr;\n\n  fill: StringAttr;\n  stroke: StringAttr;\n  width: NumberAttr;\n  offset: NumberAttr;\n  position: LineLabelPlacement;\n  maxLabelCodeUnits: NumberAttr;\n  repeatDistance: NumberAttr;\n\n  constructor(\n    options: {\n      radius?: AttrOption<number>;\n      fill?: AttrOption<string>;\n      stroke?: AttrOption<string>;\n      width?: AttrOption<number>;\n      offset?: AttrOption<number>;\n      maxLabelChars?: AttrOption<number>;\n      repeatDistance?: AttrOption<number>;\n      position?: LineLabelPlacement;\n    } & TextAttrOptions &\n      FontAttrOptions,\n  ) {\n    this.font = new FontAttr(options);\n    this.text = new TextAttr(options);\n\n    this.fill = new StringAttr(options.fill, \"black\");\n    this.stroke = new StringAttr(options.stroke, \"black\");\n    this.width = new NumberAttr(options.width, 0);\n    this.offset = new NumberAttr(options.offset, 0);\n    this.position = options.position ?? LineLabelPlacement.Above;\n    this.maxLabelCodeUnits = new NumberAttr(options.maxLabelChars, 40);\n    this.repeatDistance = new NumberAttr(options.repeatDistance, 250);\n  }\n\n  public place(layout: Layout, geom: Point[][], feature: Feature) {\n    const name = this.text.get(layout.zoom, feature);\n    if (!name) return undefined;\n    if (name.length > this.maxLabelCodeUnits.get(layout.zoom, feature))\n      return undefined;\n\n    const minLabelableDim = 20;\n    const fbbox = feature.bbox;\n    if (\n      fbbox.maxY - fbbox.minY < minLabelableDim &&\n      fbbox.maxX - fbbox.minX < minLabelableDim\n    )\n      return undefined;\n\n    const font = this.font.get(layout.zoom, feature);\n    layout.scratch.font = font;\n    const metrics = layout.scratch.measureText(name);\n    const width = metrics.width;\n    const height =\n      metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent;\n\n    let repeatDistance = this.repeatDistance.get(layout.zoom, feature);\n    if (layout.overzoom > 4) repeatDistance *= 1 << (layout.overzoom - 4);\n\n    const cellSize = height * 2;\n\n    const labelCandidates = simpleLabel(geom, width, repeatDistance, cellSize);\n    if (labelCandidates.length === 0) return undefined;\n\n    const labels = [];\n    for (const candidate of labelCandidates) {\n      const dx = candidate.end.x - candidate.start.x;\n      const dy = candidate.end.y - candidate.start.y;\n\n      const cells = lineCells(\n        candidate.start,\n        candidate.end,\n        width,\n        cellSize / 2,\n      );\n      const bboxes = cells.map((c) => {\n        return {\n          minX: c.x - cellSize / 2,\n          minY: c.y - cellSize / 2,\n          maxX: c.x + cellSize / 2,\n          maxY: c.y + cellSize / 2,\n        };\n      });\n\n      const draw = (ctx: CanvasRenderingContext2D) => {\n        ctx.globalAlpha = 1;\n        // ctx.beginPath();\n        // ctx.moveTo(0, 0);\n        // ctx.lineTo(dx, dy);\n        // ctx.strokeStyle = \"red\";\n        // ctx.stroke();\n        ctx.rotate(Math.atan2(dy, dx));\n        if (dx < 0) {\n          ctx.scale(-1, -1);\n          ctx.translate(-width, 0);\n        }\n        let heightPlacement = 0;\n        if (this.position === LineLabelPlacement.Below)\n          heightPlacement += height;\n        else if (this.position === LineLabelPlacement.Center)\n          heightPlacement += height / 2;\n        ctx.translate(\n          0,\n          heightPlacement - this.offset.get(layout.zoom, feature),\n        );\n        ctx.font = font;\n        const lineWidth = this.width.get(layout.zoom, feature);\n        if (lineWidth) {\n          ctx.lineWidth = lineWidth;\n          ctx.strokeStyle = this.stroke.get(layout.zoom, feature);\n          ctx.strokeText(name, 0, 0);\n        }\n        ctx.fillStyle = this.fill.get(layout.zoom, feature);\n        ctx.fillText(name, 0, 0);\n      };\n      labels.push({\n        anchor: candidate.start,\n        bboxes: bboxes,\n        draw: draw,\n        deduplicationKey: name,\n        deduplicationDistance: repeatDistance,\n      });\n    }\n\n    return labels;\n  }\n}\n","import { type Flavor } from \"@protomaps/basemaps\";\nimport { mix } from \"color2k\";\nimport { LabelRule } from \"../labeler\";\nimport { PaintRule } from \"../painter\";\nimport {\n  CenteredTextSymbolizer,\n  CircleSymbolizer,\n  GroupSymbolizer,\n  LineLabelSymbolizer,\n  LineSymbolizer,\n  OffsetTextSymbolizer,\n  PolygonSymbolizer,\n  exp,\n  linear,\n} from \"../symbolizer\";\nimport { Feature, GeomType, JsonObject } from \"../tilecache\";\n\nconst getString = (props: JsonObject, key: string): string => {\n  const val = props[key];\n  if (typeof val === \"string\") return val;\n  return \"\";\n};\n\nconst getNumber = (props: JsonObject, key: string): number => {\n  const val = props[key];\n  if (typeof val === \"number\") return val;\n  return 0;\n};\n\nexport const paintRules = (t: Flavor): PaintRule[] => {\n  return [\n    {\n      dataLayer: \"earth\",\n      symbolizer: new PolygonSymbolizer({\n        fill: t.earth,\n      }),\n    },\n    ...(t.landcover\n      ? [\n          {\n            dataLayer: \"landcover\",\n            symbolizer: new PolygonSymbolizer({\n              fill: (z, f) => {\n                const landcover = t.landcover;\n                if (!landcover || !f) return \"\";\n                const kind = getString(f.props, \"kind\");\n                if (kind === \"grassland\") return landcover.grassland;\n                if (kind === \"barren\") return landcover.barren;\n                if (kind === \"urban_area\") return landcover.urban_area;\n                if (kind === \"farmland\") return landcover.farmland;\n                if (kind === \"glacier\") return landcover.glacier;\n                if (kind === \"scrub\") return landcover.scrub;\n                return landcover.forest;\n              },\n              opacity: (z, f) => {\n                if (z === 8) return 0.5;\n                return 1;\n              },\n            }),\n          },\n        ]\n      : []),\n    {\n      dataLayer: \"landuse\",\n      symbolizer: new PolygonSymbolizer({\n        fill: (z, f) => {\n          return mix(t.park_a, t.park_b, Math.min(Math.max(z / 12.0, 12), 0));\n        },\n      }),\n      filter: (z, f) => {\n        const kind = getString(f.props, \"kind\");\n        return [\"allotments\", \"village_green\", \"playground\"].includes(kind);\n      },\n    },\n    {\n      dataLayer: \"landuse\",\n      symbolizer: new PolygonSymbolizer({\n        fill: t.park_b,\n        opacity: (z, f) => {\n          if (z < 8) return 0;\n          if (z === 8) return 0.5;\n          return 1;\n        },\n      }),\n      filter: (z, f) => {\n        const kind = getString(f.props, \"kind\");\n        return [\n          \"national_park\",\n          \"park\",\n          \"cemetery\",\n          \"protected_area\",\n          \"nature_reserve\",\n          \"forest\",\n          \"golf_course\",\n        ].includes(kind);\n      },\n    },\n    {\n      dataLayer: \"landuse\",\n      symbolizer: new PolygonSymbolizer({\n        fill: t.hospital,\n      }),\n      filter: (z, f) => {\n        return f.props.kind === \"hospital\";\n      },\n    },\n    {\n      dataLayer: \"landuse\",\n      symbolizer: new PolygonSymbolizer({\n        fill: t.industrial,\n      }),\n      filter: (z, f) => {\n        return f.props.kind === \"industrial\";\n      },\n    },\n    {\n      dataLayer: \"landuse\",\n      symbolizer: new PolygonSymbolizer({\n        fill: t.school,\n      }),\n      filter: (z, f) => {\n        const kind = getString(f.props, \"kind\");\n        return [\"school\", \"university\", \"college\"].includes(kind);\n      },\n    },\n    {\n      dataLayer: \"landuse\",\n      symbolizer: new PolygonSymbolizer({\n        fill: t.beach,\n      }),\n      filter: (z, f) => {\n        return f.props.kind === \"beach\";\n      },\n    },\n    {\n      dataLayer: \"landuse\",\n      symbolizer: new PolygonSymbolizer({\n        fill: t.zoo,\n      }),\n      filter: (z, f) => {\n        return f.props.kind === \"zoo\";\n      },\n    },\n    {\n      dataLayer: \"landuse\",\n      symbolizer: new PolygonSymbolizer({\n        fill: t.zoo,\n      }),\n      filter: (z, f) => {\n        const kind = getString(f.props, \"kind\");\n        return [\"military\", \"naval_base\", \"airfield\"].includes(kind);\n      },\n    },\n    {\n      dataLayer: \"landuse\",\n      symbolizer: new PolygonSymbolizer({\n        fill: (z, f) => {\n          return mix(t.wood_a, t.wood_b, Math.min(Math.max(z / 12.0, 12), 0));\n        },\n        opacity: (z, f) => {\n          if (z < 8) return 0;\n          if (z === 8) return 0.5;\n          return 1;\n        },\n      }),\n      filter: (z, f) => {\n        const kind = getString(f.props, \"kind\");\n        return [\"wood\", \"nature_reserve\", \"forest\"].includes(kind);\n      },\n    },\n    {\n      dataLayer: \"landuse\",\n      symbolizer: new PolygonSymbolizer({\n        fill: (z, f) => {\n          return mix(t.scrub_a, t.scrub_b, Math.min(Math.max(z / 12.0, 12), 0));\n        },\n      }),\n      filter: (z, f) => {\n        const kind = getString(f.props, \"kind\");\n        return [\"scrub\", \"grassland\", \"grass\"].includes(kind);\n      },\n    },\n    {\n      dataLayer: \"landuse\",\n      symbolizer: new PolygonSymbolizer({\n        fill: t.scrub_b,\n      }),\n      filter: (z, f) => {\n        const kind = getString(f.props, \"kind\");\n        return [\"scrub\", \"grassland\", \"grass\"].includes(kind);\n      },\n    },\n    {\n      dataLayer: \"landuse\",\n      symbolizer: new PolygonSymbolizer({\n        fill: t.glacier,\n      }),\n      filter: (z, f) => {\n        return f.props.kind === \"glacier\";\n      },\n    },\n    {\n      dataLayer: \"landuse\",\n      symbolizer: new PolygonSymbolizer({\n        fill: t.sand,\n        opacity: (z, f) => {\n          if (z < 8) return 0;\n          if (z === 8) return 0.5;\n          return 1;\n        },\n      }),\n      filter: (z, f) => {\n        return f.props.kind === \"sand\";\n      },\n    },\n    {\n      dataLayer: \"landuse\",\n      symbolizer: new PolygonSymbolizer({\n        fill: t.aerodrome,\n      }),\n      filter: (z, f) => {\n        return f.props.kind === \"aerodrome\";\n      },\n    },\n    {\n      dataLayer: \"water\",\n      symbolizer: new PolygonSymbolizer({\n        fill: t.water,\n      }),\n      filter: (z, f) => {\n        return f.geomType === GeomType.Polygon;\n      },\n    },\n    {\n      dataLayer: \"roads\",\n      symbolizer: new LineSymbolizer({\n        color: t.runway,\n        width: (z, f) => {\n          return exp(1.6, [\n            [11, 0],\n            [13, 4],\n            [19, 30],\n          ])(z);\n        },\n      }),\n      filter: (z, f) => {\n        return f.props.kind_detail === \"runway\";\n      },\n    },\n    {\n      dataLayer: \"roads\",\n      symbolizer: new LineSymbolizer({\n        color: t.runway,\n        width: (z, f) => {\n          return exp(1.6, [\n            [14, 0],\n            [14.5, 1],\n            [16, 6],\n          ])(z);\n        },\n      }),\n      filter: (z, f) => {\n        return f.props.kind_detail === \"taxiway\";\n      },\n    },\n    {\n      dataLayer: \"roads\",\n      symbolizer: new LineSymbolizer({\n        color: t.pier,\n        width: (z, f) => {\n          return exp(1.6, [\n            [13, 0],\n            [13.5, 0, 5],\n            [21, 16],\n          ])(z);\n        },\n      }),\n      filter: (z, f) => {\n        return f.props.kind === \"path\" && f.props.kind_detail === \"pier\";\n      },\n    },\n    {\n      dataLayer: \"water\",\n      minzoom: 14,\n      symbolizer: new LineSymbolizer({\n        color: t.water,\n        width: (z, f) => {\n          return exp(1.6, [\n            [9, 0],\n            [9.5, 1.0],\n            [18, 12],\n          ])(z);\n        },\n      }),\n      filter: (z, f) => {\n        return f.geomType === GeomType.Line && f.props.kind === \"river\";\n      },\n    },\n    {\n      dataLayer: \"water\",\n      minzoom: 14,\n      symbolizer: new LineSymbolizer({\n        color: t.water,\n        width: 0.5,\n      }),\n      filter: (z, f) => {\n        return f.geomType === GeomType.Line && f.props.kind === \"stream\";\n      },\n    },\n    {\n      dataLayer: \"landuse\",\n      symbolizer: new PolygonSymbolizer({\n        fill: t.pedestrian,\n      }),\n      filter: (z, f) => {\n        return f.props.kind === \"pedestrian\";\n      },\n    },\n    {\n      dataLayer: \"landuse\",\n      symbolizer: new PolygonSymbolizer({\n        fill: t.pier,\n      }),\n      filter: (z, f) => {\n        return f.props.kind === \"pier\";\n      },\n    },\n    {\n      dataLayer: \"buildings\",\n      symbolizer: new PolygonSymbolizer({\n        fill: t.buildings,\n        opacity: 0.5,\n      }),\n    },\n    {\n      dataLayer: \"roads\",\n      symbolizer: new LineSymbolizer({\n        color: t.major,\n        width: (z, f) => {\n          return exp(1.6, [\n            [14, 0],\n            [20, 7],\n          ])(z);\n        },\n      }),\n      filter: (z, f) => {\n        const kind = getString(f.props, \"kind\");\n        return [\"other\", \"path\"].includes(kind);\n      },\n    },\n    {\n      dataLayer: \"roads\",\n      symbolizer: new LineSymbolizer({\n        color: t.major,\n        width: (z, f) => {\n          return exp(1.6, [\n            [13, 0],\n            [18, 8],\n          ])(z);\n        },\n      }),\n      filter: (z, f) => {\n        return f.props.kind === \"minor_road\";\n      },\n    },\n    {\n      dataLayer: \"roads\",\n      symbolizer: new LineSymbolizer({\n        color: t.major,\n        width: (z, f) => {\n          return exp(1.6, [\n            [6, 0],\n            [12, 1.6],\n            [15, 3],\n            [18, 13],\n          ])(z);\n        },\n      }),\n      filter: (z, f) => {\n        return f.props.kind === \"major_road\";\n      },\n    },\n    {\n      dataLayer: \"roads\",\n      symbolizer: new LineSymbolizer({\n        color: t.major,\n        width: (z, f) => {\n          return exp(1.6, [\n            [3, 0],\n            [6, 1.1],\n            [12, 1.6],\n            [15, 5],\n            [18, 15],\n          ])(z);\n        },\n      }),\n      filter: (z, f) => {\n        return f.props.kind === \"highway\";\n      },\n    },\n    {\n      dataLayer: \"boundaries\",\n      symbolizer: new LineSymbolizer({\n        color: t.boundaries,\n        width: 1,\n      }),\n      filter: (z, f) => {\n        const minAdminLevel = f.props.kind_detail;\n        return typeof minAdminLevel === \"number\" && minAdminLevel <= 2;\n      },\n    },\n    {\n      dataLayer: \"roads\",\n      symbolizer: new LineSymbolizer({\n        dash: [0.3, 0.75],\n        color: t.railway,\n        dashWidth: (z, f) => {\n          return exp(1.6, [\n            [4, 0],\n            [7, 0.15],\n            [19, 9],\n          ])(z);\n        },\n        opacity: 0.5,\n      }),\n      filter: (z, f) => {\n        return f.props.kind === \"rail\";\n      },\n    },\n    {\n      dataLayer: \"boundaries\",\n      symbolizer: new LineSymbolizer({\n        color: t.boundaries,\n        width: 0.5,\n      }),\n      filter: (z, f) => {\n        const minAdminLevel = f.props.kind_detail;\n        return typeof minAdminLevel === \"number\" && minAdminLevel > 2;\n      },\n    },\n  ];\n};\n\nexport const labelRules = (t: Flavor, lang: string): LabelRule[] => {\n  const nametags = [`name:${lang}`, \"name\"];\n\n  return [\n    // {\n    //   id: \"neighbourhood\",\n    //   dataLayer: \"places\",\n    //   symbolizer: languageStack(\n    //     new CenteredTextSymbolizer({\n    //       labelProps: nametags,\n    //       fill: params.neighbourhoodLabel,\n    //       font: \"500 10px sans-serif\",\n    //       textTransform: \"uppercase\",\n    //     }),\n    //     params.neighbourhoodLabel,\n    //   ),\n    //   filter: (z, f) => {\n    //     return f.props[\"kind\"] === \"neighbourhood\";\n    //   },\n    // },\n    {\n      dataLayer: \"roads\",\n      symbolizer: new LineLabelSymbolizer({\n        labelProps: nametags,\n        fill: t.roads_label_minor,\n        font: \"400 12px sans-serif\",\n        width: 2,\n        stroke: t.roads_label_minor_halo,\n      }),\n      // TODO: sort by minzoom\n      minzoom: 16,\n      filter: (z, f) => {\n        const kind = getString(f.props, \"kind\");\n        return [\"minor_road\", \"other\", \"path\"].includes(kind);\n      },\n    },\n    {\n      dataLayer: \"roads\",\n      symbolizer: new LineLabelSymbolizer({\n        labelProps: nametags,\n        fill: t.roads_label_major,\n        font: \"400 12px sans-serif\",\n        width: 2,\n        stroke: t.roads_label_major_halo,\n      }),\n      // TODO: sort by minzoom\n      minzoom: 12,\n      filter: (z, f) => {\n        const kind = getString(f.props, \"kind\");\n        return [\"highway\", \"major_road\"].includes(kind);\n      },\n    },\n    {\n      dataLayer: \"roads\",\n      symbolizer: new LineLabelSymbolizer({\n        labelProps: nametags,\n        fill: t.roads_label_major,\n        font: \"400 12px sans-serif\",\n        width: 2,\n        stroke: t.roads_label_major_halo,\n      }),\n      // TODO: sort by minzoom\n      minzoom: 12,\n      filter: (z, f) => {\n        const kind = getString(f.props, \"kind\");\n        return [\"highway\", \"major_road\"].includes(kind);\n      },\n    },\n    {\n      dataLayer: \"water\",\n      symbolizer: new CenteredTextSymbolizer({\n        labelProps: nametags,\n        fill: t.ocean_label,\n        lineHeight: 1.5,\n        letterSpacing: 1,\n        font: (z, f) => {\n          const size = linear([\n            [3, 10],\n            [10, 12],\n          ])(z);\n          return `400 ${size}px sans-serif`;\n        },\n        textTransform: \"uppercase\",\n      }),\n      filter: (z, f) => {\n        const kind = getString(f.props, \"kind\");\n        return (\n          f.geomType === GeomType.Point &&\n          [\"ocean\", \"bay\", \"strait\", \"fjord\"].includes(kind)\n        );\n      },\n    },\n    {\n      dataLayer: \"water\",\n      symbolizer: new CenteredTextSymbolizer({\n        labelProps: nametags,\n        fill: t.ocean_label,\n        lineHeight: 1.5,\n        letterSpacing: 1,\n        font: (z, f) => {\n          const size = linear([\n            [3, 10],\n            [6, 12],\n            [10, 12],\n          ])(z);\n          return `400 ${size}px sans-serif`;\n        },\n      }),\n      filter: (z, f) => {\n        const kind = getString(f.props, \"kind\");\n        return (\n          f.geomType === GeomType.Point &&\n          [\"sea\", \"lake\", \"water\"].includes(kind)\n        );\n      },\n    },\n    {\n      dataLayer: \"places\",\n      symbolizer: new CenteredTextSymbolizer({\n        labelProps: (z, f) => {\n          if (z < 6) {\n            return [`ref:${lang}`, \"ref\"];\n          }\n          return nametags;\n        },\n        fill: t.state_label,\n        stroke: t.state_label_halo,\n        width: 1,\n        lineHeight: 1.5,\n        font: (z: number, f?: Feature) => {\n          return \"400 12px sans-serif\";\n        },\n        textTransform: \"uppercase\",\n      }),\n      filter: (z, f) => {\n        return f.props.kind === \"region\";\n      },\n    },\n    {\n      dataLayer: \"places\",\n      symbolizer: new CenteredTextSymbolizer({\n        labelProps: nametags,\n        fill: t.country_label,\n        lineHeight: 1.5,\n        font: (z: number, f?: Feature) => {\n          if (z < 6) return \"600 12px sans-serif\";\n          return \"600 12px sans-serif\";\n        },\n        textTransform: \"uppercase\",\n      }),\n      filter: (z, f) => {\n        return f.props.kind === \"country\";\n      },\n    },\n    {\n      // places_locality\n      dataLayer: \"places\",\n      minzoom: 9,\n      symbolizer: new CenteredTextSymbolizer({\n        labelProps: nametags,\n        fill: t.city_label,\n        lineHeight: 1.5,\n        font: (z: number, f?: Feature) => {\n          if (!f) return \"400 12px sans-serif\";\n          const minZoom = f.props.min_zoom;\n          let weight = 400;\n          if (minZoom && minZoom <= 5) {\n            weight = 600;\n          }\n          let size = 12;\n          const popRank = f.props.population_rank;\n          if (popRank && popRank > 9) {\n            size = 16;\n          }\n          return `${weight} ${size}px sans-serif`;\n        },\n      }),\n      sort: (a, b) => {\n        const aRank = getNumber(a, \"min_zoom\");\n        const bRank = getNumber(b, \"min_zoom\");\n        return aRank - bRank;\n      },\n      filter: (z, f) => {\n        return f.props.kind === \"locality\";\n      },\n    },\n    {\n      dataLayer: \"places\",\n      maxzoom: 8,\n      symbolizer: new GroupSymbolizer([\n        new CircleSymbolizer({\n          radius: 2,\n          fill: t.city_label,\n          stroke: t.city_label_halo,\n          width: 1.5,\n        }),\n        new OffsetTextSymbolizer({\n          labelProps: nametags,\n          fill: t.city_label,\n          stroke: t.city_label_halo,\n          width: 1,\n          offsetX: 6,\n          offsetY: 4.5,\n          font: (z, f) => {\n            return \"400 12px sans-serif\";\n          },\n        }),\n      ]),\n      filter: (z, f) => {\n        return f.props.kind === \"locality\";\n      },\n    },\n  ];\n};\n","import Point from \"@mapbox/point-geometry\";\nimport { PMTiles } from \"pmtiles\";\nimport {\n  Bbox,\n  Feature,\n  PmtilesSource,\n  TileCache,\n  TileSource,\n  Zxy,\n  ZxySource,\n} from \"./tilecache\";\n\n/*\n * PreparedTile\n * For a given display Z:\n * layers: map of names-> features with coordinates in CSS pixel units.\n * translate: how to get layers coordinates to global Z coordinates.\n * dataTile: the Z,X,Y of the data tile.\n * window? if present, use as bounding box or canvas clipping area.\n */\nexport interface PreparedTile {\n  z: number; // the display zoom level that it is for\n  origin: Point; // the top-left corner in global CSS pixel coordinates\n  data: Map<string, Feature[]>; // return a map to Iterable\n  scale: number; // over or underzooming scale\n  dim: number; // the effective size of this tile on the zoom level\n  dataTile: Zxy; // the key of the raw tile\n}\n\nexport interface TileTransform {\n  dataTile: Zxy;\n  origin: Point;\n  scale: number;\n  dim: number;\n}\n\n// TODO make this lazy\nexport const transformGeom = (\n  geom: Array<Array<Point>>,\n  scale: number,\n  translate: Point,\n) => {\n  const retval = [];\n  for (const arr of geom) {\n    const loop = [];\n    for (const coord of arr) {\n      loop.push(coord.clone().mult(scale).add(translate));\n    }\n    retval.push(loop);\n  }\n  return retval;\n};\n\nexport const wrap = (val: number, z: number) => {\n  const dim = 1 << z;\n  if (val < 0) return dim + val;\n  if (val >= dim) return val % dim;\n  return val;\n};\n\n/*\n * @class View\n * expresses relationship between canvas coordinates and data tiles.\n */\nexport class View {\n  levelDiff: number;\n  tileCache: TileCache;\n  maxDataLevel: number;\n\n  constructor(tileCache: TileCache, maxDataLevel: number, levelDiff: number) {\n    this.tileCache = tileCache;\n    this.maxDataLevel = maxDataLevel;\n    this.levelDiff = levelDiff;\n  }\n\n  public dataTilesForBounds(\n    displayZoom: number,\n    bounds: Bbox,\n  ): Array<TileTransform> {\n    const fractional = 2 ** displayZoom / 2 ** Math.ceil(displayZoom);\n    const needed = [];\n    let scale = 1;\n    const dim = this.tileCache.tileSize;\n    if (displayZoom < this.levelDiff) {\n      scale = (1 / (1 << (this.levelDiff - displayZoom))) * fractional;\n      needed.push({\n        dataTile: { z: 0, x: 0, y: 0 },\n        origin: new Point(0, 0),\n        scale: scale,\n        dim: dim * scale,\n      });\n    } else if (displayZoom <= this.levelDiff + this.maxDataLevel) {\n      const f = 1 << this.levelDiff;\n\n      const basetileSize = 256 * fractional;\n\n      const dataZoom = Math.ceil(displayZoom) - this.levelDiff;\n\n      const mintileX = Math.floor(bounds.minX / f / basetileSize);\n      const mintileY = Math.floor(bounds.minY / f / basetileSize);\n      const maxtileX = Math.floor(bounds.maxX / f / basetileSize);\n      const maxtileY = Math.floor(bounds.maxY / f / basetileSize);\n      for (let tx = mintileX; tx <= maxtileX; tx++) {\n        for (let ty = mintileY; ty <= maxtileY; ty++) {\n          const origin = new Point(\n            tx * f * basetileSize,\n            ty * f * basetileSize,\n          );\n          needed.push({\n            dataTile: {\n              z: dataZoom,\n              x: wrap(tx, dataZoom),\n              y: wrap(ty, dataZoom),\n            },\n            origin: origin,\n            scale: fractional,\n            dim: dim * fractional,\n          });\n        }\n      }\n    } else {\n      const f = 1 << this.levelDiff;\n      scale =\n        (1 << (Math.ceil(displayZoom) - this.maxDataLevel - this.levelDiff)) *\n        fractional;\n      const mintileX = Math.floor(bounds.minX / f / 256 / scale);\n      const mintileY = Math.floor(bounds.minY / f / 256 / scale);\n      const maxtileX = Math.floor(bounds.maxX / f / 256 / scale);\n      const maxtileY = Math.floor(bounds.maxY / f / 256 / scale);\n      for (let tx = mintileX; tx <= maxtileX; tx++) {\n        for (let ty = mintileY; ty <= maxtileY; ty++) {\n          const origin = new Point(tx * f * 256 * scale, ty * f * 256 * scale);\n          needed.push({\n            dataTile: {\n              z: this.maxDataLevel,\n              x: wrap(tx, this.maxDataLevel),\n              y: wrap(ty, this.maxDataLevel),\n            },\n            origin: origin,\n            scale: scale,\n            dim: dim * scale,\n          });\n        }\n      }\n    }\n    return needed;\n  }\n\n  public dataTileForDisplayTile(displayTile: Zxy): TileTransform {\n    let dataTile: Zxy;\n    let scale = 1;\n    let dim = this.tileCache.tileSize;\n    let origin: Point;\n    if (displayTile.z < this.levelDiff) {\n      dataTile = { z: 0, x: 0, y: 0 };\n      scale = 1 / (1 << (this.levelDiff - displayTile.z));\n      origin = new Point(0, 0);\n      dim = dim * scale;\n    } else if (displayTile.z <= this.levelDiff + this.maxDataLevel) {\n      const f = 1 << this.levelDiff;\n      dataTile = {\n        z: displayTile.z - this.levelDiff,\n        x: Math.floor(displayTile.x / f),\n        y: Math.floor(displayTile.y / f),\n      };\n      origin = new Point(dataTile.x * f * 256, dataTile.y * f * 256);\n    } else {\n      scale = 1 << (displayTile.z - this.maxDataLevel - this.levelDiff);\n      const f = 1 << this.levelDiff;\n      dataTile = {\n        z: this.maxDataLevel,\n        x: Math.floor(displayTile.x / f / scale),\n        y: Math.floor(displayTile.y / f / scale),\n      };\n      origin = new Point(\n        dataTile.x * f * scale * 256,\n        dataTile.y * f * scale * 256,\n      );\n      dim = dim * scale;\n    }\n    return { dataTile: dataTile, scale: scale, origin: origin, dim: dim };\n  }\n\n  public async getBbox(\n    displayZoom: number,\n    bounds: Bbox,\n  ): Promise<Array<PreparedTile>> {\n    const needed = this.dataTilesForBounds(displayZoom, bounds);\n    const result = await Promise.all(\n      needed.map((tt) => this.tileCache.get(tt.dataTile)),\n    );\n    return result.map((data, i) => {\n      const tt = needed[i];\n      return {\n        data: data,\n        z: displayZoom,\n        dataTile: tt.dataTile,\n        scale: tt.scale,\n        dim: tt.dim,\n        origin: tt.origin,\n      };\n    });\n  }\n\n  public async getDisplayTile(displayTile: Zxy): Promise<PreparedTile> {\n    const tt = this.dataTileForDisplayTile(displayTile);\n    const data = await this.tileCache.get(tt.dataTile);\n    return {\n      data: data,\n      z: displayTile.z,\n      dataTile: tt.dataTile,\n      scale: tt.scale,\n      origin: tt.origin,\n      dim: tt.dim,\n    };\n  }\n\n  public queryFeatures(\n    lng: number,\n    lat: number,\n    displayZoom: number,\n    brushSize: number,\n  ) {\n    const roundedZoom = Math.round(displayZoom);\n    const dataZoom = Math.min(roundedZoom - this.levelDiff, this.maxDataLevel);\n    const brushSizeAtZoom = brushSize / (1 << (roundedZoom - dataZoom));\n    return this.tileCache.queryFeatures(lng, lat, dataZoom, brushSizeAtZoom);\n  }\n}\n\nexport interface SourceOptions {\n  levelDiff?: number;\n  maxDataZoom?: number;\n  url?: PMTiles | string;\n  sources?: Record<string, SourceOptions>;\n}\n\nexport const sourcesToViews = (options: SourceOptions) => {\n  const sourceToViews = (o: SourceOptions): View => {\n    const levelDiff = o.levelDiff === undefined ? 1 : o.levelDiff;\n    const maxDataZoom = o.maxDataZoom || 15;\n    let source: TileSource;\n    if (typeof o.url === \"string\") {\n      if (new URL(o.url, \"http://example.com\").pathname.endsWith(\".pmtiles\")) {\n        source = new PmtilesSource(o.url, true);\n      } else {\n        source = new ZxySource(o.url, true);\n      }\n    } else if (o.url) {\n      source = new PmtilesSource(o.url, true);\n    } else {\n      throw new Error(`Invalid source ${o.url}`);\n    }\n\n    const cache = new TileCache(source, (256 * 1) << levelDiff);\n    return new View(cache, maxDataZoom, levelDiff);\n  };\n\n  const sources = new Map<string, View>();\n  if (options.sources) {\n    for (const key in options.sources) {\n      sources.set(key, sourceToViews(options.sources[key]));\n    }\n  } else {\n    sources.set(\"\", sourceToViews(options));\n  }\n  return sources;\n};\n","import Point from \"@mapbox/point-geometry\";\nimport rBush from \"rbush\";\nimport { Filter } from \"./painter\";\nimport { DrawExtra, LabelSymbolizer } from \"./symbolizer\";\nimport { Bbox, JsonObject, toIndex } from \"./tilecache\";\nimport { PreparedTile, transformGeom } from \"./view\";\n\ntype TileInvalidationCallback = (tiles: Set<string>) => void;\n\n// the anchor should be contained within, or on the boundary of,\n// one of the bounding boxes. This is not enforced by library,\n// but is required for label deduplication.\nexport interface Label {\n  anchor: Point;\n  bboxes: Bbox[];\n  draw: (ctx: CanvasRenderingContext2D, drawExtra?: DrawExtra) => void;\n  deduplicationKey?: string;\n  deduplicationDistance?: number;\n}\n\nexport interface IndexedLabel {\n  anchor: Point;\n  bboxes: Bbox[];\n  draw: (ctx: CanvasRenderingContext2D) => void;\n  order: number;\n  tileKey: string;\n  deduplicationKey?: string;\n  deduplicationDistance?: number;\n}\n\ntype TreeItem = Bbox & { indexedLabel: IndexedLabel };\n\nexport interface Layout {\n  index: Index;\n  order: number;\n  scratch: CanvasRenderingContext2D;\n  zoom: number;\n  overzoom: number;\n}\n\nexport interface LabelRule {\n  id?: string;\n  minzoom?: number;\n  maxzoom?: number;\n  dataSource?: string;\n  dataLayer: string;\n  symbolizer: LabelSymbolizer;\n  filter?: Filter;\n  visible?: boolean;\n  sort?: (a: JsonObject, b: JsonObject) => number;\n}\n\nexport const covering = (\n  displayZoom: number,\n  tileWidth: number,\n  bbox: Bbox,\n) => {\n  const res = 256;\n  const f = tileWidth / res;\n\n  const minx = Math.floor(bbox.minX / res);\n  const miny = Math.floor(bbox.minY / res);\n  const maxx = Math.floor(bbox.maxX / res);\n  const maxy = Math.floor(bbox.maxY / res);\n  const leveldiff = Math.log2(f);\n\n  const retval = [];\n  for (let x = minx; x <= maxx; x++) {\n    const wrappedX = x % (1 << displayZoom);\n    for (let y = miny; y <= maxy; y++) {\n      retval.push({\n        display: toIndex({ z: displayZoom, x: wrappedX, y: y }),\n        key: toIndex({\n          z: displayZoom - leveldiff,\n          x: Math.floor(wrappedX / f),\n          y: Math.floor(y / f),\n        }),\n      });\n    }\n  }\n  return retval;\n};\n\nexport class Index {\n  tree: rBush<TreeItem>;\n  current: Map<string, Set<IndexedLabel>>;\n  dim: number;\n  maxLabeledTiles: number;\n\n  constructor(dim: number, maxLabeledTiles: number) {\n    this.tree = new rBush();\n    this.current = new Map();\n    this.dim = dim;\n    this.maxLabeledTiles = maxLabeledTiles;\n  }\n\n  public hasPrefix(tileKey: string): boolean {\n    for (const key of this.current.keys()) {\n      if (key.startsWith(tileKey)) return true;\n    }\n    return false;\n  }\n\n  public has(tileKey: string): boolean {\n    return this.current.has(tileKey);\n  }\n\n  public size(): number {\n    return this.current.size;\n  }\n\n  public keys() {\n    return this.current.keys();\n  }\n\n  public searchBbox(bbox: Bbox, order: number): Set<IndexedLabel> {\n    const labels = new Set<IndexedLabel>();\n    for (const match of this.tree.search(bbox)) {\n      if (match.indexedLabel.order <= order) {\n        labels.add(match.indexedLabel);\n      }\n    }\n    return labels;\n  }\n\n  public searchLabel(label: Label, order: number): Set<IndexedLabel> {\n    const labels = new Set<IndexedLabel>();\n    for (const bbox of label.bboxes) {\n      for (const match of this.tree.search(bbox)) {\n        if (match.indexedLabel.order <= order) {\n          labels.add(match.indexedLabel);\n        }\n      }\n    }\n    return labels;\n  }\n\n  public bboxCollides(bbox: Bbox, order: number): boolean {\n    for (const match of this.tree.search(bbox)) {\n      if (match.indexedLabel.order <= order) return true;\n    }\n    return false;\n  }\n\n  public labelCollides(label: Label, order: number): boolean {\n    for (const bbox of label.bboxes) {\n      for (const match of this.tree.search(bbox)) {\n        if (match.indexedLabel.order <= order) return true;\n      }\n    }\n    return false;\n  }\n\n  public deduplicationCollides(label: Label): boolean {\n    // create a bbox around anchor to find potential matches.\n    // this is depending on precondition: (anchor is contained within, or on boundary of, a label bbox)\n    if (!label.deduplicationKey || !label.deduplicationDistance) return false;\n    const dist = label.deduplicationDistance;\n    const testBbox = {\n      minX: label.anchor.x - dist,\n      minY: label.anchor.y - dist,\n      maxX: label.anchor.x + dist,\n      maxY: label.anchor.y + dist,\n    };\n    for (const collision of this.tree.search(testBbox)) {\n      if (collision.indexedLabel.deduplicationKey === label.deduplicationKey) {\n        if (collision.indexedLabel.anchor.dist(label.anchor) < dist) {\n          return true;\n        }\n      }\n    }\n    return false;\n  }\n\n  public makeEntry(tileKey: string) {\n    if (this.current.get(tileKey)) {\n      console.log(\"consistency error 1\");\n    }\n    const newSet = new Set<IndexedLabel>();\n    this.current.set(tileKey, newSet);\n  }\n\n  // can put in multiple due to antimeridian wrapping\n  public insert(label: Label, order: number, tileKey: string): void {\n    const indexedLabel = {\n      anchor: label.anchor,\n      bboxes: label.bboxes,\n      draw: label.draw,\n      order: order,\n      tileKey: tileKey,\n      deduplicationKey: label.deduplicationKey,\n      deduplicationDistance: label.deduplicationDistance,\n    };\n    let entry = this.current.get(tileKey);\n    if (!entry) {\n      const newSet = new Set<IndexedLabel>();\n      this.current.set(tileKey, newSet);\n      entry = newSet;\n    }\n    entry.add(indexedLabel);\n\n    let wrapsLeft = false;\n    let wrapsRight = false;\n    for (const bbox of label.bboxes) {\n      this.tree.insert({\n        minX: bbox.minX,\n        minY: bbox.minY,\n        maxX: bbox.maxX,\n        maxY: bbox.maxY,\n        indexedLabel: indexedLabel,\n      });\n      if (bbox.minX < 0) wrapsLeft = true;\n      if (bbox.maxX > this.dim) wrapsRight = true;\n    }\n\n    if (wrapsLeft || wrapsRight) {\n      const shift = wrapsLeft ? this.dim : -this.dim;\n\n      const newBboxes = [];\n      for (const bbox of label.bboxes) {\n        newBboxes.push({\n          minX: bbox.minX + shift,\n          minY: bbox.minY,\n          maxX: bbox.maxX + shift,\n          maxY: bbox.maxY,\n        });\n      }\n      const duplicateLabel = {\n        anchor: new Point(label.anchor.x + shift, label.anchor.y),\n        bboxes: newBboxes,\n        draw: label.draw,\n        order: order,\n        tileKey: tileKey,\n      };\n      const entry = this.current.get(tileKey);\n      if (entry) entry.add(duplicateLabel);\n      for (const bbox of newBboxes) {\n        this.tree.insert({\n          minX: bbox.minX,\n          minY: bbox.minY,\n          maxX: bbox.maxX,\n          maxY: bbox.maxY,\n          indexedLabel: duplicateLabel,\n        });\n      }\n    }\n  }\n\n  public pruneOrNoop(keyAdded: string) {\n    const added = keyAdded.split(\":\");\n    let maxKey = undefined;\n    let maxDist = 0;\n    let keysForDs = 0;\n\n    for (const existingKey of this.current.keys()) {\n      const existing = existingKey.split(\":\");\n      if (existing[3] === added[3]) {\n        keysForDs++;\n        const dist = Math.sqrt(\n          (+existing[0] - +added[0]) ** 2 + (+existing[1] - +added[1]) ** 2,\n        );\n        if (dist > maxDist) {\n          maxDist = dist;\n          maxKey = existingKey;\n        }\n      }\n\n      if (maxKey && keysForDs > this.maxLabeledTiles) {\n        this.pruneKey(maxKey);\n      }\n    }\n  }\n\n  public pruneKey(keyToRemove: string): void {\n    const indexedLabels = this.current.get(keyToRemove);\n    if (!indexedLabels) return; // TODO: not that clean...\n    const entriesToDelete = [];\n    for (const entry of this.tree.all()) {\n      if (indexedLabels.has(entry.indexedLabel)) {\n        entriesToDelete.push(entry);\n      }\n    }\n    for (const entry of entriesToDelete) {\n      this.tree.remove(entry);\n    }\n    this.current.delete(keyToRemove);\n  }\n\n  // NOTE: technically this is incorrect\n  // with antimeridian wrapping, since we should also remove\n  // the duplicate label; but i am having a hard time\n  // imagining where this will happen in practical usage\n  public removeLabel(labelToRemove: IndexedLabel): void {\n    const entriesToDelete = [];\n    for (const entry of this.tree.all()) {\n      if (labelToRemove === entry.indexedLabel) {\n        entriesToDelete.push(entry);\n      }\n    }\n    for (const entry of entriesToDelete) {\n      this.tree.remove(entry);\n    }\n    const c = this.current.get(labelToRemove.tileKey);\n    if (c) c.delete(labelToRemove);\n  }\n}\n\nexport class Labeler {\n  index: Index;\n  z: number;\n  scratch: CanvasRenderingContext2D;\n  labelRules: LabelRule[];\n  callback?: TileInvalidationCallback;\n\n  constructor(\n    z: number,\n    scratch: CanvasRenderingContext2D,\n    labelRules: LabelRule[],\n    maxLabeledTiles: number,\n    callback?: TileInvalidationCallback,\n  ) {\n    this.index = new Index((256 * 1) << z, maxLabeledTiles);\n    this.z = z;\n    this.scratch = scratch;\n    this.labelRules = labelRules;\n    this.callback = callback;\n  }\n\n  private layout(preparedTilemap: Map<string, PreparedTile[]>): number {\n    const start = performance.now();\n\n    const keysAdding = new Set<string>();\n    // if it already exists... short circuit\n    for (const [k, preparedTiles] of preparedTilemap) {\n      for (const preparedTile of preparedTiles) {\n        const key = `${toIndex(preparedTile.dataTile)}:${k}`;\n        if (!this.index.has(key)) {\n          this.index.makeEntry(key);\n          keysAdding.add(key);\n        }\n      }\n    }\n\n    const tilesInvalidated = new Set<string>();\n    for (const [order, rule] of this.labelRules.entries()) {\n      if (rule.visible === false) continue;\n      if (rule.minzoom && this.z < rule.minzoom) continue;\n      if (rule.maxzoom && this.z > rule.maxzoom) continue;\n\n      const dsName = rule.dataSource || \"\";\n      const preparedTiles = preparedTilemap.get(dsName);\n      if (!preparedTiles) continue;\n\n      for (const preparedTile of preparedTiles) {\n        const key = `${toIndex(preparedTile.dataTile)}:${dsName}`;\n        if (!keysAdding.has(key)) continue;\n\n        const layer = preparedTile.data.get(rule.dataLayer);\n        if (layer === undefined) continue;\n\n        const feats = layer;\n        if (rule.sort)\n          feats.sort((a, b) => {\n            if (rule.sort) {\n              return rule.sort(a.props, b.props);\n            }\n            return 0;\n          });\n\n        const layout = {\n          index: this.index,\n          zoom: this.z,\n          scratch: this.scratch,\n          order: order,\n          overzoom: this.z - preparedTile.dataTile.z,\n        };\n        for (const feature of feats) {\n          if (rule.filter && !rule.filter(this.z, feature)) continue;\n          const transformed = transformGeom(\n            feature.geom,\n            preparedTile.scale,\n            preparedTile.origin,\n          );\n          const labels = rule.symbolizer.place(layout, transformed, feature);\n          if (!labels) continue;\n\n          for (const label of labels) {\n            let labelAdded = false;\n            if (\n              label.deduplicationKey &&\n              this.index.deduplicationCollides(label)\n            ) {\n              continue;\n            }\n\n            // does the label collide with anything?\n            if (this.index.labelCollides(label, Infinity)) {\n              if (!this.index.labelCollides(label, order)) {\n                const conflicts = this.index.searchLabel(label, Infinity);\n                for (const conflict of conflicts) {\n                  this.index.removeLabel(conflict);\n                  for (const bbox of conflict.bboxes) {\n                    this.findInvalidatedTiles(\n                      tilesInvalidated,\n                      preparedTile.dim,\n                      bbox,\n                      key,\n                    );\n                  }\n                }\n                this.index.insert(label, order, key);\n                labelAdded = true;\n              }\n              // label not added.\n            } else {\n              this.index.insert(label, order, key);\n              labelAdded = true;\n            }\n\n            if (labelAdded) {\n              for (const bbox of label.bboxes) {\n                if (\n                  bbox.maxX > preparedTile.origin.x + preparedTile.dim ||\n                  bbox.minX < preparedTile.origin.x ||\n                  bbox.minY < preparedTile.origin.y ||\n                  bbox.maxY > preparedTile.origin.y + preparedTile.dim\n                ) {\n                  this.findInvalidatedTiles(\n                    tilesInvalidated,\n                    preparedTile.dim,\n                    bbox,\n                    key,\n                  );\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    for (const key of keysAdding) {\n      this.index.pruneOrNoop(key);\n    }\n\n    if (tilesInvalidated.size > 0 && this.callback) {\n      this.callback(tilesInvalidated);\n    }\n    return performance.now() - start;\n  }\n\n  private findInvalidatedTiles(\n    tilesInvalidated: Set<string>,\n    dim: number,\n    bbox: Bbox,\n    key: string,\n  ) {\n    const touched = covering(this.z, dim, bbox);\n    for (const s of touched) {\n      if (s.key !== key && this.index.hasPrefix(s.key)) {\n        tilesInvalidated.add(s.display);\n      }\n    }\n  }\n\n  public add(preparedTilemap: Map<string, PreparedTile[]>): number {\n    let allAdded = true;\n    for (const [k, preparedTiles] of preparedTilemap) {\n      for (const preparedTile of preparedTiles) {\n        if (!this.index.has(`${toIndex(preparedTile.dataTile)}:${k}`))\n          allAdded = false;\n      }\n    }\n\n    if (allAdded) {\n      return 0;\n    }\n    const timing = this.layout(preparedTilemap);\n    return timing;\n  }\n}\n\nexport class Labelers {\n  labelers: Map<number, Labeler>;\n  scratch: CanvasRenderingContext2D;\n  labelRules: LabelRule[];\n  maxLabeledTiles: number;\n  callback: TileInvalidationCallback;\n\n  constructor(\n    scratch: CanvasRenderingContext2D,\n    labelRules: LabelRule[],\n    maxLabeledTiles: number,\n    callback: TileInvalidationCallback,\n  ) {\n    this.labelers = new Map<number, Labeler>();\n    this.scratch = scratch;\n    this.labelRules = labelRules;\n    this.maxLabeledTiles = maxLabeledTiles;\n    this.callback = callback;\n  }\n\n  public add(z: number, preparedTilemap: Map<string, PreparedTile[]>): number {\n    let labeler = this.labelers.get(z);\n    if (labeler) {\n      return labeler.add(preparedTilemap);\n    }\n    labeler = new Labeler(\n      z,\n      this.scratch,\n      this.labelRules,\n      this.maxLabeledTiles,\n      this.callback,\n    );\n    this.labelers.set(z, labeler);\n    return labeler.add(preparedTilemap);\n  }\n\n  public getIndex(z: number) {\n    const labeler = this.labelers.get(z);\n    if (labeler) return labeler.index; // TODO cleanup\n  }\n}\n","import Point from \"@mapbox/point-geometry\";\nimport { Index } from \"./labeler\";\nimport { PaintSymbolizer } from \"./symbolizer\";\nimport { Bbox, Feature } from \"./tilecache\";\nimport { PreparedTile, transformGeom } from \"./view\";\n\nexport type Filter = (zoom: number, feature: Feature) => boolean;\n\nexport interface PaintRule {\n  id?: string;\n  minzoom?: number;\n  maxzoom?: number;\n  dataSource?: string;\n  dataLayer: string;\n  symbolizer: PaintSymbolizer;\n  filter?: Filter;\n}\n\nexport function paint(\n  ctx: CanvasRenderingContext2D,\n  z: number,\n  preparedTilemap: Map<string, PreparedTile[]>,\n  labelData: Index | null,\n  rules: PaintRule[],\n  bbox: Bbox,\n  origin: Point,\n  clip: boolean,\n  debug?: string,\n) {\n  const start = performance.now();\n  ctx.save();\n  ctx.miterLimit = 2;\n\n  for (const rule of rules) {\n    if (rule.minzoom && z < rule.minzoom) continue;\n    if (rule.maxzoom && z > rule.maxzoom) continue;\n    const preparedTiles = preparedTilemap.get(rule.dataSource || \"\");\n    if (!preparedTiles) continue;\n    for (const preparedTile of preparedTiles) {\n      const layer = preparedTile.data.get(rule.dataLayer);\n      if (layer === undefined) continue;\n      if (rule.symbolizer.before) rule.symbolizer.before(ctx, preparedTile.z);\n\n      const po = preparedTile.origin;\n      const dim = preparedTile.dim;\n      const ps = preparedTile.scale;\n      ctx.save();\n\n      // apply clipping to the tile\n      // find the smallest of all the origins\n      if (clip) {\n        ctx.beginPath();\n        const minX = Math.max(po.x - origin.x, bbox.minX - origin.x); // - 0.5;\n        const minY = Math.max(po.y - origin.y, bbox.minY - origin.y); // - 0.5;\n        const maxX = Math.min(po.x - origin.x + dim, bbox.maxX - origin.x); // + 0.5;\n        const maxY = Math.min(po.y - origin.y + dim, bbox.maxY - origin.y); // + 0.5;\n        ctx.rect(minX, minY, maxX - minX, maxY - minY);\n        ctx.clip();\n      }\n\n      ctx.translate(po.x - origin.x, po.y - origin.y);\n\n      // TODO fix seams in static mode\n      // if (clip) {\n      //     // small fudge factor in static mode to fix seams\n      //     ctx.translate(dim / 2, dim / 2);\n      //     ctx.scale(1 + 1 / dim, 1 + 1 / dim);\n      //     ctx.translate(-dim / 2, -dim / 2);\n      // }\n\n      for (const feature of layer) {\n        let geom = feature.geom;\n        const fbox = feature.bbox;\n        if (\n          fbox.maxX * ps + po.x < bbox.minX ||\n          fbox.minX * ps + po.x > bbox.maxX ||\n          fbox.minY * ps + po.y > bbox.maxY ||\n          fbox.maxY * ps + po.y < bbox.minY\n        ) {\n          continue;\n        }\n        if (rule.filter && !rule.filter(preparedTile.z, feature)) continue;\n        if (ps !== 1) {\n          geom = transformGeom(geom, ps, new Point(0, 0));\n        }\n        rule.symbolizer.draw(ctx, geom, preparedTile.z, feature);\n      }\n      ctx.restore();\n    }\n  }\n\n  if (clip) {\n    ctx.beginPath();\n    ctx.rect(\n      bbox.minX - origin.x,\n      bbox.minY - origin.y,\n      bbox.maxX - bbox.minX,\n      bbox.maxY - bbox.minY,\n    );\n    ctx.clip();\n  }\n\n  if (labelData) {\n    const matches = labelData.searchBbox(bbox, Infinity);\n    for (const label of matches) {\n      ctx.save();\n      ctx.translate(label.anchor.x - origin.x, label.anchor.y - origin.y);\n      label.draw(ctx);\n      ctx.restore();\n      if (debug) {\n        ctx.lineWidth = 0.5;\n        ctx.strokeStyle = debug;\n        ctx.fillStyle = debug;\n        ctx.globalAlpha = 1;\n        ctx.fillRect(\n          label.anchor.x - origin.x - 2,\n          label.anchor.y - origin.y - 2,\n          4,\n          4,\n        );\n        for (const bbox of label.bboxes) {\n          ctx.strokeRect(\n            bbox.minX - origin.x,\n            bbox.minY - origin.y,\n            bbox.maxX - bbox.minX,\n            bbox.maxY - bbox.minY,\n          );\n        }\n      }\n    }\n  }\n  ctx.restore();\n  return performance.now() - start;\n}\n","// biome-ignore lint: leaflet 1.x\ndeclare const L: any;\n\nimport Point from \"@mapbox/point-geometry\";\n\nimport type { Coords } from \"leaflet\";\nimport { namedFlavor } from \"@protomaps/basemaps\";\nimport { PMTiles } from \"pmtiles\";\nimport { labelRules, paintRules } from \"../default_style/style\";\nimport { LabelRule, Labelers } from \"../labeler\";\nimport { PaintRule, paint } from \"../painter\";\nimport { PickedFeature } from \"../tilecache\";\nimport { PreparedTile, SourceOptions, sourcesToViews } from \"../view\";\n\nconst timer = (duration: number) => {\n  return new Promise<void>((resolve) => {\n    setTimeout(() => {\n      resolve();\n    }, duration);\n  });\n};\n\n// replacement for Promise.allSettled (requires ES2020+)\n// this is called for every tile render,\n// so ensure font loading failure does not make map rendering fail\ntype Status = {\n  status: string;\n  value?: unknown;\n  reason: Error;\n};\n\nconst reflect = (promise: Promise<Status>) => {\n  return promise.then(\n    (v) => {\n      return { status: \"fulfilled\", value: v };\n    },\n    (error) => {\n      return { status: \"rejected\", reason: error };\n    },\n  );\n};\n\ntype DoneCallback = (error?: Error, tile?: HTMLElement) => void;\ntype KeyedHtmlCanvasElement = HTMLCanvasElement & { key: string };\n\nexport interface LeafletLayerOptions extends L.GridLayerOptions {\n  bounds?: L.LatLngBoundsExpression;\n  attribution?: string;\n  debug?: string;\n  lang?: string;\n  tileDelay?: number;\n  noWrap?: boolean;\n  paintRules?: PaintRule[];\n  labelRules?: LabelRule[];\n  tasks?: Promise<Status>[];\n  maxDataZoom?: number;\n  url?: PMTiles | string;\n  sources?: Record<string, SourceOptions>;\n  flavor?: string;\n  backgroundColor?: string;\n}\n\nconst leafletLayer = (options: LeafletLayerOptions = {}) => {\n  class LeafletLayer extends L.GridLayer {\n    public paintRules: PaintRule[];\n    public labelRules: LabelRule[];\n    public backgroundColor?: string;\n\n    constructor(options: LeafletLayerOptions = {}) {\n      if (options.noWrap && !options.bounds)\n        options.bounds = [\n          [-90, -180],\n          [90, 180],\n        ];\n      if (options.attribution == null)\n        options.attribution =\n          '<a href=\"https://protomaps.com\">Protomaps</a> © <a href=\"https://openstreetmap.org/copyright\">OpenStreetMap</a>';\n      super(options);\n\n      if (options.flavor) {\n        const flavor = namedFlavor(options.flavor);\n        this.paintRules = paintRules(flavor);\n        this.labelRules = labelRules(flavor, options.lang || \"en\");\n        this.backgroundColor = flavor.background;\n      } else {\n        this.paintRules = options.paintRules || [];\n        this.labelRules = options.labelRules || [];\n        this.backgroundColor = options.backgroundColor;\n      }\n\n      this.lastRequestedZ = undefined;\n      this.tasks = options.tasks || [];\n\n      this.views = sourcesToViews(options);\n\n      this.debug = options.debug;\n      const scratch = document.createElement(\"canvas\").getContext(\"2d\");\n      this.scratch = scratch;\n      this.onTilesInvalidated = (tiles: Set<string>) => {\n        for (const t of tiles) {\n          this.rerenderTile(t);\n        }\n      };\n      this.labelers = new Labelers(\n        this.scratch,\n        this.labelRules,\n        16,\n        this.onTilesInvalidated,\n      );\n      this.tileSize = 256 * window.devicePixelRatio;\n      this.tileDelay = options.tileDelay || 3;\n      this.lang = options.lang;\n    }\n\n    public async renderTile(\n      coords: Coords,\n      element: KeyedHtmlCanvasElement,\n      key: string,\n      done = () => {},\n    ) {\n      this.lastRequestedZ = coords.z;\n\n      const promises = [];\n      for (const [k, v] of this.views) {\n        const promise = v.getDisplayTile(coords);\n        promises.push({ key: k, promise: promise });\n      }\n      const tileResponses = await Promise.all(\n        promises.map((o) => {\n          return o.promise.then(\n            (v: PreparedTile[]) => {\n              return { status: \"fulfilled\", value: v, key: o.key };\n            },\n            (error: Error) => {\n              return { status: \"rejected\", reason: error, key: o.key };\n            },\n          );\n        }),\n      );\n\n      const preparedTilemap = new Map<string, PreparedTile[]>();\n      for (const tileResponse of tileResponses) {\n        if (tileResponse.status === \"fulfilled\") {\n          preparedTilemap.set(tileResponse.key, [tileResponse.value]);\n        } else {\n          if (tileResponse.reason.name === \"AbortError\") {\n            // do nothing\n          } else {\n            console.error(tileResponse.reason);\n          }\n        }\n      }\n\n      if (element.key !== key) return;\n      if (this.lastRequestedZ !== coords.z) return;\n\n      await Promise.all(this.tasks.map(reflect));\n\n      if (element.key !== key) return;\n      if (this.lastRequestedZ !== coords.z) return;\n\n      const layoutTime = this.labelers.add(coords.z, preparedTilemap);\n\n      if (element.key !== key) return;\n      if (this.lastRequestedZ !== coords.z) return;\n\n      const labelData = this.labelers.getIndex(coords.z);\n\n      if (!this._map) return; // the layer has been removed from the map\n\n      const center = this._map.getCenter().wrap();\n      const pixelBounds = this._getTiledPixelBounds(center);\n      const tileRange = this._pxBoundsToTileRange(pixelBounds);\n      const tileCenter = tileRange.getCenter();\n      const priority = coords.distanceTo(tileCenter) * this.tileDelay;\n\n      await timer(priority);\n\n      if (element.key !== key) return;\n      if (this.lastRequestedZ !== coords.z) return;\n\n      const buf = 16;\n      const bbox = {\n        minX: 256 * coords.x - buf,\n        minY: 256 * coords.y - buf,\n        maxX: 256 * (coords.x + 1) + buf,\n        maxY: 256 * (coords.y + 1) + buf,\n      };\n      const origin = new Point(256 * coords.x, 256 * coords.y);\n\n      element.width = this.tileSize;\n      element.height = this.tileSize;\n      const ctx = element.getContext(\"2d\");\n      if (!ctx) {\n        console.error(\"Failed to get Canvas context\");\n        return;\n      }\n      ctx.setTransform(this.tileSize / 256, 0, 0, this.tileSize / 256, 0, 0);\n      ctx.clearRect(0, 0, 256, 256);\n\n      if (this.backgroundColor) {\n        ctx.save();\n        ctx.fillStyle = this.backgroundColor;\n        ctx.fillRect(0, 0, 256, 256);\n        ctx.restore();\n      }\n\n      let paintingTime = 0;\n\n      const paintRules = this.paintRules;\n\n      paintingTime = paint(\n        ctx,\n        coords.z,\n        preparedTilemap,\n        this.xray ? null : labelData,\n        paintRules,\n        bbox,\n        origin,\n        false,\n        this.debug,\n      );\n\n      if (this.debug) {\n        ctx.save();\n        ctx.fillStyle = this.debug;\n        ctx.font = \"600 12px sans-serif\";\n        ctx.fillText(`${coords.z} ${coords.x} ${coords.y}`, 4, 14);\n\n        ctx.font = \"12px sans-serif\";\n        let ypos = 28;\n        for (const [k, v] of preparedTilemap) {\n          const dt = v[0].dataTile;\n          ctx.fillText(`${k + (k ? \" \" : \"\") + dt.z} ${dt.x} ${dt.y}`, 4, ypos);\n          ypos += 14;\n        }\n\n        ctx.font = \"600 10px sans-serif\";\n        if (paintingTime > 8) {\n          ctx.fillText(`${paintingTime.toFixed()} ms paint`, 4, ypos);\n          ypos += 14;\n        }\n\n        if (layoutTime > 8) {\n          ctx.fillText(`${layoutTime.toFixed()} ms layout`, 4, ypos);\n        }\n        ctx.strokeStyle = this.debug;\n\n        ctx.lineWidth = 0.5;\n        ctx.beginPath();\n        ctx.moveTo(0, 0);\n        ctx.lineTo(0, 256);\n        ctx.stroke();\n\n        ctx.lineWidth = 0.5;\n        ctx.beginPath();\n        ctx.moveTo(0, 0);\n        ctx.lineTo(256, 0);\n        ctx.stroke();\n\n        ctx.restore();\n      }\n      done();\n    }\n\n    public rerenderTile(key: string) {\n      for (const unwrappedK in this._tiles) {\n        const wrappedCoord = this._wrapCoords(\n          this._keyToTileCoords(unwrappedK),\n        );\n        if (key === this._tileCoordsToKey(wrappedCoord)) {\n          this.renderTile(wrappedCoord, this._tiles[unwrappedK].el, key);\n        }\n      }\n    }\n\n    // a primitive way to check the features at a certain point.\n    // it does not support hover states, cursor changes, or changing the style of the selected feature,\n    // so is only appropriate for debugging or very basic use cases.\n    // those features are outside of the scope of this library:\n    // for fully pickable, interactive features, use MapLibre GL JS instead.\n    public queryTileFeaturesDebug(\n      lng: number,\n      lat: number,\n      brushSize = 16,\n    ): Map<string, PickedFeature[]> {\n      const featuresBySourceName = new Map<string, PickedFeature[]>();\n      for (const [sourceName, view] of this.views) {\n        featuresBySourceName.set(\n          sourceName,\n          view.queryFeatures(lng, lat, this._map.getZoom(), brushSize),\n        );\n      }\n      return featuresBySourceName;\n    }\n\n    public clearLayout() {\n      this.labelers = new Labelers(\n        this.scratch,\n        this.labelRules,\n        16,\n        this.onTilesInvalidated,\n      );\n    }\n\n    public rerenderTiles() {\n      for (const unwrappedK in this._tiles) {\n        const wrappedCoord = this._wrapCoords(\n          this._keyToTileCoords(unwrappedK),\n        );\n        const key = this._tileCoordsToKey(wrappedCoord);\n        this.renderTile(wrappedCoord, this._tiles[unwrappedK].el, key);\n      }\n    }\n\n    public createTile(coords: Coords, showTile: DoneCallback) {\n      const element = L.DomUtil.create(\"canvas\", \"leaflet-tile\");\n      element.lang = this.lang;\n\n      const key = this._tileCoordsToKey(coords);\n      element.key = key;\n\n      this.renderTile(coords, element, key, () => {\n        showTile(undefined, element);\n      });\n\n      return element;\n    }\n\n    public _removeTile(key: string) {\n      const tile = this._tiles[key];\n      if (!tile) {\n        return;\n      }\n      tile.el.removed = true;\n      tile.el.key = undefined;\n      L.DomUtil.removeClass(tile.el, \"leaflet-tile-loaded\");\n      tile.el.width = tile.el.height = 0;\n      L.DomUtil.remove(tile.el);\n      delete this._tiles[key];\n      this.fire(\"tileunload\", {\n        tile: tile.el,\n        coords: this._keyToTileCoords(key),\n      });\n    }\n  }\n  return new LeafletLayer(options);\n};\n\nexport { leafletLayer };\n","import potpack from \"potpack\";\n\n// https://github.com/tangrams/tangram/blob/master/src/styles/text/font_manager.js\nexport const Font = (name: string, url: string, weight: string) => {\n  const ff = new FontFace(name, `url(${url})`, { weight: weight });\n  document.fonts.add(ff);\n  return ff.load();\n};\n\ninterface Sprite {\n  x: number;\n  y: number;\n  w: number;\n  h: number;\n}\n\ninterface PotPackInput {\n  x?: number;\n  y?: number;\n  w: number;\n  h: number;\n  id: string;\n  img: HTMLImageElement;\n}\n\nconst mkimg = async (src: string): Promise<HTMLImageElement> => {\n  return new Promise((resolve, reject) => {\n    const img = new Image();\n    img.onload = () => resolve(img);\n    img.onerror = () => reject(\"Invalid SVG\");\n    img.src = src;\n  });\n};\n\nconst MISSING = `\n<svg width=\"20px\" height=\"20px\" viewBox=\"0 0 50 50\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n    <rect width=\"50\" height=\"50\" fill=\"#cccccc\"/>\n    <g transform=\"translate(5,5)\">\n        <path fill=\"none\" stroke=\"#666666\" stroke-width=\"7\" d=\"m11,12a8.5,8 0 1,1 17,0q0,4-4,6t-4.5,4.5-.4,4v.2m0,3v7\"/>\n    </g>\n</svg>\n`;\n\nexport class Sheet {\n  src: string;\n  canvas: HTMLCanvasElement;\n  mapping: Map<string, Sprite>;\n  missingBox: Sprite;\n\n  constructor(src: string) {\n    this.src = src;\n    this.canvas = document.createElement(\"canvas\");\n    this.mapping = new Map<string, Sprite>();\n    this.missingBox = { x: 0, y: 0, w: 0, h: 0 };\n  }\n\n  async load() {\n    let src = this.src;\n    const scale = window.devicePixelRatio;\n    if (src.endsWith(\".html\")) {\n      const c = await fetch(src);\n      src = await c.text();\n    }\n    const tree = new window.DOMParser().parseFromString(src, \"text/html\");\n    const icons = Array.from(tree.body.children);\n\n    const missingImg = await mkimg(\n      `data:image/svg+xml;base64,${btoa(MISSING)}`,\n    );\n\n    const boxes: PotPackInput[] = [\n      {\n        w: missingImg.width * scale,\n        h: missingImg.height * scale,\n        img: missingImg,\n        id: \"\",\n      },\n    ];\n\n    const serializer = new XMLSerializer();\n    for (const ps of icons) {\n      const svg64 = btoa(serializer.serializeToString(ps));\n      const image64 = `data:image/svg+xml;base64,${svg64}`;\n      const img = await mkimg(image64);\n      boxes.push({\n        w: img.width * scale,\n        h: img.height * scale,\n        img: img,\n        id: ps.id,\n      });\n    }\n\n    const packresult = potpack(boxes);\n    this.canvas.width = packresult.w;\n    this.canvas.height = packresult.h;\n    const ctx = this.canvas.getContext(\"2d\");\n    if (ctx) {\n      for (const box of boxes) {\n        if (box.x !== undefined && box.y !== undefined) {\n          ctx.drawImage(box.img, box.x, box.y, box.w, box.h);\n          if (box.id)\n            this.mapping.set(box.id, {\n              x: box.x,\n              y: box.y,\n              w: box.w,\n              h: box.h,\n            });\n          else this.missingBox = { x: box.x, y: box.y, w: box.w, h: box.h };\n        }\n      }\n    }\n    return this;\n  }\n\n  get(name: string): Sprite {\n    let result = this.mapping.get(name);\n    if (!result) result = this.missingBox;\n    return result;\n  }\n}\n"]}