{"version":3,"file":"maptiler-sdk.mjs","sources":["../src/language.ts","../src/config.ts","../src/defaults.ts","../src/LogoControl.ts","../src/MaptilerLogoControl.ts","../src/tools.ts","../src/mapstyle.ts","../src/MaptilerTerrainControl.ts","../src/NavigationControl.ts","../src/MaptilerNavigationControl.ts","../src/GeolocateControl.ts","../src/MaptilerGeolocateControl.ts","../src/AttributionControl.ts","../src/ScaleControl.ts","../src/FullscreenControl.ts","../src/Map.ts","../src/Marker.ts","../src/Popup.ts","../src/Style.ts","../src/CanvasSource.ts","../src/GeoJSONSource.ts","../src/ImageSource.ts","../src/RasterTileSource.ts","../src/RasterDEMTileSource.ts","../src/VectorTileSource.ts","../src/VideoSource.ts","../src/TerrainControl.ts","../src/Point.ts","../src/index.ts"],"sourcesContent":["import type { Map, SymbolLayerSpecification } from \"maplibre-gl\";\n\n/**\n * Languages. Note that not all the languages of this list are available but the compatibility list may be expanded in the future.\n */\nconst Language = {\n  /**\n   * AUTO mode uses the language of the browser\n   */\n  AUTO: \"auto\",\n\n  /**\n   * STYLE is a custom flag to keep the language of the map as defined into the style.\n   * If STYLE is set in the constructor, then further modification of the language\n   * with `.setLanguage()` is not possible.\n   */\n  STYLE_LOCK: \"style_lock\",\n\n  /**\n   * Default fallback languages that uses latin charaters\n   */\n  LATIN: \"latin\",\n\n  /**\n   * Default fallback languages that uses non-latin charaters\n   */\n  NON_LATIN: \"nonlatin\",\n\n  /**\n   * Labels are in their local language, when available\n   */\n  LOCAL: \"\",\n\n  ALBANIAN: \"sq\",\n  AMHARIC: \"am\",\n  ARABIC: \"ar\",\n  ARMENIAN: \"hy\",\n  AZERBAIJANI: \"az\",\n  BASQUE: \"eu\",\n  BELORUSSIAN: \"be\",\n  BOSNIAN: \"bs\",\n  BRETON: \"br\",\n  BULGARIAN: \"bg\",\n  CATALAN: \"ca\",\n  CHINESE: \"zh\",\n  CORSICAN: \"co\",\n  CROATIAN: \"hr\",\n  CZECH: \"cs\",\n  DANISH: \"da\",\n  DUTCH: \"nl\",\n  ENGLISH: \"en\",\n  ESPERANTO: \"eo\",\n  ESTONIAN: \"et\",\n  FINNISH: \"fi\",\n  FRENCH: \"fr\",\n  FRISIAN: \"fy\",\n  GEORGIAN: \"ka\",\n  GERMAN: \"de\",\n  GREEK: \"el\",\n  HEBREW: \"he\",\n  HINDI: \"hi\",\n  HUNGARIAN: \"hu\",\n  ICELANDIC: \"is\",\n  INDONESIAN: \"id\",\n  IRISH: \"ga\",\n  ITALIAN: \"it\",\n  JAPANESE: \"ja\",\n  JAPANESE_HIRAGANA: \"ja-Hira\",\n  JAPANESE_KANA: \"ja_kana\",\n  JAPANESE_LATIN: \"ja_rm\",\n  JAPANESE_2018: \"ja-Latn\",\n  KANNADA: \"kn\",\n  KAZAKH: \"kk\",\n  KOREAN: \"ko\",\n  KOREAN_LATIN: \"ko-Latn\",\n  KURDISH: \"ku\",\n  ROMAN_LATIN: \"la\",\n  LATVIAN: \"lv\",\n  LITHUANIAN: \"lt\",\n  LUXEMBOURGISH: \"lb\",\n  MACEDONIAN: \"mk\",\n  MALAYALAM: \"ml\",\n  MALTESE: \"mt\",\n  NORWEGIAN: \"no\",\n  OCCITAN: \"oc\",\n  POLISH: \"pl\",\n  PORTUGUESE: \"pt\",\n  ROMANIAN: \"ro\",\n  ROMANSH: \"rm\",\n  RUSSIAN: \"ru\",\n  SCOTTISH_GAELIC: \"gd\",\n  SERBIAN_CYRILLIC: \"sr\",\n  SERBIAN_LATIN: \"sr-Latn\",\n  SLOVAK: \"sk\",\n  SLOVENE: \"sl\",\n  SPANISH: \"es\",\n  SWEDISH: \"sv\",\n  TAMIL: \"ta\",\n  TELUGU: \"te\",\n  THAI: \"th\",\n  TURKISH: \"tr\",\n  UKRAINIAN: \"uk\",\n  WELSH: \"cy\",\n} as const;\n\nconst languagesIsoSet = new Set(Object.values(Language) as Array<string>);\n\nfunction isLanguageSupported(lang: string): boolean {\n  return languagesIsoSet.has(lang);\n}\n\nconst languageCodeSet = new Set(Object.values(Language));\n\n/**\n * Type representing the key of the Language object\n */\ntype LanguageKey = keyof typeof Language;\n\ntype Values<T> = T[keyof T];\n\n/**\n * Built-in languages values as strings\n */\ntype LanguageString = Values<typeof Language>;\n\nfunction getBrowserLanguage(): LanguageString {\n  if (typeof navigator === \"undefined\") {\n    return Intl.DateTimeFormat()\n      .resolvedOptions()\n      .locale.split(\"-\")[0] as LanguageString;\n  }\n\n  const canditatelangs = Array.from(\n    new Set(navigator.languages.map((l) => l.split(\"-\")[0]))\n  ).filter((l) => languageCodeSet.has(l as LanguageString));\n\n  return canditatelangs.length\n    ? (canditatelangs[0] as LanguageString)\n    : Language.LATIN;\n}\n\nfunction setPrimaryLanguage(map: Map, lang: string) {\n  const layers = map.getStyle().layers;\n\n  // detects pattern like \"{name:somelanguage}\" with loose spacing\n  const strLanguageRegex = /^\\s*{\\s*name\\s*(:\\s*(\\S*))?\\s*}$/;\n\n  // detects pattern like \"name:somelanguage\" with loose spacing\n  const strLanguageInArrayRegex = /^\\s*name\\s*(:\\s*(\\S*))?\\s*$/;\n\n  // for string based bilingual lang such as \"{name:latin}  {name:nonlatin}\" or \"{name:latin}  {name}\"\n  const strBilingualRegex =\n    /^\\s*{\\s*name\\s*(:\\s*(\\S*))?\\s*}(\\s*){\\s*name\\s*(:\\s*(\\S*))?\\s*}$/;\n\n  // Regex to capture when there are more info, such as mountains elevation with unit m/ft\n  const strMoreInfoRegex = /^(.*)({\\s*name\\s*(:\\s*(\\S*))?\\s*})(.*)$/;\n\n  const langStr = lang ? `name:${lang}` : \"name\"; // to handle local lang\n  const replacer = [\n    \"case\",\n    [\"has\", langStr],\n    [\"get\", langStr],\n    [\"get\", \"name\"],\n  ];\n\n  for (let i = 0; i < layers.length; i += 1) {\n    const layer = layers[i] as SymbolLayerSpecification;\n    const layout = layer.layout;\n\n    if (!layout) {\n      continue;\n    }\n\n    if (!layout[\"text-field\"]) {\n      continue;\n    }\n\n    const textFieldLayoutProp = map.getLayoutProperty(layer.id, \"text-field\");\n\n    // Note:\n    // The value of the 'text-field' property can take multiple shape;\n    // 1. can be an array with 'concat' on its first element (most likely means bilingual)\n    // 2. can be an array with 'get' on its first element (monolingual)\n    // 3. can be a string of shape '{name:latin}'\n    // 4. can be a string referencing another prop such as '{housenumber}' or '{ref}'\n    //\n    // The case 1, 2 and 3 will be updated while maintaining their original type and shape.\n    // The case 3 will not be updated\n\n    let regexMatch;\n\n    // This is case 1\n    if (\n      Array.isArray(textFieldLayoutProp) &&\n      textFieldLayoutProp.length >= 2 &&\n      textFieldLayoutProp[0].trim().toLowerCase() === \"concat\"\n    ) {\n      const newProp = textFieldLayoutProp.slice(); // newProp is Array\n      // The style could possibly have defined more than 2 concatenated language strings but we only want to edit the first\n      // The style could also define that there are more things being concatenated and not only languages\n\n      for (let j = 0; j < textFieldLayoutProp.length; j += 1) {\n        const elem = textFieldLayoutProp[j];\n\n        // we are looking for an elem of shape '{name:somelangage}' (string) of `[\"get\", \"name:somelanguage\"]` (array)\n\n        // the entry of of shape '{name:somelangage}', possibly with loose spacing\n        if (\n          (typeof elem === \"string\" || elem instanceof String) &&\n          strLanguageRegex.exec(elem.toString())\n        ) {\n          newProp[j] = replacer;\n          break; // we just want to update the primary language\n        }\n        // the entry is of an array of shape `[\"get\", \"name:somelanguage\"]`\n        else if (\n          Array.isArray(elem) &&\n          elem.length >= 2 &&\n          elem[0].trim().toLowerCase() === \"get\" &&\n          strLanguageInArrayRegex.exec(elem[1].toString())\n        ) {\n          newProp[j] = replacer;\n          break; // we just want to update the primary language\n        } else if (\n          Array.isArray(elem) &&\n          elem.length === 4 &&\n          elem[0].trim().toLowerCase() === \"case\"\n        ) {\n          newProp[j] = replacer;\n          break; // we just want to update the primary language\n        }\n      }\n\n      map.setLayoutProperty(layer.id, \"text-field\", newProp);\n    }\n\n    // This is case 2\n    else if (\n      Array.isArray(textFieldLayoutProp) &&\n      textFieldLayoutProp.length >= 2 &&\n      textFieldLayoutProp[0].trim().toLowerCase() === \"get\" &&\n      strLanguageInArrayRegex.exec(textFieldLayoutProp[1].toString())\n    ) {\n      const newProp = replacer;\n      map.setLayoutProperty(layer.id, \"text-field\", newProp);\n    }\n\n    // This is case 3\n    else if (\n      (typeof textFieldLayoutProp === \"string\" ||\n        textFieldLayoutProp instanceof String) &&\n      strLanguageRegex.exec(textFieldLayoutProp.toString())\n    ) {\n      const newProp = replacer;\n      map.setLayoutProperty(layer.id, \"text-field\", newProp);\n    } else if (\n      Array.isArray(textFieldLayoutProp) &&\n      textFieldLayoutProp.length === 4 &&\n      textFieldLayoutProp[0].trim().toLowerCase() === \"case\"\n    ) {\n      const newProp = replacer;\n      map.setLayoutProperty(layer.id, \"text-field\", newProp);\n    } else if (\n      (typeof textFieldLayoutProp === \"string\" ||\n        textFieldLayoutProp instanceof String) &&\n      (regexMatch = strBilingualRegex.exec(textFieldLayoutProp.toString())) !==\n        null\n    ) {\n      const newProp = `{${langStr}}${regexMatch[3]}{name${\n        regexMatch[4] || \"\"\n      }}`;\n      map.setLayoutProperty(layer.id, \"text-field\", newProp);\n    } else if (\n      (typeof textFieldLayoutProp === \"string\" ||\n        textFieldLayoutProp instanceof String) &&\n      (regexMatch = strMoreInfoRegex.exec(textFieldLayoutProp.toString())) !==\n        null\n    ) {\n      const newProp = `${regexMatch[1]}{${langStr}}${regexMatch[5]}`;\n      map.setLayoutProperty(layer.id, \"text-field\", newProp);\n    }\n  }\n}\n\nfunction setSecondaryLanguage(map: Map, lang: string) {\n  const layers = map.getStyle().layers;\n\n  // detects pattern like \"{name:somelanguage}\" with loose spacing\n  const strLanguageRegex = /^\\s*{\\s*name\\s*(:\\s*(\\S*))?\\s*}$/;\n\n  // detects pattern like \"name:somelanguage\" with loose spacing\n  const strLanguageInArrayRegex = /^\\s*name\\s*(:\\s*(\\S*))?\\s*$/;\n\n  // for string based bilingual lang such as \"{name:latin}  {name:nonlatin}\" or \"{name:latin}  {name}\"\n  const strBilingualRegex =\n    /^\\s*{\\s*name\\s*(:\\s*(\\S*))?\\s*}(\\s*){\\s*name\\s*(:\\s*(\\S*))?\\s*}$/;\n\n  let regexMatch;\n\n  for (let i = 0; i < layers.length; i += 1) {\n    const layer = layers[i] as SymbolLayerSpecification;\n    const layout = layer.layout;\n\n    if (!layout) {\n      continue;\n    }\n\n    if (!layout[\"text-field\"]) {\n      continue;\n    }\n\n    const textFieldLayoutProp = map.getLayoutProperty(layer.id, \"text-field\");\n\n    let newProp;\n\n    // Note:\n    // The value of the 'text-field' property can take multiple shape;\n    // 1. can be an array with 'concat' on its first element (most likely means bilingual)\n    // 2. can be an array with 'get' on its first element (monolingual)\n    // 3. can be a string of shape '{name:latin}'\n    // 4. can be a string referencing another prop such as '{housenumber}' or '{ref}'\n    //\n    // Only the case 1 will be updated because we don't want to change the styling (read: add a secondary language where the original styling is only displaying 1)\n\n    // This is case 1\n    if (\n      Array.isArray(textFieldLayoutProp) &&\n      textFieldLayoutProp.length >= 2 &&\n      textFieldLayoutProp[0].trim().toLowerCase() === \"concat\"\n    ) {\n      newProp = textFieldLayoutProp.slice(); // newProp is Array\n      // The style could possibly have defined more than 2 concatenated language strings but we only want to edit the first\n      // The style could also define that there are more things being concatenated and not only languages\n\n      let languagesAlreadyFound = 0;\n\n      for (let j = 0; j < textFieldLayoutProp.length; j += 1) {\n        const elem = textFieldLayoutProp[j];\n\n        // we are looking for an elem of shape '{name:somelangage}' (string) of `[\"get\", \"name:somelanguage\"]` (array)\n\n        // the entry of of shape '{name:somelangage}', possibly with loose spacing\n        if (\n          (typeof elem === \"string\" || elem instanceof String) &&\n          strLanguageRegex.exec(elem.toString())\n        ) {\n          if (languagesAlreadyFound === 1) {\n            newProp[j] = `{name:${lang}}`;\n            break; // we just want to update the secondary language\n          }\n\n          languagesAlreadyFound += 1;\n        }\n        // the entry is of an array of shape `[\"get\", \"name:somelanguage\"]`\n        else if (\n          Array.isArray(elem) &&\n          elem.length >= 2 &&\n          elem[0].trim().toLowerCase() === \"get\" &&\n          strLanguageInArrayRegex.exec(elem[1].toString())\n        ) {\n          if (languagesAlreadyFound === 1) {\n            newProp[j][1] = `name:${lang}`;\n            break; // we just want to update the secondary language\n          }\n\n          languagesAlreadyFound += 1;\n        } else if (\n          Array.isArray(elem) &&\n          elem.length === 4 &&\n          elem[0].trim().toLowerCase() === \"case\"\n        ) {\n          if (languagesAlreadyFound === 1) {\n            newProp[j] = [\"get\", `name:${lang}`]; // the situation with 'case' is supposed to only happen with the primary lang\n            break; // but in case a styling also does that for secondary...\n          }\n\n          languagesAlreadyFound += 1;\n        }\n      }\n\n      map.setLayoutProperty(layer.id, \"text-field\", newProp);\n    }\n\n    // the language (both first and second) are defined into a single string model\n    else if (\n      (typeof textFieldLayoutProp === \"string\" ||\n        textFieldLayoutProp instanceof String) &&\n      (regexMatch = strBilingualRegex.exec(textFieldLayoutProp.toString())) !==\n        null\n    ) {\n      const langStr = lang ? `name:${lang}` : \"name\"; // to handle local lang\n      newProp = `{name${regexMatch[1] || \"\"}}${regexMatch[3]}{${langStr}}`;\n      map.setLayoutProperty(layer.id, \"text-field\", newProp);\n    }\n  }\n}\n\nexport {\n  Language,\n  getBrowserLanguage,\n  isLanguageSupported,\n  setPrimaryLanguage,\n  setSecondaryLanguage,\n};\n\nexport type { LanguageString, LanguageKey };\n","import EventEmitter from \"events\";\nimport { Language, LanguageString } from \"./language\";\nimport { config as clientConfig, FetchFunction } from \"@maptiler/client\";\nimport { Unit } from \"./unit\";\n\n/**\n * Configuration class for the SDK\n */\nclass SdkConfig extends EventEmitter {\n  /**\n   * The primary language. By default, the language of the web browser is used.\n   */\n  primaryLanguage: LanguageString | null = Language.AUTO;\n\n  /**\n   * The secondary language, to overwrite the default language defined in the map style.\n   * This settings is highly dependant on the style compatibility and may not work in most cases.\n   */\n  secondaryLanguage: LanguageString | null = null;\n\n  /**\n   * Setting on whether of not the SDK runs with a session logic.\n   * A \"session\" is started at the initialization of the SDK and finished when the browser\n   * page is being refreshed.\n   * When `session` is enabled (default: true), the extra URL param `mtsid` is added to queries\n   * on the MapTiler Cloud API. This allows MapTiler to enable \"session based billing\".\n   */\n  session = true;\n\n  /**\n   * Unit to be used\n   */\n  private _unit: Unit = \"metric\";\n\n  /**\n   * MapTiler Cloud API key\n   */\n  private _apiKey = \"\";\n\n  constructor() {\n    super();\n  }\n\n  /**\n   * Set the unit system\n   */\n  set unit(u: Unit) {\n    this._unit = u;\n    this.emit(\"unit\", u);\n  }\n\n  /**\n   * Get the unit system\n   */\n  get unit(): Unit {\n    return this._unit;\n  }\n\n  /**\n   * Set the MapTiler Cloud API key\n   */\n  set apiKey(k: string) {\n    this._apiKey = k;\n    clientConfig.apiKey = k;\n    this.emit(\"apiKey\", k);\n  }\n\n  /**\n   * Get the MapTiler Cloud API key\n   */\n  get apiKey(): string {\n    return this._apiKey;\n  }\n\n  /**\n   * Set a the custom fetch function to replace the default one\n   */\n  set fetch(f: FetchFunction) {\n    clientConfig.fetch = f;\n  }\n\n  /**\n   * Get the fetch fucntion\n   */\n  get fetch(): FetchFunction | null {\n    return clientConfig.fetch;\n  }\n}\n\nconst config = new SdkConfig();\n\nexport { config, SdkConfig };\n","import { Language } from \"./language\";\n\n/**\n * Some default settings for the SDK\n */\nconst defaults = {\n  maptilerLogoURL: \"https://api.maptiler.com/resources/logo.svg\",\n  maptilerURL: \"https://www.maptiler.com/\",\n  maptilerApiHost: \"api.maptiler.com\",\n  rtlPluginURL:\n    \"https://cdn.maptiler.com/mapbox-gl-rtl-text/v0.2.3/mapbox-gl-rtl-text.min.js\",\n  primaryLanguage: Language.AUTO,\n  secondaryLanguage: Language.LOCAL,\n  terrainSourceURL: \"https://api.maptiler.com/tiles/terrain-rgb-v2/tiles.json\",\n  terrainSourceId: \"maptiler-terrain\",\n};\n\nObject.freeze(defaults);\n\nexport { defaults };\n","/**\n * This is an extension of MapLibre LogoControl to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class LogoControl extends maplibregl.LogoControl {\n  onAdd(map: Map | MapMLGL) {\n    return super.onAdd(map as MapMLGL);\n  }\n}\n","import maplibregl from \"maplibre-gl\";\nimport type { LogoOptions as LogoOptionsML } from \"maplibre-gl\";\nimport { defaults } from \"./defaults\";\nimport { Map } from \"./Map\";\nimport { LogoControl } from \"./LogoControl\";\n\ntype LogoOptions = LogoOptionsML & {\n  logoURL?: string;\n  linkURL?: string;\n};\n\n/**\n * This LogoControl extends the MapLibre LogoControl but instead can use any image URL and\n * any link URL. By default this is using MapTiler logo and URL.\n */\nexport class MaptilerLogoControl extends LogoControl {\n  private logoURL = \"\";\n  private linkURL = \"\";\n\n  constructor(options: LogoOptions = {}) {\n    super(options);\n\n    this.logoURL = options.logoURL ?? defaults.maptilerLogoURL;\n    this.linkURL = options.linkURL ?? defaults.maptilerURL;\n  }\n\n  onAdd(map: Map): HTMLElement {\n    this._map = map;\n    this._compact = this.options && this.options.compact;\n    this._container = window.document.createElement(\"div\");\n    this._container.className = \"maplibregl-ctrl\";\n    const anchor = window.document.createElement(\"a\");\n    anchor.style.backgroundRepeat = \"no-repeat\";\n    anchor.style.cursor = \"pointer\";\n    anchor.style.display = \"block\";\n    anchor.style.height = \"23px\";\n    anchor.style.margin = \"0 0 -4px -4px\";\n    anchor.style.overflow = \"hidden\";\n    anchor.style.width = \"88px\";\n    anchor.style.backgroundImage = `url(${this.logoURL})`;\n    anchor.style.backgroundSize = \"100px 30px\";\n    anchor.style.width = \"100px\";\n    anchor.style.height = \"30px\";\n\n    anchor.target = \"_blank\";\n    anchor.rel = \"noopener nofollow\";\n    anchor.href = this.linkURL;\n    anchor.setAttribute(\n      \"aria-label\",\n      this._map._getUIString(\"LogoControl.Title\")\n    );\n    anchor.setAttribute(\"rel\", \"noopener nofollow\");\n    this._container.appendChild(anchor);\n    this._container.style.display = \"block\";\n\n    this._map.on(\"resize\", this._updateCompact);\n    this._updateCompact();\n\n    return this._container;\n  }\n}\n","import maplibregl from \"maplibre-gl\";\nimport { defaults } from \"./defaults\";\n\nexport function enableRTL() {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  if (maplibregl.getRTLTextPluginStatus() === \"unavailable\") {\n    maplibregl.setRTLTextPlugin(\n      defaults.rtlPluginURL,\n      null,\n      true // Lazy load the plugin\n    );\n  }\n}\n\n// This comes from:\n// https://github.com/maplibre/maplibre-gl-js/blob/v2.4.0/src/util/util.ts#L223\nexport function bindAll(fns: Array<string>, context: any): void {\n  fns.forEach((fn) => {\n    if (!context[fn]) {\n      return;\n    }\n    context[fn] = context[fn].bind(context);\n  });\n}\n\n// This comes from:\n// https://github.com/maplibre/maplibre-gl-js/blob/v2.4.0/src/util/dom.ts#L22\nexport function DOMcreate<K extends keyof HTMLElementTagNameMap>(\n  tagName: K,\n  className?: string,\n  container?: HTMLElement\n): HTMLElementTagNameMap[K] {\n  const el = window.document.createElement(tagName);\n  if (className !== undefined) el.className = className;\n  if (container) container.appendChild(el);\n  return el;\n}\n\n// This comes from:\n// https://github.com/maplibre/maplibre-gl-js/blob/v2.4.0/src/util/dom.ts#L111\nexport function DOMremove(node: HTMLElement) {\n  if (node.parentNode) {\n    node.parentNode.removeChild(node);\n  }\n}\n","import {\n  MapStyle,\n  ReferenceMapStyle,\n  MapStyleVariant,\n  mapStylePresetList,\n  expandMapStyle,\n} from \"@maptiler/client\";\n\nexport function styleToStyle(\n  style:\n    | string\n    | ReferenceMapStyle\n    | MapStyleVariant\n    | maplibregl.StyleSpecification\n    | null\n    | undefined\n): string | maplibregl.StyleSpecification {\n  if (!style) {\n    return MapStyle[mapStylePresetList[0].referenceStyleID]\n      .getDefaultVariant()\n      .getExpandedStyleURL();\n  }\n\n  // If the provided style is a shorthand (eg. \"streets-v2\") or a full style URL\n  if (typeof style === \"string\" || style instanceof String) {\n    if (!style.startsWith(\"http\") && style.toLowerCase().includes(\".json\")) {\n      // If a style does not start by http but still contains the extension \".json\"\n      // we assume it's a relative path to a style json file\n      return style as string;\n    } else {\n      return expandMapStyle(style);\n    }\n  }\n\n  if (style instanceof MapStyleVariant) {\n    return style.getExpandedStyleURL();\n  }\n\n  if (style instanceof ReferenceMapStyle) {\n    return (style.getDefaultVariant() as MapStyleVariant).getExpandedStyleURL();\n  }\n\n  return style as maplibregl.StyleSpecification;\n}\n","import { bindAll, DOMcreate, DOMremove } from \"./tools\";\n\nimport { Map } from \"./Map\";\nimport maplibregl from \"maplibre-gl\";\n\n/**\n * A `MaptilerTerrainControl` control adds a button to turn terrain on and off\n * by triggering the terrain logic that is already deployed in the Map object.\n */\nexport class MaptilerTerrainControl implements maplibregl.IControl {\n  _map: Map;\n  _container: HTMLElement;\n  _terrainButton: HTMLButtonElement;\n\n  constructor() {\n    bindAll([\"_toggleTerrain\", \"_updateTerrainIcon\"], this);\n  }\n\n  onAdd(map: Map) {\n    this._map = map;\n    this._container = DOMcreate(\"div\", \"maplibregl-ctrl maplibregl-ctrl-group\");\n    this._terrainButton = DOMcreate(\n      \"button\",\n      \"maplibregl-ctrl-terrain\",\n      this._container\n    );\n    DOMcreate(\"span\", \"maplibregl-ctrl-icon\", this._terrainButton).setAttribute(\n      \"aria-hidden\",\n      \"true\"\n    );\n    this._terrainButton.type = \"button\";\n    this._terrainButton.addEventListener(\"click\", this._toggleTerrain);\n\n    this._updateTerrainIcon();\n    this._map.on(\"terrain\", this._updateTerrainIcon);\n    return this._container;\n  }\n\n  onRemove() {\n    DOMremove(this._container);\n    this._map.off(\"terrain\", this._updateTerrainIcon);\n    this._map = undefined;\n  }\n\n  _toggleTerrain() {\n    if (this._map.hasTerrain()) {\n      this._map.disableTerrain();\n    } else {\n      this._map.enableTerrain();\n    }\n\n    this._updateTerrainIcon();\n  }\n\n  _updateTerrainIcon() {\n    this._terrainButton.classList.remove(\"maplibregl-ctrl-terrain\");\n    this._terrainButton.classList.remove(\"maplibregl-ctrl-terrain-enabled\");\n    // if (this._map.terrain) {\n    if (this._map.hasTerrain()) {\n      this._terrainButton.classList.add(\"maplibregl-ctrl-terrain-enabled\");\n      this._terrainButton.title = this._map._getUIString(\n        \"TerrainControl.disableTerrain\"\n      );\n    } else {\n      this._terrainButton.classList.add(\"maplibregl-ctrl-terrain\");\n      this._terrainButton.title = this._map._getUIString(\n        \"TerrainControl.enableTerrain\"\n      );\n    }\n  }\n}\n","/**\n * This is an extension of MapLibre NavigationControl to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class NavigationControl extends maplibregl.NavigationControl {\n  onAdd(map: Map | MapMLGL) {\n    return super.onAdd(map as MapMLGL);\n  }\n}\n","import { NavigationControl } from \"./NavigationControl\";\n\ntype HTMLButtonElementPlus = HTMLButtonElement & {\n  clickFunction: (e?: any) => unknown;\n};\n\nexport class MaptilerNavigationControl extends NavigationControl {\n  constructor() {\n    super({\n      showCompass: true,\n      showZoom: true,\n      visualizePitch: true,\n    });\n\n    // Removing the default click event\n    this._compass.removeEventListener(\n      \"click\",\n      (this._compass as HTMLButtonElementPlus).clickFunction\n    );\n\n    // Adding custom click event\n    this._compass.addEventListener(\"click\", (e) => {\n      {\n        const currentPitch = this._map.getPitch();\n        if (currentPitch === 0) {\n          this._map.easeTo({ pitch: Math.min(this._map.getMaxPitch(), 80) });\n        } else {\n          if (this.options.visualizePitch) {\n            this._map.resetNorthPitch({}, { originalEvent: e });\n          } else {\n            this._map.resetNorth({}, { originalEvent: e });\n          }\n        }\n      }\n    });\n  }\n\n  /**\n   * Overloading: the button now stores its click callback so that we can later on delete it and replace it\n   */\n  _createButton(\n    className: string,\n    fn: (e?: any) => unknown\n  ): HTMLButtonElementPlus {\n    const button = super._createButton(className, fn) as HTMLButtonElementPlus;\n    button.clickFunction = fn;\n    return button;\n  }\n\n  /**\n   * Overloading: Limit how flat the compass icon can get\n   */\n  _rotateCompassArrow() {\n    const rotate = this.options.visualizePitch\n      ? `scale(${Math.min(\n          1.5,\n          1 /\n            Math.pow(Math.cos(this._map.transform.pitch * (Math.PI / 180)), 0.5)\n        )}) rotateX(${Math.min(70, this._map.transform.pitch)}deg) rotateZ(${\n          this._map.transform.angle * (180 / Math.PI)\n        }deg)`\n      : `rotate(${this._map.transform.angle * (180 / Math.PI)}deg)`;\n\n    this._compassIcon.style.transform = rotate;\n  }\n}\n","/**\n * This is an extension of MapLibre GeolocateControl to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class GeolocateControl extends maplibregl.GeolocateControl {\n  onAdd(map: Map | MapMLGL) {\n    return super.onAdd(map as MapMLGL);\n  }\n}\n","import type { LngLatLike } from \"maplibre-gl\";\nimport maplibregl from \"maplibre-gl\";\nimport { GeolocateControl } from \"./GeolocateControl\";\nimport { DOMcreate } from \"./tools\";\n\nconst Marker = maplibregl.Marker;\nconst LngLat = maplibregl.LngLat;\n\n/**\n * The MaptilerGeolocateControl is an extension of the original GeolocateControl\n * with a few changes. In this version, the active mode persists as long as the\n * location is still centered. This means it's robust to rotation, pitch and zoom.\n *\n */\nexport class MaptilerGeolocateControl extends GeolocateControl {\n  private lastUpdatedCenter = new LngLat(0, 0);\n\n  /**\n   * Update the camera location to center on the current position\n   *\n   * @param {Position} position the Geolocation API Position\n   * @private\n   */\n  _updateCamera(position: GeolocationPosition) {\n    const center = new LngLat(\n      position.coords.longitude,\n      position.coords.latitude\n    );\n    const radius = position.coords.accuracy;\n    const bearing = this._map.getBearing();\n    const options = {\n      bearing,\n      ...this.options.fitBoundsOptions,\n      linear: true,\n    };\n\n    const currentMapZoom = this._map.getZoom();\n\n    if (currentMapZoom > this.options.fitBoundsOptions.maxZoom) {\n      options.zoom = currentMapZoom;\n    }\n\n    this._map.fitBounds(center.toBounds(radius), options, {\n      geolocateSource: true, // tag this camera change so it won't cause the control to change to background state\n    });\n\n    let hasFittingBeenDisrupted = false;\n\n    const flagFittingDisruption = () => {\n      hasFittingBeenDisrupted = true;\n    };\n\n    this._map.once(\"click\", flagFittingDisruption);\n    this._map.once(\"dblclick\", flagFittingDisruption);\n    this._map.once(\"dragstart\", flagFittingDisruption);\n    this._map.once(\"mousedown\", flagFittingDisruption);\n    this._map.once(\"touchstart\", flagFittingDisruption);\n    this._map.once(\"wheel\", flagFittingDisruption);\n\n    this._map.once(\"moveend\", () => {\n      // Removing the events if not used\n      this._map.off(\"click\", flagFittingDisruption);\n      this._map.off(\"dblclick\", flagFittingDisruption);\n      this._map.off(\"dragstart\", flagFittingDisruption);\n      this._map.off(\"mousedown\", flagFittingDisruption);\n      this._map.off(\"touchstart\", flagFittingDisruption);\n      this._map.off(\"wheel\", flagFittingDisruption);\n\n      if (hasFittingBeenDisrupted) {\n        return;\n      }\n\n      this.lastUpdatedCenter = this._map.getCenter();\n    });\n  }\n\n  _setupUI(supported: boolean) {\n    this.lastUpdatedCenter = this._map.getCenter();\n\n    this._container.addEventListener(\"contextmenu\", (e: MouseEvent) =>\n      e.preventDefault()\n    );\n    this._geolocateButton = DOMcreate(\n      \"button\",\n      \"maplibregl-ctrl-geolocate\",\n      this._container\n    );\n    DOMcreate(\n      \"span\",\n      \"maplibregl-ctrl-icon\",\n      this._geolocateButton\n    ).setAttribute(\"aria-hidden\", \"true\");\n    this._geolocateButton.type = \"button\";\n\n    if (supported === false) {\n      // warnOnce('Geolocation support is not available so the GeolocateControl will be disabled.');\n      const title = this._map._getUIString(\n        \"GeolocateControl.LocationNotAvailable\"\n      );\n      this._geolocateButton.disabled = true;\n      this._geolocateButton.title = title;\n      this._geolocateButton.setAttribute(\"aria-label\", title);\n    } else {\n      const title = this._map._getUIString(\"GeolocateControl.FindMyLocation\");\n      this._geolocateButton.title = title;\n      this._geolocateButton.setAttribute(\"aria-label\", title);\n    }\n\n    if (this.options.trackUserLocation) {\n      this._geolocateButton.setAttribute(\"aria-pressed\", \"false\");\n      this._watchState = \"OFF\";\n    }\n\n    // when showUserLocation is enabled, keep the Geolocate button disabled until the device location marker is setup on the map\n    if (this.options.showUserLocation) {\n      this._dotElement = DOMcreate(\"div\", \"maplibregl-user-location-dot\");\n\n      this._userLocationDotMarker = new Marker(this._dotElement);\n\n      this._circleElement = DOMcreate(\n        \"div\",\n        \"maplibregl-user-location-accuracy-circle\"\n      );\n      this._accuracyCircleMarker = new Marker({\n        element: this._circleElement,\n        pitchAlignment: \"map\",\n      });\n\n      if (this.options.trackUserLocation) this._watchState = \"OFF\";\n\n      this._map.on(\"move\", this._onZoom);\n    }\n\n    this._geolocateButton.addEventListener(\"click\", this.trigger.bind(this));\n\n    this._setup = true;\n\n    // when the camera is changed (and it's not as a result of the Geolocation Control) change\n    // the watch mode to background watch, so that the marker is updated but not the camera.\n    // Addition: Yet the status change does not occur if the ditance it has moved to is less than\n    // one meter from the last auto-updated position. This is to guarrantee that if the move\n    // is a zoom, rotation or pitch (where the center stays the same) then we can keep the ACTIVE_LOCK\n    // mode ON.\n    if (this.options.trackUserLocation) {\n      this._map.on(\"moveend\", (event: any) => {\n        const fromResize =\n          event.originalEvent && event.originalEvent.type === \"resize\";\n        const movingDistance = this.lastUpdatedCenter.distanceTo(\n          this._map.getCenter()\n        );\n\n        if (\n          !event.geolocateSource &&\n          this._watchState === \"ACTIVE_LOCK\" &&\n          !fromResize &&\n          movingDistance > 1\n        ) {\n          this._watchState = \"BACKGROUND\";\n          this._geolocateButton.classList.add(\n            \"maplibregl-ctrl-geolocate-background\"\n          );\n          this._geolocateButton.classList.remove(\n            \"maplibregl-ctrl-geolocate-active\"\n          );\n\n          this.fire(new Event(\"trackuserlocationend\"));\n        }\n      });\n    }\n  }\n\n  _updateCircleRadius() {\n    if (\n      this._watchState !== \"BACKGROUND\" &&\n      this._watchState !== \"ACTIVE_LOCK\"\n    ) {\n      return;\n    }\n\n    const lastKnownLocation: LngLatLike = [\n      this._lastKnownPosition.coords.longitude,\n      this._lastKnownPosition.coords.latitude,\n    ];\n\n    const projectedLocation = this._map.project(lastKnownLocation);\n    const a = this._map.unproject([projectedLocation.x, projectedLocation.y]);\n    const b = this._map.unproject([\n      projectedLocation.x + 20,\n      projectedLocation.y,\n    ]);\n    const metersPerPixel = a.distanceTo(b) / 20;\n\n    const circleDiameter = Math.ceil((2.0 * this._accuracy) / metersPerPixel);\n    this._circleElement.style.width = `${circleDiameter}px`;\n    this._circleElement.style.height = `${circleDiameter}px`;\n  }\n\n  _onZoom() {\n    if (this.options.showUserLocation && this.options.showAccuracyCircle) {\n      this._updateCircleRadius();\n    }\n  }\n}\n","/**\n * This is an extension of MapLibre AttributionControl to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class AttributionControl extends maplibregl.AttributionControl {\n  onAdd(map: Map | MapMLGL) {\n    return super.onAdd(map as MapMLGL);\n  }\n}\n","/**\n * This is an extension of MapLibre ScaleControl to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class ScaleControl extends maplibregl.ScaleControl {\n  onAdd(map: Map | MapMLGL) {\n    return super.onAdd(map as MapMLGL);\n  }\n}\n","/**\n * This is an extension of MapLibre FullscreenControl to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class FullscreenControl extends maplibregl.FullscreenControl {\n  onAdd(map: Map | MapMLGL) {\n    return super.onAdd(map as MapMLGL);\n  }\n}\n","import maplibregl from \"maplibre-gl\";\nimport { Base64 } from \"js-base64\";\nimport type {\n  StyleSpecification,\n  MapOptions as MapOptionsML,\n  ControlPosition,\n  StyleOptions,\n  MapDataEvent,\n  Tile,\n  RasterDEMSourceSpecification,\n  TerrainSpecification,\n  MapTerrainEvent,\n} from \"maplibre-gl\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { ReferenceMapStyle, MapStyleVariant } from \"@maptiler/client\";\nimport { config, SdkConfig } from \"./config\";\nimport { defaults } from \"./defaults\";\nimport { MaptilerLogoControl } from \"./MaptilerLogoControl\";\nimport { enableRTL } from \"./tools\";\nimport {\n  getBrowserLanguage,\n  isLanguageSupported,\n  setPrimaryLanguage,\n  setSecondaryLanguage,\n  Language,\n  LanguageString,\n} from \"./language\";\nimport { styleToStyle } from \"./mapstyle\";\nimport { MaptilerTerrainControl } from \"./MaptilerTerrainControl\";\nimport { MaptilerNavigationControl } from \"./MaptilerNavigationControl\";\nimport { geolocation } from \"@maptiler/client\";\nimport { MaptilerGeolocateControl } from \"./MaptilerGeolocateControl\";\nimport { AttributionControl } from \"./AttributionControl\";\nimport { ScaleControl } from \"./ScaleControl\";\nimport { FullscreenControl } from \"./FullscreenControl\";\n\nfunction sleepAsync(ms: number) {\n  return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport type LoadWithTerrainEvent = {\n  type: \"loadWithTerrain\";\n  target: Map;\n  terrain: {\n    source: string;\n    exaggeration: number;\n  };\n};\n\n// StyleSwapOptions is not exported by Maplibre, but we can redefine it (used for setStyle)\nexport type TransformStyleFunction = (\n  previous: StyleSpecification,\n  next: StyleSpecification\n) => StyleSpecification;\n\nexport type StyleSwapOptions = {\n  diff?: boolean;\n  transformStyle?: TransformStyleFunction;\n};\n\nconst MAPTILER_SESSION_ID = uuidv4();\n\nexport const GeolocationType: {\n  POINT: \"POINT\";\n  COUNTRY: \"COUNTRY\";\n} = {\n  POINT: \"POINT\",\n  COUNTRY: \"COUNTRY\",\n} as const;\n\ntype MapTerrainDataEvent = MapDataEvent & {\n  isSourceLoaded: boolean;\n  tile: Tile;\n  sourceId: string;\n  source: RasterDEMSourceSpecification;\n};\n\n/**\n * Options to provide to the `Map` constructor\n */\nexport type MapOptions = Omit<MapOptionsML, \"style\" | \"maplibreLogo\"> & {\n  /**\n   * Style of the map. Can be:\n   * - a full style URL (possibly with API key)\n   * - a shorthand with only the MapTIler style name (eg. `\"streets-v2\"`)\n   * - a longer form with the prefix `\"maptiler://\"` (eg. `\"maptiler://streets-v2\"`)\n   */\n  style?: ReferenceMapStyle | MapStyleVariant | StyleSpecification | string;\n\n  /**\n   * Define the language of the map. This can be done directly with a language ISO code (eg. \"en\")\n   * or with a built-in shorthand (eg. Language.ENGLISH).\n   * Note that this is equivalent to setting the `config.primaryLanguage` and will overwrite it.\n   */\n  language?: LanguageString;\n\n  /**\n   * Define the MapTiler Cloud API key to be used. This is strictly equivalent to setting\n   * `config.apiKey` and will overwrite it.\n   */\n  apiKey?: string;\n\n  /**\n   * Shows or hides the MapTiler logo in the bottom left corner.\n   *\n   * For paid plans:\n   * - `true` shows MapTiler logo\n   * - `false` hodes MapTiler logo\n   * - default: `false` (hide)\n   *\n   * For free plans: MapTiler logo always shows, regardless of the value.\n   */\n  maptilerLogo?: boolean;\n\n  /**\n   * Enables 3D terrain if `true`. (default: `false`)\n   */\n  terrain?: boolean;\n\n  /**\n   * Exaggeration factor of the terrain. (default: `1`, no exaggeration)\n   */\n  terrainExaggeration?: number;\n\n  /**\n   * Show the navigation control. (default: `true`, will hide if `false`)\n   */\n  navigationControl?: boolean | ControlPosition;\n\n  /**\n   * Show the terrain control. (default: `false`, will show if `true`)\n   */\n  terrainControl?: boolean | ControlPosition;\n\n  /**\n   * Show the geolocate control. (default: `true`, will hide if `false`)\n   */\n  geolocateControl?: boolean | ControlPosition;\n\n  /**\n   * Show the scale control. (default: `false`, will show if `true`)\n   */\n  scaleControl?: boolean | ControlPosition;\n\n  /**\n   * Show the full screen control. (default: `false`, will show if `true`)\n   */\n  fullscreenControl?: boolean | ControlPosition;\n\n  /**\n   * Method to position the map at a given geolocation. Only if:\n   * - `hash` is `false`\n   * - `center` is not provided\n   *\n   * If the value is `true` of `\"POINT\"` (given by `GeolocationType.POINT`) then the positionning uses the MapTiler Cloud\n   * Geolocation to find the non-GPS location point.\n   * The zoom level can be provided in the `Map` constructor with the `zoom` option or will be `13` if not provided.\n   *\n   * If the value is `\"COUNTRY\"` (given by `GeolocationType.COUNTRY`) then the map is centered around the bounding box of the country.\n   * In this case, the `zoom` option will be ignored.\n   *\n   * If the value is `false`, no geolocation is performed and the map centering and zooming depends on other options or on\n   * the built-in defaults.\n   *\n   * If this option is non-false and the options `center` is also provided, then `center` prevails.\n   *\n   * Default: `false`\n   */\n  geolocate?: (typeof GeolocationType)[keyof typeof GeolocationType] | boolean;\n};\n\n/**\n * The Map class can be instanciated to display a map in a `<div>`\n */\nexport class Map extends maplibregl.Map {\n  private isTerrainEnabled = false;\n  private terrainExaggeration = 1;\n  private primaryLanguage: LanguageString | null = null;\n  private secondaryLanguage: LanguageString | null = null;\n  private terrainGrowing = false;\n  private terrainFlattening = false;\n\n  constructor(options: MapOptions) {\n    if (options.apiKey) {\n      config.apiKey = options.apiKey;\n    }\n\n    const style = styleToStyle(options.style);\n    const hashPreConstructor = location.hash;\n\n    if (!config.apiKey) {\n      console.warn(\n        \"MapTiler Cloud API key is not set. Visit https://maptiler.com and try Cloud for free!\"\n      );\n    }\n\n    // calling the map constructor with full length style\n    super({\n      ...options,\n      style,\n      maplibreLogo: false,\n\n      transformRequest: (url: string) => {\n        let reqUrl = null;\n\n        try {\n          // The URL is expected to be absolute.\n          // Yet, if it's local we just return it without assuming a 'base' url (in the URL constructor)\n          // and we let the URL be locally resolved with a potential base path.\n          reqUrl = new URL(url);\n        } catch (e) {\n          return {\n            url,\n            headers: {},\n          };\n        }\n\n        if (reqUrl.host === defaults.maptilerApiHost) {\n          if (!reqUrl.searchParams.has(\"key\")) {\n            reqUrl.searchParams.append(\"key\", config.apiKey);\n          }\n\n          if (config.session) {\n            reqUrl.searchParams.append(\"mtsid\", MAPTILER_SESSION_ID);\n          }\n        }\n\n        return {\n          url: reqUrl.href,\n          headers: {},\n        };\n      },\n    });\n\n    this.primaryLanguage = options.language ?? config.primaryLanguage;\n    this.secondaryLanguage = config.secondaryLanguage;\n    this.terrainExaggeration =\n      options.terrainExaggeration ?? this.terrainExaggeration;\n\n    // Map centering and geolocation\n    this.once(\"styledata\", async () => {\n      // Not using geolocation centering if...\n\n      // the geolcoate option is not provided or is falsy\n      if (!options.geolocate) {\n        return;\n      }\n\n      // ... a center is provided in options\n      if (options.center) {\n        return;\n      }\n\n      // ... the hash option is enabled and a hash is present in the URL\n      if (options.hash && !!hashPreConstructor) {\n        return;\n      }\n\n      // If the geolocation is set to COUNTRY:\n      try {\n        if (options.geolocate === GeolocationType.COUNTRY) {\n          await this.fitToIpBounds();\n          return;\n        }\n      } catch (e) {\n        // not raising\n        console.warn(e.message);\n      }\n\n      // As a fallback, we want to center the map on the visitor. First with IP geolocation...\n      let ipLocatedCameraHash = null;\n      try {\n        await this.centerOnIpPoint(options.zoom);\n        ipLocatedCameraHash = this.getCameraHash();\n      } catch (e) {\n        // not raising\n        console.warn(e.message);\n      }\n\n      // A more precise localization\n\n      // This more advanced localization is commented out because the easeTo animation\n      // triggers an error if the terrain grow is enabled (due to being nable to project the center while moving)\n\n      // Then, the get a more precise location, we rely on the browser location, but only if it was already granted\n      // before (we don't want to ask wih a popup at launch time)\n      const locationResult = await navigator.permissions.query({\n        name: \"geolocation\",\n      });\n\n      if (locationResult.state === \"granted\") {\n        navigator.geolocation.getCurrentPosition(\n          // success callback\n          (data) => {\n            // If the user has already moved since the ip location, then we no longer want to move the center\n            if (ipLocatedCameraHash !== this.getCameraHash()) {\n              return;\n            }\n\n            if (this.terrain) {\n              this.easeTo({\n                center: [data.coords.longitude, data.coords.latitude],\n                zoom: options.zoom || 12,\n                duration: 2000,\n              });\n            } else {\n              this.once(\"terrain\", () => {\n                this.easeTo({\n                  center: [data.coords.longitude, data.coords.latitude],\n                  zoom: options.zoom || 12,\n                  duration: 2000,\n                });\n              });\n            }\n          },\n\n          // error callback\n          null,\n\n          // options\n          {\n            maximumAge: 24 * 3600 * 1000, // a day in millisec\n            timeout: 5000, // milliseconds\n            enableHighAccuracy: false,\n          }\n        );\n      }\n    });\n\n    // If the config includes language changing, we must update the map language\n    this.on(\"styledata\", () => {\n      this.setPrimaryLanguage(this.primaryLanguage);\n      this.setSecondaryLanguage(this.secondaryLanguage);\n    });\n\n    // this even is in charge of reaplying the terrain elevation after the\n    // style has changed because depending on the src/tgt style,\n    // the style logic is not always able to resolve the application of terrain\n    this.on(\"styledata\", () => {\n      // the styling resolver did no manage to reaply the terrain,\n      // so let's reload it\n      if (this.getTerrain() === null && this.isTerrainEnabled) {\n        this.enableTerrain(this.terrainExaggeration);\n      }\n    });\n\n    // load the Right-to-Left text plugin (will happen only once)\n    this.once(\"load\", async () => {\n      enableRTL();\n    });\n\n    // Update logo and attibution\n    this.once(\"load\", async () => {\n      let tileJsonContent = { logo: null };\n\n      try {\n        const possibleSources = Object.keys(this.style.sourceCaches)\n          .map((sourceName) => this.getSource(sourceName))\n          .filter(\n            (s: any) =>\n              typeof s.url === \"string\" && s.url.includes(\"tiles.json\")\n          );\n\n        const styleUrl = new URL(\n          (possibleSources[0] as maplibregl.VectorTileSource).url\n        );\n\n        if (!styleUrl.searchParams.has(\"key\")) {\n          styleUrl.searchParams.append(\"key\", config.apiKey);\n        }\n\n        const tileJsonRes = await fetch(styleUrl.href);\n        tileJsonContent = await tileJsonRes.json();\n      } catch (e) {\n        // No tiles.json found (should not happen on maintained styles)\n      }\n\n      // The attribution and logo must show when required\n      if (\"logo\" in tileJsonContent && tileJsonContent.logo) {\n        const logoURL: string = tileJsonContent.logo;\n\n        this.addControl(\n          new MaptilerLogoControl({ logoURL }),\n          options.logoPosition\n        );\n\n        // if attribution in option is `false` but the the logo shows up in the tileJson, then the attribution must show anyways\n        if (options.attributionControl === false) {\n          this.addControl(new AttributionControl(options));\n        }\n      } else if (options.maptilerLogo) {\n        this.addControl(new MaptilerLogoControl(), options.logoPosition);\n      }\n\n      // the other controls at init time but be after\n      // (due to the async nature of logo control)\n\n      // By default, no scale control\n      if (options.scaleControl) {\n        // default position, if not provided, is top left corner\n        const position = (\n          options.scaleControl === true || options.scaleControl === undefined\n            ? \"bottom-right\"\n            : options.scaleControl\n        ) as ControlPosition;\n\n        const scaleControl = new ScaleControl({ unit: config.unit });\n        this.addControl(scaleControl, position);\n        config.on(\"unit\", (unit) => {\n          scaleControl.setUnit(unit);\n        });\n      }\n\n      if (options.navigationControl !== false) {\n        // default position, if not provided, is top left corner\n        const position = (\n          options.navigationControl === true ||\n          options.navigationControl === undefined\n            ? \"top-right\"\n            : options.navigationControl\n        ) as ControlPosition;\n        this.addControl(new MaptilerNavigationControl(), position);\n      }\n\n      if (options.geolocateControl !== false) {\n        // default position, if not provided, is top left corner\n        const position = (\n          options.geolocateControl === true ||\n          options.geolocateControl === undefined\n            ? \"top-right\"\n            : options.geolocateControl\n        ) as ControlPosition;\n\n        this.addControl(\n          // new maplibregl.GeolocateControl({\n          new MaptilerGeolocateControl({\n            positionOptions: {\n              enableHighAccuracy: true,\n              maximumAge: 0,\n              timeout: 6000 /* 6 sec */,\n            },\n            fitBoundsOptions: {\n              maxZoom: 15,\n            },\n            trackUserLocation: true,\n            showAccuracyCircle: true,\n            showUserLocation: true,\n          }),\n          position\n        );\n      }\n\n      if (options.terrainControl) {\n        // default position, if not provided, is top left corner\n        const position = (\n          options.terrainControl === true ||\n          options.terrainControl === undefined\n            ? \"top-right\"\n            : options.terrainControl\n        ) as ControlPosition;\n        this.addControl(new MaptilerTerrainControl(), position);\n      }\n\n      // By default, no fullscreen control\n      if (options.fullscreenControl) {\n        // default position, if not provided, is top left corner\n        const position = (\n          options.fullscreenControl === true ||\n          options.fullscreenControl === undefined\n            ? \"top-right\"\n            : options.fullscreenControl\n        ) as ControlPosition;\n\n        this.addControl(new FullscreenControl({}), position);\n      }\n    });\n\n    // Creating a custom event: \"loadWithTerrain\"\n    // that fires only once when both:\n    // - the map has full loaded (corresponds to the the \"load\" event)\n    // - the terrain has loaded (corresponds to the \"terrain\" event with terrain beion non-null)\n    // This custom event is necessary to wait for when the map is instanciated with `terrain: true`\n    // and some animation (flyTo, easeTo) are running from the begining.\n    let loadEventTriggered = false;\n    let terrainEventTriggered = false;\n    let terrainEventData: LoadWithTerrainEvent = null;\n\n    this.once(\"load\", (_) => {\n      loadEventTriggered = true;\n      if (terrainEventTriggered) {\n        this.fire(\"loadWithTerrain\", terrainEventData);\n      }\n    });\n\n    const terrainCallback = (evt) => {\n      if (!evt.terrain) return;\n      terrainEventTriggered = true;\n      terrainEventData = {\n        type: \"loadWithTerrain\",\n        target: this,\n        terrain: evt.terrain,\n      };\n      this.off(\"terrain\", terrainCallback);\n\n      if (loadEventTriggered) {\n        this.fire(\"loadWithTerrain\", terrainEventData as LoadWithTerrainEvent);\n      }\n    };\n\n    this.on(\"terrain\", terrainCallback);\n\n    // enable 3D terrain if provided in options\n    if (options.terrain) {\n      this.enableTerrain(\n        options.terrainExaggeration ?? this.terrainExaggeration\n      );\n    }\n  }\n\n  /**\n   * Awaits for _this_ Map instance to be \"loaded\" and returns a Promise to the Map.\n   * If _this_ Map instance is already loaded, the Promise is resolved directly,\n   * otherwise, it is resolved as a result of the \"load\" event.\n   * @returns\n   */\n  async onLoadAsync() {\n    return new Promise<Map>((resolve, reject) => {\n      if (this.loaded()) {\n        return resolve(this);\n      }\n\n      this.once(\"load\", (_) => {\n        resolve(this);\n      });\n    });\n  }\n\n  /**\n   * Awaits for _this_ Map instance to be \"loaded\" as well as with terrain being non-null for the first time\n   * and returns a Promise to the Map.\n   * If _this_ Map instance is already loaded with terrain, the Promise is resolved directly,\n   * otherwise, it is resolved as a result of the \"loadWithTerrain\" event.\n   * @returns\n   */\n  async onLoadWithTerrainAsync() {\n    return new Promise<Map>((resolve, reject) => {\n      if (this.loaded() && this.terrain) {\n        return resolve(this);\n      }\n\n      this.once(\"loadWithTerrain\", (_) => {\n        resolve(this);\n      });\n    });\n  }\n\n  /**\n   * Update the style of the map.\n   * Can be:\n   * - a full style URL (possibly with API key)\n   * - a shorthand with only the MapTIler style name (eg. `\"streets-v2\"`)\n   * - a longer form with the prefix `\"maptiler://\"` (eg. `\"maptiler://streets-v2\"`)\n   * @param style\n   * @param options\n   * @returns\n   */\n  setStyle(\n    style: ReferenceMapStyle | MapStyleVariant | StyleSpecification | string,\n    options?: StyleSwapOptions & StyleOptions\n  ) {\n    return super.setStyle(styleToStyle(style), options);\n  }\n\n  /**\n   * Define the primary language of the map. Note that not all the languages shorthands provided are available.\n   * This function is a short for `.setPrimaryLanguage()`\n   * @param language\n   */\n  setLanguage(language: LanguageString = defaults.primaryLanguage) {\n    if (language === Language.AUTO) {\n      return this.setLanguage(getBrowserLanguage());\n    }\n    this.setPrimaryLanguage(language);\n  }\n\n  /**\n   * Define the primary language of the map. Note that not all the languages shorthands provided are available.\n   * @param language\n   */\n  setPrimaryLanguage(language: LanguageString = defaults.primaryLanguage) {\n    if (this.primaryLanguage === Language.STYLE_LOCK) {\n      console.warn(\n        \"The language cannot be changed because this map has been instantiated with the STYLE_LOCK language flag.\"\n      );\n      return;\n    }\n\n    if (!isLanguageSupported(language as string)) {\n      return;\n    }\n\n    this.primaryLanguage = language;\n\n    this.onStyleReady(() => {\n      if (language === Language.AUTO) {\n        return this.setPrimaryLanguage(getBrowserLanguage());\n      }\n\n      setPrimaryLanguage(this, language as string);\n    });\n  }\n\n  /**\n   * Define the secondary language of the map. Note that this is not supported by all the map styles\n   * Note that most styles do not allow a secondary language and this function only works if the style allows (no force adding)\n   * @param language\n   */\n  setSecondaryLanguage(language: LanguageString = defaults.secondaryLanguage) {\n    // Using the lock flag as a primaty language also applies to the secondary\n    if (this.primaryLanguage === Language.STYLE_LOCK) {\n      console.warn(\n        \"The language cannot be changed because this map has been instantiated with the STYLE_LOCK language flag.\"\n      );\n      return;\n    }\n\n    if (!isLanguageSupported(language as string)) {\n      return;\n    }\n\n    this.secondaryLanguage = language;\n\n    this.onStyleReady(() => {\n      if (language === Language.AUTO) {\n        return this.setSecondaryLanguage(getBrowserLanguage());\n      }\n\n      setSecondaryLanguage(this, language as string);\n    });\n  }\n\n  /**\n   * Get the primary language\n   * @returns\n   */\n  getPrimaryLanguage(): LanguageString {\n    return this.primaryLanguage;\n  }\n\n  /**\n   * Get the secondary language\n   * @returns\n   */\n  getSecondaryLanguage(): LanguageString {\n    return this.secondaryLanguage;\n  }\n\n  /**\n   * Get the exaggeration factor applied to the terrain\n   * @returns\n   */\n  getTerrainExaggeration(): number {\n    return this.terrainExaggeration;\n  }\n\n  /**\n   * Know if terrian is enabled or not\n   * @returns\n   */\n  hasTerrain(): boolean {\n    return this.isTerrainEnabled;\n  }\n\n  private growTerrain(exaggeration, durationMs = 1000) {\n    // This method assumes the terrain is already built\n    if (!this.terrain) {\n      return;\n    }\n\n    const startTime = performance.now();\n    // This is supposedly 0, but it could be something else (e.g. already in the middle of growing, or user defined other)\n    const currentExaggeration = this.terrain.exaggeration;\n    const deltaExaggeration = exaggeration - currentExaggeration;\n\n    // This is again called in a requestAnimationFrame ~loop, until the terrain has grown enough\n    // that it has reached the target\n    const updateExaggeration = () => {\n      if (!this.terrain) {\n        return;\n      }\n\n      // If the flattening animation is triggered while the growing animation\n      // is running, then the flattening animation is stopped\n      if (this.terrainFlattening) {\n        return;\n      }\n\n      // normalized value in interval [0, 1] of where we are currently in the animation loop\n      const positionInLoop = (performance.now() - startTime) / durationMs;\n\n      // The animation goes on until we reached 99% of the growing sequence duration\n      if (positionInLoop < 0.99) {\n        const exaggerationFactor = 1 - Math.pow(1 - positionInLoop, 4);\n        const newExaggeration =\n          currentExaggeration + exaggerationFactor * deltaExaggeration;\n        this.terrain.exaggeration = newExaggeration;\n        requestAnimationFrame(updateExaggeration);\n      } else {\n        this.terrainGrowing = false;\n        this.terrainFlattening = false;\n        this.terrain.exaggeration = exaggeration;\n      }\n\n      this.triggerRepaint();\n    };\n\n    this.terrainGrowing = true;\n    this.terrainFlattening = false;\n    requestAnimationFrame(updateExaggeration);\n  }\n\n  /**\n   * Enables the 3D terrain visualization\n   * @param exaggeration\n   * @returns\n   */\n  enableTerrain(exaggeration = this.terrainExaggeration) {\n    if (exaggeration < 0) {\n      console.warn(\"Terrain exaggeration cannot be negative.\");\n      return;\n    }\n\n    // This function is mapped to a map \"data\" event. It checks that the terrain\n    // tiles are loaded and when so, it starts an animation to make the terrain grow\n    const dataEventTerrainGrow = async (evt: MapTerrainDataEvent) => {\n      if (!this.terrain) {\n        return;\n      }\n\n      if (\n        evt.type !== \"data\" ||\n        evt.dataType !== \"source\" ||\n        !(\"source\" in evt)\n      ) {\n        return;\n      }\n\n      if (evt.sourceId !== \"maptiler-terrain\") {\n        return;\n      }\n\n      const source = evt.source;\n\n      if (source.type !== \"raster-dem\") {\n        return;\n      }\n\n      if (!evt.isSourceLoaded) {\n        return;\n      }\n\n      // We shut this event off because we want it to happen only once.\n      // Yet, we cannot use the \"once\" method because only the last event of the series\n      // has `isSourceLoaded` true\n      this.off(\"data\", dataEventTerrainGrow);\n\n      this.growTerrain(exaggeration);\n    };\n\n    // This is put into a function so that it can be called regardless\n    // of the loading state of _this_ the map instance\n    const addTerrain = () => {\n      // When style is changed,\n      this.isTerrainEnabled = true;\n      this.terrainExaggeration = exaggeration;\n\n      // Mapping it to the \"data\" event so that we can check that the terrain\n      // growing starts only when terrain tiles are loaded (to reduce glitching)\n      this.on(\"data\", dataEventTerrainGrow);\n\n      this.addSource(defaults.terrainSourceId, {\n        type: \"raster-dem\",\n        url: defaults.terrainSourceURL,\n      });\n\n      // Setting up the terrain with a 0 exaggeration factor\n      // so it loads ~seamlessly and then can grow from there\n      this.setTerrain({\n        source: defaults.terrainSourceId,\n        exaggeration: 0,\n      });\n    };\n\n    // The terrain has already been loaded,\n    // we just update the exaggeration.\n    if (this.getTerrain()) {\n      this.isTerrainEnabled = true;\n      this.growTerrain(exaggeration);\n      return;\n    }\n\n    if (this.loaded() || this.isTerrainEnabled) {\n      addTerrain();\n    } else {\n      this.once(\"load\", () => {\n        if (this.getTerrain() && this.getSource(defaults.terrainSourceId)) {\n          return;\n        }\n        addTerrain();\n      });\n    }\n  }\n\n  /**\n   * Disable the 3D terrain visualization\n   */\n  disableTerrain() {\n    // It could be disabled already\n    if (!this.terrain) {\n      return;\n    }\n\n    this.isTerrainEnabled = false;\n    // this.stopFlattening = false;\n\n    // Duration of the animation in millisec\n    const animationLoopDuration = 1 * 1000;\n    const startTime = performance.now();\n    // This is supposedly 0, but it could be something else (e.g. already in the middle of growing, or user defined other)\n    const currentExaggeration = this.terrain.exaggeration;\n\n    // This is again called in a requestAnimationFrame ~loop, until the terrain has grown enough\n    // that it has reached the target\n    const updateExaggeration = () => {\n      if (!this.terrain) {\n        return;\n      }\n\n      // If the growing animation is triggered while flattening,\n      // then we exist the flatening\n      if (this.terrainGrowing) {\n        return;\n      }\n\n      // normalized value in interval [0, 1] of where we are currently in the animation loop\n      const positionInLoop =\n        (performance.now() - startTime) / animationLoopDuration;\n\n      // The animation goes on until we reached 99% of the growing sequence duration\n      if (positionInLoop < 0.99) {\n        const exaggerationFactor = Math.pow(1 - positionInLoop, 4);\n        const newExaggeration = currentExaggeration * exaggerationFactor;\n        this.terrain.exaggeration = newExaggeration;\n        requestAnimationFrame(updateExaggeration);\n      } else {\n        this.terrain.exaggeration = 0;\n        this.terrainGrowing = false;\n        this.terrainFlattening = false;\n        this.setTerrain(null);\n        if (this.getSource(defaults.terrainSourceId)) {\n          this.removeSource(defaults.terrainSourceId);\n        }\n      }\n\n      this.triggerRepaint();\n    };\n\n    this.terrainGrowing = false;\n    this.terrainFlattening = true;\n    requestAnimationFrame(updateExaggeration);\n  }\n\n  /**\n   * Sets the 3D terrain exageration factor.\n   * If the terrain was not enabled prior to the call of this method,\n   * the method `.enableTerrain()` will be called.\n   * If `animate` is `true`, the terrain transformation will be animated in the span of 1 second.\n   * If `animate` is `false`, no animated transition to the newly defined exaggeration.\n   * @param exaggeration\n   * @param animate\n   */\n  setTerrainExaggeration(exaggeration: number, animate = true) {\n    if (!animate && this.terrain) {\n      this.terrainExaggeration = exaggeration;\n      this.terrain.exaggeration = exaggeration;\n      this.triggerRepaint();\n    } else {\n      this.enableTerrain(exaggeration);\n    }\n  }\n\n  /**\n   * Perform an action when the style is ready. It could be at the moment of calling this method\n   * or later.\n   * @param cb\n   */\n  private onStyleReady(cb) {\n    if (this.isStyleLoaded()) {\n      cb();\n    } else {\n      this.once(\"styledata\", () => {\n        cb();\n      });\n    }\n  }\n\n  async fitToIpBounds() {\n    const ipGeolocateResult = await geolocation.info();\n    this.fitBounds(\n      ipGeolocateResult.country_bounds as [number, number, number, number],\n      {\n        duration: 0,\n        padding: 100,\n      }\n    );\n  }\n\n  async centerOnIpPoint(zoom: number | undefined) {\n    const ipGeolocateResult = await geolocation.info();\n    this.jumpTo({\n      center: [ipGeolocateResult.longitude, ipGeolocateResult.latitude],\n      zoom: zoom || 11,\n    });\n  }\n\n  getCameraHash() {\n    const hashBin = new Float32Array(5);\n    const center = this.getCenter();\n    hashBin[0] = center.lng;\n    hashBin[1] = center.lat;\n    hashBin[2] = this.getZoom();\n    hashBin[3] = this.getPitch();\n    hashBin[4] = this.getBearing();\n    return Base64.fromUint8Array(new Uint8Array(hashBin.buffer));\n  }\n\n  /**\n   * Get the SDK config object.\n   * This is convenient to dispatch the SDK configuration to externally built layers\n   * that do not directly have access to the SDK configuration but do have access to a Map instance.\n   * @returns\n   */\n  getSdkConfig(): SdkConfig {\n    return config;\n  }\n\n  /**\n   * Get the MapTiler session ID. Convenient to dispatch to externaly built component\n   * that do not directly have access to the SDK configuration but do have access to a Map instance.\n   * @returns\n   */\n  getMaptilerSessionId(): string {\n    return MAPTILER_SESSION_ID;\n  }\n}\n","/**\n * This is an extension of MapLibre Marker to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class Marker extends maplibregl.Marker {\n  addTo(map: Map | MapMLGL): this {\n    return super.addTo(map as MapMLGL);\n  }\n}\n","/**\n * This is an extension of MapLibre Popup to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class Popup extends maplibregl.Popup {\n  addTo(map: Map | MapMLGL): this {\n    return super.addTo(map as MapMLGL);\n  }\n}\n","/**\n * This is an extension of MapLibre Style to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL, StyleOptions } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class Style extends maplibregl.Style {\n  constructor(map: Map, options: StyleOptions = {}) {\n    super(map as MapMLGL, options);\n  }\n}\n","/**\n * This is an extension of MapLibre CanvasSource to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class CanvasSource extends maplibregl.CanvasSource {\n  onAdd(map: Map | MapMLGL) {\n    super.onAdd(map as MapMLGL);\n  }\n}\n","/**\n * This is an extension of MapLibre GeoJSONSource to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class GeoJSONSource extends maplibregl.GeoJSONSource {\n  onAdd(map: Map | MapMLGL) {\n    super.onAdd(map as MapMLGL);\n  }\n}\n","/**\n * This is an extension of MapLibre ImageSource to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class ImageSource extends maplibregl.ImageSource {\n  onAdd(map: Map | MapMLGL) {\n    super.onAdd(map as MapMLGL);\n  }\n}\n","/**\n * This is an extension of MapLibre RasterTileSource to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class RasterTileSource extends maplibregl.RasterTileSource {\n  onAdd(map: Map | MapMLGL) {\n    super.onAdd(map as MapMLGL);\n  }\n}\n","/**\n * This is an extension of MapLibre RasterDEMTileSource to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class RasterDEMTileSource extends maplibregl.RasterDEMTileSource {\n  onAdd(map: Map | MapMLGL) {\n    super.onAdd(map as MapMLGL);\n  }\n}\n","/**\n * This is an extension of MapLibre VectorTileSource to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class VectorTileSource extends maplibregl.VectorTileSource {\n  onAdd(map: Map | MapMLGL) {\n    super.onAdd(map as MapMLGL);\n  }\n}\n","/**\n * This is an extension of MapLibre VideoSource to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class VideoSource extends maplibregl.VideoSource {\n  onAdd(map: Map | MapMLGL) {\n    super.onAdd(map as MapMLGL);\n  }\n}\n","/**\n * This is an extension of MapLibre TerrainControl to make it fully type compatible with the SDK\n */\n\nimport maplibregl from \"maplibre-gl\";\nimport type { Map as MapMLGL } from \"maplibre-gl\";\nimport { Map } from \"./Map\";\n\nexport class TerrainControl extends maplibregl.TerrainControl {\n  onAdd(map: Map | MapMLGL) {\n    return super.onAdd(map as MapMLGL);\n  }\n}\n","/**\n * This is TypeScript rewrite of the Point class to use instead of the version imported in MapLibre.\n * It also uses a class instead of prototypes.\n */\n\n/**\n * Row major 2x2 matrix\n */\nexport type Matrix2 = [number, number, number, number];\n\n/**\n * a point\n * @param x\n * @param y\n */\nexport class Point {\n  public x: number;\n  public y: number;\n\n  constructor(x: number, y: number) {\n    this.x = x;\n    this.y = y;\n  }\n\n  private _matMult(m: Matrix2): Point {\n    const x = m[0] * this.x + m[1] * this.y;\n    const y = m[2] * this.x + m[3] * this.y;\n    this.x = x;\n    this.y = y;\n    return this;\n  }\n\n  private _add(p: Point): Point {\n    this.x += p.x;\n    this.y += p.y;\n    return this;\n  }\n\n  private _sub(p: Point): Point {\n    this.x -= p.x;\n    this.y -= p.y;\n    return this;\n  }\n\n  private _mult(k: number): Point {\n    this.x *= k;\n    this.y *= k;\n    return this;\n  }\n\n  private _div(k: number): Point {\n    this.x /= k;\n    this.y /= k;\n    return this;\n  }\n\n  private _multByPoint(p: Point): Point {\n    this.x *= p.x;\n    this.y *= p.y;\n    return this;\n  }\n\n  private _divByPoint(p: Point): Point {\n    this.x /= p.x;\n    this.y /= p.y;\n    return this;\n  }\n\n  private _unit(): Point {\n    this._div(this.mag());\n    return this;\n  }\n\n  private _perp(): Point {\n    const y = this.y;\n    this.y = this.x;\n    this.x = -y;\n    return this;\n  }\n\n  private _rotate(angle: number): Point {\n    const cos = Math.cos(angle);\n    const sin = Math.sin(angle);\n    const x = cos * this.x - sin * this.y;\n    const y = sin * this.x + cos * this.y;\n    this.x = x;\n    this.y = y;\n    return this;\n  }\n\n  private _rotateAround(angle: number, p: Point): Point {\n    const cos = Math.cos(angle);\n    const sin = Math.sin(angle);\n    const x = p.x + cos * (this.x - p.x) - sin * (this.y - p.y);\n    const y = p.y + sin * (this.x - p.x) + cos * (this.y - p.y);\n    this.x = x;\n    this.y = y;\n    return this;\n  }\n\n  private _round(): Point {\n    this.x = Math.round(this.x);\n    this.y = Math.round(this.y);\n    return this;\n  }\n\n  /**\n   * Clone this point, returning a new point that can be modified\n   * without affecting the old one.\n   * @return {Point} the clone\n   */\n  clone(): Point {\n    return new Point(this.x, this.y);\n  }\n\n  /**\n   * Add this point's x & y coordinates to another point,\n   * yielding a new point.\n   * @param {Point} p the other point\n   * @return {Point} output point\n   */\n  add(p: Point): Point {\n    return this.clone()._add(p);\n  }\n\n  /**\n   * Subtract this point's x & y coordinates to from point,\n   * yielding a new point.\n   * @param {Point} p the other point\n   * @return {Point} output point\n   */\n  sub(p: Point): Point {\n    return this.clone()._sub(p);\n  }\n\n  /**\n   * Multiply this point's x & y coordinates by point,\n   * yielding a new point.\n   * @param {Point} p the other point\n   * @return {Point} output point\n   */\n  multByPoint(p: Point): Point {\n    return this.clone()._multByPoint(p);\n  }\n\n  /**\n   * Divide this point's x & y coordinates by point,\n   * yielding a new point.\n   * @param {Point} p the other point\n   * @return {Point} output point\n   */\n  divByPoint(p: Point): Point {\n    return this.clone()._divByPoint(p);\n  }\n\n  /**\n   * Multiply this point's x & y coordinates by a factor,\n   * yielding a new point.\n   * @param {Number} k factor\n   * @return {Point} output point\n   */\n  mult(k: number): Point {\n    return this.clone()._mult(k);\n  }\n\n  /**\n   * Divide this point's x & y coordinates by a factor,\n   * yielding a new point.\n   * @param {Point} k factor\n   * @return {Point} output point\n   */\n  div(k: number): Point {\n    return this.clone()._div(k);\n  }\n\n  /**\n   * Rotate this point around the 0, 0 origin by an angle a,\n   * given in radians\n   * @param {Number} a angle to rotate around, in radians\n   * @return {Point} output point\n   */\n  rotate(a: number): Point {\n    return this.clone()._rotate(a);\n  }\n\n  /**\n   * Rotate this point around p point by an angle a,\n   * given in radians\n   * @param {Number} a angle to rotate around, in radians\n   * @param {Point} p Point to rotate around\n   * @return {Point} output point\n   */\n  rotateAround(a: number, p: Point): Point {\n    return this.clone()._rotateAround(a, p);\n  }\n\n  /**\n   * Multiply this point by a 4x1 transformation matrix\n   * @param {Array<Number>} m transformation matrix\n   * @return {Point} output point\n   */\n  matMult(m: Matrix2): Point {\n    return this.clone()._matMult(m);\n  }\n\n  /**\n   * Calculate this point but as a unit vector from 0, 0, meaning\n   * that the distance from the resulting point to the 0, 0\n   * coordinate will be equal to 1 and the angle from the resulting\n   * point to the 0, 0 coordinate will be the same as before.\n   * @return {Point} unit vector point\n   */\n  unit(): Point {\n    return this.clone()._unit();\n  }\n\n  /**\n   * Compute a perpendicular point, where the new y coordinate\n   * is the old x coordinate and the new x coordinate is the old y\n   * coordinate multiplied by -1\n   * @return {Point} perpendicular point\n   */\n  perp(): Point {\n    return this.clone()._perp();\n  }\n\n  /**\n   * Return a version of this point with the x & y coordinates\n   * rounded to integers.\n   * @return {Point} rounded point\n   */\n  round(): Point {\n    return this.clone()._round();\n  }\n\n  /**\n   * Return the magnitude of this point: this is the Euclidean\n   * distance from the 0, 0 coordinate to this point's x and y\n   * coordinates.\n   * @return {Number} magnitude\n   */\n  mag(): number {\n    return Math.sqrt(this.x * this.x + this.y * this.y);\n  }\n\n  /**\n   * Judge whether this point is equal to another point, returning\n   * true or false.\n   * @param {Point} other the other point\n   * @return {boolean} whether the points are equal\n   */\n  equals(other): boolean {\n    return this.x === other.x && this.y === other.y;\n  }\n\n  /**\n   * Calculate the distance from this point to another point\n   * @param {Point} p the other point\n   * @return {Number} distance\n   */\n  dist(p): number {\n    return Math.sqrt(this.distSqr(p));\n  }\n\n  /**\n   * Calculate the distance from this point to another point,\n   * without the square root step. Useful if you're comparing\n   * relative distances.\n   * @param {Point} p the other point\n   * @return {Number} distance\n   */\n  distSqr(p): number {\n    const dx = p.x - this.x;\n    const dy = p.y - this.y;\n    return dx * dx + dy * dy;\n  }\n\n  /**\n   * Get the angle from the 0, 0 coordinate to this point, in radians\n   * coordinates.\n   * @return {Number} angle\n   */\n  angle(): number {\n    return Math.atan2(this.y, this.x);\n  }\n\n  /**\n   * Get the angle from this point to another point, in radians\n   * @param {Point} b the other point\n   * @return {Number} angle\n   */\n  angleTo(b: Point): number {\n    return Math.atan2(this.y - b.y, this.x - b.x);\n  }\n\n  /**\n   * Get the angle between this point and another point, in radians\n   * @param {Point} b the other point\n   * @return {Number} angle\n   */\n  angleWith(b: Point): number {\n    return this.angleWithSep(b.x, b.y);\n  }\n\n  /*\n   * Find the angle of the two vectors, solving the formula for\n   * the cross product a x b = |a||b|sin(θ) for θ.\n   * @param {Number} x the x-coordinate\n   * @param {Number} y the y-coordinate\n   * @return {Number} the angle in radians\n   */\n  angleWithSep(x: number, y: number): number {\n    return Math.atan2(this.x * y - this.y * x, this.x * x + this.y * y);\n  }\n\n  /**\n   * Construct a point from an array if necessary, otherwise if the input\n   * is already a Point, or an unknown type, return it unchanged\n   * @param {Array<number> | Point} a any kind of input value\n   * @return {Point} constructed point, or passed-through value.\n   * @example\n   * // this\n   * var point = Point.convert([0, 1]);\n   * // is equivalent to\n   * var point = new Point(0, 1);\n   */\n  static convert(a: Point | Array<number>) {\n    if (a instanceof Point) {\n      return a;\n    }\n    if (Array.isArray(a)) {\n      return new Point(a[0], a[1]);\n    }\n    return a;\n  }\n}\n","/**\n * Maplibre export first, then extensions can overload the exports.\n */\nexport * from \"maplibre-gl\";\n\n/**\n * To perform explicit named export so that they are included in the UMD bundle\n */\n// import * as ML from \"maplibre-gl\";\n\nimport maplibregl from \"maplibre-gl\";\n\nconst {\n  supported,\n  setRTLTextPlugin,\n  getRTLTextPluginStatus,\n  LngLat,\n  LngLatBounds,\n  MercatorCoordinate,\n  Evented,\n  AJAXError,\n  prewarm,\n  clearPrewarmedResources,\n  version,\n  workerCount,\n  maxParallelImageRequests,\n  workerUrl,\n  addProtocol,\n  removeProtocol,\n} = maplibregl;\n\n// We still want to export maplibregl.Map, but as a different name\nconst MapMLGL = maplibregl.Map;\nconst MarkerMLGL = maplibregl.Marker;\nconst PopupMLGL = maplibregl.Popup;\nconst StyleMLGL = maplibregl.Style;\nconst CanvasSourceMLGL = maplibregl.CanvasSource;\nconst GeoJSONSourceMLGL = maplibregl.GeoJSONSource;\nconst ImageSourceMLGL = maplibregl.ImageSource;\nconst RasterTileSourceMLGL = maplibregl.RasterTileSource;\nconst RasterDEMTileSourceMLGL = maplibregl.RasterDEMTileSource;\nconst VectorTileSourceMLGL = maplibregl.VectorTileSource;\nconst VideoSourceMLGL = maplibregl.VideoSource;\nconst NavigationControlMLGL = maplibregl.NavigationControl;\nconst GeolocateControlMLGL = maplibregl.GeolocateControl;\nconst AttributionControlMLGL = maplibregl.AttributionControl;\nconst LogoControlMLGL = maplibregl.LogoControl;\nconst ScaleControlMLGL = maplibregl.ScaleControl;\nconst FullscreenControlMLGL = maplibregl.FullscreenControl;\nconst TerrainControlMLGL = maplibregl.TerrainControl;\n\nexport {\n  supported,\n  setRTLTextPlugin,\n  getRTLTextPluginStatus,\n  PopupMLGL,\n  MarkerMLGL,\n  StyleMLGL,\n  LngLat,\n  LngLatBounds,\n  MercatorCoordinate,\n  Evented,\n  AJAXError,\n  CanvasSourceMLGL,\n  GeoJSONSourceMLGL,\n  ImageSourceMLGL,\n  RasterDEMTileSourceMLGL,\n  RasterTileSourceMLGL,\n  VectorTileSourceMLGL,\n  VideoSourceMLGL,\n  prewarm,\n  clearPrewarmedResources,\n  version,\n  workerCount,\n  maxParallelImageRequests,\n  workerUrl,\n  addProtocol,\n  removeProtocol,\n  MapMLGL,\n};\n\n// Exporting types of class instances from MapLibre:\nexport type NavigationControlMLGL = InstanceType<typeof NavigationControlMLGL>;\nexport type GeolocateControlMLGL = InstanceType<typeof GeolocateControlMLGL>;\nexport type AttributionControlMLGL = InstanceType<\n  typeof AttributionControlMLGL\n>;\nexport type LogoControlMLGL = InstanceType<typeof LogoControlMLGL>;\nexport type ScaleControlMLGL = InstanceType<typeof ScaleControlMLGL>;\nexport type FullscreenControlMLGL = InstanceType<typeof FullscreenControlMLGL>;\nexport type TerrainControlMLGL = InstanceType<typeof TerrainControlMLGL>;\nexport type MarkerMLGL = InstanceType<typeof MarkerMLGL>;\nexport type PopupMLGL = InstanceType<typeof PopupMLGL>;\nexport type StyleMLGL = InstanceType<typeof StyleMLGL>;\nexport type LngLat = InstanceType<typeof LngLat>;\nexport type LngLatBounds = InstanceType<typeof LngLatBounds>;\nexport type MercatorCoordinate = InstanceType<typeof MercatorCoordinate>;\nexport type Evented = InstanceType<typeof Evented>;\nexport type AJAXError = InstanceType<typeof AJAXError>;\nexport type CanvasSourceMLGL = InstanceType<typeof CanvasSourceMLGL>;\nexport type GeoJSONSourceMLGL = InstanceType<typeof GeoJSONSourceMLGL>;\nexport type ImageSourceMLGL = InstanceType<typeof ImageSourceMLGL>;\nexport type RasterDEMTileSourceMLGL = InstanceType<\n  typeof RasterDEMTileSourceMLGL\n>;\nexport type RasterTileSourceMLGL = InstanceType<typeof RasterTileSourceMLGL>;\nexport type VectorTileSourceMLGL = InstanceType<typeof VectorTileSourceMLGL>;\nexport type VideoSourceMLGL = InstanceType<typeof VideoSourceMLGL>;\nexport type MapMLGL = InstanceType<typeof MapMLGL>;\n\n// SDK specific\nimport { Map, GeolocationType } from \"./Map\";\nimport type { MapOptions, LoadWithTerrainEvent } from \"./Map\";\n\nimport { Marker } from \"./Marker\";\nimport { Popup } from \"./Popup\";\nimport { Style } from \"./Style\";\nimport { CanvasSource } from \"./CanvasSource\";\nimport { GeoJSONSource } from \"./GeoJSONSource\";\nimport { ImageSource } from \"./ImageSource\";\nimport { RasterTileSource } from \"./RasterTileSource\";\nimport { RasterDEMTileSource } from \"./RasterDEMTileSource\";\nimport { VectorTileSource } from \"./VectorTileSource\";\nimport { VideoSource } from \"./VideoSource\";\nimport { NavigationControl } from \"./NavigationControl\";\nimport { GeolocateControl } from \"./GeolocateControl\";\nimport { AttributionControl } from \"./AttributionControl\";\nimport { LogoControl } from \"./LogoControl\";\nimport { ScaleControl } from \"./ScaleControl\";\nimport { FullscreenControl } from \"./FullscreenControl\";\nimport { TerrainControl } from \"./TerrainControl\";\n\n// Import of modified versions of the controls\nimport { MaptilerGeolocateControl } from \"./MaptilerGeolocateControl\";\nimport { MaptilerLogoControl } from \"./MaptilerLogoControl\";\nimport { MaptilerTerrainControl } from \"./MaptilerTerrainControl\";\nimport { MaptilerNavigationControl } from \"./MaptilerNavigationControl\";\n\n// importing client functions to expose them as part of the SDK\nimport type {\n  BBox,\n  Position,\n  GeocodingOptions,\n  CoordinatesSearchOptions,\n  CenteredStaticMapOptions,\n  AutomaticStaticMapOptions,\n  BoundedStaticMapOptions,\n} from \"@maptiler/client\";\n\nimport {\n  geocoding,\n  geolocation,\n  coordinates,\n  data,\n  staticMaps,\n  ServiceError,\n  LanguageGeocoding,\n  LanguageGeocodingString,\n  ReferenceMapStyle,\n  MapStyle,\n  MapStyleVariant,\n} from \"@maptiler/client\";\n\nimport type { MapStyleType } from \"@maptiler/client\";\n\nimport { Point } from \"./Point\";\nimport type { Matrix2 } from \"./Point\";\n\n// Importing enums and configs\nimport { config, SdkConfig } from \"./config\";\nimport {\n  Language,\n  LanguageString,\n  LanguageKey,\n  setPrimaryLanguage,\n  setSecondaryLanguage,\n} from \"./language\";\nimport type { Unit } from \"./unit\";\n\n// Exporting types\nexport type {\n  MapOptions,\n  LoadWithTerrainEvent,\n  GeocodingOptions,\n  BBox,\n  Position,\n  CoordinatesSearchOptions,\n  CenteredStaticMapOptions,\n  BoundedStaticMapOptions,\n  AutomaticStaticMapOptions,\n  LanguageString,\n  LanguageKey,\n  LanguageGeocodingString,\n  Unit,\n  MapStyleType,\n  Matrix2,\n};\n\n// Exporting classes, objects, functions, etc.\nexport {\n  Map,\n  Marker,\n  Popup,\n  Style,\n  CanvasSource,\n  GeoJSONSource,\n  ImageSource,\n  RasterTileSource,\n  RasterDEMTileSource,\n  VideoSource,\n  NavigationControl,\n  GeolocateControl,\n  AttributionControl,\n  LogoControl,\n  ScaleControl,\n  FullscreenControl,\n  TerrainControl,\n  VectorTileSource,\n  GeolocationType,\n  SdkConfig,\n  config,\n  ServiceError,\n  geocoding,\n  geolocation,\n  coordinates,\n  data,\n  staticMaps,\n  MapStyle,\n  Language,\n  LanguageGeocoding,\n  setPrimaryLanguage,\n  setSecondaryLanguage,\n  Point,\n  ReferenceMapStyle,\n  MapStyleVariant,\n  MaptilerGeolocateControl,\n  MaptilerLogoControl,\n  MaptilerTerrainControl,\n  MaptilerNavigationControl,\n};\n"],"names":["clientConfig","maplibregl","Marker","LngLat","__spreadProps","__spreadValues","uuidv4"],"mappings":"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"}