diff --git a/.babelrc b/.babelrc deleted file mode 100644 index 6b56a97f7..000000000 --- a/.babelrc +++ /dev/null @@ -1,19 +0,0 @@ -{ - "presets": [ - [ "@babel/preset-env", { - "modules": false, - "targets": { - "browsers": [ - "last 2 Chrome versions", - "last 2 Firefox versions", - "last 2 Safari versions", - "last 2 iOS versions", - "last 1 Android version", - "last 1 ChromeAndroid version", - "ie 11" - ] - } - } ], - "@babel/preset-react" - ] - } diff --git a/.buildpacks b/.buildpacks index d33bfd6ed..4c900729e 100644 --- a/.buildpacks +++ b/.buildpacks @@ -1,2 +1,3 @@ https://github.com/Scalingo/apt-buildpack +https://github.com/Scalingo/nodejs-buildpack https://github.com/Scalingo/python-buildpack diff --git a/.env.example b/.env.example index ebb3304e0..a2762dee7 100644 --- a/.env.example +++ b/.env.example @@ -36,8 +36,7 @@ EMAIL_SMTP_KEY=ASK_A_MAINTAINER EMAIL_HOST_USER=YOUR_EMAIL MATOMO_ACTIVATE=0 -MATOMO_SCRIPT_NAME=container_mlVvm9TG.js -MATOMO_TOKEN=TO_FILL + HIGHCHART_SERVER=https://highcharts-export.osc-fr1.scalingo.io MATTERMOST_WEBHOOK=https://mattermost.incubateur.net/hooks/uak581f8bidyxp5td67rurj5sh diff --git a/.gitignore b/.gitignore index 978e184c1..c2a7de035 100644 --- a/.gitignore +++ b/.gitignore @@ -166,3 +166,7 @@ staticroot/* public_data/static/SSCH* diff_bfc_* .idea + +# Webpack bundles +static/assets/scripts/ +static/assets/styles/*.css.map diff --git a/.slugignore b/.slugignore index 388f4cdcc..48b25a403 100644 --- a/.slugignore +++ b/.slugignore @@ -1,2 +1,4 @@ assets/scripts assets/styles +assets/types +/node_modules diff --git a/README.md b/README.md index 6f30fc26a..2a6d8f246 100644 --- a/README.md +++ b/README.md @@ -69,8 +69,6 @@ Le site est désormais accessible en local à cette adresse: | LOCAL_FILE_DIRECTORY | Emplacement des données locales (utile pour charger des shapefile en local au lieu de S3) | public_data/local_data | | MATTERMOST_WEBHOOK | Webhook personnel pour envoyer des messages dans Mattermost | https://mattermost.incubateur.net/hooks/uak581f8bidyxp5td67rurj5sh | | MATOMO_ACTIVATE | Détermine si des infos doivent être envoyé à Matomo | 0 | -| MATOMO_SCRIPT_NAME | | | -| MATOMO_TOKEN | Token pour envoyer les données à Matomo | | | POSTGRES_DB | Nom de la base de donnée (local uniquement) | postgres | | POSTGRES_USER | Username par défaut de la base de donnée (local uniquement) | postgres | | POSTGRES_PASSWORD | Password par défaut de la base de donnée (local uniquement) | postgres | diff --git a/airflow/dags/ingest_admin_express.py b/airflow/dags/ingest_admin_express.py index 72bb9ac15..4c6781ce7 100644 --- a/airflow/dags/ingest_admin_express.py +++ b/airflow/dags/ingest_admin_express.py @@ -39,51 +39,46 @@ def get_source_by_name(name: str) -> dict: type="string", enum=zones, ), - "refresh_source": Param( - default=False, - description="Rafraîchir la source", - type="boolean", - ), }, ) def ingest_admin_express(): bucket_name = "airflow-staging" + tmp_path = "/tmp/admin_express" @task.python def download_admin_express(**context) -> str: + print(context["params"]["zone"]) url = get_source_by_name(context["params"]["zone"])["url"] - + print(url) filename = url.split("/")[-1] + print(filename) path_on_bucket = f"{bucket_name}/{filename}" print(path_on_bucket) - - file_exists = Container().s3().exists(path_on_bucket) - - if file_exists and not context["params"]["refresh_source"]: - return path_on_bucket - opener = URLopener() opener.addheader("User-Agent", "Mozilla/5.0") opener.retrieve(url=url, filename=filename) - Container().s3().put_file(filename, path_on_bucket) - + os.remove(filename) return path_on_bucket @task.python def ingest(path_on_bucket, **context) -> str: - srid = get_source_by_name(context["params"]["zone"])["srid"] - shp_to_table_map = get_source_by_name(context["params"]["zone"])["shapefile_to_table"] + source = get_source_by_name(context["params"]["zone"]) + srid = source["srid"] + print(srid) + shp_to_table_map = source["shapefile_to_table"] + print(shp_to_table_map) with Container().s3().open(path_on_bucket, "rb") as f: - py7zr.SevenZipFile(f, mode="r").extractall() - for dirpath, _, filenames in os.walk("."): + py7zr.SevenZipFile(f, mode="r").extractall(path=tmp_path) + for dirpath, _, filenames in os.walk(tmp_path): for filename in filenames: if filename.endswith(".shp"): table_name = shp_to_table_map.get(filename) if not table_name: continue path = os.path.abspath(os.path.join(dirpath, filename)) + print(path) cmd = [ "ogr2ogr", "-f", @@ -113,9 +108,14 @@ def dbt_run(**context): dbt_run_cmd = f"dbt build -s {dbt_selector}" return 'cd "${AIRFLOW_HOME}/include/sql/sparte" && ' + dbt_run_cmd + @task.bash + def cleanup() -> str: + return f"rm -rf {tmp_path}" + path_on_bucket = download_admin_express() ingest_result = ingest(path_on_bucket) ingest_result >> dbt_run() + ingest_result >> cleanup() # Instantiate the DAG diff --git a/airflow/dags/ingest_cog_changes.py b/airflow/dags/ingest_cog_changes.py new file mode 100644 index 000000000..d4293e04a --- /dev/null +++ b/airflow/dags/ingest_cog_changes.py @@ -0,0 +1,61 @@ +import os +from urllib.request import URLopener + +import pandas as pd +from airflow.decorators import dag, task +from airflow.models.param import Param +from include.container import Container +from pendulum import datetime + +urls = { + "2024": "https://www.insee.fr/fr/statistiques/fichier/7766585/v_mvt_commune_2024.csv", +} + + +@dag( + start_date=datetime(2024, 1, 1), + schedule="@once", + catchup=False, + doc_md=__doc__, + max_active_runs=1, + default_args={"owner": "Alexis Athlani", "retries": 3}, + tags=["INSEE"], + params={ + "year": Param( + default="2024", + description="Année des changements", + type="string", + enum=list(urls.keys()), + ), + }, +) +def ingest_cog_changes(): + bucket_name = "airflow-staging" + tmp_localpath = "/tmp/cog_changes" + + @task.python + def download_change_file(**context) -> str: + year = context["params"]["year"] + filename = urls[year].split("/")[-1] + path_on_bucket = f"{bucket_name}/{filename}" + opener = URLopener() + opener.addheader("User-Agent", "Mozilla/5.0") + opener.retrieve(url=urls[year], filename=filename) + Container().s3().put_file(filename, path_on_bucket) + os.remove(filename) + return path_on_bucket + + @task.python + def ingest(path_on_bucket, **context) -> int | None: + Container().s3().get_file(path_on_bucket, tmp_localpath) + df = pd.read_csv(tmp_localpath) + table_name = f"insee_cog_changes_{context['params']['year']}" + row_count = df.to_sql(table_name, con=Container().sqlalchemy_dbt_conn(), if_exists="replace") + os.remove(tmp_localpath) + return row_count + + path_on_bucket = download_change_file() + ingest(path_on_bucket) + + +ingest_cog_changes() diff --git a/airflow/dags/ingest_majic.py b/airflow/dags/ingest_majic.py new file mode 100644 index 000000000..092067025 --- /dev/null +++ b/airflow/dags/ingest_majic.py @@ -0,0 +1,101 @@ +import shutil +import subprocess +from typing import List +from zipfile import ZipFile + +from airflow.decorators import dag, task +from airflow.operators.python import PythonOperator +from include.container import Container +from include.majic.sources import sources +from include.pools import DBT_POOL +from include.utils import ( + get_dbt_command_from_directory, + get_first_shapefile_path_in_dir, +) +from pendulum import datetime + +BUCKET_NAME = "airflow-staging" +TMP_PATH = "/tmp/majic" + + +def load_shapefile_to_postgres(source: dict): + shapefile_on_s3 = source["shapefile_on_s3"] + srid = source["srid"] + table_name = source["table_name"] + path_on_bucket = f"{BUCKET_NAME}/{shapefile_on_s3}" + + with Container().s3().open(path_on_bucket, "rb") as f: + zip_file = ZipFile(f) + tmp_path = f"{TMP_PATH}/{table_name}" + zip_file.extractall(tmp_path) + shapefile_path = get_first_shapefile_path_in_dir(tmp_path) + cmd = [ + "ogr2ogr", + "-f", + '"PostgreSQL"', + f'"{Container().gdal_dbt_conn().encode()}"', + "-overwrite", + "-lco", + "GEOMETRY_NAME=geom", + "-a_srs", + f"EPSG:{srid}", + "-nlt", + "MULTIPOLYGON", + "-nlt", + "PROMOTE_TO_MULTI", + "-nln", + table_name, + shapefile_path, + "--config", + "PG_USE_COPY", + "YES", + ] + subprocess.run(" ".join(cmd), shell=True, check=True) + + shutil.rmtree(TMP_PATH) + + +@dag( + start_date=datetime(2024, 1, 1), + schedule="@once", + catchup=False, + max_active_runs=1, + default_args={"owner": "Alexis Athlani", "retries": 3}, + tags=["Majic", "Cerema"], +) +def ingest_majic(): + # Les fichiers de consommation d'espace sont sur le dropbox du Cerema + # Ils ne sont pas acessibles programmatiquement, donc il faut les télécharger manuellement + # et les mettre dans le bucket airflow-staging, dans le dossier majic + + ingest_tasks: List[PythonOperator] = [] + + for source in sources: + ingest_task = PythonOperator( + task_id=f"ingest_{source['table_name']}", + python_callable=load_shapefile_to_postgres, + op_kwargs={"source": source}, + ) + ingest_tasks.append(ingest_task) + + @task.bash(pool=DBT_POOL) + def dbt_build() -> str: + return get_dbt_command_from_directory(cmd="dbt build -s +consommation.sql+") + + @task.bash() + def cleanup() -> str: + return f"rm -rf {TMP_PATH}" + + for i in range(len(ingest_tasks) - 1): + ingest_tasks[i] >> ingest_tasks[i + 1] + + build = dbt_build() + cleanup_task = cleanup() + + # Build the models and clean up the temporary files + # after all the ingest tasks have completed + ingest_tasks[-1].set_downstream(build) + build.set_downstream(cleanup_task) + + +ingest_majic() diff --git a/airflow/dags/ingest_scots.py b/airflow/dags/ingest_scots.py new file mode 100644 index 000000000..f625957f4 --- /dev/null +++ b/airflow/dags/ingest_scots.py @@ -0,0 +1,87 @@ +import os + +import pandas as pd +import requests +from airflow.decorators import dag, task +from include.container import Container +from include.pools import DBT_POOL +from pendulum import datetime + +SCOT_ENDPOINT = "https://api-sudocuh.datahub.din.developpement-durable.gouv.fr/sudocuh/enquetes/ref/scot/liste/CSV?annee_cog=2024" # noqa: E501 (line too long) +SCOT_COMMUNES_ENDPOINT = "https://api-sudocuh.datahub.din.developpement-durable.gouv.fr/sudocuh/enquetes/ref/scot/communes/CSV?annee_cog=2024" # noqa: E501 (line too long) + + +@dag( + start_date=datetime(2024, 1, 1), + schedule="@once", + catchup=False, + doc_md=__doc__, + max_active_runs=1, + default_args={"owner": "Alexis Athlani", "retries": 3}, + tags=["SUDOCUH"], +) +def ingest_scots(): + bucket_name = "airflow-staging" + scot_filename = "scot.csv" + scot_communes_filename = "scot_communes.csv" + tmp_localpath_scot = f"/tmp/{scot_filename}" + tmp_localpath_scot_communes = f"/tmp/{scot_communes_filename}" + + @task.python + def download_scots() -> str: + request = requests.get(SCOT_ENDPOINT) + + with open(tmp_localpath_scot, "wb") as f: + f.write(request.content) + + path_on_bucket = f"{bucket_name}/{scot_filename}" + + Container().s3().put_file(tmp_localpath_scot, path_on_bucket) + os.remove(tmp_localpath_scot) + return path_on_bucket + + @task.python + def download_scot_communes() -> str: + request = requests.get(SCOT_COMMUNES_ENDPOINT) + + with open(tmp_localpath_scot_communes, "wb") as f: + f.write(request.content) + + path_on_bucket = f"{bucket_name}/{scot_communes_filename}" + + Container().s3().put_file(tmp_localpath_scot_communes, path_on_bucket) + os.remove(tmp_localpath_scot_communes) + return path_on_bucket + + @task.python + def ingest_scots(path_on_bucket) -> int | None: + Container().s3().get_file(path_on_bucket, tmp_localpath_scot) + df = pd.read_csv(tmp_localpath_scot, sep=";") + table_name = "sudocuh_scot" + row_count = df.to_sql(table_name, con=Container().sqlalchemy_dbt_conn(), if_exists="replace") + os.remove(tmp_localpath_scot) + return row_count + + @task.python + def ingest_scot_communes(path_on_bucket) -> int | None: + Container().s3().get_file(path_on_bucket, tmp_localpath_scot_communes) + df = pd.read_csv(tmp_localpath_scot_communes, sep=";") + table_name = "sudocuh_scot_communes" + row_count = df.to_sql(table_name, con=Container().sqlalchemy_dbt_conn(), if_exists="replace") + os.remove(tmp_localpath_scot_communes) + return row_count + + @task.bash(retries=0, trigger_rule="all_success", pool=DBT_POOL) + def dbt_build(**context): + return 'cd "${AIRFLOW_HOME}/include/sql/sparte" && dbt build -s sudocuh' + + scots_path = download_scots() + scot_communes_path = download_scot_communes() + + ingest_scots_result = ingest_scots(scots_path) + ingest_scot_communes_result = ingest_scot_communes(scot_communes_path) + + ingest_scots_result >> ingest_scot_communes_result >> dbt_build() + + +ingest_scots() diff --git a/airflow/dags/update_app.py b/airflow/dags/update_app.py index 983b46154..28e8f3669 100644 --- a/airflow/dags/update_app.py +++ b/airflow/dags/update_app.py @@ -152,6 +152,8 @@ def copy_public_data_commune(**context): return copy_table_from_dw_to_app( from_table="public_ocsge.for_app_commune", to_table="public.public_data_commune", + use_subset=context["params"]["use_subset"], + subset_where=f"mpoly && ({context['params']['subset_geom']})", environment=context["params"]["environment"], btree_index_columns=[ ["insee"], @@ -163,6 +165,8 @@ def copy_public_data_departement(**context): return copy_table_from_dw_to_app( from_table="public_ocsge.for_app_departement", to_table="public.public_data_departement", + use_subset=context["params"]["use_subset"], + subset_where=f"mpoly && ({context['params']['subset_geom']})", environment=context["params"]["environment"], btree_index_columns=[ ["source_id"], @@ -187,6 +191,8 @@ def copy_public_data_ocsgediff(**context): return copy_table_from_dw_to_app( from_table="public_ocsge.for_app_ocsgediff", to_table="public.public_data_ocsgediff", + use_subset=context["params"]["use_subset"], + subset_where=f"mpoly && ({context['params']['subset_geom']})", environment=context["params"]["environment"], btree_index_columns=[ ["year_old"], @@ -204,6 +210,8 @@ def copy_public_data_communediff(**context): return copy_table_from_dw_to_app( from_table="public_ocsge.for_app_communediff", to_table="public.public_data_communediff", + use_subset=context["params"]["use_subset"], + subset_where=f"mpoly && ({context['params']['subset_geom']})", environment=context["params"]["environment"], btree_index_columns=[ ["year_old"], @@ -217,6 +225,8 @@ def copy_public_data_zoneconstruite(**context): return copy_table_from_dw_to_app( from_table="public_ocsge.for_app_zoneconstruite", to_table="public.public_data_zoneconstruite", + use_subset=context["params"]["use_subset"], + subset_where=f"mpoly && ({context['params']['subset_geom']})", environment=context["params"]["environment"], btree_index_columns=[ ["millesime"], diff --git a/airflow/include/admin_express/sources.json b/airflow/include/admin_express/sources.json index 7589f918f..61b2b1658 100644 --- a/airflow/include/admin_express/sources.json +++ b/airflow/include/admin_express/sources.json @@ -5,18 +5,20 @@ "srid": 2154, "shapefile_to_table": { "COMMUNE.shp": "commune_metropole", - "DEPARTEMENT.shp": "departement_metropole" + "DEPARTEMENT.shp": "departement_metropole", + "EPCI.shp": "epci_metropole" }, - "dbt_selector": "commune_metropole.sql+ departement_metropole.sql+" + "dbt_selector": "commune_metropole.sql+ departement_metropole.sql+ epci_metropole.sql+" }, { "name": "Guadeloupe", "url": "https://data.geopf.fr/telechargement/download/ADMIN-EXPRESS-COG/ADMIN-EXPRESS-COG_3-2__SHP_RGAF09UTM20_GLP_2024-02-22/ADMIN-EXPRESS-COG_3-2__SHP_RGAF09UTM20_GLP_2024-02-22.7z", "srid": 32620, "shapefile_to_table": { "COMMUNE.shp": "commune_guadeloupe", - "DEPARTEMENT.shp": "departement_guadeloupe" + "DEPARTEMENT.shp": "departement_guadeloupe", + "EPCI.shp": "epci_guadeloupe" }, - "dbt_selector": "commune_guadeloupe.sql+ departement_guadeloupe.sql+" + "dbt_selector": "commune_guadeloupe.sql+ departement_guadeloupe.sql+ epci_guadeloupe.sql+" }, { "name": "Martinique", @@ -24,26 +26,29 @@ "srid": 32620, "shapefile_to_table": { "COMMUNE.shp": "commune_martinique", - "DEPARTEMENT.shp": "departement_martinique" + "DEPARTEMENT.shp": "departement_martinique", + "EPCI.shp": "epci_martinique" }, - "dbt_selector": "commune_martinique.sql+ departement_martinique.sql+" + "dbt_selector": "commune_martinique.sql+ departement_martinique.sql+ epci_martinique.sql+" }, { "name": "Guyanne", "url": "https://data.geopf.fr/telechargement/download/ADMIN-EXPRESS-COG/ADMIN-EXPRESS-COG_3-2__SHP_UTM22RGFG95_GUF_2024-02-22/ADMIN-EXPRESS-COG_3-2__SHP_UTM22RGFG95_GUF_2024-02-22.7z", "srid": 2972, "shapefile_to_table": { "COMMUNE.shp": "commune_guyane", - "DEPARTEMENT.shp": "departement_guyane" + "DEPARTEMENT.shp": "departement_guyane", + "EPCI.shp": "epci_guyane" }, - "dbt_selector": "commune_guyane.sql+ departement_guyane.sql+" + "dbt_selector": "commune_guyane.sql+ departement_guyane.sql+ epci_guyane.sql+" }, { "name": "La Réunion", "url": "https://data.geopf.fr/telechargement/download/ADMIN-EXPRESS-COG/ADMIN-EXPRESS-COG_3-2__SHP_RGR92UTM40S_REU_2024-02-22/ADMIN-EXPRESS-COG_3-2__SHP_RGR92UTM40S_REU_2024-02-22.7z", "srid": 2975, "shapefile_to_table": { "COMMUNE.shp": "commune_reunion", - "DEPARTEMENT.shp": "departement_reunion" + "DEPARTEMENT.shp": "departement_reunion", + "EPCI.shp": "epci_reunion" }, - "dbt_selector": "commune_reunion.sql+ departement_reunion.sql+" + "dbt_selector": "commune_reunion.sql+ departement_reunion.sql+ epci_reunion.sql+" } ] \ No newline at end of file diff --git a/airflow/include/container.py b/airflow/include/container.py index 6306cc4d1..b6596c946 100644 --- a/airflow/include/container.py +++ b/airflow/include/container.py @@ -16,7 +16,10 @@ def db_str_for_ogr2ogr(dbname: str, user: str, password: str, host: str, port: i return f"PG:dbname='{dbname}' host='{host}' port='{port}' user='{user}' password='{password}'" -def create_sql_alchemy_conn(url: str) -> sqlalchemy.engine.base.Connection: +def create_sql_alchemy_conn( + dbname: str, user: str, password: str, host: str, port: int +) -> sqlalchemy.engine.base.Connection: + url = f"postgresql+psycopg2://{user}:{password.replace('@', '%40')}@{host}:{port}/{dbname}" return sqlalchemy.create_engine(url) @@ -48,6 +51,15 @@ class Container(containers.DeclarativeContainer): port=getenv("DBT_DB_PORT"), ) + sqlalchemy_dbt_conn = providers.Factory( + create_sql_alchemy_conn, + dbname=getenv("DBT_DB_NAME"), + user=getenv("DBT_DB_USER"), + password=getenv("DBT_DB_PASSWORD"), + host=getenv("DBT_DB_HOST"), + port=getenv("DBT_DB_PORT"), + ) + # DEV connections gdal_dev_conn = providers.Factory( PgConnectionString, diff --git a/airflow/include/majic/sources.py b/airflow/include/majic/sources.py new file mode 100644 index 000000000..0bd6138f1 --- /dev/null +++ b/airflow/include/majic/sources.py @@ -0,0 +1,32 @@ +sources = [ + { + "name": "France Métropolitaine", + "shapefile_on_s3": "majic/obs_artif_conso_com_2009_2023.zip", + "srid": 2154, + "table_name": "majic_france_metropolitaine", + }, + { + "name": "Guadeloupe", + "shapefile_on_s3": "majic/obs_artif_conso_com_2009_2023_971.zip", + "srid": 32620, + "table_name": "majic_guadeloupe", + }, + { + "name": "Martinique", + "shapefile_on_s3": "majic/obs_artif_conso_com_2009_2023_972.zip", + "srid": 32620, + "table_name": "majic_martinique", + }, + { + "name": "Guyane", + "shapefile_on_s3": "majic/obs_artif_conso_com_2009_2023_973.zip", + "srid": 2972, + "table_name": "majic_guyane", + }, + { + "name": "La Réunion", + "shapefile_on_s3": "majic/obs_artif_conso_com_2009_2023_974.zip", + "srid": 2975, + "table_name": "majic_la_reunion", + }, +] diff --git a/airflow/include/ocsge/sources.json b/airflow/include/ocsge/sources.json index 6492ffe45..8f1eaa31a 100644 --- a/airflow/include/ocsge/sources.json +++ b/airflow/include/ocsge/sources.json @@ -1,4 +1,13 @@ { + "2A": { + "difference": { + "2019_2021": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0_DIFF_SHP_LAMB93_D02A_2019-2021/OCS-GE_2-0_DIFF_SHP_LAMB93_D02A_2019-2021.7z" + }, + "occupation_du_sol_et_zone_construite": { + "2019": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D02A_2019-01-01/OCS-GE_2-0__SHP_LAMB93_D02A_2019-01-01.7z", + "2021": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D02A_2021-01-01/OCS-GE_2-0__SHP_LAMB93_D02A_2021-01-01.7z" + } + }, "2B": { "difference": { "2019_2021": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0_DIFF_SHP_LAMB93_D02B_2019-2021/OCS-GE_2-0_DIFF_SHP_LAMB93_D02B_2019-2021.7z" @@ -89,6 +98,15 @@ "2021": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D024_2021-01-01/OCS-GE_2-0__SHP_LAMB93_D024_2021-01-01.7z" } }, + "27": { + "difference": { + "2019_2022": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0_DIFF_SHP_LAMB93_D027_2019_2022/OCS-GE_2-0_DIFF_SHP_LAMB93_D027_2019_2022.7z" + }, + "occupation_du_sol_et_zone_construite": { + "2019": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D027_2019-01-01/OCS-GE_2-0__SHP_LAMB93_D027_2019-01-01.7z", + "2022": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D027_2022-01-01/OCS-GE_2-0__SHP_LAMB93_D027_2022-01-01.7z" + } + }, "29": { "difference": { "2018_2021": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D029_DIFF_2018-2021/OCS-GE_2-0__SHP_LAMB93_D029_DIFF_2018-2021.7z" @@ -170,6 +188,15 @@ "2021": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D040_2021-01-01/OCS-GE_2-0__SHP_LAMB93_D040_2021-01-01.7z" } }, + "46": { + "difference": { + "2019_2022": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0_DIFF_SHP_LAMB93_D046_2019-2022/OCS-GE_2-0_DIFF_SHP_LAMB93_D046_2019-2022.7z" + }, + "occupation_du_sol_et_zone_construite": { + "2019": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D046_2019-01-01/OCS-GE_2-0__SHP_LAMB93_D046_2019-01-01.7z", + "2022": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D046_2022-01-01/OCS-GE_2-0__SHP_LAMB93_D046_2022-01-01.7z" + } + }, "47": { "difference": { "2017_2021": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0_DIFF_SHP_LAMB93_D047_2017-2021/OCS-GE_2-0_DIFF_SHP_LAMB93_D047_2017-2021.7z" @@ -288,6 +315,15 @@ "2022": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D072_2022-01-01/OCS-GE_2-0__SHP_LAMB93_D072_2022-01-01.7z" } }, + "73": { + "difference": { + "2019_2022": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0_DIFF_SHP_LAMB93_D073_2019-2022/OCS-GE_2-0_DIFF_SHP_LAMB93_D073_2019-2022.7z" + }, + "occupation_du_sol_et_zone_construite": { + "2019": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D073_2019-01-01/OCS-GE_2-0__SHP_LAMB93_D073_2019-01-01.7z", + "2022": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D073_2022-01-01/OCS-GE_2-0__SHP_LAMB93_D073_2022-01-01.7z" + } + }, "75": { "difference": { "2018_2021": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D075_DIFF_2018-2021/OCS-GE_2-0__SHP_LAMB93_D075_DIFF_2018-2021.7z" @@ -297,6 +333,15 @@ "2021": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D075_2021-01-01/OCS-GE_2-0__SHP_LAMB93_D075_2021-01-01.7z" } }, + "76": { + "difference": { + "2019_2022": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0_DIFF_SHP_LAMB93_D076_2019_2022/OCS-GE_2-0_DIFF_SHP_LAMB93_D076_2019_2022.7z" + }, + "occupation_du_sol_et_zone_construite": { + "2019": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D076_2019-01-01/OCS-GE_2-0__SHP_LAMB93_D076_2019-01-01.7z", + "2022": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D076_2022-01-01/OCS-GE_2-0__SHP_LAMB93_D076_2022-01-01.7z" + } + }, "77": { "difference": { "2017_2021": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0_DIFF_SHP_LAMB93_D077_2017-2021/OCS-GE_2-0_DIFF_SHP_LAMB93_D077_2017-2021.7z" @@ -342,6 +387,15 @@ "2021": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D084_2021-01-01/OCS-GE_2-0__SHP_LAMB93_D084_2021-01-01.7z" } }, + "85": { + "difference": { + "2019_2022": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0_DIFF_SHP_LAMB93_D085_2019_2022/OCS-GE_2-0_DIFF_SHP_LAMB93_D085_2019_2022.7z" + }, + "occupation_du_sol_et_zone_construite": { + "2019": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D085_2019-01-01/OCS-GE_2-0__SHP_LAMB93_D085_2019-01-01.7z", + "2022": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D085_2022-01-01/OCS-GE_2-0__SHP_LAMB93_D085_2022-01-01.7z" + } + }, "91": { "difference": { "2018_2021": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0_DIFF_SHP_LAMB93_D091_2018-2021/OCS-GE_2-0_DIFF_SHP_LAMB93_D091_2018-2021.7z" diff --git a/airflow/include/sql/sparte/dbt_project.yml b/airflow/include/sql/sparte/dbt_project.yml index 7e5c37694..258e56c34 100644 --- a/airflow/include/sql/sparte/dbt_project.yml +++ b/airflow/include/sql/sparte/dbt_project.yml @@ -24,3 +24,9 @@ models: +schema: admin_express gpu: +schema: gpu + majic: + +schema: majic + sudocuh: + +schema: sudocuh + insee: + +schema: insee diff --git a/airflow/include/sql/sparte/macros/admin_express/epci.sql b/airflow/include/sql/sparte/macros/admin_express/epci.sql new file mode 100644 index 000000000..82e074b24 --- /dev/null +++ b/airflow/include/sql/sparte/macros/admin_express/epci.sql @@ -0,0 +1,13 @@ +{% macro epci(source_table_name) %} + {{ config(materialized='table') }} + + SELECT + id, + nom as name, + code_siren as code, + nature, + ST_Area(geom) as surface, + geom + FROM + {{ source('public', source_table_name) }} +{% endmacro %} diff --git a/airflow/include/sql/sparte/macros/delete_from_this_where_field_not_in.sql b/airflow/include/sql/sparte/macros/delete_from_this_where_field_not_in.sql index 400c62090..6afc95a33 100644 --- a/airflow/include/sql/sparte/macros/delete_from_this_where_field_not_in.sql +++ b/airflow/include/sql/sparte/macros/delete_from_this_where_field_not_in.sql @@ -6,5 +6,11 @@ {% if not that_field %} {% set that_field = this_field %} {% endif %} - DELETE FROM {{ this }} WHERE {{ this_field }} not in (SELECT DISTINCT {{ that_field }} FROM {{ ref(table) }} ) + DELETE FROM {{ this }} + WHERE {{ this_field }} in ( + SELECT {{ this_field }} FROM {{ this }} AS foo + LEFT JOIN {{ ref(table) }} AS bar + ON foo.{{ this_field }} = bar.{{ that_field }} + WHERE {{ that_field }} is null + ) {% endmacro %} diff --git a/airflow/include/sql/sparte/macros/majic/divide_majic.sql b/airflow/include/sql/sparte/macros/majic/divide_majic.sql new file mode 100644 index 000000000..5076b90c0 --- /dev/null +++ b/airflow/include/sql/sparte/macros/majic/divide_majic.sql @@ -0,0 +1,113 @@ +{% macro divide_majic(initial_commune_code, final_commune_code, percent) %} +SELECT + '{{ final_commune_code }}' as commune_code, + conso_2009_2010 * {{ percent }} / 100 as conso_2009_2010, + conso_2009_2010_activite * {{ percent }} / 100 as conso_2009_2010_activite, + conso_2009_2010_habitat * {{ percent }} / 100 as conso_2009_2010_habitat, + conso_2009_2010_mixte * {{ percent }} / 100 as conso_2009_2010_mixte, + conso_2009_2010_route * {{ percent }} / 100 as conso_2009_2010_route, + conso_2009_2010_ferroviaire * {{ percent }} / 100 as conso_2009_2010_ferroviaire, + conso_2009_2010_inconnu * {{ percent }} / 100 as conso_2009_2010_inconnu, + conso_2010_2011 * {{ percent }} / 100 as conso_2010_2011, + conso_2010_2011_activite * {{ percent }} / 100 as conso_2010_2011_activite, + conso_2010_2011_habitat * {{ percent }} / 100 as conso_2010_2011_habitat, + conso_2010_2011_mixte * {{ percent }} / 100 as conso_2010_2011_mixte, + conso_2010_2011_route * {{ percent }} / 100 as conso_2010_2011_route, + conso_2010_2011_ferroviaire * {{ percent }} / 100 as conso_2010_2011_ferroviaire, + conso_2010_2011_inconnu * {{ percent }} / 100 as conso_2010_2011_inconnu, + conso_2011_2012 * {{ percent }} / 100 as conso_2011_2012, + conso_2011_2012_activite * {{ percent }} / 100 as conso_2011_2012_activite, + conso_2011_2012_habitat * {{ percent }} / 100 as conso_2011_2012_habitat, + conso_2011_2012_mixte * {{ percent }} / 100 as conso_2011_2012_mixte, + conso_2011_2012_route * {{ percent }} / 100 as conso_2011_2012_route, + conso_2011_2012_ferroviaire * {{ percent }} / 100 as conso_2011_2012_ferroviaire, + conso_2011_2012_inconnu * {{ percent }} / 100 as conso_2011_2012_inconnu, + conso_2012_2013 * {{ percent }} / 100 as conso_2012_2013, + conso_2012_2013_activite * {{ percent }} / 100 as conso_2012_2013_activite, + conso_2012_2013_habitat * {{ percent }} / 100 as conso_2012_2013_habitat, + conso_2012_2013_mixte * {{ percent }} / 100 as conso_2012_2013_mixte, + conso_2012_2013_route * {{ percent }} / 100 as conso_2012_2013_route, + conso_2012_2013_ferroviaire * {{ percent }} / 100 as conso_2012_2013_ferroviaire, + conso_2012_2013_inconnu * {{ percent }} / 100 as conso_2012_2013_inconnu, + conso_2013_2014 * {{ percent }} / 100 as conso_2013_2014, + conso_2013_2014_activite * {{ percent }} / 100 as conso_2013_2014_activite, + conso_2013_2014_habitat * {{ percent }} / 100 as conso_2013_2014_habitat, + conso_2013_2014_mixte * {{ percent }} / 100 as conso_2013_2014_mixte, + conso_2013_2014_route * {{ percent }} / 100 as conso_2013_2014_route, + conso_2013_2014_ferroviaire * {{ percent }} / 100 as conso_2013_2014_ferroviaire, + conso_2013_2014_inconnu * {{ percent }} / 100 as conso_2013_2014_inconnu, + conso_2014_2015 * {{ percent }} / 100 as conso_2014_2015, + conso_2014_2015_activite * {{ percent }} / 100 as conso_2014_2015_activite, + conso_2014_2015_habitat * {{ percent }} / 100 as conso_2014_2015_habitat, + conso_2014_2015_mixte * {{ percent }} / 100 as conso_2014_2015_mixte, + conso_2014_2015_route * {{ percent }} / 100 as conso_2014_2015_route, + conso_2014_2015_ferroviaire * {{ percent }} / 100 as conso_2014_2015_ferroviaire, + conso_2014_2015_inconnu * {{ percent }} / 100 as conso_2014_2015_inconnu, + conso_2015_2016 * {{ percent }} / 100 as conso_2015_2016, + conso_2015_2016_activite * {{ percent }} / 100 as conso_2015_2016_activite, + conso_2015_2016_habitat * {{ percent }} / 100 as conso_2015_2016_habitat, + conso_2015_2016_mixte * {{ percent }} / 100 as conso_2015_2016_mixte, + conso_2015_2016_route * {{ percent }} / 100 as conso_2015_2016_route, + conso_2015_2016_ferroviaire * {{ percent }} / 100 as conso_2015_2016_ferroviaire, + conso_2015_2016_inconnu * {{ percent }} / 100 as conso_2015_2016_inconnu, + conso_2016_2017 * {{ percent }} / 100 as conso_2016_2017, + conso_2016_2017_activite * {{ percent }} / 100 as conso_2016_2017_activite, + conso_2016_2017_habitat * {{ percent }} / 100 as conso_2016_2017_habitat, + conso_2016_2017_mixte * {{ percent }} / 100 as conso_2016_2017_mixte, + conso_2016_2017_route * {{ percent }} / 100 as conso_2016_2017_route, + conso_2016_2017_ferroviaire * {{ percent }} / 100 as conso_2016_2017_ferroviaire, + conso_2016_2017_inconnu * {{ percent }} / 100 as conso_2016_2017_inconnu, + conso_2017_2018 * {{ percent }} / 100 as conso_2017_2018, + conso_2017_2018_activite * {{ percent }} / 100 as conso_2017_2018_activite, + conso_2017_2018_habitat * {{ percent }} / 100 as conso_2017_2018_habitat, + conso_2017_2018_mixte * {{ percent }} / 100 as conso_2017_2018_mixte, + conso_2017_2018_route * {{ percent }} / 100 as conso_2017_2018_route, + conso_2017_2018_ferroviaire * {{ percent }} / 100 as conso_2017_2018_ferroviaire, + conso_2017_2018_inconnu * {{ percent }} / 100 as conso_2017_2018_inconnu, + conso_2018_2019 * {{ percent }} / 100 as conso_2018_2019, + conso_2018_2019_activite * {{ percent }} / 100 as conso_2018_2019_activite, + conso_2018_2019_habitat * {{ percent }} / 100 as conso_2018_2019_habitat, + conso_2018_2019_mixte * {{ percent }} / 100 as conso_2018_2019_mixte, + conso_2018_2019_route * {{ percent }} / 100 as conso_2018_2019_route, + conso_2018_2019_ferroviaire * {{ percent }} / 100 as conso_2018_2019_ferroviaire, + conso_2018_2019_inconnu * {{ percent }} / 100 as conso_2018_2019_inconnu, + conso_2019_2020 * {{ percent }} / 100 as conso_2019_2020, + conso_2019_2020_activite * {{ percent }} / 100 as conso_2019_2020_activite, + conso_2019_2020_habitat * {{ percent }} / 100 as conso_2019_2020_habitat, + conso_2019_2020_mixte * {{ percent }} / 100 as conso_2019_2020_mixte, + conso_2019_2020_route * {{ percent }} / 100 as conso_2019_2020_route, + conso_2019_2020_ferroviaire * {{ percent }} / 100 as conso_2019_2020_ferroviaire, + conso_2019_2020_inconnu * {{ percent }} / 100 as conso_2019_2020_inconnu, + conso_2020_2021 * {{ percent }} / 100 as conso_2020_2021, + conso_2020_2021_activite * {{ percent }} / 100 as conso_2020_2021_activite, + conso_2020_2021_habitat * {{ percent }} / 100 as conso_2020_2021_habitat, + conso_2020_2021_mixte * {{ percent }} / 100 as conso_2020_2021_mixte, + conso_2020_2021_route * {{ percent }} / 100 as conso_2020_2021_route, + conso_2020_2021_ferroviaire * {{ percent }} / 100 as conso_2020_2021_ferroviaire, + conso_2020_2021_inconnu * {{ percent }} / 100 as conso_2020_2021_inconnu, + conso_2021_2022 * {{ percent }} / 100 as conso_2021_2022, + conso_2021_2022_activite * {{ percent }} / 100 as conso_2021_2022_activite, + conso_2021_2022_habitat * {{ percent }} / 100 as conso_2021_2022_habitat, + conso_2021_2022_mixte * {{ percent }} / 100 as conso_2021_2022_mixte, + conso_2021_2022_route * {{ percent }} / 100 as conso_2021_2022_route, + conso_2021_2022_ferroviaire * {{ percent }} / 100 as conso_2021_2022_ferroviaire, + conso_2021_2022_inconnu * {{ percent }} / 100 as conso_2021_2022_inconnu, + conso_2022_2023 * {{ percent }} / 100 as conso_2022_2023, + conso_2022_2023_activite * {{ percent }} / 100 as conso_2022_2023_activite, + conso_2022_2023_habitat * {{ percent }} / 100 as conso_2022_2023_habitat, + conso_2022_2023_mixte * {{ percent }} / 100 as conso_2022_2023_mixte, + conso_2022_2023_route * {{ percent }} / 100 as conso_2022_2023_route, + conso_2022_2023_ferroviaire * {{ percent }} / 100 as conso_2022_2023_ferroviaire, + conso_2022_2023_inconnu * {{ percent }} / 100 as conso_2022_2023_inconnu, + conso_2009_2023 * {{ percent }} / 100 as conso_2009_2023, + conso_2009_2023_activite * {{ percent }} / 100 as conso_2009_2023_activite, + conso_2009_2023_habitat * {{ percent }} / 100 as conso_2009_2023_habitat, + conso_2009_2023_mixte * {{ percent }} / 100 as conso_2009_2023_mixte, + conso_2009_2023_route * {{ percent }} / 100 as conso_2009_2023_route, + conso_2009_2023_ferroviaire * {{ percent }} / 100 as conso_2009_2023_ferroviaire, + conso_2009_2023_inconnu * {{ percent }} / 100 as conso_2009_2023_inconnu +FROM + {{ ref('consommation') }} +WHERE + commune_code = '{{ initial_commune_code }}' +{% endmacro %} diff --git a/airflow/include/sql/sparte/macros/majic/majic.sql b/airflow/include/sql/sparte/macros/majic/majic.sql new file mode 100644 index 000000000..5e8ce4638 --- /dev/null +++ b/airflow/include/sql/sparte/macros/majic/majic.sql @@ -0,0 +1,114 @@ + +{% macro majic(source_table_name) %} + {{ config(materialized='table') }} + + SELECT + idcom as commune_code, + naf09art10 as conso_2009_2010, + art09act10 as conso_2009_2010_activite, + art09hab10 as conso_2009_2010_habitat, + art09mix10 as conso_2009_2010_mixte, + art09rou10 as conso_2009_2010_route, + art09fer10 as conso_2009_2010_ferroviaire, + art09inc10 as conso_2009_2010_inconnu, + naf10art11 as conso_2010_2011, + art10act11 as conso_2010_2011_activite, + art10hab11 as conso_2010_2011_habitat, + art10mix11 as conso_2010_2011_mixte, + art10rou11 as conso_2010_2011_route, + art10fer11 as conso_2010_2011_ferroviaire, + art10inc11 as conso_2010_2011_inconnu, + naf11art12 as conso_2011_2012, + art11act12 as conso_2011_2012_activite, + art11hab12 as conso_2011_2012_habitat, + art11mix12 as conso_2011_2012_mixte, + art11rou12 as conso_2011_2012_route, + art11fer12 as conso_2011_2012_ferroviaire, + art11inc12 as conso_2011_2012_inconnu, + naf12art13 as conso_2012_2013, + art12act13 as conso_2012_2013_activite, + art12hab13 as conso_2012_2013_habitat, + art12mix13 as conso_2012_2013_mixte, + art12rou13 as conso_2012_2013_route, + art12fer13 as conso_2012_2013_ferroviaire, + art12inc13 as conso_2012_2013_inconnu, + naf13art14 as conso_2013_2014, + art13act14 as conso_2013_2014_activite, + art13hab14 as conso_2013_2014_habitat, + art13mix14 as conso_2013_2014_mixte, + art13rou14 as conso_2013_2014_route, + art13fer14 as conso_2013_2014_ferroviaire, + art13inc14 as conso_2013_2014_inconnu, + naf14art15 as conso_2014_2015, + art14act15 as conso_2014_2015_activite, + art14hab15 as conso_2014_2015_habitat, + art14mix15 as conso_2014_2015_mixte, + art14rou15 as conso_2014_2015_route, + art14fer15 as conso_2014_2015_ferroviaire, + art14inc15 as conso_2014_2015_inconnu, + naf15art16 as conso_2015_2016, + art15act16 as conso_2015_2016_activite, + art15hab16 as conso_2015_2016_habitat, + art15mix16 as conso_2015_2016_mixte, + art15rou16 as conso_2015_2016_route, + art15fer16 as conso_2015_2016_ferroviaire, + art15inc16 as conso_2015_2016_inconnu, + naf16art17 as conso_2016_2017, + art16act17 as conso_2016_2017_activite, + art16hab17 as conso_2016_2017_habitat, + art16mix17 as conso_2016_2017_mixte, + art16rou17 as conso_2016_2017_route, + art16fer17 as conso_2016_2017_ferroviaire, + art16inc17 as conso_2016_2017_inconnu, + naf17art18 as conso_2017_2018, + art17act18 as conso_2017_2018_activite, + art17hab18 as conso_2017_2018_habitat, + art17mix18 as conso_2017_2018_mixte, + art17rou18 as conso_2017_2018_route, + art17fer18 as conso_2017_2018_ferroviaire, + art17inc18 as conso_2017_2018_inconnu, + naf18art19 as conso_2018_2019, + art18act19 as conso_2018_2019_activite, + art18hab19 as conso_2018_2019_habitat, + art18mix19 as conso_2018_2019_mixte, + art18rou19 as conso_2018_2019_route, + art18fer19 as conso_2018_2019_ferroviaire, + art18inc19 as conso_2018_2019_inconnu, + naf19art20 as conso_2019_2020, + art19act20 as conso_2019_2020_activite, + art19hab20 as conso_2019_2020_habitat, + art19mix20 as conso_2019_2020_mixte, + art19rou20 as conso_2019_2020_route, + art19fer20 as conso_2019_2020_ferroviaire, + art19inc20 as conso_2019_2020_inconnu, + naf20art21 as conso_2020_2021, + art20act21 as conso_2020_2021_activite, + art20hab21 as conso_2020_2021_habitat, + art20mix21 as conso_2020_2021_mixte, + art20rou21 as conso_2020_2021_route, + art20fer21 as conso_2020_2021_ferroviaire, + art20inc21 as conso_2020_2021_inconnu, + naf21art22 as conso_2021_2022, + art21act22 as conso_2021_2022_activite, + art21hab22 as conso_2021_2022_habitat, + art21mix22 as conso_2021_2022_mixte, + art21rou22 as conso_2021_2022_route, + art21fer22 as conso_2021_2022_ferroviaire, + art21inc22 as conso_2021_2022_inconnu, + naf22art23 as conso_2022_2023, + art22act23 as conso_2022_2023_activite, + art22hab23 as conso_2022_2023_habitat, + art22mix23 as conso_2022_2023_mixte, + art22rou23 as conso_2022_2023_route, + art22fer23 as conso_2022_2023_ferroviaire, + art22inc23 as conso_2022_2023_inconnu, + naf09art23 as conso_2009_2023, + art09act23 as conso_2009_2023_activite, + art09hab23 as conso_2009_2023_habitat, + art09mix23 as conso_2009_2023_mixte, + art09rou23 as conso_2009_2023_route, + art09fer23 as conso_2009_2023_ferroviaire, + art09inc23 as conso_2009_2023_inconnu + FROM + {{ source('public', source_table_name) }} +{% endmacro %} diff --git a/airflow/include/sql/sparte/macros/majic/merge_majic.sql b/airflow/include/sql/sparte/macros/majic/merge_majic.sql new file mode 100644 index 000000000..51b522428 --- /dev/null +++ b/airflow/include/sql/sparte/macros/majic/merge_majic.sql @@ -0,0 +1,119 @@ +{% macro merge_majic(final_commune_code, communes_code_to_merge) %} +SELECT + min('{{ final_commune_code }}') as commune_code, + sum(conso_2009_2010) as conso_2009_2010, + sum(conso_2009_2010_activite) as conso_2009_2010_activite, + sum(conso_2009_2010_habitat) as conso_2009_2010_habitat, + sum(conso_2009_2010_mixte) as conso_2009_2010_mixte, + sum(conso_2009_2010_route) as conso_2009_2010_route, + sum(conso_2009_2010_ferroviaire) as conso_2009_2010_ferroviaire, + sum(conso_2009_2010_inconnu) as conso_2009_2010_inconnu, + sum(conso_2010_2011) as conso_2010_2011, + sum(conso_2010_2011_activite) as conso_2010_2011_activite, + sum(conso_2010_2011_habitat) as conso_2010_2011_habitat, + sum(conso_2010_2011_mixte) as conso_2010_2011_mixte, + sum(conso_2010_2011_route) as conso_2010_2011_route, + sum(conso_2010_2011_ferroviaire) as conso_2010_2011_ferroviaire, + sum(conso_2010_2011_inconnu) as conso_2010_2011_inconnu, + sum(conso_2011_2012) as conso_2011_2012, + sum(conso_2011_2012_activite) as conso_2011_2012_activite, + sum(conso_2011_2012_habitat) as conso_2011_2012_habitat, + sum(conso_2011_2012_mixte) as conso_2011_2012_mixte, + sum(conso_2011_2012_route) as conso_2011_2012_route, + sum(conso_2011_2012_ferroviaire) as conso_2011_2012_ferroviaire, + sum(conso_2011_2012_inconnu) as conso_2011_2012_inconnu, + sum(conso_2012_2013) as conso_2012_2013, + sum(conso_2012_2013_activite) as conso_2012_2013_activite, + sum(conso_2012_2013_habitat) as conso_2012_2013_habitat, + sum(conso_2012_2013_mixte) as conso_2012_2013_mixte, + sum(conso_2012_2013_route) as conso_2012_2013_route, + sum(conso_2012_2013_ferroviaire) as conso_2012_2013_ferroviaire, + sum(conso_2012_2013_inconnu) as conso_2012_2013_inconnu, + sum(conso_2013_2014) as conso_2013_2014, + sum(conso_2013_2014_activite) as conso_2013_2014_activite, + sum(conso_2013_2014_habitat) as conso_2013_2014_habitat, + sum(conso_2013_2014_mixte) as conso_2013_2014_mixte, + sum(conso_2013_2014_route) as conso_2013_2014_route, + sum(conso_2013_2014_ferroviaire) as conso_2013_2014_ferroviaire, + sum(conso_2013_2014_inconnu) as conso_2013_2014_inconnu, + sum(conso_2014_2015) as conso_2014_2015, + sum(conso_2014_2015_activite) as conso_2014_2015_activite, + sum(conso_2014_2015_habitat) as conso_2014_2015_habitat, + sum(conso_2014_2015_mixte) as conso_2014_2015_mixte, + sum(conso_2014_2015_route) as conso_2014_2015_route, + sum(conso_2014_2015_ferroviaire) as conso_2014_2015_ferroviaire, + sum(conso_2014_2015_inconnu) as conso_2014_2015_inconnu, + sum(conso_2015_2016) as conso_2015_2016, + sum(conso_2015_2016_activite) as conso_2015_2016_activite, + sum(conso_2015_2016_habitat) as conso_2015_2016_habitat, + sum(conso_2015_2016_mixte) as conso_2015_2016_mixte, + sum(conso_2015_2016_route) as conso_2015_2016_route, + sum(conso_2015_2016_ferroviaire) as conso_2015_2016_ferroviaire, + sum(conso_2015_2016_inconnu) as conso_2015_2016_inconnu, + sum(conso_2016_2017) as conso_2016_2017, + sum(conso_2016_2017_activite) as conso_2016_2017_activite, + sum(conso_2016_2017_habitat) as conso_2016_2017_habitat, + sum(conso_2016_2017_mixte) as conso_2016_2017_mixte, + sum(conso_2016_2017_route) as conso_2016_2017_route, + sum(conso_2016_2017_ferroviaire) as conso_2016_2017_ferroviaire, + sum(conso_2016_2017_inconnu) as conso_2016_2017_inconnu, + sum(conso_2017_2018) as conso_2017_2018, + sum(conso_2017_2018_activite) as conso_2017_2018_activite, + sum(conso_2017_2018_habitat) as conso_2017_2018_habitat, + sum(conso_2017_2018_mixte) as conso_2017_2018_mixte, + sum(conso_2017_2018_route) as conso_2017_2018_route, + sum(conso_2017_2018_ferroviaire) as conso_2017_2018_ferroviaire, + sum(conso_2017_2018_inconnu) as conso_2017_2018_inconnu, + sum(conso_2018_2019) as conso_2018_2019, + sum(conso_2018_2019_activite) as conso_2018_2019_activite, + sum(conso_2018_2019_habitat) as conso_2018_2019_habitat, + sum(conso_2018_2019_mixte) as conso_2018_2019_mixte, + sum(conso_2018_2019_route) as conso_2018_2019_route, + sum(conso_2018_2019_ferroviaire) as conso_2018_2019_ferroviaire, + sum(conso_2018_2019_inconnu) as conso_2018_2019_inconnu, + sum(conso_2019_2020) as conso_2019_2020, + sum(conso_2019_2020_activite) as conso_2019_2020_activite, + sum(conso_2019_2020_habitat) as conso_2019_2020_habitat, + sum(conso_2019_2020_mixte) as conso_2019_2020_mixte, + sum(conso_2019_2020_route) as conso_2019_2020_route, + sum(conso_2019_2020_ferroviaire) as conso_2019_2020_ferroviaire, + sum(conso_2019_2020_inconnu) as conso_2019_2020_inconnu, + sum(conso_2020_2021) as conso_2020_2021, + sum(conso_2020_2021_activite) as conso_2020_2021_activite, + sum(conso_2020_2021_habitat) as conso_2020_2021_habitat, + sum(conso_2020_2021_mixte) as conso_2020_2021_mixte, + sum(conso_2020_2021_route) as conso_2020_2021_route, + sum(conso_2020_2021_ferroviaire) as conso_2020_2021_ferroviaire, + sum(conso_2020_2021_inconnu) as conso_2020_2021_inconnu, + sum(conso_2021_2022) as conso_2021_2022, + sum(conso_2021_2022_activite) as conso_2021_2022_activite, + sum(conso_2021_2022_habitat) as conso_2021_2022_habitat, + sum(conso_2021_2022_mixte) as conso_2021_2022_mixte, + sum(conso_2021_2022_route) as conso_2021_2022_route, + sum(conso_2021_2022_ferroviaire) as conso_2021_2022_ferroviaire, + sum(conso_2021_2022_inconnu) as conso_2021_2022_inconnu, + sum(conso_2022_2023) as conso_2022_2023, + sum(conso_2022_2023_activite) as conso_2022_2023_activite, + sum(conso_2022_2023_habitat) as conso_2022_2023_habitat, + sum(conso_2022_2023_mixte) as conso_2022_2023_mixte, + sum(conso_2022_2023_route) as conso_2022_2023_route, + sum(conso_2022_2023_ferroviaire) as conso_2022_2023_ferroviaire, + sum(conso_2022_2023_inconnu) as conso_2022_2023_inconnu, + sum(conso_2009_2023) as conso_2009_2023, + sum(conso_2009_2023_activite) as conso_2009_2023_activite, + sum(conso_2009_2023_habitat) as conso_2009_2023_habitat, + sum(conso_2009_2023_mixte) as conso_2009_2023_mixte, + sum(conso_2009_2023_route) as conso_2009_2023_route, + sum(conso_2009_2023_ferroviaire) as conso_2009_2023_ferroviaire, + sum(conso_2009_2023_inconnu) as conso_2009_2023_inconnu +FROM + {{ ref('consommation') }} +WHERE + commune_code in ( + '{{ final_commune_code }}', + {% for commune_code in communes_code_to_merge %} + '{{ commune_code }}' + {% if not loop.last %},{% endif %} + {% endfor %} + ) +{% endmacro %} diff --git a/airflow/include/sql/sparte/models/admin_express/epci.sql b/airflow/include/sql/sparte/models/admin_express/epci.sql new file mode 100644 index 000000000..4e74c4033 --- /dev/null +++ b/airflow/include/sql/sparte/models/admin_express/epci.sql @@ -0,0 +1,35 @@ +{{ + config( + materialized='table', + indexes=[ + {'columns': ['id'], 'type': 'btree'}, + {'columns': ['code'], 'type': 'btree'}, + {'columns': ['name'], 'type': 'btree'}, + {'columns': ['geom'], 'type': 'gist'} + ]) +}} + +SELECT + *, + 32620 AS srid_source +FROM {{ ref('epci_guadeloupe') }} +UNION ALL +SELECT + *, + 32620 AS srid_source +FROM {{ ref('epci_martinique') }} +UNION ALL +SELECT + *, + 2972 AS srid_source +FROM {{ ref('epci_guyane') }} +UNION ALL +SELECT + *, + 2975 AS srid_source +FROM {{ ref('epci_reunion') }} +UNION ALL +SELECT + *, + 2154 AS srid_source +FROM {{ ref('epci_metropole') }} diff --git a/airflow/include/sql/sparte/models/admin_express/epci_guadeloupe.sql b/airflow/include/sql/sparte/models/admin_express/epci_guadeloupe.sql new file mode 100644 index 000000000..fc4fdbcd3 --- /dev/null +++ b/airflow/include/sql/sparte/models/admin_express/epci_guadeloupe.sql @@ -0,0 +1 @@ +{{ epci('epci_guadeloupe') }} diff --git a/airflow/include/sql/sparte/models/admin_express/epci_guyane.sql b/airflow/include/sql/sparte/models/admin_express/epci_guyane.sql new file mode 100644 index 000000000..569a78543 --- /dev/null +++ b/airflow/include/sql/sparte/models/admin_express/epci_guyane.sql @@ -0,0 +1 @@ +{{ epci('epci_guyane') }} diff --git a/airflow/include/sql/sparte/models/admin_express/epci_martinique.sql b/airflow/include/sql/sparte/models/admin_express/epci_martinique.sql new file mode 100644 index 000000000..907bb8639 --- /dev/null +++ b/airflow/include/sql/sparte/models/admin_express/epci_martinique.sql @@ -0,0 +1 @@ +{{ epci('epci_martinique') }} diff --git a/airflow/include/sql/sparte/models/admin_express/epci_metropole.sql b/airflow/include/sql/sparte/models/admin_express/epci_metropole.sql new file mode 100644 index 000000000..a732459c0 --- /dev/null +++ b/airflow/include/sql/sparte/models/admin_express/epci_metropole.sql @@ -0,0 +1 @@ +{{ epci('epci_metropole') }} diff --git a/airflow/include/sql/sparte/models/admin_express/epci_reunion.sql b/airflow/include/sql/sparte/models/admin_express/epci_reunion.sql new file mode 100644 index 000000000..e23e8cc82 --- /dev/null +++ b/airflow/include/sql/sparte/models/admin_express/epci_reunion.sql @@ -0,0 +1 @@ +{{ epci('epci_reunion') }} diff --git a/airflow/include/sql/sparte/models/admin_express/schema.yml b/airflow/include/sql/sparte/models/admin_express/schema.yml index e9b165b75..03da9ff25 100644 --- a/airflow/include/sql/sparte/models/admin_express/schema.yml +++ b/airflow/include/sql/sparte/models/admin_express/schema.yml @@ -1,17 +1,52 @@ version: 2 + +code_is_unique_and_not_null: &code_is_unique_and_not_null + - name: code + data_tests: + - not_null + - unique + + models: - name: commune + columns: *code_is_unique_and_not_null - name: commune_guadeloupe + columns: *code_is_unique_and_not_null - name: commune_guyane + columns: *code_is_unique_and_not_null - name: commune_martinique + columns: *code_is_unique_and_not_null - name: commune_reunion + columns: *code_is_unique_and_not_null + - name: commune_metropole + columns: *code_is_unique_and_not_null - name: departement + columns: *code_is_unique_and_not_null - name: departement_guadeloupe + columns: *code_is_unique_and_not_null - name: departement_guyane + columns: *code_is_unique_and_not_null - name: departement_martinique + columns: *code_is_unique_and_not_null - name: departement_reunion + columns: *code_is_unique_and_not_null + - name: departement_metropole + columns: *code_is_unique_and_not_null + - name: epci + columns: *code_is_unique_and_not_null + - name: epci_guadeloupe + columns: *code_is_unique_and_not_null + - name: epci_guyane + columns: *code_is_unique_and_not_null + - name: epci_martinique + columns: *code_is_unique_and_not_null + - name: epci_reunion + columns: *code_is_unique_and_not_null + - name: epci_metropole + columns: *code_is_unique_and_not_null + sources: - name: public @@ -26,5 +61,8 @@ sources: - name: departement_guyane - name: departement_martinique - name: departement_reunion - - name: epci - - name: region + - name: epci_metropole + - name: epci_guadeloupe + - name: epci_guyane + - name: epci_martinique + - name: epci_reunion diff --git a/airflow/include/sql/sparte/models/insee/cog_changes_2024.sql b/airflow/include/sql/sparte/models/insee/cog_changes_2024.sql new file mode 100644 index 000000000..acb7cbbb5 --- /dev/null +++ b/airflow/include/sql/sparte/models/insee/cog_changes_2024.sql @@ -0,0 +1,19 @@ +{{ config(materialized='table') }} + +SELECT + index, + "MOD" AS type_de_changement, + "TYPECOM_AV" AS type_commune_avant, + "COM_AV" AS code_commune_avant, + "TNCC_AV" AS type_de_nom_en_clair_avant, + "NCC_AV" AS nom_en_clair_avant, + "LIBELLE_AV" AS libelle_avant, + "TYPECOM_AP" AS type_commune_apres, + "COM_AP" AS code_commune_apres, + "TNCC_AP" AS type_de_nom_en_clair_apres, + "NCC_AP" AS nom_en_clair_apres, + "NCCENR_AP" AS nom_en_clair_enrichi_apres, + "LIBELLE_AP" AS libelle_apres, + TO_DATE("DATE_EFF", 'YYYY-MM-DD') AS date_effet +FROM + {{ source('public', 'insee_cog_changes_2024') }} diff --git a/airflow/include/sql/sparte/models/insee/schema.yml b/airflow/include/sql/sparte/models/insee/schema.yml new file mode 100644 index 000000000..1b793e8eb --- /dev/null +++ b/airflow/include/sql/sparte/models/insee/schema.yml @@ -0,0 +1,45 @@ + +version: 2 + +type_de_changement: &type_de_changement + values : [ + 10, # Changement de nom + 20, # Création + 21, # Rétablissement + 30, # Suppression + 31, # Fusion simple + 32, # Création de commune nouvelle + 33, # Fusion association + 34, # Transformation de fusion association en fusion simple + 35, # Suppression de commune déléguée + 41, # Changement de code dû à un changement de département + 50, # Changement de code dû à un transfert de chef-lieu + 70, # Transformation de commune associée en commune déléguée + 71 # 71 is not in the official list but is present in the data + ] + +type_commune: &type_commune + values : [ + "COM", # Commune + "COMA", # Commune associée + "COMD", # Commune déléguée + "ARM" # Arrondissement municipal + ] + +models: + - name: cog_changes_2024 + columns: + - name: type_de_changement + data_tests: + - accepted_values: *type_de_changement + - name: type_commune_avant + data_tests: + - accepted_values: *type_commune + - name: type_commune_apres + data_tests: + - accepted_values: *type_commune + +sources: + - name: public + tables: + - name: insee_cog_changes_2024 diff --git a/airflow/include/sql/sparte/models/majic/consommation.sql b/airflow/include/sql/sparte/models/majic/consommation.sql new file mode 100644 index 000000000..d3ca144bd --- /dev/null +++ b/airflow/include/sql/sparte/models/majic/consommation.sql @@ -0,0 +1,16 @@ +{{ config(materialized='table') }} + +SELECT * +FROM {{ ref('consommation_guadeloupe') }} +UNION ALL +SELECT * +FROM {{ ref('consommation_martinique') }} +UNION ALL +SELECT * +FROM {{ ref('consommation_guyane') }} +UNION ALL +SELECT * +FROM {{ ref('consommation_reunion') }} +UNION ALL +SELECT * +FROM {{ ref('consommation_metropole') }} diff --git a/airflow/include/sql/sparte/models/majic/consommation_cog_2024.sql b/airflow/include/sql/sparte/models/majic/consommation_cog_2024.sql new file mode 100644 index 000000000..9da5d6b2e --- /dev/null +++ b/airflow/include/sql/sparte/models/majic/consommation_cog_2024.sql @@ -0,0 +1,79 @@ +{{ config(materialized='table') }} + +with unchanged_conso as ( + select * from {{ ref('consommation') }} + where commune_code not in ( + '08294', + '08053', + '16355', + '16097', + '18131', + '18173', + '25282', + '25060', + '25549', + '25060', + '35112', + '35062', + '49321', + '49160', + '64541', + '64300', + '69152', + '69149', + '85041', + '85292', + '85271', + '86231', + '86247', + '95282', + '95169', + '85084', + '85165', + '85212', + '60054', + '60054' + ) +), + +fusions as ( + {{ merge_majic('08053', ['08294']) }} + union + {{ merge_majic('16097', ['16355']) }} + union + {{ merge_majic('18173', ['18131']) }} + union + {{ merge_majic('25060', ['25282', '25549']) }} + union + {{ merge_majic('35062', ['35112']) }} + union + {{ merge_majic('49160', ['49321']) }} + union + {{ merge_majic('64300', ['64541']) }} + union + {{ merge_majic('69149', ['69152']) }} + union + {{ merge_majic('85292', ['85041', '85271']) }} + union + {{ merge_majic('86247', ['86231']) }} + union + {{ merge_majic('95169', ['95282']) }} +), + +divisions as ( + {{ divide_majic('85084', '85084', 68.57) }} + union + {{ divide_majic('85084', '85165', 14.20) }} + union + {{ divide_majic('85084', '85212', 17.23) }} + union + {{ divide_majic('60054', '60054', 42.24) }} + union + {{ divide_majic('60054', '60694', 57.76) }} +) + +select * from unchanged_conso +union all +select * from fusions +union all +select * from divisions diff --git a/airflow/include/sql/sparte/models/majic/consommation_guadeloupe.sql b/airflow/include/sql/sparte/models/majic/consommation_guadeloupe.sql new file mode 100644 index 000000000..cb69d38ff --- /dev/null +++ b/airflow/include/sql/sparte/models/majic/consommation_guadeloupe.sql @@ -0,0 +1 @@ +{{ majic('majic_guadeloupe') }} diff --git a/airflow/include/sql/sparte/models/majic/consommation_guyane.sql b/airflow/include/sql/sparte/models/majic/consommation_guyane.sql new file mode 100644 index 000000000..51d0f9bf9 --- /dev/null +++ b/airflow/include/sql/sparte/models/majic/consommation_guyane.sql @@ -0,0 +1 @@ +{{ majic('majic_guyane') }} diff --git a/airflow/include/sql/sparte/models/majic/consommation_martinique.sql b/airflow/include/sql/sparte/models/majic/consommation_martinique.sql new file mode 100644 index 000000000..3f7456751 --- /dev/null +++ b/airflow/include/sql/sparte/models/majic/consommation_martinique.sql @@ -0,0 +1 @@ +{{ majic('majic_martinique') }} diff --git a/airflow/include/sql/sparte/models/majic/consommation_metropole.sql b/airflow/include/sql/sparte/models/majic/consommation_metropole.sql new file mode 100644 index 000000000..495263e93 --- /dev/null +++ b/airflow/include/sql/sparte/models/majic/consommation_metropole.sql @@ -0,0 +1,3 @@ +{{ majic('majic_france_metropolitaine') }} +WHERE + iddep NOT IN ('971', '972', '973', '974') diff --git a/airflow/include/sql/sparte/models/majic/consommation_reunion.sql b/airflow/include/sql/sparte/models/majic/consommation_reunion.sql new file mode 100644 index 000000000..4003e3a20 --- /dev/null +++ b/airflow/include/sql/sparte/models/majic/consommation_reunion.sql @@ -0,0 +1 @@ +{{ majic('majic_la_reunion') }} diff --git a/airflow/include/sql/sparte/models/majic/schema.yml b/airflow/include/sql/sparte/models/majic/schema.yml new file mode 100644 index 000000000..5e4cc2880 --- /dev/null +++ b/airflow/include/sql/sparte/models/majic/schema.yml @@ -0,0 +1,28 @@ + +version: 2 + +models: + - name: consommation + columns: + - name: commune_code + data_tests: + - not_null + - unique + - name: consommation_cog_2024 + columns: + - name: commune_code + data_tests: + - not_null + - unique + - relationships: + to: ref('commune') + field: code + +sources: + - name: public + tables: + - name: majic_france_metropolitaine + - name: majic_guadeloupe + - name: majic_guyane + - name: majic_martinique + - name: majic_la_reunion diff --git a/airflow/include/sql/sparte/models/ocsge/intersected/difference_commune.sql b/airflow/include/sql/sparte/models/ocsge/intersected/difference_commune.sql index 145f6fe2e..8c70c1902 100644 --- a/airflow/include/sql/sparte/models/ocsge/intersected/difference_commune.sql +++ b/airflow/include/sql/sparte/models/ocsge/intersected/difference_commune.sql @@ -9,22 +9,22 @@ Cette requête découpe les objets OCS GE de différence par commune. -Dans le cas où un objet OCS GE est découpé par plusieurs communes, il sera dupliqué, mais -la surface totale de l'objet sera conservée. +Dans le cas où un objet OCS GE est découpé par plusieurs communes, +il sera dupliqué, mais la surface totale de l'objet sera conservée. */ with difference_commune_without_surface as ( - SELECT - concat(ocsge.uuid::text, '_', commune.code::text) as ocsge_commune_id, -- surrogate key + select + -- surrogate key + commune.code as commune_code, -- les attributs spécifiques aux communes sont préfixés par commune_ - commune.code as commune_code, + ocsge.loaded_date as ocsge_loaded_date, -- les attributs spécifiques aux objets OCS GE sont préfixés par ocsge_ - ocsge.loaded_date as ocsge_loaded_date, - ocsge.uuid as ocsge_uuid, - -- les attributs communs aux deux tables sont sans préfixe + ocsge.uuid as ocsge_uuid, ocsge.year_old, + -- les attributs communs aux deux tables sont sans préfixe ocsge.year_new, ocsge.departement, ocsge.new_is_impermeable, @@ -36,25 +36,27 @@ with difference_commune_without_surface as ( ocsge.cs_new, ocsge.us_new, ocsge.srid_source, - ST_Intersection(commune.geom, ocsge.geom) AS geom - FROM - {{ ref("commune") }} AS commune - INNER JOIN - {{ ref("difference") }} AS ocsge - ON - ocsge.departement = commune.departement - AND - ocsge.srid_source = commune.srid_source - AND - ST_Intersects(commune.geom, ocsge.geom) + concat(ocsge.uuid::text, '_', commune.code::text) as ocsge_commune_id, + st_intersection(commune.geom, ocsge.geom) as geom + from + {{ ref("commune") }} as commune + inner join + {{ ref("difference") }} as ocsge + on + commune.departement = ocsge.departement + and + commune.srid_source = ocsge.srid_source + and + st_intersects(commune.geom, ocsge.geom) {% if is_incremental() %} - WHERE ocsge.uuid not in (SELECT bar.ocsge_uuid from {{ this }} as bar) + where + ocsge.loaded_date > (select max(ocsge_loaded_date) from {{ this }}) {% endif %} ) -SELECT +select *, - ST_Area(geom) as surface -FROM + st_area(geom) as surface +from difference_commune_without_surface diff --git a/airflow/include/sql/sparte/models/sudocuh/models.yml b/airflow/include/sql/sparte/models/sudocuh/models.yml new file mode 100644 index 000000000..a449cba90 --- /dev/null +++ b/airflow/include/sql/sparte/models/sudocuh/models.yml @@ -0,0 +1,25 @@ + +version: 2 + +models: + - name: scot_communes + columns: + - name: commune_code + data_tests: + - not_null + - unique + - relationships: + to: ref('commune') + field: code + - name: id_scot + data_tests: + - not_null + - relationships: + to: ref('scot') + field: id_scot + +sources: + - name: public + tables: + - name: sudocuh_scot + - name: sudocuh_scot_communes diff --git a/airflow/include/sql/sparte/models/sudocuh/scot.sql b/airflow/include/sql/sparte/models/sudocuh/scot.sql new file mode 100644 index 000000000..8e3be216b --- /dev/null +++ b/airflow/include/sql/sparte/models/sudocuh/scot.sql @@ -0,0 +1,57 @@ +{{ config(materialized='table') }} + +SELECT + index, + annee_cog, + scotpopulationmillesime AS scot_population_millesime, + circonscription_reg2016 AS circonscription_region_2016_code, + circonscription_region2016 AS circonscription_region_2016_nom, + circonscription_dept AS circonscription_departement_code, + circonscription_departement AS circonscription_departement_nom, + id_scot, + nom_scot, + derniere_procedure, + scot_moderne, + code_etat_code AS code_etat, + code_etat_libelle, + code_etat_elaboration_revision, + epci_porteur_siren, + epci_porteur_type, + epci_porteur_type_libelle, + epci_porteur_nom, + scot_approuve_nom_schema, + scot_approuve_noserie_procedure, + scot_approuve_scot_interdepartement, + scot_approuve_date_publication_perimetre, + scot_approuve_date_prescription, + scot_approuve_date_arret_projet, + scot_approuve_date_approbation, + scot_approuve_annee_approbation, + scot_approuve_date_approbation_precedent, + scot_approuve_date_fin_echeance, + scot_approuve_scot_loi_ene, + scot_approuve_moe, + scot_approuve_cout_ht, + scot_approuve_cout_ttc, + perimetre_approuve_nombre_communes, + perimetre_approuve_pop_municipale, + perimetre_approuve_pop_totale, + perimetre_approuve_superficie, + perimetre_approuve_zb_nombre_communes, + perimetre_approuve_zb_pop_totale, + perimetre_approuve_zb_superficie, + scot_en_cours_pcnomschema, + scot_en_cours_pcnoserieprocedure, + scot_en_cours_pcscotinterdepartement, + scot_en_cours_pcdatepublicationperimetre, + scot_en_cours_pcdateprescription, + scot_en_cours_pcdatearretprojet, + scot_en_cours_pclibellemoe, + scot_en_cours_pccoutschemaht, + scot_en_cours_pccoutschemattc, + perimetre_en_cours_pcnombrecommunes, + perimetre_en_cours_pcpopmunicipale, + perimetre_en_cours_pcpopulationtotale, + perimetre_en_cours_pcsuperficie + +FROM {{ source('public', 'sudocuh_scot') }} diff --git a/airflow/include/sql/sparte/models/sudocuh/scot_communes.sql b/airflow/include/sql/sparte/models/sudocuh/scot_communes.sql new file mode 100644 index 000000000..887c409c2 --- /dev/null +++ b/airflow/include/sql/sparte/models/sudocuh/scot_communes.sql @@ -0,0 +1,25 @@ +{{ config(materialized='table') }} + +SELECT + index, + annee_cog, + circonscription_reg2016 AS circonscription_region_2016, + circonscription_dept AS circonscription_departement, + communes_code_insee AS commune_code, + communes_nom AS commune_nom, + communes_zb AS commune_zb, + communes_opposable AS commune_opposable, + code_etat_code AS code_etat, + id_scot, + nom_scot, + epci_porteur_siren, + scot_approuve_id_scot, + scot_approuve_nom_schema, + scot_approuve_noserie_procedure, + scot_approuve_date_prescription, + scot_approuve_date_approbation, + scot_en_cours_id_scot, + scot_en_cours_nom_schema, + scot_en_cours_noserie_procedure, + scot_en_cours_date_prescription +FROM {{ source('public', 'sudocuh_scot_communes') }} diff --git a/airflow/include/utils.py b/airflow/include/utils.py index ec9aa141e..294710ff8 100644 --- a/airflow/include/utils.py +++ b/airflow/include/utils.py @@ -1,2 +1,34 @@ +import os + + def multiline_string_to_single_line(string: str) -> str: return string.replace("\n", " ").replace("\r", "") + + +def get_first_shapefile_path_in_dir(dir_path: str) -> str | None: + """ + Walk through a directory and return the first shapefile path found. + Raises a ValueError if multiple shapefiles are found. + """ + + shapefile_paths = [] + + for dirpath, _, filenames in os.walk(dir_path): + for filename in filenames: + if filename.endswith(".shp"): + shapefile_paths.append(os.path.abspath(os.path.join(dirpath, filename))) + + if len(shapefile_paths) > 1: + raise ValueError(f"Multiple shapefiles found in {dir_path}") + + if shapefile_paths: + return shapefile_paths[0] + + return None + + +def get_dbt_command_from_directory( + cmd: str, + directory="${AIRFLOW_HOME}/include/sql/sparte", +) -> str: + return f'cd "{directory}" && ' + cmd diff --git a/assets/images/information.svg b/assets/images/information.svg new file mode 100644 index 000000000..42e934a4d --- /dev/null +++ b/assets/images/information.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/ocsge-nomenclature-cs.png b/assets/images/ocsge-nomenclature-cs.png new file mode 100644 index 000000000..360addf94 Binary files /dev/null and b/assets/images/ocsge-nomenclature-cs.png differ diff --git a/assets/images/ocsge-nomenclature-us.png b/assets/images/ocsge-nomenclature-us.png new file mode 100644 index 000000000..18e2f6342 Binary files /dev/null and b/assets/images/ocsge-nomenclature-us.png differ diff --git a/project/static/project/img/ocs_ge_matrice_passage.png b/assets/images/ocsge_matrice_passage.png similarity index 100% rename from project/static/project/img/ocs_ge_matrice_passage.png rename to assets/images/ocsge_matrice_passage.png diff --git a/assets/scripts/.eslintrc b/assets/scripts/.eslintrc index cd58ef0c1..3acae1a84 100644 --- a/assets/scripts/.eslintrc +++ b/assets/scripts/.eslintrc @@ -27,5 +27,10 @@ "no-plusplus": ["error", { "allowForLoopAfterthoughts": true }], "no-nested-ternary": "off", "no-new": "off" + }, + "settings": { + "react": { + "version": "detect" + } } } diff --git a/assets/scripts/components/HighchartsMapOcsge.tsx b/assets/scripts/components/charts/HighchartsMapOcsge.tsx similarity index 97% rename from assets/scripts/components/HighchartsMapOcsge.tsx rename to assets/scripts/components/charts/HighchartsMapOcsge.tsx index 61f3f08fe..5254d026c 100644 --- a/assets/scripts/components/HighchartsMapOcsge.tsx +++ b/assets/scripts/components/charts/HighchartsMapOcsge.tsx @@ -2,7 +2,7 @@ import React, { useRef, useEffect, useState, useMemo } from 'react'; import * as Highcharts from 'highcharts'; import HighchartsReact from 'highcharts-react-official'; import HighchartsMap from 'highcharts/modules/map'; -import { useGetDepartementListQuery } from '../services/api.js'; +import { useGetDepartementListQuery } from '@services/api'; HighchartsMap(Highcharts); @@ -175,4 +175,4 @@ const HighchartsMapOcsge: React.FC = () => { ); }; -export default HighchartsMapOcsge; \ No newline at end of file +export default HighchartsMapOcsge; diff --git a/assets/scripts/components/layout/Dashboard.tsx b/assets/scripts/components/layout/Dashboard.tsx new file mode 100644 index 000000000..5b53bf964 --- /dev/null +++ b/assets/scripts/components/layout/Dashboard.tsx @@ -0,0 +1,178 @@ +import React, { useEffect } from 'react'; +import { useDispatch } from 'react-redux'; +import { BrowserRouter as Router, Route, Routes } from 'react-router-dom'; +import styled from 'styled-components'; +import { useGetProjectQuery } from '@services/api'; +import { setProjectData } from '@store/projectSlice'; +import useMatomoTracking from '@hooks/useMatomoTracking'; +import useUrls from '@hooks/useUrls'; +import Footer from '@components/layout/Footer'; +import Header from '@components/layout/Header'; +import Navbar from '@components/layout/Navbar'; +import TopBar from '@components/layout/TopBar'; +import Synthese from '@components/pages/Synthese'; +import Consommation from '@components/pages/Consommation'; +import Impermeabilisation from '@components/pages/Impermeabilisation'; +import Artificialisation from '@components/pages/Artificialisation'; +import Gpu from '@components/pages/Gpu'; +import Ocsge from '@components/pages/Ocsge'; +import Trajectoires from '@components/pages/Trajectoires'; +import RapportLocal from '@components/pages/RapportLocal'; +import Update from '@components/pages/Update'; +import RouteWrapper from '@components/widgets/RouteWrapper'; + +interface DashboardProps { + projectId: string; +} + +const Main = styled.main` + margin-left: 280px; + margin-top: 80px; + flex-grow: 1; + display: flex; + flex-direction: column; + background: #f8f9ff; +`; + +const Content = styled.div` + flex-grow: 1; + display: flex; + flex-direction: column; +`; + + +const Dashboard: React.FC = ({ projectId }) => { + const dispatch = useDispatch(); + const { data, error, isLoading } = useGetProjectQuery(projectId); + const urls = useUrls(); + + useEffect(() => { + if (data) { + dispatch(setProjectData(data)); + } + }, [data, dispatch]); + + return ( + <> + {data && !isLoading && !error && urls && ( + <> +
+ + + +
+ + + + + + + } + /> + + + + } + /> + + + + } + /> + + + + } + /> + + + + } + /> + + + + } + /> + + + + } + /> + + + + } + /> + + + + } + /> + + +
+
+
+ + )} + + ); +}; + +const TrackingWrapper: React.FC = () => { + useMatomoTracking(); + return null; // Ce composant ne rend rien +}; + +export default Dashboard; diff --git a/assets/scripts/components/layout/Footer.tsx b/assets/scripts/components/layout/Footer.tsx new file mode 100644 index 000000000..a099df1ba --- /dev/null +++ b/assets/scripts/components/layout/Footer.tsx @@ -0,0 +1,74 @@ +import React, { useState, useEffect } from 'react'; +import styled from 'styled-components'; + +interface FooterData { + menuItems: MenuItem[]; +} + +interface MenuItem { + label: string; + url: string; + target?: string; +} + +const Container = styled.div` + font-size: 0.8em; + padding: 2rem 1rem; +`; + +const NavLinks = styled.nav` + display: flex; + align-items: center; + gap: 0.5rem; +`; + +const NavLink = styled.a` + padding: 0.25rem 0.75rem; + font-size: 0.85em; + font-weight: 500; + text-decoration: none; + background-image: none; + -webkit-tap-highlight-color: transparent; + transition: color .3s ease; + color: #979FB8; + + &:hover { + color: #4318FF; + } +`; + +const Footer = () => { + const [data, setData] = useState(null); + + // La composition du footer et notamment les urls des liens sont récupérés via le contexte Django => project/templates/layout/base.html => #footer-data + useEffect(() => { + const dataElement = document.getElementById('footer-data'); + if (dataElement) { + const parsedData = JSON.parse(dataElement.textContent || '{}'); + setData(parsedData); + } + }, []); + + return ( + +
+
+ + {data?.menuItems.map((item) => ( + + {item.label} + + ))} + +
+
+
+ ); +}; + +export default Footer; diff --git a/assets/scripts/components/layout/Header.tsx b/assets/scripts/components/layout/Header.tsx new file mode 100644 index 000000000..294b50e49 --- /dev/null +++ b/assets/scripts/components/layout/Header.tsx @@ -0,0 +1,164 @@ +import React, { useState, useEffect } from 'react'; +import styled from 'styled-components'; +import SearchBar from '@components/widgets/SearchBar'; + +interface HeaderData { + logos: Logo[]; + search: { + createUrl: string; + }; + menuItems: MenuItem[]; +} + +interface Logo { + src: string; + alt: string; + height?: string; + url?: string; +} + +interface MenuItem { + label: string; + url: string; + target?: string; +} + +const HeaderContainer = styled.header` + position: fixed; + top: 0; + left: 0; + width: 100%; + z-index: 999; + display: flex; + justify-content: space-between; + align-items: center; + padding: 0.3rem 1rem; + background-color: #fff; + border-bottom: 1px solid #EEF2F7; + + @media (max-width: 768px) { + flex-direction: column; + align-items: flex-start; + } +`; + +const LogoContainer = styled.div` + display: flex; + align-items: center; + gap: 2rem; + padding-right: 0.75rem; +`; + +const Logo = styled.img<{ width?: string; height?: string }>` + height: ${({ height }) => height || '50px'}; +`; + +const LogoLink = styled.a` + background: none; + text-decoration: none; +`; + +const ButtonContainer = styled.div` + display: flex; + flex-grow: 1; + justify-content: end; +`; + +const SearchBarContainer = styled.div` + flex-grow: 1; + margin: 0 2rem; + display: flex; + justify-content: end; + max-width: 550px; +`; + +const NavLinks = styled.nav` + display: flex; + align-items: center; + gap: 1rem; + + @media (max-width: 768px) { + margin-top: 1rem; + } +`; + +const NavLink = styled.a` + display: flex; + align-items: center; + gap: 0.5rem; + padding: 0.25rem 0.75rem; + font-size: 0.85em; + font-weight: 500; + text-decoration: none; + background-image: none; + -webkit-tap-highlight-color: transparent; + transition: background 0.2s ease; + color: #000091; + + &:hover { + color: #000091; + background: #f6f6f6 !important; + } + + @media (max-width: 768px) { + margin-left: 0; + margin-right: 1rem; + } +`; + +const Header = () => { + const [data, setData] = useState(null); + + // La composition du header et notamment les urls des liens sont récupérés via le contexte Django => project/templates/layout/base.html => #header-data + useEffect(() => { + const dataElement = document.getElementById('header-data'); + if (dataElement) { + const parsedData = JSON.parse(dataElement.textContent || '{}'); + setData(parsedData); + } + }, []); + + return ( + + + {data?.logos.map((logo) => ( + logo.url ? ( + + + + ) : ( + + ) + ))} + + + + + + + {data?.menuItems.map((item) => ( + + {item.label} + + ))} + + + + ); +}; + +export default Header; diff --git a/assets/scripts/components/layout/Navbar.tsx b/assets/scripts/components/layout/Navbar.tsx new file mode 100644 index 000000000..2e85392d0 --- /dev/null +++ b/assets/scripts/components/layout/Navbar.tsx @@ -0,0 +1,291 @@ +import React, { useState, useEffect } from 'react'; +import { useLocation, Link } from 'react-router-dom'; +import styled, { css } from 'styled-components'; +import useHtmx from '@hooks/useHtmx'; +import useUrls from '@hooks/useUrls'; +import Button from '@components/ui/Button'; + +interface NavbarData { + menuItems: MenuItems[]; +} + +interface MenuItems { + label: string; + url?: string; + icon: string; + subMenu?: SubMenu[]; +} + +interface SubMenu { + label: string; + url: string; + icon: string; +} + +const primaryColor = '#313178'; +const activeColor = '#4318FF'; + +const MenuStyle = css` + display: flex; + align-items: center; + padding: 0.6rem 1rem; + font-size: 0.85em; + font-weight: 500; +`; + +const LinkStyle = css<{ $isActive: boolean }>` + text-decoration: none; + background-image: none; + background-color: inherit !important; + border-right: 4px solid transparent; + -webkit-tap-highlight-color: transparent; + transition: color 0.2s ease, border-color 0.3s ease; + border-right: 4px solid transparent; + border-color: ${({ $isActive }) => ($isActive ? "#6a6af4" : "transparent")}; + color: ${({ $isActive }) => ($isActive ? activeColor : primaryColor)}; + + &:hover { + color: ${activeColor}; + } + &:active { + background: none; + } +`; + +const Container = styled.aside` + position: fixed; + left: 0; + top: 80px; + bottom: 0; + width: 280px; + display: flex; + flex-direction: column; + background: ##04023c; + border-right: 1px solid #EEF2F7; +`; + +const MenuList = styled.ul` + list-style: none; + padding: 1rem 0 0; + margin: 0; + flex: 1 1 0%; + overflow-y: auto; +`; + +const Menu = styled.li` + padding: 0; + margin-bottom: 1rem; +`; + +const MenuTitle = styled.div` + ${MenuStyle} + color: ${primaryColor}; + cursor: default; +`; + +const MenuTitleLink = styled(Link)<{ $isActive: boolean }>` + ${MenuStyle} + ${LinkStyle} +`; + +const SubMenuList = styled.ul` + list-style: none; + padding: 0; + margin: 0; + margin-bottom: 0.5em; +`; + +const SubMenu = styled.li` + padding-left: 0.1rem; + border-left: 1px solid #E0E1FF; + margin-left: 1.4rem; + position: relative; +`; + +const SubMenuTitleLink = styled(Link)<{ $isActive: boolean }>` + ${MenuStyle} + ${LinkStyle} +`; + +const Icon = styled.i` + margin-right: 0.7em; +`; + +const DownloadList = styled.ul` + height: 0; + overflow: hidden; + transition: height 0.3s ease; + margin: 0; + padding: 0; + list-style-type: none; +`; + +const DownloadContainer = styled.div` + margin: 1rem; + padding: 1rem; + border-radius: 6px; + background: #cacafb; + + &:hover ${DownloadList} { + height: 192px; + } +`; + +const DownloadTitle = styled.div` + color: ${activeColor}; + font-size: 0.9em; + display: flex; + align-items: center; + gap: 0.2rem; + flex-direction: column; + font-weight: 500; + + i { + font-size: 1.2em; + background: ${activeColor}; + color: #fff; + width: 40px; + height: 40px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + } +`; + +const DownloadListItem = styled.li` + & > a, & > button { + width: 100%; + } + + &:first-child { + margin-top: 1rem; + } +`; + +const Navbar: React.FC = () => { + const location = useLocation(); + const [data, setData] = useState(null); + const urls = useUrls(); + const htmxRef = useHtmx([urls]); + + // La composition de la navbar et notamment les urls des liens sont récupérés via le contexte Django => project/templates/layout/base.html => #navbar-data + useEffect(() => { + const dataElement = document.getElementById('navbar-data'); + if (dataElement) { + const data = JSON.parse(dataElement.textContent || '{}'); + setData(data); + } + }, []); + + const isActive = (url?: string) => location.pathname === url; + + // Temporaire => Il faudrait utiliser la modal de react dsfr + const resetModalContent = () => { + const modalContent = document.getElementById('diag_word_form'); + if (modalContent) { + modalContent.innerHTML = '
'; + } + }; + + const renderMenuItems = (items: SubMenu[]) => ( + + {items.map(item => ( + + + {item.icon && } + {item.label} + + + ))} + + ); + + return ( + + + {data?.menuItems.map((menu) => ( + + {menu.url ? ( + + {menu.icon && } + {menu.label} + + ) : ( + + {menu.icon && } + {menu.label} + + )} + {menu.subMenu && renderMenuItems(menu.subMenu)} + + ))} + + {urls && ( + + + +
Téléchargements
+
+ + + + } + + + + + Maille d'analyse + { memoizedProjectData?.level_label } + + +
+ ); +}; + +export default memo(TopBar); diff --git a/assets/scripts/components/pages/Artificialisation.tsx b/assets/scripts/components/pages/Artificialisation.tsx new file mode 100644 index 000000000..4eeff2e02 --- /dev/null +++ b/assets/scripts/components/pages/Artificialisation.tsx @@ -0,0 +1,76 @@ +import React from 'react'; +import { useHtmlLoader } from '@hooks/useHtmlLoader'; +import useHighcharts from '@hooks/useHighcharts'; +import Loader from '@components/ui/Loader'; +import Guide from '@components/widgets/Guide'; +import OcsgeMatricePassage from '@images/ocsge_matrice_passage.png'; + +/* +Ce composant est un composant hybride qui permet de récupérer du contenu côté serveur via Django et de l'intégrer directement dans l'interface React. +Cette approche progressive facilite la migration des éléments de contenu existants vers React, tout en permettant de conserver certaines fonctionnalités serveur le temps de la transition. + +### Graphiques interactifs : +Le hook `useHighcharts` récupère les options des graphiques transmises par le contexte Django et les rend dynamiquement dans le contenu. + +### Injection HTML contrôlée : +Le contenu récupéré du serveur est inséré directement dans le DOM à l'aide de `dangerouslySetInnerHTML`. +Cela est nécessaire pour rendre du contenu HTML généré côté serveur, mais il est important de prendre des précautions contre les injections de code malveillant (XSS). +Dans ce cas, les données provenant de Django sont considérées comme fiables. +*/ + +const Artificialisation: React.FC<{ endpoint: string }> = ({ endpoint }) => { + const { content, isLoading, error } = useHtmlLoader(endpoint); + + useHighcharts([ + 'detail_couv_artif_chart', + 'couv_artif_sol', + 'detail_usage_artif_chart', + 'usage_artif_sol', + 'chart_comparison', + 'chart_waterfall' + ], isLoading); + + if (isLoading) return ; + if (error) return
Erreur : {error}
; + + return ( +
+
+
+ +
  • soit imperméabilisés en raison du bâti ou d'un revêtement,
  • +
  • soit stabilisés et compactés,
  • +
  • soit constitués de matériaux composites »
  • + + `} + DrawerTitle="Cadre Réglementaire" + DrawerContentHtml={` +

    + L'article 192 de la Loi Climat & Résilience votée en août 2021 définit + l'artificialisation comme « une surface dont les sols sont : +

    +
      +
    • soit imperméabilisés en raison du bâti ou d'un revêtement,
    • +
    • soit stabilisés et compactés,
    • +
    • soit constitués de matériaux composites »
    • +
    +

    Elle se traduit dans l'OCS GE nationale comme la somme des objets anthropisés dans la description de la couverture des sols.

    +

    L'application applique ici un croisement des données de l'OCS GE pour définir l'artificialisation conformément aux attendus de la loi Climat & Résilience, et au décret « nomenclature de l'artificialisation des sols» (Décret n° 2022-763 du 29 avril 2022 relatif à la nomenclature de l'artificialisation des sols pour la fixation et le suivi des objectifs dans les documents de planification et d'urbanisme).

    +

    Définition de l'artificialisation des sols

    +

    La nomenclature précise que les surfaces dont les sols sont soit imperméabilisés en raison du bâti ou d'un revêtement, soit stabilisés et compactés, soit constitués de matériaux composites sont qualifiées de surfaces artificialisées. De même, les surfaces végétalisées herbacées (c'est-à-dire non ligneuses) et qui sont à usage résidentiel, de production secondaire ou tertiaire, ou d'infrastructures, sont considérées comme artificialisées, y compris lorsqu'elles sont en chantier ou à l'état d'abandon.

    +

    L'artificialisation nette est définie comme « le solde de l'artificialisation et de la désartificialisation des sols constatées sur un périmètre et sur une période donnés » (article L.101-2-1 du code de l'urbanisme).

    +

    Au niveau national, l'artificialisation est mesurée par l'occupation des sols à grande échelle (OCS GE), en cours d'élaboration, dont la production sera engagée sur l'ensemble du territoire national d'ici fin 2024.

    + OCS GE Nomenclature Us + `} + /> +
    +
    +
    +
    + ); +}; + +export default Artificialisation; diff --git a/assets/scripts/components/pages/Consommation.tsx b/assets/scripts/components/pages/Consommation.tsx new file mode 100644 index 000000000..fc5a60078 --- /dev/null +++ b/assets/scripts/components/pages/Consommation.tsx @@ -0,0 +1,101 @@ +import React, { useEffect, useState } from 'react'; +import { useHtmlLoader } from '@hooks/useHtmlLoader'; +import useHtmx from '@hooks/useHtmx'; +import useHighcharts from '@hooks/useHighcharts'; +import Loader from '@components/ui/Loader'; +import Guide from '@components/widgets/Guide'; + +/* +Ce composant est un composant hybride qui permet de récupérer du contenu côté serveur via Django et de l'intégrer directement dans l'interface React. +Cette approche progressive facilite la migration des éléments de contenu existants vers React, tout en permettant de conserver certaines fonctionnalités serveur le temps de la transition. + +### Rafraîchissement via une clé dynamique : +Le composant utilise une clé de rafraîchissement (`refreshKey`) qui permet de forcer un nouveau rendu lorsqu'un formulaire ou une action utilisateur modifie les paramètres, via la bibliothèque HTMX. +Le hook `useHtmx` s'assure que les interactions HTMX continuent de fonctionner même après le rendu côté React. Chaque fois que l'événement personnalisé `force-refresh` est déclenché, le composant réinitialise son contenu avec les nouveaux paramètres. + +### Graphiques interactifs : +Le hook `useHighcharts` récupère les options des graphiques transmises par le contexte Django et les rend dynamiquement dans le contenu. + +### Injection HTML contrôlée : +Le contenu récupéré du serveur est inséré directement dans le DOM à l'aide de `dangerouslySetInnerHTML`. +Cela est nécessaire pour rendre du contenu HTML généré côté serveur, mais il est important de prendre des précautions contre les injections de code malveillant (XSS). +Dans ce cas, les données provenant de Django sont considérées comme fiables. +*/ + +const Consommation: React.FC<{ endpoint: string }> = ({ endpoint }) => { + const [refreshKey, setRefreshKey] = useState(0); + const { content, isLoading, error } = useHtmlLoader(endpoint + `?refreshKey=${refreshKey}`); + const htmxRef = useHtmx([isLoading]); + + useHighcharts([ + 'annual_total_conso_chart', + 'comparison_chart', + 'chart_determinant', + 'pie_determinant', + 'surface_chart', + 'surface_proportional_chart' + ], isLoading); + + useEffect(() => { + const handleForceRefresh = () => { + setRefreshKey(prevKey => prevKey + 1); + }; + + document.addEventListener('force-refresh', handleForceRefresh); + + return () => { + document.removeEventListener('force-refresh', handleForceRefresh); + }; + }, []); + + useEffect(() => { + if (!isLoading && refreshKey !== 0) { + const targetElement = document.getElementById('territoires-de-comparaison'); + const targetPosition = targetElement.getBoundingClientRect().top + window.scrollY - 190; + if (targetElement) { + window.scrollTo({ top: targetPosition, behavior: 'instant' }); + } + } + }, [refreshKey, isLoading]); + + if (isLoading) return ; + if (error) return
    Erreur : {error}
    ; + + return ( +
    +
    +
    + + La consommation d'espaces NAF (Naturels, Agricoles et Forestiers) est entendue comme + « la création ou l'extension effective d'espaces urbanisés sur le territoire concerné » (article 194 de la loi Climat et résilience). +

    +

    + Cet article exprime le fait que le caractère urbanisé d'un espace est la traduction de l'usage qui en est fait. + Un espace urbanisé n'est plus un espace d'usage NAF (Naturel, Agricole et Forestier). Si l'artificialisation des sols traduit globalement un changement de couverture physique, + la consommation traduit un changement d'usage. A titre d'exemple, un bâtiment agricole artificialise mais ne consomme pas. +

    +

    + La consommation d'espaces NAF (Naturels, Agricoles et Forestiers) est mesurée avec les données d'évolution des fichiers fonciers produits + et diffusés par le Cerema depuis 2009 à partir des fichiers MAJIC (Mise A Jour de l'Information Cadastrale) + de la DGFIP. Le dernier millésime de 2023 est la photographie du territoire au 1er janvier 2023, intégrant + les évolutions réalisées au cours de l'année 2022. +

    +

    + Les données de l'INSEE sont également intégrées pour mettre en perspective la consommation d'espaces vis à vis de l'évolution de la population. +

    +

    Plus d'informations sur les fichiers fonciers (source : Cerema)

    + `} + /> +
    +
    +
    +
    + ); +}; + +export default Consommation; diff --git a/assets/scripts/components/pages/Gpu.tsx b/assets/scripts/components/pages/Gpu.tsx new file mode 100644 index 000000000..2a178a348 --- /dev/null +++ b/assets/scripts/components/pages/Gpu.tsx @@ -0,0 +1,32 @@ +import React from 'react'; +import { useHtmlLoader } from '@hooks/useHtmlLoader'; +import Loader from '@components/ui/Loader'; + +/* +Ce composant est un composant hybride qui permet de récupérer du contenu côté serveur via Django et de l'intégrer directement dans l'interface React. +Cette approche progressive facilite la migration des éléments de contenu existants vers React, tout en permettant de conserver certaines fonctionnalités serveur le temps de la transition. + +### Injection HTML contrôlée : +Le contenu récupéré du serveur est inséré directement dans le DOM à l'aide de `dangerouslySetInnerHTML`. +Cela est nécessaire pour rendre du contenu HTML généré côté serveur, mais il est important de prendre des précautions contre les injections de code malveillant (XSS). +Dans ce cas, les données provenant de Django sont considérées comme fiables. +*/ + +const Gpu: React.FC<{ endpoint: string }> = ({ endpoint }) => { + const { content, isLoading, error } = useHtmlLoader(endpoint); + + if (isLoading) return ; + if (error) return
    Erreur : {error}
    ; + + return ( +
    +
    +
    +
    +
    +
    +
    + ); +}; + +export default Gpu; diff --git a/assets/scripts/components/pages/Impermeabilisation.tsx b/assets/scripts/components/pages/Impermeabilisation.tsx new file mode 100644 index 000000000..518dee16f --- /dev/null +++ b/assets/scripts/components/pages/Impermeabilisation.tsx @@ -0,0 +1,77 @@ +import React from 'react'; +import { useHtmlLoader } from '@hooks/useHtmlLoader'; +import useHighcharts from '@hooks/useHighcharts'; +import Loader from '@components/ui/Loader'; +import Guide from '@components/widgets/Guide'; + +/* +Ce composant est un composant hybride qui permet de récupérer du contenu côté serveur via Django et de l'intégrer directement dans l'interface React. +Cette approche progressive facilite la migration des éléments de contenu existants vers React, tout en permettant de conserver certaines fonctionnalités serveur le temps de la transition. + +### Graphiques interactifs : +Le hook `useHighcharts` récupère les options des graphiques transmises par le contexte Django et les rend dynamiquement dans le contenu. + +### Injection HTML contrôlée : +Le contenu récupéré du serveur est inséré directement dans le DOM à l'aide de `dangerouslySetInnerHTML`. +Cela est nécessaire pour rendre du contenu HTML généré côté serveur, mais il est important de prendre des précautions contre les injections de code malveillant (XSS). +Dans ce cas, les données provenant de Django sont considérées comme fiables. +*/ + +const Impermeabilisation: React.FC<{ endpoint: string }> = ({ endpoint }) => { + const { content, isLoading, error } = useHtmlLoader(endpoint); + + useHighcharts([ + 'imper_nette_chart', + 'imper_progression_couv_chart', + 'imper_repartition_couv_chart', + 'imper_progression_usage_chart', + 'imper_repartition_usage_chart', + ], isLoading); + + if (isLoading) return ; + if (error) return
    Erreur : {error}
    ; + + return ( +
    +
    +
    + +
  • 1° Surfaces dont les sols sont imperméabilisés en raison du bâti (constructions, aménagements, ouvrages ou installations).
  • +
  • 2° Surfaces dont les sols sont imperméabilisés en raison d'un revêtement (Impericiel, asphalté, bétonné, couvert de pavés ou de dalles).
  • + + `} + DrawerTitle="Cadre Réglementaire" + DrawerContentHtml={` +

    Le Décret n° 2023-1096 du 27 novembre 2023 relatif à l'évaluation et au suivi de l'Imperméabilisation des sols précise que le rapport relatif à l'Imperméabilisation des sols prévu à l'article L. 2231-1 présente, pour les années civiles sur lesquelles il porte et au moins tous les trois ans, les indicateurs et données suivants:

    +
      +
    • « 1° La consommation des espaces naturels, agricoles et forestiers, exprimée en nombre d'hectares, le cas échéant en la différenciant entre ces types d'espaces, et en pourcentage au regard de la superficie du territoire couvert. Sur le même territoire, le rapport peut préciser également la transformation effective d'espaces urbanisés ou construits en espaces naturels, agricoles et forestiers du fait d'une désimperméabilisation ;
    • +
    • « 2° Le solde entre les surfaces imperméabilisées et les surfaces désimperméabilisées, telles que définies dans la nomenclature annexée à l'article R. 101-1 du code de l'urbanisme ;
    • +
    • « 3° Les surfaces dont les sols ont été rendus imperméables, au sens des 1° et 2° de la nomenclature annexée à l'article R. 101-1 du code de l'urbanisme ;
    • +
    • « 4° L'évaluation du respect des objectifs de réduction de la consommation d'espaces naturels, agricoles et forestiers et de lutte contre l'imperméabilisation des sols fixés dans les documents de planification et d'urbanisme. Les documents de planification sont ceux énumérés au III de l'article R. 101-1 du code de l'urbanisme.
    • +
    +

    + L’imperméabilisation des sols est donc définie comme: +

    +
      +
    • 1° Surfaces dont les sols sont imperméabilisés en raison du bâti (constructions, aménagements, ouvrages ou installations).
    • +
    • 2° Surfaces dont les sols sont imperméabilisés en raison d'un revêtement (Impericiel, asphalté, bétonné, couvert de pavés ou de dalles).
    • +
    +

    + Au niveau national, l’imperméabilisation est mesurée par l'occupation des sols à grande échelle (OCS GE), en cours d'élaboration, dont la production sera engagée sur l'ensemble du territoire national d'ici mi 2025. +

    +

    + Dans la nomenclature OCS GE, les zones imperméables correspondent aux deux classes commençant par le code CS1.1.1 +

    + `} + /> +
    +
    +
    +
    + ); +}; + +export default Impermeabilisation; diff --git a/assets/scripts/components/pages/Ocsge.tsx b/assets/scripts/components/pages/Ocsge.tsx new file mode 100644 index 000000000..6a2fd3455 --- /dev/null +++ b/assets/scripts/components/pages/Ocsge.tsx @@ -0,0 +1,64 @@ +import React from 'react'; +import { useHtmlLoader } from '@hooks/useHtmlLoader'; +import useHighcharts from '@hooks/useHighcharts'; +import Loader from '@components/ui/Loader'; +import Guide from '@components/widgets/Guide'; +import OcsgeNomenclatureUs from '@images/ocsge-nomenclature-us.png'; +import OcsgeNomenclatureCs from '@images/ocsge-nomenclature-cs.png'; + +/* +Ce composant est un composant hybride qui permet de récupérer du contenu côté serveur via Django et de l'intégrer directement dans l'interface React. +Cette approche progressive facilite la migration des éléments de contenu existants vers React, tout en permettant de conserver certaines fonctionnalités serveur le temps de la transition. + +### Graphiques interactifs : +Le hook `useHighcharts` récupère les options des graphiques transmises par le contexte Django et les rend dynamiquement dans le contenu. + +### Injection HTML contrôlée : +Le contenu récupéré du serveur est inséré directement dans le DOM à l'aide de `dangerouslySetInnerHTML`. +Cela est nécessaire pour rendre du contenu HTML généré côté serveur, mais il est important de prendre des précautions contre les injections de code malveillant (XSS). +Dans ce cas, les données provenant de Django sont considérées comme fiables. +*/ + +const Ocsge: React.FC<{ endpoint: string }> = ({ endpoint }) => { + const { content, isLoading, error } = useHtmlLoader(endpoint); + + useHighcharts([ + 'chart_couv_pie', + 'chart_couv_prog', + 'chart_usa_pie', + 'chart_usa_prog', + 'chart_couv_wheel', + 'chart_usa_wheel' + ], isLoading); + + if (isLoading) return ; + if (error) return
    Erreur : {error}
    ; + + return ( +
    +
    +
    + Au niveau national, l'artificialisation est mesurée par l'occupation des sols à grande échelle (OCS GE), en cours d'élaboration, dont la production sera engagée sur l'ensemble du territoire national d'ici fin 2024.

    +

    L'OCS GE est une base de données vectorielle pour la description de l'occupation du sol de l'ensemble du territoire métropolitain et des départements et régions d'outre-mer (DROM). Elle est un référentiel national, constituant un socle national, utilisable au niveau national et au niveau local notamment pour contribuer aux calculs d'indicateurs exigés par les documents d'urbanisme. Elle s'appuie sur un modèle ouvert séparant la couverture du sol et l'usage du sol (appelé modèle en 2 dimensions), une précision géométrique appuyée sur le Référentiel à Grande Échelle (RGE®) et une cohérence temporelle (notion de millésime) qui, par le biais de mises à jour à venir, permettra de quantifier et de qualifier les évolutions des espaces.

    +

    La couverture du sol est une vue « physionomique » du terrain. La description est une simple distinction des éléments structurant le paysage. Ex : Zones bâties.

    +

    L'usage du sol est une vue « anthropique du sol ». Il est partagé en fonction du rôle que jouent les portions de terrain en tant qu'occupation humaine. Dans l'OCS GE, l'usage US235 regroupe les objets de US2 (production secondaire), US3 (production tertiaire) et US5 (usage résidentiel) de la nomenclature nationale quand la distinction entre ces usages n'est pas possible ou pas connue. Ex : Agriculture.

    +

    Chaque objet géographique de l'OCS GE porte ces deux informations. Ex : Zones bâties (couverture) et Agriculture (usage) décrivent des bâtiments agricoles.

    +
    + OCS GE Nomenclature Us + OCS GE Nomenclature Us +
    + `} + /> +
    +
    +
    +
    + ); +}; + +export default Ocsge; diff --git a/assets/scripts/components/pages/RapportLocal.tsx b/assets/scripts/components/pages/RapportLocal.tsx new file mode 100644 index 000000000..6dea32533 --- /dev/null +++ b/assets/scripts/components/pages/RapportLocal.tsx @@ -0,0 +1,67 @@ +import React from 'react'; +import { useHtmlLoader } from '@hooks/useHtmlLoader'; +import useHtmx from '@hooks/useHtmx'; +import useUrls from '@hooks/useUrls'; +import Loader from '@components/ui/Loader'; +import Button from '@components/ui/Button'; +import CallToAction from '@components/ui/CallToAction'; + +/* +Ce composant est un composant hybride qui permet de récupérer du contenu côté serveur via Django et de l'intégrer directement dans l'interface React. +Cette approche progressive facilite la migration des éléments de contenu existants vers React, tout en permettant de conserver certaines fonctionnalités serveur le temps de la transition. + +### Injection HTML contrôlée : +Le contenu récupéré du serveur est inséré directement dans le DOM à l'aide de `dangerouslySetInnerHTML`. +Cela est nécessaire pour rendre du contenu HTML généré côté serveur, mais il est important de prendre des précautions contre les injections de code malveillant (XSS). +Dans ce cas, les données provenant de Django sont considérées comme fiables. +*/ + +const RapportLocal: React.FC<{ endpoint: string }> = ({ endpoint }) => { + const { content, isLoading, error } = useHtmlLoader(endpoint); + const urls = useUrls(); + const htmxRef = useHtmx([isLoading]); + + // Temporaire => Il faudrait utiliser la modal de react dsfr + const resetModalContent = () => { + const modalContent = document.getElementById('diag_word_form'); + if (modalContent) { + modalContent.innerHTML = '
    '; + } + }; + + if (isLoading) return ; + if (error) return
    Erreur : {error}
    ; + + return ( +
    +
    +
    + { urls && ( + +
    +
    +
    + )} +
    +
    +
    +
    + ); +}; + +export default RapportLocal; diff --git a/assets/scripts/components/pages/Synthese.tsx b/assets/scripts/components/pages/Synthese.tsx new file mode 100644 index 000000000..bf13b5fd1 --- /dev/null +++ b/assets/scripts/components/pages/Synthese.tsx @@ -0,0 +1,32 @@ +import React from 'react'; +import { useHtmlLoader } from '@hooks/useHtmlLoader'; +import Loader from '@components/ui/Loader'; + +/* +Ce composant est un composant hybride qui permet de récupérer du contenu côté serveur via Django et de l'intégrer directement dans l'interface React. +Cette approche progressive facilite la migration des éléments de contenu existants vers React, tout en permettant de conserver certaines fonctionnalités serveur le temps de la transition. + +### Injection HTML contrôlée : +Le contenu récupéré du serveur est inséré directement dans le DOM à l'aide de `dangerouslySetInnerHTML`. +Cela est nécessaire pour rendre du contenu HTML généré côté serveur, mais il est important de prendre des précautions contre les injections de code malveillant (XSS). +Dans ce cas, les données provenant de Django sont considérées comme fiables. +*/ + +const Synthese: React.FC<{ endpoint: string }> = ({ endpoint }) => { + const { content, isLoading, error } = useHtmlLoader(endpoint); + + if (isLoading) return ; + if (error) return
    Erreur : {error}
    ; + + return ( +
    +
    +
    +
    +
    +
    +
    + ); +}; + +export default Synthese; diff --git a/assets/scripts/components/pages/Trajectoires.tsx b/assets/scripts/components/pages/Trajectoires.tsx new file mode 100644 index 000000000..e34feebb1 --- /dev/null +++ b/assets/scripts/components/pages/Trajectoires.tsx @@ -0,0 +1,118 @@ +import React, { useEffect, useState } from 'react'; +import { useHtmlLoader } from '@hooks/useHtmlLoader'; +import useHtmx from '@hooks/useHtmx'; +import useHighcharts from '@hooks/useHighcharts'; +import Loader from '@components/ui/Loader'; +import Guide from '@components/widgets/Guide'; + +/* +Ce composant est un composant hybride qui permet de récupérer du contenu côté serveur via Django et de l'intégrer directement dans l'interface React. +Cette approche progressive facilite la migration des éléments de contenu existants vers React, tout en permettant de conserver certaines fonctionnalités serveur le temps de la transition. + +### Rafraîchissement via une clé dynamique : +Le composant utilise une clé de rafraîchissement (`refreshKey`) qui permet de forcer un nouveau rendu lorsqu'un formulaire ou une action utilisateur modifie les paramètres, via la bibliothèque HTMX. +Le hook `useHtmx` s'assure que les interactions HTMX continuent de fonctionner même après le rendu côté React. Chaque fois que l'événement personnalisé `force-refresh` est déclenché, le composant réinitialise son contenu avec les nouveaux paramètres. + +### Graphiques interactifs : +Le hook `useHighcharts` récupère les options des graphiques transmises par le contexte Django et les rend dynamiquement dans le contenu. + +### Injection HTML contrôlée : +Le contenu récupéré du serveur est inséré directement dans le DOM à l'aide de `dangerouslySetInnerHTML`. +Cela est nécessaire pour rendre du contenu HTML généré côté serveur, mais il est important de prendre des précautions contre les injections de code malveillant (XSS). +Dans ce cas, les données provenant de Django sont considérées comme fiables. +*/ + +const Trajectoires: React.FC<{ endpoint: string }> = ({ endpoint }) => { + const [refreshKey, setRefreshKey] = useState(0); + const { content, isLoading, error } = useHtmlLoader(endpoint + `?refreshKey=${refreshKey}`); + const htmxRef = useHtmx([isLoading]); + + useHighcharts([ + 'target_2031_chart' + ], isLoading); + + useEffect(() => { + const handleLoadGraphic = () => { + setTimeout(handleModalClose, 1800); + }; + + const handleModalClose = () => { + // Ferme la modal Bootstrap + const modalElement = document.getElementById("setTarget"); + if (modalElement) { + const modalInstance = window.bootstrap.Modal.getInstance(modalElement); + if (modalInstance) { + modalInstance.hide(); + } + } + + // Rafraîchit la clé après avoir fermé la modal pour recharger le contenu + setRefreshKey(prevKey => prevKey + 1); + }; + + document.addEventListener('load-graphic', handleLoadGraphic); + + return () => { + document.removeEventListener('load-graphic', handleLoadGraphic); + }; + }, []); + + if (isLoading) return ; + if (error) return
    Erreur : {error}
    ; + + return ( +
    +
    +
    + l’objectif d’atteindre le « zéro artificialisation nette des sols » en 2050, avec un objectif intermédiaire + de réduction de moitié de la consommation d’espaces naturels, agricoles et forestiers dans les dix prochaines années 2021-2031 + par rapport à la décennie précédente 2011-2021. + `} + DrawerTitle="Cadre Réglementaire" + DrawerContentHtml={` +

    + La loi Climat & Résilience fixe l’objectif d’atteindre le « zéro artificialisation nette des sols » en 2050, avec un objectif intermédiaire + de réduction de moitié de la consommation d’espaces + naturels, agricoles et forestiers dans les dix prochaines années 2021-2031 (en se basant sur les données allant du 01/01/2021 au 31/12/2030) + par rapport à la décennie précédente 2011-2021 (en se basant sur les données allant du 01/01/2011 au 31/12/2020). +

    +

    + Cette trajectoire nationale progressive est à décliner dans les documents de planification et d'urbanisme (avant le 22 novembre 2024 pour les SRADDET, + avant le 22 février 2027 pour les SCoT et avant le 22 février 2028 pour les PLU(i) et cartes communales). +

    +

    + Elle doit être conciliée avec l'objectif de soutien de la construction durable, en particulier dans les territoires où l'offre de logements et de surfaces économiques + est insuffisante au regard de la demande. +

    +

    + La loi prévoit également que la consommation foncière des projets d'envergure nationale ou européenne et d'intérêt général majeur sera comptabilisée au niveau national, et + non au niveau régional ou local. Ces projets seront énumérés par arrêté du ministre chargé de l'urbanisme, en fonction de catégories définies dans la loi, + après consultation des régions, de la conférence régionale et du public. Un forfait de 12 500 hectares est déterminé pour la période 2021-2031, dont 10 000 + hectares font l'objet d'une péréquation entre les régions couvertes par un SRADDET. +

    +

    + Cette loi précise également l’exercice de territorialisation de la trajectoire. Afin de tenir compte des besoins de l’ensemble des territoires, + une surface minimale d’un hectare de consommation est garantie à toutes les communes couvertes par un document d'urbanisme prescrit, arrêté ou approuvé avant le 22 août 2026, + pour la période 2021-2031. Cette « garantie communale » peut être mutualisée au niveau intercommunal à la demande des communes. Quant aux communes littorales soumises au recul + du trait de côte, qui sont listées par décret et qui ont mis en place un projet de recomposition spatiale, elles peuvent considérer, avant même que la désartificialisation soit + effective, comme « désartificialisées » les surfaces situées dans la zone menacée à horizon 30 ans et qui seront ensuite désartificialisées. +

    +

    + Dès aujourd’hui, Mon Diagnostic Artificialisation vous permet de vous projeter dans cet objectif de réduction de la consommation d’espaces NAF (Naturels, Agricoles et Forestiers) d’ici à 2031 et de simuler divers scénarios. +

    +

    + La consommation d'espaces NAF (Naturels, Agricoles et Forestiers) est mesurée avec les données d’évolution des fichiers fonciers produits et diffusés par le Cerema depuis 2009 à partir des fichiers MAJIC de la DGFIP. + Le dernier millésime de 2023 est la photographie du territoire au 1er janvier 2023, intégrant les évolutions réalisées au cours de l'année 2022. +

    + `} + /> +
    +
    +
    +
    + ); +}; + +export default Trajectoires; diff --git a/assets/scripts/components/pages/Update.tsx b/assets/scripts/components/pages/Update.tsx new file mode 100644 index 000000000..57061ff75 --- /dev/null +++ b/assets/scripts/components/pages/Update.tsx @@ -0,0 +1,32 @@ +import React from 'react'; +import { useHtmlLoader } from '@hooks/useHtmlLoader'; +import Loader from '@components/ui/Loader'; + +/* +Ce composant est un composant hybride qui permet de récupérer du contenu côté serveur via Django et de l'intégrer directement dans l'interface React. +Cette approche progressive facilite la migration des éléments de contenu existants vers React, tout en permettant de conserver certaines fonctionnalités serveur le temps de la transition. + +### Injection HTML contrôlée : +Le contenu récupéré du serveur est inséré directement dans le DOM à l'aide de `dangerouslySetInnerHTML`. +Cela est nécessaire pour rendre du contenu HTML généré côté serveur, mais il est important de prendre des précautions contre les injections de code malveillant (XSS). +Dans ce cas, les données provenant de Django sont considérées comme fiables. +*/ + +const Update: React.FC<{ endpoint: string }> = ({ endpoint }) => { + const { content, isLoading, error } = useHtmlLoader(endpoint); + + if (isLoading) return ; + if (error) return
    Erreur : {error}
    ; + + return ( +
    +
    +
    +
    +
    +
    +
    + ); +}; + +export default Update; diff --git a/assets/scripts/components/ui/Button.tsx b/assets/scripts/components/ui/Button.tsx new file mode 100644 index 000000000..a0dd65ecf --- /dev/null +++ b/assets/scripts/components/ui/Button.tsx @@ -0,0 +1,68 @@ +import React from 'react'; +import styled, { css } from 'styled-components'; + +const ButtonStyle = css` + display: flex; + align-items: center; + padding: 0.5rem; + border-radius: 6px; + color: #4318FF; + font-size: 0.8em; + transition: color 0.3s ease, background-color 0.3s ease; + width: auto; + background: #cacafb; + + &:hover { + background-color: #4318FF !important; + color: #FFFFFF !important; + } +`; + +const LinkElement = styled.a` + ${ButtonStyle} +`; + +const ButtonElement = styled.button` + ${ButtonStyle} +`; + +const ButtonIcon = styled.i` + font-size: 1.4em; + margin-right: 0.5rem; +`; + +interface ButtonProps { + type: 'button' | 'link' | 'htmx'; + icon?: string; + label: string; + url?: string; + htmxAttrs?: { [key: string]: string }; + onClick?: () => void; +} + +const Button: React.FC = ({ type, icon, label, url, htmxAttrs, onClick }) => { + const renderButton = { + link: ( + + {icon && } + {label} + + ), + htmx: ( + + {icon && } + {label} + + ), + button: ( + + {icon && } + {label} + + ), + }; + + return renderButton[type] || null; +}; + +export default Button; diff --git a/assets/scripts/components/ui/CallToAction.tsx b/assets/scripts/components/ui/CallToAction.tsx new file mode 100644 index 000000000..8b6ec082d --- /dev/null +++ b/assets/scripts/components/ui/CallToAction.tsx @@ -0,0 +1,46 @@ +import React, { ReactNode } from 'react'; +import styled from 'styled-components'; + +const Container = styled.div` + display: flex; + flex-direction: column; + padding: 1rem; + border-radius: 6px; + background-image: + radial-gradient( + farthest-corner circle at top left, + #a0aeff 0%, 63%, #9ba0ff 0% 0% + ) +`; + +const Title = styled.h3` + font-size: 0.9rem; + color: #313178; + margin-bottom: 0.5rem; +`; + +const Text = styled.p` + font-size: 0.8rem; + line-height: 1.2rem; + color: #313178; + margin-bottom: 1rem; +`; + + +interface CallToActionProps { + title: string; + text: string; + children: ReactNode; +} + +const CallToAction: React.FC = ({ title, text, children }) => { + return ( + + {title} + {text} + {children} + + ); +}; + +export default CallToAction; diff --git a/assets/scripts/components/ui/Divider.tsx b/assets/scripts/components/ui/Divider.tsx new file mode 100644 index 000000000..a7714d651 --- /dev/null +++ b/assets/scripts/components/ui/Divider.tsx @@ -0,0 +1,32 @@ +import React from 'react'; +import styled from 'styled-components'; + +interface DividerProps { + orientation?: 'horizontal' | 'vertical'; + color?: string; + size?: string; +} + +const StyledDivider = styled.div` + background-color: ${({ color }) => color || '#E0E1FF'}; + ${({ orientation, size }) => + orientation === 'vertical' + ? ` + height: ${size || 'auto'}; + width: 1px; + ` + : ` + height: 1px; + width: ${size || 'auto'}; + `} +`; + +const Divider: React.FC = ({ + orientation = 'vertical', + color, + size, +}) => { + return ; +}; + +export default Divider; diff --git a/assets/scripts/components/ui/Drawer.tsx b/assets/scripts/components/ui/Drawer.tsx new file mode 100644 index 000000000..8f66bcd84 --- /dev/null +++ b/assets/scripts/components/ui/Drawer.tsx @@ -0,0 +1,78 @@ +import React, { useEffect } from 'react'; +import styled from 'styled-components'; + +const DrawerContainer = styled.div<{ $isOpen: boolean }>` + position: fixed; + top: 0; + right: 0; + max-width: 620px; + height: 100%; + background-color: #fff; + box-shadow: rgba(0, 0, 0, 0.2) 0px 8px 10px -5px, rgba(0, 0, 0, 0.14) 0px 16px 24px 2px, rgba(0, 0, 0, 0.12) 0px 6px 30px 5px; + padding: 1rem 2rem; + overflow-y: auto; + transform: ${({ $isOpen }) => ($isOpen ? 'translateX(0)' : 'translateX(100%)')}; + transition: transform 0.3s ease-in-out; + z-index: 1001; +`; + +const DrawerTitle = styled.h4` + margin-top: 1rem; + font-size: 1em; + background: #f4f7fe; + border-radius: 6px; + padding: 1rem; + display: flex; + align-items: center; + justify-content: space-between; +`; + +const Icon = styled.i` + color: #2B3674; +`; + +const Overlay = styled.div<{ $isOpen: boolean }>` + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.2); + opacity: ${({ $isOpen }) => ($isOpen ? '1' : '0')}; + visibility: ${({ $isOpen }) => ($isOpen ? 'visible' : 'hidden')}; + transition: opacity 0.3s ease-in-out, visibility 0.3s ease-in-out; + z-index: 1000; +`; + +interface DrawerProps { + isOpen: boolean; + title: string; + contentHtml: string; + onClose: () => void; +} + +const Drawer: React.FC = ({ isOpen, title, contentHtml, onClose }) => { + useEffect(() => { + if (isOpen) { + document.body.style.overflow = 'hidden'; + } else { + document.body.style.overflow = 'auto'; + } + return () => { + document.body.style.overflow = 'auto'; + }; + }, [isOpen]); + + return ( + <> + + + + {title} +
    + + + ); +}; + +export default Drawer; diff --git a/assets/scripts/components/ui/ErrorBoundary.tsx b/assets/scripts/components/ui/ErrorBoundary.tsx new file mode 100644 index 000000000..3b5eea61c --- /dev/null +++ b/assets/scripts/components/ui/ErrorBoundary.tsx @@ -0,0 +1,42 @@ +import React, { Component, ReactNode } from 'react'; + +interface ErrorBoundaryProps { + children: ReactNode; +} + +interface ErrorBoundaryState { + hasError: boolean; + error: Error | null; +} + +class ErrorBoundary extends Component { + constructor(props: ErrorBoundaryProps) { + super(props); + this.state = { hasError: false, error: null }; + } + + static getDerivedStateFromError(_: Error): ErrorBoundaryState { + // Met à jour l'état pour afficher l'UI de repli lors du prochain rendu. + return { hasError: true, error: _ }; + } + + componentDidCatch(error: Error, errorInfo: React.ErrorInfo): void { + // Intégration Sentry à ajouter ici + console.error("ErrorBoundary caught an error", error, errorInfo); + } + + render() { + if (this.state.hasError) { + return ( +
    +

    Une erreur s'est produite.

    + {this.state.error &&

    {this.state.error.message}

    } +
    + ); + } + + return this.props.children; + } +} + +export default ErrorBoundary; diff --git a/assets/scripts/components/ui/Loader.tsx b/assets/scripts/components/ui/Loader.tsx new file mode 100644 index 000000000..a6f965135 --- /dev/null +++ b/assets/scripts/components/ui/Loader.tsx @@ -0,0 +1,70 @@ +import React from 'react'; +import styled, { keyframes } from 'styled-components'; + +const m = keyframes` + 0% { + background-position: calc(0*100%/2) 100%, calc(1*100%/2) 100%, calc(2*100%/2) 100%; + } + 12.5% { + background-position: calc(0*100%/2) 0, calc(1*100%/2) 100%, calc(2*100%/2) 100%; + } + 25% { + background-position: calc(0*100%/2) 0, calc(1*100%/2) 0, calc(2*100%/2) 100%; + } + 37.5% { + background-position: calc(0*100%/2) 0, calc(1*100%/2) 0, calc(2*100%/2) 0; + } + 50% { + background-position: calc(0*100%/2) 0, calc(1*100%/2) 0, calc(2*100%/2) 0; + } + 62.5% { + background-position: calc(0*100%/2) 100%, calc(1*100%/2) 0, calc(2*100%/2) 0; + } + 75% { + background-position: calc(0*100%/2) 100%, calc(1*100%/2) 100%, calc(2*100%/2) 0; + } + 87.5% { + background-position: calc(0*100%/2) 100%, calc(1*100%/2) 100%, calc(2*100%/2) 100%; + } + 100% { + background-position: calc(0*100%/2) 100%, calc(1*100%/2) 100%, calc(2*100%/2) 100%; + } +`; + +const LoaderWrapper = styled.div` + width: 100%; + display: flex; + align-items: center; + justify-content: center; + flex-grow: 1; +`; + +const LoaderContainer = styled.div<{ size: number }>` + color: darkblue; + width: ${({ size }) => size}px; + height: ${({ size }) => size * 0.566}px; /* Garder la proportion */ + --d: radial-gradient(farthest-side, currentColor 90%, #0000); + background: var(--d), var(--d), var(--d); + background-size: ${({ size }) => size * 0.226}px ${({ size }) => size * 0.226}px; + background-repeat: no-repeat; + animation: ${m} 1s infinite; +`; + +interface LoaderProps { + size?: number; + wrap?: boolean; +} + +const Loader: React.FC = ({ size = 53, wrap = true }) => { + const content = ; + + return wrap ? ( + + {content} + + ) : ( + content + ); +}; + +export default Loader; diff --git a/assets/scripts/components/widgets/GpuStatus.tsx b/assets/scripts/components/widgets/GpuStatus.tsx new file mode 100644 index 000000000..a317132a3 --- /dev/null +++ b/assets/scripts/components/widgets/GpuStatus.tsx @@ -0,0 +1,24 @@ +import React from 'react'; +import styled from 'styled-components'; + +const NoticeBody = styled.div` + flex-direction: column; + display: flex; + gap: 0.5rem; +`; + + +const GpuStatus: React.FC = () => { + return ( +
    +
    + +

    Données de zonages d'urbanisme non disponibles.

    +

    Les données de zonages d'urbanisme issus du GPU (Géoportail de l'Urbanisme) ne sont pas disponibles sur ce territoire.

    +
    +
    +
    + ); +}; + +export default GpuStatus; diff --git a/assets/scripts/components/widgets/Guide.tsx b/assets/scripts/components/widgets/Guide.tsx new file mode 100644 index 000000000..78af93757 --- /dev/null +++ b/assets/scripts/components/widgets/Guide.tsx @@ -0,0 +1,85 @@ +import React, { useState } from 'react'; +import styled from 'styled-components'; +import Drawer from '@components/ui/Drawer'; +import InformationIcon from '@images/information.svg'; + +const StyledInformationIcon = styled(InformationIcon)` + max-width: 75px; + height: auto; + fill: #48d5a7; +`; + +const Container = styled.div` + display: flex; + align-items: center; + gap: 1.5rem; + padding: 1rem; + border-radius: 6px; + background: #C8F2E5; + margin-bottom: 2rem; + + img { + width: 75px; + height: auto; + } +`; + +const Title = styled.div` + font-weight: 600; + font-size: 0.9em; + margin-bottom: 0.4rem; +`; + +const Content = styled.div` + font-size: 0.8em; + padding: 0; + margin: 0; + margin-bottom: 1rem; +`; + +const Button = styled.button` + transition: color .3s ease, background .3s ease; + &:hover { + background: #000091 !important; + color: #fff !important; + } +`; + +interface GuideProps { + title: string; + contentHtml: string; + DrawerTitle: string; + DrawerContentHtml: string; +} + +const Guide: React.FC = ({ title, contentHtml, DrawerTitle, DrawerContentHtml }) => { + const [isDrawerOpen, setIsDrawerOpen] = useState(false); + + const toggleDrawer = () => { + setIsDrawerOpen(!isDrawerOpen); + }; + + return ( + <> + + +
    + { title } + + +
    +
    + + + + ); +}; + +export default Guide; diff --git a/assets/scripts/components/widgets/OcsgeStatus.tsx b/assets/scripts/components/widgets/OcsgeStatus.tsx new file mode 100644 index 000000000..96a9648ec --- /dev/null +++ b/assets/scripts/components/widgets/OcsgeStatus.tsx @@ -0,0 +1,39 @@ +import React from 'react'; +import styled from 'styled-components'; + +const NoticeBody = styled.div` + flex-direction: column; + display: flex; + gap: 0.5rem; +`; + +export interface OcsgeStatusProps { + status: "COMPLETE_UNIFORM" | "COMPLETE_NOT_UNIFORM" | "PARTIAL" | "NO_DATA" | "UNDEFINED"; +} + +const defaultMessage = "Les données OCS GE ne sont pas encore disponibles sur ce territoire pour les dates sélectionnées."; +const detailMessage = "Vous n'avez donc pas accès aux informations relatives à l'artificialisation, l'imperméabilisation, l'usage et la couverture."; +const errorMessage = `${defaultMessage} ${detailMessage}`; + +const statusMessages: { [key in OcsgeStatusProps['status']]?: string } = { + COMPLETE_NOT_UNIFORM: `Les données OCS GE sont disponibles sur ce territoire, mais les dates des millésimes ne sont pas uniformes entre toutes les collectivités. ${detailMessage}`, + PARTIAL: `Les données OCS GE ne sont que partiellement disponibles sur ce territoire. ${detailMessage}`, + NO_DATA: errorMessage, + UNDEFINED: errorMessage, +}; + +const OcsgeStatus: React.FC = ({ status }) => { + const message = statusMessages[status] || errorMessage; + return ( +
    +
    + +

    Données OCS GE non disponibles.

    +

    { message }

    +
    +
    +
    + ); +}; + +export default OcsgeStatus; diff --git a/assets/scripts/components/widgets/RouteWrapper.tsx b/assets/scripts/components/widgets/RouteWrapper.tsx new file mode 100644 index 000000000..0671984ba --- /dev/null +++ b/assets/scripts/components/widgets/RouteWrapper.tsx @@ -0,0 +1,47 @@ +import React, { ReactNode } from 'react'; +import styled from 'styled-components'; +import usePageTitle from '@hooks/usePageTitle'; +import OcsgeStatus, { OcsgeStatusProps } from '@components/widgets/OcsgeStatus'; +import GpuStatus from '@components/widgets/GpuStatus'; + +interface RouteWrapperProps { + title: string; + ocsgeStatus?: OcsgeStatusProps["status"]; + hasGpu?: boolean; + children: ReactNode; +} + +const Title = styled.h1` + margin: 1rem 0 0 0; + font-size: 1.8em; +`; + +const RouteWrapper: React.FC = ({ title, ocsgeStatus, hasGpu, children }) => { + const shouldDisplayOcsgeStatus = ocsgeStatus && ocsgeStatus !== "COMPLETE_UNIFORM"; + const shouldDisplayGpuStatus = hasGpu === false; + + usePageTitle(title); + + return ( + <> +
    +
    +
    + {title} + + {/* Affichage conditionnel du statut OCS GE */} + {shouldDisplayOcsgeStatus && } + + {/* Affichage conditionnel du statut GPU */} + {shouldDisplayGpuStatus && } +
    +
    +
    + + {/* Affichage du contenu uniquement si les conditions d'OCS GE et GPU sont remplies */} + {!shouldDisplayOcsgeStatus && !shouldDisplayGpuStatus && children} + + ); +}; + +export default RouteWrapper; diff --git a/assets/scripts/components/widgets/SearchBar.tsx b/assets/scripts/components/widgets/SearchBar.tsx new file mode 100644 index 000000000..cf02bab99 --- /dev/null +++ b/assets/scripts/components/widgets/SearchBar.tsx @@ -0,0 +1,251 @@ +import React, { useEffect, ChangeEvent, useState } from 'react'; +import styled from 'styled-components'; +import { useSearchTerritoryQuery } from '@services/api'; +import useDebounce from '@hooks/useDebounce'; +import getCsrfToken from '@utils/csrf'; +import Loader from '@components/ui/Loader'; + +interface SearchBarProps { + createUrl: string; +} + +export interface Territory { + id: number; + name: string; + source_id: string; + public_key: string; + area: number; + land_type_label: string; +} + +const primaryColor = '#313178'; +const activeColor = '#4318FF'; +const secondaryColor = '#a1a1f8'; + +const SearchContainer = styled.div` + display: flex; + align-items: center; + width: 100%; + border: 1px solid #d5d9de; + border-radius: 6px; + padding: 0.5rem; + background: #fff; + position: relative; + z-index: 1001; +`; + +const Icon = styled.i` + color: ${primaryColor}; + margin: 0 0.5rem; +`; + +const Input = styled.input` + flex-grow: 1; + border: none; + font-size: 0.9em; + color: ${primaryColor}; + + &:focus { + outline: none; + } +`; + +const ResultsContainer = styled.div` + position: absolute; + top: 120%; + left: 0; + right: 0; + background: white; + border: 1px solid #d5d9de; + border-radius: 6px; + max-height: 30vh; + overflow-y: auto; + z-index: 1002; +`; + +const Overlay = styled.div<{ $visible: boolean }>` + display: ${({ $visible }) => ($visible ? 'block' : 'none')}; + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + background: rgba(0, 0, 0, 0.2); + z-index: 1000; +`; + +const ResultItem = styled.div<{ $disabled: boolean }>` + padding: 0.5rem; + font-size: 0.9em; + cursor: ${({ $disabled }) => ($disabled ? 'not-allowed' : 'pointer')}; + transition: background 0.3s ease, color 0.3s ease; + color: ${primaryColor}; + + &:not(:last-child) { + border-bottom: 1px solid #EBEBEC; + } + + &:hover { + background: #f4f7fe; + color: ${activeColor}; + } +`; + +const TerritoryTitle = styled.div` + display: flex; + align-otems: center; + justify-content: space-between; + font-weight: 500; +`; + +const TerritoryDetails = styled.div` + font-size: 0.8em; + color: ${secondaryColor}; + display: flex; + justify-content: space-between; + width: 100%; +`; + +const Badge = styled.p` + font-size: 0.8em; + font-weight: 400; + background: #e3e3fd; + color: ${primaryColor}; + text-transform: none; +`; + + +const NoResultsMessage = styled.div` + padding: 0.5rem; + font-size: 0.9em; + color: ${secondaryColor}; + text-align: center; +`; + +const HighlightedText = styled.span` + font-weight: bold; + color: ${activeColor}; +`; + +const SearchBar: React.FC = ({ createUrl }) => { + const [query, setQuery] = useState(''); + const [isFocused, setIsFocused] = useState(false); + const [data, setData] = useState(undefined); + const [isSubmitting, setIsSubmitting] = useState(false); + const debouncedQuery = useDebounce(query, 500); + const minimumCharCountForSearch = 2; + const shouldQueryBeSkipped = debouncedQuery.length < minimumCharCountForSearch; + const { data: queryData, isFetching } = useSearchTerritoryQuery(debouncedQuery, { + skip: shouldQueryBeSkipped, + }); + + useEffect(() => { + if (shouldQueryBeSkipped || isFetching) { + setData(undefined); + } else { + setData(queryData); + } + }, [isFetching, queryData, debouncedQuery, shouldQueryBeSkipped]); + + const handleInputChange = (event: ChangeEvent) => { + const newQuery = event.target.value; + setQuery(newQuery); + }; + + const handleBlur = () => { + setTimeout(() => { + setQuery(''); + setIsFocused(false); + setData(undefined); + }, 150); + }; + + // Solution temporaire + const createDiagnostic = (publicKey: string, disabled: boolean) => { + if (isSubmitting || disabled) return; + + setIsSubmitting(true); + + const form = document.createElement('form'); + form.action = createUrl; + form.method = 'POST'; + + // CSRF Token + const csrfToken = document.createElement('input'); + csrfToken.type = 'hidden'; + csrfToken.name = 'csrfmiddlewaretoken'; + csrfToken.value = getCsrfToken(); + form.appendChild(csrfToken); + + // Public Key + const selection = document.createElement('input'); + selection.type = 'hidden'; + selection.name = 'selection'; + selection.value = publicKey; + form.appendChild(selection); + + // Keyword + const keywordInput = document.createElement('input'); + keywordInput.type = 'hidden'; + keywordInput.name = 'keyword'; + keywordInput.value = query; + form.appendChild(keywordInput); + + document.body.appendChild(form); + form.submit(); + }; + + return ( + <> + + + + setIsFocused(true)} + onBlur={handleBlur} + placeholder="Rechercher un territoire (Commune, EPCI, Département, Région...)" + aria-label="Rechercher un territoire" + /> + {isFetching && } + {data && ( + + {data.length > 0 ? ( + data.map((territory: Territory) => { + const isDisabled = territory.area === 0; + return ( + createDiagnostic(territory.public_key, isDisabled)} + > +
    + +
    {territory.name}
    + {territory.land_type_label} +
    + +
    Code INSEE: {territory.source_id}
    + {isDisabled && +
    Données indisponibles: Territoire supprimé en 2024
    + } +
    +
    +
    + ); + }) + ) : ( + + Aucun résultat trouvé pour votre recherche. + + )} +
    + )} +
    + + ); +}; + +export default SearchBar; diff --git a/assets/scripts/filter-diagnostic-list.js b/assets/scripts/filter-diagnostic-list.js deleted file mode 100644 index a3259e0e0..000000000 --- a/assets/scripts/filter-diagnostic-list.js +++ /dev/null @@ -1,39 +0,0 @@ -const filterDiagnosticListInput = document.getElementById('filter-diagnostic-list-input') - -if (filterDiagnosticListInput) -{ - filterDiagnosticListInput.onkeyup = () => - { - const keyword = filterDiagnosticListInput.value.toLowerCase() - let elements = document.querySelectorAll('.diagnostic-list-item') - elements = Array.from(elements) - - elements.forEach((element) => - { - const name = element.querySelector('.diagnostic-list-item-key').dataset.key.toLowerCase() - if (name.indexOf(keyword) !== -1) - { - element.removeAttribute('hidden') - element.style.visibility = 'visible' - } - else - { - element.setAttribute('hidden', true) - element.style.visibility = 'hidden' - } - }) - - // Get hidden elements count - const emptyMessage = document.getElementById('diagnostic-list-empty-message') - if (elements.length === elements.filter((obj) => obj.hidden).length) - { - emptyMessage.removeAttribute('hidden') - emptyMessage.style.visibility = 'visible' - } - else - { - emptyMessage.setAttribute('hidden', true) - emptyMessage.style.visibility = 'hidden' - } - } -} diff --git a/assets/scripts/fr-callout-read-more.js b/assets/scripts/fr-callout-read-more.js deleted file mode 100644 index c6e3f5245..000000000 --- a/assets/scripts/fr-callout-read-more.js +++ /dev/null @@ -1,18 +0,0 @@ -const buttons = document.querySelectorAll('.fr-callout-read-more__btn') - -buttons.forEach((button) => -{ - button.addEventListener('click', () => - { - const excerpt = button.parentNode.querySelector('.fr-callout-read-more__excerpt') - const text = button.parentNode.querySelector('.fr-callout-read-more__text') - - const expanded = button.getAttribute('aria-expanded') === 'true' - - button.parentNode.classList.toggle('fr-callout-read-more--expanded') - button.setAttribute('aria-expanded', !expanded) - excerpt.hidden = !expanded - text.hidden = expanded - button.firstChild.data = expanded ? 'Lire plus' : 'Lire moins' - }) -}) diff --git a/assets/scripts/highcharts-custom-buttons.js b/assets/scripts/highcharts-custom-buttons.js deleted file mode 100644 index 4bf4d6c70..000000000 --- a/assets/scripts/highcharts-custom-buttons.js +++ /dev/null @@ -1,35 +0,0 @@ -window.htmx = require('htmx.org') - -window.htmx.onLoad(() => -{ - // Trigger full screen chart - document.querySelectorAll('.fullscreen-chart').forEach((button) => - { - button.onclick = () => - { - const target = button.dataset.chartTarget - const chartDom = document.getElementById(target) - const chart = Highcharts.charts[Highcharts.attr(chartDom, 'data-highcharts-chart')] - - chart.fullscreen.toggle() - } - }) - - // Export chart - document.querySelectorAll('.export-chart').forEach((button) => - { - button.onclick = (e) => - { - const target = button.dataset.chartTarget - const chartDom = document.getElementById(target) - const chart = Highcharts.charts[Highcharts.attr(chartDom, 'data-highcharts-chart')] - - e.preventDefault() - - chart.exportChart({ - type: button.dataset.type, - scale: 3, - }) - } - }) -}) diff --git a/assets/scripts/hooks/useDebounce.ts b/assets/scripts/hooks/useDebounce.ts new file mode 100644 index 000000000..f68402c58 --- /dev/null +++ b/assets/scripts/hooks/useDebounce.ts @@ -0,0 +1,19 @@ +import { useState, useEffect } from 'react'; + +function useDebounce(value: string, delay: number): string { + const [debouncedValue, setDebouncedValue] = useState(value); + + useEffect(() => { + const handler = setTimeout(() => { + setDebouncedValue(value); + }, delay); + + return () => { + clearTimeout(handler); + }; + }, [value, delay]); + + return debouncedValue; +} + +export default useDebounce; diff --git a/assets/scripts/hooks/useHighcharts.ts b/assets/scripts/hooks/useHighcharts.ts new file mode 100644 index 000000000..f2119e47f --- /dev/null +++ b/assets/scripts/hooks/useHighcharts.ts @@ -0,0 +1,72 @@ +import { useEffect } from 'react'; +import Highcharts from 'highcharts'; +import highchartsExporting from 'highcharts/modules/exporting'; +import exportDataModule from 'highcharts/modules/export-data'; +import highchartsAccessibility from 'highcharts/modules/accessibility'; +import DependencyWheel from 'highcharts/modules/dependency-wheel'; +import Sankey from 'highcharts/modules/sankey'; + +highchartsExporting(Highcharts); +exportDataModule(Highcharts); +highchartsAccessibility(Highcharts); +Sankey(Highcharts); +DependencyWheel(Highcharts); + +const useHighcharts = (chartIds: string[], loading: boolean) => { + useEffect(() => { + if (!loading) { + Highcharts.setOptions({ + exporting: { + url: document.querySelector('meta[name="highcharts-server-url"]')?.getAttribute('content') + } + }); + + chartIds.forEach((chartId) => { + const chartDataElement = document.getElementById(`${chartId}_data`); + if (chartDataElement) { + const chartOptions = JSON.parse(chartDataElement.textContent || '{}'); + const chart = Highcharts.chart(chartId, chartOptions); + + const fullscreenButton = document.querySelector( + `[data-chart-fullscreen="${chartId}"]` + ); + + const exportPngButton = document.querySelector( + `[data-chart-exportpng="${chartId}"]` + ); + + const exportCsvButton = document.querySelector( + `[data-chart-exportcsv="${chartId}"]` + ); + + if (fullscreenButton) { + fullscreenButton.onclick = (e) => { + e.preventDefault(); + chart.fullscreen.toggle(); + }; + } + + if (exportPngButton) { + exportPngButton.onclick = (e) => { + e.preventDefault(); + chart.exportChart({ + type: 'image/png', + scale: 3, + }, {}); + }; + } + + if (exportCsvButton) { + exportCsvButton.onclick = (e) => { + e.preventDefault(); + chart.downloadCSV() + }; + } + + } + }); + } + }, [chartIds, loading]); +}; + +export default useHighcharts; diff --git a/assets/scripts/hooks/useHtmlLoader.ts b/assets/scripts/hooks/useHtmlLoader.ts new file mode 100644 index 000000000..5e7344656 --- /dev/null +++ b/assets/scripts/hooks/useHtmlLoader.ts @@ -0,0 +1,34 @@ +import { useEffect, useState } from 'react'; + +export const useHtmlLoader = (endpoint: string) => { + const [content, setContent] = useState(''); + const [isLoading, setIsLoading] = useState(true); + const [error, setError] = useState(null); + + useEffect(() => { + const loadContent = async () => { + setIsLoading(true); + setError(null); + try { + const response = await fetch(endpoint, { + headers: { + 'X-Requested-With': 'XMLHttpRequest', + }, + }); + if (!response.ok) { + throw new Error(`Failed to load content from ${endpoint}`); + } + const data = await response.text(); + setContent(data); + } catch (err) { + setError(err.message); + } finally { + setIsLoading(false); + } + }; + + loadContent(); + }, [endpoint]); + + return { content, isLoading, error }; +}; diff --git a/assets/scripts/hooks/useHtmx.ts b/assets/scripts/hooks/useHtmx.ts new file mode 100644 index 000000000..8af5747de --- /dev/null +++ b/assets/scripts/hooks/useHtmx.ts @@ -0,0 +1,41 @@ +import { useEffect, useRef } from 'react'; +import htmx from 'htmx.org'; + +const useHtmx = (dependencies: React.DependencyList = []) => { + const ref = useRef(null); + + useEffect(() => { + // Configurer HTMX et définir l'extension disable-element + htmx.config.includeIndicatorStyles = false; + + // Désactive temporairement le bouton sur lequel l'utilisateur vient de cliquer pendant les requêtes HTMX + htmx.defineExtension('disable-element', { + onEvent(name, evt) { + if (name === 'htmx:beforeRequest' || name === 'htmx:afterRequest') { + const { elt } = evt.detail; + const target = elt.getAttribute('hx-disable-element'); + const targetElement = (target === 'self') ? elt : document.querySelector(target); + + if (name === 'htmx:beforeRequest' && targetElement) { + targetElement.disabled = true; + } else if (name === 'htmx:afterRequest' && targetElement) { + targetElement.disabled = false; + } + } + }, + }); + + if (ref.current) { + htmx.process(ref.current); + } + + // Nettoyer l'extension et la configuration à la désinstallation du composant + return () => { + delete window.htmx; // Supprimer HTMX si nécessaire + }; + }, dependencies); + + return ref; +}; + +export default useHtmx; diff --git a/assets/scripts/hooks/useMatomoTracking.ts b/assets/scripts/hooks/useMatomoTracking.ts new file mode 100644 index 000000000..1475df17e --- /dev/null +++ b/assets/scripts/hooks/useMatomoTracking.ts @@ -0,0 +1,16 @@ +import { useEffect } from 'react'; +import { useLocation } from 'react-router-dom'; + +const useMatomoTracking = (): void => { + const location = useLocation(); + + useEffect(() => { + if (typeof _paq !== 'undefined') { + _paq.push(['setCustomUrl', window.location.href]); + _paq.push(['setDocumentTitle', document.title]); + _paq.push(['trackPageView']); + } + }, [location]); +}; + +export default useMatomoTracking; diff --git a/assets/scripts/hooks/usePageTitle.ts b/assets/scripts/hooks/usePageTitle.ts new file mode 100644 index 000000000..816d7b17e --- /dev/null +++ b/assets/scripts/hooks/usePageTitle.ts @@ -0,0 +1,13 @@ +import { useEffect } from 'react'; + +/** + * Hook pour mettre à jour le titre de la page. + * @param title - Le titre de la page. + */ +const usePageTitle = (title: string) => { + useEffect(() => { + document.title = `${title} | Mon Diagnostic Artificialisation`; + }, [title]); +}; + +export default usePageTitle; diff --git a/assets/scripts/hooks/useUrls.ts b/assets/scripts/hooks/useUrls.ts new file mode 100644 index 000000000..76bb8d273 --- /dev/null +++ b/assets/scripts/hooks/useUrls.ts @@ -0,0 +1,28 @@ +import { useEffect, useState } from 'react'; + +interface UrlsData { + [key: string]: string; +} + +const useUrls = (): UrlsData | null => { + const [urls, setUrls] = useState(null); + + useEffect(() => { + const urlsElement = document.getElementById('urls-data'); + if (urlsElement) { + const data = JSON.parse(urlsElement.textContent || '{}'); + + // Gérer les accents dans les urls + const decodedUrls: UrlsData = Object.keys(data.urls).reduce((acc, key) => { + acc[key] = decodeURIComponent(data.urls[key]); + return acc; + }, {} as UrlsData); + + setUrls(decodedUrls); + } + }, []); + + return urls; +}; + +export default useUrls; diff --git a/assets/scripts/index.js b/assets/scripts/index.js index a67e6aff3..3fefede6a 100644 --- a/assets/scripts/index.js +++ b/assets/scripts/index.js @@ -1,49 +1,11 @@ -/** ******************* - * TODO: WEBPACK Code splitting - ******************* */ - // Import styles import '../styles/index.css' // Import dsfr import '@gouvfr/dsfr/dist/dsfr.module.min.js' -// Import fr-callout-read-more -import './fr-callout-read-more.js' - -// Import highcharts custom buttons -import './highcharts-custom-buttons.js' - -// Import filter diagnostic list -import './filter-diagnostic-list.js' - // Import map import './map_libre/index.js' -import './react-roots.js' - -// Import HTMX and inject it into the window scope -window.htmx = require('htmx.org') -// Fix CSP inline style -window.htmx.config.includeIndicatorStyles = false -// Disable Submit Button -window.htmx.defineExtension('disable-element', { - onEvent(name, evt) - { - if (name === 'htmx:beforeRequest' || name === 'htmx:afterRequest') - { - const { elt } = evt.detail - const target = elt.getAttribute('hx-disable-element') - const targetElement = (target === 'self') ? elt : document.querySelector(target) - - if (name === 'htmx:beforeRequest' && targetElement) - { - targetElement.disabled = true - } - else if (name === 'htmx:afterRequest' && targetElement) - { - targetElement.disabled = false - } - } - }, -}) +// React +import './react-roots.tsx' diff --git a/assets/scripts/map_libre/events.js b/assets/scripts/map_libre/events.js index 093842183..363850d79 100644 --- a/assets/scripts/map_libre/events.js +++ b/assets/scripts/map_libre/events.js @@ -1,3 +1,4 @@ +import htmx from 'htmx.org' import { formatData } from './utils.js' export default class Events diff --git a/assets/scripts/react-roots.js b/assets/scripts/react-roots.js deleted file mode 100644 index 0105cc3f9..000000000 --- a/assets/scripts/react-roots.js +++ /dev/null @@ -1,15 +0,0 @@ -import React from 'react' -import { createRoot } from 'react-dom/client' -import { Provider } from 'react-redux' -import HighchartsMapOcsge from './components/HighchartsMapOcsge.tsx' -import store from './store/store.js' - -const highchartsMapOcsge = document.getElementById('react-highcharts-ocsge') -if (highchartsMapOcsge) -{ - createRoot(highchartsMapOcsge).render( - - - , - ) -} diff --git a/assets/scripts/react-roots.tsx b/assets/scripts/react-roots.tsx new file mode 100644 index 000000000..2708e8613 --- /dev/null +++ b/assets/scripts/react-roots.tsx @@ -0,0 +1,43 @@ +import React from 'react'; +import { createRoot } from 'react-dom/client'; +import { Provider } from 'react-redux'; +import store from '@store/store'; +import ErrorBoundary from '@components/ui/ErrorBoundary'; +import Dashboard from '@components/layout/Dashboard'; +import HighchartsMapOcsge from '@components/charts/HighchartsMapOcsge' +import SearchBar from '@components/widgets/SearchBar' + +const searchBar = document.getElementById('react-search-bar') +if (searchBar) +{ + const createUrl = searchBar.dataset.createUrl; + createRoot(searchBar).render( + + + , + ) +} + + +const highchartsMapOcsge = document.getElementById('react-highcharts-ocsge') +if (highchartsMapOcsge) +{ + createRoot(highchartsMapOcsge).render( + + + , + ) +} + +const dashboard = document.getElementById('react-root'); +if (dashboard) { + const projectId = dashboard.dataset.projectId; + + createRoot(dashboard).render( + + + + + , + ); +} diff --git a/assets/scripts/services/api.js b/assets/scripts/services/api.js deleted file mode 100644 index 1d0ef0a8f..000000000 --- a/assets/scripts/services/api.js +++ /dev/null @@ -1,15 +0,0 @@ -import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react' - -export const djangoApi = createApi({ - reducerPath: 'djangoApi', - baseQuery: fetchBaseQuery({ credentials: 'include' }), - endpoints: (builder) => ({ - getDepartementList: builder.query({ - query: () => '/public/departements/', - }), - }), -}) - -export const { - useGetDepartementListQuery, -} = djangoApi diff --git a/assets/scripts/services/api.ts b/assets/scripts/services/api.ts new file mode 100644 index 000000000..dc70c07c1 --- /dev/null +++ b/assets/scripts/services/api.ts @@ -0,0 +1,33 @@ +import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react' +import getCsrfToken from '@utils/csrf' + +export const djangoApi = createApi({ + reducerPath: 'djangoApi', + baseQuery: fetchBaseQuery({ credentials: 'include' }), + endpoints: (builder) => ({ + getDepartementList: builder.query({ + query: () => '/public/departements/', + }), + getProject: builder.query({ + query: (id) => `/project/${id}/detail`, + }), + searchTerritory: builder.query({ + query: (needle) => + { + const csrfToken = getCsrfToken() + return { + url: '/public/search-land', + method: 'POST', + body: { needle }, + headers: csrfToken ? { 'X-CSRFToken': csrfToken } : {}, + } + }, + }), + }), +}) + +export const { + useGetDepartementListQuery, + useGetProjectQuery, + useSearchTerritoryQuery, +} = djangoApi diff --git a/assets/scripts/store/projectSlice.ts b/assets/scripts/store/projectSlice.ts new file mode 100644 index 000000000..52e99a0ef --- /dev/null +++ b/assets/scripts/store/projectSlice.ts @@ -0,0 +1,21 @@ +import { createSlice } from '@reduxjs/toolkit' + +const projectSlice = createSlice({ + name: 'project', + initialState: { + projectData: null, + }, + reducers: { + setProjectData: (state, action) => + { + state.projectData = action.payload + }, + clearProjectData: (state) => + { + state.projectData = null + }, + }, +}) + +export const { setProjectData, clearProjectData } = projectSlice.actions +export default projectSlice.reducer diff --git a/assets/scripts/store/store.js b/assets/scripts/store/store.js deleted file mode 100644 index f31299176..000000000 --- a/assets/scripts/store/store.js +++ /dev/null @@ -1,15 +0,0 @@ -import { configureStore } from '@reduxjs/toolkit' -import { setupListeners } from '@reduxjs/toolkit/query' -import { djangoApi } from '../services/api.js' - -const store = configureStore({ - reducer: { - [djangoApi.reducerPath]: djangoApi.reducer, - }, - middleware: (getDefaultMiddleware) => getDefaultMiddleware() - .concat(djangoApi.middleware), -}) - -setupListeners(store.dispatch) - -export default store diff --git a/assets/scripts/store/store.ts b/assets/scripts/store/store.ts new file mode 100644 index 000000000..4d7397704 --- /dev/null +++ b/assets/scripts/store/store.ts @@ -0,0 +1,20 @@ +import { configureStore } from '@reduxjs/toolkit'; +import { setupListeners } from '@reduxjs/toolkit/query'; +import { djangoApi } from '@services/api'; +import projectReducer from '@store/projectSlice'; + +const store = configureStore({ + reducer: { + [djangoApi.reducerPath]: djangoApi.reducer, + project: projectReducer, + }, + middleware: (getDefaultMiddleware) => + getDefaultMiddleware().concat(djangoApi.middleware), +}); + +setupListeners(store.dispatch); + +export type RootState = ReturnType; +export type AppDispatch = typeof store.dispatch; + +export default store; diff --git a/assets/scripts/utils/csrf.ts b/assets/scripts/utils/csrf.ts new file mode 100644 index 000000000..e52c95a03 --- /dev/null +++ b/assets/scripts/utils/csrf.ts @@ -0,0 +1,14 @@ +const getCsrfToken = (): string | null => { + const name = 'csrftoken'; + const cookies = document.cookie.split(';'); + for (const cookie of cookies) { + const trimmedCookie = cookie.trim(); + + if (trimmedCookie.startsWith(name + '=')) { + return decodeURIComponent(trimmedCookie.substring(name.length + 1)); + } + } + return null; +}; + +export default getCsrfToken; diff --git a/assets/scripts/utils/formatUtils.ts b/assets/scripts/utils/formatUtils.ts new file mode 100644 index 000000000..2031a90f8 --- /dev/null +++ b/assets/scripts/utils/formatUtils.ts @@ -0,0 +1,28 @@ +const formatNumber = (number: number, decimals: number = 0, useGrouping: boolean = true): string => { + return number.toLocaleString('fr-FR', { + minimumFractionDigits: decimals, + maximumFractionDigits: decimals, + useGrouping, + }); +} + +const formatDateTime = (date: Date, options: Intl.DateTimeFormatOptions = {}): string => { + if (!(date instanceof Date) || Number.isNaN(date.getTime()) || !Number.isFinite(date.getTime())) { + return 'Date invalide'; + } + + const defaultOptions: Intl.DateTimeFormatOptions = { + year: 'numeric', + month: 'long', + day: 'numeric', + hour: '2-digit', + minute: '2-digit', + second: undefined, + }; + + const finalOptions = { ...defaultOptions, ...options }; + + return new Intl.DateTimeFormat('fr-FR', finalOptions).format(date); +} + +export { formatNumber, formatDateTime }; diff --git a/assets/styles/index.css b/assets/styles/index.css index 5fa7799df..eeebb12a7 100644 --- a/assets/styles/index.css +++ b/assets/styles/index.css @@ -13,6 +13,14 @@ Header logo height: 54px; } +/* +Header search +*/ +.search-bar-no-home { + flex-grow: 1; + max-width: 550px; +} + /* Custom tag icon */ diff --git a/assets/types/declaration.d.ts b/assets/types/declaration.d.ts index 6ffe06621..08dbbfc7b 100644 --- a/assets/types/declaration.d.ts +++ b/assets/types/declaration.d.ts @@ -7,3 +7,20 @@ declare module '*.geojson' { const value: any; export default value; } + +declare var _paq: any; + +declare module '*.png' { + const value: string; + export default value; +} + +declare module '*.jpg' { + const value: string; + export default value; +} + +declare module '*.jpeg' { + const value: string; + export default value; +} diff --git a/assets/types/global.d.ts b/assets/types/global.d.ts new file mode 100644 index 000000000..76276a3cf --- /dev/null +++ b/assets/types/global.d.ts @@ -0,0 +1,4 @@ +interface Window { + htmx?: any; + bootstrap?: any; +} diff --git a/assets/types/svg.d.ts b/assets/types/svg.d.ts new file mode 100644 index 000000000..406ae8ed3 --- /dev/null +++ b/assets/types/svg.d.ts @@ -0,0 +1,6 @@ +declare module '*.svg' { + import * as React from 'react'; + + const ReactComponent: React.FunctionComponent & { title?: string }>; + export default ReactComponent; +} diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 000000000..aa379f20e --- /dev/null +++ b/babel.config.js @@ -0,0 +1,26 @@ +module.exports = { + presets: [ + [ + "@babel/preset-env", + { + "modules": false, + "targets": { + "browsers": [ + "last 2 Chrome versions", + "last 2 Firefox versions", + "last 2 Safari versions", + "last 2 iOS versions", + "last 1 Android version", + "last 1 ChromeAndroid version", + "ie 11" + ] + } + } + ], + "@babel/preset-react", + "@babel/preset-typescript" + ], + plugins: [ + ...(process.env.NODE_ENV === 'development' ? ["react-refresh/babel"] : []) + ] +}; diff --git a/config/middlewares.py b/config/middlewares.py index aaaeafc12..76e6a0fcc 100644 --- a/config/middlewares.py +++ b/config/middlewares.py @@ -56,3 +56,13 @@ def process_response(self, request, response): content = response.content.decode("utf-8") response.content = content.replace("[NONCE_PLACEHOLDER]", request.csp_nonce).encode("utf-8") return response + + +class HtmxMiddleware: + def __init__(self, get_response): + self.get_response = get_response + + def __call__(self, request): + request.htmx = "HX-Request" in request.headers + response = self.get_response(request) + return response diff --git a/config/settings.py b/config/settings.py index 33545fdee..ffbb2aa33 100644 --- a/config/settings.py +++ b/config/settings.py @@ -22,7 +22,7 @@ from sentry_sdk.integrations.django import DjangoIntegration from sentry_sdk.integrations.redis import RedisIntegration -OFFICIAL_VERSION = "8.0" +OFFICIAL_VERSION = "8.2.0" root = environ.Path(__file__) - 2 # get root of the project @@ -107,6 +107,7 @@ MIDDLEWARE = [ "django.middleware.gzip.GZipMiddleware", + "config.middlewares.HtmxMiddleware", "config.middlewares.LogIncomingRequest", "config.middlewares.MaintenanceModeMiddleware", "django.middleware.security.SecurityMiddleware", @@ -173,6 +174,9 @@ { "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator", }, + { + "NAME": "utils.validators.ContainsSpecialCharacterValidator", + }, ] @@ -360,7 +364,7 @@ # bypass check of internal IPs def show_toolbar(request): - return True + return False DEBUG_TOOLBAR_CONFIG = { "SHOW_TOOLBAR_CALLBACK": show_toolbar, @@ -474,7 +478,6 @@ def show_toolbar(request): # MATOMO -MATOMO_TOKEN = env.str("MATOMO_TOKEN", default="") MATOMO_ACTIVATE = env.bool("MATOMO_ACTIVATE", default=False) # GOOGLE TAG ADWORDS @@ -530,6 +533,7 @@ def show_toolbar(request): # Crisp "https://game.crisp.chat", "https://plugins.crisp.chat/", + "https://www.googletagmanager.com/", ) CSP_MEDIA_SRC = ( # Crisp @@ -548,6 +552,7 @@ def show_toolbar(request): "beta.gouv.fr", "sparte-metabase.osc-secnum-fr1.scalingo.io", "google.com", + "https://www.google.com/", "data.geopf.fr", "https://raw.githack.com", "https://openmaptiles.geo.data.gouv.fr", @@ -560,6 +565,8 @@ def show_toolbar(request): "wss://client.relay.crisp.chat", "wss://stream.relay.crisp.chat", "https://gist.githubusercontent.com", + "https://highcharts-export.osc-fr1.scalingo.io/", + "ws://localhost:3000/ws", ] CSP_FRAME_ANCESTORS = ("'self'", "https://sparte-metabase.osc-secnum-fr1.scalingo.io") diff --git a/crisp/migrations/0002_update_faq_url.py b/crisp/migrations/0002_update_faq_url.py new file mode 100644 index 000000000..14017597b --- /dev/null +++ b/crisp/migrations/0002_update_faq_url.py @@ -0,0 +1,20 @@ +# Generated by Django 4.2.16 on 2024-10-28 11:40 + +from django.db import migrations + + +def update_faq_url(apps, schema_editor): + Parameter = apps.get_model("django_app_parameter", "parameter") + + Parameter.objects.filter(slug="FAQ_URL").update(value="https://faq.mondiagartif.beta.gouv.fr/fr/") + + +class Migration(migrations.Migration): + dependencies = [ + ("crisp", "0001_initial"), + ("django_app_parameter", "0003_alter_parameter_value_type"), + ] + + operations = [ + migrations.RunPython(update_faq_url), + ] diff --git a/crisp/models.py b/crisp/models.py index 95c107d50..2051d6b4f 100644 --- a/crisp/models.py +++ b/crisp/models.py @@ -1,3 +1,5 @@ +from typing import Literal + from django.db import models from .signals import on_notification_save @@ -8,13 +10,28 @@ class CrispWebhookNotification(models.Model): timestamp = models.DateTimeField() data = models.JSONField() + @property + def from_value(self) -> Literal["user", "operator"] | None: + return self.data.get("from") + + @property + def sender(self): + if self.from_value and self.from_value == "user": + return self.data.get("user") + + return {} + + @property + def sender_name(self): + return self.sender.get("nickname") + @property def origin(self): return self.data.get("origin", "crisp") @property def message(self): - return self.data.get("content") + return self.data.get("content").replace("\r", "").replace("\\n", "\n") @property def inbox_url(self): diff --git a/crisp/signals.py b/crisp/signals.py index ee2ae4bdc..8276e656a 100644 --- a/crisp/signals.py +++ b/crisp/signals.py @@ -1,23 +1,27 @@ -from textwrap import dedent - from utils.mattermost import Crisp -def on_notification_save(sender, instance, created, *args, **kwargs): - if created: - message_with_link = f"[{instance.message}]({instance.inbox_url})" +def format_message(instance): + return f"""Date : {instance.timestamp} +Lien Crisp : {instance.inbox_url} +Nom : {instance.sender_name} +Message : {instance.message}""" + - message = dedent( - f""" - Nouveau message reçu sur Crisp. - Evénement : {instance.event} - Origine : {instance.origin} - Date : {instance.timestamp} - Message : {message_with_link} - """ - ) +def on_notification_save( + sender, + instance, + created, + *args, + **kwargs, +): + message_is_sent = instance.event == "message:send" + message_is_from_user = instance.from_value == "user" + message_is_text = instance.data.get("type") == "text" + message_is_sent_by_user = message_is_sent and message_is_from_user - notification = Crisp(msg=message) + if created and message_is_sent_by_user and message_is_text: + notification = Crisp(msg=format_message(instance)) notification.send() return instance diff --git a/crisp/tests.py b/crisp/tests.py new file mode 100644 index 000000000..3bd1bca5e --- /dev/null +++ b/crisp/tests.py @@ -0,0 +1,51 @@ +from django.test import TestCase + +from .models import CrispWebhookNotification +from .signals import format_message + + +class TestCrispNotification(TestCase): + def setUp(self) -> None: + self.maxDiff = None + self.notification = CrispWebhookNotification( + event="message:send", + timestamp="2021-08-03T14:00:00Z", + data={ + "from": "user", + "type": "text", + "user": {"user_id": "session_306c0770-46f3-4c66-8931-35cb324a0b72", "nickname": "Marie-José"}, + "origin": "urn:crisp.im:contact-form:0", + "content": "**Rapport Varennes-Jarcy**\n\nBonjour,\r\ndemande effectuée à plusieurs reprises mais aucune réception,\r\nbien cordialement,", # noqa : E501 + "stamped": True, + "mentions": [], + "timestamp": 1715864068597, + "session_id": "session_306c0770-46f3-4c66-8931-35cb324a0b72", + "website_id": "0ac14c43-849c-4fc4-8e09-923b78e9a0de", + "fingerprint": 171586406859730, + }, + ) + + def test_sender_name(self): + self.assertEqual(self.notification.sender_name, "Marie-José") + + def test_message(self): + self.assertEqual( + self.notification.message, + """**Rapport Varennes-Jarcy** + +Bonjour, +demande effectuée à plusieurs reprises mais aucune réception, +bien cordialement,""", + ) + + def test_format_message(self): + output = format_message(self.notification) + expected_output = """Date : 2021-08-03T14:00:00Z +Lien Crisp : https://app.crisp.chat/website/0ac14c43-849c-4fc4-8e09-923b78e9a0de/inbox/session_306c0770-46f3-4c66-8931-35cb324a0b72/ +Nom : Marie-José +Message : **Rapport Varennes-Jarcy** + +Bonjour, +demande effectuée à plusieurs reprises mais aucune réception, +bien cordialement,""" # noqa : E501 + self.assertEqual(output, expected_output) diff --git a/diagnostic_word/renderers.py b/diagnostic_word/renderers.py index 050d65ae4..2d54b5fab 100644 --- a/diagnostic_word/renderers.py +++ b/diagnostic_word/renderers.py @@ -208,13 +208,11 @@ def get_context_data(self) -> Dict[str, Any]: # Comparison territories if has_neighbors: - voisins = diagnostic.get_look_a_like() # Charts comparison_chart = charts.AnnualConsoComparisonChartExport(diagnostic) comparison_surface_chart = charts.SurfaceChartExport(diagnostic) comparison_relative_chart = charts.AnnualConsoProportionalComparisonChartExport(diagnostic) context |= { - "voisins": voisins, # Charts "comparison_chart": self.prep_image(comparison_chart.get_temp_image(), width=170), "comparison_surface_chart": self.prep_image(comparison_surface_chart.get_temp_image(), width=170), diff --git a/documentation/templates/documentation/tutoriel.html b/documentation/templates/documentation/tutoriel.html index 2507c41df..8e741905c 100644 --- a/documentation/templates/documentation/tutoriel.html +++ b/documentation/templates/documentation/tutoriel.html @@ -25,72 +25,69 @@ -->
    -
    -
    -
    -

    Tutoriel

    -
    -
    - -
    -
    -

    ✍️ Comment créer mon diagnostic ?

    -
    - Catpure d'écran de la page d'acceuil -
    -

    - Nous avons pensé Mon Diagnostic Artificialisation pour que la création de votre diagnostic soit la plus simple et la plus rapide possible. Vous trouverez ci-dessous un aperçu de la procédure. -

    -

    1 - Rendez-vous sur la plateforme Mon Diagnostic Artificialisation

    -

    Il existe deux façons de créer un diagnostic :

    -
      -
    • Soit directement en tapant le nom d’une collectivité dans la barre de recherche
    • -
    • Soit par le menu en haut à droite “créer un diagnostic” - là vous avez un filtre par type de collectivité
    • -
    -
    - Catpure d'écran de le recherche d'un territoire -
    -

    2 - Choisissez la collectivité qui vous intéresse en cliquant dessus

    -
    - Catpure d'écran de la sélection de territoire -
    -

    3 - Vous êtes maintenant dans la page d’accueil de votre diagnostic

    -

    Le menu sous votre collectivité vous donne accès à plusieurs éléments du diagnostic :

    -
      -
    • une synthèse pour avoir toutes les informations essentielles en un coup d’oeil
    • -
    • les trajectoires
    • -
    • la consommation des sols
    • -
    • l’artificialisation
    • -
    • découvrir l’OCSGE
    • -
    • zonages d’urbanisme
    • -
    • Paramètres
    • -
    -

    Les différents graphiques sont téléchargeables et donc facilement intégrables à vos rapports et autres documents.

    -
    - Capture d'écran de la page d'acceuil du diagnostic -
    -

    4 - Téléchargez votre diagnostic

    -

    En cliquant sur le bouton bleu en haut à droite dans votre page de diagnostic, vous avez le choix de le charger en format Word ou en format Excel, et ainsi les intégrer à vos rapports et documents internes.

    -
    - Capture d'écran du téléchargement du diagnostic -
    -

    Si vous optez pour le format Word, une fenêtre s’ouvre pour que vous renseigniez vos informations d’envoi par mail.

    -
    - Capture d'écran de la saisie de contact pour le téléchargement du diagnostic +
    +
    +

    Tutoriel

    + +
    +
    +

    ✍️ Comment créer mon diagnostic ?

    +
    + Catpure d'écran de la page d'acceuil +
    +

    + Nous avons pensé Mon Diagnostic Artificialisation pour que la création de votre diagnostic soit la plus simple et la plus rapide possible. Vous trouverez ci-dessous un aperçu de la procédure. +

    +

    1 - Rendez-vous sur la plateforme Mon Diagnostic Artificialisation

    +

    Il existe deux façons de créer un diagnostic :

    +
      +
    • Soit directement en tapant le nom d’une collectivité dans la barre de recherche
    • +
    • Soit par le menu en haut à droite “créer un diagnostic” - là vous avez un filtre par type de collectivité
    • +
    +
    + Catpure d'écran de le recherche d'un territoire +
    +

    2 - Choisissez la collectivité qui vous intéresse en cliquant dessus

    +
    + Catpure d'écran de la sélection de territoire +
    +

    3 - Vous êtes maintenant dans la page d’accueil de votre diagnostic

    +

    Le menu sous votre collectivité vous donne accès à plusieurs éléments du diagnostic :

    +
      +
    • une synthèse pour avoir toutes les informations essentielles en un coup d’oeil
    • +
    • les trajectoires
    • +
    • la consommation des sols
    • +
    • l’artificialisation
    • +
    • découvrir l’OCSGE
    • +
    • zonages d’urbanisme
    • +
    • Paramètres
    • +
    +

    Les différents graphiques sont téléchargeables et donc facilement intégrables à vos rapports et autres documents.

    +
    + Capture d'écran de la page d'acceuil du diagnostic +
    +

    4 - Téléchargez votre diagnostic

    +

    En cliquant sur le bouton bleu en haut à droite dans votre page de diagnostic, vous avez le choix de le charger en format Word ou en format Excel, et ainsi les intégrer à vos rapports et documents internes.

    +
    + Capture d'écran du téléchargement du diagnostic +
    +

    Si vous optez pour le format Word, une fenêtre s’ouvre pour que vous renseigniez vos informations d’envoi par mail.

    +
    + Capture d'écran de la saisie de contact pour le téléchargement du diagnostic +
    -
    -
    -
    -

    ✍️ Pourquoi se créer un compte ?

    -

    La création d’un compte vous permet de sauvegarder vos diagnostics, de les retrouver et de les modifier dans le temps pour les mettre à jour.

    -
    - Catpure d'écran de la section Mes diagnostics +
    +
    +

    ✍️ Pourquoi se créer un compte ?

    +

    La création d’un compte vous permet de sauvegarder vos diagnostics, de les retrouver et de les modifier dans le temps pour les mettre à jour.

    +
    + Catpure d'écran de la section Mes diagnostics +
    -
    +
    - -
    + {% endblock content %} diff --git a/highcharts/charts.py b/highcharts/charts.py index 6bf74d841..f4411bfd1 100644 --- a/highcharts/charts.py +++ b/highcharts/charts.py @@ -44,6 +44,18 @@ def get_param(self) -> Dict[str, Any]: } ] }, + "colors": [ + "#6a6af4", + "#53e19f", + "#00e272", + "#fe6a35", + "#6b8abc", + "#d568fb", + "#2ee0ca", + "#fa4b42", + "#feb56a", + "#91e8e1", + ], } return param @@ -93,6 +105,15 @@ def dumps(self, indent=None, mark_output_safe=True) -> str: else: return chart_dumped + def dict(self) -> Dict[str, Any]: + chart_dumped = json.dumps( + obj=self.chart, + default=decimal2float, + indent=None, + ) + + return mark_safe(chart_dumped) + def get_name(self) -> str: if not self.name: try: diff --git a/highcharts/templates/highcharts/display_chart_data.html b/highcharts/templates/highcharts/display_chart_data.html new file mode 100644 index 000000000..c8dbabbd7 --- /dev/null +++ b/highcharts/templates/highcharts/display_chart_data.html @@ -0,0 +1,4 @@ + + diff --git a/highcharts/templates/highcharts/display_chart_test.html b/highcharts/templates/highcharts/display_chart_test.html deleted file mode 100644 index 20542e83e..000000000 --- a/highcharts/templates/highcharts/display_chart_test.html +++ /dev/null @@ -1,58 +0,0 @@ -
    - {% block before_buttons %}{% endblock %} - - - - - - - - - {% block after_buttons %}{% endblock %} - -
    - -
    - - - - - - diff --git a/highcharts/templatetags/highcharts_tags.py b/highcharts/templatetags/highcharts_tags.py index 87c109162..00fc3c44f 100644 --- a/highcharts/templatetags/highcharts_tags.py +++ b/highcharts/templatetags/highcharts_tags.py @@ -28,20 +28,17 @@ def display_chart(div_id, chart, nonce): return context -@register.inclusion_tag("highcharts/display_chart_test.html") -def display_chart_test(div_id, chart, nonce): +@register.inclusion_tag("highcharts/display_chart_data.html") +def display_chart_data(div_id, chart, nonce): context = { "div_id": div_id, - "js_name": "noname", "CSP_NONCE": nonce, - "autogenrated_id": "rsdtcfyvgubhinjok", } if chart: context.update( { "chart_name": chart.get_name(), - "json_options": chart.dumps(), - "js_name": chart.get_js_name(), + "json_options": chart.dict(), } ) return context diff --git a/home/charts.py b/home/charts.py deleted file mode 100644 index fbe4b8fc8..000000000 --- a/home/charts.py +++ /dev/null @@ -1,185 +0,0 @@ -import re -from collections import defaultdict -from datetime import date - -from django.db.models import CharField, Count, F, Func, Value - -from highcharts import charts -from project.models import Project, Request -from users.models import User -from utils.matomo import Matomo - - -class DiagAndDownloadChart(charts.Chart): - name = "Diagnostic created and downloaded per month" - param = { - "chart": {"type": "column"}, - "title": {"text": "Progression des indicateurs clés mois par mois"}, - "yAxis": { - "title": {"text": "Nombre"}, - }, - "xAxis": {"type": "category"}, - "legend": {"layout": "horizontal", "align": "center", "verticalAlign": "top"}, - "plotOptions": { - "column": { - "dataLabels": {"enabled": True, "format": "{point.y:,.0f}"}, - } - }, - "series": [], - } - - def get_series(self): - if not self.series: - qs_account = ( - User.objects.annotate( - date=Func( - F("date_joined"), - Value("yyyy-MM"), - function="to_char", - output_field=CharField(), - ) - ) - .values("date") - .annotate(total=Count("id")) - .order_by("date") - ) - qs_created = ( - Project.objects.annotate( - date=Func( - F("created_date"), - Value("yyyy-MM"), - function="to_char", - output_field=CharField(), - ) - ) - .values("date") - .annotate(total=Count("id")) - .order_by("date") - ) - qs_dl = ( - Request.objects.annotate( - date=Func( - F("created_date"), - Value("yyyy-MM"), - function="to_char", - output_field=CharField(), - ) - ) - .values("date") - .annotate(total=Count("id")) - .order_by("date") - ) - self.series = { - "Utilisateurs inscris": {row["date"]: row["total"] for row in qs_account}, - "Diagnostics créés": {row["date"]: row["total"] for row in qs_created}, - "Diagnostics téléchargés": {row["date"]: row["total"] for row in qs_dl}, - } - return self.series - - -class UseOfReportPieChart(charts.Chart): - name = "How reports tab are opened" - param = { - "chart": {"type": "pie"}, - "title": {"text": "Pages consultées dans le diagnostic en ligne "}, - "yAxis": { - "title": {"text": "Ouverture"}, - "stackLabels": {"enabled": True, "format": "{total:,.1f}"}, - }, - "tooltip": { - "enabled": False, - "pointFormat": "{point.name}: {point.percentage:.1f}", - }, - "xAxis": {"type": "category"}, - "legend": {"layout": "horizontal", "align": "center", "verticalAlign": "top"}, - "plotOptions": { - "pie": { - "allowPointSelect": True, - "cursor": "pointer", - "dataLabels": { - "enabled": True, - "format": "{point.name}: {point.percentage:.1f} %", - }, - } - }, - "series": [], - } - - def get_series(self): - def t(title): - if title == "map": - return "Carte intéractive" - elif title == "synthesis": - return "Synthèse" - else: - return title - - if not self.series: - self.end = date.today() - self.start = date(year=self.end.year - 1, month=(self.end.month % 12) + 1, day=1) - mato = Matomo(period=(self.start, self.end)) - re_map = re.compile(r"(consommation|couverture|synthesis|usage|artificialisation|map)") - self.series = defaultdict(lambda: 0) - for row in mato.request(): - match = re_map.search(row["label"]) - if match: - self.series[t(match.group(0))] += row["nb_hits"] - return {"Page du rapport": self.series} - - -class OrganismPieChart(charts.Chart): - _field = "organism" - _name = "Organismes" - name = "How reports tab are opened" - param = { - "chart": {"type": "pie"}, - "title": {"text": ""}, - "yAxis": { - "title": {"text": "Ouverture"}, - "stackLabels": {"enabled": True, "format": "{total:,.1f}"}, - }, - "tooltip": { - "enabled": False, - "pointFormat": "{point.name}: {point.percentage:.1f}", - }, - "xAxis": {"type": "category"}, - "legend": {"layout": "horizontal", "align": "center", "verticalAlign": "top"}, - "plotOptions": { - "pie": { - "allowPointSelect": True, - "cursor": "pointer", - "dataLabels": { - "enabled": True, - "format": "{point.name}: {point.percentage:.1f} %", - }, - } - }, - "series": [], - } - - def t(self, value): - try: - return dict(User.ORGANISMS.choices)[value] - except KeyError: - return value - - def get_series(self): - if not self.series: - self.series = { - self._name: { - self.t(row[self._field]): row["total"] - for row in ( - Request.objects.all().values(self._field).annotate(total=Count("id")).order_by(self._field) - ) - } - } - return self.series - - -class FunctionsPieChart(OrganismPieChart): - _field = "function" - _name = "Fonctions" - - def get_series(self): - self.chart["title"]["text"] = "Répartition des fonctions" - return super().get_series() diff --git a/home/templates/home/download.html b/home/templates/home/download.html index 054a3e072..7375e2d4a 100644 --- a/home/templates/home/download.html +++ b/home/templates/home/download.html @@ -58,7 +58,7 @@

    Trames de rapport triennal local des communes au RNU

    {% block tagging %} {% endblock tagging %} diff --git a/home/templates/home/home.html b/home/templates/home/home.html index bac8712c7..8e1cffb5a 100644 --- a/home/templates/home/home.html +++ b/home/templates/home/home.html @@ -35,7 +35,7 @@

    Mon Diagnostic Artificialisation vous aide à analyser et ma

    - {% include "project/partials/search.html" %} +
    @@ -220,7 +220,7 @@

    D'où proviennent nos données ?

    {% block tagging %} {% endblock tagging %} diff --git a/home/templates/home/home_rapport_local.html b/home/templates/home/home_rapport_local.html index 4eb67767e..031a3f584 100644 --- a/home/templates/home/home_rapport_local.html +++ b/home/templates/home/home_rapport_local.html @@ -34,7 +34,7 @@

    Préparer le rapport triennal local de suivi de l’artifici

    - {% include "project/partials/search.html" %} + {% include "project/components/forms/search.html" %}
    @@ -141,7 +141,7 @@

    Cadre réglementaire

    {% block tagging %} {% endblock tagging %} diff --git a/home/urls.py b/home/urls.py index 192278cdd..39a39e818 100644 --- a/home/urls.py +++ b/home/urls.py @@ -12,7 +12,6 @@ path("telechargements/rnu-package/", views.download_package_request, name="download_rnu_package"), path("mentions-legales", views.LegalNoticeView.as_view(), name="cgv"), path("confidentialité", views.PrivacyView.as_view(), name="privacy"), - path("test", views.TestView.as_view(), name="test"), path("accessibilite", views.AccessView.as_view(), name="accessibilite"), path("robots.txt", views.RobotView.as_view(), name="robots"), path("contact", views.ContactView.as_view(), name="contact"), diff --git a/home/views.py b/home/views.py index 8cc937117..026132fe4 100644 --- a/home/views.py +++ b/home/views.py @@ -24,10 +24,6 @@ from .tasks import send_nwl_confirmation, send_nwl_final -class TestView(TemplateView): - template_name = "home/test.html" - - class HomeView(BreadCrumbMixin, TemplateView): template_name = "home/home.html" diff --git a/metabase/admin.py b/metabase/admin.py index 50dc5e3f4..510b74cd3 100644 --- a/metabase/admin.py +++ b/metabase/admin.py @@ -4,7 +4,7 @@ @admin.register(StatDiagnostic) -class StatDiagnosticAdmin(admin.GeoModelAdmin): +class StatDiagnosticAdmin(admin.GISModelAdmin): model = StatDiagnostic list_display = ( "created_date", diff --git a/package-lock.json b/package-lock.json index 9224fac92..e29646dc9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,16 @@ { "name": "sparte", - "version": "7.4", + "version": "8.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "sparte", - "version": "7.4", + "version": "8.2.0", "dependencies": { "@gouvfr/dsfr": "^1.8.5", "@reduxjs/toolkit": "^2.2.1", - "@types/jest": "^29.5.12", - "@types/node": "^20.11.30", - "@types/react": "^18.2.73", - "@types/react-dom": "^18.2.23", + "@svgr/webpack": "^8.1.0", "highcharts": "^11.4.6", "highcharts-react-official": "^3.2.1", "htmx.org": "^1.8.4", @@ -22,15 +19,22 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-redux": "^9.1.0", - "styled-components": "^6.1.8", - "ts-loader": "^9.5.1", - "typescript": "^5.4.3" + "react-router-dom": "^6.26.0", + "styled-components": "^6.1.8" }, "devDependencies": { "@babel/core": "^7.24.1", "@babel/eslint-parser": "^7.22.15", "@babel/preset-env": "^7.24.1", "@babel/preset-react": "^7.24.1", + "@babel/preset-typescript": "^7.24.7", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.15", + "@types/jest": "^29.5.12", + "@types/node": "^20.11.30", + "@types/react": "^18.2.73", + "@types/react-dom": "^18.2.23", + "@types/react-redux": "^7.1.33", + "@types/styled-components": "^5.1.34", "babel-loader": "^9.1.3", "css-loader": "^6.7.3", "eslint": "^8.52.0", @@ -38,16 +42,20 @@ "eslint-webpack-plugin": "^4.0.1", "json-loader": "^0.5.7", "mini-css-extract-plugin": "^2.7.2", + "react-refresh": "^0.14.2", + "ts-loader": "^9.5.1", + "tsconfig-paths-webpack-plugin": "^4.1.0", + "typescript": "^5.6.2", "webpack": "^5.76.0", "webpack-bundle-analyzer": "^4.7.0", - "webpack-cli": "^5.0.1" + "webpack-cli": "^5.0.1", + "webpack-dev-server": "^5.0.4" } }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -74,7 +82,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -84,7 +91,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", - "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", @@ -131,13 +137,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", - "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", - "dev": true, + "version": "7.25.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.5.tgz", + "integrity": "sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w==", "license": "MIT", "dependencies": { - "@babel/types": "^7.24.7", + "@babel/types": "^7.25.4", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -150,7 +155,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.24.7" @@ -163,7 +167,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/traverse": "^7.24.7", @@ -177,7 +180,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/compat-data": "^7.24.7", @@ -191,20 +193,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz", - "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==", - "dev": true, + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz", + "integrity": "sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.8", "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-replace-supers": "^7.25.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/traverse": "^7.25.4", "semver": "^6.3.1" }, "engines": { @@ -218,7 +217,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz", "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", @@ -236,7 +234,6 @@ "version": "0.6.2", "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", @@ -253,7 +250,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.24.7" @@ -266,7 +262,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.24.7", @@ -280,7 +275,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.24.7" @@ -290,14 +284,13 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz", - "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==", - "dev": true, + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", + "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -307,7 +300,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/traverse": "^7.24.7", @@ -321,7 +313,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.24.7", @@ -341,7 +332,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", - "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.24.7" @@ -351,10 +341,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", - "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", - "dev": true, + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -364,7 +353,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz", "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", @@ -379,15 +367,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", - "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", - "dev": true, + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz", + "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==", "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.7", - "@babel/helper-optimise-call-expression": "^7.24.7" + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -400,7 +387,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/traverse": "^7.24.7", @@ -414,7 +400,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/traverse": "^7.24.7", @@ -428,7 +413,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.24.7" @@ -438,10 +422,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", - "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", - "dev": true, + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -460,7 +443,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -470,7 +452,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz", "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-function-name": "^7.24.7", @@ -486,7 +467,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.24.7", @@ -512,11 +492,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", - "dev": true, + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.4.tgz", + "integrity": "sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==", "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.4" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -528,7 +510,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz", "integrity": "sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.24.7", @@ -545,7 +526,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz", "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" @@ -561,7 +541,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", @@ -579,7 +558,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz", "integrity": "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.24.7", @@ -596,7 +574,6 @@ "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -609,7 +586,6 @@ "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -622,7 +598,6 @@ "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" @@ -635,7 +610,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" @@ -651,7 +625,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -664,7 +637,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" @@ -677,7 +649,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" @@ -693,7 +664,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" @@ -709,7 +679,6 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" @@ -722,7 +691,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -735,7 +703,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" @@ -751,7 +718,6 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" @@ -764,7 +730,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -777,7 +742,6 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" @@ -790,7 +754,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -803,7 +766,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -816,7 +778,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -829,7 +790,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" @@ -845,7 +805,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" @@ -857,11 +816,25 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz", + "integrity": "sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", @@ -878,7 +851,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" @@ -894,7 +866,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz", "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.24.7", @@ -913,7 +884,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.24.7", @@ -931,7 +901,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" @@ -947,7 +916,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz", "integrity": "sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" @@ -963,7 +931,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.24.7", @@ -980,7 +947,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.24.7", @@ -998,7 +964,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz", "integrity": "sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", @@ -1021,7 +986,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", @@ -1038,7 +1002,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz", "integrity": "sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" @@ -1054,7 +1017,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.24.7", @@ -1071,7 +1033,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" @@ -1087,7 +1048,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", @@ -1104,7 +1064,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", @@ -1121,7 +1080,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", @@ -1138,7 +1096,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", @@ -1155,7 +1112,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz", "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.24.7", @@ -1173,7 +1129,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", @@ -1190,7 +1145,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz", "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" @@ -1206,7 +1160,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", @@ -1223,7 +1176,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" @@ -1239,7 +1191,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.24.7", @@ -1256,7 +1207,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz", "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.24.7", @@ -1274,7 +1224,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz", "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-hoist-variables": "^7.24.7", @@ -1293,7 +1242,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.24.7", @@ -1310,7 +1258,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.24.7", @@ -1327,7 +1274,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" @@ -1343,7 +1289,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", @@ -1360,7 +1305,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", @@ -1377,7 +1321,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.24.7", @@ -1396,7 +1339,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", @@ -1413,7 +1355,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", @@ -1430,7 +1371,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz", "integrity": "sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", @@ -1448,7 +1388,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" @@ -1464,7 +1403,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.24.7", @@ -1481,7 +1419,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", @@ -1500,7 +1437,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" @@ -1512,11 +1448,25 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.25.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.25.1.tgz", + "integrity": "sha512-SLV/giH/V4SmloZ6Dt40HjTGTAIkxn33TVIHxNGNvo8ezMhrxBkzisj4op1KZYPIOHFLqhv60OHvX+YRu4xbmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-react-display-name": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz", "integrity": "sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" @@ -1532,7 +1482,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.7.tgz", "integrity": "sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", @@ -1552,7 +1501,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz", "integrity": "sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/plugin-transform-react-jsx": "^7.24.7" @@ -1568,7 +1516,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz", "integrity": "sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", @@ -1585,7 +1532,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", @@ -1602,7 +1548,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" @@ -1618,7 +1563,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" @@ -1634,7 +1578,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", @@ -1651,7 +1594,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" @@ -1667,7 +1609,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" @@ -1683,7 +1624,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz", "integrity": "sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" @@ -1695,11 +1635,29 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.2.tgz", + "integrity": "sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-syntax-typescript": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-unicode-escapes": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" @@ -1715,7 +1673,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.24.7", @@ -1732,7 +1689,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.24.7", @@ -1749,7 +1705,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.24.7", @@ -1766,7 +1721,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.7.tgz", "integrity": "sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/compat-data": "^7.24.7", @@ -1862,7 +1816,6 @@ "version": "0.1.6-no-external-plugins", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", @@ -1877,7 +1830,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.7.tgz", "integrity": "sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", @@ -1894,18 +1846,35 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/preset-typescript": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz", + "integrity": "sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.7", + "@babel/plugin-transform-typescript": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/regjsgen": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true, "license": "MIT" }, "node_modules/@babel/runtime": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", - "dev": true, "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -1915,35 +1884,30 @@ } }, "node_modules/@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", - "dev": true, + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", - "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", - "dev": true, + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.4.tgz", + "integrity": "sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7", + "@babel/generator": "^7.25.4", + "@babel/parser": "^7.25.4", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.4", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1952,13 +1916,12 @@ } }, "node_modules/@babel/types": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", - "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", - "dev": true, + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.4.tgz", + "integrity": "sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-string-parser": "^7.24.8", "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, @@ -2136,66 +2099,167 @@ "dev": true, "license": "BSD-3-Clause" }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "license": "MIT", + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", "dependencies": { - "jest-get-type": "^29.6.3" + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" + "engines": { + "node": ">=12" }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@jest/types/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@jest/types/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -2212,6 +2276,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -2224,12 +2289,14 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, "license": "MIT" }, "node_modules/@jest/types/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -2239,6 +2306,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -2283,6 +2351,7 @@ "version": "0.3.6", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -2305,6 +2374,70 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.1.0.tgz", + "integrity": "sha512-zlQONA+msXPPwHWZMKFVS78ewFczIll5lXiVPwFPCZUsrOKdxc2AvxU1HoNBmMRhqDZUR9HkC3UOm+6pME6Xsg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "^1.1.1", + "@jsonjoy.com/util": "^1.1.2", + "hyperdyperid": "^1.2.0", + "thingies": "^1.20.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.3.0.tgz", + "integrity": "sha512-Cebt4Vk7k1xHy87kHY7KSPLT77A7Ev7IfOblyLZhtYEhrdQ6fX4EoLq3xOQ3O/DRMEh2ok5nyC180E+ABS8Wmw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "dev": true, + "license": "MIT" + }, "node_modules/@mapbox/geojson-rewind": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz", @@ -2429,6 +2562,66 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.15.tgz", + "integrity": "sha512-LFWllMA55pzB9D34w/wXUCf8+c+IYKuJDgxiZ3qMhl64KRMBHYM1I3VdGaD2BV5FNPV2/S2596bppxHbv2ZydQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-html": "^0.0.9", + "core-js-pure": "^3.23.3", + "error-stack-parser": "^2.0.6", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.4", + "schema-utils": "^4.2.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "@types/webpack": "4.x || 5.x", + "react-refresh": ">=0.10.0 <1.0.0", + "sockjs-client": "^1.4.0", + "type-fest": ">=0.17.0 <5.0.0", + "webpack": ">=4.43.0 <6.0.0", + "webpack-dev-server": "3.x || 4.x || 5.x", + "webpack-hot-middleware": "2.x", + "webpack-plugin-serve": "0.x || 1.x" + }, + "peerDependenciesMeta": { + "@types/webpack": { + "optional": true + }, + "sockjs-client": { + "optional": true + }, + "type-fest": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + }, + "webpack-hot-middleware": { + "optional": true + }, + "webpack-plugin-serve": { + "optional": true + } + } + }, "node_modules/@polka/url": { "version": "1.0.0-next.25", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", @@ -2436,42 +2629,360 @@ "dev": true, "license": "MIT" }, - "node_modules/@reduxjs/toolkit": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.6.tgz", - "integrity": "sha512-kH0r495c5z1t0g796eDQAkYbEQ3a1OLYN9o8jQQVZyKyw367pfRGS+qZLkHYvFHiUUdafpoSlQ2QYObIApjPWA==", + "node_modules/@reduxjs/toolkit": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.6.tgz", + "integrity": "sha512-kH0r495c5z1t0g796eDQAkYbEQ3a1OLYN9o8jQQVZyKyw367pfRGS+qZLkHYvFHiUUdafpoSlQ2QYObIApjPWA==", + "license": "MIT", + "dependencies": { + "immer": "^10.0.3", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.1.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/@remix-run/router": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.0.tgz", + "integrity": "sha512-zDICCLKEwbVYTS6TjYaWtHXxkdoUvD/QXvyVZjGCsWz5vyH7aFeONlPffPdW+Y/t6KT0MgXb2Mfjun9YpWN1dA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "license": "MIT", + "peer": true + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", + "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/webpack": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", + "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "dev": true, "license": "MIT", "dependencies": { - "immer": "^10.0.3", - "redux": "^5.0.1", - "redux-thunk": "^3.1.0", - "reselect": "^5.1.0" - }, - "peerDependencies": { - "react": "^16.9.0 || ^17.0.0 || ^18", - "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-redux": { - "optional": true - } + "@types/node": "*" } }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "license": "MIT" + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", - "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dev": true, "license": "MIT", - "peer": true + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } }, "node_modules/@types/cookie": { "version": "0.4.1", @@ -2494,6 +3005,7 @@ "version": "8.56.10", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", + "dev": true, "license": "MIT", "dependencies": { "@types/estree": "*", @@ -2504,6 +3016,7 @@ "version": "3.7.7", "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, "license": "MIT", "dependencies": { "@types/eslint": "*", @@ -2514,24 +3027,81 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true, "license": "MIT" }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", + "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, "node_modules/@types/geojson": { "version": "7946.0.14", "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==", "license": "MIT" }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", + "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.15", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", + "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, "license": "MIT" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "*" @@ -2541,6 +3111,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, "license": "MIT", "dependencies": { "@types/istanbul-lib-report": "*" @@ -2550,6 +3121,7 @@ "version": "29.5.12", "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", + "dev": true, "license": "MIT", "dependencies": { "expect": "^29.0.0", @@ -2560,6 +3132,7 @@ "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, "license": "MIT" }, "node_modules/@types/json5": { @@ -2587,6 +3160,13 @@ "@types/pbf": "*" } }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { "version": "20.14.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz", @@ -2596,6 +3176,16 @@ "undici-types": "~5.26.4" } }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/pbf": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/pbf/-/pbf-3.0.5.tgz", @@ -2606,12 +3196,28 @@ "version": "15.7.12", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, "license": "MIT" }, "node_modules/@types/react": { "version": "18.3.3", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", + "devOptional": true, "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -2622,17 +3228,104 @@ "version": "18.3.0", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", + "dev": true, "license": "MIT", "dependencies": { "@types/react": "*" } }, + "node_modules/@types/react-redux": { + "version": "7.1.33", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.33.tgz", + "integrity": "sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, + "node_modules/@types/react-redux/node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, + "node_modules/@types/retry": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, "license": "MIT" }, + "node_modules/@types/styled-components": { + "version": "5.1.34", + "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.34.tgz", + "integrity": "sha512-mmiVvwpYklFIv9E8qfxuPyIt/OuyIrn6gMOAMOFUO3WJfSrSE+sGUoa4PiZj77Ut7bKZpaa6o1fBKS/4TOEvnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hoist-non-react-statics": "*", + "@types/react": "*", + "csstype": "^3.0.2" + } + }, "node_modules/@types/stylis": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz", @@ -2654,10 +3347,21 @@ "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==", "license": "MIT" }, + "node_modules/@types/ws": { + "version": "8.5.12", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", + "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/yargs": { "version": "17.0.32", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "dev": true, "license": "MIT", "dependencies": { "@types/yargs-parser": "*" @@ -2667,6 +3371,7 @@ "version": "21.0.3", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, "license": "MIT" }, "node_modules/@ungap/structured-clone": { @@ -2680,6 +3385,7 @@ "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", @@ -2690,24 +3396,28 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", @@ -2719,12 +3429,14 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.12.1", @@ -2737,6 +3449,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" @@ -2746,6 +3459,7 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" @@ -2755,12 +3469,14 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.12.1", @@ -2777,6 +3493,7 @@ "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.12.1", @@ -2790,6 +3507,7 @@ "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.12.1", @@ -2802,6 +3520,7 @@ "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.12.1", @@ -2816,6 +3535,7 @@ "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.12.1", @@ -2873,12 +3593,14 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, "license": "Apache-2.0" }, "node_modules/accepts": { @@ -2886,7 +3608,6 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "license": "MIT", - "peer": true, "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -2899,6 +3620,7 @@ "version": "8.12.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -2911,6 +3633,7 @@ "version": "1.9.5", "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "dev": true, "license": "MIT", "peerDependencies": { "acorn": "^8" @@ -2943,6 +3666,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -3001,11 +3725,38 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } }, + "node_modules/ansi-html": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.9.tgz", + "integrity": "sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -3032,7 +3783,6 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "license": "ISC", - "peer": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -3045,7 +3795,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, "license": "Python-2.0" }, "node_modules/aria-query": { @@ -3086,6 +3835,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true, + "license": "MIT" + }, "node_modules/array-includes": { "version": "3.1.8", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", @@ -3356,7 +4112,6 @@ "version": "0.4.11", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", - "dev": true, "license": "MIT", "dependencies": { "@babel/compat-data": "^7.22.6", @@ -3371,7 +4126,6 @@ "version": "0.10.4", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.1", @@ -3385,7 +4139,6 @@ "version": "0.6.2", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.2" @@ -3414,15 +4167,23 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "license": "MIT" + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, "license": "MIT", - "peer": true + "engines": { + "node": "*" + } }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" }, @@ -3430,6 +4191,89 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/body-parser/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bonjour-service": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -3722,14 +4566,30 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, "license": "MIT" }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -3777,12 +4637,23 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/camelize": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", @@ -3831,7 +4702,6 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "license": "MIT", - "peer": true, "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -3855,6 +4725,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.0" @@ -3864,6 +4735,7 @@ "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, "funding": [ { "type": "github", @@ -3940,6 +4812,72 @@ "dev": true, "license": "ISC" }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -3996,11 +4934,33 @@ "license": "MIT", "peer": true }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, "license": "MIT" }, "node_modules/cookie": { @@ -4013,11 +4973,17 @@ "node": ">= 0.6" } }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true, + "license": "MIT" + }, "node_modules/core-js-compat": { "version": "3.37.1", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", - "dev": true, "license": "MIT", "dependencies": { "browserslist": "^4.23.0" @@ -4027,6 +4993,25 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/core-js-pure": { + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.38.1.tgz", + "integrity": "sha512-BY8Etc1FZqdw1glX0XNOq2FDwfrg/VGqoZOZCdaL+UmdaqDwQwYXkMJT4t6In+zfEfOJDcM9T0KdbBeJg8KKCQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, "node_modules/cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -4041,6 +5026,32 @@ "node": ">= 0.10" } }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -4114,6 +5125,22 @@ "node": ">=10" } }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/css-to-react-native": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", @@ -4125,6 +5152,31 @@ "postcss-value-parser": "^4.0.2" } }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -4138,6 +5190,39 @@ "node": ">=4" } }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" + }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", @@ -4274,6 +5359,58 @@ "dev": true, "license": "MIT" }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -4292,6 +5429,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/define-properties": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", @@ -4315,7 +5465,6 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -4327,6 +5476,13 @@ "license": "MIT", "peer": true }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT" + }, "node_modules/dev-ip": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", @@ -4343,11 +5499,25 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -4361,6 +5531,71 @@ "node": ">=6.0.0" } }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -4374,6 +5609,13 @@ "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==", "license": "ISC" }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, "node_modules/easy-extender": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", @@ -4478,8 +5720,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/electron-to-chromium": { "version": "1.4.816", @@ -4492,15 +5733,23 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true, + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, "license": "MIT", - "peer": true + "engines": { + "node": ">= 4" + } }, "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -4555,6 +5804,7 @@ "version": "5.17.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", + "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -4564,6 +5814,18 @@ "node": ">=10.13.0" } }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/envinfo": { "version": "7.13.0", "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz", @@ -4577,6 +5839,25 @@ "node": ">=4" } }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "stackframe": "^1.3.4" + } + }, "node_modules/es-abstract": { "version": "1.23.3", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", @@ -4715,6 +5996,7 @@ "version": "1.5.4", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "dev": true, "license": "MIT" }, "node_modules/es-object-atoms": { @@ -4789,8 +6071,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "1.0.5", @@ -5128,6 +6409,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", @@ -5141,6 +6423,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -5377,6 +6660,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" @@ -5389,6 +6673,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -5398,7 +6683,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" @@ -5409,7 +6693,6 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -5418,22 +6701,47 @@ "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.8.x" } }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, "node_modules/expect": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, "license": "MIT", "dependencies": { "@jest/expect-utils": "^29.7.0", @@ -5446,6 +6754,190 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/express/node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/express/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/express/node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/express/node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", @@ -5462,12 +6954,14 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, "license": "MIT" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { @@ -5497,6 +6991,19 @@ "reusify": "^1.0.4" } }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -5635,7 +7142,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=4.0" }, @@ -5656,12 +7162,51 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -5695,7 +7240,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } @@ -5704,7 +7248,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5745,7 +7288,6 @@ "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -5860,7 +7402,6 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "license": "ISC", - "peer": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -5872,6 +7413,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, "license": "BSD-2-Clause" }, "node_modules/global-prefix": { @@ -5904,7 +7446,6 @@ "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -5970,6 +7511,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true, + "license": "MIT" + }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -6050,7 +7598,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -6074,6 +7621,93 @@ "react": ">=16.8.0" } }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -6087,12 +7721,18 @@ "integrity": "sha512-VZAohXyF7xPGS52IM8d1T1283y+X4D+Owf3qY1NZ9RuBypyu9l8cGsxUMAG5fEAb/DhT7rDoJ9Hpu5/HxFD3cw==", "license": "0BSD" }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true, + "license": "MIT" + }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "license": "MIT", - "peer": true, "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -6109,17 +7749,22 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true, + "license": "MIT" + }, "node_modules/http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "license": "MIT", - "peer": true, "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -6129,12 +7774,56 @@ "node": ">=8.0.0" } }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.18" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "license": "MIT", - "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -6209,7 +7898,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -6371,6 +8059,16 @@ "node": ">=10.13.0" } }, + "node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, "node_modules/is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", @@ -6407,6 +8105,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, "node_modules/is-async-function": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", @@ -6443,7 +8147,6 @@ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "license": "MIT", - "peer": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -6487,7 +8190,6 @@ "version": "2.14.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", - "dev": true, "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -6533,6 +8235,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -6570,7 +8288,6 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -6604,6 +8321,25 @@ "node": ">=0.10.0" } }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", @@ -6632,6 +8368,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-network-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", + "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -6678,6 +8427,19 @@ "node": ">=8" } }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -6739,6 +8501,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", @@ -6884,10 +8659,27 @@ "set-function-name": "^2.0.1" } }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jest-diff": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.0.0", @@ -6903,6 +8695,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -6918,6 +8711,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -6934,6 +8728,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -6946,12 +8741,14 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, "license": "MIT" }, "node_modules/jest-diff/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -6961,6 +8758,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -6973,6 +8771,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -6982,6 +8781,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.0.0", @@ -6997,6 +8797,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -7012,6 +8813,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -7028,6 +8830,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -7040,12 +8843,14 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, "license": "MIT" }, "node_modules/jest-matcher-utils/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -7055,6 +8860,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -7067,6 +8873,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", @@ -7087,6 +8894,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -7102,6 +8910,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -7118,6 +8927,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -7130,12 +8940,14 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, "license": "MIT" }, "node_modules/jest-message-util/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -7145,6 +8957,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -7157,6 +8970,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", @@ -7174,6 +8988,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -7189,6 +9004,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -7205,6 +9021,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -7217,12 +9034,14 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, "license": "MIT" }, "node_modules/jest-util/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -7232,6 +9051,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -7292,7 +9112,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -7305,7 +9124,6 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -7338,6 +9156,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { @@ -7357,7 +9176,6 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, "license": "MIT", "bin": { "json5": "lib/cli.js" @@ -7440,6 +9258,17 @@ "node": ">=0.10" } }, + "node_modules/launch-editor": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.1.tgz", + "integrity": "sha512-elBx2l/tp9z99X5H/qev8uyDywVh0VXAwEbjk8kJhnc5grOFkGh7aW6q55me9xnYbss261XtnUrysZ+XvGbhQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -7460,15 +9289,37 @@ "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", "peer": true }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.11.5" } }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, "node_modules/localtunnel": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz", @@ -7574,7 +9425,6 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true, "license": "MIT" }, "node_modules/lodash.isequal": { @@ -7609,11 +9459,19 @@ "loose-envify": "cli.js" } }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, "license": "ISC", "dependencies": { "yallist": "^3.0.2" @@ -7659,12 +9517,66 @@ "url": "https://github.com/maplibre/maplibre-gl-js?sponsor=1" } }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.11.1.tgz", + "integrity": "sha512-LZcMTBAgqUUKNXZagcZxvXXfgF1bHX7Y7nQ0QyEiNbRJgE29GhgPd8Yna1VQcLlPiHt/5RFJMWYN9Uv/VPNvjQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/json-pack": "^1.0.3", + "@jsonjoy.com/util": "^1.3.0", + "tree-dump": "^1.0.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">= 4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true, + "license": "MIT" + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, "license": "MIT" }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/micromatch": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", @@ -7709,6 +9621,16 @@ "node": ">= 0.6" } }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/mini-css-extract-plugin": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz", @@ -7730,6 +9652,13 @@ "webpack": "^5.0.0" } }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true, + "license": "ISC" + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -7751,6 +9680,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/mitt": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", @@ -7774,6 +9713,20 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "license": "MIT" }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, "node_modules/murmurhash-js": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", @@ -7810,7 +9763,6 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -7819,8 +9771,29 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, "license": "MIT" }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, "node_modules/node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", @@ -7833,7 +9806,32 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, "node_modules/object-assign": { @@ -7852,7 +9850,6 @@ "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" }, @@ -7996,6 +9993,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true, + "license": "MIT" + }, "node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -8009,6 +10013,16 @@ "node": ">= 0.8" } }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -8019,6 +10033,57 @@ "wrappy": "1" } }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", + "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open/node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/opener": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", @@ -8099,6 +10164,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-retry": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.0.tgz", + "integrity": "sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -8109,11 +10192,17 @@ "node": ">=6" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -8122,12 +10211,29 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -8166,9 +10272,48 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", "dev": true, "license": "MIT" }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/pbf": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.3.0.tgz", @@ -8462,6 +10607,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", @@ -8476,6 +10622,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -8484,6 +10631,13 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -8511,15 +10665,56 @@ "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==", "license": "MIT" }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -8551,6 +10746,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" @@ -8561,7 +10757,6 @@ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -8571,7 +10766,6 @@ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "license": "MIT", - "peer": true, "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -8611,6 +10805,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, "license": "MIT" }, "node_modules/react-redux": { @@ -8636,12 +10831,68 @@ } } }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.0.tgz", + "integrity": "sha512-wVQq0/iFYd3iZ9H2l3N3k4PL8EEHcb0XlU2Na8nEwmiXgIUElEH6gaJDtUQxJ+JFzmIXaQjfdpcGWaM6IoQGxg==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.19.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.0.tgz", + "integrity": "sha512-RRGUIiDtLrkX3uYcFiCIxKFWMcWQGMojpYZfcstc63A1+sSnVgILGIm9gNUA6na3Fm1QuPGSBQH2EMbAZOnMsQ==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.19.0", + "react-router": "6.26.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "license": "MIT", - "peer": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -8704,14 +10955,12 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true, "license": "MIT" }, "node_modules/regenerate-unicode-properties": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", - "dev": true, "license": "MIT", "dependencies": { "regenerate": "^1.4.2" @@ -8724,14 +10973,12 @@ "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true, "license": "MIT" }, "node_modules/regenerator-transform": { "version": "0.15.2", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.4" @@ -8761,7 +11008,6 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/regjsgen": "^0.8.0", @@ -8779,7 +11025,6 @@ "version": "0.9.1", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "jsesc": "~0.5.0" @@ -8792,7 +11037,6 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, "bin": { "jsesc": "bin/jsesc" } @@ -8821,8 +11065,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/reselect": { "version": "5.1.1", @@ -8834,7 +11077,6 @@ "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", @@ -8875,7 +11117,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -8920,6 +11161,16 @@ "license": "MIT", "peer": true }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -8948,6 +11199,19 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/run-applescript": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -9009,6 +11273,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, "funding": [ { "type": "github", @@ -9048,8 +11313,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/scheduler": { "version": "0.23.2", @@ -9117,11 +11381,31 @@ "dev": true, "license": "MIT" }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true, + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -9223,6 +11507,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" @@ -9233,7 +11518,6 @@ "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "license": "MIT", - "peer": true, "dependencies": { "accepts": "~1.3.4", "batch": "0.6.1", @@ -9252,7 +11536,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -9262,7 +11545,6 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -9272,7 +11554,6 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "license": "MIT", - "peer": true, "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -9287,29 +11568,25 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/serve-index/node_modules/setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/serve-index/node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -9391,8 +11668,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/shallow-clone": { "version": "3.0.1", @@ -9436,13 +11712,22 @@ "node": ">=8" } }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/side-channel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -9456,6 +11741,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, "node_modules/sirv": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", @@ -9475,9 +11767,20 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" } }, "node_modules/socket.io": { @@ -9540,6 +11843,18 @@ "node": ">=10.0.0" } }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, "node_modules/sort-asc": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/sort-asc/-/sort-asc-0.2.0.tgz", @@ -9579,6 +11894,7 @@ "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">= 8" @@ -9597,6 +11913,7 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", @@ -9607,11 +11924,44 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, "node_modules/split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -9653,6 +12003,7 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, "license": "MIT", "dependencies": { "escape-string-regexp": "^2.0.0" @@ -9665,11 +12016,19 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "dev": true, + "license": "MIT" + }, "node_modules/statuses": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", @@ -9711,12 +12070,21 @@ "node": ">= 0.10.0" } }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -9726,12 +12094,34 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, "node_modules/string-width/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/string.prototype.includes": { "version": "2.0.0", @@ -9840,17 +12230,40 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -9951,7 +12364,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -9960,10 +12372,51 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "license": "MIT" + }, + "node_modules/svgo": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -9973,6 +12426,7 @@ "version": "5.31.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz", "integrity": "sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -9991,6 +12445,7 @@ "version": "5.3.10", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.20", @@ -10025,6 +12480,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -10034,6 +12490,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", @@ -10048,6 +12505,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", @@ -10066,6 +12524,7 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -10084,6 +12543,26 @@ "dev": true, "license": "MIT" }, + "node_modules/thingies": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", + "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", + "dev": true, + "license": "Unlicense", + "engines": { + "node": ">=10.18" + }, + "peerDependencies": { + "tslib": "^2" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true, + "license": "MIT" + }, "node_modules/tinyqueue": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", @@ -10094,7 +12573,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -10117,7 +12595,6 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.6" } @@ -10128,34 +12605,171 @@ "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6" + "engines": { + "node": ">=6" + } + }, + "node_modules/tree-dump": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz", + "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/ts-loader": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", + "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4", + "source-map": "^0.7.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/ts-loader/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ts-loader/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ts-loader/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ts-loader/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ts-loader/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-loader/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-loader/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" } }, - "node_modules/ts-loader": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", - "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", + "node_modules/tsconfig-paths-webpack-plugin": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.1.0.tgz", + "integrity": "sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==", + "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4", - "source-map": "^0.7.4" + "enhanced-resolve": "^5.7.0", + "tsconfig-paths": "^4.1.2" }, "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "typescript": "*", - "webpack": "^5.0.0" + "node": ">=10.13.0" } }, - "node_modules/ts-loader/node_modules/ansi-styles": { + "node_modules/tsconfig-paths-webpack-plugin/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -10167,10 +12781,11 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/ts-loader/node_modules/chalk": { + "node_modules/tsconfig-paths-webpack-plugin/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -10183,10 +12798,11 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/ts-loader/node_modules/color-convert": { + "node_modules/tsconfig-paths-webpack-plugin/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -10195,37 +12811,28 @@ "node": ">=7.0.0" } }, - "node_modules/ts-loader/node_modules/color-name": { + "node_modules/tsconfig-paths-webpack-plugin/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, "license": "MIT" }, - "node_modules/ts-loader/node_modules/has-flag": { + "node_modules/tsconfig-paths-webpack-plugin/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/ts-loader/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ts-loader/node_modules/supports-color": { + "node_modules/tsconfig-paths-webpack-plugin/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -10234,18 +12841,19 @@ "node": ">=8" } }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "node_modules/tsconfig-paths-webpack-plugin/node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", + "json5": "^2.2.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, "node_modules/tsconfig-paths/node_modules/json5": { @@ -10294,6 +12902,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typed-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", @@ -10376,9 +12998,10 @@ } }, "node_modules/typescript": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", - "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", + "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", + "devOptional": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -10454,7 +13077,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -10464,7 +13086,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, "license": "MIT", "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", @@ -10478,7 +13099,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -10488,7 +13108,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -10524,7 +13143,6 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -10563,6 +13181,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -10589,17 +13208,25 @@ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4.0" } }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -10619,6 +13246,7 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "dev": true, "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", @@ -10628,10 +13256,21 @@ "node": ">=10.13.0" } }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, "node_modules/webpack": { "version": "5.92.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.92.1.tgz", "integrity": "sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==", + "dev": true, "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -10803,6 +13442,182 @@ "node": ">=14" } }, + "node_modules/webpack-dev-middleware": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", + "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^4.6.0", + "mime-types": "^2.1.31", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webpack-dev-server": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.0.4.tgz", + "integrity": "sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.4.0", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "rimraf": "^5.0.5", + "schema-utils": "^4.2.0", + "selfsigned": "^2.4.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^7.1.0", + "ws": "^8.16.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/webpack-dev-server/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/webpack-dev-server/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/webpack-dev-server/node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/webpack-merge": { "version": "5.10.0", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", @@ -10822,6 +13637,7 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, "license": "MIT", "engines": { "node": ">=10.13.0" @@ -10831,6 +13647,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", @@ -10845,6 +13662,31 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -10983,6 +13825,61 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -11031,7 +13928,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" }, @@ -11071,7 +13967,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, "license": "ISC" }, "node_modules/yargs": { diff --git a/package.json b/package.json index 6771ef4cf..60684d892 100644 --- a/package.json +++ b/package.json @@ -1,17 +1,26 @@ { "name": "sparte", - "version": "8.0", + "version": "8.2.0", "private": true, "scripts": { - "dev": "webpack --watch --mode development", + "dev": "webpack serve --mode development", "build": "webpack --mode production", - "lint": "eslint --fix ./assets/scripts/*.js ./assets/scripts/**/*.js" + "lint": "eslint --fix ./assets/scripts/*.js ./assets/scripts/**/*.js", + "tsc": "tsc" }, "devDependencies": { "@babel/core": "^7.24.1", "@babel/eslint-parser": "^7.22.15", "@babel/preset-env": "^7.24.1", "@babel/preset-react": "^7.24.1", + "@babel/preset-typescript": "^7.24.7", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.15", + "@types/jest": "^29.5.12", + "@types/node": "^20.11.30", + "@types/react": "^18.2.73", + "@types/react-dom": "^18.2.23", + "@types/react-redux": "^7.1.33", + "@types/styled-components": "^5.1.34", "babel-loader": "^9.1.3", "css-loader": "^6.7.3", "eslint": "^8.52.0", @@ -19,17 +28,19 @@ "eslint-webpack-plugin": "^4.0.1", "json-loader": "^0.5.7", "mini-css-extract-plugin": "^2.7.2", + "react-refresh": "^0.14.2", + "ts-loader": "^9.5.1", + "tsconfig-paths-webpack-plugin": "^4.1.0", + "typescript": "^5.6.2", "webpack": "^5.76.0", "webpack-bundle-analyzer": "^4.7.0", - "webpack-cli": "^5.0.1" + "webpack-cli": "^5.0.1", + "webpack-dev-server": "^5.0.4" }, "dependencies": { "@gouvfr/dsfr": "^1.8.5", "@reduxjs/toolkit": "^2.2.1", - "@types/jest": "^29.5.12", - "@types/node": "^20.11.30", - "@types/react": "^18.2.73", - "@types/react-dom": "^18.2.23", + "@svgr/webpack": "^8.1.0", "highcharts": "^11.4.6", "highcharts-react-official": "^3.2.1", "htmx.org": "^1.8.4", @@ -38,8 +49,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-redux": "^9.1.0", - "styled-components": "^6.1.8", - "ts-loader": "^9.5.1", - "typescript": "^5.4.3" + "react-router-dom": "^6.26.0", + "styled-components": "^6.1.8" } -} +} \ No newline at end of file diff --git a/project/admin.py b/project/admin.py index 8b4a80503..2a6cb23f7 100644 --- a/project/admin.py +++ b/project/admin.py @@ -215,7 +215,7 @@ def link_to_user(self, obj): def link_to_project(self, obj): try: - link = reverse("project:detail", args=[obj.project_id]) + link = reverse("project:home", args=[obj.project_id]) return format_html(f'Accès à la fiche') except exceptions.NoReverseMatch: return format_html("Diagnostic inconnu") diff --git a/project/api_views.py b/project/api_views.py index 6f784b0d1..fa3594153 100644 --- a/project/api_views.py +++ b/project/api_views.py @@ -1,8 +1,9 @@ """Public data API views.""" + from django.contrib.gis.geos import Polygon from django.db.models import F, OuterRef, Subquery from django.http import JsonResponse -from rest_framework import viewsets +from rest_framework import generics, viewsets from rest_framework.decorators import action from rest_framework.exceptions import ParseError @@ -11,7 +12,11 @@ from public_data.serializers import ZoneUrbaSerializer from .models import Emprise, Project -from .serializers import EmpriseSerializer, ProjectCommuneSerializer +from .serializers import ( + EmpriseSerializer, + ProjectCommuneSerializer, + ProjectDetailSerializer, +) from .views.mixins import UserQuerysetOrPublicMixin @@ -34,6 +39,11 @@ def get_queryset(self): return self.queryset.filter(**{self.filter_field: id}) +class ProjectDetailView(generics.RetrieveAPIView): + queryset = Project.objects.all() + serializer_class = ProjectDetailSerializer + + class ProjectViewSet(UserQuerysetOrPublicMixin, viewsets.ReadOnlyModelViewSet): queryset = Project.objects.all() serializer_class = ProjectCommuneSerializer diff --git a/project/charts/AnnualArtifChart.py b/project/charts/AnnualArtifChart.py index 36474c731..5fc933880 100644 --- a/project/charts/AnnualArtifChart.py +++ b/project/charts/AnnualArtifChart.py @@ -1,6 +1,9 @@ from project.charts.base_project_chart import ProjectChart from project.charts.constants import ( + ARTIFICIALISATION_COLOR, + ARTIFICIALISATION_NETTE_COLOR, DEFAULT_VALUE_DECIMALS, + DESARTIFICIALISATION_COLOR, LANG_MISSING_OCSGE_DIFF_ARTIF, ) @@ -69,10 +72,10 @@ def get_series(self): def add_series(self): series = self.get_series() - self.add_serie(ARTIFICIALISATION, series[ARTIFICIALISATION], color="#ff0000") - self.add_serie(RENATURATION, series[RENATURATION], color="#00ff00") + self.add_serie(ARTIFICIALISATION, series[ARTIFICIALISATION], color=ARTIFICIALISATION_COLOR) + self.add_serie(RENATURATION, series[RENATURATION], color=DESARTIFICIALISATION_COLOR) self.add_serie( NET_ARTIFICIALISATION, series[NET_ARTIFICIALISATION], - color="#0000ff", + color=ARTIFICIALISATION_NETTE_COLOR, ) diff --git a/project/charts/AnnualConsoByDeterminantChart.py b/project/charts/AnnualConsoByDeterminantChart.py index 44051499a..868315564 100644 --- a/project/charts/AnnualConsoByDeterminantChart.py +++ b/project/charts/AnnualConsoByDeterminantChart.py @@ -2,6 +2,7 @@ from project.charts.constants import ( CEREMA_CREDITS, DEFAULT_VALUE_DECIMALS, + HIGHLIGHT_COLOR, LEGEND_NAVIGATION_EXPORT, ) @@ -58,7 +59,7 @@ def add_series(self): self.project.get_conso_per_year(), **{ "type": "line", - "color": "#ff0000", + "color": HIGHLIGHT_COLOR, "dashStyle": "ShortDash", }, ) diff --git a/project/charts/AnnualConsoChart.py b/project/charts/AnnualConsoChart.py index e42bdef57..2f548573b 100644 --- a/project/charts/AnnualConsoChart.py +++ b/project/charts/AnnualConsoChart.py @@ -4,6 +4,7 @@ DEFAULT_HEADER_FORMAT, DEFAULT_POINT_FORMAT, DEFAULT_VALUE_DECIMALS, + HIGHLIGHT_COLOR, LEGEND_NAVIGATION_EXPORT, ) from public_data.models import AdminRef @@ -55,7 +56,7 @@ def add_series(self): self.project.get_conso_per_year(), **{ "type": "line", - "color": "#ff0000", + "color": HIGHLIGHT_COLOR, "dashStyle": "ShortDash", }, ) diff --git a/project/charts/ArtifProgressionByCouvertureChart.py b/project/charts/ArtifProgressionByCouvertureChart.py index 08348d955..06d047893 100644 --- a/project/charts/ArtifProgressionByCouvertureChart.py +++ b/project/charts/ArtifProgressionByCouvertureChart.py @@ -4,8 +4,10 @@ from project.charts.base_project_chart import ProjectChart from project.charts.constants import ( + ARTIFICIALISATION_COLOR, DEFAULT_HEADER_FORMAT, DEFAULT_VALUE_DECIMALS, + DESARTIFICIALISATION_COLOR, LANG_MISSING_OCSGE_DIFF_ARTIF, LEGEND_NAVIGATION_EXPORT, OCSGE_CREDITS, @@ -89,6 +91,7 @@ def add_series(self, *args, **kwargs) -> None: } for item in self.get_series() ], + "color": ARTIFICIALISATION_COLOR, } ) self.chart["series"].append( @@ -101,6 +104,7 @@ def add_series(self, *args, **kwargs) -> None: } for item in self.get_series() ], + "color": DESARTIFICIALISATION_COLOR, } ) diff --git a/project/charts/ArtifWaterfallChart.py b/project/charts/ArtifWaterfallChart.py index 367245f35..b559cb2fe 100644 --- a/project/charts/ArtifWaterfallChart.py +++ b/project/charts/ArtifWaterfallChart.py @@ -1,6 +1,9 @@ from project.charts.base_project_chart import ProjectChart from project.charts.constants import ( + ARTIFICIALISATION_COLOR, + ARTIFICIALISATION_NETTE_COLOR, DEFAULT_VALUE_DECIMALS, + DESARTIFICIALISATION_COLOR, LANG_MISSING_OCSGE_DIFF_ARTIF, OCSGE_CREDITS, ) @@ -57,17 +60,17 @@ def add_series(self): { "name": "Artificialisation", "data": total_artif_data, - "color": "#ff0000", + "color": ARTIFICIALISATION_COLOR, }, { "name": "Désartificialisation", "data": total_desartif_data, - "color": "#00ff00", + "color": DESARTIFICIALISATION_COLOR, }, { "name": "Artificialisation nette", "data": artif_nette_data, - "color": "#0000ff", + "color": ARTIFICIALISATION_NETTE_COLOR, }, ] diff --git a/project/charts/CouvertureProgressionChart.py b/project/charts/CouvertureProgressionChart.py index 36a3f3b8f..28a4f84ae 100644 --- a/project/charts/CouvertureProgressionChart.py +++ b/project/charts/CouvertureProgressionChart.py @@ -1,6 +1,7 @@ from project.charts.base_project_chart import ProjectChart from project.charts.constants import ( DEFAULT_VALUE_DECIMALS, + HIGHLIGHT_COLOR, LANG_MISSING_OCSGE_DIFF_ARTIF, OCSGE_CREDITS, ) @@ -25,7 +26,7 @@ def param(self): "lang": LANG_MISSING_OCSGE_DIFF_ARTIF, "yAxis": { "title": {"text": "Surface (en ha)"}, - "plotLines": [{"value": 0, "width": 2, "color": "#ff0000"}], + "plotLines": [{"value": 0, "width": 2, "color": HIGHLIGHT_COLOR}], }, "tooltip": { "pointFormat": "{point.y}", diff --git a/project/charts/SurfaceChart.py b/project/charts/SurfaceChart.py index 20b74de31..58faa933f 100644 --- a/project/charts/SurfaceChart.py +++ b/project/charts/SurfaceChart.py @@ -4,6 +4,7 @@ DEFAULT_HEADER_FORMAT, DEFAULT_POINT_FORMAT, DEFAULT_VALUE_DECIMALS, + HIGHLIGHT_COLOR, LEGEND_NAVIGATION_EXPORT, ) @@ -29,7 +30,7 @@ def param(self): def get_options(self, serie_name): if serie_name == self.project.territory_name: - return {"color": "#ff0000"} + return {"color": HIGHLIGHT_COLOR} else: return super().get_options(serie_name) diff --git a/project/charts/constants.py b/project/charts/constants.py index 59f86ceb9..be5d368c3 100644 --- a/project/charts/constants.py +++ b/project/charts/constants.py @@ -86,3 +86,8 @@ def missing_ocsge_diff_message(missing_indicateur: str) -> str: } LEGEND_NAVIGATION_EXPORT = {"enabled": False} + +ARTIFICIALISATION_COLOR = "#fa4b42" +DESARTIFICIALISATION_COLOR = "#00e272" +ARTIFICIALISATION_NETTE_COLOR = "#6a6af4" +HIGHLIGHT_COLOR = "#fa4b42" diff --git a/project/models/project_base.py b/project/models/project_base.py index 44c5f9f51..0853af806 100644 --- a/project/models/project_base.py +++ b/project/models/project_base.py @@ -75,7 +75,7 @@ class Status(models.TextChoices): ) name = models.CharField("Nom", max_length=100, validators=[is_alpha_validator]) - @cached_property + @property def combined_emprise(self) -> MultiPolygon: """Return a combined MultiPolygon of all emprises.""" combined = self.emprise_set.aggregate(Union("mpoly")) @@ -792,7 +792,7 @@ def get_look_a_like_pop_change_per_year( } def get_absolute_url(self): - return reverse("project:detail", kwargs={"pk": self.pk}) + return reverse("project:home", kwargs={"pk": self.pk}) def get_artif_area(self): """Return artificial surface total for all city inside diagnostic""" @@ -1137,7 +1137,11 @@ def get_arbitrary_comparison_lands(self) -> QuerySet[Departement] | QuerySet[Reg return AdminRef.get_class(name=self.land_type).objects.filter(source_id__in=comparison_source_ids) def get_neighbors(self): - return AdminRef.get_class(self.land_type).objects.filter(mpoly__touches=self.combined_emprise) + return ( + AdminRef.get_class(self.land_type) + .objects.filter(mpoly__intersects=self.combined_emprise.buffer(0.0001)) + .exclude(id=int(self.land_id)) + ) def get_comparison_lands( self, limit=9 @@ -1151,9 +1155,8 @@ def get_comparison_lands( return (self.get_arbitrary_comparison_lands() or self.get_neighbors()).order_by("name")[:limit] def comparison_lands_and_self_land(self) -> list[Land]: - return [self.land_proxy] + [ - Land(public_key=f"{land.land_type}_{land.id}") for land in self.get_comparison_lands() - ] + look_a_likes = self.get_look_a_like() + return [self.land_proxy] + look_a_likes def get_matrix(self, sol: Literal["couverture", "usage"] = "couverture"): if sol == "usage": diff --git a/project/serializers.py b/project/serializers.py index b6d10f72b..cbdbb0359 100644 --- a/project/serializers.py +++ b/project/serializers.py @@ -1,11 +1,27 @@ from rest_framework import serializers from rest_framework_gis import serializers as gis_serializers +from project.models import Project from public_data.models import Commune, CommuneDiff from .models import Emprise +class ProjectDetailSerializer(serializers.ModelSerializer): + class Meta: + model = Project + fields = [ + "id", + "created_date", + "level_label", + "analyse_start_date", + "analyse_end_date", + "territory_name", + "ocsge_coverage_status", + "has_zonage_urbanisme", + ] + + class EmpriseSerializer(gis_serializers.GeoFeatureModelSerializer): class Meta: fields = ( diff --git a/project/static/project/css/project.css b/project/static/project/css/project.css deleted file mode 100644 index e504df8d3..000000000 --- a/project/static/project/css/project.css +++ /dev/null @@ -1,131 +0,0 @@ -@charset "UTF-8"; - -.rounded-5 { - border-radius: 0.5rem; -} - -.box { - box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); - border-radius: 0.5rem !important; - background-color: rgb(255, 255, 255); - margin-top: 4rem; - position: relative; -} - -.box-alert { - background-color: rgb(255, 243, 205); - color: rgb(102, 77, 3); -} - -.scrollme-x { - overflow-x: auto; -} - -.box h3 { - margin-top: 1rem; - font-size: 1.35em; - font-weight: 700; - margin-bottom: 2rem; -} - -.box tr:hover { - background-color: rgb(241, 250, 255); - color: rgb(0, 59, 117) !important; -} - -.list-item { - background-color: rgb(255, 255, 255); - height: 2rem; - border-radius: 0.5rem; - border: 1px solid #fff !important; -} - -.list-item:hover { - background-color: rgb(242, 245, 255); - border: 1px solid #dee2e6 !important; -} - -.grid-item { - width: 300px; -} - -.grid-item--width2 { - width: 600px; -} - -.card-title { - margin-bottom: 0.5rem; - font-weight: bold; -} - -.bg-light-blue { - background-color: rgb(242, 245, 255); -} - -.grab { - cursor: move; - cursor: grab; - cursor: -moz-grab; - cursor: -webkit-grab; -} - -.grab:active { - cursor: grabbing; - cursor: -moz-grabbing; - cursor: -webkit-grabbing; -} - -.city-group { - box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); - width: 300px; - overflow-y: hidden; - float: left !important; - margin: 15px; -} - -.city-group>.card-body { - max-height: 600px; - overflow-y: auto; -} - -#detail_artif_chart { - height: 250px; -} - -#group-model { - display: none; -} - -.plotband_blue{ - fill: rgba(149, 206, 255, 0.1); - color: rgb(149, 206, 255); -} - -.plotband_green{ - fill: rgba(169, 255, 150, 0.1); - color: rgb(135, 204, 120); -} - -.plotband_orange{ - fill: rgba(255, 188, 117, 0.1); - color: rgb(255, 188, 117); -} - -.plotband_pink{ - fill: rgba(255, 117, 153, 0.1); - color: rgb(255, 117, 153); -} - -.plotband_violet{ - fill: rgba(153, 158, 255, 0.1); - color: rgb(153, 158, 255); -} - -.plotband_gray { - fill: rgba(92, 92, 97, 0.1); - color: rgb(92, 92, 97); -} - -.dotted { - text-decoration: underline dotted; -} diff --git a/project/static/project/styles/dashboard.css b/project/static/project/styles/dashboard.css new file mode 100644 index 000000000..7abcbfa38 --- /dev/null +++ b/project/static/project/styles/dashboard.css @@ -0,0 +1,29 @@ +#react-root { + min-height: 100vh; + display: flex; + flex-direction: column; +} + +.custom-badge { + font-size: 0.8em; + font-weight: 400; + background: #e3e3fd; + color: #313178; + text-transform: none; +} + +.comparison_land_title { + font-weight: 500; +} + +.comparison_land_details { + font-size: 0.8em; + color: #a1a1f8; + display: flex; + justify-content: space-between; + width: 100%; +} + +.comparison_land_item { + border-bottom: 1px solid #EEF2F7; +} diff --git a/project/tasks/project.py b/project/tasks/project.py index 072332116..9866e738c 100644 --- a/project/tasks/project.py +++ b/project/tasks/project.py @@ -176,7 +176,7 @@ def send_email_request_bilan(request_id) -> None: return request = Request.objects.get(pk=request_id) diagnostic = request.project - project_url = get_url_with_domain(reverse("project:detail", args=[diagnostic.id])) + project_url = get_url_with_domain(reverse("project:home", args=[diagnostic.id])) relative_url = get_url_with_domain(reverse("admin:project_request_change", kwargs={"object_id": request.id})) image_url = "https://creative-assets.mailinblue.com/editor/image_placeholder.png" if diagnostic.cover_image: diff --git a/project/templates/project/add_look_a_like.html b/project/templates/project/add_look_a_like.html deleted file mode 100644 index 7bd8feb56..000000000 --- a/project/templates/project/add_look_a_like.html +++ /dev/null @@ -1,66 +0,0 @@ -{% extends "index.html" %} - -{% load static %} -{% load crispy_forms_tags %} - -{% block pagetitle %} -Ajouter un territoire de comparaison -{% endblock %} - -{% block headers %} -{% endblock %} - -{% block content %} -
    -
    - -

    Ajouter un territoire de comparaison - -

    - -
    - {% csrf_token %} - -
    -
    - - -
    -
    - - -
    - {% if results %} -

    Résultats

    - - {% for land, data in results.items %} - {% if data %} -
    -
    - {{ land }} {{ data|length }} - - -
    -
    -
    - {% for result in data %} -
    - - {{ result.name }} {% if result.insee %}({{ result.insee }}){% endif %} -
    - {% endfor %} -
    -
    -
    - {% endif %} - {% endfor %} - {% else %} -

    Renseigner le début du nom du territoire rechercher.

    - {% endif %} -
    - -
    -
    -{% endblock %} diff --git a/project/templates/project/partials/artif_detail_couv_chart.html b/project/templates/project/components/charts/artif_detail_couv_chart.html similarity index 99% rename from project/templates/project/partials/artif_detail_couv_chart.html rename to project/templates/project/components/charts/artif_detail_couv_chart.html index ebc67bd08..80f6836ef 100644 --- a/project/templates/project/partials/artif_detail_couv_chart.html +++ b/project/templates/project/components/charts/artif_detail_couv_chart.html @@ -26,7 +26,7 @@ - +
    {% display_chart 'couv_artif_sol' couv_artif_sol CSP_NONCE %} @@ -56,7 +56,7 @@ - +
    {% display_chart 'detail_couv_artif_chart' detail_couv_artif_chart CSP_NONCE %} diff --git a/project/templates/project/partials/artif_detail_usage_chart.html b/project/templates/project/components/charts/artif_detail_usage_chart.html similarity index 99% rename from project/templates/project/partials/artif_detail_usage_chart.html rename to project/templates/project/components/charts/artif_detail_usage_chart.html index 58f127119..361838b29 100644 --- a/project/templates/project/partials/artif_detail_usage_chart.html +++ b/project/templates/project/components/charts/artif_detail_usage_chart.html @@ -27,7 +27,7 @@ - +
    {% display_chart 'usage_artif_sol' usage_artif_sol CSP_NONCE %} @@ -57,7 +57,7 @@ - +
    {% display_chart 'detail_usage_artif_chart' detail_usage_artif_chart CSP_NONCE %} diff --git a/project/templates/project/partials/artif_net_chart.html b/project/templates/project/components/charts/artif_net_chart.html similarity index 98% rename from project/templates/project/partials/artif_net_chart.html rename to project/templates/project/components/charts/artif_net_chart.html index 31edc5e09..eb2b872f6 100644 --- a/project/templates/project/partials/artif_net_chart.html +++ b/project/templates/project/components/charts/artif_net_chart.html @@ -23,7 +23,7 @@ - +
    diff --git a/project/templates/project/partials/artif_zone_urba.html b/project/templates/project/components/charts/artif_zone_urba.html similarity index 96% rename from project/templates/project/partials/artif_zone_urba.html rename to project/templates/project/components/charts/artif_zone_urba.html index a8b1edfba..187f127b4 100644 --- a/project/templates/project/partials/artif_zone_urba.html +++ b/project/templates/project/components/charts/artif_zone_urba.html @@ -55,13 +55,13 @@

    Détails de l'artificialisation entre {{ diagnostic.first_year_ocsge|stringf

    Grandes familles de couverture des sols des surfaces artificialisées

    -
    +

    Grandes familles d'usages du sol des surfaces artificialisées

    -
    +
    diff --git a/project/templates/project/partials/report_target_2031_graphic.html b/project/templates/project/components/charts/report_target_2031_graphic.html similarity index 68% rename from project/templates/project/partials/report_target_2031_graphic.html rename to project/templates/project/components/charts/report_target_2031_graphic.html index 13255bdf1..eb994c615 100644 --- a/project/templates/project/partials/report_target_2031_graphic.html +++ b/project/templates/project/components/charts/report_target_2031_graphic.html @@ -1,36 +1,17 @@ {% load highcharts_tags %} -
    -
    +
    +
    - - - + {% include "project/components/widgets/chart_buttons.html" with chart="target_2031_chart" %}
    -
    -
    +
    +
    @@ -98,12 +79,4 @@
    Données
    -{% display_chart 'target_2031_chart' target_2031_chart CSP_NONCE %} - -{% if reload_kpi %} - {{ diagnostic.target_2031 }} - {{ total_2020|floatformat:1 }} - {{ annual_2020|floatformat:1 }} - {{ conso_2031|floatformat:1 }} - {{ annual_objective_2031|floatformat:1 }} -{% endif %} +{% display_chart_data 'target_2031_chart' target_2031_chart CSP_NONCE %} diff --git a/project/templates/project/components/dashboard/artificialisation.html b/project/templates/project/components/dashboard/artificialisation.html new file mode 100644 index 000000000..89a7bda5e --- /dev/null +++ b/project/templates/project/components/dashboard/artificialisation.html @@ -0,0 +1,572 @@ +{% load static %} +{% load highcharts_tags %} +{% load project_tags %} + +
    +
    +
    +

    + + L’artificialisation présentée ne prend pas encore en compte + les seuils et les exceptions du décret du 27 novembre 2023. + +

    +

    + +

    + Nous travaillons actuellement à intégrer la + + méthode de calcul de l'artificialisation proposée par le portail de l'artificialisation + +

    +

    + Celle-ci prend en compte les seuils tels que définis par le decret du 27 novembre 2023. + Cependant cette méthode ne prend pas encore en compte les exceptions définies par le décret, + à savoir : les surfaces végétalisées à usage de parc ou jardin public, + quel que soit le type de couvert (boisé ou herbacé) qui pourront être considérées comme étant non artificialisées, + et les surfaces végétalisées sur lesquelles seront implantées des installations de panneaux photovoltaïques + qui respectent des conditions techniques garantissant qu'elles n'affectent pas durablement les fonctions + écologiques du sol ainsi que son potentiel agronomique. +

    +

    + Suite aux évolutions réglementaires de novembre 2023, la méthode de calcul proposée par le portail de + l'artificialisation est en version provisoire et donc susceptible d’évoluer en fonction des retours des utilisateurs. + Pour toute question ou suggestion, n’hésitez pas à contacter le Cerema directement : + pole-web@cerema.fr +

    + +

    +
    +
    +
    + +
    +

    Etat des lieux du territoire au dernier millésime

    + + Qu'est-ce qu'un millésime ? + + +
    +
    +
    +
    +

    {{ total_surface|floatformat:0 }} ha

    +

    Surface du territoire

    +
    +
    +
    +
    +

    {{ artif_area|floatformat:0 }} ha

    +

    + en {{ last_millesime }} +

    +
    +
    +
    +
    +

    {{ rate_artif_area|floatformat:0 }}%

    +

    Taux de surfaces artificialisées

    +
    +
    +
    +
    +
    + +
    +

    Evolution en volume de {{ first_millesime }} à {{ last_millesime }}

    +
    +
    +
    +

    {{ new_artif|floatformat:1 }} ha

    +

    + +

    +
    +
    +
    +
    +

    {{ new_natural|floatformat:1 }} ha

    +

    + +

    +
    +
    +
    +
    +

    {{ net_artif|floatformat:1 }} ha

    +

    + +

    + +
    +
    +
    +
    +

    {{ net_artif_rate|floatformat:1 }} %

    +

    + +

    +
    +
    +
    +
    + +
    +

    Aperçu de l'artificialisation

    + +

    Evolution de l'artificialisation entre {{ first_millesime }} et {{ last_millesime }}

    + +
    +
    +
    +
    + {% include "project/components/widgets/chart_buttons.html" with chart="chart_waterfall" %} +
    +
    +
    +
    +
    + {% url 'project:theme-my-artif' project.pk as dynamic_map_url %} + {% include "project/components/widgets/static_map.html" with dynamic_map_url=dynamic_map_url static_map=project.theme_map_understand_artif title="Carte comprendre l'artificialisation de son territoire" %} +
    +
    + +
    +
    +
    +
    + + Source de données: +

    + OCS GE +

    +
    + +
    +
    +
    Source
    +

    Données d'OCcupation des Sols à Grande Echelle (OCS GE) de l'IGN, sur la période d'analyse traduite grâce à la matrice de passage.

    + +
    Calcul
    +

    Artificialisation sur la période - désartificialisation sur la période.

    + +
    Données
    +
    +
    +
    +
    + + + + + + {% for period in headers_evolution_artif %} + + {% endfor %} + + + + {% for serie_name, data in table_evolution_artif.items %} + + + {% for period, val in data.items %} + + {% endfor %} + + {% endfor %} + +
    + Évolution de l'artificialisation sur le territoire entre {{ first_millesime }} et {{ last_millesime }} (en ha) +
    {{ period }} (Ha)
    {{ serie_name }}{{ val|floatformat:1 }}
    +
    +
    +
    +
    +
    +
    +
    +
    + +{% if not is_commune %} +
    +

    Artificialisation nette entre {{ first_millesime }} et {{ last_millesime }}

    + +
    +
    +
    +
    + + + {% include "project/components/widgets/chart_buttons.html" with chart="chart_comparison" %} +
    +
    +
    +
    +
    + {% url 'project:theme-city-artif' project.pk as dynamic_map_url %} + {% include "project/components/widgets/static_map.html" with dynamic_map_url=dynamic_map_url static_map=project.theme_map_artif title="Carte artificialisation des communes du territoire sur la période (en ha)" %} +
    +
    + +
    +
    +
    +
    + + Source de données: +

    + OCS GE +

    +
    + +
    +
    +
    Source
    +

    Données d'OCcupation des Sols à Grande Echelle (OCS GE) de l'IGN, sur la période d'analyse.

    + +
    Calcul
    +

    OCS GE traduite grâce à la matrice de passage.

    + +
    Données
    +
    +
    +
    +
    + + + + + + + {% for period in table_artif_net_periods %} + + + + {% endfor %} + + + + + {% for record in table_artif_net_records %} + + + + {% for period in record.periods %} + + + + {% endfor %} + + + {% endfor %} + +
    + Artificialisation nette sur le territoire entre {{ first_millesime }} et {{ last_millesime }} (en ha) +
    Surface (en ha)Artificialisation ({{ period }})Désartificialisation ({{ period }})Artificialisation nette ({{ period }})% d'artificialisation nette total
    {{ record.name }}{{ record.area|floatformat:1 }}{{ period.new_artif|floatformat:1 }}{{ period.new_natural|floatformat:1 }}{{ period.net_artif|floatformat:1 }}{{ record.net_artif_percentage|floatformat:2 }} %
    +
    +
    +
    +
    +
    +
    +
    +
    +{% endif %} + +
    +

    Détails de l'artificialisation entre {{ first_millesime }} et {{ last_millesime }}

    + +

    Grandes familles de couverture des sols des surfaces artificialisées

    + +
    +
    +
    +
    + {% include "project/components/widgets/chart_buttons.html" with chart="couv_artif_sol" %} + +
    +
    +
    +
    +
    +
    +
    + {% include "project/components/widgets/chart_buttons.html" with chart="detail_couv_artif_chart" %} + +
    +
    +
    +
    +
    + +
    +
    +
    +
    + + Source de données: +

    + OCS GE +

    +
    + +
    +
    +
    Source
    +

    Données d'OCcupation des Sols à Grande Echelle (OCS GE) de l'IGN, sur la période d'analyse (millésime min : {{ project.first_year_ocsge }}, millésime max : {{ project.last_year_ocsge }}).

    + +
    Calcul
    +

    OCS GE traduite grâce à la matrice de passage.

    + +
    Exemple de lecture
    +

    Il y a eu 7.5 ha de nouvelles Zones non bâties représentant 10% de la surface de toutes les nouvelles surfaces artificialisées et 2 ha d'anciennes Zones non bâties désartificialisées représentant 16% de la surface de toutes les zones désartificialisées.

    + +
    Données
    +

    En hectare (Ha).

    +
    +
    +
    +
    + + + + + + + + + + + + + + {% for couv in detail_couv_artif_table %} + + + + + + + + + {% endfor %} + + + + + + + + + +
    + Évolution de l'artificialisation par type de couverture sur le territoire de {{ first_millesime }} à {{ last_millesime }} (en ha et %) +
    Type de couvertureArtificialisation%Désartificialisation%Artificialisé en {{ last_millesime }}
    {{ couv.code_prefix }} {{ couv.label }}{{ couv.artif|floatformat:1 }}{{ couv.artif|percent:detail_total_artif }}{{ couv.renat|floatformat:1 }}{{ couv.renat|percent:detail_total_renat }}{{ couv.last_millesime|floatformat:1 }}
    Total{{ detail_total_artif|floatformat:1 }}100%{{ detail_total_renat|floatformat:1 }}100%{{ artif_area|floatformat:1 }}
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +

    Grandes familles d'usages du sol des surfaces artificialisées

    + +
    +
    +
    +
    + {% include "project/components/widgets/chart_buttons.html" with chart="usage_artif_sol" %} + +
    +
    +
    +
    +
    +
    +
    + {% include "project/components/widgets/chart_buttons.html" with chart="detail_usage_artif_chart" %} + +
    +
    +
    +
    +
    + +
    +
    +
    +
    + + Source de données: +

    + OCS GE +

    +
    + +
    +
    +
    Source
    +

    Données d'OCcupation des Sols à Grande Echelle (OCS GE) de l'IGN, sur la période d'analyse (millésime min : {{ project.first_year_ocsge }}, millésime max : {{ project.last_year_ocsge }}).

    + +
    Calcul
    +

    OCS GE traduite grâce à la matrice de passage.

    + +
    Données
    +

    En hectare (Ha).

    +
    +
    +
    +
    + + + + + + + + + + + + + + {% for item in detail_usage_artif_table %} + + + + + + + + + {% endfor %} + + + + + + + + + +
    + Évolution de l'artificialisation par type d'usage sur le territoire de {{ first_millesime }} à {{ last_millesime }} (en ha et %) +
    Type d'usageArtificialisation%Désartificialisation%Artificialisé en {{ last_millesime }}
    {{ item.code_prefix }} {{ item.label }}{{ item.artif|floatformat:1 }}{{ item.artif|percent:detail_total_artif }}{{ item.renat|floatformat:1 }}{{ item.renat|percent:detail_total_renat }}{{ item.last_millesime|floatformat:1 }}
    Total{{ detail_total_artif|floatformat:1 }}100%{{ detail_total_renat|floatformat:1 }}100%{{ artif_area|floatformat:1 }}
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + +{% display_chart_data 'detail_couv_artif_chart' detail_couv_artif_chart CSP_NONCE %} +{% display_chart_data 'couv_artif_sol' couv_artif_sol CSP_NONCE %} +{% display_chart_data 'detail_usage_artif_chart' detail_usage_artif_chart CSP_NONCE %} +{% display_chart_data 'usage_artif_sol' usage_artif_sol CSP_NONCE %} +{% display_chart_data 'chart_waterfall' chart_waterfall CSP_NONCE %} +{% if not is_commune %} + {% display_chart_data 'chart_comparison' chart_comparison CSP_NONCE %} +{% endif %} diff --git a/project/templates/project/components/dashboard/consommation.html b/project/templates/project/components/dashboard/consommation.html new file mode 100644 index 000000000..a003f92a6 --- /dev/null +++ b/project/templates/project/components/dashboard/consommation.html @@ -0,0 +1,500 @@ +{% load highcharts_tags %} +{% load sri %} + +
    +
    + {% include "project/components/widgets/statistic.html" with title=total_surface|floatformat:0|add:" ha" description="Surface du territoire" %} +
    +
    + {% include "project/components/widgets/statistic.html" with title=conso_period|floatformat:1|add:" ha" description="Consommation de "|add:project.analyse_start_date|add:" à "|add:project.analyse_end_date %} +
    +
    + +
    +

    Consommation d'espace annuelle sur le territoire

    + +
    +
    +
    +
    + {% include "project/components/widgets/chart_buttons.html" with chart="annual_total_conso_chart" %} + +
    +
    +
    +
    + {% if not is_commune %} +
    + {% url 'project:theme-city-conso' project.pk as dynamic_map_url %} + {% include "project/components/widgets/static_map.html" with dynamic_map_url=dynamic_map_url static_map=project.theme_map_conso title="Carte consommation d'espaces des communes du territoire sur la période (en ha)" %} +
    + {% endif %} +
    + +
    +
    +
    +
    + + Source de données: +

    + FICHIERS FONCIERS +

    +
    + +
    +
    +
    Source
    +

    + Données d'évolution des fichiers fonciers produits et diffusés par le Cerema depuis 2009 à + partir des fichiers MAJIC (Mise A Jour de l'Information Cadastrale) de la DGFIP. Le dernier + millésime de 2023 est la photographie du territoire au 1er janvier 2023, intégrant les évolutions + réalisées au cours de l'année 2022. + Pour plus d'informations sur "Qu'est-ce qu'un millésime ?". +

    +
    Calcul
    +

    Données brutes, sans calcul

    + +
    Données
    +
    +
    +
    +
    + + + + + + {% for year in project.years %} + + {% endfor %} + + + + + {% for item, data in annual_conso_data_table.items %} + + + {% for year, val in data.items %} + + {% endfor %} + + {% endfor %} + +
    + Consommation d'espace annuelle sur le territoire (en ha) +
    {{ year }}Total
    {{ item }}+{{ val|floatformat:1 }}
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +

    Destinations de la consommation d'espaces

    + +
    +
    +
    +
    + {% include "project/components/widgets/chart_buttons.html" with chart="pie_determinant" %} + +
    +
    +
    +
    +
    +
    +
    + {% include "project/components/widgets/chart_buttons.html" with chart="chart_determinant" %} + +
    +
    +
    +
    +
    + +
    +
    +
    +
    + + Source de données: +

    + FICHIERS FONCIERS +

    +
    + +
    +
    +
    Source
    +

    + Données d'évolution des fichiers fonciers produits et diffusés par le Cerema depuis 2009 à + partir des fichiers MAJIC (Mise A Jour de l'Information Cadastrale) de la DGFIP. Le dernier + millésime de 2023 est la photographie du territoire au 1er janvier 2023, intégrant les évolutions + réalisées au cours de l'année 2022. + Pour plus d'informations sur "Qu'est-ce qu'un millésime ?". +

    +

    + La ligne "inconnu" comprend les éléments dont la destination + n’est pas définie dans les fichiers fonciers. +

    +
    Calcul
    +

    Données brutes, sans calcul

    + +
    Données
    +
    +
    +
    +
    + + + + + + {% for year in project.years %} + + {% endfor %} + + + + + {% for determinant_name, data in data_determinant.items %} + + + {% for year, val in data.items %} + + {% endfor %} + + {% endfor %} + +
    + Consommation d'espace annuelle sur le territoire par destination (en ha) +
    Destination{{ year }}Total
    {{ determinant_name }}+{{ val|floatformat:1 }}
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +

    Comparaison avec les territoires similaires

    + +
    +

    + Par défaut, les territoires de comparaison incluent les territoires voisins. Vous pouvez en retirer ou en ajouter selon vos besoins. +

    + {% if project.look_a_like %} +
      + {% for land in project.get_look_a_like %} +
    • +
      + {% csrf_token %} + + + +
      +
    • + {% endfor %} +
    + {% else %} +

    Il n'y a aucun territoire de comparaison de configuré.

    + {% endif %} + +
    + +
    +
    + {% include "project/components/widgets/chart_buttons.html" with chart="comparison_chart" %} + +
    +
    +
    + +
    +
    +
    +
    + + Source de données: +

    + FICHIERS FONCIERS +

    +
    + +
    +
    +
    Source
    +

    + Données d'évolution des fichiers fonciers produits et diffusés par le Cerema depuis 2009 à + partir des fichiers MAJIC (Mise A Jour de l'Information Cadastrale) de la DGFIP. Le dernier + millésime de 2023 est la photographie du territoire au 1er janvier 2023, intégrant les évolutions + réalisées au cours de l'année 2022. + Pour plus d'informations sur "Qu'est-ce qu'un millésime ?". +

    +
    Calcul
    +

    Données brutes, sans calcul

    + +
    Données
    + {{ comparison_table }} +
    +
    +
    +
    + +
    +

    Consommation d'espaces rapportée à la surface du territoire

    + +
    +
    + {% include "project/components/widgets/chart_buttons.html" with chart="surface_chart" %} + +
    +
    +
    + +
    +
    +
    +
    + + Source de données: +

    + FICHIERS FONCIERS +

    +
    + +
    +
    +
    Source
    +

    + Données d'évolution des fichiers fonciers produits et diffusés par le Cerema depuis 2009 à + partir des fichiers MAJIC (Mise A Jour de l'Information Cadastrale) de la DGFIP. Le dernier + millésime de 2023 est la photographie du territoire au 1er janvier 2023, intégrant les évolutions + réalisées au cours de l'année 2022. + Pour plus d'informations sur "Qu'est-ce qu'un millésime ?". +

    +
    Calcul
    +

    Données brutes, sans calcul

    + +
    Données
    +
    +
    +
    +
    + + + + + + + + + + {% for city_name, data in surface_data_table.items %} + + + {% for year, val in data.items %} + + {% endfor %} + + {% endfor %} + +
    + Surface des territoires similaires (en ha) +
    Surface des territoires
    {{ city_name }}{{ val|floatformat:0 }} Ha
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    + {% include "project/components/widgets/chart_buttons.html" with chart="surface_proportional_chart" %} + +
    +
    +
    + +
    +
    +
    +
    + + Source de données: +

    + FICHIERS FONCIERS +

    +
    + +
    +
    +
    Source
    +

    + Données d'évolution des fichiers fonciers produits et diffusés par le Cerema depuis 2009 à + partir des fichiers MAJIC (Mise A Jour de l'Information Cadastrale) de la DGFIP. Le dernier + millésime de 2023 est la photographie du territoire au 1er janvier 2023, intégrant les évolutions + réalisées au cours de l'année 2022. + Pour plus d'informations sur "Qu'est-ce qu'un millésime ?". +

    +
    Calcul
    +

    + Pour chaque territoire, la consommation d'espace annuelle est multipliée par 1000 et divisée par + sa surface totale. Le résultat est exprimé en pour mille (‰). +

    + +
    Données
    + {{ surface_proportional_data_table }} +
    +
    +
    +
    + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    + +
    +
    +

    Ajouter un territoire de comparaison

    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +{% display_chart_data 'annual_total_conso_chart' annual_total_conso_chart CSP_NONCE %} +{% display_chart_data 'comparison_chart' comparison_chart CSP_NONCE %} +{% display_chart_data 'chart_determinant' determinant_per_year_chart CSP_NONCE %} +{% display_chart_data 'pie_determinant' determinant_pie_chart CSP_NONCE %} +{% display_chart_data 'surface_chart' surface_chart CSP_NONCE %} +{% display_chart_data 'surface_proportional_chart' surface_proportional_chart CSP_NONCE %} diff --git a/project/templates/project/components/dashboard/gpu.html b/project/templates/project/components/dashboard/gpu.html new file mode 100644 index 000000000..a8f3b1141 --- /dev/null +++ b/project/templates/project/components/dashboard/gpu.html @@ -0,0 +1,97 @@ +
    +

    Découvrez notre explorateur des zonages d'urbanisme

    +

    + Croisez les zonages d'urbanisme avec les données de l'OCS GE afin de comprendre l'artificialisation de votre territoire. +

    + + + +
    + +
    +

    Synthèse des zonages d'urbanisme

    + +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + {% for zone_type, zone in zone_list.items %} + + + + + + + + + {% endfor %} + +
    + Données synthèse des zonages d'urbanisme +
    Type de
    zone
    Nombre
    de zones
    Surface
    totale
    Surface
    artificielle ({{ last_year_ocsge }})
    Taux d'artificialisation
    ({{ last_year_ocsge }})
    Artificialisation
    ({{ first_year_ocsge }} à {{ last_year_ocsge }})
    {{ zone_type }}{{ zone.nb_zones }}{{ zone.total_area|floatformat:1 }} ha{{ zone.last_artif_area|floatformat:1 }} ha +
    +
    +
    {{ zone.fill_up_rate|floatformat:1 }}%
    +
    +
    {{ zone.new_artif|floatformat:1 }} ha
    +
    +
    +
    +
    + +

    Les types de zone d'après le Standard CNIG PLU v2022 - rev. octobre 2022: +
    U : zone urbaine +
    AUc : zone à urbaniser +
    AUs : zone à urbaniser bloquée +
    A : zone agricole +
    N : zone naturelle +

    +
    +
    + +
    + {% include "project/components/widgets/static_map.html" with static_map=diagnostic.theme_map_gpu title="Carte présentant les zonages d'urbanisme du territoire" %} +
    + +
    + +
    +
    +
    +
    + + Source de données: +

    + OCS GE +

    +
    + +
    +
    +
    Source
    +

    Données d'OCcupation des Sols à Grande Echelle (OCS GE) de l'IGN, sur la période d'analyse. Zonages d'Urbanisme issus du Géoportail de l'Urbanisme (GPU) en date de juin 2023: https://www.geoportail-urbanisme.gouv.fr/

    + +
    Calcul
    +

    Qualifier l'artificialisation de chaque parcelle OCS GE via la matrice d'artficialisation (consulter). Puis comparer la surface totale des parcelles artificialisées dans chaque zonage d'urbanisme à la surface de la zone pour connaître le taux d'occupation.

    +
    +
    +
    +
    diff --git a/project/templates/project/components/dashboard/impermeabilisation.html b/project/templates/project/components/dashboard/impermeabilisation.html new file mode 100644 index 000000000..adcb7bd18 --- /dev/null +++ b/project/templates/project/components/dashboard/impermeabilisation.html @@ -0,0 +1,199 @@ +{% load highcharts_tags %} +{% load static %} + +
    +

    Evolution de l'imperméabilisation entre {{ first_millesime }} et {{ last_millesime }}

    + +
    +
    +
    +
    + {% include "project/components/widgets/chart_buttons.html" with chart="imper_nette_chart" %} +
    +
    +
    +
    +
    + +
    +
    +
    +
    + + Source de données: +

    + OCS GE +

    +
    + +
    +
    +
    Source
    +

    Données d'OCcupation des Sols à Grande Echelle (OCS GE) de l'IGN, sur la période d'analyse traduite grâce à la matrice de passage.

    + +
    Calcul
    +

    Imperméabilisation nette = Imperméabilisation sur la période - Désimperméabilisation sur la période.

    + +
    Données
    + {{ imper_nette_data_table }} +
    +
    +
    +
    + + +
    +

    Détails de l'Imperméabilisation entre {{ first_millesime }} et {{ last_millesime }}

    + +

    Familles de couverture des sols des surfaces imperméabilisées

    + +
    +
    +
    +
    + {% include "project/components/widgets/chart_buttons.html" with chart="imper_repartition_couv_chart" %} + +
    +
    +
    +
    +
    +
    +
    + {% include "project/components/widgets/chart_buttons.html" with chart="imper_progression_couv_chart" %} + +
    +
    +
    +
    +
    + +
    +
    +
    +
    + + Source de données: +

    + OCS GE +

    +
    + +
    +
    +
    Source
    +

    Données d'OCcupation des Sols à Grande Echelle (OCS GE) de l'IGN, sur la période d'analyse (millésime min : {{ project.first_year_ocsge }}, millésime max : {{ project.last_year_ocsge }}).

    + +
    Calcul
    +

    OCS GE traduite grâce à la matrice de passage.

    + +
    Exemple de lecture
    +

    Il y a eu 7.5 ha de nouvelles Zones non bâties représentant 10% de la surface de toutes les nouvelles surfaces imperméabilisées et 2 ha d'anciennes Zones non bâties désimperméabilisée représentant 16% de la surface de toutes les zones désimperméabilisées.

    + +
    Données
    +

    En hectare (ha).

    + {{ imper_progression_couv_data_table }} +
    +
    +
    +
    + +
    +

    Grandes familles d'usages du sol des surfaces imperméabilisées

    + +
    +
    +
    +
    + {% include "project/components/widgets/chart_buttons.html" with chart="imper_repartition_usage_chart" %} + +
    +
    +
    +
    +
    +
    +
    + {% include "project/components/widgets/chart_buttons.html" with chart="imper_progression_usage_chart" %} + +
    +
    +
    +
    +
    + +
    +
    +
    +
    + + Source de données: +

    + OCS GE +

    +
    + +
    +
    +
    Source
    +

    Données d'OCcupation des Sols à Grande Echelle (OCS GE) de l'IGN, sur la période d'analyse (millésime min : {{ project.first_year_ocsge }}, millésime max : {{ project.last_year_ocsge }}).

    + +
    Calcul
    +

    OCS GE traduite grâce à la matrice de passage.

    + +
    Données
    +

    En hectare (ha).

    + {{ imper_progression_usage_data_table }} +
    +
    +
    +
    + + + + + + + + +{% display_chart_data 'imper_nette_chart' imper_nette_chart CSP_NONCE %} +{% display_chart_data 'imper_progression_couv_chart' imper_progression_couv_chart CSP_NONCE %} +{% display_chart_data 'imper_repartition_couv_chart' imper_repartition_couv_chart CSP_NONCE %} +{% display_chart_data 'imper_progression_usage_chart' imper_progression_usage_chart CSP_NONCE %} +{% display_chart_data 'imper_repartition_usage_chart' imper_repartition_usage_chart CSP_NONCE %} diff --git a/project/templates/project/components/dashboard/ocsge.html b/project/templates/project/components/dashboard/ocsge.html new file mode 100644 index 000000000..c72dcafe5 --- /dev/null +++ b/project/templates/project/components/dashboard/ocsge.html @@ -0,0 +1,352 @@ +{% load highcharts_tags %} +{% load project_tags %} +{% load sri %} + +
    +

    Couverture du sol

    +

    Répartition

    + +
    +
    +
    +
    + {% include "project/components/widgets/chart_buttons.html" with chart="chart_couv_pie" %} +
    +
    +
    +
    +
    +
    +
    + {% include "project/components/widgets/chart_buttons.html" with chart="chart_couv_prog" %} +
    +
    +
    +
    +
    + +
    +
    +
    +
    + + Source de données: +

    + OCS GE +

    +
    + +
    +
    +
    Source
    +

    Données d'Occupation des Sols à Grande Echelle (OCS GE) de l'IGN, sur la période d'analyse traduite grâce à la matrice de passage.

    + +
    Calcul
    +

    Données brutes, sans calcul.

    + +
    Données
    + Progression de {{ first_millesime }} à {{ last_millesime }} +
    +
    +
    +
    + + + + + + + + + + + + + + {% for item in couv_progression_chart.get_series %} + + + + + + + + + {% endfor %} + +
    + Évolution de la couverture des sols sur le territoire de {{ first_millesime }} à {{ last_millesime }} +
    CodeLibelléSurface {{ first_millesime }} (ha)Evolution (ha)Surface {{ last_millesime }} (ha)Surface {{ last_millesime }} (%)
    {{ item.level|space }} {{ item.code }}{{ item.get_label_short }}{{ item.surface_first|floatformat:1 }} + {% if item.surface_diff > 0 %}+{% endif %}{{ item.surface_diff|floatformat:1 }} + {{ item.surface_last|floatformat:1 }}{{ item.surface_last|percent:surface_territory }}
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +

    Matrice de passage de {{ first_millesime }} à {{ last_millesime }} :

    + +
    +
    + {% include "project/components/widgets/chart_buttons.html" with chart="chart_couv_wheel" %} +
    +
    +
    + +
    +
    +
    +
    + + Source de données: +

    + OCS GE +

    +
    + +
    +
    +
    Source
    +

    Données d'OCcupation des Sols à Grande Echelle (OCS GE) de l'IGN, sur la période d'analyse traduite grâce à la matrice de passage.

    + +
    Calcul
    +

    Données brutes, sans calcul.

    + +
    Données
    +

    En hectare (Ha).

    +

    Les lignes indiquent la couverture {{ first_millesime }} et les colonnes indiquent la couverture {{ last_millesime }}. Par conséquent, à l'intersection se trouve la superficie qui est passée d'une couverture l'autre.

    +
    +
    +
    +
    + + + + + + {% for header in couv_matrix_headers %} + + {% endfor %} + + + + + {% for name, data in couv_matrix_data.items %} + + + {% for title, val in data.items %} + + {% endfor %} + + {% endfor %} + +
    + Matrice d'évolution de la couverture des sols sur le territoire de {{ first_millesime }} à {{ last_millesime }} (en ha) +
    + + {{ header.code }} + + Total
    + {% if name.code %} + + {{ name.code }} {{ name.label_short }} + + {% else %} + Total + {% endif %} + + + {{ val|floatformat:1 }} + +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +

    Usage du sol

    +

    Répartition

    + +
    +
    +
    +
    + {% include "project/components/widgets/chart_buttons.html" with chart="chart_usa_pie" %} +
    +
    +
    +
    +
    +
    +
    + {% include "project/components/widgets/chart_buttons.html" with chart="chart_usa_prog" %} +
    +
    +
    +
    +
    + +
    +
    +
    +
    + + Source de données: +

    + OCS GE +

    +
    + +
    +
    +
    Source
    +

    Données d'Occupation des Sols à Grande Echelle (OCS GE) de l'IGN, sur la période d'analyse traduite grâce à la matrice de passage.

    + +
    Calcul
    +

    Données brutes, sans calcul.

    + +
    Données
    + Progression de {{ first_millesime }} à {{ last_millesime }} +
    +
    +
    +
    + + + + + + + + + + + + + + {% for item in usa_progression_chart.get_series %} + + + + + + + + + {% endfor %} + +
    + Évolution de l'usage des sols sur le territoire de {{ first_millesime }} à {{ last_millesime }} +
    CodeLibelléSurface {{ first_millesime }} (ha)Evolution (ha)Surface {{ last_millesime }} (ha)Surface {{ last_millesime }} (%)
    {{ item.level|space }} {{ item.code }}{{ item.get_label_short }}{{ item.surface_first|floatformat:1 }} + {% if item.surface_diff > 0 %}+{% endif %}{{ item.surface_diff|floatformat:1 }} + {{ item.surface_last|floatformat:1 }}{{ item.surface_last|percent:surface_territory }}
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +

    Matrice de passage de {{ first_millesime }} à {{ last_millesime }} :

    + +
    +
    + {% include "project/components/widgets/chart_buttons.html" with chart="chart_usa_wheel" %} +
    +
    +
    + +
    +
    +
    +
    + + Source de données: +

    + OCS GE +

    +
    + +
    +
    +
    Source
    +

    Données d'Occupation des Sols à Grande Echelle (OCS GE) de l'IGN, sur la période d'analyse traduite grâce à la matrice de passage.

    + +
    Calcul
    +

    Artificialisation sur la période - désartificialisation sur la période.

    + +
    Données
    +

    En hectare (Ha).

    +

    Les lignes indiquent l'usage {{ first_millesime }} et les colonnes indiquent l'usage {{ last_millesime }}. Par conséquent, à l'intersection se trouve la superficie qui est passée d'une couverture l'autre.

    +
    +
    +
    +
    + + + + + + {% for header in usa_matrix_headers %} + + {% endfor %} + + + + + {% for name, data in usa_matrix_data.items %} + + + {% for title, val in data.items %} + + {% endfor %} + + {% endfor %} + +
    + Matrice d'évolution de l'usage des sols sur le territoire de {{ first_millesime }} à {{ last_millesime }} (en ha) +
    + + {{ header.code }} + + Total
    + {% if name.code %} + + {{ name.code }} {{ name.label_short }} + + {% else %} + Total + {% endif %} + + + {{ val|floatformat:1 }} + +
    +
    +
    +
    +
    +
    +
    +
    +
    + +{% display_chart_data 'chart_couv_pie' couv_pie_chart CSP_NONCE %} +{% display_chart_data 'chart_couv_prog' couv_progression_chart CSP_NONCE %} +{% display_chart_data 'chart_usa_pie' usa_pie_chart CSP_NONCE %} +{% display_chart_data 'chart_usa_prog' usa_progression_chart CSP_NONCE %} +{% display_chart_data 'chart_couv_wheel' couv_wheel_chart CSP_NONCE %} +{% display_chart_data 'chart_usa_wheel' usa_whell_chart CSP_NONCE %} diff --git a/project/templates/project/components/dashboard/rapport_local.html b/project/templates/project/components/dashboard/rapport_local.html new file mode 100644 index 000000000..4130ba5c1 --- /dev/null +++ b/project/templates/project/components/dashboard/rapport_local.html @@ -0,0 +1,183 @@ +{% load static %} + +
    +

    Objet du rapport triennal local de suivi de l’artificialisation des sols

    +
    +
    +

    Sur la décennie 2011-2021, 24 000 ha d’espaces naturels, agricoles et forestiers ont été consommés chaque année en moyenne en France, soit près de 5 terrains de football par heure. Les conséquences sont écologiques mais aussi socio-économiques.

    +
    +
    +

    La France s’est donc fixé, dans le cadre de la loi n° 2021-1104 du 22 août 2021 dite « Climat et résilience » complétée par la loi n° 2023-630 du 20 juillet 2023, l’objectif d’atteindre le « zéro artificialisation nette des sols » en 2050, avec un objectif intermédiaire de réduction de moitié de la consommation d’espaces NAF (Naturels, Agricoles et Forestiers) sur 2021-2031 par rapport à la décennie précédente.

    +

    Cette trajectoire progressive est à décliner territorialement dans les documents de planification et d’urbanisme.

    +

    Cette trajectoire est mesurée, pour la période 2021-2031, en consommation d’espaces NAF (Naturels, Agricoles et Forestiers), définie comme « la création ou l'extension effective d'espaces urbanisés sur le territoire concerné » (article 194, III, 5° de la loi Climat et résilience). Le bilan de consommation d'espaces NAF (Naturels, Agricoles et Forestiers) s'effectue à l'échelle d'un document de planification ou d'urbanisme.

    +

    A partir de 2031, cette trajectoire est également mesurée en artificialisation nette des sols, définie comme « le solde de l'artificialisation et de la désartificialisation des sols constatées sur un périmètre et sur une période donnés » (article L.101-2-1 du code de l’urbanisme). L'artificialisation nette des sols se calcule à l'échelle d'un document de planification ou d'urbanisme.

    +
    +
    +
    + +
    +

    Qui doit établir ce rapport ?

    +
    +
    +
    +
    +
    +
    +
    +

    + Les communes +

    +

    dotées d’un document d'urbanisme

    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +

    + Les établissements publics de coopération intercommunale +

    +

    dotés d’un document d'urbanisme

    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +

    + Les services déconcentrés de l’Etat (DDT) +

    +

    Pour les territoires soumis au règlement national d’urbanisme (RNU)

    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +

    L’enjeu est de mesurer et de communiquer régulièrement au sujet du rythme de l’artificialisation des sols, afin d’anticiper et de suivre la trajectoire et sa réduction. Ce rapport doit être présenté à l’organe délibérant, faire l’objet d’un débat et d’une délibération du conseil municipal ou communautaire, et de mesures de publicité. Le rapport est transmis dans un délai de quinze jours suivant sa publication aux préfets de région et de département, au président du conseil régional, au président de l’EPCI dont la commune est membre ou aux maires des communes membres de l’EPCI compétent ainsi qu’aux observatoires locaux de l’habitat et du foncier.

    +
    +
    + +
    +

    Quand doit être établi ce rapport et sur quelle période ?

    +
    +

    Le premier rapport doit être réalisé 3 ans après l'entrée en vigueur de la loi, soit en 2024.

    +

    A noter que c'est le rapport qui est triennal, et non la période à couvrir par le rapport :

    +
      +
    • Il faut que le rapport soit produit a minima tous les 3 ans. Il est donc possible pour une collectivité qui le souhaite, de produire un rapport, par exemple tous les ans ou tous les 2 ans.
    • +
    • La période à couvrir n'est pas précisée dans les textes. Étant donné que l’État met à disposition les données des fichiers fonciers depuis le 1er janvier 2011 (le début de la période de référence de la loi CR), il serait intéressant que le rapport présente la chronique des données du 1er janvier 2011 et jusqu'au dernier millésime disponible, pour apprécier la trajectoire du territoire concerné avec le recul nécessaire (les variations annuelles étant toujours à prendre avec prudence car pouvant refléter de simples biais méthodologiques dans les données sources).
    • +
    +
    +
    + +
    +

    Que doit contenir ce rapport ?

    +
    +

    Le contenu minimal obligatoire est détaillé à l’article R. 2231-1 du code général des collectivités territoriales:

    +
    +
    +
    +

    + 1° La consommation des espaces naturels, agricoles et forestiers, exprimée en nombre d'hectares, le cas échéant en la différenciant entre ces types d'espaces, et en pourcentage au regard de la superficie du territoire couvert. +

    +

    + Sur le même territoire, le rapport peut préciser également la transformation effective d'espaces urbanisés ou construits en espaces naturels, agricoles et forestiers du fait d'une désartificialisation. +

    +

    + Indicateur obligatoire. + Disponible sur Mon Diag Artif, France Métropolitaine, Corse et DROM (sauf Mayotte). +

    +
    +
    +
    +
    +
    +
    +
    +

    + 2° Le solde entre les surfaces artificialisées et les surfaces désartificialisées, +

    +

    + telles que définies dans la nomenclature annexée à l'article R. 101-1 du code de l'urbanisme. +

    +

    + Indicateur non obligatoire. + Disponible sur Mon Diag Artif, pour les territoires avec l'OCS GE. +

    +
    +
    +
    +
    +
    +
    +
    +

    + 3° Les surfaces dont les sols ont été rendus imperméables, +

    +

    + au sens des 1° et 2° de la nomenclature annexée à l'article R. 101-1 du code de l'urbanisme. +

    +

    + Indicateur non obligatoire. + Disponible sur Mon Diag Artif, pour les territoires avec l'OCS GE. +

    +
    +
    +
    +
    +
    +
    +
    +

    + 4° L'évaluation du respect des objectifs de réduction de la consommation d'espaces naturels, agricoles et forestiers et de lutte contre l'artificialisation des sols fixés dans les documents de planification et d'urbanisme. +

    +

    + Les documents de planification sont ceux énumérés au III de l'article R. 101-1 du code de l'urbanisme. +

    +

    + Indicateur non obligatoire. + Non prévu dans Mon Diag Artif. +

    +
    +
    +
    +
    +
    +

    Avant 2031, il n’est pas obligatoire de renseigner les indicateurs 2°, 3° et 4° tant que les documents d'urbanisme n'ont pas intégré cet objectif.

    +
    +
    +
    + +
    +

    Quelles sont les sources d’informations disponibles pour ce rapport ?

    +
    +

    Les données produites par l'observatoire national de l'artificialisation sont disponibles gratuitement.

    +

    MonDiagnosticArtificialisation vous propose une première trame de ce rapport triennal local, en s’appuyant sur les données de l’observatoire national disponibles à date, soit:

    +
      +
    • concernant la consommation d’espaces naturels, agricoles et forestiers, les données issues des fichiers fonciers produites annuellement par le Cerema ;
    • +
    • concernant l’artificialisation nette des sols, les données issues de l’occupation des sols à grande échelle (OCS GE) en cours de production par l’IGN, qui seront disponibles sur l’ensemble du territoire national d’ici fin 2025.
    • +
    +

    Il n'est, bien évidemment, pas demandé d'inventer des données non encore disponibles : pour le premier rapport triennal à produire d'ici août 2024 il est possible d'utiliser les fichiers fonciers au 1er janvier 2023, couvrant la consommation d'espaces NAF (Naturels, Agricoles et Forestiers) au titre de l'année 2022. La consommation d'espaces NAF (Naturels, Agricoles et Forestiers) au titre de l’année 2023 n’étant pas disponible à ce jour.

    +

    Il est également possible d’utiliser les données locales, notamment celles des observatoires de l’habitat et du foncier (art. L. 302-1 du code de la construction et de l'habitation) et de s'appuyer sur les analyses réalisées dans le cadre de l'évaluation du schéma de cohérence territoriale (ScoT – art. L. 143-28 du code de l'urbanisme) et de celle du plan local d'urbanisme (art. L. 153-27 du code de l’urbanisme).

    +

    Ces données locales doivent être conformes aux définitions légales de la consommation d'espaces (et le cas échéant de l'artificialisation nette des sols), homogènes et cohérentes sur la décennie de référence de la loi (1er janvier 2011-1er janvier 2021) et sur la décennie en cours (1er janvier 2021-1er janvier 2031).

    +
    +
    diff --git a/project/templates/project/components/dashboard/synthese.html b/project/templates/project/components/dashboard/synthese.html new file mode 100644 index 000000000..95173eae4 --- /dev/null +++ b/project/templates/project/components/dashboard/synthese.html @@ -0,0 +1,199 @@ +
    +

    Estimation de la trajectoire 2031

    +
    +
    +
    +

    +{{ objective_chart.total_2020|floatformat:1 }} ha

    +

    Bilan consommation d'espaces 2011-2020

    +
    +
    +
    +
    +

    +{{ objective_chart.conso_2031|floatformat:1 }} ha

    +

    Consommation cumulée de la période du 1er jan. 2021 au 31 déc. 2030 (10 ans) avec un objectif non-réglementaire de réduction de {{ diagnostic.target_2031 }}%

    +
    +
    +
    +
    +
    +
    +
    + + Source de données: +

    + FICHIERS FONCIERS +

    +
    + +
    +
    +
    Source
    +

    + Données d'évolution des fichiers fonciers produits et diffusés par le Cerema depuis 2009 à + partir des fichiers MAJIC (Mise A Jour de l'Information Cadastrale) de la DGFIP. Le dernier + millésime de 2023 est la photographie du territoire au 1er janvier 2023, intégrant les évolutions + réalisées au cours de l'année 2022. +

    +
    Calcul
    +

    La Loi Climat & Résilience recommande entre 2021 et 2031 à l'échelle régionale, de diviser par 2 la consommation d'espaces NAF (Naturels, Agricoles et Forestiers) mesurée entre 2011 et 2021 ; le même calcul a été appliqué à l'échelle du territoire comme scénario standard.

    +
    +
    +
    + +
    + +
    +

    Consommation

    +

    Bilan de la consommation d'espaces

    +
    +
    +
    +

    +{{ current_conso|floatformat:1 }} ha

    +

    Consommation d'espaces {{ diagnostic.analyse_start_date }}-{{ diagnostic.analyse_end_date }}

    +
    +
    +
    +
    +

    +{{ year_avg_conso|floatformat:1 }} ha

    +

    Consommation d'espaces moyenne par an entre {{ diagnostic.analyse_start_date }}-{{ diagnostic.analyse_end_date }}

    +
    +
    +
    +
    +
    +
    +
    + + Source de données: +

    + FICHIERS FONCIERS +

    +
    + +
    +
    +
    Source
    +

    + Données d'évolution des fichiers fonciers produits et diffusés par le Cerema depuis 2009 à + partir des fichiers MAJIC (Mise A Jour de l'Information Cadastrale) de la DGFIP. Le dernier + millésime de 2023 est la photographie du territoire au 1er janvier 2023, intégrant les évolutions + réalisées au cours de l'année 2022. +

    +
    Calcul
    +

    Les données du Cerema donnent la consommation d'espaces NAF (Naturels, Agricoles et Forestiers) par année, par destination et par commune.

    +
    +
    +
    + +
    + +{% if diagnostic.has_complete_uniform_ocsge_coverage %} +
    +

    Artificialisation

    +

    Bilan de l'artificialisation nette entre {{ diagnostic.analyse_start_date }} et {{ diagnostic.analyse_end_date }}

    +

    Objectif zéro artificialisation nette en 2050

    +

    Sur la période demandée, l'OCS GE couvre de {{ first_millesime }} à {{ last_millesime }}.

    +
    +
    +
    +

    {{ net_artif|floatformat:1 }} ha

    +

    Artificialisation nette sur la période

    +
    +
    +
    +
    +

    +{{ new_artif|floatformat:1 }} ha

    +

    Total artificialisation sur la période

    +
    +
    +
    +
    +

    +{{ new_natural|floatformat:1 }} ha

    +

    Total désartificialisation sur la période

    +
    +
    +
    +
    +
    +
    +
    + + Source de données: +

    + OCS GE +

    +
    + +
    +
    +
    Source
    +

    OCS GE (millésime min : {{ project.first_year_ocsge }}, millésime max : {{ project.last_year_ocsge }}).

    +
    Calcul
    +

    L'artificialisation nette = artificialisation - désartificialisation sur la période.

    +
    +
    +
    + +
    + +{% if project.has_zonage_urbanisme %} +
    +

    Croisement avec les zonages d'urbanisme

    +

    Artificialisation des zonages d'urbanisme selon les documents d'urbanisme en vigueur

    +

    Sur la période demandée, l'OCS GE couvre de {{ first_millesime }} à {{ last_millesime }}.

    +
    + {% for zone_type, zone in zone_list.items %} +
    +
    +

    +

    +
    +
    {{ zone.fill_up_rate|floatformat:1 }}%
    +
    +

    +

    + Taux d'artificialisation des zones {{ zone_type }} + ({{ zone.type_zone_label }}) +

    +

    + Surface Totale: {{ zone.total_area|floatformat:1 }} ha
    +

    +
    +
    + {% endfor %} +
    + +
    +
    +
    +
    + + Source de données: +

    + OCS GE +

    +
    + +
    +
    +
    Source
    +

    Données OCS GE (OCcupation des Sols à Grande Echelle) de l'IGN, sur la période d'analyse. Zonages d'Urbanisme issus du GPU (Géoportail de l'Urbanisme) en date de juin 2023: https://www.geoportail-urbanisme.gouv.fr/

    + +
    Calcul
    +

    Qualifier l'artificialisation de chaque parcelle OCS GE via la matrice d'artficialisation (consulter). Puis comparer la surface totale des parcelles artificialisées dans chaque zonage d'urbanisme à la surface de la zone pour connaître le taux d'occupation.

    +
    +
    +
    + +
    +{% endif %} +{% endif %} +
    diff --git a/project/templates/project/components/dashboard/trajectoires.html b/project/templates/project/components/dashboard/trajectoires.html new file mode 100644 index 000000000..4e96dc5b8 --- /dev/null +++ b/project/templates/project/components/dashboard/trajectoires.html @@ -0,0 +1,62 @@ +{% load static %} + +
    +
    +
    +

    Période de référence

    +
    +

    +{{ target_2031_chart.total_2020|floatformat:1 }} ha

    +

    +{{ target_2031_chart.annual_2020|floatformat:1 }} ha/an

    +
    +

    Consommation cumulée de la période du 1er jan. 2011 au 31 déc. 2020 (10 ans)

    +
    +
    + +
    +
    +

    Projection 2031

    +
    +

    +{{ conso_2031|floatformat:1 }} ha

    +

    +{{ annual_objective_2031|floatformat:1 }} ha/an

    +
    +

    Consommation cumulée de la période du 1er jan. 2021 au 31 déc. 2030 (10 ans) avec un objectif non-réglementaire de réduction de {{ diagnostic.target_2031 }}%

    +

    +
    +
    +
    + +
    + {% include "project/components/charts/report_target_2031_graphic.html" %} +
    + + + + + +{% block tagging %} + +{% endblock tagging %} diff --git a/project/templates/project/components/dashboard/update.html b/project/templates/project/components/dashboard/update.html new file mode 100644 index 000000000..84165edc0 --- /dev/null +++ b/project/templates/project/components/dashboard/update.html @@ -0,0 +1,29 @@ +{% load crispy_forms_tags %} + +
    +
    +
    +
    + {% csrf_token %} + {{ form|crispy }} +
    + + +
    + +
    +
    +
    +
    +
    +
    diff --git a/project/templates/project/components/forms/add_territoire_de_comparaison.html b/project/templates/project/components/forms/add_territoire_de_comparaison.html new file mode 100644 index 000000000..303d956eb --- /dev/null +++ b/project/templates/project/components/forms/add_territoire_de_comparaison.html @@ -0,0 +1,49 @@ +{% load crispy_forms_tags %} + +
    +
    + {% csrf_token %} +
    +
    + + +
    +
    + + {% if success_message %} + + {% endif %} + + {% if results %} +
    +

    Résultats

    + {% for result in results %} +
    +
    +
    + {{ result.name }} +

    {{result.land_type_label}}

    +
    + {% if result.insee %} +
    + Code INSEE: {{ result.insee }} +
    + {% endif %} + {% if result.area == 0 %} +
    Données indisponibles: Territoire supprimé en 2024
    + {% endif %} +
    +
    + {% csrf_token %} + + +
    +
    + {% endfor %} +
    + {% endif %} +
    diff --git a/project/templates/project/report_download.html b/project/templates/project/components/forms/report_download.html similarity index 88% rename from project/templates/project/report_download.html rename to project/templates/project/components/forms/report_download.html index d3de02f01..7281785fb 100644 --- a/project/templates/project/report_download.html +++ b/project/templates/project/components/forms/report_download.html @@ -9,15 +9,15 @@

    Votre demande a été prise en compte.

    {% if requested_document == 'rapport-complet' %} {% elif requested_document == 'rapport-conso' %} {% elif requested_document == 'rapport-local' %} {% endif %} {% else %} diff --git a/project/templates/project/partials/report_set_period.html b/project/templates/project/components/forms/report_set_period.html similarity index 55% rename from project/templates/project/partials/report_set_period.html rename to project/templates/project/components/forms/report_set_period.html index b09305458..1f65b3416 100644 --- a/project/templates/project/partials/report_set_period.html +++ b/project/templates/project/components/forms/report_set_period.html @@ -1,33 +1,16 @@ {% load crispy_forms_tags %} - - {% if success_message %} + + {% else %}
    {% csrf_token %} diff --git a/project/templates/project/partials/report_set_target_2031.html b/project/templates/project/components/forms/report_set_target_2031.html similarity index 70% rename from project/templates/project/partials/report_set_target_2031.html rename to project/templates/project/components/forms/report_set_target_2031.html index 251b5dbe2..a349436ee 100644 --- a/project/templates/project/partials/report_set_target_2031.html +++ b/project/templates/project/components/forms/report_set_target_2031.html @@ -6,13 +6,7 @@

    Votre objectif de réduction à 2031 a été mis à

    {% else %} @@ -27,7 +21,7 @@

    Votre objectif de réduction à 2031 a été mis à {% endif %} diff --git a/project/templates/project/components/widgets/chart_buttons.html b/project/templates/project/components/widgets/chart_buttons.html new file mode 100644 index 000000000..b05f21d9e --- /dev/null +++ b/project/templates/project/components/widgets/chart_buttons.html @@ -0,0 +1,14 @@ + + + \ No newline at end of file diff --git a/project/templates/project/components/widgets/fragment_splash_progress.html b/project/templates/project/components/widgets/fragment_splash_progress.html new file mode 100644 index 000000000..8f1018003 --- /dev/null +++ b/project/templates/project/components/widgets/fragment_splash_progress.html @@ -0,0 +1,4 @@ + +
    +
    Dernière mise à jour: {{ last_update|date:"H:i:s" }}
    +
    diff --git a/project/templates/project/components/widgets/static_map.html b/project/templates/project/components/widgets/static_map.html new file mode 100644 index 000000000..882e78c30 --- /dev/null +++ b/project/templates/project/components/widgets/static_map.html @@ -0,0 +1,22 @@ + diff --git a/project/templates/project/components/widgets/statistic.html b/project/templates/project/components/widgets/statistic.html new file mode 100644 index 000000000..dbe6feb21 --- /dev/null +++ b/project/templates/project/components/widgets/statistic.html @@ -0,0 +1,4 @@ +
    +

    {{ title }}

    +

    {{ description }}

    +
    \ No newline at end of file diff --git a/project/templates/project/create/advanced_search.html b/project/templates/project/create/advanced_search.html deleted file mode 100644 index 69b4d7882..000000000 --- a/project/templates/project/create/advanced_search.html +++ /dev/null @@ -1,192 +0,0 @@ -{% extends "index.html" %} - -{% load static %} -{% load crispy_forms_tags %} - -{% block pagetitle %} -Créer un diagnostic -{% endblock pagetitle %} - -{% block headers %} - -{% endblock headers %} - -{% block content %} -
    -
    - -

    Sélectionner un territoire à diagnostiquer

    - - - {% csrf_token %} - - - - - - -
    -
    -
    -

    Zone géographique:

    -
    -
    -
    Région:
    -
    {{ form.region }}
    -
    - {% if form.cleaned_data.region %} -
    -
    Département:
    -
    {{ form.departement }}
    -
    - {% endif %} - {% if form.cleaned_data.departement %} -
    -
    EPCI:
    -
    {{ form.epci }}
    -
    - {% endif %} -
    -
    -
    -

    Type de territoire:

    -
    - {{ form.search_commune }} - -
    -
    - {{ form.search_epci }} - -
    -
    - {{ form.search_scot }} - -
    -
    - {{ form.search_departement }} - -
    -
    - {{ form.search_region }} - -
    -
    -
    -
    - - - {% if results %} -

    Résultats

    - -
    - {% for land, data in results.items %} -
    -

    - - -

    -
    - -
    -
    - {% endfor %} -
    - {% endif %} - -
    -
    -{% endblock content %} - -{% block bodyend %} - -{% endblock bodyend %} diff --git a/project/templates/project/create/fragment_splash_progress.html b/project/templates/project/create/fragment_splash_progress.html deleted file mode 100644 index 203afa4cb..000000000 --- a/project/templates/project/create/fragment_splash_progress.html +++ /dev/null @@ -1,16 +0,0 @@ - -
    - -
    Dernière mise à jour: {{ last_update|date:"H:i:s" }}
    -
    diff --git a/project/templates/project/all_charts_for_preview.html b/project/templates/project/dev/all_charts_for_preview.html similarity index 100% rename from project/templates/project/all_charts_for_preview.html rename to project/templates/project/dev/all_charts_for_preview.html diff --git a/project/templates/project/rnu_package_notice.html b/project/templates/project/dev/rnu_package_notice.html similarity index 75% rename from project/templates/project/rnu_package_notice.html rename to project/templates/project/dev/rnu_package_notice.html index 3b6dc3108..5667cffc9 100644 --- a/project/templates/project/rnu_package_notice.html +++ b/project/templates/project/dev/rnu_package_notice.html @@ -2,8 +2,22 @@ {% sri_static "assets/styles/main.css" %} - + + + + + + + {% block pagetitle %}{{ page_title }}{% endblock %} + + + + + + + + +{% endblock headers %} + +{% block content %} +
    +
    +
    +

    Sélectionner un territoire à diagnostiquer

    + +
    + {% csrf_token %} + + + + + + +
    +
    +
    +

    Zone géographique:

    +
    +
    +
    Région:
    +
    {{ form.region }}
    +
    + {% if form.cleaned_data.region %} +
    +
    Département:
    +
    {{ form.departement }}
    +
    + {% endif %} + {% if form.cleaned_data.departement %} +
    +
    EPCI:
    +
    {{ form.epci }}
    +
    + {% endif %} +
    +
    +
    +

    Type de territoire:

    +
    + {{ form.search_commune }} + +
    +
    + {{ form.search_epci }} + +
    +
    + {{ form.search_scot }} + +
    +
    + {{ form.search_departement }} + +
    +
    + {{ form.search_region }} + +
    +
    +
    +
    +
    + + {% if results %} +

    Résultats

    + +
    + {% for land, data in results.items %} +
    +

    + + +

    +
    + +
    +
    + {% endfor %} +
    + {% endif %} +
    +
    +
    +{% endblock content %} + +{% block bodyend %} + +{% endblock bodyend %} diff --git a/project/templates/project/pages/artificialisation.html b/project/templates/project/pages/artificialisation.html new file mode 100644 index 000000000..441878679 --- /dev/null +++ b/project/templates/project/pages/artificialisation.html @@ -0,0 +1,3 @@ +{% extends "project/layout/base.html" %} + +{% block pagetitle %}Artificialisation | Mon Diagnostic Artificialisation{% endblock pagetitle %} diff --git a/project/templates/project/pages/consommation.html b/project/templates/project/pages/consommation.html new file mode 100644 index 000000000..b18ab000d --- /dev/null +++ b/project/templates/project/pages/consommation.html @@ -0,0 +1,3 @@ +{% extends "project/layout/base.html" %} + +{% block pagetitle %}Consommation d'espaces NAF | Mon Diagnostic Artificialisation{% endblock pagetitle %} diff --git a/project/templates/project/delete.html b/project/templates/project/pages/delete.html similarity index 91% rename from project/templates/project/delete.html rename to project/templates/project/pages/delete.html index 02086216e..2aea74f77 100644 --- a/project/templates/project/delete.html +++ b/project/templates/project/pages/delete.html @@ -4,7 +4,7 @@ {% load crispy_forms_tags %} {% block pagetitle %} - - nouveau projet +Supprimer un diagnostic | Mon Diagnostic Artificialisation {% endblock pagetitle %} {% block headers %} diff --git a/project/templates/project/error_download_word.html b/project/templates/project/pages/error_download_word.html similarity index 93% rename from project/templates/project/error_download_word.html rename to project/templates/project/pages/error_download_word.html index cd5d4e7d4..705ebf87c 100644 --- a/project/templates/project/error_download_word.html +++ b/project/templates/project/pages/error_download_word.html @@ -18,7 +18,7 @@

    Nous vous invitons à créer votre propre diagnostic afin de le télécharger : -
    Nouveau diagnostic +
    Nouveau diagnostic

    diff --git a/project/templates/project/pages/gpu.html b/project/templates/project/pages/gpu.html new file mode 100644 index 000000000..1932653aa --- /dev/null +++ b/project/templates/project/pages/gpu.html @@ -0,0 +1,3 @@ +{% extends "project/layout/base.html" %} + +{% block pagetitle %}Artificialisation des zonages d'urbanisme | Mon Diagnostic Artificialisation{% endblock pagetitle %} diff --git a/project/templates/project/pages/impermeabilisation.html b/project/templates/project/pages/impermeabilisation.html new file mode 100644 index 000000000..c49ecf79e --- /dev/null +++ b/project/templates/project/pages/impermeabilisation.html @@ -0,0 +1,3 @@ +{% extends "project/layout/base.html" %} + +{% block pagetitle %}Imperméabilisation | Mon Diagnostic Artificialisation{% endblock pagetitle %} diff --git a/project/templates/project/pages/list.html b/project/templates/project/pages/list.html new file mode 100644 index 000000000..00b9829ba --- /dev/null +++ b/project/templates/project/pages/list.html @@ -0,0 +1,121 @@ +{% extends "index.html" %} + +{% load static %} +{% load sri %} + +{% block pagetitle %} +Mes diagnostics +{% endblock pagetitle %} + +{% block content %} +
    +
    +

    Mes diagnostics

    + +
    +
    + {% for project in projects %} +
    +
    +
    +
    +
    +

    + {{ project.name }} +

    + + + +
    +
    +
      +
    • +

      Surface du territoire: {{ project.area|floatformat:0 }} ha

      +
    • +
    • +

      Période demandée: De {{ project.analyse_start_date }} à {{ project.analyse_end_date }}

      +
    • +
    • +

      Maille d'analyse: {{ project.level_label }}

      +
    • + {% if project.has_complete_uniform_ocsge_coverage %} +
    • +

      OCS GE

      +
    • + {% endif %} +
    +
    +
    + +
    +
    +
    + {% if project.cover_image %} + Couverture diagnostic + {% else %} +
    + {% endif %} +
    +
    +
    +
    + {% empty %} +

    Vous n'avez aucun diagnostic.

    + {% endfor %} +
    + +
    +{% endblock content %} + +{% block bodyend %} + +{% endblock bodyend %} diff --git a/project/templates/project/pages/ocsge.html b/project/templates/project/pages/ocsge.html new file mode 100644 index 000000000..2c9f3412c --- /dev/null +++ b/project/templates/project/pages/ocsge.html @@ -0,0 +1,3 @@ +{% extends "project/layout/base.html" %} + +{% block pagetitle %}Usage et couverture du sol (OCS GE) | Mon Diagnostic Artificialisation{% endblock pagetitle %} diff --git a/project/templates/project/pages/rapport_local.html b/project/templates/project/pages/rapport_local.html new file mode 100644 index 000000000..a7702d44a --- /dev/null +++ b/project/templates/project/pages/rapport_local.html @@ -0,0 +1,3 @@ +{% extends "project/layout/base.html" %} + +{% block pagetitle %}Rapport triennal local | Mon Diagnostic Artificialisation{% endblock pagetitle %} diff --git a/project/templates/project/create/splash_screen.html b/project/templates/project/pages/splash_screen.html similarity index 77% rename from project/templates/project/create/splash_screen.html rename to project/templates/project/pages/splash_screen.html index 96c791b1f..22319d783 100644 --- a/project/templates/project/create/splash_screen.html +++ b/project/templates/project/pages/splash_screen.html @@ -27,12 +27,14 @@

    Votre diagnostic est en cours de préparati {% block tagging %} {% endblock tagging %} diff --git a/project/templates/project/pages/synthese.html b/project/templates/project/pages/synthese.html new file mode 100644 index 000000000..8ab600106 --- /dev/null +++ b/project/templates/project/pages/synthese.html @@ -0,0 +1,3 @@ +{% extends "project/layout/base.html" %} + +{% block pagetitle %}Synthèse | Mon Diagnostic Artificialisation{% endblock pagetitle %} diff --git a/project/templates/project/pages/trajectoires.html b/project/templates/project/pages/trajectoires.html new file mode 100644 index 000000000..16b64cf28 --- /dev/null +++ b/project/templates/project/pages/trajectoires.html @@ -0,0 +1,3 @@ +{% extends "project/layout/base.html" %} + +{% block pagetitle %}Trajectoire ZAN | Mon Diagnostic Artificialisation{% endblock pagetitle %} diff --git a/project/templates/project/pages/update.html b/project/templates/project/pages/update.html new file mode 100644 index 000000000..ef27eaa6c --- /dev/null +++ b/project/templates/project/pages/update.html @@ -0,0 +1,3 @@ +{% extends "project/layout/base.html" %} + +{% block pagetitle %}Paramètres du diagnostic | Mon Diagnostic Artificialisation{% endblock pagetitle %} diff --git a/project/templates/project/partials/artif_cities_map.html b/project/templates/project/partials/artif_cities_map.html deleted file mode 100644 index 2947f33b2..000000000 --- a/project/templates/project/partials/artif_cities_map.html +++ /dev/null @@ -1,14 +0,0 @@ - diff --git a/project/templates/project/partials/artif_territory_map.html b/project/templates/project/partials/artif_territory_map.html deleted file mode 100644 index 3d5e700a5..000000000 --- a/project/templates/project/partials/artif_territory_map.html +++ /dev/null @@ -1,19 +0,0 @@ - - diff --git a/project/templates/project/partials/conso_map.html b/project/templates/project/partials/conso_map.html deleted file mode 100644 index 9934b31b3..000000000 --- a/project/templates/project/partials/conso_map.html +++ /dev/null @@ -1,13 +0,0 @@ -
    -
    - - - -
    -

    Carte consommation d'espaces des communes du territoire sur la période (en Ha)

    - {% if project.theme_map_conso %} - Carte consommation d'espaces des communes du territoire sur la période (en Ha) - {% else %} -
    - {% endif %} -
    diff --git a/project/templates/project/partials/nomenclature_couverture_ocsge.html b/project/templates/project/partials/nomenclature_couverture_ocsge.html deleted file mode 100644 index ed65cc5ee..000000000 --- a/project/templates/project/partials/nomenclature_couverture_ocsge.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - {{ couv_nomenclature.CS1.code_prefix }} - {{ couv_nomenclature.CS1.label_short }} -
    -
    - {{ couv_nomenclature.CS1_1.code_prefix }} -
    {{ couv_nomenclature.CS1_1.label_short }}
    -
    - {{ couv_nomenclature.CS1_1_1.code_prefix }} -
    {{ couv_nomenclature.CS1_1_1.label_short }}
    -
    - {{ couv_nomenclature.CS1_1_1_1.code_prefix }} -
    {{ couv_nomenclature.CS1_1_1_1.label_short }}
    -
    - {{ couv_nomenclature.CS1_1_1_2.code_prefix }} -
    {{ couv_nomenclature.CS1_1_1_2.label_short }}
    -
    - {{ couv_nomenclature.CS1_1_2.code_prefix }} -
    {{ couv_nomenclature.CS1_1_2.label_short }}
    -
    - {{ couv_nomenclature.CS1_1_2_1.code_prefix }} -
    {{ couv_nomenclature.CS1_1_2_1.label_short }}
    -
    - {{ couv_nomenclature.CS1_1_2_2.code_prefix }} -
    {{ couv_nomenclature.CS1_1_2_2.label_short }}
    -
    - {{ couv_nomenclature.CS1_2.code_prefix }} -
    {{ couv_nomenclature.CS1_2.label_short }}
    -
    - {{ couv_nomenclature.CS1_2_1.code_prefix }} -
    {{ couv_nomenclature.CS1_2_1.label_short }}
    -
    - {{ couv_nomenclature.CS1_2_2.code_prefix }} -
    {{ couv_nomenclature.CS1_2_2.label_short }}
    -
    - {{ couv_nomenclature.CS1_2_3.code_prefix }} -
    {{ couv_nomenclature.CS1_2_3.label_short }}
    -
    -
    - {{ couv_nomenclature.CS2.code_prefix }} - {{ couv_nomenclature.CS2.label_short }} -
    -
    - {{ couv_nomenclature.CS2_1.code_prefix }} -
    {{ couv_nomenclature.CS2_1.label_short }}
    -
    - {{ couv_nomenclature.CS2_1_1.code_prefix }} -
    {{ couv_nomenclature.CS2_1_1.label_short }}
    -
    - {{ couv_nomenclature.CS2_1_1_1.code_prefix }} -
    {{ couv_nomenclature.CS2_1_1_1.label_short }}
    -
    - {{ couv_nomenclature.CS2_1_1_2.code_prefix }} -
    {{ couv_nomenclature.CS2_1_1_2.label_short }}
    -
    - {{ couv_nomenclature.CS2_1_1_3.code_prefix }} -
    {{ couv_nomenclature.CS2_1_1_3.label_short }}
    -
    - {{ couv_nomenclature.CS2_1_2.code_prefix }} -
    {{ couv_nomenclature.CS2_1_2.label_short }}
    -
    - {{ couv_nomenclature.CS2_1_3.code_prefix }} -
    {{ couv_nomenclature.CS2_1_3.label_short }}
    -
    - {{ couv_nomenclature.CS2_2.code_prefix }} -
    {{ couv_nomenclature.CS2_2.label_short }}
    -
    - {{ couv_nomenclature.CS2_2_1.code_prefix }} -
    {{ couv_nomenclature.CS2_2_1.label_short }}
    -
    - {{ couv_nomenclature.CS2_2_2.code_prefix }} -
    {{ couv_nomenclature.CS2_2_2.label_short }}
    -
    - - diff --git a/project/templates/project/partials/nomenclature_usage_ocsge.html b/project/templates/project/partials/nomenclature_usage_ocsge.html deleted file mode 100644 index 26ea8748e..000000000 --- a/project/templates/project/partials/nomenclature_usage_ocsge.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - {{ usage_nomenclature.US1.code_prefix }} -
    {{ usage_nomenclature.US1.label_short }}
    -
    - {{ usage_nomenclature.US1_1.code_prefix }} -
    {{ usage_nomenclature.US1_1.label_short }}
    -
    - {{ usage_nomenclature.US1_2.code_prefix }} -
    {{ usage_nomenclature.US1_2.label_short }}
    -
    - {{ usage_nomenclature.US1_3.code_prefix }} -
    {{ usage_nomenclature.US1_3.label_short }}
    -
    - {{ usage_nomenclature.US1_4.code_prefix }} -
    {{ usage_nomenclature.US1_4.label_short }}
    -
    - {{ usage_nomenclature.US1_5.code_prefix }} -
    {{ usage_nomenclature.US1_5.label_short }}
    -
    - {{ usage_nomenclature.US235.code_prefix }} -
    {{ usage_nomenclature.US235.label_short }}
    -
    - {{ usage_nomenclature.US235.code_prefix }} -
    {{ usage_nomenclature.US235.label_short }}
    -
    - {{ usage_nomenclature.US4.code_prefix }} -
    {{ usage_nomenclature.US4.label_short }}
    -
    - {{ usage_nomenclature.US4_1.code_prefix }} -
    {{ usage_nomenclature.US4_1.label_short }}
    -
    - {{ usage_nomenclature.US4_1_1.code_prefix }} -
    {{ usage_nomenclature.US4_1_1.label_short }}
    -
    - {{ usage_nomenclature.US4_1_2.code_prefix }} -
    {{ usage_nomenclature.US4_1_2.label_short }}
    -
    - {{ usage_nomenclature.US4_1_3.code_prefix }} -
    {{ usage_nomenclature.US4_1_3.label_short }}
    -
    - {{ usage_nomenclature.US4_1_4.code_prefix }} -
    {{ usage_nomenclature.US4_1_4.label_short }}
    -
    - {{ usage_nomenclature.US4_1_5.code_prefix }} -
    {{ usage_nomenclature.US4_1_5.label_short }}
    -
    - {{ usage_nomenclature.US4_2.code_prefix }} -
    {{ usage_nomenclature.US4_2.label_short }}
    -
    - {{ usage_nomenclature.US4_3.code_prefix }} -
    {{ usage_nomenclature.US4_3.label_short }}
    -
    - {{ usage_nomenclature.US6.code_prefix }} -
    {{ usage_nomenclature.US6.label_short }}
    -
    - {{ usage_nomenclature.US6_1.code_prefix }} -
    {{ usage_nomenclature.US6_1.label_short }}
    -
    - {{ usage_nomenclature.US6_2.code_prefix }} -
    {{ usage_nomenclature.US6_2.label_short }}
    -
    - {{ usage_nomenclature.US6_3.code_prefix }} -
    {{ usage_nomenclature.US6_3.label_short }}
    -
    - {{ usage_nomenclature.US6_6.code_prefix }} -
    {{ usage_nomenclature.US6_6.label_short }}
    -
    - - diff --git a/project/templates/project/partials/ocsge_status.html b/project/templates/project/partials/ocsge_status.html deleted file mode 100644 index 04760af88..000000000 --- a/project/templates/project/partials/ocsge_status.html +++ /dev/null @@ -1,21 +0,0 @@ -{% if not project.has_complete_uniform_ocsge_coverage %} -
    -
    -
    -

    - {% if project.has_partial_ocsge_coverage %} - Les données OCS GE ne sont que partiellement disponibles sur ce territoire, vous n'avez - donc pas accès aux informations relatives à l'artificialisation, l'usage et la couverture. - {% elif project.has_complete_not_uniform_ocsge_coverage %} - Les données OCS GE sont disponibles sur ce territoire, mais les dates des millésimes ne - sont pas uniformes entre toutes les collectivités, vous n'avez donc pas accès aux - informations relatives à l'artificialisation, l'usage et la couverture. - {% else %} - Les données OCS GE ne sont pas encore disponibles sur ce territoire pour les dates sélectionnées, - vous n'avez donc pas accès aux informations relatives à l'artificialisation, l'usage et la couverture. - {% endif %} -

    -
    -
    -
    -{% endif %} diff --git a/project/templates/project/partials/report_title.html b/project/templates/project/partials/report_title.html deleted file mode 100644 index 409e4b8e8..000000000 --- a/project/templates/project/partials/report_title.html +++ /dev/null @@ -1,127 +0,0 @@ -
    -
    -
    -

    {{ title }}

    - -
    - -
    -
    - - - - - -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    - - \ No newline at end of file diff --git a/project/templates/project/partials/search.html b/project/templates/project/partials/search.html deleted file mode 100644 index 471e2db1a..000000000 --- a/project/templates/project/partials/search.html +++ /dev/null @@ -1,258 +0,0 @@ -{% load crispy_forms_tags %} - - - - - - diff --git a/project/templates/project/partials/surface_comparison_conso.html b/project/templates/project/partials/surface_comparison_conso.html deleted file mode 100644 index 406bbcbb7..000000000 --- a/project/templates/project/partials/surface_comparison_conso.html +++ /dev/null @@ -1,177 +0,0 @@ -{% load highcharts_tags %} - -

    Consommation d'espaces rapportée à la surface du territoire

    - -
    -
    - - - - - -
    -
    -
    - -
    -
    -
    -
    - - Source de données: -

    - FICHIERS FONCIERS -

    -
    - -
    -
    -
    Source
    -

    - Données d'évolution des fichiers fonciers produits et diffusés par le Cerema depuis 2009 à - partir des fichiers MAJIC (Mise A Jour de l'Information Cadastrale) de la DGFIP. Le dernier - millésime de 2023 est la photographie du territoire au 1er janvier 2023, intégrant les évolutions - réalisées au cours de l'année 2022. - Pour plus d'informations sur "Qu'est-ce qu'un millésime ?". -

    -
    Calcul
    -

    Données brutes, sans calcul

    - -
    Données
    -
    -
    -
    -
    - - - - - - - - - - {% for city_name, data in surface_data_table.items %} - - - {% for year, val in data.items %} - - {% endfor %} - - {% endfor %} - -
    - Surface des territoires similaires (en ha) -
    Surface des territoires
    {{ city_name }}{{ val|floatformat:0 }} Ha
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    - - - - - -
    -
    -
    - -
    -
    -
    -
    - - Source de données: -

    - FICHIERS FONCIERS -

    -
    - -
    -
    -
    Source
    -

    - Données d'évolution des fichiers fonciers produits et diffusés par le Cerema depuis 2009 à - partir des fichiers MAJIC (Mise A Jour de l'Information Cadastrale) de la DGFIP. Le dernier - millésime de 2023 est la photographie du territoire au 1er janvier 2023, intégrant les évolutions - réalisées au cours de l'année 2022. - Pour plus d'informations sur "Qu'est-ce qu'un millésime ?". -

    -
    Calcul
    -

    - Pour chaque territoire, la consommation d'espace annuelle est multipliée par 1000 et divisée par - sa surface totale. Le résultat est exprimé en pour mille (‰). -

    - -
    Données
    - {{ surface_proportional_data_table }} -
    -
    -
    - -{% display_chart 'surface_chart' surface_chart CSP_NONCE %} -{% display_chart 'surface_proportional_chart' surface_proportional_chart CSP_NONCE %} - - - diff --git a/project/templates/project/partials/zone_urba_aggregated_table.html b/project/templates/project/partials/zone_urba_aggregated_table.html deleted file mode 100644 index c99ea59dc..000000000 --- a/project/templates/project/partials/zone_urba_aggregated_table.html +++ /dev/null @@ -1,83 +0,0 @@ -
    -

    Synthèse des zonages d'urbanisme

    - -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - {% for zone_type, zone in zone_list.items %} - - - - - - - - - {% endfor %} - -
    - Données synthèse des zonages d'urbanisme -
    Type de
    zone
    Nombre
    de zones
    Surface
    totale
    Surface
    artificielle ({{ last_year_ocsge }})
    Taux d'artificialisation
    ({{ last_year_ocsge }})
    Artificialisation
    ({{ first_year_ocsge }} à {{ last_year_ocsge }})
    {{ zone_type }}{{ zone.nb_zones }}{{ zone.total_area|floatformat:1 }} ha{{ zone.last_artif_area|floatformat:1 }} ha -
    -
    -
    {{ zone.fill_up_rate|floatformat:1 }}%
    -
    -
    {{ zone.new_artif|floatformat:1 }} ha
    -
    -
    -
    -
    - -

    Les types de zone d'après le Standard CNIG PLU v2022 - rev. octobre 2022: -
    U : zone urbaine -
    AUc : zone à urbaniser -
    AUs : zone à urbaniser bloquée -
    A : zone agricole -
    N : zone naturelle -

    -
    - -
    - {% include "project/partials/zone_urba_general_map.html" %} -
    - -
    - -
    -
    -
    -
    - - Source de données: -

    - OCS GE -

    -
    - -
    -
    -
    Source
    -

    Données d'OCcupation des Sols à Grande Echelle (OCS GE) de l'IGN, sur la période d'analyse. Zonages d'Urbanisme issus du Géoportail de l'Urbanisme (GPU) en date de juin 2023: https://www.geoportail-urbanisme.gouv.fr/

    - -
    Calcul
    -

    Qualifier l'artificialisation de chaque parcelle OCS GE via la matrice d'artficialisation (consulter). Puis comparer la surface totale des parcelles artificialisées dans chaque zonage d'urbanisme à la surface de la zone pour connaître le taux d'occupation.

    -
    -
    -
    -
    diff --git a/project/templates/project/partials/zone_urba_fill_map.html b/project/templates/project/partials/zone_urba_fill_map.html deleted file mode 100644 index 5725fd78e..000000000 --- a/project/templates/project/partials/zone_urba_fill_map.html +++ /dev/null @@ -1,16 +0,0 @@ -
    -
    - {% if diagnostic.theme_map_fill_gpu %} - - - - {% endif %} -
    -

    Carte présentant l'artificialisation des zones U, AUs et AUc

    - {% if diagnostic.theme_map_fill_gpu %} - Carte présentant les zonages d'urbanisme - {% else %} -
    -
    - {% endif %} -
    diff --git a/project/templates/project/partials/zone_urba_general_map.html b/project/templates/project/partials/zone_urba_general_map.html deleted file mode 100644 index 049bfbf61..000000000 --- a/project/templates/project/partials/zone_urba_general_map.html +++ /dev/null @@ -1,9 +0,0 @@ -
    -

    Carte présentant les zonages d'urbanisme du territoire

    - {% if diagnostic.theme_map_gpu %} - Carte présentant les zonages d'urbanisme - {% else %} -
    -
    - {% endif %} -
    diff --git a/project/templates/project/report_artif.html b/project/templates/project/report_artif.html deleted file mode 100644 index 51e9b063d..000000000 --- a/project/templates/project/report_artif.html +++ /dev/null @@ -1,753 +0,0 @@ -{% extends "index.html" %} - -{% load static %} -{% load project_tags %} -{% load humanize %} -{% load i18n %} -{% load l10n %} -{% load highcharts_tags %} -{% load sri %} - -{% block pagetitle %} -Rapport artificialisation -{% endblock pagetitle %} - -{% block headers %} -{% sri_static "project/css/project.css" %} -{% endblock headers %} - -{% block content %} -
    - {% include "project/partials/report_title.html" with title=diagnostic surface=diagnostic.area %} - - {% include "project/report_menu.html" %} - -
    -
    -
    -
    -

    - - L’artificialisation présentée ne prend pas encore en compte - les seuils et les exceptions du décret du 27 novembre 2023. - -

    -

    - -

    - Nous travaillons actuellement à intégrer la - - méthode de calcul de l'artificialisation proposée par le portail de l'artificialisation - -

    -

    - Celle-ci prend en compte les seuils tels que définis par le decret du 27 novembre 2023. - Cependant cette méthode ne prend pas encore en compte les exceptions définies par le décret, - à savoir : les surfaces végétalisées à usage de parc ou jardin public, - quel que soit le type de couvert (boisé ou herbacé) qui pourront être considérées comme étant non artificialisées, - et les surfaces végétalisées sur lesquelles seront implantées des installations de panneaux photovoltaïques - qui respectent des conditions techniques garantissant qu'elles n'affectent pas durablement les fonctions - écologiques du sol ainsi que son potentiel agronomique. -

    -

    - Suite aux évolutions réglementaires de novembre 2023, la méthode de calcul proposée par le portail de - l'artificialisation est en version provisoire et donc susceptible d’évoluer en fonction des retours des utilisateurs. - Pour toute question ou suggestion, n’hésitez pas à contacter le Cerema directement : - pole-web@cerema.fr -

    - -

    -
    -
    -
    - -
    -
    -

    L'article 192 de la Loi Climat & Résilience votée en août 2021 définit l'artificialisation comme « une surface dont les sols sont :

    -
      -
    • soit imperméabilisés en raison du bâti ou d'un revêtement,
    • -
    • soit stabilisés et compactés,
    • -
    • soit constitués de matériaux composites »
    • -
    -
    - - - -
    - -
    -

    Etat des lieux du territoire au dernier millésime

    - - Qu'est-ce qu'un millésime ? - - -
    -
    -
    -
    -

    {{ total_surface|floatformat:0 }} ha

    -

    Surface du territoire

    -
    -
    -
    -
    -

    {{ artif_area|floatformat:0 }} ha

    -

    - en {{ last_millesime }} -

    -
    -
    -
    -
    -

    {{ rate_artif_area|floatformat:0 }}%

    -

    Taux de surfaces artificialisées

    -
    -
    -
    -
    -
    - -
    -

    Evolution en volume de {{ first_millesime }} à {{ last_millesime }}

    -
    -
    -
    -

    {{ new_artif|floatformat:1 }} ha

    -

    - -

    -
    -
    -
    -
    -

    {{ new_natural|floatformat:1 }} ha

    -

    - -

    -
    -
    -
    -
    -

    {{ net_artif|floatformat:1 }} ha

    -

    - -

    - -
    -
    -
    -
    -

    {{ net_artif_rate|floatformat:1 }} %

    -

    - -

    -
    -
    -
    -
    - -
    -

    Aperçu de l'artificialisation

    - -

    Evolution de l'artificialisation entre {{ first_millesime }} et {{ last_millesime }}

    - -
    -
    -
    -
    - - - -
    -
    -
    -
    -
    - {% include "project/partials/artif_territory_map.html" %} -
    -
    - -
    -
    -
    -
    - - Source de données: -

    - OCS GE -

    -
    - -
    -
    -
    Source
    -

    Données d'OCcupation des Sols à Grande Echelle (OCS GE) de l'IGN, sur la période d'analyse traduite grâce à la matrice de passage.

    - -
    Calcul
    -

    Artificialisation sur la période - désartificialisation sur la période.

    - -
    Données
    -
    -
    -
    -
    - - - - - - {% for period in headers_evolution_artif %} - - {% endfor %} - - - - {% for serie_name, data in table_evolution_artif.items %} - - - {% for period, val in data.items %} - - {% endfor %} - - {% endfor %} - -
    - Évolution de l'artificialisation sur le territoire entre {{ first_millesime }} et {{ last_millesime }} (en ha) -
    {{ period }} (Ha)
    {{ serie_name }}{{ val|floatformat:1 }}
    -
    -
    -
    -
    -
    -
    -
    -
    - - {% if nb_communes > 1 %} -
    -

    Artificialisation nette entre {{ first_millesime }} et {{ last_millesime }}

    - -
    -
    -
    -
    - - - - - -
    -
    -
    -
    -
    - {% include "project/partials/artif_cities_map.html" %} -
    -
    - -
    -
    -
    -
    - - Source de données: -

    - OCS GE -

    -
    - -
    -
    -
    Source
    -

    Données d'OCcupation des Sols à Grande Echelle (OCS GE) de l'IGN, sur la période d'analyse.

    - -
    Calcul
    -

    OCS GE traduite grâce à la matrice de passage.

    - -
    Données
    -
    -
    -
    -
    - - - - - - - {% for period in table_artif_net_periods %} - - - - {% endfor %} - - - - - {% for record in table_artif_net_records %} - - - - {% for period in record.periods %} - - - - {% endfor %} - - - {% endfor %} - -
    - Artificialisation nette sur le territoire entre {{ first_millesime }} et {{ last_millesime }} (en ha) -
    Surface (en ha)Artificialisation ({{ period }})Désartificialisation ({{ period }})Artificialisation nette ({{ period }})% d'artificialisation nette total
    {{ record.name }}{{ record.area|floatformat:1 }}{{ period.new_artif|floatformat:1 }}{{ period.new_natural|floatformat:1 }}{{ period.net_artif|floatformat:1 }}{{ record.net_artif_percentage|floatformat:2 }} %
    -
    -
    -
    -
    -
    -
    -
    -
    - {% endif %} - -
    -

    Détails de l'artificialisation entre {{ first_millesime }} et {{ last_millesime }}

    - -

    Grandes familles de couverture des sols des surfaces artificialisées

    - -
    -
    -
    -
    - - - - - -
    -
    -
    -
    -
    -
    -
    - - - - - -
    -
    -
    -
    -
    - -
    -
    -
    -
    - - Source de données: -

    - OCS GE -

    -
    - -
    -
    -
    Source
    -

    Données d'OCcupation des Sols à Grande Echelle (OCS GE) de l'IGN, sur la période d'analyse (millésime min : {{ project.first_year_ocsge }}, millésime max : {{ project.last_year_ocsge }}).

    - -
    Calcul
    -

    OCS GE traduite grâce à la matrice de passage.

    - -
    Exemple de lecture
    -

    Il y a eu 7.5 ha de nouvelles Zones non bâties représentant 10% de la surface de toutes les nouvelles surfaces artificialisées et 2 ha d'anciennes Zones non bâties désartificialisées représentant 16% de la surface de toutes les zones désartificialisées.

    - -
    Données
    -

    En hectare (Ha).

    -
    -
    -
    -
    - - - - - - - - - - - - - - {% for couv in detail_couv_artif_table %} - - - - - - - - - {% endfor %} - - - - - - - - - -
    - Évolution de l'artificialisation par type de couverture sur le territoire de {{ first_millesime }} à {{ last_millesime }} (en ha et %) -
    Type de couvertureArtificialisation%Désartificialisation%Artificialisé en {{ last_millesime }}
    {{ couv.code_prefix }} {{ couv.label }}{{ couv.artif|floatformat:1 }}{{ couv.artif|percent:detail_total_artif }}{{ couv.renat|floatformat:1 }}{{ couv.renat|percent:detail_total_renat }}{{ couv.last_millesime|floatformat:1 }}
    Total{{ detail_total_artif|floatformat:1 }}100%{{ detail_total_renat|floatformat:1 }}100%{{ artif_area|floatformat:1 }}
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -

    Grandes familles d'usages du sol des surfaces artificialisées

    - -
    -
    -
    -
    - - - - - -
    -
    -
    -
    -
    -
    -
    - - - - - -
    -
    -
    -
    -
    - -
    -
    -
    -
    - - Source de données: -

    - OCS GE -

    -
    - -
    -
    -
    Source
    -

    Données d'OCcupation des Sols à Grande Echelle (OCS GE) de l'IGN, sur la période d'analyse (millésime min : {{ project.first_year_ocsge }}, millésime max : {{ project.last_year_ocsge }}).

    - -
    Calcul
    -

    OCS GE traduite grâce à la matrice de passage.

    - -
    Données
    -

    En hectare (Ha).

    -
    -
    -
    -
    - - - - - - - - - - - - - - {% for item in detail_usage_artif_table %} - - - - - - - - - {% endfor %} - - - - - - - - - -
    - Évolution de l'artificialisation par type d'usage sur le territoire de {{ first_millesime }} à {{ last_millesime }} (en ha et %) -
    Type d'usageArtificialisation%Désartificialisation%Artificialisé en {{ last_millesime }}
    {{ item.code_prefix }} {{ item.label }}{{ item.artif|floatformat:1 }}{{ item.artif|percent:detail_total_artif }}{{ item.renat|floatformat:1 }}{{ item.renat|percent:detail_total_renat }}{{ item.last_millesime|floatformat:1 }}
    Total{{ detail_total_artif|floatformat:1 }}100%{{ detail_total_renat|floatformat:1 }}100%{{ artif_area|floatformat:1 }}
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - -{% endblock content %} - -{% block bodyend %} -{% localize off %} -{% sri_static "highcharts/js/highcharts.js" %} -{% sri_static "highcharts/js/highcharts-more.js" %} -{% sri_static "highcharts/js/exporting.js" %} -{% sri_static "highcharts/js/no-data.js" %} -{% french_translation %} -{% display_chart 'detail_couv_artif_chart' detail_couv_artif_chart CSP_NONCE %} -{% display_chart 'couv_artif_sol' couv_artif_sol CSP_NONCE %} -{% display_chart 'detail_usage_artif_chart' detail_usage_artif_chart CSP_NONCE %} -{% display_chart 'usage_artif_sol' usage_artif_sol CSP_NONCE %} -{% display_chart 'chart_comparison' chart_comparison CSP_NONCE %} -{% display_chart 'chart_waterfall' chart_waterfall CSP_NONCE %} - -{% endlocalize %} -{% endblock bodyend %} diff --git a/project/templates/project/report_consommation.html b/project/templates/project/report_consommation.html deleted file mode 100644 index ca029f78e..000000000 --- a/project/templates/project/report_consommation.html +++ /dev/null @@ -1,493 +0,0 @@ -{% extends "index.html" %} - -{% load static %} -{% load project_tags %} -{% load humanize %} -{% load i18n %} -{% load l10n %} -{% load highcharts_tags %} -{% load sri %} - -{% block pagetitle %} -Rapport consommation -{% endblock pagetitle %} - -{% block headers %} -{% sri_static "project/css/project.css" %} - -{% endblock headers %} - -{% block content %} -
    - {% include "project/partials/report_title.html" with title=diagnostic surface=diagnostic.area %} - - {% include "project/report_menu.html" %} - -
    -
    -
    -

    - La consommation d'espaces NAF (Naturels, Agricoles et Forestiers) est entendue comme - « la création ou l'extension effective d'espaces urbanisés sur le territoire concerné » (article 194 de la loi Climat et résilience). -

    -

    - Cet article exprime le fait que le caractère urbanisé d'un espace est la traduction de l'usage qui en est fait. - Un espace urbanisé n'est plus un espace d'usage NAF (Naturel, Agricole et Forestier). Si l'artificialisation des sols traduit globalement un changement de couverture physique, - la consommation traduit un changement d'usage. A titre d'exemple, un bâtiment agricole artificialise mais ne consomme pas. -

    -
    - - - -
    - - - -
    -
    -
    -

    {{ total_surface|floatformat:0 }} ha

    -

    Surface du territoire

    -
    -
    -
    -
    -

    +{{ conso_period|floatformat:1 }} ha

    -

    Consommation {{ project.analyse_start_date }} à {{ project.analyse_end_date }}

    -
    -
    -
    - -
    -

    Consommation d'espace annuelle sur le territoire

    - -
    -
    -
    -
    - - - - - -
    -
    -
    -
    - {% if nb_communes > 1 %} -
    - {% include "project/partials/conso_map.html" %} -
    - {% endif %} -
    - -
    -
    -
    -
    - - Source de données: -

    - FICHIERS FONCIERS -

    -
    - -
    -
    -
    Source
    -

    - Données d'évolution des fichiers fonciers produits et diffusés par le Cerema depuis 2009 à - partir des fichiers MAJIC (Mise A Jour de l'Information Cadastrale) de la DGFIP. Le dernier - millésime de 2023 est la photographie du territoire au 1er janvier 2023, intégrant les évolutions - réalisées au cours de l'année 2022. - Pour plus d'informations sur "Qu'est-ce qu'un millésime ?". -

    -
    Calcul
    -

    Données brutes, sans calcul

    - -
    Données
    -
    -
    -
    -
    - - - - - - {% for year in project.years %} - - {% endfor %} - - - - - {% for item, data in annual_conso_data_table.items %} - - - {% for year, val in data.items %} - - {% endfor %} - - {% endfor %} - -
    - Consommation d'espace annuelle sur le territoire (en ha) -
    {{ year }}Total
    {{ item }}+{{ val|floatformat:1 }}
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -

    Destinations de la consommation d'espaces

    - -
    -
    -
    -
    - - - - - -
    -
    -
    -
    -
    -
    -
    - - - - - -
    -
    -
    -
    -
    - -
    -
    -
    -
    - - Source de données: -

    - FICHIERS FONCIERS -

    -
    - -
    -
    -
    Source
    -

    - Données d'évolution des fichiers fonciers produits et diffusés par le Cerema depuis 2009 à - partir des fichiers MAJIC (Mise A Jour de l'Information Cadastrale) de la DGFIP. Le dernier - millésime de 2023 est la photographie du territoire au 1er janvier 2023, intégrant les évolutions - réalisées au cours de l'année 2022. - Pour plus d'informations sur "Qu'est-ce qu'un millésime ?". -

    -

    - La ligne "inconnu" comprend les éléments dont la destination - n’est pas définie dans les fichiers fonciers. -

    -
    Calcul
    -

    Données brutes, sans calcul

    - -
    Données
    -
    -
    -
    -
    - - - - - - {% for year in project.years %} - - {% endfor %} - - - - - {% for determinant_name, data in data_determinant.items %} - - - {% for year, val in data.items %} - - {% endfor %} - - {% endfor %} - -
    - Consommation d'espace annuelle sur le territoire par destination (en ha) -
    Destination{{ year }}Total
    {{ determinant_name }}+{{ val|floatformat:1 }}
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -

    Comparaison avec les territoires similaires

    -
    -
    - - - - - - - -
    -
    -
    - -
    -
    -
    -
    - - Source de données: -

    - FICHIERS FONCIERS -

    -
    - -
    -
    -
    Source
    -

    - Données d'évolution des fichiers fonciers produits et diffusés par le Cerema depuis 2009 à - partir des fichiers MAJIC (Mise A Jour de l'Information Cadastrale) de la DGFIP. Le dernier - millésime de 2023 est la photographie du territoire au 1er janvier 2023, intégrant les évolutions - réalisées au cours de l'année 2022. - Pour plus d'informations sur "Qu'est-ce qu'un millésime ?". -

    -
    Calcul
    -

    Données brutes, sans calcul

    - -
    Données
    - {{ comparison_table }} -
    -
    -
    -
    - -
    -

    Consommation d'espaces rapportée à la surface du territoire

    -
    -
    -
    -
    - - - - - - - - - - - -{% endblock content %} - -{% block bodyend %} -{% localize off %} -{% sri_static "highcharts/js/highcharts.js" %} -{% sri_static "highcharts/js/exporting.js" %} -{% french_translation %} -{% display_chart 'annual_total_conso_chart' annual_total_conso_chart CSP_NONCE %} -{% display_chart 'comparison_chart' comparison_chart CSP_NONCE %} -{% display_chart 'chart_determinant' determinant_per_year_chart CSP_NONCE %} -{% display_chart 'pie_determinant' determinant_pie_chart CSP_NONCE %} - -{% endlocalize %} -{% endblock bodyend %} diff --git a/project/templates/project/report_discover_ocsge.html b/project/templates/project/report_discover_ocsge.html deleted file mode 100644 index c0c358bf3..000000000 --- a/project/templates/project/report_discover_ocsge.html +++ /dev/null @@ -1,536 +0,0 @@ -{% extends "index.html" %} - -{% load static %} -{% load project_tags %} -{% load humanize %} -{% load i18n %} -{% load l10n %} -{% load highcharts_tags %} -{% load sri %} - -{% block pagetitle %} -{{ nom }} -{% endblock pagetitle %} - -{% block headers %} -{% sri_static "project/css/project.css" %} - -{% endblock headers %} - -{% block content %} -
    - {% include "project/partials/report_title.html" with title=diagnostic surface=surface_territory %} - - {% include "project/report_menu.html" %} - -
    -
    -
    -

    Au niveau national, l'artificialisation est mesurée par l'occupation des sols à grande échelle (OCS GE), en cours d'élaboration, dont la production sera engagée sur l'ensemble du territoire national d'ici fin 2024.

    -

    L'OCS GE est une base de données vectorielle pour la description de l'occupation du sol de l'ensemble du territoire métropolitain et des départements et régions d'outre-mer (DROM). Elle est un référentiel national, constituant un socle national, utilisable au niveau national et au niveau local notamment pour contribuer aux calculs d'indicateurs exigés par les documents d'urbanisme.

    -
    - - - -
    - -
    -

    Couverture du sol

    -

    Répartition

    - -
    -
    -
    -
    - - - -
    -
    -
    -
    -
    -
    -
    - - - -
    -
    -
    -
    -
    - -
    -
    -
    -
    - - Source de données: -

    - OCS GE -

    -
    - -
    -
    -
    Source
    -

    Données d'Occupation des Sols à Grande Echelle (OCS GE) de l'IGN, sur la période d'analyse traduite grâce à la matrice de passage.

    - -
    Calcul
    -

    Données brutes, sans calcul.

    - -
    Données
    - Progression de {{ first_millesime }} à {{ last_millesime }} -
    -
    -
    -
    - - - - - - - - - - - - - - {% for item in couv_progression_chart.get_series %} - - - - - - - - - {% endfor %} - -
    - Évolution de la couverture des sols sur le territoire de {{ first_millesime }} à {{ last_millesime }} -
    CodeLibelléSurface {{ first_millesime }} (ha)Evolution (ha)Surface {{ last_millesime }} (ha)Surface {{ last_millesime }} (%)
    {{ item.level|space }} {{ item.code }}{{ item.get_label_short }}{{ item.surface_first|floatformat:1 }} - {% if item.surface_diff > 0 %}+{% endif %}{{ item.surface_diff|floatformat:1 }} - {{ item.surface_last|floatformat:1 }}{{ item.surface_last|percent:surface_territory }}
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -

    Matrice de passage de {{ first_millesime }} à {{ last_millesime }} :

    - -
    -
    - - - -
    -
    -
    - -
    -
    -
    -
    - - Source de données: -

    - OCS GE -

    -
    - -
    -
    -
    Source
    -

    Données d'OCcupation des Sols à Grande Echelle (OCS GE) de l'IGN, sur la période d'analyse traduite grâce à la matrice de passage.

    - -
    Calcul
    -

    Données brutes, sans calcul.

    - -
    Données
    -

    En hectare (Ha).

    -

    Les lignes indiquent la couverture {{ first_millesime }} et les colonnes indiquent la couverture {{ last_millesime }}. Par conséquent, à l'intersection se trouve la superficie qui est passée d'une couverture l'autre.

    -
    -
    -
    -
    - - - - - - {% for header in couv_matrix_headers %} - - {% endfor %} - - - - - {% for name, data in couv_matrix_data.items %} - - - {% for title, val in data.items %} - - {% endfor %} - - {% endfor %} - -
    - Matrice d'évolution de la couverture des sols sur le territoire de {{ first_millesime }} à {{ last_millesime }} (en ha) -
    - - {{ header.code }} - - Total
    - {% if name.code %} - - {{ name.code }} {{ name.label_short }} - - {% else %} - Total - {% endif %} - - - {{ val|floatformat:1 }} - -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -

    Usage du sol

    -

    Répartition

    - -
    -
    -
    -
    - - - -
    -
    -
    -
    -
    -
    -
    - - - -
    -
    -
    -
    -
    - -
    -
    -
    -
    - - Source de données: -

    - OCS GE -

    -
    - -
    -
    -
    Source
    -

    Données d'Occupation des Sols à Grande Echelle (OCS GE) de l'IGN, sur la période d'analyse traduite grâce à la matrice de passage.

    - -
    Calcul
    -

    Données brutes, sans calcul.

    - -
    Données
    - Progression de {{ first_millesime }} à {{ last_millesime }} -
    -
    -
    -
    - - - - - - - - - - - - - - {% for item in usa_progression_chart.get_series %} - - - - - - - - - {% endfor %} - -
    - Évolution de l'usage des sols sur le territoire de {{ first_millesime }} à {{ last_millesime }} -
    CodeLibelléSurface {{ first_millesime }} (ha)Evolution (ha)Surface {{ last_millesime }} (ha)Surface {{ last_millesime }} (%)
    {{ item.level|space }} {{ item.code }}{{ item.get_label_short }}{{ item.surface_first|floatformat:1 }} - {% if item.surface_diff > 0 %}+{% endif %}{{ item.surface_diff|floatformat:1 }} - {{ item.surface_last|floatformat:1 }}{{ item.surface_last|percent:surface_territory }}
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -

    Matrice de passage de {{ first_millesime }} à {{ last_millesime }} :

    - -
    -
    - - - -
    -
    -
    - -
    -
    -
    -
    - - Source de données: -

    - OCS GE -

    -
    - -
    -
    -
    Source
    -

    Données d'Occupation des Sols à Grande Echelle (OCS GE) de l'IGN, sur la période d'analyse traduite grâce à la matrice de passage.

    - -
    Calcul
    -

    Artificialisation sur la période - désartificialisation sur la période.

    - -
    Données
    -

    En hectare (Ha).

    -

    Les lignes indiquent l'usage {{ first_millesime }} et les colonnes indiquent l'usage {{ last_millesime }}. Par conséquent, à l'intersection se trouve la superficie qui est passée d'une couverture l'autre.

    -
    -
    -
    -
    - - - - - - {% for header in usa_matrix_headers %} - - {% endfor %} - - - - - {% for name, data in usa_matrix_data.items %} - - - {% for title, val in data.items %} - - {% endfor %} - - {% endfor %} - -
    - Matrice d'évolution de l'usage des sols sur le territoire de {{ first_millesime }} à {{ last_millesime }} (en ha) -
    - - {{ header.code }} - - Total
    - {% if name.code %} - - {{ name.code }} {{ name.label_short }} - - {% else %} - Total - {% endif %} - - - {{ val|floatformat:1 }} - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -{% endblock content %} - -{% block bodyend %} -{% localize off %} -{% sri_static "highcharts/js/highcharts.js" %} -{% sri_static "highcharts/js/exporting.js" %} -{% sri_static "highcharts/js/sankey.js" %} -{% sri_static "highcharts/js/dependency-wheel.js" %} -{% french_translation %} -{% display_chart 'chart_couv_pie' couv_pie_chart CSP_NONCE %} -{% display_chart 'chart_couv_prog' couv_progression_chart CSP_NONCE %} -{% display_chart 'chart_usa_pie' usa_pie_chart CSP_NONCE %} -{% display_chart 'chart_usa_prog' usa_progression_chart CSP_NONCE %} -{% display_chart 'chart_couv_wheel' couv_wheel_chart CSP_NONCE %} -{% display_chart 'chart_usa_wheel' usa_whell_chart CSP_NONCE %} -{% endlocalize %} -{% endblock bodyend %} diff --git a/project/templates/project/report_gpu.html b/project/templates/project/report_gpu.html deleted file mode 100644 index 2369159da..000000000 --- a/project/templates/project/report_gpu.html +++ /dev/null @@ -1,33 +0,0 @@ -{% extends "index.html" %} - -{% load static %} -{% load project_tags %} -{% load humanize %} -{% load i18n %} -{% load l10n %} -{% load sri %} - -{% block pagetitle %} -Rapport Zones d'Urbanisme -{% endblock pagetitle %} - -{% block headers %} -{% endblock headers %} - -{% block content %} -
    - {% include "project/partials/report_title.html" with title=diagnostic surface=diagnostic.area %} - - {% include "project/report_menu.html" %} - -
    - - {% include "project/partials/ocsge_status.html" %} - -
    -

    Zones d'urbanisme

    -

    Synthèse du taux d'artificialisation

    - -
    -
    -{% endblock %} diff --git a/project/templates/project/report_imper.html b/project/templates/project/report_imper.html deleted file mode 100644 index 1812c82f4..000000000 --- a/project/templates/project/report_imper.html +++ /dev/null @@ -1,370 +0,0 @@ -{% extends "index.html" %} - -{% load static %} -{% load project_tags %} -{% load humanize %} -{% load i18n %} -{% load l10n %} -{% load highcharts_tags %} -{% load sri %} - -{% block pagetitle %} -Rapport Imperméabilisation -{% endblock pagetitle %} - -{% block headers %} -{% sri_static "project/css/project.css" %} -{% endblock headers %} - -{% block content %} -
    - {% include "project/partials/report_title.html" with title=diagnostic surface=diagnostic.area %} - - {% include "project/report_menu.html" %} - -
    -
    -
    -

    Le Décret n° 2023-1096 du 27 novembre 2023 relatif à l'évaluation et au suivi de l'Imperméabilisation des sols précise que le rapport relatif à l'Imperméabilisation des sols prévu à l'article L. 2231-1 présente, pour les années civiles sur lesquelles il porte et au moins tous les trois ans, les indicateurs et données suivants:

    -
      -
    • « 1° La consommation des espaces naturels, agricoles et forestiers, exprimée en nombre d'hectares, le cas échéant en la différenciant entre ces types d'espaces, et en pourcentage au regard de la superficie du territoire couvert. Sur le même territoire, le rapport peut préciser également la transformation effective d'espaces urbanisés ou construits en espaces naturels, agricoles et forestiers du fait d'une Désimperméabilisation ;
    • -
    • « 2° Le solde entre les surfaces Impericialisées et les surfaces désImpericialisées, telles que définies dans la nomenclature annexée à l'article R. 101-1 du code de l'urbanisme ;
    • -
    -
    - - - -
    - -
    -

    Aperçu de l'imperméabilisation

    - -

    Evolution de l'imperméabilisation entre {{ first_millesime }} et {{ last_millesime }}

    - -
    -
    -
    -
    - - - -
    -
    -
    -
    -
    - -
    -
    -
    -
    - - Source de données: -

    - OCS GE -

    -
    - -
    -
    -
    Source
    -

    Données d'OCcupation des Sols à Grande Echelle (OCS GE) de l'IGN, sur la période d'analyse traduite grâce à la matrice de passage.

    - -
    Calcul
    -

    Imperméabilisation nette = Imperméabilisation sur la période - Désimperméabilisation sur la période.

    - -
    Données
    - {{ imper_nette_data_table }} -
    -
    -
    -
    - - -
    -

    Détails de l'Imperméabilisation entre {{ first_millesime }} et {{ last_millesime }}

    - -

    Familles de couverture des sols des surfaces imperméabilisées

    - -
    -
    -
    -
    - - - - - -
    -
    -
    -
    -
    -
    -
    - - - - - -
    -
    -
    -
    -
    - -
    -
    -
    -
    - - Source de données: -

    - OCS GE -

    -
    - -
    -
    -
    Source
    -

    Données d'OCcupation des Sols à Grande Echelle (OCS GE) de l'IGN, sur la période d'analyse (millésime min : {{ project.first_year_ocsge }}, millésime max : {{ project.last_year_ocsge }}).

    - -
    Calcul
    -

    OCS GE traduite grâce à la matrice de passage.

    - -
    Exemple de lecture
    -

    Il y a eu 7.5 ha de nouvelles Zones non bâties représentant 10% de la surface de toutes les nouvelles surfaces imperméabilisées et 2 ha d'anciennes Zones non bâties désimperméabilisée représentant 16% de la surface de toutes les zones désimperméabilisées.

    - -
    Données
    -

    En hectare (ha).

    - {{ imper_progression_couv_data_table }} -
    -
    -
    -
    - -
    -

    Grandes familles d'usages du sol des surfaces imperméabilisées

    - -
    -
    -
    -
    - - - - - -
    -
    -
    -
    -
    -
    -
    - - - - - -
    -
    -
    -
    -
    - -
    -
    -
    -
    - - Source de données: -

    - OCS GE -

    -
    - -
    -
    -
    Source
    -

    Données d'OCcupation des Sols à Grande Echelle (OCS GE) de l'IGN, sur la période d'analyse (millésime min : {{ project.first_year_ocsge }}, millésime max : {{ project.last_year_ocsge }}).

    - -
    Calcul
    -

    OCS GE traduite grâce à la matrice de passage.

    - -
    Données
    -

    En hectare (ha).

    - {{ imper_progression_usage_data_table }} -
    -
    -
    -
    -
    -
    - - - - - - - -{% endblock content %} - -{% block bodyend %} -{% localize off %} -{% sri_static "highcharts/js/highcharts.js" %} -{% sri_static "highcharts/js/highcharts-more.js" %} -{% sri_static "highcharts/js/exporting.js" %} -{% sri_static "highcharts/js/no-data.js" %} -{% french_translation %} -{% display_chart 'imper_nette_chart' imper_nette_chart CSP_NONCE %} -{% display_chart 'imper_progression_couv_chart' imper_progression_couv_chart CSP_NONCE %} -{% display_chart 'imper_repartition_couv_chart' imper_repartition_couv_chart CSP_NONCE %} -{% display_chart 'imper_progression_usage_chart' imper_progression_usage_chart CSP_NONCE %} -{% display_chart 'imper_repartition_usage_chart' imper_repartition_usage_chart CSP_NONCE %} -{% endlocalize %} -{% endblock bodyend %} diff --git a/project/templates/project/report_local.html b/project/templates/project/report_local.html deleted file mode 100644 index 6075da134..000000000 --- a/project/templates/project/report_local.html +++ /dev/null @@ -1,222 +0,0 @@ -{% extends "index.html" %} - -{% load static %} -{% load project_tags %} -{% load humanize %} -{% load i18n %} -{% load l10n %} -{% load sri %} - -{% block pagetitle %} -Rapport triennal local -{% endblock pagetitle %} - -{% block headers %} -{% sri_static "project/css/project.css" %} -{% endblock headers %} - -{% block content %} -
    - {% include "project/partials/report_title.html" with title=diagnostic surface=diagnostic.area %} - - {% include "project/report_menu.html" %} - -
    -

    Nouveau

    - - -
    -

    Objet du rapport triennal local de suivi de l’artificialisation des sols

    -
    -

    Sur la décennie 2011-2021, 24 000 ha d’espaces naturels, agricoles et forestiers ont été consommés chaque année en moyenne en France, soit près de 5 terrains de football par heure. Les conséquences sont écologiques mais aussi socio-économiques.

    -
    -
    -

    La France s’est donc fixée, dans le cadre de la loi n° 2021-1104 du 22 août 2021 dite « Climat et résilience » complétée par la loi n° 2023-630 du 20 juillet 2023, l’objectif d’atteindre le « zéro artificialisation nette des sols » en 2050, avec un objectif intermédiaire de réduction de moitié de la consommation d’espaces NAF (Naturels, Agricoles et Forestiers) sur 2021-2031 par rapport à la décennie précédente.

    -

    Cette trajectoire progressive est à décliner territorialement dans les documents de planification et d’urbanisme.

    -

    Cette trajectoire est mesurée, pour la période 2021-2031, en consommation d’espaces NAF (Naturels, Agricoles et Forestiers), définie comme « la création ou l'extension effective d'espaces urbanisés sur le territoire concerné » (article 194, III, 5° de la loi Climat et résilience). Le bilan de consommation d'espaces NAF (Naturels, Agricoles et Forestiers) s'effectue à l'échelle d'un document de planification ou d'urbanisme.

    -

    A partir de 2031, cette trajectoire est également mesurée en artificialisation nette des sols, définie comme « le solde de l'artificialisation et de la désartificialisation des sols constatées sur un périmètre et sur une période donnés » (article L.101-2-1 du code de l’urbanisme). L'artificialisation nette des sols se calcule à l'échelle d'un document de planification ou d'urbanisme.

    -
    -
    - -
    -

    Qui doit établir ce rapport ?

    -
    -
    -
    -
    -
    -

    - Les communes -

    -

    dotées d’un document d'urbanisme

    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -

    - Les établissements publics de coopération intercommunale -

    -

    dotés d’un document d'urbanisme

    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -

    - Les services déconcentrés de l’Etat (DDT) -

    -

    Pour les territoires soumis au règlement national d’urbanisme (RNU)

    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -

    L’enjeu est de mesurer et de communiquer régulièrement au sujet du rythme de l’artificialisation des sols, afin d’anticiper et de suivre la trajectoire et sa réduction. Ce rapport doit être présenté à l’organe délibérant, faire l’objet d’un débat et d’une délibération du conseil municipal ou communautaire, et de mesures de publicité. Le rapport est transmis dans un délai de quinze jours suivant sa publication aux préfets de région et de département, au président du conseil régional, au président de l’EPCI dont la commune est membre ou aux maires des communes membres de l’EPCI compétent ainsi qu’aux observatoires locaux de l’habitat et du foncier.

    -
    - -
    -

    Quand doit être établi ce rapport et sur quelle période ?

    -

    Le premier rapport doit être réalisé 3 ans après l'entrée en vigueur de la loi, soit en 2024.

    -

    A noter que c'est le rapport qui est triennal, et non la période à couvrir par le rapport :

    -
      -
    • Il faut que le rapport soit produit a minima tous les 3 ans. Il est donc possible pour une collectivité qui le souhaite, de produire un rapport, par exemple tous les ans ou tous les 2 ans.
    • -
    • La période à couvrir n'est pas précisée dans les textes. Étant donné que l’État met à disposition les données des fichiers fonciers depuis le 1er janvier 2011 (le début de la période de référence de la loi CR), il serait intéressant que le rapport présente la chronique des données du 1er janvier 2011 et jusqu'au dernier millésime disponible, pour apprécier la trajectoire du territoire concerné avec le recul nécessaire (les variations annuelles étant toujours à prendre avec prudence car pouvant refléter de simples biais méthodologiques dans les données sources).
    • -
    -
    - -
    -

    Que doit contenir ce rapport ?

    -

    Le contenu minimal obligatoire est détaillé à l’article R. 2231-1 du code général des collectivités territoriales:

    -
    -
    -
    -

    - 1° La consommation des espaces naturels, agricoles et forestiers, exprimée en nombre d'hectares, le cas échéant en la différenciant entre ces types d'espaces, et en pourcentage au regard de la superficie du territoire couvert. -

    -

    - Sur le même territoire, le rapport peut préciser également la transformation effective d'espaces urbanisés ou construits en espaces naturels, agricoles et forestiers du fait d'une désartificialisation. -

    -

    - Indicateur obligatoire. - Disponible sur Mon Diag Artif, France Métropolitaine, Corse et DROM (sauf Mayotte). -

    -
    -
    -
    -
    -
    -
    -
    -

    - 2° Le solde entre les surfaces artificialisées et les surfaces désartificialisées, -

    -

    - telles que définies dans la nomenclature annexée à l'article R. 101-1 du code de l'urbanisme. -

    -

    - Indicateur non obligatoire. - Disponible sur Mon Diag Artif, pour les territoires avec l'OCS GE. -

    -
    -
    -
    -
    -
    -
    -
    -

    - 3° Les surfaces dont les sols ont été rendus imperméables, -

    -

    - au sens des 1° et 2° de la nomenclature annexée à l'article R. 101-1 du code de l'urbanisme. -

    -

    - Indicateur non obligatoire. - Disponible sur Mon Diag Artif, pour les territoires avec l'OCS GE. -

    -
    -
    -
    -
    -
    -
    -
    -

    - 4° L'évaluation du respect des objectifs de réduction de la consommation d'espaces naturels, agricoles et forestiers et de lutte contre l'artificialisation des sols fixés dans les documents de planification et d'urbanisme. -

    -

    - Les documents de planification sont ceux énumérés au III de l'article R. 101-1 du code de l'urbanisme. -

    -

    - Indicateur non obligatoire. - Non prévu dans Mon Diag Artif. -

    -
    -
    -
    -
    -
    -

    Avant 2031, il n’est pas obligatoire de renseigner les indicateurs 2°, 3° et 4° tant que les documents d'urbanisme n'ont pas intégré cet objectif.

    -
    -
    - -
    -

    Quelles sont les sources d’informations disponibles pour ce rapport ?

    -

    Les données produites par l'observatoire national de l'artificialisation sont disponibles gratuitement.

    -

    MonDiagnosticArtificialisation vous propose une première trame de ce rapport triennal local, en s’appuyant sur les données de l’observatoire nationale disponibles à date, soit:

    -
      -
    • concernant la consommation d’espaces naturels, agricoles et forestiers, les données issues des fichiers fonciers produites annuellement par le Cerema ;
    • -
    • concernant l’artificialisation nette des sols, les données issues de l’occupation des sols à grande échelle (OCS GE) en cours de production par l’IGN, qui seront disponibles sur l’ensemble du territoire national d’ici fin 2025.
    • -
    -

    Il n'est, bien évidemment, pas demandé d'inventer des données non encore disponibles : pour le premier rapport triennal à produire d'ici août 2024 il est possible d'utiliser les fichiers fonciers au 1er janvier 2023, couvrant la consommation d'espaces NAF (Naturels, Agricoles et Forestiers) au titre de l'année 2022. La consommation d'espaces NAF (Naturels, Agricoles et Forestiers) au titre de l’année 2023 n’étant pas disponible à ce jour.

    -

    Il est également possible d’utiliser les données locales, notamment celles des observatoires de l’habitat et du foncier (art. L. 302-1 du code de la construction et de l'habitation) et de s'appuyer sur les analyses réalisées dans le cadre de l'évaluation du schéma de cohérence territoriale (ScoT – art. L. 143-28 du code de l'urbanisme) et de celle du plan local d'urbanisme (art. L. 153-27 du code de l’urbanisme).

    -

    Ces données locales doivent être conformes aux définitions légales de la consommation d'espaces (et le cas échéant de l'artificialisation nette des sols), homogènes et cohérentes sur la décennie de référence de la loi (1er janvier 2011-1er janvier 2021) et sur la décennie en cours (1er janvier 2021-1er janvier 2031).

    -
    -
    -
    - -{% endblock content %} - -{% block tagging %} - -{% endblock tagging %} diff --git a/project/templates/project/report_menu.html b/project/templates/project/report_menu.html deleted file mode 100644 index d900fe09c..000000000 --- a/project/templates/project/report_menu.html +++ /dev/null @@ -1,163 +0,0 @@ - - -{% if project.user is None %} -
    -
    -
    -
    -

    - Vous êtes actuellement en mode "anonyme". Si vous souhaitez retrouver votre diagnostic lors de votre prochaine visite - {% if user.is_authenticated %} - associez le à votre compte. - {% else %} - créez un compte ou connectez-vous. - {% endif %} -

    -
    -
    -
    -
    -{% endif %} diff --git a/project/templates/project/report_synthesis.html b/project/templates/project/report_synthesis.html deleted file mode 100644 index 6c685920f..000000000 --- a/project/templates/project/report_synthesis.html +++ /dev/null @@ -1,265 +0,0 @@ -{% extends "index.html" %} - -{% load static %} -{% load project_tags %} -{% load humanize %} -{% load i18n %} -{% load l10n %} -{% load sri %} - -{% block pagetitle %} -Synthèse -{% endblock pagetitle %} - -{% block headers %} -{% sri_static "project/css/project.css" %} -{% endblock headers %} - -{% block content %} -
    - {% include "project/partials/report_title.html" with title=diagnostic surface=diagnostic.area %} - - {% include "project/report_menu.html" %} - -
    -
    -
    -

    L'article 191 de la Loi Climat & Résilience exprime que :

    -

    « Afin d'atteindre l'objectif national d'absence de toute artificialisation nette des sols en 2050, le rythme de l'artificialisation des sols dans les dix années suivant la promulgation de la présente loi doit être tel que, sur cette période, la consommation totale d'espaces observée à l'échelle nationale soit inférieure à la moitié de celle observée sur les dix années précédant cette date.»

    -
    - - - -
    - - {% include "project/partials/ocsge_status.html" %} - -
    -

    Trajectoires

    -

    Estimation de la trajectoire 2031

    -
    -
    -
    -

    +{{ objective_chart.total_2020|floatformat:1 }} ha

    -

    Bilan consommation d'espaces 2011-2020

    -
    -
    -
    -
    -

    +{{ objective_chart.conso_2031|floatformat:1 }} ha

    -

    Consommation cumulée de la période du 1er jan. 2021 au 31 déc. 2030 (10 ans) avec un objectif non-réglementaire de réduction de {{ diagnostic.target_2031 }}%

    -
    -
    -
    -
    -
    -
    -
    - - Source de données: -

    - FICHIERS FONCIERS -

    -
    - -
    -
    -
    Source
    -

    - Données d'évolution des fichiers fonciers produits et diffusés par le Cerema depuis 2009 à - partir des fichiers MAJIC (Mise A Jour de l'Information Cadastrale) de la DGFIP. Le dernier - millésime de 2023 est la photographie du territoire au 1er janvier 2023, intégrant les évolutions - réalisées au cours de l'année 2022. -

    -
    Calcul
    -

    La Loi Climat & Résilience recommande entre 2021 et 2031 à l'échelle régionale, de diviser par 2 la consommation d'espaces NAF (Naturels, Agricoles et Forestiers) mesurée entre 2011 et 2021 ; le même calcul a été appliqué à l'échelle du territoire comme scénario standard.

    -
    -
    -
    - -
    - -
    -

    Consommation

    -

    Bilan de la consommation d'espaces

    -
    -
    -
    -

    +{{ current_conso|floatformat:1 }} ha

    -

    Consommation d'espaces {{ diagnostic.analyse_start_date }}-{{ diagnostic.analyse_end_date }}

    -
    -
    -
    -
    -

    +{{ year_avg_conso|floatformat:1 }} ha

    -

    Consommation d'espaces moyenne par an entre {{ diagnostic.analyse_start_date }}-{{ diagnostic.analyse_end_date }}

    -
    -
    -
    -
    -
    -
    -
    - - Source de données: -

    - FICHIERS FONCIERS -

    -
    - -
    -
    -
    Source
    -

    - Données d'évolution des fichiers fonciers produits et diffusés par le Cerema depuis 2009 à - partir des fichiers MAJIC (Mise A Jour de l'Information Cadastrale) de la DGFIP. Le dernier - millésime de 2023 est la photographie du territoire au 1er janvier 2023, intégrant les évolutions - réalisées au cours de l'année 2022. -

    -
    Calcul
    -

    Les données du Cerema donnent la consommation d'espaces NAF (Naturels, Agricoles et Forestiers) par année, par destination et par commune.

    -
    -
    -
    - -
    - - {% if diagnostic.has_complete_uniform_ocsge_coverage %} -
    -

    Artificialisation

    -

    Bilan de l'artificialisation nette entre {{ diagnostic.analyse_start_date }} et {{ diagnostic.analyse_end_date }}

    -

    Objectif zéro artificialisation nette en 2050

    -

    Sur la période demandée, l'OCS GE couvre de {{ first_millesime }} à {{ last_millesime }}.

    -
    -
    -
    -

    {{ net_artif|floatformat:1 }} ha

    -

    Artificialisation nette sur la période

    -
    -
    -
    -
    -

    +{{ new_artif|floatformat:1 }} ha

    -

    Total artificialisation sur la période

    -
    -
    -
    -
    -

    +{{ new_natural|floatformat:1 }} ha

    -

    Total désartificialisation sur la période

    -
    -
    -
    -
    -
    -
    -
    - - Source de données: -

    - OCS GE -

    -
    - -
    -
    -
    Source
    -

    OCS GE (millésime min : {{ project.first_year_ocsge }}, millésime max : {{ project.last_year_ocsge }}).

    -
    Calcul
    -

    L'artificialisation nette = artificialisation - désartificialisation sur la période.

    -
    -
    -
    - -
    - - {% if project.has_zonage_urbanisme %} -
    -

    Croisement avec les zonages d'urbanisme

    -

    Artificialisation des zonages d'urbanisme selon les documents d'urbanisme en vigueur

    -

    Sur la période demandée, l'OCS GE couvre de {{ first_millesime }} à {{ last_millesime }}.

    -
    - {% for zone_type, zone in zone_list.items %} -
    -
    -

    -

    -
    -
    {{ zone.fill_up_rate|floatformat:1 }}%
    -
    -

    -

    - Taux d'artificialisation des zones {{ zone_type }} - ({{ zone.type_zone_label }}) -

    -

    - Surface Totale: {{ zone.total_area|floatformat:1 }} ha
    -

    -
    -
    - {% endfor %} -
    - -
    -
    -
    -
    - - Source de données: -

    - OCS GE -

    -
    - -
    -
    -
    Source
    -

    Données OCS GE (OCcupation des Sols à Grande Echelle) de l'IGN, sur la période d'analyse. Zonages d'Urbanisme issus du GPU (Géoportail de l'Urbanisme) en date de juin 2023: https://www.geoportail-urbanisme.gouv.fr/

    - -
    Calcul
    -

    Qualifier l'artificialisation de chaque parcelle OCS GE via la matrice d'artficialisation (consulter). Puis comparer la surface totale des parcelles artificialisées dans chaque zonage d'urbanisme à la surface de la zone pour connaître le taux d'occupation.

    -
    -
    -
    - -
    - {% endif %} - {% endif %} -
    -
    -{% endblock content %} - -{% block tagging %} - -{% endblock tagging %} diff --git a/project/templates/project/report_target_2031.html b/project/templates/project/report_target_2031.html deleted file mode 100644 index 68873695e..000000000 --- a/project/templates/project/report_target_2031.html +++ /dev/null @@ -1,149 +0,0 @@ -{% extends "index.html" %} - -{% load static %} -{% load project_tags %} -{% load humanize %} -{% load i18n %} -{% load l10n %} -{% load highcharts_tags %} -{% load sri %} -{% load crispy_forms_tags %} - -{% block pagetitle %} -Trajectoires -{% endblock pagetitle %} - -{% block headers %} - -{% localize off %} -{% sri_static "highcharts/js/highcharts.js" %} -{% sri_static "highcharts/js/exporting.js" %} -{% french_translation %} -{% endlocalize %} -{% endblock headers %} - -{% block content %} -
    - {% include "project/partials/report_title.html" with title=diagnostic surface=diagnostic.area %} - - {% include "project/report_menu.html" %} - -
    -
    -
    -

    - La loi Climat & Résilience fixe l’objectif d’atteindre le « zéro artificialisation nette des sols » en 2050, avec un objectif intermédiaire - de réduction de moitié de la consommation d’espaces - naturels, agricoles et forestiers dans les dix prochaines années 2021-2031 (en se basant sur les données allant du 01/01/2021 au 31/12/2030) - par rapport à la décennie précédente 2011-2021 (en se basant sur les données allant du 01/01/2011 au 31/12/2020). -

    -

    - Cette trajectoire nationale progressive est à décliner dans les documents de planification et d'urbanisme (avant le 22 novembre 2024 pour les SRADDET, - avant le 22 février 2027 pour les SCoT et avant le 22 février 2028 pour les PLU(i) et cartes communales). -

    -
    - - - -
    - -
    -
    -
    -

    Période de référence

    -
    -

    +{{ target_2031_chart.total_2020|floatformat:1 }} ha

    -

    +{{ target_2031_chart.annual_2020|floatformat:1 }} ha/an

    -
    -

    Consommation cumulée de la période du 1er jan. 2011 au 31 déc. 2020 (10 ans)

    -
    -
    - -
    -
    -

    Projection 2031

    -
    -

    +{{ conso_2031|floatformat:1 }} ha

    -

    +{{ annual_objective_2031|floatformat:1 }} ha/an

    -
    -

    Consommation cumulée de la période du 1er jan. 2021 au 31 déc. 2030 (10 ans) avec un objectif non-réglementaire de réduction de {{ diagnostic.target_2031 }}%

    -

    -
    -
    -
    - -
    - {% include "project/partials/report_target_2031_graphic.html" %} -
    -
    -
    - - - -{% endblock content %} - -{% block tagging %} - -{% endblock tagging %} diff --git a/project/templates/project/report_urban_zones.html b/project/templates/project/report_urban_zones.html deleted file mode 100644 index 615570db2..000000000 --- a/project/templates/project/report_urban_zones.html +++ /dev/null @@ -1,52 +0,0 @@ -{% extends "index.html" %} - -{% load static %} -{% load project_tags %} -{% load humanize %} -{% load i18n %} -{% load l10n %} -{% load sri %} - -{% block pagetitle %} -Zonages d'urbanisme -{% endblock pagetitle %} - -{% block content %} -
    - {% include "project/partials/report_title.html" with title=diagnostic surface=diagnostic.area %} - - {% include "project/report_menu.html" %} - -
    -
    -

    Découvrez notre explorateur des zonages d'urbanisme

    -

    - Croisez les zonages d'urbanisme avec les données de l'OCS GE afin de comprendre l'artificialisation de votre territoire. -

    - - - -
    - - -
    -

    Synthèse des zonages d'urbanisme

    - -
    -
    -
    -
    -{% endblock content %} - -{% block tagging %} - -{% endblock tagging %} diff --git a/project/templates/project/test.html b/project/templates/project/test.html deleted file mode 100644 index 8c4f0b73e..000000000 --- a/project/templates/project/test.html +++ /dev/null @@ -1,24 +0,0 @@ -{% extends "index.html" %} - -{% load static %} - -{% block pagetitle %} -Test Ad Words -{% endblock pagetitle %} - -{% block content %} -Test Ad Words -{% endblock content %} - -{% block tagging %} - -{% endblock tagging %} diff --git a/project/templates/project/update.html b/project/templates/project/update.html deleted file mode 100644 index a4d3d5b19..000000000 --- a/project/templates/project/update.html +++ /dev/null @@ -1,87 +0,0 @@ -{% extends "index.html" %} - -{% load crispy_forms_tags %} -{% load static %} -{% load project_tags %} -{% load humanize %} -{% load i18n %} -{% load l10n %} -{% load sri %} - -{% block pagetitle %} -Modifier -{% endblock pagetitle %} - -{% block headers %} -{% sri_static "project/css/project.css" %} -{% endblock headers %} - -{% block content %} -
    - {% include "project/partials/report_title.html" with title=diagnostic surface=diagnostic.area %} - - {% include "project/report_menu.html" %} - -
    -
    -
    -
    - {% csrf_token %} - {{ form|crispy }} -
    - - -
    - -
    -
    -
    -
    -
    -
    - -
    -
    -
    - - - - Territoires de comparaison -
    - {% if project.look_a_like %} -
    - {% for land in project.get_look_a_like %} -
    - {{ land.name }} - -
    - {% endfor %} -
    - {% else %} -

    Aucun territoire.

    - {% endif %} -
    -
    -
    -{% endblock content %} - -{% block bodyend %} - -{% endblock bodyend %} diff --git a/project/urls.py b/project/urls.py index f8a493566..fc586a812 100644 --- a/project/urls.py +++ b/project/urls.py @@ -1,8 +1,9 @@ from django.urls import path +from django.views.generic.base import RedirectView from rest_framework import routers from . import views -from .api_views import EmpriseViewSet, ProjectViewSet +from .api_views import EmpriseViewSet, ProjectDetailView, ProjectViewSet app_name = "project" @@ -20,14 +21,15 @@ name="splash-progress", ), # CRUD - path("", views.ProjectListView.as_view(), name="list"), - path("/", views.ProjectReportSynthesisView.as_view(), name="detail"), + path("mes-diagnostics", views.ProjectListView.as_view(), name="list"), + path("/", RedirectView.as_view(pattern_name="project:report_synthesis", permanent=True), name="home"), + path("/detail", ProjectDetailView.as_view(), name="project-detail"), path("/ajouter", views.ClaimProjectView.as_view(), name="claim"), path("/edit", views.ProjectUpdateView.as_view(), name="update"), path("/delete/", views.ProjectDeleteView.as_view(), name="delete"), path("/ajouter-voisin", views.ProjectAddLookALike.as_view(), name="lookalike"), path( - "/retirer-voisin/", + "/retirer-voisin", views.ProjectRemoveLookALike.as_view(), name="rm-lookalike", ), @@ -77,11 +79,6 @@ views.ProjectReportUrbanZonesView.as_view(), name="report_urban_zones", ), - path( - "/tableau-de-bord/zones-urbanismes", - views.ProjectReportGpuView.as_view(), - name="report_gpu", - ), path( "/tableau-de-bord/rapport-local", views.ProjectReportLocalView.as_view(), @@ -93,11 +90,6 @@ views.ProjectReportTarget2031GraphView.as_view(), name="target-2031-graphic", ), - path( - "/tableau-de-bord/consommation-relative/surface", - views.ConsoRelativeSurfaceChart.as_view(), - name="relative-surface", - ), path( "/tableau-de-bord/artificialisation/évolution-nette", views.ArtifNetChart.as_view(), @@ -113,36 +105,6 @@ views.ArtifDetailUsaChart.as_view(), name="artif-detail-usa-chart", ), - path( - "/synthèse-des-zonages-d-urbanisme", - views.ProjectReportGpuZoneSynthesisTable.as_view(), - name="synthesis-zone-urba-all", - ), - path( - "/zonages-d-urbanisme/carte-générale", - views.ProjectReportGpuZoneGeneralMap.as_view(), - name="zone-urba-general-map", - ), - path( - "/zonages-d-urbanisme/carte-de-remplissage", - views.ProjectReportGpuZoneFillMap.as_view(), - name="zone-urba-fill-map", - ), - path( - "/consommation/carte", - views.ProjectReportConsoMap.as_view(), - name="conso-map", - ), - path( - "/artificialisation/carte-territoire", - views.ProjectReportArtifTerritoryMap.as_view(), - name="artif-territory-map", - ), - path( - "/artificialisation/carte-villes", - views.ProjectReportArtifCitiesMap.as_view(), - name="artif-cities-map", - ), # MAP path( "/carte/comprendre-mon-artificialisation", @@ -193,8 +155,6 @@ # EXPORT path("exports/", views.ExportListView.as_view(), name="excel"), path("/export-excel", views.ExportExcelView.as_view(), name="export-excel"), - # SUB APPS - path("test", views.TestView.as_view(), name="test"), ] diff --git a/project/views/api.py b/project/views/api.py deleted file mode 100644 index ca1403d9c..000000000 --- a/project/views/api.py +++ /dev/null @@ -1,34 +0,0 @@ -from django.contrib.gis.geos import Polygon -from django.db.models import F, OuterRef, Subquery -from django.http import JsonResponse -from rest_framework import viewsets -from rest_framework.decorators import action -from rest_framework_gis import filters - -from project.mixins import UserQuerysetOrPublicMixin -from project.models import Project -from project.serializers import ProjectCommuneSerializer -from public_data.models import Cerema, Commune - - -class ProjectViewSet(UserQuerysetOrPublicMixin, viewsets.ReadOnlyModelViewSet): - bbox_filter_field = "mpoly" - bbox_filter_include_overlapping = True - filter_backends = (filters.InBBoxFilter,) - queryset = Project.objects.all() - serializer_class = ProjectCommuneSerializer - - @action(detail=True, methods=["get"]) - def communes(self, request): - project = self.get_object() - sum_function = sum([F(f) for f in Cerema.get_art_field(project.analyse_start_date, project.analyse_end_date)]) - qs = Cerema.objects.annotate(artif_area=sum_function) - queryset = Commune.objects.annotate( - artif_area=Subquery(qs.filter(city_insee=OuterRef("insee")).values("artif_area")[:1]) - ) - bbox = self.request.GET.get("bbox", None) - if bbox is not None and len(bbox) > 0: - polygon_box = Polygon.from_bbox(bbox.split(",")) - queryset = queryset.filter(mpoly__within=polygon_box) - serializer = ProjectCommuneSerializer(queryset, many=True) - return JsonResponse(serializer.data, status=200) diff --git a/project/views/crud.py b/project/views/crud.py index 3df9fa97b..519e5923d 100644 --- a/project/views/crud.py +++ b/project/views/crud.py @@ -1,7 +1,7 @@ import celery from django.contrib import messages from django.contrib.auth.mixins import LoginRequiredMixin -from django.http import HttpResponseRedirect +from django.http import HttpResponse from django.shortcuts import get_object_or_404, redirect from django.urls import reverse, reverse_lazy from django.utils import timezone @@ -29,7 +29,7 @@ from public_data.models import AdminRef, Land from utils.views_mixins import BreadCrumbMixin, RedirectURLMixin -from .mixins import GroupMixin +from .mixins import GroupMixin, ReactMixin class ClaimProjectView(LoginRequiredMixin, RedirectView): @@ -53,7 +53,7 @@ def get(self, request, *args, **kwargs): class CreateProjectViews(BreadCrumbMixin, FormView): - template_name = "project/create/advanced_search.html" + template_name = "project/pages/advanced_search.html" form_class = SelectTerritoryForm def get_context_breadcrumbs(self): @@ -105,9 +105,10 @@ def form_valid(self, form): return redirect("project:splash", pk=project.id) -class ProjectUpdateView(GroupMixin, UpdateView): +class ProjectUpdateView(ReactMixin, UpdateView): model = Project - template_name = "project/update.html" + partial_template_name = "project/components/dashboard/update.html" + full_template_name = "project/pages/update.html" form_class = UpdateProjectForm context_object_name = "project" @@ -117,16 +118,11 @@ def get_context_data(self, **kwargs): kwargs.update( { "diagnostic": project, - "active_page": "update", + "project_id": project.id, } ) return super().get_context_data(**kwargs) - def get_context_breadcrumbs(self): - breadcrumbs = super().get_context_breadcrumbs() - breadcrumbs.append({"href": None, "title": "Editer"}) - return breadcrumbs - def form_valid(self, form): """If the form is valid, save the associated model.""" from metabase.tasks import async_create_stat_for_project @@ -149,7 +145,7 @@ def form_valid(self, form): class ProjectSetTarget2031View(UpdateView): model = Project - template_name = "project/partials/report_set_target_2031.html" + template_name = "project/components/forms/report_set_target_2031.html" fields = ["target_2031"] context_object_name = "diagnostic" @@ -163,7 +159,7 @@ def form_valid(self, form): class SetProjectPeriodView(GroupMixin, RedirectURLMixin, UpdateView): model = Project - template_name = "project/partials/report_set_period.html" + template_name = "project/components/forms/report_set_period.html" form_class = UpdateProjectPeriodForm context_object_name = "diagnostic" @@ -180,7 +176,7 @@ def form_valid(self, form): class ProjectDeleteView(GroupMixin, LoginRequiredMixin, DeleteView): model = Project - template_name = "project/delete.html" + template_name = "project/pages/delete.html" success_url = reverse_lazy("project:list") def get_context_breadcrumbs(self): @@ -191,59 +187,31 @@ def get_context_breadcrumbs(self): class ProjectAddLookALike(GroupMixin, RedirectURLMixin, FormMixin, DetailView): model = Project - template_name = "project/add_look_a_like.html" + template_name = "project/components/forms/add_territoire_de_comparaison.html" context_object_name = "project" form_class = KeywordForm - def get_success_url(self): - """Add anchor to url if provided in GET parameters.""" - anchor = self.request.GET.get("anchor", None) - if anchor: - return f"{super().get_success_url()}#{anchor}" - return super().get_success_url() - def form_valid(self, form): """If the form is valid, redirect to the supplied URL.""" - kwargs = {"results": Land.search(form.cleaned_data["keyword"], search_for="*")} + kwargs = {"results": Land.search(form.cleaned_data["keyword"], search_for="*"), "form": form} return self.render_to_response(self.get_context_data(**kwargs)) - def get(self, request, *args, **kwargs): - add_public_key = request.GET.get("add", None) + def post(self, request, *args, **kwargs): + add_public_key = request.POST.get("add", None) project = self.get_object() if add_public_key: try: - # if public_key does not exist should raise an exception land = Land(add_public_key) - # use land.public_key to avoid injection project.add_look_a_like(land.public_key) project._change_reason = ProjectChangeReason.USER_ADDED_A_LOOK_A_LIKE project.save(update_fields=["look_a_like"]) - return HttpResponseRedirect(self.get_success_url()) + + response = HttpResponse(status=204) + response["HX-Trigger"] = "force-refresh" # Déclenche l'événement 'force-refresh' + return response except LandException: pass - return super().get(request, *args, **kwargs) - - def get_context_breadcrumbs(self): - breadcrumbs = super().get_context_breadcrumbs() - breadcrumbs += [ - { - "href": reverse_lazy("project:update", kwargs=self.kwargs), - "title": "Paramètres", - }, - {"href": None, "title": "Ajouter un territoire de comparaison"}, - ] - return breadcrumbs - def get_context_data(self, **kwargs): - kwargs["next"] = self.request.GET.get("next", None) - kwargs["anchor"] = self.request.GET.get("anchor", None) - return super().get_context_data(**kwargs) - - def post(self, request, *args, **kwargs): - """ - Handle POST requests: instantiate a form instance with the passed - POST variables and then check if it's valid. - """ form = self.get_form() if form.is_valid(): return self.form_valid(form) @@ -251,32 +219,28 @@ def post(self, request, *args, **kwargs): return self.form_invalid(form) -class ProjectRemoveLookALike(GroupMixin, RedirectURLMixin, DetailView): - """Remove a look a like from the project. - - Providing a next page in the url parameter is required. - """ +class ProjectRemoveLookALike(DetailView): + """Supprime un territoire de comparaison du projet.""" model = Project - def get_success_url(self): - """Add anchor to url if provided in GET parameters.""" - anchor = self.request.GET.get("anchor", None) - if anchor: - return f"{super().get_success_url()}#{anchor}" - return super().get_success_url() - - def get(self, request, *args, **kwargs): + def post(self, request, *args, **kwargs): project = self.get_object() - public_key = self.kwargs["public_key"] + + public_key = request.POST.get("public_key") + project.remove_look_a_like(public_key) project._change_reason = ProjectChangeReason.USER_REMOVED_A_LOOK_A_LIKE project.save(update_fields=["look_a_like"]) - return HttpResponseRedirect(self.get_success_url()) + + response = HttpResponse(status=204) + # Ajoute un en-tête HTMX personnalisé pour forcer le rechargement du composant React Consommation.tsx + response["HX-Trigger"] = "force-refresh" + return response class ProjectListView(GroupMixin, LoginRequiredMixin, ListView): - template_name = "project/list.html" + template_name = "project/pages/list.html" context_object_name = "projects" # override to add an "s" def get_queryset(self): @@ -285,7 +249,7 @@ def get_queryset(self): class SplashScreenView(GroupMixin, DetailView): model = Project - template_name = "project/create/splash_screen.html" + template_name = "project/pages/splash_screen.html" context_object_name = "diagnostic" def get_context_breadcrumbs(self): @@ -298,13 +262,13 @@ def get_context_breadcrumbs(self): class SplashProgressionView(GroupMixin, DetailView): model = Project - template_name = "project/create/fragment_splash_progress.html" + template_name = "project/components/widgets/fragment_splash_progress.html" context_object_name = "diagnostic" def dispatch(self, *args, **kwargs): response = super().dispatch(*args, **kwargs) if self.object.is_ready_to_be_displayed: - response["HX-Redirect"] = reverse("project:detail", kwargs=self.kwargs) + response["HX-Redirect"] = reverse("project:home", kwargs=self.kwargs) return response def get_context_data(self, **kwargs): diff --git a/project/views/dev.py b/project/views/dev.py index c4d68f21c..e98501d1f 100644 --- a/project/views/dev.py +++ b/project/views/dev.py @@ -6,7 +6,7 @@ class AllChartsForPreview(ProjectReportBaseView): - template_name = "project/all_charts_for_preview.html" + template_name = "project/dev/all_charts_for_preview.html" breadcrumbs_title = "Rapport consommation" def get_context_data(self, **kwargs): diff --git a/project/views/mixins.py b/project/views/mixins.py index f4ef670a6..b0a9348b6 100644 --- a/project/views/mixins.py +++ b/project/views/mixins.py @@ -48,7 +48,7 @@ def get_context_breadcrumbs(self): project = self.get_object() breadcrumbs.append( { - "href": reverse_lazy("project:detail", kwargs={"pk": project.id}), + "href": reverse_lazy("project:home", kwargs={"pk": project.id}), "title": project.name, } ) @@ -70,3 +70,13 @@ def _build_error_message(self): page_name = getattr(self, "breadcrumbs_title", "cette page") page_name_literal = "à la page " + page_name if page_name != "cette page" else page_name return f"Vous ne pouvez pas accéder {page_name_literal} car l'OCS GE n'est pas disponible pour ce territoire." + + +class ReactMixin: + partial_template_name = "" + full_template_name = "" + + def get_template_names(self): + if self.request.headers.get("X-Requested-With") == "XMLHttpRequest": + return [self.partial_template_name] + return [self.full_template_name] diff --git a/project/views/report.py b/project/views/report.py index 4a10a1e18..cd3ca7c43 100644 --- a/project/views/report.py +++ b/project/views/report.py @@ -1,8 +1,8 @@ from decimal import InvalidOperation -from functools import cached_property from typing import Any, Dict import pandas as pd +from django.conf import settings from django.contrib import messages from django.contrib.gis.db.models.functions import Area from django.contrib.gis.geos import Polygon @@ -11,7 +11,7 @@ from django.db.models.functions import Cast, Concat from django.db.models.query import QuerySet from django.http import HttpRequest, HttpResponse, HttpResponseRedirect -from django.shortcuts import redirect +from django.shortcuts import redirect, render from django.urls import reverse from django.views.generic import CreateView, DetailView, TemplateView @@ -50,16 +50,10 @@ from utils.htmx import StandAloneMixin from utils.views_mixins import CacheMixin -from .mixins import ( - BreadCrumbMixin, - GroupMixin, - OcsgeCoverageMixin, - UserQuerysetOrPublicMixin, -) +from .mixins import ReactMixin -class ProjectReportBaseView(CacheMixin, GroupMixin, DetailView): - breadcrumbs_title = "To be set" +class ProjectReportBaseView(ReactMixin, CacheMixin, DetailView): context_object_name = "project" queryset = Project.objects.all() @@ -74,15 +68,17 @@ def dispatch(self, request, *args, **kwargs): return redirect("project:splash", pk=project.id) return super().dispatch(request, *args, **kwargs) - def get_context_breadcrumbs(self): - breadcrumbs = super().get_context_breadcrumbs() - breadcrumbs.append({"href": None, "title": self.breadcrumbs_title}) - return breadcrumbs + def get_context_data(self, **kwargs): + project: Project = self.get_object() + + kwargs.update({"project_id": project.id, "HIGHCHART_SERVER": settings.HIGHCHART_SERVER}) + + return super().get_context_data(**kwargs) class ProjectReportConsoView(ProjectReportBaseView): - template_name = "project/report_consommation.html" - breadcrumbs_title = "Rapport consommation" + partial_template_name = "project/components/dashboard/consommation.html" + full_template_name = "project/pages/consommation.html" def get_context_data(self, **kwargs): project: Project = self.get_object() @@ -102,24 +98,39 @@ def get_context_data(self, **kwargs): # Déterminants det_chart = charts.AnnualConsoByDeterminantChart(project) + det_pie_chart = charts.ConsoByDeterminantPieChart( + project, + series=det_chart.get_series(), + ) # comparison chart comparison_chart = charts.AnnualConsoComparisonChart(project) + # surface + surface_chart = charts.SurfaceChart(self.object) + surface_proportional_chart = charts.AnnualConsoProportionalComparisonChart(self.object) + + surface_proportional_table = ConsoProportionalComparisonTableMapper.map( + consommation_progression=PublicDataContainer.consommation_progression_service().get_by_lands( + lands=project.comparison_lands_and_self_land(), + start_date=int(project.analyse_start_date), + end_date=int(project.analyse_end_date), + ) + ) + kwargs.update( { "diagnostic": project, "total_surface": project.area, - "active_page": "consommation", "conso_period": conso_period, + "is_commune": project.land_type == AdminRef.COMMUNE, # charts "determinant_per_year_chart": det_chart, - "determinant_pie_chart": charts.ConsoByDeterminantPieChart( - project, - series=det_chart.get_series(), - ), + "determinant_pie_chart": det_pie_chart, "comparison_chart": comparison_chart, "annual_total_conso_chart": annual_total_conso_chart, + "surface_chart": surface_chart, + "surface_proportional_chart": surface_proportional_chart, # data tables "annual_conso_data_table": annual_conso_data_table, "data_determinant": add_total_line_column(det_chart.get_series()), @@ -130,30 +141,26 @@ def get_context_data(self, **kwargs): end_date=int(project.analyse_end_date), ) ), - "nb_communes": project.cities.count(), + "surface_data_table": surface_chart.get_series(), + "surface_proportional_data_table": surface_proportional_table, } ) return super().get_context_data(**kwargs) -class ProjectReportDicoverOcsgeView(OcsgeCoverageMixin, ProjectReportBaseView): - template_name = "project/report_discover_ocsge.html" - breadcrumbs_title = "Découvrir l'OCS GE" +class ProjectReportDicoverOcsgeView(ProjectReportBaseView): + partial_template_name = "project/components/dashboard/ocsge.html" + full_template_name = "project/pages/ocsge.html" def get_context_data(self, **kwargs): project: Project = self.get_object() - surface_territory = project.area - kwargs = { - "diagnostic": project, - "nom": "Rapport découvrir l'OCS GE", - "surface_territory": surface_territory, - "active_page": "discover", - } - kwargs.update( { + "diagnostic": project, + "nom": "Rapport découvrir l'OCS GE", + "surface_territory": project.area, "first_millesime": str(project.first_year_ocsge), "last_millesime": str(project.last_year_ocsge), "couv_pie_chart": charts.CouverturePieChart(project), @@ -195,8 +202,8 @@ def get_context_data(self, **kwargs): class ProjectReportSynthesisView(ProjectReportBaseView): - template_name = "project/report_synthesis.html" - breadcrumbs_title = "Synthèse consommation d'espaces et artificialisation" + partial_template_name = "project/components/dashboard/synthese.html" + full_template_name = "project/pages/synthese.html" def get_context_data(self, **kwargs): project: Project = self.get_object() @@ -209,7 +216,6 @@ def get_context_data(self, **kwargs): kwargs.update( { "diagnostic": project, - "active_page": "synthesis", "total_surface": total_surface, "new_artif": progression_time_scoped["new_artif"], "new_natural": progression_time_scoped["new_natural"], @@ -226,8 +232,8 @@ def get_context_data(self, **kwargs): class ProjectReportLocalView(ProjectReportBaseView): - template_name = "project/report_local.html" - breadcrumbs_title = "Rapport triennal local" + partial_template_name = "project/components/dashboard/rapport_local.html" + full_template_name = "project/pages/rapport_local.html" def get_context_data(self, **kwargs): project: Project = self.get_object() @@ -235,15 +241,14 @@ def get_context_data(self, **kwargs): kwargs.update( { "diagnostic": project, - "active_page": "local", } ) return super().get_context_data(**kwargs) -class ProjectReportImperView(OcsgeCoverageMixin, ProjectReportBaseView): - template_name = "project/report_imper.html" - breadcrumbs_title = "Imperméabilisation" +class ProjectReportImperView(ProjectReportBaseView): + partial_template_name = "project/components/dashboard/impermeabilisation.html" + full_template_name = "project/pages/impermeabilisation.html" def get_context_data(self, **kwargs): project: Project = self.get_object() @@ -260,7 +265,6 @@ def get_context_data(self, **kwargs): kwargs.update( { "diagnostic": project, - "active_page": "impermeabilisation", "first_millesime": str(project.first_year_ocsge), "last_millesime": str(project.last_year_ocsge), "imper_nette_chart": charts.ImperNetteProgression(project), @@ -276,27 +280,37 @@ def get_context_data(self, **kwargs): return super().get_context_data(**kwargs) -class ProjectReportArtifView(OcsgeCoverageMixin, ProjectReportBaseView): - template_name = "project/report_artif.html" - breadcrumbs_title = "Artificialisation" +class ProjectReportArtifView(ProjectReportBaseView): + partial_template_name = "project/components/dashboard/artificialisation.html" + full_template_name = "project/pages/artificialisation.html" def get_context_data(self, **kwargs): project: Project = self.get_object() total_surface = project.area - - # Retrieve request level of analysis level = self.request.GET.get("level_conso", project.level) + is_commune = (project.land_type == AdminRef.COMMUNE,) kwargs = { "land_type": project.land_type or "COMP", "diagnostic": project, - "active_page": "artificialisation", "total_surface": total_surface, + "is_commune": is_commune, + "level": level, } if project.ocsge_coverage_status != project.OcsgeCoverageStatus.COMPLETE_UNIFORM: return super().get_context_data(**kwargs) + kwargs |= self.get_ocsge_context(project, total_surface) + + if not is_commune: + kwargs |= self.get_comparison_context(project, level) + + kwargs |= self.get_artif_net_table(project) + + return super().get_context_data(**kwargs) + + def get_ocsge_context(self, project, total_surface): first_millesime = project.first_year_ocsge last_millesime = project.last_year_ocsge @@ -304,8 +318,8 @@ def get_context_data(self, **kwargs): rate_artif_area = round(100 * float(artif_area) / float(total_surface)) chart_waterfall = charts.ArtifWaterfallChart(project) - progression_time_scoped = chart_waterfall.get_series() + net_artif = progression_time_scoped["net_artif"] try: @@ -319,8 +333,6 @@ def get_context_data(self, **kwargs): table_evolution_artif = charts.AnnualArtifChart(project).get_series() headers_evolution_artif = table_evolution_artif["Artificialisation"].keys() - chart_comparison = charts.NetArtifComparaisonChart(project, level=level) - detail_couv_artif_chart = charts.ArtifProgressionByCouvertureChart(project) detail_usage_artif_chart = charts.ArtifProgressionByUsageChart(project) @@ -343,7 +355,7 @@ def get_context_data(self, **kwargs): usage_row["last_millesime"] = row["surface"] break - kwargs |= { + return { "first_millesime": str(first_millesime), "last_millesime": str(last_millesime), "artif_area": artif_area, @@ -362,16 +374,16 @@ def get_context_data(self, **kwargs): "detail_usage_artif_chart": detail_usage_artif_chart, "couv_artif_sol": couv_artif_sol, "usage_artif_sol": usage_artif_sol, - "chart_comparison": chart_comparison, - "table_comparison": add_total_line_column(chart_comparison.get_series()), - "level": level, "chart_waterfall": chart_waterfall, - "nb_communes": project.cities.count(), } - kwargs |= self.get_artif_net_table(project) + def get_comparison_context(self, project, level): + chart_comparison = charts.NetArtifComparaisonChart(project, level=level) - return super().get_context_data(**kwargs) + return { + "chart_comparison": chart_comparison, + "table_comparison": add_total_line_column(chart_comparison.get_series()), + } def get_artif_net_table(self, project): qs = project.get_artif_per_maille_and_period() @@ -409,9 +421,9 @@ def get_artif_net_table(self, project): } -class ProjectReportDownloadView(BreadCrumbMixin, CreateView): +class ProjectReportDownloadView(CreateView): model = Request - template_name = "project/report_download.html" + template_name = "project/components/forms/report_download.html" fields = [ "first_name", "last_name", @@ -475,8 +487,8 @@ def form_valid(self, form): class ProjectReportTarget2031View(ProjectReportBaseView): - template_name = "project/report_target_2031.html" - breadcrumbs_title = "Rapport trajectoires" + partial_template_name = "project/components/dashboard/trajectoires.html" + full_template_name = "project/pages/trajectoires.html" def get_context_data(self, **kwargs): diagnostic = self.get_object() @@ -484,26 +496,25 @@ def get_context_data(self, **kwargs): kwargs.update( { "diagnostic": diagnostic, - "active_page": "target_2031", "total_real": target_2031_chart.total_real, "annual_real": target_2031_chart.annual_real, "conso_2031": target_2031_chart.conso_2031, "annual_objective_2031": target_2031_chart.annual_objective_2031, "target_2031_chart": target_2031_chart, + "target_2031_chart_data": target_2031_chart.dict(), } ) return super().get_context_data(**kwargs) class ProjectReportTarget2031GraphView(ProjectReportBaseView): - template_name = "project/partials/report_target_2031_graphic.html" + template_name = "project/components/charts/report_target_2031_graphic.html" def get_context_data(self, **kwargs) -> Dict[str, Any]: diagnostic = self.get_object() target_2031_chart = charts.ObjectiveChart(diagnostic) kwargs.update( { - "reload_kpi": True, "diagnostic": diagnostic, "target_2031_chart": target_2031_chart, "total_2020": target_2031_chart.total_2020, @@ -514,17 +525,25 @@ def get_context_data(self, **kwargs) -> Dict[str, Any]: ) return super().get_context_data(**kwargs) + def get(self, request, *args, **kwargs): + # Récupération du contexte via la méthode dédiée + context = self.get_context_data(**kwargs) + # Rendu du template avec le contexte obtenu + return render(request, self.template_name, context) + -class ProjectReportUrbanZonesView(OcsgeCoverageMixin, ProjectReportBaseView): - template_name = "project/report_urban_zones.html" - breadcrumbs_title = "Zonages d'urbanisme" +class ProjectReportUrbanZonesView(ProjectReportBaseView): + partial_template_name = "project/components/dashboard/gpu.html" + full_template_name = "project/pages/gpu.html" def get_context_data(self, **kwargs): project = self.get_object() kwargs.update( { "diagnostic": project, - "active_page": "urban_zones", + "zone_list": project.get_artif_per_zone_urba_type(), + "first_year_ocsge": str(project.first_year_ocsge), + "last_year_ocsge": str(project.last_year_ocsge), } ) @@ -532,7 +551,7 @@ def get_context_data(self, **kwargs): class DownloadWordView(TemplateView): - template_name = "project/error_download_word.html" + template_name = "project/pages/error_download_word.html" def get(self, request, *args, **kwargs): """Redirect vers le fichier word du diagnostic si: le diagnostic est public ou est associé à l'utilisateur @@ -552,42 +571,12 @@ def get(self, request, *args, **kwargs): return super().get(request, *args, **kwargs) -class ConsoRelativeSurfaceChart(CacheMixin, UserQuerysetOrPublicMixin, DetailView): - context_object_name = "project" - queryset = Project.objects.all() - template_name = "project/partials/surface_comparison_conso.html" - - def get_context_data(self, **kwargs): - project: Project = self.get_object() - surface_chart = charts.SurfaceChart(self.object) - surface_proportional_chart = charts.AnnualConsoProportionalComparisonChart(self.object) - - surface_proportional_table = ConsoProportionalComparisonTableMapper.map( - consommation_progression=PublicDataContainer.consommation_progression_service().get_by_lands( - lands=project.comparison_lands_and_self_land(), - start_date=int(project.analyse_start_date), - end_date=int(project.analyse_end_date), - ) - ) - - kwargs.update( - { - "diagnostic": self.object, - "surface_chart": surface_chart, - "surface_data_table": surface_chart.get_series(), - "surface_proportional_chart": surface_proportional_chart, - "surface_proportional_data_table": surface_proportional_table, - } - ) - return super().get_context_data(**kwargs) - - class ArtifZoneUrbaView(CacheMixin, StandAloneMixin, DetailView): """Content of the pannel in Urba Area Explorator.""" queryset = ZoneUrba.objects.all() context_object_name = "zone_urba" - template_name = "project/partials/artif_zone_urba.html" + template_name = "project/components/charts/artif_zone_urba.html" def get_object(self) -> QuerySet[Any]: return ZoneUrba.objects.get(checksum=self.kwargs["checksum"]) @@ -613,7 +602,7 @@ def get_context_data(self, **kwargs): class ArtifNetChart(CacheMixin, TemplateView): - template_name = "project/partials/artif_net_chart.html" + template_name = "project/components/charts/artif_net_chart.html" def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: self.diagnostic = Project.objects.get(pk=self.kwargs["pk"]) @@ -675,7 +664,7 @@ def get_context_data(self, **kwargs: Any) -> Dict[str, Any]: class ArtifDetailCouvChart(CacheMixin, TemplateView): - template_name = "project/partials/artif_detail_couv_chart.html" + template_name = "project/components/charts/artif_detail_couv_chart.html" def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: self.diagnostic = Project.objects.get(pk=self.kwargs["pk"]) @@ -758,7 +747,7 @@ def get_context_data(self, **kwargs: Any) -> Dict[str, Any]: class ArtifDetailUsaChart(CacheMixin, TemplateView): - template_name = "project/partials/artif_detail_usage_chart.html" + template_name = "project/components/charts/artif_detail_usage_chart.html" def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: self.diagnostic = Project.objects.get(pk=self.kwargs["pk"]) @@ -838,80 +827,3 @@ def get_context_data(self, **kwargs: Any) -> Dict[str, Any]: "detail_total_artif_period": sum(_["last_millesime"] for _ in detail_usage_artif_table), } return super().get_context_data(**kwargs) - - -class TestView(TemplateView): - template_name = "project/test.html" - - -class ProjectReportGpuView(ProjectReportBaseView): - template_name = "project/report_gpu.html" - breadcrumbs_title = "Rapport Zones d'urbanisme" - - def get_context_data(self, **kwargs): - project = self.get_object() - kwargs.update( - { - "diagnostic": project, - "active_page": "gpu", - } - ) - - return super().get_context_data(**kwargs) - - -class ProjectReportGpuZoneSynthesisTable(CacheMixin, StandAloneMixin, TemplateView): - template_name = "project/partials/zone_urba_aggregated_table.html" - - @cached_property - def diagnostic(self): - return Project.objects.get(pk=self.kwargs["pk"]) - - def should_cache(self, *args, **kwargs): - if not self.diagnostic.theme_map_gpu: - return False - return True - - def get_context_data(self, **kwargs): - kwargs |= { - "zone_list": self.diagnostic.get_artif_per_zone_urba_type(), - "diagnostic": self.diagnostic, - "first_year_ocsge": str(self.diagnostic.first_year_ocsge), - "last_year_ocsge": str(self.diagnostic.last_year_ocsge), - } - return super().get_context_data(**kwargs) - - -class ProjectReportGpuZoneGeneralMap(StandAloneMixin, TemplateView): - template_name = "project/partials/zone_urba_general_map.html" - - def get_context_data(self, **kwargs): - return super().get_context_data(diagnostic=Project.objects.get(pk=self.kwargs["pk"]), **kwargs) - - -class ProjectReportGpuZoneFillMap(StandAloneMixin, TemplateView): - template_name = "project/partials/zone_urba_fill_map.html" - - def get_context_data(self, **kwargs): - return super().get_context_data(diagnostic=Project.objects.get(pk=self.kwargs["pk"]), **kwargs) - - -class ProjectReportConsoMap(StandAloneMixin, TemplateView): - template_name = "project/partials/conso_map.html" - - def get_context_data(self, **kwargs): - return super().get_context_data(diagnostic=Project.objects.get(pk=self.kwargs["pk"]), **kwargs) - - -class ProjectReportArtifTerritoryMap(StandAloneMixin, TemplateView): - template_name = "project/partials/artif_territory_map.html" - - def get_context_data(self, **kwargs): - return super().get_context_data(diagnostic=Project.objects.get(pk=self.kwargs["pk"]), **kwargs) - - -class ProjectReportArtifCitiesMap(StandAloneMixin, TemplateView): - template_name = "project/partials/artif_cities_map.html" - - def get_context_data(self, **kwargs): - return super().get_context_data(diagnostic=Project.objects.get(pk=self.kwargs["pk"]), **kwargs) diff --git a/public_data/admin/CeremaAdmin.py b/public_data/admin/CeremaAdmin.py index 47a3b9e00..f266f6526 100644 --- a/public_data/admin/CeremaAdmin.py +++ b/public_data/admin/CeremaAdmin.py @@ -4,7 +4,7 @@ @admin.register(Cerema) -class CeremaAdmin(admin.GeoModelAdmin): +class CeremaAdmin(admin.GISModelAdmin): model = Cerema list_display = ( "city_insee", diff --git a/public_data/admin/CommuneAdmin.py b/public_data/admin/CommuneAdmin.py index 6c53c6005..c4236eb8e 100644 --- a/public_data/admin/CommuneAdmin.py +++ b/public_data/admin/CommuneAdmin.py @@ -4,7 +4,7 @@ @admin.register(Commune) -class CommuneAdmin(admin.GeoModelAdmin): +class CommuneAdmin(admin.GISModelAdmin): model = Commune list_display = ( "insee", diff --git a/public_data/admin/CommunePopAdmin.py b/public_data/admin/CommunePopAdmin.py index 2b6526ba1..1f21922cf 100644 --- a/public_data/admin/CommunePopAdmin.py +++ b/public_data/admin/CommunePopAdmin.py @@ -4,5 +4,5 @@ @admin.register(CommunePop) -class CommunePopAdmin(admin.GeoModelAdmin): +class CommunePopAdmin(admin.GISModelAdmin): model = CommunePop diff --git a/public_data/admin/DataSourceAdmin.py b/public_data/admin/DataSourceAdmin.py deleted file mode 100644 index 660bc152d..000000000 --- a/public_data/admin/DataSourceAdmin.py +++ /dev/null @@ -1,21 +0,0 @@ -from django.contrib.gis import admin - -from public_data.models import DataSource - - -@admin.register(DataSource) -class DataSourceAdmin(admin.ModelAdmin): - model = DataSource - list_display = ( - "dataset", - "name", - "official_land_id", - "millesimes", - ) - search_fields = ( - "productor", - "dataset", - "name", - "official_land_id", - ) - ordering = ("productor", "dataset", "name") diff --git a/public_data/admin/DepartementAdmin.py b/public_data/admin/DepartementAdmin.py index e75296b13..eb0987621 100644 --- a/public_data/admin/DepartementAdmin.py +++ b/public_data/admin/DepartementAdmin.py @@ -4,7 +4,7 @@ @admin.register(Departement) -class DepartementAdmin(admin.GeoModelAdmin): +class DepartementAdmin(admin.GISModelAdmin): model = Departement list_display = ( "id", diff --git a/public_data/admin/EpciAdmin.py b/public_data/admin/EpciAdmin.py index 467e81cf6..570e3e057 100644 --- a/public_data/admin/EpciAdmin.py +++ b/public_data/admin/EpciAdmin.py @@ -4,7 +4,7 @@ @admin.register(Epci) -class EpciAdmin(admin.GeoModelAdmin): +class EpciAdmin(admin.GISModelAdmin): model = Epci list_display = ( "id", diff --git a/public_data/admin/OcsgeAdmin.py b/public_data/admin/OcsgeAdmin.py index c2b387061..943ca2343 100644 --- a/public_data/admin/OcsgeAdmin.py +++ b/public_data/admin/OcsgeAdmin.py @@ -4,7 +4,7 @@ @admin.register(Ocsge) -class OcsgeAdmin(admin.GeoModelAdmin): +class OcsgeAdmin(admin.GISModelAdmin): model = Ocsge list_display = ( "id", diff --git a/public_data/admin/OcsgeArtificialAreaAdmin.py b/public_data/admin/OcsgeArtificialAreaAdmin.py index 6a2261666..4536373e0 100644 --- a/public_data/admin/OcsgeArtificialAreaAdmin.py +++ b/public_data/admin/OcsgeArtificialAreaAdmin.py @@ -4,5 +4,5 @@ @admin.register(ArtificialArea) -class OcsgeArtificialAreaAdmin(admin.GeoModelAdmin): +class OcsgeArtificialAreaAdmin(admin.GISModelAdmin): model = ArtificialArea diff --git a/public_data/admin/OcsgeCommuneDiffAdmin.py b/public_data/admin/OcsgeCommuneDiffAdmin.py index 1a0f5f9ec..fcc0ce327 100644 --- a/public_data/admin/OcsgeCommuneDiffAdmin.py +++ b/public_data/admin/OcsgeCommuneDiffAdmin.py @@ -4,5 +4,5 @@ @admin.register(CommuneDiff) -class OcsgeCommuneDiffAdmin(admin.GeoModelAdmin): +class OcsgeCommuneDiffAdmin(admin.GISModelAdmin): model = CommuneDiff diff --git a/public_data/admin/OcsgeCommuneSolAdmin.py b/public_data/admin/OcsgeCommuneSolAdmin.py index 07bd2b3b3..18b2f4050 100644 --- a/public_data/admin/OcsgeCommuneSolAdmin.py +++ b/public_data/admin/OcsgeCommuneSolAdmin.py @@ -4,5 +4,5 @@ @admin.register(CommuneSol) -class OcsgeCommuneSolAdmin(admin.GeoModelAdmin): +class OcsgeCommuneSolAdmin(admin.GISModelAdmin): model = CommuneSol diff --git a/public_data/admin/OcsgeDiffAdmin.py b/public_data/admin/OcsgeDiffAdmin.py index b94cd3d14..e25629458 100644 --- a/public_data/admin/OcsgeDiffAdmin.py +++ b/public_data/admin/OcsgeDiffAdmin.py @@ -4,5 +4,5 @@ @admin.register(OcsgeDiff) -class OcsgeDiffAdmin(admin.GeoModelAdmin): +class OcsgeDiffAdmin(admin.GISModelAdmin): model = OcsgeDiff diff --git a/public_data/admin/OcsgeZoneConstruiteAdmin.py b/public_data/admin/OcsgeZoneConstruiteAdmin.py index fd2ddffff..0dbc17c6c 100644 --- a/public_data/admin/OcsgeZoneConstruiteAdmin.py +++ b/public_data/admin/OcsgeZoneConstruiteAdmin.py @@ -4,5 +4,5 @@ @admin.register(ZoneConstruite) -class OcsgeZoneConstruiteAdmin(admin.GeoModelAdmin): +class OcsgeZoneConstruiteAdmin(admin.GISModelAdmin): model = ZoneConstruite diff --git a/public_data/admin/RegionAdmin.py b/public_data/admin/RegionAdmin.py index 8f769583a..7853dab48 100644 --- a/public_data/admin/RegionAdmin.py +++ b/public_data/admin/RegionAdmin.py @@ -4,7 +4,7 @@ @admin.register(Region) -class RegionAdmin(admin.GeoModelAdmin): +class RegionAdmin(admin.GISModelAdmin): model = Region list_display = ( "id", diff --git a/public_data/admin/ScotAdmin.py b/public_data/admin/ScotAdmin.py index 516de0024..675802566 100644 --- a/public_data/admin/ScotAdmin.py +++ b/public_data/admin/ScotAdmin.py @@ -4,5 +4,5 @@ @admin.register(Scot) -class ScotAdmin(admin.GeoModelAdmin): +class ScotAdmin(admin.GISModelAdmin): model = Scot diff --git a/public_data/admin/SudocuhAdmin.py b/public_data/admin/SudocuhAdmin.py index f03dc9ffe..82e0a6ff1 100644 --- a/public_data/admin/SudocuhAdmin.py +++ b/public_data/admin/SudocuhAdmin.py @@ -4,7 +4,7 @@ @admin.register(Sudocuh) -class SudocuhAdmin(admin.GeoModelAdmin): +class SudocuhAdmin(admin.GISModelAdmin): model = Sudocuh list_display = ( "nom_commune", diff --git a/public_data/admin/SudocuhEpciAdmin.py b/public_data/admin/SudocuhEpciAdmin.py index e289a846b..cf6ce8b15 100644 --- a/public_data/admin/SudocuhEpciAdmin.py +++ b/public_data/admin/SudocuhEpciAdmin.py @@ -4,7 +4,7 @@ @admin.register(SudocuhEpci) -class SudocuhEpciAdmin(admin.GeoModelAdmin): +class SudocuhEpciAdmin(admin.GISModelAdmin): model = SudocuhEpci list_display = ( "nom_epci", diff --git a/public_data/admin/__init__.py b/public_data/admin/__init__.py index 9c45d9d89..d275a5c6d 100644 --- a/public_data/admin/__init__.py +++ b/public_data/admin/__init__.py @@ -1,7 +1,6 @@ from .CeremaAdmin import CeremaAdmin from .CommuneAdmin import CommuneAdmin from .CommunePopAdmin import CommunePopAdmin -from .DataSourceAdmin import DataSourceAdmin from .DepartementAdmin import DepartementAdmin from .EpciAdmin import EpciAdmin from .OcsgeAdmin import OcsgeAdmin @@ -19,7 +18,6 @@ "CeremaAdmin", "CommuneAdmin", "CommunePopAdmin", - "DataSourceAdmin", "DepartementAdmin", "EpciAdmin", "OcsgeAdmin", diff --git a/public_data/factories.py b/public_data/factories.py deleted file mode 100644 index 1ab11dcb2..000000000 --- a/public_data/factories.py +++ /dev/null @@ -1,61 +0,0 @@ -import logging -import re -import secrets -import string -from typing import Any, Callable, Dict, Tuple - -from public_data.models import DataSource - -logger = logging.getLogger(__name__) - - -class LayerMapperFactory: - def __init__(self, data_source: DataSource): - self.data_source = data_source - - def get_class_properties(self, module_name: str) -> Dict[str, Any]: - properties = { - "Meta": type("Meta", (), {"proxy": True}), - "shape_file_path": self.data_source.path, - "departement_id": self.data_source.official_land_id, - "srid": self.data_source.srid, - "__module__": module_name, - } - if self.data_source.mapping: - properties["mapping"] = self.data_source.mapping - return properties - - def get_base_class(self) -> Tuple: - """Return the base class from which the proxy should inherit from. - - The base class returned should be a child of AutoLoadMixin: - >>> if not issubclass(base_class, AutoLoadMixin): - >>> raise TypeError(f"Base class {base_class} should inherit from AutoLoadMixin.") - """ - raise NotImplementedError("You need to define which base class to use.") - - def get_class_name(self) -> str: - """Build a class name in KamelCase. - - Naming rule: Auto{data_name}{official_land_id}{year} - Example: AutoOcsgeDiff3220182021 - """ - unique_token = "".join(secrets.choice(string.ascii_lowercase) for _ in range(5)) - raw_words = [ - "Auto", - unique_token, - self.data_source.name, - self.data_source.official_land_id, - ] + list(map(str, self.data_source.millesimes)) - splited_words = [sub_word for word in raw_words for sub_word in word.split("_")] - cleaned_words = [re.sub(r"[\W_]", "", word) for word in splited_words] - class_name = "".join([word.capitalize() for word in cleaned_words if word]) - return class_name - - def get_layer_mapper_proxy_class(self, module_name: str = __name__) -> Callable: - logger.info("Create class for module=%s", module_name) - return type( - self.get_class_name(), - self.get_base_class(), - self.get_class_properties(module_name), - ) diff --git a/public_data/infra/consommation/progression/highchart/ConsoComparisonMapper.py b/public_data/infra/consommation/progression/highchart/ConsoComparisonMapper.py index 7dc10dff3..322740322 100644 --- a/public_data/infra/consommation/progression/highchart/ConsoComparisonMapper.py +++ b/public_data/infra/consommation/progression/highchart/ConsoComparisonMapper.py @@ -1,3 +1,4 @@ +from project.charts.constants import HIGHLIGHT_COLOR from public_data.domain.consommation.progression.ConsommationProgression import ( ConsommationProgressionLand, ) @@ -7,7 +8,7 @@ class ConsoComparisonMapper: @staticmethod def map(land_id_to_highlight: str, consommation_progression: list[ConsommationProgressionLand]): highlight_style = { - "color": "#ff0000", + "color": HIGHLIGHT_COLOR, "dashStyle": "ShortDash", "lineWidth": 4, } diff --git a/public_data/infra/consommation/progression/highchart/ConsoProportionalComparisonMapper.py b/public_data/infra/consommation/progression/highchart/ConsoProportionalComparisonMapper.py index bbec5d675..df712f131 100644 --- a/public_data/infra/consommation/progression/highchart/ConsoProportionalComparisonMapper.py +++ b/public_data/infra/consommation/progression/highchart/ConsoProportionalComparisonMapper.py @@ -1,3 +1,4 @@ +from project.charts.constants import HIGHLIGHT_COLOR from public_data.domain.consommation.progression.ConsommationProgression import ( ConsommationProgressionLand, ) @@ -7,7 +8,7 @@ class ConsoProportionalComparisonMapper: @staticmethod def map(land_id_to_highlight: str, consommation_progression: list[ConsommationProgressionLand]): highlight_style = { - "color": "#ff0000", + "color": HIGHLIGHT_COLOR, "dashStyle": "ShortDash", "lineWidth": 4, } diff --git a/public_data/infra/impermeabilisation/difference/highchart/ImperNetteMapper.py b/public_data/infra/impermeabilisation/difference/highchart/ImperNetteMapper.py index 7c17a0fcd..c9ebb8739 100644 --- a/public_data/infra/impermeabilisation/difference/highchart/ImperNetteMapper.py +++ b/public_data/infra/impermeabilisation/difference/highchart/ImperNetteMapper.py @@ -1,3 +1,8 @@ +from project.charts.constants import ( + ARTIFICIALISATION_COLOR, + ARTIFICIALISATION_NETTE_COLOR, + DESARTIFICIALISATION_COLOR, +) from public_data.domain.impermeabilisation.difference.ImpermeabilisationDifference import ( ImpermeabilisationDifference, ) @@ -20,16 +25,16 @@ def map(difference: ImpermeabilisationDifference) -> list: { "name": "Imperméabilisation", "data": total_imper_data, - "color": "#ff0000", + "color": ARTIFICIALISATION_COLOR, }, { "name": "Désimperméabilisation", "data": total_desimper_data, - "color": "#00ff00", + "color": DESARTIFICIALISATION_COLOR, }, { "name": "Imperméabilisation nette", "data": imper_nette_data, - "color": "#0000ff", + "color": ARTIFICIALISATION_NETTE_COLOR, }, ] diff --git a/public_data/infra/impermeabilisation/difference/highchart/ImperProgressionMapper.py b/public_data/infra/impermeabilisation/difference/highchart/ImperProgressionMapper.py index 67abe068f..27ad3fbf6 100644 --- a/public_data/infra/impermeabilisation/difference/highchart/ImperProgressionMapper.py +++ b/public_data/infra/impermeabilisation/difference/highchart/ImperProgressionMapper.py @@ -1,3 +1,4 @@ +from project.charts.constants import ARTIFICIALISATION_COLOR, DESARTIFICIALISATION_COLOR from public_data.domain.impermeabilisation.difference.ImpermeabilisationDifference import ( ImpermeabilisationDifference, ImpermeabilisationDifferenceSol, @@ -24,6 +25,7 @@ def _map_usage(usage: list[ImpermeabilisationDifferenceSol]): } for item in usage ], + "color": ARTIFICIALISATION_COLOR, }, { "name": "Désimperméabilisation", @@ -34,6 +36,7 @@ def _map_usage(usage: list[ImpermeabilisationDifferenceSol]): } for item in usage ], + "color": DESARTIFICIALISATION_COLOR, }, ] @@ -49,6 +52,7 @@ def _map_couverture(couverture: list[ImpermeabilisationDifferenceSol]): } for item in couverture ], + "color": ARTIFICIALISATION_COLOR, }, { "name": "Désimperméabilisation", @@ -59,5 +63,6 @@ def _map_couverture(couverture: list[ImpermeabilisationDifferenceSol]): } for item in couverture ], + "color": DESARTIFICIALISATION_COLOR, }, ] diff --git a/public_data/loaders.py b/public_data/loaders.py deleted file mode 100644 index 51e0ef0af..000000000 --- a/public_data/loaders.py +++ /dev/null @@ -1,325 +0,0 @@ -from typing import Self - -from django.contrib.gis.db.models.functions import Area -from django.db.models import DecimalField, F -from django.db.models.functions import Cast - -from public_data.models import ( - SRID, - AutoLoadMixin, - CouvertureUsageMatrix, - Ocsge, - OcsgeDiff, - ZoneConstruite, -) -from public_data.models.cerema import Cerema -from utils.db import DynamicSRIDTransform - - -# syntaxic sugar to avoid writing long line of code -# cache has been added to matrix_dict method -def get_matrix(cs, us): - return CouvertureUsageMatrix().matrix_dict()[(cs, us)] - - -class AutoOcsge(AutoLoadMixin, Ocsge): - class Meta: - proxy = True - - mapping = { - "id_source": "ID", - "couverture": "CODE_CS", - "usage": "CODE_US", - "mpoly": "MULTIPOLYGON", - } - - def save(self, *args, **kwargs) -> Self: - self.year = self.__class__._year - self.departement = self.__class__._departement - self.srid_source = self.srid - - self.matrix = get_matrix(self.couverture, self.usage) - self.is_artificial = bool(self.matrix.is_artificial) - - if self.matrix.couverture: - self.couverture_label = self.matrix.couverture.label - if self.matrix.usage: - self.usage_label = self.matrix.usage.label - - return super().save(*args, **kwargs) - - @classmethod - def clean_data(cls) -> None: - cls.objects.filter( - departement=cls._departement, - year=cls._year, - ).delete() - - @classmethod - def calculate_fields(cls) -> None: - cls.objects.filter( - departement=cls._departement, - year=cls._year, - ).update( - surface=Cast( - Area(DynamicSRIDTransform("mpoly", "srid_source")), - DecimalField(max_digits=15, decimal_places=4), - ) - ) - - -class AutoOcsgeDiff(AutoLoadMixin, OcsgeDiff): - class Meta: - proxy = True - - @classmethod - @property - def mapping(cls) -> dict[str, str]: - return { - "cs_old": f"CS_{cls._year_old}", - "us_old": f"US_{cls._year_old}", - "cs_new": f"CS_{cls._year_new}", - "us_new": f"US_{cls._year_new}", - "mpoly": "MULTIPOLYGON", - } - - def before_save(self) -> None: - self.year_new = self.__class__._year_new - self.year_old = self.__class__._year_old - self.departement = self.__class__._departement - self.srid_source = self.srid - - self.new_matrix = get_matrix(self.cs_new, self.us_new) - self.new_is_artif = bool(self.new_matrix.is_artificial) - - if self.new_matrix.couverture: - self.cs_new_label = self.new_matrix.couverture.label - - if self.new_matrix.usage: - self.us_new_label = self.new_matrix.usage.label - - self.old_matrix = get_matrix(self.cs_old, self.us_old) - self.old_is_artif = bool(self.old_matrix.is_artificial) - - if self.old_matrix.couverture: - self.cs_old_label = self.old_matrix.couverture.label - if self.old_matrix.usage: - self.us_old_label = self.old_matrix.usage.label - - self.is_new_artif = not self.old_is_artif and self.new_is_artif - self.is_new_natural = self.old_is_artif and not self.new_is_artif - - @classmethod - def calculate_fields(cls) -> None: - cls.objects.filter( - departement=cls._departement, - year_new=cls._year_new, - year_old=cls._year_old, - ).update( - surface=Cast( - Area(DynamicSRIDTransform("mpoly", "srid_source")), - DecimalField(max_digits=15, decimal_places=4), - ) - ) - - @classmethod - def clean_data(cls) -> None: - cls.objects.filter( - departement=cls._departement, - year_new=cls._year_new, - year_old=cls._year_old, - ).delete() - - -class AutoZoneConstruite(AutoLoadMixin, ZoneConstruite): - class Meta: - proxy = True - - mapping = { - "id_source": "ID", - "millesime": "MILLESIME", - "mpoly": "MULTIPOLYGON", - } - - def save(self, *args, **kwargs) -> Self: - self.year = int(self._year) - self.departement = self.__class__._departement - self.srid_source = self.srid - self.surface = self.mpoly.transform(self.srid, clone=True).area - self.departement = self._departement - return super().save(*args, **kwargs) - - @classmethod - def clean_data(cls) -> None: - cls.objects.filter( - departement=cls._departement, - year=cls._year, - ).delete() - - -class BaseLoadCerema(AutoLoadMixin, Cerema): - class Meta: - proxy = True - - mapping = { - "city_insee": "IDCOM", - "city_name": "IDCOMTXT", - "region_id": "IDREG", - "region_name": "IDREGTXT", - "dept_id": "IDDEP", - "dept_name": "IDDEPTXT", - "epci_id": "EPCI22", - "epci_name": "EPCI22TXT", - "scot": "SCOT", - "naf09art10": "NAF09ART10", - "art09act10": "ART09ACT10", - "art09hab10": "ART09HAB10", - "art09mix10": "ART09MIX10", - "art09rou10": "ART09ROU10", - "art09fer10": "ART09FER10", - "art09inc10": "ART09INC10", - "naf10art11": "NAF10ART11", - "art10act11": "ART10ACT11", - "art10hab11": "ART10HAB11", - "art10mix11": "ART10MIX11", - "art10rou11": "ART10ROU11", - "art10fer11": "ART10FER11", - "art10inc11": "ART10INC11", - "naf11art12": "NAF11ART12", - "art11act12": "ART11ACT12", - "art11hab12": "ART11HAB12", - "art11mix12": "ART11MIX12", - "art11rou12": "ART11ROU12", - "art11fer12": "ART11FER12", - "art11inc12": "ART11INC12", - "naf12art13": "NAF12ART13", - "art12act13": "ART12ACT13", - "art12hab13": "ART12HAB13", - "art12mix13": "ART12MIX13", - "art12rou13": "ART12ROU13", - "art12fer13": "ART12FER13", - "art12inc13": "ART12INC13", - "naf13art14": "NAF13ART14", - "art13act14": "ART13ACT14", - "art13hab14": "ART13HAB14", - "art13mix14": "ART13MIX14", - "art13rou14": "ART13ROU14", - "art13fer14": "ART13FER14", - "art13inc14": "ART13INC14", - "naf14art15": "NAF14ART15", - "art14act15": "ART14ACT15", - "art14hab15": "ART14HAB15", - "art14mix15": "ART14MIX15", - "art14rou15": "ART14ROU15", - "art14fer15": "ART14FER15", - "art14inc15": "ART14INC15", - "naf15art16": "NAF15ART16", - "art15act16": "ART15ACT16", - "art15hab16": "ART15HAB16", - "art15mix16": "ART15MIX16", - "art15rou16": "ART15ROU16", - "art15fer16": "ART15FER16", - "art15inc16": "ART15INC16", - "naf16art17": "NAF16ART17", - "art16act17": "ART16ACT17", - "art16hab17": "ART16HAB17", - "art16mix17": "ART16MIX17", - "art16rou17": "ART16ROU17", - "art16fer17": "ART16FER17", - "art16inc17": "ART16INC17", - "naf17art18": "NAF17ART18", - "art17act18": "ART17ACT18", - "art17hab18": "ART17HAB18", - "art17mix18": "ART17MIX18", - "art17rou18": "ART17ROU18", - "art17fer18": "ART17FER18", - "art17inc18": "ART17INC18", - "naf18art19": "NAF18ART19", - "art18act19": "ART18ACT19", - "art18hab19": "ART18HAB19", - "art18mix19": "ART18MIX19", - "art18rou19": "ART18ROU19", - "art18fer19": "ART18FER19", - "art18inc19": "ART18INC19", - "naf19art20": "NAF19ART20", - "art19act20": "ART19ACT20", - "art19hab20": "ART19HAB20", - "art19mix20": "ART19MIX20", - "art19rou20": "ART19ROU20", - "art19fer20": "ART19FER20", - "art19inc20": "ART19INC20", - "naf20art21": "NAF20ART21", - "art20act21": "ART20ACT21", - "art20hab21": "ART20HAB21", - "art20mix21": "ART20MIX21", - "art20rou21": "ART20ROU21", - "art20fer21": "ART20FER21", - "art20inc21": "ART20INC21", - "naf21art22": "NAF21ART22", - "art21act22": "ART21ACT22", - "art21hab22": "ART21HAB22", - "art21mix22": "ART21MIX22", - "art21rou22": "ART21ROU22", - "art21fer22": "ART21FER22", - "art21inc22": "ART21INC22", - "mpoly": "MULTIPOLYGON", - # mis dans la table tel quel (pas d'usage à date) - "naf09art22": "NAF09ART22", - "art09act22": "ART09ACT22", - "art09hab22": "ART09HAB22", - "art09mix22": "ART09MIX22", - "art09inc22": "ART09INC22", - "art09rou22": "ART09ROU22", - "art09fer22": "ART09FER22", - "artcom2020": "ARTCOM2020", - "pop13": "POP13", - "pop19": "POP19", - "pop1319": "POP1319", - "men13": "MEN13", - "men19": "MEN19", - "men1319": "MEN1319", - "emp13": "EMP13", - "emp19": "EMP19", - "emp1319": "EMP1319", - "mepart1319": "MEPART1319", - "menhab1319": "MENHAB1319", - "artpop1319": "ARTPOP1319", - "surfcom2022": "SURFCOM202", - "aav2020": "AAV2020", - "aav2020txt": "AAV2020TXT", - "aav2020_ty": "AAV2020_TY", - } - - def __str__(self): - return f"{self.region_name}-{self.dept_name}-{self.city_name}({self.city_insee})" - - @classmethod - def calculate_fields(cls): - """Calculate fields to speedup user consultation.""" - fields = cls.get_art_field(2011, 2020) - kwargs = { - "naf11art21": sum([F(f) for f in fields]), - "art11hab21": sum([F(f.replace("art", "hab").replace("naf", "art")) for f in fields]), - "art11act21": sum([F(f.replace("art", "act").replace("naf", "art")) for f in fields]), - } - cls.objects.update(**kwargs) - - @classmethod - def clean_data(cls): - cls.objects.filter(srid_source=SRID.LAMBERT_93).delete() - - -class BaseLoadCeremaDromCom(BaseLoadCerema): - """ - Base class for DROM COM - NOTE: we exclude surfcom2022 and artcom2020 because they are not available for DROM COM - """ - - class Meta: - proxy = True - - mapping = {k: v for k, v in BaseLoadCerema.mapping.items() if k not in ["surfcom2022", "artcom2020"]} - - @classmethod - def clean_data(cls) -> None: - return cls.objects.filter(dept_id=cls.departement_id).delete() diff --git a/public_data/management/commands/load_cerema.py b/public_data/management/commands/load_cerema.py deleted file mode 100644 index e25e03674..000000000 --- a/public_data/management/commands/load_cerema.py +++ /dev/null @@ -1,65 +0,0 @@ -import logging -from typing import Callable, Tuple - -from django.core.management.base import BaseCommand - -from public_data import loaders -from public_data.factories import LayerMapperFactory -from public_data.models import DataSource - -logger = logging.getLogger("management.commands") - - -class CeremaFactory(LayerMapperFactory): - def get_base_class(self) -> Tuple[Callable]: - base_class = loaders.BaseLoadCeremaDromCom - if self.data_source.official_land_id == "MetropoleEtCorse": - base_class = loaders.BaseLoadCerema - return (base_class,) - - -class Command(BaseCommand): - help = "Load data from Cerema" - - def add_arguments(self, parser): - parser.add_argument( - "--verbose", - action="store_true", - help="reduce output", - ) - parser.add_argument( - "--official_land_ids", - nargs="+", - type=int, - help="Select what to to load using official land id source's property", - ) - - def get_queryset(self): - """Filter sources of data to return only Cerema sources and MAJIC dataset.""" - return DataSource.objects.filter( - productor=DataSource.ProductorChoices.CEREMA, - dataset=DataSource.DatasetChoices.MAJIC, - ) - - def handle(self, *args, **options): - logger.info("Start load_cerema") - - sources = self.get_queryset() - - if options.get("official_land_ids"): - logger.info("filter on official_land_ids=%s", options["official_land_ids"]) - sources = sources.filter(official_land_id__in=options["official_land_ids"]) - - if not sources.exists(): - logger.warning("No data source found") - return - - logger.info("Nb sources found=%d", sources.count()) - - for source in sources: - factory = CeremaFactory(source) - layer_mapper_proxy_class = factory.get_layer_mapper_proxy_class(module_name=__name__) - logger.info("Process %s", layer_mapper_proxy_class.__name__) - layer_mapper_proxy_class.load() - - logger.info("End load_cerema") diff --git a/public_data/managers.py b/public_data/managers.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/public_data/migrations/0012_ocsge2015.py b/public_data/migrations/0012_ocsge2015.py index a59e314b7..d2c2813a4 100644 --- a/public_data/migrations/0012_ocsge2015.py +++ b/public_data/migrations/0012_ocsge2015.py @@ -60,7 +60,6 @@ class Migration(migrations.Migration): ], bases=( models.Model, - public_data.models.mixins.AutoLoadMixin, public_data.models.mixins.DataColorationMixin, ), ), diff --git a/public_data/migrations/0019_ocsge2018.py b/public_data/migrations/0019_ocsge2018.py index e102ccaae..822a6e78a 100644 --- a/public_data/migrations/0019_ocsge2018.py +++ b/public_data/migrations/0019_ocsge2018.py @@ -103,7 +103,6 @@ class Migration(migrations.Migration): }, bases=( models.Model, - public_data.models.mixins.AutoLoadMixin, public_data.models.mixins.DataColorationMixin, ), ), diff --git a/public_data/migrations/0022_auto_20211025_2135.py b/public_data/migrations/0022_auto_20211025_2135.py index 8331cfd6e..34c22a75a 100644 --- a/public_data/migrations/0022_auto_20211025_2135.py +++ b/public_data/migrations/0022_auto_20211025_2135.py @@ -111,7 +111,6 @@ class Migration(migrations.Migration): ], bases=( models.Model, - public_data.models.mixins.AutoLoadMixin, public_data.models.mixins.DataColorationMixin, ), ), diff --git a/public_data/migrations/0028_consocerema.py b/public_data/migrations/0028_consocerema.py index 162c1762d..5f3f65679 100644 --- a/public_data/migrations/0028_consocerema.py +++ b/public_data/migrations/0028_consocerema.py @@ -59,7 +59,6 @@ class Migration(migrations.Migration): ), ], bases=( - public_data.models.mixins.AutoLoadMixin, public_data.models.mixins.DataColorationMixin, models.Model, ), diff --git a/public_data/migrations/0031_auto_20211217_2220.py b/public_data/migrations/0031_auto_20211217_2220.py index 9a9759530..ce4d41b78 100644 --- a/public_data/migrations/0031_auto_20211217_2220.py +++ b/public_data/migrations/0031_auto_20211217_2220.py @@ -115,7 +115,6 @@ class Migration(migrations.Migration): ), ], bases=( - public_data.models.mixins.AutoLoadMixin, public_data.models.mixins.DataColorationMixin, models.Model, ), diff --git a/public_data/migrations/0047_ocsgediff.py b/public_data/migrations/0047_ocsgediff.py index 4c8a41dcc..23e6116cd 100644 --- a/public_data/migrations/0047_ocsgediff.py +++ b/public_data/migrations/0047_ocsgediff.py @@ -150,7 +150,6 @@ class Migration(migrations.Migration): ("is_new_naf", models.BooleanField(blank=True, null=True)), ], bases=( - public_data.models.mixins.AutoLoadMixin, public_data.models.mixins.DataColorationMixin, models.Model, ), diff --git a/public_data/migrations/0048_auto_20220504_1041.py b/public_data/migrations/0048_auto_20220504_1041.py index 8caf53534..7d1a16290 100644 --- a/public_data/migrations/0048_auto_20220504_1041.py +++ b/public_data/migrations/0048_auto_20220504_1041.py @@ -51,7 +51,6 @@ class Migration(migrations.Migration): ), ], bases=( - public_data.models.mixins.AutoLoadMixin, public_data.models.mixins.DataColorationMixin, models.Model, ), diff --git a/public_data/migrations/0064_artificialarea.py b/public_data/migrations/0064_artificialarea.py index 330286d5f..05edb32f2 100644 --- a/public_data/migrations/0064_artificialarea.py +++ b/public_data/migrations/0064_artificialarea.py @@ -53,7 +53,6 @@ class Migration(migrations.Migration): ), ], bases=( - public_data.models.mixins.TruncateTableMixin, public_data.models.mixins.DataColorationMixin, models.Model, ), diff --git a/public_data/migrations/0190_delete_datasource_delete_refplan.py b/public_data/migrations/0190_delete_datasource_delete_refplan.py new file mode 100644 index 000000000..5c3a8c406 --- /dev/null +++ b/public_data/migrations/0190_delete_datasource_delete_refplan.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.13 on 2024-10-02 18:41 + +from django.db import migrations + + +class Migration(migrations.Migration): + dependencies = [ + ("public_data", "0189_alter_commune_options_alter_departement_options_and_more"), + ] + + operations = [ + migrations.DeleteModel( + name="DataSource", + ), + migrations.DeleteModel( + name="RefPlan", + ), + ] diff --git a/public_data/models/__init__.py b/public_data/models/__init__.py index ac022b959..ecb876f37 100644 --- a/public_data/models/__init__.py +++ b/public_data/models/__init__.py @@ -1,7 +1,6 @@ from .administration import * # noqa: F401, F403 +from .cerema import Cerema # noqa: F401 from .couverture_usage import * # noqa: F401, F403 -from .data_source import * # noqa: F401, F403 -from .deprecated import * # noqa: F401, F403 from .gpu import * # noqa: F401, F403 from .mixins import * # noqa: F401, F403 from .ocsge import ArtificialArea, Ocsge, OcsgeDiff, ZoneConstruite # noqa: F401, F403 diff --git a/public_data/models/administration/Commune.py b/public_data/models/administration/Commune.py index a2607029b..7b927e47c 100644 --- a/public_data/models/administration/Commune.py +++ b/public_data/models/administration/Commune.py @@ -1,5 +1,7 @@ from django.contrib.gis.db import models +from django.contrib.postgres.search import TrigramSimilarity from django.core.validators import MaxValueValidator, MinValueValidator +from django.db.models.functions import Lower from public_data.models.cerema import Cerema from public_data.models.enums import SRID @@ -59,6 +61,7 @@ class Meta: default_property = "insee" # need to be set correctly to work default_color = "Yellow" land_type = AdminRef.COMMUNE + land_type_label = AdminRef.CHOICES_DICT[land_type] default_analysis_level = AdminRef.COMMUNE @property @@ -86,11 +89,13 @@ def get_official_id(self) -> str: @classmethod def search(cls, needle, region=None, departement=None, epci=None): + qs = cls.objects.annotate(similarity=TrigramSimilarity(Lower("name__unaccent"), needle.lower())) + if needle.isdigit(): qs = cls.objects.filter(insee__icontains=needle) else: - qs = cls.objects.all() - qs = qs.filter(name__unaccent__trigram_word_similar=needle) + qs = qs.filter(similarity__gt=0.2) # Filtrer par un score minimum de similarité + qs = qs.order_by("-similarity") # Trier par score décroissant if region: qs = qs.filter(departement__region=region) @@ -98,7 +103,7 @@ def search(cls, needle, region=None, departement=None, epci=None): qs = qs.filter(departement=departement) if epci: qs = qs.filter(epci=epci) - qs = qs.order_by("name") + return qs @classmethod diff --git a/public_data/models/administration/Departement.py b/public_data/models/administration/Departement.py index 43bedf7b4..642303b7e 100644 --- a/public_data/models/administration/Departement.py +++ b/public_data/models/administration/Departement.py @@ -1,5 +1,7 @@ from django.contrib.gis.db import models from django.contrib.postgres.fields import ArrayField +from django.contrib.postgres.search import TrigramSimilarity +from django.db.models.functions import Lower from public_data.models.cerema import Cerema from public_data.models.enums import SRID @@ -30,6 +32,7 @@ class Meta: objects = IntersectManager() land_type = AdminRef.DEPARTEMENT + land_type_label = AdminRef.CHOICES_DICT[land_type] default_analysis_level = AdminRef.SCOT @property @@ -47,10 +50,13 @@ def __str__(self): @classmethod def search(cls, needle, region=None, departement=None, epci=None): - qs = cls.objects.filter(name__unaccent__trigram_word_similar=needle) + qs = cls.objects.annotate(similarity=TrigramSimilarity(Lower("name__unaccent"), needle.lower())) + qs = qs.filter(similarity__gt=0.15) # Filtrer par un score minimum de similarité + qs = qs.order_by("-similarity") # Trier par score décroissant + if region: qs = qs.filter(region=region) if departement: qs = qs.filter(id=departement.id) - qs = qs.order_by("name") + return qs diff --git a/public_data/models/administration/Epci.py b/public_data/models/administration/Epci.py index dc526af39..affbd9710 100644 --- a/public_data/models/administration/Epci.py +++ b/public_data/models/administration/Epci.py @@ -1,5 +1,7 @@ from django.apps import apps from django.contrib.gis.db import models +from django.contrib.postgres.search import TrigramSimilarity +from django.db.models.functions import Lower from public_data.models.enums import SRID from utils.db import IntersectManager @@ -27,6 +29,7 @@ class Meta: objects = IntersectManager() land_type = AdminRef.EPCI + land_type_label = AdminRef.CHOICES_DICT[land_type] default_analysis_level = AdminRef.COMMUNE @property @@ -57,12 +60,17 @@ def __str__(self): @classmethod def search(cls, needle, region=None, departement=None, epci=None): - qs = cls.objects.filter(name__unaccent__trigram_word_similar=needle) + qs = cls.objects.annotate(similarity=TrigramSimilarity(Lower("name__unaccent"), needle.lower())) + qs = qs.filter(similarity__gt=0.15) # Filtrer par un score minimum de similarité + qs = qs.order_by("-similarity") # Trier par score décroissant + if region: qs = qs.filter(departements__region=region) if departement: qs = qs.filter(departements__id=departement.id) if epci: qs = qs.filter(id=epci.id) - qs = qs.distinct().order_by("name") + + qs = qs.distinct().order_by("-similarity") + return qs diff --git a/public_data/models/administration/Land.py b/public_data/models/administration/Land.py index d677258fe..0711db3c7 100644 --- a/public_data/models/administration/Land.py +++ b/public_data/models/administration/Land.py @@ -1,4 +1,4 @@ -from typing import Dict +from typing import List from django.contrib.gis.db import models from django.core.exceptions import ObjectDoesNotExist @@ -88,16 +88,19 @@ def get_land_class(cls, land_type): return cls.Meta.subclasses[land_type.upper()] @classmethod - def search(cls, needle, region=None, departement=None, epci=None, search_for=None) -> Dict[str, models.QuerySet]: - """Search for a keyword on all land subclasses""" + def search(cls, needle, region=None, departement=None, epci=None, search_for=None) -> List[models.Model]: + """Search for a keyword on all land subclasses and return a flat list of results ordered by similarity""" if not search_for: - return dict() + return [] if search_for == "*": search_for = cls.Meta.subclasses.keys() - return { - name: subclass.search(needle, region=region, departement=departement, epci=epci) - for name, subclass in cls.Meta.subclasses.items() - if name in search_for - } + results = [] + for name, subclass in cls.Meta.subclasses.items(): + if name in search_for: + subclass_results = subclass.search(needle, region=region, departement=departement, epci=epci) + results.extend(subclass_results) + + results = sorted(results, key=lambda x: x.similarity, reverse=True) # Tri par similarité + return results[:20] # Limiter à 20 résultats diff --git a/public_data/models/administration/Region.py b/public_data/models/administration/Region.py index 8874d19e0..db9996781 100644 --- a/public_data/models/administration/Region.py +++ b/public_data/models/administration/Region.py @@ -1,5 +1,7 @@ from django.apps import apps from django.contrib.gis.db import models +from django.contrib.postgres.search import TrigramSimilarity +from django.db.models.functions import Lower from public_data.models.cerema import Cerema from public_data.models.enums import SRID @@ -27,6 +29,7 @@ class Meta: objects = IntersectManager() land_type = AdminRef.REGION + land_type_label = AdminRef.CHOICES_DICT[land_type] default_analysis_level = AdminRef.DEPARTEMENT @property @@ -41,10 +44,13 @@ def get_ocsge_millesimes(self) -> set: @classmethod def search(cls, needle, region=None, departement=None, epci=None): - qs = cls.objects.filter(name__unaccent__trigram_word_similar=needle) + qs = cls.objects.annotate(similarity=TrigramSimilarity(Lower("name__unaccent"), needle.lower())) + qs = qs.filter(similarity__gt=0.15) # Filtrer par un score minimum de similarité + qs = qs.order_by("-similarity") # Trier par score décroissant + if region: qs = qs.filter(id=region.id) - qs = qs.order_by("name") + return qs @property diff --git a/public_data/models/administration/Scot.py b/public_data/models/administration/Scot.py index 1a5b47490..94e3a7d0c 100644 --- a/public_data/models/administration/Scot.py +++ b/public_data/models/administration/Scot.py @@ -1,4 +1,6 @@ from django.contrib.gis.db import models +from django.contrib.postgres.search import TrigramSimilarity +from django.db.models.functions import Lower from public_data.models.cerema import Cerema from public_data.models.enums import SRID @@ -28,11 +30,12 @@ class Meta: objects = IntersectManager() land_type = AdminRef.SCOT + land_type_label = AdminRef.CHOICES_DICT[land_type] default_analysis_level = AdminRef.EPCI @property def official_id(self) -> str: - return self.siren + return self.name def get_qs_cerema(self): return Cerema.objects.filter(city_insee__in=self.commune_set.values("insee")) @@ -48,10 +51,13 @@ def get_official_id(self) -> str: @classmethod def search(cls, needle, region=None, departement=None, epci=None): - qs = cls.objects.filter(name__unaccent__trigram_word_similar=needle) + qs = cls.objects.annotate(similarity=TrigramSimilarity(Lower("name__unaccent"), needle.lower())) + qs = qs.filter(similarity__gt=0.15) # Filtrer par un score minimum de similarité + qs = qs.order_by("-similarity") # Trier par score décroissant + if region: qs = qs.filter(regions=region) if departement: qs = qs.filter(id=departement.id) - qs = qs.order_by("name") + return qs diff --git a/public_data/models/data_source.py b/public_data/models/data_source.py deleted file mode 100644 index bd670ce07..000000000 --- a/public_data/models/data_source.py +++ /dev/null @@ -1,125 +0,0 @@ -from django.contrib.postgres.fields import ArrayField -from django.db import models - -from public_data.models.enums import SRID - -from .cerema import Cerema -from .ocsge import Ocsge, OcsgeDiff, ZoneConstruite - - -class DataSource(models.Model): - class Meta: - verbose_name = "Source de données" - verbose_name_plural = "Sources de données" - unique_together = ["productor", "dataset", "name", "millesimes", "official_land_id"] - ordering = ["official_land_id", "millesimes", "name"] - - class ProductorChoices(models.TextChoices): - IGN = "IGN", "Institut national de l'information géographique et forestière" - CEREMA = ( - "CEREMA", - "Centre d'études et d'expertise sur les risques, l'environnement, la mobilité et l'aménagement", - ) - MDA = "MDA", "Mon Diagnostic Artficialisation" - - class DatasetChoices(models.TextChoices): - OCSGE = "OCSGE", "Occupation du sol à grande échelle" - MAJIC = "MAJIC", "Mise A Jour des Informations Cadastrales" - ADMIN_EXPRESS = "ADMIN_EXPRESS", "ADMIN EXPRESS" - - class DataNameChoices(models.TextChoices): - OCCUPATION_DU_SOL = "OCCUPATION_DU_SOL", "Couverture et usage du sol" - DIFFERENCE = "DIFFERENCE", "Différence entre deux OCSGE" - ZONE_CONSTRUITE = "ZONE_CONSTRUITE", "Zone construite" - ZONE_ARTIFICIELLE = "ZONE_ARTIFICIELLE", "Zone artificielle" - CONSOMMATION_ESPACE = "CONSOMMATION_ESPACE", "Consommation d'espace" - DEPARTEMENTS = "DEPARTEMENTS", "Départements" - - productor = models.CharField("Producteur", max_length=255, choices=ProductorChoices.choices) - dataset = models.CharField("Jeu de donnée", max_length=255, choices=DatasetChoices.choices) - name = models.CharField( - "Nom", - max_length=255, - choices=DataNameChoices.choices, - help_text="Nom de la couche de données au sein du jeu de donnée", - ) - millesimes = ArrayField( - models.IntegerField(), - verbose_name="Millésime(s)", - blank=True, - null=True, - help_text="Séparer les années par une virgule si la donnée concerne plusieurs années", - ) - mapping = models.JSONField( - blank=True, null=True, help_text="A renseigner uniquement si le mapping n'est pas standard." - ) - path = models.CharField("Chemin sur S3", max_length=255) - shapefile_name = models.CharField("Nom du shapefile", max_length=255) - source_url = models.URLField( - "URL de la source", - blank=True, - null=True, - help_text="Cet URL peut-être le même pour plusieurs sources (par exemple, si contenu dans archive zip)", - ) - official_land_id = models.CharField( - verbose_name="ID du territoire", - help_text=( - "\nID officiel du territoire (code INSEE, SIREN, etc.)
    " - "\nPeut-être vide si la donnée ne concerne pas un territoire spécifique" - "\n(par exemple, s'il concerne la France entière, ou un DROM-COM entier)" - ), - max_length=255, - ) - srid = models.IntegerField( - "SRID", - choices=SRID.choices, - default=SRID.LAMBERT_93, - ) - - def __str__(self) -> str: - return f"{self.productor} - {self.dataset} - {self.official_land_id} - {self.name} - {self.millesimes}" - - def millesimes_string(self) -> str: - return "_".join(map(str, self.millesimes)) - - def get_build_name(self) -> str: - return ( - "_".join( - [ - self.dataset, - self.name, - self.official_land_id, - "_".join(map(str, self.millesimes)), - self.ProductorChoices.MDA, - ] - ) - + ".shp.zip" - ) - - def delete_loaded_data(self): - if self.productor != self.ProductorChoices.MDA: - raise ValueError("Only MDA data can be deleted") - - model: models.Model = { - self.DataNameChoices.OCCUPATION_DU_SOL: Ocsge, - self.DataNameChoices.ZONE_CONSTRUITE: ZoneConstruite, - self.DataNameChoices.DIFFERENCE: OcsgeDiff, - self.DataNameChoices.CONSOMMATION_ESPACE: Cerema, - }[self.name] - - if self.name == self.DataNameChoices.DIFFERENCE: - return model.objects.filter( - departement=self.official_land_id, - year_old=min(self.millesimes), - year_new=max(self.millesimes), - ).delete() - elif self.name == self.DataNameChoices.CONSOMMATION_ESPACE: - if self.official_land_id == "MetropoleEtCorse": - return model.objects.filter(srid_source=self.srid).delete() - else: - return model.objects.filter(dept_id=self.official_land_id).delete() - else: - return model.objects.filter( - departement=self.official_land_id, - year=self.millesimes[0], - ).delete() diff --git a/public_data/models/data_source_fixture.json b/public_data/models/data_source_fixture.json deleted file mode 100644 index 4d987a3ff..000000000 --- a/public_data/models/data_source_fixture.json +++ /dev/null @@ -1,3522 +0,0 @@ -[ - { - "model": "public_data.datasource", - "pk": 1, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "essonne_ocsge_2018.zip", - "shapefile_name": "OCCUPATION_SOL.shp", - "source_url": "https://wxs.ign.fr/c2vbqzbz832vi4tkvvmtsoh6/telechargement/inspire/OCSGE-NG-PACK_1-1$OCS-GE-NG_1-1__SHP_LAMB93_D091_2018-01-01/file/OCS-GE-NG_1-1__SHP_LAMB93_D091_2018-01-01.7z", - "official_land_id": "91", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 2, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "essonne_ocsge_2021.zip", - "shapefile_name": "OCCUPATION_SOL.shp", - "source_url": "https://wxs.ign.fr/c2vbqzbz832vi4tkvvmtsoh6/telechargement/inspire/OCSGE-NG-PACK_1-1$OCS-GE-NG_1-1__SHP_LAMB93_D091_2021-01-01/file/OCS-GE-NG_1-1__SHP_LAMB93_D091_2021-01-01.7z", - "official_land_id": "91", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 3, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "essonne_zone_construite_2018.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": "https://wxs.ign.fr/c2vbqzbz832vi4tkvvmtsoh6/telechargement/inspire/OCSGE-NG-PACK_1-1$OCS-GE-NG_1-1__SHP_LAMB93_D091_2018-01-01/file/OCS-GE-NG_1-1__SHP_LAMB93_D091_2018-01-01.7z", - "official_land_id": "91", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 4, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "essonne_zone_construite_2021.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": "https://wxs.ign.fr/c2vbqzbz832vi4tkvvmtsoh6/telechargement/inspire/OCSGE-NG-PACK_1-1$OCS-GE-NG_1-1__SHP_LAMB93_D091_2021-01-01/file/OCS-GE-NG_1-1__SHP_LAMB93_D091_2021-01-01.7z", - "official_land_id": "91", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 5, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2018\", \"2021\"]", - "mapping": null, - "path": "essonne_diff_2018_2021.zip", - "shapefile_name": "DIFF_91_2021_2018.shp", - "source_url": "https://wxs.ign.fr/c2vbqzbz832vi4tkvvmtsoh6/telechargement/inspire/OCSGE-NG-PACK_1-1_DIFF$OCS-GE-NG_1-1__SHP_LAMB93_D091_DIFF_2018-2021/file/OCS-GE-NG_1-1__SHP_LAMB93_D091_DIFF_2018-2021.7z", - "official_land_id": "91", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 11, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "hauts_de_seine_ocsge_2018_corrige.zip", - "shapefile_name": "hauts_de_seine_ocsge_2018_corrige.shp", - "source_url": "https://wxs.ign.fr/c2vbqzbz832vi4tkvvmtsoh6/telechargement/inspire/OCSGE-NG-PACK_1-1$OCS-GE-NG_1-1__SHP_LAMB93_D092_2018-01-01/file/OCS-GE-NG_1-1__SHP_LAMB93_D092_2018-01-01.7z", - "official_land_id": "92", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 12, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "hauts_de_seine_ocsge_2021_corrige.zip", - "shapefile_name": "hauts_de_seine_ocsge_2021_corrige.shp", - "source_url": "https://wxs.ign.fr/c2vbqzbz832vi4tkvvmtsoh6/telechargement/inspire/OCSGE-NG-PACK_1-1$OCS-GE-NG_1-1__SHP_LAMB93_D092_2021-01-01/file/OCS-GE-NG_1-1__SHP_LAMB93_D092_2021-01-01.7z", - "official_land_id": "92", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 13, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "hauts_de_seine_zone_construite_2018_corrige.zip", - "shapefile_name": "hauts_de_seine_zone_construite_2018_corrige.shp", - "source_url": "https://wxs.ign.fr/c2vbqzbz832vi4tkvvmtsoh6/telechargement/inspire/OCSGE-NG-PACK_1-1$OCS-GE-NG_1-1__SHP_LAMB93_D092_2018-01-01/file/OCS-GE-NG_1-1__SHP_LAMB93_D092_2018-01-01.7z", - "official_land_id": "92", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 14, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "hauts_de_seine_zone_construite_2021_corrige.zip", - "shapefile_name": "hauts_de_seine_zone_construite_2021_corrige.shp", - "source_url": "https://wxs.ign.fr/c2vbqzbz832vi4tkvvmtsoh6/telechargement/inspire/OCSGE-NG-PACK_1-1$OCS-GE-NG_1-1__SHP_LAMB93_D092_2021-01-01/file/OCS-GE-NG_1-1__SHP_LAMB93_D092_2021-01-01.7z", - "official_land_id": "92", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 15, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2018\", \"2021\"]", - "mapping": null, - "path": "hauts_de_seine_diff_2018_2021_corrige.zip", - "shapefile_name": "hauts_de_seine_diff_2018_2021_corrige.shp", - "source_url": "https://wxs.ign.fr/c2vbqzbz832vi4tkvvmtsoh6/telechargement/inspire/OCSGE-NG-PACK_1-1_DIFF$OCS-GE-NG_1-1__SHP_LAMB93_D092_DIFF_2018-2021/file/OCS-GE-NG_1-1__SHP_LAMB93_D092_DIFF_2018-2021.7z", - "official_land_id": "92", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 21, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2017\"]", - "mapping": null, - "path": "seine_et_marne_ocsge_2017.zip", - "shapefile_name": "OCCUPATION_SOL.shp", - "source_url": "https://wxs.ign.fr/c2vbqzbz832vi4tkvvmtsoh6/telechargement/inspire/OCSGE-NG-PACK_1-1$OCS-GE-NG_1-1__SHP_LAMB93_D077_2017-01-01/file/OCS-GE-NG_1-1__SHP_LAMB93_D077_2017-01-01.7z", - "official_land_id": "77", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 22, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "seine_et_marne_ocsge_2021.zip", - "shapefile_name": "OCCUPATION_SOL.shp", - "source_url": "https://wxs.ign.fr/c2vbqzbz832vi4tkvvmtsoh6/telechargement/inspire/OCSGE-NG-PACK_1-1$OCS-GE-NG_1-1__SHP_LAMB93_D077_2021-01-01/file/OCS-GE-NG_1-1__SHP_LAMB93_D077_2021-01-01.7z", - "official_land_id": "77", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 23, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2017\"]", - "mapping": null, - "path": "seine_et_marne_zone_construite_2017.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": "https://wxs.ign.fr/c2vbqzbz832vi4tkvvmtsoh6/telechargement/inspire/OCSGE-NG-PACK_1-1$OCS-GE-NG_1-1__SHP_LAMB93_D077_2017-01-01/file/OCS-GE-NG_1-1__SHP_LAMB93_D077_2017-01-01.7z", - "official_land_id": "77", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 24, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "seine_et_marne_zone_construite_2021.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": "https://wxs.ign.fr/c2vbqzbz832vi4tkvvmtsoh6/telechargement/inspire/OCSGE-NG-PACK_1-1$OCS-GE-NG_1-1__SHP_LAMB93_D077_2021-01-01/file/OCS-GE-NG_1-1__SHP_LAMB93_D077_2021-01-01.7z", - "official_land_id": "77", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 25, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2017\", \"2021\"]", - "mapping": null, - "path": "seine_et_marne_diff_2017_2021.zip", - "shapefile_name": "DIFF_77_2021_2017.shp", - "source_url": "https://wxs.ign.fr/c2vbqzbz832vi4tkvvmtsoh6/telechargement/inspire/OCSGE-NG-PACK_1-1_DIFF$OCS-GE-NG_1-1__SHP_LAMB93_D077_DIFF_2017-2021/file/OCS-GE-NG_1-1__SHP_LAMB93_D077_DIFF_2017-2021.7z", - "official_land_id": "77", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 32, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2017\"]", - "mapping": null, - "path": "ille_et_vilaine_ocsge_2017_corrige.zip", - "shapefile_name": "OCCUPATION_SOL.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE-NG_1-1__SHP_LAMB93_D035_2017/OCS-GE-NG_1-1__SHP_LAMB93_D035_2017.7z", - "official_land_id": "35", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 33, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2020\"]", - "mapping": null, - "path": "ille_et_vilaine_ocsge_2020_corrige.zip", - "shapefile_name": "OCCUPATION_SOL.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE-NG_1-1__SHP_LAMB93_D035_2020/OCS-GE-NG_1-1__SHP_LAMB93_D035_2020.7z", - "official_land_id": "35", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 34, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2017\"]", - "mapping": null, - "path": "ille_et_vilaine_zone_construite_2017.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE-NG_1-1__SHP_LAMB93_D035_2017/OCS-GE-NG_1-1__SHP_LAMB93_D035_2017.7z", - "official_land_id": "35", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 35, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2020\"]", - "mapping": null, - "path": "ille_et_vilaine_zone_construite_2020.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE-NG_1-1__SHP_LAMB93_D035_2020/OCS-GE-NG_1-1__SHP_LAMB93_D035_2020.7z", - "official_land_id": "35", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 36, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2017\", \"2020\"]", - "mapping": null, - "path": "ille_et_vilaine_diff_2017_2020.zip", - "shapefile_name": "DIFF_35_2020_2017.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE-NG_1-1_DIFF_SHP_LAMB93_D035_2017-2020/OCS-GE-NG_1-1_DIFF_SHP_LAMB93_D035_2017-2020.7z", - "official_land_id": "35", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 37, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2017\"]", - "mapping": null, - "path": "var_ocsge_2017_corrige.zip", - "shapefile_name": "OCCUPATION_SOL.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE-NG_1-1__SHP_LAMB93_D083_2017/OCS-GE-NG_1-1__SHP_LAMB93_D083_2017.7z", - "official_land_id": "83", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 39, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2017\", \"2020\"]", - "mapping": null, - "path": "var_diff_2017_2020.zip", - "shapefile_name": "DIFF_83_2020_2017.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE-NG_1-1_DIFF_SHP_LAMB93_D083_2017-2020/OCS-GE-NG_1-1_DIFF_SHP_LAMB93_D083_2017-2020.7z", - "official_land_id": "83", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 40, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2017\"]", - "mapping": null, - "path": "var_zone_construite_2017.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE-NG_1-1__SHP_LAMB93_D083_2017/OCS-GE-NG_1-1__SHP_LAMB93_D083_2017.7z", - "official_land_id": "83", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 42, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "val_de_marne_2018_corrige.zip", - "shapefile_name": "val_de_marne_2018_corrige.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE-NG_1-1__SHP_LAMB93_D094_2018/OCS-GE-NG_1-1__SHP_LAMB93_D094_2018.7z", - "official_land_id": "94", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 43, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "val_de_marne_2021_corrige.zip", - "shapefile_name": "val_de_marne_2021_corrige.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE-NG_1-1__SHP_LAMB93_D094_2021/OCS-GE-NG_1-1__SHP_LAMB93_D094_2021.7z", - "official_land_id": "94", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 44, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "val_de_marne_zone_construite_2018.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE-NG_1-1__SHP_LAMB93_D094_2018/OCS-GE-NG_1-1__SHP_LAMB93_D094_2018.7z", - "official_land_id": "94", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 45, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "val_de_marne_zone_construite_2021.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE-NG_1-1__SHP_LAMB93_D094_2021/OCS-GE-NG_1-1__SHP_LAMB93_D094_2021.7z", - "official_land_id": "94", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 46, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2018\", \"2021\"]", - "mapping": null, - "path": "val_de_marne_18_21_diff.zip", - "shapefile_name": "DIFF_94_2021_2018.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE-NG_1-1_DIFF_SHP_LAMB93_D094_2018-2021/OCS-GE-NG_1-1_DIFF_SHP_LAMB93_D094_2018-2021.7z", - "official_land_id": "94", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 52, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2017\", \"2020\"]", - "mapping": null, - "path": "OCSGE_DIFFERENCE_35_2017_2020_MDA.shp.zip", - "shapefile_name": "DIFFERENCE.shp", - "source_url": null, - "official_land_id": "35", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 53, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2017\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_35_2017_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "35", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 54, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2017\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_35_2017_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "35", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 55, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2020\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_35_2020_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "35", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 56, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2020\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_35_2020_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "35", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 57, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_92_2018_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "92", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 58, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_92_2018_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "92", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 59, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_92_2021_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "92", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 60, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2018\", \"2021\"]", - "mapping": null, - "path": "OCSGE_DIFFERENCE_92_2018_2021_MDA.shp.zip", - "shapefile_name": "DIFFERENCE.shp", - "source_url": null, - "official_land_id": "92", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 61, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_92_2021_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "92", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 62, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_91_2018_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "91", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 63, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_91_2018_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "91", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 64, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2018\", \"2021\"]", - "mapping": null, - "path": "OCSGE_DIFFERENCE_91_2018_2021_MDA.shp.zip", - "shapefile_name": "DIFFERENCE.shp", - "source_url": null, - "official_land_id": "91", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 65, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_91_2021_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "91", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 66, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_91_2021_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "91", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 67, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_40_2018_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "40", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 68, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_40_2018_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "40", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 69, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2018\", \"2021\"]", - "mapping": null, - "path": "OCSGE_DIFFERENCE_40_2018_2021_MDA.shp.zip", - "shapefile_name": "DIFFERENCE.shp", - "source_url": null, - "official_land_id": "40", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 70, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_40_2021_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "40", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 71, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_40_2021_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "40", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 72, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2017\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_77_2017_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "77", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 73, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2017\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_77_2017_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "77", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 74, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2017\", \"2021\"]", - "mapping": null, - "path": "OCSGE_DIFFERENCE_77_2017_2021_MDA.shp.zip", - "shapefile_name": "DIFFERENCE.shp", - "source_url": null, - "official_land_id": "77", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 75, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_77_2021_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "77", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 76, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_77_2021_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "77", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 77, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2017\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_83_2017_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "83", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 78, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2017\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_83_2017_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "83", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 79, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2017\", \"2020\"]", - "mapping": null, - "path": "OCSGE_DIFFERENCE_83_2017_2020_MDA.shp.zip", - "shapefile_name": "DIFFERENCE.shp", - "source_url": null, - "official_land_id": "83", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 80, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2020\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_83_2020_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "83", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 81, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2020\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_83_2020_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "83", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 82, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_94_2018_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "94", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 83, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_94_2018_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "94", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 84, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2018\", \"2021\"]", - "mapping": null, - "path": "OCSGE_DIFFERENCE_94_2018_2021_MDA.shp.zip", - "shapefile_name": "DIFFERENCE.shp", - "source_url": null, - "official_land_id": "94", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 85, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_94_2021_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "94", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 86, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_94_2021_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "94", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 87, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2017\"]", - "mapping": null, - "path": "ocsge_rhone_2017.zip", - "shapefile_name": "OCCUPATION_SOL.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D069_2017-01-01/OCS-GE_2-0__SHP_LAMB93_D069_2017-01-01.7z", - "official_land_id": "69", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 88, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2020\"]", - "mapping": null, - "path": "ocsge_rhone_2020.zip", - "shapefile_name": "OCCUPATION_SOL.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D069_2020-01-01/OCS-GE_2-0__SHP_LAMB93_D069_2020-01-01.7z", - "official_land_id": "69", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 89, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2017\"]", - "mapping": null, - "path": "zone_construite_rhone_2017.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D069_2017-01-01/OCS-GE_2-0__SHP_LAMB93_D069_2017-01-01.7z", - "official_land_id": "69", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 90, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2020\"]", - "mapping": null, - "path": "zone_construite_rhone_2020.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D069_2020-01-01/OCS-GE_2-0__SHP_LAMB93_D069_2020-01-01.7z", - "official_land_id": "69", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 91, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2017\", \"2020\"]", - "mapping": null, - "path": "rhone_diff_17_20.zip", - "shapefile_name": "DIFF_69_2020_2017.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D069_DIFF_2017-2020/OCS-GE_2-0__SHP_LAMB93_D069_DIFF_2017-2020.7z", - "official_land_id": "69", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 92, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2017\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_69_2017_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "69", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 93, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2020\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_69_2020_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "69", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 94, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2017\", \"2020\"]", - "mapping": null, - "path": "OCSGE_DIFFERENCE_69_2017_2020_MDA.shp.zip", - "shapefile_name": "DIFFERENCE.shp", - "source_url": null, - "official_land_id": "69", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 95, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2017\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_69_2017_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "69", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 96, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2020\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_69_2020_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "69", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 97, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_ARTIFICIELLE", - "millesimes": "[\"2017\"]", - "mapping": null, - "path": "OCSGE_ZONE_ARTIFICIELLE_69_2017_MDA.shp.zip", - "shapefile_name": "ZONE_ARTIFICIELLE.shp", - "source_url": null, - "official_land_id": "69", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 98, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_ARTIFICIELLE", - "millesimes": "[\"2020\"]", - "mapping": null, - "path": "OCSGE_ZONE_ARTIFICIELLE_69_2020_MDA.shp.zip", - "shapefile_name": "ZONE_ARTIFICIELLE.shp", - "source_url": null, - "official_land_id": "69", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 99, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_ARTIFICIELLE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_ZONE_ARTIFICIELLE_94_2018_MDA.shp.zip", - "shapefile_name": "ZONE_ARTIFICIELLE.shp", - "source_url": null, - "official_land_id": "94", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 100, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_ARTIFICIELLE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_ZONE_ARTIFICIELLE_94_2021_MDA.shp.zip", - "shapefile_name": "ZONE_ARTIFICIELLE.shp", - "source_url": null, - "official_land_id": "94", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 101, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "isere_ocsge_2018.zip", - "shapefile_name": "OCCUPATION_SOL.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D038_2018-01-01/OCS-GE_2-0__SHP_LAMB93_D038_2018-01-01.7z", - "official_land_id": "38", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 102, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "isere_ocsge_2021.zip", - "shapefile_name": "OCCUPATION_SOL.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D038_2021-01-01/OCS-GE_2-0__SHP_LAMB93_D038_2021-01-01.7z", - "official_land_id": "38", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 103, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "isere_zone_construite_2018.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D038_2018-01-01/OCS-GE_2-0__SHP_LAMB93_D038_2018-01-01.7z", - "official_land_id": "38", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 104, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "isere_zone_construite_2021.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D038_2021-01-01/OCS-GE_2-0__SHP_LAMB93_D038_2021-01-01.7z", - "official_land_id": "38", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 105, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2018\", \"2021\"]", - "mapping": null, - "path": "isere_diff_18_21.zip", - "shapefile_name": "DIFF_38_2021_2018.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D038_DIFF_2018-2021/OCS-GE_2-0__SHP_LAMB93_D038_DIFF_2018-2021.7z", - "official_land_id": "38", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 106, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2018\", \"2021\"]", - "mapping": null, - "path": "OCSGE_DIFFERENCE_38_2018_2021_MDA.shp.zip", - "shapefile_name": "DIFFERENCE.shp", - "source_url": null, - "official_land_id": "38", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 107, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_38_2021_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "38", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 108, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_38_2018_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "38", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 109, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_38_2018_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "38", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 110, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_38_2021_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "38", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 112, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_ARTIFICIELLE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_ZONE_ARTIFICIELLE_38_2018_MDA.shp.zip", - "shapefile_name": "ZONE_ARTIFICIELLE.shp", - "source_url": null, - "official_land_id": "38", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 113, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_ARTIFICIELLE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_ZONE_ARTIFICIELLE_38_2021_MDA.shp.zip", - "shapefile_name": "ZONE_ARTIFICIELLE.shp", - "source_url": null, - "official_land_id": "38", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 123, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2018\", \"2021\"]", - "mapping": null, - "path": "29_DIFFERENCE_2018_2021_IGN_REPACKED.shp.zip", - "shapefile_name": "DIFF_29_2021_2018.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D029_DIFF_2018-2021/OCS-GE_2-0__SHP_LAMB93_D029_DIFF_2018-2021.7z", - "official_land_id": "29", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 124, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "29_OCCUPATION_DU_SOL_2018_IGN_REPACKED.shp.zip", - "shapefile_name": "OCCUPATION_SOL.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D029_2018-01-01/OCS-GE_2-0__SHP_LAMB93_D029_2018-01-01.7z", - "official_land_id": "29", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 125, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "29_OCCUPATION_DU_SOL_2021_IGN_REPACKED.shp.zip", - "shapefile_name": "OCCUPATION_SOL.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D029_2021-01-01/OCS-GE_2-0__SHP_LAMB93_D029_2021-01-01.7z", - "official_land_id": "29", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 126, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "29_ZONE_CONSTRUITE_2021_IGN_REPACKED.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D029_2021-01-01/OCS-GE_2-0__SHP_LAMB93_D029_2021-01-01.7z", - "official_land_id": "29", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 127, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "29_ZONE_CONSTRUITE_2018_IGN_REPACKED.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D029_2018-01-01/OCS-GE_2-0__SHP_LAMB93_D029_2018-01-01.7z", - "official_land_id": "29", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 128, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2018\", \"2021\"]", - "mapping": null, - "path": "37_DIFFERENCE_2018_2021_IGN_REPACKED.shp.zip", - "shapefile_name": "DIFF_37_2021_2018.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D037_DIFF_2018-2021/OCS-GE_2-0__SHP_LAMB93_D037_DIFF_2018-2021.7z", - "official_land_id": "37", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 129, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "37_OCCUPATION_DU_SOL_2021_IGN_REPACKED.shp.zip", - "shapefile_name": "OCCUPATION_SOL.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D037_2021-01-01/OCS-GE_2-0__SHP_LAMB93_D037_2021-01-01.7z", - "official_land_id": "37", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 130, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "37_OCCUPATION_DU_SOL_2018_IGN_REPACKED.shp.zip", - "shapefile_name": "OCCUPATION_SOL.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D037_2018-01-01/OCS-GE_2-0__SHP_LAMB93_D037_2018-01-01.7z", - "official_land_id": "37", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 131, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "37_ZONE_CONSTRUITE_2018_IGN_REPACKED.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D037_2018-01-01/OCS-GE_2-0__SHP_LAMB93_D037_2018-01-01.7z", - "official_land_id": "37", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 132, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "37_ZONE_CONSTRUITE_2021_IGN_REPACKED.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D037_2021-01-01/OCS-GE_2-0__SHP_LAMB93_D037_2021-01-01.7z", - "official_land_id": "37", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 133, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2018\", \"2021\"]", - "mapping": null, - "path": "67_DIFFERENCE_2018_2021_IGN_REPACKED.shp.zip", - "shapefile_name": "DIFF_67_2021_2018.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D067_DIFF_2018-2021/OCS-GE_2-0__SHP_LAMB93_D067_DIFF_2018-2021.7z", - "official_land_id": "67", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 134, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "67_OCCUPATION_DU_SOL_2018_IGN_REPACKED.shp.zip", - "shapefile_name": "OCCUPATION_SOL.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D067_2018-01-01/OCS-GE_2-0__SHP_LAMB93_D067_2018-01-01.7z", - "official_land_id": "67", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 135, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "67_OCCUPATION_DU_SOL_2021_IGN_REPACKED.shp.zip", - "shapefile_name": "OCCUPATION_SOL.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D067_2021-01-01/OCS-GE_2-0__SHP_LAMB93_D067_2021-01-01.7z", - "official_land_id": "67", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 136, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "67_ZONE_CONSTRUITE_2018_IGN_REPACKED.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D067_2018-01-01/OCS-GE_2-0__SHP_LAMB93_D067_2018-01-01.7z", - "official_land_id": "67", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 137, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "67_ZONE_CONSTRUITE_2021_IGN_REPACKED.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D067_2021-01-01/OCS-GE_2-0__SHP_LAMB93_D067_2021-01-01.7z", - "official_land_id": "67", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 149, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2018\", \"2021\"]", - "mapping": null, - "path": "11_DIFFERENCE_2018_2021_IGN_REPACKED.shp.zip", - "shapefile_name": "DIFF_11_2021_2018.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D011_DIFF_2018-2021/OCS-GE_2-0__SHP_LAMB93_D011_DIFF_2018-2021.7z", - "official_land_id": "11", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 154, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2018\", \"2021\"]", - "mapping": null, - "path": "84_DIFFERENCE_2018_2021_IGN_REPACKED.shp.zip", - "shapefile_name": "DIFF_84_2021_2018.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D084_DIFF_2018-2021/OCS-GE_2-0__SHP_LAMB93_D084_DIFF_2018-2021.7z", - "official_land_id": "84", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 155, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "11_OCCUPATION_DU_SOL_2018_IGN_REPACKED.shp.zip", - "shapefile_name": "OCCUPATION_SOL.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D011_2018-01-01/OCS-GE_2-0__SHP_LAMB93_D011_2018-01-01.7z", - "official_land_id": "11", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 156, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "11_OCCUPATION_DU_SOL_2021_IGN_REPACKED.shp.zip", - "shapefile_name": "OCCUPATION_SOL.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D011_2021-01-01/OCS-GE_2-0__SHP_LAMB93_D011_2021-01-01.7z", - "official_land_id": "11", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 157, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "11_ZONE_CONSTRUITE_2018_IGN_REPACKED.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D011_2018-01-01/OCS-GE_2-0__SHP_LAMB93_D011_2018-01-01.7z", - "official_land_id": "11", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 158, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "11_ZONE_CONSTRUITE_2021_IGN_REPACKED.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D011_2021-01-01/OCS-GE_2-0__SHP_LAMB93_D011_2021-01-01.7z", - "official_land_id": "11", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 159, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "84_OCCUPATION_DU_SOL_2018_IGN_REPACKED.shp.zip", - "shapefile_name": "OCCUPATION_SOL.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D084_2018-01-01/OCS-GE_2-0__SHP_LAMB93_D084_2018-01-01.7z", - "official_land_id": "84", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 160, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "84_OCCUPATION_DU_SOL_2021_IGN_REPACKED.shp.zip", - "shapefile_name": "OCCUPATION_SOL.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D084_2021-01-01/OCS-GE_2-0__SHP_LAMB93_D084_2021-01-01.7z", - "official_land_id": "84", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 161, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "84_ZONE_CONSTRUITE_2021_IGN_REPACKED.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D084_2021-01-01/OCS-GE_2-0__SHP_LAMB93_D084_2021-01-01.7z", - "official_land_id": "84", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 162, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "84_ZONE_CONSTRUITE_2018_IGN_REPACKED.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D084_2018-01-01/OCS-GE_2-0__SHP_LAMB93_D084_2018-01-01.7z", - "official_land_id": "84", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 178, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2018\", \"2021\"]", - "mapping": null, - "path": "OCSGE_DIFFERENCE_37_2018_2021_MDA.shp.zip", - "shapefile_name": "DIFFERENCE.shp", - "source_url": null, - "official_land_id": "37", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 179, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_37_2021_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "37", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 180, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_37_2018_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "37", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 181, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_37_2018_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "37", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 182, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_37_2021_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "37", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 183, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_ARTIFICIELLE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_ZONE_ARTIFICIELLE_37_2018_MDA.shp.zip", - "shapefile_name": "ZONE_ARTIFICIELLE.shp", - "source_url": null, - "official_land_id": "37", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 184, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_ARTIFICIELLE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_ZONE_ARTIFICIELLE_37_2021_MDA.shp.zip", - "shapefile_name": "ZONE_ARTIFICIELLE.shp", - "source_url": null, - "official_land_id": "37", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 185, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2018\", \"2021\"]", - "mapping": null, - "path": "OCSGE_DIFFERENCE_67_2018_2021_MDA.shp.zip", - "shapefile_name": "DIFFERENCE.shp", - "source_url": null, - "official_land_id": "67", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 186, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_67_2018_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "67", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 187, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_67_2021_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "67", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 188, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_67_2018_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "67", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 189, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_67_2021_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "67", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 190, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2018\", \"2021\"]", - "mapping": null, - "path": "OCSGE_DIFFERENCE_11_2018_2021_MDA.shp.zip", - "shapefile_name": "DIFFERENCE.shp", - "source_url": null, - "official_land_id": "11", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 191, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_11_2021_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "11", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 192, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_11_2018_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "11", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 193, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_11_2018_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "11", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 194, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_11_2021_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "11", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 195, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_ARTIFICIELLE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_ZONE_ARTIFICIELLE_11_2018_MDA.shp.zip", - "shapefile_name": "ZONE_ARTIFICIELLE.shp", - "source_url": null, - "official_land_id": "11", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 196, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_ARTIFICIELLE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_ZONE_ARTIFICIELLE_11_2021_MDA.shp.zip", - "shapefile_name": "ZONE_ARTIFICIELLE.shp", - "source_url": null, - "official_land_id": "11", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 197, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2018\", \"2021\"]", - "mapping": null, - "path": "OCSGE_DIFFERENCE_29_2018_2021_MDA.shp.zip", - "shapefile_name": "DIFFERENCE.shp", - "source_url": null, - "official_land_id": "29", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 198, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_29_2021_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "29", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 199, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_29_2018_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "29", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 200, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_29_2018_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "29", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 201, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_29_2021_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "29", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 202, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_ARTIFICIELLE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_ZONE_ARTIFICIELLE_29_2018_MDA.shp.zip", - "shapefile_name": "ZONE_ARTIFICIELLE.shp", - "source_url": null, - "official_land_id": "29", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 203, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_ARTIFICIELLE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_ZONE_ARTIFICIELLE_29_2021_MDA.shp.zip", - "shapefile_name": "ZONE_ARTIFICIELLE.shp", - "source_url": null, - "official_land_id": "29", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 204, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_ARTIFICIELLE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_ZONE_ARTIFICIELLE_67_2018_MDA.shp.zip", - "shapefile_name": "ZONE_ARTIFICIELLE.shp", - "source_url": null, - "official_land_id": "67", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 205, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_ARTIFICIELLE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_ZONE_ARTIFICIELLE_67_2021_MDA.shp.zip", - "shapefile_name": "ZONE_ARTIFICIELLE.shp", - "source_url": null, - "official_land_id": "67", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 206, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2018\", \"2021\"]", - "mapping": null, - "path": "OCSGE_DIFFERENCE_84_2018_2021_MDA.shp.zip", - "shapefile_name": "DIFFERENCE.shp", - "source_url": null, - "official_land_id": "84", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 207, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_84_2021_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "84", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 208, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_84_2018_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "84", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 209, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_84_2018_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "84", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 210, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_84_2021_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "84", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 211, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_ARTIFICIELLE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_ZONE_ARTIFICIELLE_84_2018_MDA.shp.zip", - "shapefile_name": "ZONE_ARTIFICIELLE.shp", - "source_url": null, - "official_land_id": "84", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 212, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_ARTIFICIELLE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_ZONE_ARTIFICIELLE_84_2021_MDA.shp.zip", - "shapefile_name": "ZONE_ARTIFICIELLE.shp", - "source_url": null, - "official_land_id": "84", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 218, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2016\", \"2019\"]", - "mapping": null, - "path": "32_DIFFERENCE_2016_2019_IGN_REPACKED.shp.zip", - "shapefile_name": "DIFF_32_2019_2016.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D032_DIFF_2016-2019/OCS-GE_2-0__SHP_LAMB93_D032_DIFF_2016-2019.7z", - "official_land_id": "32", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 220, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2016\"]", - "mapping": null, - "path": "32_OCCUPATION_DU_SOL_2016_IGN_REPACKED.shp.zip", - "shapefile_name": "OCCUPATION_SOL.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D032_2016-01-01/OCS-GE_2-0__SHP_LAMB93_D032_2016-01-01.7z", - "official_land_id": "32", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 221, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2019\"]", - "mapping": null, - "path": "32_OCCUPATION_DU_SOL_2019_IGN_REPACKED.shp.zip", - "shapefile_name": "OCCUPATION_SOL.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D032_2019-01-01/OCS-GE_2-0__SHP_LAMB93_D032_2019-01-01.7z", - "official_land_id": "32", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 222, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2016\"]", - "mapping": null, - "path": "32_ZONE_CONSTRUITE_2016_IGN_REPACKED.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D032_2016-01-01/OCS-GE_2-0__SHP_LAMB93_D032_2016-01-01.7z", - "official_land_id": "32", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 223, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2019\"]", - "mapping": null, - "path": "32_ZONE_CONSTRUITE_2019_IGN_REPACKED.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D032_2019-01-01/OCS-GE_2-0__SHP_LAMB93_D032_2019-01-01.7z", - "official_land_id": "32", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 224, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2016\", \"2019\"]", - "mapping": null, - "path": "OCSGE_DIFFERENCE_32_2016_2019_MDA.shp.zip", - "shapefile_name": "DIFFERENCE.shp", - "source_url": null, - "official_land_id": "32", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 225, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2016\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_32_2016_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "32", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 226, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2019\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_32_2019_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "32", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 227, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2016\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_32_2016_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "32", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 228, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2019\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_32_2019_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "32", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 229, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_ARTIFICIELLE", - "millesimes": "[\"2016\"]", - "mapping": null, - "path": "OCSGE_ZONE_ARTIFICIELLE_32_2016_MDA.shp.zip", - "shapefile_name": "ZONE_ARTIFICIELLE.shp", - "source_url": null, - "official_land_id": "32", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 230, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_ARTIFICIELLE", - "millesimes": "[\"2019\"]", - "mapping": null, - "path": "OCSGE_ZONE_ARTIFICIELLE_32_2019_MDA.shp.zip", - "shapefile_name": "ZONE_ARTIFICIELLE.shp", - "source_url": null, - "official_land_id": "32", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 231, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_ARTIFICIELLE", - "millesimes": "[\"2017\"]", - "mapping": null, - "path": "OCSGE_ZONE_ARTIFICIELLE_35_2017_MDA.shp.zip", - "shapefile_name": "ZONE_ARTIFICIELLE.shp", - "source_url": null, - "official_land_id": "35", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 232, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_ARTIFICIELLE", - "millesimes": "[\"2020\"]", - "mapping": null, - "path": "OCSGE_ZONE_ARTIFICIELLE_35_2020_MDA.shp.zip", - "shapefile_name": "ZONE_ARTIFICIELLE.shp", - "source_url": null, - "official_land_id": "35", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 233, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "66_OCCUPATION_DU_SOL_2021_IGN_REPACKED.shp.zip", - "shapefile_name": "OCCUPATION_SOL.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D066_2021-01-01/OCS-GE_2-0__SHP_LAMB93_D066_2021-01-01.7z", - "official_land_id": "66", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 234, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "66_ZONE_CONSTRUITE_2021_IGN_REPACKED.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D066_2021-01-01/OCS-GE_2-0__SHP_LAMB93_D066_2021-01-01.7z", - "official_land_id": "66", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 235, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "66_OCCUPATION_DU_SOL_2018_IGN_REPACKED.shp.zip", - "shapefile_name": "OCCUPATION_SOL.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D066_2018-01-01/OCS-GE_2-0__SHP_LAMB93_D066_2018-01-01.7z", - "official_land_id": "66", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 236, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "66_ZONE_CONSTRUITE_2018_IGN_REPACKED.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D066_2018-01-01/OCS-GE_2-0__SHP_LAMB93_D066_2018-01-01.7z", - "official_land_id": "66", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 237, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2018\", \"2021\"]", - "mapping": null, - "path": "66_DIFFERENCE_2018_2021_IGN_REPACKED.shp.zip", - "shapefile_name": "DIFF_D066_2021_2018.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0_DIFF_SHP_LAMB93_D066_2018-2021/OCS-GE_2-0_DIFF_SHP_LAMB93_D066_2018-2021.7z", - "official_land_id": "66", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 238, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2018\", \"2021\"]", - "mapping": null, - "path": "OCSGE_DIFFERENCE_66_2018_2021_MDA.shp.zip", - "shapefile_name": "DIFFERENCE.shp", - "source_url": null, - "official_land_id": "66", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 239, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_66_2018_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "66", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 240, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_66_2021_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "66", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 241, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_66_2018_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "66", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 242, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_66_2021_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "66", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 243, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_ARTIFICIELLE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_ZONE_ARTIFICIELLE_66_2018_MDA.shp.zip", - "shapefile_name": "ZONE_ARTIFICIELLE.shp", - "source_url": null, - "official_land_id": "66", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 244, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_ARTIFICIELLE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_ZONE_ARTIFICIELLE_66_2021_MDA.shp.zip", - "shapefile_name": "ZONE_ARTIFICIELLE.shp", - "source_url": null, - "official_land_id": "66", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 245, - "fields": { - "productor": "CEREMA", - "dataset": "MAJIC", - "name": "CONSOMMATION_ESPACE", - "millesimes": "[\"2009\", \"2023\"]", - "mapping": null, - "path": "cerema_2023.zip", - "shapefile_name": "cerema_2023.shp", - "source_url": "https://cerema.app.box.com/v/pnb-action7-indicateurs-ff/file/1512847131932", - "official_land_id": "MetropoleEtCorse", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 246, - "fields": { - "productor": "MDA", - "dataset": "MAJIC", - "name": "CONSOMMATION_ESPACE", - "millesimes": "[\"2009\", \"2023\"]", - "mapping": null, - "path": "MAJIC_CONSOMMATION_ESPACE_MetropoleEtCorse_2009_2023_MDA.shp.zip", - "shapefile_name": "CONSOMMATION_ESPACE.shp", - "source_url": null, - "official_land_id": "MetropoleEtCorse", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 247, - "fields": { - "productor": "CEREMA", - "dataset": "MAJIC", - "name": "CONSOMMATION_ESPACE", - "millesimes": "[\"2009\", \"2023\"]", - "mapping": null, - "path": "cerema_2023_971.zip", - "shapefile_name": "obs_artif_conso_com_2009_2023_971.shp", - "source_url": "https://cerema.app.box.com/v/pnb-action7-indicateurs-ff/file/1512838206072", - "official_land_id": "971", - "srid": 32620 - } - }, - { - "model": "public_data.datasource", - "pk": 248, - "fields": { - "productor": "CEREMA", - "dataset": "MAJIC", - "name": "CONSOMMATION_ESPACE", - "millesimes": "[\"2009\", \"2023\"]", - "mapping": null, - "path": "cerema_2023_972.zip", - "shapefile_name": "obs_artif_conso_com_2009_2023_972.shp", - "source_url": "https://cerema.app.box.com/v/pnb-action7-indicateurs-ff/file/1512827044358", - "official_land_id": "972", - "srid": 32620 - } - }, - { - "model": "public_data.datasource", - "pk": 249, - "fields": { - "productor": "CEREMA", - "dataset": "MAJIC", - "name": "CONSOMMATION_ESPACE", - "millesimes": "[\"2009\", \"2023\"]", - "mapping": null, - "path": "cerema_2023_973.zip", - "shapefile_name": "obs_artif_conso_com_2009_2023_973.shp", - "source_url": "https://cerema.app.box.com/v/pnb-action7-indicateurs-ff/file/1512828738470", - "official_land_id": "973", - "srid": 2972 - } - }, - { - "model": "public_data.datasource", - "pk": 250, - "fields": { - "productor": "CEREMA", - "dataset": "MAJIC", - "name": "CONSOMMATION_ESPACE", - "millesimes": "[\"2009\", \"2023\"]", - "mapping": null, - "path": "cerema_2023_974.zip", - "shapefile_name": "obs_artif_conso_com_2009_2023_974.shp", - "source_url": "https://cerema.app.box.com/v/pnb-action7-indicateurs-ff/file/1512840025235", - "official_land_id": "974", - "srid": 2975 - } - }, - { - "model": "public_data.datasource", - "pk": 251, - "fields": { - "productor": "MDA", - "dataset": "MAJIC", - "name": "CONSOMMATION_ESPACE", - "millesimes": "[\"2009\", \"2023\"]", - "mapping": null, - "path": "MAJIC_CONSOMMATION_ESPACE_971_2009_2023_MDA.shp.zip", - "shapefile_name": "CONSOMMATION_ESPACE.shp", - "source_url": null, - "official_land_id": "971", - "srid": 32620 - } - }, - { - "model": "public_data.datasource", - "pk": 252, - "fields": { - "productor": "MDA", - "dataset": "MAJIC", - "name": "CONSOMMATION_ESPACE", - "millesimes": "[\"2009\", \"2023\"]", - "mapping": null, - "path": "MAJIC_CONSOMMATION_ESPACE_972_2009_2023_MDA.shp.zip", - "shapefile_name": "CONSOMMATION_ESPACE.shp", - "source_url": null, - "official_land_id": "972", - "srid": 32620 - } - }, - { - "model": "public_data.datasource", - "pk": 253, - "fields": { - "productor": "MDA", - "dataset": "MAJIC", - "name": "CONSOMMATION_ESPACE", - "millesimes": "[\"2009\", \"2023\"]", - "mapping": null, - "path": "MAJIC_CONSOMMATION_ESPACE_973_2009_2023_MDA.shp.zip", - "shapefile_name": "CONSOMMATION_ESPACE.shp", - "source_url": null, - "official_land_id": "973", - "srid": 2972 - } - }, - { - "model": "public_data.datasource", - "pk": 254, - "fields": { - "productor": "MDA", - "dataset": "MAJIC", - "name": "CONSOMMATION_ESPACE", - "millesimes": "[\"2009\", \"2023\"]", - "mapping": null, - "path": "MAJIC_CONSOMMATION_ESPACE_974_2009_2023_MDA.shp.zip", - "shapefile_name": "CONSOMMATION_ESPACE.shp", - "source_url": null, - "official_land_id": "974", - "srid": 2975 - } - }, - { - "model": "public_data.datasource", - "pk": 255, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2018\", \"2021\"]", - "mapping": null, - "path": "62_DIFFERENCE_2018_2021_IGN_REPACKED.shp.zip", - "shapefile_name": "DIFF_62_2021_2019.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE-NG_1-1__SHP_LAMB93_D062_DIFF_2018-2021/OCS-GE-NG_1-1__SHP_LAMB93_D062_DIFF_2018-2021.7z", - "official_land_id": "62", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 256, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "62_OCCUPATION_DU_SOL_2018_IGN_REPACKED.shp.zip", - "shapefile_name": "OCCUPATION_SOL.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D062_2018-01-01/OCS-GE_2-0__SHP_LAMB93_D062_2018-01-01.7z", - "official_land_id": "62", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 257, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "62_ZONE_CONSTRUITE_2018_IGN_REPACKED.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D062_2018-01-01/OCS-GE_2-0__SHP_LAMB93_D062_2018-01-01.7z", - "official_land_id": "62", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 258, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "62_OCCUPATION_DU_SOL_2021_IGN_REPACKED.shp.zip", - "shapefile_name": "OCCUPATION_SOL.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D062_2021-01-01/OCS-GE_2-0__SHP_LAMB93_D062_2021-01-01.7z", - "official_land_id": "62", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 259, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "62_ZONE_CONSTRUITE_2021_IGN_REPACKED.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D062_2021-01-01/OCS-GE_2-0__SHP_LAMB93_D062_2021-01-01.7z", - "official_land_id": "62", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 260, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_62_2018_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "62", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 261, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_62_2021_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "62", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 262, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2018\", \"2021\"]", - "mapping": null, - "path": "OCSGE_DIFFERENCE_62_2018_2021_MDA.shp.zip", - "shapefile_name": "DIFFERENCE.shp", - "source_url": null, - "official_land_id": "62", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 263, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_62_2018_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "62", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 264, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_62_2021_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "62", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 265, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_ARTIFICIELLE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_ZONE_ARTIFICIELLE_62_2018_MDA.shp.zip", - "shapefile_name": "ZONE_ARTIFICIELLE.shp", - "source_url": null, - "official_land_id": "62", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 266, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_ARTIFICIELLE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_ZONE_ARTIFICIELLE_62_2021_MDA.shp.zip", - "shapefile_name": "ZONE_ARTIFICIELLE.shp", - "source_url": null, - "official_land_id": "62", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 268, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_ARTIFICIELLE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_ZONE_ARTIFICIELLE_91_2018_MDA.shp.zip", - "shapefile_name": "ZONE_ARTIFICIELLE.shp", - "source_url": null, - "official_land_id": "91", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 269, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_ARTIFICIELLE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_ZONE_ARTIFICIELLE_91_2021_MDA.shp.zip", - "shapefile_name": "ZONE_ARTIFICIELLE.shp", - "source_url": null, - "official_land_id": "91", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 270, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_ARTIFICIELLE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_ZONE_ARTIFICIELLE_92_2018_MDA.shp.zip", - "shapefile_name": "ZONE_ARTIFICIELLE.shp", - "source_url": null, - "official_land_id": "92", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 271, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_ARTIFICIELLE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_ZONE_ARTIFICIELLE_92_2021_MDA.shp.zip", - "shapefile_name": "ZONE_ARTIFICIELLE.shp", - "source_url": null, - "official_land_id": "92", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 275, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "40_OCCUPATION_DU_SOL_2021_IGN_REPACKED.shp.zip", - "shapefile_name": "OCCUPATION_SOL.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D040_2021-01-01/OCS-GE_2-0__SHP_LAMB93_D040_2021-01-01.7z", - "official_land_id": "40", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 276, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "40_ZONE_CONSTRUITE_2021_IGN_REPACKED.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D040_2021-01-01/OCS-GE_2-0__SHP_LAMB93_D040_2021-01-01.7z", - "official_land_id": "40", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 277, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "40_OCCUPATION_DU_SOL_2018_IGN_REPACKED.shp.zip", - "shapefile_name": "OCCUPATION_SOL.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D040_2018-01-01/OCS-GE_2-0__SHP_LAMB93_D040_2018-01-01.7z", - "official_land_id": "40", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 278, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "40_ZONE_CONSTRUITE_2018_IGN_REPACKED.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D040_2018-01-01/OCS-GE_2-0__SHP_LAMB93_D040_2018-01-01.7z", - "official_land_id": "40", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 279, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2018\", \"2021\"]", - "mapping": null, - "path": "40_DIFFERENCE_2018_2021_IGN_REPACKED.shp.zip", - "shapefile_name": "DIFF_40_2021_2018.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D040_DIFF_2018-2021/OCS-GE_2-0__SHP_LAMB93_D040_DIFF_2018-2021.7z", - "official_land_id": "40", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 280, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_ARTIFICIELLE", - "millesimes": "[\"2017\"]", - "mapping": null, - "path": "OCSGE_ZONE_ARTIFICIELLE_77_2017_MDA.shp.zip", - "shapefile_name": "ZONE_ARTIFICIELLE.shp", - "source_url": null, - "official_land_id": "77", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 281, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_ARTIFICIELLE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_ZONE_ARTIFICIELLE_77_2021_MDA.shp.zip", - "shapefile_name": "ZONE_ARTIFICIELLE.shp", - "source_url": null, - "official_land_id": "77", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 282, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_ARTIFICIELLE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_ZONE_ARTIFICIELLE_40_2018_MDA.shp.zip", - "shapefile_name": "ZONE_ARTIFICIELLE.shp", - "source_url": null, - "official_land_id": "40", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 283, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_ARTIFICIELLE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_ZONE_ARTIFICIELLE_40_2021_MDA.shp.zip", - "shapefile_name": "ZONE_ARTIFICIELLE.shp", - "source_url": null, - "official_land_id": "40", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 284, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "33_OCCUPATION_DU_SOL_2018_IGN_REPACKED.shp.zip", - "shapefile_name": "OCCUPATION_SOL.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D033_2018-01-01/OCS-GE_2-0__SHP_LAMB93_D033_2018-01-01.7z", - "official_land_id": "33", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 285, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "33_ZONE_CONSTRUITE_2018_IGN_REPACKED.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D033_2018-01-01/OCS-GE_2-0__SHP_LAMB93_D033_2018-01-01.7z", - "official_land_id": "33", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 286, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "33_OCCUPATION_DU_SOL_2021_IGN_REPACKED.shp.zip", - "shapefile_name": "OCCUPATION_SOL.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D033_2021-01-01/OCS-GE_2-0__SHP_LAMB93_D033_2021-01-01.7z", - "official_land_id": "33", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 287, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "33_ZONE_CONSTRUITE_2021_IGN_REPACKED.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0__SHP_LAMB93_D033_2021-01-01/OCS-GE_2-0__SHP_LAMB93_D033_2021-01-01.7z", - "official_land_id": "33", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 288, - "fields": { - "productor": "IGN", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2018\", \"2021\"]", - "mapping": null, - "path": "33_DIFFERENCE_2018_2021_IGN_REPACKED.shp.zip", - "shapefile_name": "DIFF_D033_2021_2018.shp", - "source_url": "https://data.geopf.fr/telechargement/download/OCSGE/OCS-GE_2-0_DIFF_SHP_LAMB93_D033_2018-2021/OCS-GE_2-0_DIFF_SHP_LAMB93_D033_2018-2021.7z", - "official_land_id": "33", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 289, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "DIFFERENCE", - "millesimes": "[\"2018\", \"2021\"]", - "mapping": null, - "path": "OCSGE_DIFFERENCE_33_2018_2021_MDA.shp.zip", - "shapefile_name": "DIFFERENCE.shp", - "source_url": null, - "official_land_id": "33", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 290, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_33_2018_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "33", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 291, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "ZONE_CONSTRUITE", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_ZONE_CONSTRUITE_33_2021_MDA.shp.zip", - "shapefile_name": "ZONE_CONSTRUITE.shp", - "source_url": null, - "official_land_id": "33", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 292, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2018\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_33_2018_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "33", - "srid": 2154 - } - }, - { - "model": "public_data.datasource", - "pk": 293, - "fields": { - "productor": "MDA", - "dataset": "OCSGE", - "name": "OCCUPATION_DU_SOL", - "millesimes": "[\"2021\"]", - "mapping": null, - "path": "OCSGE_OCCUPATION_DU_SOL_33_2021_MDA.shp.zip", - "shapefile_name": "OCCUPATION_DU_SOL.shp", - "source_url": null, - "official_land_id": "33", - "srid": 2154 - } - } -] \ No newline at end of file diff --git a/public_data/models/deprecated.py b/public_data/models/deprecated.py deleted file mode 100644 index ca81bcbe3..000000000 --- a/public_data/models/deprecated.py +++ /dev/null @@ -1,20 +0,0 @@ -"""Ce fichier contient tous les modèles dit "DEPRECATED". Ce sont des modèles qu'il -faut migrer vers les nouvelles façons de stocker les données. Cela nécessite souvent -beaucoup de travail (les views sont également à changer, voir le front) et cela a été -remis à plus tard (dette technique). - -Il est également probable que certains modèles ont été total décommissioné mais pas -encore retiré de ce fichier. -""" -from .cerema import Cerema - - -class RefPlan(Cerema): - """ - Utilisé avant la récupération du fichier du Cerema - !!! DEPRECATED !!! - Available for retro-compatibility - """ - - class Meta: - proxy = True diff --git a/public_data/models/mixins.py b/public_data/models/mixins.py index d1d031656..1d0a1748b 100644 --- a/public_data/models/mixins.py +++ b/public_data/models/mixins.py @@ -1,18 +1,10 @@ -from logging import DEBUG, INFO, getLogger +from logging import getLogger from os import getenv -from pathlib import Path -from tempfile import TemporaryDirectory -from typing import Dict -from zipfile import ZipFile import numpy as np from colour import Color -from django.contrib.gis.utils import LayerMapping from django.core.exceptions import FieldDoesNotExist -from django.db import connection -from public_data.models.enums import SRID -from public_data.storages import DataStorage from utils.colors import get_onecolor_gradient, get_random_color, is_valid logger = getLogger(__name__) @@ -20,254 +12,6 @@ LOCAL_FILE_DIRECTORY = getenv("LOCAL_FILE_DIRECTORY") -class AutoLoadMixin: - """ - Enable auto loading of data into database according to - * shape_file_path - usually shape file is in media directory - * mapping - between feature name and database field name - Those two needs to be set in child class. - """ - - @property - def shape_file_path(self) -> str: - """ - Path to the shapefile to load, either on S3 or locally - - Local path is relative to the env variable LOCAL_FILE_DIRECTORY - S3 path is relative to the value defined in DataStorage.location - - Example: - LOCAL_FILE_DIRECTORY = 'public_data/local_data' - shape_file_path = 'communes/communes-2021-01-01.shp' - - will load the shapefile from public_data/local_data/communes/communes-2021-01-01.shp - """ - raise NotImplementedError("The shape_file_path property must be set in child class") - - @property - def mapping(self) -> Dict[str, str]: - """ - Mapping between shapefile fields and model fields - for geodjango's LayerMapping - """ - raise NotImplementedError("The mapping property must be set in child class") - - @property - def srid(self) -> int: - """ - SRID of the source shapefile - Defaults to LAMBERT_93, override if needed. - - NOTE: getting the SRID from the shapefile is not 100% reliable - hence the need to set it manually. - """ - return SRID.LAMBERT_93 - - def before_save(self) -> None: - if hasattr(self.__class__, "srid_source"): - self.srid_source = self.__class__.srid - - def save(self, *args, **kwargs): - self.before_save() - super().save(*args, **kwargs) - self.after_save() - return self - - def after_save(self) -> None: - """Hook to do things after saving""" - - @classmethod - def calculate_fields(cls) -> None: - """Override if you need to calculate some fields after loading data.""" - - @staticmethod - def prepare_shapefile(shape_file_path: Path) -> None: - """Hook that prepares shapefile before loading it into database - Useful to modify shapefile fields type before mapping - - Note that this method will update in place in case - a local file is used. If the shapefile is retrieved from S3, - it will update the file from the temporary directory it - is extracted to. - - Args: - shape_file_path: path to the shapefile to prepare - (provided by the load method) - """ - - @staticmethod - def __check_path_is_a_regular_file(path: Path) -> None: - if not path.is_file(): - raise FileNotFoundError(f"{path} is not a regular file") - - @staticmethod - def __check_path_suffix_is_shapefile(path: Path) -> None: - if path.suffix != ".shp": - raise FileNotFoundError(f"{path} is not a shapefile") - - @staticmethod - def __check_prj_file_exists(path: Path) -> None: - prj_file_path = path.with_suffix(suffix=".prj") - - if not prj_file_path.exists(): - raise FileNotFoundError(f"{prj_file_path} is missing") - - @classmethod - def __check_is_shape_file(cls, shape_file_path: Path) -> None: - cls.__check_path_is_a_regular_file(shape_file_path) - cls.__check_path_suffix_is_shapefile(shape_file_path) - cls.__check_prj_file_exists(shape_file_path) - - def __retrieve_zipped_shapefile_from_s3( - file_name_on_s3: str, - output_path: Path, - ) -> Path: - storage = DataStorage() - - if not storage.exists(file_name_on_s3): - raise FileNotFoundError(f"{file_name_on_s3} could not be found on S3") - - output_zip_path = f"{output_path}/{file_name_on_s3}" - - storage.bucket.download_file( - Key=f"{storage.location}/{file_name_on_s3}", - Filename=output_zip_path, - ) - - return output_zip_path - - def __extract_zipped_shapefile( - zipped_shapefile_path: Path, - output_path: Path, - ) -> Path: - with ZipFile(zipped_shapefile_path) as zip_file: - zip_file.extractall(output_path) - - return output_path - - def __get_shapefile_path_from_folder(folder_path: Path) -> Path: - for tempfile in folder_path.rglob("*.shp"): - if tempfile.name.startswith("._"): - continue - - return tempfile - - raise FileNotFoundError("No file with .shp suffix") - - @classmethod - def clean_data(cls) -> None: - """Delete previously loaded data - - The implementation of the method should ensure idempotency - by removing entirely and exclusively the data previously loaded - by the child class - """ - raise NotImplementedError(f"No clean_data method implemented for the class {cls.__name__}") - - @classmethod - def load( - cls, - local_file_path=None, - local_file_directory=LOCAL_FILE_DIRECTORY, - verbose=True, - layer_mapper_strict=True, - layer_mapper_silent=False, - layer_mapper_encoding="utf-8", - layer_mapper_step=1000, - ) -> None: - """Populate table with data from shapefile then calculate all fields - - If no local_file_path is provided, the shapefile is downloaded from S3, - and then extracted in a temporary directory. - - All arguments are optional and only affects how LayerMapper behave - LayerMapper documentation: - - https://docs.djangoproject.com/en/4.2/ref/contrib/gis/layermapping/ - - Args: - verbose: print more information - local_file_path: path to a local shapefile - local_file_directory: directory where to find the local shapefile - layer_mapper_strict: raise exception if a field is missing - layer_mapper_silent: do not print anything - layer_mapper_encoding: encoding of the shapefile - layer_mapper_step: number of rows to process at once - - Raises: - FileNotFoundError: if the shapefile is not found on S3 or locally - NotImplementedError: if the child class does not implement the shape_file_path property - """ - - logger.setLevel(DEBUG if verbose else INFO) - - logger.info("Loading data from class %s", cls.__name__) - - with TemporaryDirectory() as temporary_directory: - if not local_file_path: - logger.info("Retrieving zipped shapefile from S3") - - zipped_shapefile_path = cls.__retrieve_zipped_shapefile_from_s3( - file_name_on_s3=cls.shape_file_path, - output_path=Path(temporary_directory), - ) - logger.debug(f"Zipped shapefile temporary path: {zipped_shapefile_path}") - - logger.debug("Extracting zipped shapefile") - - shapefile_folder_path = cls.__extract_zipped_shapefile( - zipped_shapefile_path=zipped_shapefile_path, - output_path=Path(temporary_directory), - ) - - logger.debug(f"Extracted shapefile folder path: {shapefile_folder_path}") - - shape_file_path = cls.__get_shapefile_path_from_folder(shapefile_folder_path) - else: - logger.info("Using local shapefile") - - shape_file_path = Path(f"{local_file_directory}/{local_file_path}") - - logger.info("Shapefile path: %s", shape_file_path) - - cls.__check_is_shape_file(shape_file_path) - - logger.debug("Shapefile is valid ✅") - - logger.info("Preparing shapefile") - - cls.prepare_shapefile(shape_file_path) - - logger.info("Cleaning previously loaded data") - - cls.clean_data() - - logger.info("Setting up LayerMapper") - - layer_mapper = LayerMapping( - model=cls, - data=shape_file_path, - mapping=cls.mapping, - encoding=layer_mapper_encoding, - transaction_mode="commit_on_success", - ) - - logger.info("Saving mapped entities") - - layer_mapper.save( - strict=layer_mapper_strict, - silent=layer_mapper_silent, - verbose=verbose, - progress=True, - step=layer_mapper_step, - ) - - logger.info("Calculating fields") - - cls.calculate_fields() - - logger.info("Done loading data from class %s", cls.__name__) - - class DataColorationMixin: """DataColorationMixin add class' methods: - get_property_percentile: return percentiles of a property's distribution @@ -348,15 +92,3 @@ def get_percentile(cls, property_name=None, percentiles=None): return None else: return np.percentile(rows, percentiles, interpolation="lower") - - -class TruncateTableMixin: - """enable a truncate statement (compatible only with PostgreSQL so far)""" - - @classmethod - def truncate(cls, restart_id=True): - query = f'TRUNCATE TABLE "{cls._meta.db_table}"' - if restart_id: - query += " RESTART IDENTITY" - with connection.cursor() as cursor: - cursor.execute(query) diff --git a/public_data/readme.MD b/public_data/readme.MD deleted file mode 100644 index 2b6958218..000000000 --- a/public_data/readme.MD +++ /dev/null @@ -1,72 +0,0 @@ - - -## Management commands - - -### shp2model - -La commande attend un chemin relatif ou absolue vers un fichier shape (extension .shp). - -Exemple : `./manage.py shp2model ./public_data/media/mondossier/monfichier.shp` - -La commande va analyser le contenu du fichier et fournir un squelette de model selon les règles suivantes : -- Nom de la classe : nom du layer (en camelcase) -- Hérite de la classe `AutoLoadMixin` -- Un champ va être ajouté par feature avec pour nom le nom du champ en minuscule. Le type de champ est fonction du type OFT trouvé et le max_length est issu du field_width du fichier. -- un champ MultiPolygon est ajouté (nom: mpoly) -- le chemin vers le fichier est conservé dans la propriété shape_file_path -- le mapping entre les champs du fichier shape et les champs de la classe est conservé dans la propriété mapping - -Exemple: -``` -class Artificialisee2015to2018(AutoLoadMixin): - """ - A_B_2015_2018 : la surface (en hectares) artificialisée entre 2015 et 2018 - Données construites par Philippe - """ - - surface = models.IntegerField(_("surface"), max_length=10) - cs_2018 = models.CharField(_("cs_2018"), max_length=254) - us_2018 = models.CharField(_("us_2018"), max_length=254) - cs_2015 = models.CharField(_("cs_2015"), max_length=254) - us_2015 = models.CharField(_("us_2015"), max_length=254) - - mpoly = models.MultiPolygonField() - - shape_file_path = Path("public_data/media/a_b_2015_2018/A_B_2015_2018.shp") - mapping = { - "surface": "Surface", - "cs_2018": "cs_2018", - "us_2018": "us_2018", - "cs_2015": "cs_2015", - "us_2015": "us_2015", - "mpoly": "MULTIPOLYGON", - } -``` - -### load_data et AutoLoadMixin - -Ci-dessus, vous avez remarqué que le squelette hérite de la classe AutoLoadMixin (et nom models.Model comme il est de coutume). C'est pour que la classe embarque une méthode de classe "Load()" qui permet de charger les données en base depuis le fichier shape. - -Cette fonctionnalité est activée au travers de la commande load_data qui prend le nom du classe en paramètre. Exemple : `./manage.py load_data public_data.models.Artificialisee2015to2018` - -La méthode load() va : -- vider la base de donner (delete global) -- utiliser `LayerMapping` (issue de GeoDjango) avec les 2 propriétés détaillées précédemment : shape_file_path et mapping -- uploader le contenu du fichier dans la base - -## Données de l'INSEE - -2 données sont chargées depuis l'INSEE : -- Population des communes (incluant un historique depuis 2006) -- nombre de ménages par communes (incluant un historique depuis 2008) - -Ces données sont stockées dans CommunePop et accessible depuis Commune.pop.all() - -Pour charger ces données, 2 fichiers sont utilisées et ils doivent être disponibles dans s3://[bucketname]/data : -- pop : base-pop-historiques-1876-2019.xlsx, colonnes : CODGEO, LIBGEO, 2019 à 2006 -- ménage : base-cc-coupl-fam-men-2018-lite.xlsx, colonnes : CODGEO, LIBGEO, 2018 à 2008 - -L'INSEE ne fournit le nombre de ménage que pour 2018, 2013 et 2008. Les années manquantes ont été complétées avec une estimation en utilisant une droite affine. - -La commande pour charger les fichiers est : `python manage.py load_insee` diff --git a/public_data/serializers.py b/public_data/serializers.py index fd9811dd6..d390c75a6 100644 --- a/public_data/serializers.py +++ b/public_data/serializers.py @@ -103,6 +103,7 @@ class LandSerializer(s.Serializer): source_id = s.SerializerMethodField() public_key = s.CharField() area = s.FloatField() + land_type_label = s.CharField() def get_source_id(self, obj) -> str: return obj.get_official_id() diff --git a/public_data/shapefile.py b/public_data/shapefile.py deleted file mode 100644 index 7cc05c91b..000000000 --- a/public_data/shapefile.py +++ /dev/null @@ -1,199 +0,0 @@ -from logging import Logger, getLogger -from os import mkdir -from pathlib import Path -from urllib.request import URLopener -from uuid import uuid4 -from zipfile import ZipFile - -import py7zr -from storages.backends.s3boto3 import S3Boto3Storage - -from public_data.models import DataSource -from public_data.storages import DataStorage - - -def __download_source( - source: DataSource, - output_path: Path, - storage: S3Boto3Storage, -) -> Path: - file_name_on_s3 = source.path - - if not storage.exists(file_name_on_s3): - raise FileNotFoundError(f"{file_name_on_s3} could not be found on S3") - - output_zip_path = f"{output_path.name}/{file_name_on_s3}" - - storage.bucket.download_file( - Key=f"{storage.location}/{file_name_on_s3}", - Filename=output_zip_path, - ) - - return Path(output_zip_path) - - -def __download_url( - url: str, - output_path: Path, -) -> Path: - filename_from_url = url.split("/")[-1] - - output_zip_path = f"{output_path.name}/{filename_from_url}" - - opener = URLopener() - opener.addheader("User-Agent", "Mozilla/5.0") - opener.retrieve(url=url, filename=output_zip_path) - - return Path(output_zip_path) - - -def __extract_7z_shapefile( - zipped_shapefile_path: Path, - output_path: Path, -) -> Path: - zipped_shapefile_path_without_suffix = zipped_shapefile_path.stem.split(".")[0] - output_path = Path(f"{output_path}/{zipped_shapefile_path_without_suffix}") - - archive = py7zr.SevenZipFile(zipped_shapefile_path, mode="r") - archive.extractall(path=output_path.absolute()) - archive.close() - - return output_path - - -def __extract_zipped_shapefile( - zipped_shapefile_path: Path, - output_path: Path, -) -> Path: - zipped_shapefile_path_without_suffix = zipped_shapefile_path.stem.split(".")[0] - output_path = Path(f"{output_path}/{zipped_shapefile_path_without_suffix}") - - with ZipFile(file=zipped_shapefile_path) as zip_file: - zip_file.extractall(path=output_path.absolute()) - - return output_path - - -def __get_shapefile_path_from_folder(shapefile_directory: Path, pattern="*.shp") -> Path: - for tempfile in shapefile_directory.rglob(pattern=pattern): - if tempfile.name.startswith("."): - # Skip hidden files - continue - if not tempfile.name.endswith(".shp"): - # Skip files that contains shp in their name, but do not end with .shp (e.g. shp.zip) - continue - return tempfile - - raise FileNotFoundError(f"No file with .shp suffix found in {shapefile_directory}") - - -def delete_directory(pth: Path): - for sub in pth.iterdir(): - if sub.is_dir(): - delete_directory(sub) - else: - sub.unlink() - pth.rmdir() - - -def get_shapefile_from_source( - storage: DataStorage, - source: DataSource, - output_path: Path, - logger: Logger, -) -> tuple[Path, Path, Path]: - logger.info("Downloading shapefile") - zipped_shapefile_path = __download_source(storage=storage, source=source, output_path=output_path) - logger.info(f"Downloaded shapefile to {zipped_shapefile_path}") - logger.info(msg="Extracting shapefile") - shapefile_directory = __extract_zipped_shapefile( - zipped_shapefile_path=zipped_shapefile_path, - output_path=output_path, - ) - logger.info(f"Extracted shapefile to {shapefile_directory}") - - shapefile_path = __get_shapefile_path_from_folder(shapefile_directory=shapefile_directory) - logger.info(f"Shapefile path: {shapefile_path}") - - return shapefile_path, shapefile_directory, zipped_shapefile_path - - -def get_shapefile_from_url( - url: str, - output_path: Path, - logger: Logger, - shapefile_name: str = None, -): - logger.info("Downloading shapefile") - zipped_shapefile_path = __download_url(url=url, output_path=output_path) - logger.info(f"Downloaded shapefile to {zipped_shapefile_path}") - logger.info(msg="Extracting shapefile") - shapefile_directory = __extract_7z_shapefile( - zipped_shapefile_path=zipped_shapefile_path, - output_path=output_path, - ) - logger.info(f"Extracted shapefile to {shapefile_directory}") - - shapefile_path = __get_shapefile_path_from_folder(shapefile_directory=shapefile_directory, pattern=shapefile_name) - logger.info(f"Shapefile path: {shapefile_path}") - - return shapefile_path, shapefile_directory, zipped_shapefile_path - - -class ShapefileFromSource: - def __init__(self, source: DataSource, logger_name="management.commands") -> None: - self.storage = DataStorage() - self.source = source - self.output_path = Path("tmp" + str(uuid4())) - self.shapefile_path = None - self.shapefile_directory = None - self.zipped_shapefile_path = None - self.logger = getLogger(logger_name) - - def __enter__(self) -> Path: - mkdir(path=self.output_path) - shapefile_path, shapefile_directory, zipped_shapefile_path = get_shapefile_from_source( - source=self.source, - output_path=self.output_path, - storage=self.storage, - logger=self.logger, - ) - self.shapefile_path = shapefile_path - self.shapefile_directory = shapefile_directory - self.zipped_shapefile_path = zipped_shapefile_path - return self.shapefile_path - - def __exit__(self, exc_type, exc_val, exc_tb): - delete_directory(self.output_path) - - -class ShapefileFromURL: - def __init__( - self, - url: str, - logger_name="management.commands", - shapefile_name: str = None, - ) -> None: - self.url = url - self.shapefile_name = shapefile_name - self.output_path = Path("tmp" + str(uuid4())) - self.shapefile_path = None - self.shapefile_directory = None - self.zipped_shapefile_path = None - self.logger = getLogger(logger_name) - - def __enter__(self) -> Path: - mkdir(path=self.output_path) - shapefile_path, shapefile_directory, zipped_shapefile_path = get_shapefile_from_url( - url=self.url, - output_path=self.output_path, - logger=self.logger, - shapefile_name=self.shapefile_name, - ) - self.shapefile_path = shapefile_path - self.shapefile_directory = shapefile_directory - self.zipped_shapefile_path = zipped_shapefile_path - return self.shapefile_path - - def __exit__(self, exc_type, exc_val, exc_tb): - delete_directory(self.output_path) diff --git a/public_data/views.py b/public_data/views.py index 48d2c4201..ee6c8645c 100644 --- a/public_data/views.py +++ b/public_data/views.py @@ -499,6 +499,6 @@ def post(self, request) -> Response: needle = serializer.validated_data["needle"] results = Land.search(needle, search_for="*") - output = {land_type: serializers.LandSerializer(lands, many=True).data for land_type, lands in results.items()} + output = serializers.LandSerializer(results, many=True).data return Response(data=output) diff --git a/static/assets/scripts/bundle.js b/static/assets/scripts/bundle.js deleted file mode 100644 index bf5bb49c1..000000000 --- a/static/assets/scripts/bundle.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{var __webpack_modules__={348:()=>{const t=new class{constructor(){this.modules={}}create(t){const e=new t;this.modules[e.type]=e}getModule(t){return this.modules[t]}add(t,e){this.modules[t].add(e)}remove(t,e){this.modules[t].remove(e)}get isActive(){return this._isActive}set isActive(t){if(t===this._isActive)return;this._isActive=t;const e=Object.keys(this.modules).map((t=>this.modules[t]));if(t)for(const t of e)t.activate();else for(const t of e)t.deactivate()}get isLegacy(){return this._isLegacy}set isLegacy(t){t!==this._isLegacy&&(this._isLegacy=t)}},e="dsfr",i="1.12.1";class r{constructor(t,e,i,r){switch(this.level=t,this.light=e,this.dark=i,r){case"warn":this.logger=console.warn;break;case"error":this.logger=console.error;break;default:this.logger=console.log}}log(...t){const i=new s(e);for(const e of t)i.add(e);this.print(i)}print(t){t.setColor(this.color),this.logger.apply(console,t.getMessage())}get color(){return window.matchMedia("(prefers-color-scheme: dark)").matches?this.dark:this.light}}class s{constructor(t){this.inputs=["%c"],this.styles=["font-family:Marianne","line-height: 1.5"],this.objects=[],t&&this.add(`${t} :`)}add(t){switch(typeof t){case"object":case"function":this.inputs.push("%o "),this.objects.push(t);break;default:this.inputs.push(`${t} `)}}setColor(t){this.styles.push(`color:${t}`)}getMessage(){return[this.inputs.join(""),this.styles.join(";"),...this.objects]}}const n={log:new r(0,"#616161","#989898"),debug:new r(1,"#000091","#8B8BFF"),info:new r(2,"#007c3b","#00ed70"),warn:new r(3,"#ba4500","#fa5c00","warn"),error:new r(4,"#D80600","#FF4641","error")},o=new class{constructor(){this.level=2;for(const t in n){const e=n[t];this[t]=(...t)=>{this.level<=e.level&&e.log.apply(e,t)},this[t].print=e.print.bind(e)}}state(){const e=new s;e.add(t),this.log.print(e)}tree(){const e=t.getModule("stage");if(!e)return;const i=new s;this._branch(e.root,0,i),this.log.print(i)}_branch(t,e,i){let r="";if(e>0){let t="";for(let i=0;i{"loading"!==document.readyState?window.requestAnimationFrame(t):document.addEventListener("DOMContentLoaded",t)},l={AUTO:"auto",MANUAL:"manual",RUNTIME:"runtime",LOADED:"loaded",VUE:"vue",ANGULAR:"angular",REACT:"react"},c=new class{constructor(){this._mode=l.AUTO,this.isStarted=!1,this.starting=this.start.bind(this),this.preventManipulation=!1}configure(t={},e,r){this.startCallback=e;const s=t.production&&(!r||"false"!==r.production);switch(!0){case r&&!isNaN(r.level):o.level=Number(r.level);break;case r&&r.verbose&&("true"===r.verbose||1===r.verbose):o.level=0;break;case s:o.level=999;break;case t.verbose:o.level=0}o.info(`version ${i}`),this.mode=t.mode||l.AUTO}set mode(t){switch(t){case l.AUTO:this.preventManipulation=!1,e=this.starting,a(e);break;case l.LOADED:this.preventManipulation=!1,a(this.starting);break;case l.RUNTIME:this.preventManipulation=!1,this.start();break;case l.MANUAL:this.preventManipulation=!1;break;case l.VUE:case l.ANGULAR:case l.REACT:this.preventManipulation=!0;break;default:return void o.error("Illegal mode")}var e;this._mode=t,o.info(`mode set to ${t}`)}get mode(){return this._mode}start(){o.info("start"),this.startCallback()}};class h{constructor(){this._collection=[]}forEach(t){this._collection.forEach(t)}map(t){return this._collection.map(t)}get length(){return this._collection.length}add(t){return!(this._collection.indexOf(t)>-1||(this._collection.push(t),this.onAdd&&this.onAdd(),this.onPopulate&&1===this._collection.length&&this.onPopulate(),0))}remove(t){const e=this._collection.indexOf(t);if(-1===e)return!1;this._collection.splice(e,1),this.onRemove&&this.onRemove(),this.onEmpty&&0===this._collection.length&&this.onEmpty()}execute(...t){for(const e of this._collection)e&&e.apply(null,t)}clear(){this._collection.length=0}clone(){const t=new h;return t._collection=this._collection.slice(),t}get collection(){return this._collection}}class u extends h{constructor(t){super(),this.type=t,this.isActive=!1}activate(){}deactivate(){}}const d=t=>`fr-${t}`;d.selector=(t,e)=>(void 0===e&&(e="."),`${e}${d(t)}`),(d.attr=t=>`data-${d(t)}`).selector=(t,e)=>{let i=d.attr(t);return void 0!==e&&(i+=`="${e}"`),`[${i}]`},d.event=t=>`${e}.${t}`,d.emission=(t,e)=>`emission:${t}.${e}`;const p=(t,e)=>Array.prototype.slice.call(t.querySelectorAll(e)),f=(t,e)=>{const i=t.parentElement;return i.matches(e)?i:i===document.documentElement?null:f(i,e)};class m{constructor(t,e,i){this.selector=t,this.InstanceClass=e,this.creator=i,this.instances=new h,this.isIntroduced=!1,this._instanceClassName=this.InstanceClass.instanceClassName,this._instanceClassNames=this.getInstanceClassNames(this.InstanceClass),this._property=this._instanceClassName.substring(0,1).toLowerCase()+this._instanceClassName.substring(1);const r=this._instanceClassName.replace(/[^a-zA-Z0-9]+/g,"-").replace(/([A-Z]+)([A-Z][a-z])/g,"$1-$2").replace(/([a-z])([A-Z])/g,"$1-$2").replace(/([0-9])([^0-9])/g,"$1-$2").replace(/([^0-9])([0-9])/g,"$1-$2").toLowerCase();this._attribute=d.attr(`js-${r}`)}getInstanceClassNames(t){const e=Object.getPrototypeOf(t);return e&&"Instance"!==e.instanceClassName?[...this.getInstanceClassNames(e),t.instanceClassName]:[t.instanceClassName]}hasInstanceClassName(t){return this._instanceClassNames.indexOf(t)>-1}introduce(){this.isIntroduced||(this.isIntroduced=!0,t.getModule("stage").parse(document.documentElement,this))}parse(t,e){const i=[];return t.matches&&t.matches(this.selector)&&i.push(t),!e&&t.querySelectorAll&&t.querySelector(this.selector)&&i.push.apply(i,p(t,this.selector)),i}create(t){if(!t.node.matches(this.selector))return;const e=new this.InstanceClass;return this.instances.add(e),e}remove(t){this.instances.remove(t)}dispose(){const t=this.instances.collection;for(let e=t.length-1;e>-1;e--)t[e]._dispose();this.creator=null}get instanceClassName(){return this._instanceClassName}get instanceClassNames(){return this._instanceClassNames}get property(){return this._property}get attribute(){return this._attribute}}class g extends u{constructor(){super("register")}register(e,i,r){const s=new m(e,i,r);return this.add(s),t.isActive&&s.introduce(),s}activate(){for(const t of this.collection)t.introduce()}remove(t){t.dispose(),super.remove(t)}}let y=0;class _{constructor(t,e){e?this.id=e:(y++,this.id=y),this.node=t,this.attributeNames=[],this.instances=[],this._children=[],this._parent=null,this._projects=[]}get proxy(){const t=this;if(!this._proxy){this._proxy={id:this.id,get parent(){return t.parent?t.parent.proxy:null},get children(){return t.children.map((t=>t.proxy))}};for(const t of this.instances)this._proxy[t.registration.property]=t.proxy}return this._proxy}get html(){if(!this.node||!this.node.outerHTML)return"";const t=this.node.outerHTML.indexOf(">");return this.node.outerHTML.substring(0,t+1)}project(t){-1===this._projects.indexOf(t)&&this._projects.push(t)}populate(){const t=this._projects.slice();this._projects.length=0;for(const e of t)this.create(e)}create(t){if(this.hasInstance(t.instanceClassName))return;o.debug(`create instance of ${t.instanceClassName} on element [${this.id}]`);const e=t.create(this);this.instances.push(e),e._config(this,t),this._proxy&&(this._proxy[t.property]=e.proxy)}remove(t){const e=this.instances.indexOf(t);e>-1&&this.instances.splice(e,1),this._proxy&&delete this._proxy[t.registration.property]}get parent(){return this._parent}get ascendants(){return[this.parent,...this.parent.ascendants]}get children(){return this._children}get descendants(){const t=[...this._children];return this._children.forEach((e=>t.push(...e.descendants))),t}addChild(t,e){return this._children.indexOf(t)>-1?null:(t._parent=this,!isNaN(e)&&e>-1&&e=0;t--){const e=this.instances[t];e&&e._dispose()}this.instances.length=0,t.remove("stage",this),this.parent.removeChild(this),this._children.length=0,o.debug(`remove element [${this.id}] ${this.html}`)}prepare(t){-1===this.attributeNames.indexOf(t)&&this.attributeNames.push(t)}examine(){const t=this.attributeNames.slice();this.attributeNames.length=0;for(let e=this.instances.length-1;e>-1;e--)this.instances[e].examine(t)}}const v={CLICK:d.emission("root","click"),KEYDOWN:d.emission("root","keydown"),KEYUP:d.emission("root","keyup")},x={TAB:{id:"tab",value:9},ESCAPE:{id:"escape",value:27},END:{id:"end",value:35},HOME:{id:"home",value:36},LEFT:{id:"left",value:37},UP:{id:"up",value:38},RIGHT:{id:"right",value:39},DOWN:{id:"down",value:40}},b=t=>Object.values(x).filter((e=>e.value===t))[0];class w extends _{constructor(){super(document.documentElement,"root"),this.node.setAttribute(d.attr("js"),!0),this.listen()}listen(){document.documentElement.addEventListener("click",this.click.bind(this),{capture:!0}),document.documentElement.addEventListener("keydown",this.keydown.bind(this),{capture:!0}),document.documentElement.addEventListener("keyup",this.keyup.bind(this),{capture:!0})}click(t){this.emit(v.CLICK,t.target)}keydown(t){this.emit(v.KEYDOWN,b(t.keyCode))}keyup(t){this.emit(v.KEYUP,b(t.keyCode))}}class S extends u{constructor(){super("stage"),this.root=new w,super.add(this.root),this.observer=new MutationObserver(this.mutate.bind(this)),this.modifications=[],this.willModify=!1,this.modifying=this.modify.bind(this)}hasElement(t){for(const e of this.collection)if(e.node===t)return!0;return!1}getElement(t){for(const e of this.collection)if(e.node===t)return e;const e=new _(t);return this.add(e),o.debug(`add element [${e.id}] ${e.html}`),e}getProxy(t){return this.hasElement(t)?this.getElement(t).proxy:null}add(t){super.add(t),this.put(t,this.root)}put(t,e){let i=0;for(let r=e.children.length-1;r>-1;r--){const s=e.children[r],n=t.node.compareDocumentPosition(s.node);if(n&Node.DOCUMENT_POSITION_CONTAINS)return void this.put(t,s);if(n&Node.DOCUMENT_POSITION_CONTAINED_BY)e.removeChild(s),t.addChild(s,0);else if(n&Node.DOCUMENT_POSITION_PRECEDING){i=r+1;break}}e.addChild(t,i)}activate(){this.observer.observe(document.documentElement,{childList:!0,subtree:!0,attributes:!0})}deactivate(){this.observer.disconnect()}mutate(t){const e=[];t.forEach((t=>{switch(t.type){case"childList":t.removedNodes.forEach((t=>this.dispose(t))),t.addedNodes.forEach((t=>this.parse(t)));break;case"attributes":if(this.hasElement(t.target)){const i=this.getElement(t.target);i.prepare(t.attributeName),-1===e.indexOf(i)&&e.push(i);for(const t of i.descendants)-1===e.indexOf(t)&&e.push(t)}-1===this.modifications.indexOf(t.target)&&this.modifications.push(t.target)}})),e.forEach((t=>t.examine())),this.modifications.length&&!this.willModify&&(this.willModify=!0,window.requestAnimationFrame(this.modifying))}modify(){this.willModify=!1;const t=this.modifications.slice();this.modifications.length=0;for(const e of t)document.documentElement.contains(e)&&this.parse(e)}dispose(t){const e=[];this.forEach((i=>{t.contains(i.node)&&e.push(i)}));for(const t of e)t.dispose(),this.remove(t)}parse(e,i,r){const s=i?[i]:t.getModule("register").collection,n=[];for(const t of s){const i=t.parse(e,r);for(const e of i){const i=this.getElement(e);i.project(t),-1===n.indexOf(i)&&n.push(i)}}for(const t of n)t.populate()}}class C extends u{constructor(){super("render"),this.rendering=this.render.bind(this),this.nexts=new h}activate(){window.requestAnimationFrame(this.rendering)}request(t){this.nexts.add(t)}render(){if(!t.isActive)return;if(window.requestAnimationFrame(this.rendering),this.forEach((t=>t.render())),!this.nexts.length)return;const e=this.nexts.clone();this.nexts.clear(),e.forEach((t=>t.next()))}}class T extends u{constructor(){super("resize"),this.requireResize=!1,this.resizing=this.resize.bind(this);const t=this.request.bind(this);document.fonts&&document.fonts.ready.then(t),window.addEventListener("resize",t),window.addEventListener("orientationchange",t)}activate(){this.request()}request(){this.requireResize||(this.requireResize=!0,window.requestAnimationFrame(this.resizing))}resize(){this.requireResize&&(this.forEach((t=>t.resize())),this.requireResize=!1)}}class k extends u{constructor(){super("lock"),this._isLocked=!1,this._scrollY=0,this.onPopulate=this.lock.bind(this),this.onEmpty=this.unlock.bind(this)}get isLocked(){return this._isLocked}lock(){if(!this._isLocked){this._isLocked=!0,this._scrollY=window.scrollY;const t=window.innerWidth-document.documentElement.clientWidth;document.documentElement.setAttribute(d.attr("scrolling"),"false"),document.body.style.top=-this._scrollY+"px",this.behavior=getComputedStyle(document.documentElement).getPropertyValue("scroll-behavior"),"smooth"===this.behavior&&(document.documentElement.style.scrollBehavior="auto"),t>0&&document.documentElement.style.setProperty("--scrollbar-width",`${t}px`)}}unlock(){this._isLocked&&(this._isLocked=!1,document.documentElement.removeAttribute(d.attr("scrolling")),document.body.style.top="",window.scrollTo(0,this._scrollY),"smooth"===this.behavior&&document.documentElement.style.removeProperty("scroll-behavior"),document.documentElement.style.removeProperty("--scrollbar-width"))}move(t){this._isLocked?(this._scrollY+=t,document.body.style.top=-this._scrollY+"px"):window.scrollTo(0,window.scrollY+t)}}class E extends u{constructor(){super("load"),this.loading=this.load.bind(this)}activate(){window.addEventListener("load",this.loading)}load(){this.forEach((t=>t.load()))}}const A=["Marianne","Spectral"];class M extends u{constructor(){super("font-swap"),this.swapping=this.swap.bind(this)}activate(){document.fonts&&document.fonts.addEventListener("loadingdone",this.swapping)}swap(){const t=A.filter((t=>document.fonts.check(`16px ${t}`)));this.forEach((e=>e.swapFont(t)))}}class P extends u{constructor(){super("mouse-move"),this.requireMove=!1,this._isMoving=!1,this.moving=this.move.bind(this),this.requesting=this.request.bind(this),this.onPopulate=this.listen.bind(this),this.onEmpty=this.unlisten.bind(this)}listen(){this._isMoving||(this._isMoving=!0,this.requireMove=!1,document.documentElement.addEventListener("mousemove",this.requesting))}unlisten(){this._isMoving&&(this._isMoving=!1,this.requireMove=!1,document.documentElement.removeEventListener("mousemove",this.requesting))}request(t){this._isMoving&&(this.point={x:t.clientX,y:t.clientY},this.requireMove||(this.requireMove=!0,window.requestAnimationFrame(this.moving)))}move(){this.requireMove&&(this.forEach((t=>t.mouseMove(this.point))),this.requireMove=!1)}}class I extends u{constructor(){super("hash"),this.handling=this.handle.bind(this),this.getLocationHash()}activate(){window.addEventListener("hashchange",this.handling)}deactivate(){window.removeEventListener("hashchange",this.handling)}_sanitize(t){return"#"===t.charAt(0)?t.substring(1):t}set hash(t){const e=this._sanitize(t);this._hash!==e&&(window.location.hash=e)}get hash(){return this._hash}getLocationHash(){const t=window.location.hash;this._hash=this._sanitize(t)}handle(t){this.getLocationHash(),this.forEach((e=>e.handleHash(this._hash,t)))}}const L=new class{constructor(){t.create(g),t.create(S),t.create(C),t.create(T),t.create(k),t.create(E),t.create(M),t.create(P),t.create(I);const e=t.getModule("register");this.register=e.register.bind(e)}get isActive(){return t.isActive}start(){o.debug("START"),t.isActive=!0}stop(){o.debug("STOP"),t.isActive=!1}},D=new class{getColor(t,e,i,r={}){const s=`--${t}-${e}-${i}${(t=>{switch(!0){case t.hover:return"-hover";case t.active:return"-active";default:return""}})(r)}`;return getComputedStyle(document.documentElement).getPropertyValue(s).trim()||null}},z=t=>"."===t.charAt(0)?t.substr(1):t,O=t=>{switch(!0){case!t.className:return[];case"string"==typeof t.className:return t.className.split(" ");case"string"==typeof t.className.baseVal:return t.className.baseVal.split(" ")}return[]},R=(t,e,i)=>{e=z(e);const r=O(t),s=r.indexOf(e);!0===i?s>-1&&r.splice(s,1):-1===s&&r.push(e),t.className=r.join(" ")},N=(t,e)=>R(t,e),B=(t,e)=>R(t,e,!0),F=(t,e)=>O(t).indexOf(z(e))>-1,j=['[tabindex]:not([tabindex="-1"])',"a[href]","button:not([disabled])","input:not([disabled])","select:not([disabled])","textarea:not([disabled])","audio[controls]","video[controls]",'[contenteditable]:not([contenteditable="false"])',"details>summary:first-of-type","details","iframe"].join(),U=t=>t.querySelectorAll(j);let V=0;const q=t=>{if(!document.getElementById(t))return t;let e=!0;const i=t;for(;e;)V++,t=`${i}-${V}`,e=document.getElementById(t);return t},G={addClass:N,hasClass:F,removeClass:B,queryParentSelector:f,querySelectorAllArray:p,queryActions:U,uniqueId:q},$={supportLocalStorage:()=>{try{return"localStorage"in window&&null!==window.localStorage}catch(t){return!1}},supportAspectRatio:()=>!!window.CSS&&CSS.supports("aspect-ratio: 16 / 9")},H={TransitionSelector:{NONE:d.selector("transition-none")}},W=(t,...e)=>(e.forEach((e=>{const i=Object.keys(e).reduce(((t,i)=>(t[i]=Object.getOwnPropertyDescriptor(e,i),t)),{});Object.getOwnPropertySymbols(e).forEach((t=>{const r=Object.getOwnPropertyDescriptor(e,t);r.enumerable&&(i[t]=r)})),Object.defineProperties(t,i)})),t),X={completeAssign:W},Z={},Y={};Object.defineProperty(Y,"isLegacy",{get:()=>t.isLegacy}),Y.setLegacy=()=>{t.isLegacy=!0},Z.legacy=Y,Z.dom=G,Z.image={DataURISVG:class{constructor(t=0,e=0){this._width=t,this._height=e,this._content=""}get width(){return this._width}set width(t){this._width=t}get height(){return this._height}set height(t){this._height=t}get content(){return this._content}set content(t){this._content=t}getDataURI(t=!1){let e=`${this._content}`;return e=e.replace(/#/gi,"%23"),t&&(e=e.replace(//gi,"%3E"),e=e.replace(/"/gi,"'"),e=e.replace(/{/gi,"%7B"),e=e.replace(/}/gi,"%7D")),`data:image/svg+xml;charset=utf8,${e}`}}},Z.support=$,Z.motion=H,Z.property=X,Z.ns=d,Z.register=L.register,Z.state=t,Z.query=(t=>{if(t&&t.search){const t=new URLSearchParams(window.location.search).entries();return Object.fromEntries(t)}return null})(window.location),Object.defineProperty(Z,"preventManipulation",{get:()=>c.preventManipulation}),Object.defineProperty(Z,"stage",{get:()=>t.getModule("stage")});const K=e=>t.getModule("stage").getProxy(e);K.version=i,K.prefix="fr",K.organisation="@gouvfr",K.Modes=l,Object.defineProperty(K,"mode",{set:t=>{c.mode=t},get:()=>c.mode}),K.internals=Z,K.version=i,K.start=L.start,K.stop=L.stop,K.inspector=o,K.colors=D;const Q=window[e];K.internals.configuration=Q,c.configure(Q,K.start,K.internals.query),window[e]=K;class J{constructor(){this.emissions={}}add(t,e){if("function"!=typeof e)throw new Error("closure must be a function");this.emissions[t]||(this.emissions[t]=[]),this.emissions[t].push(e)}remove(t,e){if(this.emissions[t])if(e){const i=this.emissions[t].indexOf(e);i>-1&&this.emissions[t].splice(i)}else delete this.emissions[t]}emit(t,e){if(!this.emissions[t])return[];const i=[];for(const r of this.emissions[t])r&&i.push(r(e));return i}dispose(){this.emissions=null}}class tt{constructor(t,e){this.id=t,this.minWidth=e}test(){return window.matchMedia(`(min-width: ${this.minWidth}em)`).matches}}const et={XS:new tt("xs",0),SM:new tt("sm",36),MD:new tt("md",48),LG:new tt("lg",62),XL:new tt("xl",78)};class it{constructor(t=!0){this.jsAttribute=t,this._isRendering=!1,this._isResizing=!1,this._isScrollLocked=!1,this._isLoading=!1,this._isSwappingFont=!1,this._isEnabled=!0,this._isDisposed=!1,this._listeners={},this._handlingClick=this.handleClick.bind(this),this._hashes=[],this._hash="",this._keyListenerTypes=[],this._keys=[],this.handlingKey=this.handleKey.bind(this),this._emitter=new J,this._ascent=new J,this._descent=new J,this._registrations=[],this._nexts=[]}static get instanceClassName(){return"Instance"}_config(t,e){this.element=t,this.registration=e,this.node=t.node,this.id=t.node.id,this.jsAttribute&&this.setAttribute(e.attribute,!0),this.init()}init(){}get proxy(){const t=this;return W({render:()=>t.render(),resize:()=>t.resize()},{get node(){return this.node},get isEnabled(){return t.isEnabled},set isEnabled(e){t.isEnabled=e}})}log(...t){t.unshift(`${this.registration.instanceClassName} #${this.id} - `),o.log.apply(o,t)}debug(...t){t.unshift(`${this.registration.instanceClassName} #${this.id} - `),o.debug.apply(o,t)}info(...t){t.unshift(`${this.registration.instanceClassName} #${this.id} - `),o.info.apply(o,t)}warn(...t){t.unshift(`${this.registration.instanceClassName} #${this.id} - `),o.warn.apply(o,t)}error(...t){t.unshift(`${this.registration.instanceClassName} #${this.id} - `),o.error.apply(o,t)}register(e,i){const r=t.getModule("register").register(e,i,this);this._registrations.push(r)}getRegisteredInstances(t){for(const e of this._registrations)if(e.hasInstanceClassName(t))return e.instances.collection;return[]}dispatch(t,e,i,r){const s=new CustomEvent(t,{detail:e,bubble:!0===i,cancelable:!0===r});this.node.dispatchEvent(s)}listen(t,e,i){this._listeners[t]||(this._listeners[t]=[]);const r=this._listeners[t],s=new st(this.node,t,e,i);r.push(s),s.listen()}unlisten(t,e,i){if(!t){for(const t in this._listeners)this.unlisten(t);return}const r=this._listeners[t];if(!r)return;if(!e)return void r.forEach((e=>this.unlisten(t,e.closure)));const s=r.filter((t=>t.closure===e&&t.matchOptions(i)));s.forEach((t=>t.unlisten())),this._listeners[t]=r.filter((t=>-1===s.indexOf(t)))}listenClick(t){this.listen("click",this._handlingClick,t)}unlistenClick(t){this.unlisten("click",this._handlingClick,t)}handleClick(t){}set hash(e){t.getModule("hash").hash=e}get hash(){return t.getModule("hash").hash}listenHash(e,i){if(!this._hashes)return;0===this._hashes.length&&t.add("hash",this);const r=new nt(e,i);this._hashes=this._hashes.filter((t=>t.hash!==e)),this._hashes.push(r)}unlistenHash(e){this._hashes&&(this._hashes=this._hashes.filter((t=>t.hash!==e)),0===this._hashes.length&&t.remove("hash",this))}handleHash(t,e){if(this._hashes)for(const i of this._hashes)i.handle(t,e)}listenKey(t,e,i=!1,r=!1,s="down"){-1===this._keyListenerTypes.indexOf(s)&&(this.listen(`key${s}`,this.handlingKey),this._keyListenerTypes.push(s)),this._keys.push(new rt(s,t,e,i,r))}unlistenKey(t,e){this._keys=this._keys.filter((i=>i.code!==t||i.closure!==e)),this._keyListenerTypes.forEach((t=>{this._keys.some((e=>e.type===t))||this.unlisten(`key${t}`,this.handlingKey)}))}handleKey(t){for(const e of this._keys)e.handle(t)}get isEnabled(){return this._isEnabled}set isEnabled(t){this._isEnabled=t}get isRendering(){return this._isRendering}set isRendering(e){this._isRendering!==e&&(e?t.add("render",this):t.remove("render",this),this._isRendering=e)}render(){}request(e){this._nexts.push(e),t.getModule("render").request(this)}next(){const t=this._nexts.slice();this._nexts.length=0;for(const e of t)e&&e()}get isResizing(){return this._isResizing}set isResizing(e){this._isResizing!==e&&(e?(t.add("resize",this),this.resize()):t.remove("resize",this),this._isResizing=e)}resize(){}isBreakpoint(t){return 1==("string"==typeof t)?et[t.toUpperCase()].test():t.test()}get isScrollLocked(){return this._isScrollLocked}set isScrollLocked(e){this._isScrollLocked!==e&&(e?t.add("lock",this):t.remove("lock",this),this._isScrollLocked=e)}get isLoading(){return this._isLoading}set isLoading(e){this._isLoading!==e&&(e?t.add("load",this):t.remove("load",this),this._isLoading=e)}load(){}get isSwappingFont(){return this._isSwappingFont}set isSwappingFont(e){this._isSwappingFont!==e&&(e?t.add("font-swap",this):t.remove("font-swap",this),this._isSwappingFont=e)}swapFont(){}get isMouseMoving(){return this._isMouseMoving}set isMouseMoving(e){this._isMouseMoving!==e&&(e?t.add("mouse-move",this):t.remove("mouse-move",this),this._isMouseMoving=e)}mouseMove(t){}examine(t){this.node.matches(this.registration.selector)?this.mutate(t):this._dispose()}mutate(t){}retrieveNodeId(t,e){if(t.id)return t.id;const i=q(`${this.id}-${e}`);return this.warn(`add id '${i}' to ${e}`),t.setAttribute("id",i),i}get isDisposed(){return this._isDisposed}_dispose(){this.debug(`dispose instance of ${this.registration.instanceClassName} on element [${this.element.id}]`),this.removeAttribute(this.registration.attribute),this.unlisten(),t.remove("hash",this),this._hashes=null,this._keys=null,this.isRendering=!1,this.isResizing=!1,this._nexts=null,t.getModule("render").nexts.remove(this),this.isScrollLocked=!1,this.isLoading=!1,this.isSwappingFont=!1,this.isMouseMoving=!1,this._emitter.dispose(),this._emitter=null,this._ascent.dispose(),this._ascent=null,this._descent.dispose(),this._descent=null,this.element.remove(this);for(const e of this._registrations)t.remove("register",e);this._registrations=null,this.registration.remove(this),this._isDisposed=!0,this.dispose()}dispose(){}emit(t,e){return this.element.emit(t,e)}addEmission(t,e){this._emitter.add(t,e)}removeEmission(t,e){this._emitter.remove(t,e)}ascend(t,e){return this.element.ascend(t,e)}addAscent(t,e){this._ascent.add(t,e)}removeAscent(t,e){this._ascent.remove(t,e)}descend(t,e){return this.element.descend(t,e)}addDescent(t,e){this._descent.add(t,e)}removeDescent(t,e){this._descent.remove(t,e)}get style(){return this.node.style}addClass(t){N(this.node,t)}removeClass(t){B(this.node,t)}hasClass(t){return F(this.node,t)}get classNames(){return O(this.node)}remove(){this.node.parentNode.removeChild(this.node)}setAttribute(t,e){this.node.setAttribute(t,e)}getAttribute(t){return this.node.getAttribute(t)}hasAttribute(t){return this.node.hasAttribute(t)}removeAttribute(t){this.node.removeAttribute(t)}setProperty(t,e){this.node.style.setProperty(t,e)}removeProperty(t){this.node.style.removeProperty(t)}focus(){this.node.focus()}blur(){this.node.blur()}focusClosest(){const t=this._focusClosest(this.node.parentNode);t&&t.focus()}_focusClosest(t){if(!t)return null;const e=[...U(t)];if(e.length<=1)return this._focusClosest(t.parentNode);{const t=e.indexOf(this.node);return e[t+(twindow.innerHeight&&i.move(e.bottom-window.innerHeight+50)}matches(t){return this.node.matches(t)}querySelector(t){return this.node.querySelector(t)}querySelectorAll(t){return p(this.node,t)}queryParentSelector(t){return f(this.node,t)}getRect(){const t=this.node.getBoundingClientRect();return t.center=t.left+.5*t.width,t.middle=t.top+.5*t.height,t}get isLegacy(){return t.isLegacy}}class rt{constructor(t,e,i,r,s){this.type=t,this.eventType=`key${t}`,this.keyCode=e,this.closure=i,this.preventDefault=!0===r,this.stopPropagation=!0===s}handle(t){t.type===this.eventType&&t.keyCode===this.keyCode.value&&(this.closure(t),this.preventDefault&&t.preventDefault(),this.stopPropagation&&t.stopPropagation())}}class st{constructor(t,e,i,r){this._node=t,this._type=e,this._closure=i,this._options=r}get closure(){return this._closure}listen(){this._node.addEventListener(this._type,this._closure,this._options)}matchOptions(t=null){switch(!0){case null===t:case"boolean"==typeof this._options&&"boolean"==typeof t&&this._options===t:return!0;case Object.keys(this._options).length!==Object.keys(t).length:return!1;case Object.keys(t).every((e=>this._options[e]===t[e])):return!0}return!1}unlisten(){this._node.removeEventListener(this._type,this._closure,this._options)}}class nt{constructor(t,e){this.hash=t,this.add=e}handle(t,e){this.hash===t&&this.add(e)}}const ot={DISCLOSE:d.event("disclose"),CONCEAL:d.event("conceal")},at={RESET:d.emission("disclosure","reset"),ADDED:d.emission("disclosure","added"),RETRIEVE:d.emission("disclosure","retrieve"),REMOVED:d.emission("disclosure","removed"),GROUP:d.emission("disclosure","group"),UNGROUP:d.emission("disclosure","ungroup"),SPOTLIGHT:d.emission("disclosure","spotlight")};class lt extends it{constructor(t,e,i,r){super(),this.type=t,this._selector=e,this.DisclosureButtonInstanceClass=i,this.disclosuresGroupInstanceClassName=r,this.modifier=this._selector+"--"+this.type.id,this._isPristine=!0,this._isRetrievingPrimaries=!1,this._hasRetrieved=!1,this._primaryButtons=[]}static get instanceClassName(){return"Disclosure"}init(){this.addDescent(at.RESET,this.reset.bind(this)),this.addDescent(at.GROUP,this.update.bind(this)),this.addDescent(at.UNGROUP,this.update.bind(this)),this.addAscent(at.SPOTLIGHT,this.disclose.bind(this)),this.register(`[aria-controls="${this.id}"]`,this.DisclosureButtonInstanceClass),this.ascend(at.ADDED),this.listenHash(this.id,this._spotlight.bind(this)),this.update()}get isEnabled(){return super.isEnabled}set isEnabled(t){this.isEnabled!==t&&(super.isEnabled=t,t?this.ascend(at.ADDED):this.ascend(at.REMOVED))}get isPristine(){return this._isPristine}get proxy(){const t=this,e=Object.assign(super.proxy,{disclose:t.disclose.bind(t),focus:t.focus.bind(t)});return this.type.canConceal&&(e.conceal=t.conceal.bind(t)),W(e,{get buttons(){return t.buttons.map((t=>t.proxy))},get group(){const e=t.group;return e?e.proxy:null},get isDisclosed(){return t.isDisclosed}})}get buttons(){return this.getRegisteredInstances(this.DisclosureButtonInstanceClass.instanceClassName)}update(){this.getGroup(),this.retrievePrimaries()}getGroup(){if(!this.disclosuresGroupInstanceClassName)return void(this._group=null);const t=this.element.getAscendantInstance(this.disclosuresGroupInstanceClassName,this.constructor.instanceClassName);t&&t.validate(this)?this._group=t:this._group=null}get group(){return this._group}disclose(t){return!(!0===this.isDisclosed||!this.isEnabled||(this._isPristine=!1,this.isDisclosed=!0,!t&&this.group&&(this.group.current=this),0))}conceal(t,e=!0){return!(!1===this.isDisclosed||!this.type.canConceal&&this.group&&this.group.current===this||(this.isDisclosed=!1,!t&&this.group&&this.group.current===this&&(this.group.current=null),e||this.focus(),this._isPristine||this.descend(at.RESET),0))}get isDisclosed(){return this._isDisclosed}set isDisclosed(t){if(this._isDisclosed!==t&&(this.isEnabled||!0!==t)){this.dispatch(t?ot.DISCLOSE:ot.CONCEAL,this.type),this._isDisclosed=t,t?this.addClass(this.modifier):this.removeClass(this.modifier);for(let e=0;et.isInitiallyDisclosed))}hasRetrieved(){return this._hasRetrieved}reset(){}toggle(t){if(this.type.canConceal)switch(!0){case!t:case this.isDisclosed:this.conceal(!1,!1);break;default:this.disclose()}else this.disclose()}get buttonHasFocus(){return this.buttons.some((t=>t.hasFocus))}get hasFocus(){return!!super.hasFocus||!!this.buttonHasFocus||this.querySelectorAll(":focus").length>0}focus(){this._primaryButtons.length>0&&this._primaryButtons[0].focus()}get primaryButtons(){return this._primaryButtons}retrievePrimaries(){this._isRetrievingPrimaries||(this._isRetrievingPrimaries=!0,this.request(this._retrievePrimaries.bind(this)))}_retrievePrimaries(){if(this._isRetrievingPrimaries=!1,this._primaryButtons=this._electPrimaries(this.buttons),!this._hasRetrieved&&0!==this._primaryButtons.length)if(this.retrieved(),this._hasRetrieved=!0,this.applyAbility(!0),this.group)this.group.retrieve();else if(this._isPristine&&this.isEnabled&&!this.group)switch(!0){case this.hash===this.id:this._spotlight();break;case this.isInitiallyDisclosed:this.disclose()}}retrieved(){}_spotlight(){this.disclose(),this.request((()=>{this.ascend(at.SPOTLIGHT)}))}_electPrimaries(t){return t.filter((t=>t.canDisclose&&!this.node.contains(t.node)))}applyAbility(t=!1){const e=!this._primaryButtons.every((t=>t.isDisabled));this.isEnabled!==e&&(this.isEnabled=e,t||(!this.isEnabled&&this.isDisclosed&&(this.group?this.ascend(at.REMOVED):this.type.canConceal&&this.conceal()),this.isEnabled&&(this.group&&this.ascend(at.ADDED),this.hash===this.id&&this._spotlight())))}dispose(){this._group=null,this._primaryButtons=null,super.dispose(),this.ascend(at.REMOVED)}}class ct extends it{constructor(t){super(),this.type=t,this.attributeName=t.ariaState?"aria-"+t.id:d.attr(t.id),this._canDisclose=!1}static get instanceClassName(){return"DisclosureButton"}get isPrimary(){return this.registration.creator.primaryButtons.includes(this)}get canDisclose(){return this._canDisclose}get isDisabled(){return this.type.canDisable&&this.hasAttribute("disabled")}init(){this._canDisclose=this.hasAttribute(this.attributeName),this._isInitiallyDisclosed=this.isDisclosed,this._isContained=this.registration.creator.node.contains(this.node),this.controlsId=this.getAttribute("aria-controls"),this.registration.creator.retrievePrimaries(),this.listenClick()}get proxy(){return Object.assign(super.proxy,{focus:this.focus.bind(this)})}handleClick(t){this.registration.creator&&this.registration.creator.toggle(this.canDisclose)}mutate(t){this._canDisclose=this.hasAttribute(this.attributeName),this.registration.creator.applyAbility(),!this._isApplying&&this.isPrimary&&t.indexOf(this.attributeName)>-1&&this.registration.creator&&(this.isDisclosed?this.registration.creator.disclose():this.type.canConceal&&this.registration.creator.conceal())}apply(t){this.canDisclose&&(this._isApplying=!0,this.setAttribute(this.attributeName,t),this.request((()=>{this._isApplying=!1})))}get isDisclosed(){return"true"===this.getAttribute(this.attributeName)}get isInitiallyDisclosed(){return this._isInitiallyDisclosed}focus(){super.focus(),this.scrollIntoView()}measure(t){const e=this.rect;this._dx=t.x-e.x,this._dy=t.y-e.y}get dx(){return this._dx}get dy(){return this._dy}}const ht={PREVENT_CONCEAL:d.attr.selector("prevent-conceal"),GROUP:d.attr("group")};class ut extends it{constructor(t,e){super(e),this.disclosureInstanceClassName=t,this._members=[],this._index=-1,this._isRetrieving=!1,this._hasRetrieved=!1,this._isGrouped=!0}static get instanceClassName(){return"DisclosuresGroup"}init(){this.addAscent(at.ADDED,this.update.bind(this)),this.addAscent(at.RETRIEVE,this.retrieve.bind(this)),this.addAscent(at.REMOVED,this.update.bind(this)),this.descend(at.GROUP),this._isGrouped="false"!==this.getAttribute(ht.GROUP),this.update()}get proxy(){const t=this,e={set index(e){t.index=e},get index(){return t.index},get length(){return t.length},get current(){const e=t.current;return e?e.proxy:null},get members(){return t.members.map((t=>t.proxy))},get hasFocus(){return t.hasFocus},set isGrouped(e){t.isGrouped=e},get isGrouped(){return t.isGrouped}};return W(super.proxy,e)}validate(t){return!0}getMembers(){const t=this.element.getDescendantInstances(this.disclosureInstanceClassName,this.constructor.instanceClassName,!0);this._members=t.filter(this.validate.bind(this)).filter((t=>t.isEnabled)),t.filter((t=>!this._members.includes(t))).forEach((t=>t.conceal()))}retrieve(t=!1){this._isRetrieving||this._hasRetrieved&&!t||(this._isRetrieving=!0,this.request(this._retrieve.bind(this)))}_retrieve(){if(this.getMembers(),this._isRetrieving=!1,this._hasRetrieved=!0,this.hash)for(let t=0;t{this.ascend(at.SPOTLIGHT)})),t}for(let t=0;t=this.length||t===this._index)){this._index=t;for(let e=0;ee.map((e=>d.selector(`${t}--${e}`))).join(","),St=`${d.selector("responsive-img")}, ${wt("responsive-img",bt)}, ${d.selector("responsive-vid")}, ${wt("responsive-vid",["16x9","4x3","1x1"])}`,Ct={RATIO:`${d.selector("ratio")}, ${wt("ratio",bt)}, ${St}`},Tt=window[e],kt={TOP:d.selector("placement--top"),RIGHT:d.selector("placement--right"),BOTTOM:d.selector("placement--bottom"),LEFT:d.selector("placement--left")},Et={START:d.selector("placement--start"),CENTER:d.selector("placement--center"),END:d.selector("placement--end")},At={TOP:"place_top",RIGHT:"place_right",BOTTOM:"place_bottom",LEFT:"place_left"},Mt={START:"align_start",CENTER:"align_center",END:"align_end"},Pt={AUTO:"placement_auto",MANUAL:"placement_manual"};K.core={Instance:it,Breakpoints:et,KeyCodes:x,Disclosure:lt,DisclosureButton:ct,DisclosuresGroup:ut,DisclosureType:dt,DisclosureEvent:ot,DisclosureSelector:ht,DisclosureEmission:at,Collapse:class extends lt{constructor(){super(dt.EXPAND,ft.COLLAPSE,pt,"CollapsesGroup")}static get instanceClassName(){return"Collapse"}init(){super.init(),this.listen("transitionend",this.endCollapsing.bind(this))}endCollapsing(t){this._isCollpasing&&(this._timeout&&clearTimeout(this._timeout),this._timeout=null,this._isCollpasing=!1,this.removeClass(ft.COLLAPSING),this.isDisclosed||this.isLegacy&&(this.style.maxHeight=""))}unbound(){this.isLegacy&&(this.style.maxHeight="none")}disclose(t){if(!0===this.isDisclosed||!this.isEnabled)return!1;this.unbound(),this.collapsing((()=>super.disclose(t)))}conceal(t,e){if(!1===this.isDisclosed)return!1;this.collapsing((()=>super.conceal(t,e)))}collapsing(t){this._isCollpasing=!0,this._timeout&&clearTimeout(this._timeout),this.addClass(ft.COLLAPSING),this.adjust(),this.request((()=>{t(),this._timeout=setTimeout(this.endCollapsing.bind(this),500)}))}adjust(){this.setProperty("--collapser","none");const t=this.node.offsetHeight;this.setProperty("--collapse",-t+"px"),this.setProperty("--collapser","")}reset(){this.isPristine||(this.isDisclosed=!1)}_electPrimaries(t){const e=this.element.parent.instances.map((t=>t.collapsePrimary)).filter((e=>void 0!==e&&t.indexOf(e)>-1));if(1===e.length)return e;if(1===(t=super._electPrimaries(t)).length)return t;const i=t.filter((t=>t.dy>=0));if(i.length>0&&(t=i),1===t.length)return t;const r=Math.min(...t.map((t=>t.dy))),s=t.filter((t=>t.dy===r));return s.length>0&&(t=s),1===t.length||t.sort(((t,e)=>Math.abs(e.dx)-Math.abs(t.dx))),t}},CollapseButton:pt,CollapsesGroup:class extends ut{constructor(){super("Collapse")}static get instanceClassName(){return"CollapsesGroup"}get canUngroup(){return!0}},CollapseSelector:ft,RootSelector:{ROOT:":root"},RootEmission:v,Equisized:class extends it{static get instanceClassName(){return"Equisized"}init(){this.ascend(mt.CHANGE)}measure(){return this.isLegacy&&(this.style.width="auto"),this.getRect().width}adjust(t){this.isLegacy&&(this.style.width=`${t}px`)}dispose(){this.ascend(mt.CHANGE)}},EquisizedEmission:mt,Toggle:class extends it{static get instanceClassName(){return"Toggle"}init(){this.pressed="true"===this.pressed,this.listenClick()}handleClick(){this.toggle()}toggle(){this.pressed="true"!==this.pressed}get pressed(){return this.getAttribute("aria-pressed")}set pressed(t){this.setAttribute("aria-pressed",t?"true":"false"),this.dispatch(gt.TOGGLE,t)}get proxy(){const t=this,e=Object.assign(super.proxy,{toggle:t.toggle.bind(t)});return W(e,{get pressed(){return t.pressed},set pressed(e){t.pressed=e}})}},EquisizedsGroup:class extends it{static get instanceClassName(){return"EquisizedsGroup"}init(){this.isResizing=!0,this.isLoading=!0,this.addAscent(mt.CHANGE,this.resize.bind(this))}load(){this.resize()}resize(){const t=this.element.getDescendantInstances("Equisized");this.isLegacy||this.style.setProperty("--equisized-width","auto");const e=Math.max(...t.map((t=>t.measure())));this.isLegacy?t.forEach((t=>t.adjust(e))):this.style.setProperty("--equisized-width",`${e}px`)}},InjectSvg:class extends it{static get instanceClassName(){return"InjectSvg"}init(){this.node&&(this.img=this.node.querySelector("img")),this.isLegacy||this.replace()}get proxy(){const t=this;return Object.assign(super.proxy,{replace:t.replace.bind(t),restore:t.restore.bind(t)})}fetch(){this.img&&(this.imgID=this.img.getAttribute("id"),this.imgClass=this.img.getAttribute("class"),this.imgURL=this.img.getAttribute("src"),fetch(this.imgURL).then((t=>t.text())).then((t=>{const e=(new DOMParser).parseFromString(t,"text/html");this.svg=e.querySelector("svg"),this.svg&&this.replace()})))}replace(){if(!this.svg)return void this.fetch();this.imgID&&void 0!==this.imgID&&this.svg.setAttribute("id",this.imgID);let t=this.imgURL.match(/[ \w-]+\./)[0];var e,i;t&&(t=t.slice(0,-1),["dark","light","system"].includes(t)&&(this.svg.innerHTML=this.svg.innerHTML.replaceAll('id="artwork-',`id="${t}-artwork-`),this.svg.innerHTML=this.svg.innerHTML.replaceAll('"#artwork-',`"#${t}-artwork-`))),this.imgClass&&void 0!==this.imgClass&&this.svg.setAttribute("class",this.imgClass),this.svg.hasAttribute("xmlns:a")&&this.svg.removeAttribute("xmlns:a"),this.node.setAttribute("data-fr-inject-svg",!0),e=this.svg,i={"aria-hidden":!0,focusable:!1},Object.keys(i).forEach((t=>e.setAttribute(t,i[t]))),this.node.replaceChild(this.svg,this.img)}restore(){this.img&&this.svg&&(this.node.setAttribute("data-fr-inject-svg",!1),this.node.replaceChild(this.img,this.svg))}},InjectSvgSelector:yt,Artwork:class extends it{static get instanceClassName(){return"Artwork"}init(){this.isLegacy&&this.replace()}get proxy(){return Object.assign(super.proxy,{replace:this.replace.bind(this)})}fetch(){this.xlink=this.node.getAttribute("href");const t=this.xlink.split("#");this.svgUrl=t[0],this.svgName=t[1];const e=new XMLHttpRequest;e.onload=()=>{const t=(new DOMParser).parseFromString(e.responseText,"text/html");this.realSvgContent=t.getElementById(this.svgName),this.realSvgContent&&("symbol"===this.realSvgContent.tagName?(this.use=t.querySelector('use[href="#'+this.svgName+'"]'),this.use&&this.node.parentNode.insertBefore(this.use,this.node)):this.realSvgContent.classList.add(this.node.classList),this.replace())},e.open("GET",this.svgUrl),e.send()}replace(){this.realSvgContent?this.node.parentNode.replaceChild(this.realSvgContent,this.node):this.fetch()}},ArtworkSelector:_t,AssessFile:class extends it{static get instanceClassName(){return"AssessFile"}init(){this.lang=this.getLang(this.node),this.href=this.getAttribute("href"),this.hreflang=this.getAttribute("hreflang"),this.file={},this.gather(),this.addAscent(xt.ADDED,this.update.bind(this)),this.addDescent(xt.ADDED,this.update.bind(this))}getFileLength(){void 0!==this.href?fetch(this.href,{method:"HEAD",mode:"cors"}).then((t=>{this.length=t.headers.get("content-length")||-1,-1===this.length&&o.warn("File size unknown: "+this.href+'\nUnable to get HTTP header: "content-length"'),this.gather()})):this.length=-1}mutate(t){-1!==t.indexOf("href")&&(this.href=this.getAttribute("href"),this.getFileLength()),-1!==t.indexOf("hreflang")&&(this.hreflang=this.getAttribute("hreflang"),this.gather())}gather(){if(this.isLegacy&&(this.length=-1),this.length){if(this.details=[],this.href){const t=this.parseExtension(this.href);t&&this.details.push(t.toUpperCase())}-1!==this.length&&this.details.push(this.bytesToSize(this.length)),this.hreflang&&this.details.push(this.getLangDisplayName(this.hreflang)),this.update()}else this.getFileLength()}update(){this.details&&(this.descend(xt.UPDATE,this.details),this.ascend(xt.UPDATE,this.details))}getLang(t){return t.lang?t.lang:document.documentElement===t?window.navigator.language:this.getLang(t.parentElement)}parseExtension(t){return t.match(/\.(\w{1,9})(?:$|[?#])/)[0].replace(".","")}getLangDisplayName(t){if(this.isLegacy)return t;const e=new Intl.DisplayNames([this.lang],{type:"language"}).of(t);return e.charAt(0).toUpperCase()+e.slice(1)}bytesToSize(t){if(-1===t)return null;let e=["octets","ko","Mo","Go","To"];"bytes"===this.getAttribute(d.attr("assess-file"))&&(e=["bytes","KB","MB","GB","TB"]);const i=parseInt(Math.floor(Math.log(t)/Math.log(1e3)),10);if(0===i)return`${t} ${e[i]}`;const r=t/1e3**i,s=Math.round(100*(r+Number.EPSILON))/100;return`${String(s).replace(".",",")} ${e[i]}`}},AssessDetail:class extends it{static get instanceClassName(){return"AssessDetail"}init(){this.addDescent(xt.UPDATE,this.update.bind(this)),this.ascend(xt.ADDED)}update(t){this.node.innerHTML=t.join(" - ")}},AssessEmission:xt,AssessSelector:vt,Ratio:class extends it{static get instanceClassName(){return"Ratio"}init(){if(!Tt.internals.support.supportAspectRatio()){this.ratio=16/9;for(const t in this.classNames)if(this.registration.selector.indexOf(this.classNames[t])>0){const e=this.classNames[t].split("ratio-");e[1]&&(this.ratio=e[1].split("x")[0]/e[1].split("x")[1])}this.isRendering=!0,this.update()}}render(){this.getRect().width!==this.currentWidth&&this.update()}update(){this.currentWidth=this.getRect().width,this.style.height=this.currentWidth/this.ratio+"px"}},RatioSelector:Ct,Placement:class extends it{constructor(t=Pt.AUTO,e=[At.BOTTOM,At.TOP,At.LEFT,At.RIGHT],i=[Mt.CENTER,Mt.START,Mt.END],r=16){super(),this._mode=t,this._places=e,this._aligns=i,this._safeAreaMargin=r,this._isShown=!1}static get instanceClassName(){return"Placement"}init(){this.isResizing=!0}get proxy(){const t=this,e=Object.assign(super.proxy,{show:t.show.bind(t),hide:t.hide.bind(t)});return W(e,{get mode(){return t.mode},set mode(e){t.mode=e},get place(){return t.place},set place(e){t.place=e},get align(){return t.align},set align(e){t.align=e},get isShown(){return t.isShown},set isShown(e){t.isShown=e}})}get mode(){return this._mode}set mode(t){this._mode=t}get place(){return this._place}set place(t){if(this._place!==t){switch(this._place){case At.TOP:this.removeClass(kt.TOP);break;case At.RIGHT:this.removeClass(kt.RIGHT);break;case At.BOTTOM:this.removeClass(kt.BOTTOM);break;case At.LEFT:this.removeClass(kt.LEFT)}switch(this._place=t,this._place){case At.TOP:this.addClass(kt.TOP);break;case At.RIGHT:this.addClass(kt.RIGHT);break;case At.BOTTOM:this.addClass(kt.BOTTOM);break;case At.LEFT:this.addClass(kt.LEFT)}}}get align(){return this._align}set align(t){if(this._align!==t){switch(this._align){case Mt.START:this.removeClass(Et.START);break;case Mt.CENTER:this.removeClass(Et.CENTER);break;case Mt.END:this.removeClass(Et.END)}switch(this._align=t,this._align){case Mt.START:this.addClass(Et.START);break;case Mt.CENTER:this.addClass(Et.CENTER);break;case Mt.END:this.addClass(Et.END)}}}show(){this.isShown=!0}hide(){this.isShown=!1}get isShown(){return this._isShown}set isShown(t){this._isShown!==t&&this.isEnabled&&(this.isRendering=t,this._isShown=t)}setReferent(t){this._referent=t}resize(){this.safeArea={top:this._safeAreaMargin,right:window.innerWidth-this._safeAreaMargin,bottom:window.innerHeight-this._safeAreaMargin,left:this._safeAreaMargin,center:.5*window.innerWidth,middle:.5*window.innerHeight}}render(){if(!this._referent)return;if(this.rect=this.getRect(),this.referentRect=this._referent.getRect(),this.mode===Pt.AUTO)switch(this.place=this.getPlace(),this.place){case At.TOP:case At.BOTTOM:this.align=this.getHorizontalAlign();break;case At.LEFT:case At.RIGHT:this.align=this.getVerticalAlign()}let t,e;switch(this.place){case At.TOP:e=this.referentRect.top-this.rect.height;break;case At.RIGHT:t=this.referentRect.right;break;case At.BOTTOM:e=this.referentRect.bottom;break;case At.LEFT:t=this.referentRect.left-this.rect.width}switch(this.place){case At.TOP:case At.BOTTOM:switch(this.align){case Mt.CENTER:t=this.referentRect.center-.5*this.rect.width;break;case Mt.START:t=this.referentRect.left;break;case Mt.END:t=this.referentRect.right-this.rect.width}break;case At.RIGHT:case At.LEFT:switch(this.align){case Mt.CENTER:e=this.referentRect.middle-.5*this.rect.height;break;case Mt.START:e=this.referentRect.top;break;case Mt.END:e=this.referentRect.bottom-this.rect.height}}this._x===t&&this._y===e||(this._x=t+.5|0,this._y=e+.5|0,this.node.style.transform=`translate(${this._x}px,${this._y}px)`)}getPlace(){for(const t of this._places)switch(t){case At.TOP:if(this.referentRect.top-this.rect.height>this.safeArea.top)return At.TOP;break;case At.RIGHT:if(this.referentRect.right+this.rect.widththis.safeArea.left)return At.LEFT}return this._places[0]}getHorizontalAlign(){for(const t of this._aligns)switch(t){case Mt.CENTER:if(this.referentRect.center-.5*this.rect.width>this.safeArea.left&&this.referentRect.center+.5*this.rect.widththis.safeArea.left)return Mt.END}return this._aligns[0]}getVerticalAlign(){for(const t of this._aligns)switch(t){case Mt.CENTER:if(this.referentRect.middle-.5*this.rect.height>this.safeArea.top&&this.referentRect.middle+.5*this.rect.heightthis.safeArea.top)return Mt.END}return this._aligns[0]}dispose(){this._referent=null,super.dispose()}},PlacementReferent:class extends it{constructor(){super(),this._isShown=!1}static get instanceClassName(){return"PlacementReferent"}init(){this.registration.creator.setReferent(this),this._placement=this.registration.creator}get placement(){return this._placement}get isShown(){return this._isShown}set isShown(t){this._isShown!==t&&this.isEnabled&&(this._isShown=t,t?this.registration.creator.show():this.registration.creator.hide())}show(){this.isShown=!0}hide(){this.isShown=!1}},PlacementAlign:Mt,PlacementPosition:At,PlacementMode:Pt},K.internals.register(K.core.CollapseSelector.COLLAPSE,K.core.Collapse),K.internals.register(K.core.InjectSvgSelector.INJECT_SVG,K.core.InjectSvg),K.internals.register(K.core.RatioSelector.RATIO,K.core.Ratio),K.internals.register(K.core.AssessSelector.ASSESS_FILE,K.core.AssessFile),K.internals.register(K.core.AssessSelector.DETAIL,K.core.AssessDetail);const It={SYSTEM:"system",LIGHT:"light",DARK:"dark"},Lt={THEME:Tt.internals.ns.attr("theme"),SCHEME:Tt.internals.ns.attr("scheme"),TRANSITION:Tt.internals.ns.attr("transition")},Dt={LIGHT:"light",DARK:"dark"},zt={SCHEME:Tt.internals.ns.emission("scheme","scheme"),THEME:Tt.internals.ns.emission("scheme","theme"),ASK:Tt.internals.ns.emission("scheme","ask")},Ot={SCHEME:Tt.internals.ns.event("scheme"),THEME:Tt.internals.ns.event("theme")};class Rt extends Tt.core.Instance{constructor(){super(!1)}static get instanceClassName(){return"Scheme"}init(){this.changing=this.change.bind(this),this.hasAttribute(Lt.TRANSITION)&&(this.removeAttribute(Lt.TRANSITION),this.request(this.restoreTransition.bind(this)));const t=Tt.internals.support.supportLocalStorage()?localStorage.getItem("scheme"):"",e=this.getAttribute(Lt.SCHEME);switch(t){case It.DARK:case It.LIGHT:case It.SYSTEM:this.scheme=t;break;default:switch(e){case It.DARK:this.scheme=It.DARK;break;case It.LIGHT:this.scheme=It.LIGHT;break;default:this.scheme=It.SYSTEM}}this.addAscent(zt.ASK,this.ask.bind(this)),this.addAscent(zt.SCHEME,this.apply.bind(this))}get proxy(){const t=this,e={get scheme(){return t.scheme},set scheme(e){t.scheme=e}};return Tt.internals.property.completeAssign(super.proxy,e)}restoreTransition(){this.setAttribute(Lt.TRANSITION,"")}ask(){this.descend(zt.SCHEME,this.scheme)}apply(t){this.scheme=t}get scheme(){return this._scheme}set scheme(t){if(this._scheme!==t){switch(this._scheme=t,t){case It.SYSTEM:this.listenPreferences();break;case It.DARK:this.unlistenPreferences(),this.theme=Dt.DARK;break;case It.LIGHT:this.unlistenPreferences(),this.theme=Dt.LIGHT;break;default:return void(this.scheme=It.SYSTEM)}this.descend(zt.SCHEME,t),Tt.internals.support.supportLocalStorage()&&localStorage.setItem("scheme",t),this.setAttribute(Lt.SCHEME,t),this.dispatch(Ot.SCHEME,{scheme:this._scheme})}}get theme(){return this._theme}set theme(t){if(this._theme!==t)switch(t){case Dt.LIGHT:case Dt.DARK:this._theme=t,this.setAttribute(Lt.THEME,t),this.descend(zt.THEME,t),this.dispatch(Ot.THEME,{theme:this._theme}),document.documentElement.style.colorScheme=t===Dt.DARK?"dark":""}}listenPreferences(){this.isListening||(this.isListening=!0,this.mediaQuery=window.matchMedia("(prefers-color-scheme: dark)"),this.mediaQuery.addEventListener&&this.mediaQuery.addEventListener("change",this.changing),this.change())}unlistenPreferences(){this.isListening&&(this.isListening=!1,this.mediaQuery.removeEventListener("change",this.changing),this.mediaQuery=null)}change(){this.isListening&&(this.theme=this.mediaQuery.matches?Dt.DARK:Dt.LIGHT)}mutate(t){t.indexOf(Lt.SCHEME)>-1&&(this.scheme=this.getAttribute(Lt.SCHEME)),t.indexOf(Lt.THEME)>-1&&(this.theme=this.getAttribute(Lt.THEME))}dispose(){this.unlistenPreferences()}}const Nt={SCHEME:`:root${Tt.internals.ns.attr.selector("theme")}, :root${Tt.internals.ns.attr.selector("scheme")}`,SWITCH_THEME:Tt.internals.ns.selector("switch-theme"),RADIO_BUTTONS:`input[name="${Tt.internals.ns("radios-theme")}"]`};Tt.scheme={Scheme:Rt,SchemeValue:It,SchemeSelector:Nt,SchemeEmission:zt,SchemeTheme:Dt,SchemeEvent:Ot},Tt.internals.register(Tt.scheme.SchemeSelector.SCHEME,Tt.scheme.Scheme);const Bt=Tt.internals.ns.selector("accordion"),Ft=Tt.internals.ns.selector("collapse"),jt={GROUP:Tt.internals.ns.selector("accordions-group"),ACCORDION:Bt,COLLAPSE:`${Bt} > ${Ft}, ${Bt} > *:not(${Bt}):not(${Ft}) > ${Ft}, ${Bt} > *:not(${Bt}):not(${Ft}) > *:not(${Bt}):not(${Ft}) > ${Ft}`,COLLAPSE_LEGACY:`${Bt} ${Ft}`,BUTTON:`${Bt}__btn`};class Ut extends Tt.core.Instance{static get instanceClassName(){return"Accordion"}get collapsePrimary(){return this.element.children.map((t=>t.getInstance("CollapseButton"))).filter((t=>null!==t&&t.hasClass(jt.BUTTON)))[0]}}class Vt extends Tt.core.CollapsesGroup{static get instanceClassName(){return"AccordionsGroup"}validate(t){const e=t.node.matches(Tt.internals.legacy.isLegacy?jt.COLLAPSE_LEGACY:jt.COLLAPSE);return super.validate(t)&&e}}Tt.accordion={Accordion:Ut,AccordionSelector:jt,AccordionsGroup:Vt},Tt.internals.register(Tt.accordion.AccordionSelector.GROUP,Tt.accordion.AccordionsGroup),Tt.internals.register(Tt.accordion.AccordionSelector.ACCORDION,Tt.accordion.Accordion);const qt={EQUISIZED_BUTTON:`${Tt.internals.ns.selector("btns-group--equisized")} ${Tt.internals.ns.selector("btn")}`,EQUISIZED_GROUP:Tt.internals.ns.selector("btns-group--equisized")};Tt.button={ButtonSelector:qt},Tt.internals.register(Tt.button.ButtonSelector.EQUISIZED_BUTTON,Tt.core.Equisized),Tt.internals.register(Tt.button.ButtonSelector.EQUISIZED_GROUP,Tt.core.EquisizedsGroup);class Gt extends Tt.core.Instance{static get instanceClassName(){return"CardDownload"}init(){this.addAscent(Tt.core.AssessEmission.UPDATE,(t=>{this.descend(Tt.core.AssessEmission.UPDATE,t)})),this.addAscent(Tt.core.AssessEmission.ADDED,(()=>{this.descend(Tt.core.AssessEmission.ADDED)}))}}const $t={DOWNLOAD:Tt.internals.ns.selector("card--download"),DOWNLOAD_DETAIL:`${Tt.internals.ns.selector("card--download")} ${Tt.internals.ns.selector("card__end")} ${Tt.internals.ns.selector("card__detail")}`};Tt.card={CardSelector:$t,CardDownload:Gt},Tt.internals.register(Tt.card.CardSelector.DOWNLOAD,Tt.card.CardDownload),Tt.internals.register(Tt.card.CardSelector.DOWNLOAD_DETAIL,Tt.core.AssessDetail);const Ht={INPUT:`${Tt.internals.ns.selector("checkbox-group")} input[type="checkbox"]`},Wt={CHANGE:Tt.internals.ns.emission("checkbox","change"),RETRIEVE:Tt.internals.ns.emission("checkbox","retrieve")};class Xt extends Tt.core.Instance{static get instanceClassName(){return"CheckboxInput"}constructor(){super(),this._handlingChange=this.handleChange.bind(this)}init(){this.node.addEventListener("change",this._handlingChange),this.addDescent(Wt.RETRIEVE,this._handlingChange),this.handleChange()}get isChecked(){return this.node.checked}handleChange(){this.ascend(Wt.CHANGE,this.node)}}Tt.checkbox={CheckboxSelector:Ht,CheckboxEmission:Wt,CheckboxInput:Xt},Tt.internals.register(Tt.checkbox.CheckboxSelector.INPUT,Tt.checkbox.CheckboxInput);const Zt={SEGMENTED:Tt.internals.ns.selector("segmented"),SEGMENTED_ELEMENTS:Tt.internals.ns.selector("segmented__elements"),SEGMENTED_ELEMENT:Tt.internals.ns.selector("segmented__element input"),SEGMENTED_LEGEND:Tt.internals.ns.selector("segmented__legend")},Yt={ADDED:Tt.internals.ns.emission("segmented","added"),REMOVED:Tt.internals.ns.emission("segmented","removed")};class Kt extends Tt.core.Instance{static get instanceClassName(){return"Segmented"}init(){this.elements=this.node.querySelector(Zt.SEGMENTED_ELEMENTS),this.legend=this.node.querySelector(Zt.SEGMENTED_LEGEND),this.addAscent(Yt.ADDED,this.resize.bind(this)),this.addAscent(Yt.REMOVED,this.resize.bind(this)),this._isLegendInline=this.legend&&this.legend.classList.contains(`${Tt.prefix}-segmented__legend--inline`),this.isResizing=!0}resize(){const t=`${Tt.prefix}-segmented--vertical`,e=`${Tt.prefix}-segmented__legend--inline`;this.removeClass(t),this._isLegendInline&&(this.legend.classList.add(e),(this.node.offsetWidth>this.node.parentNode.offsetWidth||this.elements.scrollWidth+this.legend.offsetWidth+16>this.node.parentNode.offsetWidth)&&this.legend.classList.remove(e)),this.elements.offsetWidth>this.node.parentNode.offsetWidth||this.elements.scrollWidth>this.node.parentNode.offsetWidth?this.addClass(t):this.removeClass(t)}}class Qt extends Tt.core.Instance{static get instanceClassName(){return"SegmentedElement"}init(){this.ascend(Yt.ADDED)}dispose(){this.ascend(Yt.REMOVED)}}Tt.segmented={SegmentedSelector:Zt,SegmentedEmission:Yt,SegmentedElement:Qt,Segmented:Kt},Tt.internals.register(Tt.segmented.SegmentedSelector.SEGMENTED,Tt.segmented.Segmented),Tt.internals.register(Tt.segmented.SegmentedSelector.SEGMENTED_ELEMENT,Tt.segmented.SegmentedElement);const Jt={BREADCRUMB:Tt.internals.ns.selector("breadcrumb"),BUTTON:Tt.internals.ns.selector("breadcrumb__button")};class te extends Tt.core.Instance{constructor(){super(),this.count=0,this.focusing=this.focus.bind(this)}static get instanceClassName(){return"Breadcrumb"}init(){this.getCollapse(),this.isResizing=!0}get proxy(){const t=this;return Object.assign(super.proxy,{focus:t.focus.bind(t),disclose:t.collapse.disclose.bind(t.collapse)})}getCollapse(){const t=this.collapse;t?t.listen(Tt.core.DisclosureEvent.DISCLOSE,this.focusing):this.addAscent(Tt.core.DisclosureEmission.ADDED,this.getCollapse.bind(this))}resize(){const t=this.collapse,e=this.links;t&&e.length&&(this.isBreakpoint(Tt.core.Breakpoints.MD)?t.buttonHasFocus&&e[0].focus():e.indexOf(document.activeElement)>-1&&t.focus())}get links(){return[...this.querySelectorAll("a[href]")]}get collapse(){return this.element.getDescendantInstances(Tt.core.Collapse.instanceClassName,null,!0)[0]}focus(){this.count=0,this._focus()}_focus(){const t=this.links[0];t&&(t.focus(),this.request(this.verify.bind(this)))}verify(){if(this.count++,this.count>100)return;const t=this.links[0];t&&document.activeElement!==t&&this._focus()}get collapsePrimary(){return this.element.children.map((t=>t.getInstance("CollapseButton"))).filter((t=>null!==t&&t.hasClass(Jt.BUTTON)))[0]}}Tt.breadcrumb={BreadcrumbSelector:Jt,Breadcrumb:te},Tt.internals.register(Tt.breadcrumb.BreadcrumbSelector.BREADCRUMB,Tt.breadcrumb.Breadcrumb);const ee={TOOLTIP:Tt.internals.ns.selector("tooltip"),SHOWN:Tt.internals.ns.selector("tooltip--shown"),BUTTON:Tt.internals.ns.selector("btn--tooltip")};class ie extends Tt.core.PlacementReferent{constructor(){super(),this._state=0}static get instanceClassName(){return"TooltipReferent"}init(){if(super.init(),this.listen("focusin",this.focusIn.bind(this)),this.listen("focusout",this.focusOut.bind(this)),!this.matches(ee.BUTTON)){const t=this.mouseover.bind(this);this.listen("mouseover",t),this.placement.listen("mouseover",t);const e=this.mouseout.bind(this);this.listen("mouseout",e),this.placement.listen("mouseout",e)}this.addEmission(Tt.core.RootEmission.KEYDOWN,this._keydown.bind(this)),this.listen("click",this._click.bind(this)),this.addEmission(Tt.core.RootEmission.CLICK,this._clickOut.bind(this))}_click(){this.focus()}_clickOut(t){this.node.contains(t)||this.blur()}_keydown(t){t===Tt.core.KeyCodes.ESCAPE&&(this.blur(),this.close())}close(){this.state=0}get state(){return this._state}set state(t){this._state!==t&&(this.isShown=t>0,this._state=t)}focusIn(){this.state|=1}focusOut(){this.state&=-2}mouseover(){this.state|=2}mouseout(){this.state&=-3}}const re={SHOW:d.event("show"),HIDE:d.event("hide")},se="hidden",ne="shown",oe="hiding";class ae extends Tt.core.Placement{constructor(){super(Tt.core.PlacementMode.AUTO,[Tt.core.PlacementPosition.TOP,Tt.core.PlacementPosition.BOTTOM],[Tt.core.PlacementAlign.CENTER,Tt.core.PlacementAlign.START,Tt.core.PlacementAlign.END]),this.modifier="",this._state=se}static get instanceClassName(){return"Tooltip"}init(){super.init(),this.register(`[aria-describedby="${this.id}"]`,ie),this.listen("transitionend",this.transitionEnd.bind(this))}transitionEnd(){this._state===oe&&(this._state=se,this.isShown=!1)}get isShown(){return super.isShown}set isShown(t){if(this.isEnabled)switch(!0){case t:this._state=ne,this.addClass(ee.SHOWN),this.dispatch(re.SHOW),super.isShown=!0;break;case this.isShown&&!t&&this._state===ne:this._state=oe,this.removeClass(ee.SHOWN);break;case this.isShown&&!t&&this._state===se:this.dispatch(re.HIDE),super.isShown=!1}}render(){super.render();let t=this.referentRect.center-this.rect.center;const e=.5*this.rect.width-8;t<-e&&(t=-e),t>e&&(t=e),this.setProperty("--arrow-x",`${t.toFixed(2)}px`)}}Tt.tooltip={Tooltip:ae,TooltipSelector:ee,TooltipEvent:re},Tt.internals.register(Tt.tooltip.TooltipSelector.TOOLTIP,Tt.tooltip.Tooltip);class le extends Tt.core.Instance{static get instanceClassName(){return"ToggleInput"}get isChecked(){return this.node.checked}}class ce extends Tt.core.Instance{static get instanceClassName(){return"ToggleStatusLabel"}init(){this.register(`input[id="${this.getAttribute("for")}"]`,le),this.update(),this.isSwappingFont=!0}get proxy(){return Object.assign(super.proxy,{update:this.update.bind(this)})}get input(){return this.getRegisteredInstances("ToggleInput")[0]}update(){this.node.style.removeProperty("--toggle-status-width");const t=this.input.isChecked,e=getComputedStyle(this.node,":before");let i=parseFloat(e.width);this.input.node.checked=!t;const r=getComputedStyle(this.node,":before"),s=parseFloat(r.width);s>i&&(i=s),this.input.node.checked=t,this.node.style.setProperty("--toggle-status-width",i/16+"rem")}swapFont(t){this.update()}}const he={STATUS_LABEL:`${Tt.internals.ns.selector("toggle__label")}${Tt.internals.ns.attr.selector("checked-label")}${Tt.internals.ns.attr.selector("unchecked-label")}`};Tt.toggle={ToggleStatusLabel:ce,ToggleSelector:he},Tt.internals.register(Tt.toggle.ToggleSelector.STATUS_LABEL,Tt.toggle.ToggleStatusLabel);const ue=Tt.internals.ns.selector("sidemenu__item"),de=Tt.internals.ns.selector("collapse"),pe={LIST:Tt.internals.ns.selector("sidemenu__list"),COLLAPSE:`${ue} > ${de}, ${ue} > *:not(${ue}):not(${de}) > ${de}, ${ue} > *:not(${ue}):not(${de}) > *:not(${ue}):not(${de}) > ${de}`,COLLAPSE_LEGACY:`${ue} ${de}`,ITEM:Tt.internals.ns.selector("sidemenu__item"),BUTTON:Tt.internals.ns.selector("sidemenu__btn")};class fe extends Tt.core.CollapsesGroup{static get instanceClassName(){return"SidemenuList"}validate(t){return super.validate(t)&&t.node.matches(Tt.internals.legacy.isLegacy?pe.COLLAPSE_LEGACY:pe.COLLAPSE)}}class me extends Tt.core.Instance{static get instanceClassName(){return"SidemenuItem"}get collapsePrimary(){return this.element.children.map((t=>t.getInstance("CollapseButton"))).filter((t=>null!==t&&t.hasClass(pe.BUTTON)))[0]}}Tt.sidemenu={SidemenuList:fe,SidemenuItem:me,SidemenuSelector:pe},Tt.internals.register(Tt.sidemenu.SidemenuSelector.LIST,Tt.sidemenu.SidemenuList),Tt.internals.register(Tt.sidemenu.SidemenuSelector.ITEM,Tt.sidemenu.SidemenuItem);const ge={MODAL:Tt.internals.ns.selector("modal"),SCROLL_DIVIDER:Tt.internals.ns.selector("scroll-divider"),BODY:Tt.internals.ns.selector("modal__body"),TITLE:Tt.internals.ns.selector("modal__title")};class ye extends Tt.core.DisclosureButton{constructor(){super(Tt.core.DisclosureType.OPENED)}static get instanceClassName(){return"ModalButton"}}const _e={CONCEALING_BACKDROP:Tt.internals.ns.attr("concealing-backdrop")};class ve extends Tt.core.Disclosure{constructor(){super(Tt.core.DisclosureType.OPENED,ge.MODAL,ye,"ModalsGroup"),this._isActive=!1,this.scrolling=this.resize.bind(this,!1),this.resizing=this.resize.bind(this,!0)}static get instanceClassName(){return"Modal"}init(){super.init(),this._isDialog="DIALOG"===this.node.tagName,this.isScrolling=!1,this.listenClick(),this.addEmission(Tt.core.RootEmission.KEYDOWN,this._keydown.bind(this))}_keydown(t){t===Tt.core.KeyCodes.ESCAPE&&this._escape()}_escape(){switch(document.activeElement?document.activeElement.tagName:void 0){case"INPUT":case"LABEL":case"TEXTAREA":case"SELECT":case"AUDIO":case"VIDEO":break;default:this.isDisclosed&&(this.conceal(),this.focus())}}retrieved(){this._ensureAccessibleName()}get body(){return this.element.getDescendantInstances("ModalBody","Modal")[0]}handleClick(t){t.target===this.node&&"false"!==this.getAttribute(_e.CONCEALING_BACKDROP)&&this.conceal()}disclose(t){return!!super.disclose(t)&&(this.body&&this.body.activate(),this.isScrollLocked=!0,this.setAttribute("aria-modal","true"),this.setAttribute("open","true"),this._isDialog||this.activateModal(),!0)}conceal(t,e){return!!super.conceal(t,e)&&(this.isScrollLocked=!1,this.removeAttribute("aria-modal"),this.removeAttribute("open"),this.body&&this.body.deactivate(),this._isDialog||this.deactivateModal(),!0)}get isDialog(){return this._isDialog}set isDialog(t){this._isDialog=t}activateModal(){this._isActive||(this._isActive=!0,this._hasDialogRole="dialog"===this.getAttribute("role"),this._hasDialogRole||this.setAttribute("role","dialog"))}deactivateModal(){this._isActive&&(this._isActive=!1,this._hasDialogRole||this.removeAttribute("role"))}_setAccessibleName(t,e){const i=this.retrieveNodeId(t,e);this.warn(`add reference to ${e} for accessible name (aria-labelledby)`),this.setAttribute("aria-labelledby",i)}_ensureAccessibleName(){if(this.hasAttribute("aria-labelledby")||this.hasAttribute("aria-label"))return;this.warn("missing accessible name");const t=this.node.querySelector(ge.TITLE),e=this.primaryButtons[0];switch(!0){case null!==t:this._setAccessibleName(t,"title");break;case void 0!==e:this.warn("missing required title, fallback to primary button"),this._setAccessibleName(e,"primary")}}}const xe=['[tabindex="0"]',"a[href]","button:not([disabled])","input:not([disabled])","select:not([disabled])","textarea:not([disabled])","audio[controls]","video[controls]",'[contenteditable]:not([contenteditable="false"])',"details>summary:first-of-type","details","iframe"].join(),be=['[tabindex]:not([tabindex="-1"]):not([tabindex="0"])'].join(),we=(t,e)=>{if(!(t instanceof Element))return!1;const i=window.getComputedStyle(t);if(!i)return!1;if("hidden"===i.visibility)return!1;for(void 0===e&&(e=t);e.contains(t);){if("none"===i.display)return!1;t=t.parentElement}return!0};class Se{constructor(t,e){this.element=null,this.activeElement=null,this.onTrap=t,this.onUntrap=e,this.waiting=this.wait.bind(this),this.handling=this.handle.bind(this),this.focusing=this.maintainFocus.bind(this),this.current=null}get trapped(){return null!==this.element}trap(t){this.trapped&&this.untrap(),this.element=t,this.isTrapping=!0,this.wait(),this.onTrap&&this.onTrap()}wait(){we(this.element)?this.trapping():window.requestAnimationFrame(this.waiting)}trapping(){if(!this.isTrapping)return;this.isTrapping=!1;const t=this.focusables;t.length&&-1===t.indexOf(document.activeElement)&&t[0].focus(),this.element.setAttribute("aria-modal",!0),window.addEventListener("keydown",this.handling),document.body.addEventListener("focus",this.focusing,!0)}stun(t){for(const e of t.children)e!==this.element&&(e.contains(this.element)?this.stun(e):this.stunneds.push(new Ce(e)))}maintainFocus(t){if(!this.element.contains(t.target)){const e=this.focusables;if(0===e.length)return;const i=e[0];t.preventDefault(),i.focus()}}handle(t){if(9!==t.keyCode)return;const e=this.focusables;if(0===e.length)return;const i=e[0],r=e[e.length-1],s=e.indexOf(document.activeElement);t.shiftKey?!this.element.contains(document.activeElement)||s<1?(t.preventDefault(),r.focus()):(document.activeElement.tabIndex>0||e[s-1].tabIndex>0)&&(t.preventDefault(),e[s-1].focus()):this.element.contains(document.activeElement)&&s!==e.length-1&&-1!==s?document.activeElement.tabIndex>0&&(t.preventDefault(),e[s+1].focus()):(t.preventDefault(),i.focus())}get focusables(){let t=Tt.internals.dom.querySelectorAllArray(this.element,xe);const e=Tt.internals.dom.querySelectorAllArray(document.documentElement,'input[type="radio"]');if(e.length){const i={};for(const t of e){const e=t.getAttribute("name");void 0===i[e]&&(i[e]=new Te(e)),i[e].push(t)}t=t.filter((t=>{if("input"!==t.tagName.toLowerCase()||"radio"!==t.getAttribute("type").toLowerCase())return!0;const e=t.getAttribute("name");return i[e].keep(t)}))}const i=Tt.internals.dom.querySelectorAllArray(this.element,be);i.sort(((t,e)=>t.tabIndex-e.tabIndex));const r=t.filter((t=>-1===i.indexOf(t)));return i.concat(r).filter((t=>"-1"!==t.tabIndex&&we(t,this.element)))}untrap(){this.trapped&&(this.isTrapping=!1,this.element.removeAttribute("aria-modal"),window.removeEventListener("keydown",this.handling),document.body.removeEventListener("focus",this.focusing,!0),this.element=null,this.onUntrap&&this.onUntrap())}dispose(){this.untrap()}}class Ce{constructor(t){this.element=t,this.inert=t.getAttribute("inert"),this.element.setAttribute("inert","")}unstun(){null===this.inert?this.element.removeAttribute("inert"):this.element.setAttribute("inert",this.inert)}}class Te{constructor(t){this.name=t,this.buttons=[]}push(t){this.buttons.push(t),(t===document.activeElement||t.checked||void 0===this.selected)&&(this.selected=t)}keep(t){return this.selected===t}}class ke extends Tt.core.DisclosuresGroup{constructor(){super("Modal",!1),this.focusTrap=new Se}static get instanceClassName(){return"ModalsGroup"}apply(t,e){super.apply(t,e),null===this.current?this.focusTrap.untrap():this.focusTrap.trap(this.current.node)}}class Ee extends Tt.core.Instance{static get instanceClassName(){return"ModalBody"}init(){this.listen("scroll",this.divide.bind(this))}activate(){this.isResizing=!0,this.resize()}deactivate(){this.isResizing=!1}divide(){this.node.scrollHeight>this.node.clientHeight?this.node.offsetHeight+this.node.scrollTop>=this.node.scrollHeight?this.removeClass(ge.SCROLL_DIVIDER):this.addClass(ge.SCROLL_DIVIDER):this.removeClass(ge.SCROLL_DIVIDER)}resize(){this.adjust(),this.request(this.adjust.bind(this))}adjust(){const t=32*(this.isBreakpoint(Tt.core.Breakpoints.MD)?2:1);this.isLegacy?this.style.maxHeight=window.innerHeight-t+"px":this.style.setProperty("--modal-max-height",window.innerHeight-t+"px"),this.divide()}}Tt.modal={Modal:ve,ModalButton:ye,ModalBody:Ee,ModalsGroup:ke,ModalSelector:ge},Tt.internals.register(Tt.modal.ModalSelector.MODAL,Tt.modal.Modal),Tt.internals.register(Tt.modal.ModalSelector.BODY,Tt.modal.ModalBody),Tt.internals.register(Tt.core.RootSelector.ROOT,Tt.modal.ModalsGroup);const Ae={TOGGLE:Tt.internals.ns.emission("password","toggle"),ADJUST:Tt.internals.ns.emission("password","adjust")};class Me extends Tt.core.Instance{static get instanceClassName(){return"PasswordToggle"}init(){this.listenClick(),this.ascend(Ae.ADJUST,this.width),this.isSwappingFont=!0,this._isChecked=this.isChecked}get width(){const t=getComputedStyle(this.node.parentNode);return parseInt(t.width)}get isChecked(){return this.node.checked}set isChecked(t){this._isChecked=t,this.ascend(Ae.TOGGLE,t)}handleClick(){this.isChecked=!this._isChecked}swapFont(t){this.ascend(Ae.ADJUST,this.width)}}class Pe extends Tt.core.Instance{static get instanceClassName(){return"Password"}init(){this.addAscent(Ae.TOGGLE,this.toggle.bind(this)),this.addAscent(Ae.ADJUST,this.adjust.bind(this))}toggle(t){this.descend(Ae.TOGGLE,t)}adjust(t){this.descend(Ae.ADJUST,t)}}const Ie={PASSWORD:Tt.internals.ns.selector("password"),INPUT:Tt.internals.ns.selector("password__input"),LABEL:Tt.internals.ns.selector("password__label"),TOOGLE:`${Tt.internals.ns.selector("password__checkbox")} input[type="checkbox"]`};class Le extends Tt.core.Instance{static get instanceClassName(){return"PasswordInput"}init(){this.addDescent(Ae.TOGGLE,this.toggle.bind(this)),this._isRevealed="password"===this.hasAttribute("type"),this.listen("keydown",this.capslock.bind(this)),this.listen("keyup",this.capslock.bind(this))}toggle(t){this.isRevealed=t,this.setAttribute("type",t?"text":"password")}get isRevealed(){return this._isRevealed}capslock(t){t&&"function"!=typeof t.getModifierState||(t.getModifierState("CapsLock")?this.node.parentNode.setAttribute(Tt.internals.ns.attr("capslock"),""):this.node.parentNode.removeAttribute(Tt.internals.ns.attr("capslock")))}set isRevealed(t){this._isRevealed=t,this.setAttribute("type",t?"text":"password")}}class De extends Tt.core.Instance{static get instanceClassName(){return"PasswordLabel"}init(){this.addDescent(Ae.ADJUST,this.adjust.bind(this))}adjust(t){const e=Math.ceil(t/16);this.node.style.paddingRight=e+"rem"}}Tt.password={Password:Pe,PasswordToggle:Me,PasswordSelector:Ie,PasswordInput:Le,PasswordLabel:De},Tt.internals.register(Tt.password.PasswordSelector.INPUT,Tt.password.PasswordInput),Tt.internals.register(Tt.password.PasswordSelector.PASSWORD,Tt.password.Password),Tt.internals.register(Tt.password.PasswordSelector.TOOGLE,Tt.password.PasswordToggle),Tt.internals.register(Tt.password.PasswordSelector.LABEL,Tt.password.PasswordLabel);const ze=Tt.internals.ns.selector("nav__item"),Oe=Tt.internals.ns.selector("collapse"),Re={NAVIGATION:Tt.internals.ns.selector("nav"),COLLAPSE:`${ze} > ${Oe}, ${ze} > *:not(${ze}):not(${Oe}) > ${Oe}, ${ze} > *:not(${ze}):not(${Oe}) > *:not(${ze}):not(${Oe}) > ${Oe}`,COLLAPSE_LEGACY:`${ze} ${Oe}`,ITEM:ze,ITEM_RIGHT:`${ze}--align-right`,MENU:Tt.internals.ns.selector("menu"),BUTTON:Tt.internals.ns.selector("nav__btn"),TRANSLATE_BUTTON:Tt.internals.ns.selector("translate__btn")};class Ne extends Tt.core.Instance{constructor(){super(),this._isRightAligned=!1}static get instanceClassName(){return"NavigationItem"}init(){this.addAscent(Tt.core.DisclosureEmission.ADDED,this.calculate.bind(this)),this.addAscent(Tt.core.DisclosureEmission.REMOVED,this.calculate.bind(this)),this.isResizing=!0,this.calculate()}resize(){this.calculate()}calculate(){const t=this.element.getDescendantInstances(Tt.core.Collapse.instanceClassName,null,!0)[0];if(t&&this.isBreakpoint(Tt.core.Breakpoints.LG)&&t.element.node.matches(Re.MENU)){const e=this.element.node.parentElement.getBoundingClientRect().right,i=t.element.node.getBoundingClientRect().width,r=this.element.node.getBoundingClientRect().left;this.isRightAligned=r+i>e}else this.isRightAligned=!1}get isRightAligned(){return this._isRightAligned}set isRightAligned(t){this._isRightAligned!==t&&(this._isRightAligned=t,t?Tt.internals.dom.addClass(this.element.node,Re.ITEM_RIGHT):Tt.internals.dom.removeClass(this.element.node,Re.ITEM_RIGHT))}get collapsePrimary(){return this.element.children.map((t=>t.getInstance("CollapseButton"))).filter((t=>null!==t&&(t.hasClass(Re.BUTTON)||t.hasClass(Re.TRANSLATE_BUTTON))))[0]}}const Be={NONE:-1,INSIDE:0,OUTSIDE:1};class Fe extends Tt.core.CollapsesGroup{static get instanceClassName(){return"Navigation"}init(){super.init(),this.clicked=!1,this.out=!1,this.addEmission(Tt.core.RootEmission.CLICK,this._handleRootClick.bind(this)),this.listen("mousedown",this.handleMouseDown.bind(this)),this.listenClick({capture:!0}),this.isResizing=!0}validate(t){return super.validate(t)&&t.element.node.matches(Tt.internals.legacy.isLegacy?Re.COLLAPSE_LEGACY:Re.COLLAPSE)}handleMouseDown(t){this.isBreakpoint(Tt.core.Breakpoints.LG)&&-1!==this.index&&this.current&&(this.position=this.current.node.contains(t.target)?Be.INSIDE:Be.OUTSIDE,this.requestPosition())}handleClick(t){!t.target.matches("a, button")||t.target.matches("[aria-controls]")||t.target.matches(Tt.core.DisclosureSelector.PREVENT_CONCEAL)||(this.index=-1)}_handleRootClick(t){this.isBreakpoint(Tt.core.Breakpoints.LG)&&(this.node.contains(t)||(this.out=!0,this.requestPosition()))}requestPosition(){this.isRequesting||(this.isRequesting=!0,this.request(this.getPosition.bind(this)))}getPosition(){if(this.out)switch(this.position){case Be.OUTSIDE:this.index=-1;break;case Be.INSIDE:this.current&&!this.current.node.contains(document.activeElement)&&this.current.focus();break;default:this.index>-1&&!this.current.hasFocus&&(this.index=-1)}this.request(this.requested.bind(this))}requested(){this.position=Be.NONE,this.out=!1,this.isRequesting=!1}get index(){return super.index}set index(t){-1===t&&this.current&&this.current.hasFocus&&this.current.focus(),super.index=t}get canUngroup(){return!this.isBreakpoint(Tt.core.Breakpoints.LG)}resize(){this.update()}}Tt.navigation={Navigation:Fe,NavigationItem:Ne,NavigationMousePosition:Be,NavigationSelector:Re},Tt.internals.register(Tt.navigation.NavigationSelector.NAVIGATION,Tt.navigation.Navigation),Tt.internals.register(Tt.navigation.NavigationSelector.ITEM,Tt.navigation.NavigationItem);class je extends Tt.core.DisclosureButton{constructor(){super(Tt.core.DisclosureType.SELECT)}static get instanceClassName(){return"TabButton"}handleClick(t){super.handleClick(t),this.focus()}apply(t){super.apply(t),this.isPrimary&&(this.setAttribute("tabindex",t?"0":"-1"),t&&this.list&&this.list.focalize(this))}get list(){return this.element.getAscendantInstance("TabsList","TabsGroup")}}const Ue={TAB:Tt.internals.ns.selector("tabs__tab"),GROUP:Tt.internals.ns.selector("tabs"),PANEL:Tt.internals.ns.selector("tabs__panel"),LIST:Tt.internals.ns.selector("tabs__list"),SHADOW:Tt.internals.ns.selector("tabs__shadow"),SHADOW_LEFT:Tt.internals.ns.selector("tabs__shadow--left"),SHADOW_RIGHT:Tt.internals.ns.selector("tabs__shadow--right"),PANEL_START:Tt.internals.ns.selector("tabs__panel--direction-start"),PANEL_END:Tt.internals.ns.selector("tabs__panel--direction-end")},Ve="direction-start",qe="direction-end",Ge="none";class $e extends Tt.core.Disclosure{constructor(){super(Tt.core.DisclosureType.SELECT,Ue.PANEL,je,"TabsGroup"),this._direction=Ge,this._isPreventingTransition=!1}static get instanceClassName(){return"TabPanel"}get direction(){return this._direction}set direction(t){if(t!==this._direction){switch(this._direction){case Ve:this.removeClass(Ue.PANEL_START);break;case qe:this.removeClass(Ue.PANEL_END);break;case Ge:break;default:return}switch(this._direction=t,this._direction){case Ve:this.addClass(Ue.PANEL_START);break;case qe:this.addClass(Ue.PANEL_END)}}}get isPreventingTransition(){return this._isPreventingTransition}set isPreventingTransition(t){this._isPreventingTransition!==t&&(t?this.addClass(Tt.internals.motion.TransitionSelector.NONE):this.removeClass(Tt.internals.motion.TransitionSelector.NONE),this._isPreventingTransition=!0===t)}translate(t,e){this.isPreventingTransition=e,this.direction=t}reset(){this.group&&this.group.retrieve(!0)}_electPrimaries(t){return this.group&&this.group.list?super._electPrimaries(t).filter((t=>this.group.list.node.contains(t.node))):[]}}const He="tab_keys_left",We="tab_keys_right",Xe="tab_keys_home",Ze="tab_keys_end",Ye={PRESS_KEY:Tt.internals.ns.emission("tab","press_key"),LIST_HEIGHT:Tt.internals.ns.emission("tab","list_height")};class Ke extends Tt.core.DisclosuresGroup{constructor(){super("TabPanel")}static get instanceClassName(){return"TabsGroup"}init(){super.init(),this.listen("transitionend",this.transitionend.bind(this)),this.addAscent(Ye.PRESS_KEY,this.pressKey.bind(this)),this.addAscent(Ye.LIST_HEIGHT,this.setListHeight.bind(this)),this.isRendering=!0}getIndex(t=0){super.getIndex(t)}get list(){return this.element.getDescendantInstances("TabsList","TabsGroup",!0)[0]}setListHeight(t){this.listHeight=t}transitionend(t){this.isPreventingTransition=!0}get buttonHasFocus(){return this.members.some((t=>t.buttonHasFocus))}pressKey(t){switch(t){case He:this.pressLeft();break;case We:this.pressRight();break;case Xe:this.pressHome();break;case Ze:this.pressEnd()}}pressRight(){this.buttonHasFocus&&(this.index0?this.index--:this.index=this.length-1,this.focus())}pressHome(){this.buttonHasFocus&&(this.index=0,this.focus())}pressEnd(){this.buttonHasFocus&&(this.index=this.length-1,this.focus())}focus(){this.current&&this.current.focus()}apply(){for(let t=0;ti.right&&this.node.scrollTo(r-i.right+e.right+16,0)}get isScrolling(){return this._isScrolling}set isScrolling(t){this._isScrolling!==t&&(this._isScrolling=t,this.apply())}apply(){this._isScrolling?(this.addClass(Ue.SHADOW),this.scroll()):(this.removeClass(Ue.SHADOW_RIGHT),this.removeClass(Ue.SHADOW_LEFT),this.removeClass(Ue.SHADOW))}scroll(){const t=this.node.scrollLeft,e=t<=16,i=this.node.scrollWidth-this.node.clientWidth-16,r=Math.abs(t)>=i,s="rtl"===document.documentElement.getAttribute("dir"),n=s?Ue.SHADOW_RIGHT:Ue.SHADOW_LEFT,o=s?Ue.SHADOW_LEFT:Ue.SHADOW_RIGHT;e?this.removeClass(n):this.addClass(n),r?this.removeClass(o):this.addClass(o)}resize(){this.isScrolling=this.node.scrollWidth>this.node.clientWidth+16;const t=this.getRect().height;this.setProperty("--tabs-list-height",`${t}px`),this.ascend(Ye.LIST_HEIGHT,t)}dispose(){this.isScrolling=!1}}Tt.tab={TabPanel:$e,TabButton:je,TabsGroup:Ke,TabsList:Qe,TabSelector:Ue,TabEmission:Ye},Tt.internals.register(Tt.tab.TabSelector.PANEL,Tt.tab.TabPanel),Tt.internals.register(Tt.tab.TabSelector.GROUP,Tt.tab.TabsGroup),Tt.internals.register(Tt.tab.TabSelector.LIST,Tt.tab.TabsList);const Je={DISMISS:Tt.internals.ns.event("dismiss")};class ti extends Tt.core.Instance{static get instanceClassName(){return"TagDismissible"}init(){this.listenClick()}handleClick(){switch(this.focusClosest(),Tt.mode){case Tt.Modes.ANGULAR:case Tt.Modes.REACT:case Tt.Modes.VUE:this.request(this.verify.bind(this));break;default:this.remove()}this.dispatch(Je.DISMISS)}verify(){document.body.contains(this.node)&&this.warn(`a TagDismissible has just been dismissed and should be removed from the dom. In ${Tt.mode} mode, the api doesn't handle dom modification. An event ${Je.DISMISS} is dispatched by the element to trigger the removal`)}}const ei={PRESSABLE:`${Tt.internals.ns.selector("tag")}[aria-pressed]`,DISMISSIBLE:`${Tt.internals.ns.selector("tag--dismiss")}`};Tt.tag={TagDismissible:ti,TagSelector:ei,TagEvent:Je},Tt.internals.register(Tt.tag.TagSelector.PRESSABLE,Tt.core.Toggle),Tt.internals.register(Tt.tag.TagSelector.DISMISSIBLE,Tt.tag.TagDismissible);const ii=Tt.internals.ns.selector("transcription"),ri={TRANSCRIPTION:ii,BUTTON:`${ii}__btn`};class si extends Tt.core.Instance{static get instanceClassName(){return"Transcription"}get collapsePrimary(){return this.element.children.map((t=>t.getInstance("CollapseButton"))).filter((t=>null!==t&&t.hasClass(ri.BUTTON)))[0]}}Tt.transcription={Transcription:si,TranscriptionSelector:ri},Tt.internals.register(Tt.transcription.TranscriptionSelector.TRANSCRIPTION,Tt.transcription.Transcription);class ni extends Tt.core.Instance{static get instanceClassName(){return"TileDownload"}init(){this.addAscent(Tt.core.AssessEmission.UPDATE,(t=>{this.descend(Tt.core.AssessEmission.UPDATE,t)})),this.addAscent(Tt.core.AssessEmission.ADDED,(()=>{this.descend(Tt.core.AssessEmission.ADDED)}))}}const oi={DOWNLOAD:Tt.internals.ns.selector("tile--download"),DOWNLOAD_DETAIL:`${Tt.internals.ns.selector("tile--download")} ${Tt.internals.ns.selector("tile__detail")}`};Tt.tile={TileSelector:oi,TileDownload:ni},Tt.internals.register(Tt.tile.TileSelector.DOWNLOAD,Tt.tile.TileDownload),Tt.internals.register(Tt.tile.TileSelector.DOWNLOAD_DETAIL,Tt.core.AssessDetail);const ai={RANGE:Tt.internals.ns.selector("range"),RANGE_SM:Tt.internals.ns.selector("range--sm"),RANGE_STEP:Tt.internals.ns.selector("range--step"),RANGE_DOUBLE:Tt.internals.ns.selector("range--double"),RANGE_DOUBLE_STEP:Tt.internals.ns.selector("range--double")+Tt.internals.ns.selector("range--step"),RANGE_INPUT:Tt.internals.ns.selector("range input[type=range]:nth-of-type(1)"),RANGE_INPUT2:`${Tt.internals.ns.selector("range--double")} input[type=range]:nth-of-type(2)`,RANGE_OUTPUT:Tt.internals.ns.selector("range__output"),RANGE_MIN:Tt.internals.ns.selector("range__min"),RANGE_MAX:Tt.internals.ns.selector("range__max"),RANGE_PREFIX:Tt.internals.ns.attr("prefix"),RANGE_SUFFIX:Tt.internals.ns.attr("suffix")},li={VALUE:Tt.internals.ns.emission("range","value"),VALUE2:Tt.internals.ns.emission("range","value2"),OUTPUT:Tt.internals.ns.emission("range","output"),CONSTRAINTS:Tt.internals.ns.emission("range","constraints"),MIN:Tt.internals.ns.emission("range","min"),MAX:Tt.internals.ns.emission("range","max"),STEP:Tt.internals.ns.emission("range","step"),PREFIX:Tt.internals.ns.emission("range","prefix"),SUFFIX:Tt.internals.ns.emission("range","suffix"),DISABLED:Tt.internals.ns.emission("range","disabled"),ENABLE_POINTER:Tt.internals.ns.emission("range","enable_pointer")};class ci{constructor(){this._width=0,this._min=0,this._max=0,this._value=0,this._thumbSize=24,this._innerWidth=0,this._prefix="",this._suffix="",this._background={}}configure(t){t&&(this._prefix=t._prefix,this._suffix=t._suffix,this._width=t.width,this.setConstraints(t._constraints),this.value=t.value,this.update())}setPrefix(t){this._prefix=null!==t?t:""}setSuffix(t){this._suffix=null!==t?t:""}_decorate(t){return`${this._prefix}${t}${this._suffix}`}get width(){return this._width}set width(t){this._width=t}get isSm(){return this._isSm}set isSm(t){this._isSm!==t&&(this._isSm=t,this.setThumbSize(t?16:24),this.update())}setThumbSize(t,e=1){this._thumbSize=t,this._innerPadding=t*e}get textValue(){return this._decorate(this._value)}get value(){return this._value}set value(t){this._value=t}get outputX(){return this._outputX}setConstraints(t){this._constraints=t,this._min=t.min,this._max=t.max,this._step=t.step,this._rangeWidth=t.rangeWidth}get min(){return this._min}get textMin(){return this._decorate(this._min)}get max(){return this._max}get textMax(){return this._decorate(this._max)}get step(){return this._step}get output(){return{text:this.textValue,transform:`translateX(${this._translateX}px) translateX(-${this._centerPercent}%)`}}_getRatio(t){return(t-this._min)/this._rangeWidth}get progress(){return this._progress}update(){this._update()}_update(){this._innerWidth=this._width-this._innerPadding;const t=this._getRatio(this._value);this._translateX=t*this._width,this._centerPercent=100*t,this._progress={right:`${(this._innerWidth*t+.5*this._innerPadding).toFixed(2)}px`}}}class hi extends ci{get stepWidth(){return`${this._stepWidth.toFixed(3)}px`}_update(){super._update();const t=this._rangeWidth/this._step;for(this._stepWidth=this._innerWidth/t,(this._stepWidth<1||!isFinite(this._stepWidth))&&(this._stepWidth=4);this._stepWidth<4;)this._stepWidth*=2}}class ui extends ci{get value2(){return this._value}set value2(t){this._value2!==t&&(this._value2=t,this.update())}get textValue(){return`${this._decorate(this._value)} - ${this._decorate(this._value2)}`}setThumbSize(t){super.setThumbSize(t,2)}_update(){super._update();const t=this._getRatio(.5*(this._value+this._value2));this._translateX=t*this._width,this._centerPercent=100*t;const e=this._getRatio(this._value),i=this._getRatio(this._value2);this._progress={left:`${(this._innerWidth*e+.25*this._innerPadding).toFixed(2)}px`,right:`${(this._innerWidth*i+.75*this._innerPadding).toFixed(2)}px`}}}class di extends ui{get stepWidth(){return`${this._stepWidth.toFixed(3)}px`}_update(){super._update();const t=this._rangeWidth/this._step;this._stepWidth=this._innerWidth/t,this._stepWidth<4&&(this._stepWidth*=Math.ceil(4/this._stepWidth))}}const pi="step",fi="double",mi="double-step";class gi extends Tt.core.Instance{static get instanceClassName(){return"Range"}init(){this._retrieveType(),this._retrieveSize(),this.isLegacy?(this.isResizing=!0,this.isMouseMoving=!0):(this._observer=new ResizeObserver(this.resize.bind(this)),this._observer.observe(this.node)),this.addAscent(li.CONSTRAINTS,this.setConstraints.bind(this)),this.addAscent(li.VALUE,this.setValue.bind(this)),this.addAscent(li.VALUE2,this.setValue2.bind(this)),this.getAttribute(ai.RANGE_PREFIX)&&this.setPrefix(this.getAttribute(ai.RANGE_PREFIX)),this.getAttribute(ai.RANGE_SUFFIX)&&this.setSuffix(this.getAttribute(ai.RANGE_SUFFIX)),this.update()}_retrieveType(){switch(!0){case this.matches(ai.RANGE_DOUBLE_STEP):case this.matches(ai.RANGE_DOUBLE):this.type=fi;break;case this.matches(ai.RANGE_STEP):this.type=pi;break;default:this.type="default"}}set type(t){if(this._type===t)return;this._type=t;const e=this._model;switch(this._type){case mi:this._model=new di;break;case fi:this._model=new ui;break;case pi:this._model=new hi;break;default:this._model=new ci}this._model.configure(e)}get type(){return this._type}_retrieveSize(){this._model.isSm=this.matches(ai.RANGE_SM)}resize(){this._retrieveWidth(),this.update()}_retrieveWidth(){this._model.width=this.getRect().width}setValue(t){switch(this._model.value=t,this._type){case mi:case fi:this.descend(li.VALUE,t)}this.update()}setValue2(t){this._model.value2=t,this.descend(li.VALUE2,t),this.update()}setConstraints(t){this._model.setConstraints(t),this.update(),this.descend(li.CONSTRAINTS,t)}setPrefix(t){this._model.setPrefix(t),this.update()}setSuffix(t){this._model.setSuffix(t),this.update()}mutate(t){switch(!0){case t.includes("class"):this._retrieveType(),this._retrieveSize();break;case t.includes(ai.RANGE_PREFIX):case t.includes(ai.RANGE_SUFFIX):this._model.setPrefix(this.getAttribute(ai.RANGE_PREFIX)),this._model.setSuffix(this.getAttribute(ai.RANGE_SUFFIX)),this.update()}}update(){this._model.update(),this.descend(li.OUTPUT,this._model.output),this.descend(li.MIN,this._model.textMin),this.descend(li.MAX,this._model.textMax);const t=this._model.progress;t.left?this.style.setProperty("--progress-left",t.left):this.style.removeProperty("--progress-left"),t.right?(this.style.setProperty("--progress-right",t.right),this.isLegacy&&t.left&&(this.style.setProperty("background-position-x",t.left),this.style.setProperty("background-size",`${parseFloat(t.right)-parseFloat(t.left)}px ${this._model.isSm?"8px":"12px"}`))):(this.style.removeProperty("--progress-right"),this.isLegacy&&(this.style.removeProperty("background-size"),this.style.removeProperty("background-position-x"))),this._model.stepWidth?this.style.setProperty("--step-width",this._model.stepWidth):this.style.removeProperty("--step-width")}mouseMove(t){if(this._type!==fi&&this._type!==mi)return;const e=t.x-this.getRect().left;this.descend(li.ENABLE_POINTER,(parseFloat(this._model.progress.right)-parseFloat(this._model.progress.left))/2+parseFloat(this._model.progress.left){this.hasAttribute("min")||this.setAttribute("min",0),this.ascend(li.CONSTRAINTS,new yi(this.node)),this.ascend(li.DISABLED,this.node.disabled)})),this.addDescent(li.VALUE2,this.setValue.bind(this))}_enablePointer(t){const e=t===this._pointerId;this._isPointerEnabled!==e&&(this._isPointerEnabled=e,e?this.style.removeProperty("pointer-events"):this.style.setProperty("pointer-events","none"))}setValue(t){parseFloat(this.node.value)>t&&(this.node.value=t,this.dispatch("change",void 0,!0),this.change())}change(){this.ascend(li.VALUE,parseFloat(this.node.value))}mutate(t){t.includes("disabled")&&this.ascend(li.DISABLED,this.node.disabled),(t.includes("min")||t.includes("max")||t.includes("step"))&&(this.ascend(li.CONSTRAINTS,new yi(this.node)),this.change())}dispose(){this._listenerType&&this.unlisten(this._listenerType,this._changing)}}class vi extends Tt.core.Instance{static get instanceClassName(){return"RangeOutput"}init(){this.addDescent(li.OUTPUT,this.change.bind(this))}change(t){this.node.innerText=t.text,this.node.style.transform=t.transform}}class xi extends Tt.core.Instance{static get instanceClassName(){return"RangeLimit"}init(){switch(!0){case this.matches(ai.RANGE_MIN):this.addDescent(li.MIN,this.change.bind(this));break;case this.matches(ai.RANGE_MAX):this.addDescent(li.MAX,this.change.bind(this))}}change(t){this.node.innerText=t}}Tt.range={Range:gi,RangeInput:_i,RangeInput2:class extends _i{static get instanceClassName(){return"RangeInput2"}_init(){this._pointerId=2,this.addDescent(li.CONSTRAINTS,this.setConstraints.bind(this)),this.addDescent(li.VALUE,this.setValue.bind(this))}setValue(t){parseFloat(this.node.value)t.replace('id="',"").replace('"',"")));const n=i.match(/aria-controls="(.*?)"/gm);let o=i.replace(/id="(.*?)"/gm,'id="$1'+e+'"');if(n)for(const t of n){const i=t.replace('aria-controls="',"").replace('"',"");s.includes(i)&&(o=o.replace(`aria-controls="${i}"`,`aria-controls="${i+e}"`))}if(o!==r)switch(Tt.mode){case Tt.Modes.ANGULAR:case Tt.Modes.REACT:case Tt.Modes.VUE:this.warn(`header__tools-links content is different from header__menu-links content.\nAs you're using a dynamic framework, you should handle duplication of this content yourself, please refer to documentation:\n${Tt.header.doc}`);break;default:this.menuLinks.innerHTML=o}}}class Si extends Tt.core.Instance{static get instanceClassName(){return"HeaderModal"}init(){this.isResizing=!0}resize(){this.isBreakpoint(Tt.core.Breakpoints.LG)?this.deactivateModal():this.activateModal()}activateModal(){const t=this.element.getInstance("Modal");t&&(t.isEnabled=!0,this.listenClick({capture:!0}))}deactivateModal(){const t=this.element.getInstance("Modal");t&&(t.conceal(),t.isEnabled=!1,this.unlistenClick({capture:!0}))}handleClick(t){!t.target.matches("a, button")||t.target.matches("[aria-controls]")||t.target.matches(Tt.core.DisclosureSelector.PREVENT_CONCEAL)||this.element.getInstance("Modal").conceal()}}Tt.header={HeaderLinks:wi,HeaderModal:Si,HeaderSelector:bi,doc:"https://www.systeme-de-design.gouv.fr/elements-d-interface/composants/en-tete"},Tt.internals.register(Tt.header.HeaderSelector.TOOLS_LINKS,Tt.header.HeaderLinks),Tt.internals.register(Tt.header.HeaderSelector.MODALS,Tt.header.HeaderModal);const Ci={DISPLAY:Tt.internals.ns.selector("display"),RADIO_BUTTONS:`input[name="${Tt.internals.ns("radios-theme")}"]`,FIELDSET:Tt.internals.ns.selector("fieldset")};class Ti extends Tt.core.Instance{static get instanceClassName(){return"Display"}init(){if(this.radios=this.querySelectorAll(Ci.RADIO_BUTTONS),Tt.scheme){this.changing=this.change.bind(this);for(const t of this.radios)t.addEventListener("change",this.changing);this.addDescent(Tt.scheme.SchemeEmission.SCHEME,this.apply.bind(this)),this.ascend(Tt.scheme.SchemeEmission.ASK)}else this.querySelector(Ci.FIELDSET).setAttribute("disabled","")}get scheme(){return this._scheme}set scheme(t){if(this._scheme!==t&&Tt.scheme)switch(t){case Tt.scheme.SchemeValue.SYSTEM:case Tt.scheme.SchemeValue.LIGHT:case Tt.scheme.SchemeValue.DARK:this._scheme=t;for(const e of this.radios)e.checked=e.value===t;this.ascend(Tt.scheme.SchemeEmission.SCHEME,t)}}change(){for(const t of this.radios)if(t.checked)return void(this.scheme=t.value)}apply(t){this.scheme=t}dispose(){for(const t of this.radios)t.removeEventListener("change",this.changing)}}Tt.display={Display:Ti,DisplaySelector:Ci},Tt.internals.register(Tt.display.DisplaySelector.DISPLAY,Tt.display.Display);const ki={SCROLLABLE:Tt.internals.ns.emission("table","scrollable"),CHANGE:Tt.internals.ns.emission("table","change"),CAPTION_HEIGHT:Tt.internals.ns.emission("table","captionheight"),CAPTION_WIDTH:Tt.internals.ns.emission("table","captionwidth")};class Ei extends Tt.core.Instance{static get instanceClassName(){return"Table"}init(){this.addAscent(ki.CAPTION_HEIGHT,this.setCaptionHeight.bind(this))}setCaptionHeight(t){this.setProperty("--table-offset",t)}}class Ai extends Tt.core.Instance{static get instanceClassName(){return"TableWrapper"}init(){this.addAscent(ki.CAPTION_HEIGHT,this.setCaptionHeight.bind(this))}setCaptionHeight(t){requestAnimationFrame((()=>this.ascend(ki.CAPTION_HEIGHT,0))),this.setProperty("--table-offset",t)}}const Mi={TABLE:Tt.internals.ns.selector("table"),TABLE_WRAPPER:[`${Tt.internals.ns.selector("table")} ${Tt.internals.ns.selector("table__wrapper")}`],SHADOW:Tt.internals.ns.selector("table__shadow"),SHADOW_LEFT:Tt.internals.ns.selector("table__shadow--left"),SHADOW_RIGHT:Tt.internals.ns.selector("table__shadow--right"),ELEMENT:[`${Tt.internals.ns.selector("table")}:not(${Tt.internals.ns.selector("table--no-scroll")}) table`],CAPTION:`${Tt.internals.ns.selector("table")} table caption`,ROW:`${Tt.internals.ns.selector("table")} tbody tr`,COL:`${Tt.internals.ns.selector("table")} thead th`};class Pi extends Tt.core.Instance{static get instanceClassName(){return"TableElement"}init(){this.listen("scroll",this.scroll.bind(this)),this.content=this.querySelector("tbody"),this.tableOffsetHeight=0,this.isResizing=!0}get isScrolling(){return this._isScrolling}set isScrolling(t){this._isScrolling!==t&&(this._isScrolling=t,t?(this.addClass(Mi.SHADOW),this.scroll()):(this.removeClass(Mi.SHADOW),this.removeClass(Mi.SHADOW_LEFT),this.removeClass(Mi.SHADOW_RIGHT)))}scroll(){const t=this.node.scrollLeft<=0,e=this.content.offsetWidth-this.node.offsetWidth-0,i=Math.abs(this.node.scrollLeft)>=e,r="rtl"===document.documentElement.getAttribute("dir"),s=r?Mi.SHADOW_RIGHT:Mi.SHADOW_LEFT,n=r?Mi.SHADOW_LEFT:Mi.SHADOW_RIGHT;t?this.removeClass(s):this.addClass(s),i?this.removeClass(n):this.addClass(n)}resize(){this.isScrolling=this.content.offsetWidth>this.node.offsetWidth}dispose(){this.isScrolling=!1}}class Ii extends Tt.core.Instance{static get instanceClassName(){return"TableCaption"}init(){this.height=0,this.isResizing=!0}resize(){const t=this.getRect().height;this.height!==t&&(this.height=t,this.ascend(ki.CAPTION_HEIGHT,`calc(${t}px + 1rem)`))}}class Li extends Tt.core.Instance{static get instanceClassName(){return"TableRow"}init(){Tt.checkbox&&(this.addAscent(Wt.CHANGE,this._handleCheckboxChange.bind(this)),this.descend(Wt.RETRIEVE))}_handleCheckboxChange(t){"row-select"===t.name&&(this.isSelected=!0===t.checked)}render(){const t=this.getRect().height+2;this._height!==t&&(this._height=t,this.setProperty("--row-height",`${this._height}px`))}get isSelected(){return this._isSelected}set isSelected(t){this._isSelected!==t&&(this.isRendering=t,this._isSelected=t,this.setAttribute("aria-selected",t))}}Tt.table={Table:Ei,TableWrapper:Ai,TableElement:Pi,TableCaption:Ii,TableSelector:Mi,TableRow:Li},Tt.internals.register(Tt.table.TableSelector.TABLE,Tt.table.Table),Tt.internals.register(Tt.table.TableSelector.TABLE_WRAPPER,Tt.table.TableWrapper),Tt.internals.register(Tt.table.TableSelector.ELEMENT,Tt.table.TableElement),Tt.internals.register(Tt.table.TableSelector.CAPTION,Tt.table.TableCaption),Tt.internals.register(Tt.table.TableSelector.ROW,Tt.table.TableRow)},515:()=>{var t=document.getElementById("filter-diagnostic-list-input");t&&(t.onkeyup=function(){var e=t.value.toLowerCase(),i=document.querySelectorAll(".diagnostic-list-item");(i=Array.from(i)).forEach((function(t){-1!==t.querySelector(".diagnostic-list-item-key").dataset.key.toLowerCase().indexOf(e)?(t.removeAttribute("hidden"),t.style.visibility="visible"):(t.setAttribute("hidden",!0),t.style.visibility="hidden")}));var r=document.getElementById("diagnostic-list-empty-message");i.length===i.filter((function(t){return t.hidden})).length?(r.removeAttribute("hidden"),r.style.visibility="visible"):(r.setAttribute("hidden",!0),r.style.visibility="hidden")})},504:()=>{document.querySelectorAll(".fr-callout-read-more__btn").forEach((function(t){t.addEventListener("click",(function(){var e=t.parentNode.querySelector(".fr-callout-read-more__excerpt"),i=t.parentNode.querySelector(".fr-callout-read-more__text"),r="true"===t.getAttribute("aria-expanded");t.parentNode.classList.toggle("fr-callout-read-more--expanded"),t.setAttribute("aria-expanded",!r),e.hidden=!r,i.hidden=r,t.firstChild.data=r?"Lire plus":"Lire moins"}))}))},847:(t,e,i)=>{window.htmx=i(926),window.htmx.onLoad((function(){document.querySelectorAll(".fullscreen-chart").forEach((function(t){t.onclick=function(){var e=t.dataset.chartTarget,i=document.getElementById(e);Highcharts.charts[Highcharts.attr(i,"data-highcharts-chart")].fullscreen.toggle()}})),document.querySelectorAll(".export-chart").forEach((function(t){t.onclick=function(e){var i=t.dataset.chartTarget,r=document.getElementById(i),s=Highcharts.charts[Highcharts.attr(r,"data-highcharts-chart")];e.preventDefault(),s.exportChart({type:t.dataset.type,scale:3})}}))}))},316:function(t,e,i){var r;"undefined"!=typeof self&&self,t.exports=(r=i(540),function(t){function e(r){if(i[r])return i[r].exports;var s=i[r]={i:r,l:!1,exports:{}};return t[r].call(s.exports,s,s.exports,e),s.l=!0,s.exports}var i={};return e.m=t,e.c=i,e.d=function(t,i,r){e.o(t,i)||Object.defineProperty(t,i,{configurable:!1,enumerable:!0,get:r})},e.n=function(t){var i=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(i,"a",i),i},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=0)}([function(t,e,i){"use strict";function r(){return r=Object.assign?Object.assign.bind():function(t){for(var e=1;et.length)&&(e=t.length);for(var i=0,r=new Array(e);iparseInt(i.userAgent.split("Firefox/")[1],10),i.marginNames=["plotTop","marginRight","marginBottom","plotLeft"],i.noop=function(){},i.supportsPassiveEvents=function(){let t=!1;if(!i.isMS){let e=Object.defineProperty({},"passive",{get:function(){t=!0}});i.win.addEventListener&&i.win.removeEventListener&&(i.win.addEventListener("testPassive",i.noop,e),i.win.removeEventListener("testPassive",i.noop,e))}return t}(),i.charts=[],i.composed=[],i.dateFormats={},i.seriesTypes={},i.symbolSizes={},i.chartCount=0,e})),i(e,"Core/Utilities.js",[e["Core/Globals.js"]],(function(t){let e,{charts:i,doc:r,win:s}=t;function n(e,i,r,o){let a=i?"Highcharts error":"Highcharts warning";32===e&&(e=`${a}: Deprecated member`);let l=d(e),c=l?`${a} #${e}: www.highcharts.com/errors/${e}/`:e.toString();if(void 0!==o){let t="";l&&(c+="?"),w(o,(function(e,i){t+=`\n - ${i}: ${e}`,l&&(c+=encodeURI(i)+"="+encodeURI(e))})),c+=t}C(t,"displayError",{chart:r,code:e,message:c,params:o},(function(){if(i)throw Error(c);s.console&&-1===n.messages.indexOf(c)&&console.warn(c)})),n.messages.push(c)}function o(t,e){return parseInt(t,e||10)}function a(t){return"string"==typeof t}function l(t){let e=Object.prototype.toString.call(t);return"[object Array]"===e||"[object Array Iterator]"===e}function c(t,e){return!(!t||"object"!=typeof t||e&&l(t))}function h(t){return c(t)&&"number"==typeof t.nodeType}function u(t){let e=t&&t.constructor;return!(!c(t,!0)||h(t)||!e||!e.name||"Object"===e.name)}function d(t){return"number"==typeof t&&!isNaN(t)&&t<1/0&&t>-1/0}function p(t){return null!=t}function f(t,e,i){let r,s=a(e)&&!p(i),n=(e,i)=>{p(e)?t.setAttribute(i,e):s?(r=t.getAttribute(i))||"class"!==i||(r=t.getAttribute(i+"Name")):t.removeAttribute(i)};return a(e)?n(i,e):w(e,n),r}function m(t){return l(t)?t:[t]}function g(t,e){let i;for(i in t||(t={}),e)t[i]=e[i];return t}function y(){let t=arguments,e=t.length;for(let i=0;i1e14?t:parseFloat(t.toPrecision(e||14))}(n||(n={})).messages=[],Math.easeInOutSine=function(t){return-.5*(Math.cos(Math.PI*t)-1)};let b=Array.prototype.find?function(t,e){return t.find(e)}:function(t,e){let i,r=t.length;for(i=0;it.order-e.order)),t.forEach((t=>{!1===t.fn.call(e,s)&&s.preventDefault()}))}n&&!s.defaultPrevented&&n.call(e,s)}w({map:"map",each:"forEach",grep:"filter",reduce:"reduce",some:"some"},(function(e,i){t[i]=function(t){return n(32,!1,void 0,{[`Highcharts.${i}`]:`use Array.${e}`}),Array.prototype[e].apply(t,[].slice.call(arguments,1))}}));let T=function(){let t=Math.random().toString(36).substring(2,9)+"-",i=0;return function(){return"highcharts-"+(e?"":t)+i++}}();return s.jQuery&&(s.jQuery.fn.highcharts=function(){let e=[].slice.call(arguments);if(this[0])return e[0]?(new(t[a(e[0])?e.shift():"Chart"])(this[0],e[0],e[1]),this):i[f(this[0],"data-highcharts-chart")]}),{addEvent:function(e,i,r,s={}){let n="function"==typeof e&&e.prototype||e;Object.hasOwnProperty.call(n,"hcEvents")||(n.hcEvents={});let o=n.hcEvents;t.Point&&e instanceof t.Point&&e.series&&e.series.chart&&(e.series.chart.runTrackerClick=!0);let a=e.addEventListener;a&&a.call(e,i,r,!!t.supportsPassiveEvents&&{passive:void 0===s.passive?-1!==i.indexOf("touch"):s.passive,capture:!1}),o[i]||(o[i]=[]);let l={fn:r,order:"number"==typeof s.order?s.order:1/0};return o[i].push(l),o[i].sort(((t,e)=>t.order-e.order)),function(){S(e,i,r)}},arrayMax:function(t){let e=t.length,i=t[0];for(;e--;)t[e]>i&&(i=t[e]);return i},arrayMin:function(t){let e=t.length,i=t[0];for(;e--;)t[e]e?t{let r=e%2/2,s=i?-1:1;return(Math.round(t*s-r)+r)*s},css:_,defined:p,destroyObjectProperties:function(t,e,i){w(t,(function(r,s){r!==e&&r?.destroy&&r.destroy(),(r?.destroy||!i)&&delete t[s]}))},diffObjects:function(t,e,i,r){let s={};return function t(e,s,n,o){let a=i?s:e;w(e,(function(i,h){if(!o&&r&&r.indexOf(h)>-1&&s[h]){i=m(i),n[h]=[];for(let e=0;e{if(t.length>1)for(n=r=t.length-1;n>0;n--)(s=t[n]-t[n-1])<0&&!o?(e?.(),e=void 0):s&&(void 0===i||s=i-1&&(i=Math.floor(r)),Math.max(0,i-(t(e,"padding-left",!0)||0)-(t(e,"padding-right",!0)||0))}if("height"===i)return Math.max(0,Math.min(e.offsetHeight,e.scrollHeight)-(t(e,"padding-top",!0)||0)-(t(e,"padding-bottom",!0)||0));let a=s.getComputedStyle(e,void 0);return a&&(n=a.getPropertyValue(i),y(r,"opacity"!==i)&&(n=o(n))),n},inArray:function(t,e,i){return n(32,!1,void 0,{"Highcharts.inArray":"use Array.indexOf"}),e.indexOf(t,i)},insertItem:function(t,e){let i,r=t.options.index,s=e.length;for(i=t.options.isInternal?s:0;i=t))&&(s||!(a<=(e[n]+(e[n+1]||e[n]))/2)));n++);return x(o*i,-Math.round(Math.log(.001)/Math.LN10))},objectEach:w,offset:function(t){let e=r.documentElement,i=t.parentElement||t.parentNode?t.getBoundingClientRect():{top:0,left:0,width:0,height:0};return{top:i.top+(s.pageYOffset||e.scrollTop)-(e.clientTop||0),left:i.left+(s.pageXOffset||e.scrollLeft)-(e.clientLeft||0),width:i.width,height:i.height}},pad:function(t,e,i){return Array((e||2)+1-String(t).replace("-","").length).join(i||"0")+t},pick:y,pInt:o,pushUnique:function(t,e){return 0>t.indexOf(e)&&!!t.push(e)},relativeLength:function(t,e,i){return/%$/.test(t)?e*parseFloat(t)/100+(i||0):parseFloat(t)},removeEvent:S,replaceNested:function(t,...e){let i,r;do{for(r of(i=t,e))t=t.replace(r[0],r[1])}while(t!==i);return t},splat:m,stableSort:function(t,e){let i,r,s=t.length;for(r=0;r0?setTimeout(t,e,i):(t.call(0,i),-1)},timeUnits:{millisecond:1,second:1e3,minute:6e4,hour:36e5,day:864e5,week:6048e5,month:24192e5,year:314496e5},uniqueKey:T,useSerialIds:function(t){return e=y(t,e)},wrap:function(t,e,i){let r=t[e];t[e]=function(){let t=arguments,e=this;return i.apply(this,[function(){return r.apply(e,arguments.length?arguments:t)}].concat([].slice.call(arguments)))}}}})),i(e,"Core/Chart/ChartDefaults.js",[],(function(){return{alignThresholds:!1,panning:{enabled:!1,type:"x"},styledMode:!1,borderRadius:0,colorCount:10,allowMutatingData:!0,ignoreHiddenSeries:!0,spacing:[10,10,15,10],resetZoomButton:{theme:{},position:{}},reflow:!0,type:"line",zooming:{singleTouch:!1,resetButton:{theme:{zIndex:6},position:{align:"right",x:-10,y:10}}},width:null,height:null,borderColor:"#334eff",backgroundColor:"#ffffff",plotBorderColor:"#cccccc"}})),i(e,"Core/Color/Palettes.js",[],(function(){return{colors:["#2caffe","#544fc5","#00e272","#fe6a35","#6b8abc","#d568fb","#2ee0ca","#fa4b42","#feb56a","#91e8e1"]}})),i(e,"Core/Time.js",[e["Core/Globals.js"],e["Core/Utilities.js"]],(function(t,e){let{win:i}=t,{defined:r,error:s,extend:n,isNumber:o,isObject:a,merge:l,objectEach:c,pad:h,pick:u,splat:d,timeUnits:p}=e,f=t.isSafari&&i.Intl&&i.Intl.DateTimeFormat.prototype.formatRange,m=t.isSafari&&i.Intl&&!i.Intl.DateTimeFormat.prototype.formatRange;class g{constructor(t){this.options={},this.useUTC=!1,this.variableTimezone=!1,this.Date=i.Date,this.getTimezoneOffset=this.timezoneOffsetFunction(),this.update(t)}get(t,e){if(this.variableTimezone||this.timezoneOffset){let i=e.getTime(),r=i-this.getTimezoneOffset(e);e.setTime(r);let s=e["getUTC"+t]();return e.setTime(i),s}return this.useUTC?e["getUTC"+t]():e["get"+t]()}set(t,e,i){if(this.variableTimezone||this.timezoneOffset){if("Milliseconds"===t||"Seconds"===t||"Minutes"===t&&this.getTimezoneOffset(e)%36e5==0)return e["setUTC"+t](i);let r=this.getTimezoneOffset(e),s=e.getTime()-r;e.setTime(s),e["setUTC"+t](i);let n=this.getTimezoneOffset(e);return s=e.getTime()+n,e.setTime(s)}return this.useUTC||f&&"FullYear"===t?e["setUTC"+t](i):e["set"+t](i)}update(t={}){let e=u(t.useUTC,!0);this.options=t=l(!0,this.options,t),this.Date=t.Date||i.Date||Date,this.useUTC=e,this.timezoneOffset=e&&t.timezoneOffset||void 0,this.getTimezoneOffset=this.timezoneOffsetFunction(),this.variableTimezone=e&&!(!t.getTimezoneOffset&&!t.timezone)}makeTime(t,e,i,r,s,n){let o,a,l;return this.useUTC?(o=this.Date.UTC.apply(0,arguments),a=this.getTimezoneOffset(o),o+=a,a!==(l=this.getTimezoneOffset(o))?o+=l-a:a-36e5!==this.getTimezoneOffset(o-36e5)||m||(o-=36e5)):o=new this.Date(t,e,u(i,1),u(r,0),u(s,0),u(n,0)).getTime(),o}timezoneOffsetFunction(){let t=this,e=this.options,i=e.getTimezoneOffset;return this.useUTC?e.timezone?t=>{try{let i=`shortOffset,${e.timezone||""}`,[r,s,n,a,l=0]=(g.formatCache[i]=g.formatCache[i]||Intl.DateTimeFormat("en",{timeZone:e.timezone,timeZoneName:"shortOffset"})).format(t).split(/(GMT|:)/).map(Number),c=-36e5*(n+l/60);if(o(c))return c}catch(t){s(34)}return 0}:this.useUTC&&i?t=>6e4*i(t.valueOf()):()=>6e4*(t.timezoneOffset||0):t=>6e4*new Date(t.toString()).getTimezoneOffset()}dateFormat(e,i,s){if(!r(i)||isNaN(i))return t.defaultOptions.lang&&t.defaultOptions.lang.invalidDate||"";e=u(e,"%Y-%m-%d %H:%M:%S");let o=this,a=new this.Date(i),l=this.get("Hours",a),d=this.get("Day",a),p=this.get("Date",a),f=this.get("Month",a),m=this.get("FullYear",a),g=t.defaultOptions.lang,y=g&&g.weekdays,_=g&&g.shortWeekdays;return c(n({a:_?_[d]:y[d].substr(0,3),A:y[d],d:h(p),e:h(p,2," "),w:d,b:g.shortMonths[f],B:g.months[f],m:h(f+1),o:f+1,y:m.toString().substr(2,2),Y:m,H:h(l),k:l,I:h(l%12||12),l:l%12||12,M:h(this.get("Minutes",a)),p:l<12?"AM":"PM",P:l<12?"am":"pm",S:h(this.get("Seconds",a)),L:h(Math.floor(i%1e3),3)},t.dateFormats),(function(t,r){for(;-1!==e.indexOf("%"+r);)e=e.replace("%"+r,"function"==typeof t?t.call(o,i):t)})),s?e.substr(0,1).toUpperCase()+e.substr(1):e}resolveDTLFormat(t){return a(t,!0)?t:{main:(t=d(t))[0],from:t[1],to:t[2]}}getTimeTicks(t,e,i,s){let o,a,l,c,h=this,d=h.Date,f=[],m={},g=new d(e),y=t.unitRange,_=t.count||1;if(s=u(s,1),r(e)){h.set("Milliseconds",g,y>=p.second?0:_*Math.floor(h.get("Milliseconds",g)/_)),y>=p.second&&h.set("Seconds",g,y>=p.minute?0:_*Math.floor(h.get("Seconds",g)/_)),y>=p.minute&&h.set("Minutes",g,y>=p.hour?0:_*Math.floor(h.get("Minutes",g)/_)),y>=p.hour&&h.set("Hours",g,y>=p.day?0:_*Math.floor(h.get("Hours",g)/_)),y>=p.day&&h.set("Date",g,y>=p.month?1:Math.max(1,_*Math.floor(h.get("Date",g)/_))),y>=p.month&&(h.set("Month",g,y>=p.year?0:_*Math.floor(h.get("Month",g)/_)),a=h.get("FullYear",g)),y>=p.year&&(a-=a%_,h.set("FullYear",g,a)),y===p.week&&(c=h.get("Day",g),h.set("Date",g,h.get("Date",g)-c+s+(c4*p.month||h.getTimezoneOffset(e)!==h.getTimezoneOffset(i));let d=g.getTime();for(o=1;d1?d=h.makeTime(a,t,n,u+o*_):d+=y*_:d=h.makeTime(a,t,n+o*_*(y===p.day?1:7)),o++;f.push(d),y<=p.hour&&f.length<1e4&&f.forEach((function(t){t%18e5==0&&"000000000"===h.dateFormat("%H%M%S%L",t)&&(m[t]="day")}))}return f.info=n(t,{higherRanks:m,totalRange:y*_}),f}getDateFormat(t,e,i,r){let s=this.dateFormat("%m-%d %H:%M:%S.%L",e),n="01-01 00:00:00.000",o={millisecond:15,second:12,minute:9,hour:6,day:3},a="millisecond",l=a;for(a in p){if(t===p.week&&+this.dateFormat("%w",e)===i&&s.substr(6)===n.substr(6)){a="week";break}if(p[a]>t){a=l;break}if(o[a]&&s.substr(o[a])!==n.substr(o[a]))break;"week"!==a&&(l=a)}return this.resolveDTLFormat(r[a]).main}}return g.formatCache={},g})),i(e,"Core/Defaults.js",[e["Core/Chart/ChartDefaults.js"],e["Core/Globals.js"],e["Core/Color/Palettes.js"],e["Core/Time.js"],e["Core/Utilities.js"]],(function(t,e,i,r,s){let{isTouchDevice:n}=e,{fireEvent:o,merge:a}=s,l={colors:i.colors,symbols:["circle","diamond","square","triangle","triangle-down"],lang:{loading:"Loading...",months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],weekdays:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],decimalPoint:".",numericSymbols:["k","M","G","T","P","E"],resetZoom:"Reset zoom",resetZoomTitle:"Reset zoom level 1:1",thousandsSep:" "},global:{buttonTheme:{fill:"#f7f7f7",padding:8,r:2,stroke:"#cccccc","stroke-width":1,style:{color:"#333333",cursor:"pointer",fontSize:"0.8em",fontWeight:"normal"},states:{hover:{fill:"#e6e6e6"},select:{fill:"#e6e9ff",style:{color:"#000000",fontWeight:"bold"}},disabled:{style:{color:"#cccccc"}}}}},time:{Date:void 0,getTimezoneOffset:void 0,timezone:void 0,timezoneOffset:0,useUTC:!0},chart:t,title:{style:{color:"#333333",fontWeight:"bold"},text:"Chart title",align:"center",margin:15,widthAdjust:-44},subtitle:{style:{color:"#666666",fontSize:"0.8em"},text:"",align:"center",widthAdjust:-44},caption:{margin:15,style:{color:"#666666",fontSize:"0.8em"},text:"",align:"left",verticalAlign:"bottom"},plotOptions:{},legend:{enabled:!0,align:"center",alignColumns:!0,className:"highcharts-no-tooltip",events:{},layout:"horizontal",itemMarginBottom:2,itemMarginTop:2,labelFormatter:function(){return this.name},borderColor:"#999999",borderRadius:0,navigation:{style:{fontSize:"0.8em"},activeColor:"#0022ff",inactiveColor:"#cccccc"},itemStyle:{color:"#333333",cursor:"pointer",fontSize:"0.8em",textDecoration:"none",textOverflow:"ellipsis"},itemHoverStyle:{color:"#000000"},itemHiddenStyle:{color:"#666666",textDecoration:"line-through"},shadow:!1,itemCheckboxStyle:{position:"absolute",width:"13px",height:"13px"},squareSymbol:!0,symbolPadding:5,verticalAlign:"bottom",x:0,y:0,title:{style:{fontSize:"0.8em",fontWeight:"bold"}}},loading:{labelStyle:{fontWeight:"bold",position:"relative",top:"45%"},style:{position:"absolute",backgroundColor:"#ffffff",opacity:.5,textAlign:"center"}},tooltip:{enabled:!0,animation:{duration:300,easing:t=>Math.sqrt(1-Math.pow(t-1,2))},borderRadius:3,dateTimeLabelFormats:{millisecond:"%A, %e %b, %H:%M:%S.%L",second:"%A, %e %b, %H:%M:%S",minute:"%A, %e %b, %H:%M",hour:"%A, %e %b, %H:%M",day:"%A, %e %b %Y",week:"Week from %A, %e %b %Y",month:"%B %Y",year:"%Y"},footerFormat:"",headerShape:"callout",hideDelay:500,padding:8,shape:"callout",shared:!1,snap:n?25:10,headerFormat:'{point.key}
    ',pointFormat:' {series.name}: {point.y}
    ',backgroundColor:"#ffffff",borderWidth:void 0,shadow:!0,stickOnContact:!1,style:{color:"#333333",cursor:"default",fontSize:"0.8em"},useHTML:!1},credits:{enabled:!0,href:"https://www.highcharts.com?credits",position:{align:"right",x:-10,verticalAlign:"bottom",y:-5},style:{cursor:"pointer",color:"#999999",fontSize:"0.6em"},text:"Highcharts.com"}};l.chart.styledMode=!1;let c=new r(l.time);return{defaultOptions:l,defaultTime:c,getOptions:function(){return l},setOptions:function(t){return o(e,"setOptions",{options:t}),a(!0,l,t),(t.time||t.global)&&(e.time?e.time.update(a(l.global,l.time,t.global,t.time)):e.time=c),l}}})),i(e,"Core/Color/Color.js",[e["Core/Globals.js"],e["Core/Utilities.js"]],(function(t,e){let{isNumber:i,merge:r,pInt:s}=e;class n{static parse(t){return t?new n(t):n.None}constructor(e){let i,r,s,o;this.rgba=[NaN,NaN,NaN,NaN],this.input=e;let a=t.Color;if(a&&a!==n)return new a(e);if("object"==typeof e&&void 0!==e.stops)this.stops=e.stops.map((t=>new n(t[1])));else if("string"==typeof e){if(this.input=e=n.names[e.toLowerCase()]||e,"#"===e.charAt(0)){let t=e.length,i=parseInt(e.substr(1),16);7===t?r=[(16711680&i)>>16,(65280&i)>>8,255&i,1]:4===t&&(r=[(3840&i)>>4|(3840&i)>>8,(240&i)>>4|240&i,(15&i)<<4|15&i,1])}if(!r)for(s=n.parsers.length;s--&&!r;)(i=(o=n.parsers[s]).regex.exec(e))&&(r=o.parse(i))}r&&(this.rgba=r)}get(t){let e=this.input,s=this.rgba;if("object"==typeof e&&void 0!==this.stops){let i=r(e);return i.stops=[].slice.call(i.stops),this.stops.forEach(((e,r)=>{i.stops[r]=[i.stops[r][0],e.get(t)]})),i}return s&&i(s[0])?"rgb"===t||!t&&1===s[3]?"rgb("+s[0]+","+s[1]+","+s[2]+")":"a"===t?`${s[3]}`:"rgba("+s.join(",")+")":e}brighten(t){let e=this.rgba;if(this.stops)this.stops.forEach((function(e){e.brighten(t)}));else if(i(t)&&0!==t)for(let i=0;i<3;i++)e[i]+=s(255*t),e[i]<0&&(e[i]=0),e[i]>255&&(e[i]=255);return this}setOpacity(t){return this.rgba[3]=t,this}tweenTo(t,e){let r=this.rgba,s=t.rgba;if(!i(r[0])||!i(s[0]))return t.input||"none";let n=1!==s[3]||1!==r[3];return(n?"rgba(":"rgb(")+Math.round(s[0]+(r[0]-s[0])*(1-e))+","+Math.round(s[1]+(r[1]-s[1])*(1-e))+","+Math.round(s[2]+(r[2]-s[2])*(1-e))+(n?","+(s[3]+(r[3]-s[3])*(1-e)):"")+")"}}return n.names={white:"#ffffff",black:"#000000"},n.parsers=[{regex:/rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d?(?:\.\d+)?)\s*\)/,parse:function(t){return[s(t[1]),s(t[2]),s(t[3]),parseFloat(t[4],10)]}},{regex:/rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)/,parse:function(t){return[s(t[1]),s(t[2]),s(t[3]),1]}}],n.None=new n(""),n})),i(e,"Core/Animation/Fx.js",[e["Core/Color/Color.js"],e["Core/Globals.js"],e["Core/Utilities.js"]],(function(t,e,i){let{parse:r}=t,{win:s}=e,{isNumber:n,objectEach:o}=i;class a{constructor(t,e,i){this.pos=NaN,this.options=e,this.elem=t,this.prop=i}dSetter(){let t=this.paths,e=t&&t[0],i=t&&t[1],r=this.now||0,s=[];if(1!==r&&e&&i)if(e.length===i.length&&r<1)for(let t=0;t=l+this.startTime?(this.now=this.end,this.pos=1,this.update(),c[this.prop]=!0,i=!0,o(c,(function(t){!0!==t&&(i=!1)})),i&&a&&a.call(n),e=!1):(this.pos=s.easing((r-this.startTime)/l),this.now=this.start+(this.end-this.start)*this.pos,this.update(),e=!0),e}initPath(t,e,i){let r,s,o,a,l=t.startX,c=t.endX,h=i.slice(),u=t.isArea,d=u?2:1,p=e&&i.length>e.length&&i.hasStackedCliffs,f=e&&e.slice();if(!f||p)return[h,h];function m(t,e){for(;t.length{let r=h(t.options.animation);a=o(e)&&i(e.defer)?s.defer:Math.max(a,r.duration+r.defer),l=Math.min(s.duration,r.duration)})),t.renderer.forExport&&(a=0),{defer:Math.max(0,a-l),duration:Math.min(a,l)}},setAnimation:function(t,e){e.renderer.globalAnimation=c(t,e.options.chart.animation,!0)},stop:u}})),i(e,"Core/Renderer/HTML/AST.js",[e["Core/Globals.js"],e["Core/Utilities.js"]],(function(t,e){let{SVG_NS:i,win:r}=t,{attr:s,createElement:n,css:o,error:a,isFunction:l,isString:c,objectEach:h,splat:u}=e,{trustedTypes:d}=r,p=d&&l(d.createPolicy)&&d.createPolicy("highcharts",{createHTML:t=>t}),f=p?p.createHTML(""):"",m=function(){try{return!!(new DOMParser).parseFromString(f,"text/html")}catch(t){return!1}}();class g{static filterUserAttributes(t){return h(t,((e,i)=>{let r=!0;-1===g.allowedAttributes.indexOf(i)&&(r=!1),-1!==["background","dynsrc","href","lowsrc","src"].indexOf(i)&&(r=c(e)&&g.allowedReferences.some((t=>0===e.indexOf(t)))),r||(a(33,!1,void 0,{"Invalid attribute in config":`${i}`}),delete t[i]),c(e)&&t[i]&&(t[i]=e.replace(/{let i=e.split(":").map((t=>t.trim())),r=i.shift();return r&&i.length&&(t[r.replace(/-([a-z])/g,(t=>t[1].toUpperCase()))]=i.join(":")),t}),{})}static setElementHTML(t,e){t.innerHTML=g.emptyHTML,e&&new g(e).addToDOM(t)}constructor(t){this.nodes="string"==typeof t?this.parseMarkup(t):t}addToDOM(e){return function e(r,n){let l;return u(r).forEach((function(r){let c,u=r.tagName,d=r.textContent?t.doc.createTextNode(r.textContent):void 0,p=g.bypassHTMLFiltering;if(u)if("#text"===u)c=d;else if(-1!==g.allowedTags.indexOf(u)||p){let a="svg"===u?i:n.namespaceURI||i,l=t.doc.createElementNS(a,u),f=r.attributes||{};h(r,(function(t,e){"tagName"!==e&&"attributes"!==e&&"children"!==e&&"style"!==e&&"textContent"!==e&&(f[e]=t)})),s(l,p?f:g.filterUserAttributes(f)),r.style&&o(l,r.style),d&&l.appendChild(d),e(r.children||[],l),c=l}else a(33,!1,void 0,{"Invalid tagName in config":u});c&&n.appendChild(c),l=c})),l}(this.nodes,e)}parseMarkup(t){let e,i=[];if(t=t.trim().replace(/ style=(["'])/g," data-style=$1"),m)e=(new DOMParser).parseFromString(p?p.createHTML(t):t,"text/html");else{let i=n("div");i.innerHTML=t,e={body:i}}let r=(t,e)=>{let i=t.nodeName.toLowerCase(),s={tagName:i};"#text"===i&&(s.textContent=t.textContent||"");let n=t.attributes;if(n){let t={};[].forEach.call(n,(e=>{"data-style"===e.name?s.style=g.parseStyle(e.value):t[e.name]=e.value})),s.attributes=t}if(t.childNodes.length){let e=[];[].forEach.call(t.childNodes,(t=>{r(t,e)})),e.length&&(s.children=e)}e.push(s)};return[].forEach.call(e.body.childNodes,(t=>r(t,i))),i}}return g.allowedAttributes=["alt","aria-controls","aria-describedby","aria-expanded","aria-haspopup","aria-hidden","aria-label","aria-labelledby","aria-live","aria-pressed","aria-readonly","aria-roledescription","aria-selected","class","clip-path","color","colspan","cx","cy","d","dx","dy","disabled","fill","filterUnits","flood-color","flood-opacity","height","href","id","in","in2","markerHeight","markerWidth","offset","opacity","operator","orient","padding","paddingLeft","paddingRight","patternUnits","r","radius","refX","refY","role","scope","slope","src","startOffset","stdDeviation","stroke","stroke-linecap","stroke-width","style","tableValues","result","rowspan","summary","target","tabindex","text-align","text-anchor","textAnchor","textLength","title","type","valign","width","x","x1","x2","xlink:href","y","y1","y2","zIndex"],g.allowedReferences=["https://","http://","mailto:","/","../","./","#"],g.allowedTags=["a","abbr","b","br","button","caption","circle","clipPath","code","dd","defs","div","dl","dt","em","feComponentTransfer","feComposite","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feMorphology","feOffset","feMerge","feMergeNode","filter","h1","h2","h3","h4","h5","h6","hr","i","img","li","linearGradient","marker","ol","p","path","pattern","pre","rect","small","span","stop","strong","style","sub","sup","svg","table","text","textPath","thead","title","tbody","tspan","td","th","tr","u","ul","#text"],g.emptyHTML=f,g.bypassHTMLFiltering=!1,g})),i(e,"Core/Templating.js",[e["Core/Defaults.js"],e["Core/Utilities.js"]],(function(t,e){let{defaultOptions:i,defaultTime:r}=t,{extend:s,getNestedProperty:n,isArray:o,isNumber:a,isObject:l,pick:c,pInt:h}=e,u={add:(t,e)=>t+e,divide:(t,e)=>0!==e?t/e:"",eq:(t,e)=>t==e,each:function(t){let e=arguments[arguments.length-1];return!!o(t)&&t.map(((i,r)=>d(e.body,s(l(i)?i:{"@this":i},{"@index":r,"@first":0===r,"@last":r===t.length-1})))).join("")},ge:(t,e)=>t>=e,gt:(t,e)=>t>e,if:t=>!!t,le:(t,e)=>t<=e,lt:(t,e)=>tt*e,ne:(t,e)=>t!=e,subtract:(t,e)=>t-e,unless:t=>!t};function d(t="",e,s){let o,a,l,h=/\{([\w\:\.\,;\-\/<>%@"'’= #\(\)]+)\}/g,f=/\(([\w\:\.\,;\-\/<>%@"'= ]+)\)/g,m=[],g=/f$/,y=/\.(\d)/,_=i.lang,v=s&&s.time||r,x=s&&s.numberFormatter||p,b=(t="")=>{let i;return"true"===t||"false"!==t&&((i=Number(t)).toString()===t?i:n(t,e))},w=0;for(;null!==(o=h.exec(t));){let i=f.exec(o[1]);i&&(o=i,l=!0),a&&a.isBlock||(a={ctx:e,expression:o[1],find:o[0],isBlock:"#"===o[1].charAt(0),start:o.index,startInner:o.index+o[0].length,length:o[0].length});let r=o[1].split(" ")[0].replace("#","");u[r]&&(a.isBlock&&r===a.fn&&w++,a.fn||(a.fn=r));let s="else"===o[1];if(a.isBlock&&a.fn&&(o[1]===`/${a.fn}`||s))if(w)!s&&w--;else{let e=a.startInner,i=t.substr(e,o.index-e);void 0===a.body?(a.body=i,a.startInner=o.index+o[0].length):a.elseBody=i,a.find+=i+o[0],s||(m.push(a),a=void 0)}else a.isBlock||m.push(a);if(i&&!a?.isBlock)break}return m.forEach((i=>{let r,n,{body:o,elseBody:a,expression:l,fn:h}=i;if(h){let t=[i],c=l.split(" ");for(n=u[h].length;n--;)t.unshift(b(c[n+1]));r=u[h].apply(e,t),i.isBlock&&"boolean"==typeof r&&(r=d(r?o:a,e,s))}else{let t=l.split(":");if(r=b(t.shift()||""),t.length&&"number"==typeof r){let e=t.join(":");if(g.test(e)){let t=parseInt((e.match(y)||["","-1"])[1],10);null!==r&&(r=x(r,t,_.decimalPoint,e.indexOf(",")>-1?_.thousandsSep:""))}else r=v.dateFormat(e,r)}}t=t.replace(i.find,c(r,""))})),l?d(t,e,s):t}function p(t,e,r,s){let n,o;t=+t||0,e=+e;let l=i.lang,u=(t.toString().split(".")[1]||"").split("e")[0].length,d=t.toString().split("e"),p=e;-1===e?e=Math.min(u,20):a(e)?e&&d[1]&&d[1]<0&&((o=e+ +d[1])>=0?(d[0]=(+d[0]).toExponential(o).split("e")[0],e=o):(d[0]=d[0].split(".")[0]||0,t=e<20?(d[0]*Math.pow(10,d[1])).toFixed(e):0,d[1]=0)):e=2;let f=(Math.abs(d[1]?d[0]:t)+Math.pow(10,-Math.max(e,u)-1)).toFixed(e),m=String(h(f)),g=m.length>3?m.length%3:0;return r=c(r,l.decimalPoint),s=c(s,l.thousandsSep),n=(t<0?"-":"")+(g?m.substr(0,g)+s:""),0>+d[1]&&!p?n="0":n+=m.substr(g).replace(/(\d{3})(?=\d)/g,"$1"+s),e?n+=r+f.slice(-e):0==+n&&(n="0"),d[1]&&0!=+n&&(n+="e"+d[1]),n}return{dateFormat:function(t,e,i){return r.dateFormat(t,e,i)},format:d,helpers:u,numberFormat:p}})),i(e,"Core/Renderer/RendererRegistry.js",[e["Core/Globals.js"]],(function(t){var e,i;let r;return(i=e||(e={})).rendererTypes={},i.getRendererType=function(t=r){return i.rendererTypes[t]||i.rendererTypes[r]},i.registerRendererType=function(e,s,n){i.rendererTypes[e]=s,(!r||n)&&(r=e,t.Renderer=s)},e})),i(e,"Core/Renderer/RendererUtilities.js",[e["Core/Utilities.js"]],(function(t){var e;let{clamp:i,pick:r,pushUnique:s,stableSort:n}=t;return(e||(e={})).distribute=function t(e,o,a){let l,c,h,u,d,p,f=e,m=f.reducedLen||o,g=(t,e)=>t.target-e.target,y=[],_=e.length,v=[],x=y.push,b=!0,w=0;for(l=_;l--;)w+=e[l].size;if(w>m){for(n(e,((t,e)=>(e.rank||0)-(t.rank||0))),h=(p=e[0].rank===e[e.length-1].rank)?_/2:-1,c=p?h:_-1;h&&w>m;)u=e[l=Math.floor(c)],s(v,l)&&(w-=u.size),c+=h,p&&c>=e.length&&(h/=2,c=h);v.sort(((t,e)=>e-t)).forEach((t=>x.apply(y,e.splice(t,1))))}for(n(e,g),e=e.map((t=>({size:t.size,targets:[t.target],align:r(t.align,.5)})));b;){for(l=e.length;l--;)u=e[l],d=(Math.min.apply(0,u.targets)+Math.max.apply(0,u.targets))/2,u.pos=i(d-u.size*u.align,0,o-u.size);for(l=e.length,b=!1;l--;)l>0&&e[l-1].pos+e[l-1].size>e[l].pos&&(e[l-1].size+=e[l].size,e[l-1].targets=e[l-1].targets.concat(e[l].targets),e[l-1].align=.5,e[l-1].pos+e[l-1].size>o&&(e[l-1].pos=o-e[l-1].size),e.splice(l,1),b=!0)}return x.apply(f,y),l=0,e.some((e=>{let i=0;return(e.targets||[]).some((()=>(f[l].pos=e.pos+i,void 0!==a&&Math.abs(f[l].pos-f[l].target)>a?(f.slice(0,l+1).forEach((t=>delete t.pos)),f.reducedLen=(f.reducedLen||o)-.1*o,f.reducedLen>.1*o&&t(f,o,a),!0):(i+=f[l].size,l++,!1))))})),n(f,g),f},e})),i(e,"Core/Renderer/SVG/SVGElement.js",[e["Core/Animation/AnimationUtilities.js"],e["Core/Color/Color.js"],e["Core/Globals.js"],e["Core/Utilities.js"]],(function(t,e,i,r){let{animate:s,animObject:n,stop:o}=t,{deg2rad:a,doc:l,svg:c,SVG_NS:h,win:u}=i,{addEvent:d,attr:p,createElement:f,crisp:m,css:g,defined:y,erase:_,extend:v,fireEvent:x,isArray:b,isFunction:w,isObject:S,isString:C,merge:T,objectEach:k,pick:E,pInt:A,pushUnique:M,replaceNested:P,syncTimeout:I,uniqueKey:L}=r;class D{_defaultGetter(t){let e=E(this[t+"Value"],this[t],this.element?this.element.getAttribute(t):null,0);return/^-?[\d\.]+$/.test(e)&&(e=parseFloat(e)),e}_defaultSetter(t,e,i){i.setAttribute(e,t)}add(t){let e,i=this.renderer,r=this.element;return t&&(this.parentGroup=t),void 0!==this.textStr&&"text"===this.element.nodeName&&i.buildText(this),this.added=!0,(!t||t.handleZ||this.zIndex)&&(e=this.zIndexSetter()),e||(t?t.element:i.box).appendChild(r),this.onAdd&&this.onAdd(),this}addClass(t,e){let i=e?"":this.attr("class")||"";return(t=(t||"").split(/ /g).reduce((function(t,e){return-1===i.indexOf(e)&&t.push(e),t}),i?[i]:[]).join(" "))!==i&&this.attr("class",t),this}afterSetters(){this.doTransform&&(this.updateTransform(),this.doTransform=!1)}align(t,e,i,r=!0){let s,n,o,a,l={},c=this.renderer,h=c.alignedObjects,u=!!t;t?(this.alignOptions=t,this.alignByTranslate=e,this.alignTo=i):(t=this.alignOptions||{},e=this.alignByTranslate,i=this.alignTo);let d=!i||C(i)?i||"renderer":void 0;d&&(u&&M(h,this),i=void 0);let p=E(i,c[d],c),f=t.align,m=t.verticalAlign;return s=(p.x||0)+(t.x||0),n=(p.y||0)+(t.y||0),"right"===f?o=1:"center"===f&&(o=2),o&&(s+=((p.width||0)-(t.width||0))/o),l[e?"translateX":"x"]=Math.round(s),"bottom"===m?a=1:"middle"===m&&(a=2),a&&(n+=((p.height||0)-(t.height||0))/a),l[e?"translateY":"y"]=Math.round(n),r&&(this[this.placed?"animate":"attr"](l),this.placed=!0),this.alignAttr=l,this}alignSetter(t){let e={left:"start",center:"middle",right:"end"};e[t]&&(this.alignValue=t,this.element.setAttribute("text-anchor",e[t]))}animate(t,e,i){let r=n(E(e,this.renderer.globalAnimation,!0)),o=r.defer;return l.hidden&&(r.duration=0),0!==r.duration?(i&&(r.complete=i),I((()=>{this.element&&s(this,t,r)}),o)):(this.attr(t,void 0,i||r.complete),k(t,(function(t,e){r.step&&r.step.call(this,t,{prop:e,pos:1,elem:this})}),this)),this}applyTextOutline(t){let e=this.element;-1!==t.indexOf("contrast")&&(t=t.replace(/contrast/g,this.renderer.getContrast(e.style.fill)));let r=t.split(" "),s=r[r.length-1],n=r[0];if(n&&"none"!==n&&i.svg){this.fakeTS=!0,n=n.replace(/(^[\d\.]+)(.*?)$/g,(function(t,e,i){return 2*Number(e)+i})),this.removeTextOutline();let t=l.createElementNS(h,"tspan");p(t,{class:"highcharts-text-outline",fill:s,stroke:s,"stroke-width":n,"stroke-linejoin":"round"});let i=e.querySelector("textPath")||e;[].forEach.call(i.childNodes,(e=>{let i=e.cloneNode(!0);i.removeAttribute&&["fill","stroke","stroke-width","stroke"].forEach((t=>i.removeAttribute(t))),t.appendChild(i)}));let r=0;[].forEach.call(i.querySelectorAll("text tspan"),(t=>{r+=Number(t.getAttribute("dy"))}));let o=l.createElementNS(h,"tspan");o.textContent="​",p(o,{x:Number(e.getAttribute("x")),dy:-r}),t.appendChild(o),i.insertBefore(t,i.firstChild)}}attr(t,e,i,r){let s,n,a,{element:l}=this,c=D.symbolCustomAttribs,h=this;return"string"==typeof t&&void 0!==e&&(s=t,(t={})[s]=e),"string"==typeof t?h=(this[t+"Getter"]||this._defaultGetter).call(this,t,l):(k(t,(function(e,i){a=!1,r||o(this,i),this.symbolName&&-1!==c.indexOf(i)&&(n||(this.symbolAttr(t),n=!0),a=!0),this.rotation&&("x"===i||"y"===i)&&(this.doTransform=!0),a||(this[i+"Setter"]||this._defaultSetter).call(this,e,i,l)}),this),this.afterSetters()),i&&i.call(this),h}clip(t){if(t&&!t.clipPath){let e=L()+"-",i=this.renderer.createElement("clipPath").attr({id:e}).add(this.renderer.defs);v(t,{clipPath:i,id:e,count:0}),t.add(i)}return this.attr("clip-path",t?`url(${this.renderer.url}#${t.id})`:"none")}crisp(t,e){e=Math.round(e||t.strokeWidth||0);let i=t.x||this.x||0,r=t.y||this.y||0,s=(t.width||this.width||0)+i,n=(t.height||this.height||0)+r,o=m(i,e),a=m(r,e);return v(t,{x:o,y:a,width:m(s,e)-o,height:m(n,e)-a}),y(t.strokeWidth)&&(t.strokeWidth=e),t}complexColor(t,i,r){let s,n,o,a,l,c,h,u,d,p,f,m=this.renderer,g=[];x(this.renderer,"complexColor",{args:arguments},(function(){if(t.radialGradient?n="radialGradient":t.linearGradient&&(n="linearGradient"),n){if(o=t[n],l=m.gradients,c=t.stops,d=r.radialReference,b(o)&&(t[n]=o={x1:o[0],y1:o[1],x2:o[2],y2:o[3],gradientUnits:"userSpaceOnUse"}),"radialGradient"===n&&d&&!y(o.gradientUnits)&&(a=o,o=T(o,m.getRadialAttr(d,a),{gradientUnits:"userSpaceOnUse"})),k(o,(function(t,e){"id"!==e&&g.push(e,t)})),k(c,(function(t){g.push(t)})),l[g=g.join(",")])p=l[g].attr("id");else{o.id=p=L();let t=l[g]=m.createElement(n).attr(o).add(m.defs);t.radAttr=a,t.stops=[],c.forEach((function(i){0===i[1].indexOf("rgba")?(h=(s=e.parse(i[1])).get("rgb"),u=s.get("a")):(h=i[1],u=1);let r=m.createElement("stop").attr({offset:i[0],"stop-color":h,"stop-opacity":u}).add(t);t.stops.push(r)}))}f="url("+m.url+"#"+p+")",r.setAttribute(i,f),r.gradient=g,t.toString=function(){return f}}}))}css(t){let e,i=this.styles,r={},s=this.element,n=!i;if(i&&k(t,(function(t,e){i&&i[e]!==t&&(r[e]=t,n=!0)})),n){i&&(t=v(i,r)),null===t.width||"auto"===t.width?delete this.textWidth:"text"===s.nodeName.toLowerCase()&&t.width&&(e=this.textWidth=A(t.width)),v(this.styles,t),e&&!c&&this.renderer.forExport&&delete t.width;let n=T(t);s.namespaceURI===this.SVG_NS&&(["textOutline","textOverflow","width"].forEach((t=>n&&delete n[t])),n.color&&(n.fill=n.color)),g(s,n)}return this.added&&("text"===this.element.nodeName&&this.renderer.buildText(this),t.textOutline&&this.applyTextOutline(t.textOutline)),this}dashstyleSetter(t){let e,i=this["stroke-width"];if("inherit"===i&&(i=1),t=t&&t.toLowerCase()){let r=t.replace("shortdashdotdot","3,1,1,1,1,1,").replace("shortdashdot","3,1,1,1").replace("shortdot","1,1,").replace("shortdash","3,1,").replace("longdash","8,3,").replace(/dot/g,"1,3,").replace("dash","4,3,").replace(/,$/,"").split(",");for(e=r.length;e--;)r[e]=""+A(r[e])*E(i,NaN);t=r.join(",").replace(/NaN/g,"none"),this.element.setAttribute("stroke-dasharray",t)}}destroy(){let t,e,i=this,r=i.element||{},s=i.renderer,n=r.ownerSVGElement,a="SPAN"===r.nodeName&&i.parentGroup||void 0;if(r.onclick=r.onmouseout=r.onmouseover=r.onmousemove=r.point=null,o(i),i.clipPath&&n){let t=i.clipPath;[].forEach.call(n.querySelectorAll("[clip-path],[CLIP-PATH]"),(function(e){e.getAttribute("clip-path").indexOf(t.element.id)>-1&&e.removeAttribute("clip-path")})),i.clipPath=t.destroy()}if(i.connector=i.connector?.destroy(),i.stops){for(e=0;ee&&e.join?(i?t+" ":"")+e.join(" "):(e||"").toString()),"")),/(NaN| {2}|^$)/.test(t)&&(t="M 0 0"),this[e]!==t&&(i.setAttribute(e,t),this[e]=t)}fillSetter(t,e,i){"string"==typeof t?i.setAttribute(e,t):t&&this.complexColor(t,e,i)}hrefSetter(t,e,i){i.setAttributeNS("http://www.w3.org/1999/xlink",e,t)}getBBox(t,e){let i,r,s,n,{alignValue:o,element:a,renderer:l,styles:c,textStr:h}=this,{cache:u,cacheKeys:d}=l,p=a.namespaceURI===this.SVG_NS,f=E(e,this.rotation,0),m=l.styledMode?a&&D.prototype.getStyle.call(a,"font-size"):c.fontSize;if(y(h)&&(-1===(n=h.toString()).indexOf("<")&&(n=n.replace(/\d/g,"0")),n+=["",l.rootFontSize,m,f,this.textWidth,o,c.textOverflow,c.fontWeight].join(",")),n&&!t&&(i=u[n]),!i||i.polygon){if(p||l.forExport){try{s=this.fakeTS&&function(t){let e=a.querySelector(".highcharts-text-outline");e&&g(e,{display:t})},w(s)&&s("none"),i=a.getBBox?v({},a.getBBox()):{width:a.offsetWidth,height:a.offsetHeight,x:0,y:0},w(s)&&s("")}catch(t){}(!i||i.width<0)&&(i={x:0,y:0,width:0,height:0})}else i=this.htmlGetBBox();r=i.height,p&&(i.height=r={"11px,17":14,"13px,20":16}[`${m||""},${Math.round(r)}`]||r),f&&(i=this.getRotatedBox(i,f));let e={bBox:i};x(this,"afterGetBBox",e),i=e.bBox}if(n&&(""===h||i.height>0)){for(;d.length>250;)delete u[d.shift()];u[n]||d.push(n),u[n]=i}return i}getRotatedBox(t,e){let{x:i,y:r,width:s,height:n}=t,{alignValue:o,translateY:l,rotationOriginX:c=0,rotationOriginY:h=0}=this,u={right:1,center:.5}[o||0]||0,d=Number(this.element.getAttribute("y")||0)-(l?0:r),p=e*a,f=(e-90)*a,m=Math.cos(p),g=Math.sin(p),y=s*m,_=s*g,v=Math.cos(f),x=Math.sin(f),[[b,w],[S,C]]=[c,h].map((t=>[t-t*m,t*g])),T=i+u*(s-y)+b+C+d*v,k=T+y,E=k-n*v,A=E-y,M=r+d-u*_-w+S+d*x,P=M+_,I=P-n*x,L=I-_,D=Math.min(T,k,E,A),z=Math.min(M,P,I,L);return{x:D,y:z,width:Math.max(T,k,E,A)-D,height:Math.max(M,P,I,L)-z,polygon:[[T,M],[k,P],[E,I],[A,L]]}}getStyle(t){return u.getComputedStyle(this.element||this,"").getPropertyValue(t)}hasClass(t){return-1!==(""+this.attr("class")).split(" ").indexOf(t)}hide(){return this.attr({visibility:"hidden"})}htmlGetBBox(){return{height:0,width:0,x:0,y:0}}constructor(t,e){this.onEvents={},this.opacity=1,this.SVG_NS=h,this.element="span"===e||"body"===e?f(e):l.createElementNS(this.SVG_NS,e),this.renderer=t,this.styles={},x(this,"afterInit")}on(t,e){let{onEvents:i}=this;return i[t]&&i[t](),i[t]=d(this.element,t,e),this}opacitySetter(t,e,i){let r=Number(Number(t).toFixed(3));this.opacity=r,i.setAttribute(e,r)}reAlign(){this.alignOptions?.width&&"left"!==this.alignOptions.align&&(this.alignOptions.width=this.getBBox().width,this.placed=!1,this.align())}removeClass(t){return this.attr("class",(""+this.attr("class")).replace(C(t)?RegExp(`(^| )${t}( |$)`):t," ").replace(/ +/g," ").trim())}removeTextOutline(){let t=this.element.querySelector("tspan.highcharts-text-outline");t&&this.safeRemoveChild(t)}safeRemoveChild(t){let e=t.parentNode;e&&e.removeChild(t)}setRadialReference(t){let e=this.element.gradient&&this.renderer.gradients[this.element.gradient];return this.element.radialReference=t,e&&e.radAttr&&e.animate(this.renderer.getRadialAttr(t,e.radAttr)),this}shadow(t){let{renderer:e}=this,i=T(90===this.parentGroup?.rotation?{offsetX:-1,offsetY:-1}:{},S(t)?t:{}),r=e.shadowDefinition(i);return this.attr({filter:t?`url(${e.url}#${r})`:"none"})}show(t=!0){return this.attr({visibility:t?"inherit":"visible"})}"stroke-widthSetter"(t,e,i){this[e]=t,i.setAttribute(e,t)}strokeWidth(){if(!this.renderer.styledMode)return this["stroke-width"]||0;let t,e=this.getStyle("stroke-width"),i=0;return/px$/.test(e)?i=A(e):""!==e&&(p(t=l.createElementNS(h,"rect"),{width:e,"stroke-width":0}),this.element.parentNode.appendChild(t),i=t.getBBox().width,t.parentNode.removeChild(t)),i}symbolAttr(t){let e=this;D.symbolCustomAttribs.forEach((function(i){e[i]=E(t[i],e[i])})),e.attr({d:e.renderer.symbols[e.symbolName](e.x,e.y,e.width,e.height,e)})}textSetter(t){t!==this.textStr&&(delete this.textPxLength,this.textStr=t,this.added&&this.renderer.buildText(this),this.reAlign())}titleSetter(t){let e=this.element,i=e.getElementsByTagName("title")[0]||l.createElementNS(this.SVG_NS,"title");e.insertBefore?e.insertBefore(i,e.firstChild):e.appendChild(i),i.textContent=P(E(t,""),[/<[^>]*>/g,""]).replace(/</g,"<").replace(/>/g,">")}toFront(){let t=this.element;return t.parentNode.appendChild(t),this}translate(t,e){return this.attr({translateX:t,translateY:e})}updateTransform(t="transform"){let{element:e,matrix:i,rotation:r=0,rotationOriginX:s,rotationOriginY:n,scaleX:o,scaleY:a,translateX:l=0,translateY:c=0}=this,h=["translate("+l+","+c+")"];y(i)&&h.push("matrix("+i.join(",")+")"),r&&(h.push("rotate("+r+" "+E(s,e.getAttribute("x"),0)+" "+E(n,e.getAttribute("y")||0)+")"),"SPAN"===this.text?.element.tagName&&this.text.attr({rotation:r,rotationOriginX:(s||0)-this.padding,rotationOriginY:(n||0)-this.padding})),(y(o)||y(a))&&h.push("scale("+E(o,1)+" "+E(a,1)+")"),h.length&&!(this.text||this).textPath&&e.setAttribute(t,h.join(" "))}visibilitySetter(t,e,i){"inherit"===t?i.removeAttribute(e):this[e]!==t&&i.setAttribute(e,t),this[e]=t}xGetter(t){return"circle"===this.element.nodeName&&("x"===t?t="cx":"y"===t&&(t="cy")),this._defaultGetter(t)}zIndexSetter(t,e){let i,r,s,n,o,a=this.renderer,l=this.parentGroup,c=(l||a).element||a.box,h=this.element,u=c===a.box,d=!1,p=this.added;if(y(t)?(h.setAttribute("data-z-index",t),t=+t,this[e]===t&&(p=!1)):y(this[e])&&h.removeAttribute("data-z-index"),this[e]=t,p){for((t=this.zIndex)&&l&&(l.handleZ=!0),o=(i=c.childNodes).length-1;o>=0&&!d;o--)n=!y(s=(r=i[o]).getAttribute("data-z-index")),r!==h&&(t<0&&n&&!u&&!o?(c.insertBefore(h,i[o]),d=!0):(A(s)<=t||n&&(!y(t)||t>=0))&&(c.insertBefore(h,i[o+1]),d=!0));d||(c.insertBefore(h,i[u?3:0]),d=!0)}return d}}return D.symbolCustomAttribs=["anchorX","anchorY","clockwise","end","height","innerR","r","start","width","x","y"],D.prototype.strokeSetter=D.prototype.fillSetter,D.prototype.yGetter=D.prototype.xGetter,D.prototype.matrixSetter=D.prototype.rotationOriginXSetter=D.prototype.rotationOriginYSetter=D.prototype.rotationSetter=D.prototype.scaleXSetter=D.prototype.scaleYSetter=D.prototype.translateXSetter=D.prototype.translateYSetter=D.prototype.verticalAlignSetter=function(t,e){this[e]=t,this.doTransform=!0},D})),i(e,"Core/Renderer/SVG/SVGLabel.js",[e["Core/Renderer/SVG/SVGElement.js"],e["Core/Utilities.js"]],(function(t,e){let{defined:i,extend:r,isNumber:s,merge:n,pick:o,removeEvent:a}=e;class l extends t{constructor(t,e,i,r,s,n,o,a,c,h){let u;super(t,"g"),this.paddingLeftSetter=this.paddingSetter,this.paddingRightSetter=this.paddingSetter,this.doUpdate=!1,this.textStr=e,this.x=i,this.y=r,this.anchorX=n,this.anchorY=o,this.baseline=c,this.className=h,this.addClass("button"===h?"highcharts-no-tooltip":"highcharts-label"),h&&this.addClass("highcharts-"+h),this.text=t.text(void 0,0,0,a).attr({zIndex:1}),"string"==typeof s&&((u=/^url\((.*?)\)$/.test(s))||this.renderer.symbols[s])&&(this.symbolKey=s),this.bBox=l.emptyBBox,this.padding=3,this.baselineOffset=0,this.needsBox=t.styledMode||u,this.deferredAttr={},this.alignFactor=0}alignSetter(t){let e={left:0,center:.5,right:1}[t];e!==this.alignFactor&&(this.alignFactor=e,this.bBox&&s(this.xSetting)&&this.attr({x:this.xSetting}))}anchorXSetter(t,e){this.anchorX=t,this.boxAttr(e,Math.round(t)-this.getCrispAdjust()-this.xSetting)}anchorYSetter(t,e){this.anchorY=t,this.boxAttr(e,t-this.ySetting)}boxAttr(t,e){this.box?this.box.attr(t,e):this.deferredAttr[t]=e}css(e){if(e){let t={};e=n(e),l.textProps.forEach((i=>{void 0!==e[i]&&(t[i]=e[i],delete e[i])})),this.text.css(t),"fontSize"in t||"fontWeight"in t?this.updateTextPadding():("width"in t||"textOverflow"in t)&&this.updateBoxSize()}return t.prototype.css.call(this,e)}destroy(){a(this.element,"mouseenter"),a(this.element,"mouseleave"),this.text&&this.text.destroy(),this.box&&(this.box=this.box.destroy()),t.prototype.destroy.call(this)}fillSetter(t,e){t&&(this.needsBox=!0),this.fill=t,this.boxAttr(e,t)}getBBox(t,e){this.textStr&&0===this.bBox.width&&0===this.bBox.height&&this.updateBoxSize();let{padding:i,height:r=0,translateX:s=0,translateY:n=0,width:a=0}=this,l=o(this.paddingLeft,i),c=e??(this.rotation||0),h={width:a,height:r,x:s+this.bBox.x-l,y:n+this.bBox.y-i+this.baselineOffset};return c&&(h=this.getRotatedBox(h,c)),h}getCrispAdjust(){return(this.renderer.styledMode&&this.box?this.box.strokeWidth():this["stroke-width"]?parseInt(this["stroke-width"],10):0)%2/2}heightSetter(t){this.heightSetting=t,this.doUpdate=!0}afterSetters(){super.afterSetters(),this.doUpdate&&(this.updateBoxSize(),this.doUpdate=!1)}onAdd(){this.text.add(this),this.attr({text:o(this.textStr,""),x:this.x||0,y:this.y||0}),this.box&&i(this.anchorX)&&this.attr({anchorX:this.anchorX,anchorY:this.anchorY})}paddingSetter(t,e){s(t)?t!==this[e]&&(this[e]=t,this.updateTextPadding()):this[e]=void 0}rSetter(t,e){this.boxAttr(e,t)}strokeSetter(t,e){this.stroke=t,this.boxAttr(e,t)}"stroke-widthSetter"(t,e){t&&(this.needsBox=!0),this["stroke-width"]=t,this.boxAttr(e,t)}"text-alignSetter"(t){this.textAlign=t}textSetter(t){void 0!==t&&this.text.attr({text:t}),this.updateTextPadding(),this.reAlign()}updateBoxSize(){let t,e=this.text,n={},o=this.padding,a=this.bBox=s(this.widthSetting)&&s(this.heightSetting)&&!this.textAlign||!i(e.textStr)?l.emptyBBox:e.getBBox(void 0,0);this.width=this.getPaddedWidth(),this.height=(this.heightSetting||a.height||0)+2*o;let c=this.renderer.fontMetrics(e);if(this.baselineOffset=o+Math.min((this.text.firstLineMetrics||c).b,a.height||1/0),this.heightSetting&&(this.baselineOffset+=(this.heightSetting-c.h)/2),this.needsBox&&!e.textPath){if(!this.box){let t=this.box=this.symbolKey?this.renderer.symbol(this.symbolKey):this.renderer.rect();t.addClass(("button"===this.className?"":"highcharts-label-box")+(this.className?" highcharts-"+this.className+"-box":"")),t.add(this)}t=this.getCrispAdjust(),n.x=t,n.y=(this.baseline?-this.baselineOffset:0)+t,n.width=Math.round(this.width),n.height=Math.round(this.height),this.box.attr(r(n,this.deferredAttr)),this.deferredAttr={}}}updateTextPadding(){let t=this.text;if(!t.textPath){this.updateBoxSize();let e=this.baseline?0:this.baselineOffset,r=o(this.paddingLeft,this.padding);i(this.widthSetting)&&this.bBox&&("center"===this.textAlign||"right"===this.textAlign)&&(r+={center:.5,right:1}[this.textAlign]*(this.widthSetting-this.bBox.width)),(r!==t.x||e!==t.y)&&(t.attr("x",r),t.hasBoxWidthChanged&&(this.bBox=t.getBBox(!0)),void 0!==e&&t.attr("y",e)),t.x=r,t.y=e}}widthSetter(t){this.widthSetting=s(t)?t:void 0,this.doUpdate=!0}getPaddedWidth(){let t=this.padding,e=o(this.paddingLeft,t),i=o(this.paddingRight,t);return(this.widthSetting||this.bBox.width||0)+e+i}xSetter(t){this.x=t,this.alignFactor&&(t-=this.alignFactor*this.getPaddedWidth(),this["forceAnimate:x"]=!0),this.xSetting=Math.round(t),this.attr("translateX",this.xSetting)}ySetter(t){this.ySetting=this.y=Math.round(t),this.attr("translateY",this.ySetting)}}return l.emptyBBox={width:0,height:0,x:0,y:0},l.textProps=["color","direction","fontFamily","fontSize","fontStyle","fontWeight","lineHeight","textAlign","textDecoration","textOutline","textOverflow","whiteSpace","width"],l})),i(e,"Core/Renderer/SVG/Symbols.js",[e["Core/Utilities.js"]],(function(t){let{defined:e,isNumber:i,pick:r}=t;function s(t,i,s,n,o){let a=[];if(o){let l=o.start||0,c=r(o.r,s),h=r(o.r,n||s),u=2e-4/Math.max(c,1),d=Math.abs((o.end||0)-l-2*Math.PI)0&&h0)return u;if(t+c>r-l)if(h>e+l&&he+l&&h0){let i=hs&&cl&&u.splice(1,1,["L",c-6,e],["L",c,e-6],["L",c+6,e],["L",r-a,e]);return u},circle:function(t,e,i,r){return s(t+i/2,e+r/2,i/2,r/2,{start:.5*Math.PI,end:2.5*Math.PI,open:!1})},diamond:function(t,e,i,r){return[["M",t+i/2,e],["L",t+i,e+r/2],["L",t+i/2,e+r],["L",t,e+r/2],["Z"]]},rect:n,roundedRect:o,square:n,triangle:function(t,e,i,r){return[["M",t+i/2,e],["L",t+i,e+r],["L",t,e+r],["Z"]]},"triangle-down":function(t,e,i,r){return[["M",t,e],["L",t+i,e],["L",t+i/2,e+r],["Z"]]}}})),i(e,"Core/Renderer/SVG/TextBuilder.js",[e["Core/Renderer/HTML/AST.js"],e["Core/Globals.js"],e["Core/Utilities.js"]],(function(t,e,i){let{doc:r,SVG_NS:s,win:n}=e,{attr:o,extend:a,fireEvent:l,isString:c,objectEach:h,pick:u}=i;return class{constructor(t){let e=t.styles;this.renderer=t.renderer,this.svgElement=t,this.width=t.textWidth,this.textLineHeight=e&&e.lineHeight,this.textOutline=e&&e.textOutline,this.ellipsis=!(!e||"ellipsis"!==e.textOverflow),this.noWrap=!(!e||"nowrap"!==e.whiteSpace)}buildSVG(){let e=this.svgElement,i=e.element,s=e.renderer,n=u(e.textStr,"").toString(),o=-1!==n.indexOf("<"),a=i.childNodes,l=!e.added&&s.box,h=[n,this.ellipsis,this.noWrap,this.textLineHeight,this.textOutline,e.getStyle("font-size"),this.width].join(",");if(h!==e.textCache){e.textCache=h,delete e.actualWidth;for(let t=a.length;t--;)i.removeChild(a[t]);if(o||this.ellipsis||this.width||e.textPath||-1!==n.indexOf(" ")&&(!this.noWrap||//g.test(n))){if(""!==n){l&&l.appendChild(i);let r=new t(n);this.modifyTree(r.nodes),r.addToDOM(i),this.modifyDOM(),this.ellipsis&&-1!==(i.textContent||"").indexOf("…")&&e.attr("title",this.unescapeEntities(e.textStr||"",["<",">"])),l&&l.removeChild(i)}}else i.appendChild(r.createTextNode(this.unescapeEntities(n)));c(this.textOutline)&&e.applyTextOutline&&e.applyTextOutline(this.textOutline)}}modifyDOM(){let t,e=this.svgElement,i=o(e.element,"x");for(e.firstLineMetrics=void 0;(t=e.element.firstChild)&&/^[\s\u200B]*$/.test(t.textContent||" ");)e.element.removeChild(t);[].forEach.call(e.element.querySelectorAll("tspan.highcharts-br"),((t,r)=>{t.nextSibling&&t.previousSibling&&(0===r&&1===t.previousSibling.nodeType&&(e.firstLineMetrics=e.renderer.fontMetrics(t.previousSibling)),o(t,{dy:this.getLineHeight(t.nextSibling),x:i}))}));let a=this.width||0;if(!a)return;let l=(t,n)=>{let l=t.textContent||"",c=l.replace(/([^\^])-/g,"$1- ").split(" "),h=!this.noWrap&&(c.length>1||e.element.childNodes.length>1),u=this.getLineHeight(n),d=0,p=e.actualWidth;if(this.ellipsis)l&&this.truncate(t,l,void 0,0,Math.max(0,a-.8*u),((t,e)=>t.substring(0,e)+"…"));else if(h){let l=[],h=[];for(;n.firstChild&&n.firstChild!==t;)h.push(n.firstChild),n.removeChild(n.firstChild);for(;c.length;)c.length&&!this.noWrap&&d>0&&(l.push(t.textContent||""),t.textContent=c.join(" ").replace(/- /g,"-")),this.truncate(t,void 0,c,0===d&&p||0,a,((t,e)=>c.slice(0,e).join(" ").replace(/- /g,"-"))),p=e.actualWidth,d++;h.forEach((e=>{n.insertBefore(e,t)})),l.forEach((e=>{n.insertBefore(r.createTextNode(e),t);let a=r.createElementNS(s,"tspan");a.textContent="​",o(a,{dy:u,x:i}),n.insertBefore(a,t)}))}},c=t=>{[].slice.call(t.childNodes).forEach((i=>{i.nodeType===n.Node.TEXT_NODE?l(i,t):(-1!==i.className.baseVal.indexOf("highcharts-br")&&(e.actualWidth=0),c(i))}))};c(e.element)}getLineHeight(t){let e=t.nodeType===n.Node.TEXT_NODE?t.parentElement:t;return this.textLineHeight?parseInt(this.textLineHeight.toString(),10):this.renderer.fontMetrics(e||this.svgElement.element).h}modifyTree(t){let e=(i,r)=>{let{attributes:s={},children:n,style:o={},tagName:l}=i,c=this.renderer.styledMode;if("b"===l||"strong"===l?c?s.class="highcharts-strong":o.fontWeight="bold":("i"===l||"em"===l)&&(c?s.class="highcharts-emphasized":o.fontStyle="italic"),o&&o.color&&(o.fill=o.color),"br"===l){s.class="highcharts-br",i.textContent="​";let e=t[r+1];e&&e.textContent&&(e.textContent=e.textContent.replace(/^ +/gm,""))}else"a"===l&&n&&n.some((t=>"#text"===t.tagName))&&(i.children=[{children:n,tagName:"tspan"}]);"#text"!==l&&"a"!==l&&(i.tagName="tspan"),a(i,{attributes:s,style:o}),n&&n.filter((t=>"#text"!==t.tagName)).forEach(e)};t.forEach(e),l(this.svgElement,"afterModifyTree",{nodes:t})}truncate(t,e,i,r,s,n){let o,a,l=this.svgElement,{rotation:c}=l,h=[],u=i?1:0,d=(e||i||"").length,p=d,f=function(e,s){let n=s||e,o=t.parentNode;if(o&&void 0===h[n]&&o.getSubStringLength)try{h[n]=r+o.getSubStringLength(0,i?n+1:n)}catch(t){}return h[n]};if(l.rotation=0,r+(a=f(t.textContent.length))>s){for(;u<=d;)p=Math.ceil((u+d)/2),i&&(o=n(i,p)),a=f(p,o&&o.length-1),u===d?u=d+1:a>s?d=p-1:u=p;0===d?t.textContent="":e&&d===e.length-1||(t.textContent=o||n(e||i,p))}i&&i.splice(0,p),l.actualWidth=a,l.rotation=c}unescapeEntities(t,e){return h(this.renderer.escapes,(function(i,r){e&&-1!==e.indexOf(i)||(t=t.toString().replace(RegExp(i,"g"),r))})),t}}})),i(e,"Core/Renderer/SVG/SVGRenderer.js",[e["Core/Renderer/HTML/AST.js"],e["Core/Defaults.js"],e["Core/Color/Color.js"],e["Core/Globals.js"],e["Core/Renderer/RendererRegistry.js"],e["Core/Renderer/SVG/SVGElement.js"],e["Core/Renderer/SVG/SVGLabel.js"],e["Core/Renderer/SVG/Symbols.js"],e["Core/Renderer/SVG/TextBuilder.js"],e["Core/Utilities.js"]],(function(t,e,i,r,s,n,o,a,l,c){let h,{defaultOptions:u}=e,{charts:d,deg2rad:p,doc:f,isFirefox:m,isMS:g,isWebKit:y,noop:_,SVG_NS:v,symbolSizes:x,win:b}=r,{addEvent:w,attr:S,createElement:C,crisp:T,css:k,defined:E,destroyObjectProperties:A,extend:M,isArray:P,isNumber:I,isObject:L,isString:D,merge:z,pick:O,pInt:R,replaceNested:N,uniqueKey:B}=c;class F{constructor(t,e,i,r,s,n,o){let a,l,c=this.createElement("svg").attr({version:"1.1",class:"highcharts-root"}),h=c.element;o||c.css(this.getStyle(r||{})),t.appendChild(h),S(t,"dir","ltr"),-1===t.innerHTML.indexOf("xmlns")&&S(h,"xmlns",this.SVG_NS),this.box=h,this.boxWrapper=c,this.alignedObjects=[],this.url=this.getReferenceURL(),this.createElement("desc").add().element.appendChild(f.createTextNode("Created with Highcharts 11.4.6")),this.defs=this.createElement("defs").add(),this.allowHTML=n,this.forExport=s,this.styledMode=o,this.gradients={},this.cache={},this.cacheKeys=[],this.imgCount=0,this.rootFontSize=c.getStyle("font-size"),this.setSize(e,i,!1),m&&t.getBoundingClientRect&&((a=function(){k(t,{left:0,top:0}),l=t.getBoundingClientRect(),k(t,{left:Math.ceil(l.left)-l.left+"px",top:Math.ceil(l.top)-l.top+"px"})})(),this.unSubPixelFix=w(b,"resize",a))}definition(e){return new t([e]).addToDOM(this.defs.element)}getReferenceURL(){if((m||y)&&f.getElementsByTagName("base").length){if(!E(h)){let e=B(),i=new t([{tagName:"svg",attributes:{width:8,height:8},children:[{tagName:"defs",children:[{tagName:"clipPath",attributes:{id:e},children:[{tagName:"rect",attributes:{width:4,height:4}}]}]},{tagName:"rect",attributes:{id:"hitme",width:8,height:8,"clip-path":`url(#${e})`,fill:"rgba(0,0,0,0.001)"}}]}]).addToDOM(f.body);k(i,{position:"fixed",top:0,left:0,zIndex:9e5});let r=f.elementFromPoint(6,6);h="hitme"===(r&&r.id),f.body.removeChild(i)}if(h)return N(b.location.href.split("#")[0],[/<[^>]*>/g,""],[/([\('\)])/g,"\\$1"],[/ /g,"%20"])}return""}getStyle(t){return this.style=M({fontFamily:"Helvetica, Arial, sans-serif",fontSize:"1rem"},t),this.style}setStyle(t){this.boxWrapper.css(this.getStyle(t))}isHidden(){return!this.boxWrapper.getBBox().width}destroy(){let t=this.defs;return this.box=null,this.boxWrapper=this.boxWrapper.destroy(),A(this.gradients||{}),this.gradients=null,this.defs=t.destroy(),this.unSubPixelFix&&this.unSubPixelFix(),this.alignedObjects=null,null}createElement(t){return new this.Element(this,t)}getRadialAttr(t,e){return{cx:t[0]-t[2]/2+(e.cx||0)*t[2],cy:t[1]-t[2]/2+(e.cy||0)*t[2],r:(e.r||0)*t[2]}}shadowDefinition(t){let e=[`highcharts-drop-shadow-${this.chartIndex}`,...Object.keys(t).map((e=>`${e}-${t[e]}`))].join("-").toLowerCase().replace(/[^a-z\d\-]/g,""),i=z({color:"#000000",offsetX:1,offsetY:1,opacity:.15,width:5},t);return this.defs.element.querySelector(`#${e}`)||this.definition({tagName:"filter",attributes:{id:e,filterUnits:i.filterUnits},children:this.getShadowFilterContent(i)}),e}getShadowFilterContent(t){return[{tagName:"feDropShadow",attributes:{dx:t.offsetX,dy:t.offsetY,"flood-color":t.color,"flood-opacity":Math.min(5*t.opacity,1),stdDeviation:t.width/2}}]}buildText(t){new l(t).buildSVG()}getContrast(t){let e=i.parse(t).rgba.map((t=>{let e=t/255;return e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4)})),r=.2126*e[0]+.7152*e[1]+.0722*e[2];return 1.05/(r+.05)>(r+.05)/.05?"#FFFFFF":"#000000"}button(e,i,r,s,n={},o,a,l,c,h){let d=this.label(e,i,r,c,void 0,void 0,h,void 0,"button"),p=this.styledMode,f=arguments,m=0;n=z(u.global.buttonTheme,n),p&&(delete n.fill,delete n.stroke,delete n["stroke-width"]);let y=n.states||{},_=n.style||{};delete n.states,delete n.style;let v=[t.filterUserAttributes(n)],x=[_];return p||["hover","select","disabled"].forEach(((e,i)=>{v.push(z(v[0],t.filterUserAttributes(f[i+5]||y[e]||{}))),x.push(v[i+1].style),delete v[i+1].style})),w(d.element,g?"mouseover":"mouseenter",(function(){3!==m&&d.setState(1)})),w(d.element,g?"mouseout":"mouseleave",(function(){3!==m&&d.setState(m)})),d.setState=(t=0)=>{if(1!==t&&(d.state=m=t),d.removeClass(/highcharts-button-(normal|hover|pressed|disabled)/).addClass("highcharts-button-"+["normal","hover","pressed","disabled"][t]),!p){d.attr(v[t]);let e=x[t];L(e)&&d.css(e)}},d.attr(v[0]),!p&&(d.css(M({cursor:"default"},_)),h&&d.text.css({pointerEvents:"none"})),d.on("touchstart",(t=>t.stopPropagation())).on("click",(function(t){3!==m&&s.call(d,t)}))}crispLine(t,e){let[i,r]=t;return E(i[1])&&i[1]===r[1]&&(i[1]=r[1]=T(i[1],e)),E(i[2])&&i[2]===r[2]&&(i[2]=r[2]=T(i[2],e)),t}path(t){let e=this.styledMode?{}:{fill:"none"};return P(t)?e.d=t:L(t)&&M(e,t),this.createElement("path").attr(e)}circle(t,e,i){let r=L(t)?t:void 0===t?{}:{x:t,y:e,r:i},s=this.createElement("circle");return s.xSetter=s.ySetter=function(t,e,i){i.setAttribute("c"+e,t)},s.attr(r)}arc(t,e,i,r,s,n){let o;L(t)?(e=(o=t).y,i=o.r,r=o.innerR,s=o.start,n=o.end,t=o.x):o={innerR:r,start:s,end:n};let a=this.symbol("arc",t,e,i,i,o);return a.r=i,a}rect(t,e,i,r,s,n){let o=L(t)?t:void 0===t?{}:{x:t,y:e,r:s,width:Math.max(i||0,0),height:Math.max(r||0,0)},a=this.createElement("rect");return this.styledMode||(void 0!==n&&(o["stroke-width"]=n,M(o,a.crisp(o))),o.fill="none"),a.rSetter=function(t,e,i){a.r=t,S(i,{rx:t,ry:t})},a.rGetter=function(){return a.r||0},a.attr(o)}roundedRect(t){return this.symbol("roundedRect").attr(t)}setSize(t,e,i){this.width=t,this.height=e,this.boxWrapper.animate({width:t,height:e},{step:function(){this.attr({viewBox:"0 0 "+this.attr("width")+" "+this.attr("height")})},duration:O(i,!0)?void 0:0}),this.alignElements()}g(t){let e=this.createElement("g");return t?e.attr({class:"highcharts-"+t}):e}image(t,e,i,r,s,n){let o={preserveAspectRatio:"none"};I(e)&&(o.x=e),I(i)&&(o.y=i),I(r)&&(o.width=r),I(s)&&(o.height=s);let a=this.createElement("image").attr(o),l=function(e){a.attr({href:t}),n.call(a,e)};if(n){a.attr({href:"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="});let e=new b.Image;w(e,"load",l),e.src=t,e.complete&&l({})}else a.attr({href:t});return a}symbol(t,e,i,r,s,n){let o,a,l,c,h=this,u=/^url\((.*?)\)$/,p=u.test(t),m=!p&&(this.symbols[t]?t:"circle"),g=m&&this.symbols[m];if(g)"number"==typeof e&&(a=g.call(this.symbols,e||0,i||0,r||0,s||0,n)),o=this.path(a),h.styledMode||o.attr("fill","none"),M(o,{symbolName:m||void 0,x:e,y:i,width:r,height:s}),n&&M(o,n);else if(p){l=t.match(u)[1];let r=o=this.image(l);r.imgwidth=O(n&&n.width,x[l]&&x[l].width),r.imgheight=O(n&&n.height,x[l]&&x[l].height),c=t=>t.attr({width:t.width,height:t.height}),["width","height"].forEach((t=>{r[`${t}Setter`]=function(t,e){this[e]=t;let{alignByTranslate:i,element:r,width:s,height:o,imgwidth:a,imgheight:l}=this,c="width"===e?a:l,h=1;n&&"within"===n.backgroundSize&&s&&o&&a&&l?(h=Math.min(s/a,o/l),S(r,{width:Math.round(a*h),height:Math.round(l*h)})):r&&c&&r.setAttribute(e,c),!i&&a&&l&&this.translate(((s||0)-a*h)/2,((o||0)-l*h)/2)}})),E(e)&&r.attr({x:e,y:i}),r.isImg=!0,E(r.imgwidth)&&E(r.imgheight)?c(r):(r.attr({width:0,height:0}),C("img",{onload:function(){let t=d[h.chartIndex];0===this.width&&(k(this,{position:"absolute",top:"-999em"}),f.body.appendChild(this)),x[l]={width:this.width,height:this.height},r.imgwidth=this.width,r.imgheight=this.height,r.element&&c(r),this.parentNode&&this.parentNode.removeChild(this),h.imgCount--,h.imgCount||!t||t.hasLoaded||t.onload()},src:l}),this.imgCount++)}return o}clipRect(t,e,i,r){return this.rect(t,e,i,r,0)}text(t,e,i,r){let s={};if(r&&(this.allowHTML||!this.forExport))return this.html(t,e,i);s.x=Math.round(e||0),i&&(s.y=Math.round(i)),E(t)&&(s.text=t);let n=this.createElement("text").attr(s);return r&&(!this.forExport||this.allowHTML)||(n.xSetter=function(t,e,i){let r=i.getElementsByTagName("tspan"),s=i.getAttribute(e);for(let i,n=0;nt.align()))}}return M(F.prototype,{Element:n,SVG_NS:v,escapes:{"&":"&","<":"<",">":">","'":"'",'"':"""},symbols:a,draw:_}),s.registerRendererType("svg",F,!0),F})),i(e,"Core/Renderer/HTML/HTMLElement.js",[e["Core/Renderer/HTML/AST.js"],e["Core/Globals.js"],e["Core/Renderer/SVG/SVGElement.js"],e["Core/Utilities.js"]],(function(t,e,i,r){let{composed:s}=e,{attr:n,css:o,createElement:a,defined:l,extend:c,pInt:h,pushUnique:u}=r;function d(t,e,r){let s=this.div?.style||r.style;i.prototype[`${e}Setter`].call(this,t,e,r),s&&(s[e]=t)}let p=(t,e)=>{if(!t.div){let r=n(t.element,"class"),s=t.css,o=a("div",r?{className:r}:void 0,{position:"absolute",left:`${t.translateX||0}px`,top:`${t.translateY||0}px`,...t.styles,display:t.display,opacity:t.opacity,visibility:t.visibility},t.parentGroup?.div||e);t.classSetter=(t,e,i)=>{i.setAttribute("class",t),o.className=t},t.translateXSetter=t.translateYSetter=(e,i)=>{t[i]=e,o.style["translateX"===i?"left":"top"]=`${e}px`,t.doTransform=!0},t.opacitySetter=t.visibilitySetter=d,t.css=e=>(s.call(t,e),e.cursor&&(o.style.cursor=e.cursor),e.pointerEvents&&(o.style.pointerEvents=e.pointerEvents),t),t.on=function(){return i.prototype.on.apply({element:o,onEvents:t.onEvents},arguments),t},t.div=o}return t.div};class f extends i{static compose(t){u(s,this.compose)&&(t.prototype.html=function(t,e,i){return new f(this,"span").attr({text:t,x:Math.round(e),y:Math.round(i)})})}constructor(t,e){super(t,e),this.css({position:"absolute",...t.styledMode?{}:{fontFamily:t.style.fontFamily,fontSize:t.style.fontSize}}),this.element.style.whiteSpace="nowrap"}getSpanCorrection(t,e,i){this.xCorr=-t*i,this.yCorr=-e}css(t){let e,{element:i}=this,r="SPAN"===i.tagName&&t&&"width"in t,s=r&&t.width;return r&&(delete t.width,this.textWidth=h(s)||void 0,e=!0),"ellipsis"===t?.textOverflow&&(t.whiteSpace="nowrap",t.overflow="hidden"),c(this.styles,t),o(i,t),e&&this.updateTransform(),this}htmlGetBBox(){let{element:t}=this;return{x:t.offsetLeft,y:t.offsetTop,width:t.offsetWidth,height:t.offsetHeight}}updateTransform(){if(!this.added)return void(this.alignOnAdd=!0);let{element:t,renderer:e,rotation:i,rotationOriginX:r,rotationOriginY:s,styles:n,textAlign:a="left",textWidth:c,translateX:h=0,translateY:u=0,x:d=0,y:p=0}=this,f={left:0,center:.5,right:1}[a],m=n.whiteSpace;if(o(t,{marginLeft:`${h}px`,marginTop:`${u}px`}),"SPAN"===t.tagName){let n,h=[i,a,t.innerHTML,c,this.textAlign].join(","),u=-1*this.parentGroup?.padding||0,g=!1;if(c!==this.oldTextWidth){let e=this.textPxLength?this.textPxLength:(o(t,{width:"",whiteSpace:m||"nowrap"}),t.offsetWidth),r=c||0;(r>this.oldTextWidth||e>r)&&(/[ \-]/.test(t.textContent||t.innerText)||"ellipsis"===t.style.textOverflow)&&(o(t,{width:e>r||i?c+"px":"auto",display:"block",whiteSpace:m||"normal"}),this.oldTextWidth=c,g=!0)}this.hasBoxWidthChanged=g,h!==this.cTT&&(n=e.fontMetrics(t).b,l(i)&&(i!==(this.oldRotation||0)||a!==this.oldAlign)&&this.setSpanRotation(i,u,u),this.getSpanCorrection(!l(i)&&this.textPxLength||t.offsetWidth,n,f));let{xCorr:y=0,yCorr:_=0}=this;o(t,{left:`${d+y}px`,top:`${p+_}px`,transformOrigin:`${(r??d)-y-d-u}px ${(s??p)-_-p-u}px`}),this.cTT=h,this.oldRotation=i,this.oldAlign=a}}setSpanRotation(t,e,i){o(this.element,{transform:`rotate(${t}deg)`,transformOrigin:`${e}% ${i}px`})}add(t){let e,i=this.renderer.box.parentNode,r=[];if(this.parentGroup=t,t&&!(e=t.div)){let s=t;for(;s;)r.push(s),s=s.parentGroup;for(let t of r.reverse())e=p(t,i)}return(e||i).appendChild(this.element),this.added=!0,this.alignOnAdd&&this.updateTransform(),this}textSetter(e){e!==this.textStr&&(delete this.bBox,delete this.oldTextWidth,t.setElementHTML(this.element,e??""),this.textStr=e,this.doTransform=!0)}alignSetter(t){this.alignValue=this.textAlign=t,this.doTransform=!0}xSetter(t,e){this[e]=t,this.doTransform=!0}}let m=f.prototype;return m.visibilitySetter=m.opacitySetter=d,m.ySetter=m.rotationSetter=m.rotationOriginXSetter=m.rotationOriginYSetter=m.xSetter,f})),i(e,"Core/Axis/AxisDefaults.js",[],(function(){var t,e;return(e=t||(t={})).xAxis={alignTicks:!0,allowDecimals:void 0,panningEnabled:!0,zIndex:2,zoomEnabled:!0,dateTimeLabelFormats:{millisecond:{main:"%H:%M:%S.%L",range:!1},second:{main:"%H:%M:%S",range:!1},minute:{main:"%H:%M",range:!1},hour:{main:"%H:%M",range:!1},day:{main:"%e %b"},week:{main:"%e %b"},month:{main:"%b '%y"},year:{main:"%Y"}},endOnTick:!1,gridLineDashStyle:"Solid",gridZIndex:1,labels:{autoRotationLimit:80,distance:15,enabled:!0,indentation:10,overflow:"justify",reserveSpace:void 0,rotation:void 0,staggerLines:0,step:0,useHTML:!1,zIndex:7,style:{color:"#333333",cursor:"default",fontSize:"0.8em"}},maxPadding:.01,minorGridLineDashStyle:"Solid",minorTickLength:2,minorTickPosition:"outside",minorTicksPerMajor:5,minPadding:.01,offset:void 0,reversed:void 0,reversedStacks:!1,showEmpty:!0,showFirstLabel:!0,showLastLabel:!0,startOfWeek:1,startOnTick:!1,tickLength:10,tickPixelInterval:100,tickmarkPlacement:"between",tickPosition:"outside",title:{align:"middle",useHTML:!1,x:0,y:0,style:{color:"#666666",fontSize:"0.8em"}},type:"linear",uniqueNames:!0,visible:!0,minorGridLineColor:"#f2f2f2",minorGridLineWidth:1,minorTickColor:"#999999",lineColor:"#333333",lineWidth:1,gridLineColor:"#e6e6e6",gridLineWidth:void 0,tickColor:"#333333"},e.yAxis={reversedStacks:!0,endOnTick:!0,maxPadding:.05,minPadding:.05,tickPixelInterval:72,showLastLabel:!0,labels:{x:void 0},startOnTick:!0,title:{text:"Values"},stackLabels:{animation:{},allowOverlap:!1,enabled:!1,crop:!0,overflow:"justify",formatter:function(){let{numberFormatter:t}=this.axis.chart;return t(this.total||0,-1)},style:{color:"#000000",fontSize:"0.7em",fontWeight:"bold",textOutline:"1px contrast"}},gridLineWidth:1,lineWidth:0},t})),i(e,"Core/Foundation.js",[e["Core/Utilities.js"]],(function(t){var e;let{addEvent:i,isFunction:r,objectEach:s,removeEvent:n}=t;return(e||(e={})).registerEventOptions=function(t,e){t.eventOptions=t.eventOptions||{},s(e.events,(function(e,s){t.eventOptions[s]!==e&&(t.eventOptions[s]&&(n(t,s,t.eventOptions[s]),delete t.eventOptions[s]),r(e)&&(t.eventOptions[s]=e,i(t,s,e,{order:0})))}))},e})),i(e,"Core/Axis/Tick.js",[e["Core/Templating.js"],e["Core/Globals.js"],e["Core/Utilities.js"]],(function(t,e,i){let{deg2rad:r}=e,{clamp:s,correctFloat:n,defined:o,destroyObjectProperties:a,extend:l,fireEvent:c,isNumber:h,merge:u,objectEach:d,pick:p}=i;return class{constructor(t,e,i,r,s){this.isNew=!0,this.isNewLabel=!0,this.axis=t,this.pos=e,this.type=i||"",this.parameters=s||{},this.tickmarkOffset=this.parameters.tickmarkOffset,this.options=this.parameters.options,c(this,"init"),i||r||this.addLabel()}addLabel(){let e,i,r,s=this,a=s.axis,u=a.options,d=a.chart,f=a.categories,m=a.logarithmic,g=a.names,y=s.pos,_=p(s.options&&s.options.labels,u.labels),v=a.tickPositions,x=y===v[0],b=y===v[v.length-1],w=(!_.step||1===_.step)&&1===a.tickInterval,S=v.info,C=s.label,T=this.parameters.category||(f?p(f[y],g[y],y):y);m&&h(T)&&(T=n(m.lin2log(T))),a.dateTime&&(S?e=(i=d.time.resolveDTLFormat(u.dateTimeLabelFormats[!u.grid&&S.higherRanks[y]||S.unitName])).main:h(T)&&(e=a.dateTime.getXDateFormat(T,u.dateTimeLabelFormats||{}))),s.isFirst=x,s.isLast=b;let k={axis:a,chart:d,dateTimeLabelFormat:e,isFirst:x,isLast:b,pos:y,tick:s,tickPositionInfo:S,value:T};c(this,"labelFormat",k);let E=e=>_.formatter?_.formatter.call(e,e):_.format?(e.text=a.defaultLabelFormatter.call(e),t.format(_.format,e,d)):a.defaultLabelFormatter.call(e),A=E.call(k,k),M=i&&i.list;s.shortenLabel=M?function(){for(r=0;r0&&a+m*g>u&&(s=Math.round((l-a)/Math.cos(f*r))):(e=a-m*g,i=a+(1-m)*g,eu&&(v=u-t.x+v*m,x=-1),(v=Math.min(y,v))v||n.autoRotation&&(d.styles||{}).width)&&(s=v)),s&&(this.shortenLabel?this.shortenLabel():(_.width=Math.floor(s)+"px",(o.style||{}).textOverflow||(_.textOverflow="ellipsis"),d.css(_)))}moveLabel(t,e){let i,r=this,s=r.label,n=r.axis,o=!1;s&&s.textStr===t?(r.movedLabel=s,o=!0,delete r.label):d(n.ticks,(function(e){o||e.isNew||e===r||!e.label||e.label.textStr!==t||(r.movedLabel=e.label,o=!0,e.labelPos=r.movedLabel.xy,delete e.label)})),!o&&(r.labelPos||s)&&(i=r.labelPos||s.xy,r.movedLabel=r.createLabel(t,e,i),r.movedLabel&&r.movedLabel.attr({opacity:0}))}render(t,e,i){let r=this.axis,s=r.horiz,o=this.pos,a=p(this.tickmarkOffset,r.tickmarkOffset),l=this.getPosition(s,o,a,e),h=l.x,u=l.y,d=r.pos,f=d+r.len,m=s?h:u;!r.chart.polar&&this.isNew&&(n(m)f)&&(i=0);let g=p(i,this.label&&this.label.newOpacity,1);i=p(i,1),this.isActive=!0,this.renderGridLine(e,i),this.renderMark(l,i),this.renderLabel(l,e,g,t),this.isNew=!1,c(this,"afterRender")}renderGridLine(t,e){let i,r=this.axis,s=r.options,n={},o=this.pos,a=this.type,l=p(this.tickmarkOffset,r.tickmarkOffset),c=r.chart.renderer,h=this.gridLine,u=s.gridLineWidth,d=s.gridLineColor,f=s.gridLineDashStyle;"minor"===this.type&&(u=s.minorGridLineWidth,d=s.minorGridLineColor,f=s.minorGridLineDashStyle),h||(r.chart.styledMode||(n.stroke=d,n["stroke-width"]=u||0,n.dashstyle=f),a||(n.zIndex=1),t&&(e=0),this.gridLine=h=c.path().attr(n).addClass("highcharts-"+(a?a+"-":"")+"grid-line").add(r.gridGroup)),h&&(i=r.getPlotLinePath({value:o+l,lineWidth:h.strokeWidth(),force:"pass",old:t,acrossPanes:!1}))&&h[t||this.isNew?"attr":"animate"]({d:i,opacity:e})}renderMark(t,e){let i=this.axis,r=i.options,s=i.chart.renderer,n=this.type,o=i.tickSize(n?n+"Tick":"tick"),a=t.x,l=t.y,c=p(r["minor"!==n?"tickWidth":"minorTickWidth"],!n&&i.isXAxis?1:0),h=r["minor"!==n?"tickColor":"minorTickColor"],u=this.mark,d=!u;o&&(i.opposite&&(o[0]=-o[0]),u||(this.mark=u=s.path().addClass("highcharts-"+(n?n+"-":"")+"tick").add(i.axisGroup),i.chart.styledMode||u.attr({stroke:h,"stroke-width":c})),u[d?"attr":"animate"]({d:this.getMarkPath(a,l,o[0],u.strokeWidth(),i.horiz,s),opacity:e}))}renderLabel(t,e,i,r){let s=this.axis,n=s.horiz,o=s.options,a=this.label,l=o.labels,c=l.step,u=p(this.tickmarkOffset,s.tickmarkOffset),d=t.x,f=t.y,m=!0;a&&h(d)&&(a.xy=t=this.getLabelPosition(d,f,a,n,l,u,r,c),this.isFirst&&!this.isLast&&!o.showFirstLabel||this.isLast&&!this.isFirst&&!o.showLastLabel?m=!1:!n||l.step||l.rotation||e||0===i||this.handleOverflow(t),c&&r%c&&(m=!1),m&&h(t.y)?(t.opacity=i,a[this.isNewLabel?"attr":"animate"](t).show(!0),this.isNewLabel=!1):(a.hide(),this.isNewLabel=!0))}replaceMovedLabel(){let t=this.label,e=this.axis;t&&!this.isNew&&(t.animate({opacity:0},void 0,t.destroy),delete this.label),e.isDirty=!0,this.label=this.movedLabel,delete this.movedLabel}}})),i(e,"Core/Axis/Axis.js",[e["Core/Animation/AnimationUtilities.js"],e["Core/Axis/AxisDefaults.js"],e["Core/Color/Color.js"],e["Core/Defaults.js"],e["Core/Foundation.js"],e["Core/Globals.js"],e["Core/Axis/Tick.js"],e["Core/Utilities.js"]],(function(t,e,i,r,s,n,o,a){let{animObject:l}=t,{xAxis:c,yAxis:h}=e,{defaultOptions:u}=r,{registerEventOptions:d}=s,{deg2rad:p}=n,{arrayMax:f,arrayMin:m,clamp:g,correctFloat:y,defined:_,destroyObjectProperties:v,erase:x,error:b,extend:w,fireEvent:S,getClosestDistance:C,insertItem:T,isArray:k,isNumber:E,isString:A,merge:M,normalizeTickInterval:P,objectEach:I,pick:L,relativeLength:D,removeEvent:z,splat:O,syncTimeout:R}=a,N=(t,e)=>P(e,void 0,void 0,L(t.options.allowDecimals,e<.5||void 0!==t.tickAmount),!!t.tickAmount);w(u,{xAxis:c,yAxis:M(c,h)});class B{constructor(t,e,i){this.init(t,e,i)}init(t,e,i=this.coll){let r="xAxis"===i,s=this.isZAxis||(t.inverted?!r:r);this.chart=t,this.horiz=s,this.isXAxis=r,this.coll=i,S(this,"init",{userOptions:e}),this.opposite=L(e.opposite,this.opposite),this.side=L(e.side,this.side,s?this.opposite?0:2:this.opposite?1:3),this.setOptions(e);let n=this.options,o=n.labels,a=n.type;this.userOptions=e,this.minPixelPadding=0,this.reversed=L(n.reversed,this.reversed),this.visible=n.visible,this.zoomEnabled=n.zoomEnabled,this.hasNames="category"===a||!0===n.categories,this.categories=k(n.categories)&&n.categories||(this.hasNames?[]:void 0),this.names||(this.names=[],this.names.keys={}),this.plotLinesAndBandsGroups={},this.positiveValuesOnly=!!this.logarithmic,this.isLinked=_(n.linkedTo),this.ticks={},this.labelEdge=[],this.minorTicks={},this.plotLinesAndBands=[],this.alternateBands={},this.len??(this.len=0),this.minRange=this.userMinRange=n.minRange||n.maxZoom,this.range=n.range,this.offset=n.offset||0,this.max=void 0,this.min=void 0;let l=L(n.crosshair,O(t.options.tooltip.crosshairs)[r?0:1]);this.crosshair=!0===l?{}:l,-1===t.axes.indexOf(this)&&(r?t.axes.splice(t.xAxis.length,0,this):t.axes.push(this),T(this,t[this.coll])),t.orderItems(this.coll),this.series=this.series||[],t.inverted&&!this.isZAxis&&r&&!_(this.reversed)&&(this.reversed=!0),this.labelRotation=E(o.rotation)?o.rotation:void 0,d(this,n),S(this,"afterInit")}setOptions(t){let e=this.horiz?{labels:{autoRotation:[-45],padding:4},margin:15}:{labels:{padding:1},title:{rotation:90*this.side}};this.options=M(e,u[this.coll],t),S(this,"afterSetOptions",{userOptions:t})}defaultLabelFormatter(){let t,e,i=this.axis,{numberFormatter:r}=this.chart,s=E(this.value)?this.value:NaN,n=i.chart.time,o=i.categories,a=this.dateTimeLabelFormat,l=u.lang,c=l.numericSymbols,h=l.numericSymbolMagnitude||1e3,d=i.logarithmic?Math.abs(s):i.tickInterval,p=c&&c.length;if(o)e=`${this.value}`;else if(a)e=n.dateFormat(a,s);else if(p&&c&&d>=1e3)for(;p--&&void 0===e;)d>=(t=Math.pow(h,p+1))&&10*s%t==0&&null!==c[p]&&0!==s&&(e=r(s/t,-1)+c[p]);return void 0===e&&(e=Math.abs(s)>=1e4?r(s,-1):r(s,-1,void 0,"")),e}getSeriesExtremes(){let t,e=this;S(this,"getSeriesExtremes",null,(function(){e.hasVisibleSeries=!1,e.dataMin=e.dataMax=e.threshold=void 0,e.softThreshold=!e.isXAxis,e.series.forEach((i=>{if(i.reserveSpace()){let r,s,n,o=i.options,a=o.threshold;if(e.hasVisibleSeries=!0,e.positiveValuesOnly&&0>=(a||0)&&(a=void 0),e.isXAxis)(r=i.xData)&&r.length&&(r=e.logarithmic?r.filter((t=>t>0)):r,s=(t=i.getXExtremes(r)).min,n=t.max,E(s)||s instanceof Date||(r=r.filter(E),s=(t=i.getXExtremes(r)).min,n=t.max),r.length&&(e.dataMin=Math.min(L(e.dataMin,s),s),e.dataMax=Math.max(L(e.dataMax,n),n)));else{let t=i.applyExtremes();E(t.dataMin)&&(s=t.dataMin,e.dataMin=Math.min(L(e.dataMin,s),s)),E(t.dataMax)&&(n=t.dataMax,e.dataMax=Math.max(L(e.dataMax,n),n)),_(a)&&(e.threshold=a),(!o.softThreshold||e.positiveValuesOnly)&&(e.softThreshold=!1)}}}))})),S(this,"afterGetSeriesExtremes")}translate(t,e,i,r,s,n){let o=this.linkedParent||this,a=r&&o.old?o.old.min:o.min;if(!E(a))return NaN;let l=o.minPixelPadding,c=(o.isOrdinal||o.brokenAxis?.hasBreaks||o.logarithmic&&s)&&o.lin2val,h=1,u=0,d=r&&o.old?o.old.transA:o.transA,p=0;return d||(d=o.transA),i&&(h*=-1,u=o.len),o.reversed&&(h*=-1,u-=h*(o.sector||o.len)),e?(p=(t=t*h+u-l)/d+a,c&&(p=o.lin2val(p))):(c&&(t=o.val2lin(t)),p=h*(t-a)*d+u+h*l+(E(n)?d*n:0),o.isRadial||(p=y(p))),p}toPixels(t,e){return this.translate(t,!1,!this.horiz,void 0,!0)+(e?0:this.pos)}toValue(t,e){return this.translate(t-(e?0:this.pos),!0,!this.horiz,void 0,!0)}getPlotLinePath(t){let e,i,r,s,n,o=this,a=o.chart,l=o.left,c=o.top,h=t.old,u=t.value,d=t.lineWidth,p=h&&a.oldChartHeight||a.chartHeight,f=h&&a.oldChartWidth||a.chartWidth,m=o.transB,y=t.translatedValue,_=t.force;function v(t,e,i){return"pass"!==_&&(ti)&&(_?t=g(t,e,i):n=!0),t}let x={value:u,lineWidth:d,old:h,force:_,acrossPanes:t.acrossPanes,translatedValue:y};return S(this,"getPlotLinePath",x,(function(t){e=r=(y=g(y=L(y,o.translate(u,void 0,void 0,h)),-1e5,1e5))+m,i=s=p-y-m,E(y)?o.horiz?(i=c,s=p-o.bottom+(o.options.isInternal?0:a.scrollablePixelsY||0),e=r=v(e,l,l+o.width)):(e=l,r=f-o.right+(a.scrollablePixelsX||0),i=s=v(i,c,c+o.height)):(n=!0,_=!1),t.path=n&&!_?void 0:a.renderer.crispLine([["M",e,i],["L",r,s]],d||1)})),x.path}getLinearTickPositions(t,e,i){let r,s,n,o=y(Math.floor(e/t)*t),a=y(Math.ceil(i/t)*t),l=[];if(y(o+t)===o&&(n=20),this.single)return[e];for(r=o;r<=a&&(l.push(r),(r=y(r+t,n))!==s);)s=r;return l}getMinorTickInterval(){let{minorTicks:t,minorTickInterval:e}=this.options;return!0===t?L(e,"auto"):!1!==t?e:void 0}getMinorTickPositions(){let t,e=this.options,i=this.tickPositions,r=this.minorTickInterval,s=this.pointRangePadding||0,n=(this.min||0)-s,o=(this.max||0)+s,a=o-n,l=[];if(a&&a/r(t.xIncrement?t.xData?.slice(0,2):t.xData)||[])))||0),this.dataMax-this.dataMin)),E(o)&&E(a)&&E(l)&&o-a=l,t=(l-o+a)/2,i=[a-t,L(s.min,a-t)],e&&(i[2]=n?n.log2lin(this.dataMin):this.dataMin),r=[(a=f(i))+l,L(s.max,a+l)],e&&(r[2]=n?n.log2lin(this.dataMax):this.dataMax),(o=m(r))-at-e)),t=C([i]))}return t&&e?Math.min(t,e):t||e}nameToX(t){let e,i=k(this.options.categories),r=i?this.categories:this.names,s=t.options.x;return t.series.requireSorting=!1,_(s)||(s=this.options.uniqueNames&&r?i?r.indexOf(t.name):L(r.keys[t.name],-1):t.series.autoIncrement()),-1===s?!i&&r&&(e=r.length):e=s,void 0!==e?(this.names[e]=t.name,this.names.keys[t.name]=e):t.x&&(e=t.x),e}updateNames(){let t=this,e=this.names;e.length>0&&(Object.keys(e.keys).forEach((function(t){delete e.keys[t]})),e.length=0,this.minRange=this.userMinRange,(this.series||[]).forEach((e=>{e.xIncrement=null,(!e.points||e.isDirtyData)&&(t.max=Math.max(t.max,e.xData.length-1),e.processData(),e.generatePoints()),e.data.forEach((function(i,r){let s;i?.options&&void 0!==i.name&&void 0!==(s=t.nameToX(i))&&s!==i.x&&(i.x=s,e.xData[r]=s)}))})))}setAxisTranslation(){let t,e,i=this,r=i.max-i.min,s=i.linkedParent,n=!!i.categories,o=i.isXAxis,a=i.axisPointRange||0,l=0,c=0,h=i.transA;(o||n||a)&&(t=i.getClosest(),s?(l=s.minPointOffset,c=s.pointRangePadding):i.series.forEach((function(e){let r=n?1:o?L(e.options.pointRange,t,0):i.axisPointRange||0,s=e.options.pointPlacement;if(a=Math.max(a,r),!i.single||n){let t=e.is("xrange")?!o:o;l=Math.max(l,t&&A(s)?0:r/2),c=Math.max(c,t&&"on"===s?0:r)}})),e=i.ordinal&&i.ordinal.slope&&t?i.ordinal.slope/t:1,i.minPointOffset=l*=e,i.pointRangePadding=c*=e,i.pointRange=Math.min(a,i.single&&n?1:r),o&&t&&(i.closestPointRange=t)),i.translationSlope=i.transA=h=i.staticScale||i.len/(r+c||1),i.transB=i.horiz?i.left:i.bottom,i.minPixelPadding=h*l,S(this,"afterSetAxisTranslation")}minFromRange(){let{max:t,min:e}=this;return E(t)&&E(e)&&t-e||void 0}setTickInterval(t){let e,i,r,s,n,{categories:o,chart:a,dataMax:l,dataMin:c,dateTime:h,isXAxis:u,logarithmic:d,options:p,softThreshold:f}=this,m=E(this.threshold)?this.threshold:void 0,g=this.minRange||0,{ceiling:v,floor:x,linkedTo:w,softMax:C,softMin:T}=p,k=E(w)&&a[this.coll]?.[w],A=p.tickPixelInterval,M=p.maxPadding,P=p.minPadding,I=0,D=E(p.tickInterval)&&p.tickInterval>=0?p.tickInterval:void 0;if(h||o||k||this.getTickAmount(),s=L(this.userMin,p.min),n=L(this.userMax,p.max),k?(this.linkedParent=k,e=k.getExtremes(),this.min=L(e.min,e.dataMin),this.max=L(e.max,e.dataMax),p.type!==k.options.type&&b(11,!0,a)):(f&&_(m)&&E(l)&&E(c)&&(c>=m?(i=m,P=0):l<=m&&(r=m,M=0)),this.min=L(s,i,c),this.max=L(n,r,l)),E(this.max)&&E(this.min)&&(d&&(this.positiveValuesOnly&&!t&&0>=Math.min(this.min,L(c,this.min))&&b(10,!0,a),this.min=y(d.log2lin(this.min),16),this.max=y(d.log2lin(this.max),16)),this.range&&E(c)&&(this.userMin=this.min=s=Math.max(c,this.minFromRange()||0),this.userMax=n=this.max,this.range=void 0)),S(this,"foundExtremes"),this.adjustForMinRange(),E(this.min)&&E(this.max)){if(!E(this.userMin)&&E(T)&&Tthis.max&&(this.max=n=C),o||this.axisPointRange||this.stacking?.usePercentage||k||!(I=this.max-this.min)||(!_(s)&&P&&(this.min-=I*P),_(n)||!M||(this.max+=I*M)),!E(this.userMin)&&E(x)&&(this.min=Math.max(this.min,x)),!E(this.userMax)&&E(v)&&(this.max=Math.min(this.max,v)),f&&E(c)&&E(l)){let t=m||0;!_(s)&&this.min=t?this.min=p.minRange?Math.min(t,this.max-g):t:!_(n)&&this.max>t&&l<=t&&(this.max=p.minRange?Math.max(t,this.min+g):t)}!a.polar&&this.min>this.max&&(_(p.min)?this.max=this.min:_(p.max)&&(this.min=this.max)),I=this.max-this.min}if(this.min!==this.max&&E(this.min)&&E(this.max)?k&&!D&&A===k.options.tickPixelInterval?this.tickInterval=D=k.tickInterval:this.tickInterval=L(D,this.tickAmount?I/Math.max(this.tickAmount-1,1):void 0,o?1:I*A/Math.max(this.len,A)):this.tickInterval=1,u&&!t){let t=this.min!==this.old?.min||this.max!==this.old?.max;this.series.forEach((function(e){e.forceCrop=e.forceCropping?.(),e.processData(t)})),S(this,"postProcessData",{hasExtremesChanged:t})}this.setAxisTranslation(),S(this,"initialAxisTranslation"),this.pointRange&&!D&&(this.tickInterval=Math.max(this.pointRange,this.tickInterval));let z=L(p.minTickInterval,h&&!this.series.some((t=>t.noSharedTooltip))?this.closestPointRange:0);!D&&this.tickIntervalMath.max(2*this.len,200))l=[this.min,this.max],b(19,!1,this.chart);else if(this.dateTime)l=this.getTimeTicks(this.dateTime.normalizeTimeTickInterval(this.tickInterval,e.units),this.min,this.max,e.startOfWeek,this.ordinal?.positions,this.closestPointRange,!0);else if(this.logarithmic)l=this.logarithmic.getLogTickPositions(this.tickInterval,this.min,this.max);else{let t=this.tickInterval,e=t;for(;e<=2*t&&(l=this.getLinearTickPositions(this.tickInterval,this.min,this.max),this.tickAmount&&l.length>this.tickAmount);)this.tickInterval=N(this,e*=1.1)}l.length>this.len&&(l=[l[0],l[l.length-1]])[0]===l[1]&&(l.length=1),r&&(this.tickPositions=l,(t=r.apply(this,[this.min,this.max]))&&(l=t))}this.tickPositions=l,this.paddedTicks=l.slice(0),this.trimTicks(l,o,a),!this.isLinked&&E(this.min)&&E(this.max)&&(this.single&&l.length<2&&!this.categories&&!this.series.some((t=>t.is("heatmap")&&"between"===t.options.pointPlacement))&&(this.min-=.5,this.max+=.5),i||t||this.adjustTickAmount()),S(this,"afterSetTickPositions")}trimTicks(t,e,i){let r=t[0],s=t[t.length-1],n=!this.isOrdinal&&this.minPointOffset||0;if(S(this,"trimTicks"),!this.isLinked){if(e&&r!==-1/0)this.min=r;else for(;this.min-n>t[0];)t.shift();if(i)this.max=s;else for(;this.max+n{let{horiz:e,options:i}=t;return[e?i.left:i.top,i.width,i.height,i.pane].join(",")},n=s(this);i[this.coll].forEach((function(i){let{series:o}=i;o.length&&o.some((t=>t.visible))&&i!==e&&s(i)===n&&(t=!0,r.push(i))}))}if(t&&o){r.forEach((t=>{let i=t.getThresholdAlignment(e);E(i)&&a.push(i)}));let t=a.length>1?a.reduce(((t,e)=>t+e),0)/a.length:void 0;r.forEach((e=>{e.thresholdAlignment=t}))}return t}getThresholdAlignment(t){if((!E(this.dataMin)||this!==t&&this.series.some((t=>t.isDirty||t.isDirtyData)))&&this.getSeriesExtremes(),E(this.threshold)){let t=g((this.threshold-(this.dataMin||0))/((this.dataMax||0)-(this.dataMin||0)),0,1);return this.options.reversed&&(t=1-t),t}}getTickAmount(){let t=this.options,e=t.tickPixelInterval,i=t.tickAmount;_(t.tickInterval)||i||!(this.lenl.push(y(l[l.length-1]+p)),m=()=>l.unshift(y(l[0]-p));if(E(h)&&(i=h<.5?Math.ceil(h*(c-1)):Math.floor(h*(c-1)),a.reversed&&(i=c-1-i)),r.hasData()&&E(o)&&E(n)){let h=()=>{r.transA*=(u-1)/(c-1),r.min=a.startOnTick?l[0]:Math.min(o,l[0]),r.max=a.endOnTick?l[l.length-1]:Math.max(n,l[l.length-1])};if(E(i)&&E(r.threshold)){for(;l[i]!==d||l.length!==c||l[0]>o||l[l.length-1]r.threshold?m():f();if(p>8*r.tickInterval)break;p*=2}h()}else if(u0&&e{i=i||t.isDirtyData||t.isDirty,r=r||t.xAxis&&t.xAxis.isDirty||!1})),this.setAxisSize();let s=this.len!==(this.old&&this.old.len);s||i||r||this.isLinked||this.forceRedraw||this.userMin!==(this.old&&this.old.userMin)||this.userMax!==(this.old&&this.old.userMax)||this.alignToOthers()?(e&&"yAxis"===t&&e.buildStacks(),this.forceRedraw=!1,this.userMinRange||(this.minRange=void 0),this.getSeriesExtremes(),this.setTickInterval(),e&&"xAxis"===t&&e.buildStacks(),this.isDirty||(this.isDirty=s||this.min!==this.old?.min||this.max!==this.old?.max)):e&&e.cleanStacks(),i&&delete this.allExtremes,S(this,"afterSetScale")}setExtremes(t,e,i=!0,r,s){this.series.forEach((t=>{delete t.kdTree})),S(this,"setExtremes",s=w(s,{min:t,max:e}),(t=>{this.userMin=t.min,this.userMax=t.max,this.eventArgs=t,i&&this.chart.redraw(r)}))}setAxisSize(){let t=this.chart,e=this.options,i=e.offsets||[0,0,0,0],r=this.horiz,s=this.width=Math.round(D(L(e.width,t.plotWidth-i[3]+i[1]),t.plotWidth)),n=this.height=Math.round(D(L(e.height,t.plotHeight-i[0]+i[2]),t.plotHeight)),o=this.top=Math.round(D(L(e.top,t.plotTop+i[0]),t.plotHeight,t.plotTop)),a=this.left=Math.round(D(L(e.left,t.plotLeft+i[3]),t.plotWidth,t.plotLeft));this.bottom=t.chartHeight-n-o,this.right=t.chartWidth-s-a,this.len=Math.max(r?s:n,0),this.pos=r?a:o}getExtremes(){let t=this.logarithmic;return{min:t?y(t.lin2log(this.min)):this.min,max:t?y(t.lin2log(this.max)):this.max,dataMin:this.dataMin,dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}}getThreshold(t){let e=this.logarithmic,i=e?e.lin2log(this.min):this.min,r=e?e.lin2log(this.max):this.max;return null===t||t===-1/0?t=i:t===1/0?t=r:i>t?t=i:r15&&e<165?t.align="right":e>195&&e<345&&(t.align="left")})),i.align}tickSize(t){let e,i=this.options,r=L(i["tick"===t?"tickWidth":"minorTickWidth"],"tick"===t&&this.isXAxis&&!this.categories?1:0),s=i["tick"===t?"tickLength":"minorTickLength"];r&&s&&("inside"===i[t+"Position"]&&(s=-s),e=[s,r]);let n={tickSize:e};return S(this,"afterTickSize",n),n.tickSize}labelMetrics(){let t=this.chart.renderer,e=this.ticks,i=e[Object.keys(e)[0]]||{};return this.chart.renderer.fontMetrics(i.label||i.movedLabel||t.box)}unsquish(){let t,e,i=this.options.labels,r=i.padding||0,s=this.horiz,n=this.tickInterval,o=this.len/(((this.categories?1:0)+this.max-this.min)/n),a=i.rotation,l=y(.8*this.labelMetrics().h),c=Math.max(this.max-this.min,0),h=function(t){let e=(t+2*r)/(o||1);return(e=e>1?Math.ceil(e):1)*n>c&&t!==1/0&&o!==1/0&&c&&(e=Math.ceil(c/n)),y(e*n)},u=n,d=Number.MAX_VALUE;if(s){if(!i.staggerLines&&(E(a)?e=[a]:o=-90&&s<=90)&&(r=(i=h(Math.abs(l/Math.sin(p*s))))+Math.abs(s/360))g&&(g=e.label.textPxLength)})),this.maxLabelLength=g,this.autoRotation)g>d&&g>f.h?p.rotation=this.labelRotation:this.labelRotation=0;else if(u&&(t=d,!m))for(e="clip",r=o.length;!h&&r--;)(i=a[o[r]].label)&&("ellipsis"===i.styles.textOverflow?i.css({textOverflow:"clip"}):i.textPxLength>u&&i.css({width:u+"px"}),i.getBBox().height>this.len/o.length-(f.h-f.f)&&(i.specificTextOverflow="ellipsis"));p.rotation&&(t=g>.5*s.chartHeight?.33*s.chartHeight:g,m||(e="ellipsis")),this.labelAlign=l.align||this.autoLabelAlign(this.labelRotation),this.labelAlign&&(p.align=this.labelAlign),o.forEach((function(i){let r=a[i],s=r&&r.label,n=c.width,o={};s&&(s.attr(p),r.shortenLabel?r.shortenLabel():t&&!n&&"nowrap"!==c.whiteSpace&&(ts.g(e).attr({zIndex:o}).addClass(`highcharts-${i.toLowerCase()}${n} `+(this.isRadial?`highcharts-radial-axis${n} `:"")+(r.className||"")).add(t);this.axisGroup||(this.gridGroup=n("grid","-grid",r.gridZIndex),this.axisGroup=n("axis","",r.zIndex),this.labelGroup=n("axis-labels","-labels",r.labels.zIndex))}getOffset(){let t,e,i,r,s=this,{chart:n,horiz:o,options:a,side:l,ticks:c,tickPositions:h,coll:u}=s,d=n.inverted&&!s.isZAxis?[1,0,3,2][l]:l,p=s.hasData(),f=a.title,m=a.labels,g=E(a.crossing),y=n.axisOffset,v=n.clipOffset,x=[-1,1,1,-1][l],b=0,w=0,C=0;if(s.showAxis=t=p||a.showEmpty,s.staggerLines=s.horiz&&m.staggerLines||void 0,s.createGroups(),p||s.isLinked?(h.forEach((function(t){s.generateTick(t)})),s.renderUnsquish(),s.reserveSpaceDefault=0===l||2===l||{1:"left",3:"right"}[l]===s.labelAlign,L(m.reserveSpace,!g&&null,"center"===s.labelAlign||null,s.reserveSpaceDefault)&&h.forEach((function(t){C=Math.max(c[t].getLabelSize(),C)})),s.staggerLines&&(C*=s.staggerLines),s.labelOffset=C*(s.opposite?-1:1)):I(c,(function(t,e){t.destroy(),delete c[e]})),f?.text&&!1!==f.enabled&&(s.addTitle(t),t&&!g&&!1!==f.reserveSpace&&(s.titleOffset=b=s.axisTitle.getBBox()[o?"height":"width"],w=_(e=f.offset)?0:L(f.margin,o?5:10))),s.renderLine(),s.offset=x*L(a.offset,y[l]?y[l]+(a.margin||0):0),s.tickRotCorr=s.tickRotCorr||{x:0,y:0},r=0===l?-s.labelMetrics().h:2===l?s.tickRotCorr.y:0,i=Math.abs(C)+w,C&&(i-=r,i+=x*(o?L(m.y,s.tickRotCorr.y+x*m.distance):L(m.x,x*m.distance))),s.axisTitleMargin=L(e,i),s.getMaxLabelDimensions&&(s.maxLabelDimensions=s.getMaxLabelDimensions(c,h)),"colorAxis"!==u&&v){let t=this.tickSize("tick");y[l]=Math.max(y[l],(s.axisTitleMargin||0)+b+x*s.offset,i,h&&h.length&&t?t[0]+x*s.offset:0);let e=!s.axisLine||a.offset?0:s.axisLine.strokeWidth()/2;v[d]=Math.max(v[d],e)}S(this,"afterGetOffset")}getLinePath(t){let e=this.chart,i=this.opposite,r=this.offset,s=this.horiz,n=this.left+(i?this.width:0)+r,o=e.chartHeight-this.bottom-(i?this.height:0)+r;return i&&(t*=-1),e.renderer.crispLine([["M",s?this.left:n,s?o:this.top],["L",s?e.chartWidth-this.right:n,s?o:e.chartHeight-this.bottom]],t)}renderLine(){this.axisLine||(this.axisLine=this.chart.renderer.path().addClass("highcharts-axis-line").add(this.axisGroup),this.chart.styledMode||this.axisLine.attr({stroke:this.options.lineColor,"stroke-width":this.options.lineWidth,zIndex:7}))}getTitlePosition(t){let e=this.horiz,i=this.left,r=this.top,s=this.len,n=this.options.title,o=e?i:r,a=this.opposite,l=this.offset,c=n.x,h=n.y,u=this.chart.renderer.fontMetrics(t),d=t?Math.max(t.getBBox(!1,0).height-u.h-1,0):0,p={low:o+(e?0:s),middle:o+s/2,high:o+(e?s:0)}[n.align],f=(e?r+this.height:i)+(e?1:-1)*(a?-1:1)*(this.axisTitleMargin||0)+[-d,d,u.f,-d][this.side],m={x:e?p+c:f+(a?this.width:0)+l+c,y:e?f+h-(a?this.height:0)+l:p+h};return S(this,"afterGetTitlePosition",{titlePosition:m}),m}renderMinorTick(t,e){let i=this.minorTicks;i[t]||(i[t]=new o(this,t,"minor")),e&&i[t].isNew&&i[t].render(null,!0),i[t].render(null,!1,1)}renderTick(t,e,i){let r=this.isLinked,s=this.ticks;(!r||t>=this.min&&t<=this.max||this.grid&&this.grid.isColumn)&&(s[t]||(s[t]=new o(this,t)),i&&s[t].isNew&&s[t].render(e,!0,-1),s[t].render(e))}render(){let t,e,i=this,r=i.chart,s=i.logarithmic,a=r.renderer,c=i.options,h=i.isLinked,u=i.tickPositions,d=i.axisTitle,p=i.ticks,f=i.minorTicks,m=i.alternateBands,g=c.stackLabels,y=c.alternateGridColor,_=c.crossing,v=i.tickmarkOffset,x=i.axisLine,b=i.showAxis,w=l(a.globalAnimation);if(i.labelEdge.length=0,i.overlap=!1,[p,f,m].forEach((function(t){I(t,(function(t){t.isActive=!1}))})),E(_)){let t=this.isXAxis?r.yAxis[0]:r.xAxis[0],e=[1,-1,-1,1][this.side];if(t){let r=t.toPixels(_,!0);i.horiz&&(r=t.len-r),i.offset=e*r}}if(i.hasData()||h){let a=i.chart.hasRendered&&i.old&&E(i.old.min);i.minorTickInterval&&!i.categories&&i.getMinorTickPositions().forEach((function(t){i.renderMinorTick(t,a)})),u.length&&(u.forEach((function(t,e){i.renderTick(t,e,a)})),v&&(0===i.min||i.single)&&(p[-1]||(p[-1]=new o(i,-1,null,!0)),p[-1].render(-1))),y&&u.forEach((function(o,a){e=void 0!==u[a+1]?u[a+1]+v:i.max-v,a%2==0&&o=.5)t=Math.round(t),c=o.getLinearTickPositions(t,e,i);else if(t>=.08){let r,s,o,a,l,h,u;for(r=t>.3?[1,2,4]:t>.15?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9],s=Math.floor(e);se&&(!n||h<=i)&&void 0!==h&&c.push(h),h>i&&(u=!0),h=l}else{let h=this.lin2log(e),u=this.lin2log(i),d=n?o.getMinorTickInterval():l.tickInterval,p=l.tickPixelInterval/(n?5:1),f=n?a/o.tickPositions.length:a;t=r(t=s("auto"===d?null:d,this.minorAutoInterval,(u-h)*p/(f||1))),c=o.getLinearTickPositions(t,h,u).map(this.log2lin),n||(this.minorAutoInterval=t/5)}return n||(o.tickInterval=t),c}lin2log(t){return Math.pow(10,t)}log2lin(t){return Math.log(t)/Math.LN10}}t.Additions=o}(e||(e={})),e})),i(e,"Core/Axis/PlotLineOrBand/PlotLineOrBandAxis.js",[e["Core/Utilities.js"]],(function(t){var e;let{erase:i,extend:r,isNumber:s}=t;return function(t){let e;function n(t){return this.addPlotBandOrLine(t,"plotBands")}function o(t,i){let r=this.userOptions,s=new e(this,t);if(this.visible&&(s=s.render()),s){if(this._addedPlotLB||(this._addedPlotLB=!0,(r.plotLines||[]).concat(r.plotBands||[]).forEach((t=>{this.addPlotBandOrLine(t)}))),i){let e=r[i]||[];e.push(t),r[i]=e}this.plotLinesAndBands.push(s)}return s}function a(t){return this.addPlotBandOrLine(t,"plotLines")}function l(t,e,i){i=i||this.options;let r,n,o=this.getPlotLinePath({value:e,force:!0,acrossPanes:i.acrossPanes}),a=[],l=this.horiz,c=!s(this.min)||!s(this.max)||tthis.max&&e>this.max,h=this.getPlotLinePath({value:t,force:!0,acrossPanes:i.acrossPanes}),u=1;if(h&&o)for(c&&(n=h.toString()===o.toString(),u=0),r=0;r{b?.on(e,(t=>{u[e].apply(this,[t])}))})),this.eventsAdded=!0),!T&&b.d||!w?.length?b&&(w?(b.show(),b.animate({d:w})):b.d&&(b.hide(),x&&(this.label=x=x.destroy()))):b.attr({d:w}),v&&(s(v.text)||s(v.formatter))&&w?.length&&e.width>0&&e.height>0&&!w.isFlat?(v=l({align:r&&S?"center":void 0,x:r?!S&&4:10,verticalAlign:!r&&S?"middle":void 0,y:r?S?16:10:S?6:-4,rotation:r&&!S?90:0},v),this.renderLabel(v,w,S,d)):x&&x.hide(),this}renderLabel(t,e,s,n){let o=this.axis,a=o.chart.renderer,c=this.label;c||(this.label=c=a.text(this.getLabelText(t),0,0,t.useHTML).attr({align:t.textAlign||t.align,rotation:t.rotation,class:"highcharts-plot-"+(s?"band":"line")+"-label "+(t.className||""),zIndex:n}),o.chart.styledMode||c.css(l({fontSize:"0.8em",textOverflow:"ellipsis"},t.style)),c.add());let h=e.xBounds||[e[0][1],e[1][1],s?e[2][1]:e[0][1]],u=e.yBounds||[e[0][2],e[1][2],s?e[2][2]:e[0][2]],d=r(h),p=r(u);if(c.align(t,!1,{x:d,y:p,width:i(h)-d,height:i(u)-p}),!c.alignValue||"left"===c.alignValue){let e=t.clip?o.width:o.chart.chartWidth;c.css({width:(90===c.rotation?o.height-(c.alignAttr.y-o.top):e-(c.alignAttr.x-o.left))+"px"})}c.show(!0)}getLabelText(t){return s(t.formatter)?t.formatter.call(this):t.text}destroy(){o(this.axis.plotLinesAndBands,this),delete this.axis,n(this)}}return u})),i(e,"Core/Tooltip.js",[e["Core/Animation/AnimationUtilities.js"],e["Core/Templating.js"],e["Core/Globals.js"],e["Core/Renderer/RendererUtilities.js"],e["Core/Renderer/RendererRegistry.js"],e["Core/Utilities.js"]],(function(t,e,i,r,s,n){var o;let{animObject:a}=t,{format:l}=e,{composed:c,doc:h,isSafari:u}=i,{distribute:d}=r,{addEvent:p,clamp:f,css:m,discardElement:g,extend:y,fireEvent:_,isArray:v,isNumber:x,isString:b,merge:w,pick:S,pushUnique:C,splat:T,syncTimeout:k}=n;class E{constructor(t,e,i){this.allowShared=!0,this.crosshairs=[],this.distance=0,this.isHidden=!0,this.isSticky=!1,this.options={},this.outside=!1,this.chart=t,this.init(t,e),this.pointer=i}bodyFormatter(t){return t.map((function(t){let e=t.series.tooltipOptions;return(e[(t.point.formatPrefix||"point")+"Formatter"]||t.point.tooltipFormatter).call(t.point,e[(t.point.formatPrefix||"point")+"Format"]||"")}))}cleanSplit(t){this.chart.series.forEach((function(e){let i=e&&e.tt;i&&(!i.isActive||t?e.tt=i.destroy():i.isActive=!1)}))}defaultFormatter(t){let e,i=this.points||T(this);return(e=(e=[t.tooltipFooterHeaderFormatter(i[0])]).concat(t.bodyFormatter(i))).push(t.tooltipFooterHeaderFormatter(i[0],!0)),e}destroy(){this.label&&(this.label=this.label.destroy()),this.split&&(this.cleanSplit(!0),this.tt&&(this.tt=this.tt.destroy())),this.renderer&&(this.renderer=this.renderer.destroy(),g(this.container)),n.clearTimeout(this.hideTimer)}getAnchor(t,e){let i,{chart:r,pointer:s}=this,n=r.inverted,o=r.plotTop,a=r.plotLeft;if((t=T(t))[0].series&&t[0].series.yAxis&&!t[0].series.yAxis.options.reversedStacks&&(t=t.slice().reverse()),this.followPointer&&e)void 0===e.chartX&&(e=s.normalize(e)),i=[e.chartX-a,e.chartY-o];else if(t[0].tooltipPos)i=t[0].tooltipPos;else{let r=0,s=0;t.forEach((function(t){let e=t.pos(!0);e&&(r+=e[0],s+=e[1])})),r/=t.length,s/=t.length,this.shared&&t.length>1&&e&&(n?r=e.chartX:s=e.chartY),i=[r-a,s-o]}return i.map(Math.round)}getClassName(t,e,i){let r=this.options,s=t.series,n=s.options;return[r.className,"highcharts-label",i&&"highcharts-tooltip-header",e?"highcharts-tooltip-box":"highcharts-tooltip",!i&&"highcharts-color-"+S(t.colorIndex,s.colorIndex),n&&n.className].filter(b).join(" ")}getLabel(){let t=this,e=this.chart.styledMode,r=this.options,n=this.split&&this.allowShared,o=this.container,a=this.chart.renderer;if(this.label){let t=!this.label.hasClass("highcharts-label");(!n&&t||n&&!t)&&this.destroy()}if(!this.label){if(this.outside){let t=this.chart.options.chart.style,e=s.getRendererType();this.container=o=i.doc.createElement("div"),o.className="highcharts-tooltip-container",m(o,{position:"absolute",top:"1px",pointerEvents:"none",zIndex:Math.max(this.options.style.zIndex||0,(t&&t.zIndex||0)+3)}),this.renderer=a=new e(o,0,0,t,void 0,void 0,a.styledMode)}if(n?this.label=a.g("tooltip"):(this.label=a.label("",0,0,r.shape,void 0,void 0,r.useHTML,void 0,"tooltip").attr({padding:r.padding,r:r.borderRadius}),e||this.label.attr({fill:r.backgroundColor,"stroke-width":r.borderWidth||0}).css(r.style).css({pointerEvents:r.style.pointerEvents||(this.shouldStickOnContact()?"auto":"none")})),t.outside){let e=this.label;[e.xSetter,e.ySetter].forEach(((i,r)=>{e[r?"ySetter":"xSetter"]=s=>{i.call(e,t.distance),e[r?"y":"x"]=s,o&&(o.style[r?"top":"left"]=`${s}px`)}}))}this.label.attr({zIndex:8}).shadow(r.shadow).add()}return o&&!o.parentElement&&i.doc.body.appendChild(o),this.label}getPlayingField(){let{body:t,documentElement:e}=h,{chart:i,distance:r,outside:s}=this;return{width:s?Math.max(t.scrollWidth,e.scrollWidth,t.offsetWidth,e.offsetWidth,e.clientWidth)-2*r:i.chartWidth,height:s?Math.max(t.scrollHeight,e.scrollHeight,t.offsetHeight,e.offsetHeight,e.clientHeight):i.chartHeight}}getPosition(t,e,i){let r,{distance:s,chart:n,outside:o,pointer:a}=this,{inverted:l,plotLeft:c,plotTop:h,polar:u}=n,{plotX:d=0,plotY:p=0}=i,f={},m=l&&i.h||0,{height:g,width:y}=this.getPlayingField(),_=a.getChartPosition(),v=t=>t*_.scaleX,x=t=>t*_.scaleY,b=i=>{let r="x"===i;return[i,r?y:g,r?t:e].concat(o?[r?v(t):x(e),r?_.left-s+v(d+c):_.top-s+x(p+h),0,r?y:g]:[r?t:e,r?d+c:p+h,r?c:h,r?c+n.plotWidth:h+n.plotHeight])},w=b("y"),C=b("x"),T=!!i.negative;!u&&n.hoverSeries?.yAxis?.reversed&&(T=!T);let k=!this.followPointer&&S(i.ttBelow,!u&&!l===T),E=function(t,e,i,r,n,a,l){let c=o?"y"===t?x(s):v(s):s,h=(i-r)/2,u=re?g:g+m)}},A=function(t,e,i,r,n){if(ne-s)return!1;f[t]=ne-r/2?e-r-2:n-i/2},M=function(t){[w,C]=[C,w],r=t},P=()=>{!1!==E.apply(0,w)?!1!==A.apply(0,C)||r||(M(!0),P()):r?f.x=f.y=0:(M(!0),P())};return(l&&!u||this.len>1)&&M(),P(),f}hide(t){let e=this;n.clearTimeout(this.hideTimer),t=S(t,this.options.hideDelay),this.isHidden||(this.hideTimer=k((function(){let i=e.getLabel();e.getLabel().animate({opacity:0},{duration:t?150:t,complete:()=>{i.hide(),e.container&&e.container.remove()}}),e.isHidden=!0}),t))}init(t,e){this.chart=t,this.options=e,this.crosshairs=[],this.isHidden=!0,this.split=e.split&&!t.inverted&&!t.polar,this.shared=e.shared||this.split,this.outside=S(e.outside,!(!t.scrollablePixelsX&&!t.scrollablePixelsY))}shouldStickOnContact(t){return!(this.followPointer||!this.options.stickOnContact||t&&!this.pointer.inClass(t.target,"highcharts-tooltip"))}move(t,e,i,r){let s=this,n=a(!s.isHidden&&s.options.animation),o={x:t,y:e};s.followPointer||(s.len||0)>1||(o.anchorX=i,o.anchorY=r),n.step=()=>s.drawTracker(),s.getLabel().animate(o,n)}refresh(t,e){let{chart:i,options:r,pointer:s,shared:o}=this,a=T(t),c=a[0],h=[],u=r.format,d=r.formatter||this.defaultFormatter,p=i.styledMode,f={};if(!r.enabled||!c.series)return;n.clearTimeout(this.hideTimer),this.allowShared=!(!v(t)&&t.series&&t.series.noSharedTooltip),this.followPointer=!this.split&&c.series.tooltipOptions.followPointer;let m=this.getAnchor(t,e),g=m[0],y=m[1];o&&this.allowShared?(s.applyInactiveState(a),a.forEach((function(t){t.setState("hover"),h.push(t.getLabelConfig())})),(f=c.getLabelConfig()).points=h):f=c.getLabelConfig(),this.len=h.length;let x=b(u)?l(u,f,i):d.call(f,this),w=c.series;if(this.distance=S(w.tooltipOptions.distance,16),!1===x)this.hide();else{if(this.split&&this.allowShared)this.renderSplit(x,a);else{let t=g,n=y;if(e&&s.isDirectTouch&&(t=e.chartX-i.plotLeft,n=e.chartY-i.plotTop),!i.polar&&!1!==w.options.clip&&!a.some((e=>s.isDirectTouch||e.series.shouldShowTooltip(t,n))))return void this.hide();{let t=this.getLabel();(!r.style.width||p)&&t.css({width:(this.outside?this.getPlayingField():i.spacingBox).width+"px"}),t.attr({class:this.getClassName(c),text:x&&x.join?x.join(""):x}),p||t.attr({stroke:r.borderColor||c.color||w.color||"#666666"}),this.updatePosition({plotX:g,plotY:y,negative:c.negative,ttBelow:c.ttBelow,h:m[2]||0})}}this.isHidden&&this.label&&this.label.attr({opacity:1}).show(),this.isHidden=!1}_(this,"refresh")}renderSplit(t,e){let i=this,{chart:r,chart:{chartWidth:s,chartHeight:n,plotHeight:o,plotLeft:a,plotTop:l,scrollablePixelsY:c=0,scrollablePixelsX:p,styledMode:m},distance:g,options:_,options:{positioner:v},pointer:x}=i,{scrollLeft:w=0,scrollTop:C=0}=r.scrollablePlotArea?.scrollingContainer||{},T=i.outside&&"number"!=typeof p?h.documentElement.getBoundingClientRect():{left:w,right:w+s,top:C,bottom:C+n},k=i.getLabel(),E=this.renderer||r.renderer,A=!(!r.xAxis[0]||!r.xAxis[0].opposite),{left:M,top:P}=x.getChartPosition(),I=l+C,L=0,D=o-c;function z(t,e,r,s,n=!0){let o,a;return r?(o=A?0:D,a=f(t-s/2,T.left,T.right-s-(i.outside?M:0))):(o=e-I,a=f(a=n?t-s-g:t+g,n?a:T.left,T.right)),{x:a,y:o}}b(t)&&(t=[!1,t]);let O=t.slice(0,e.length+1).reduce((function(t,r,s){if(!1!==r&&""!==r){let n=e[s-1]||{isHeader:!0,plotX:e[0].plotX,plotY:o,series:{}},c=n.isHeader,h=c?i:n.series,u=h.tt=function(t,e,r){let s=t,{isHeader:n,series:o}=e;if(!s){let t={padding:_.padding,r:_.borderRadius};m||(t.fill=_.backgroundColor,t["stroke-width"]=_.borderWidth??1),s=E.label("",0,0,_[n?"headerShape":"shape"],void 0,void 0,_.useHTML).addClass(i.getClassName(e,!0,n)).attr(t).add(k)}return s.isActive=!0,s.attr({text:r}),m||s.css(_.style).attr({stroke:_.borderColor||e.color||o.color||"#333333"}),s}(h.tt,n,r.toString()),d=u.getBBox(),p=d.width+u.strokeWidth();c&&(L=d.height,D+=L,A&&(I-=L));let{anchorX:y,anchorY:x}=function(t){let e,i,{isHeader:r,plotX:s=0,plotY:n=0,series:c}=t;if(r)e=Math.max(a+s,a),i=l+o/2;else{let{xAxis:t,yAxis:r}=c;e=t.pos+f(s,-g,t.len+g),c.shouldShowTooltip(0,r.pos-l+n,{ignoreX:!0})&&(i=r.pos+n)}return{anchorX:e=f(e,T.left-g,T.right+g),anchorY:i}}(n);if("number"==typeof x){let e=d.height+1,r=v?v.call(i,p,e,n):z(y,x,c,p);t.push({align:v?0:void 0,anchorX:y,anchorY:x,boxWidth:p,point:n,rank:S(r.rank,c?1:0),size:e,target:r.y,tt:u,x:r.x})}else u.isActive=!1}return t}),[]);!v&&O.some((t=>{let{outside:e}=i,r=(e?M:0)+t.anchorX;return rr}))&&(O=O.map((t=>{let{x:e,y:i}=z(t.anchorX,t.anchorY,t.point.isHeader,t.boxWidth,!1);return y(t,{target:i,x:e})}))),i.cleanSplit(),d(O,D);let R={left:M,right:M};O.forEach((function(t){let{x:e,boxWidth:r,isHeader:s}=t;!s&&(i.outside&&M+eR.right&&(R.right=M+e))})),O.forEach((function(t){let{x:e,anchorX:r,anchorY:s,pos:n,point:{isHeader:o}}=t,a={visibility:void 0===n?"hidden":"inherit",x:e,y:(n||0)+I,anchorX:r,anchorY:s};if(i.outside&&e0&&(o||(a.x=e+t,a.anchorX=r+t),o&&(a.x=(R.right-R.left)/2,a.anchorX=r+t))}t.tt.attr(a)}));let{container:N,outside:B,renderer:F}=i;if(B&&N&&F){let{width:t,height:e,x:i,y:r}=k.getBBox();F.setSize(t+i,e+r,!1),N.style.left=R.left+"px",N.style.top=P+"px"}u&&k.attr({opacity:1===k.opacity?.999:1})}drawTracker(){if(!this.shouldStickOnContact())return void(this.tracker&&(this.tracker=this.tracker.destroy()));let t=this.chart,e=this.label,i=this.shared?t.hoverPoints:t.hoverPoint;if(!e||!i)return;let r={x:0,y:0,width:0,height:0},s=this.getAnchor(i),n=e.getBBox();s[0]+=t.plotLeft-(e.translateX||0),s[1]+=t.plotTop-(e.translateY||0),r.x=Math.min(0,s[0]),r.y=Math.min(0,s[1]),r.width=s[0]<0?Math.max(Math.abs(s[0]),n.width-s[0]):Math.max(Math.abs(s[0]),n.width),r.height=s[1]<0?Math.max(Math.abs(s[1]),n.height-Math.abs(s[1])):Math.max(Math.abs(s[1]),n.height),this.tracker?this.tracker.attr(r):(this.tracker=e.renderer.rect(r).addClass("highcharts-tracker").add(e),t.styledMode||this.tracker.attr({fill:"rgba(0,0,0,0)"}))}styledModeFormat(t){return t.replace('style="font-size: 0.8em"','class="highcharts-header"').replace(/style="color:{(point|series)\.color}"/g,'class="highcharts-color-{$1.colorIndex} {series.options.className} {point.options.className}"')}tooltipFooterHeaderFormatter(t,e){let i=t.series,r=i.tooltipOptions,s=i.xAxis,n=s&&s.dateTime,o={isFooter:e,labelConfig:t},a=r.xDateFormat,c=r[e?"footerFormat":"headerFormat"];return _(this,"headerFormatter",o,(function(e){n&&!a&&x(t.key)&&(a=n.getXDateFormat(t.key,r.dateTimeLabelFormats)),n&&a&&(t.point&&t.point.tooltipDateKeys||["key"]).forEach((function(t){c=c.replace("{point."+t+"}","{point."+t+":"+a+"}")})),i.chart.styledMode&&(c=this.styledModeFormat(c)),e.text=l(c,{point:t,series:i},this.chart)})),o.text}update(t){this.destroy(),this.init(this.chart,w(!0,this.options,t))}updatePosition(t){let e,{chart:i,container:r,distance:s,options:n,pointer:o,renderer:a}=this,{height:l=0,width:c=0}=this.getLabel(),{left:h,top:u,scaleX:d,scaleY:p}=o.getChartPosition(),f=(n.positioner||this.getPosition).call(this,c,l,t),g=(t.plotX||0)+i.plotLeft,y=(t.plotY||0)+i.plotTop;a&&r&&(n.positioner&&(f.x+=h-s,f.y+=u-s),e=(n.borderWidth||0)+2*s+2,a.setSize(c+e,l+e,!1),(1!==d||1!==p)&&(m(r,{transform:`scale(${d}, ${p})`}),g*=d,y*=p),g+=h-f.x,y+=u-f.y),this.move(Math.round(f.x),Math.round(f.y||0),g,y)}}return(o=E||(E={})).compose=function(t){C(c,"Core.Tooltip")&&p(t,"afterInit",(function(){let t=this.chart;t.options.tooltip&&(t.tooltip=new o(t,t.options.tooltip,this))}))},E})),i(e,"Core/Series/Point.js",[e["Core/Renderer/HTML/AST.js"],e["Core/Animation/AnimationUtilities.js"],e["Core/Defaults.js"],e["Core/Templating.js"],e["Core/Utilities.js"]],(function(t,e,i,r,s){let{animObject:n}=e,{defaultOptions:o}=i,{format:a}=r,{addEvent:l,crisp:c,erase:h,extend:u,fireEvent:d,getNestedProperty:p,isArray:f,isFunction:m,isNumber:g,isObject:y,merge:_,pick:v,syncTimeout:x,removeEvent:b,uniqueKey:w}=s;class S{animateBeforeDestroy(){let t=this,e={x:t.startXPos,opacity:0},i=t.getGraphicalProps();i.singular.forEach((function(i){t[i]=t[i].animate("dataLabel"===i?{x:t[i].startXPos,y:t[i].startYPos,opacity:0}:e)})),i.plural.forEach((function(e){t[e].forEach((function(e){e.element&&e.animate(u({x:t.startXPos},e.startYPos?{x:e.startXPos,y:e.startYPos}:{}))}))}))}applyOptions(t,e){let i=this.series,r=i.options.pointValKey||i.pointValKey;return u(this,t=S.prototype.optionsToObject.call(this,t)),this.options=this.options?u(this.options,t):t,t.group&&delete this.group,t.dataLabels&&delete this.dataLabels,r&&(this.y=S.prototype.getNestedProperty.call(this,r)),this.selected&&(this.state="select"),"name"in this&&void 0===e&&i.xAxis&&i.xAxis.hasNames&&(this.x=i.xAxis.nameToX(this)),void 0===this.x&&i?this.x=e??i.autoIncrement():g(t.x)&&i.options.relativeXValue&&(this.x=i.autoIncrement(t.x)),this.isNull=this.isValid&&!this.isValid(),this.formatPrefix=this.isNull?"null":"point",this}destroy(){if(!this.destroyed){let t=this,e=t.series,i=e.chart,r=e.options.dataSorting,s=i.hoverPoints,o=n(t.series.chart.renderer.globalAnimation),a=()=>{for(let e in(t.graphic||t.graphics||t.dataLabel||t.dataLabels)&&(b(t),t.destroyElements()),t)delete t[e]};t.legendItem&&i.legend.destroyItem(t),s&&(t.setState(),h(s,t),s.length||(i.hoverPoints=null)),t===i.hoverPoint&&t.onMouseOut(),r&&r.enabled?(this.animateBeforeDestroy(),x(a,o.duration)):a(),i.pointCount--}this.destroyed=!0}destroyElements(t){let e=this,i=e.getGraphicalProps(t);i.singular.forEach((function(t){e[t]=e[t].destroy()})),i.plural.forEach((function(t){e[t].forEach((function(t){t&&t.element&&t.destroy()})),delete e[t]}))}firePointEvent(t,e,i){let r=this,s=this.series.options;r.manageEvent(t),"click"===t&&s.allowPointSelect&&(i=function(t){!r.destroyed&&r.select&&r.select(null,t.ctrlKey||t.metaKey||t.shiftKey)}),d(r,t,e,i)}getClassName(){return"highcharts-point"+(this.selected?" highcharts-point-select":"")+(this.negative?" highcharts-negative":"")+(this.isNull?" highcharts-null-point":"")+(void 0!==this.colorIndex?" highcharts-color-"+this.colorIndex:"")+(this.options.className?" "+this.options.className:"")+(this.zone&&this.zone.className?" "+this.zone.className.replace("highcharts-negative",""):"")}getGraphicalProps(t){let e,i,r=this,s=[],n={singular:[],plural:[]};for((t=t||{graphic:1,dataLabel:1}).graphic&&s.push("graphic","connector"),t.dataLabel&&s.push("dataLabel","dataLabelPath","dataLabelUpper"),i=s.length;i--;)r[e=s[i]]&&n.singular.push(e);return["graphic","dataLabel"].forEach((function(e){let i=e+"s";t[e]&&r[i]&&n.plural.push(i)})),n}getLabelConfig(){return{x:this.category,y:this.y,color:this.color,colorIndex:this.colorIndex,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||this.stackTotal}}getNestedProperty(t){return t?0===t.indexOf("custom.")?p(t,this.options):this[t]:void 0}getZone(){let t,e=this.series,i=e.zones,r=e.zoneAxis||"y",s=0;for(t=i[0];this[r]>=t.value;)t=i[++s];return this.nonZonedColor||(this.nonZonedColor=this.color),t&&t.color&&!this.options.color?this.color=t.color:this.color=this.nonZonedColor,t}hasNewShapeType(){return(this.graphic&&(this.graphic.symbolName||this.graphic.element.nodeName))!==this.shapeType}constructor(t,e,i){this.formatPrefix="point",this.visible=!0,this.series=t,this.applyOptions(e,i),this.id??(this.id=w()),this.resolveColor(),t.chart.pointCount++,d(this,"afterInit")}isValid(){return(g(this.x)||this.x instanceof Date)&&g(this.y)}optionsToObject(t){let e,i=this.series,r=i.options.keys,s=r||i.pointArrayMap||["y"],n=s.length,o={},a=0,l=0;if(g(t)||null===t)o[s[0]]=t;else if(f(t))for(!r&&t.length>n&&("string"==(e=typeof t[0])?o.name=t[0]:"number"===e&&(o.x=t[0]),a++);l0?S.prototype.setNestedProperty(o,t[a],s[l]):o[s[l]]=t[a]),a++,l++;else"object"==typeof t&&(o=t,t.dataLabels&&(i.hasDataLabels=()=>!0),t.marker&&(i._hasPointMarkers=!0));return o}pos(t,e=this.plotY){if(!this.destroyed){let{plotX:i,series:r}=this,{chart:s,xAxis:n,yAxis:o}=r,a=0,l=0;if(g(i)&&g(e))return t&&(a=n?n.pos:s.plotLeft,l=o?o.pos:s.plotTop),s.inverted&&n&&o?[o.len-e+l,n.len-i+a]:[i+a,e+l]}}resolveColor(){let t,e,i,r=this.series,s=r.chart.options.chart,n=r.chart.styledMode,o=s.colorCount;delete this.nonZonedColor,r.options.colorByPoint?(n||(t=(e=r.options.colors||r.chart.options.colors)[r.colorCounter],o=e.length),i=r.colorCounter,r.colorCounter++,r.colorCounter===o&&(r.colorCounter=0)):(n||(t=r.color),i=r.colorIndex),this.colorIndex=v(this.options.colorIndex,i),this.color=v(this.options.color,t)}setNestedProperty(t,e,i){return i.split(".").reduce((function(t,i,r,s){let n=s.length-1===r;return t[i]=n?e:y(t[i],!0)?t[i]:{},t[i]}),t),t}shouldDraw(){return!this.isNull}tooltipFormatter(t){let e=this.series,i=e.tooltipOptions,r=v(i.valueDecimals,""),s=i.valuePrefix||"",n=i.valueSuffix||"";return e.chart.styledMode&&(t=e.chart.tooltip.styledModeFormat(t)),(e.pointArrayMap||["y"]).forEach((function(e){e="{point."+e,(s||n)&&(t=t.replace(RegExp(e+"}","g"),s+e+"}"+n)),t=t.replace(RegExp(e+"}","g"),e+":,."+r+"f}")})),a(t,{point:this,series:this.series},e.chart)}update(t,e,i,r){let s,n=this,o=n.series,a=n.graphic,l=o.chart,c=o.options;function h(){n.applyOptions(t);let r=a&&n.hasMockGraphic,h=null===n.y?!r:r;a&&h&&(n.graphic=a.destroy(),delete n.hasMockGraphic),y(t,!0)&&(a&&a.element&&t&&t.marker&&void 0!==t.marker.symbol&&(n.graphic=a.destroy()),t?.dataLabels&&n.dataLabel&&(n.dataLabel=n.dataLabel.destroy())),s=n.index,o.updateParallelArrays(n,s),c.data[s]=y(c.data[s],!0)||y(t,!0)?n.options:v(t,c.data[s]),o.isDirty=o.isDirtyData=!0,!o.fixedBox&&o.hasCartesianSeries&&(l.isDirtyBox=!0),"point"===c.legendType&&(l.isDirtyLegend=!0),e&&l.redraw(i)}e=v(e,!0),!1===r?h():n.firePointEvent("update",{options:t},h)}remove(t,e){this.series.removePoint(this.series.data.indexOf(this),t,e)}select(t,e){let i=this,r=i.series,s=r.chart;t=v(t,!i.selected),this.selectedStaging=t,i.firePointEvent(t?"select":"unselect",{accumulate:e},(function(){i.selected=i.options.selected=t,r.options.data[r.data.indexOf(i)]=i.options,i.setState(t&&"select"),e||s.getSelectedPoints().forEach((function(t){let e=t.series;t.selected&&t!==i&&(t.selected=t.options.selected=!1,e.options.data[e.data.indexOf(t)]=t.options,t.setState(s.hoverPoints&&e.options.inactiveOtherPoints?"inactive":""),t.firePointEvent("unselect"))}))})),delete this.selectedStaging}onMouseOver(t){let{inverted:e,pointer:i}=this.series.chart;i&&(t=t?i.normalize(t):i.getChartCoordinatesFromPoint(this,e),i.runPointActions(t,this))}onMouseOut(){let t=this.series.chart;this.firePointEvent("mouseOut"),this.series.options.inactiveOtherPoints||(t.hoverPoints||[]).forEach((function(t){t.setState()})),t.hoverPoints=t.hoverPoint=null}manageEvent(t){let e=_(this.series.options.point,this.options),i=e.events?.[t];!m(i)||this.hcEvents?.[t]&&-1!==this.hcEvents?.[t]?.map((t=>t.fn)).indexOf(i)?this.importedUserEvent&&!i&&this.hcEvents?.[t]&&(b(this,t),delete this.hcEvents[t],Object.keys(this.hcEvents)||delete this.importedUserEvent):(this.importedUserEvent?.(),this.importedUserEvent=l(this,t,i))}setState(e,i){let r,s,n,a,l=this.series,c=this.state,h=l.options.states[e||"normal"]||{},p=o.plotOptions[l.type].marker&&l.options.marker,f=p&&!1===p.enabled,m=p&&p.states&&p.states[e||"normal"]||{},y=!1===m.enabled,_=this.marker||{},x=l.chart,b=p&&l.markerAttribs,w=l.halo,S=l.stateMarkerGraphic;if((e=e||"")===this.state&&!i||this.selected&&"select"!==e||!1===h.enabled||e&&(y||f&&!1===m.enabled)||e&&_.states&&_.states[e]&&!1===_.states[e].enabled)return;if(this.state=e,b&&(r=l.markerAttribs(this,e)),this.graphic&&!this.hasMockGraphic){if(c&&this.graphic.removeClass("highcharts-point-"+c),e&&this.graphic.addClass("highcharts-point-"+e),!x.styledMode){s=l.pointAttribs(this,e),n=v(x.options.chart.animation,h.animation);let t=s.opacity;l.options.inactiveOtherPoints&&g(t)&&(this.dataLabels||[]).forEach((function(e){e&&!e.hasClass("highcharts-data-label-hidden")&&(e.animate({opacity:t},n),e.connector&&e.connector.animate({opacity:t},n))})),this.graphic.animate(s,n)}r&&this.graphic.animate(r,v(x.options.chart.animation,m.animation,p.animation)),S&&S.hide()}else e&&m&&(a=_.symbol||l.symbol,S&&S.currentSymbol!==a&&(S=S.destroy()),r&&(S?S[i?"animate":"attr"]({x:r.x,y:r.y}):a&&(l.stateMarkerGraphic=S=x.renderer.symbol(a,r.x,r.y,r.width,r.height).add(l.markerGroup),S.currentSymbol=a)),!x.styledMode&&S&&"inactive"!==this.state&&S.attr(l.pointAttribs(this,e))),S&&(S[e&&this.isInside?"show":"hide"](),S.element.point=this,S.addClass(this.getClassName(),!0));let C=h.halo,T=this.graphic||S,k=T&&T.visibility||"inherit";C&&C.size&&T&&"hidden"!==k&&!this.isCluster?(w||(l.halo=w=x.renderer.path().add(T.parentGroup)),w.show()[i?"animate":"attr"]({d:this.haloPath(C.size)}),w.attr({class:"highcharts-halo highcharts-color-"+v(this.colorIndex,l.colorIndex)+(this.className?" "+this.className:""),visibility:k,zIndex:-1}),w.point=this,x.styledMode||w.attr(u({fill:this.color||l.color,"fill-opacity":C.opacity},t.filterUserAttributes(C.attributes||{})))):w?.point?.haloPath&&!w.point.destroyed&&w.animate({d:w.point.haloPath(0)},null,w.hide),d(this,"afterSetState",{state:e})}haloPath(t){let e=this.pos();return e?this.series.chart.renderer.symbols.circle(c(e[0],1)-t,e[1]-t,2*t,2*t):[]}}return S})),i(e,"Core/Pointer.js",[e["Core/Color/Color.js"],e["Core/Globals.js"],e["Core/Utilities.js"]],(function(t,e,i){var r;let{parse:s}=t,{charts:n,composed:o,isTouchDevice:a}=e,{addEvent:l,attr:c,css:h,extend:u,find:d,fireEvent:p,isNumber:f,isObject:m,objectEach:g,offset:y,pick:_,pushUnique:v,splat:x}=i;class b{applyInactiveState(t){let e,i=[];(t||[]).forEach((function(t){e=t.series,i.push(e),e.linkedParent&&i.push(e.linkedParent),e.linkedSeries&&(i=i.concat(e.linkedSeries)),e.navigatorSeries&&i.push(e.navigatorSeries)})),this.chart.series.forEach((function(t){-1===i.indexOf(t)?t.setState("inactive",!0):t.options.inactiveOtherPoints&&t.setAllPointsToState("inactive")}))}destroy(){let t=this;this.eventsToUnbind.forEach((t=>t())),this.eventsToUnbind=[],!e.chartCount&&(b.unbindDocumentMouseUp&&(b.unbindDocumentMouseUp=b.unbindDocumentMouseUp()),b.unbindDocumentTouchEnd&&(b.unbindDocumentTouchEnd=b.unbindDocumentTouchEnd())),clearInterval(t.tooltipTimeout),g(t,(function(e,i){t[i]=void 0}))}getSelectionMarkerAttrs(t,e){let i={args:{chartX:t,chartY:e},attrs:{},shapeType:"rect"};return p(this,"getSelectionMarkerAttrs",i,(i=>{let r,{chart:s,zoomHor:n,zoomVert:o}=this,{mouseDownX:a=0,mouseDownY:l=0}=s,c=i.attrs;c.x=s.plotLeft,c.y=s.plotTop,c.width=n?1:s.plotWidth,c.height=o?1:s.plotHeight,n&&(r=t-a,c.width=Math.max(1,Math.abs(r)),c.x=(r>0?0:r)+a),o&&(r=e-l,c.height=Math.max(1,Math.abs(r)),c.y=(r>0?0:r)+l)})),i}drag(t){let e,{chart:i}=this,{mouseDownX:r=0,mouseDownY:n=0}=i,{panning:o,panKey:a,selectionMarkerFill:l}=i.options.chart,c=i.plotLeft,h=i.plotTop,u=i.plotWidth,d=i.plotHeight,p=m(o)?o.enabled:o,f=a&&t[`${a}Key`],g=t.chartX,y=t.chartY,_=this.selectionMarker;if((!_||!_.touch)&&(gc+u&&(g=c+u),yh+d&&(y=h+d),this.hasDragged=Math.sqrt(Math.pow(r-g,2)+Math.pow(n-y,2)),this.hasDragged>10)){e=i.isInsidePlot(r-c,n-h,{visiblePlotOnly:!0});let{shapeType:a,attrs:u}=this.getSelectionMarkerAttrs(g,y);(i.hasCartesianSeries||i.mapView)&&this.hasZoom&&e&&!f&&!_&&(this.selectionMarker=_=i.renderer[a](),_.attr({class:"highcharts-selection-marker",zIndex:7}).add(),i.styledMode||_.attr({fill:l||s("#334eff").setOpacity(.25).get()})),_&&_.attr(u),e&&!_&&p&&i.pan(t,o)}}dragStart(t){let e=this.chart;e.mouseIsDown=t.type,e.cancelClick=!1,e.mouseDownX=t.chartX,e.mouseDownY=t.chartY}getSelectionBox(t){let e={args:{marker:t},result:t.getBBox()};return p(this,"getSelectionBox",e),e.result}drop(t){let e,{chart:i,selectionMarker:r}=this;for(let t of i.axes)t.isPanning&&(t.isPanning=!1,(t.options.startOnTick||t.options.endOnTick||t.series.some((t=>t.boosted)))&&(t.forceRedraw=!0,t.setExtremes(t.userMin,t.userMax,!1),e=!0));if(e&&i.redraw(),r&&t){if(this.hasDragged){let e=this.getSelectionBox(r);i.transform({axes:i.axes.filter((t=>t.zoomEnabled&&("xAxis"===t.coll&&this.zoomX||"yAxis"===t.coll&&this.zoomY))),selection:{originalEvent:t,xAxis:[],yAxis:[],...e},from:e})}f(i.index)&&(this.selectionMarker=r.destroy())}i&&f(i.index)&&(h(i.container,{cursor:i._cursor}),i.cancelClick=this.hasDragged>10,i.mouseIsDown=!1,this.hasDragged=0,this.pinchDown=[])}findNearestKDPoint(t,e,i){let r;return t.forEach((function(t){let s=!(t.noSharedTooltip&&e)&&0>t.options.findNearestPointBy.indexOf("y"),n=t.searchPoint(i,s);m(n,!0)&&n.series&&(!m(r,!0)||function(t,i){let r=t.distX-i.distX,s=t.dist-i.dist,n=i.series.group?.zIndex-t.series.group?.zIndex;return 0!==r&&e?r:0!==s?s:0!==n?n:t.series.index>i.series.index?-1:1}(r,n)>0)&&(r=n)})),r}getChartCoordinatesFromPoint(t,e){let{xAxis:i,yAxis:r}=t.series,s=t.shapeArgs;if(i&&r){let n=t.clientX??t.plotX??0,o=t.plotY||0;return t.isNode&&s&&f(s.x)&&f(s.y)&&(n=s.x,o=s.y),e?{chartX:r.len+r.pos-o,chartY:i.len+i.pos-n}:{chartX:n+i.pos,chartY:o+r.pos}}if(s&&s.x&&s.y)return{chartX:s.x,chartY:s.y}}getChartPosition(){if(this.chartPosition)return this.chartPosition;let{container:t}=this.chart,e=y(t);this.chartPosition={left:e.left,top:e.top,scaleX:1,scaleY:1};let{offsetHeight:i,offsetWidth:r}=t;return r>2&&i>2&&(this.chartPosition.scaleX=e.width/r,this.chartPosition.scaleY=e.height/i),this.chartPosition}getCoordinates(t){let e={xAxis:[],yAxis:[]};for(let i of this.chart.axes)e[i.isXAxis?"xAxis":"yAxis"].push({axis:i,value:i.toValue(t[i.horiz?"chartX":"chartY"])});return e}getHoverData(t,e,i,r,s,n){let o,a=[],l=function(t){return t.visible&&!(!s&&t.directTouch)&&_(t.options.enableMouseTracking,!0)},c=e,h={chartX:n?n.chartX:void 0,chartY:n?n.chartY:void 0,shared:s};p(this,"beforeGetHoverData",h),o=c&&!c.stickyTracking?[c]:i.filter((t=>t.stickyTracking&&(h.filter||l)(t)));let u=r&&t||!n?t:this.findNearestKDPoint(o,s,n);return c=u&&u.series,u&&(s&&!c.noSharedTooltip?(o=i.filter((function(t){return h.filter?h.filter(t):l(t)&&!t.noSharedTooltip}))).forEach((function(t){let e=d(t.points,(function(t){return t.x===u.x&&!t.isNull}));m(e)&&(t.boosted&&t.boost&&(e=t.boost.getPoint(e)),a.push(e))})):a.push(u)),p(this,"afterGetHoverData",h={hoverPoint:u}),{hoverPoint:h.hoverPoint,hoverSeries:c,hoverPoints:a}}getPointFromEvent(t){let e,i=t.target;for(;i&&!e;)e=i.point,i=i.parentNode;return e}onTrackerMouseOut(t){let e=this.chart,i=t.relatedTarget,r=e.hoverSeries;this.isDirectTouch=!1,!r||!i||r.stickyTracking||this.inClass(i,"highcharts-tooltip")||this.inClass(i,"highcharts-series-"+r.index)&&this.inClass(i,"highcharts-tracker")||r.onMouseOut()}inClass(t,e){let i,r=t;for(;r;){if(i=c(r,"class")){if(-1!==i.indexOf(e))return!0;if(-1!==i.indexOf("highcharts-container"))return!1}r=r.parentElement}}constructor(t,e){this.hasDragged=0,this.pointerCaptureEventsToUnbind=[],this.eventsToUnbind=[],this.options=e,this.chart=t,this.runChartClick=!!e.chart.events?.click,this.pinchDown=[],this.setDOMEvents(),p(this,"afterInit")}normalize(t,e){let i=t.touches,r=i?i.length?i.item(0):_(i.changedTouches,t.changedTouches)[0]:t;e||(e=this.getChartPosition());let s=r.pageX-e.left,n=r.pageY-e.top;return u(t,{chartX:Math.round(s/=e.scaleX),chartY:Math.round(n/=e.scaleY)})}onContainerClick(t){let e=this.chart,i=e.hoverPoint,r=this.normalize(t),s=e.plotLeft,n=e.plotTop;!e.cancelClick&&(i&&this.inClass(r.target,"highcharts-tracker")?(p(i.series,"click",u(r,{point:i})),e.hoverPoint&&i.firePointEvent("click",r)):(u(r,this.getCoordinates(r)),e.isInsidePlot(r.chartX-s,r.chartY-n,{visiblePlotOnly:!0})&&p(e,"click",r)))}onContainerMouseDown(t){let i=!(1&~(t.buttons||t.button));t=this.normalize(t),e.isFirefox&&0!==t.button&&this.onContainerMouseMove(t),(void 0===t.button||i)&&(this.zoomOption(t),i&&t.preventDefault?.(),this.dragStart(t))}onContainerMouseLeave(t){let{pointer:e}=n[_(b.hoverChartIndex,-1)]||{};t=this.normalize(t),this.onContainerMouseMove(t),e&&!this.inClass(t.relatedTarget,"highcharts-tooltip")&&(e.reset(),e.chartPosition=void 0)}onContainerMouseEnter(){delete this.chartPosition}onContainerMouseMove(t){let e=this.chart,i=e.tooltip,r=this.normalize(t);this.setHoverChartIndex(t),("mousedown"===e.mouseIsDown||this.touchSelect(r))&&this.drag(r),!e.openMenu&&(this.inClass(r.target,"highcharts-tracker")||e.isInsidePlot(r.chartX-e.plotLeft,r.chartY-e.plotTop,{visiblePlotOnly:!0}))&&(!i||!i.shouldStickOnContact(r))&&(this.inClass(r.target,"highcharts-no-tooltip")?this.reset(!1,0):this.runPointActions(r))}onDocumentTouchEnd(t){this.onDocumentMouseUp(t)}onContainerTouchMove(t){this.touchSelect(t)?this.onContainerMouseMove(t):this.touch(t)}onContainerTouchStart(t){this.touchSelect(t)?this.onContainerMouseDown(t):(this.zoomOption(t),this.touch(t,!0))}onDocumentMouseMove(t){let e=this.chart,i=e.tooltip,r=this.chartPosition,s=this.normalize(t,r);!r||e.isInsidePlot(s.chartX-e.plotLeft,s.chartY-e.plotTop,{visiblePlotOnly:!0})||i&&i.shouldStickOnContact(s)||s.target!==e.container.ownerDocument&&this.inClass(s.target,"highcharts-tracker")||this.reset()}onDocumentMouseUp(t){n[_(b.hoverChartIndex,-1)]?.pointer?.drop(t)}pinch(t){let e=this,{chart:i,hasZoom:r,lastTouches:s}=e,n=[].map.call(t.touches||[],(t=>e.normalize(t))),o=n.length,a=1===o&&(e.inClass(t.target,"highcharts-tracker")&&i.runTrackerClick||e.runChartClick),l=i.tooltip,c=1===o&&_(l?.options.followTouchMove,!0);o>1?e.initiated=!0:c&&(e.initiated=!1),r&&e.initiated&&!a&&!1!==t.cancelable&&t.preventDefault(),"touchstart"===t.type?(e.pinchDown=n,e.res=!0,i.mouseDownX=t.chartX):c?this.runPointActions(e.normalize(t)):s&&(p(i,"touchpan",{originalEvent:t,touches:n},(()=>{let e=t=>{let e=t[0],i=t[1]||e;return{x:e.chartX,y:e.chartY,width:i.chartX-e.chartX,height:i.chartY-e.chartY}};i.transform({axes:i.axes.filter((t=>t.zoomEnabled&&(this.zoomHor&&t.horiz||this.zoomVert&&!t.horiz))),to:e(n),from:e(s),trigger:t.type})})),e.res&&(e.res=!1,this.reset(!1,0))),e.lastTouches=n}reset(t,e){let i=this.chart,r=i.hoverSeries,s=i.hoverPoint,n=i.hoverPoints,o=i.tooltip,a=o&&o.shared?n:s;t&&a&&x(a).forEach((function(e){e.series.isCartesian&&void 0===e.plotX&&(t=!1)})),t?o&&a&&x(a).length&&(o.refresh(a),o.shared&&n?n.forEach((function(t){t.setState(t.state,!0),t.series.isCartesian&&(t.series.xAxis.crosshair&&t.series.xAxis.drawCrosshair(null,t),t.series.yAxis.crosshair&&t.series.yAxis.drawCrosshair(null,t))})):s&&(s.setState(s.state,!0),i.axes.forEach((function(t){t.crosshair&&s.series[t.coll]===t&&t.drawCrosshair(null,s)})))):(s&&s.onMouseOut(),n&&n.forEach((function(t){t.setState()})),r&&r.onMouseOut(),o&&o.hide(e),this.unDocMouseMove&&(this.unDocMouseMove=this.unDocMouseMove()),i.axes.forEach((function(t){t.hideCrosshair()})),i.hoverPoints=i.hoverPoint=void 0)}runPointActions(t,e,i){let r=this.chart,s=r.series,o=r.tooltip&&r.tooltip.options.enabled?r.tooltip:void 0,a=!!o&&o.shared,c=e||r.hoverPoint,h=c&&c.series||r.hoverSeries,u=(!t||"touchmove"!==t.type)&&(!!e||h&&h.directTouch&&this.isDirectTouch),p=this.getHoverData(c,h,s,u,a,t);c=p.hoverPoint,h=p.hoverSeries;let f=p.hoverPoints,m=h&&h.tooltipOptions.followPointer&&!h.tooltipOptions.split,g=a&&h&&!h.noSharedTooltip;if(c&&(i||c!==r.hoverPoint||o&&o.isHidden)){if((r.hoverPoints||[]).forEach((function(t){-1===f.indexOf(t)&&t.setState()})),r.hoverSeries!==h&&h.onMouseOver(),this.applyInactiveState(f),(f||[]).forEach((function(t){t.setState("hover")})),r.hoverPoint&&r.hoverPoint.firePointEvent("mouseOut"),!c.series)return;r.hoverPoints=f,r.hoverPoint=c,c.firePointEvent("mouseOver",void 0,(()=>{o&&c&&o.refresh(g?f:c,t)}))}else if(m&&o&&!o.isHidden){let e=o.getAnchor([{}],t);r.isInsidePlot(e[0],e[1],{visiblePlotOnly:!0})&&o.updatePosition({plotX:e[0],plotY:e[1]})}this.unDocMouseMove||(this.unDocMouseMove=l(r.container.ownerDocument,"mousemove",(t=>n[b.hoverChartIndex??-1]?.pointer?.onDocumentMouseMove(t))),this.eventsToUnbind.push(this.unDocMouseMove)),r.axes.forEach((function(e){let i,s=_((e.crosshair||{}).snap,!0);!s||(i=r.hoverPoint)&&i.series[e.coll]===e||(i=d(f,(t=>t.series&&t.series[e.coll]===e))),i||!s?e.drawCrosshair(t,i):e.hideCrosshair()}))}setDOMEvents(){let t=this.chart.container,e=t.ownerDocument;t.onmousedown=this.onContainerMouseDown.bind(this),t.onmousemove=this.onContainerMouseMove.bind(this),t.onclick=this.onContainerClick.bind(this),this.eventsToUnbind.push(l(t,"mouseenter",this.onContainerMouseEnter.bind(this)),l(t,"mouseleave",this.onContainerMouseLeave.bind(this))),b.unbindDocumentMouseUp||(b.unbindDocumentMouseUp=l(e,"mouseup",this.onDocumentMouseUp.bind(this)));let i=this.chart.renderTo.parentElement;for(;i&&"BODY"!==i.tagName;)this.eventsToUnbind.push(l(i,"scroll",(()=>{delete this.chartPosition}))),i=i.parentElement;this.eventsToUnbind.push(l(t,"touchstart",this.onContainerTouchStart.bind(this),{passive:!1}),l(t,"touchmove",this.onContainerTouchMove.bind(this),{passive:!1})),b.unbindDocumentTouchEnd||(b.unbindDocumentTouchEnd=l(e,"touchend",this.onDocumentTouchEnd.bind(this),{passive:!1})),this.setPointerCapture(),l(this.chart,"redraw",this.setPointerCapture.bind(this))}setPointerCapture(){if(!a)return;let t=this.pointerCaptureEventsToUnbind,e=this.chart,i=e.container,r=_(e.options.tooltip?.followTouchMove,!0)&&e.series.some((t=>t.options.findNearestPointBy.indexOf("y")>-1));!this.hasPointerCapture&&r?(t.push(l(i,"pointerdown",(t=>{t.target?.hasPointerCapture(t.pointerId)&&t.target?.releasePointerCapture(t.pointerId)})),l(i,"pointermove",(t=>{e.pointer?.getPointFromEvent(t)?.onMouseOver(t)}))),e.styledMode||h(i,{"touch-action":"none"}),i.className+=" highcharts-no-touch-action",this.hasPointerCapture=!0):this.hasPointerCapture&&!r&&(t.forEach((t=>t())),t.length=0,e.styledMode||h(i,{"touch-action":_(e.options.chart.style?.["touch-action"],"manipulation")}),i.className=i.className.replace(" highcharts-no-touch-action",""),this.hasPointerCapture=!1)}setHoverChartIndex(t){let i=this.chart,r=e.charts[_(b.hoverChartIndex,-1)];if(r&&r!==i){let e={relatedTarget:i.container};t&&!t?.relatedTarget&&(t={...e,...t}),r.pointer?.onContainerMouseLeave(t||e)}r&&r.mouseIsDown||(b.hoverChartIndex=i.index)}touch(t,e){let i,{chart:r,pinchDown:s=[]}=this;this.setHoverChartIndex(),1===(t=this.normalize(t)).touches.length?r.isInsidePlot(t.chartX-r.plotLeft,t.chartY-r.plotTop,{visiblePlotOnly:!0})&&!r.openMenu?(e&&this.runPointActions(t),"touchmove"===t.type&&(i=!!s[0]&&Math.pow(s[0].chartX-t.chartX,2)+Math.pow(s[0].chartY-t.chartY,2)>=16),_(i,!0)&&this.pinch(t)):e&&this.reset():2===t.touches.length&&this.pinch(t)}touchSelect(t){return!(!this.chart.zooming.singleTouch||!t.touches||1!==t.touches.length)}zoomOption(t){let e,i,r=this.chart,s=r.inverted,n=r.zooming.type||"";/touch/.test(t.type)&&(n=_(r.zooming.pinchType,n)),this.zoomX=e=/x/.test(n),this.zoomY=i=/y/.test(n),this.zoomHor=e&&!s||i&&s,this.zoomVert=i&&!s||e&&s,this.hasZoom=e||i}}return(r=b||(b={})).compose=function(t){v(o,"Core.Pointer")&&l(t,"beforeRender",(function(){this.pointer=new r(this,this.options)}))},b})),i(e,"Core/Legend/LegendSymbol.js",[e["Core/Utilities.js"]],(function(t){var e;let{extend:i,merge:r,pick:s}=t;return function(t){function e(t,e,n){let o,a=this.legendItem=this.legendItem||{},{chart:l,options:c}=this,{baseline:h=0,symbolWidth:u,symbolHeight:d}=t,p=this.symbol||"circle",f=d/2,m=l.renderer,g=a.group,y=h-Math.round(d*(n?.4:.3)),_={},v=c.marker,x=0;if(l.styledMode||(_["stroke-width"]=Math.min(c.lineWidth||0,24),c.dashStyle?_.dashstyle=c.dashStyle:"square"===c.linecap||(_["stroke-linecap"]="round")),a.line=m.path().addClass("highcharts-graph").attr(_).add(g),n&&(a.area=m.path().addClass("highcharts-area").add(g)),_["stroke-linecap"]&&(x=Math.min(a.line.strokeWidth(),u)/2),u){let t=[["M",x,y],["L",u-x,y]];a.line.attr({d:t}),a.area?.attr({d:[...t,["L",u-x,h],["L",x,h]]})}if(v&&!1!==v.enabled&&u){let t=Math.min(s(v.radius,f),f);0===p.indexOf("url")&&(v=r(v,{width:d,height:d}),t=0),a.symbol=o=m.symbol(p,u/2-t,y-t,2*t,2*t,i({context:"legend"},v)).addClass("highcharts-point").add(g),o.isMarker=!0}}t.areaMarker=function(t,i){e.call(this,t,i,!0)},t.lineMarker=e,t.rectangle=function(t,e){let i=e.legendItem||{},r=t.options,n=t.symbolHeight,o=r.squareSymbol,a=o?n:t.symbolWidth;i.symbol=this.chart.renderer.rect(o?(t.symbolWidth-n)/2:0,t.baseline-n+1,a,n,s(t.options.symbolRadius,n/2)).addClass("highcharts-point").attr({zIndex:3}).add(i.group)}}(e||(e={})),e})),i(e,"Core/Series/SeriesDefaults.js",[],(function(){return{lineWidth:2,allowPointSelect:!1,crisp:!0,showCheckbox:!1,animation:{duration:1e3},enableMouseTracking:!0,events:{},marker:{enabledThreshold:2,lineColor:"#ffffff",lineWidth:0,radius:4,states:{normal:{animation:!0},hover:{animation:{duration:150},enabled:!0,radiusPlus:2,lineWidthPlus:1},select:{fillColor:"#cccccc",lineColor:"#000000",lineWidth:2}}},point:{events:{}},dataLabels:{animation:{},align:"center",borderWidth:0,defer:!0,formatter:function(){let{numberFormatter:t}=this.series.chart;return"number"!=typeof this.y?"":t(this.y,-1)},padding:5,style:{fontSize:"0.7em",fontWeight:"bold",color:"contrast",textOutline:"1px contrast"},verticalAlign:"bottom",x:0,y:0},cropThreshold:300,opacity:1,pointRange:0,softThreshold:!0,states:{normal:{animation:!0},hover:{animation:{duration:150},lineWidthPlus:1,marker:{},halo:{size:10,opacity:.25}},select:{animation:{duration:0}},inactive:{animation:{duration:150},opacity:.2}},stickyTracking:!0,turboThreshold:1e3,findNearestPointBy:"x"}})),i(e,"Core/Series/SeriesRegistry.js",[e["Core/Globals.js"],e["Core/Defaults.js"],e["Core/Series/Point.js"],e["Core/Utilities.js"]],(function(t,e,i,r){var s;let{defaultOptions:n}=e,{extend:o,extendClass:a,merge:l}=r;return function(e){function r(t,r){let s=n.plotOptions||{},o=r.defaultOptions,a=r.prototype;return a.type=t,a.pointClass||(a.pointClass=i),!e.seriesTypes[t]&&(o&&(s[t]=o),e.seriesTypes[t]=r,!0)}e.seriesTypes=t.seriesTypes,e.registerSeriesType=r,e.seriesType=function(t,s,c,h,u){let d=n.plotOptions||{};if(s=s||"",d[t]=l(d[s],c),delete e.seriesTypes[t],r(t,a(e.seriesTypes[s]||function(){},h)),e.seriesTypes[t].prototype.type=t,u){class r extends i{}o(r.prototype,u),e.seriesTypes[t].prototype.pointClass=r}return e.seriesTypes[t]}}(s||(s={})),s})),i(e,"Core/Series/Series.js",[e["Core/Animation/AnimationUtilities.js"],e["Core/Defaults.js"],e["Core/Foundation.js"],e["Core/Globals.js"],e["Core/Legend/LegendSymbol.js"],e["Core/Series/Point.js"],e["Core/Series/SeriesDefaults.js"],e["Core/Series/SeriesRegistry.js"],e["Core/Renderer/SVG/SVGElement.js"],e["Core/Utilities.js"]],(function(t,e,i,r,s,n,o,a,l,c){let{animObject:h,setAnimation:u}=t,{defaultOptions:d}=e,{registerEventOptions:p}=i,{svg:f,win:m}=r,{seriesTypes:g}=a,{arrayMax:y,arrayMin:_,clamp:v,correctFloat:x,crisp:b,defined:w,destroyObjectProperties:S,diffObjects:C,erase:T,error:k,extend:E,find:A,fireEvent:M,getClosestDistance:P,getNestedProperty:I,insertItem:L,isArray:D,isNumber:z,isString:O,merge:R,objectEach:N,pick:B,removeEvent:F,splat:j,syncTimeout:U}=c;class V{constructor(){this.zoneAxis="y"}init(t,e){let i;M(this,"init",{options:e});let r=this,s=t.series;this.eventsToUnbind=[],r.chart=t,r.options=r.setOptions(e);let n=r.options,o=!1!==n.visible;r.linkedSeries=[],r.bindAxes(),E(r,{name:n.name,state:"",visible:o,selected:!0===n.selected}),p(this,n);let a=n.events;(a&&a.click||n.point&&n.point.events&&n.point.events.click||n.allowPointSelect)&&(t.runTrackerClick=!0),r.getColor(),r.getSymbol(),r.parallelArrays.forEach((function(t){r[t+"Data"]||(r[t+"Data"]=[])})),r.isCartesian&&(t.hasCartesianSeries=!0),s.length&&(i=s[s.length-1]),r._i=B(i&&i._i,-1)+1,r.opacity=r.options.opacity,t.orderItems("series",L(this,s)),n.dataSorting&&n.dataSorting.enabled?r.setDataSortingOptions():r.points||r.data||r.setData(n.data,!1),M(this,"afterInit")}is(t){return g[t]&&this instanceof g[t]}bindAxes(){let t,e=this,i=e.options,r=e.chart;M(this,"bindAxes",null,(function(){(e.axisTypes||[]).forEach((function(s){(r[s]||[]).forEach((function(r){t=r.options,(B(i[s],0)===r.index||void 0!==i[s]&&i[s]===t.id)&&(L(e,r.series),e[s]=r,r.isDirty=!0)})),e[s]||e.optionalAxis===s||k(18,!0,r)}))})),M(this,"afterBindAxes")}updateParallelArrays(t,e,i){let r=t.series,s=z(e)?function(i){let s="y"===i&&r.toYData?r.toYData(t):t[i];r[i+"Data"][e]=s}:function(t){Array.prototype[e].apply(r[t+"Data"],i)};r.parallelArrays.forEach(s)}hasData(){return this.visible&&void 0!==this.dataMax&&void 0!==this.dataMin||this.visible&&this.yData&&this.yData.length>0}hasMarkerChanged(t,e){let i=t.marker,r=e.marker||{};return i&&(r.enabled&&!i.enabled||r.symbol!==i.symbol||r.height!==i.height||r.width!==i.width)}autoIncrement(t){let e,i,r=this.options,s=r.pointIntervalUnit,n=r.relativeXValue,o=this.chart.time,a=this.xIncrement;return a=B(a,r.pointStart,0),this.pointInterval=i=B(this.pointInterval,r.pointInterval,1),n&&z(t)&&(i*=t),s&&(e=new o.Date(a),"day"===s?o.set("Date",e,o.get("Date",e)+i):"month"===s?o.set("Month",e,o.get("Month",e)+i):"year"===s&&o.set("FullYear",e,o.get("FullYear",e)+i),i=e.getTime()-a),n&&z(t)?a+i:(this.xIncrement=a+i,a)}setDataSortingOptions(){let t=this.options;E(this,{requireSorting:!1,sorted:!1,enabledDataSorting:!0,allowDG:!1}),w(t.pointRange)||(t.pointRange=1)}setOptions(t){let e,i=this.chart,r=i.options.plotOptions,s=i.userOptions||{},n=R(t),o=i.styledMode,a={plotOptions:r,userOptions:n};M(this,"setOptions",a);let l=a.plotOptions[this.type],c=s.plotOptions||{},h=c.series||{},u=d.plotOptions[this.type]||{},p=c[this.type]||{};this.userOptions=a.userOptions;let f=R(l,r.series,p,n);this.tooltipOptions=R(d.tooltip,d.plotOptions.series?.tooltip,u?.tooltip,i.userOptions.tooltip,c.series?.tooltip,p.tooltip,n.tooltip),this.stickyTracking=B(n.stickyTracking,p.stickyTracking,h.stickyTracking,!!this.tooltipOptions.shared&&!this.noSharedTooltip||f.stickyTracking),null===l.marker&&delete f.marker,this.zoneAxis=f.zoneAxis||"y";let m=this.zones=(f.zones||[]).map((t=>({...t})));return(f.negativeColor||f.negativeFillColor)&&!f.zones&&(e={value:f[this.zoneAxis+"Threshold"]||f.threshold||0,className:"highcharts-negative"},o||(e.color=f.negativeColor,e.fillColor=f.negativeFillColor),m.push(e)),m.length&&w(m[m.length-1].value)&&m.push(o?{}:{color:this.color,fillColor:this.fillColor}),M(this,"afterSetOptions",{options:f}),f}getName(){return B(this.options.name,"Series "+(this.index+1))}getCyclic(t,e,i){let r,s,n=this.chart,o=`${t}Index`,a=`${t}Counter`,l=i?.length||n.options.chart.colorCount;!e&&(w(s=B("color"===t?this.options.colorIndex:void 0,this[o]))?r=s:(n.series.length||(n[a]=0),r=n[a]%l,n[a]+=1),i&&(e=i[r])),void 0!==r&&(this[o]=r),this[t]=e}getColor(){this.chart.styledMode?this.getCyclic("color"):this.options.colorByPoint?this.color="#cccccc":this.getCyclic("color",this.options.color||d.plotOptions[this.type].color,this.chart.options.colors)}getPointsCollection(){return(this.hasGroupedData?this.points:this.data)||[]}getSymbol(){let t=this.options.marker;this.getCyclic("symbol",t.symbol,this.chart.options.symbols)}findPointIndex(t,e){let i,r,s,o=t.id,a=t.x,l=this.points,c=this.options.dataSorting;if(o){let t=this.chart.get(o);t instanceof n&&(i=t)}else if(this.linkedParent||this.enabledDataSorting||this.options.relativeXValue){let e=e=>!e.touched&&e.index===t.index;if(c&&c.matchByName?e=e=>!e.touched&&e.name===t.name:this.options.relativeXValue&&(e=e=>!e.touched&&e.options.x===t.x),!(i=A(l,e)))return}return i&&void 0!==(s=i&&i.index)&&(r=!0),void 0===s&&z(a)&&(s=this.xData.indexOf(a,e)),-1!==s&&void 0!==s&&this.cropped&&(s=s>=this.cropStart?s-this.cropStart:s),!r&&z(s)&&l[s]&&l[s].touched&&(s=void 0),s}updateData(t,e){let i,r,s,n,o=this.options,a=o.dataSorting,l=this.points,c=[],h=this.requireSorting,u=t.length===l.length,d=!0;if(this.xIncrement=null,t.forEach((function(t,e){let r,s=w(t)&&this.pointClass.prototype.optionsToObject.call({series:this},t)||{},d=s.x;s.id||z(d)?(-1===(r=this.findPointIndex(s,n))||void 0===r?c.push(t):l[r]&&t!==o.data[r]?(l[r].update(t,!1,null,!1),l[r].touched=!0,h&&(n=r+1)):l[r]&&(l[r].touched=!0),(!u||e!==r||a&&a.enabled||this.hasDerivedData)&&(i=!0)):c.push(t)}),this),i)for(r=l.length;r--;)(s=l[r])&&!s.touched&&s.remove&&s.remove(!1,e);else!u||a&&a.enabled?d=!1:(t.forEach((function(t,e){t===l[e].y||l[e].destroyed||l[e].update(t,!1,null,!1)})),c.length=0);return l.forEach((function(t){t&&(t.touched=!1)})),!!d&&(c.forEach((function(t){this.addPoint(t,!1,null,null,!1)}),this),null===this.xIncrement&&this.xData&&this.xData.length&&(this.xIncrement=y(this.xData),this.autoIncrement()),!0)}setData(t,e=!0,i,r){let s,n,o,a,l=this,c=l.points,h=c&&c.length||0,u=l.options,d=l.chart,p=u.dataSorting,f=l.xAxis,m=u.turboThreshold,g=this.xData,y=this.yData,_=l.pointArrayMap,v=_&&_.length,x=u.keys,b=0,w=1;d.options.chart.allowMutatingData||(u.data&&delete l.options.data,l.userOptions.data&&delete l.userOptions.data,a=R(!0,t));let S=(t=a||t||[]).length;if(p&&p.enabled&&(t=this.sortData(t)),d.options.chart.allowMutatingData&&!1!==r&&S&&h&&!l.cropped&&!l.hasGroupedData&&l.visible&&!l.boosted&&(o=this.updateData(t,i)),!o){l.xIncrement=null,l.colorCounter=0,this.parallelArrays.forEach((function(t){l[t+"Data"].length=0}));let e=m&&S>m;if(e){let i=l.getFirstValidPoint(t),r=l.getFirstValidPoint(t,S-1,-1),o=t=>!(!D(t)||!x&&!z(t[0]));if(z(i)&&z(r))for(s=0;s=0?b:0,w=w>=0?w:1),1===i.length&&(w=0),b===w)for(s=0;s{let r=I(i,t),s=I(i,e);return sr?1:0})).forEach((function(t,e){t.x=e}),this),e.linkedSeries&&e.linkedSeries.forEach((function(e){let i=e.options,s=i.data;i.dataSorting&&i.dataSorting.enabled||!s||(s.forEach((function(i,n){s[n]=r(e,i),t[n]&&(s[n].x=t[n].x,s[n].index=n)})),e.setData(s,!1))})),t}getProcessedData(t){let e,i,r,s,n,o=this,a=o.xAxis,l=o.options.cropThreshold,c=a?.logarithmic,h=o.isCartesian,u=0,d=o.xData,p=o.yData,f=!1,m=d.length;a&&(s=(r=a.getExtremes()).min,n=r.max,f=!(!a.categories||a.names.length)),h&&o.sorted&&!t&&(!l||m>l||o.forceCrop)&&(d[m-1]n?(d=[],p=[]):o.yData&&(d[0]n)&&(d=(e=this.cropData(o.xData,o.yData,s,n)).xData,p=e.yData,u=e.start,i=!0));let g=P([c?d.map(c.log2lin):d],(()=>o.requireSorting&&!f&&k(15,!1,o.chart)));return{xData:d,yData:p,cropped:i,cropStart:u,closestPointRange:g}}processData(t){let e=this.xAxis;if(this.isCartesian&&!this.isDirty&&!e.isDirty&&!this.yAxis.isDirty&&!t)return!1;let i=this.getProcessedData();this.cropped=i.cropped,this.cropStart=i.cropStart,this.processedXData=i.xData,this.processedYData=i.yData,this.closestPointRange=this.basePointRange=i.closestPointRange,M(this,"afterProcessData")}cropData(t,e,i,r){let s,n,o=t.length,a=0,l=o;for(s=0;s=i){a=Math.max(0,s-1);break}for(n=s;nr){l=n+1;break}return{xData:t.slice(a,l),yData:e.slice(a,l),start:a,end:l}}generatePoints(){let t,e,i,r,s=this.options,n=this.processedData||s.data,o=this.processedXData,a=this.processedYData,l=this.pointClass,c=o.length,h=this.cropStart||0,u=this.hasGroupedData,d=s.keys,p=[],f=s.dataGrouping&&s.dataGrouping.groupAll?h:0,m=this.data;if(!m&&!u){let t=[];t.length=n.length,m=this.data=t}for(d&&u&&(this.options.keys=!1),r=0;r0:o.length)||!p),s=e||this.getExtremesFromAll||this.options.getExtremesFromAll||this.cropped||!c||(S[a+d]||n)>=v&&(S[a-d]||n)<=x,r&&s)if(l=o.length)for(;l--;)z(o[l])&&(u[b++]=o[l]);else u[b++]=o;let C={activeYData:u,dataMin:_(u),dataMax:y(u)};return M(this,"afterGetExtremes",{dataExtremes:C}),C}applyExtremes(){let t=this.getExtremes();return this.dataMin=t.dataMin,this.dataMax=t.dataMax,t}getFirstValidPoint(t,e=0,i=1){let r=t.length,s=e;for(;s>=0&&s1)&&(n.step=function(t,e){i&&i.apply(e,arguments),"width"===e.prop&&l?.element&&l.attr(s?"height":"width",t+99)}),a.addClass("highcharts-animating").animate(t,n)}}afterAnimate(){this.setClip(),N(this.chart.sharedClips,((t,e,i)=>{t&&!this.chart.container.querySelector(`[clip-path="url(#${t.id})"]`)&&(t.destroy(),delete i[e])})),this.finishedAnimating=!0,M(this,"afterAnimate")}drawPoints(t=this.points){let e,i,r,s,n,o,a,l=this.chart,c=l.styledMode,{colorAxis:h,options:u}=this,d=u.marker,p=this[this.specialGroup||"markerGroup"],f=this.xAxis,m=B(d.enabled,!f||!!f.isRadial||null,this.closestPointRangePx>=d.enabledThreshold*d.radius);if(!1!==d.enabled||this._hasPointMarkers)for(e=0;e0||i.hasImage)&&(i.graphic=r=l.renderer.symbol(t,a.x,a.y,a.width,a.height,o?n:d).add(p),this.enabledDataSorting&&l.hasRendered&&(r.attr({x:i.startXPos}),s="animate")),r&&"animate"===s&&r[e?"show":"hide"](e).animate(a),r){let t=this.pointAttribs(i,c||!i.selected?void 0:"select");c?h&&r.css({fill:t.fill}):r[s](t)}r&&r.addClass(i.getClassName(),!0)}else r&&(i.graphic=r.destroy())}markerAttribs(t,e){let i,r,s=this.options,n=s.marker,o=t.marker||{},a=o.symbol||n.symbol,l={},c=B(o.radius,n&&n.radius);e&&(i=n.states[e],c=B((r=o.states&&o.states[e])&&r.radius,i&&i.radius,c&&c+(i&&i.radiusPlus||0))),t.hasImage=a&&0===a.indexOf("url"),t.hasImage&&(c=0);let h=t.pos();return z(c)&&h&&(s.crisp&&(h[0]=b(h[0],t.hasImage?0:"rect"===a?n?.lineWidth||0:1)),l.x=h[0]-c,l.y=h[1]-c),c&&(l.width=l.height=2*c),l}pointAttribs(t,e){let i,r,s,n,o=this.options.marker,a=t&&t.options,l=a&&a.marker||{},c=a&&a.color,h=t&&t.color,u=t&&t.zone&&t.zone.color,d=this.color,p=B(l.lineWidth,o.lineWidth),f=1;return d=c||u||h||d,s=l.fillColor||o.fillColor||d,n=l.lineColor||o.lineColor||d,e=e||"normal",i=o.states[e]||{},p=B((r=l.states&&l.states[e]||{}).lineWidth,i.lineWidth,p+B(r.lineWidthPlus,i.lineWidthPlus,0)),s=r.fillColor||i.fillColor||s,{stroke:n=r.lineColor||i.lineColor||n,"stroke-width":p,fill:s,opacity:f=B(r.opacity,i.opacity,f)}}destroy(t){let e,i,r,s=this,n=s.chart,o=/AppleWebKit\/533/.test(m.navigator.userAgent),a=s.data||[];for(M(s,"destroy",{keepEventsForUpdate:t}),this.removeEvents(t),(s.axisTypes||[]).forEach((function(t){(r=s[t])&&r.series&&(T(r.series,s),r.isDirty=r.forceRedraw=!0)})),s.legendItem&&s.chart.legend.destroyItem(s),e=a.length;e--;)(i=a[e])&&i.destroy&&i.destroy();for(let t of s.zones)S(t,void 0,!0);c.clearTimeout(s.animationTimeout),N(s,(function(t,e){t instanceof l&&!t.survive&&t[o&&"group"===e?"hide":"destroy"]()})),n.hoverSeries===s&&(n.hoverSeries=void 0),T(n.series,s),n.orderItems("series"),N(s,(function(e,i){t&&"hcEvents"===i||delete s[i]}))}applyZones(){let{area:t,chart:e,graph:i,zones:r,points:s,xAxis:n,yAxis:o,zoneAxis:a}=this,{inverted:l,renderer:c}=e,h=this[`${a}Axis`],{isXAxis:u,len:d=0}=h||{},p=(i?.strokeWidth()||0)/2+1,f=(t,e=0,i=0)=>{l&&(i=d-i);let{translated:r=0,lineClip:s}=t,n=i-r;s?.push(["L",e,Math.abs(n){t.forEach(((e,i)=>{("M"===e[0]||"L"===e[0])&&(t[i]=[e[0],u?d-e[1]:e[1],u?e[2]:d-e[2]])}))};if(r.forEach((t=>{t.lineClip=[],t.translated=v(h.toPixels(B(t.value,e),!0)||0,0,d)})),i&&!this.showLine&&i.hide(),t&&t.hide(),"y"===a&&s.length{let r=e.lineClip||[],s=Math.round(e.translated||0);n.reversed&&r.reverse();let{clip:a,simpleClip:h}=e,d=0,f=0,y=n.len,_=o.len;u?(d=s,y=g):(f=s,_=g);let v=[["M",d,f],["L",y,f],["L",y,_],["L",d,_],["Z"]],x=[v[0],...r,v[1],v[2],...m,v[3],v[4]];m=r.reverse(),g=s,l&&(p(x),t&&p(v)),a?(a.animate({d:x}),h?.animate({d:v})):(a=e.clip=c.path(x),t&&(h=e.simpleClip=c.path(v))),i&&e.graph?.clip(a),t&&e.area?.clip(h)}))}else this.visible&&(i&&i.show(),t&&t.show())}plotGroup(t,e,i,r,s){let n=this[t],o=!n,a={visibility:i,zIndex:r||.1};return w(this.opacity)&&!this.chart.styledMode&&"inactive"!==this.state&&(a.opacity=this.opacity),n||(this[t]=n=this.chart.renderer.g().add(s)),n.addClass("highcharts-"+e+" highcharts-series-"+this.index+" highcharts-"+this.type+"-series "+(w(this.colorIndex)?"highcharts-color-"+this.colorIndex+" ":"")+(this.options.className||"")+(n.hasClass("highcharts-tracker")?" highcharts-tracker":""),!0),n.attr(a)[o?"attr":"animate"](this.getPlotBox(e)),n}getPlotBox(t){let e=this.xAxis,i=this.yAxis,r=this.chart,s=r.inverted&&!r.polar&&e&&this.invertible&&"series"===t;return r.inverted&&(e=i,i=this.xAxis),{translateX:e?e.left:r.plotLeft,translateY:i?i.top:r.plotTop,rotation:s?90:0,rotationOriginX:s?(e.len-i.len)/2:0,rotationOriginY:s?(e.len+i.len)/2:0,scaleX:s?-1:1,scaleY:1}}removeEvents(t){let{eventsToUnbind:e}=this;t||F(this),e.length&&(e.forEach((t=>{t()})),e.length=0)}render(){let t=this,{chart:e,options:i,hasRendered:r}=t,s=h(i.animation),n=t.visible?"inherit":"hidden",o=i.zIndex,a=e.seriesGroup,l=t.finishedAnimating?0:s.duration;M(this,"render"),t.plotGroup("group","series",n,o,a),t.markerGroup=t.plotGroup("markerGroup","markers",n,o,a),!1!==i.clip&&t.setClip(),l&&t.animate?.(!0),t.drawGraph&&(t.drawGraph(),t.applyZones()),t.visible&&t.drawPoints(),t.drawDataLabels?.(),t.redrawPoints?.(),i.enableMouseTracking&&t.drawTracker?.(),l&&t.animate?.(),r||(l&&s.defer&&(l+=s.defer),t.animationTimeout=U((()=>{t.afterAnimate()}),l||0)),t.isDirty=!1,t.hasRendered=!0,M(t,"afterRender")}redraw(){let t=this.isDirty||this.isDirtyData;this.translate(),this.render(),t&&delete this.kdTree}reserveSpace(){return this.visible||!this.chart.options.chart.ignoreHiddenSeries}searchPoint(t,e){let{xAxis:i,yAxis:r}=this,s=this.chart.inverted;return this.searchKDTree({clientX:s?i.len-t.chartY+i.pos:t.chartX-i.pos,plotY:s?r.len-t.chartX+r.pos:t.chartY-r.pos},e,t)}buildKDTree(t){this.buildingKdTree=!0;let e=this,i=e.options.findNearestPointBy.indexOf("y")>-1?2:1;delete e.kdTree,U((function(){e.kdTree=function t(i,r,s){let n,o,a=i?.length;if(a)return n=e.kdAxisArray[r%s],i.sort(((t,e)=>(t[n]||0)-(e[n]||0))),{point:i[o=Math.floor(a/2)],left:t(i.slice(0,o),r+1,s),right:t(i.slice(o+1),r+1,s)}}(e.getValidPoints(void 0,!e.directTouch),i,i),e.buildingKdTree=!1}),e.options.kdNow||"touchstart"===t?.type?0:1)}searchKDTree(t,e,i){let r=this,[s,n]=this.kdAxisArray,o=e?"distX":"dist",a=(r.options.findNearestPointBy||"").indexOf("y")>-1?2:1,l=!!r.isBubble;if(this.kdTree||this.buildingKdTree||this.buildKDTree(i),this.kdTree)return function t(e,i,a,c){let h,u,d=i.point,p=r.kdAxisArray[a%c],f=d;!function(t,e){let i=t[s],r=e[s],o=w(i)&&w(r)?i-r:null,a=t[n],c=e[n],h=w(a)&&w(c)?a-c:0,u=l&&e.marker?.radius||0;e.dist=Math.sqrt((o&&o*o||0)+h*h)-u,e.distX=w(o)?Math.abs(o)-u:Number.MAX_VALUE}(e,d);let m=(e[p]||0)-(d[p]||0)+(l&&d.marker?.radius||0),g=m<0?"left":"right",y=m<0?"right":"left";return i[g]&&(f=(h=t(e,i[g],a+1,c))[o]=0&&n<=(r?r.len:e.plotHeight)&&s>=0&&s<=(i?i.len:e.plotWidth)}drawTracker(){let t=this,e=t.options,i=e.trackByArea,r=[].concat((i?t.areaPath:t.graphPath)||[]),s=t.chart,n=s.pointer,o=s.renderer,a=s.options.tooltip?.snap||0,l=()=>{e.enableMouseTracking&&s.hoverSeries!==t&&t.onMouseOver()},c="rgba(192,192,192,"+(f?1e-4:.002)+")",h=t.tracker;h?h.attr({d:r}):t.graph&&(t.tracker=h=o.path(r).attr({visibility:t.visible?"inherit":"hidden",zIndex:2}).addClass(i?"highcharts-tracker-area":"highcharts-tracker-line").add(t.group),s.styledMode||h.attr({"stroke-linecap":"round","stroke-linejoin":"round",stroke:c,fill:i?c:"none","stroke-width":t.graph.strokeWidth()+(i?0:2*a)}),[t.tracker,t.markerGroup,t.dataLabelsGroup].forEach((t=>{t&&(t.addClass("highcharts-tracker").on("mouseover",l).on("mouseout",(t=>{n?.onTrackerMouseOut(t)})),e.cursor&&!s.styledMode&&t.css({cursor:e.cursor}),t.on("touchstart",l))}))),M(this,"afterDrawTracker")}addPoint(t,e,i,r,s){let n,o,a=this.options,l=this.data,c=this.chart,h=this.xAxis,u=h&&h.hasNames&&h.names,d=a.data,p=this.xData;e=B(e,!0);let f={series:this};this.pointClass.prototype.applyOptions.apply(f,[t]);let m=f.x;if(o=p.length,this.requireSorting&&mm;)o--;this.updateParallelArrays(f,"splice",[o,0,0]),this.updateParallelArrays(f,o),u&&f.name&&(u[m]=f.name),d.splice(o,0,t),(n||this.processedData)&&(this.data.splice(o,0,null),this.processData()),"point"===a.legendType&&this.generatePoints(),i&&(l[0]&&l[0].remove?l[0].remove(!1):(l.shift(),this.updateParallelArrays(f,"shift"),d.shift())),!1!==s&&M(this,"addPoint",{point:f}),this.isDirty=!0,this.isDirtyData=!0,e&&c.redraw(r)}removePoint(t,e,i){let r=this,s=r.data,n=s[t],o=r.points,a=r.chart,l=function(){o&&o.length===s.length&&o.splice(t,1),s.splice(t,1),r.options.data.splice(t,1),r.updateParallelArrays(n||{series:r},"splice",[t,1]),n&&n.destroy(),r.isDirty=!0,r.isDirtyData=!0,e&&a.redraw()};u(i,a),e=B(e,!0),n?n.firePointEvent("remove",null,l):l()}remove(t,e,i,r){let s=this,n=s.chart;function o(){s.destroy(r),n.isDirtyLegend=n.isDirtyBox=!0,n.linkSeries(r),B(t,!0)&&n.redraw(e)}!1!==i?M(s,"remove",null,o):o()}update(t,e){M(this,"update",{options:t=C(t,this.userOptions)});let i,r,s=this,n=s.chart,o=s.userOptions,a=s.initialType||s.type,l=n.options.plotOptions,c=g[a].prototype,h=s.finishedAnimating&&{animation:!1},u={},d=["colorIndex","eventOptions","navigatorSeries","symbolIndex","baseSeries"],p=t.type||o.type||n.options.chart.type,f=!(this.hasDerivedData||p&&p!==this.type||void 0!==t.pointStart||void 0!==t.pointInterval||void 0!==t.relativeXValue||t.joinBy||t.mapData||["dataGrouping","pointStart","pointInterval","pointIntervalUnit","keys"].some((t=>s.hasOptionChanged(t))));p=p||a,f&&(d.push("data","isDirtyData","isDirtyCanvas","points","processedData","processedXData","processedYData","xIncrement","cropped","_hasPointMarkers","hasDataLabels","nodes","layout","level","mapMap","mapData","minY","maxY","minX","maxX","transformGroups"),!1!==t.visible&&d.push("area","graph"),s.parallelArrays.forEach((function(t){d.push(t+"Data")})),t.data&&(t.dataSorting&&E(s.options.dataSorting,t.dataSorting),this.setData(t.data,!1))),t=R(o,{index:void 0===o.index?s.index:o.index,pointStart:l?.series?.pointStart??o.pointStart??s.xData?.[0]},!f&&{data:s.options.data},t,h),f&&t.data&&(t.data=s.options.data),(d=["group","markerGroup","dataLabelsGroup","transformGroup"].concat(d)).forEach((function(t){d[t]=s[t],delete s[t]}));let m=!1;if(g[p]){if(m=p!==s.type,s.remove(!1,!1,!1,!0),m)if(n.propFromSeries(),Object.setPrototypeOf)Object.setPrototypeOf(s,g[p].prototype);else{let t=Object.hasOwnProperty.call(s,"hcEvents")&&s.hcEvents;for(r in c)s[r]=void 0;E(s,g[p].prototype),t?s.hcEvents=t:delete s.hcEvents}}else k(17,!0,n,{missingModuleFor:p});if(d.forEach((function(t){s[t]=d[t]})),s.init(n,t),f&&this.points)for(let t of(!1===(i=s.options).visible?(u.graphic=1,u.dataLabel=1):(this.hasMarkerChanged(i,o)&&(u.graphic=1),s.hasDataLabels?.()||(u.dataLabel=1)),this.points))t&&t.series&&(t.resolveColor(),Object.keys(u).length&&t.destroyElements(u),!1===i.showInLegend&&t.legendItem&&n.legend.destroyItem(t));s.initialType=a,n.linkSeries(),n.setSortedData(),m&&s.linkedSeries.length&&(s.isDirtyData=!0),M(this,"afterUpdate"),B(e,!0)&&n.redraw(!!f&&void 0)}setName(t){this.name=this.options.name=this.userOptions.name=t,this.chart.isDirtyLegend=!0}hasOptionChanged(t){let e=this.chart,i=this.options[t],r=e.options.plotOptions,s=this.userOptions[t],n=B(r?.[this.type]?.[t],r?.series?.[t]);return s&&!w(n)?i!==s:i!==B(n,i)}onMouseOver(){let t=this.chart,e=t.hoverSeries,i=t.pointer;i?.setHoverChartIndex(),e&&e!==this&&e.onMouseOut(),this.options.events.mouseOver&&M(this,"mouseOver"),this.setState("hover"),t.hoverSeries=this}onMouseOut(){let t=this.options,e=this.chart,i=e.tooltip,r=e.hoverPoint;e.hoverSeries=null,r&&r.onMouseOut(),this&&t.events.mouseOut&&M(this,"mouseOut"),i&&!this.stickyTracking&&(!i.shared||this.noSharedTooltip)&&i.hide(),e.series.forEach((function(t){t.setState("",!0)}))}setState(t,e){let i=this,r=i.options,s=i.graph,n=r.inactiveOtherPoints,o=r.states,a=B(o[t||"normal"]&&o[t||"normal"].animation,i.chart.options.chart.animation),l=r.lineWidth,c=r.opacity;if(t=t||"",i.state!==t&&([i.group,i.markerGroup,i.dataLabelsGroup].forEach((function(e){e&&(i.state&&e.removeClass("highcharts-series-"+i.state),t&&e.addClass("highcharts-series-"+t))})),i.state=t,!i.chart.styledMode)){if(o[t]&&!1===o[t].enabled)return;if(t&&(l=o[t].lineWidth||l+(o[t].lineWidthPlus||0),c=B(o[t].opacity,c)),s&&!s.dashstyle&&z(l))for(let t of[s,...this.zones.map((t=>t.graph))])t?.animate({"stroke-width":l},a);n||[i.group,i.markerGroup,i.dataLabelsGroup,i.labelBySeries].forEach((function(t){t&&t.animate({opacity:c},a)}))}e&&n&&i.points&&i.setAllPointsToState(t||void 0)}setAllPointsToState(t){this.points.forEach((function(e){e.setState&&e.setState(t)}))}setVisible(t,e){let i=this,r=i.chart,s=r.options.chart.ignoreHiddenSeries,n=i.visible;i.visible=t=i.options.visible=i.userOptions.visible=void 0===t?!n:t;let o=t?"show":"hide";["group","dataLabelsGroup","markerGroup","tracker","tt"].forEach((t=>{i[t]?.[o]()})),(r.hoverSeries===i||r.hoverPoint?.series===i)&&i.onMouseOut(),i.legendItem&&r.legend.colorizeItem(i,t),i.isDirty=!0,i.options.stacking&&r.series.forEach((t=>{t.options.stacking&&t.visible&&(t.isDirty=!0)})),i.linkedSeries.forEach((e=>{e.setVisible(t,!1)})),s&&(r.isDirtyBox=!0),M(i,o),!1!==e&&r.redraw()}show(){this.setVisible(!0)}hide(){this.setVisible(!1)}select(t){this.selected=t=this.options.selected=void 0===t?!this.selected:t,this.checkbox&&(this.checkbox.checked=t),M(this,t?"select":"unselect")}shouldShowTooltip(t,e,i={}){return i.series=this,i.visiblePlotOnly=!0,this.chart.isInsidePlot(t,e,i)}drawLegendSymbol(t,e){s[this.options.legendSymbol||"rectangle"]?.call(this,t,e)}}return V.defaultOptions=o,V.types=a.seriesTypes,V.registerType=a.registerSeriesType,E(V.prototype,{axisTypes:["xAxis","yAxis"],coll:"series",colorCounter:0,directTouch:!1,invertible:!0,isCartesian:!0,kdAxisArray:["clientX","plotY"],parallelArrays:["x","y"],pointClass:n,requireSorting:!0,sorted:!0}),a.series=V,V})),i(e,"Core/Legend/Legend.js",[e["Core/Animation/AnimationUtilities.js"],e["Core/Foundation.js"],e["Core/Globals.js"],e["Core/Series/Series.js"],e["Core/Series/Point.js"],e["Core/Renderer/RendererUtilities.js"],e["Core/Templating.js"],e["Core/Utilities.js"]],(function(t,e,i,r,s,n,o,a){var l;let{animObject:c,setAnimation:h}=t,{registerEventOptions:u}=e,{composed:d,marginNames:p}=i,{distribute:f}=n,{format:m}=o,{addEvent:g,createElement:y,css:_,defined:v,discardElement:x,find:b,fireEvent:w,isNumber:S,merge:C,pick:T,pushUnique:k,relativeLength:E,stableSort:A,syncTimeout:M}=a;class P{constructor(t,e){this.allItems=[],this.initialItemY=0,this.itemHeight=0,this.itemMarginBottom=0,this.itemMarginTop=0,this.itemX=0,this.itemY=0,this.lastItemY=0,this.lastLineHeight=0,this.legendHeight=0,this.legendWidth=0,this.maxItemWidth=0,this.maxLegendWidth=0,this.offsetWidth=0,this.padding=0,this.pages=[],this.symbolHeight=0,this.symbolWidth=0,this.titleHeight=0,this.totalItemWidth=0,this.widthOption=0,this.chart=t,this.setOptions(e),e.enabled&&(this.render(),u(this,e),g(this.chart,"endResize",(function(){this.legend.positionCheckboxes()}))),g(this.chart,"render",(()=>{this.options.enabled&&this.proximate&&(this.proximatePositions(),this.positionItems())}))}setOptions(t){let e=T(t.padding,8);this.options=t,this.chart.styledMode||(this.itemStyle=t.itemStyle,this.itemHiddenStyle=C(this.itemStyle,t.itemHiddenStyle)),this.itemMarginTop=t.itemMarginTop,this.itemMarginBottom=t.itemMarginBottom,this.padding=e,this.initialItemY=e-5,this.symbolWidth=T(t.symbolWidth,16),this.pages=[],this.proximate="proximate"===t.layout&&!this.chart.inverted,this.baseline=void 0}update(t,e){let i=this.chart;this.setOptions(C(!0,this.options,t)),"events"in this.options&&u(this,this.options),this.destroy(),i.isDirtyLegend=i.isDirtyBox=!0,T(e,!0)&&i.redraw(),w(this,"afterUpdate",{redraw:e})}colorizeItem(t,e){let{area:i,group:r,label:s,line:n,symbol:o}=t.legendItem||{};if(r?.[e?"removeClass":"addClass"]("highcharts-legend-item-hidden"),!this.chart.styledMode){let{itemHiddenStyle:r={}}=this,a=r.color,{fillColor:l,fillOpacity:c,lineColor:h,marker:u}=t.options,d=t=>(!e&&(t.fill&&(t.fill=a),t.stroke&&(t.stroke=a)),t);s?.css(C(e?this.itemStyle:r)),n?.attr(d({stroke:h||t.color})),o&&o.attr(d(u&&o.isMarker?t.pointAttribs():{fill:t.color})),i?.attr(d({fill:l||t.color,"fill-opacity":l?1:c??.75}))}w(this,"afterColorizeItem",{item:t,visible:e})}positionItems(){this.allItems.forEach(this.positionItem,this),this.chart.isResizing||this.positionCheckboxes()}positionItem(t){let{group:e,x:i=0,y:r=0}=t.legendItem||{},s=this.options,n=s.symbolPadding,o=!s.rtl,a=t.checkbox;if(e&&e.element){let s={translateX:o?i:this.legendWidth-i-2*n-4,translateY:r};e[v(e.translateY)?"animate":"attr"](s,void 0,(()=>{w(this,"afterPositionItem",{item:t})}))}a&&(a.x=i,a.y=r)}destroyItem(t){let e=t.checkbox,i=t.legendItem||{};for(let t of["group","label","line","symbol"])i[t]&&(i[t]=i[t].destroy());e&&x(e),t.legendItem=void 0}destroy(){for(let t of this.getAllItems())this.destroyItem(t);for(let t of["clipRect","up","down","pager","nav","box","title","group"])this[t]&&(this[t]=this[t].destroy());this.display=null}positionCheckboxes(){let t,e=this.group&&this.group.alignAttr,i=this.clipHeight||this.legendHeight,r=this.titleHeight;e&&(t=e.translateY,this.allItems.forEach((function(s){let n,o=s.checkbox;o&&(n=t+r+o.y+(this.scrollOffset||0)+3,_(o,{left:e.translateX+s.checkboxOffset+o.x-20+"px",top:n+"px",display:this.proximate||n>t-6&&n1.5*b?x.height:b))}layoutItem(t){let e=this.options,i=this.padding,r="horizontal"===e.layout,s=t.itemHeight,n=this.itemMarginBottom,o=this.itemMarginTop,a=r?T(e.itemDistance,20):0,l=this.maxLegendWidth,c=e.alignColumns&&this.totalItemWidth>l?this.maxItemWidth:t.itemWidth,h=t.legendItem||{};r&&this.itemX-i+c>l&&(this.itemX=i,this.lastLineHeight&&(this.itemY+=o+this.lastLineHeight+n),this.lastLineHeight=0),this.lastItemY=o+this.itemY+n,this.lastLineHeight=Math.max(s,this.lastLineHeight),h.x=this.itemX,h.y=this.itemY,r?this.itemX+=c:(this.itemY+=o+s+n,this.lastLineHeight=s),this.offsetWidth=this.widthOption||Math.max((r?this.itemX-i-(t.checkbox?0:a):c)+i,this.offsetWidth)}getAllItems(){let t=[];return this.chart.series.forEach((function(e){let i=e&&e.options;e&&T(i.showInLegend,!v(i.linkedTo)&&void 0,!0)&&(t=t.concat((e.legendItem||{}).labels||("point"===i.legendType?e.data:e)))})),w(this,"afterGetAllItems",{allItems:t}),t}getAlignment(){let t=this.options;return this.proximate?t.align.charAt(0)+"tv":t.floating?"":t.align.charAt(0)+t.verticalAlign.charAt(0)+t.layout.charAt(0)}adjustMargins(t,e){let i=this.chart,r=this.options,s=this.getAlignment();s&&[/(lth|ct|rth)/,/(rtv|rm|rbv)/,/(rbh|cb|lbh)/,/(lbv|lm|ltv)/].forEach((function(n,o){n.test(s)&&!v(t[o])&&(i[p[o]]=Math.max(i[p[o]],i.legend[(o+1)%2?"legendHeight":"legendWidth"]+[1,-1,-1,1][o]*r[o%2?"x":"y"]+T(r.margin,12)+e[o]+(i.titleOffset[o]||0)))}))}proximatePositions(){let t,e=this.chart,i=[],r="left"===this.options.align;for(let s of(this.allItems.forEach((function(t){let s,n,o,a,l=r;t.yAxis&&(t.xAxis.options.reversed&&(l=!l),t.points&&(s=b(l?t.points:t.points.slice(0).reverse(),(function(t){return S(t.plotY)}))),n=this.itemMarginTop+t.legendItem.label.getBBox().height+this.itemMarginBottom,a=t.yAxis.top-e.plotTop,o=t.visible?(s?s.plotY:t.yAxis.height)+(a-.3*n):a+t.yAxis.height,i.push({target:o,size:n,item:t}))}),this),f(i,e.plotHeight)))t=s.item.legendItem||{},S(s.pos)&&(t.y=e.plotTop-e.spacing[0]+s.pos)}render(){let t,e,i,r,s=this.chart,n=s.renderer,o=this.options,a=this.padding,l=this.getAllItems(),c=this.group,h=this.box;this.itemX=a,this.itemY=this.initialItemY,this.offsetWidth=0,this.lastItemY=0,this.widthOption=E(o.width,s.spacingBox.width-a),r=s.spacingBox.width-2*a-o.x,["rm","lm"].indexOf(this.getAlignment().substring(0,2))>-1&&(r/=2),this.maxLegendWidth=this.widthOption||r,c||(this.group=c=n.g("legend").addClass(o.className||"").attr({zIndex:7}).add(),this.contentGroup=n.g().attr({zIndex:1}).add(c),this.scrollGroup=n.g().add(this.contentGroup)),this.renderTitle(),A(l,((t,e)=>(t.options&&t.options.legendIndex||0)-(e.options&&e.options.legendIndex||0))),o.reversed&&l.reverse(),this.allItems=l,this.display=t=!!l.length,this.lastLineHeight=0,this.maxItemWidth=0,this.totalItemWidth=0,this.itemHeight=0,l.forEach(this.renderItem,this),l.forEach(this.layoutItem,this),e=(this.widthOption||this.offsetWidth)+a,i=this.lastItemY+this.lastLineHeight+this.titleHeight,i=this.handleOverflow(i)+a,h||(this.box=h=n.rect().addClass("highcharts-legend-box").attr({r:o.borderRadius}).add(c)),s.styledMode||h.attr({stroke:o.borderColor,"stroke-width":o.borderWidth||0,fill:o.backgroundColor||"none"}).shadow(o.shadow),e>0&&i>0&&h[h.placed?"animate":"attr"](h.crisp.call({},{x:0,y:0,width:e,height:i},h.strokeWidth())),c[t?"show":"hide"](),s.styledMode&&"none"===c.getStyle("display")&&(e=i=0),this.legendWidth=e,this.legendHeight=i,t&&this.align(),this.proximate||this.positionItems(),w(this,"afterRender")}align(t=this.chart.spacingBox){let e=this.chart,i=this.options,r=t.y;/(lth|ct|rth)/.test(this.getAlignment())&&e.titleOffset[0]>0?r+=e.titleOffset[0]:/(lbh|cb|rbh)/.test(this.getAlignment())&&e.titleOffset[2]>0&&(r-=e.titleOffset[2]),r!==t.y&&(t=C(t,{y:r})),e.hasRendered||(this.group.placed=!1),this.group.align(C(i,{width:this.legendWidth,height:this.legendHeight,verticalAlign:this.proximate?"top":i.verticalAlign}),!0,t)}handleOverflow(t){let e,i,r,s=this,n=this.chart,o=n.renderer,a=this.options,l=a.y,c="top"===a.verticalAlign,h=this.padding,u=a.maxHeight,d=a.navigation,p=T(d.animation,!0),f=d.arrowSize||12,m=this.pages,g=this.allItems,y=function(t){"number"==typeof t?b.attr({height:t}):b&&(s.clipRect=b.destroy(),s.contentGroup.clip()),s.contentGroup.div&&(s.contentGroup.div.style.clip=t?"rect("+h+"px,9999px,"+(h+t)+"px,0)":"auto")},_=function(t){return s[t]=o.circle(0,0,1.3*f).translate(f/2,f/2).add(x),n.styledMode||s[t].attr("fill","rgba(0,0,0,0.0001)"),s[t]},v=n.spacingBox.height+(c?-l:l)-h,x=this.nav,b=this.clipRect;return"horizontal"!==a.layout||"middle"===a.verticalAlign||a.floating||(v/=2),u&&(v=Math.min(v,u)),m.length=0,t&&v>0&&t>v&&!1!==d.enabled?(this.clipHeight=e=Math.max(v-20-this.titleHeight-h,0),this.currentPage=T(this.currentPage,1),this.fullHeight=t,g.forEach(((t,s)=>{let n=(r=t.legendItem||{}).y||0,o=Math.round(r.label.getBBox().height),a=m.length;(!a||n-m[a-1]>e&&(i||n)!==m[a-1])&&(m.push(i||n),a++),r.pageIx=a-1,i&&((g[s-1].legendItem||{}).pageIx=a-1),s===g.length-1&&n+o-m[a-1]>e&&n>m[a-1]&&(m.push(n),r.pageIx=a),n!==i&&(i=n)})),b||(b=s.clipRect=o.clipRect(0,h-2,9999,0),s.contentGroup.clip(b)),y(e),x||(this.nav=x=o.g().attr({zIndex:1}).add(this.group),this.up=o.symbol("triangle",0,0,f,f).add(x),_("upTracker").on("click",(function(){s.scroll(-1,p)})),this.pager=o.text("",15,10).addClass("highcharts-legend-navigation"),!n.styledMode&&d.style&&this.pager.css(d.style),this.pager.add(x),this.down=o.symbol("triangle-down",0,0,f,f).add(x),_("downTracker").on("click",(function(){s.scroll(1,p)}))),s.scroll(0),t=v):x&&(y(),this.nav=x.destroy(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0),t}scroll(t,e){let i=this.chart,r=this.pages,s=r.length,n=this.clipHeight,o=this.options.navigation,a=this.pager,l=this.padding,u=this.currentPage+t;u>s&&(u=s),u>0&&(void 0!==e&&h(e,i),this.nav.attr({translateX:l,translateY:n+this.padding+7+this.titleHeight,visibility:"inherit"}),[this.up,this.upTracker].forEach((function(t){t.attr({class:1===u?"highcharts-legend-nav-inactive":"highcharts-legend-nav-active"})})),a.attr({text:u+"/"+s}),[this.down,this.downTracker].forEach((function(t){t.attr({x:18+this.pager.getBBox().width,class:u===s?"highcharts-legend-nav-inactive":"highcharts-legend-nav-active"})}),this),i.styledMode||(this.up.attr({fill:1===u?o.inactiveColor:o.activeColor}),this.upTracker.css({cursor:1===u?"default":"pointer"}),this.down.attr({fill:u===s?o.inactiveColor:o.activeColor}),this.downTracker.css({cursor:u===s?"default":"pointer"})),this.scrollOffset=-r[u-1]+this.initialItemY,this.scrollGroup.animate({translateY:this.scrollOffset}),this.currentPage=u,this.positionCheckboxes(),M((()=>{w(this,"afterScroll",{currentPage:u})}),c(T(e,i.renderer.globalAnimation,!0)).duration))}setItemEvents(t,e,i){let n=this,o=t.legendItem||{},a=n.chart.renderer.boxWrapper,l=t instanceof s,c=t instanceof r,h="highcharts-legend-"+(l?"point":"series")+"-active",u=n.chart.styledMode,d=i?[e,o.symbol]:[o.group],p=e=>{n.allItems.forEach((i=>{t!==i&&[i].concat(i.linkedSeries||[]).forEach((t=>{t.setState(e,!l)}))}))};for(let i of d)i&&i.on("mouseover",(function(){t.visible&&p("inactive"),t.setState("hover"),t.visible&&a.addClass(h),u||e.css(n.options.itemHoverStyle)})).on("mouseout",(function(){n.chart.styledMode||e.css(C(t.visible?n.itemStyle:n.itemHiddenStyle)),p(""),a.removeClass(h),t.setState()})).on("click",(function(e){a.removeClass(h),w(n,"itemClick",{browserEvent:e,legendItem:t},(function(){t.setVisible&&t.setVisible(),p(t.visible?"inactive":"")})),l?t.firePointEvent("legendItemClick",{browserEvent:e}):c&&w(t,"legendItemClick",{browserEvent:e})}))}createCheckboxForItem(t){t.checkbox=y("input",{type:"checkbox",className:"highcharts-legend-checkbox",checked:t.selected,defaultChecked:t.selected},this.options.itemCheckboxStyle,this.chart.container),g(t.checkbox,"click",(function(e){let i=e.target;w(t.series||t,"checkboxClick",{checked:i.checked,item:t},(function(){t.select()}))}))}}return(l=P||(P={})).compose=function(t){k(d,"Core.Legend")&&g(t,"beforeMargins",(function(){this.legend=new l(this,this.options.legend)}))},P})),i(e,"Core/Chart/Chart.js",[e["Core/Animation/AnimationUtilities.js"],e["Core/Axis/Axis.js"],e["Core/Defaults.js"],e["Core/Templating.js"],e["Core/Foundation.js"],e["Core/Globals.js"],e["Core/Renderer/RendererRegistry.js"],e["Core/Series/Series.js"],e["Core/Series/SeriesRegistry.js"],e["Core/Renderer/SVG/SVGRenderer.js"],e["Core/Time.js"],e["Core/Utilities.js"],e["Core/Renderer/HTML/AST.js"],e["Core/Axis/Tick.js"]],(function(t,e,i,r,s,n,o,a,l,c,h,u,d,p){let{animate:f,animObject:m,setAnimation:g}=t,{defaultOptions:y,defaultTime:_}=i,{numberFormat:v}=r,{registerEventOptions:x}=s,{charts:b,doc:w,marginNames:S,svg:C,win:T}=n,{seriesTypes:k}=l,{addEvent:E,attr:A,createElement:M,css:P,defined:I,diffObjects:L,discardElement:D,erase:z,error:O,extend:R,find:N,fireEvent:B,getStyle:F,isArray:j,isNumber:U,isObject:V,isString:q,merge:G,objectEach:$,pick:H,pInt:W,relativeLength:X,removeEvent:Z,splat:Y,syncTimeout:K,uniqueKey:Q}=u;class J{static chart(t,e,i){return new J(t,e,i)}constructor(t,e,i){this.sharedClips={};let r=[...arguments];(q(t)||t.nodeName)&&(this.renderTo=r.shift()),this.init(r[0],r[1])}setZoomOptions(){let t=this.options.chart,e=t.zooming;this.zooming={...e,type:H(t.zoomType,e.type),key:H(t.zoomKey,e.key),pinchType:H(t.pinchType,e.pinchType),singleTouch:H(t.zoomBySingleTouch,e.singleTouch,!1),resetButton:G(e.resetButton,t.resetZoomButton)}}init(t,e){B(this,"init",{args:arguments},(function(){let i=G(y,t),r=i.chart;this.userOptions=R({},t),this.margin=[],this.spacing=[],this.labelCollectors=[],this.callback=e,this.isResizing=0,this.options=i,this.axes=[],this.series=[],this.time=t.time&&Object.keys(t.time).length?new h(t.time):n.time,this.numberFormatter=r.numberFormatter||v,this.styledMode=r.styledMode,this.hasCartesianSeries=r.showAxes,this.index=b.length,b.push(this),n.chartCount++,x(this,r),this.xAxis=[],this.yAxis=[],this.pointCount=this.colorCounter=this.symbolCounter=0,this.setZoomOptions(),B(this,"afterInit"),this.firstRender()}))}initSeries(t){let e=this.options.chart,i=t.type||e.type,r=k[i];r||O(17,!0,this,{missingModuleFor:i});let s=new r;return"function"==typeof s.init&&s.init(this,t),s}setSortedData(){this.getSeriesOrderByLinks().forEach((function(t){t.points||t.data||!t.enabledDataSorting||t.setData(t.options.data,!1)}))}getSeriesOrderByLinks(){return this.series.concat().sort((function(t,e){return t.linkedSeries.length||e.linkedSeries.length?e.linkedSeries.length-t.linkedSeries.length:0}))}orderItems(t,e=0){let i=this[t],r=this.options[t]=Y(this.options[t]).slice(),s=this.userOptions[t]=this.userOptions[t]?Y(this.userOptions[t]).slice():[];if(this.hasRendered&&(r.splice(e),s.splice(e)),i)for(let t=e,n=i.length;t=Math.max(l+n,t.pos)&&e<=Math.min(l+n+u.width,t.pos+t.len)||(f.isInsidePlot=!1)}if(!i.ignoreY&&f.isInsidePlot){let t=!r&&i.axis&&!i.axis.isXAxis&&i.axis||h&&(r?h.xAxis:h.yAxis)||{pos:o,len:1/0},e=i.paneCoordinates?t.pos+p:o+p;e>=Math.max(c+o,t.pos)&&e<=Math.min(c+o+u.height,t.pos+t.len)||(f.isInsidePlot=!1)}return B(this,"afterIsInsidePlot",f),f.isInsidePlot}redraw(t){B(this,"beforeRedraw");let e,i,r,s,n=this.hasCartesianSeries?this.axes:this.colorAxis||[],o=this.series,a=this.pointer,l=this.legend,c=this.userOptions.legend,h=this.renderer,u=h.isHidden(),d=[],p=this.isDirtyBox,f=this.isDirtyLegend;for(h.rootFontSize=h.boxWrapper.getStyle("font-size"),this.setResponsive&&this.setResponsive(!1),g(!!this.hasRendered&&t,this),u&&this.temporaryDisplay(),this.layOutTitles(!1),r=o.length;r--;)if(((s=o[r]).options.stacking||s.options.centerInCategory)&&(i=!0,s.isDirty)){e=!0;break}if(e)for(r=o.length;r--;)(s=o[r]).options.stacking&&(s.isDirty=!0);o.forEach((function(t){t.isDirty&&("point"===t.options.legendType?("function"==typeof t.updateTotals&&t.updateTotals(),f=!0):c&&(c.labelFormatter||c.labelFormat)&&(f=!0)),t.isDirtyData&&B(t,"updatedData")})),f&&l&&l.options.enabled&&(l.render(),this.isDirtyLegend=!1),i&&this.getStacks(),n.forEach((function(t){t.updateNames(),t.setScale()})),this.getMargins(),n.forEach((function(t){t.isDirty&&(p=!0)})),n.forEach((function(t){let e=t.min+","+t.max;t.extKey!==e&&(t.extKey=e,d.push((function(){B(t,"afterSetExtremes",R(t.eventArgs,t.getExtremes())),delete t.eventArgs}))),(p||i)&&t.redraw()})),p&&this.drawChartBox(),B(this,"predraw"),o.forEach((function(t){(p||t.isDirty)&&t.visible&&t.redraw(),t.isDirtyData=!1})),a&&a.reset(!0),h.draw(),B(this,"redraw"),B(this,"render"),u&&this.temporaryDisplay(!0),d.forEach((function(t){t.call()}))}get(t){let e=this.series;function i(e){return e.id===t||e.options&&e.options.id===t}let r=N(this.axes,i)||N(this.series,i);for(let t=0;!r&&t(e.getPointsCollection().forEach((e=>{H(e.selectedStaging,e.selected)&&t.push(e)})),t)),[])}getSelectedSeries(){return this.series.filter((function(t){return t.selected}))}setTitle(t,e,i){this.applyDescription("title",t),this.applyDescription("subtitle",e),this.applyDescription("caption",void 0),this.layOutTitles(i)}applyDescription(t,e){let i=this,r=this.options[t]=G(this.options[t],e),s=this[t];s&&e&&(this[t]=s=s.destroy()),r&&!s&&((s=this.renderer.text(r.text,0,0,r.useHTML).attr({align:r.align,class:"highcharts-"+t,zIndex:r.zIndex||4}).add()).update=function(e,r){i.applyDescription(t,e),i.layOutTitles(r)},this.styledMode||s.css(R("title"===t?{fontSize:this.options.isStock?"1em":"1.2em"}:{},r.style)),this[t]=s)}layOutTitles(t=!0){let e=[0,0,0],i=this.renderer,r=this.spacingBox;["title","subtitle","caption"].forEach((function(t){let s=this[t],n=this.options[t],o=n.verticalAlign||"top",a="title"===t?"top"===o?-3:0:"top"===o?e[0]+2:0;if(s){s.css({width:(n.width||r.width+(n.widthAdjust||0))+"px"});let t=i.fontMetrics(s).b,l=Math.round(s.getBBox(n.useHTML).height);s.align(R({y:"bottom"===o?t:a+t,height:l},n),!1,"spacingBox"),n.floating||("top"===o?e[0]=Math.ceil(e[0]+l):"bottom"===o&&(e[2]=Math.ceil(e[2]+l)))}}),this),e[0]&&"top"===(this.options.title.verticalAlign||"top")&&(e[0]+=this.options.title.margin),e[2]&&"bottom"===this.options.caption.verticalAlign&&(e[2]+=this.options.caption.margin);let s=!this.titleOffset||this.titleOffset.join(",")!==e.join(",");this.titleOffset=e,B(this,"afterLayOutTitles"),!this.isDirtyBox&&s&&(this.isDirtyBox=this.isDirtyLegend=s,this.hasRendered&&t&&this.isDirtyBox&&this.redraw())}getContainerBox(){return{width:F(this.renderTo,"width",!0)||0,height:F(this.renderTo,"height",!0)||0}}getChartSize(){let t=this.options.chart,e=t.width,i=t.height,r=this.getContainerBox();this.chartWidth=Math.max(0,e||r.width||600),this.chartHeight=Math.max(0,X(i,this.chartWidth)||(r.height>1?r.height:400)),this.containerBox=r}temporaryDisplay(t){let e,i=this.renderTo;if(t)for(;i&&i.style;)i.hcOrigStyle&&(P(i,i.hcOrigStyle),delete i.hcOrigStyle),i.hcOrigDetached&&(w.body.removeChild(i),i.hcOrigDetached=!1),i=i.parentNode;else for(;i&&i.style&&(w.body.contains(i)||i.parentNode||(i.hcOrigDetached=!0,w.body.appendChild(i)),("none"===F(i,"display",!1)||i.hcOricDetached)&&(i.hcOrigStyle={display:i.style.display,height:i.style.height,overflow:i.style.overflow},e={display:"block",overflow:"hidden"},i!==this.renderTo&&(e.height=0),P(i,e),i.offsetWidth||i.style.setProperty("display","block","important")),(i=i.parentNode)!==w.body););}setClassName(t){this.container.className="highcharts-container "+(t||"")}getContainer(){let t,e=this.options,i=e.chart,r="data-highcharts-chart",s=Q(),a=this.renderTo;a||(this.renderTo=a=i.renderTo),q(a)&&(this.renderTo=a=w.getElementById(a)),a||O(13,!0,this);let l=W(A(a,r));U(l)&&b[l]&&b[l].hasRendered&&b[l].destroy(),A(a,r,this.index),a.innerHTML=d.emptyHTML,i.skipClone||a.offsetWidth||this.temporaryDisplay(),this.getChartSize();let h=this.chartHeight,u=this.chartWidth;P(a,{overflow:"hidden",pointerEvents:n.isChrome?"fill":"auto"}),this.styledMode||(t=R({position:"relative",overflow:"hidden",width:u+"px",height:h+"px",textAlign:"left",lineHeight:"normal",zIndex:0,"-webkit-tap-highlight-color":"rgba(0,0,0,0)",userSelect:"none","touch-action":"manipulation",outline:"none"},i.style||{}));let p=M("div",{id:s},t,a);this.container=p,this.getChartSize(),u===this.chartWidth||(u=this.chartWidth,this.styledMode||P(p,{width:H(i.style?.width,u+"px")})),this.containerBox=this.getContainerBox(),this._cursor=p.style.cursor;let f=i.renderer||!C?o.getRendererType(i.renderer):c;if(this.renderer=new f(p,u,h,void 0,i.forExport,e.exporting&&e.exporting.allowHTML,this.styledMode),g(void 0,this),this.setClassName(i.className),this.styledMode)for(let t in e.defs)this.renderer.definition(e.defs[t]);else this.renderer.setStyle(i.style);this.renderer.chartIndex=this.index,B(this,"afterGetContainer")}getMargins(t){let{spacing:e,margin:i,titleOffset:r}=this;this.resetMargins(),r[0]&&!I(i[0])&&(this.plotTop=Math.max(this.plotTop,r[0]+e[0])),r[2]&&!I(i[2])&&(this.marginBottom=Math.max(this.marginBottom,r[2]+e[2])),this.legend&&this.legend.display&&this.legend.adjustMargins(i,e),B(this,"getMargins"),t||this.getAxisMargins()}getAxisMargins(){let t=this,e=t.axisOffset=[0,0,0,0],i=t.colorAxis,r=t.margin,s=function(t){t.forEach((function(t){t.visible&&t.getOffset()}))};t.hasCartesianSeries?s(t.axes):i&&i.length&&s(i),S.forEach((function(i,s){I(r[s])||(t[i]+=e[s])})),t.setChartSize()}getOptions(){return L(this.userOptions,y)}reflow(t){let e=this,i=e.containerBox,r=e.getContainerBox();delete e.pointer?.chartPosition,!e.isPrinting&&!e.isResizing&&i&&r.width&&((r.width!==i.width||r.height!==i.height)&&(u.clearTimeout(e.reflowTimeout),e.reflowTimeout=K((function(){e.container&&e.setSize(void 0,void 0,!1)}),t?100:0)),e.containerBox=r)}setReflow(){let t=this,e=e=>{t.options?.chart.reflow&&t.hasLoaded&&t.reflow(e)};if("function"==typeof ResizeObserver)new ResizeObserver(e).observe(t.renderTo);else{let t=E(T,"resize",e);E(this,"destroy",t)}}setSize(t,e,i){let r=this,s=r.renderer;r.isResizing+=1,g(i,r);let n=s.globalAnimation;r.oldChartHeight=r.chartHeight,r.oldChartWidth=r.chartWidth,void 0!==t&&(r.options.chart.width=t),void 0!==e&&(r.options.chart.height=e),r.getChartSize();let{chartWidth:o,chartHeight:a,scrollablePixelsX:l=0,scrollablePixelsY:c=0}=r;(r.isDirtyBox||o!==r.oldChartWidth||a!==r.oldChartHeight)&&(r.styledMode||(n?f:P)(r.container,{width:`${o+l}px`,height:`${a+c}px`},n),r.setChartSize(!0),s.setSize(o,a,n),r.axes.forEach((function(t){t.isDirty=!0,t.setScale()})),r.isDirtyLegend=!0,r.isDirtyBox=!0,r.layOutTitles(),r.getMargins(),r.redraw(n),r.oldChartHeight=void 0,B(r,"resize"),setTimeout((()=>{r&&B(r,"endResize")}),m(n).duration)),r.isResizing-=1}setChartSize(t){let e,i,r,s,{chartHeight:n,chartWidth:o,inverted:a,spacing:l,renderer:c}=this,h=this.clipOffset,u=Math[a?"floor":"round"];this.plotLeft=e=Math.round(this.plotLeft),this.plotTop=i=Math.round(this.plotTop),this.plotWidth=r=Math.max(0,Math.round(o-e-this.marginRight)),this.plotHeight=s=Math.max(0,Math.round(n-i-this.marginBottom)),this.plotSizeX=a?s:r,this.plotSizeY=a?r:s,this.spacingBox=c.spacingBox={x:l[3],y:l[0],width:o-l[3]-l[1],height:n-l[0]-l[2]},this.plotBox=c.plotBox={x:e,y:i,width:r,height:s},h&&(this.clipBox={x:u(h[3]),y:u(h[0]),width:u(this.plotSizeX-h[1]-h[3]),height:u(this.plotSizeY-h[0]-h[2])}),t||(this.axes.forEach((function(t){t.setAxisSize(),t.setAxisTranslation()})),c.alignElements()),B(this,"afterSetChartSize",{skipAxes:t})}resetMargins(){B(this,"resetMargins");let t=this,e=t.options.chart,i=e.plotBorderWidth||0,r=i/2;["margin","spacing"].forEach((function(i){let r=e[i],s=V(r)?r:[r,r,r,r];["Top","Right","Bottom","Left"].forEach((function(r,n){t[i][n]=H(e[i+r],s[n])}))})),S.forEach((function(e,i){t[e]=H(t.margin[i],t.spacing[i])})),t.axisOffset=[0,0,0,0],t.clipOffset=[r,r,r,r],t.plotBorderWidth=i}drawChartBox(){let t,e,i,r=this.options.chart,s=this.renderer,n=this.chartWidth,o=this.chartHeight,a=this.styledMode,l=this.plotBGImage,c=r.backgroundColor,h=r.plotBackgroundColor,u=r.plotBackgroundImage,d=this.plotLeft,p=this.plotTop,f=this.plotWidth,m=this.plotHeight,g=this.plotBox,y=this.clipRect,_=this.clipBox,v=this.chartBackground,x=this.plotBackground,b=this.plotBorder,w="animate";v||(this.chartBackground=v=s.rect().addClass("highcharts-background").add(),w="attr"),a?t=e=v.strokeWidth():(e=(t=r.borderWidth||0)+(r.shadow?8:0),i={fill:c||"none"},(t||v["stroke-width"])&&(i.stroke=r.borderColor,i["stroke-width"]=t),v.attr(i).shadow(r.shadow)),v[w]({x:e/2,y:e/2,width:n-e-t%2,height:o-e-t%2,r:r.borderRadius}),w="animate",x||(w="attr",this.plotBackground=x=s.rect().addClass("highcharts-plot-background").add()),x[w](g),!a&&(x.attr({fill:h||"none"}).shadow(r.plotShadow),u&&(l?(u!==l.attr("href")&&l.attr("href",u),l.animate(g)):this.plotBGImage=s.image(u,d,p,f,m).add())),y?y.animate({width:_.width,height:_.height}):this.clipRect=s.clipRect(_),w="animate",b||(w="attr",this.plotBorder=b=s.rect().addClass("highcharts-plot-border").attr({zIndex:1}).add()),a||b.attr({stroke:r.plotBorderColor,"stroke-width":r.plotBorderWidth||0,fill:"none"}),b[w](b.crisp({x:d,y:p,width:f,height:m},-b.strokeWidth())),this.isDirtyBox=!1,B(this,"afterDrawChartBox")}propFromSeries(){let t,e,i,r=this,s=r.options.chart,n=r.options.series;["inverted","angular","polar"].forEach((function(o){for(e=k[s.type],i=s[o]||e&&e.prototype[o],t=n&&n.length;!i&&t--;)(e=k[n[t].type])&&e.prototype[o]&&(i=!0);r[o]=i}))}linkSeries(t){let e=this,i=e.series;i.forEach((function(t){t.linkedSeries.length=0})),i.forEach((function(t){let{linkedTo:i}=t.options;if(q(i)){let r;(r=":previous"===i?e.series[t.index-1]:e.get(i))&&r.linkedParent!==t&&(r.linkedSeries.push(t),t.linkedParent=r,r.enabledDataSorting&&t.setDataSortingOptions(),t.visible=H(t.options.visible,r.options.visible,t.visible))}})),B(this,"afterLinkSeries",{isUpdating:t})}renderSeries(){this.series.forEach((function(t){t.translate(),t.render()}))}render(){let t,e=this.axes,i=this.colorAxis,r=this.renderer,s=this.options.chart.axisLayoutRuns||2,n=t=>{t.forEach((t=>{t.visible&&t.render()}))},o=0,a=!0,l=0;for(let t of(this.setTitle(),B(this,"beforeMargins"),this.getStacks?.(),this.getMargins(!0),this.setChartSize(),e)){let{options:e}=t,{labels:i}=e;if(this.hasCartesianSeries&&t.horiz&&t.visible&&i.enabled&&t.series.length&&"colorAxis"!==t.coll&&!this.polar){o=e.tickLength,t.createGroups();let r=new p(t,0,"",!0),s=r.createLabel("x",i);if(r.destroy(),s&&H(i.reserveSpace,!U(e.crossing))&&(o=s.getBBox().height+i.distance+Math.max(e.offset||0,0)),o){s?.destroy();break}}}for(this.plotHeight=Math.max(this.plotHeight-o,0);(a||t||s>1)&&l(l?1:1.1),t=r/this.plotHeight>(l?1:1.05),l++}this.drawChartBox(),this.hasCartesianSeries?n(e):i&&i.length&&n(i),this.seriesGroup||(this.seriesGroup=r.g("series-group").attr({zIndex:3}).shadow(this.options.chart.seriesGroupShadow).add()),this.renderSeries(),this.addCredits(),this.setResponsive&&this.setResponsive(),this.hasRendered=!0}addCredits(t){let e=this,i=G(!0,this.options.credits,t);i.enabled&&!this.credits&&(this.credits=this.renderer.text(i.text+(this.mapCredits||""),0,0).addClass("highcharts-credits").on("click",(function(){i.href&&(T.location.href=i.href)})).attr({align:i.position.align,zIndex:8}),e.styledMode||this.credits.css(i.style),this.credits.add().align(i.position),this.credits.update=function(t){e.credits=e.credits.destroy(),e.addCredits(t)})}destroy(){let t,e=this,i=e.axes,r=e.series,s=e.container,o=s&&s.parentNode;for(B(e,"destroy"),e.renderer.forExport?z(b,e):b[e.index]=void 0,n.chartCount--,e.renderTo.removeAttribute("data-highcharts-chart"),Z(e),t=i.length;t--;)i[t]=i[t].destroy();for(this.scroller&&this.scroller.destroy&&this.scroller.destroy(),t=r.length;t--;)r[t]=r[t].destroy();["title","subtitle","chartBackground","plotBackground","plotBGImage","plotBorder","seriesGroup","clipRect","credits","pointer","rangeSelector","legend","resetZoomButton","tooltip","renderer"].forEach((function(t){let i=e[t];i&&i.destroy&&(e[t]=i.destroy())})),s&&(s.innerHTML=d.emptyHTML,Z(s),o&&D(s)),$(e,(function(t,i){delete e[i]}))}firstRender(){let t=this,e=t.options;t.getContainer(),t.resetMargins(),t.setChartSize(),t.propFromSeries(),t.getAxes();let i=j(e.series)?e.series:[];e.series=[],i.forEach((function(e){t.initSeries(e)})),t.linkSeries(),t.setSortedData(),B(t,"beforeRender"),t.render(),t.pointer?.getChartPosition(),t.renderer.imgCount||t.hasLoaded||t.onload(),t.temporaryDisplay(!0)}onload(){this.callbacks.concat([this.callback]).forEach((function(t){t&&void 0!==this.index&&t.apply(this,[this])}),this),B(this,"load"),B(this,"render"),I(this.index)&&this.setReflow(),this.warnIfA11yModuleNotLoaded(),this.hasLoaded=!0}warnIfA11yModuleNotLoaded(){let{options:t,title:e}=this;!t||this.accessibility||(this.renderer.boxWrapper.attr({role:"img","aria-label":(e&&e.element.textContent||"").replace(/this.transform({reset:!0,trigger:"zoom"})))}pan(t,e){let i=this,r="object"==typeof e?e:{enabled:e,type:"x"},s=r.type,n=s&&i[{x:"xAxis",xy:"axes",y:"yAxis"}[s]].filter((t=>t.options.panningEnabled&&!t.options.isInternal)),o=i.options.chart;o?.panning&&(o.panning=r),B(this,"pan",{originalEvent:t},(()=>{i.transform({axes:n,event:t,to:{x:t.chartX-(i.mouseDownX||0),y:t.chartY-(i.mouseDownY||0)},trigger:"pan"}),P(i.container,{cursor:"move"})}))}transform(t){let e,i,{axes:r=this.axes,event:s,from:n={},reset:o,selection:a,to:l={},trigger:c}=t,{inverted:h}=this,u=!1;for(let t of(this.hoverPoints?.forEach((t=>t.setState())),r)){let{horiz:r,len:d,minPointOffset:p=0,options:f,reversed:m}=t,g=r?"width":"height",y=r?"x":"y",_=H(l[g],t.len),v=H(n[g],t.len),x=10>Math.abs(_)?1:_/v,b=(n[y]||0)+v/2-t.pos,w=b-((l[y]??t.pos)+_/2-t.pos)/x,S=m&&!h||!m&&h?-1:1;if(!o&&(b<0||b>t.len))continue;let C=t.toValue(w,!0)+(a?0:p*S),T=t.toValue(w+d/x,!0)-(a?0:p*S||0),k=t.allExtremes;if(C>T&&([C,T]=[T,C]),1===x&&!o&&"yAxis"===t.coll&&!k){for(let e of t.series){let t=e.getExtremes(e.getProcessedData(!0).yData,!0);k??(k={dataMin:Number.MAX_VALUE,dataMax:-Number.MAX_VALUE}),U(t.dataMin)&&U(t.dataMax)&&(k.dataMin=Math.min(t.dataMin,k.dataMin),k.dataMax=Math.max(t.dataMax,k.dataMax))}t.allExtremes=k}let{dataMin:E,dataMax:A,min:M,max:P}=R(t.getExtremes(),k||{}),L=E??f.min,D=A??f.max,z=T-C,O=t.categories?0:Math.min(z,D-L),N=L-O*(I(f.min)?0:f.minPadding),B=D+O*(I(f.max)?0:f.maxPadding),F=t.allowZoomOutside||1===x||"zoom"!==c&&x>1,j=Math.min(f.min??N,N,F?M:N),V=Math.max(f.max??B,B,F?P:B);(!t.isOrdinal||1!==x||o)&&(C=1&&(T=C+z)),T>V&&(T=V,x>=1&&(C=T-z)),(o||t.series.length&&(C!==M||T!==P)&&C>=j&&T<=V)&&(a?a[t.coll].push({axis:t,min:C,max:T}):(t.isPanning="zoom"!==c,t.isPanning&&(i=!0),t.setExtremes(o?void 0:C,o?void 0:T,!1,!1,{move:w,trigger:c,scale:x}),!o&&(C>j||T{delete t.selection,t.trigger="zoom",this.transform(t)})):(!e||i||this.resetZoomButton?!e&&this.resetZoomButton&&(this.resetZoomButton=this.resetZoomButton.destroy()):this.showResetZoom(),this.redraw("zoom"===c&&(this.options.chart.animation??this.pointCount<100)))),u}}return R(J.prototype,{callbacks:[],collectionsWithInit:{xAxis:[J.prototype.addAxis,[!0]],yAxis:[J.prototype.addAxis,[!1]],series:[J.prototype.addSeries]},collectionsWithUpdate:["xAxis","yAxis","series"],propsRequireDirtyBox:["backgroundColor","borderColor","borderWidth","borderRadius","plotBackgroundColor","plotBackgroundImage","plotBorderColor","plotBorderWidth","plotShadow","shadow"],propsRequireReflow:["margin","marginTop","marginRight","marginBottom","marginLeft","spacing","spacingTop","spacingRight","spacingBottom","spacingLeft"],propsRequireUpdateSeries:["chart.inverted","chart.polar","chart.ignoreHiddenSeries","chart.type","colors","plotOptions","time","tooltip"]}),J})),i(e,"Extensions/ScrollablePlotArea.js",[e["Core/Animation/AnimationUtilities.js"],e["Core/Globals.js"],e["Core/Renderer/RendererRegistry.js"],e["Core/Utilities.js"]],(function(t,e,i,r){let{stop:s}=t,{composed:n}=e,{addEvent:o,createElement:a,css:l,defined:c,merge:h,pushUnique:u}=r;function d(){let t=this.scrollablePlotArea;(this.scrollablePixelsX||this.scrollablePixelsY)&&!t&&(this.scrollablePlotArea=t=new f(this)),t?.applyFixed()}function p(){this.chart.scrollablePlotArea&&(this.chart.scrollablePlotArea.isDirty=!0)}class f{static compose(t,e,i){u(n,this.compose)&&(o(t,"afterInit",p),o(e,"afterSetChartSize",(t=>this.afterSetSize(t.target,t))),o(e,"render",d),o(i,"show",p))}static afterSetSize(t,e){let i,r,s,{minWidth:n,minHeight:o}=t.options.chart.scrollablePlotArea||{},{clipBox:a,plotBox:l,inverted:u,renderer:d}=t;if(!d.forExport&&(n?(t.scrollablePixelsX=i=Math.max(0,n-t.chartWidth),i&&(t.scrollablePlotBox=h(t.plotBox),l.width=t.plotWidth+=i,a[u?"height":"width"]+=i,s=!0)):o&&(t.scrollablePixelsY=r=Math.max(0,o-t.chartHeight),c(r)&&(t.scrollablePlotBox=h(t.plotBox),l.height=t.plotHeight+=r,a[u?"width":"height"]+=r,s=!1)),c(s)&&!e.skipAxes))for(let e of t.axes)e.horiz===s&&(e.setAxisSize(),e.setAxisTranslation())}constructor(t){let e,r=t.options.chart,s=i.getRendererType(),n=r.scrollablePlotArea||{},c=this.moveFixedElements.bind(this),h={WebkitOverflowScrolling:"touch",overflowX:"hidden",overflowY:"hidden"};t.scrollablePixelsX&&(h.overflowX="auto"),t.scrollablePixelsY&&(h.overflowY="auto"),this.chart=t;let u=this.parentDiv=a("div",{className:"highcharts-scrolling-parent"},{position:"relative"},t.renderTo),d=this.scrollingContainer=a("div",{className:"highcharts-scrolling"},h,u),p=this.innerContainer=a("div",{className:"highcharts-inner-container"},void 0,d),f=this.fixedDiv=a("div",{className:"highcharts-fixed"},{position:"absolute",overflow:"hidden",pointerEvents:"none",zIndex:(r.style?.zIndex||0)+2,top:0},void 0,!0),m=this.fixedRenderer=new s(f,t.chartWidth,t.chartHeight,r.style);this.mask=m.path().attr({fill:r.backgroundColor||"#fff","fill-opacity":n.opacity??.85,zIndex:-1}).addClass("highcharts-scrollable-mask").add(),d.parentNode.insertBefore(f,d),l(t.renderTo,{overflow:"visible"}),o(t,"afterShowResetZoom",c),o(t,"afterApplyDrilldown",c),o(t,"afterLayOutTitles",c),o(d,"scroll",(()=>{let{pointer:i,hoverPoint:r}=t;i&&(delete i.chartPosition,r&&(e=r),i.runPointActions(void 0,e,!0))})),p.appendChild(t.container)}applyFixed(){let{chart:t,fixedRenderer:e,isDirty:i,scrollingContainer:r}=this,{axisOffset:n,chartWidth:o,chartHeight:a,container:h,plotHeight:u,plotLeft:d,plotTop:p,plotWidth:f,scrollablePixelsX:m=0,scrollablePixelsY:g=0}=t,{scrollPositionX:y=0,scrollPositionY:_=0}=t.options.chart.scrollablePlotArea||{},v=o+m,x=a+g;e.setSize(o,a),(i??!0)&&(this.isDirty=!1,this.moveFixedElements()),s(t.container),l(h,{width:`${v}px`,height:`${x}px`}),t.renderer.boxWrapper.attr({width:v,height:x,viewBox:[0,0,v,x].join(" ")}),t.chartBackground?.attr({width:v,height:x}),l(r,{width:`${o}px`,height:`${a}px`}),c(i)||(r.scrollLeft=m*y,r.scrollTop=g*_);let b=p-n[0]-1,w=d-n[3]-1,S=p+u+n[2]+1,C=d+f+n[1]+1,T=d+f-m,k=p+u-g,E=[["M",0,0]];m?E=[["M",0,b],["L",d-1,b],["L",d-1,S],["L",0,S],["Z"],["M",T,b],["L",o,b],["L",o,S],["L",T,S],["Z"]]:g&&(E=[["M",w,0],["L",w,p-1],["L",C,p-1],["L",C,0],["Z"],["M",w,k],["L",w,a],["L",C,a],["L",C,k],["Z"]]),"adjustHeight"!==t.redrawTrigger&&this.mask.attr({d:E})}moveFixedElements(){let t,{container:e,inverted:i,scrollablePixelsX:r,scrollablePixelsY:s}=this.chart,n=this.fixedRenderer,o=f.fixedSelectors;for(let a of(r&&!i?t=".highcharts-yaxis":r&&i||s&&!i?t=".highcharts-xaxis":s&&i&&(t=".highcharts-yaxis"),t&&o.push(`${t}:not(.highcharts-radial-axis)`,`${t}-labels:not(.highcharts-radial-axis-labels)`),o))[].forEach.call(e.querySelectorAll(a),(t=>{(t.namespaceURI===n.SVG_NS?n.box:n.box.parentNode).appendChild(t),t.style.pointerEvents="auto"}))}}return f.fixedSelectors=[".highcharts-breadcrumbs-group",".highcharts-contextbutton",".highcharts-caption",".highcharts-credits",".highcharts-drillup-button",".highcharts-legend",".highcharts-legend-checkbox",".highcharts-navigator-series",".highcharts-navigator-xaxis",".highcharts-navigator-yaxis",".highcharts-navigator",".highcharts-range-selector-group",".highcharts-reset-zoom",".highcharts-scrollbar",".highcharts-subtitle",".highcharts-title"],f})),i(e,"Core/Axis/Stacking/StackItem.js",[e["Core/Templating.js"],e["Core/Series/SeriesRegistry.js"],e["Core/Utilities.js"]],(function(t,e,i){let{format:r}=t,{series:s}=e,{destroyObjectProperties:n,fireEvent:o,isNumber:a,pick:l}=i;return class{constructor(t,e,i,r,s){let n=t.chart.inverted,o=t.reversed;this.axis=t;let a=this.isNegative=!!i!=!!o;this.options=e=e||{},this.x=r,this.total=null,this.cumulative=null,this.points={},this.hasValidPoints=!1,this.stack=s,this.leftCliff=0,this.rightCliff=0,this.alignOptions={align:e.align||(n?a?"left":"right":"center"),verticalAlign:e.verticalAlign||(n?"middle":a?"bottom":"top"),y:e.y,x:e.x},this.textAlign=e.textAlign||(n?a?"right":"left":"center")}destroy(){n(this,this.axis)}render(t){let e=this.axis.chart,i=this.options,s=i.format,n=s?r(s,this,e):i.formatter.call(this);if(this.label)this.label.attr({text:n,visibility:"hidden"});else{this.label=e.renderer.label(n,null,void 0,i.shape,void 0,void 0,i.useHTML,!1,"stack-labels");let r={r:i.borderRadius||0,text:n,padding:l(i.padding,5),visibility:"hidden"};e.styledMode||(r.fill=i.backgroundColor,r.stroke=i.borderColor,r["stroke-width"]=i.borderWidth,this.label.css(i.style||{})),this.label.attr(r),this.label.added||this.label.add(t)}this.label.labelrank=e.plotSizeY,o(this,"afterRender")}setOffset(t,e,i,r,n,c){let{alignOptions:h,axis:u,label:d,options:p,textAlign:f}=this,m=u.chart,g=this.getStackBox({xOffset:t,width:e,boxBottom:i,boxTop:r,defaultX:n,xAxis:c}),{verticalAlign:y}=h;if(d&&g){let t,e=d.getBBox(void 0,0),i=d.padding,r="justify"===l(p.overflow,"justify");h.x=p.x||0,h.y=p.y||0;let{x:n,y:o}=this.adjustStackPosition({labelBox:e,verticalAlign:y,textAlign:f});g.x-=n,g.y-=o,d.align(h,!1,g),(t=m.isInsidePlot(d.alignAttr.x+h.x+n,d.alignAttr.y+h.y+o))||(r=!1),r&&s.prototype.justifyDataLabel.call(u,d,h,d.alignAttr,e,g),d.attr({x:d.alignAttr.x,y:d.alignAttr.y,rotation:p.rotation,rotationOriginX:e.width*{left:0,center:.5,right:1}[p.textAlign||"center"],rotationOriginY:e.height/2}),l(!r&&p.crop,!0)&&(t=a(d.x)&&a(d.y)&&m.isInsidePlot(d.x-i+(d.width||0),d.y)&&m.isInsidePlot(d.x+i,d.y)),d[t?"show":"hide"]()}o(this,"afterSetOffset",{xOffset:t,width:e})}adjustStackPosition({labelBox:t,verticalAlign:e,textAlign:i}){let r={bottom:0,middle:1,top:2,right:1,center:0,left:-1},s=r[e],n=r[i];return{x:t.width/2+t.width/2*n,y:t.height/2*s}}getStackBox(t){let e=this.axis,i=e.chart,{boxTop:r,defaultX:s,xOffset:n,width:o,boxBottom:c}=t,h=e.stacking.usePercentage?100:l(r,this.total,0),u=e.toPixels(h),d=t.xAxis||i.xAxis[0],p=l(s,d.translate(this.x))+n,f=Math.abs(u-e.toPixels(c||a(e.min)&&e.logarithmic&&e.logarithmic.lin2log(e.min)||0)),m=i.inverted,g=this.isNegative;return m?{x:(g?u:u-f)-i.plotLeft,y:d.height-p-o+d.top-i.plotTop,width:f,height:o}:{x:p+d.transB-i.plotLeft,y:(g?u-f:u)-i.plotTop,width:o,height:f}}}})),i(e,"Core/Axis/Stacking/StackingAxis.js",[e["Core/Animation/AnimationUtilities.js"],e["Core/Axis/Axis.js"],e["Core/Series/SeriesRegistry.js"],e["Core/Axis/Stacking/StackItem.js"],e["Core/Utilities.js"]],(function(t,e,i,r,s){var n;let{getDeferredAnimation:o}=t,{series:{prototype:a}}=i,{addEvent:l,correctFloat:c,defined:h,destroyObjectProperties:u,fireEvent:d,isArray:p,isNumber:f,objectEach:m,pick:g}=s;function y(){let t=this.inverted;this.axes.forEach((t=>{t.stacking&&t.stacking.stacks&&t.hasVisibleSeries&&(t.stacking.oldStacks=t.stacking.stacks)})),this.series.forEach((e=>{let i=e.xAxis&&e.xAxis.options||{};e.options.stacking&&e.reserveSpace()&&(e.stackKey=[e.type,g(e.options.stack,""),t?i.top:i.left,t?i.height:i.width].join(","))}))}function _(){let t=this.stacking;if(t){let e=t.stacks;m(e,((t,i)=>{u(t),delete e[i]})),t.stackTotalGroup?.destroy()}}function v(){this.stacking||(this.stacking=new T(this))}function x(t,e,i,r){return!h(t)||t.x!==e||r&&t.stackKey!==r?t={x:e,index:0,key:r,stackKey:r}:t.index++,t.key=[i,e,t.index].join(","),t}function b(){let t,e=this,i=e.yAxis,r=e.stackKey||"",s=i.stacking.stacks,n=e.processedXData,o=e.options.stacking,a=e[o+"Stacker"];a&&[r,"-"+r].forEach((i=>{let r,o,l,c=n.length;for(;c--;)r=n[c],t=e.getStackIndicator(t,r,e.index,i),o=s[i]?.[r],(l=o?.points[t.key||""])&&a.call(e,l,o,c)}))}function w(t,e,i){let r=e.total?100/e.total:0;t[0]=c(t[0]*r),t[1]=c(t[1]*r),this.stackedYData[i]=t[1]}function S(t){(this.is("column")||this.is("columnrange"))&&(this.options.centerInCategory&&!this.options.stacking&&this.chart.series.length>1?a.setStackedPoints.call(this,t,"group"):t.stacking.resetStacks())}function C(t,e){let i,s,n,o,a,l,u,d,f,m=e||this.options.stacking;if(!m||!this.reserveSpace()||({group:"xAxis"}[m]||"yAxis")!==t.coll)return;let y=this.processedXData,_=this.processedYData,v=[],x=_.length,b=this.options,w=b.threshold||0,S=b.startFromThreshold?w:0,C=b.stack,T=e?`${this.type},${m}`:this.stackKey||"",k="-"+T,E=this.negStacks,A=t.stacking,M=A.stacks,P=A.oldStacks;for(A.stacksTouched+=1,u=0;u0&&!1===this.singleStacks&&(n.points[l][0]=n.points[this.index+","+d+",0"][0])):(delete n.points[l],delete n.points[this.index]);let e=n.total||0;"percent"===m?(o=s?T:k,e=E&&M[o]?.[d]?(o=M[o][d]).total=Math.max(o.total||0,e)+Math.abs(f)||0:c(e+(Math.abs(f)||0))):"group"===m?(p(f)&&(f=f[0]),null!==f&&e++):e=c(e+(f||0)),n.cumulative="group"===m?(e||1)-1:c(g(n.cumulative,S)+(f||0)),n.total=e,null!==f&&(n.points[l].push(n.cumulative),v[u]=n.cumulative,n.hasValidPoints=!0)}"percent"===m&&(A.usePercentage=!0),"group"!==m&&(this.stackedYData=v),A.oldStacks={}}class T{constructor(t){this.oldStacks={},this.stacks={},this.stacksTouched=0,this.axis=t}buildStacks(){let t,e,i=this.axis,r=i.series,s="xAxis"===i.coll,n=i.options.reversedStacks,o=r.length;for(this.resetStacks(),this.usePercentage=!1,e=o;e--;)t=r[n?e:o-e-1],s&&t.setGroupedPoints(i),t.setStackedPoints(i);if(!s)for(e=0;e{m(t,(t=>{t.cumulative=t.total}))})))}resetStacks(){m(this.stacks,(t=>{m(t,((e,i)=>{f(e.touched)&&e.touched{m(t,(t=>{t.render(n)}))})),n.animate({opacity:1},s)}}return(n||(n={})).compose=function(t,e,i){let r=e.prototype,s=i.prototype;r.getStacks||(l(t,"init",v),l(t,"destroy",_),r.getStacks=y,s.getStackIndicator=x,s.modifyStacks=b,s.percentStacker=w,s.setGroupedPoints=S,s.setStackedPoints=C)},n})),i(e,"Series/Line/LineSeries.js",[e["Core/Series/Series.js"],e["Core/Series/SeriesRegistry.js"],e["Core/Utilities.js"]],(function(t,e,i){let{defined:r,merge:s,isObject:n}=i;class o extends t{drawGraph(){let t=this.options,e=(this.gappedPath||this.getGraphPath).call(this),i=this.chart.styledMode;[this,...this.zones].forEach(((r,o)=>{let a,l=r.graph,c=l?"animate":"attr",h=r.dashStyle||t.dashStyle;l?(l.endX=this.preventGraphAnimation?null:e.xMap,l.animate({d:e})):e.length&&(r.graph=l=this.chart.renderer.path(e).addClass("highcharts-graph"+(o?` highcharts-zone-graph-${o-1} `:" ")+(o&&r.className||"")).attr({zIndex:1}).add(this.group)),l&&!i&&(a={stroke:!o&&t.lineColor||r.color||this.color||"#cccccc","stroke-width":t.lineWidth||0,fill:this.fillGraph&&this.color||"none"},h?a.dashstyle=h:"square"!==t.linecap&&(a["stroke-linecap"]=a["stroke-linejoin"]="round"),l[c](a).shadow(o<2&&t.shadow&&s({filterUnits:"userSpaceOnUse"},n(t.shadow)?t.shadow:{}))),l&&(l.startX=e.xMap,l.isArea=e.isArea)}))}getGraphPath(t,e,i){let s,n=this,o=n.options,a=[],l=[],c=o.step,h=(t=t||n.points).reversed;return h&&t.reverse(),(c={right:1,center:2}[c]||c&&3)&&h&&(c=4-c),(t=this.getValidPoints(t,!1,!(o.connectNulls&&!e&&!i))).forEach((function(h,u){let d,p=h.plotX,f=h.plotY,m=t[u-1],g=h.isNull||"number"!=typeof f;(h.leftCliff||m&&m.rightCliff)&&!i&&(s=!0),g&&!r(e)&&u>0?s=!o.connectNulls:g&&!e?s=!0:(0===u||s?d=[["M",h.plotX,h.plotY]]:n.getPointSpline?d=[n.getPointSpline(t,h,u)]:c?(d=1===c?[["L",m.plotX,f]]:2===c?[["L",(m.plotX+p)/2,m.plotY],["L",(m.plotX+p)/2,f]]:[["L",p,m.plotY]]).push(["L",p,f]):d=[["L",p,f]],l.push(h.x),c&&(l.push(h.x),2===c&&l.push(h.x)),a.push.apply(a,d),s=!1)})),a.xMap=l,n.graphPath=a,a}}return o.defaultOptions=s(t.defaultOptions,{legendSymbol:"lineMarker"}),e.registerSeriesType("line",o),o})),i(e,"Series/Area/AreaSeriesDefaults.js",[],(function(){return{threshold:0,legendSymbol:"areaMarker"}})),i(e,"Series/Area/AreaSeries.js",[e["Series/Area/AreaSeriesDefaults.js"],e["Core/Series/SeriesRegistry.js"],e["Core/Utilities.js"]],(function(t,e,i){let{seriesTypes:{line:r}}=e,{extend:s,merge:n,objectEach:o,pick:a}=i;class l extends r{drawGraph(){this.areaPath=[],super.drawGraph.apply(this);let{areaPath:t,options:e}=this;[this,...this.zones].forEach(((i,r)=>{let s={},n=i.fillColor||e.fillColor,o=i.area,a=o?"animate":"attr";o?(o.endX=this.preventGraphAnimation?null:t.xMap,o.animate({d:t})):(s.zIndex=0,(o=i.area=this.chart.renderer.path(t).addClass("highcharts-area"+(r?` highcharts-zone-area-${r-1} `:" ")+(r&&i.className||"")).add(this.group)).isArea=!0),this.chart.styledMode||(s.fill=n||i.color||this.color,s["fill-opacity"]=n?1:e.fillOpacity??.75,o.css({pointerEvents:this.stickyTracking?"none":"auto"})),o[a](s),o.startX=t.xMap,o.shiftUnit=e.step?2:1}))}getGraphPath(t){let e,i,s,n=r.prototype.getGraphPath,o=this.options,l=o.stacking,c=this.yAxis,h=[],u=[],d=this.index,p=c.stacking.stacks[this.stackKey],f=o.threshold,m=Math.round(c.getThreshold(o.threshold)),g=a(o.connectNulls,"percent"===l),y=function(i,r,s){let n,o,a=t[i],g=l&&p[a.x].points[d],y=a[s+"Null"]||0,_=a[s+"Cliff"]||0,v=!0;_||y?(n=(y?g[0]:g[1])+_,o=g[0]+_,v=!!y):!l&&t[r]&&t[r].isNull&&(n=o=f),void 0!==n&&(u.push({plotX:e,plotY:null===n?m:c.getThreshold(n),isNull:v,isCliff:!0}),h.push({plotX:e,plotY:null===o?m:c.getThreshold(o),doCurve:!1}))};t=t||this.points,l&&(t=this.getStackPoints(t));for(let r=0,n=t.length;r1&&l&&u.some((t=>t.isCliff))&&(b.hasStackedCliffs=w.hasStackedCliffs=!0),b.xMap=_.xMap,this.areaPath=b,w}getStackPoints(t){let e=this,i=[],r=[],s=this.xAxis,n=this.yAxis,l=n.stacking.stacks[this.stackKey],c={},h=n.series,u=h.length,d=n.options.reversedStacks?1:-1,p=h.indexOf(e);if(t=t||this.points,this.options.stacking){for(let e=0;et.visible));r.forEach((function(t,o){let m,g,y=0;if(c[t]&&!c[t].isNull)i.push(c[t]),[-1,1].forEach((function(i){let s=1===i?"rightNull":"leftNull",n=l[r[o+i]],a=0;if(n){let i=p;for(;i>=0&&i=0&&ei&&n>c?(n=Math.max(i,c),a=2*c-n):nd&&a>c?(a=Math.max(d,c),n=2*c-a):a1){let s=this.xAxis.series.filter((t=>t.visible)).map((t=>t.index)),n=0,o=0;v(this.xAxis.stacking?.stacks,(t=>{if("number"==typeof i.x){let e=t[i.x.toString()];if(e&&m(e.points[this.index])){let t=Object.keys(e.points).filter((t=>!t.match(",")&&e.points[t]&&e.points[t].length>1)).map(parseFloat).filter((t=>-1!==s.indexOf(t))).sort(((t,e)=>e-t));n=t.indexOf(this.index),o=t.length}}})),n=this.xAxis.reversed?o-1-n:n;let a=(o-1)*r.paddedWidth+e;t=(i.plotX||0)+a/2-e-n*r.paddedWidth}return t}translate(){let t=this,e=t.chart,i=t.options,r=t.dense=t.closestPointRange*t.xAxis.transA<2,n=t.borderWidth=_(i.borderWidth,r?0:1),o=t.xAxis,a=t.yAxis,l=i.threshold,c=_(i.minPointLength,5),u=t.getColumnMetrics(),p=u.width,m=t.pointXOffset=u.offset,y=t.dataMin,v=t.dataMax,x=t.translatedThreshold=a.getThreshold(l),b=t.barW=Math.max(p,1+2*n);i.pointPadding&&(b=Math.ceil(b)),s.prototype.translate.apply(t),t.points.forEach((function(r){let s,n=_(r.yBottom,x),f=999+Math.abs(n),w=r.plotX||0,S=h(r.plotY,-f,a.len+f),C=Math.min(S,n),T=Math.max(S,n)-C,k=p,E=w+m,A=b;c&&Math.abs(T)c?n-c:x-(s?c:0)),d(r.options.pointWidth)&&(E-=Math.round(((k=A=Math.ceil(r.options.pointWidth))-p)/2)),i.centerInCategory&&!i.stacking&&(E=t.adjustForMissingColumns(E,k,r,u)),r.barX=E,r.pointWidth=k,r.tooltipPos=e.inverted?[h(a.len+a.pos-e.plotLeft-S,a.pos-e.plotLeft,a.len+a.pos-e.plotLeft),o.len+o.pos-e.plotTop-E-A/2,T]:[o.left-e.plotLeft+E+A/2,h(S+a.pos-e.plotTop,a.pos-e.plotTop,a.len+a.pos-e.plotTop),T],r.shapeType=t.pointClass.prototype.shapeType||"roundedRect",r.shapeArgs=t.crispCol(E,r.isNull?x:C,A,r.isNull?0:T)})),f(this,"afterColumnTranslate")}drawGraph(){this.group[this.dense?"addClass":"removeClass"]("highcharts-dense-data")}pointAttribs(t,e){let i,r,s,n=this.options,o=this.pointAttrToOptions||{},a=o.stroke||"borderColor",c=o["stroke-width"]||"borderWidth",h=t&&t.color||this.color,u=t&&t[a]||n[a]||h,d=t&&t.options.dashStyle||n.dashStyle,p=t&&t[c]||n[c]||this[c]||0,f=_(t&&t.opacity,n.opacity,1);t&&this.zones.length&&(r=t.getZone(),h=t.options.color||r&&(r.color||t.nonZonedColor)||this.color,r&&(u=r.borderColor||u,d=r.dashStyle||d,p=r.borderWidth||p)),e&&t&&(s=(i=y(n.states[e],t.options.states&&t.options.states[e]||{})).brightness,h=i.color||void 0!==s&&l(h).brighten(i.brightness).get()||h,u=i[a]||u,p=i[c]||p,d=i.dashStyle||d,f=_(i.opacity,f));let m={fill:h,stroke:u,"stroke-width":p,opacity:f};return d&&(m.dashstyle=d),m}drawPoints(t=this.points){let e,i=this,r=this.chart,s=i.options,n=r.renderer,o=s.animationLimit||250;t.forEach((function(t){let a=t.plotY,l=t.graphic,c=!!l,h=l&&r.pointCountt?.enabled))}function i(t,e,i,r,s){let{chart:n,enabledDataSorting:l}=this,c=this.isCartesian&&n.inverted,h=t.plotX,d=t.plotY,f=i.rotation||0,m=o(h)&&o(d)&&n.isInsidePlot(h,Math.round(d),{inverted:c,paneCoordinates:!0,series:this}),g=0===f&&"justify"===p(i.overflow,l?"none":"justify"),y=this.visible&&!1!==t.visible&&o(h)&&(t.series.forceDL||l&&!g||m||p(i.inside,!!this.options.stacking)&&r&&n.isInsidePlot(h,c?r.x+1:r.y+r.height-1,{inverted:c,paneCoordinates:!0,series:this})),_=t.pos();if(y&&_){var v;let o=e.getBBox(),h=e.getBBox(void 0,0),d={right:1,center:.5}[i.align||0]||0,x={bottom:1,middle:.5}[i.verticalAlign||0]||0;if(r=a({x:_[0],y:Math.round(_[1]),width:0,height:0},r||{}),"plotEdges"===i.alignTo&&this.isCartesian&&(r[c?"x":"y"]=0,r[c?"width":"height"]=this.yAxis?.len||0),a(i,{width:o.width,height:o.height}),v=r,l&&this.xAxis&&!g&&this.setDataLabelStartPos(t,e,s,m,v),e.align(u(i,{width:h.width,height:h.height}),!1,r,!1),e.alignAttr.x+=d*(h.width-o.width),e.alignAttr.y+=x*(h.height-o.height),e[e.placed?"animate":"attr"]({x:e.alignAttr.x+(o.width-h.width)/2,y:e.alignAttr.y+(o.height-h.height)/2,rotationOriginX:(e.width||0)/2,rotationOriginY:(e.height||0)/2}),g&&r.height>=0)this.justifyDataLabel(e,i,e.alignAttr,o,r,s);else if(p(i.crop,!0)){let{x:t,y:i}=e.alignAttr;y=n.isInsidePlot(t,i,{paneCoordinates:!0,series:this})&&n.isInsidePlot(t+o.width-1,i+o.height-1,{paneCoordinates:!0,series:this})}i.shape&&!f&&e[s?"attr":"animate"]({anchorX:_[0],anchorY:_[1]})}s&&l&&(e.placed=!1),y||l&&!g?(e.show(),e.placed=!0):(e.hide(),e.placed=!1)}function r(){return this.plotGroup("dataLabelsGroup","data-labels",this.hasRendered?"inherit":"hidden",this.options.dataLabels.zIndex||6)}function g(t){let e=this.hasRendered||0,i=this.initDataLabelsGroup().attr({opacity:+e});return!e&&i&&(this.visible&&i.show(),this.options.animation?i.animate({opacity:1},t):i.attr({opacity:1})),i}function y(t){let e;t=t||this.points;let i=this,r=i.chart,a=i.options,c=r.renderer,{backgroundColor:u,plotBackgroundColor:g}=r.options.chart,y=c.getContrast(h(g)&&g||h(u)&&u||"#000000"),_=x(i),{animation:b,defer:w}=_[0],S=w?s(r,b,i):{defer:0,duration:0};l(this,"drawDataLabels"),i.hasDataLabels?.()&&(e=this.initDataLabels(S),t.forEach((t=>{let s=t.dataLabels||[];m(v(_,t.dlOptions||t.options?.dataLabels)).forEach(((u,m)=>{let g,_,v,x,b,w=u.enabled&&(t.visible||t.dataLabelOnHidden)&&(!t.isNull||t.dataLabelOnNull)&&function(t,e){let i=e.filter;if(i){let e=i.operator,r=t[i.property],s=i.value;return">"===e&&r>s||"<"===e&&r="===e&&r>=s||"<="===e&&r<=s||"=="===e&&r==s||"==="===e&&r===s||"!="===e&&r!=s||"!=="===e&&r!==s}return!0}(t,u),{backgroundColor:S,borderColor:C,distance:T,style:k={}}=u,E={},A=s[m],M=!A;w&&(_=p(u[t.formatPrefix+"Format"],u.format),g=t.getLabelConfig(),v=o(_)?n(_,g,r):(u[t.formatPrefix+"Formatter"]||u.formatter).call(g,u),x=u.rotation,!r.styledMode&&(k.color=p(u.color,k.color,h(i.color)?i.color:void 0,"#000000"),"contrast"===k.color?("none"!==S&&(b=S),t.contrastColor=c.getContrast("auto"!==b&&b||t.color||i.color),k.color=b||!o(T)&&u.inside||0>f(T||0)||a.stacking?t.contrastColor:y):delete t.contrastColor,a.cursor&&(k.cursor=a.cursor)),E={r:u.borderRadius||0,rotation:x,padding:u.padding,zIndex:1},r.styledMode||(E.fill="auto"===S?t.color:S,E.stroke="auto"===C?t.color:C,E["stroke-width"]=u.borderWidth),d(E,((t,e)=>{void 0===t&&delete E[e]}))),!A||w&&o(v)&&!!A.div==!!u.useHTML&&(A.rotation&&u.rotation||A.rotation===u.rotation)||(A=void 0,M=!0),w&&o(v)&&(A?E.text=v:(A=c.label(v,0,0,u.shape,void 0,void 0,u.useHTML,void 0,"data-label")).addClass(" highcharts-data-label-color-"+t.colorIndex+" "+(u.className||"")+(u.useHTML?" highcharts-tracker":"")),A&&(A.options=u,A.attr(E),r.styledMode||A.css(k).shadow(u.shadow),l(A,"beforeAddingDataLabel",{labelOptions:u,point:t}),A.added||A.add(e),i.alignDataLabel(t,A,u,void 0,M),A.isActive=!0,s[m]&&s[m]!==A&&s[m].destroy(),s[m]=A))}));let u=s.length;for(;u--;)s[u]&&s[u].isActive?s[u].isActive=!1:(s[u]?.destroy(),s.splice(u,1));t.dataLabel=s[0],t.dataLabels=s}))),l(this,"afterDrawDataLabels")}function _(t,e,i,r,s,n){let o,a,l=this.chart,c=e.align,h=e.verticalAlign,u=t.box?0:t.padding||0,d=l.inverted?this.yAxis:this.xAxis,p=d?d.left-l.plotLeft:0,f=l.inverted?this.xAxis:this.yAxis,m=f?f.top-l.plotTop:0,{x:g=0,y=0}=e;return(o=(i.x||0)+u+p)<0&&("right"===c&&g>=0?(e.align="left",e.inside=!0):g-=o,a=!0),(o=(i.x||0)+r.width-u+p)>l.plotWidth&&("left"===c&&g<=0?(e.align="right",e.inside=!0):g+=l.plotWidth-o,a=!0),(o=i.y+u+m)<0&&("bottom"===h&&y>=0?(e.verticalAlign="top",e.inside=!0):y-=o,a=!0),(o=(i.y||0)+r.height-u+m)>l.plotHeight&&("top"===h&&y<=0?(e.verticalAlign="bottom",e.inside=!0):y+=l.plotHeight-o,a=!0),a&&(e.x=g,e.y=y,t.placed=!n,t.align(e,void 0,s)),a}function v(t,e){let i,r=[];if(c(t)&&!c(e))r=t.map((function(t){return u(t,e)}));else if(c(e)&&!c(t))r=e.map((function(e){return u(t,e)}));else if(c(t)||c(e)){if(c(t)&&c(e))for(i=Math.max(t.length,e.length);i--;)r[i]=u(t[i],e[i])}else r=u(t,e);return r}function x(t){let e=t.chart.options.plotOptions;return m(v(v(e?.series?.dataLabels,e?.[t.type]?.dataLabels),t.options.dataLabels))}function b(t,e,i,r,s){let n=this.chart,o=n.inverted,a=this.xAxis,l=a.reversed,c=((o?e.height:e.width)||0)/2,h=t.pointWidth,u=h?h/2:0;e.startXPos=o?s.x:l?-c-u:a.width-c+u,e.startYPos=o?l?this.yAxis.height-c+u:-c-u:s.y,r?"hidden"===e.visibility&&(e.show(),e.attr({opacity:0}).animate({opacity:1})):e.attr({opacity:1}).animate({opacity:0},void 0,e.hide),n.hasRendered&&(i&&e.attr({x:e.startXPos,y:e.startYPos}),e.placed=!0)}t.compose=function(t){let s=t.prototype;s.initDataLabels||(s.initDataLabels=g,s.initDataLabelsGroup=r,s.alignDataLabel=i,s.drawDataLabels=y,s.justifyDataLabel=_,s.setDataLabelStartPos=b,s.hasDataLabels=e)}}(r||(r={})),r})),i(e,"Series/Column/ColumnDataLabel.js",[e["Core/Series/DataLabel.js"],e["Core/Globals.js"],e["Core/Series/SeriesRegistry.js"],e["Core/Utilities.js"]],(function(t,e,i,r){var s;let{composed:n}=e,{series:o}=i,{merge:a,pick:l,pushUnique:c}=r;return function(e){function i(t,e,i,r,s){let n=this.chart.inverted,c=t.series,h=(c.xAxis?c.xAxis.len:this.chart.plotSizeX)||0,u=(c.yAxis?c.yAxis.len:this.chart.plotSizeY)||0,d=t.dlBox||t.shapeArgs,p=l(t.below,t.plotY>l(this.translatedThreshold,u)),f=l(i.inside,!!this.options.stacking);if(d){if(r=a(d),"allow"!==i.overflow||!1!==i.crop){r.y<0&&(r.height+=r.y,r.y=0);let t=r.y+r.height-u;t>0&&t {series.name}
    ',pointFormat:"x: {point.x}
    y: {point.y}
    "}}})),i(e,"Series/Scatter/ScatterSeries.js",[e["Series/Scatter/ScatterSeriesDefaults.js"],e["Core/Series/SeriesRegistry.js"],e["Core/Utilities.js"]],(function(t,e,i){let{column:r,line:s}=e.seriesTypes,{addEvent:n,extend:o,merge:a}=i;class l extends s{applyJitter(){let t=this,e=this.options.jitter,i=this.points.length;e&&this.points.forEach((function(r,s){["x","y"].forEach((function(n,o){if(e[n]&&!r.isNull){let a=`plot${n.toUpperCase()}`,l=t[`${n}Axis`],c=e[n]*l.transA;if(l&&!l.logarithmic){let t=Math.max(0,(r[a]||0)-c),e=Math.min(l.len,(r[a]||0)+c);r[a]=t+(e-t)*function(t){let e=1e4*Math.sin(t);return e-Math.floor(e)}(s+o*i),"x"===n&&(r.clientX=r.plotX)}}}))}))}drawGraph(){this.options.lineWidth?super.drawGraph():this.graph&&(this.graph=this.graph.destroy())}}return l.defaultOptions=a(s.defaultOptions,t),o(l.prototype,{drawTracker:r.prototype.drawTracker,sorted:!1,requireSorting:!1,noSharedTooltip:!0,trackerGroups:["group","markerGroup","dataLabelsGroup"]}),n(l,"afterTranslate",(function(){this.applyJitter()})),e.registerSeriesType("scatter",l),l})),i(e,"Series/CenteredUtilities.js",[e["Core/Globals.js"],e["Core/Series/Series.js"],e["Core/Utilities.js"]],(function(t,e,i){var r,s;let{deg2rad:n}=t,{fireEvent:o,isNumber:a,pick:l,relativeLength:c}=i;return(s=r||(r={})).getCenter=function(){let t,i,r,s=this.options,n=this.chart,h=2*(s.slicedOffset||0),u=n.plotWidth-2*h,d=n.plotHeight-2*h,p=s.center,f=Math.min(u,d),m=s.thickness,g=s.size,y=s.innerSize||0;"string"==typeof g&&(g=parseFloat(g)),"string"==typeof y&&(y=parseFloat(y));let _=[l(p[0],"50%"),l(p[1],"50%"),l(g&&g<0?void 0:s.size,"100%"),l(y&&y<0?void 0:s.innerSize||0,"0%")];for(!n.angular||this instanceof e||(_[3]=0),i=0;i<4;++i)r=_[i],t=i<2||2===i&&/%$/.test(r),_[i]=c(r,[u,d,f,_[2]][i])+(t?h:0);return _[3]>_[2]&&(_[3]=_[2]),a(m)&&2*m<_[2]&&m>0&&(_[3]=_[2]-2*m),o(this,"afterGetCenter",{positions:_}),_},s.getStartAndEndRadians=function(t,e){let i=a(t)?t:0,r=a(e)&&e>i&&e-i<360?e:i+360;return{start:n*(i+-90),end:n*(r+-90)}},r})),i(e,"Series/Pie/PiePoint.js",[e["Core/Animation/AnimationUtilities.js"],e["Core/Series/Point.js"],e["Core/Utilities.js"]],(function(t,e,i){let{setAnimation:r}=t,{addEvent:s,defined:n,extend:o,isNumber:a,pick:l,relativeLength:c}=i;class h extends e{getConnectorPath(t){let e=t.dataLabelPosition,i=t.options||{},r=i.connectorShape,s=this.connectorShapes[r]||r;return e&&s.call(this,{...e.computed,alignment:e.alignment},e.connectorPosition,i)||[]}getTranslate(){return this.sliced&&this.slicedTranslation||{translateX:0,translateY:0}}haloPath(t){let e=this.shapeArgs;return this.sliced||!this.visible?[]:this.series.chart.renderer.symbols.arc(e.x,e.y,e.r+t,e.r+t,{innerR:e.r-1,start:e.start,end:e.end,borderRadius:e.borderRadius})}constructor(t,e,i){super(t,e,i),this.half=0,this.name??(this.name="Slice");let r=t=>{this.slice("select"===t.type)};s(this,"select",r),s(this,"unselect",r)}isValid(){return a(this.y)&&this.y>=0}setVisible(t,e=!0){t!==this.visible&&this.update({visible:t??!this.visible},e,void 0,!1)}slice(t,e,i){let s=this.series;r(i,s.chart),e=l(e,!0),this.sliced=this.options.sliced=t=n(t)?t:!this.sliced,s.options.data[s.data.indexOf(this)]=this.options,this.graphic&&this.graphic.animate(this.getTranslate())}}return o(h.prototype,{connectorShapes:{fixedOffset:function(t,e,i){let r=e.breakAt,s=e.touchingSliceAt,n=i.softConnector?["C",t.x+("left"===t.alignment?-5:5),t.y,2*r.x-s.x,2*r.y-s.y,r.x,r.y]:["L",r.x,r.y];return[["M",t.x,t.y],n,["L",s.x,s.y]]},straight:function(t,e){let i=e.touchingSliceAt;return[["M",t.x,t.y],["L",i.x,i.y]]},crookedLine:function(t,e,i){let{breakAt:r,touchingSliceAt:s}=e,{series:n}=this,[o,a,l]=n.center,h=l/2,{plotLeft:u,plotWidth:d}=n.chart,p="left"===t.alignment,{x:f,y:m}=t,g=r.x;if(i.crookDistance){let t=c(i.crookDistance,1);g=p?o+h+(d+u-o-h)*(1-t):u+(o-h)*t}else g=o+(a-m)*Math.tan((this.angle||0)-Math.PI/2);let y=[["M",f,m]];return(p?g<=f&&g>=r.x:g>=f&&g<=r.x)&&y.push(["L",g,m]),y.push(["L",r.x,r.y],["L",s.x,s.y]),y}}}),h})),i(e,"Series/Pie/PieSeriesDefaults.js",[],(function(){return{borderRadius:3,center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{connectorPadding:5,connectorShape:"crookedLine",crookDistance:void 0,distance:30,enabled:!0,formatter:function(){return this.point.isNull?void 0:this.point.name},softConnector:!0,x:0},fillColor:void 0,ignoreHiddenPoint:!0,inactiveOtherPoints:!0,legendType:"point",marker:null,size:null,showInLegend:!1,slicedOffset:10,stickyTracking:!1,tooltip:{followPointer:!0},borderColor:"#ffffff",borderWidth:1,lineWidth:void 0,states:{hover:{brightness:.1}}}})),i(e,"Series/Pie/PieSeries.js",[e["Series/CenteredUtilities.js"],e["Series/Column/ColumnSeries.js"],e["Core/Globals.js"],e["Series/Pie/PiePoint.js"],e["Series/Pie/PieSeriesDefaults.js"],e["Core/Series/Series.js"],e["Core/Series/SeriesRegistry.js"],e["Core/Renderer/SVG/Symbols.js"],e["Core/Utilities.js"]],(function(t,e,i,r,s,n,o,a,l){let{getStartAndEndRadians:c}=t,{noop:h}=i,{clamp:u,extend:d,fireEvent:p,merge:f,pick:m}=l;class g extends n{animate(t){let e=this,i=e.points,r=e.startAngleRad;t||i.forEach((function(t){let i=t.graphic,s=t.shapeArgs;i&&s&&(i.attr({r:m(t.startR,e.center&&e.center[3]/2),start:r,end:r}),i.animate({r:s.r,start:s.start,end:s.end},e.options.animation))}))}drawEmpty(){let t,e,i=this.startAngleRad,r=this.endAngleRad,s=this.options;0===this.total&&this.center?(t=this.center[0],e=this.center[1],this.graph||(this.graph=this.chart.renderer.arc(t,e,this.center[1]/2,0,i,r).addClass("highcharts-empty-series").add(this.group)),this.graph.attr({d:a.arc(t,e,this.center[2]/2,0,{start:i,end:r,innerR:this.center[3]/2})}),this.chart.styledMode||this.graph.attr({"stroke-width":s.borderWidth,fill:s.fillColor||"none",stroke:s.color||"#cccccc"})):this.graph&&(this.graph=this.graph.destroy())}drawPoints(){let t=this.chart.renderer;this.points.forEach((function(e){e.graphic&&e.hasNewShapeType()&&(e.graphic=e.graphic.destroy()),e.graphic||(e.graphic=t[e.shapeType](e.shapeArgs).add(e.series.group),e.delayedRendering=!0)}))}generatePoints(){super.generatePoints(),this.updateTotals()}getX(t,e,i,r){let s=this.center,n=this.radii?this.radii[i.index]||0:s[2]/2,o=r.dataLabelPosition,a=o?.distance||0,l=Math.asin(u((t-s[1])/(n+a),-1,1));return s[0]+Math.cos(l)*(n+a)*(e?-1:1)+(a>0?(e?-1:1)*(r.padding||0):0)}hasData(){return!!this.processedXData.length}redrawPoints(){let t,e,i,r,s=this,n=s.chart;this.drawEmpty(),s.group&&!n.styledMode&&s.group.shadow(s.options.shadow),s.points.forEach((function(o){let a={};e=o.graphic,!o.isNull&&e?(r=o.shapeArgs,t=o.getTranslate(),n.styledMode||(i=s.pointAttribs(o,o.selected&&"select")),o.delayedRendering?(e.setRadialReference(s.center).attr(r).attr(t),n.styledMode||e.attr(i).attr({"stroke-linejoin":"round"}),o.delayedRendering=!1):(e.setRadialReference(s.center),n.styledMode||f(!0,a,i),f(!0,a,r,t),e.animate(a)),e.attr({visibility:o.visible?"inherit":"hidden"}),e.addClass(o.getClassName(),!0)):e&&(o.graphic=e.destroy())}))}sortByAngle(t,e){t.sort((function(t,i){return void 0!==t.angle&&(i.angle-t.angle)*e}))}translate(t){p(this,"translate"),this.generatePoints();let e,i,r,s,n,o,a,l=this.options,h=l.slicedOffset,u=c(l.startAngle,l.endAngle),d=this.startAngleRad=u.start,f=(this.endAngleRad=u.end)-d,m=this.points,g=l.ignoreHiddenPoint,y=m.length,_=0;for(t||(this.center=t=this.getCenter()),o=0;o1.5*Math.PI?r-=2*Math.PI:r<-Math.PI/2&&(r+=2*Math.PI),a.slicedTranslation={translateX:Math.round(Math.cos(r)*h),translateY:Math.round(Math.sin(r)*h)},s=Math.cos(r)*t[2]/2,n=Math.sin(r)*t[2]/2,a.tooltipPos=[t[0]+.7*s,t[1]+.7*n],a.half=r<-Math.PI/2||r>Math.PI/2?1:0,a.angle=r}p(this,"afterTranslate")}updateTotals(){let t,e,i=this.points,r=i.length,s=this.options.ignoreHiddenPoint,n=0;for(t=0;t0&&(e.visible||!s)?e.y/n*100:0,e.total=n}}return g.defaultOptions=f(n.defaultOptions,s),d(g.prototype,{axisTypes:[],directTouch:!0,drawGraph:void 0,drawTracker:e.prototype.drawTracker,getCenter:t.getCenter,getSymbol:h,invertible:!1,isCartesian:!1,noSharedTooltip:!0,pointAttribs:e.prototype.pointAttribs,pointClass:r,requireSorting:!1,searchPoint:h,trackerGroups:["group","dataLabelsGroup"]}),o.registerSeriesType("pie",g),g})),i(e,"Series/Pie/PieDataLabel.js",[e["Core/Series/DataLabel.js"],e["Core/Globals.js"],e["Core/Renderer/RendererUtilities.js"],e["Core/Series/SeriesRegistry.js"],e["Core/Utilities.js"]],(function(t,e,i,r,s){var n;let{composed:o,noop:a}=e,{distribute:l}=i,{series:c}=r,{arrayMax:h,clamp:u,defined:d,pick:p,pushUnique:f,relativeLength:m}=s;return function(e){let i={radialDistributionY:function(t,e){return(e.dataLabelPosition?.top||0)+t.distributeBox.pos},radialDistributionX:function(t,e,i,r,s){let n=s.dataLabelPosition;return t.getX(i<(n?.top||0)+2||i>(n?.bottom||0)-2?r:i,e.half,e,s)},justify:function(t,e,i,r){return r[0]+(t.half?-1:1)*(i+(e.dataLabelPosition?.distance||0))},alignToPlotEdges:function(t,e,i,r){let s=t.getBBox().width;return e?s+r:i-s-r},alignToConnectors:function(t,e,i,r){let s,n=0;return t.forEach((function(t){(s=t.dataLabel.getBBox().width)>n&&(n=s)})),e?n+r:i-n-r}};function r(t,e){let{center:i,options:r}=this,s=i[2]/2,n=t.angle||0,o=Math.cos(n),a=Math.sin(n),l=i[0]+o*s,c=i[1]+a*s,h=Math.min((r.slicedOffset||0)+(r.borderWidth||0),e/5);return{natural:{x:l+o*e,y:c+a*e},computed:{},alignment:e<0?"center":t.half?"right":"left",connectorPosition:{breakAt:{x:l+o*h,y:c+a*h},touchingSliceAt:{x:l,y:c}},distance:e}}function s(){let t,e,i,r=this,s=r.points,n=r.chart,o=n.plotWidth,a=n.plotHeight,u=n.plotLeft,f=Math.round(n.chartWidth/3),g=r.center,y=g[2]/2,_=g[1],v=[[],[]],x=[0,0,0,0],b=r.dataLabelPositioners,w=0;r.visible&&r.hasDataLabels?.()&&(s.forEach((t=>{(t.dataLabels||[]).forEach((t=>{t.shortened&&(t.attr({width:"auto"}).css({width:"auto",textOverflow:"clip"}),t.shortened=!1)}))})),c.prototype.drawDataLabels.apply(r),s.forEach((t=>{(t.dataLabels||[]).forEach(((e,i)=>{let r=g[2]/2,s=e.options,n=m(s?.distance||0,r);0===i&&v[t.half].push(t),!d(s?.style?.width)&&e.getBBox().width>f&&(e.css({width:Math.round(.7*f)+"px"}),e.shortened=!0),e.dataLabelPosition=this.getDataLabelPosition(t,n),w=Math.max(w,n)}))})),v.forEach(((t,s)=>{let c,h,f,m=t.length,v=[],S=0;m&&(r.sortByAngle(t,s-.5),w>0&&(c=Math.max(0,_-y-w),h=Math.min(_+y+w,n.plotHeight),t.forEach((t=>{(t.dataLabels||[]).forEach((e=>{let i=e.dataLabelPosition;i&&i.distance>0&&(i.top=Math.max(0,_-y-i.distance),i.bottom=Math.min(_+y+i.distance,n.plotHeight),S=e.getBBox().height||21,e.lineHeight=n.renderer.fontMetrics(e.text||e).h+2*e.padding,t.distributeBox={target:(e.dataLabelPosition?.natural.y||0)-i.top+e.lineHeight/2,size:S,rank:t.y},v.push(t.distributeBox))}))})),l(v,f=h+S-c,f/5)),t.forEach((n=>{(n.dataLabels||[]).forEach((l=>{let c=l.options||{},h=n.distributeBox,f=l.dataLabelPosition,m=f?.natural.y||0,_=c.connectorPadding||0,w=l.lineHeight||21,S=(w-l.getBBox().height)/2,C=0,T=m,k="inherit";if(f){if(v&&d(h)&&f.distance>0&&(void 0===h.pos?k="hidden":(i=h.size,T=b.radialDistributionY(n,l))),c.justify)C=b.justify(n,l,y,g);else switch(c.alignTo){case"connectors":C=b.alignToConnectors(t,s,o,u);break;case"plotEdges":C=b.alignToPlotEdges(l,s,o,u);break;default:C=b.radialDistributionX(r,n,T-S,m,l)}if(f.attribs={visibility:k,align:f.alignment},f.posAttribs={x:C+(c.x||0)+({left:_,right:-_}[f.alignment]||0),y:T+(c.y||0)-w/2},f.computed.x=C,f.computed.y=T-S,p(c.crop,!0)){let t;C-(e=l.getBBox().width)<_&&1===s?(t=Math.round(e-C+_),x[3]=Math.max(t,x[3])):C+e>o-_&&0===s&&(t=Math.round(C+e-o+_),x[1]=Math.max(t,x[1])),T-i/2<0?x[0]=Math.max(Math.round(i/2-T),x[0]):T+i/2>a&&(x[2]=Math.max(Math.round(T+i/2-a),x[2])),f.sideOverflow=t}}}))})))})),(0===h(x)||this.verifyDataLabelOverflow(x))&&(this.placeDataLabels(),this.points.forEach((e=>{(e.dataLabels||[]).forEach((i=>{let{connectorColor:s,connectorWidth:o=1}=i.options||{},a=i.dataLabelPosition;if(o){let l;t=i.connector,a&&a.distance>0?(l=!t,t||(i.connector=t=n.renderer.path().addClass("highcharts-data-label-connector highcharts-color-"+e.colorIndex+(e.className?" "+e.className:"")).add(r.dataLabelsGroup)),n.styledMode||t.attr({"stroke-width":o,stroke:s||e.color||"#666666"}),t[l?"attr":"animate"]({d:e.getConnectorPath(i)}),t.attr({visibility:a.attribs?.visibility})):t&&(i.connector=t.destroy())}}))}))))}function n(){this.points.forEach((t=>{(t.dataLabels||[]).forEach((t=>{let e=t.dataLabelPosition;e?(e.sideOverflow&&(t.css({width:Math.max(t.getBBox().width-e.sideOverflow,0)+"px",textOverflow:(t.options?.style||{}).textOverflow||"ellipsis"}),t.shortened=!0),t.attr(e.attribs),t[t.moved?"animate":"attr"](e.posAttribs),t.moved=!0):t&&t.attr({y:-9999})})),delete t.distributeBox}),this)}function g(t){let e=this.center,i=this.options,r=i.center,s=i.minSize||80,n=s,o=null!==i.size;return!o&&(null!==r[0]?n=Math.max(e[2]-Math.max(t[1],t[3]),s):(n=Math.max(e[2]-t[1]-t[3],s),e[0]+=(t[3]-t[1])/2),null!==r[1]?n=u(n,s,e[2]-Math.max(t[0],t[2])):(n=u(n,s,e[2]-t[0]-t[2]),e[1]+=(t[0]-t[2])/2),n(t.x+=e.x,t.y+=e.y,t)),{x:0,y:0});return{x:e.x/t.length,y:e.y/t.length}},e.getDistanceBetweenPoints=function(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))},e.getAngleBetweenPoints=function(t,e){return Math.atan2(e.x-t.x,e.y-t.y)},e.pointInPolygon=function({x:t,y:e},i){let r,s,n=i.length,o=!1;for(r=0,s=n-1;re!=c>e&&t<(l-n)*(e-a)/(c-a)+n&&(o=!o)}return o},t})),i(e,"Extensions/OverlappingDataLabels.js",[e["Core/Geometry/GeometryUtilities.js"],e["Core/Utilities.js"]],(function(t,e){let{pointInPolygon:i}=t,{addEvent:r,fireEvent:s,objectEach:n,pick:o}=e;function a(t){let e,r,n,o,a,c=t.length,h=(t,e)=>!(e.x>=t.x+t.width||e.x+e.width<=t.x||e.y>=t.y+t.height||e.y+e.height<=t.y),u=(t,e)=>{for(let r of t)if(i({x:r[0],y:r[1]},e))return!0;return!1},d=!1;for(let i=0;i(e.labelrank||0)-(t.labelrank||0)));for(let e=0;e{n(t,(t=>{t.label&&e.push(t.label)}))}));for(let i of t.series||[])if(i.visible&&i.hasDataLabels?.()){let r=i=>{for(let r of i)r.visible&&(r.dataLabels||[]).forEach((i=>{let s=i.options||{};i.labelrank=o(s.labelrank,r.labelrank,r.shapeArgs?.height),s.allowOverlap??Number(s.distance)>0?(i.oldOpacity=i.opacity,i.newOpacity=1,l(i,t)):e.push(i)}))};r(i.nodes||[]),r(i.points)}this.hideOverlappingLabels(e)}return{compose:function(t){let e=t.prototype;e.hideOverlappingLabels||(e.hideOverlappingLabels=a,r(t,"render",c))}}})),i(e,"Extensions/BorderRadius.js",[e["Core/Defaults.js"],e["Core/Globals.js"],e["Core/Utilities.js"]],(function(t,e,i){let{defaultOptions:r}=t,{noop:s}=e,{addEvent:n,extend:o,isObject:a,merge:l,relativeLength:c}=i,h={radius:0,scope:"stack",where:void 0},u=s,d=s;function p(t,e,i,r,s={}){let n=u(t,e,i,r,s),{innerR:o=0,r:a=i,start:l=0,end:h=0}=s;if(s.open||!s.borderRadius)return n;let d=h-l,p=Math.sin(d/2),f=Math.max(Math.min(c(s.borderRadius||0,a-o),(a-o)/2,a*p/(1+p)),0),m=Math.min(f,d/Math.PI*2*o),g=n.length-1;for(;g--;)!function(t,e,i){let r,s,n,o=t[e],a=t[e+1];if("Z"===a[0]&&(a=t[0]),"M"!==o[0]&&"L"!==o[0]||"A"!==a[0]?"A"===o[0]&&("M"===a[0]||"L"===a[0])&&(r=a,s=o):(r=o,s=a,n=!0),r&&s&&s.params){let o=s[1],a=s[5],l=s.params,{start:c,end:h,cx:u,cy:d}=l,p=a?o-i:o+i,f=p?Math.asin(i/p):0,m=a?f:-f,g=Math.cos(f)*p;n?(l.start=c+m,r[1]=u+g*Math.cos(c),r[2]=d+g*Math.sin(c),t.splice(e+1,0,["A",i,i,0,0,1,u+o*Math.cos(l.start),d+o*Math.sin(l.start)])):(l.end=h-m,s[6]=u+o*Math.cos(l.end),s[7]=d+o*Math.sin(l.end),t.splice(e+1,0,["A",i,i,0,0,1,u+g*Math.cos(h),d+g*Math.sin(h)])),s[4]=Math.abs(l.end-l.start)1?m:f);return n}function f(){if(this.options.borderRadius&&(!this.chart.is3d||!this.chart.is3d())){let{options:t,yAxis:e}=this,i="percent"===t.stacking,s=r.plotOptions?.[this.type]?.borderRadius,n=m(t.borderRadius,a(s)?s:{}),l=e.options.reversed;for(let r of this.points){let{shapeArgs:s}=r;if("roundedRect"===r.shapeType&&s){let{width:a=0,height:h=0,y:u=0}=s,d=u,p=h;if("stack"===n.scope&&r.stackTotal){let s=e.translate(i?100:r.stackTotal,!1,!0,!1,!0),n=e.translate(t.threshold||0,!1,!0,!1,!0),o=this.crispCol(0,Math.min(s,n),0,Math.abs(s-n));d=o.y,p=o.height}let f=(r.negative?-1:1)*(l?-1:1)==-1,m=n.where;!m&&this.is("waterfall")&&Math.abs((r.yBottom||0)-(this.translatedThreshold||0))>this.borderWidth&&(m="all"),m||(m="end");let g=Math.min(c(n.radius,a),a/2,"all"===m?h/2:1/0)||0;"end"===m&&(f&&(d-=g),p+=g),o(s,{brBoxHeight:p,brBoxY:d,r:g})}}}}function m(t,e){return a(t)||(t={radius:t||0}),l(h,e,t)}function g(){let t=m(this.options.borderRadius);for(let e of this.points){let i=e.shapeArgs;i&&(i.borderRadius=c(t.radius,(i.r||0)-(i.innerR||0)))}}function y(t,e,i,r,s={}){let n=d(t,e,i,r,s),{r:o=0,brBoxHeight:a=r,brBoxY:l=e}=s,c=e-l,h=l+a-(e+r),u=c-o>-.1?0:o,p=h-o>-.1?0:o,f=Math.max(u&&c,0),m=Math.max(p&&h,0),g=[t+u,e],y=[t+i-u,e],_=[t+i,e+u],v=[t+i,e+r-p],x=[t+i-p,e+r],b=[t+p,e+r],w=[t,e+r-p],S=[t,e+u],C=(t,e)=>Math.sqrt(Math.pow(t,2)-Math.pow(e,2));if(f){let t=C(u,u-f);g[0]-=t,y[0]+=t,_[1]=S[1]=e+u-f}if(r=o(i.minWidth,0)&&this.chartHeight>=o(i.minHeight,0)}).call(this)&&e.push(t._id)}function l(t,e){let r,o=this.options.responsive,l=this.currentResponsive,c=[];!e&&o&&o.rules&&o.rules.forEach((t=>{void 0===t._id&&(t._id=a()),this.matchResponsiveRule(t,c)}),this);let h=n(...c.map((t=>s((o||{}).rules||[],(e=>e._id===t)))).map((t=>t&&t.chartOptions)));h.isResponsiveOptions=!0,c=c.toString()||void 0;let u=l&&l.ruleIds;c===u||(l&&(this.currentResponsive=void 0,this.updatingResponsive=!0,this.update(l.undoOptions,t,!0),this.updatingResponsive=!1),c?((r=i(h,this.options,!0,this.collectionsWithUpdate)).isResponsiveOptions=!0,this.currentResponsive={ruleIds:c,mergedOptions:h,undoOptions:r},this.updatingResponsive||this.update(h,t,!0)):this.currentResponsive=void 0)}t.compose=function(t){let i=t.prototype;return i.matchResponsiveRule||r(i,{matchResponsiveRule:e,setResponsive:l}),t}}(e||(e={})),e})),i(e,"masters/highcharts.src.js",[e["Core/Globals.js"],e["Core/Utilities.js"],e["Core/Defaults.js"],e["Core/Animation/Fx.js"],e["Core/Animation/AnimationUtilities.js"],e["Core/Renderer/HTML/AST.js"],e["Core/Templating.js"],e["Core/Renderer/RendererRegistry.js"],e["Core/Renderer/RendererUtilities.js"],e["Core/Renderer/SVG/SVGElement.js"],e["Core/Renderer/SVG/SVGRenderer.js"],e["Core/Renderer/HTML/HTMLElement.js"],e["Core/Axis/Axis.js"],e["Core/Axis/DateTimeAxis.js"],e["Core/Axis/LogarithmicAxis.js"],e["Core/Axis/PlotLineOrBand/PlotLineOrBand.js"],e["Core/Axis/Tick.js"],e["Core/Tooltip.js"],e["Core/Series/Point.js"],e["Core/Pointer.js"],e["Core/Legend/Legend.js"],e["Core/Legend/LegendSymbol.js"],e["Core/Chart/Chart.js"],e["Extensions/ScrollablePlotArea.js"],e["Core/Axis/Stacking/StackingAxis.js"],e["Core/Axis/Stacking/StackItem.js"],e["Core/Series/Series.js"],e["Core/Series/SeriesRegistry.js"],e["Series/Column/ColumnDataLabel.js"],e["Series/Pie/PieDataLabel.js"],e["Core/Series/DataLabel.js"],e["Extensions/OverlappingDataLabels.js"],e["Extensions/BorderRadius.js"],e["Core/Responsive.js"],e["Core/Color/Color.js"],e["Core/Time.js"]],(function(t,e,i,r,s,n,o,a,l,c,h,u,d,p,f,m,g,y,_,v,x,b,w,S,C,T,k,E,A,M,P,I,L,D,z,O){return t.AST=n,t.Axis=d,t.Chart=w,t.Color=z,t.DataLabel=P,t.Fx=r,t.HTMLElement=u,t.Legend=x,t.LegendSymbol=b,t.OverlappingDataLabels=t.OverlappingDataLabels||I,t.PlotLineOrBand=m,t.Point=_,t.Pointer=v,t.RendererRegistry=a,t.Series=k,t.SeriesRegistry=E,t.StackItem=T,t.SVGElement=c,t.SVGRenderer=h,t.Templating=o,t.Tick=g,t.Time=O,t.Tooltip=y,t.animate=s.animate,t.animObject=s.animObject,t.chart=w.chart,t.color=z.parse,t.dateFormat=o.dateFormat,t.defaultOptions=i.defaultOptions,t.distribute=l.distribute,t.format=o.format,t.getDeferredAnimation=s.getDeferredAnimation,t.getOptions=i.getOptions,t.numberFormat=o.numberFormat,t.seriesType=E.seriesType,t.setAnimation=s.setAnimation,t.setOptions=i.setOptions,t.stop=s.stop,t.time=i.defaultTime,t.timers=r.timers,L.compose(t.Series,t.SVGElement,t.SVGRenderer),A.compose(t.Series.types.column),P.compose(t.Series),p.compose(t.Axis),u.compose(t.SVGRenderer),x.compose(t.Chart),f.compose(t.Axis),I.compose(t.Chart),M.compose(t.Series.types.pie),m.compose(t.Axis),v.compose(t.Chart),D.compose(t.Chart),S.compose(t.Axis,t.Chart,t.Series),C.compose(t.Axis,t.Chart,t.Series),y.compose(t.Pointer),e.extend(t,e),t})),e["masters/highcharts.src.js"]._modules=e,e["masters/highcharts.src.js"]},t.exports?(n.default=n,t.exports=s&&s.document?n(s):n):void 0===(r=function(){return n(s)}.call(e,i,e,t))||(t.exports=r)},159:(t,e,i)=>{var r,s,n;n=function(t){"use strict";var e=t?t._modules:{};function i(e,i,r,s){e.hasOwnProperty(i)||(e[i]=s.apply(null,r),"function"==typeof CustomEvent&&t.win.dispatchEvent(new CustomEvent("HighchartsModuleLoaded",{detail:{path:i,module:e[i]}})))}i(e,"Core/Axis/Color/ColorAxisComposition.js",[e["Core/Color/Color.js"],e["Core/Utilities.js"]],(function(t,e){var i;let{parse:r}=t,{addEvent:s,extend:n,merge:o,pick:a,splat:l}=e;return function(t){let e;function i(){let{userOptions:t}=this;this.colorAxis=[],t.colorAxis&&(t.colorAxis=l(t.colorAxis),t.colorAxis.map((t=>new e(this,t))))}function c(t){let e,i,r=this.chart.colorAxis||[],s=e=>{let i=t.allItems.indexOf(e);-1!==i&&(this.destroyItem(t.allItems[i]),t.allItems.splice(i,1))},n=[];for(r.forEach((function(t){(e=t.options)&&e.showInLegend&&(e.dataClasses&&e.visible?n=n.concat(t.getDataClassLegendSymbols()):e.visible&&n.push(t),t.series.forEach((function(t){(!t.options.showInLegend||e.dataClasses)&&("point"===t.options.legendType?t.points.forEach((function(t){s(t)})):s(t))})))})),i=n.length;i--;)t.allItems.unshift(n[i])}function h(t){t.visible&&t.item.legendColor&&t.item.legendItem.symbol.attr({fill:t.item.legendColor})}function u(t){this.chart.colorAxis?.forEach((e=>{e.update({},t.redraw)}))}function d(){(this.chart.colorAxis&&this.chart.colorAxis.length||this.colorAttribs)&&this.translateColors()}function p(){let t=this.axisTypes;t?-1===t.indexOf("colorAxis")&&t.push("colorAxis"):this.axisTypes=["colorAxis"]}function f(t){let e=this,i=t?"show":"hide";e.visible=e.options.visible=!!t,["graphic","dataLabel"].forEach((function(t){e[t]&&e[t][i]()})),this.series.buildKDTree()}function m(){let t=this,e=this.getPointsCollection(),i=this.options.nullColor,r=this.colorAxis,s=this.colorKey;e.forEach((e=>{let n=e.getNestedProperty(s),o=e.options.color||(e.isNull||null===e.value?i:r&&void 0!==n?r.toColor(n,e):e.color||t.color);o&&e.color!==o&&(e.color=o,"point"===t.options.legendType&&e.legendItem&&e.legendItem.label&&t.chart.legend.colorizeItem(e,e.visible))}))}function g(){this.elem.attr("fill",r(this.start).tweenTo(r(this.end),this.pos),void 0,!0)}function y(){this.elem.attr("stroke",r(this.start).tweenTo(r(this.end),this.pos),void 0,!0)}t.compose=function(t,r,l,_,v){let x=r.prototype,b=l.prototype,w=v.prototype;x.collectionsWithUpdate.includes("colorAxis")||(e=t,x.collectionsWithUpdate.push("colorAxis"),x.collectionsWithInit.colorAxis=[x.addColorAxis],s(r,"afterGetAxes",i),function(t){let i=t.prototype.createAxis;t.prototype.createAxis=function(t,r){if("colorAxis"!==t)return i.apply(this,arguments);let s=new e(this,o(r.axis,{index:this[t].length,isX:!1}));return this.isDirtyLegend=!0,this.axes.forEach((t=>{t.series=[]})),this.series.forEach((t=>{t.bindAxes(),t.isDirtyData=!0})),a(r.redraw,!0)&&this.redraw(r.animation),s}}(r),b.fillSetter=g,b.strokeSetter=y,s(_,"afterGetAllItems",c),s(_,"afterColorizeItem",h),s(_,"afterUpdate",u),n(w,{optionalAxis:"colorAxis",translateColors:m}),n(w.pointClass.prototype,{setVisible:f}),s(v,"afterTranslate",d,{order:1}),s(v,"bindAxes",p))},t.pointSetVisible=f}(i||(i={})),i})),i(e,"Core/Axis/Color/ColorAxisDefaults.js",[],(function(){return{lineWidth:0,minPadding:0,maxPadding:0,gridLineColor:"#ffffff",gridLineWidth:1,tickPixelInterval:72,startOnTick:!0,endOnTick:!0,offset:0,marker:{animation:{duration:50},width:.01,color:"#999999"},labels:{distance:8,overflow:"justify",rotation:0},minColor:"#e6e9ff",maxColor:"#0022ff",tickLength:5,showInLegend:!0}})),i(e,"Core/Axis/Color/ColorAxisLike.js",[e["Core/Color/Color.js"],e["Core/Utilities.js"]],(function(t,e){var i,r;let{parse:s}=t,{merge:n}=e;return(r=i||(i={})).initDataClasses=function(t){let e,i,r,o=this.chart,a=this.legendItem=this.legendItem||{},l=this.options,c=t.dataClasses||[],h=o.options.chart.colorCount,u=0;this.dataClasses=i=[],a.labels=[];for(let t=0,a=c.length;t=r)&&(void 0===s||t<=s)){n=o.color,e&&(e.dataClass=a,e.colorIndex=o.colorIndex);break}}else{for(i=this.normalizedValue(t),a=c.length;a--&&!(i>c[a][0]););r=c[a]||c[a+1],i=1-((s=c[a+1]||r)[0]-i)/(s[0]-r[0]||1),n=r.color.tweenTo(s.color,i)}return n},i})),i(e,"Core/Axis/Color/ColorAxis.js",[e["Core/Axis/Axis.js"],e["Core/Axis/Color/ColorAxisComposition.js"],e["Core/Axis/Color/ColorAxisDefaults.js"],e["Core/Axis/Color/ColorAxisLike.js"],e["Core/Defaults.js"],e["Core/Legend/LegendSymbol.js"],e["Core/Series/SeriesRegistry.js"],e["Core/Utilities.js"]],(function(t,e,i,r,s,n,o,a){let{defaultOptions:l}=s,{series:c}=o,{defined:h,extend:u,fireEvent:d,isArray:p,isNumber:f,merge:m,pick:g,relativeLength:y}=a;l.colorAxis=m(l.xAxis,i);class _ extends t{static compose(t,i,r,s){e.compose(_,t,i,r,s)}constructor(t,e){super(t,e),this.coll="colorAxis",this.visible=!0,this.init(t,e)}init(t,e){let i=t.options.legend||{},r=e.layout?"vertical"!==e.layout:"vertical"!==i.layout;this.side=e.side||r?2:1,this.reversed=e.reversed||!r,this.opposite=!r,super.init(t,e,"colorAxis"),this.userOptions=e,p(t.userOptions.colorAxis)&&(t.userOptions.colorAxis[this.index]=e),e.dataClasses&&this.initDataClasses(e),this.initStops(),this.horiz=r,this.zoomEnabled=!1}hasData(){return!!(this.tickPositions||[]).length}setTickPositions(){if(!this.dataClasses)return super.setTickPositions()}setOptions(t){let e=m(l.colorAxis,t,{showEmpty:!1,title:null,visible:this.chart.options.legend.enabled&&!1!==t.visible});super.setOptions(e),this.options.crosshair=this.options.marker}setAxisSize(){let t=this.chart,e=this.legendItem?.symbol,{width:i,height:r}=this.getSize();e&&(this.left=+e.attr("x"),this.top=+e.attr("y"),this.width=i=+e.attr("width"),this.height=r=+e.attr("height"),this.right=t.chartWidth-this.left-i,this.bottom=t.chartHeight-this.top-r,this.pos=this.horiz?this.left:this.top),this.len=(this.horiz?i:r)||_.defaultLegendLength}getOffset(){let t=this.legendItem?.group,e=this.chart.axisOffset[this.side];if(t){this.axisParent=t,super.getOffset();let i=this.chart.legend;i.allItems.forEach((function(t){t instanceof _&&t.drawLegendSymbol(i,t)})),i.render(),this.chart.getMargins(!0),this.chart.series.some((t=>t.isDrilling))||(this.isDirty=!0),this.added||(this.added=!0,this.labelLeft=0,this.labelRight=this.width),this.chart.axisOffset[this.side]=e}}setLegendColor(){let t=this.horiz,e=this.reversed,i=e?1:0,r=e?0:1,s=t?[i,0,r,0]:[0,r,0,i];this.legendColor={linearGradient:{x1:s[0],y1:s[1],x2:s[2],y2:s[3]},stops:this.stops}}drawLegendSymbol(t,e){let i=e.legendItem||{},r=t.padding,s=t.options,n=this.options.labels,o=g(s.itemDistance,10),a=this.horiz,{width:l,height:c}=this.getSize(),h=g(s.labelPadding,a?16:30);this.setLegendColor(),i.symbol||(i.symbol=this.chart.renderer.symbol("roundedRect").attr({r:s.symbolRadius??3,zIndex:1}).add(i.group)),i.symbol.attr({x:0,y:(t.baseline||0)-11,width:l,height:c}),i.labelWidth=l+r+(a?o:g(n.x,n.distance)+(this.maxLabelLength||0)),i.labelHeight=c+r+(a?h:0)}setState(t){this.series.forEach((function(e){e.setState(t)}))}setVisible(){}getSeriesExtremes(){let t,e,i,r,s,n,o,a,l=this.series,u=l.length;for(this.dataMin=1/0,this.dataMax=-1/0;u--;){if(e=(n=l[u]).colorKey=g(n.options.colorKey,n.colorKey,n.pointValKey,n.zoneAxis,"y"),r=n.pointArrayMap,s=n[e+"Min"]&&n[e+"Max"],n[e+"Data"])t=n[e+"Data"];else if(r){if(t=[],i=r.indexOf(e),o=n.yData,i>=0&&o)for(a=0;ao+a&&(i=o+a+2),e.plotX=i,e.plotY=this.len-i,super.drawCrosshair(t,e),e.plotX=s,e.plotY=n,this.cross&&!this.cross.addedToColorAxis&&r.group&&(this.cross.addClass("highcharts-coloraxis-marker").add(r.group),this.cross.addedToColorAxis=!0,this.chart.styledMode||"object"!=typeof this.crosshair||this.cross.attr({fill:this.crosshair.color})))}getPlotLinePath(t){let e=this.left,i=t.translatedValue,r=this.top;return f(i)?this.horiz?[["M",i-4,r-6],["L",i+4,r-6],["L",i,r],["Z"]]:[["M",e,i],["L",e-6,i+6],["L",e-6,i-6],["Z"]]:super.getPlotLinePath(t)}update(t,e){let i=this.chart.legend;this.series.forEach((t=>{t.isDirtyData=!0})),(t.dataClasses&&i.allItems||this.dataClasses)&&this.destroyItems(),super.update(t,e),this.legendItem&&this.legendItem.label&&(this.setLegendColor(),i.colorizeItem(this,!0))}destroyItems(){let t=this.chart,e=this.legendItem||{};if(e.label)t.legend.destroyItem(this);else if(e.labels)for(let i of e.labels)t.legend.destroyItem(i);t.isDirtyLegend=!0}destroy(){this.chart.isDirtyLegend=!0,this.destroyItems(),super.destroy(...[].slice.call(arguments))}remove(t){this.destroyItems(),super.remove(t)}getDataClassLegendSymbols(){let t,e=this,i=e.chart,r=e.legendItem&&e.legendItem.labels||[],s=i.options.legend,o=g(s.valueDecimals,-1),a=g(s.valueSuffix,""),l=t=>e.series.reduce(((e,i)=>(e.push(...i.points.filter((e=>e.dataClass===t))),e)),[]);return r.length||e.dataClasses.forEach(((s,c)=>{let h=s.from,p=s.to,{numberFormatter:f}=i,m=!0;t="",void 0===h?t="< ":void 0===p&&(t="> "),void 0!==h&&(t+=f(h,o)+a),void 0!==h&&void 0!==p&&(t+=" - "),void 0!==p&&(t+=f(p,o)+a),r.push(u({chart:i,name:t,options:{},drawLegendSymbol:n.rectangle,visible:!0,isDataClass:!0,setState:t=>{for(let e of l(c))e.setState(t)},setVisible:function(){this.visible=m=e.visible=!m;let t=[];for(let e of l(c))e.setVisible(m),e.hiddenInDataClass=!m,-1===t.indexOf(e.series)&&t.push(e.series);i.legend.colorizeItem(this,m),t.forEach((t=>{d(t,"afterDataClassLegendClick")}))}},s))})),r}getSize(){let{chart:t,horiz:e}=this,{height:i,width:r}=this.options,{legend:s}=t.options;return{width:g(h(r)?y(r,t.chartWidth):void 0,s?.symbolWidth,e?_.defaultLegendLength:12),height:g(h(i)?y(i,t.chartHeight):void 0,s?.symbolHeight,e?12:_.defaultLegendLength)}}}return _.defaultLegendLength=200,_.keepProps=["legendItem"],u(_.prototype,r),Array.prototype.push.apply(t.keepProps,_.keepProps),_})),i(e,"masters/modules/coloraxis.src.js",[e["Core/Globals.js"],e["Core/Axis/Color/ColorAxis.js"]],(function(t,e){return t.ColorAxis=t.ColorAxis||e,t.ColorAxis.compose(t.Chart,t.Fx,t.Legend,t.Series),t})),i(e,"Maps/MapNavigationDefaults.js",[],(function(){return{lang:{zoomIn:"Zoom in",zoomOut:"Zoom out"},mapNavigation:{buttonOptions:{alignTo:"plotBox",align:"left",verticalAlign:"top",x:0,width:18,height:18,padding:5,style:{color:"#666666",fontSize:"1em",fontWeight:"bold"},theme:{fill:"#ffffff",stroke:"#e6e6e6","stroke-width":1,"text-align":"center"}},buttons:{zoomIn:{onclick:function(){this.mapZoom(.5)},text:"+",y:0},zoomOut:{onclick:function(){this.mapZoom(2)},text:"-",y:28}},mouseWheelSensitivity:1.1}}})),i(e,"Maps/MapPointer.js",[e["Core/Utilities.js"]],(function(t){var e;let{defined:i,extend:r,pick:s,wrap:n}=t;return function(t){let e,o=0;function a(t){let e=this.chart;t=this.normalize(t),e.options.mapNavigation.enableDoubleClickZoomTo?e.pointer.inClass(t.target,"highcharts-tracker")&&e.hoverPoint&&e.hoverPoint.zoomTo():e.isInsidePlot(t.chartX-e.plotLeft,t.chartY-e.plotTop)&&e.mapZoom(.5,void 0,void 0,t.chartX,t.chartY)}function l(t){let r=this.chart,s=i((t=this.normalize(t)).wheelDelta)&&-t.wheelDelta/120||t.deltaY||t.detail;Math.abs(s)>=1&&(o+=Math.abs(s),e&&clearTimeout(e),e=setTimeout((()=>{o=0}),50)),o<10&&r.isInsidePlot(t.chartX-r.plotLeft,t.chartY-r.plotTop)&&r.mapView&&r.mapView.zoomBy(-(r.options.mapNavigation.mouseWheelSensitivity-1)*s,void 0,[t.chartX,t.chartY],!(1>Math.abs(s))&&void 0)}function c(t,e,i){let s=this.chart;if(e=t.call(this,e,i),s&&s.mapView){let t=s.mapView.pixelsToLonLat({x:e.chartX-s.plotLeft,y:e.chartY-s.plotTop});t&&r(e,t)}return e}function h(t){let e=this.chart.options.mapNavigation;e&&s(e.enableTouchZoom,e.enabled)&&(this.chart.zooming.pinchType="xy"),t.apply(this,[].slice.call(arguments,1))}t.compose=function(t){let e=t.prototype;e.onContainerDblClick||(r(e,{onContainerDblClick:a,onContainerMouseWheel:l}),n(e,"normalize",c),n(e,"zoomOption",h))}}(e||(e={})),e})),i(e,"Maps/MapSymbols.js",[],(function(){let t;function e(e,i,r,s,n){if(n){let t=n?.r||0;n.brBoxY=i-t,n.brBoxHeight=s+t}return t.roundedRect(e,i,r,s,n)}function i(e,i,r,s,n){if(n){let t=n?.r||0;n.brBoxHeight=s+t}return t.roundedRect(e,i,r,s,n)}return{compose:function(r){(t=r.prototype.symbols).bottombutton=e,t.topbutton=i}}})),i(e,"Maps/MapNavigation.js",[e["Core/Defaults.js"],e["Core/Globals.js"],e["Maps/MapNavigationDefaults.js"],e["Maps/MapPointer.js"],e["Maps/MapSymbols.js"],e["Core/Utilities.js"]],(function(t,e,i,r,s,n){let{setOptions:o}=t,{composed:a}=e,{addEvent:l,extend:c,merge:h,objectEach:u,pick:d,pushUnique:p}=n;function f(t){t&&(t.preventDefault&&t.preventDefault(),t.stopPropagation&&t.stopPropagation(),t.cancelBubble=!0)}class m{static compose(t,e,n){r.compose(e),s.compose(n),p(a,"Map.Navigation")&&(l(t,"beforeRender",(function(){this.mapNavigation=new m(this),this.mapNavigation.update()})),o(i))}constructor(t){this.chart=t,this.navButtons=[]}update(t){let e=this,i=e.chart,r=e.navButtons,s=function(t){this.handler.call(i,t),f(t)},n=i.options.mapNavigation;for(t&&(n=i.options.mapNavigation=h(i.options.mapNavigation,t));r.length;)r.pop().destroy();if(!i.renderer.forExport&&d(n.enableButtons,n.enabled)){e.navButtonsGroup||(e.navButtonsGroup=i.renderer.g().attr({zIndex:7}).add()),u(n.buttons,((t,o)=>{let a={padding:(t=h(n.buttonOptions,t)).padding};!i.styledMode&&t.theme&&(c(a,t.theme),a.style=h(t.theme.style,t.style));let{text:u,width:d=0,height:p=0,padding:m=0}=t,g=i.renderer.button("+"!==u&&"-"!==u&&u||"",0,0,s,a,void 0,void 0,void 0,"zoomIn"===o?"topbutton":"bottombutton").addClass("highcharts-map-navigation highcharts-"+{zoomIn:"zoom-in",zoomOut:"zoom-out"}[o]).attr({width:d,height:p,title:i.options.lang[o],zIndex:5}).add(e.navButtonsGroup);if("+"===u||"-"===u){let e=d+1,r=[["M",m+3,m+p/2],["L",m+e-3,m+p/2]];"+"===u&&r.push(["M",m+e/2,m+3],["L",m+e/2,m+p-3]),i.renderer.path(r).addClass("highcharts-button-symbol").attr(i.styledMode?{}:{stroke:t.style?.color,"stroke-width":3,"stroke-linecap":"round"}).add(g)}if(g.handler=t.onclick,l(g.element,"dblclick",f),r.push(g),c(t,{width:g.width,height:2*(g.height||0)}),i.hasLoaded)g.align(t,!1,t.alignTo);else{let e=l(i,"load",(()=>{g.element&&g.align(t,!1,t.alignTo),e()}))}}));let t=(t,e)=>!(e.x>=t.x+t.width||e.x+e.width<=t.x||e.y>=t.y+t.height||e.y+e.height<=t.y);i.hasLoaded||l(i,"render",(function(){let r=i.exportingGroup&&i.exportingGroup.getBBox();if(r){let i=e.navButtonsGroup.getBBox();if(t(r,i)){let t=-i.y-i.height+r.y-5,s=r.y+r.height-i.y+5,o=n.buttonOptions&&n.buttonOptions.verticalAlign;e.navButtonsGroup.attr({translateY:"bottom"===o?t:s})}}}))}this.updateEvents(n)}updateEvents(t){let e=this.chart;d(t.enableDoubleClickZoom,t.enabled)||t.enableDoubleClickZoomTo?this.unbindDblClick=this.unbindDblClick||l(e.container,"dblclick",(function(t){e.pointer.onContainerDblClick(t)})):this.unbindDblClick&&(this.unbindDblClick=this.unbindDblClick()),d(t.enableMouseWheelZoom,t.enabled)?this.unbindMouseWheel=this.unbindMouseWheel||l(e.container,"wheel",(function(t){return e.pointer.inClass(t.target,"highcharts-no-mousewheel")||(e.pointer.onContainerMouseWheel(t),f(t)),!1})):this.unbindMouseWheel&&(this.unbindMouseWheel=this.unbindMouseWheel())}}return m})),i(e,"Series/ColorMapComposition.js",[e["Core/Series/SeriesRegistry.js"],e["Core/Renderer/SVG/SVGElement.js"],e["Core/Utilities.js"]],(function(t,e,i){var r;let{column:{prototype:s}}=t.seriesTypes,{addEvent:n,defined:o}=i;return function(t){function i(t){let i=this.series,r=i.chart.renderer;this.moveToTopOnHover&&this.graphic&&(i.stateMarkerGraphic||(i.stateMarkerGraphic=new e(r,"use").css({pointerEvents:"none"}).add(this.graphic.parentGroup)),"hover"===t?.state?(this.graphic.attr({id:this.id}),i.stateMarkerGraphic.attr({href:`${r.url}#${this.id}`,visibility:"visible"})):i.stateMarkerGraphic.attr({href:""}))}t.pointMembers={dataLabelOnNull:!0,moveToTopOnHover:!0,isValid:function(){return null!==this.value&&this.value!==1/0&&this.value!==-1/0&&(void 0===this.value||!isNaN(this.value))}},t.seriesMembers={colorKey:"value",axisTypes:["xAxis","yAxis","colorAxis"],parallelArrays:["x","y","value"],pointArrayMap:["value"],trackerGroups:["group","markerGroup","dataLabelsGroup"],colorAttribs:function(t){let e={};return o(t.color)&&(!t.state||"normal"===t.state)&&(e[this.colorProp||"fill"]=t.color),e},pointAttribs:s.pointAttribs},t.compose=function(t){return n(t.prototype.pointClass,"afterSetState",i),t}}(r||(r={})),r})),i(e,"Core/Chart/MapChart.js",[e["Core/Chart/Chart.js"],e["Core/Defaults.js"],e["Core/Renderer/SVG/SVGRenderer.js"],e["Core/Utilities.js"]],(function(t,e,i,r){var s;let{getOptions:n}=e,{isNumber:o,merge:a,pick:l}=r;class c extends t{init(t,e){let i=n().credits,r=a({chart:{panning:{enabled:!0,type:"xy"},type:"map"},credits:{mapText:l(i.mapText,' © {geojson.copyrightShort}'),mapTextFull:l(i.mapTextFull,"{geojson.copyright}")},mapView:{},tooltip:{followTouchMove:!1}},t);super.init(r,e)}mapZoom(t,e,i,r,s){this.mapView&&(o(t)&&(t=Math.log(t)/Math.log(.5)),this.mapView.zoomBy(t,o(e)&&o(i)?this.mapView.projection.inverse([e,i]):void 0,o(r)&&o(s)?[r,s]:void 0))}update(t){t.chart&&"map"in t.chart&&this.mapView?.recommendMapView(this,[t.chart.map,...(this.options.series||[]).map((t=>t.mapData))],!0),super.update.apply(this,arguments)}}return(s=c||(c={})).maps={},s.mapChart=function(t,e,i){return new s(t,e,i)},s.splitPath=function(t){let e;return e="string"==typeof t?(t=t.replace(/([A-Z])/gi," $1 ").replace(/^\s*/,"").replace(/\s*$/,"")).split(/[ ,;]+/).map((t=>/[A-Z]/i.test(t)?t:parseFloat(t))):t,i.prototype.pathToSegments(e)},c})),i(e,"Maps/MapUtilities.js",[],(function(){return{boundsFromPath:function(t){let e,i=-Number.MAX_VALUE,r=Number.MAX_VALUE,s=-Number.MAX_VALUE,n=Number.MAX_VALUE;if(t.forEach((t=>{let o=t[t.length-2],a=t[t.length-1];"number"==typeof o&&"number"==typeof a&&(r=Math.min(r,o),i=Math.max(i,o),n=Math.min(n,a),s=Math.max(s,a),e=!0)})),e)return{x1:r,y1:n,x2:i,y2:s}}}})),i(e,"Series/Map/MapPoint.js",[e["Series/ColorMapComposition.js"],e["Maps/MapUtilities.js"],e["Core/Series/SeriesRegistry.js"],e["Core/Utilities.js"]],(function(t,e,i,r){let{boundsFromPath:s}=e,n=i.seriesTypes.scatter.prototype.pointClass,{extend:o,isNumber:a,pick:l}=r;class c extends n{static getProjectedPath(t,e){return t.projectedPath||(e&&t.geometry?(e.hasCoordinates=!0,t.projectedPath=e.path(t.geometry)):t.projectedPath=t.path),t.projectedPath||[]}applyOptions(t,e){let i=this.series,r=super.applyOptions(t,e),s=i.joinBy;if(i.mapData&&i.mapMap){let t=s[1],e=super.getNestedProperty(t),n=void 0!==e&&i.mapMap[e];n?o(r,{...n,name:r.name??n.name}):-1!==i.pointArrayMap.indexOf("value")&&(r.value=r.value||null)}return r}getProjectedBounds(t){let e=s(c.getProjectedPath(this,t)),i=this.properties,r=this.series.chart.mapView;if(e){let s=i&&i["hc-middle-lon"],n=i&&i["hc-middle-lat"];if(r&&a(s)&&a(n)){let i=t.forward([s,n]);e.midX=i[0],e.midY=i[1]}else{let t=i&&i["hc-middle-x"],r=i&&i["hc-middle-y"];e.midX=e.x1+(e.x2-e.x1)*l(this.middleX,a(t)?t:.5);let s=l(this.middleY,a(r)?r:.5);this.geometry||(s=1-s),e.midY=e.y2-(e.y2-e.y1)*s}return e}}onMouseOver(t){r.clearTimeout(this.colorInterval),!this.isNull&&this.visible||this.series.options.nullInteraction?super.onMouseOver.call(this,t):this.series.onMouseOut()}setVisible(t){this.visible=this.options.visible=!!t,this.dataLabel&&this.dataLabel[t?"show":"hide"](),this.graphic&&this.graphic.attr(this.series.pointAttribs(this))}zoomTo(t){let e=this.series.chart,i=e.mapView,r=this.bounds;if(i&&r){let s=a(this.insetIndex)&&i.insets[this.insetIndex];if(s){let t=s.projectedUnitsToPixels({x:r.x1,y:r.y1}),e=s.projectedUnitsToPixels({x:r.x2,y:r.y2}),n=i.pixelsToProjectedUnits({x:t.x,y:t.y}),o=i.pixelsToProjectedUnits({x:e.x,y:e.y});r={x1:n.x,y1:n.y,x2:o.x,y2:o.y}}i.fitToBounds(r,void 0,!1),this.series.isDirty=!0,e.redraw(t)}}}return o(c.prototype,{dataLabelOnNull:t.pointMembers.dataLabelOnNull,moveToTopOnHover:t.pointMembers.moveToTopOnHover,isValid:t.pointMembers.isValid}),c})),i(e,"Series/Map/MapSeriesDefaults.js",[e["Core/Utilities.js"]],(function(t){let{isNumber:e}=t;return{affectsMapView:!0,animation:!1,dataLabels:{crop:!1,formatter:function(){let{numberFormatter:t}=this.series.chart,{value:i}=this.point;return e(i)?t(i,-1):this.point.name},inside:!0,overflow:!1,padding:0,verticalAlign:"middle"},linecap:"round",marker:null,nullColor:"#f7f7f7",stickyTracking:!1,tooltip:{followPointer:!0,pointFormat:"{point.name}: {point.value}
    "},turboThreshold:0,allAreas:!0,borderColor:"#e6e6e6",borderWidth:1,joinBy:"hc-key",states:{hover:{halo:void 0,borderColor:"#666666",borderWidth:2},normal:{animation:!0},select:{color:"#cccccc"}},legendSymbol:"rectangle"}})),i(e,"Maps/MapViewDefaults.js",[],(function(){return{center:[0,0],fitToGeometry:void 0,maxZoom:void 0,padding:0,projection:{name:void 0,parallels:void 0,rotation:void 0},zoom:void 0,insetOptions:{borderColor:"#cccccc",borderWidth:1,padding:"10%",relativeTo:"mapBoundingBox",units:"percent"}}})),i(e,"Maps/GeoJSONComposition.js",[e["Core/Globals.js"],e["Core/Templating.js"],e["Core/Utilities.js"]],(function(t,e,i){var r;let{win:s}=t,{format:n}=e,{error:o,extend:a,merge:l,wrap:c}=i;return function(t){function e(t){return this.mapView&&this.mapView.lonLatToProjectedUnits(t)}function i(t){return this.mapView&&this.mapView.projectedUnitsToLonLat(t)}function r(t,e){let i=this.options.chart.proj4||s.proj4;if(!i)return void o(21,!1,this);let{jsonmarginX:r=0,jsonmarginY:n=0,jsonres:a=1,scale:l=1,xoffset:c=0,xpan:h=0,yoffset:u=0,ypan:d=0}=e,p=i(e.crs,[t.lon,t.lat]),f=e.cosAngle||e.rotation&&Math.cos(e.rotation),m=e.sinAngle||e.rotation&&Math.sin(e.rotation),g=e.rotation?[p[0]*f+p[1]*m,-p[0]*m+p[1]*f]:p;return{x:((g[0]-c)*l+h)*a+r,y:-(((u-g[1])*l+d)*a-n)}}function h(t,e){let i=this.options.chart.proj4||s.proj4;if(!i)return void o(21,!1,this);if(null===t.y)return;let{jsonmarginX:r=0,jsonmarginY:n=0,jsonres:a=1,scale:l=1,xoffset:c=0,xpan:h=0,yoffset:u=0,ypan:d=0}=e,p={x:((t.x-r)/a-h)/l+c,y:((t.y-n)/a+d)/l+u},f=e.cosAngle||e.rotation&&Math.cos(e.rotation),m=e.sinAngle||e.rotation&&Math.sin(e.rotation),g=i(e.crs,"WGS84",e.rotation?{x:p.x*f+-p.y*m,y:p.x*m+p.y*f}:p);return{lat:g.y,lon:g.x}}function u(t,e){e||(e=Object.keys(t.objects)[0]);let i=t.objects[e];if(i["hc-decoded-geojson"]&&i["hc-decoded-geojson"].title===t.title)return i["hc-decoded-geojson"];let r=t.arcs;if(t.transform){let e,i,s,n=t.arcs,{scale:o,translate:a}=t.transform;r=[];for(let t=0,l=n.length;t"number"==typeof t[0]?t.reduce(((t,e,i)=>{let s=e<0?r[~e]:r[e];return e<0?(s=s.slice(0,0===i?s.length:s.length-1)).reverse():i&&(s=s.slice(1)),t.concat(s)}),[]):t.map(s),n=i.geometries,o=[];for(let t=0,e=n.length;t(e[1]-t[1])*(i[0]-t[0])}function i(t,e,i,r){let s=[t[0]-e[0],t[1]-e[1]],n=[i[0]-r[0],i[1]-r[1]],o=t[0]*e[1]-t[1]*e[0],a=i[0]*r[1]-i[1]*r[0],l=1/(s[0]*n[1]-s[1]*n[0]),c=[(o*n[0]-a*s[0])*l,(o*n[1]-a*s[1])*l];return c.isIntersection=!0,c}return{clipLineString:function(e,i){let r=[],s=t(e,i,!1);for(let t=1;t0===t?0:t>0?1:-1),e=Math.PI/180,i=Math.PI/2,r=t=>Math.tan((i+t)/2);return class{constructor(i){let s=(i.parallels||[]).map((t=>t*e)),n=s[0]||0,o=s[1]??n,a=Math.cos(n);"object"==typeof i.projectedBounds&&(this.projectedBounds=i.projectedBounds);let l=n===o?Math.sin(n):Math.log(a/Math.cos(o))/Math.log(r(o)/r(n));1e-10>Math.abs(l)&&(l=1e-10*(t(l)||1)),this.n=l,this.c=a*Math.pow(r(n),l)/l}forward(t){let{c:s,n,projectedBounds:o}=this,a=t[0]*e,l=t[1]*e;s>0?l<1e-6-i&&(l=1e-6-i):l>i-1e-6&&(l=i-1e-6);let c=s/Math.pow(r(l),n),h=c*Math.sin(n*a)*63.78137,u=63.78137*(s-c*Math.cos(n*a)),d=[h,u];return o&&(ho.x2||uo.y2)&&(d.outside=!0),d}inverse(r){let{c:s,n}=this,o=r[0]/63.78137,a=s-r[1]/63.78137,l=t(n)*Math.sqrt(o*o+a*a),c=Math.atan2(o,Math.abs(a))*t(a);return a*n<0&&(c-=Math.PI*t(o)*t(a)),[c/n/e,(2*Math.atan(Math.pow(s/l,1/n))-i)/e]}}})),i(e,"Maps/Projections/EqualEarth.js",[],(function(){let t=Math.sqrt(3)/2;return class{constructor(){this.bounds={x1:-200.37508342789243,x2:200.37508342789243,y1:-97.52595454902263,y2:97.52595454902263}}forward(e){let i=Math.PI/180,r=Math.asin(t*Math.sin(e[1]*i)),s=r*r,n=s*s*s;return[e[0]*i*Math.cos(r)*74.03120656864502/(t*(1.340264+-.24331799999999998*s+n*(.0062510000000000005+.034164*s))),74.03120656864502*r*(1.340264+-.081106*s+n*(893e-6+.003796*s))]}inverse(e){let i,r,s,n,o=e[0]/74.03120656864502,a=e[1]/74.03120656864502,l=180/Math.PI,c=a;for(let t=0;t<12&&(r=(i=c*c)*i*i,s=c*(1.340264+-.081106*i+r*(893e-6+.003796*i))-a,c-=n=s/(1.340264+-.24331799999999998*i+r*(.0062510000000000005+.034164*i)),!(1e-9>Math.abs(n)));++t);r=(i=c*c)*i*i;let h=l*t*o*(1.340264+-.24331799999999998*i+r*(.0062510000000000005+.034164*i))/Math.cos(c),u=l*Math.asin(Math.sin(c)/t);return Math.abs(h)>180?[NaN,NaN]:[h,u]}}})),i(e,"Maps/Projections/Miller.js",[],(function(){let t=Math.PI/4,e=Math.PI/180;return class{constructor(){this.bounds={x1:-200.37508342789243,x2:200.37508342789243,y1:-146.91480769173063,y2:146.91480769173063}}forward(i){return[i[0]*e*63.78137,79.7267125*Math.log(Math.tan(t+.4*i[1]*e))]}inverse(i){return[i[0]/63.78137/e,2.5*(Math.atan(Math.exp(i[1]/63.78137*.8))-t)/e]}}})),i(e,"Maps/Projections/Orthographic.js",[],(function(){let t=Math.PI/180;return class{constructor(){this.antimeridianCutting=!1,this.bounds={x1:-63.78460826781007,x2:63.78460826781007,y1:-63.78460826781007,y2:63.78460826781007}}forward(e){let i=e[0],r=e[1]*t,s=[Math.cos(r)*Math.sin(i*t)*63.78460826781007,63.78460826781007*Math.sin(r)];return(i<-90||i>90)&&(s.outside=!0),s}inverse(e){let i=e[0]/63.78460826781007,r=e[1]/63.78460826781007,s=Math.sqrt(i*i+r*r),n=Math.asin(s),o=Math.sin(n);return[Math.atan2(i*o,s*Math.cos(n))/t,Math.asin(s&&r*o/s)/t]}}})),i(e,"Maps/Projections/WebMercator.js",[],(function(){let t=Math.PI/180;return class{constructor(){this.bounds={x1:-200.37508342789243,x2:200.37508342789243,y1:-200.3750834278071,y2:200.3750834278071},this.maxLatitude=85.0511287798}forward(e){let i=Math.sin(e[1]*t),r=[63.78137*e[0]*t,63.78137*Math.log((1+i)/(1-i))/2];return Math.abs(e[1])>this.maxLatitude&&(r.outside=!0),r}inverse(e){return[e[0]/(63.78137*t),(2*Math.atan(Math.exp(e[1]/63.78137))-Math.PI/2)/t]}}})),i(e,"Maps/Projections/ProjectionRegistry.js",[e["Maps/Projections/LambertConformalConic.js"],e["Maps/Projections/EqualEarth.js"],e["Maps/Projections/Miller.js"],e["Maps/Projections/Orthographic.js"],e["Maps/Projections/WebMercator.js"]],(function(t,e,i,r,s){return{EqualEarth:e,LambertConformalConic:t,Miller:i,Orthographic:r,WebMercator:s}})),i(e,"Maps/Projection.js",[e["Core/Geometry/PolygonClip.js"],e["Maps/Projections/ProjectionRegistry.js"],e["Core/Utilities.js"]],(function(t,e,i){let{clipLineString:r,clipPolygon:s}=t,{clamp:n,erase:o}=i,a=2*Math.PI/360,l=t=>(t<-180&&(t+=360),t>180&&(t-=360),t),c=t=>(1-Math.cos(t))/2;class h{static add(t,e){h.registry[t]=e}static distance(t,e){let{atan2:i,sqrt:r}=Math,s=((t,e)=>{let i=Math.cos,r=t[1]*a,s=t[0]*a,n=e[1]*a,o=e[0]*a;return c(n-r)+i(r)*i(n)*c(o-s)})(t,e);return 2*i(r(s),r(1-s))*6371e3}static geodesic(t,e,i,r=5e5){let{atan2:s,cos:n,sin:o,sqrt:l}=Math,c=h.distance,u=t[1]*a,d=t[0]*a,p=e[1]*a,f=e[0]*a,m=n(u)*n(d),g=n(p)*n(f),y=n(u)*o(d),_=n(p)*o(f),v=o(u),x=o(p),b=c(t,e),w=b/6371e3,S=o(w),C=Math.round(b/r),T=[];if(i&&T.push(t),C>1){let t=1/C;for(let e=t;e<.999;e+=t){let t=o((1-e)*w)/S,i=o(e*w)/S,r=t*m+i*g,n=t*y+i*_,c=s(t*v+i*x,l(r*r+n*n)),h=s(n,r);T.push([h/a,c/a])}}return i&&T.push(e),T}static insertGeodesics(t){let e=t.length-1;for(;e--;)if(Math.max(Math.abs(t[e][0]-t[e+1][0]),Math.abs(t[e][1]-t[e+1][1]))>10){let i=h.geodesic(t[e],t[e+1]);i.length&&t.splice(e+1,0,...i)}}static toString(t){let{name:e,rotation:i}=t||{};return[e,i&&i.join(",")].join(";")}constructor(t={}){this.hasCoordinates=!1,this.hasGeoProjection=!1,this.maxLatitude=90,this.options=t;let{name:e,projectedBounds:i,rotation:r}=t;this.rotator=r?this.getRotator(r):void 0;let s=e?h.registry[e]:void 0;s&&(this.def=new s(t));let{def:n,rotator:o}=this;n&&(this.maxLatitude=n.maxLatitude||90,this.hasGeoProjection=!0),o&&n?(this.forward=t=>n.forward(o.forward(t)),this.inverse=t=>o.inverse(n.inverse(t))):n?(this.forward=t=>n.forward(t),this.inverse=t=>n.inverse(t)):o&&(this.forward=o.forward,this.inverse=o.inverse),this.bounds="world"===i?n&&n.bounds:i}lineIntersectsBounds(t){let e,{x1:i,x2:r,y1:s,y2:n}=this.bounds||{},o=(t,e,i)=>{let[r,s]=t,n=e?0:1;if("number"==typeof i&&r[e]>=i!=s[e]>=i){let t=(i-r[e])/(s[e]-r[e]),o=r[n]+t*(s[n]-r[n]);return e?[o,i]:[i,o]}},a=t[0];return((e=o(t,0,i))||(e=o(t,0,r)))&&(a=e,t[1]=e),((e=o(t,1,s))||(e=o(t,1,n)))&&(a=e),a}getRotator(t){let e=t[0]*a,i=(t[1]||0)*a,r=(t[2]||0)*a,s=Math.cos(i),n=Math.sin(i),o=Math.cos(r),l=Math.sin(r);if(0!==e||0!==i||0!==r)return{forward:t=>{let i=t[0]*a+e,r=t[1]*a,c=Math.cos(r),h=Math.cos(i)*c,u=Math.sin(i)*c,d=Math.sin(r),p=d*s+h*n;return[Math.atan2(u*o-p*l,h*s-d*n)/a,Math.asin(p*o+u*l)/a]},inverse:t=>{let i=t[0]*a,r=t[1]*a,c=Math.cos(r),h=Math.cos(i)*c,u=Math.sin(i)*c,d=Math.sin(r),p=d*o-u*l;return[(Math.atan2(u*o+d*l,h*s+p*n)-e)/a,Math.asin(p*s-h*n)/a]}}}forward(t){return t}inverse(t){return t}cutOnAntimeridian(t,e){let i,r=[],s=[t];for(let i=0,s=t.length;i90)&&(l<-90||l>90)&&a>0!=l>0){let t=n((180-(a+360)%360)/((l+360)%360-(a+360)%360),0,1),e=o[1]+t*(s[1]-o[1]);r.push({i,lat:e,direction:a<0?1:-1,previousLonLat:o,lonLat:s})}}if(r.length)if(e){r.length%2==1&&(i=r.slice().sort(((t,e)=>Math.abs(e.lat)-Math.abs(t.lat)))[0],o(r,i));let e=r.length-2;for(;e>=0;){let i=r[e].i,n=l(180+1e-6*r[e].direction),o=l(180-1e-6*r[e].direction),a=t.splice(i,r[e+1].i-i,...h.geodesic([n,r[e].lat],[n,r[e+1].lat],!0));a.push(...h.geodesic([o,r[e+1].lat],[o,r[e].lat],!0)),s.push(a),e-=2}if(i)for(let t=0;t-1){let t=(r<0?-1:1)*this.maxLatitude,s=l(180+1e-6*e),a=l(180-1e-6*e),c=h.geodesic([s,r],[s,t],!0);for(let i=s+120*e;i>-180&&i<180;i+=120*e)c.push([i,t]);c.push(...h.geodesic([a,t],[a,i.lat],!0)),n.splice(o,0,...c);break}}}else{let e=r.length;for(;e--;){let i=r[e].i,n=t.splice(i,t.length,[l(180+1e-6*r[e].direction),r[e].lat]);n.unshift([l(180-1e-6*r[e].direction),r[e].lat]),s.push(n)}}return s}path(t){let e,{bounds:i,def:n,rotator:o}=this,a=[],l="Polygon"===t.type||"MultiPolygon"===t.type,c=this.hasGeoProjection,u=!n||!1!==n.antimeridianCutting,d=u?o:void 0,p=u&&n||this;i&&(e=[[i.x1,i.y1],[i.x2,i.y1],[i.x2,i.y2],[i.x1,i.y2]]);let f=t=>{let n=t.map((t=>{if(u){d&&(t=d.forward(t));let e=t[0];1e-6>Math.abs(e-180)&&(e=e<180?179.999999:180.000001),t=[e,t[1]]}return t})),o=[n];c&&(h.insertGeodesics(n),u&&(o=this.cutOnAntimeridian(n,l))),o.forEach((t=>{let n,o;if(t.length<2)return;let d=!1,f=!1,m=t=>{d?a.push(["L",t[0],t[1]]):(a.push(["M",t[0],t[1]]),d=!0)},g=!1,y=!1,_=t.map((t=>{let e=p.forward(t);return e.outside?g=!0:y=!0,e[1]===1/0?e[1]=1e10:e[1]===-1/0&&(e[1]=-1e10),e}));if(u){if(l&&_.push(_[0]),g){if(!y)return;if(e)if(l)_=s(_,e);else if(i)return void r(_,e).forEach((t=>{d=!1,t.forEach(m)}))}_.forEach(m)}else for(let e=0;e<_.length;e++){let i=t[e],r=_[e];r.outside?f=!0:(l&&!n&&(n=i,t.push(i),_.push(r)),f&&o&&(l&&c?h.geodesic(o,i).forEach((t=>m(p.forward(t)))):d=!1),m(r),o=i,f=!1)}}))};return"LineString"===t.type?f(t.coordinates):"MultiLineString"===t.type?t.coordinates.forEach((t=>f(t))):"Polygon"===t.type?(t.coordinates.forEach((t=>f(t))),a.length&&a.push(["Z"])):"MultiPolygon"===t.type&&(t.coordinates.forEach((t=>{t.forEach((t=>f(t)))})),a.length&&a.push(["Z"])),a}}return h.registry=e,h})),i(e,"Maps/MapView.js",[e["Core/Globals.js"],e["Maps/MapViewDefaults.js"],e["Maps/GeoJSONComposition.js"],e["Core/Geometry/GeometryUtilities.js"],e["Maps/MapUtilities.js"],e["Maps/Projection.js"],e["Core/Utilities.js"]],(function(t,e,i,r,s,n,o){let{composed:a}=t,{pointInPolygon:l}=r,{topo2geo:c}=i,{boundsFromPath:h}=s,{addEvent:u,clamp:d,crisp:p,fireEvent:f,isArray:m,isNumber:g,isObject:y,isString:_,merge:v,pick:x,pushUnique:b,relativeLength:w}=o,S={};function C(t,e){let{width:i,height:r}=e;return Math.log(400.979322/Math.max((t.x2-t.x1)/(i/256),(t.y2-t.y1)/(r/256)))/Math.log(2)}function T(t){t.seriesOptions.mapData&&this.mapView?.recommendMapView(this,[this.options.chart.map,t.seriesOptions.mapData],this.options.drilldown?.mapZooming)}class k{static compose(t){b(a,"MapView")&&(S=t.maps,u(t,"afterInit",(function(){this.mapView=new k(this,this.options.mapView)}),{order:0}),u(t,"addSeriesAsDrilldown",T),u(t,"afterDrillUp",T))}static compositeBounds(t){if(t.length)return t.slice(1).reduce(((t,e)=>(t.x1=Math.min(t.x1,e.x1),t.y1=Math.min(t.y1,e.y1),t.x2=Math.max(t.x2,e.x2),t.y2=Math.max(t.y2,e.y2),t)),v(t[0]))}static mergeInsets(t,e){let i=t=>{let e={};return t.forEach(((t,i)=>{e[t&&t.id||`i${i}`]=t})),e},r=v(i(t),i(e));return Object.keys(r).map((t=>r[t]))}constructor(t,i){this.allowTransformAnimation=!0,this.eventsToUnbind=[],this.insets=[],this.padding=[0,0,0,0],this.recommendedMapView={},this instanceof E||this.recommendMapView(t,[t.options.chart.map,...(t.options.series||[]).map((t=>t.mapData))]),this.userOptions=i||{};let r=v(e,this.recommendedMapView,i),s=this.recommendedMapView?.insets,o=i&&i.insets;s&&o&&(r.insets=k.mergeInsets(s,o)),this.chart=t,this.center=r.center,this.options=r,this.projection=new n(r.projection),this.playingField=t.plotBox,this.zoom=r.zoom||0,this.minZoom=r.minZoom,this.createInsets(),this.eventsToUnbind.push(u(t,"afterSetChartSize",(()=>{this.playingField=this.getField(),(void 0===this.minZoom||this.minZoom===this.zoom)&&(this.fitToBounds(void 0,void 0,!1),!this.chart.hasRendered&&g(this.userOptions.zoom)&&(this.zoom=this.userOptions.zoom),this.userOptions.center&&v(!0,this.center,this.userOptions.center))}))),this.setUpEvents()}createInsets(){let t=this.options,e=t.insets;e&&e.forEach((e=>{let i=new E(this,v(t.insetOptions,e));this.insets.push(i)}))}fitToBounds(t,e,i=!0,r){let s=t||this.getProjectedBounds();if(s){let n=x(e,t?0:this.options.padding),o=this.getField(!1),a=m(n)?n:[n,n,n,n];this.padding=[w(a[0],o.height),w(a[1],o.width),w(a[2],o.height),w(a[3],o.width)],this.playingField=this.getField();let l=C(s,this.playingField);t||(this.minZoom=l);let c=this.projection.inverse([(s.x2+s.x1)/2,(s.y2+s.y1)/2]);this.setView(c,l,i,r)}}getField(t=!0){let e=t?this.padding:[0,0,0,0];return{x:e[3],y:e[0],width:this.chart.plotWidth-e[1]-e[3],height:this.chart.plotHeight-e[0]-e[2]}}getGeoMap(t){if(_(t))return S[t]&&"Topology"===S[t].type?c(S[t]):S[t];if(y(t,!0)){if("FeatureCollection"===t.type)return t;if("Topology"===t.type)return c(t)}}getMapBBox(){let t=this.getProjectedBounds(),e=this.getScale();if(t){let i=this.padding,r=this.projectedUnitsToPixels({x:t.x1,y:t.y2});return{width:(t.x2-t.x1)*e+i[1]+i[3],height:(t.y2-t.y1)*e+i[0]+i[2],x:r.x-i[3],y:r.y-i[0]}}}getProjectedBounds(){let t=this.projection,e=this.chart.series.reduce(((t,e)=>{let i=e.getProjectedBounds&&e.getProjectedBounds();return i&&!1!==e.options.affectsMapView&&t.push(i),t}),[]),i=this.options.fitToGeometry;if(i){if(!this.fitToGeometryCache)if("MultiPoint"===i.type){let e=i.coordinates.map((e=>t.forward(e))),r=e.map((t=>t[0])),s=e.map((t=>t[1]));this.fitToGeometryCache={x1:Math.min.apply(0,r),x2:Math.max.apply(0,r),y1:Math.min.apply(0,s),y2:Math.max.apply(0,s)}}else this.fitToGeometryCache=h(t.path(i));return this.fitToGeometryCache}return this.projection.bounds||k.compositeBounds(e)}getScale(){return 256/400.979322*Math.pow(2,this.zoom)}getSVGTransform(){let{x:t,y:e,width:i,height:r}=this.playingField,s=this.projection.forward(this.center),n=this.projection.hasCoordinates?-1:1,o=this.getScale(),a=o*n;return{scaleX:o,scaleY:a,translateX:t+i/2-s[0]*o,translateY:e+r/2-s[1]*a}}lonLatToPixels(t){let e=this.lonLatToProjectedUnits(t);if(e)return this.projectedUnitsToPixels(e)}lonLatToProjectedUnits(t){let e=this.chart,i=e.mapTransforms;if(i){for(let r in i)if(Object.hasOwnProperty.call(i,r)&&i[r].hitZone){let s=e.transformFromLatLon(t,i[r]);if(s&&l(s,i[r].hitZone.coordinates[0]))return s}return e.transformFromLatLon(t,i.default)}for(let e of this.insets)if(e.options.geoBounds&&l({x:t.lon,y:t.lat},e.options.geoBounds.coordinates[0])){let i=e.projection.forward([t.lon,t.lat]),r=e.projectedUnitsToPixels({x:i[0],y:i[1]});return this.pixelsToProjectedUnits(r)}let r=this.projection.forward([t.lon,t.lat]);if(!r.outside)return{x:r[0],y:r[1]}}projectedUnitsToLonLat(t){let e=this.chart,i=e.mapTransforms;if(i){for(let r in i)if(Object.hasOwnProperty.call(i,r)&&i[r].hitZone&&l(t,i[r].hitZone.coordinates[0]))return e.transformToLatLon(t,i[r]);return e.transformToLatLon(t,i.default)}let r=this.projectedUnitsToPixels(t);for(let t of this.insets)if(t.hitZone&&l(r,t.hitZone.coordinates[0])){let e=t.pixelsToProjectedUnits(r),i=t.projection.inverse([e.x,e.y]);return{lon:i[0],lat:i[1]}}let s=this.projection.inverse([t.x,t.y]);return{lon:s[0],lat:s[1]}}recommendMapView(t,e,i=!1){this.recommendedMapView={};let r=e.map((t=>this.getGeoMap(t))),s=[];r.forEach((t=>{if(t&&(Object.keys(this.recommendedMapView).length||(this.recommendedMapView=t["hc-recommended-mapview"]||{}),t.bbox)){let[e,i,r,n]=t.bbox;s.push({x1:e,y1:i,x2:r,y2:n})}}));let n=s.length&&k.compositeBounds(s);f(this,"onRecommendMapView",{geoBounds:n,chart:t},(function(){if(n&&this.recommendedMapView){if(!this.recommendedMapView.projection){let{x1:t,y1:e,x2:i,y2:r}=n;this.recommendedMapView.projection=i-t>180&&r-e>90?{name:"EqualEarth",parallels:[0,0],rotation:[0]}:{name:"LambertConformalConic",parallels:[e,r],rotation:[-(t+i)/2]}}this.recommendedMapView.insets||(this.recommendedMapView.insets=void 0)}})),this.geoMap=r[0],i&&t.hasRendered&&!t.userOptions.mapView?.projection&&this.recommendedMapView&&this.update(this.recommendedMapView)}redraw(t){this.chart.series.forEach((t=>{t.useMapGeometry&&(t.isDirty=!0)})),this.chart.redraw(t)}setView(t,e,i=!0,r){t&&(this.center=t),"number"==typeof e&&("number"==typeof this.minZoom&&(e=Math.max(e,this.minZoom)),"number"==typeof this.options.maxZoom&&(e=Math.min(e,this.options.maxZoom)),g(e)&&(this.zoom=e));let s=this.getProjectedBounds();if(s){let t=this.projection.forward(this.center),{x:e,y:i,width:r,height:n}=this.playingField,o=this.getScale(),a=this.projectedUnitsToPixels({x:s.x1,y:s.y1}),l=this.projectedUnitsToPixels({x:s.x2,y:s.y2}),c=[(s.x1+s.x2)/2,(s.y1+s.y2)/2];if(!this.chart.series.some((t=>t.isDrilling))){let s=a.x,h=l.y,u=l.x,d=a.y;u-se+r&&s>e&&(t[0]+=Math.min(u-r-e,s-e)/o),d-hi+n&&h>i&&(t[1]-=Math.min(d-n-i,h-i)/o),this.center=this.projection.inverse(t)}this.insets.forEach((t=>{t.options.field&&(t.hitZone=t.getHitZone(),t.playingField=t.getField())})),this.render()}f(this,"afterSetView"),i&&this.redraw(r)}projectedUnitsToPixels(t){let e=this.getScale(),i=this.projection.forward(this.center),r=this.playingField,s=r.x+r.width/2,n=r.y+r.height/2;return{x:s-e*(i[0]-t.x),y:n+e*(i[1]-t.y)}}pixelsToLonLat(t){return this.projectedUnitsToLonLat(this.pixelsToProjectedUnits(t))}pixelsToProjectedUnits(t){let{x:e,y:i}=t,r=this.getScale(),s=this.projection.forward(this.center),n=this.playingField,o=n.x+n.width/2,a=n.y+n.height/2;return{x:s[0]+(e-o)/r,y:s[1]-(i-a)/r}}setUpEvents(){let t,e,i,{chart:r}=this,s=s=>{let{lastTouches:n,pinchDown:o}=r.pointer,a=this.projection,l=s.touches,{mouseDownX:c,mouseDownY:h}=r,u=0;if(1===o?.length?(c=o[0].chartX,h=o[0].chartY):2===o?.length&&(c=(o[0].chartX+o[1].chartX)/2,h=(o[0].chartY+o[1].chartY)/2),2===l?.length&&n&&(u=Math.log(Math.sqrt(Math.pow(n[0].chartX-n[1].chartX,2)+Math.pow(n[0].chartY-n[1].chartY,2))/Math.sqrt(Math.pow(l[0].chartX-l[1].chartX,2)+Math.pow(l[0].chartY-l[1].chartY,2)))/Math.log(.5)),g(c)&&g(h)){let n=`${c},${h}`,{chartX:o,chartY:p}=s.originalEvent;2===l?.length&&(o=(l[0].chartX+l[1].chartX)/2,p=(l[0].chartY+l[1].chartY)/2),n!==e&&(e=n,t=this.projection.forward(this.center),i=(this.projection.options.rotation||[0,0]).slice());let f=a.def&&a.def.bounds,m=f&&C(f,this.playingField)||-1/0;if("Orthographic"===a.options.name&&2>(l?.length||0)&&(this.minZoom||1/0)<1.3*m){let t=440/(this.getScale()*Math.min(r.plotWidth,r.plotHeight));if(i){let e=(c-o)*t-i[0],s=d(-i[1]-(h-p)*t,-80,80),n=this.zoom;this.update({projection:{rotation:[-e,-s]}},!1),this.fitToBounds(void 0,void 0,!1),this.zoom=n,r.redraw(!1)}}else if(g(o)&&g(p)){let e=this.getScale(),i=this.projection.hasCoordinates?1:-1,r=this.projection.inverse([t[0]+(c-o)/e,t[1]-(h-p)/e*i]);isNaN(r[0]+r[1])||this.zoomBy(u,r,void 0,!1)}s.preventDefault()}};u(r,"pan",s),u(r,"touchpan",s),u(r,"selection",(t=>{if(t.resetSelection)this.zoomBy();else{let e=t.x-r.plotLeft,i=t.y-r.plotTop,{y:s,x:n}=this.pixelsToProjectedUnits({x:e,y:i}),{y:o,x:a}=this.pixelsToProjectedUnits({x:e+t.width,y:i+t.height});this.fitToBounds({x1:n,y1:s,x2:a,y2:o},void 0,!0,!t.originalEvent.touches&&void 0),/^touch/.test(t.originalEvent.type)||r.showResetZoom(),t.preventDefault()}}))}render(){this.group||(this.group=this.chart.renderer.g("map-view").attr({zIndex:4}).add())}update(t,e=!0,i){let r=t.projection,s=r&&n.toString(r)!==n.toString(this.options.projection),o=!1;v(!0,this.userOptions,t),v(!0,this.options,t),"insets"in t&&(this.insets.forEach((t=>t.destroy())),this.insets.length=0,o=!0),(s||"fitToGeometry"in t)&&delete this.fitToGeometryCache,(s||o)&&(this.chart.series.forEach((t=>{let e=t.transformGroups;if(t.clearBounds&&t.clearBounds(),t.isDirty=!0,t.isDirtyData=!0,o&&e)for(;e.length>1;){let t=e.pop();t&&t.destroy()}})),s&&(this.projection=new n(this.options.projection)),o&&this.createInsets(),!t.center&&Object.hasOwnProperty.call(t,"zoom")&&!g(t.zoom)&&this.fitToBounds(void 0,void 0,!1)),t.center||g(t.zoom)?this.setView(this.options.center,t.zoom,!1):"fitToGeometry"in t&&this.fitToBounds(void 0,void 0,!1),e&&this.chart.redraw(i)}zoomBy(t,e,i,r){let s=this.chart,n=this.projection.forward(this.center);if("number"==typeof t){let o,a,l,c=this.zoom+t;if(i){let[t,e]=i,r=this.getScale(),o=t-s.plotLeft-s.plotWidth/2,c=e-s.plotTop-s.plotHeight/2;a=n[0]+o/r,l=n[1]+c/r}if("number"==typeof a&&"number"==typeof l){let t=1-Math.pow(2,this.zoom)/Math.pow(2,c),e=n[0]-a,i=n[1]-l;n[0]-=e*t,n[1]+=i*t,o=this.projection.inverse(n)}this.setView(e||o,c,void 0,r)}else this.fitToBounds(void 0,void 0,void 0,r)}}class E extends k{constructor(t,e){if(super(t.chart,e),this.id=e.id,this.mapView=t,this.options=v({center:[0,0]},t.options.insetOptions,e),this.allBounds=[],this.options.geoBounds){let e=t.projection.path(this.options.geoBounds);this.geoBoundsProjectedBox=h(e),this.geoBoundsProjectedPolygon=e.map((t=>[t[1]||0,t[2]||0]))}}getField(t=!0){let e=this.hitZone;if(e){let i=t?this.padding:[0,0,0,0],r=e.coordinates[0],s=r.map((t=>t[0])),n=r.map((t=>t[1])),o=Math.min.apply(0,s)+i[3],a=Math.max.apply(0,s)-i[1],l=Math.min.apply(0,n)+i[0],c=Math.max.apply(0,n)-i[2];if(g(o)&&g(l))return{x:o,y:l,width:a-o,height:c-l}}return super.getField.call(this,t)}getHitZone(){let{chart:t,mapView:e,options:i}=this,{coordinates:r}=i.field||{};if(r){let s=r[0];if("percent"===i.units){let r="mapBoundingBox"===i.relativeTo&&e.getMapBBox()||v(t.plotBox,{x:0,y:0});s=s.map((t=>[w(`${t[0]}%`,r.width,r.x),w(`${t[1]}%`,r.height,r.y)]))}return{type:"Polygon",coordinates:[s]}}}getProjectedBounds(){return k.compositeBounds(this.allBounds)}isInside(t){let{geoBoundsProjectedBox:e,geoBoundsProjectedPolygon:i}=this;return!!(e&&t.x>=e.x1&&t.x<=e.x2&&t.y>=e.y1&&t.y<=e.y2&&i&&l(t,i))}render(){let{chart:t,mapView:e,options:i}=this,r=i.borderPath||i.field;if(r&&e.group){let s=!0;this.border||(this.border=t.renderer.path().addClass("highcharts-mapview-inset-border").add(e.group),s=!1),t.styledMode||this.border.attr({stroke:i.borderColor,"stroke-width":i.borderWidth});let n=this.border.strokeWidth(),o="mapBoundingBox"===i.relativeTo&&e.getMapBBox()||e.playingField,a=(r.coordinates||[]).reduce(((e,r)=>r.reduce(((e,r,s)=>{let[a,l]=r;return"percent"===i.units&&(a=t.plotLeft+w(`${a}%`,o.width,o.x),l=t.plotTop+w(`${l}%`,o.height,o.y)),a=p(a,n),l=p(l,n),e.push(0===s?["M",a,l]:["L",a,l]),e}),e)),[]);this.border[s?"animate":"attr"]({d:a})}}destroy(){this.border&&(this.border=this.border.destroy()),this.eventsToUnbind.forEach((t=>t()))}setUpEvents(){}}return k})),i(e,"Series/Map/MapSeries.js",[e["Core/Animation/AnimationUtilities.js"],e["Series/ColorMapComposition.js"],e["Series/CenteredUtilities.js"],e["Core/Globals.js"],e["Core/Chart/MapChart.js"],e["Series/Map/MapPoint.js"],e["Series/Map/MapSeriesDefaults.js"],e["Maps/MapView.js"],e["Core/Series/SeriesRegistry.js"],e["Core/Utilities.js"]],(function(t,e,i,r,s,n,o,a,l,c){let{animObject:h,stop:u}=t,{noop:d}=r,{splitPath:p}=s,{column:f,scatter:m}=l.seriesTypes,{extend:g,find:y,fireEvent:_,getNestedProperty:v,isArray:x,defined:b,isNumber:w,isObject:S,merge:C,objectEach:T,pick:k,splat:E}=c;class A extends m{constructor(){super(...arguments),this.processedData=[]}animate(t){let{chart:e,group:i}=this,r=h(this.options.animation);t?i.attr({translateX:e.plotLeft+e.plotWidth/2,translateY:e.plotTop+e.plotHeight/2,scaleX:.001,scaleY:.001}):i.animate({translateX:e.plotLeft,translateY:e.plotTop,scaleX:1,scaleY:1},r)}clearBounds(){this.points.forEach((t=>{delete t.bounds,delete t.insetIndex,delete t.projectedPath})),delete this.bounds}doFullTranslate(){return!(!this.isDirtyData&&!this.chart.isResizing&&this.hasRendered)}drawMapDataLabels(){super.drawDataLabels(),this.dataLabelsGroup&&this.dataLabelsGroup.clip(this.chart.clipRect)}drawPoints(){let t=this,{chart:e,group:i,transformGroups:r=[]}=this,{mapView:s,renderer:n}=e;if(s){this.transformGroups=r,r[0]||(r[0]=n.g().add(i));for(let t=0,e=s.insets.length;t{let{graphic:e}=t;t.group=r["number"==typeof t.insetIndex?t.insetIndex+1:0],e&&e.parentGroup!==t.group&&e.add(t.group)})),f.prototype.drawPoints.apply(this),this.points.forEach((i=>{let r=i.graphic;if(r){let s=r.animate,n="";i.name&&(n+="highcharts-name-"+i.name.replace(/ /g,"-").toLowerCase()),i.properties&&i.properties["hc-key"]&&(n+=" highcharts-key-"+i.properties["hc-key"].toString().toLowerCase()),n&&r.addClass(n),e.styledMode&&r.css(this.pointAttribs(i,i.selected?"select":void 0)),r.attr({visibility:i.visible||!i.visible&&!i.isNull?"inherit":"hidden"}),r.animate=function(i,n,o){let a=w(i["stroke-width"])&&!w(r["stroke-width"]),l=w(r["stroke-width"])&&!w(i["stroke-width"]);if(a||l){let s=k(t.getStrokeWidth(t.options),1)/(e.mapView&&e.mapView.getScale()||1);a&&(r["stroke-width"]=s),l&&(i["stroke-width"]=s)}return s.call(r,i,n,l?function(){r.element.removeAttribute("stroke-width"),delete r["stroke-width"],o&&o.apply(this,arguments)}:o)}}}))),r.forEach(((i,r)=>{let o=(0===r?s:s.insets[r-1]).getSVGTransform(),a=k(this.getStrokeWidth(this.options),1),l=o.scaleX,c=o.scaleY>0?1:-1,d=e=>{(t.points||[]).forEach((t=>{let i,r=t.graphic;r&&r["stroke-width"]&&(i=this.getStrokeWidth(t.options))&&r.attr({"stroke-width":i/e})}))};if(n.globalAnimation&&e.hasRendered&&s.allowTransformAnimation){let t=Number(i.attr("translateX")),e=Number(i.attr("translateY")),r=Number(i.attr("scaleX")),s=(s,n)=>{let h=r+(l-r)*n.pos;i.attr({translateX:t+(o.translateX-t)*n.pos,translateY:e+(o.translateY-e)*n.pos,scaleX:h,scaleY:h*c,"stroke-width":a/h}),d(h)},u=C(h(n.globalAnimation)),p=u.step;u.step=function(){p&&p.apply(this,arguments),s.apply(this,arguments)},i.attr({animator:0}).animate({animator:1},u,function(){"boolean"!=typeof n.globalAnimation&&n.globalAnimation.complete&&n.globalAnimation.complete({applyDrilldown:!0}),_(this,"mapZoomComplete")}.bind(this))}else u(i),i.attr(C(o,{"stroke-width":a/l})),d(l)})),this.isDrilling||this.drawMapDataLabels()}}getProjectedBounds(){if(!this.bounds&&this.chart.mapView){let{insets:t,projection:e}=this.chart.mapView,i=[];(this.points||[]).forEach((r=>{if(r.path||r.geometry){if("string"==typeof r.path?r.path=p(r.path):x(r.path)&&"M"===r.path[0]&&(r.path=this.chart.renderer.pathToSegments(r.path)),!r.bounds){let i=r.getProjectedBounds(e);if(i){r.labelrank=k(r.labelrank,(i.x2-i.x1)*(i.y2-i.y1));let{midX:e,midY:s}=i;if(t&&w(e)&&w(s)){let n=y(t,(t=>t.isInside({x:e,y:s})));n&&(delete r.projectedPath,(i=r.getProjectedBounds(n.projection))&&n.allBounds.push(i),r.insetIndex=t.indexOf(n))}r.bounds=i}}r.bounds&&void 0===r.insetIndex&&i.push(r.bounds)}})),this.bounds=a.compositeBounds(i)}return this.bounds}getStrokeWidth(t){let e=this.pointAttrToOptions;return t[e&&e["stroke-width"]||"borderWidth"]}hasData(){return!!this.processedXData.length}pointAttribs(t,e){let{mapView:i,styledMode:r}=t.series.chart,s=r?this.colorAttribs(t):f.prototype.pointAttribs.call(this,t,e),n=this.getStrokeWidth(t.options);if(e){let i=C(this.options.states&&this.options.states[e],t.options.states&&t.options.states[e]||{}),r=this.getStrokeWidth(i);b(r)&&(n=r),s.stroke=i.borderColor??t.color}n&&i&&(n/=i.getScale());let o=this.getStrokeWidth(this.options);return s.dashstyle&&i&&w(o)&&(n=o/i.getScale()),t.visible||(s.fill=this.options.nullColor),b(n)?s["stroke-width"]=n:delete s["stroke-width"],s["stroke-linecap"]=s["stroke-linejoin"]=this.options.linecap,s}updateData(){return!this.processedData&&super.updateData.apply(this,arguments)}setData(t,e=!0,i,r){delete this.bounds,super.setData(t,!1,void 0,r),this.processData(),this.generatePoints(),e&&this.chart.redraw(i)}processData(){let t,e,i,s=this.options,o=s.data,a=this.chart,l=a.options.chart,c=this.joinBy,h=s.keys||this.pointArrayMap,u=[],d={},p=this.chart.mapView,f=p&&(S(s.mapData,!0)?p.getGeoMap(s.mapData):p.geoMap),m=a.mapTransforms=l.mapTransforms||f&&f["hc-transform"]||a.mapTransforms;m&&T(m,(t=>{t.rotation&&(t.cosAngle=Math.cos(t.rotation),t.sinAngle=Math.sin(t.rotation))})),x(s.mapData)?i=s.mapData:f&&"FeatureCollection"===f.type&&(this.mapTitle=f.title,i=r.geojson(f,this.type,this)),this.processedData=[];let g=this.processedData;if(o){let t;for(let e=0,i=o.length;eh.length&&"string"==typeof t[0]&&(g[e]["hc-key"]=t[0],++i);for(let r=0;r0?n.prototype.setNestedProperty(g[e],t[i],h[r]):g[e][h[r]]=t[i])}else g[e]=o[e];c&&"_i"===c[0]&&(g[e]._i=e)}}if(i){this.mapData=i,this.mapMap={};for(let r=0;r{let i=v(t,e);d[i]&&u.push(d[i])}))}if(s.allAreas){if(c[1]){let t=c[1];g.forEach((e=>{u.push(v(t,e))}))}let t="|"+u.map((function(t){return t&&t[c[0]]})).join("|")+"|";i.forEach((e=>{c[0]&&-1!==t.indexOf("|"+e[c[0]]+"|")||g.push(C(e,{value:null}))}))}}this.processedXData=Array(g.length)}setOptions(t){let e=super.setOptions(t),i=e.joinBy;return null===e.joinBy&&(i="_i"),(i=this.joinBy=E(i))[1]||(i[1]=i[0]),e}translate(){let t=this.doFullTranslate(),e=this.chart.mapView,i=e&&e.projection;if(this.chart.hasRendered&&(this.isDirtyData||!this.hasRendered)&&(this.processData(),this.generatePoints(),delete this.bounds,!e||e.userOptions.center||w(e.userOptions.zoom)||e.zoom!==e.minZoom?this.getProjectedBounds():e.fitToBounds(void 0,void 0,!1)),e){let r=e.getSVGTransform();this.points.forEach((s=>{let o=w(s.insetIndex)&&e.insets[s.insetIndex].getSVGTransform()||r;o&&s.bounds&&w(s.bounds.midX)&&w(s.bounds.midY)&&(s.plotX=s.bounds.midX*o.scaleX+o.translateX,s.plotY=s.bounds.midY*o.scaleY+o.translateY),t&&(s.shapeType="path",s.shapeArgs={d:n.getProjectedPath(s,i)}),s.hiddenInDataClass||(s.projectedPath&&!s.projectedPath.length?s.setVisible(!1):s.visible||s.setVisible(!0))}))}_(this,"afterTranslate")}update(t){t.mapData&&this.chart.mapView?.recommendMapView(this.chart,[this.chart.options.chart.map,...(this.chart.options.series||[]).map(((e,i)=>i===this._i?t.mapData:e.mapData))],!0),super.update.apply(this,arguments)}}return A.defaultOptions=C(m.defaultOptions,o),g(A.prototype,{type:"map",axisTypes:e.seriesMembers.axisTypes,colorAttribs:e.seriesMembers.colorAttribs,colorKey:e.seriesMembers.colorKey,directTouch:!0,drawDataLabels:d,drawGraph:d,forceDL:!0,getCenter:i.getCenter,getExtremesFromAll:!0,getSymbol:d,isCartesian:!1,parallelArrays:e.seriesMembers.parallelArrays,pointArrayMap:e.seriesMembers.pointArrayMap,pointClass:n,preserveAspectRatio:!0,searchPoint:d,trackerGroups:e.seriesMembers.trackerGroups,useMapGeometry:!0}),e.compose(A),l.registerSeriesType("map",A),A})),i(e,"Series/MapLine/MapLineSeriesDefaults.js",[],(function(){return{lineWidth:1,fillColor:"none",legendSymbol:"lineMarker"}})),i(e,"Series/MapLine/MapLineSeries.js",[e["Series/MapLine/MapLineSeriesDefaults.js"],e["Series/Map/MapSeries.js"],e["Core/Series/SeriesRegistry.js"],e["Core/Utilities.js"]],(function(t,e,i,r){let{extend:s,merge:n}=r;class o extends e{pointAttribs(t,e){let i=super.pointAttribs(t,e);return i.fill=this.options.fillColor,i}}return o.defaultOptions=n(e.defaultOptions,t),s(o.prototype,{type:"mapline",colorProp:"stroke",pointAttrToOptions:{stroke:"color","stroke-width":"lineWidth"}}),i.registerSeriesType("mapline",o),o})),i(e,"Series/MapPoint/MapPointPoint.js",[e["Core/Series/SeriesRegistry.js"],e["Core/Utilities.js"]],(function(t,e){let{scatter:i}=t.seriesTypes,{isNumber:r}=e;class s extends i.prototype.pointClass{isValid(){return!!(this.options.geometry||r(this.x)&&r(this.y)||r(this.options.lon)&&r(this.options.lat))}}return s})),i(e,"Series/MapPoint/MapPointSeriesDefaults.js",[],(function(){return{dataLabels:{crop:!1,defer:!1,enabled:!0,formatter:function(){return this.point.name},overflow:!1,style:{color:"#000000"}},legendSymbol:"lineMarker"}})),i(e,"Series/MapPoint/MapPointSeries.js",[e["Core/Globals.js"],e["Series/MapPoint/MapPointPoint.js"],e["Series/MapPoint/MapPointSeriesDefaults.js"],e["Core/Series/SeriesRegistry.js"],e["Core/Renderer/SVG/SVGRenderer.js"],e["Core/Utilities.js"]],(function(t,e,i,r,s,n){let{noop:o}=t,{map:a,scatter:l}=r.seriesTypes,{extend:c,fireEvent:h,isNumber:u,merge:d}=n;class p extends l{constructor(){super(...arguments),this.clearBounds=a.prototype.clearBounds}drawDataLabels(){super.drawDataLabels(),this.dataLabelsGroup&&this.dataLabelsGroup.clip(this.chart.clipRect)}projectPoint(t){let e=this.chart.mapView;if(e){let{geometry:i,lon:r,lat:s}=t,n=i&&"Point"===i.type&&i.coordinates;if(u(r)&&u(s)&&(n=[r,s]),n)return e.lonLatToProjectedUnits({lon:n[0],lat:n[1]})}}translate(){let t=this.chart.mapView;if(this.processedXData||this.processData(),this.generatePoints(),this.getProjectedBounds&&this.isDirtyData&&(delete this.bounds,this.getProjectedBounds()),t){let e=t.getSVGTransform(),{hasCoordinates:i}=t.projection;this.points.forEach((r=>{let s,{x:n,y:o}=r,a=u(r.insetIndex)&&t.insets[r.insetIndex].getSVGTransform()||e,l=this.projectPoint(r.options)||r.properties&&this.projectPoint(r.properties);if(l?(n=l.x,o=l.y):r.bounds&&(n=r.bounds.midX,o=r.bounds.midY,a&&u(n)&&u(o)&&(r.plotX=n*a.scaleX+a.translateX,r.plotY=o*a.scaleY+a.translateY,s=!0)),u(n)&&u(o)){if(!s){let e=t.projectedUnitsToPixels({x:n,y:o});r.plotX=e.x,r.plotY=i?e.y:this.chart.plotHeight-e.y}}else r.y=r.plotX=r.plotY=void 0;r.isInside=this.isPointInside(r),r.zone=this.zones.length?r.getZone():void 0}))}h(this,"afterTranslate")}}return p.defaultOptions=d(l.defaultOptions,i),s.prototype.symbols.mapmarker=(t,e,i,r,s)=>{let n,o,a=s&&"legend"===s.context;a?(n=t+i/2,o=e+r):s&&"number"==typeof s.anchorX&&"number"==typeof s.anchorY?(n=s.anchorX,o=s.anchorY):(n=t+i/2,o=e+r/2,e-=r);let l=a?r/3:r/2;return[["M",n,o],["C",n,o,n-l,e+1.5*l,n-l,e+l],["A",l,l,1,1,1,n+l,e+l],["C",n+l,e+1.5*l,n,o,n,o],["Z"]]},c(p.prototype,{type:"mappoint",axisTypes:["colorAxis"],forceDL:!0,isCartesian:!1,pointClass:e,searchPoint:o,useMapGeometry:!0}),r.registerSeriesType("mappoint",p),p})),i(e,"Series/Bubble/BubbleLegendDefaults.js",[],(function(){return{borderColor:void 0,borderWidth:2,className:void 0,color:void 0,connectorClassName:void 0,connectorColor:void 0,connectorDistance:60,connectorWidth:1,enabled:!1,labels:{className:void 0,allowOverlap:!1,format:"",formatter:void 0,align:"right",style:{fontSize:"0.9em",color:"#000000"},x:0,y:0},maxSize:60,minSize:10,legendIndex:0,ranges:{value:void 0,borderColor:void 0,color:void 0,connectorColor:void 0},sizeBy:"area",sizeByAbsoluteValue:!1,zIndex:1,zThreshold:0}})),i(e,"Series/Bubble/BubbleLegendItem.js",[e["Core/Color/Color.js"],e["Core/Templating.js"],e["Core/Globals.js"],e["Core/Utilities.js"]],(function(t,e,i,r){let{parse:s}=t,{noop:n}=i,{arrayMax:o,arrayMin:a,isNumber:l,merge:c,pick:h,stableSort:u}=r;return class{constructor(t,e){this.setState=n,this.init(t,e)}init(t,e){this.options=t,this.visible=!0,this.chart=e.chart,this.legend=e}addToLegend(t){t.splice(this.options.legendIndex,0,this)}drawLegendSymbol(t){let e,i=h(t.options.itemDistance,20),r=this.legendItem||{},s=this.options,n=s.ranges,o=s.connectorDistance;if(!n||!n.length||!l(n[0].value))return void(t.options.bubbleLegend.autoRanges=!0);u(n,(function(t,e){return e.value-t.value})),this.ranges=n,this.setOptions(),this.render();let a=this.getMaxLabelSize(),c=this.ranges[0].radius,d=2*c;e=(e=o-c+a.width)>0?e:0,this.maxLabel=a,this.movementX="left"===s.labels.align?e:0,r.labelWidth=d+e+i,r.labelHeight=d+a.height/2}setOptions(){let t=this.ranges,e=this.options,i=this.chart.series[e.seriesIndex],r=this.legend.baseline,n={zIndex:e.zIndex,"stroke-width":e.borderWidth},o={zIndex:e.zIndex,"stroke-width":e.connectorWidth},a={align:this.legend.options.rtl||"left"===e.labels.align?"right":"left",zIndex:e.zIndex},l=i.options.marker.fillOpacity,u=this.chart.styledMode;t.forEach((function(d,p){u||(n.stroke=h(d.borderColor,e.borderColor,i.color),n.fill=h(d.color,e.color,1!==l?s(i.color).setOpacity(l).get("rgba"):i.color),o.stroke=h(d.connectorColor,e.connectorColor,i.color)),t[p].radius=this.getRangeRadius(d.value),t[p]=c(t[p],{center:t[0].radius-t[p].radius+r}),u||c(!0,t[p],{bubbleAttribs:c(n),connectorAttribs:c(o),labelAttribs:a})}),this)}getRangeRadius(t){let e=this.options,i=this.options.seriesIndex,r=this.chart.series[i],s=e.ranges[0].value,n=e.ranges[e.ranges.length-1].value,o=e.minSize,a=e.maxSize;return r.getRadius.call(this,n,s,o,a,t)}render(){let t=this.legendItem||{},e=this.chart.renderer,i=this.options.zThreshold;for(let r of(this.symbols||(this.symbols={connectors:[],bubbleItems:[],labels:[]}),t.symbol=e.g("bubble-legend"),t.label=e.g("bubble-legend-item").css(this.legend.itemStyle||{}),t.symbol.translateX=0,t.symbol.translateY=0,t.symbol.add(t.label),t.label.add(t.group),this.ranges))r.value>=i&&this.renderRange(r);this.hideOverlappingLabels()}renderRange(t){let e=this.ranges[0],i=this.legend,r=this.options,s=r.labels,n=this.chart,o=n.series[r.seriesIndex],a=n.renderer,l=this.symbols,c=l.labels,h=t.center,u=Math.abs(t.radius),d=r.connectorDistance||0,p=s.align,f=i.options.rtl,m=r.borderWidth,g=r.connectorWidth,y=e.radius||0,_=h-u-m/2+g/2,v=(_%1?1:.5)-(g%2?0:.5),x=a.styledMode,b=f||"left"===p?-d:d;"center"===p&&(b=0,r.connectorDistance=0,t.labelAttribs.align="center"),l.bubbleItems.push(a.circle(y,h+v,u).attr(x?{}:t.bubbleAttribs).addClass((x?"highcharts-color-"+o.colorIndex+" ":"")+"highcharts-bubble-legend-symbol "+(r.className||"")).add(this.legendItem.symbol)),l.connectors.push(a.path(a.crispLine([["M",y,_],["L",y+b,_]],r.connectorWidth)).attr(x?{}:t.connectorAttribs).addClass((x?"highcharts-color-"+this.options.seriesIndex+" ":"")+"highcharts-bubble-legend-connectors "+(r.connectorClassName||"")).add(this.legendItem.symbol));let w=a.text(this.formatLabel(t)).attr(x?{}:t.labelAttribs).css(x?{}:s.style).addClass("highcharts-bubble-legend-labels "+(r.labels.className||"")).add(this.legendItem.symbol),S={x:y+b+r.labels.x,y:_+r.labels.y+.4*w.getBBox().height};w.attr(S),c.push(w),w.placed=!0,w.alignAttr=S}getMaxLabelSize(){let t,e;return this.symbols.labels.forEach((function(i){e=i.getBBox(!0),t=t?e.width>t.width?e:t:e})),t||{}}formatLabel(t){let i=this.options,r=i.labels.formatter,s=i.labels.format,{numberFormatter:n}=this.chart;return s?e.format(s,t):r?r.call(t):n(t.value,1)}hideOverlappingLabels(){let t=this.chart,e=this.options.labels.allowOverlap,i=this.symbols;!e&&i&&(t.hideOverlappingLabels(i.labels),i.labels.forEach((function(t,e){t.newOpacity?t.newOpacity!==t.oldOpacity&&i.connectors[e].show():i.connectors[e].hide()})))}getRanges(){let t,e,i=this.legend.bubbleLegend,r=i.chart.series,s=i.options.ranges,n=Number.MAX_VALUE,u=-Number.MAX_VALUE;return r.forEach((function(t){t.isBubble&&!t.ignoreSeries&&(e=t.zData.filter(l)).length&&(n=h(t.options.zMin,Math.min(n,Math.max(a(e),!1===t.options.displayNegative?t.options.zThreshold:-Number.MAX_VALUE))),u=h(t.options.zMax,Math.max(u,o(e))))})),t=n===u?[{value:u}]:[{value:n},{value:(n+u)/2},{value:u,autoRanges:!0}],s.length&&s[0].radius&&t.reverse(),t.forEach((function(e,i){s&&s[i]&&(t[i]=c(s[i],e))})),t}predictBubbleSizes(){let t,e=this.chart,i=e.legend.options,r=i.floating,s="horizontal"===i.layout,n=s?e.legend.lastLineHeight:0,o=e.plotSizeX,a=e.plotSizeY,l=e.series[this.options.seriesIndex],c=l.getPxExtremes(),h=Math.ceil(c.minPxSize),u=Math.ceil(c.maxPxSize),d=Math.min(a,o),p=l.options.maxSize;return r||!/%$/.test(p)?t=u:(t=(d+n)*(p=parseFloat(p))/100/(p/100+1),(s&&a-t>=o||!s&&o-t>=a)&&(t=u)),[h,Math.ceil(t)]}updateRanges(t,e){let i=this.legend.options.bubbleLegend;i.minSize=t,i.maxSize=e,i.ranges=this.getRanges()}correctSizes(){let t=this.legend,e=this.chart.series[this.options.seriesIndex].getPxExtremes();Math.abs(Math.ceil(e.maxPxSize)-this.options.maxSize)>1&&(this.updateRanges(this.options.minSize,e.maxPxSize),t.render())}}})),i(e,"Series/Bubble/BubbleLegendComposition.js",[e["Series/Bubble/BubbleLegendDefaults.js"],e["Series/Bubble/BubbleLegendItem.js"],e["Core/Defaults.js"],e["Core/Globals.js"],e["Core/Utilities.js"]],(function(t,e,i,r,s){let{setOptions:n}=i,{composed:o}=r,{addEvent:a,objectEach:l,pushUnique:c,wrap:h}=s;function u(t,e,i){let r,s,n,o=this.legend,a=d(this)>=0;o&&o.options.enabled&&o.bubbleLegend&&o.options.bubbleLegend.autoRanges&&a?(r=o.bubbleLegend.options,s=o.bubbleLegend.predictBubbleSizes(),o.bubbleLegend.updateRanges(s[0],s[1]),r.placed||(o.group.placed=!1,o.allItems.forEach((t=>{(n=t.legendItem||{}).group&&(n.group.translateY=void 0)}))),o.render(),r.placed||(this.getMargins(),this.axes.forEach((function(t){t.visible&&t.render(),r.placed||(t.setScale(),t.updateNames(),l(t.ticks,(function(t){t.isNew=!0,t.isNewLabel=!0})))})),this.getMargins()),r.placed=!0,t.call(this,e,i),o.bubbleLegend.correctSizes(),g(o,p(o))):(t.call(this,e,i),o&&o.options.enabled&&o.bubbleLegend&&(o.render(),g(o,p(o))))}function d(t){let e=t.series,i=0;for(;ie.height&&(e.height=s[l].itemHeight);e.step=a}return n}function f(t){let i=this.bubbleLegend,r=this.options,s=r.bubbleLegend,n=d(this.chart);i&&i.ranges&&i.ranges.length&&(s.ranges.length&&(s.autoRanges=!!s.ranges[0].autoRanges),this.destroyItem(i)),n>=0&&r.enabled&&s.enabled&&(s.seriesIndex=n,this.bubbleLegend=new e(s,this),this.bubbleLegend.addToLegend(t.allItems))}function m(t){let e;if(t.defaultPrevented)return!1;let i=t.legendItem,r=this.chart,s=i.visible;this&&this.bubbleLegend&&(i.visible=!s,i.ignoreSeries=s,e=d(r)>=0,this.bubbleLegend.visible!==e&&(this.update({bubbleLegend:{enabled:e}}),this.bubbleLegend.visible=e),i.visible=s)}function g(t,e){let i,r,s,n,o=t.allItems,a=t.options.rtl,l=0;o.forEach(((t,o)=>{(n=t.legendItem||{}).group&&(i=n.group.translateX||0,r=n.y||0,((s=t.movementX)||a&&t.ranges)&&(s=a?i-t.options.maxSize/2:i+s,n.group.attr({translateX:s})),o>e[l].step&&l++,n.group.attr({translateY:Math.round(r+e[l].height/2)}),n.y=r+e[l].height/2)}))}return{compose:function(e,i){c(o,"Series.BubbleLegend")&&(n({legend:{bubbleLegend:t}}),h(e.prototype,"drawChartBox",u),a(i,"afterGetAllItems",f),a(i,"itemClick",m))}}})),i(e,"Series/Bubble/BubblePoint.js",[e["Core/Series/Point.js"],e["Core/Series/SeriesRegistry.js"],e["Core/Utilities.js"]],(function(t,e,i){let{seriesTypes:{scatter:{prototype:{pointClass:r}}}}=e,{extend:s}=i;class n extends r{haloPath(e){return t.prototype.haloPath.call(this,0===e?0:(this.marker&&this.marker.radius||0)+e)}}return s(n.prototype,{ttBelow:!1}),n})),i(e,"Series/Bubble/BubbleSeries.js",[e["Series/Bubble/BubbleLegendComposition.js"],e["Series/Bubble/BubblePoint.js"],e["Core/Color/Color.js"],e["Core/Globals.js"],e["Core/Series/SeriesRegistry.js"],e["Core/Utilities.js"]],(function(t,e,i,r,s,n){let{parse:o}=i,{composed:a,noop:l}=r,{series:c,seriesTypes:{column:{prototype:h},scatter:u}}=s,{addEvent:d,arrayMax:p,arrayMin:f,clamp:m,extend:g,isNumber:y,merge:_,pick:v,pushUnique:x}=n;function b(){let t,e=this.len,{coll:i,isXAxis:r,min:s}=this,n=r?"xData":"yData",o=(this.max||0)-(s||0),a=0,l=e,c=e/o;("xAxis"===i||"yAxis"===i)&&(this.series.forEach((e=>{if(e.bubblePadding&&e.reserveSpace()){this.allowZoomOutside=!0,t=!0;let i=e[n];if(r&&((e.onPoint||e).getRadii(0,0,e),e.onPoint&&(e.radii=e.onPoint.radii)),o>0){let t=i.length;for(;t--;)if(y(i[t])&&this.dataMin<=i[t]&&i[t]<=this.max){let r=e.radii&&e.radii[t]||0;a=Math.min((i[t]-s)*c-r,a),l=Math.max((i[t]-s)*c+r,l)}}}})),t&&o>0&&!this.logarithmic&&(l-=e,c*=(e+Math.max(0,a)-Math.min(l,e))/e,[["min","userMin",a],["max","userMax",l]].forEach((t=>{void 0===v(this.options[t[0]],this[t[1]])&&(this[t[0]]+=t[2]/c)}))))}class w extends u{static compose(e,i,r){t.compose(i,r),x(a,"Series.Bubble")&&d(e,"foundExtremes",b)}animate(t){!t&&this.points.length{if(r.bubblePadding&&r.reserveSpace()){let s=(r.onPoint||r).getZExtremes();s&&(e=Math.min(v(e,s.zMin),s.zMin),i=Math.max(v(i,s.zMax),s.zMax),t=!0)}})),t?(o={zMin:e,zMax:i},this.chart.bubbleZExtremes=o):o={zMin:0,zMax:0}}for(e=0,t=r.length;e0&&(h=(s-t)/c)}return a&&h>=0&&(h=Math.sqrt(h)),Math.ceil(i+h*(r-i))/2}hasData(){return!!this.processedXData.length}markerAttribs(t,e){let i=super.markerAttribs(t,e),{height:r=0,width:s=0}=i;return this.chart.inverted?g(i,{x:(t.plotX||0)-s/2,y:(t.plotY||0)-r/2}):i}pointAttribs(t,e){let i=this.options.marker.fillOpacity,r=c.prototype.pointAttribs.call(this,t,e);return 1!==i&&(r.fill=o(r.fill).setOpacity(i).get("rgba")),r}translate(){super.translate.call(this),this.getRadii(),this.translateBubble()}translateBubble(){let{data:t,options:e,radii:i}=this,{minPxSize:r}=this.getPxExtremes(),s=t.length;for(;s--;){let n=t[s],o=i?i[s]:0;"z"===this.zoneAxis&&(n.negative=(n.z||0)<(e.zThreshold||0)),y(o)&&o>=r/2?(n.marker=g(n.marker,{radius:o,width:2*o,height:2*o}),n.dlBox={x:n.plotX-o,y:n.plotY-o,width:2*o,height:2*o}):(n.shapeArgs=n.plotY=n.dlBox=void 0,n.isInside=!1)}}getPxExtremes(){let t=Math.min(this.chart.plotWidth,this.chart.plotHeight),e=e=>{let i;return"string"==typeof e&&(i=/%$/.test(e),e=parseInt(e,10)),i?t*e/100:e},i=e(v(this.options.minSize,8));return{minPxSize:i,maxPxSize:Math.max(e(v(this.options.maxSize,"20%")),i)}}getZExtremes(){let t=this.options,e=(this.zData||[]).filter(y);if(e.length){let i=v(t.zMin,m(f(e),!1===t.displayNegative?t.zThreshold||0:-Number.MAX_VALUE,Number.MAX_VALUE)),r=v(t.zMax,p(e));if(y(i)&&y(r))return{zMin:i,zMax:r}}}}return w.defaultOptions=_(u.defaultOptions,{dataLabels:{formatter:function(){let{numberFormatter:t}=this.series.chart,{z:e}=this.point;return y(e)?t(e,-1):""},inside:!0,verticalAlign:"middle"},animationLimit:250,marker:{lineColor:null,lineWidth:1,fillOpacity:.5,radius:null,states:{hover:{radiusPlus:0}},symbol:"circle"},minSize:8,maxSize:"20%",softThreshold:!1,states:{hover:{halo:{size:5}}},tooltip:{pointFormat:"({point.x}, {point.y}), Size: {point.z}"},turboThreshold:0,zThreshold:0,zoneAxis:"z"}),g(w.prototype,{alignDataLabel:h.alignDataLabel,applyZones:l,bubblePadding:!0,isBubble:!0,pointArrayMap:["y","z"],pointClass:e,parallelArrays:["x","y","z"],trackerGroups:["group","dataLabelsGroup"],specialGroup:"group",zoneAxis:"z"}),d(w,"updatedData",(t=>{delete t.target.chart.bubbleZExtremes})),d(w,"remove",(t=>{delete t.target.chart.bubbleZExtremes})),s.registerSeriesType("bubble",w),w})),i(e,"Series/MapBubble/MapBubblePoint.js",[e["Series/Bubble/BubblePoint.js"],e["Core/Series/SeriesRegistry.js"],e["Core/Utilities.js"]],(function(t,e,i){let{seriesTypes:{map:{prototype:{pointClass:{prototype:r}}}}}=e,{extend:s}=i;class n extends t{isValid(){return"number"==typeof this.z}}return s(n.prototype,{applyOptions:r.applyOptions,getProjectedBounds:r.getProjectedBounds}),n})),i(e,"Series/MapBubble/MapBubbleSeries.js",[e["Series/Bubble/BubbleSeries.js"],e["Series/MapBubble/MapBubblePoint.js"],e["Core/Series/SeriesRegistry.js"],e["Core/Utilities.js"]],(function(t,e,i,r){let{seriesTypes:{map:{prototype:s},mappoint:{prototype:n}}}=i,{extend:o,merge:a}=r;class l extends t{constructor(){super(...arguments),this.clearBounds=s.clearBounds}searchPoint(t,e){return this.searchKDTree({plotX:t.chartX-this.chart.plotLeft,plotY:t.chartY-this.chart.plotTop},e,t)}translate(){n.translate.call(this),this.getRadii(),this.translateBubble()}updateParallelArrays(t,e,i){super.updateParallelArrays.call(this,t,e,i);let r=this.processedXData,s=this.xData;r&&s&&(r.length=s.length)}}return l.defaultOptions=a(t.defaultOptions,{lineWidth:0,animationLimit:500,joinBy:"hc-key",tooltip:{pointFormat:"{point.name}: {point.z}"}}),o(l.prototype,{type:"mapbubble",axisTypes:["colorAxis"],getProjectedBounds:s.getProjectedBounds,isCartesian:!1,pointArrayMap:["z"],pointClass:e,processData:s.processData,projectPoint:n.projectPoint,kdAxisArray:["plotX","plotY"],setData:s.setData,setOptions:s.setOptions,updateData:s.updateData,useMapGeometry:!0,xyFromShape:!0}),i.registerSeriesType("mapbubble",l),l})),i(e,"Series/Heatmap/HeatmapPoint.js",[e["Core/Series/SeriesRegistry.js"],e["Core/Utilities.js"]],(function(t,e){let{scatter:{prototype:{pointClass:i}}}=t.seriesTypes,{clamp:r,defined:s,extend:n,pick:o}=e;class a extends i{applyOptions(t,e){return(this.isNull||null===this.value)&&delete this.color,super.applyOptions(t,e),this.formatPrefix=this.isNull||null===this.value?"null":"point",this}getCellAttributes(){let t=this.series,e=t.options,i=(e.colsize||1)/2,n=(e.rowsize||1)/2,a=t.xAxis,l=t.yAxis,c=this.options.marker||t.options.marker,h=t.pointPlacementToXValue(),u=o(this.pointPadding,e.pointPadding,0),d={x1:r(Math.round(a.len-a.translate(this.x-i,!1,!0,!1,!0,-h)),-a.len,2*a.len),x2:r(Math.round(a.len-a.translate(this.x+i,!1,!0,!1,!0,-h)),-a.len,2*a.len),y1:r(Math.round(l.translate(this.y-n,!1,!0,!1,!0)),-l.len,2*l.len),y2:r(Math.round(l.translate(this.y+n,!1,!0,!1,!0)),-l.len,2*l.len)};for(let t of[["width","x"],["height","y"]]){let e=t[0],i=t[1],r=i+"1",n=i+"2",o=Math.abs(d[r]-d[n]),h=c&&c.lineWidth||0,p=Math.abs(d[r]+d[n])/2,f=c&&c[e];if(s(f)&&f"},states:{hover:{halo:!1,brightness:.2}},legendSymbol:"rectangle"}})),i(e,"Series/InterpolationUtilities.js",[e["Core/Globals.js"],e["Core/Utilities.js"]],(function(t,e){let{doc:i}=t,{defined:r,pick:s}=e;return{colorFromPoint:function(t,e){let i=e.series.colorAxis;if(i){let n=i.toColor(t||0,e).split(")")[0].split("(")[1].split(",").map((t=>s(parseFloat(t),parseInt(t,10))));return n[3]=255*s(n[3],1),r(t)&&e.visible||(n[3]=0),n}return[0,0,0,0]},getContext:function(t){let{canvas:e,context:r}=t;return e&&r?(r.clearRect(0,0,e.width,e.height),r):(t.canvas=i.createElement("canvas"),t.context=t.canvas.getContext("2d",{willReadFrequently:!0})||void 0,t.context)}}})),i(e,"Series/Heatmap/HeatmapSeries.js",[e["Core/Color/Color.js"],e["Series/ColorMapComposition.js"],e["Series/Heatmap/HeatmapPoint.js"],e["Series/Heatmap/HeatmapSeriesDefaults.js"],e["Core/Series/SeriesRegistry.js"],e["Core/Renderer/SVG/SVGRenderer.js"],e["Core/Utilities.js"],e["Series/InterpolationUtilities.js"]],(function(t,e,i,r,s,n,o,a){let{series:l,seriesTypes:{column:c,scatter:h}}=s,{prototype:{symbols:u}}=n,{addEvent:d,extend:p,fireEvent:f,isNumber:m,merge:g,pick:y}=o,{colorFromPoint:_,getContext:v}=a;class x extends h{constructor(){super(...arguments),this.valueMax=NaN,this.valueMin=NaN,this.isDirtyCanvas=!0}drawPoints(){let t=this,e=t.options,i=e.interpolation,r=e.marker||{};if(i){let{image:e,chart:i,xAxis:r,yAxis:s}=t,{reversed:n=!1,len:o}=r,{reversed:a=!1,len:l}=s,c={width:o,height:l};if(!e||t.isDirtyData||t.isDirtyCanvas){let o=v(t),{canvas:l,options:{colsize:h=1,rowsize:u=1},points:d,points:{length:p}}=t,f=i.colorAxis&&i.colorAxis[0];if(l&&o&&f){let{min:f,max:m}=r.getExtremes(),{min:g,max:y}=s.getExtremes(),v=m-f,x=y-g,b=Math.round(v/h/8*8),w=Math.round(x/u/8*8),[S,C]=[[b,b/v,n,"ceil"],[w,w/x,!a,"floor"]].map((([t,e,i,r])=>i?i=>Math[r](t-e*i):t=>Math[r](e*t))),T=l.width=b+1,k=T*(l.height=w+1),E=(p-1)/k,A=new Uint8ClampedArray(4*k),M=(t,e)=>4*Math.ceil(T*C(e-g)+S(t-f));t.buildKDTree();for(let t=0;t{e.graphic&&(e.graphic[t.chart.styledMode?"css":"animate"](t.colorAttribs(e)),null===e.value&&e.graphic.addClass("highcharts-null-point"))})))}getExtremes(){let{dataMin:t,dataMax:e}=l.prototype.getExtremes.call(this,this.valueData);return m(t)&&(this.valueMin=t),m(e)&&(this.valueMax=e),l.prototype.getExtremes.call(this)}getValidPoints(t,e){return l.prototype.getValidPoints.call(this,t,e,!0)}hasData(){return!!this.processedXData.length}init(){super.init.apply(this,arguments);let t=this.options;t.pointRange=y(t.pointRange,t.colsize||1),this.yAxis.axisPointRange=t.rowsize||1,u.ellipse=u.circle,t.marker&&m(t.borderRadius)&&(t.marker.r=t.borderRadius)}markerAttribs(t,e){let i=t.shapeArgs||{};if(t.hasImage)return{x:t.plotX,y:t.plotY};if(e&&"normal"!==e){let r=t.options.marker||{},s=this.options.marker||{},n=s.states&&s.states[e]||{},o=r.states&&r.states[e]||{},a=(o.width||n.width||i.width||0)+(o.widthPlus||n.widthPlus||0),l=(o.height||n.height||i.height||0)+(o.heightPlus||n.heightPlus||0);return{x:(i.x||0)+((i.width||0)-a)/2,y:(i.y||0)+((i.height||0)-l)/2,width:a,height:l}}return i}pointAttribs(e,i){let r=l.prototype.pointAttribs.call(this,e,i),s=this.options||{},n=this.chart.options.plotOptions||{},o=n.series||{},a=n.heatmap||{},c=e&&e.options.borderColor||s.borderColor||a.borderColor||o.borderColor,h=e&&e.options.borderWidth||s.borderWidth||a.borderWidth||o.borderWidth||r["stroke-width"];if(r.stroke=e&&e.marker&&e.marker.lineColor||s.marker&&s.marker.lineColor||c||this.color,r["stroke-width"]=h,i&&"normal"!==i){let n=g(s.states&&s.states[i],s.marker&&s.marker.states&&s.marker.states[i],e&&e.options.states&&e.options.states[i]||{});r.fill=n.color||t.parse(r.fill).brighten(n.brightness||0).get(),r.stroke=n.lineColor||r.stroke}return r}translate(){let{borderRadius:t,marker:e}=this.options,i=e&&e.symbol||"rect",r=u[i]?i:"rect",s=-1!==["circle","square"].indexOf(r);for(let e of(this.generatePoints(),this.points)){let n=e.getCellAttributes(),o=Math.min(n.x1,n.x2),a=Math.min(n.y1,n.y2),l=Math.max(Math.abs(n.x2-n.x1),0),c=Math.max(Math.abs(n.y2-n.y1),0);if(e.hasImage=0===(e.marker&&e.marker.symbol||i||"").indexOf("url"),s){let t=Math.abs(l-c);o=Math.min(n.x1,n.x2)+(l]*>|>)([\\s\\S]*?)<\\/"+t+">",e?"gim":"im")}function d(t){if(null==t)return;let e=NaN;return e="ms"==t.slice(-2)?parseFloat(t.slice(0,-2)):"s"==t.slice(-1)?1e3*parseFloat(t.slice(0,-1)):"m"==t.slice(-1)?1e3*parseFloat(t.slice(0,-1))*60:parseFloat(t),isNaN(e)?void 0:e}function ee(t,e){return t.getAttribute&&t.getAttribute(e)}function o(t,e){return t.hasAttribute&&(t.hasAttribute(e)||t.hasAttribute("data-"+e))}function te(t,e){return ee(t,e)||ee(t,"data-"+e)}function u(t){return t.parentElement}function re(){return document}function c(t,e){for(;t&&!e(t);)t=u(t);return t||null}function L(t,e,i){var r=te(e,i),s=te(e,"hx-disinherit");return t!==e&&s&&("*"===s||s.split(" ").indexOf(i)>=0)?"unset":r}function ne(t,e){var i=null;if(c(t,(function(r){return i=L(t,r,e)})),"unset"!==i)return i}function h(t,e){var i=t.matches||t.matchesSelector||t.msMatchesSelector||t.mozMatchesSelector||t.webkitMatchesSelector||t.oMatchesSelector;return i&&i.call(t,e)}function A(t){var e=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(t);return e?e[1].toLowerCase():""}function s(t,e){for(var i=(new DOMParser).parseFromString(t,"text/html").body;e>0;)e--,i=i.firstChild;return null==i&&(i=re().createDocumentFragment()),i}function N(t){return/",0).querySelector("template").content;return Q.config.allowScriptTags?oe(n.querySelectorAll("script"),(function(t){Q.config.inlineScriptNonce&&(t.nonce=Q.config.inlineScriptNonce),t.htmxExecuted=-1===navigator.userAgent.indexOf("Firefox")})):oe(n.querySelectorAll("script"),(function(t){_(t)})),n}switch(i){case"thead":case"tbody":case"tfoot":case"colgroup":case"caption":return s(""+r+"
    ",1);case"col":return s(""+r+"
    ",2);case"tr":return s(""+r+"
    ",2);case"td":case"th":return s(""+r+"
    ",3);case"script":case"style":return s("
    "+r+"
    ",1);default:return s(r,0)}}function ie(t){t&&t()}function I(t,e){return Object.prototype.toString.call(t)==="[object "+e+"]"}function k(t){return I(t,"Function")}function P(t){return I(t,"Object")}function ae(t){var e="htmx-internal-data",i=t[e];return i||(i=t[e]={}),i}function M(t){var e=[];if(t)for(var i=0;i=0}function se(t){return t.getRootNode&&t.getRootNode()instanceof window.ShadowRoot?re().body.contains(t.getRootNode().host):re().body.contains(t)}function D(t){return t.trim().split(/\s+/)}function le(t,e){for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return t}function E(t){try{return JSON.parse(t)}catch(t){return b(t),null}}function U(){var t="htmx:localStorageTest";try{return localStorage.setItem(t,t),localStorage.removeItem(t),!0}catch(t){return!1}}function B(t){try{var e=new URL(t);return e&&(t=e.pathname+e.search),/^\/$/.test(t)||(t=t.replace(/\/+$/,"")),t}catch(e){return t}}function t(e){return Tr(re().body,(function(){return eval(e)}))}function F(t){return Q.on("htmx:load",(function(e){t(e.detail.elt)}))}function V(){Q.logger=function(t,e,i){console&&console.log(e,t,i)}}function j(){Q.logger=null}function C(t,e){return e?t.querySelector(e):C(re(),t)}function f(t,e){return e?t.querySelectorAll(e):f(re(),t)}function _(t,e){t=p(t),e?setTimeout((function(){_(t),t=null}),e):t.parentElement.removeChild(t)}function z(t,e,i){t=p(t),i?setTimeout((function(){z(t,e),t=null}),i):t.classList&&t.classList.add(e)}function n(t,e,i){t=p(t),i?setTimeout((function(){n(t,e),t=null}),i):t.classList&&(t.classList.remove(e),0===t.classList.length&&t.removeAttribute("class"))}function $(t,e){(t=p(t)).classList.toggle(e)}function W(t,e){oe((t=p(t)).parentElement.children,(function(t){n(t,e)})),z(t,e)}function v(t,e){if((t=p(t)).closest)return t.closest(e);do{if(null==t||h(t,e))return t}while(t=t&&u(t));return null}function g(t,e){return t.substring(0,e.length)===e}function G(t,e){return t.substring(t.length-e.length)===e}function J(t){var e=t.trim();return g(e,"<")&&G(e,"/>")?e.substring(1,e.length-2):e}function Z(t,e){return 0===e.indexOf("closest ")?[v(t,J(e.substr(8)))]:0===e.indexOf("find ")?[C(t,J(e.substr(5)))]:"next"===e?[t.nextElementSibling]:0===e.indexOf("next ")?[K(t,J(e.substr(5)))]:"previous"===e?[t.previousElementSibling]:0===e.indexOf("previous ")?[Y(t,J(e.substr(9)))]:"document"===e?[document]:"window"===e?[window]:"body"===e?[document.body]:re().querySelectorAll(J(e))}var K=function(t,e){for(var i=re().querySelectorAll(e),r=0;r=0;r--){var s=i[r];if(s.compareDocumentPosition(t)===Node.DOCUMENT_POSITION_FOLLOWING)return s}};function ue(t,e){return e?Z(t,e)[0]:Z(re().body,t)[0]}function p(t){return I(t,"String")?C(t):t}function ve(t,e,i){return k(e)?{target:re().body,event:t,listener:e}:{target:p(t),event:e,listener:i}}function de(t,e,i){return jr((function(){var r=ve(t,e,i);r.target.addEventListener(r.event,r.listener)})),k(e)?e:i}function ge(t,e,i){return jr((function(){var r=ve(t,e,i);r.target.removeEventListener(r.event,r.listener)})),k(e)?e:i}var pe=re().createElement("output");function me(t,e){var i=ne(t,e);if(i){if("this"===i)return[xe(t,e)];var r=Z(t,i);return 0===r.length?(b('The selector "'+i+'" on '+e+" returned no matches!"),[pe]):r}}function xe(t,e){return c(t,(function(t){return null!=te(t,e)}))}function ye(t){var e=ne(t,"hx-target");return e?"this"===e?xe(t,"hx-target"):ue(t,e):ae(t).boosted?re().body:t}function be(t){for(var e=Q.config.attributesToSettle,i=0;i0?(s=t.substr(0,t.indexOf(":")),r=t.substr(t.indexOf(":")+1,t.length)):s=t);var n=re().querySelectorAll(r);return n?(oe(n,(function(t){var r,n=e.cloneNode(!0);(r=re().createDocumentFragment()).appendChild(n),Se(s,t)||(r=n);var o={shouldSwap:!0,target:t,fragment:r};ce(t,"htmx:oobBeforeSwap",o)&&(t=o.target,o.shouldSwap&&Fe(s,t,t,r,i),oe(i.elts,(function(t){ce(t,"htmx:oobAfterSwap",o)})))})),e.parentNode.removeChild(e)):(e.parentNode.removeChild(e),fe(re().body,"htmx:oobErrorNoTarget",{content:e})),t}function Ce(t,e,i){var r=ne(t,"hx-select-oob");if(r)for(var s=r.split(","),n=0;n0){var s=r.replace("'","\\'"),n=e.tagName.replace(":","\\:"),o=t.querySelector(n+"[id='"+s+"']");if(o&&o!==t){var a=e.cloneNode();we(e,o),i.tasks.push((function(){we(e,a)}))}}}))}function Oe(t){return function(){n(t,Q.config.addedClass),zt(t),Nt(t),qe(t),ce(t,"htmx:load")}}function qe(t){var e="[autofocus]",i=h(t,e)?t:t.querySelector(e);null!=i&&i.focus()}function a(t,e,i,r){for(Te(t,i,r);i.childNodes.length>0;){var s=i.firstChild;z(s,Q.config.addedClass),t.insertBefore(s,e),s.nodeType!==Node.TEXT_NODE&&s.nodeType!==Node.COMMENT_NODE&&r.tasks.push(Oe(s))}}function He(t,e){for(var i=0;i-1){var e=t.replace(H,"").match(q);if(e)return e[2]}}function je(t,e,i,r,s,n){s.title=Ve(r);var o=l(r);if(o)return Ce(i,o,s),Re(o=Be(i,o,n)),Fe(t,i,e,o,s)}function _e(t,e,i){var r=t.getResponseHeader(e);if(0===r.indexOf("{")){var s=E(r);for(var n in s)if(s.hasOwnProperty(n)){var o=s[n];P(o)||(o={value:o}),ce(i,n,o)}}else for(var a=r.split(","),l=0;l0;){var o=e[0];if("]"===o){if(0==--r){null===n&&(s+="true"),e.shift(),s+=")})";try{var a=Tr(t,(function(){return Function(s)()}),(function(){return!0}));return a.source=s,a}catch(t){return fe(re().body,"htmx:syntax:error",{error:t,source:s}),null}}}else"["===o&&r++;Qe(o,n,i)?s+="(("+i+"."+o+") ? ("+i+"."+o+") : (window."+o+"))":s+=o,n=e.shift()}}}function y(t,e){for(var i="";t.length>0&&!e.test(t[0]);)i+=t.shift();return i}function tt(t){var e;return t.length>0&&Ze.test(t[0])?(t.shift(),e=y(t,Ke).trim(),t.shift()):e=y(t,x),e}var rt="input, textarea, select";function nt(t,e,i){var r=[],s=Ye(e);do{y(s,Je);var n=s.length,o=y(s,/[,\[\s]/);if(""!==o)if("every"===o){var a={trigger:"every"};y(s,Je),a.pollInterval=d(y(s,/[,\[\s]/)),y(s,Je),(l=et(t,s,"event"))&&(a.eventFilter=l),r.push(a)}else if(0===o.indexOf("sse:"))r.push({trigger:"sse",sseEvent:o.substr(4)});else{var l,c={trigger:o};for((l=et(t,s,"event"))&&(c.eventFilter=l);s.length>0&&","!==s[0];){y(s,Je);var h=s.shift();if("changed"===h)c.changed=!0;else if("once"===h)c.once=!0;else if("consume"===h)c.consume=!0;else if("delay"===h&&":"===s[0])s.shift(),c.delay=d(y(s,x));else if("from"===h&&":"===s[0]){if(s.shift(),Ze.test(s[0]))var u=tt(s);else if("closest"===(u=y(s,x))||"find"===u||"next"===u||"previous"===u){s.shift();var p=tt(s);p.length>0&&(u+=" "+p)}c.from=u}else"target"===h&&":"===s[0]?(s.shift(),c.target=tt(s)):"throttle"===h&&":"===s[0]?(s.shift(),c.throttle=d(y(s,x))):"queue"===h&&":"===s[0]?(s.shift(),c.queue=y(s,x)):"root"===h&&":"===s[0]?(s.shift(),c[h]=tt(s)):"threshold"===h&&":"===s[0]?(s.shift(),c[h]=y(s,x)):fe(t,"htmx:syntax:error",{token:s.shift()})}r.push(c)}s.length===n&&fe(t,"htmx:syntax:error",{token:s.shift()}),y(s,Je)}while(","===s[0]&&s.shift());return i&&(i[e]=r),r}function it(t){var e=te(t,"hx-trigger"),i=[];if(e){var r=Q.config.triggerSpecsCache;i=r&&r[e]||nt(t,e,r)}return i.length>0?i:h(t,"form")?[{trigger:"submit"}]:h(t,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:h(t,rt)?[{trigger:"change"}]:[{trigger:"click"}]}function at(t){ae(t).cancelled=!0}function ot(t,e,i){var r=ae(t);r.timeout=setTimeout((function(){se(t)&&!0!==r.cancelled&&(ct(i,t,Wt("hx:poll:trigger",{triggerSpec:i,target:t}))||e(t),ot(t,e,i))}),i.pollInterval)}function st(t){return location.hostname===t.hostname&&ee(t,"href")&&0!==ee(t,"href").indexOf("#")}function lt(t,e,i){if("A"===t.tagName&&st(t)&&(""===t.target||"_self"===t.target)||"FORM"===t.tagName){var r,s;if(e.boosted=!0,"A"===t.tagName)r="get",s=ee(t,"href");else{var n=ee(t,"method");r=n?n.toLowerCase():"get",s=ee(t,"action")}i.forEach((function(i){ht(t,(function(t,e){v(t,Q.config.disableSelector)?m(t):he(r,s,t,e)}),e,i,!0)}))}}function ut(t,e){if("submit"===t.type||"click"===t.type){if("FORM"===e.tagName)return!0;if(h(e,'input[type="submit"], button')&&null!==v(e,"form"))return!0;if("A"===e.tagName&&e.href&&("#"===e.getAttribute("href")||0!==e.getAttribute("href").indexOf("#")))return!0}return!1}function ft(t,e){return ae(t).boosted&&"A"===t.tagName&&"click"===e.type&&(e.ctrlKey||e.metaKey)}function ct(t,e,i){var r=t.eventFilter;if(r)try{return!0!==r.call(e,i)}catch(t){return fe(re().body,"htmx:eventFilter:error",{error:t,source:r.source}),!0}return!1}function ht(t,e,i,r,s){var n,o=ae(t);n=r.from?Z(t,r.from):[t],r.changed&&n.forEach((function(t){ae(t).lastValue=t.value})),oe(n,(function(n){var a=function(i){if(se(t)){if(!ft(t,i)&&((s||ut(i,t))&&i.preventDefault(),!ct(r,t,i))){var l=ae(i);if(l.triggerSpec=r,null==l.handledFor&&(l.handledFor=[]),l.handledFor.indexOf(t)<0){if(l.handledFor.push(t),r.consume&&i.stopPropagation(),r.target&&i.target&&!h(i.target,r.target))return;if(r.once){if(o.triggeredOnce)return;o.triggeredOnce=!0}if(r.changed){var c=ae(n);if(c.lastValue===n.value)return;c.lastValue=n.value}if(o.delayed&&clearTimeout(o.delayed),o.throttle)return;r.throttle>0?o.throttle||(e(t,i),o.throttle=setTimeout((function(){o.throttle=null}),r.throttle)):r.delay>0?o.delayed=setTimeout((function(){e(t,i)}),r.delay):(ce(t,"htmx:trigger"),e(t,i))}}}else n.removeEventListener(r.trigger,a)};null==i.listenerInfos&&(i.listenerInfos=[]),i.listenerInfos.push({trigger:r.trigger,listener:a,on:n}),n.addEventListener(r.trigger,a)}))}var vt=!1,dt=null;function gt(){dt||(dt=function(){vt=!0},window.addEventListener("scroll",dt),setInterval((function(){vt&&(vt=!1,oe(re().querySelectorAll("[hx-trigger='revealed'],[data-hx-trigger='revealed']"),(function(t){pt(t)})))}),200))}function pt(t){!o(t,"data-hx-revealed")&&X(t)&&(t.setAttribute("data-hx-revealed","true"),ae(t).initHash?ce(t,"revealed"):t.addEventListener("htmx:afterProcessNode",(function(e){ce(t,"revealed")}),{once:!0}))}function mt(t,e,i){for(var r=D(i),s=0;s=0){var s=wt(i);setTimeout((function(){xt(t,e,i+1)}),s)}},s.onopen=function(t){i=0},ae(t).webSocket=s,s.addEventListener("message",(function(e){if(!yt(t)){var i=e.data;R(t,(function(e){i=e.transformResponse(i,null,t)}));for(var r=T(t),s=M(l(i).children),n=0;n0?ce(t,"htmx:validation:halted",o):(r.send(JSON.stringify(a)),ut(i,t)&&i.preventDefault())})):fe(t,"htmx:noWebSocketSourceError")}function wt(t){var e=Q.config.wsReconnectDelay;if("function"==typeof e)return e(t);if("full-jitter"===e){var i=Math.min(t,6);return 1e3*Math.pow(2,i)*Math.random()}b('htmx.config.wsReconnectDelay must either be a function or the string "full-jitter"')}function St(t,e,i){for(var r=D(i),s=0;s0?setTimeout(s,r):s()}function Ht(t,e,i){var r=!1;return oe(w,(function(s){if(o(t,"hx-"+s)){var n=te(t,"hx-"+s);r=!0,e.path=n,e.verb=s,i.forEach((function(i){Lt(t,i,e,(function(t,e){v(t,Q.config.disableSelector)?m(t):he(s,n,t,e)}))}))}})),r}function Lt(t,e,i,r){if(e.sseEvent)Rt(t,r,e.sseEvent);else if("revealed"===e.trigger)gt(),ht(t,r,i,e),pt(t);else if("intersect"===e.trigger){var s={};e.root&&(s.root=ue(t,e.root)),e.threshold&&(s.threshold=parseFloat(e.threshold));var n=new IntersectionObserver((function(e){for(var i=0;i0?(i.polling=!0,ot(t,r,e)):ht(t,r,i,e)}function At(t){if(!t.htmxExecuted&&Q.config.allowScriptTags&&("text/javascript"===t.type||"module"===t.type||""===t.type)){var e=re().createElement("script");oe(t.attributes,(function(t){e.setAttribute(t.name,t.value)})),e.textContent=t.textContent,e.async=!1,Q.config.inlineScriptNonce&&(e.nonce=Q.config.inlineScriptNonce);var i=t.parentElement;try{i.insertBefore(e,t)}catch(t){b(t)}finally{t.parentElement&&t.parentElement.removeChild(t)}}}function Nt(t){h(t,"script")&&At(t),oe(f(t,"script"),(function(t){At(t)}))}function It(t){var e=t.attributes;if(!e)return!1;for(var i=0;i0;){var o=r.shift(),a=o.match(/^\s*([a-zA-Z:\-\.]+:)(.*)/);0===n&&a?(o.split(":"),i[s=a[1].slice(0,-1)]=a[2]):i[s]+=o,n+=Bt(o)}for(var l in i)Ft(t,l,i[l])}}function jt(t){Ae(t);for(var e=0;eQ.config.historyCacheSize;)s.shift();for(;s.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(s));break}catch(t){fe(re().body,"htmx:historyCacheError",{cause:t,cache:s}),s.shift()}}}function Yt(t){if(!U())return null;t=B(t);for(var e=E(localStorage.getItem("htmx-history-cache"))||[],i=0;i=200&&this.status<400){ce(re().body,"htmx:historyCacheMissLoad",i);var e=l(this.response);e=e.querySelector("[hx-history-elt],[data-hx-history-elt]")||e;var r=Zt(),s=T(r),n=Ve(this.response);if(n){var o=C("title");o?o.innerHTML=n:window.document.title=n}Ue(r,e,s),nr(s.tasks),Jt=t,ce(re().body,"htmx:historyRestore",{path:t,cacheMiss:!0,serverResponse:this.response})}else fe(re().body,"htmx:historyCacheMissLoadError",i)},e.send()}function ar(t){er();var e=Yt(t=t||location.pathname+location.search);if(e){var i=l(e.content),r=Zt(),s=T(r);Ue(r,i,s),nr(s.tasks),document.title=e.title,setTimeout((function(){window.scrollTo(0,e.scroll)}),0),Jt=t,ce(re().body,"htmx:historyRestore",{path:t,item:e})}else Q.config.refreshOnHistoryMiss?window.location.reload(!0):ir(t)}function or(t){var e=me(t,"hx-indicator");return null==e&&(e=[t]),oe(e,(function(t){var e=ae(t);e.requestCount=(e.requestCount||0)+1,t.classList.add.call(t.classList,Q.config.requestClass)})),e}function sr(t){var e=me(t,"hx-disabled-elt");return null==e&&(e=[]),oe(e,(function(t){var e=ae(t);e.requestCount=(e.requestCount||0)+1,t.setAttribute("disabled","")})),e}function lr(t,e){oe(t,(function(t){var e=ae(t);e.requestCount=(e.requestCount||0)-1,0===e.requestCount&&t.classList.remove.call(t.classList,Q.config.requestClass)})),oe(e,(function(t){var e=ae(t);e.requestCount=(e.requestCount||0)-1,0===e.requestCount&&t.removeAttribute("disabled")}))}function ur(t,e){for(var i=0;i=0}function wr(t,e){var i=e||ne(t,"hx-swap"),r={swapStyle:ae(t).boosted?"innerHTML":Q.config.defaultSwapStyle,swapDelay:Q.config.defaultSwapDelay,settleDelay:Q.config.defaultSettleDelay};if(Q.config.scrollIntoViewOnBoost&&ae(t).boosted&&!br(t)&&(r.show="top"),i){var s=D(i);if(s.length>0)for(var n=0;n0?c.join(":"):null;r.scroll=a,r.scrollTarget=l}else if(0===o.indexOf("show:")){var c,h=(c=o.substr(5).split(":")).pop();l=c.length>0?c.join(":"):null,r.show=h,r.showTarget=l}else if(0===o.indexOf("focus-scroll:")){var u=o.substr(13);r.focusScroll="true"==u}else 0==n?r.swapStyle=o:b("Unknown modifier in hx-swap: "+o)}}return r}function Sr(t){return"multipart/form-data"===ne(t,"hx-encoding")||h(t,"form")&&"multipart/form-data"===ee(t,"enctype")}function Er(t,e,i){var r=null;return R(e,(function(s){null==r&&(r=s.encodeParameters(t,i,e))})),null!=r?r:Sr(e)?mr(i):pr(i)}function T(t){return{tasks:[],elts:[t]}}function Cr(t,e){var i=t[0],r=t[t.length-1];if(e.scroll){var s=null;e.scrollTarget&&(s=ue(i,e.scrollTarget)),"top"===e.scroll&&(i||s)&&((s=s||i).scrollTop=0),"bottom"===e.scroll&&(r||s)&&((s=s||r).scrollTop=s.scrollHeight)}if(e.show){if(s=null,e.showTarget){var n=e.showTarget;"window"===e.showTarget&&(n="body"),s=ue(i,n)}"top"===e.show&&(i||s)&&(s=s||i).scrollIntoView({block:"start",behavior:Q.config.scrollBehavior}),"bottom"===e.show&&(r||s)&&(s=s||r).scrollIntoView({block:"end",behavior:Q.config.scrollBehavior})}}function Rr(t,e,i,r){if(null==r&&(r={}),null==t)return r;var s=te(t,e);if(s){var n,o=s.trim(),a=i;if("unset"===o)return null;for(var l in 0===o.indexOf("javascript:")?(o=o.substr(11),a=!0):0===o.indexOf("js:")&&(o=o.substr(3),a=!0),0!==o.indexOf("{")&&(o="{"+o+"}"),n=a?Tr(t,(function(){return Function("return ("+o+")")()}),{}):E(o))n.hasOwnProperty(l)&&null==r[l]&&(r[l]=n[l])}return Rr(u(t),e,i,r)}function Tr(t,e,i){return Q.config.allowEval?e():(fe(t,"htmx:evalDisallowedError"),i)}function Or(t,e){return Rr(t,"hx-vars",!0,e)}function qr(t,e){return Rr(t,"hx-vals",!1,e)}function Hr(t){return le(Or(t),qr(t))}function Lr(t,e,i){if(null!==i)try{t.setRequestHeader(e,i)}catch(r){t.setRequestHeader(e,encodeURIComponent(i)),t.setRequestHeader(e+"-URI-AutoEncoded","true")}}function Ar(t){if(t.responseURL&&"undefined"!=typeof URL)try{var e=new URL(t.responseURL);return e.pathname+e.search}catch(e){fe(re().body,"htmx:badResponseUrl",{url:t.responseURL})}}function O(t,e){return e.test(t.getAllResponseHeaders())}function Nr(t,e,i){return t=t.toLowerCase(),i?i instanceof Element||I(i,"String")?he(t,e,null,null,{targetOverride:p(i),returnPromise:!0}):he(t,e,p(i.source),i.event,{handler:i.handler,headers:i.headers,values:i.values,targetOverride:p(i.target),swapOverride:i.swap,select:i.select,returnPromise:!0}):he(t,e,null,null,{returnPromise:!0})}function Ir(t){for(var e=[];t;)e.push(t),t=t.parentElement;return e}function kr(t,e,i){var r,s;return"function"==typeof URL?(s=new URL(e,document.location.href),r=document.location.origin===s.origin):(s=e,r=g(e,document.location.origin)),!(Q.config.selfRequestsOnly&&!r)&&ce(t,"htmx:validateUrl",le({url:s,sameHost:r},i))}function he(t,e,i,r,s,n){var o=null,a=null;if((s=null!=s?s:{}).returnPromise&&"undefined"!=typeof Promise)var l=new Promise((function(t,e){o=t,a=e}));null==i&&(i=re().body);var c=s.handler||Mr,h=s.select||null;if(!se(i))return ie(o),l;var u=s.targetOverride||ye(i);if(null==u||u==pe)return fe(i,"htmx:targetError",{target:te(i,"hx-target")}),ie(a),l;var d=ae(i),p=d.lastButtonClicked;if(p){var f=ee(p,"formaction");null!=f&&(e=f);var m=ee(p,"formmethod");null!=m&&"dialog"!==m.toLowerCase()&&(t=m)}var g=ne(i,"hx-confirm");if(void 0===n){var y={target:u,elt:i,path:e,verb:t,triggeringEvent:r,etc:s,issueRequest:function(n){return he(t,e,i,r,s,!!n)},question:g};if(!1===ce(i,"htmx:confirm",y))return ie(o),l}var _=i,v=ne(i,"hx-sync"),x=null,b=!1;if(v){var w=v.split(":"),S=w[0].trim();if(_="this"===S?xe(i,"hx-sync"):ue(i,S),v=(w[1]||"drop").trim(),d=ae(_),"drop"===v&&d.xhr&&!0!==d.abortable)return ie(o),l;if("abort"===v){if(d.xhr)return ie(o),l;b=!0}else"replace"===v?ce(_,"htmx:abort"):0===v.indexOf("queue")&&(x=(v.split(" ")[1]||"last").trim())}if(d.xhr){if(!d.abortable){if(null==x){if(r){var C=ae(r);C&&C.triggerSpec&&C.triggerSpec.queue&&(x=C.triggerSpec.queue)}null==x&&(x="last")}return null==d.queuedRequests&&(d.queuedRequests=[]),"first"===x&&0===d.queuedRequests.length||"all"===x?d.queuedRequests.push((function(){he(t,e,i,r,s)})):"last"===x&&(d.queuedRequests=[],d.queuedRequests.push((function(){he(t,e,i,r,s)}))),ie(o),l}ce(_,"htmx:abort")}var T=new XMLHttpRequest;d.xhr=T,d.abortable=b;var k=function(){d.xhr=null,d.abortable=!1,null!=d.queuedRequests&&d.queuedRequests.length>0&&d.queuedRequests.shift()()},E=ne(i,"hx-prompt");if(E){var A=prompt(E);if(null===A||!ce(i,"htmx:prompt",{prompt:A,target:u}))return ie(o),k(),l}if(g&&!n&&!confirm(g))return ie(o),k(),l;var M=xr(i,u,A);"get"===t||Sr(i)||(M["Content-Type"]="application/x-www-form-urlencoded"),s.headers&&(M=le(M,s.headers));var P=dr(i,t),I=P.errors,L=P.values;s.values&&(L=le(L,s.values));var D=le(L,Hr(i)),z=yr(D,i);Q.config.getCacheBusterParam&&"get"===t&&(z["org.htmx.cache-buster"]=ee(u,"id")||"true"),null!=e&&""!==e||(e=re().location.href);var O=Rr(i,"hx-request"),R=ae(i).boosted,N=Q.config.methodsThatUseUrlParams.indexOf(t)>=0,B={boosted:R,useUrlParams:N,parameters:z,unfilteredParameters:D,headers:M,target:u,verb:t,errors:I,withCredentials:s.credentials||O.credentials||Q.config.withCredentials,timeout:s.timeout||O.timeout||Q.config.timeout,path:e,triggeringEvent:r};if(!ce(i,"htmx:configRequest",B))return ie(o),k(),l;if(e=B.path,t=B.verb,M=B.headers,z=B.parameters,N=B.useUrlParams,(I=B.errors)&&I.length>0)return ce(i,"htmx:validation:halted",B),ie(o),k(),l;var F=e.split("#"),j=F[0],U=F[1],V=e;if(N&&(V=j,0!==Object.keys(z).length&&(V.indexOf("?")<0?V+="?":V+="&",V+=pr(z),U&&(V+="#"+U))),!kr(i,V,B))return fe(i,"htmx:invalidPath",B),ie(a),l;if(T.open(t.toUpperCase(),V,!0),T.overrideMimeType("text/html"),T.withCredentials=B.withCredentials,T.timeout=B.timeout,O.noHeaders);else for(var q in M)if(M.hasOwnProperty(q)){var G=M[q];Lr(T,q,G)}var $={xhr:T,target:u,requestConfig:B,etc:s,boosted:R,select:h,pathInfo:{requestPath:e,finalRequestPath:V,anchor:U}};if(T.onload=function(){try{var t=Ir(i);if($.pathInfo.responsePath=Ar(T),c(i,$),lr(H,W),ce(i,"htmx:afterRequest",$),ce(i,"htmx:afterOnLoad",$),!se(i)){for(var e=null;t.length>0&&null==e;){var r=t.shift();se(r)&&(e=r)}e&&(ce(e,"htmx:afterRequest",$),ce(e,"htmx:afterOnLoad",$))}ie(o),k()}catch(t){throw fe(i,"htmx:onLoadError",le({error:t},$)),t}},T.onerror=function(){lr(H,W),fe(i,"htmx:afterRequest",$),fe(i,"htmx:sendError",$),ie(a),k()},T.onabort=function(){lr(H,W),fe(i,"htmx:afterRequest",$),fe(i,"htmx:sendAbort",$),ie(a),k()},T.ontimeout=function(){lr(H,W),fe(i,"htmx:afterRequest",$),fe(i,"htmx:timeout",$),ie(a),k()},!ce(i,"htmx:beforeRequest",$))return ie(o),k(),l;var H=or(i),W=sr(i);oe(["loadstart","loadend","progress","abort"],(function(t){oe([T,T.upload],(function(e){e.addEventListener(t,(function(e){ce(i,"htmx:xhr:"+t,{lengthComputable:e.lengthComputable,loaded:e.loaded,total:e.total})}))}))})),ce(i,"htmx:beforeSend",$);var X=N?null:Er(T,i,z);return T.send(X),l}function Pr(t,e){var i=e.xhr,r=null,s=null;if(O(i,/HX-Push:/i)?(r=i.getResponseHeader("HX-Push"),s="push"):O(i,/HX-Push-Url:/i)?(r=i.getResponseHeader("HX-Push-Url"),s="push"):O(i,/HX-Replace-Url:/i)&&(r=i.getResponseHeader("HX-Replace-Url"),s="replace"),r)return"false"===r?{}:{type:s,path:r};var n=e.pathInfo.finalRequestPath,o=e.pathInfo.responsePath,a=ne(t,"hx-push-url"),l=ne(t,"hx-replace-url"),c=ae(t).boosted,h=null,u=null;return a?(h="push",u=a):l?(h="replace",u=l):c&&(h="push",u=o||n),u?"false"===u?{}:("true"===u&&(u=o||n),e.pathInfo.anchor&&-1===u.indexOf("#")&&(u=u+"#"+e.pathInfo.anchor),{type:h,path:u}):{}}function Mr(t,e){var i=e.xhr,r=e.target,s=e.etc,n=(e.requestConfig,e.select);if(ce(t,"htmx:beforeOnLoad",e)){if(O(i,/HX-Trigger:/i)&&_e(i,"HX-Trigger",t),O(i,/HX-Location:/i)){er();var o=i.getResponseHeader("HX-Location");return 0===o.indexOf("{")&&(f=E(o),o=f.path,delete f.path),void Nr("GET",o,f).then((function(){tr(o)}))}var a=O(i,/HX-Refresh:/i)&&"true"===i.getResponseHeader("HX-Refresh");if(O(i,/HX-Redirect:/i))return location.href=i.getResponseHeader("HX-Redirect"),void(a&&location.reload());if(a)location.reload();else{O(i,/HX-Retarget:/i)&&("this"===i.getResponseHeader("HX-Retarget")?e.target=t:e.target=ue(t,i.getResponseHeader("HX-Retarget")));var l=Pr(t,e),c=i.status>=200&&i.status<400&&204!==i.status,h=i.response,u=i.status>=400,d=Q.config.ignoreTitle,p=le({shouldSwap:c,serverResponse:h,isError:u,ignoreTitle:d},e);if(ce(r,"htmx:beforeSwap",p)){if(r=p.target,h=p.serverResponse,u=p.isError,d=p.ignoreTitle,e.target=r,e.failed=u,e.successful=!u,p.shouldSwap){286===i.status&&at(t),R(t,(function(e){h=e.transformResponse(h,i,t)})),l.type&&er();var f,m=s.swapOverride;O(i,/HX-Reswap:/i)&&(m=i.getResponseHeader("HX-Reswap")),(f=wr(t,m)).hasOwnProperty("ignoreTitle")&&(d=f.ignoreTitle),r.classList.add(Q.config.swappingClass);var g=null,y=null,_=function(){try{var s,o=document.activeElement,a={};try{a={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null}}catch(o){}n&&(s=n),O(i,/HX-Reselect:/i)&&(s=i.getResponseHeader("HX-Reselect")),l.type&&(ce(re().body,"htmx:beforeHistoryUpdate",le({history:l},e)),"push"===l.type?(tr(l.path),ce(re().body,"htmx:pushedIntoHistory",{path:l.path})):(rr(l.path),ce(re().body,"htmx:replacedInHistory",{path:l.path})));var c=T(r);if(je(f.swapStyle,r,t,h,c,s),a.elt&&!se(a.elt)&&ee(a.elt,"id")){var u=document.getElementById(ee(a.elt,"id")),p={preventScroll:void 0!==f.focusScroll?!f.focusScroll:!Q.config.defaultFocusScroll};if(u){if(a.start&&u.setSelectionRange)try{u.setSelectionRange(a.start,a.end)}catch(o){}u.focus(p)}}if(r.classList.remove(Q.config.swappingClass),oe(c.elts,(function(t){t.classList&&t.classList.add(Q.config.settlingClass),ce(t,"htmx:afterSwap",e)})),O(i,/HX-Trigger-After-Swap:/i)){var m=t;se(t)||(m=re().body),_e(i,"HX-Trigger-After-Swap",m)}var _=function(){if(oe(c.tasks,(function(t){t.call()})),oe(c.elts,(function(t){t.classList&&t.classList.remove(Q.config.settlingClass),ce(t,"htmx:afterSettle",e)})),e.pathInfo.anchor){var r=re().getElementById(e.pathInfo.anchor);r&&r.scrollIntoView({block:"start",behavior:"auto"})}if(c.title&&!d){var s=C("title");s?s.innerHTML=c.title:window.document.title=c.title}if(Cr(c.elts,f),O(i,/HX-Trigger-After-Settle:/i)){var n=t;se(t)||(n=re().body),_e(i,"HX-Trigger-After-Settle",n)}ie(g)};f.settleDelay>0?setTimeout(_,f.settleDelay):_()}catch(o){throw fe(t,"htmx:swapError",e),ie(y),o}},v=Q.config.globalViewTransitions;if(f.hasOwnProperty("transition")&&(v=f.transition),v&&ce(t,"htmx:beforeTransition",e)&&"undefined"!=typeof Promise&&document.startViewTransition){var x=new Promise((function(t,e){g=t,y=e})),b=_;_=function(){document.startViewTransition((function(){return b(),x}))}}f.swapDelay>0?setTimeout(_,f.swapDelay):_()}u&&fe(t,"htmx:responseError",le({error:"Response Status Error Code "+i.status+" from "+e.pathInfo.requestPath},e))}}}}var Xr={};function Dr(){return{init:function(t){return null},onEvent:function(t,e){return!0},transformResponse:function(t,e,i){return t},isInlineSwap:function(t){return!1},handleSwap:function(t,e,i,r){return!1},encodeParameters:function(t,e,i){return null}}}function Ur(t,e){e.init&&e.init(r),Xr[t]=le(Dr(),e)}function Br(t){delete Xr[t]}function Fr(t,e,i){if(null==t)return e;null==e&&(e=[]),null==i&&(i=[]);var r=te(t,"hx-ext");return r&&oe(r.split(","),(function(t){if("ignore:"!=(t=t.replace(/ /g,"")).slice(0,7)){if(i.indexOf(t)<0){var r=Xr[t];r&&e.indexOf(r)<0&&e.push(r)}}else i.push(t.slice(7))})),Fr(u(t),e,i)}var Vr=!1;function jr(t){Vr||"complete"===re().readyState?t():re().addEventListener("DOMContentLoaded",t)}function _r(){!1!==Q.config.includeIndicatorStyles&&re().head.insertAdjacentHTML("beforeend","")}function zr(){var t=re().querySelector('meta[name="htmx-config"]');return t?E(t.content):null}function $r(){var t=zr();t&&(Q.config=le(Q.config,t))}return re().addEventListener("DOMContentLoaded",(function(){Vr=!0})),jr((function(){$r(),_r();var t=re().body;zt(t);var e=re().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");t.addEventListener("htmx:abort",(function(t){var e=ae(t.target);e&&e.xhr&&e.xhr.abort()}));const i=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(t){t.state&&t.state.htmx?(ar(),oe(e,(function(t){ce(t,"htmx:restored",{document:re(),triggerEvent:ce})}))):i&&i(t)},setTimeout((function(){ce(t,"htmx:load",{}),t=null}),0)})),Q}()},__WEBPACK_AMD_DEFINE_ARRAY__=[],void 0===(__WEBPACK_AMD_DEFINE_RESULT__="function"==typeof(__WEBPACK_AMD_DEFINE_FACTORY__=t)?__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports,__WEBPACK_AMD_DEFINE_ARRAY__):__WEBPACK_AMD_DEFINE_FACTORY__)||(module.exports=__WEBPACK_AMD_DEFINE_RESULT__)},551:(t,e,i)=>{"use strict";var r=i(540),s=i(982);function n(t){for(var e="https://reactjs.org/docs/error-decoder.html?invariant="+t,i=1;i
    ',this.debugPanelSize=document.createElement("div"),this.debugPanelSize.classList.add("filter-group","tab-item"),this.debugPanelSize.innerHTML="Size: w ".concat(this.config.width," x h ").concat(this.config.height),this.debugPanel.appendChild(this.debugPanelSize),this.debugPanelBounding=document.createElement("div"),this.debugPanelBounding.classList.add("filter-group","tab-item"),this.debugPanelBounding.innerHTML="Bounds: SW ".concat(this.map.getBounds().getSouthWest().toString(),", NE ").concat(this.map.getBounds().getNorthEast().toString()),this.debugPanel.appendChild(this.debugPanelBounding),this.debugPanelZoom=document.createElement("div"),this.debugPanelZoom.classList.add("filter-group","tab-item"),this.debugPanelZoom.innerHTML="Zoom level: ".concat(Math.floor(this.map.getZoom())),this.debugPanel.appendChild(this.debugPanelZoom),this.map.on("moveend",(function(){t.debugPanelZoom.innerHTML="Zoom level: ".concat(Math.floor(t.map.getZoom())),t.debugPanelBounding.innerHTML="Bounds: SW ".concat(t.map.getBounds().getSouthWest().toString(),", NE ").concat(t.map.getBounds().getNorthEast().toString())}))}},{key:"update",value:function(){this.sources&&this.sources.map((function(t){return t.update()})),this.filters&&this.filters.map((function(t){return t.update()}))}},{key:"sourceData",value:function(t){if("geojson"===t.source.type){var e=this.filters.find((function(e){return e.source===t.sourceId}));e&&e.sourceData(t.isSourceLoaded)}}}],i&&R(t.prototype,i),r&&R(t,r),Object.defineProperty(t,"prototype",{writable:!1}),t;var t,i,r}();window.MapLibre=B;var F=__webpack_require__(540),j=__webpack_require__(338),U=__webpack_require__(418),V=F,q=Symbol.for("react-redux-context"),G="undefined"!=typeof globalThis?globalThis:{};function $(){if(!V.createContext)return{};const t=G[q]??(G[q]=new Map);let e=t.get(V.createContext);return e||(e=V.createContext(null),t.set(V.createContext,e)),e}var H=$(),W=()=>{throw new Error("uSES not initialized!")};function X(t=H){return function(){return V.useContext(t)}}var Z=X(),Y=W,K=(t,e)=>t===e;function Q(t=H){const e=t===H?Z:X(t),i=(t,i={})=>{const{equalityFn:r=K,devModeChecks:s={}}="function"==typeof i?{equalityFn:i}:i;const{store:n,subscription:o,getServerState:a,stabilityCheck:l,identityFunctionCheck:c}=e(),h=(V.useRef(!0),V.useCallback({[t.name]:e=>t(e)}[t.name],[t,l,s.stabilityCheck])),u=Y(o.addNestedSub,n.getState,a||n.getState,h,r);return V.useDebugValue(u),u};return Object.assign(i,{withTypes:()=>i}),i}var J=Q();Symbol.for("react.element"),Symbol.for("react.portal"),Symbol.for("react.fragment"),Symbol.for("react.strict_mode"),Symbol.for("react.profiler"),Symbol.for("react.provider"),Symbol.for("react.context"),Symbol.for("react.server_context"),Symbol.for("react.forward_ref"),Symbol.for("react.suspense"),Symbol.for("react.suspense_list"),Symbol.for("react.memo"),Symbol.for("react.lazy"),Symbol.for("react.offscreen"),Symbol.for("react.client.reference");function tt(t){t()}var et={notify(){},get:()=>[]};function it(t,e){let i,r=et,s=0,n=!1;function o(){c.onStateChange&&c.onStateChange()}function a(){s++,i||(i=e?e.addNestedSub(o):t.subscribe(o),r=function(){let t=null,e=null;return{clear(){t=null,e=null},notify(){tt((()=>{let e=t;for(;e;)e.callback(),e=e.next}))},get(){const e=[];let i=t;for(;i;)e.push(i),i=i.next;return e},subscribe(i){let r=!0;const s=e={callback:i,next:null,prev:e};return s.prev?s.prev.next=s:t=s,function(){r&&null!==t&&(r=!1,s.next?s.next.prev=s.prev:e=s.prev,s.prev?s.prev.next=s.next:t=s.next)}}}}())}function l(){s--,i&&0===s&&(i(),i=void 0,r.clear(),r=et)}const c={addNestedSub:function(t){a();const e=r.subscribe(t);let i=!1;return()=>{i||(i=!0,e(),l())}},notifyNestedSubs:function(){r.notify()},handleChangeWrapper:o,isSubscribed:function(){return n},trySubscribe:function(){n||(n=!0,a())},tryUnsubscribe:function(){n&&(n=!1,l())},getListeners:()=>r};return c}var rt=!("undefined"==typeof window||void 0===window.document||void 0===window.document.createElement),st="undefined"!=typeof navigator&&"ReactNative"===navigator.product,nt=rt||st?V.useLayoutEffect:V.useEffect;function ot(t,e){return t===e?0!==t||0!==e||1/t==1/e:t!=t&&e!=e}function at(t,e){if(ot(t,e))return!0;if("object"!=typeof t||null===t||"object"!=typeof e||null===e)return!1;const i=Object.keys(t),r=Object.keys(e);if(i.length!==r.length)return!1;for(let r=0;r{const e=it(t);return{store:t,subscription:e,getServerState:r?()=>r:void 0,stabilityCheck:s,identityFunctionCheck:n}}),[t,r,s,n]),a=V.useMemo((()=>t.getState()),[t]);nt((()=>{const{subscription:e}=o;return e.onStateChange=e.notifyNestedSubs,e.trySubscribe(),a!==t.getState()&&e.notifyNestedSubs(),()=>{e.tryUnsubscribe(),e.onStateChange=void 0}}),[o,a]);const l=e||H;return V.createElement(l.Provider,{value:o},i)};function ct(t=H){const e=t===H?Z:X(t),i=()=>{const{store:t}=e();return t};return Object.assign(i,{withTypes:()=>i}),i}var ht=ct();function ut(t=H){const e=t===H?ht:ct(t),i=()=>e().dispatch;return Object.assign(i,{withTypes:()=>i}),i}var dt,pt=ut(),ft=tt;dt=U.useSyncExternalStoreWithSelector,Y=dt,(t=>{t})(F.useSyncExternalStore);var mt=__webpack_require__(783),gt=__webpack_require__(316),yt=__webpack_require__.n(gt),_t=__webpack_require__(159),vt=__webpack_require__.n(_t);function xt(t){return`Minified Redux error #${t}; visit https://redux.js.org/Errors?code=${t} for the full message or use the non-minified dev environment for full errors. `}var bt=(()=>"function"==typeof Symbol&&Symbol.observable||"@@observable")(),wt=()=>Math.random().toString(36).substring(7).split("").join("."),St={INIT:`@@redux/INIT${wt()}`,REPLACE:`@@redux/REPLACE${wt()}`,PROBE_UNKNOWN_ACTION:()=>`@@redux/PROBE_UNKNOWN_ACTION${wt()}`};function Ct(t){if("object"!=typeof t||null===t)return!1;let e=t;for(;null!==Object.getPrototypeOf(e);)e=Object.getPrototypeOf(e);return Object.getPrototypeOf(t)===e||null===Object.getPrototypeOf(t)}function Tt(t,e,i){if("function"!=typeof t)throw new Error(xt(2));if("function"==typeof e&&"function"==typeof i||"function"==typeof i&&"function"==typeof arguments[3])throw new Error(xt(0));if("function"==typeof e&&void 0===i&&(i=e,e=void 0),void 0!==i){if("function"!=typeof i)throw new Error(xt(1));return i(Tt)(t,e)}let r=t,s=e,n=new Map,o=n,a=0,l=!1;function c(){o===n&&(o=new Map,n.forEach(((t,e)=>{o.set(e,t)})))}function h(){if(l)throw new Error(xt(3));return s}function u(t){if("function"!=typeof t)throw new Error(xt(4));if(l)throw new Error(xt(5));let e=!0;c();const i=a++;return o.set(i,t),function(){if(e){if(l)throw new Error(xt(6));e=!1,c(),o.delete(i),n=null}}}function d(t){if(!Ct(t))throw new Error(xt(7));if(void 0===t.type)throw new Error(xt(8));if("string"!=typeof t.type)throw new Error(xt(17));if(l)throw new Error(xt(9));try{l=!0,s=r(s,t)}finally{l=!1}return(n=o).forEach((t=>{t()})),t}d({type:St.INIT});return{dispatch:d,subscribe:u,getState:h,replaceReducer:function(t){if("function"!=typeof t)throw new Error(xt(10));r=t,d({type:St.REPLACE})},[bt]:function(){const t=u;return{subscribe(e){if("object"!=typeof e||null===e)throw new Error(xt(11));function i(){const t=e;t.next&&t.next(h())}i();return{unsubscribe:t(i)}},[bt](){return this}}}}}function kt(t){const e=Object.keys(t),i={};for(let r=0;r{const i=t[e];if(void 0===i(void 0,{type:St.INIT}))throw new Error(xt(12));if(void 0===i(void 0,{type:St.PROBE_UNKNOWN_ACTION()}))throw new Error(xt(13))}))}(i)}catch(t){s=t}return function(t={},e){if(s)throw s;let n=!1;const o={};for(let s=0;st:1===t.length?t[0]:t.reduce(((t,e)=>(...i)=>t(e(...i))))}function At(t){return Ct(t)&&"type"in t&&"string"==typeof t.type}var Mt=Symbol.for("immer-nothing"),Pt=Symbol.for("immer-draftable"),It=Symbol.for("immer-state");function Lt(t,...e){throw new Error(`[Immer] minified error nr: ${t}. Full error at: https://bit.ly/3cXEKWf`)}var Dt=Object.getPrototypeOf;function zt(t){return!!t&&!!t[It]}function Ot(t){return!!t&&(Nt(t)||Array.isArray(t)||!!t[Pt]||!!t.constructor?.[Pt]||qt(t)||Gt(t))}var Rt=Object.prototype.constructor.toString();function Nt(t){if(!t||"object"!=typeof t)return!1;const e=Dt(t);if(null===e)return!0;const i=Object.hasOwnProperty.call(e,"constructor")&&e.constructor;return i===Object||"function"==typeof i&&Function.toString.call(i)===Rt}function Bt(t,e){0===Ft(t)?Reflect.ownKeys(t).forEach((i=>{e(i,t[i],t)})):t.forEach(((i,r)=>e(r,i,t)))}function Ft(t){const e=t[It];return e?e.type_:Array.isArray(t)?1:qt(t)?2:Gt(t)?3:0}function jt(t,e){return 2===Ft(t)?t.has(e):Object.prototype.hasOwnProperty.call(t,e)}function Ut(t,e){return 2===Ft(t)?t.get(e):t[e]}function Vt(t,e,i){const r=Ft(t);2===r?t.set(e,i):3===r?t.add(i):t[e]=i}function qt(t){return t instanceof Map}function Gt(t){return t instanceof Set}function $t(t){return t.copy_||t.base_}function Ht(t,e){if(qt(t))return new Map(t);if(Gt(t))return new Set(t);if(Array.isArray(t))return Array.prototype.slice.call(t);const i=Nt(t);if(!0===e||"class_only"===e&&!i){const e=Object.getOwnPropertyDescriptors(t);delete e[It];let i=Reflect.ownKeys(e);for(let r=0;r1&&(t.set=t.add=t.clear=t.delete=Xt),Object.freeze(t),e&&Object.entries(t).forEach((([t,e])=>Wt(e,!0)))),t}function Xt(){Lt(2)}function Zt(t){return Object.isFrozen(t)}var Yt,Kt={};function Qt(t){const e=Kt[t];return e||Lt(0),e}function Jt(t,e){Kt[t]||(Kt[t]=e)}function te(){return Yt}function ee(t,e){e&&(Qt("Patches"),t.patches_=[],t.inversePatches_=[],t.patchListener_=e)}function ie(t){re(t),t.drafts_.forEach(ne),t.drafts_=null}function re(t){t===Yt&&(Yt=t.parent_)}function se(t){return Yt={drafts_:[],parent_:Yt,immer_:t,canAutoFreeze_:!0,unfinalizedDrafts_:0}}function ne(t){const e=t[It];0===e.type_||1===e.type_?e.revoke_():e.revoked_=!0}function oe(t,e){e.unfinalizedDrafts_=e.drafts_.length;const i=e.drafts_[0];return void 0!==t&&t!==i?(i[It].modified_&&(ie(e),Lt(4)),Ot(t)&&(t=ae(e,t),e.parent_||ce(e,t)),e.patches_&&Qt("Patches").generateReplacementPatches_(i[It].base_,t,e.patches_,e.inversePatches_)):t=ae(e,i,[]),ie(e),e.patches_&&e.patchListener_(e.patches_,e.inversePatches_),t!==Mt?t:void 0}function ae(t,e,i){if(Zt(e))return e;const r=e[It];if(!r)return Bt(e,((s,n)=>le(t,r,e,s,n,i))),e;if(r.scope_!==t)return e;if(!r.modified_)return ce(t,r.base_,!0),r.base_;if(!r.finalized_){r.finalized_=!0,r.scope_.unfinalizedDrafts_--;const e=r.copy_;let s=e,n=!1;3===r.type_&&(s=new Set(e),e.clear(),n=!0),Bt(s,((s,o)=>le(t,r,e,s,o,i,n))),ce(t,e,!1),i&&t.patches_&&Qt("Patches").generatePatches_(r,i,t.patches_,t.inversePatches_)}return r.copy_}function le(t,e,i,r,s,n,o){if(zt(s)){const o=ae(t,s,n&&e&&3!==e.type_&&!jt(e.assigned_,r)?n.concat(r):void 0);if(Vt(i,r,o),!zt(o))return;t.canAutoFreeze_=!1}else o&&i.add(s);if(Ot(s)&&!Zt(s)){if(!t.immer_.autoFreeze_&&t.unfinalizedDrafts_<1)return;ae(t,s),e&&e.scope_.parent_||"symbol"==typeof r||!Object.prototype.propertyIsEnumerable.call(i,r)||ce(t,s)}}function ce(t,e,i=!1){!t.parent_&&t.immer_.autoFreeze_&&t.canAutoFreeze_&&Wt(e,i)}var he={get(t,e){if(e===It)return t;const i=$t(t);if(!jt(i,e))return function(t,e,i){const r=pe(e,i);return r?"value"in r?r.value:r.get?.call(t.draft_):void 0}(t,i,e);const r=i[e];return t.finalized_||!Ot(r)?r:r===de(t.base_,e)?(me(t),t.copy_[e]=ge(r,t)):r},has:(t,e)=>e in $t(t),ownKeys:t=>Reflect.ownKeys($t(t)),set(t,e,i){const r=pe($t(t),e);if(r?.set)return r.set.call(t.draft_,i),!0;if(!t.modified_){const r=de($t(t),e),o=r?.[It];if(o&&o.base_===i)return t.copy_[e]=i,t.assigned_[e]=!1,!0;if(((s=i)===(n=r)?0!==s||1/s==1/n:s!=s&&n!=n)&&(void 0!==i||jt(t.base_,e)))return!0;me(t),fe(t)}var s,n;return t.copy_[e]===i&&(void 0!==i||e in t.copy_)||Number.isNaN(i)&&Number.isNaN(t.copy_[e])||(t.copy_[e]=i,t.assigned_[e]=!0),!0},deleteProperty:(t,e)=>(void 0!==de(t.base_,e)||e in t.base_?(t.assigned_[e]=!1,me(t),fe(t)):delete t.assigned_[e],t.copy_&&delete t.copy_[e],!0),getOwnPropertyDescriptor(t,e){const i=$t(t),r=Reflect.getOwnPropertyDescriptor(i,e);return r?{writable:!0,configurable:1!==t.type_||"length"!==e,enumerable:r.enumerable,value:i[e]}:r},defineProperty(){Lt(11)},getPrototypeOf:t=>Dt(t.base_),setPrototypeOf(){Lt(12)}},ue={};function de(t,e){const i=t[It];return(i?$t(i):t)[e]}function pe(t,e){if(!(e in t))return;let i=Dt(t);for(;i;){const t=Object.getOwnPropertyDescriptor(i,e);if(t)return t;i=Dt(i)}}function fe(t){t.modified_||(t.modified_=!0,t.parent_&&fe(t.parent_))}function me(t){t.copy_||(t.copy_=Ht(t.base_,t.scope_.immer_.useStrictShallowCopy_))}Bt(he,((t,e)=>{ue[t]=function(){return arguments[0]=arguments[0][0],e.apply(this,arguments)}})),ue.deleteProperty=function(t,e){return ue.set.call(this,t,e,void 0)},ue.set=function(t,e,i){return he.set.call(this,t[0],e,i,t[0])};function ge(t,e){const i=qt(t)?Qt("MapSet").proxyMap_(t,e):Gt(t)?Qt("MapSet").proxySet_(t,e):function(t,e){const i=Array.isArray(t),r={type_:i?1:0,scope_:e?e.scope_:te(),modified_:!1,finalized_:!1,assigned_:{},parent_:e,base_:t,draft_:null,copy_:null,revoke_:null,isManual_:!1};let s=r,n=he;i&&(s=[r],n=ue);const{revoke:o,proxy:a}=Proxy.revocable(s,n);return r.draft_=a,r.revoke_=o,a}(t,e);return(e?e.scope_:te()).drafts_.push(i),i}function ye(t){return zt(t)||Lt(10),_e(t)}function _e(t){if(!Ot(t)||Zt(t))return t;const e=t[It];let i;if(e){if(!e.modified_)return e.base_;e.finalized_=!0,i=Ht(t,e.scope_.immer_.useStrictShallowCopy_)}else i=Ht(t,!0);return Bt(i,((t,e)=>{Vt(i,t,_e(e))})),e&&(e.finalized_=!1),i}function ve(){const t="replace",e="add",i="remove";function r(t){if(!Ot(t))return t;if(Array.isArray(t))return t.map(r);if(qt(t))return new Map(Array.from(t.entries()).map((([t,e])=>[t,r(e)])));if(Gt(t))return new Set(Array.from(t).map(r));const e=Object.create(Dt(t));for(const i in t)e[i]=r(t[i]);return jt(t,Pt)&&(e[Pt]=t[Pt]),e}function s(t){return zt(t)?r(t):t}Jt("Patches",{applyPatches_:function(s,n){return n.forEach((n=>{const{path:o,op:a}=n;let l=s;for(let t=0;t{const u=Ut(l,r),d=Ut(c,r),p=h?jt(l,r)?t:e:i;if(u===d&&p===t)return;const f=n.concat(r);o.push(p===i?{op:p,path:f}:{op:p,path:f,value:d}),a.push(p===e?{op:i,path:f}:p===i?{op:e,path:f,value:s(u)}:{op:t,path:f,value:s(u)})}))}(r,n,o,a);case 1:return function(r,n,o,a){let{base_:l,assigned_:c}=r,h=r.copy_;h.length{if(!a.has(t)){const o=r.concat([l]);s.push({op:i,path:o,value:t}),n.unshift({op:e,path:o,value:t})}l++})),l=0,a.forEach((t=>{if(!o.has(t)){const o=r.concat([l]);s.push({op:e,path:o,value:t}),n.unshift({op:i,path:o,value:t})}l++}))}(r,n,o,a)}},generateReplacementPatches_:function(e,i,r,s){r.push({op:t,path:[],value:i===Mt?void 0:i}),s.push({op:t,path:[],value:e})}})}var xe=new class{constructor(t){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.produce=(t,e,i)=>{if("function"==typeof t&&"function"!=typeof e){const i=e;e=t;const r=this;return function(t=i,...s){return r.produce(t,(t=>e.call(this,t,...s)))}}let r;if("function"!=typeof e&&Lt(6),void 0!==i&&"function"!=typeof i&&Lt(7),Ot(t)){const s=se(this),n=ge(t,void 0);let o=!0;try{r=e(n),o=!1}finally{o?ie(s):re(s)}return ee(s,i),oe(r,s)}if(!t||"object"!=typeof t){if(r=e(t),void 0===r&&(r=t),r===Mt&&(r=void 0),this.autoFreeze_&&Wt(r,!0),i){const e=[],s=[];Qt("Patches").generateReplacementPatches_(t,r,e,s),i(e,s)}return r}Lt(1)},this.produceWithPatches=(t,e)=>{if("function"==typeof t)return(e,...i)=>this.produceWithPatches(e,(e=>t(e,...i)));let i,r;return[this.produce(t,e,((t,e)=>{i=t,r=e})),i,r]},"boolean"==typeof t?.autoFreeze&&this.setAutoFreeze(t.autoFreeze),"boolean"==typeof t?.useStrictShallowCopy&&this.setUseStrictShallowCopy(t.useStrictShallowCopy)}createDraft(t){Ot(t)||Lt(8),zt(t)&&(t=ye(t));const e=se(this),i=ge(t,void 0);return i[It].isManual_=!0,re(e),i}finishDraft(t,e){const i=t&&t[It];i&&i.isManual_||Lt(9);const{scope_:r}=i;return ee(r,e),oe(void 0,r)}setAutoFreeze(t){this.autoFreeze_=t}setUseStrictShallowCopy(t){this.useStrictShallowCopy_=t}applyPatches(t,e){let i;for(i=e.length-1;i>=0;i--){const r=e[i];if(0===r.path.length&&"replace"===r.op){t=r.value;break}}i>-1&&(e=e.slice(i+1));const r=Qt("Patches").applyPatches_;return zt(t)?r(t,e):this.produce(t,(t=>r(t,e)))}},be=xe.produce,we=xe.produceWithPatches.bind(xe),Se=(xe.setAutoFreeze.bind(xe),xe.setUseStrictShallowCopy.bind(xe),xe.applyPatches.bind(xe));xe.createDraft.bind(xe),xe.finishDraft.bind(xe);function Ce(t,e="expected a function, instead received "+typeof t){if("function"!=typeof t)throw new TypeError(e)}var Te=t=>Array.isArray(t)?t:[t];function ke(t){const e=Array.isArray(t[0])?t[0]:t;return function(t,e="expected all items to be functions, instead received the following types: "){if(!t.every((t=>"function"==typeof t))){const i=t.map((t=>"function"==typeof t?`function ${t.name||"unnamed"}()`:typeof t)).join(", ");throw new TypeError(`${e}[${i}]`)}}(e,"createSelector expects all input-selectors to be functions, but received the following types: "),e}Symbol(),Object.getPrototypeOf({});var Ee="undefined"!=typeof WeakRef?WeakRef:class{constructor(t){this.value=t}deref(){return this.value}},Ae=0,Me=1;function Pe(){return{s:Ae,v:void 0,o:null,p:null}}function Ie(t,e={}){let i=Pe();const{resultEqualityCheck:r}=e;let s,n=0;function o(){let e=i;const{length:o}=arguments;for(let t=0,i=o;t{i=Pe(),o.resetResultsCount()},o.resultsCount=()=>n,o.resetResultsCount=()=>{n=0},o}function Le(t,...e){const i="function"==typeof t?{memoize:t,memoizeOptions:e}:t,r=(...t)=>{let e,r=0,s=0,n={},o=t.pop();"object"==typeof o&&(n=o,o=t.pop()),Ce(o,`createSelector expects an output function after the inputs, but received: [${typeof o}]`);const a={...i,...n},{memoize:l,memoizeOptions:c=[],argsMemoize:h=Ie,argsMemoizeOptions:u=[],devModeChecks:d={}}=a,p=Te(c),f=Te(u),m=ke(t),g=l((function(){return r++,o.apply(null,arguments)}),...p);const y=h((function(){s++;const t=function(t,e){const i=[],{length:r}=t;for(let s=0;ss,resetDependencyRecomputations:()=>{s=0},lastResult:()=>e,recomputations:()=>r,resetRecomputations:()=>{r=0},memoize:l,argsMemoize:h})};return Object.assign(r,{withTypes:()=>r}),r}var De=Le(Ie),ze=Object.assign(((t,e=De)=>{!function(t,e="expected an object, instead received "+typeof t){if("object"!=typeof t)throw new TypeError(e)}(t,"createStructuredSelector expects first argument to be an object where each property is a selector, instead received a "+typeof t);const i=Object.keys(t);return e(i.map((e=>t[e])),((...t)=>t.reduce(((t,e,r)=>(t[i[r]]=e,t)),{})))}),{withTypes:()=>ze});function Oe(t){return({dispatch:e,getState:i})=>r=>s=>"function"==typeof s?s(e,i,t):r(s)}var Re=Oe(),Ne=Oe,Be=(((...t)=>{const e=Le(...t),i=Object.assign(((...t)=>{const i=e(...t),r=(t,...e)=>i(zt(t)?ye(t):t,...e);return Object.assign(r,i),r}),{withTypes:()=>i})})(Ie),"undefined"!=typeof window&&window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__?window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__:function(){if(0!==arguments.length)return"object"==typeof arguments[0]?Et:Et.apply(null,arguments)}),Fe=("undefined"!=typeof window&&window.__REDUX_DEVTOOLS_EXTENSION__&&window.__REDUX_DEVTOOLS_EXTENSION__,t=>t&&"function"==typeof t.match);function je(t,e){function i(...i){if(e){let r=e(...i);if(!r)throw new Error(ki(0));return{type:t,payload:r.payload,..."meta"in r&&{meta:r.meta},..."error"in r&&{error:r.error}}}return{type:t,payload:i[0]}}return i.toString=()=>`${t}`,i.type=t,i.match=e=>At(e)&&e.type===t,i}var Ue=class t extends Array{constructor(...e){super(...e),Object.setPrototypeOf(this,t.prototype)}static get[Symbol.species](){return t}concat(...t){return super.concat.apply(this,t)}prepend(...e){return 1===e.length&&Array.isArray(e[0])?new t(...e[0].concat(this)):new t(...e.concat(this))}};function Ve(t){return Ot(t)?be(t,(()=>{})):t}function qe(t,e,i){if(t.has(e)){let r=t.get(e);return i.update&&(r=i.update(r,e,t),t.set(e,r)),r}if(!i.insert)throw new Error(ki(10));const r=i.insert(e,t);return t.set(e,r),r}var Ge="RTK_autoBatch",$e=()=>t=>({payload:t,meta:{[Ge]:!0}}),He=t=>e=>{setTimeout(e,t)},We="undefined"!=typeof window&&window.requestAnimationFrame?window.requestAnimationFrame:He(10),Xe=t=>function(e){const{autoBatch:i=!0}=e??{};let r=new Ue(t);return i&&r.push(((t={type:"raf"})=>e=>(...i)=>{const r=e(...i);let s=!0,n=!1,o=!1;const a=new Set,l="tick"===t.type?queueMicrotask:"raf"===t.type?We:"callback"===t.type?t.queueNotification:He(t.timeout),c=()=>{o=!1,n&&(n=!1,a.forEach((t=>t())))};return Object.assign({},r,{subscribe(t){const e=r.subscribe((()=>s&&t()));return a.add(t),()=>{e(),a.delete(t)}},dispatch(t){try{return s=!t?.meta?.[Ge],n=!s,n&&(o||(o=!0,l(c))),r.dispatch(t)}finally{s=!0}}})})("object"==typeof i?i:void 0)),r};function Ze(t){const e={},i=[];let r;const s={addCase(t,i){const r="string"==typeof t?t:t.type;if(!r)throw new Error(ki(28));if(r in e)throw new Error(ki(29));return e[r]=i,s},addMatcher:(t,e)=>(i.push({matcher:t,reducer:e}),s),addDefaultCase:t=>(r=t,s)};return t(s),[e,i,r]}var Ye=(t=21)=>{let e="",i=t;for(;i--;)e+="ModuleSymbhasOwnPr-0123456789ABCDEFGHNRVfgctiUvz_KqYTJkLxpZXIjQW"[64*Math.random()|0];return e},Ke=(t,e)=>Fe(t)?t.match(e):t(e);function Qe(...t){return e=>t.some((t=>Ke(t,e)))}function Je(...t){return e=>t.every((t=>Ke(t,e)))}function ti(t,e){if(!t||!t.meta)return!1;const i="string"==typeof t.meta.requestId,r=e.indexOf(t.meta.requestStatus)>-1;return i&&r}function ei(t){return"function"==typeof t[0]&&"pending"in t[0]&&"fulfilled"in t[0]&&"rejected"in t[0]}function ii(...t){return 0===t.length?t=>ti(t,["pending"]):ei(t)?Qe(...t.map((t=>t.pending))):ii()(t[0])}function ri(...t){return 0===t.length?t=>ti(t,["rejected"]):ei(t)?Qe(...t.map((t=>t.rejected))):ri()(t[0])}function si(...t){const e=t=>t&&t.meta&&t.meta.rejectedWithValue;return 0===t.length||ei(t)?Je(ri(...t),e):si()(t[0])}function ni(...t){return 0===t.length?t=>ti(t,["fulfilled"]):ei(t)?Qe(...t.map((t=>t.fulfilled))):ni()(t[0])}function oi(...t){return 0===t.length?t=>ti(t,["pending","fulfilled","rejected"]):ei(t)?Qe(...t.flatMap((t=>[t.pending,t.rejected,t.fulfilled]))):oi()(t[0])}var ai=["name","message","stack","code"],li=class{constructor(t,e){this.payload=t,this.meta=e}_type},ci=class{constructor(t,e){this.payload=t,this.meta=e}_type},hi=t=>{if("object"==typeof t&&null!==t){const e={};for(const i of ai)"string"==typeof t[i]&&(e[i]=t[i]);return e}return{message:String(t)}},ui=(()=>{function t(t,e,i){const r=je(t+"/fulfilled",((t,e,i,r)=>({payload:t,meta:{...r||{},arg:i,requestId:e,requestStatus:"fulfilled"}}))),s=je(t+"/pending",((t,e,i)=>({payload:void 0,meta:{...i||{},arg:e,requestId:t,requestStatus:"pending"}}))),n=je(t+"/rejected",((t,e,r,s,n)=>({payload:s,error:(i&&i.serializeError||hi)(t||"Rejected"),meta:{...n||{},arg:r,requestId:e,rejectedWithValue:!!s,requestStatus:"rejected",aborted:"AbortError"===t?.name,condition:"ConditionError"===t?.name}})));return Object.assign((function(t){return(o,a,l)=>{const c=i?.idGenerator?i.idGenerator(t):Ye(),h=new AbortController;let u,d;function p(t){d=t,h.abort()}const f=async function(){let f;try{let n=i?.condition?.(t,{getState:a,extra:l});if(null!==(m=n)&&"object"==typeof m&&"function"==typeof m.then&&(n=await n),!1===n||h.signal.aborted)throw{name:"ConditionError",message:"Aborted due to condition callback returning false."};const g=new Promise(((t,e)=>{u=()=>{e({name:"AbortError",message:d||"Aborted"})},h.signal.addEventListener("abort",u)}));o(s(c,t,i?.getPendingMeta?.({requestId:c,arg:t},{getState:a,extra:l}))),f=await Promise.race([g,Promise.resolve(e(t,{dispatch:o,getState:a,extra:l,requestId:c,signal:h.signal,abort:p,rejectWithValue:(t,e)=>new li(t,e),fulfillWithValue:(t,e)=>new ci(t,e)})).then((e=>{if(e instanceof li)throw e;return e instanceof ci?r(e.payload,c,t,e.meta):r(e,c,t)}))])}catch(e){f=e instanceof li?n(null,c,t,e.payload,e.meta):n(e,c,t)}finally{u&&h.signal.removeEventListener("abort",u)}var m;return i&&!i.dispatchConditionRejection&&n.match(f)&&f.meta.condition||o(f),f}();return Object.assign(f,{abort:p,requestId:c,arg:t,unwrap:()=>f.then(di)})}}),{pending:s,rejected:n,fulfilled:r,settled:Qe(n,r),typePrefix:t})}return t.withTypes=()=>t,t})();function di(t){if(t.meta&&t.meta.rejectedWithValue)throw t.payload;if(t.error)throw t.error;return t.payload}var pi=Symbol.for("rtk-slice-createasyncthunk");function fi(t,e){return`${t}/${e}`}function mi({creators:t}={}){const e=t?.asyncThunk?.[pi];return function(t){const{name:i,reducerPath:r=i}=t;if(!i)throw new Error(ki(11));const s=("function"==typeof t.reducers?t.reducers(function(){function t(t,e){return{_reducerDefinitionType:"asyncThunk",payloadCreator:t,...e}}return t.withTypes=()=>t,{reducer:t=>Object.assign({[t.name]:(...e)=>t(...e)}[t.name],{_reducerDefinitionType:"reducer"}),preparedReducer:(t,e)=>({_reducerDefinitionType:"reducerWithPrepare",prepare:t,reducer:e}),asyncThunk:t}}()):t.reducers)||{},n=Object.keys(s),o={sliceCaseReducersByName:{},sliceCaseReducersByType:{},actionCreators:{},sliceMatchers:[]},a={addCase(t,e){const i="string"==typeof t?t:t.type;if(!i)throw new Error(ki(12));if(i in o.sliceCaseReducersByType)throw new Error(ki(13));return o.sliceCaseReducersByType[i]=e,a},addMatcher:(t,e)=>(o.sliceMatchers.push({matcher:t,reducer:e}),a),exposeAction:(t,e)=>(o.actionCreators[t]=e,a),exposeCaseReducer:(t,e)=>(o.sliceCaseReducersByName[t]=e,a)};function l(){const[e={},i=[],r]="function"==typeof t.extraReducers?Ze(t.extraReducers):[t.extraReducers],s={...e,...o.sliceCaseReducersByType};return function(t,e){let i,[r,s,n]=Ze(e);if("function"==typeof t)i=()=>Ve(t());else{const e=Ve(t);i=()=>e}function o(t=i(),e){let o=[r[e.type],...s.filter((({matcher:t})=>t(e))).map((({reducer:t})=>t))];return 0===o.filter((t=>!!t)).length&&(o=[n]),o.reduce(((t,i)=>{if(i){if(zt(t)){const r=i(t,e);return void 0===r?t:r}if(Ot(t))return be(t,(t=>i(t,e)));{const r=i(t,e);if(void 0===r){if(null===t)return t;throw new Error(ki(9))}return r}}return t}),t)}return o.getInitialState=i,o}(t.initialState,(t=>{for(let e in s)t.addCase(e,s[e]);for(let e of o.sliceMatchers)t.addMatcher(e.matcher,e.reducer);for(let e of i)t.addMatcher(e.matcher,e.reducer);r&&t.addDefaultCase(r)}))}n.forEach((r=>{const n=s[r],o={reducerName:r,type:fi(i,r),createNotation:"function"==typeof t.reducers};!function(t){return"asyncThunk"===t._reducerDefinitionType}(n)?function({type:t,reducerName:e,createNotation:i},r,s){let n,o;if("reducer"in r){if(i&&!function(t){return"reducerWithPrepare"===t._reducerDefinitionType}(r))throw new Error(ki(17));n=r.reducer,o=r.prepare}else n=r;s.addCase(t,n).exposeCaseReducer(e,n).exposeAction(e,o?je(t,o):je(t))}(o,n,a):function({type:t,reducerName:e},i,r,s){if(!s)throw new Error(ki(18));const{payloadCreator:n,fulfilled:o,pending:a,rejected:l,settled:c,options:h}=i,u=s(t,n,h);r.exposeAction(e,u),o&&r.addCase(u.fulfilled,o);a&&r.addCase(u.pending,a);l&&r.addCase(u.rejected,l);c&&r.addMatcher(u.settled,c);r.exposeCaseReducer(e,{fulfilled:o||_i,pending:a||_i,rejected:l||_i,settled:c||_i})}(o,n,a,e)}));const c=t=>t,h=new Map;let u;function d(t,e){return u||(u=l()),u(t,e)}function p(){return u||(u=l()),u.getInitialState()}function f(e,i=!1){function r(t){let r=t[e];return void 0===r&&i&&(r=p()),r}function s(e=c){const r=qe(h,i,{insert:()=>new WeakMap});return qe(r,e,{insert:()=>{const r={};for(const[s,n]of Object.entries(t.selectors??{}))r[s]=gi(n,e,p,i);return r}})}return{reducerPath:e,getSelectors:s,get selectors(){return s(r)},selectSlice:r}}const m={name:i,reducer:d,actions:o.actionCreators,caseReducers:o.sliceCaseReducersByName,getInitialState:p,...f(r),injectInto(t,{reducerPath:e,...i}={}){const s=e??r;return t.inject({reducerPath:s,reducer:d},i),{...m,...f(s,!0)}}};return m}}function gi(t,e,i,r){function s(s,...n){let o=e(s);return void 0===o&&r&&(o=i()),t(o,...n)}return s.unwrapped=t,s}var yi=mi();function _i(){}var vi=(t,e)=>{if("function"!=typeof t)throw new Error(ki(32))};var{assign:xi}=Object,bi="listenerMiddleware",wi=t=>{let{type:e,actionCreator:i,matcher:r,predicate:s,effect:n}=t;if(e)s=je(e).match;else if(i)e=i.type,s=i.match;else if(r)s=r;else if(!s)throw new Error(ki(21));return vi(n),{predicate:s,type:e,effect:n}},Si=Object.assign((t=>{const{type:e,predicate:i,effect:r}=wi(t);return{id:Ye(),effect:r,type:e,predicate:i,pending:new Set,unsubscribe:()=>{throw new Error(ki(22))}}}),{withTypes:()=>Si}),Ci=Object.assign(je(`${bi}/add`),{withTypes:()=>Ci}),Ti=(je(`${bi}/removeAll`),Object.assign(je(`${bi}/remove`),{withTypes:()=>Ti}));Symbol.for("rtk-state-proxy-original");function ki(t){return`Minified Redux Toolkit error #${t}; visit https://redux-toolkit.js.org/Errors?code=${t} for the full message or use the non-minified dev environment for full errors. `}var Ei=(t=>(t.uninitialized="uninitialized",t.pending="pending",t.fulfilled="fulfilled",t.rejected="rejected",t))(Ei||{});var Ai=t=>t.replace(/\/$/,""),Mi=t=>t.replace(/^\//,"");function Pi(t,e){if(!t)return e;if(!e)return t;if(function(t){return new RegExp("(^|:)//").test(t)}(e))return e;const i=t.endsWith("/")||!e.startsWith("?")?"/":"";return`${t=Ai(t)}${i}${e=Mi(e)}`}var Ii=t=>[].concat(...t);var Li=Ct;function Di(t,e){if(t===e||!(Li(t)&&Li(e)||Array.isArray(t)&&Array.isArray(e)))return e;const i=Object.keys(e),r=Object.keys(t);let s=i.length===r.length;const n=Array.isArray(e)?[]:{};for(const r of i)n[r]=Di(t[r],e[r]),s&&(s=t[r]===n[r]);return s?t:n}var zi=(...t)=>fetch(...t),Oi=t=>t.status>=200&&t.status<=299,Ri=t=>/ion\/(vnd\.api\+)?json/.test(t.get("content-type")||"");function Ni(t){if(!Ct(t))return t;const e={...t};for(const[t,i]of Object.entries(e))void 0===i&&delete e[t];return e}var Bi=class{constructor(t,e=void 0){this.value=t,this.meta=e}};var Fi=je("__rtkq/focused"),ji=je("__rtkq/unfocused"),Ui=je("__rtkq/online"),Vi=je("__rtkq/offline"),qi=!1;function Gi(t){return"query"===t.type}function $i(t,e,i,r,s,n){return"function"==typeof t?t(e,i,r,s).map(Hi).map(n):Array.isArray(t)?t.map(Hi).map(n):[]}function Hi(t){return"string"==typeof t?{type:t}:t}function Wi(t){return null!=t}function Xi(t){let e=0;for(const i in t)e++;return e}var Zi=Symbol("forceQueryFn"),Yi=t=>"function"==typeof t[Zi];function Ki(t){return t}function Qi(t,e,i,r){return $i(i[t.meta.arg.endpointName][e],ni(t)?t.payload:void 0,si(t)?t.payload:void 0,t.meta.arg.originalArgs,"baseQueryMeta"in t.meta?t.meta.baseQueryMeta:void 0,r)}function Ji(t,e,i){const r=t[e];r&&i(r)}function tr(t){return("arg"in t?t.arg.fixedCacheKey:t.fixedCacheKey)??t.requestId}function er(t,e,i){const r=t[tr(e)];r&&i(r)}var ir={};function rr({reducerPath:t,queryThunk:e,mutationThunk:i,context:{endpointDefinitions:r,apiUid:s,extractRehydrationInfo:n,hasRehydrationInfo:o},assertTagType:a,config:l}){const c=je(`${t}/resetApiState`),h=yi({name:`${t}/queries`,initialState:ir,reducers:{removeQueryResult:{reducer(t,{payload:{queryCacheKey:e}}){delete t[e]},prepare:$e()},queryResultPatched:{reducer(t,{payload:{queryCacheKey:e,patches:i}}){Ji(t,e,(t=>{t.data=Se(t.data,i.concat())}))},prepare:$e()}},extraReducers(t){t.addCase(e.pending,((t,{meta:e,meta:{arg:i}})=>{const r=Yi(i);t[i.queryCacheKey]??={status:"uninitialized",endpointName:i.endpointName},Ji(t,i.queryCacheKey,(t=>{t.status="pending",t.requestId=r&&t.requestId?t.requestId:e.requestId,void 0!==i.originalArgs&&(t.originalArgs=i.originalArgs),t.startedTimeStamp=e.startedTimeStamp}))})).addCase(e.fulfilled,((t,{meta:e,payload:i})=>{Ji(t,e.arg.queryCacheKey,(t=>{if(t.requestId!==e.requestId&&!Yi(e.arg))return;const{merge:s}=r[e.arg.endpointName];if(t.status="fulfilled",s)if(void 0!==t.data){const{fulfilledTimeStamp:r,arg:n,baseQueryMeta:o,requestId:a}=e;let l=be(t.data,(t=>s(t,i,{arg:n.originalArgs,baseQueryMeta:o,fulfilledTimeStamp:r,requestId:a})));t.data=l}else t.data=i;else t.data=r[e.arg.endpointName].structuralSharing??1?Di(zt(t.data)?(zt(n=t.data)||Lt(15),n[It].base_):t.data,i):i;var n;delete t.error,t.fulfilledTimeStamp=e.fulfilledTimeStamp}))})).addCase(e.rejected,((t,{meta:{condition:e,arg:i,requestId:r},error:s,payload:n})=>{Ji(t,i.queryCacheKey,(t=>{if(e);else{if(t.requestId!==r)return;t.status="rejected",t.error=n??s}}))})).addMatcher(o,((t,e)=>{const{queries:i}=n(e);for(const[e,r]of Object.entries(i))"fulfilled"!==r?.status&&"rejected"!==r?.status||(t[e]=r)}))}}),u=yi({name:`${t}/mutations`,initialState:ir,reducers:{removeMutationResult:{reducer(t,{payload:e}){const i=tr(e);i in t&&delete t[i]},prepare:$e()}},extraReducers(t){t.addCase(i.pending,((t,{meta:e,meta:{requestId:i,arg:r,startedTimeStamp:s}})=>{r.track&&(t[tr(e)]={requestId:i,status:"pending",endpointName:r.endpointName,startedTimeStamp:s})})).addCase(i.fulfilled,((t,{payload:e,meta:i})=>{i.arg.track&&er(t,i,(t=>{t.requestId===i.requestId&&(t.status="fulfilled",t.data=e,t.fulfilledTimeStamp=i.fulfilledTimeStamp)}))})).addCase(i.rejected,((t,{payload:e,error:i,meta:r})=>{r.arg.track&&er(t,r,(t=>{t.requestId===r.requestId&&(t.status="rejected",t.error=e??i)}))})).addMatcher(o,((t,e)=>{const{mutations:i}=n(e);for(const[e,r]of Object.entries(i))"fulfilled"!==r?.status&&"rejected"!==r?.status||e===r?.requestId||(t[e]=r)}))}}),d=yi({name:`${t}/invalidation`,initialState:ir,reducers:{updateProvidedBy:{reducer(t,e){const{queryCacheKey:i,providedTags:r}=e.payload;for(const e of Object.values(t))for(const t of Object.values(e)){const e=t.indexOf(i);-1!==e&&t.splice(e,1)}for(const{type:e,id:s}of r){const r=(t[e]??={})[s||"__internal_without_id"]??=[];r.includes(i)||r.push(i)}},prepare:$e()}},extraReducers(t){t.addCase(h.actions.removeQueryResult,((t,{payload:{queryCacheKey:e}})=>{for(const i of Object.values(t))for(const t of Object.values(i)){const i=t.indexOf(e);-1!==i&&t.splice(i,1)}})).addMatcher(o,((t,e)=>{const{provided:i}=n(e);for(const[e,r]of Object.entries(i))for(const[i,s]of Object.entries(r)){const r=(t[e]??={})[i||"__internal_without_id"]??=[];for(const t of s){r.includes(t)||r.push(t)}}})).addMatcher(Qe(ni(e),si(e)),((t,e)=>{const i=Qi(e,"providesTags",r,a),{queryCacheKey:s}=e.meta.arg;d.caseReducers.updateProvidedBy(t,d.actions.updateProvidedBy({queryCacheKey:s,providedTags:i}))}))}}),p=yi({name:`${t}/subscriptions`,initialState:ir,reducers:{updateSubscriptionOptions(t,e){},unsubscribeQueryResult(t,e){},internal_getRTKQSubscriptions(){}}}),f=yi({name:`${t}/internalSubscriptions`,initialState:ir,reducers:{subscriptionsUpdated:{reducer:(t,e)=>Se(t,e.payload),prepare:$e()}}}),m=yi({name:`${t}/config`,initialState:{online:"undefined"==typeof navigator||void 0===navigator.onLine||navigator.onLine,focused:"undefined"==typeof document||"hidden"!==document.visibilityState,middlewareRegistered:!1,...l},reducers:{middlewareRegistered(t,{payload:e}){t.middlewareRegistered="conflict"!==t.middlewareRegistered&&s===e||"conflict"}},extraReducers:t=>{t.addCase(Ui,(t=>{t.online=!0})).addCase(Vi,(t=>{t.online=!1})).addCase(Fi,(t=>{t.focused=!0})).addCase(ji,(t=>{t.focused=!1})).addMatcher(o,(t=>({...t})))}}),g=kt({queries:h.reducer,mutations:u.reducer,provided:d.reducer,subscriptions:f.reducer,config:m.reducer});return{reducer:(t,e)=>g(c.match(e)?void 0:t,e),actions:{...m.actions,...h.actions,...p.actions,...f.actions,...u.actions,...d.actions,resetApiState:c}}}var sr=Symbol.for("RTKQ/skipToken"),nr={status:"uninitialized"},or=be(nr,(()=>{})),ar=be(nr,(()=>{}));var lr=WeakMap?new WeakMap:void 0,cr=({endpointName:t,queryArgs:e})=>{let i="";const r=lr?.get(e);if("string"==typeof r)i=r;else{const t=JSON.stringify(e,((t,e)=>e=Ct(e="bigint"==typeof e?{$bigint:e.toString()}:e)?Object.keys(e).sort().reduce(((t,i)=>(t[i]=e[i],t)),{}):e));Ct(e)&&lr?.set(e,t),i=t}return`${t}(${i})`};function hr(...t){return function(e){const i=Ie((t=>e.extractRehydrationInfo?.(t,{reducerPath:e.reducerPath??"api"}))),r={reducerPath:"api",keepUnusedDataFor:60,refetchOnMountOrArgChange:!1,refetchOnFocus:!1,refetchOnReconnect:!1,invalidationBehavior:"delayed",...e,extractRehydrationInfo:i,serializeQueryArgs(t){let i=cr;if("serializeQueryArgs"in t.endpointDefinition){const e=t.endpointDefinition.serializeQueryArgs;i=t=>{const i=e(t);return"string"==typeof i?i:cr({...t,queryArgs:i})}}else e.serializeQueryArgs&&(i=e.serializeQueryArgs);return i(t)},tagTypes:[...e.tagTypes||[]]},s={endpointDefinitions:{},batch(t){t()},apiUid:Ye(),extractRehydrationInfo:i,hasRehydrationInfo:Ie((t=>null!=i(t)))},n={injectEndpoints:function(t){const e=t.endpoints({query:t=>({...t,type:"query"}),mutation:t=>({...t,type:"mutation"})});for(const[i,r]of Object.entries(e))if(!0!==t.overrideExisting&&i in s.endpointDefinitions){if("throw"===t.overrideExisting)throw new Error(ki(39))}else{s.endpointDefinitions[i]=r;for(const t of o)t.injectEndpoint(i,r)}return n},enhanceEndpoints({addTagTypes:t,endpoints:e}){if(t)for(const e of t)r.tagTypes.includes(e)||r.tagTypes.push(e);if(e)for(const[t,i]of Object.entries(e))"function"==typeof i?i(s.endpointDefinitions[t]):Object.assign(s.endpointDefinitions[t]||{},i);return n}},o=t.map((t=>t.init(n,r,s)));return n.injectEndpoints({endpoints:e.endpoints})}}var ur=({reducerPath:t,api:e,queryThunk:i,context:r,internalState:s})=>{const{removeQueryResult:n,unsubscribeQueryResult:o}=e.internalActions,a=Qe(o.match,i.fulfilled,i.rejected);function l(t){const e=s.currentSubscriptions[t];return!!e&&!function(t){for(let e in t)return!1;return!0}(e)}const c={};function h(t,e,i,s){const o=r.endpointDefinitions[e],a=o?.keepUnusedDataFor??s.keepUnusedDataFor;if(a===1/0)return;const h=Math.max(0,Math.min(a,2147482.647));if(!l(t)){const e=c[t];e&&clearTimeout(e),c[t]=setTimeout((()=>{l(t)||i.dispatch(n({queryCacheKey:t})),delete c[t]}),1e3*h)}}return(i,s,n)=>{if(a(i)){const e=s.getState()[t],{queryCacheKey:r}=o.match(i)?i.payload:i.meta.arg;h(r,e.queries[r]?.endpointName,s,e.config)}if(e.util.resetApiState.match(i))for(const[t,e]of Object.entries(c))e&&clearTimeout(e),delete c[t];if(r.hasRehydrationInfo(i)){const e=s.getState()[t],{queries:n}=r.extractRehydrationInfo(i);for(const[t,i]of Object.entries(n))h(t,i?.endpointName,s,e.config)}}},dr=({reducerPath:t,context:e,context:{endpointDefinitions:i},mutationThunk:r,queryThunk:s,api:n,assertTagType:o,refetchQuery:a,internalState:l})=>{const{removeQueryResult:c}=n.internalActions,h=Qe(ni(r),si(r)),u=Qe(ni(r,s),ri(r,s));let d=[];function p(i,r){const s=r.getState(),o=s[t];if(d.push(...i),"delayed"===o.config.invalidationBehavior&&function(t){for(const e in t.queries)if("pending"===t.queries[e]?.status)return!0;for(const e in t.mutations)if("pending"===t.mutations[e]?.status)return!0;return!1}(o))return;const h=d;if(d=[],0===h.length)return;const u=n.util.selectInvalidatedBy(s,h);e.batch((()=>{const t=Array.from(u.values());for(const{queryCacheKey:e}of t){const t=o.queries[e],i=l.currentSubscriptions[e]??{};t&&(0===Xi(i)?r.dispatch(c({queryCacheKey:e})):"uninitialized"!==t.status&&r.dispatch(a(t,e)))}}))}return(t,e)=>{h(t)?p(Qi(t,"invalidatesTags",i,o),e):u(t)?p([],e):n.util.invalidateTags.match(t)&&p($i(t.payload,void 0,void 0,void 0,void 0,o),e)}},pr=({reducerPath:t,queryThunk:e,api:i,refetchQuery:r,internalState:s})=>{const n={};function o({queryCacheKey:e},i){const a=i.getState()[t],l=a.queries[e],h=s.currentSubscriptions[e];if(!l||"uninitialized"===l.status)return;const{lowestPollingInterval:u,skipPollingIfUnfocused:d}=c(h);if(!Number.isFinite(u))return;const p=n[e];p?.timeout&&(clearTimeout(p.timeout),p.timeout=void 0);const f=Date.now()+u;n[e]={nextPollTimestamp:f,pollingInterval:u,timeout:setTimeout((()=>{!a.config.focused&&d||i.dispatch(r(l,e)),o({queryCacheKey:e},i)}),u)}}function a({queryCacheKey:e},i){const r=i.getState()[t].queries[e],a=s.currentSubscriptions[e];if(!r||"uninitialized"===r.status)return;const{lowestPollingInterval:h}=c(a);if(!Number.isFinite(h))return void l(e);const u=n[e],d=Date.now()+h;(!u||d{(i.internalActions.updateSubscriptionOptions.match(t)||i.internalActions.unsubscribeQueryResult.match(t))&&a(t.payload,r),(e.pending.match(t)||e.rejected.match(t)&&t.meta.condition)&&a(t.meta.arg,r),(e.fulfilled.match(t)||e.rejected.match(t)&&!t.meta.condition)&&o(t.meta.arg,r),i.util.resetApiState.match(t)&&function(){for(const t of Object.keys(n))l(t)}()}},fr=new Error("Promise never resolved before cacheEntryRemoved."),mr=({api:t,reducerPath:e,context:i,queryThunk:r,mutationThunk:s,internalState:n})=>{const o=oi(r),a=oi(s),l=ni(r,s),c={};function h(e,r,s,n,o){const a=i.endpointDefinitions[e],l=a?.onCacheEntryAdded;if(!l)return;let h={};const u=new Promise((t=>{h.cacheEntryRemoved=t})),d=Promise.race([new Promise((t=>{h.valueResolved=t})),u.then((()=>{throw fr}))]);d.catch((()=>{})),c[s]=h;const p=t.endpoints[e].select("query"===a.type?r:s),f=n.dispatch(((t,e,i)=>i)),m={...n,getCacheEntry:()=>p(n.getState()),requestId:o,extra:f,updateCachedData:"query"===a.type?i=>n.dispatch(t.util.updateQueryData(e,r,i)):void 0,cacheDataLoaded:d,cacheEntryRemoved:u},g=l(r,m);Promise.resolve(g).catch((t=>{if(t!==fr)throw t}))}return(i,n,u)=>{const d=function(e){if(o(e))return e.meta.arg.queryCacheKey;if(a(e))return e.meta.arg.fixedCacheKey??e.meta.requestId;return t.internalActions.removeQueryResult.match(e)?e.payload.queryCacheKey:t.internalActions.removeMutationResult.match(e)?tr(e.payload):""}(i);if(r.pending.match(i)){const t=u[e].queries[d],r=n.getState()[e].queries[d];!t&&r&&h(i.meta.arg.endpointName,i.meta.arg.originalArgs,d,n,i.meta.requestId)}else if(s.pending.match(i)){n.getState()[e].mutations[d]&&h(i.meta.arg.endpointName,i.meta.arg.originalArgs,d,n,i.meta.requestId)}else if(l(i)){const t=c[d];t?.valueResolved&&(t.valueResolved({data:i.payload,meta:i.meta.baseQueryMeta}),delete t.valueResolved)}else if(t.internalActions.removeQueryResult.match(i)||t.internalActions.removeMutationResult.match(i)){const t=c[d];t&&(delete c[d],t.cacheEntryRemoved())}else if(t.util.resetApiState.match(i))for(const[t,e]of Object.entries(c))delete c[t],e.cacheEntryRemoved()}},gr=({api:t,context:e,queryThunk:i,mutationThunk:r})=>{const s=ii(i,r),n=ri(i,r),o=ni(i,r),a={};return(i,r)=>{if(s(i)){const{requestId:s,arg:{endpointName:n,originalArgs:o}}=i.meta,l=e.endpointDefinitions[n],c=l?.onQueryStarted;if(c){const e={},i=new Promise(((t,i)=>{e.resolve=t,e.reject=i}));i.catch((()=>{})),a[s]=e;const h=t.endpoints[n].select("query"===l.type?o:s),u=r.dispatch(((t,e,i)=>i)),d={...r,getCacheEntry:()=>h(r.getState()),requestId:s,extra:u,updateCachedData:"query"===l.type?e=>r.dispatch(t.util.updateQueryData(n,o,e)):void 0,queryFulfilled:i};c(o,d)}}else if(o(i)){const{requestId:t,baseQueryMeta:e}=i.meta;a[t]?.resolve({data:i.payload,meta:e}),delete a[t]}else if(n(i)){const{requestId:t,rejectedWithValue:e,baseQueryMeta:r}=i.meta;a[t]?.reject({error:i.payload??i.error,isUnhandledError:!e,meta:r}),delete a[t]}}},yr=({api:t,context:{apiUid:e},reducerPath:i})=>(i,r)=>{t.util.resetApiState.match(i)&&r.dispatch(t.internalActions.middlewareRegistered(e))},_r=({api:t,queryThunk:e,internalState:i})=>{const r=`${t.reducerPath}/subscriptions`;let s=null,n=null;const{updateSubscriptionOptions:o,unsubscribeQueryResult:a}=t.internalActions,l=()=>i.currentSubscriptions,c={getSubscriptions:l,getSubscriptionCount:t=>Xi(l()[t]??{}),isRequestSubscribed:(t,e)=>{const i=l();return!!i?.[t]?.[e]}};return(l,h)=>{if(s||(s=JSON.parse(JSON.stringify(i.currentSubscriptions))),t.util.resetApiState.match(l))return s=i.currentSubscriptions={},n=null,[!0,!1];if(t.internalActions.internal_getRTKQSubscriptions.match(l))return[!1,c];const u=((i,r)=>{if(o.match(r)){const{queryCacheKey:t,requestId:e,options:s}=r.payload;return i?.[t]?.[e]&&(i[t][e]=s),!0}if(a.match(r)){const{queryCacheKey:t,requestId:e}=r.payload;return i[t]&&delete i[t][e],!0}if(t.internalActions.removeQueryResult.match(r))return delete i[r.payload.queryCacheKey],!0;if(e.pending.match(r)){const{meta:{arg:t,requestId:e}}=r,s=i[t.queryCacheKey]??={};return s[`${e}_running`]={},t.subscribe&&(s[e]=t.subscriptionOptions??s[e]??{}),!0}let s=!1;if(e.fulfilled.match(r)||e.rejected.match(r)){const t=i[r.meta.arg.queryCacheKey]||{},e=`${r.meta.requestId}_running`;s||=!!t[e],delete t[e]}if(e.rejected.match(r)){const{meta:{condition:t,arg:e,requestId:n}}=r;if(t&&e.subscribe){const t=i[e.queryCacheKey]??={};t[n]=e.subscriptionOptions??t[n]??{},s=!0}}return s})(i.currentSubscriptions,l);let d=!0;if(u){n||(n=setTimeout((()=>{const e=JSON.parse(JSON.stringify(i.currentSubscriptions)),[,r]=we(s,(()=>e));h.next(t.internalActions.subscriptionsUpdated(r)),s=e,n=null}),500));const o="string"==typeof l.type&&!!l.type.startsWith(r),a=e.rejected.match(l)&&l.meta.condition&&!!l.meta.arg.subscribe;d=!o&&!a}return[d,!1]}};function vr(t){const{reducerPath:e,queryThunk:i,api:r,context:s}=t,{apiUid:n}=s,o={invalidateTags:je(`${e}/invalidateTags`)},a=t=>t.type.startsWith(`${e}/`),l=[yr,ur,dr,pr,mr,gr];return{middleware:i=>{let o=!1;const h={...t,internalState:{currentSubscriptions:{}},refetchQuery:c,isThisApiSliceAction:a},u=l.map((t=>t(h))),d=_r(h),p=(({reducerPath:t,context:e,api:i,refetchQuery:r,internalState:s})=>{const{removeQueryResult:n}=i.internalActions;function o(i,o){const a=i.getState()[t],l=a.queries,c=s.currentSubscriptions;e.batch((()=>{for(const t of Object.keys(c)){const e=l[t],s=c[t];s&&e&&((Object.values(s).some((t=>!0===t[o]))||Object.values(s).every((t=>void 0===t[o]))&&a.config[o])&&(0===Xi(s)?i.dispatch(n({queryCacheKey:t})):"uninitialized"!==e.status&&i.dispatch(r(e,t))))}}))}return(t,e)=>{Fi.match(t)&&o(e,"refetchOnFocus"),Ui.match(t)&&o(e,"refetchOnReconnect")}})(h);return t=>l=>{if(!At(l))return t(l);o||(o=!0,i.dispatch(r.internalActions.middlewareRegistered(n)));const c={...i,next:t},h=i.getState(),[f,m]=d(l,c,h);let g;if(g=f?t(l):m,i.getState()[e]&&(p(l,c,h),a(l)||s.hasRehydrationInfo(l)))for(let t of u)t(l,c,h);return g}},actions:o};function c(t,e,r={}){return i({type:"query",endpointName:t.endpointName,originalArgs:t.originalArgs,subscribe:!1,forceRefetch:!0,queryCacheKey:e,...r})}}function xr(t,...e){return Object.assign(t,...e)}var br=Symbol(),wr=({createSelector:t=De}={})=>({name:br,init(e,{baseQuery:i,tagTypes:r,reducerPath:s,serializeQueryArgs:n,keepUnusedDataFor:o,refetchOnMountOrArgChange:a,refetchOnFocus:l,refetchOnReconnect:c,invalidationBehavior:h},u){ve();const d=t=>t;Object.assign(e,{reducerPath:s,endpoints:{},internalActions:{onOnline:Ui,onOffline:Vi,onFocus:Fi,onFocusLost:ji},util:{}});const{queryThunk:p,mutationThunk:f,patchQueryData:m,updateQueryData:g,upsertQueryData:y,prefetch:_,buildMatchThunkActions:v}=function({reducerPath:t,baseQuery:e,context:{endpointDefinitions:i},serializeQueryArgs:r,api:s,assertTagType:n}){const o=async(t,{signal:r,abort:s,rejectWithValue:n,fulfillWithValue:o,dispatch:l,getState:c,extra:h})=>{const u=i[t.endpointName];try{let i,n=Ki;const d={signal:r,abort:s,dispatch:l,getState:c,extra:h,endpoint:t.endpointName,type:t.type,forced:"query"===t.type?a(t,c()):void 0},p="query"===t.type?t[Zi]:void 0;if(p?i=p():u.query?(i=await e(u.query(t.originalArgs),d,u.extraOptions),u.transformResponse&&(n=u.transformResponse)):i=await u.queryFn(t.originalArgs,d,u.extraOptions,(t=>e(t,d,u.extraOptions))),i.error)throw new Bi(i.error,i.meta);return o(await n(i.data,i.meta,t.originalArgs),{fulfilledTimeStamp:Date.now(),baseQueryMeta:i.meta,[Ge]:!0})}catch(e){let i=e;if(i instanceof Bi){let e=Ki;u.query&&u.transformErrorResponse&&(e=u.transformErrorResponse);try{return n(await e(i.value,i.meta,t.originalArgs),{baseQueryMeta:i.meta,[Ge]:!0})}catch(t){i=t}}throw console.error(i),i}};function a(e,i){const r=i[t]?.queries?.[e.queryCacheKey],s=i[t]?.config.refetchOnMountOrArgChange,n=r?.fulfilledTimeStamp,o=e.forceRefetch??(e.subscribe&&s);return!!o&&(!0===o||(Number(new Date)-Number(n))/1e3>=o)}const l=ui(`${t}/executeQuery`,o,{getPendingMeta:()=>({startedTimeStamp:Date.now(),[Ge]:!0}),condition(e,{getState:r}){const s=r(),n=s[t]?.queries?.[e.queryCacheKey],o=n?.fulfilledTimeStamp,l=e.originalArgs,c=n?.originalArgs,h=i[e.endpointName];return!(!Yi(e)&&("pending"===n?.status||!a(e,s)&&(!Gi(h)||!h?.forceRefetch?.({currentArg:l,previousArg:c,endpointState:n,state:s}))&&o))},dispatchConditionRejection:!0}),c=ui(`${t}/executeMutation`,o,{getPendingMeta:()=>({startedTimeStamp:Date.now(),[Ge]:!0})});function h(t){return e=>e?.meta?.arg?.endpointName===t}return{queryThunk:l,mutationThunk:c,prefetch:(t,e,i)=>(r,n)=>{const o=(t=>"force"in t)(i)&&i.force,a=(t=>"ifOlderThan"in t)(i)&&i.ifOlderThan,l=(i=!0)=>{const r={forceRefetch:i,isPrefetch:!0};return s.endpoints[t].initiate(e,r)},c=s.endpoints[t].select(e)(n());if(o)r(l());else if(a){const t=c?.fulfilledTimeStamp;if(!t)return void r(l());(Number(new Date)-Number(new Date(t)))/1e3>=a&&r(l())}else r(l(!1))},updateQueryData:(t,e,i,r=!0)=>(n,o)=>{const a=s.endpoints[t].select(e)(o());let l,c={patches:[],inversePatches:[],undo:()=>n(s.util.patchQueryData(t,e,c.inversePatches,r))};if("uninitialized"===a.status)return c;if("data"in a)if(Ot(a.data)){const[t,e,r]=we(a.data,i);c.patches.push(...e),c.inversePatches.push(...r),l=t}else l=i(a.data),c.patches.push({op:"replace",path:[],value:l}),c.inversePatches.push({op:"replace",path:[],value:a.data});return 0===c.patches.length||n(s.util.patchQueryData(t,e,c.patches,r)),c},upsertQueryData:(t,e,i)=>r=>r(s.endpoints[t].initiate(e,{subscribe:!1,forceRefetch:!0,[Zi]:()=>({data:i})})),patchQueryData:(t,e,o,a)=>(l,c)=>{const h=i[t],u=r({queryArgs:e,endpointDefinition:h,endpointName:t});if(l(s.internalActions.queryResultPatched({queryCacheKey:u,patches:o})),!a)return;const d=s.endpoints[t].select(e)(c()),p=$i(h.providesTags,d.data,void 0,e,{},n);l(s.internalActions.updateProvidedBy({queryCacheKey:u,providedTags:p}))},buildMatchThunkActions:function(t,e){return{matchPending:Je(ii(t),h(e)),matchFulfilled:Je(ni(t),h(e)),matchRejected:Je(ri(t),h(e))}}}}({baseQuery:i,reducerPath:s,context:u,api:e,serializeQueryArgs:n,assertTagType:d}),{reducer:x,actions:b}=rr({context:u,queryThunk:p,mutationThunk:f,reducerPath:s,assertTagType:d,config:{refetchOnFocus:l,refetchOnReconnect:c,refetchOnMountOrArgChange:a,keepUnusedDataFor:o,reducerPath:s,invalidationBehavior:h}});xr(e.util,{patchQueryData:m,updateQueryData:g,upsertQueryData:y,prefetch:_,resetApiState:b.resetApiState}),xr(e.internalActions,b);const{middleware:w,actions:S}=vr({reducerPath:s,context:u,queryThunk:p,mutationThunk:f,api:e,assertTagType:d});xr(e.util,S),xr(e,{reducer:x,middleware:w});const{buildQuerySelector:C,buildMutationSelector:T,selectInvalidatedBy:k,selectCachedArgsForQuery:E}=function({serializeQueryArgs:t,reducerPath:e,createSelector:i}){const r=t=>or,s=t=>ar;return{buildQuerySelector:function(e,s){return a=>{const l=t({queryArgs:a,endpointDefinition:s,endpointName:e});return i(a===sr?r:t=>o(t)?.queries?.[l]??or,n)}},buildMutationSelector:function(){return t=>{let e;return e="object"==typeof t?tr(t)??sr:t,i(e===sr?s:t=>o(t)?.mutations?.[e]??ar,n)}},selectInvalidatedBy:function(t,i){const r=t[e],s=new Set;for(const t of i.map(Hi)){const e=r.provided[t.type];if(!e)continue;let i=(void 0!==t.id?e[t.id]:Ii(Object.values(e)))??[];for(const t of i)s.add(t)}return Ii(Array.from(s.values()).map((t=>{const e=r.queries[t];return e?[{queryCacheKey:t,endpointName:e.endpointName,originalArgs:e.originalArgs}]:[]})))},selectCachedArgsForQuery:function(t,i){return Object.values(t[e].queries).filter((t=>t?.endpointName===i&&"uninitialized"!==t.status)).map((t=>t.originalArgs))}};function n(t){return{...t,...(e=t.status,{status:e,isUninitialized:"uninitialized"===e,isLoading:"pending"===e,isSuccess:"fulfilled"===e,isError:"rejected"===e})};var e}function o(t){return t[e]}}({serializeQueryArgs:n,reducerPath:s,createSelector:t});xr(e.util,{selectInvalidatedBy:k,selectCachedArgsForQuery:E});const{buildInitiateQuery:A,buildInitiateMutation:M,getRunningMutationThunk:P,getRunningMutationsThunk:I,getRunningQueriesThunk:L,getRunningQueryThunk:D}=function({serializeQueryArgs:t,queryThunk:e,mutationThunk:i,api:r,context:s}){const n=new Map,o=new Map,{unsubscribeQueryResult:a,removeMutationResult:l,updateSubscriptionOptions:c}=r.internalActions;return{buildInitiateQuery:function(i,s){const o=(l,{subscribe:u=!0,forceRefetch:d,subscriptionOptions:p,[Zi]:f,...m}={})=>(g,y)=>{const _=t({queryArgs:l,endpointDefinition:s,endpointName:i}),v=e({...m,type:"query",subscribe:u,forceRefetch:d,subscriptionOptions:p,endpointName:i,originalArgs:l,queryCacheKey:_,[Zi]:f}),x=r.endpoints[i].select(l),b=g(v),w=x(y());h(g);const{requestId:S,abort:C}=b,T=w.requestId!==S,k=n.get(g)?.[_],E=()=>x(y()),A=Object.assign(f?b.then(E):T&&!k?Promise.resolve(w):Promise.all([k,b]).then(E),{arg:l,requestId:S,subscriptionOptions:p,queryCacheKey:_,abort:C,async unwrap(){const t=await A;if(t.isError)throw t.error;return t.data},refetch:()=>g(o(l,{subscribe:!1,forceRefetch:!0})),unsubscribe(){u&&g(a({queryCacheKey:_,requestId:S}))},updateSubscriptionOptions(t){A.subscriptionOptions=t,g(c({endpointName:i,requestId:S,queryCacheKey:_,options:t}))}});if(!k&&!T&&!f){const t=n.get(g)||{};t[_]=A,n.set(g,t),A.then((()=>{delete t[_],Xi(t)||n.delete(g)}))}return A};return o},buildInitiateMutation:function(t){return(e,{track:r=!0,fixedCacheKey:s}={})=>(n,a)=>{const c=i({type:"mutation",endpointName:t,originalArgs:e,track:r,fixedCacheKey:s}),u=n(c);h(n);const{requestId:d,abort:p,unwrap:f}=u,m=(g=t=>({error:t}),u.unwrap().then((t=>({data:t}))).catch(g));var g;const y=Object.assign(m,{arg:u.arg,requestId:d,abort:p,unwrap:f,reset:()=>{n(l({requestId:d,fixedCacheKey:s}))}}),_=o.get(n)||{};return o.set(n,_),_[d]=y,y.then((()=>{delete _[d],Xi(_)||o.delete(n)})),s&&(_[s]=y,y.then((()=>{_[s]===y&&(delete _[s],Xi(_)||o.delete(n))}))),y}},getRunningQueryThunk:function(e,i){return r=>{const o=s.endpointDefinitions[e],a=t({queryArgs:i,endpointDefinition:o,endpointName:e});return n.get(r)?.[a]}},getRunningMutationThunk:function(t,e){return t=>o.get(t)?.[e]},getRunningQueriesThunk:function(){return t=>Object.values(n.get(t)||{}).filter(Wi)},getRunningMutationsThunk:function(){return t=>Object.values(o.get(t)||{}).filter(Wi)}};function h(t){}}({queryThunk:p,mutationThunk:f,api:e,serializeQueryArgs:n,context:u});return xr(e.util,{getRunningMutationThunk:P,getRunningMutationsThunk:I,getRunningQueryThunk:D,getRunningQueriesThunk:L}),{name:br,injectEndpoint(t,i){const r=e;r.endpoints[t]??={},Gi(i)?xr(r.endpoints[t],{name:t,select:C(t,i),initiate:A(t,i)},v(p,t)):"mutation"===i.type&&xr(r.endpoints[t],{name:t,select:T(),initiate:M(t)},v(f,t))}}}});wr();function Sr(t,...e){return Object.assign(t,...e)}function Cr(t){return t.replace(t[0],t[0].toUpperCase())}var Tr=WeakMap?new WeakMap:void 0,kr=({endpointName:t,queryArgs:e})=>{let i="";const r=Tr?.get(e);if("string"==typeof r)i=r;else{const t=JSON.stringify(e,((t,e)=>e=Ct(e="bigint"==typeof e?{$bigint:e.toString()}:e)?Object.keys(e).sort().reduce(((t,i)=>(t[i]=e[i],t)),{}):e));Ct(e)&&Tr?.set(e,t),i=t}return`${t}(${i})`},Er=Symbol();function Ar(t,e,i,r){const s=(0,F.useMemo)((()=>({queryArgs:t,serialized:"object"==typeof t?e({queryArgs:t,endpointDefinition:i,endpointName:r}):t})),[t,e,i,r]),n=(0,F.useRef)(s);return(0,F.useEffect)((()=>{n.current.serialized!==s.serialized&&(n.current=s)}),[s]),n.current.serialized===s.serialized?n.current.queryArgs:t}function Mr(t){const e=(0,F.useRef)(t);return(0,F.useEffect)((()=>{at(e.current,t)||(e.current=t)}),[t]),at(e.current,t)?e.current:t}var Pr=(()=>!("undefined"==typeof window||void 0===window.document||void 0===window.document.createElement))(),Ir=(()=>"undefined"!=typeof navigator&&"ReactNative"===navigator.product)(),Lr=(()=>Pr||Ir?F.useLayoutEffect:F.useEffect)(),Dr=t=>t.isUninitialized?{...t,isUninitialized:!1,isFetching:!0,isLoading:void 0===t.data,status:Ei.pending}:t;var zr=Symbol();var Or=hr(wr(),(({batch:t=ft,hooks:e={useDispatch:pt,useSelector:J,useStore:ht},createSelector:i=De,unstable__sideEffectsInRender:r=!1,...s}={})=>({name:zr,init(s,{serializeQueryArgs:n},o){const a=s,{buildQueryHooks:l,buildMutationHook:c,usePrefetch:h}=function({api:t,moduleOptions:{batch:e,hooks:{useDispatch:i,useSelector:r,useStore:s},unstable__sideEffectsInRender:n,createSelector:o},serializeQueryArgs:a,context:l}){const c=n?t=>t():F.useEffect;return{buildQueryHooks:function(n){const u=(e,{refetchOnReconnect:r,refetchOnFocus:s,refetchOnMountOrArgChange:o,skip:a=!1,pollingInterval:h=0,skipPollingIfUnfocused:u=!1}={})=>{const{initiate:d}=t.endpoints[n],p=i(),f=(0,F.useRef)(void 0);if(!f.current){const e=p(t.internalActions.internal_getRTKQSubscriptions());f.current=e}const m=Ar(a?sr:e,kr,l.endpointDefinitions[n],n),g=Mr({refetchOnReconnect:r,refetchOnFocus:s,pollingInterval:h,skipPollingIfUnfocused:u}),y=(0,F.useRef)(!1),_=(0,F.useRef)(void 0);let{queryCacheKey:v,requestId:x}=_.current||{},b=!1;v&&x&&(b=f.current.isRequestSubscribed(v,x));const w=!b&&y.current;return c((()=>{y.current=b})),c((()=>{w&&(_.current=void 0)}),[w]),c((()=>{const t=_.current;if(m===sr)return t?.unsubscribe(),void(_.current=void 0);const e=_.current?.subscriptionOptions;if(t&&t.arg===m)g!==e&&t.updateSubscriptionOptions(g);else{t?.unsubscribe();const e=p(d(m,{subscriptionOptions:g,forceRefetch:o}));_.current=e}}),[p,d,o,m,g,w]),(0,F.useEffect)((()=>()=>{_.current?.unsubscribe(),_.current=void 0}),[]),(0,F.useMemo)((()=>({refetch:()=>{if(!_.current)throw new Error(ki(38));return _.current?.refetch()}})),[])},d=({refetchOnReconnect:r,refetchOnFocus:s,pollingInterval:o=0,skipPollingIfUnfocused:a=!1}={})=>{const{initiate:l}=t.endpoints[n],h=i(),[u,d]=(0,F.useState)(Er),p=(0,F.useRef)(void 0),f=Mr({refetchOnReconnect:r,refetchOnFocus:s,pollingInterval:o,skipPollingIfUnfocused:a});c((()=>{const t=p.current?.subscriptionOptions;f!==t&&p.current?.updateSubscriptionOptions(f)}),[f]);const m=(0,F.useRef)(f);c((()=>{m.current=f}),[f]);const g=(0,F.useCallback)((function(t,i=!1){let r;return e((()=>{p.current?.unsubscribe(),p.current=r=h(l(t,{subscriptionOptions:m.current,forceRefetch:!i})),d(t)})),r}),[h,l]);return(0,F.useEffect)((()=>()=>{p?.current?.unsubscribe()}),[]),(0,F.useEffect)((()=>{u===Er||p.current||g(u,!0)}),[u,g]),(0,F.useMemo)((()=>[g,u]),[g,u])},p=(e,{skip:i=!1,selectFromResult:c}={})=>{const{select:u}=t.endpoints[n],d=Ar(i?sr:e,a,l.endpointDefinitions[n],n),p=(0,F.useRef)(void 0),f=(0,F.useMemo)((()=>o([u(d),(t,e)=>e,t=>d],h,{memoizeOptions:{resultEqualityCheck:at}})),[u,d]),m=(0,F.useMemo)((()=>c?o([f],c,{devModeChecks:{identityFunctionCheck:"never"}}):f),[f,c]),g=r((t=>m(t,p.current)),at),y=s(),_=f(y.getState(),p.current);return Lr((()=>{p.current=_}),[_]),g};return{useQueryState:p,useQuerySubscription:u,useLazyQuerySubscription:d,useLazyQuery(t){const[e,i]=d(t),r=p(i,{...t,skip:i===Er}),s=(0,F.useMemo)((()=>({lastArg:i})),[i]);return(0,F.useMemo)((()=>[e,r,s]),[e,r,s])},useQuery(t,e){const i=u(t,e),r=p(t,{selectFromResult:t===sr||e?.skip?void 0:Dr,...e}),{data:s,status:n,isLoading:o,isSuccess:a,isError:l,error:c}=r;return(0,F.useDebugValue)({data:s,status:n,isLoading:o,isSuccess:a,isError:l,error:c}),(0,F.useMemo)((()=>({...r,...i})),[r,i])}}},buildMutationHook:function(s){return({selectFromResult:n,fixedCacheKey:a}={})=>{const{select:l,initiate:c}=t.endpoints[s],h=i(),[u,d]=(0,F.useState)();(0,F.useEffect)((()=>()=>{u?.arg.fixedCacheKey||u?.reset()}),[u]);const p=(0,F.useCallback)((function(t){const e=h(c(t,{fixedCacheKey:a}));return d(e),e}),[h,c,a]),{requestId:f}=u||{},m=(0,F.useMemo)((()=>l({fixedCacheKey:a,requestId:u?.requestId})),[a,u,l]),g=(0,F.useMemo)((()=>n?o([m],n):m),[n,m]),y=r(g,at),_=null==a?u?.arg.originalArgs:void 0,v=(0,F.useCallback)((()=>{e((()=>{u&&d(void 0),a&&h(t.internalActions.removeMutationResult({requestId:f,fixedCacheKey:a}))}))}),[h,a,u,f]),{endpointName:x,data:b,status:w,isLoading:S,isSuccess:C,isError:T,error:k}=y;(0,F.useDebugValue)({endpointName:x,data:b,status:w,isLoading:S,isSuccess:C,isError:T,error:k});const E=(0,F.useMemo)((()=>({...y,originalArgs:_,reset:v})),[y,_,v]);return(0,F.useMemo)((()=>[p,E]),[p,E])}},usePrefetch:function(e,r){const s=i(),n=Mr(r);return(0,F.useCallback)(((i,r)=>s(t.util.prefetch(e,i,{...n,...r}))),[e,s,n])}};function h(t,e,i){if(e?.endpointName&&t.isUninitialized){const{endpointName:t}=e,r=l.endpointDefinitions[t];a({queryArgs:e.originalArgs,endpointDefinition:r,endpointName:t})===a({queryArgs:i,endpointDefinition:r,endpointName:t})&&(e=void 0)}let r=t.isSuccess?t.data:e?.data;void 0===r&&(r=t.data);const s=void 0!==r,n=t.isLoading,o=(!e||e.isLoading||e.isUninitialized)&&!s&&n,c=t.isSuccess||n&&s;return{...t,data:r,currentData:t.data,isFetching:n,isLoading:o,isSuccess:c}}}({api:s,moduleOptions:{batch:t,hooks:e,unstable__sideEffectsInRender:r,createSelector:i},serializeQueryArgs:n,context:o});return Sr(a,{usePrefetch:h}),Sr(o,{batch:t}),{injectEndpoint(t,e){if("query"===e.type){const{useQuery:e,useLazyQuery:i,useLazyQuerySubscription:r,useQueryState:n,useQuerySubscription:o}=l(t);Sr(a.endpoints[t],{useQuery:e,useLazyQuery:i,useLazyQuerySubscription:r,useQueryState:n,useQuerySubscription:o}),s[`use${Cr(t)}Query`]=e,s[`useLazy${Cr(t)}Query`]=i}else if(function(t){return"mutation"===t.type}(e)){const e=c(t);Sr(a.endpoints[t],{useMutation:e}),s[`use${Cr(t)}Mutation`]=e}}}}}))()),Rr=Or({reducerPath:"djangoApi",baseQuery:function({baseUrl:t,prepareHeaders:e=(t=>t),fetchFn:i=zi,paramsSerializer:r,isJsonContentType:s=Ri,jsonContentType:n="application/json",jsonReplacer:o,timeout:a,responseHandler:l,validateStatus:c,...h}={}){return"undefined"==typeof fetch&&i===zi&&console.warn("Warning: `fetch` is not available. Please supply a custom `fetchFn` property to use `fetchBaseQuery` on SSR environments."),async(d,p)=>{const{signal:f,getState:m,extra:g,endpoint:y,forced:_,type:v}=p;let x,{url:b,headers:w=new Headers(h.headers),params:S,responseHandler:C=l??"json",validateStatus:T=c??Oi,timeout:k=a,...E}="string"==typeof d?{url:d}:d,A={...h,signal:f,...E};w=new Headers(Ni(w)),A.headers=await e(w,{getState:m,extra:g,endpoint:y,forced:_,type:v})||w;const M=t=>"object"==typeof t&&(Ct(t)||Array.isArray(t)||"function"==typeof t.toJSON);if(!A.headers.has("content-type")&&M(A.body)&&A.headers.set("content-type",n),M(A.body)&&s(A.headers)&&(A.body=JSON.stringify(A.body,o)),S){const t=~b.indexOf("?")?"&":"?";b+=t+(r?r(S):new URLSearchParams(Ni(S)))}b=Pi(t,b);const P=new Request(b,A);x={request:new Request(b,A)};let I,L=!1,D=k&&setTimeout((()=>{L=!0,p.abort()}),k);try{I=await i(P)}catch(t){return{error:{status:L?"TIMEOUT_ERROR":"FETCH_ERROR",error:String(t)},meta:x}}finally{D&&clearTimeout(D)}const z=I.clone();let O;x.response=z;let R="";try{let t;if(await Promise.all([u(I,C).then((t=>O=t),(e=>t=e)),z.text().then((t=>R=t),(()=>{}))]),t)throw t}catch(t){return{error:{status:"PARSING_ERROR",originalStatus:I.status,data:R,error:String(t)},meta:x}}return T(I,O)?{data:O,meta:x}:{error:{status:I.status,data:O},meta:x}};async function u(t,e){if("function"==typeof e)return e(t);if("content-type"===e&&(e=s(t.headers)?"json":"text"),"json"===e){const e=await t.text();return e.length?JSON.parse(e):null}return t.text()}}({credentials:"include"}),endpoints:function(t){return{getDepartementList:t.query({query:function(){return"/public/departements/"}})}}}),Nr=Rr.useGetDepartementListQuery,Br=function(){return Br=Object.assign||function(t){for(var e,i=1,r=arguments.length;i".concat(this.properties.nom,"
    ").concat(e)},jr=function(){return this.point.properties.ocsge_millesimes?this.point.properties.nom:""};const Ur=function(){var t=(0,F.useRef)(null),e=(0,F.useState)(null),i=e[0],r=e[1],s=Nr(null).data;(0,F.useEffect)((function(){s&&fetch("https://gist.githubusercontent.com/alexisig/8003b3cb786ba1fcaf1801b81d42d755/raw/0715b61a3f6ef828f7dc90b8fa42167547673af4/departements-1000m-dept-simpl-displaced-vertical.geojson").then((function(t){return t.json()})).then((function(t){var e=function(t,e){return Br(Br({},t),{features:t.features.map((function(t){var i=t.properties.code,r=e.find((function(t){return t.source_id===i}));return r?Br(Br({},t),{properties:Br(Br({},t.properties),{is_artif_ready:r.is_artif_ready,ocsge_millesimes:r.ocsge_millesimes})}):(console.warn('Le département "'.concat(i,"\" du GeoJSON n'a pas été trouvé dans les données.")),t)}))})}(t,s);r(e)})).catch((function(t){return console.error("Error fetching GeoJSON:",t)}))}),[s]);var n=(0,F.useMemo)((function(){return{chart:{map:i,height:550,width:600},title:{text:""},credits:{enabled:!1},series:[{type:"map",joinBy:"code",keys:["code","value"],data:i?i.features.filter((function(t){return t.properties.is_artif_ready})).map((function(t){return{code:t.properties.code,value:1}})):[],states:{hover:{borderColor:"#cccccc",brightness:.1,borderWidth:1}},dataLabels:{enabled:!0,formatter:jr,style:{color:"#293273"}},tooltip:{headerFormat:"",pointFormatter:Fr},borderWidth:1}],mapNavigation:{enabled:!0,buttonOptions:{verticalAlign:"bottom"}},mapView:{projection:{name:"WebMercator"}},colorAxis:{dataClasses:[{from:1,to:1,color:"#6dd176",name:"OCS GE Disponible"}]}}}),[i]);return F.createElement("div",null,i?F.createElement(yt(),{highcharts:mt,constructorType:"mapChart",options:n,ref:t}):F.createElement("div",{className:"fr-custom-loader"}))};function Vr(t){return Vr="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Vr(t)}var qr,Gr,$r,Hr,Wr,Xr=function(t){const e=function(t){const{thunk:e=!0,immutableCheck:i=!0,serializableCheck:r=!0,actionCreatorCheck:s=!0}=t??{};let n=new Ue;return e&&("boolean"==typeof e?n.push(Re):n.push(Ne(e.extraArgument))),n},{reducer:i,middleware:r,devTools:s=!0,preloadedState:n,enhancers:o}=t||{};let a,l;if("function"==typeof i)a=i;else{if(!Ct(i))throw new Error(ki(1));a=kt(i)}l="function"==typeof r?r(e):e();let c=Et;s&&(c=Be({trace:!1,..."object"==typeof s&&s}));const h=function(...t){return e=>(i,r)=>{const s=e(i,r);let n=()=>{throw new Error(xt(15))};const o={getState:s.getState,dispatch:(t,...e)=>n(t,...e)},a=t.map((t=>t(o)));return n=Et(...a)(s.dispatch),{...s,dispatch:n}}}(...l),u=Xe(h);let d="function"==typeof o?o(u):u();return Tt(a,n,c(...d))}({reducer:(qr={},Gr=Rr.reducerPath,$r=Rr.reducer,(Gr=function(t){var e=function(t,e){if("object"!=Vr(t)||!t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var r=i.call(t,e||"default");if("object"!=Vr(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==Vr(e)?e:e+""}(Gr))in qr?Object.defineProperty(qr,Gr,{value:$r,enumerable:!0,configurable:!0,writable:!0}):qr[Gr]=$r,qr),middleware:function(t){return t().concat(Rr.middleware)}});Hr=Xr.dispatch,Wr?Wr(Hr,{onFocus:Fi,onFocusLost:ji,onOffline:Vi,onOnline:Ui}):function(){const t=()=>Hr(Fi()),e=()=>Hr(Ui()),i=()=>Hr(Vi()),r=()=>{"visible"===window.document.visibilityState?t():Hr(ji())};qi||"undefined"!=typeof window&&window.addEventListener&&(window.addEventListener("visibilitychange",r,!1),window.addEventListener("focus",t,!1),window.addEventListener("online",e,!1),window.addEventListener("offline",i,!1),qi=!0)}();const Zr=Xr;var Yr=document.getElementById("react-highcharts-ocsge");Yr&&(0,j.H)(Yr).render(F.createElement(lt,{store:Zr},F.createElement(Ur,null))),window.htmx=__webpack_require__(926),window.htmx.config.includeIndicatorStyles=!1,window.htmx.defineExtension("disable-element",{onEvent:function(t,e){if("htmx:beforeRequest"===t||"htmx:afterRequest"===t){var i=e.detail.elt,r=i.getAttribute("hx-disable-element"),s="self"===r?i:document.querySelector(r);"htmx:beforeRequest"===t&&s?s.disabled=!0:"htmx:afterRequest"===t&&s&&(s.disabled=!1)}}})})()})(); \ No newline at end of file diff --git a/static/assets/styles/main.css b/static/assets/styles/main.css index 245df2ce6..28480872c 100644 --- a/static/assets/styles/main.css +++ b/static/assets/styles/main.css @@ -1,3 +1,6 @@ +/*!***********************************************************************************************!*\ + !*** css ./node_modules/css-loader/dist/cjs.js!./node_modules/@gouvfr/dsfr/dist/dsfr.min.css ***! + \***********************************************************************************************/ @charset "UTF-8"; /*! * DSFR v1.12.1 | SPDX-License-Identifier: MIT | License-Filename: LICENSE.md | restricted use (see terms and conditions) @@ -394,6 +397,9 @@ /*! media xl */ /*! media xl */ /*! media xl */}@media (-ms-high-contrast:active),(forced-colors:active){a:not([href]){color:graytext}[href],[href]:visited{color:linktext}[target=_blank]:after,[target=_blank][class*=" fr-fi-"]:after,[target=_blank][class*=" fr-icon-"]:after,[target=_blank][class^=fr-fi-]:after,[target=_blank][class^=fr-icon-]:after{background-color:linktext;forced-color-adjust:none}button{color:buttontext}button:disabled{color:graytext}input,select,textarea{border:1px solid}.fr-artwork-background,.fr-artwork-motif{fill:graytext}.fr-artwork-decorative{fill:none}.fr-artwork-major,.fr-artwork-minor{fill:canvastext}ul>li::marker{color:graytext}.fr-hr,hr{border-top:1px solid}.fr-range-group--disabled .fr-range__max,.fr-range-group--disabled .fr-range__min,.fr-range-group--disabled .fr-range__output{color:graytext}.fr-range-group--disabled .fr-range[data-fr-js-range]:after,.fr-range-group--disabled .fr-range[data-fr-js-range]:before{border:1px solid graytext}.fr-range-group--disabled .fr-label,.fr-range-group--disabled .fr-label .fr-hint-text{color:graytext}.fr-range[data-fr-js-range]:after,.fr-range[data-fr-js-range]:before{border:1px solid buttontext}.fr-range[data-fr-js-range] input[type=range]{border:none}.fr-range[data-fr-js-range] input[type=range]:focus::-webkit-slider-thumb{outline-color:highlight}.fr-range[data-fr-js-range] input[type=range]:focus::-moz-range-thumb{outline-color:highlight}.fr-range[data-fr-js-range] input[type=range]::-webkit-slider-thumb{background:buttontext;box-shadow:none}.fr-range[data-fr-js-range] input[type=range]::-moz-range-thumb{background:buttontext;box-shadow:none}.fr-range[data-fr-js-range] input[type=range]:disabled::-webkit-slider-thumb{background:graytext}.fr-range[data-fr-js-range] input[type=range]:disabled::-moz-range-thumb{background:graytext}.fr-range--double[data-fr-js-range] input[type=range]:first-of-type{border-right:none}.fr-range--double[data-fr-js-range] input[type=range]:nth-of-type(2){border-left:none}.fr-accordion__btn:after{background-color:buttontext;forced-color-adjust:none}.fr-accordion{border-bottom:1px solid;border-top:1px solid}.fr-accordion+.fr-accordion{border-top:none}.fr-badge:after,.fr-badge:before{background-color:canvastext}.fr-badge{outline:1px solid}.fr-btn:after,.fr-btn:before{background-color:buttontext}.fr-btn:disabled:after,.fr-btn:disabled:before,a.fr-btn:not([href]):after,a.fr-btn:not([href]):before{background-color:graytext}.fr-btn:disabled,a.fr-btn:not([href]){border-color:graytext;color:graytext}a[href].fr-btn:after,a[href].fr-btn:before{background-color:linktext}button.fr-btn{border:1px solid buttontext}.fr-btn--account:before,.fr-btn--briefcase:before,.fr-btn--close:after,.fr-btn--display:before,.fr-btn--fullscreen:after,.fr-btn--sort:before,.fr-btn--sort[aria-sorting=asc]:before,.fr-btn--sort[aria-sorting=desc]:before,.fr-btn--team:before,.fr-btn--tooltip:before{background-color:buttontext;forced-color-adjust:none}.fr-connect{border:1px solid}.fr-connect__brand,.fr-connect__login{line-height:1.1}.fr-connect--plus:after{color:buttontext;forced-color-adjust:none}.fr-connect-group .fr-connect+p a{text-decoration:underline;text-underline-offset:5px}.fr-quote{border-left:1px solid}.fr-breadcrumb__list li:not(:first-child):before{background-color:canvastext;forced-color-adjust:none}.fr-breadcrumb__link{text-decoration:underline;text-underline-offset:5px}.fr-breadcrumb__link[aria-current]:not([aria-current=false]){text-decoration:none}.fr-fieldset input:disabled+label,.fr-fieldset input:disabled+label .fr-hint-text,.fr-fieldset input:disabled+label+.fr-hint-text,.fr-fieldset:disabled .fr-fieldset__legend,.fr-fieldset:disabled .fr-hint-text,.fr-fieldset:disabled .fr-label{color:graytext}.fr-message--error:after,.fr-message--error:before,.fr-message--info:after,.fr-message--info:before,.fr-message--valid:after,.fr-message--valid:before{background-color:canvasText;forced-color-adjust:none}.fr-error-text:before,.fr-info-text:before,.fr-valid-text:before{background-color:canvastext;forced-color-adjust:none}.fr-stepper__steps{background-image:repeating-linear-gradient(to right,highlight 0,highlight var(--active-inner),transparent var(--active-inner),transparent var(--active-outer)),repeating-linear-gradient(to right,graytext 0,graytext var(--default-inner),transparent var(--default-inner),transparent var(--default-outer));forced-color-adjust:none}.fr-tooltip{background:canvas;outline:1px solid}.fr-tooltip.fr-placement{padding:.5rem}a.fr-link{text-decoration:underline;text-underline-offset:5px}a.fr-link:not([href]):after,a.fr-link:not([href]):before{background-color:graytext}.fr-link--download:after,.fr-links-group--download .fr-link:after{background-color:linktext;forced-color-adjust:none}.fr-link--download .fr-link__detail,.fr-links-group--download .fr-link .fr-link__detail{color:canvastext}.fr-link--download:not([href]) .fr-link__detail,.fr-links-group--download .fr-link:not([href]) .fr-link__detail{color:graytext}.fr-link--close:after{background-color:buttontext;forced-color-adjust:none}.fr-sidemenu__inner{border-right:1px solid}.fr-sidemenu__btn[aria-current]:not([aria-current=false]):before,.fr-sidemenu__link[aria-current]:not([aria-current=false]):before{background-color:highlight;forced-color-adjust:none}.fr-sidemenu__btn[aria-expanded]:after{background-color:buttontext;forced-color-adjust:none}.fr-highlight{border-left:4px solid;padding-left:1rem}.fr-tabs{border-bottom:1px solid}.fr-tabs:before{border:1px solid graytext}.fr-tabs__tab{border:1px solid}.fr-tabs__tab[aria-selected=true]:not(:disabled){border-bottom:1px solid highlight;border-top:1px solid highlight;border-color:highlight highlight canvas;border-style:solid;border-width:4px 1px 1px;color:highlight}.fr-pagination__link:not([href]):disabled:not([aria-current]),a.fr-pagination__link:not([href]):not([aria-current]){color:graytext}.fr-pagination__link--first.fr-pagination__link--label:before,.fr-pagination__link--first:before,.fr-pagination__link--last.fr-pagination__link--label:after,.fr-pagination__link--last:before,.fr-pagination__link--next.fr-pagination__link--label:after,.fr-pagination__link--next:before,.fr-pagination__link--prev.fr-pagination__link--label:before,.fr-pagination__link--prev:before{forced-color-adjust:none}.fr-summary{outline:1px solid}.fr-summary__link{text-decoration:underline;text-underline-offset:5px}.fr-table__content .fr-cell--fixed .fr-checkbox-group .fr-label{opacity:0}.fr-table__content .fr-cell--fixed{outline:1px solid}.fr-table__content table tbody tr:after{border:2px solid highlight}.fr-table__content td,.fr-table__content th{border:1px solid}.fr-tag:after,.fr-tag:before{background-color:canvastext}.fr-tag{border:1px solid}.fr-tag:disabled,a.fr-tag:not([href]){color:graytext}a.fr-tag[aria-pressed=true]:not(:disabled),button.fr-tag[aria-pressed=true]:not(:disabled),input[type=button].fr-tag[aria-pressed=true]:not(:disabled),input[type=image].fr-tag[aria-pressed=true]:not(:disabled),input[type=reset].fr-tag[aria-pressed=true]:not(:disabled),input[type=submit].fr-tag[aria-pressed=true]:not(:disabled){border:1px solid highlight;border-top:4px solid highlight;color:highlight}a.fr-tag[aria-pressed=true].fr-tag--sm:after,a.fr-tag[aria-pressed=true]:not(:disabled):after,button.fr-tag[aria-pressed=true].fr-tag--sm:after,button.fr-tag[aria-pressed=true]:not(:disabled):after,input[type=button].fr-tag[aria-pressed=true].fr-tag--sm:after,input[type=button].fr-tag[aria-pressed=true]:not(:disabled):after,input[type=image].fr-tag[aria-pressed=true].fr-tag--sm:after,input[type=image].fr-tag[aria-pressed=true]:not(:disabled):after,input[type=reset].fr-tag[aria-pressed=true].fr-tag--sm:after,input[type=reset].fr-tag[aria-pressed=true]:not(:disabled):after,input[type=submit].fr-tag[aria-pressed=true].fr-tag--sm:after,input[type=submit].fr-tag[aria-pressed=true]:not(:disabled):after{display:none}a.fr-tag--dismiss:after,button.fr-tag--dismiss:after,input[type=button].fr-tag--dismiss:after,input[type=image].fr-tag--dismiss:after,input[type=reset].fr-tag--dismiss:after,input[type=submit].fr-tag--dismiss:after{background-color:buttontext;forced-color-adjust:none}a.fr-tag--dismiss:disabled:after,button.fr-tag--dismiss:disabled:after,input[type=button].fr-tag--dismiss:disabled:after,input[type=image].fr-tag--dismiss:disabled:after,input[type=reset].fr-tag--dismiss:disabled:after,input[type=submit].fr-tag--dismiss:disabled:after{background-color:graytext}a.fr-tag--dismiss.fr-tag--sm:after,button.fr-tag--dismiss.fr-tag--sm:after,input[type=button].fr-tag--dismiss.fr-tag--sm:after,input[type=image].fr-tag--dismiss.fr-tag--sm:after,input[type=reset].fr-tag--dismiss.fr-tag--sm:after,input[type=submit].fr-tag--dismiss.fr-tag--sm:after{background-color:buttontext}a.fr-tag--dismiss.fr-tag--sm:disabled:after,button.fr-tag--dismiss.fr-tag--sm:disabled:after,input[type=button].fr-tag--dismiss.fr-tag--sm:disabled:after,input[type=image].fr-tag--dismiss.fr-tag--sm:disabled:after,input[type=reset].fr-tag--dismiss.fr-tag--sm:disabled:after,input[type=submit].fr-tag--dismiss.fr-tag--sm:disabled:after{background-color:graytext}.fr-tags-group.fr-tags-group--sm button.fr-tag.fr-tag--dismiss:after,.fr-tags-group.fr-tags-group--sm input[type=button].fr-tag.fr-tag--dismiss:after{background-color:buttontext}.fr-tags-group.fr-tags-group--sm button.fr-tag[aria-pressed=true]:after,.fr-tags-group.fr-tags-group--sm input[type=button].fr-tag[aria-pressed=true]:after{display:none}.fr-download .fr-download__link:after{forced-color-adjust:none}.fr-alert{outline:1px solid}.fr-alert:before{background-color:graytext;left:8px}.fr-alert .fr-btn--close:before,.fr-alert .fr-link--close:before{background-color:buttontext;forced-color-adjust:none}.fr-notice{outline:1px solid}.fr-notice__title:before{background-color:canvastext;forced-color-adjust:none}.fr-notice .fr-btn--close:before{background-color:buttontext;forced-color-adjust:none}.fr-notice--weather-purple,.fr-notice--weather-red{color:highlight}.fr-notice--attack .fr-notice__title:before,.fr-notice--cyberattack .fr-notice__title:before,.fr-notice--kidnapping .fr-notice__title:before,.fr-notice--weather-purple .fr-notice__title:before,.fr-notice--weather-red .fr-notice__title:before,.fr-notice--witness .fr-notice__title:before{background-color:highlight;forced-color-adjust:none}.fr-notice--attack,.fr-notice--cyberattack,.fr-notice--kidnapping,.fr-notice--witness{color:highlight}.fr-radio-group input[type=radio]{opacity:1}.fr-radio-group input[type=radio]:disabled+label{color:graytext}.fr-radio-group input[type=radio]+label:before{display:none}.fr-radio-rich input[type=radio]:disabled+label{outline:1px solid}.fr-radio-rich input[type=radio]:disabled+label:before{background-color:transparent}.fr-radio-rich input[type=radio]:disabled~.fr-radio-rich__pictogram{outline:1px solid graytext}.fr-radio-rich input[type=radio]+label,.fr-radio-rich__img,.fr-radio-rich__pictogram{outline:1px solid}.fr-card{border:1px solid}.fr-card__title a:after,.fr-card__title button:after{background-color:linktext;forced-color-adjust:none}.fr-card__title a,.fr-card__title button{text-decoration:underline;text-underline-offset:5px}.fr-card__title a:not([href]):after,.fr-card__title button:not([href]):after{background-color:graytext}.fr-card__title [target=_blank]:after{background-color:linktext}.fr-card.fr-enlarge-button .fr-card__title button,.fr-card.fr-enlarge-link .fr-card__title a{text-decoration:none}.fr-card--download .fr-card__title a:after,.fr-card--download .fr-card__title button:after{background-color:linktext}.fr-card--download .fr-card__title a:disabled:after,.fr-card--download .fr-card__title a:not([href]):after,.fr-card--download .fr-card__title button:disabled:after{background-color:graytext}.fr-checkbox-group input[type=checkbox]{opacity:1}.fr-checkbox-group input[type=checkbox]:disabled+label{color:graytext}.fr-checkbox-group input[type=checkbox]+label:before{display:none}.fr-segmented__elements{outline:1px solid}.fr-segmented input+label:before{background-color:buttontext}.fr-segmented input:checked:focus+label{outline:4px solid;outline-offset:0}.fr-segmented input:checked+label{color:highlight;outline:2px solid}.fr-segmented input:checked:disabled+label,.fr-segmented input:disabled+label{color:graytext}.fr-segmented input:not([disabled]):not(:checked)+label{color:buttontext}.fr-toggle input[type=checkbox]:checked~.fr-toggle__label:before{background-color:transparent;background-image:none;border:2px solid highlight;color:canvastext;forced-color-adjust:none}.fr-toggle input[type=checkbox]:checked~.fr-toggle__label:after{background-color:highlight;background-image:url("data:image/svg+xml;charset=utf-8,");border:2px solid highlight}.fr-toggle input[type=checkbox]:focus~.fr-toggle__label:before{outline-color:graytext}.fr-toggle input[type=checkbox]:disabled~.fr-toggle__label{color:graytext}.fr-toggle input[type=checkbox]:disabled~.fr-toggle__label:after,.fr-toggle input[type=checkbox]:disabled~.fr-toggle__label:before{background-image:none;border:2px solid graytext;box-shadow:none;color:graytext}.fr-toggle input[type=checkbox]:disabled:checked~.fr-toggle__label:after,.fr-toggle input[type=checkbox]:disabled:checked~.fr-toggle__label:before{background-image:none;border:2px solid graytext;box-shadow:none}.fr-toggle input[type=checkbox]:disabled:checked~.fr-toggle__label:after{background-color:graytext;background-image:url("data:image/svg+xml;charset=utf-8,")}.fr-toggle label[data-fr-unchecked-label][data-fr-checked-label]:before{background-image:none;color:canvastext}.fr-toggle label:before{background-image:none;height:1.5rem;padding-top:1.25rem}.fr-toggle label:after,.fr-toggle label:before{background-color:transparent;border:2px solid buttontext;forced-color-adjust:none}.fr-toggle label:after{box-shadow:none}.fr-select{background-image:url("data:image/svg+xml;charset=utf-8,")}.fr-callout{border-left:4px solid;padding-left:1.25rem}.fr-modal--opened .fr-modal__body{border:1px solid}.fr-modal__footer,.fr-nav__list{border-top:1px solid}.fr-nav__list{border-bottom:1px solid}.fr-nav__btn[aria-current]:not([aria-current=false]):before,.fr-nav__link[aria-current]:not([aria-current=false]):before{background-color:highlight;width:.25rem}.fr-nav__btn:after{background-color:buttontext;forced-color-adjust:none}.fr-share .fr-btns-group .fr-btn{border:none}.fr-share .fr-btns-group:not(.fr-btns-group--sm):not(.fr-btns-group--lg) .fr-btn:not([class^=fr-icon-]):not([class*=" fr-icon-"]):not([class^=fr-fi-]):not([class*=" fr-fi-"]):before{background-color:buttontext;forced-color-adjust:none}.fr-share .fr-btns-group:not(.fr-btns-group--sm):not(.fr-btns-group--lg) .fr-btn:disabled:not([class^=fr-icon-]):not([class*=" fr-icon-"]):not([class^=fr-fi-]):not([class*=" fr-fi-"]):before,.fr-share .fr-btns-group:not(.fr-btns-group--sm):not(.fr-btns-group--lg) a.fr-btn:not([href]):not([class^=fr-icon-]):not([class*=" fr-icon-"]):not([class^=fr-fi-]):not([class*=" fr-fi-"]):before{background-color:graytext}.fr-share .fr-btns-group:not(.fr-btns-group--sm):not(.fr-btns-group--lg) a[href].fr-btn:not([class^=fr-icon-]):not([class*=" fr-icon-"]):not([class^=fr-fi-]):not([class*=" fr-fi-"]):before{background-color:linktext}.fr-share__link--facebook:before{background-color:buttontext;forced-color-adjust:none}a[href].fr-share__link--facebook:before{background-color:linktext;forced-color-adjust:none}a:not([href]).fr-share__link--facebook:before{background-color:graytext;forced-color-adjust:none}.fr-share__link--twitter:before{background-color:buttontext;forced-color-adjust:none}a[href].fr-share__link--twitter:before{background-color:linktext;forced-color-adjust:none}a:not([href]).fr-share__link--twitter:before{background-color:graytext;forced-color-adjust:none}.fr-share__link--linkedin:before{background-color:buttontext;forced-color-adjust:none}a[href].fr-share__link--linkedin:before{background-color:linktext;forced-color-adjust:none}a:not([href]).fr-share__link--linkedin:before{background-color:graytext;forced-color-adjust:none}.fr-share__link--mail:before{background-color:buttontext;forced-color-adjust:none}a[href].fr-share__link--mail:before{background-color:linktext;forced-color-adjust:none}a:not([href]).fr-share__link--mail:before{background-color:graytext;forced-color-adjust:none}.fr-share__link--copy:before{background-color:buttontext;forced-color-adjust:none}a[href].fr-share__link--copy:before{background-color:linktext;forced-color-adjust:none}a:not([href]).fr-share__link--copy:before{background-color:graytext;forced-color-adjust:none}.fr-footer{border-top:2px solid;padding-top:1.875rem}.fr-footer__bottom{border-top:1px solid}.fr-footer__bottom-item .fr-btn{border:none}.fr-footer__partners{border-top:1px solid}.fr-tile{outline:1px solid}.fr-tile.fr-enlarge-button .fr-tile__title a,.fr-tile.fr-enlarge-button .fr-tile__title button,.fr-tile.fr-enlarge-link .fr-tile__title a,.fr-tile.fr-enlarge-link .fr-tile__title button{text-decoration:none}.fr-tile__title a,.fr-tile__title button{text-decoration:underline;text-underline-offset:5px}.fr-tile__title a:after,.fr-tile__title button:after{background-color:linktext;forced-color-adjust:none}.fr-tile__title a:disabled:after,.fr-tile__title a:not([href]):after,.fr-tile__title button:disabled:after{background-color:graytext}.fr-tile.fr-tile--download .fr-tile__title a:after,.fr-tile.fr-tile--download .fr-tile__title button:after,.fr-tile__title [target=_blank]:after{background-color:linktext}.fr-tile.fr-tile--download .fr-tile__title a:disabled:after,.fr-tile.fr-tile--download .fr-tile__title a:not([href]):after,.fr-tile.fr-tile--download .fr-tile__title button:disabled:after{background-color:graytext}.fr-translate .fr-translate__btn:after,.fr-translate .fr-translate__btn:before{background-color:buttontext;forced-color-adjust:none}.fr-transcription__btn:after{forced-color-adjust:none}.fr-transcription__btn{border:1px solid}.fr-transcription .fr-collapse{outline:1px solid}.fr-transcription .fr-modal:not(.fr-modal--opened){border-bottom:1px solid}.fr-input-wrap--addon>:last-child:not(:first-child){max-height:2.5rem}.fr-content-media__transcription .fr-link:after,.fr-search-bar .fr-btn:before{background-color:buttontext;forced-color-adjust:none}.fr-consent-banner{outline:1px solid}.fr-consent-service__collapse .fr-consent-service__collapse-btn:after{forced-color-adjust:none}.fr-follow__social .fr-btns-group:not(.fr-btns-group--sm):not(.fr-btns-group--lg) .fr-btn:not([class^=fr-icon-]):not([class*=" fr-icon-"]):not([class^=fr-fi-]):not([class*=" fr-fi-"]):before{background-color:buttontext;forced-color-adjust:none}.fr-follow__social .fr-btns-group:not(.fr-btns-group--sm):not(.fr-btns-group--lg) a.fr-btn:not([class^=fr-icon-]):not([class*=" fr-icon-"]):not([class^=fr-fi-]):not([class*=" fr-fi-"]):before{background-color:linktext}.fr-follow__social .fr-btns-group:not(.fr-btns-group--sm):not(.fr-btns-group--lg) a.fr-btn:not([href]):not([class^=fr-icon-]):not([class*=" fr-icon-"]):not([class^=fr-fi-]):not([class*=" fr-fi-"]):before{background-color:graytext}.fr-follow__social .fr-btns-group--lg .fr-btn:not([class^=fr-icon-]):not([class*=" fr-icon-"]):not([class^=fr-fi-]):not([class*=" fr-fi-"]):before{background-color:buttontext;forced-color-adjust:none}.fr-follow__social .fr-btns-group--lg a.fr-btn:not([class^=fr-icon-]):not([class*=" fr-icon-"]):not([class^=fr-fi-]):not([class*=" fr-fi-"]):before{background-color:linktext}.fr-follow__social .fr-btns-group--lg a.fr-btn:not([href]):not([class^=fr-icon-]):not([class*=" fr-icon-"]):not([class^=fr-fi-]):not([class*=" fr-fi-"]):before{background-color:graytext}.fr-header{outline:1px solid}.fr-header__navbar .fr-btn--menu:before,.fr-header__navbar .fr-btn--search:before{background-color:buttontext;forced-color-adjust:none}.fr-header .fr-header__menu-links .fr-btn{border:none}}@media (hover:hover) and (pointer:fine){:root{--brighten:-1}a[href]:hover,button:not(:disabled):hover,input[type=button]:not(:disabled):hover,input[type=image]:not(:disabled):hover,input[type=reset]:not(:disabled):hover,input[type=submit]:not(:disabled):hover{background-color:var(--hover-tint)}a[href]:active,button:not(:disabled):active,input[type=button]:not(:disabled):active,input[type=image]:not(:disabled):active,input[type=reset]:not(:disabled):active,input[type=submit]:not(:disabled):active{background-color:var(--active-tint)}a[href]:active,a[href]:hover{--underline-hover-width:var(--underline-max-width)}.fr-enlarge-link a:active,.fr-enlarge-link a:hover{background:none}.fr-enlarge-link:hover{background-color:var(--hover)}.fr-enlarge-link:active{background-color:var(--active)}.fr-enlarge-button button:active,.fr-enlarge-button button:hover{background:none}.fr-enlarge-button:hover{background-color:var(--hover)}.fr-enlarge-button:active{background-color:var(--active)}:root[data-fr-theme=dark]{--brighten:1}.fr-card--download.fr-enlarge-button:hover .fr-card__header,.fr-card--download.fr-enlarge-link:hover .fr-card__header{background-color:var(--hover)}.fr-card--download.fr-enlarge-button:active .fr-card__header,.fr-card--download.fr-enlarge-link:active .fr-card__header{background-color:var(--active)}.fr-header__brand.fr-enlarge-link a[href]:hover{--a:0.1}.fr-header__brand.fr-enlarge-link a[href]:active{--a:0.2}}@media (-ms-high-contrast:active) and (-ms-high-contrast:active),(-ms-high-contrast:active) and (forced-colors:active),(forced-colors:active) and (-ms-high-contrast:active),(forced-colors:active) and (forced-colors:active){[class*=" fr-fi-"]:after,[class*=" fr-fi-"]:before,[class*=" fr-icon-"]:after,[class*=" fr-icon-"]:before,[class^=fr-fi-]:after,[class^=fr-fi-]:before,[class^=fr-icon-]:after,[class^=fr-icon-]:before{background-color:canvastext;forced-color-adjust:none}button[class*=" fr-fi-"]:not([disabled]):after,button[class*=" fr-fi-"]:not([disabled]):before,button[class*=" fr-icon-"]:not([disabled]):after,button[class*=" fr-icon-"]:not([disabled]):before,button[class^=fr-fi-]:not([disabled]):after,button[class^=fr-fi-]:not([disabled]):before,button[class^=fr-icon-]:not([disabled]):after,button[class^=fr-icon-]:not([disabled]):before{background-color:buttontext}a[href][class*=" fr-fi-"]:after,a[href][class*=" fr-fi-"]:before,a[href][class*=" fr-icon-"]:after,a[href][class*=" fr-icon-"]:before,a[href][class^=fr-fi-]:after,a[href][class^=fr-fi-]:before,a[href][class^=fr-icon-]:after,a[href][class^=fr-icon-]:before{background-color:linktext}a[class*=" fr-fi-"]:not([href]):after,a[class*=" fr-fi-"]:not([href]):before,a[class*=" fr-icon-"]:not([href]):after,a[class*=" fr-icon-"]:not([href]):before,a[class^=fr-fi-]:not([href]):after,a[class^=fr-fi-]:not([href]):before,a[class^=fr-icon-]:not([href]):after,a[class^=fr-icon-]:not([href]):before,audio[class*=" fr-fi-"]:not([href]):after,audio[class*=" fr-fi-"]:not([href]):before,audio[class*=" fr-icon-"]:not([href]):after,audio[class*=" fr-icon-"]:not([href]):before,audio[class^=fr-fi-]:not([href]):after,audio[class^=fr-fi-]:not([href]):before,audio[class^=fr-icon-]:not([href]):after,audio[class^=fr-icon-]:not([href]):before,button[class*=" fr-fi-"]:disabled:after,button[class*=" fr-fi-"]:disabled:before,button[class*=" fr-icon-"]:disabled:after,button[class*=" fr-icon-"]:disabled:before,button[class^=fr-fi-]:disabled:after,button[class^=fr-fi-]:disabled:before,button[class^=fr-icon-]:disabled:after,button[class^=fr-icon-]:disabled:before,input[class*=" fr-fi-"]:disabled:after,input[class*=" fr-fi-"]:disabled:before,input[class*=" fr-icon-"]:disabled:after,input[class*=" fr-icon-"]:disabled:before,input[class^=fr-fi-]:disabled:after,input[class^=fr-fi-]:disabled:before,input[class^=fr-icon-]:disabled:after,input[class^=fr-icon-]:disabled:before,input[type=checkbox]:disabled+label[class*=" fr-fi-"]:after,input[type=checkbox]:disabled+label[class*=" fr-fi-"]:before,input[type=checkbox]:disabled+label[class*=" fr-icon-"]:after,input[type=checkbox]:disabled+label[class*=" fr-icon-"]:before,input[type=checkbox]:disabled+label[class^=fr-fi-]:after,input[type=checkbox]:disabled+label[class^=fr-fi-]:before,input[type=checkbox]:disabled+label[class^=fr-icon-]:after,input[type=checkbox]:disabled+label[class^=fr-icon-]:before,input[type=checkbox][class*=" fr-fi-"]:disabled:after,input[type=checkbox][class*=" fr-fi-"]:disabled:before,input[type=checkbox][class*=" fr-icon-"]:disabled:after,input[type=checkbox][class*=" fr-icon-"]:disabled:before,input[type=checkbox][class^=fr-fi-]:disabled:after,input[type=checkbox][class^=fr-fi-]:disabled:before,input[type=checkbox][class^=fr-icon-]:disabled:after,input[type=checkbox][class^=fr-icon-]:disabled:before,input[type=radio]:disabled+label[class*=" fr-fi-"]:after,input[type=radio]:disabled+label[class*=" fr-fi-"]:before,input[type=radio]:disabled+label[class*=" fr-icon-"]:after,input[type=radio]:disabled+label[class*=" fr-icon-"]:before,input[type=radio]:disabled+label[class^=fr-fi-]:after,input[type=radio]:disabled+label[class^=fr-fi-]:before,input[type=radio]:disabled+label[class^=fr-icon-]:after,input[type=radio]:disabled+label[class^=fr-icon-]:before,input[type=radio][class*=" fr-fi-"]:disabled:after,input[type=radio][class*=" fr-fi-"]:disabled:before,input[type=radio][class*=" fr-icon-"]:disabled:after,input[type=radio][class*=" fr-icon-"]:disabled:before,input[type=radio][class^=fr-fi-]:disabled:after,input[type=radio][class^=fr-fi-]:disabled:before,input[type=radio][class^=fr-icon-]:disabled:after,input[type=radio][class^=fr-icon-]:disabled:before,textarea[class*=" fr-fi-"]:disabled:after,textarea[class*=" fr-fi-"]:disabled:before,textarea[class*=" fr-icon-"]:disabled:after,textarea[class*=" fr-icon-"]:disabled:before,textarea[class^=fr-fi-]:disabled:after,textarea[class^=fr-fi-]:disabled:before,textarea[class^=fr-icon-]:disabled:after,textarea[class^=fr-icon-]:disabled:before,video[class*=" fr-fi-"]:not([href]):after,video[class*=" fr-fi-"]:not([href]):before,video[class*=" fr-icon-"]:not([href]):after,video[class*=" fr-icon-"]:not([href]):before,video[class^=fr-fi-]:not([href]):after,video[class^=fr-fi-]:not([href]):before,video[class^=fr-icon-]:not([href]):after,video[class^=fr-icon-]:not([href]):before{background-color:graytext}.fr-segmented input:checked+label:before,.fr-tabs__tab[aria-selected=true][class*=" fr-fi-"]:not(:disabled):after,.fr-tabs__tab[aria-selected=true][class*=" fr-fi-"]:not(:disabled):before,.fr-tabs__tab[aria-selected=true][class*=" fr-icon-"]:not(:disabled):after,.fr-tabs__tab[aria-selected=true][class*=" fr-icon-"]:not(:disabled):before,.fr-tabs__tab[aria-selected=true][class^=fr-fi-]:not(:disabled):after,.fr-tabs__tab[aria-selected=true][class^=fr-fi-]:not(:disabled):before,.fr-tabs__tab[aria-selected=true][class^=fr-icon-]:not(:disabled):after,.fr-tabs__tab[aria-selected=true][class^=fr-icon-]:not(:disabled):before,a.fr-tag[aria-pressed=true]:not(:disabled):after,a.fr-tag[aria-pressed=true]:not(:disabled):before,button.fr-tag[aria-pressed=true]:not(:disabled):after,button.fr-tag[aria-pressed=true]:not(:disabled):before,input[type=button].fr-tag[aria-pressed=true]:not(:disabled):after,input[type=button].fr-tag[aria-pressed=true]:not(:disabled):before,input[type=image].fr-tag[aria-pressed=true]:not(:disabled):after,input[type=image].fr-tag[aria-pressed=true]:not(:disabled):before,input[type=reset].fr-tag[aria-pressed=true]:not(:disabled):after,input[type=reset].fr-tag[aria-pressed=true]:not(:disabled):before,input[type=submit].fr-tag[aria-pressed=true]:not(:disabled):after,input[type=submit].fr-tag[aria-pressed=true]:not(:disabled):before{background-color:highlight}.fr-segmented input:checked:disabled+label:before{background-color:graytext}}@media (prefers-reduced-motion:reduce){.fr-accordion .fr-collapse,.fr-accordion__btn:after,.fr-collapse,.fr-collapse:before,.fr-consent-service .fr-consent-service__collapse-btn:after,.fr-modal,.fr-modal--opened,.fr-modal__footer,.fr-nav__btn:after,.fr-tabs,.fr-tabs__panel,.fr-translate .fr-translate__btn:after,.fr-translate__menu{transition:none}}@media (prefers-color-scheme:dark) and (forced-colors:active){.fr-logo:after,[data-fr-theme=dark] .fr-logo:after{background-position:-2.625rem 100%}.fr-logo--sm:after,[data-fr-theme=dark] .fr-logo--sm:after{background-position:-1.96875rem 100%}.fr-logo--lg:after,[data-fr-theme=dark] .fr-logo--lg:after{background-position:-3.28125rem 100%}.fr-footer__brand .fr-logo:after,[data-fr-theme=dark] .fr-footer__brand .fr-logo:after{background-position:-2.625rem 100%}.fr-header__logo .fr-logo:after,[data-fr-theme=dark] .fr-header__logo .fr-logo:after{background-position:-1.96875rem 100%}}@media (prefers-color-scheme:light) and (forced-colors:active){.fr-logo:after,[data-fr-theme=dark] .fr-logo:after{background-position:0 calc(100% + 1.875rem)}.fr-logo--sm:after,[data-fr-theme=dark] .fr-logo--sm:after{background-position:0 calc(100% + 1.40625rem)}.fr-logo--lg:after,[data-fr-theme=dark] .fr-logo--lg:after{background-position:0 calc(100% + 2.34375rem)}.fr-footer__brand .fr-logo:after,[data-fr-theme=dark] .fr-footer__brand .fr-logo:after{background-position:0 calc(100% + 1.875rem)}.fr-header__logo .fr-logo:after,[data-fr-theme=dark] .fr-header__logo .fr-logo:after{background-position:0 calc(100% + 1.40625rem)}}@media (min-width:48em) and (-ms-high-contrast:active),(min-width:48em) and (forced-colors:active){.fr-sidemenu--right .fr-sidemenu__inner{border-left:1px solid}}@media (-ms-high-contrast:active) and (min-width:48em),(forced-colors:active) and (min-width:48em){.fr-highlight{padding-left:2rem}.fr-callout{padding-left:2.75rem}}@media (min-width:62em) and (-ms-high-contrast:active),(min-width:62em) and (forced-colors:active){.fr-pagination__link--first.fr-pagination__link--lg-label:before,.fr-pagination__link--last.fr-pagination__link--lg-label:after,.fr-pagination__link--next.fr-pagination__link--lg-label:after,.fr-pagination__link--prev.fr-pagination__link--lg-label:before{forced-color-adjust:none}.fr-nav__list>*>.fr-nav__btn[aria-current]:not([aria-current=false]):before,.fr-nav__list>*>.fr-nav__link[aria-current]:not([aria-current=false]):before,.fr-nav__list>.fr-nav__btn[aria-current]:not([aria-current=false]):before,.fr-nav__list>.fr-nav__link[aria-current]:not([aria-current=false]):before{background-color:highlight;height:.25rem}.fr-mega-menu,.fr-menu__list{outline:1px solid}.fr-translate .fr-menu__list{border-top:1px solid}}@media (forced-colors:active),(prefers-contrast:more){.fr-pagination__link[aria-current]:not([aria-current=false]){border:1px solid var(--border-active-blue-france);justify-content:center;padding:calc(.25rem - 1px) calc(.75rem - 1px)}}@media (min-width:48em) and (prefers-color-scheme:dark) and (forced-colors:active){.fr-footer__brand .fr-logo:after,[data-fr-theme=dark] .fr-footer__brand .fr-logo:after{background-position:-3.28125rem 100%}}@media (min-width:48em) and (prefers-color-scheme:light) and (forced-colors:active){.fr-footer__brand .fr-logo:after,[data-fr-theme=dark] .fr-footer__brand .fr-logo:after{background-position:0 calc(100% + 2.34375rem)}}@media (-ms-high-contrast:active) and (min-width:62em),(forced-colors:active) and (min-width:62em){.fr-header{outline:none}}@media screen and (min-width:0\0) and (min-resolution:72dpi) and (min-width:0\0) and (min-resolution:72dpi){.fr-enlarge-button,.fr-enlarge-link{background-color:transparent}.fr-enlarge-button:hover,.fr-enlarge-link:hover{background-color:rgba(0,0,0,.05)}.fr-enlarge-button:active,.fr-enlarge-link:active{background-color:rgba(0,0,0,.1)}.fr-range[data-fr-js-range] input[type=range]::-ms-fill-lower{background-color:#000091}.fr-range[data-fr-js-range] input[type=range]:disabled::-ms-fill-lower{background-color:#e5e5e5}.fr-range[data-fr-js-range].fr-range--double{background-image:linear-gradient(90deg,#000091 0,#000091)}.fr-range-group--disabled .fr-range--double[data-fr-js-range]{background-image:linear-gradient(90deg,#e5e5e5 0,#e5e5e5)}.fr-pagination__link{background-color:transparent}.fr-pagination__link:hover{background-color:rgba(0,0,0,.05)}.fr-pagination__link:active{background-color:rgba(0,0,0,.1)}.fr-table__content table{border-left:1px solid #929292;border-right:1px solid #929292}.fr-table__content table thead tr:first-child th{border-top:1px solid #929292}.fr-table__content table thead tr:last-child th{border-bottom:1px solid #3a3a3a}.fr-table--bordered table td,.fr-table--bordered table th{border-right:1px solid #929292}.fr-table>table thead tr:first-child th{border-top:1px solid #929292}.fr-table>table thead tr:last-child th{border-bottom:1px solid #3a3a3a}.fr-table>table tbody tr:last-child td,.fr-table>table tbody tr:last-child th{border-bottom:1px solid #929292}.fr-table>table td:first-child,.fr-table>table th:first-child{border-left:1px solid #929292}.fr-table>table td:last-child,.fr-table>table th:last-child{border-right:1px solid #929292}.fr-table--bordered>table td,.fr-table--bordered>table th{border-bottom:1px solid #929292}.fr-nav__btn,.fr-nav__link{background-color:transparent}.fr-nav__btn:hover,.fr-nav__link:hover{background-color:rgba(0,0,0,.05)}.fr-nav__btn:active,.fr-nav__link:active{background-color:rgba(0,0,0,.1)}}@media screen and (min-width:0\0) and (min-resolution:72dpi){.fr-enlarge-button [href],.fr-enlarge-link [href]{text-decoration:none}.fr-raw-link [href]:after,.fr-raw-link[href]:after{content:none}[target=_blank]:after{background-color:transparent;background-image:url(../../assets/images/5fac7fc1e919c8785620.svg);background-repeat:no-repeat;background-size:100%;content:"";height:1rem;vertical-align:sub;width:1rem}.fr-responsive-vid:before{content:"";display:block;padding-bottom:56.25%}ul{list-style-type:disc}ol{list-style-type:decimal}ol,ul{margin-bottom:.5rem;margin-top:.5rem;padding-left:1rem}h1,h2,h3,h4,h5,h6{color:#161616;margin:0 0 1.5rem}p{margin:0 0 1rem}[class*=" fr-fi-"]:before,[class*=" fr-icon-"]:before,[class^=fr-fi-]:before,[class^=fr-icon-]:before{background-color:transparent;background-repeat:no-repeat;background-size:100%;height:1.5rem;width:1.5rem}.fr-icon--xs:before{height:.75rem;width:.75rem}.fr-icon--sm:before{height:1rem;width:1rem}.fr-icon--md:before{height:1.5rem;width:1.5rem}.fr-icon--lg:before{height:2rem;width:2rem}body{background-color:#fff;color:#3a3a3a}a:not([href]),audio:not([href]),button:disabled,input:disabled,input[type=checkbox]:disabled,input[type=checkbox]:disabled+label,input[type=radio]:disabled,input[type=radio]:disabled+label,textarea:disabled,video:not([href]){color:#929292}.fr-artwork-decorative{fill:#ececfe}.fr-artwork-minor{fill:#e1000f}.fr-artwork-major{fill:#000091}.fr-artwork-background{fill:#f6f6f6}.fr-artwork-motif{fill:#e5e5e5}.fr-artwork--green-tilleul-verveine .fr-artwork-minor{fill:#b7a73f}.fr-artwork--green-bourgeon .fr-artwork-minor{fill:#68a532}.fr-artwork--green-emeraude .fr-artwork-minor{fill:#00a95f}.fr-artwork--green-menthe .fr-artwork-minor{fill:#009081}.fr-artwork--green-archipel .fr-artwork-minor{fill:#009099}.fr-artwork--blue-ecume .fr-artwork-minor{fill:#465f9d}.fr-artwork--blue-cumulus .fr-artwork-minor{fill:#417dc4}.fr-artwork--purple-glycine .fr-artwork-minor{fill:#a558a0}.fr-artwork--pink-macaron .fr-artwork-minor{fill:#e18b76}.fr-artwork--pink-tuile .fr-artwork-minor{fill:#ce614a}.fr-artwork--yellow-tournesol .fr-artwork-minor{fill:#c8aa39}.fr-artwork--yellow-moutarde .fr-artwork-minor{fill:#c3992a}.fr-artwork--orange-terre-battue .fr-artwork-minor{fill:#e4794a}.fr-artwork--brown-cafe-creme .fr-artwork-minor{fill:#d1b781}.fr-artwork--brown-caramel .fr-artwork-minor{fill:#c08c65}.fr-artwork--brown-opera .fr-artwork-minor{fill:#bd987a}.fr-artwork--beige-gris-galet .fr-artwork-minor{fill:#aea397}[disabled] .fr-artwork *{fill:#929292}.fr-display-lg,.fr-display-md,.fr-display-sm,.fr-display-xl,.fr-display-xs,.fr-h1,.fr-h2,.fr-h3,.fr-h4,.fr-h5,.fr-h6{color:#161616}hr{background-image:linear-gradient(0deg,#ddd,#ddd)}.fr-hr-or:after,.fr-hr-or:before{background-color:#ddd}.fr-hr{background-image:linear-gradient(0deg,#ddd,#ddd)}.fr-range__max,.fr-range__min,.fr-range__output{min-width:1.5rem}.fr-range input[type=range]{padding:0}.fr-range[data-fr-js-range]{justify-content:flex-start}.fr-range[data-fr-js-range]:after{background-color:#000091;content:none}.fr-range[data-fr-js-range] .fr-range__max{margin-left:auto}.fr-range[data-fr-js-range] input[type=range]{margin-top:-.25rem}.fr-range[data-fr-js-range] input[type=range]::-ms-track{background:transparent;border-color:transparent;border-width:.625rem 0;color:transparent;height:.75rem}.fr-range[data-fr-js-range] input[type=range]::-ms-fill-lower{border-radius:.375rem;height:.75rem}.fr-range[data-fr-js-range] input[type=range]::-ms-thumb{background-color:#fff;border:1px solid #000091;border-radius:50%;box-shadow:0 0 0 1px rgba(0,0,18,.16);height:1.5rem;width:1.5rem;z-index:500}.fr-range[data-fr-js-range] input[type=range]:not(:only-of-type){pointer-events:auto}.fr-range[data-fr-js-range].fr-range--double{background-position-y:1.625rem;background-repeat:no-repeat}.fr-range[data-fr-js-range].fr-range--double .fr-range__output{min-width:3rem}.fr-range[data-fr-js-range].fr-range--double input[type=range]{width:calc(100% - 1.5rem)}.fr-range[data-fr-js-range].fr-range--double input[type=range]::-ms-fill-lower{background-color:transparent}.fr-range[data-fr-js-range].fr-range--double input[type=range]:first-of-type{margin-right:1.5rem;z-index:2}.fr-range[data-fr-js-range].fr-range--double input[type=range]:nth-of-type(2){left:1.5rem}.fr-range--sm[data-fr-js-range] .fr-range__max,.fr-range--sm[data-fr-js-range] .fr-range__min,.fr-range--sm[data-fr-js-range] .fr-range__output{min-width:1rem}.fr-range--sm[data-fr-js-range] input[type=range]::-ms-track{border-width:.5rem 0;height:.5rem}.fr-range--sm[data-fr-js-range] input[type=range]::-ms-fill-lower{height:.5rem}.fr-range--sm[data-fr-js-range] input[type=range]::-ms-thumb{height:1rem;width:1rem}.fr-range--sm[data-fr-js-range].fr-range--double{background-position-y:1.5rem}.fr-range--sm[data-fr-js-range].fr-range--double .fr-range__output{min-width:2rem}.fr-range--sm[data-fr-js-range].fr-range--double input[type=range]{width:calc(100% - 1rem)}.fr-range--sm[data-fr-js-range].fr-range--double input[type=range]:first-of-type{margin-right:1rem}.fr-range--sm[data-fr-js-range].fr-range--double input[type=range]:nth-of-type(2){left:1rem}.fr-range-group--disabled .fr-range--double[data-fr-js-range] input[type=range]:first-of-type::-ms-fill-lower,.fr-range-group--disabled .fr-range--double[data-fr-js-range] input[type=range]:nth-of-type(2)::-ms-fill-lower{background-color:transparent}.fr-range[data-fr-js-range]:before{box-shadow:inset 0 0 0 1px #000091}.fr-range[data-fr-js-range] input[type=range]:disabled::-ms-thumb{border:1px solid #e5e5e5}.fr-range__output{color:#000091}.fr-range__max,.fr-range__min{color:#666}.fr-range--step[data-fr-js-range]:before{background-image:radial-gradient(circle at 2px 50%,#000091 0,#000091 1px,transparent 0)}.fr-range--step[data-fr-js-range]:after{background-image:radial-gradient(circle at 2px 50%,#e3e3fd 0,#e3e3fd 2px,transparent 0);box-shadow:inset 10px 0 0 0 #000091,inset -10px 0 0 0 #000091}.fr-range--step.fr-range--sm[data-fr-js-range]:after{box-shadow:inset 6px 0 0 0 #000091,inset -6px 0 0 0 #000091}.fr-range-group--error:before{background-image:linear-gradient(0deg,#ce0500,#ce0500)}.fr-range-group--valid:before{background-image:linear-gradient(0deg,#18753c,#18753c)}.fr-range-group--disabled .fr-range[data-fr-js-range]:before{box-shadow:inset 0 0 0 1px #e5e5e5}.fr-range-group--disabled .fr-range[data-fr-js-range]:after{background-color:#e5e5e5}.fr-range-group--disabled .fr-range--step[data-fr-js-range]:before{background-image:radial-gradient(circle at 2px 50%,#e5e5e5 0,#e5e5e5 1px,transparent 0)}.fr-range-group--disabled .fr-range--step[data-fr-js-range]:after{background-image:radial-gradient(circle at 2px 50%,#fff 0,#fff 2px,transparent 0);box-shadow:inset 10px 0 0 0 #e5e5e5,inset -10px 0 0 0 #e5e5e5}.fr-range-group--disabled .fr-range__max,.fr-range-group--disabled .fr-range__min,.fr-range-group--disabled .fr-range__output{color:#929292}.fr-accordions-group ol,.fr-accordions-group ul{list-style-type:none}.fr-accordions-group ol,.fr-accordions-group ul{margin-bottom:0;margin-top:0;padding-left:0}.fr-accordion__btn:after,.fr-accordion__btn:before{background-color:transparent;background-image:url(../../assets/images/4a86895e5ee6121af909.svg);background-repeat:no-repeat;background-size:100%;height:1rem;width:1rem}.fr-accordion__btn[aria-expanded=true]:after{transform:rotate(-180deg)}.fr-accordion:before{box-shadow:inset 0 1px 0 0 #ddd,0 1px 0 0 #ddd}.fr-accordion__btn{color:#000091}.fr-accordion__btn[aria-expanded=true]{background-color:#e3e3fd}.fr-badge:after,.fr-badge:before{background-color:transparent;background-repeat:no-repeat;background-size:100%;height:1rem;width:1rem}.fr-badge--sm:before{height:.75rem;width:.75rem}.fr-badge--sm.fr-badge--info:after,.fr-badge--sm.fr-badge--info:before,.fr-badge.fr-badge--info:after,.fr-badge.fr-badge--info:before{background-image:url(../../assets/images/719d870fd2ef14580ede.svg)}.fr-badge--sm.fr-badge--success:after,.fr-badge--sm.fr-badge--success:before,.fr-badge.fr-badge--success:after,.fr-badge.fr-badge--success:before{background-image:url(../../assets/images/ea273050d938525cf347.svg)}.fr-badge--sm.fr-badge--error:after,.fr-badge--sm.fr-badge--error:before,.fr-badge.fr-badge--error:after,.fr-badge.fr-badge--error:before{background-image:url(../../assets/images/9e33ec01f6d0a9071b3e.svg)}.fr-badge--sm.fr-badge--warning:after,.fr-badge--sm.fr-badge--warning:before,.fr-badge.fr-badge--warning:after,.fr-badge.fr-badge--warning:before{background-image:url(../../assets/images/dfc431c99a853d95e0bd.svg)}.fr-badge--sm.fr-badge--new:after,.fr-badge--sm.fr-badge--new:before,.fr-badge.fr-badge--new:after,.fr-badge.fr-badge--new:before{background-image:url(../../assets/images/f9d25a79774639cf3a1c.svg)}ol.fr-badges-group,ul.fr-badges-group{list-style-type:none}ol.fr-badges-group,ul.fr-badges-group{margin-bottom:0;margin-top:0;padding-left:0}.fr-badge{background-color:#eee;color:#3a3a3a}.fr-badge--info{background-color:#e8edff;color:#0063cb}.fr-badge--error{background-color:#ffe9e9;color:#ce0500}.fr-badge--success{background-color:#b8fec9;color:#18753c}.fr-badge--warning{background-color:#ffe9e6;color:#b34000}.fr-badge--new{background-color:#feebd0;color:#695240}.fr-badge--green-tilleul-verveine{background-color:#fceeac;color:#66673d}.fr-badge--green-bourgeon{background-color:#c9fcac;color:#447049}.fr-badge--green-emeraude{background-color:#c3fad5;color:#297254}.fr-badge--green-menthe{background-color:#bafaee;color:#37635f}.fr-badge--green-archipel{background-color:#c7f6fc;color:#006a6f}.fr-badge--blue-ecume{background-color:#e9edfe;color:#2f4077}.fr-badge--blue-cumulus{background-color:#e6eefe;color:#3558a2}.fr-badge--purple-glycine{background-color:#fee7fc;color:#6e445a}.fr-badge--pink-macaron{background-color:#fee9e6;color:#8d533e}.fr-badge--pink-tuile{background-color:#fee9e7;color:#a94645}.fr-badge--yellow-tournesol{background-color:#feecc2;color:#716043}.fr-badge--yellow-moutarde{background-color:#feebd0;color:#695240}.fr-badge--orange-terre-battue{background-color:#fee9e5;color:#755348}.fr-badge--brown-cafe-creme{background-color:#f7ecdb;color:#685c48}.fr-badge--brown-caramel{background-color:#f7ebe5;color:#845d48}.fr-badge--brown-opera{background-color:#f7ece4;color:#745b47}.fr-badge--beige-gris-galet{background-color:#f3ede5;color:#6a6156}.fr-logo{color:#000}.fr-btn:after,.fr-btn:before{background-color:transparent;background-repeat:no-repeat;background-size:100%;height:1rem;width:1rem}.fr-btn[href]{text-decoration:none}.fr-btn.fr-btn--secondary:disabled:hover,.fr-btn.fr-btn--tertiary-no-outline:disabled:hover,.fr-btn.fr-btn--tertiary:disabled:hover{background-color:transparent}.fr-btn[class*=" fr-fi-"]:not([class^=fr-btn--icon-]):not([class*=" fr-btn--icon-"]):after,.fr-btn[class*=" fr-fi-"]:not([class^=fr-btn--icon-]):not([class*=" fr-btn--icon-"]):before,.fr-btn[class*=" fr-icon-"]:not([class^=fr-btn--icon-]):not([class*=" fr-btn--icon-"]):after,.fr-btn[class*=" fr-icon-"]:not([class^=fr-btn--icon-]):not([class*=" fr-btn--icon-"]):before,.fr-btn[class^=fr-fi-]:not([class^=fr-btn--icon-]):not([class*=" fr-btn--icon-"]):after,.fr-btn[class^=fr-fi-]:not([class^=fr-btn--icon-]):not([class*=" fr-btn--icon-"]):before,.fr-btn[class^=fr-icon-]:not([class^=fr-btn--icon-]):not([class*=" fr-btn--icon-"]):after,.fr-btn[class^=fr-icon-]:not([class^=fr-btn--icon-]):not([class*=" fr-btn--icon-"]):before{background-color:transparent;background-repeat:no-repeat;background-size:100%;height:1.5rem;width:1.5rem}.fr-btn--sm:after,.fr-btn--sm:before{background-color:transparent;background-repeat:no-repeat;background-size:100%;height:.75rem;width:.75rem}.fr-btn--sm[class*=" fr-fi-"]:not([class^=fr-btn--icon-]):not([class*=" fr-btn--icon-"]):after,.fr-btn--sm[class*=" fr-fi-"]:not([class^=fr-btn--icon-]):not([class*=" fr-btn--icon-"]):before,.fr-btn--sm[class*=" fr-icon-"]:not([class^=fr-btn--icon-]):not([class*=" fr-btn--icon-"]):after,.fr-btn--sm[class*=" fr-icon-"]:not([class^=fr-btn--icon-]):not([class*=" fr-btn--icon-"]):before,.fr-btn--sm[class^=fr-fi-]:not([class^=fr-btn--icon-]):not([class*=" fr-btn--icon-"]):after,.fr-btn--sm[class^=fr-fi-]:not([class^=fr-btn--icon-]):not([class*=" fr-btn--icon-"]):before,.fr-btn--sm[class^=fr-icon-]:not([class^=fr-btn--icon-]):not([class*=" fr-btn--icon-"]):after,.fr-btn--sm[class^=fr-icon-]:not([class^=fr-btn--icon-]):not([class*=" fr-btn--icon-"]):before{background-color:transparent;background-repeat:no-repeat;background-size:100%;height:1rem;width:1rem}.fr-btn--lg:after,.fr-btn--lg:before{background-color:transparent;background-repeat:no-repeat;background-size:100%;height:1.5rem;width:1.5rem}.fr-btn--lg[class*=" fr-fi-"]:not([class^=fr-btn--icon-]):not([class*=" fr-btn--icon-"]):after,.fr-btn--lg[class*=" fr-fi-"]:not([class^=fr-btn--icon-]):not([class*=" fr-btn--icon-"]):before,.fr-btn--lg[class*=" fr-icon-"]:not([class^=fr-btn--icon-]):not([class*=" fr-btn--icon-"]):after,.fr-btn--lg[class*=" fr-icon-"]:not([class^=fr-btn--icon-]):not([class*=" fr-btn--icon-"]):before,.fr-btn--lg[class^=fr-fi-]:not([class^=fr-btn--icon-]):not([class*=" fr-btn--icon-"]):after,.fr-btn--lg[class^=fr-fi-]:not([class^=fr-btn--icon-]):not([class*=" fr-btn--icon-"]):before,.fr-btn--lg[class^=fr-icon-]:not([class^=fr-btn--icon-]):not([class*=" fr-btn--icon-"]):after,.fr-btn--lg[class^=fr-icon-]:not([class^=fr-btn--icon-]):not([class*=" fr-btn--icon-"]):before{background-color:transparent;background-repeat:no-repeat;background-size:100%;height:2rem;width:2rem}.fr-btn--close:after,.fr-btn--close:before{background-image:url(../../assets/images/69dfb9f70fe1180898d7.svg)}.fr-btn--close:after,.fr-btn--close:before,.fr-btn--tooltip:after,.fr-btn--tooltip:before{background-color:transparent;background-repeat:no-repeat;background-size:100%;height:1rem;width:1rem}.fr-btn--tooltip:after,.fr-btn--tooltip:before{background-image:url(../../assets/images/e7bac55db823e2fff520.svg)}.fr-btn--fullscreen:after,.fr-btn--fullscreen:before{background-image:url(../../assets/images/f6e7658074f30aea13c9.svg)}.fr-btn--display:after,.fr-btn--display:before,.fr-btn--fullscreen:after,.fr-btn--fullscreen:before{background-color:transparent;background-repeat:no-repeat;background-size:100%;height:1rem;width:1rem}.fr-btn--display:after,.fr-btn--display:before{background-image:url(../../assets/images/612a73b3b57ae5174141.svg)}.fr-btn--briefcase:after,.fr-btn--briefcase:before{background-image:url(../../assets/images/4cc7b952227d89154a3c.svg)}.fr-btn--account:after,.fr-btn--account:before,.fr-btn--briefcase:after,.fr-btn--briefcase:before{background-color:transparent;background-repeat:no-repeat;background-size:100%;height:1rem;width:1rem}.fr-btn--account:after,.fr-btn--account:before{background-image:url(../../assets/images/f0988f904b456de54307.svg)}.fr-btn--team:after,.fr-btn--team:before{background-image:url(../../assets/images/d2ee906545c132a6ec5c.svg)}.fr-btn--sort:after,.fr-btn--sort:before,.fr-btn--team:after,.fr-btn--team:before{background-color:transparent;background-repeat:no-repeat;background-size:100%;height:1rem;width:1rem}.fr-btn--sort:after,.fr-btn--sort:before{background-image:url(../../assets/images/21f69e91424c407eb09a.svg)}.fr-btn--sort:before{transition:transform .3s}.fr-btn--sort[aria-sorting=desc]:before{transform:rotate(-180deg)}.fr-btn--sort[aria-sorting=asc]:after,.fr-btn--sort[aria-sorting=asc]:before,.fr-btn--sort[aria-sorting=desc]:after,.fr-btn--sort[aria-sorting=desc]:before{background-color:transparent;background-image:url(../../assets/images/4648a2eb31198cc757a8.svg);background-repeat:no-repeat;background-size:100%;height:1rem;width:1rem}ol.fr-btns-group,ul.fr-btns-group{list-style-type:none}ol.fr-btns-group,ul.fr-btns-group{margin-bottom:0;margin-top:0;padding-left:0}.fr-btns-group--sm:not([class^=fr-btns-group--icon-]):not([class*=" fr-btns-group--icon-"]) .fr-btn[class*=" fr-fi-"]:after,.fr-btns-group--sm:not([class^=fr-btns-group--icon-]):not([class*=" fr-btns-group--icon-"]) .fr-btn[class*=" fr-fi-"]:before,.fr-btns-group--sm:not([class^=fr-btns-group--icon-]):not([class*=" fr-btns-group--icon-"]) .fr-btn[class*=" fr-icon-"]:after,.fr-btns-group--sm:not([class^=fr-btns-group--icon-]):not([class*=" fr-btns-group--icon-"]) .fr-btn[class*=" fr-icon-"]:before,.fr-btns-group--sm:not([class^=fr-btns-group--icon-]):not([class*=" fr-btns-group--icon-"]) .fr-btn[class^=fr-fi-]:after,.fr-btns-group--sm:not([class^=fr-btns-group--icon-]):not([class*=" fr-btns-group--icon-"]) .fr-btn[class^=fr-fi-]:before,.fr-btns-group--sm:not([class^=fr-btns-group--icon-]):not([class*=" fr-btns-group--icon-"]) .fr-btn[class^=fr-icon-]:after,.fr-btns-group--sm:not([class^=fr-btns-group--icon-]):not([class*=" fr-btns-group--icon-"]) .fr-btn[class^=fr-icon-]:before{background-color:transparent;background-repeat:no-repeat;background-size:100%;height:1rem;width:1rem}.fr-btns-group--lg:not([class^=fr-btns-group--icon-]):not([class*=" fr-btns-group--icon-"]) .fr-btn[class*=" fr-fi-"]:after,.fr-btns-group--lg:not([class^=fr-btns-group--icon-]):not([class*=" fr-btns-group--icon-"]) .fr-btn[class*=" fr-fi-"]:before,.fr-btns-group--lg:not([class^=fr-btns-group--icon-]):not([class*=" fr-btns-group--icon-"]) .fr-btn[class*=" fr-icon-"]:after,.fr-btns-group--lg:not([class^=fr-btns-group--icon-]):not([class*=" fr-btns-group--icon-"]) .fr-btn[class*=" fr-icon-"]:before,.fr-btns-group--lg:not([class^=fr-btns-group--icon-]):not([class*=" fr-btns-group--icon-"]) .fr-btn[class^=fr-fi-]:after,.fr-btns-group--lg:not([class^=fr-btns-group--icon-]):not([class*=" fr-btns-group--icon-"]) .fr-btn[class^=fr-fi-]:before,.fr-btns-group--lg:not([class^=fr-btns-group--icon-]):not([class*=" fr-btns-group--icon-"]) .fr-btn[class^=fr-icon-]:after,.fr-btns-group--lg:not([class^=fr-btns-group--icon-]):not([class*=" fr-btns-group--icon-"]) .fr-btn[class^=fr-icon-]:before{background-color:transparent;background-repeat:no-repeat;background-size:100%;height:2rem;width:2rem}.fr-btn{background-color:#000091;color:#f5f5fe}.fr-btn:hover{background-color:#1212ff}.fr-btn:active{background-color:#2323ff}.fr-btn:disabled,a.fr-btn:not([href]){background-color:#e5e5e5;color:#929292}.fr-btn--secondary{background-color:transparent;box-shadow:inset 0 0 0 1px #000091;color:#000091}.fr-btn--secondary:hover{background-color:rgba(0,0,0,.05)}.fr-btn--secondary:active{background-color:rgba(0,0,0,.1)}.fr-btn--secondary:disabled,a.fr-btn--secondary:not([href]){background-color:transparent;box-shadow:inset 0 0 0 1px #e5e5e5;color:#929292}.fr-btn--secondary:disabled:hover,a.fr-btn--secondary:not([href]):hover{background-color:rgba(0,0,0,.05)}.fr-btn--secondary:disabled:active,a.fr-btn--secondary:not([href]):active{background-color:rgba(0,0,0,.1)}.fr-btn--account,.fr-btn--sort,.fr-btn--tertiary{background-color:transparent;box-shadow:inset 0 0 0 1px #ddd;color:#000091}.fr-btn--account:hover,.fr-btn--sort:hover,.fr-btn--tertiary:hover{background-color:rgba(0,0,0,.05)}.fr-btn--account:active,.fr-btn--sort:active,.fr-btn--tertiary:active{background-color:rgba(0,0,0,.1)}.fr-btn--account:disabled,.fr-btn--sort:disabled,.fr-btn--tertiary:disabled,a.fr-btn--account:not([href]),a.fr-btn--sort:not([href]),a.fr-btn--tertiary:not([href]){background-color:transparent;box-shadow:inset 0 0 0 1px #e5e5e5;color:#929292}.fr-btn--account:disabled:hover,.fr-btn--sort:disabled:hover,.fr-btn--tertiary:disabled:hover,a.fr-btn--account:not([href]):hover,a.fr-btn--sort:not([href]):hover,a.fr-btn--tertiary:not([href]):hover{background-color:rgba(0,0,0,.05)}.fr-btn--account:disabled:active,.fr-btn--sort:disabled:active,.fr-btn--tertiary:disabled:active,a.fr-btn--account:not([href]):active,a.fr-btn--sort:not([href]):active,a.fr-btn--tertiary:not([href]):active{background-color:rgba(0,0,0,.1)}.fr-btn--briefcase,.fr-btn--close,.fr-btn--display,.fr-btn--fullscreen,.fr-btn--team,.fr-btn--tertiary-no-outline,.fr-btn--tooltip{background-color:transparent;color:#000091}.fr-btn--briefcase:hover,.fr-btn--close:hover,.fr-btn--display:hover,.fr-btn--fullscreen:hover,.fr-btn--team:hover,.fr-btn--tertiary-no-outline:hover,.fr-btn--tooltip:hover{background-color:rgba(0,0,0,.05)}.fr-btn--briefcase:active,.fr-btn--close:active,.fr-btn--display:active,.fr-btn--fullscreen:active,.fr-btn--team:active,.fr-btn--tertiary-no-outline:active,.fr-btn--tooltip:active{background-color:rgba(0,0,0,.1)}.fr-btn--briefcase:disabled,.fr-btn--close:disabled,.fr-btn--display:disabled,.fr-btn--fullscreen:disabled,.fr-btn--team:disabled,.fr-btn--tertiary-no-outline:disabled,.fr-btn--tooltip:disabled,a.fr-btn--briefcase:not([href]),a.fr-btn--close:not([href]),a.fr-btn--display:not([href]),a.fr-btn--fullscreen:not([href]),a.fr-btn--team:not([href]),a.fr-btn--tertiary-no-outline:not([href]),a.fr-btn--tooltip:not([href]){background-color:transparent;color:#929292}.fr-btn--briefcase:disabled:hover,.fr-btn--close:disabled:hover,.fr-btn--display:disabled:hover,.fr-btn--fullscreen:disabled:hover,.fr-btn--team:disabled:hover,.fr-btn--tertiary-no-outline:disabled:hover,.fr-btn--tooltip:disabled:hover,a.fr-btn--briefcase:not([href]):hover,a.fr-btn--close:not([href]):hover,a.fr-btn--display:not([href]):hover,a.fr-btn--fullscreen:not([href]):hover,a.fr-btn--team:not([href]):hover,a.fr-btn--tertiary-no-outline:not([href]):hover,a.fr-btn--tooltip:not([href]):hover{background-color:rgba(0,0,0,.05)}.fr-btn--briefcase:disabled:active,.fr-btn--close:disabled:active,.fr-btn--display:disabled:active,.fr-btn--fullscreen:disabled:active,.fr-btn--team:disabled:active,.fr-btn--tertiary-no-outline:disabled:active,.fr-btn--tooltip:disabled:active,a.fr-btn--briefcase:not([href]):active,a.fr-btn--close:not([href]):active,a.fr-btn--display:not([href]):active,a.fr-btn--fullscreen:not([href]):active,a.fr-btn--team:not([href]):active,a.fr-btn--tertiary-no-outline:not([href]):active,a.fr-btn--tooltip:not([href]):active{background-color:rgba(0,0,0,.1)}.fr-connect{background-color:#000091;color:#f5f5fe}.fr-connect:disabled,a.fr-connect:not([href]){background-color:#e5e5e5;color:#929292}.fr-connect-group .fr-connect+p a{color:#000091}.fr-connect-group p{color:#666}.fr-quote:after,.fr-quote:before{background-color:transparent;background-image:url(../../assets/images/ca29c8856e4d207fa5e9.svg);background-repeat:no-repeat;background-size:100%;height:2rem;width:2rem}ol.fr-quote__source,ul.fr-quote__source{list-style-type:none}ol.fr-quote__source,ul.fr-quote__source{margin-bottom:0;margin-top:0;padding-left:0}.fr-quote blockquote{max-width:100%}.fr-quote:before{color:#6a6af4}.fr-quote--green-tilleul-verveine:before{color:#b7a73f}.fr-quote--green-bourgeon:before{color:#68a532}.fr-quote--green-emeraude:before{color:#00a95f}.fr-quote--green-menthe:before{color:#009081}.fr-quote--green-archipel:before{color:#009099}.fr-quote--blue-ecume:before{color:#465f9d}.fr-quote--blue-cumulus:before{color:#417dc4}.fr-quote--purple-glycine:before{color:#a558a0}.fr-quote--pink-macaron:before{color:#e18b76}.fr-quote--pink-tuile:before{color:#ce614a}.fr-quote--yellow-tournesol:before{color:#c8aa39}.fr-quote--yellow-moutarde:before{color:#c3992a}.fr-quote--orange-terre-battue:before{color:#e4794a}.fr-quote--brown-cafe-creme:before{color:#d1b781}.fr-quote--brown-caramel:before{color:#c08c65}.fr-quote--brown-opera:before{color:#bd987a}.fr-quote--beige-gris-galet:before{color:#aea397}.fr-quote{background-image:linear-gradient(0deg,#ddd,#ddd)}.fr-quote__source{color:#666}.fr-breadcrumb ol,.fr-breadcrumb ul{list-style-type:none}.fr-breadcrumb ol,.fr-breadcrumb ul{margin-bottom:0;margin-top:0;padding-left:0}.fr-breadcrumb__link:not([aria-current]):after,.fr-breadcrumb__link[aria-current=false]:after{background-color:transparent;background-image:url(../../assets/images/f6aba782df5e024ccbbc.svg);background-repeat:no-repeat;background-size:100%;content:"";display:inline-block;height:1rem;margin-left:.5rem;margin-right:-.25rem;pointer-events:none;vertical-align:-4px;width:1rem}.fr-breadcrumb{color:#666}.fr-breadcrumb__link[aria-current]:not([aria-current=false]){color:#3a3a3a}.fr-fieldset__legend{color:#161616;max-width:100%}.fr-message--error:after,.fr-message--error:before{background-color:transparent;background-image:url(../../assets/images/9e33ec01f6d0a9071b3e.svg);background-repeat:no-repeat;background-size:100%;height:1rem;width:1rem}.fr-message--valid:after,.fr-message--valid:before{background-image:url(../../assets/images/ea273050d938525cf347.svg)}.fr-message--info:after,.fr-message--info:before,.fr-message--valid:after,.fr-message--valid:before{background-color:transparent;background-repeat:no-repeat;background-size:100%;height:1rem;width:1rem}.fr-message--info:after,.fr-message--info:before{background-image:url(../../assets/images/719d870fd2ef14580ede.svg)}.fr-input-group--valid label,.fr-range-group--valid label,.fr-select-group--valid label,.fr-upload-group--valid label{color:#18753c}.fr-input-group--error label,.fr-range-group--error label,.fr-select-group--error label,.fr-upload-group--error label{color:#ce0500}.fr-input-group--info label,.fr-range-group--info label,.fr-select-group--info label,.fr-upload-group--info label{color:#0063cb}.fr-input-group--disabled .fr-hint-text,.fr-input-group--disabled label,.fr-range-group--disabled .fr-hint-text,.fr-range-group--disabled label,.fr-select-group--disabled .fr-hint-text,.fr-select-group--disabled label,.fr-upload-group--disabled .fr-hint-text,.fr-upload-group--disabled label{color:#929292}.fr-label{color:#161616}.fr-label--error{color:#ce0500}.fr-label--success{color:#18753c}.fr-label--info{color:#0063cb}.fr-label--disabled,.fr-label--disabled .fr-hint-text{color:#929292}.fr-hint-text,.fr-message{color:#666}.fr-message--error{color:#ce0500}.fr-message--valid{color:#18753c}.fr-message--info{color:#0063cb}.fr-fieldset input:disabled+label,.fr-fieldset input:disabled+label .fr-hint-text,.fr-fieldset input:disabled+label+.fr-hint-text,.fr-fieldset:disabled .fr-fieldset__legend,.fr-fieldset:disabled .fr-hint-text,.fr-fieldset:disabled .fr-label{color:#929292}.fr-fieldset--error,.fr-fieldset--error .fr-fieldset__legend{background-image:linear-gradient(0deg,#ce0500,#ce0500)}.fr-fieldset--error .fr-fieldset__legend,.fr-fieldset--error .fr-label{color:#ce0500}.fr-fieldset--valid,.fr-fieldset--valid .fr-fieldset__legend{background-image:linear-gradient(0deg,#18753c,#18753c)}.fr-fieldset--valid .fr-fieldset__legend,.fr-fieldset--valid .fr-label{color:#18753c}.fr-fieldset--info,.fr-fieldset--info .fr-fieldset__legend{background-image:linear-gradient(0deg,#0063cb,#0063cb)}.fr-fieldset--info .fr-fieldset__legend,.fr-fieldset--info .fr-label{color:#0063cb}.fr-error-text:after,.fr-error-text:before{background-image:url(../../assets/images/9e33ec01f6d0a9071b3e.svg)}.fr-error-text:after,.fr-error-text:before,.fr-valid-text:after,.fr-valid-text:before{background-color:transparent;background-repeat:no-repeat;background-size:100%;height:1rem;width:1rem}.fr-valid-text:after,.fr-valid-text:before{background-image:url(../../assets/images/ea273050d938525cf347.svg)}.fr-error-text{color:#ce0500}.fr-valid-text{color:#18753c}.fr-info-text{color:#0063cb}.fr-fieldset--valid .fr-fieldset__content:before{box-shadow:inset 2px 0 0 0 #18753c}.fr-fieldset--error .fr-fieldset__content:before{box-shadow:inset 2px 0 0 0 #ce0500}.fr-fieldset--info .fr-fieldset__content:before{box-shadow:inset 2px 0 0 0 #0063cb}.fr-stepper__title{color:#161616;margin-bottom:.75rem}.fr-stepper__steps{background-image:repeating-linear-gradient(to right,#000091 0,#000091 var(--active-inner),transparent var(--active-inner),transparent var(--active-outer)),repeating-linear-gradient(to right,#eee 0,#eee var(--default-inner),transparent var(--default-inner),transparent var(--default-outer));display:none}.fr-stepper__details,.fr-stepper__state{color:#666}.fr-tooltip{color:#3a3a3a;margin-top:.5rem;position:relative}.fr-tooltip.fr-placement{background-image:linear-gradient(90deg,#fff,#fff);box-shadow:0 0 0 1px rgba(0,0,18,.16);z-index:1000}.fr-link{background-image:none;color:#000091;text-decoration:underline}.fr-link--sm:before,.fr-link:before{height:1rem;width:1rem}.fr-link--lg:before,.fr-link--sm:before,.fr-link:before{background-color:transparent;background-repeat:no-repeat;background-size:100%}.fr-link--lg:before{height:1.5rem;width:1.5rem}ol.fr-links-group,ul.fr-links-group{list-style-type:none}ol.fr-links-group,ul.fr-links-group{margin-bottom:0;margin-top:0;padding-left:0}.fr-link__detail{color:#666}.fr-links-group li::marker{color:#000091}.fr-links-group--bordered{box-shadow:inset 0 0 0 1px #ddd}.fr-link--close{background-color:transparent;color:#000091}.fr-link--close:hover{background-color:rgba(0,0,0,.05)}.fr-link--close:active{background-color:rgba(0,0,0,.1)}.fr-link--close:disabled,a.fr-link--close:not([href]){background-color:transparent;color:#929292}.fr-link--close:disabled:hover,a.fr-link--close:not([href]):hover{background-color:rgba(0,0,0,.05)}.fr-link--close:disabled:active,a.fr-link--close:not([href]):active{background-color:rgba(0,0,0,.1)}.fr-sidemenu{box-shadow:inset 0 -1px 0 0 #ddd,inset 0 1px 0 0 #ddd;height:auto}.fr-sidemenu ol,.fr-sidemenu ul{list-style-type:none}.fr-sidemenu ol,.fr-sidemenu ul{margin-bottom:0;margin-top:0;padding-left:0}.fr-sidemenu [href]{text-decoration:none}.fr-sidemenu__btn[aria-expanded]:after{background-color:transparent;background-image:url(../../assets/images/4a86895e5ee6121af909.svg);background-repeat:no-repeat;background-size:100%;height:1rem;width:1rem}.fr-sidemenu__title{box-shadow:inset 0 -1px 0 0 #ddd;color:#161616}.fr-sidemenu__item .fr-sidemenu__btn,.fr-sidemenu__item .fr-sidemenu__link{color:#161616}.fr-sidemenu__item:before{box-shadow:0 -1px 0 0 #ddd,inset 0 -1px 0 0 #ddd}.fr-sidemenu__item:first-child:before{box-shadow:inset 0 -1px 0 0 #ddd}.fr-sidemenu__item:last-child:before{box-shadow:0 -1px 0 0 #ddd}.fr-sidemenu__btn,.fr-sidemenu__btn[aria-current]:not([aria-current=false]),.fr-sidemenu__link,.fr-sidemenu__link[aria-current]:not([aria-current=false]){color:#000091}.fr-sidemenu__btn[aria-current]:not([aria-current=false]):before,.fr-sidemenu__link[aria-current]:not([aria-current=false]):before{background-color:#000091}.fr-sidemenu__btn[aria-expanded=true]{background-color:#e3e3fd}.fr-highlight{background-image:linear-gradient(0deg,#6a6af4,#6a6af4)}.fr-highlight--green-tilleul-verveine{background-image:linear-gradient(0deg,#b7a73f,#b7a73f)}.fr-highlight--green-bourgeon{background-image:linear-gradient(0deg,#68a532,#68a532)}.fr-highlight--green-emeraude{background-image:linear-gradient(0deg,#00a95f,#00a95f)}.fr-highlight--green-menthe{background-image:linear-gradient(0deg,#009081,#009081)}.fr-highlight--green-archipel{background-image:linear-gradient(0deg,#009099,#009099)}.fr-highlight--blue-ecume{background-image:linear-gradient(0deg,#465f9d,#465f9d)}.fr-highlight--blue-cumulus{background-image:linear-gradient(0deg,#417dc4,#417dc4)}.fr-highlight--purple-glycine{background-image:linear-gradient(0deg,#a558a0,#a558a0)}.fr-highlight--pink-macaron{background-image:linear-gradient(0deg,#e18b76,#e18b76)}.fr-highlight--pink-tuile{background-image:linear-gradient(0deg,#ce614a,#ce614a)}.fr-highlight--yellow-tournesol{background-image:linear-gradient(0deg,#c8aa39,#c8aa39)}.fr-highlight--yellow-moutarde{background-image:linear-gradient(0deg,#c3992a,#c3992a)}.fr-highlight--orange-terre-battue{background-image:linear-gradient(0deg,#e4794a,#e4794a)}.fr-highlight--brown-cafe-creme{background-image:linear-gradient(0deg,#d1b781,#d1b781)}.fr-highlight--brown-caramel{background-image:linear-gradient(0deg,#c08c65,#c08c65)}.fr-highlight--brown-opera{background-image:linear-gradient(0deg,#bd987a,#bd987a)}.fr-highlight--beige-gris-galet{background-image:linear-gradient(0deg,#aea397,#aea397)}.fr-tabs ol,.fr-tabs ul{list-style-type:none}.fr-tabs ol,.fr-tabs ul{margin-bottom:0;margin-top:0;padding-left:0}.fr-tabs:before{bottom:0;box-shadow:inset 0 1px 0 0 #ddd,inset 1px 0 0 0 #ddd,inset -1px 0 0 0 #ddd;left:0;position:absolute;right:0;top:3rem}.fr-tabs .fr-tabs__list{padding:.25rem .75rem}.fr-tabs__tab:after,.fr-tabs__tab:before{height:1rem;width:1rem}.fr-tabs__panel{left:0;padding:0 .1px}.fr-tabs__panel [href]{text-decoration:underline}.fr-tabs__panel>*{margin-left:1rem;margin-right:1rem}.fr-tabs__panel>:first-child{margin-top:.75rem}.fr-tabs__panel>:last-child{margin-bottom:1rem}.fr-tabs{box-shadow:inset 0 -1px 0 0 #ddd}.fr-tabs__tab{background-image:linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd);box-shadow:0 2px 0 0 #fff}.fr-tabs__tab:not([aria-selected=true]){background-color:#e3e3fd;color:#161616}.fr-tabs__tab[aria-selected=true]:not(:disabled){background-color:#fff;background-image:linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd);color:#000091}.fr-tabs__tab:disabled{background-color:#e5e5e5;color:#929292}.fr-pagination [href]{text-decoration:none}.fr-pagination ol,.fr-pagination ul{list-style-type:none}.fr-pagination ol,.fr-pagination ul{margin-bottom:0;margin-top:0;padding-left:0}.fr-pagination .fr-pagination__link--first:after,.fr-pagination .fr-pagination__link--first:before{background-color:transparent;background-image:url(../../assets/images/0cdcecad9ad8958941f1.svg);background-repeat:no-repeat;background-size:100%;height:1.5rem;width:1.5rem}.fr-pagination .fr-pagination__link--prev:after,.fr-pagination .fr-pagination__link--prev:before{background-color:transparent;background-image:url(../../assets/images/dd6f55cf15bed3c3f4f8.svg);background-repeat:no-repeat;background-size:100%;height:1.5rem;width:1.5rem}.fr-pagination .fr-pagination__link--next:after,.fr-pagination .fr-pagination__link--next:before{background-color:transparent;background-image:url(../../assets/images/f6aba782df5e024ccbbc.svg);background-repeat:no-repeat;background-size:100%;height:1.5rem;width:1.5rem}.fr-pagination .fr-pagination__link--last:after,.fr-pagination .fr-pagination__link--last:before{background-color:transparent;background-image:url(../../assets/images/6a8c4f5be92a6a9b36a8.svg);background-repeat:no-repeat;background-size:100%;height:1.5rem;width:1.5rem}.fr-pagination{color:#161616}.fr-pagination__link[aria-current]:not([aria-current=false]){background-color:#000091;color:#f5f5fe}.fr-pagination__link[aria-current]:not([aria-current=false]):hover{background-color:#1212ff}.fr-pagination__link[aria-current]:not([aria-current=false]):active{background-color:#2323ff}.fr-pagination__link:not([aria-current]):disabled,.fr-pagination__link[aria-current=false]:disabled,a.fr-pagination__link:not([aria-current]):not([href]),a.fr-pagination__link[aria-current=false]:not([href]){color:#929292}.fr-summary ol{list-style-type:decimal}.fr-summary__link:before{content:none}.fr-summary{background-color:#eee}.fr-summary li>a,.fr-summary__title{color:#161616}.fr-table__header .fr-segmented{flex:1}.fr-table__header .fr-table__detail{flex:2}.fr-table__content table,.fr-table__content table thead tr th,.fr-table__content table thead tr th:last-child{background-image:none}.fr-table__content table thead tr th[role=columnheader]{background-position:100% 0;background-repeat:no-repeat;background-size:1px 100%}.fr-table__content table tbody tr{background-image:none}.fr-table__content table tbody tr[aria-selected=true]:after{content:none}.fr-table__content table tbody tr[aria-selected=true] td,.fr-table__content table tbody tr[aria-selected=true] th{border-bottom:2px solid #000091;border-top:2px solid #000091}.fr-table__content table tbody tr[aria-selected=true] td:first-child,.fr-table__content table tbody tr[aria-selected=true] th:first-child{border-left:2px solid #000091}.fr-table__content table tbody tr[aria-selected=true] td:last-child,.fr-table__content table tbody tr[aria-selected=true] th:last-child{border-right:2px solid #000091}.fr-table[data-fr-js-table=true] .fr-table__wrapper:after{content:none}.fr-table[data-fr-js-table=true] caption,.fr-table[data-fr-js-table=true].fr-table--caption-bottom caption,.fr-table[data-fr-js-table=true].fr-table--no-caption caption{margin-bottom:1rem;position:relative}.fr-table--bordered table td:last-child,.fr-table--bordered table th:last-child{border-right:none}.fr-table__wrapper:after{background-image:linear-gradient(0deg,#929292,#929292),linear-gradient(0deg,#929292,#929292),linear-gradient(0deg,#929292,#929292),linear-gradient(0deg,#929292,#929292)}.fr-table__content table caption{color:#161616}.fr-table__content table thead th{background-color:#f6f6f6;background-image:linear-gradient(0deg,#3a3a3a,#3a3a3a),linear-gradient(0deg,#929292,#929292)}.fr-table__content table thead th[role=columnheader]{background-image:linear-gradient(0deg,#3a3a3a,#3a3a3a),linear-gradient(0deg,#3a3a3a,#3a3a3a)}.fr-table__content table thead th:last-child{background-color:#f6f6f6;background-image:linear-gradient(0deg,#3a3a3a,#3a3a3a)}.fr-table__content table tbody tr:after{background-image:linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091)}.fr-table__content table tbody td{background-color:#fff;background-image:linear-gradient(0deg,#929292,#929292),linear-gradient(0deg,#929292,#929292)}.fr-table__content table tbody th{background-color:#f6f6f6;background-image:linear-gradient(0deg,#929292,#929292),linear-gradient(0deg,#3a3a3a,#3a3a3a)}.fr-table__detail{color:#666}.fr-table>table caption{color:#161616}.fr-table>table tbody:after,.fr-table>table thead:after{background-image:linear-gradient(0deg,#929292,#929292),linear-gradient(0deg,#929292,#929292),linear-gradient(0deg,#929292,#929292)}.fr-table>table thead{background-color:#f6f6f6;background-image:linear-gradient(0deg,#3a3a3a,#3a3a3a);background-image:none;color:#161616}.fr-table>table tbody{background-color:#fff}.fr-table>table tbody tr:nth-child(2n){background-color:#f6f6f6}.fr-table--green-tilleul-verveine>table:after{background-image:linear-gradient(0deg,#b7a73f,#b7a73f),linear-gradient(0deg,#b7a73f,#b7a73f),linear-gradient(0deg,#b7a73f,#b7a73f),linear-gradient(0deg,#b7a73f,#b7a73f)}.fr-table--green-tilleul-verveine>table thead{background-color:#fceeac;background-image:linear-gradient(0deg,#66673d,#66673d);background-image:none}.fr-table--green-tilleul-verveine>table tbody{background-color:#fef7da}.fr-table--green-tilleul-verveine>table tbody tr:nth-child(2n){background-color:#fceeac}.fr-table--green-tilleul-verveine.fr-table--bordered>table tbody tr{background-image:linear-gradient(0deg,#b7a73f,#b7a73f);background-image:none}.fr-table--green-bourgeon>table:after{background-image:linear-gradient(0deg,#68a532,#68a532),linear-gradient(0deg,#68a532,#68a532),linear-gradient(0deg,#68a532,#68a532),linear-gradient(0deg,#68a532,#68a532)}.fr-table--green-bourgeon>table thead{background-color:#c9fcac;background-image:linear-gradient(0deg,#447049,#447049);background-image:none}.fr-table--green-bourgeon>table tbody{background-color:#e6feda}.fr-table--green-bourgeon>table tbody tr:nth-child(2n){background-color:#c9fcac}.fr-table--green-bourgeon.fr-table--bordered>table tbody tr{background-image:linear-gradient(0deg,#68a532,#68a532);background-image:none}.fr-table--green-emeraude>table:after{background-image:linear-gradient(0deg,#00a95f,#00a95f),linear-gradient(0deg,#00a95f,#00a95f),linear-gradient(0deg,#00a95f,#00a95f),linear-gradient(0deg,#00a95f,#00a95f)}.fr-table--green-emeraude>table thead{background-color:#c3fad5;background-image:linear-gradient(0deg,#297254,#297254);background-image:none}.fr-table--green-emeraude>table tbody{background-color:#e3fdeb}.fr-table--green-emeraude>table tbody tr:nth-child(2n){background-color:#c3fad5}.fr-table--green-emeraude.fr-table--bordered>table tbody tr{background-image:linear-gradient(0deg,#00a95f,#00a95f);background-image:none}.fr-table--green-menthe>table:after{background-image:linear-gradient(0deg,#009081,#009081),linear-gradient(0deg,#009081,#009081),linear-gradient(0deg,#009081,#009081),linear-gradient(0deg,#009081,#009081)}.fr-table--green-menthe>table thead{background-color:#bafaee;background-image:linear-gradient(0deg,#37635f,#37635f);background-image:none}.fr-table--green-menthe>table tbody{background-color:#dffdf7}.fr-table--green-menthe>table tbody tr:nth-child(2n){background-color:#bafaee}.fr-table--green-menthe.fr-table--bordered>table tbody tr{background-image:linear-gradient(0deg,#009081,#009081);background-image:none}.fr-table--green-archipel>table:after{background-image:linear-gradient(0deg,#009099,#009099),linear-gradient(0deg,#009099,#009099),linear-gradient(0deg,#009099,#009099),linear-gradient(0deg,#009099,#009099)}.fr-table--green-archipel>table thead{background-color:#c7f6fc;background-image:linear-gradient(0deg,#006a6f,#006a6f);background-image:none}.fr-table--green-archipel>table tbody{background-color:#e5fbfd}.fr-table--green-archipel>table tbody tr:nth-child(2n){background-color:#c7f6fc}.fr-table--green-archipel.fr-table--bordered>table tbody tr{background-image:linear-gradient(0deg,#009099,#009099);background-image:none}.fr-table--blue-ecume>table:after{background-image:linear-gradient(0deg,#465f9d,#465f9d),linear-gradient(0deg,#465f9d,#465f9d),linear-gradient(0deg,#465f9d,#465f9d),linear-gradient(0deg,#465f9d,#465f9d)}.fr-table--blue-ecume>table thead{background-color:#e9edfe;background-image:linear-gradient(0deg,#2f4077,#2f4077);background-image:none}.fr-table--blue-ecume>table tbody{background-color:#f4f6fe}.fr-table--blue-ecume>table tbody tr:nth-child(2n){background-color:#e9edfe}.fr-table--blue-ecume.fr-table--bordered>table tbody tr{background-image:linear-gradient(0deg,#465f9d,#465f9d);background-image:none}.fr-table--blue-cumulus>table:after{background-image:linear-gradient(0deg,#417dc4,#417dc4),linear-gradient(0deg,#417dc4,#417dc4),linear-gradient(0deg,#417dc4,#417dc4),linear-gradient(0deg,#417dc4,#417dc4)}.fr-table--blue-cumulus>table thead{background-color:#e6eefe;background-image:linear-gradient(0deg,#3558a2,#3558a2);background-image:none}.fr-table--blue-cumulus>table tbody{background-color:#f3f6fe}.fr-table--blue-cumulus>table tbody tr:nth-child(2n){background-color:#e6eefe}.fr-table--blue-cumulus.fr-table--bordered>table tbody tr{background-image:linear-gradient(0deg,#417dc4,#417dc4);background-image:none}.fr-table--purple-glycine>table:after{background-image:linear-gradient(0deg,#a558a0,#a558a0),linear-gradient(0deg,#a558a0,#a558a0),linear-gradient(0deg,#a558a0,#a558a0),linear-gradient(0deg,#a558a0,#a558a0)}.fr-table--purple-glycine>table thead{background-color:#fee7fc;background-image:linear-gradient(0deg,#6e445a,#6e445a);background-image:none}.fr-table--purple-glycine>table tbody{background-color:#fef3fd}.fr-table--purple-glycine>table tbody tr:nth-child(2n){background-color:#fee7fc}.fr-table--purple-glycine.fr-table--bordered>table tbody tr{background-image:linear-gradient(0deg,#a558a0,#a558a0);background-image:none}.fr-table--pink-macaron>table:after{background-image:linear-gradient(0deg,#e18b76,#e18b76),linear-gradient(0deg,#e18b76,#e18b76),linear-gradient(0deg,#e18b76,#e18b76),linear-gradient(0deg,#e18b76,#e18b76)}.fr-table--pink-macaron>table thead{background-color:#fee9e6;background-image:linear-gradient(0deg,#8d533e,#8d533e);background-image:none}.fr-table--pink-macaron>table tbody{background-color:#fef4f2}.fr-table--pink-macaron>table tbody tr:nth-child(2n){background-color:#fee9e6}.fr-table--pink-macaron.fr-table--bordered>table tbody tr{background-image:linear-gradient(0deg,#e18b76,#e18b76);background-image:none}.fr-table--pink-tuile>table:after{background-image:linear-gradient(0deg,#ce614a,#ce614a),linear-gradient(0deg,#ce614a,#ce614a),linear-gradient(0deg,#ce614a,#ce614a),linear-gradient(0deg,#ce614a,#ce614a)}.fr-table--pink-tuile>table thead{background-color:#fee9e7;background-image:linear-gradient(0deg,#a94645,#a94645);background-image:none}.fr-table--pink-tuile>table tbody{background-color:#fef4f3}.fr-table--pink-tuile>table tbody tr:nth-child(2n){background-color:#fee9e7}.fr-table--pink-tuile.fr-table--bordered>table tbody tr{background-image:linear-gradient(0deg,#ce614a,#ce614a);background-image:none}.fr-table--yellow-tournesol>table:after{background-image:linear-gradient(0deg,#c8aa39,#c8aa39),linear-gradient(0deg,#c8aa39,#c8aa39),linear-gradient(0deg,#c8aa39,#c8aa39),linear-gradient(0deg,#c8aa39,#c8aa39)}.fr-table--yellow-tournesol>table thead{background-color:#feecc2;background-image:linear-gradient(0deg,#716043,#716043);background-image:none}.fr-table--yellow-tournesol>table tbody{background-color:#fef6e3}.fr-table--yellow-tournesol>table tbody tr:nth-child(2n){background-color:#feecc2}.fr-table--yellow-tournesol.fr-table--bordered>table tbody tr{background-image:linear-gradient(0deg,#c8aa39,#c8aa39);background-image:none}.fr-table--yellow-moutarde>table:after{background-image:linear-gradient(0deg,#c3992a,#c3992a),linear-gradient(0deg,#c3992a,#c3992a),linear-gradient(0deg,#c3992a,#c3992a),linear-gradient(0deg,#c3992a,#c3992a)}.fr-table--yellow-moutarde>table thead{background-color:#feebd0;background-image:linear-gradient(0deg,#695240,#695240);background-image:none}.fr-table--yellow-moutarde>table tbody{background-color:#fef5e8}.fr-table--yellow-moutarde>table tbody tr:nth-child(2n){background-color:#feebd0}.fr-table--yellow-moutarde.fr-table--bordered>table tbody tr{background-image:linear-gradient(0deg,#c3992a,#c3992a);background-image:none}.fr-table--orange-terre-battue>table:after{background-image:linear-gradient(0deg,#e4794a,#e4794a),linear-gradient(0deg,#e4794a,#e4794a),linear-gradient(0deg,#e4794a,#e4794a),linear-gradient(0deg,#e4794a,#e4794a)}.fr-table--orange-terre-battue>table thead{background-color:#fee9e5;background-image:linear-gradient(0deg,#755348,#755348);background-image:none}.fr-table--orange-terre-battue>table tbody{background-color:#fef4f2}.fr-table--orange-terre-battue>table tbody tr:nth-child(2n){background-color:#fee9e5}.fr-table--orange-terre-battue.fr-table--bordered>table tbody tr{background-image:linear-gradient(0deg,#e4794a,#e4794a);background-image:none}.fr-table--brown-cafe-creme>table:after{background-image:linear-gradient(0deg,#d1b781,#d1b781),linear-gradient(0deg,#d1b781,#d1b781),linear-gradient(0deg,#d1b781,#d1b781),linear-gradient(0deg,#d1b781,#d1b781)}.fr-table--brown-cafe-creme>table thead{background-color:#f7ecdb;background-image:linear-gradient(0deg,#685c48,#685c48);background-image:none}.fr-table--brown-cafe-creme>table tbody{background-color:#fbf6ed}.fr-table--brown-cafe-creme>table tbody tr:nth-child(2n){background-color:#f7ecdb}.fr-table--brown-cafe-creme.fr-table--bordered>table tbody tr{background-image:linear-gradient(0deg,#d1b781,#d1b781);background-image:none}.fr-table--brown-caramel>table:after{background-image:linear-gradient(0deg,#c08c65,#c08c65),linear-gradient(0deg,#c08c65,#c08c65),linear-gradient(0deg,#c08c65,#c08c65),linear-gradient(0deg,#c08c65,#c08c65)}.fr-table--brown-caramel>table thead{background-color:#f7ebe5;background-image:linear-gradient(0deg,#845d48,#845d48);background-image:none}.fr-table--brown-caramel>table tbody{background-color:#fbf5f2}.fr-table--brown-caramel>table tbody tr:nth-child(2n){background-color:#f7ebe5}.fr-table--brown-caramel.fr-table--bordered>table tbody tr{background-image:linear-gradient(0deg,#c08c65,#c08c65);background-image:none}.fr-table--brown-opera>table:after{background-image:linear-gradient(0deg,#bd987a,#bd987a),linear-gradient(0deg,#bd987a,#bd987a),linear-gradient(0deg,#bd987a,#bd987a),linear-gradient(0deg,#bd987a,#bd987a)}.fr-table--brown-opera>table thead{background-color:#f7ece4;background-image:linear-gradient(0deg,#745b47,#745b47);background-image:none}.fr-table--brown-opera>table tbody{background-color:#fbf5f2}.fr-table--brown-opera>table tbody tr:nth-child(2n){background-color:#f7ece4}.fr-table--brown-opera.fr-table--bordered>table tbody tr{background-image:linear-gradient(0deg,#bd987a,#bd987a);background-image:none}.fr-table--beige-gris-galet>table:after{background-image:linear-gradient(0deg,#aea397,#aea397),linear-gradient(0deg,#aea397,#aea397),linear-gradient(0deg,#aea397,#aea397),linear-gradient(0deg,#aea397,#aea397)}.fr-table--beige-gris-galet>table thead{background-color:#f3ede5;background-image:linear-gradient(0deg,#6a6156,#6a6156);background-image:none}.fr-table--beige-gris-galet>table tbody{background-color:#f9f6f2}.fr-table--beige-gris-galet>table tbody tr:nth-child(2n){background-color:#f3ede5}.fr-table--beige-gris-galet.fr-table--bordered>table tbody tr{background-image:linear-gradient(0deg,#aea397,#aea397);background-image:none}.fr-table--bordered>table tbody tr{background-image:linear-gradient(0deg,#ddd,#ddd)}.fr-table--bordered>table tbody tr:nth-child(2n){background-color:transparent}.fr-table--bordered>table tbody tr:nth-child(2n):hover{background-color:rgba(0,0,0,.05)}.fr-table--bordered>table tbody tr:nth-child(2n):active{background-color:rgba(0,0,0,.1)}.fr-table:before{content:none}.fr-table--beige-gris-galet>table,.fr-table--beige-gris-galet>table tbody tr,.fr-table--blue-cumulus>table,.fr-table--blue-cumulus>table tbody tr,.fr-table--blue-ecume>table,.fr-table--blue-ecume>table tbody tr,.fr-table--brown-cafe-creme>table,.fr-table--brown-cafe-creme>table tbody tr,.fr-table--brown-caramel>table,.fr-table--brown-caramel>table tbody tr,.fr-table--brown-opera>table,.fr-table--brown-opera>table tbody tr,.fr-table--green-archipel>table,.fr-table--green-archipel>table tbody tr,.fr-table--green-bourgeon>table,.fr-table--green-bourgeon>table tbody tr,.fr-table--green-emeraude>table,.fr-table--green-emeraude>table tbody tr,.fr-table--green-menthe>table,.fr-table--green-menthe>table tbody tr,.fr-table--green-tilleul-verveine>table,.fr-table--green-tilleul-verveine>table tbody tr,.fr-table--orange-terre-battue>table,.fr-table--orange-terre-battue>table tbody tr,.fr-table--pink-macaron>table,.fr-table--pink-macaron>table tbody tr,.fr-table--pink-tuile>table,.fr-table--pink-tuile>table tbody tr,.fr-table--purple-glycine>table,.fr-table--purple-glycine>table tbody tr,.fr-table--yellow-moutarde>table,.fr-table--yellow-moutarde>table tbody tr,.fr-table--yellow-tournesol>table,.fr-table--yellow-tournesol>table tbody tr,.fr-table>table tbody tr,.fr-table>table tbody:after,.fr-table>table thead:after{background-image:none}.fr-tag{background-color:#eee;color:#161616;text-decoration:none}.fr-tag:after,.fr-tag:before{height:1rem;width:1rem}.fr-tag.fr-tag--sm:before,.fr-tag:after,.fr-tag:before{background-color:transparent;background-repeat:no-repeat;background-size:100%}.fr-tag.fr-tag--sm:before{height:.75rem;width:.75rem}button.fr-tag[aria-pressed=true],input[type=button].fr-tag[aria-pressed=true]{background-size:100% 100%,100% 100%}button.fr-tag[aria-pressed=true]:after,input[type=button].fr-tag[aria-pressed=true]:after{background-color:transparent;background-image:url(../../assets/images/dad78caeb7e4997451a3.svg);background-repeat:no-repeat;background-size:100%;color:#000091;height:1rem;width:1rem}button.fr-tag[aria-pressed=true].fr-tag--sm:after,input[type=button].fr-tag[aria-pressed=true].fr-tag--sm:after{background-color:transparent;background-repeat:no-repeat;background-size:100%;height:.75rem;width:.75rem}button.fr-tag.fr-tag--dismiss:after,input[type=button].fr-tag.fr-tag--dismiss:after{background-color:transparent;background-image:url(../../assets/images/69dfb9f70fe1180898d7.svg);background-repeat:no-repeat;background-size:100%;height:1rem;width:1rem}button.fr-tag.fr-tag--dismiss.fr-tag--sm:after,input[type=button].fr-tag.fr-tag--dismiss.fr-tag--sm:after{background-color:transparent;background-repeat:no-repeat;background-size:100%;height:.75rem;width:.75rem}ol.fr-tags-group,ul.fr-tags-group{list-style-type:none}ol.fr-tags-group,ul.fr-tags-group{margin-bottom:0;margin-top:0;padding-left:0}.fr-tags-group--sm:after,.fr-tags-group--sm:before{background-color:transparent;background-repeat:no-repeat;background-size:100%;height:1rem;width:1rem}.fr-tags-group--sm a.fr-tag.fr-tag--dismiss:after,.fr-tags-group--sm button.fr-tag.fr-tag--dismiss:after,.fr-tags-group--sm input[type=button].fr-tag.fr-tag--dismiss:after,.fr-tags-group--sm input[type=image].fr-tag.fr-tag--dismiss:after,.fr-tags-group--sm input[type=reset].fr-tag.fr-tag--dismiss:after,.fr-tags-group--sm input[type=submit].fr-tag.fr-tag--dismiss:after{background-color:transparent;background-repeat:no-repeat;background-size:100%;height:.75rem;width:.75rem}.fr-tags-group--sm a.fr-tag[aria-pressed=true]:after,.fr-tags-group--sm button.fr-tag[aria-pressed=true]:after,.fr-tags-group--sm input[type=button].fr-tag[aria-pressed=true]:after,.fr-tags-group--sm input[type=image].fr-tag[aria-pressed=true]:after,.fr-tags-group--sm input[type=reset].fr-tag[aria-pressed=true]:after,.fr-tags-group--sm input[type=submit].fr-tag[aria-pressed=true]:after{background-color:transparent;background-color:transparent!important;background-repeat:no-repeat;background-size:100%;height:.75rem;width:.75rem}.fr-tag[aria-pressed=false]{background-color:#e3e3fd;color:#000091}.fr-tag[aria-pressed=false]:hover{background-color:#c1c1fb}.fr-tag[aria-pressed=false]:active{background-color:#adadf9}.fr-tag.fr-tag--dismiss{background-color:#000091;color:#f5f5fe}.fr-tag.fr-tag--dismiss:hover{background-color:#1212ff}.fr-tag.fr-tag--dismiss:active{background-color:#2323ff}a.fr-tag,button.fr-tag,input[type=button].fr-tag,input[type=image].fr-tag,input[type=reset].fr-tag,input[type=submit].fr-tag{background-color:#e3e3fd;color:#000091}a.fr-tag:hover,button.fr-tag:hover,input[type=button].fr-tag:hover,input[type=image].fr-tag:hover,input[type=reset].fr-tag:hover,input[type=submit].fr-tag:hover{background-color:#c1c1fb}a.fr-tag:active,button.fr-tag:active,input[type=button].fr-tag:active,input[type=image].fr-tag:active,input[type=reset].fr-tag:active,input[type=submit].fr-tag:active{background-color:#adadf9}a.fr-tag--green-tilleul-verveine,button.fr-tag--green-tilleul-verveine,input[type=button].fr-tag--green-tilleul-verveine,input[type=image].fr-tag--green-tilleul-verveine,input[type=reset].fr-tag--green-tilleul-verveine,input[type=submit].fr-tag--green-tilleul-verveine{background-color:#fbe769;color:#66673d}a.fr-tag--green-tilleul-verveine:hover,button.fr-tag--green-tilleul-verveine:hover,input[type=button].fr-tag--green-tilleul-verveine:hover,input[type=image].fr-tag--green-tilleul-verveine:hover,input[type=reset].fr-tag--green-tilleul-verveine:hover,input[type=submit].fr-tag--green-tilleul-verveine:hover{background-color:#d7c655}a.fr-tag--green-tilleul-verveine:active,button.fr-tag--green-tilleul-verveine:active,input[type=button].fr-tag--green-tilleul-verveine:active,input[type=image].fr-tag--green-tilleul-verveine:active,input[type=reset].fr-tag--green-tilleul-verveine:active,input[type=submit].fr-tag--green-tilleul-verveine:active{background-color:#c2b24c}a.fr-tag--green-bourgeon,button.fr-tag--green-bourgeon,input[type=button].fr-tag--green-bourgeon,input[type=image].fr-tag--green-bourgeon,input[type=reset].fr-tag--green-bourgeon,input[type=submit].fr-tag--green-bourgeon{background-color:#a9fb68;color:#447049}a.fr-tag--green-bourgeon:hover,button.fr-tag--green-bourgeon:hover,input[type=button].fr-tag--green-bourgeon:hover,input[type=image].fr-tag--green-bourgeon:hover,input[type=reset].fr-tag--green-bourgeon:hover,input[type=submit].fr-tag--green-bourgeon:hover{background-color:#8ed654}a.fr-tag--green-bourgeon:active,button.fr-tag--green-bourgeon:active,input[type=button].fr-tag--green-bourgeon:active,input[type=image].fr-tag--green-bourgeon:active,input[type=reset].fr-tag--green-bourgeon:active,input[type=submit].fr-tag--green-bourgeon:active{background-color:#7fc04b}a.fr-tag--green-emeraude,button.fr-tag--green-emeraude,input[type=button].fr-tag--green-emeraude,input[type=image].fr-tag--green-emeraude,input[type=reset].fr-tag--green-emeraude,input[type=submit].fr-tag--green-emeraude{background-color:#9ef9be;color:#297254}a.fr-tag--green-emeraude:hover,button.fr-tag--green-emeraude:hover,input[type=button].fr-tag--green-emeraude:hover,input[type=image].fr-tag--green-emeraude:hover,input[type=reset].fr-tag--green-emeraude:hover,input[type=submit].fr-tag--green-emeraude:hover{background-color:#69df97}a.fr-tag--green-emeraude:active,button.fr-tag--green-emeraude:active,input[type=button].fr-tag--green-emeraude:active,input[type=image].fr-tag--green-emeraude:active,input[type=reset].fr-tag--green-emeraude:active,input[type=submit].fr-tag--green-emeraude:active{background-color:#5ec988}a.fr-tag--green-menthe,button.fr-tag--green-menthe,input[type=button].fr-tag--green-menthe,input[type=image].fr-tag--green-menthe,input[type=reset].fr-tag--green-menthe,input[type=submit].fr-tag--green-menthe{background-color:#8bf8e7;color:#37635f}a.fr-tag--green-menthe:hover,button.fr-tag--green-menthe:hover,input[type=button].fr-tag--green-menthe:hover,input[type=image].fr-tag--green-menthe:hover,input[type=reset].fr-tag--green-menthe:hover,input[type=submit].fr-tag--green-menthe:hover{background-color:#6ed5c5}a.fr-tag--green-menthe:active,button.fr-tag--green-menthe:active,input[type=button].fr-tag--green-menthe:active,input[type=image].fr-tag--green-menthe:active,input[type=reset].fr-tag--green-menthe:active,input[type=submit].fr-tag--green-menthe:active{background-color:#62bfb1}a.fr-tag--green-archipel,button.fr-tag--green-archipel,input[type=button].fr-tag--green-archipel,input[type=image].fr-tag--green-archipel,input[type=reset].fr-tag--green-archipel,input[type=submit].fr-tag--green-archipel{background-color:#a6f2fa;color:#006a6f}a.fr-tag--green-archipel:hover,button.fr-tag--green-archipel:hover,input[type=button].fr-tag--green-archipel:hover,input[type=image].fr-tag--green-archipel:hover,input[type=reset].fr-tag--green-archipel:hover,input[type=submit].fr-tag--green-archipel:hover{background-color:#62dbe5}a.fr-tag--green-archipel:active,button.fr-tag--green-archipel:active,input[type=button].fr-tag--green-archipel:active,input[type=image].fr-tag--green-archipel:active,input[type=reset].fr-tag--green-archipel:active,input[type=submit].fr-tag--green-archipel:active{background-color:#58c5cf}a.fr-tag--blue-ecume,button.fr-tag--blue-ecume,input[type=button].fr-tag--blue-ecume,input[type=image].fr-tag--blue-ecume,input[type=reset].fr-tag--blue-ecume,input[type=submit].fr-tag--blue-ecume{background-color:#dee5fd;color:#2f4077}a.fr-tag--blue-ecume:hover,button.fr-tag--blue-ecume:hover,input[type=button].fr-tag--blue-ecume:hover,input[type=image].fr-tag--blue-ecume:hover,input[type=reset].fr-tag--blue-ecume:hover,input[type=submit].fr-tag--blue-ecume:hover{background-color:#b4c5fb}a.fr-tag--blue-ecume:active,button.fr-tag--blue-ecume:active,input[type=button].fr-tag--blue-ecume:active,input[type=image].fr-tag--blue-ecume:active,input[type=reset].fr-tag--blue-ecume:active,input[type=submit].fr-tag--blue-ecume:active{background-color:#99b3f9}a.fr-tag--blue-cumulus,button.fr-tag--blue-cumulus,input[type=button].fr-tag--blue-cumulus,input[type=image].fr-tag--blue-cumulus,input[type=reset].fr-tag--blue-cumulus,input[type=submit].fr-tag--blue-cumulus{background-color:#dae6fd;color:#3558a2}a.fr-tag--blue-cumulus:hover,button.fr-tag--blue-cumulus:hover,input[type=button].fr-tag--blue-cumulus:hover,input[type=image].fr-tag--blue-cumulus:hover,input[type=reset].fr-tag--blue-cumulus:hover,input[type=submit].fr-tag--blue-cumulus:hover{background-color:#a9c8fb}a.fr-tag--blue-cumulus:active,button.fr-tag--blue-cumulus:active,input[type=button].fr-tag--blue-cumulus:active,input[type=image].fr-tag--blue-cumulus:active,input[type=reset].fr-tag--blue-cumulus:active,input[type=submit].fr-tag--blue-cumulus:active{background-color:#8ab8f9}a.fr-tag--purple-glycine,button.fr-tag--purple-glycine,input[type=button].fr-tag--purple-glycine,input[type=image].fr-tag--purple-glycine,input[type=reset].fr-tag--purple-glycine,input[type=submit].fr-tag--purple-glycine{background-color:#fddbfa;color:#6e445a}a.fr-tag--purple-glycine:hover,button.fr-tag--purple-glycine:hover,input[type=button].fr-tag--purple-glycine:hover,input[type=image].fr-tag--purple-glycine:hover,input[type=reset].fr-tag--purple-glycine:hover,input[type=submit].fr-tag--purple-glycine:hover{background-color:#fbaff5}a.fr-tag--purple-glycine:active,button.fr-tag--purple-glycine:active,input[type=button].fr-tag--purple-glycine:active,input[type=image].fr-tag--purple-glycine:active,input[type=reset].fr-tag--purple-glycine:active,input[type=submit].fr-tag--purple-glycine:active{background-color:#fa96f2}a.fr-tag--pink-macaron,button.fr-tag--pink-macaron,input[type=button].fr-tag--pink-macaron,input[type=image].fr-tag--pink-macaron,input[type=reset].fr-tag--pink-macaron,input[type=submit].fr-tag--pink-macaron{background-color:#fddfda;color:#8d533e}a.fr-tag--pink-macaron:hover,button.fr-tag--pink-macaron:hover,input[type=button].fr-tag--pink-macaron:hover,input[type=image].fr-tag--pink-macaron:hover,input[type=reset].fr-tag--pink-macaron:hover,input[type=submit].fr-tag--pink-macaron:hover{background-color:#fbb8ab}a.fr-tag--pink-macaron:active,button.fr-tag--pink-macaron:active,input[type=button].fr-tag--pink-macaron:active,input[type=image].fr-tag--pink-macaron:active,input[type=reset].fr-tag--pink-macaron:active,input[type=submit].fr-tag--pink-macaron:active{background-color:#faa18d}a.fr-tag--pink-tuile,button.fr-tag--pink-tuile,input[type=button].fr-tag--pink-tuile,input[type=image].fr-tag--pink-tuile,input[type=reset].fr-tag--pink-tuile,input[type=submit].fr-tag--pink-tuile{background-color:#fddfdb;color:#a94645}a.fr-tag--pink-tuile:hover,button.fr-tag--pink-tuile:hover,input[type=button].fr-tag--pink-tuile:hover,input[type=image].fr-tag--pink-tuile:hover,input[type=reset].fr-tag--pink-tuile:hover,input[type=submit].fr-tag--pink-tuile:hover{background-color:#fbb8ad}a.fr-tag--pink-tuile:active,button.fr-tag--pink-tuile:active,input[type=button].fr-tag--pink-tuile:active,input[type=image].fr-tag--pink-tuile:active,input[type=reset].fr-tag--pink-tuile:active,input[type=submit].fr-tag--pink-tuile:active{background-color:#faa191}a.fr-tag--yellow-tournesol,button.fr-tag--yellow-tournesol,input[type=button].fr-tag--yellow-tournesol,input[type=image].fr-tag--yellow-tournesol,input[type=reset].fr-tag--yellow-tournesol,input[type=submit].fr-tag--yellow-tournesol{background-color:#fde39c;color:#716043}a.fr-tag--yellow-tournesol:hover,button.fr-tag--yellow-tournesol:hover,input[type=button].fr-tag--yellow-tournesol:hover,input[type=image].fr-tag--yellow-tournesol:hover,input[type=reset].fr-tag--yellow-tournesol:hover,input[type=submit].fr-tag--yellow-tournesol:hover{background-color:#e9c53b}a.fr-tag--yellow-tournesol:active,button.fr-tag--yellow-tournesol:active,input[type=button].fr-tag--yellow-tournesol:active,input[type=image].fr-tag--yellow-tournesol:active,input[type=reset].fr-tag--yellow-tournesol:active,input[type=submit].fr-tag--yellow-tournesol:active{background-color:#d3b235}a.fr-tag--yellow-moutarde,button.fr-tag--yellow-moutarde,input[type=button].fr-tag--yellow-moutarde,input[type=image].fr-tag--yellow-moutarde,input[type=reset].fr-tag--yellow-moutarde,input[type=submit].fr-tag--yellow-moutarde{background-color:#fde2b5;color:#695240}a.fr-tag--yellow-moutarde:hover,button.fr-tag--yellow-moutarde:hover,input[type=button].fr-tag--yellow-moutarde:hover,input[type=image].fr-tag--yellow-moutarde:hover,input[type=reset].fr-tag--yellow-moutarde:hover,input[type=submit].fr-tag--yellow-moutarde:hover{background-color:#f6c43c}a.fr-tag--yellow-moutarde:active,button.fr-tag--yellow-moutarde:active,input[type=button].fr-tag--yellow-moutarde:active,input[type=image].fr-tag--yellow-moutarde:active,input[type=reset].fr-tag--yellow-moutarde:active,input[type=submit].fr-tag--yellow-moutarde:active{background-color:#dfb135}a.fr-tag--orange-terre-battue,button.fr-tag--orange-terre-battue,input[type=button].fr-tag--orange-terre-battue,input[type=image].fr-tag--orange-terre-battue,input[type=reset].fr-tag--orange-terre-battue,input[type=submit].fr-tag--orange-terre-battue{background-color:#fddfd8;color:#755348}a.fr-tag--orange-terre-battue:hover,button.fr-tag--orange-terre-battue:hover,input[type=button].fr-tag--orange-terre-battue:hover,input[type=image].fr-tag--orange-terre-battue:hover,input[type=reset].fr-tag--orange-terre-battue:hover,input[type=submit].fr-tag--orange-terre-battue:hover{background-color:#fbb8a5}a.fr-tag--orange-terre-battue:active,button.fr-tag--orange-terre-battue:active,input[type=button].fr-tag--orange-terre-battue:active,input[type=image].fr-tag--orange-terre-battue:active,input[type=reset].fr-tag--orange-terre-battue:active,input[type=submit].fr-tag--orange-terre-battue:active{background-color:#faa184}a.fr-tag--brown-cafe-creme,button.fr-tag--brown-cafe-creme,input[type=button].fr-tag--brown-cafe-creme,input[type=image].fr-tag--brown-cafe-creme,input[type=reset].fr-tag--brown-cafe-creme,input[type=submit].fr-tag--brown-cafe-creme{background-color:#f4e3c7;color:#685c48}a.fr-tag--brown-cafe-creme:hover,button.fr-tag--brown-cafe-creme:hover,input[type=button].fr-tag--brown-cafe-creme:hover,input[type=image].fr-tag--brown-cafe-creme:hover,input[type=reset].fr-tag--brown-cafe-creme:hover,input[type=submit].fr-tag--brown-cafe-creme:hover{background-color:#e1c386}a.fr-tag--brown-cafe-creme:active,button.fr-tag--brown-cafe-creme:active,input[type=button].fr-tag--brown-cafe-creme:active,input[type=image].fr-tag--brown-cafe-creme:active,input[type=reset].fr-tag--brown-cafe-creme:active,input[type=submit].fr-tag--brown-cafe-creme:active{background-color:#ccb078}a.fr-tag--brown-caramel,button.fr-tag--brown-caramel,input[type=button].fr-tag--brown-caramel,input[type=image].fr-tag--brown-caramel,input[type=reset].fr-tag--brown-caramel,input[type=submit].fr-tag--brown-caramel{background-color:#f3e2d9;color:#845d48}a.fr-tag--brown-caramel:hover,button.fr-tag--brown-caramel:hover,input[type=button].fr-tag--brown-caramel:hover,input[type=image].fr-tag--brown-caramel:hover,input[type=reset].fr-tag--brown-caramel:hover,input[type=submit].fr-tag--brown-caramel:hover{background-color:#e7bea6}a.fr-tag--brown-caramel:active,button.fr-tag--brown-caramel:active,input[type=button].fr-tag--brown-caramel:active,input[type=image].fr-tag--brown-caramel:active,input[type=reset].fr-tag--brown-caramel:active,input[type=submit].fr-tag--brown-caramel:active{background-color:#e1a982}a.fr-tag--brown-opera,button.fr-tag--brown-opera,input[type=button].fr-tag--brown-opera,input[type=image].fr-tag--brown-opera,input[type=reset].fr-tag--brown-opera,input[type=submit].fr-tag--brown-opera{background-color:#f3e2d7;color:#745b47}a.fr-tag--brown-opera:hover,button.fr-tag--brown-opera:hover,input[type=button].fr-tag--brown-opera:hover,input[type=image].fr-tag--brown-opera:hover,input[type=reset].fr-tag--brown-opera:hover,input[type=submit].fr-tag--brown-opera:hover{background-color:#e7bfa0}a.fr-tag--brown-opera:active,button.fr-tag--brown-opera:active,input[type=button].fr-tag--brown-opera:active,input[type=image].fr-tag--brown-opera:active,input[type=reset].fr-tag--brown-opera:active,input[type=submit].fr-tag--brown-opera:active{background-color:#deaa7e}a.fr-tag--beige-gris-galet,button.fr-tag--beige-gris-galet,input[type=button].fr-tag--beige-gris-galet,input[type=image].fr-tag--beige-gris-galet,input[type=reset].fr-tag--beige-gris-galet,input[type=submit].fr-tag--beige-gris-galet{background-color:#eee4d9;color:#6a6156}a.fr-tag--beige-gris-galet:hover,button.fr-tag--beige-gris-galet:hover,input[type=button].fr-tag--beige-gris-galet:hover,input[type=image].fr-tag--beige-gris-galet:hover,input[type=reset].fr-tag--beige-gris-galet:hover,input[type=submit].fr-tag--beige-gris-galet:hover{background-color:#dbc3a4}a.fr-tag--beige-gris-galet:active,button.fr-tag--beige-gris-galet:active,input[type=button].fr-tag--beige-gris-galet:active,input[type=image].fr-tag--beige-gris-galet:active,input[type=reset].fr-tag--beige-gris-galet:active,input[type=submit].fr-tag--beige-gris-galet:active{background-color:#c6b094}button.fr-tag[aria-pressed=true]:not(:disabled),input[type=button].fr-tag[aria-pressed=true]:not(:disabled){background-color:transparent;background-image:radial-gradient(circle at 100% .25rem,transparent .578125rem,#000091 .625rem);color:#f5f5fe}button.fr-tag[aria-pressed=true]:not(:disabled):hover,input[type=button].fr-tag[aria-pressed=true]:not(:disabled):hover{background-image:radial-gradient(circle at 100% .25rem,transparent .578125rem,#1212ff .625rem)}button.fr-tag[aria-pressed=true]:not(:disabled):active,input[type=button].fr-tag[aria-pressed=true]:not(:disabled):active{background-image:radial-gradient(circle at 100% .25rem,transparent .578125rem,#2323ff .625rem)}button.fr-tag[aria-pressed=true]:disabled,input[type=button].fr-tag[aria-pressed=true]:disabled{background-color:transparent;background-image:radial-gradient(circle at 100% .25rem,transparent .578125rem,#e5e5e5 .625rem)}button.fr-tag[aria-pressed=true]:disabled:after,input[type=button].fr-tag[aria-pressed=true]:disabled:after{color:#929292}button.fr-tag[aria-pressed=true].fr-tag--sm,input[type=button].fr-tag[aria-pressed=true].fr-tag--sm{background-image:radial-gradient(circle at 100% .1875rem,transparent .4475rem,#000091 .5rem)}button.fr-tag[aria-pressed=true].fr-tag--sm:hover,input[type=button].fr-tag[aria-pressed=true].fr-tag--sm:hover{background-image:radial-gradient(circle at 100% .1875rem,transparent .4475rem,#1212ff .5rem)}button.fr-tag[aria-pressed=true].fr-tag--sm:active,input[type=button].fr-tag[aria-pressed=true].fr-tag--sm:active{background-image:radial-gradient(circle at 100% .1875rem,transparent .4475rem,#2323ff .5rem)}button.fr-tag[aria-pressed=true].fr-tag--sm:disabled,input[type=button].fr-tag[aria-pressed=true].fr-tag--sm:disabled{background-image:radial-gradient(circle at 100% .1875rem,transparent .4475rem,#e5e5e5 .5rem)}button.fr-tag:disabled,input[type=button].fr-tag:disabled{background-color:#e5e5e5;color:#929292}a:not([href]).fr-tag,button.fr-tag:disabled:hover,input[type=button].fr-tag:disabled:hover{background-color:#e5e5e5}a:not([href]).fr-tag{color:#929292}.fr-tags-group.fr-tags-group--sm button.fr-tag[aria-pressed=true],.fr-tags-group.fr-tags-group--sm input[type=button].fr-tag[aria-pressed=true]{background-image:radial-gradient(circle at 100% .1875rem,transparent .4475rem,#000091 .5rem)}.fr-tags-group.fr-tags-group--sm button.fr-tag[aria-pressed=true]:hover,.fr-tags-group.fr-tags-group--sm input[type=button].fr-tag[aria-pressed=true]:hover{background-image:radial-gradient(circle at 100% .1875rem,transparent .4475rem,#1212ff .5rem)}.fr-tags-group.fr-tags-group--sm button.fr-tag[aria-pressed=true]:active,.fr-tags-group.fr-tags-group--sm input[type=button].fr-tag[aria-pressed=true]:active{background-image:radial-gradient(circle at 100% .1875rem,transparent .4475rem,#2323ff .5rem)}.fr-tags-group.fr-tags-group--sm button.fr-tag[aria-pressed=true]:disabled,.fr-tags-group.fr-tags-group--sm input[type=button].fr-tag[aria-pressed=true]:disabled{background-image:radial-gradient(circle at 100% .1875rem,transparent .4475rem,#e5e5e5 .5rem)}.fr-alert:after,.fr-alert:before{background-color:transparent;background-repeat:no-repeat;background-size:100%;height:1.5rem;width:1.5rem}.fr-alert p,.fr-alert__title{margin:0 0 .25rem}.fr-alert--info:before{background-image:url(../../assets/images/719d870fd2ef14580ede.svg)}.fr-alert--success:before{background-image:url(../../assets/images/ea273050d938525cf347.svg)}.fr-alert--error:before{background-image:url(../../assets/images/9e33ec01f6d0a9071b3e.svg)}.fr-alert--warning:before{background-image:url(../../assets/images/dfc431c99a853d95e0bd.svg)}.fr-alert .fr-btn--close:after,.fr-alert .fr-btn--close:before,.fr-alert .fr-link--close:after,.fr-alert .fr-link--close:before{background-color:transparent;background-image:url(../../assets/images/69dfb9f70fe1180898d7.svg);background-repeat:no-repeat;background-size:100%;height:1rem;width:1rem}.fr-alert{background-image:linear-gradient(0deg,#3a3a3a,#3a3a3a),linear-gradient(0deg,#3a3a3a,#3a3a3a),linear-gradient(0deg,#3a3a3a,#3a3a3a),linear-gradient(0deg,#3a3a3a,#3a3a3a),linear-gradient(0deg,#3a3a3a,#3a3a3a)}.fr-alert:before{color:#fff}.fr-alert--info{background-image:linear-gradient(0deg,#0063cb,#0063cb),linear-gradient(0deg,#0063cb,#0063cb),linear-gradient(0deg,#0063cb,#0063cb),linear-gradient(0deg,#0063cb,#0063cb),linear-gradient(0deg,#0063cb,#0063cb)}.fr-alert--error{background-image:linear-gradient(0deg,#ce0500,#ce0500),linear-gradient(0deg,#ce0500,#ce0500),linear-gradient(0deg,#ce0500,#ce0500),linear-gradient(0deg,#ce0500,#ce0500),linear-gradient(0deg,#ce0500,#ce0500)}.fr-alert--success{background-image:linear-gradient(0deg,#18753c,#18753c),linear-gradient(0deg,#18753c,#18753c),linear-gradient(0deg,#18753c,#18753c),linear-gradient(0deg,#18753c,#18753c),linear-gradient(0deg,#18753c,#18753c)}.fr-alert--warning{background-image:linear-gradient(0deg,#b34000,#b34000),linear-gradient(0deg,#b34000,#b34000),linear-gradient(0deg,#b34000,#b34000),linear-gradient(0deg,#b34000,#b34000),linear-gradient(0deg,#b34000,#b34000)}.fr-notice p,.fr-notice__title{margin:0}.fr-notice__title:before{color:transparent;vertical-align:-6px}.fr-notice--info .fr-notice__title:not([class^=fr-icon-]):not([class*=" fr-icon-"]):not([class^=fr-fi-]):not([class*=" fr-fi-"]):before{background-image:url(../../assets/images/719d870fd2ef14580ede.svg);height:1.5rem;width:1.5rem}.fr-notice--alert .fr-notice__title:not([class^=fr-icon-]):not([class*=" fr-icon-"]):not([class^=fr-fi-]):not([class*=" fr-fi-"]):before,.fr-notice--cyberattack .fr-notice__title:not([class^=fr-icon-]):not([class*=" fr-icon-"]):not([class^=fr-fi-]):not([class*=" fr-fi-"]):before,.fr-notice--warning .fr-notice__title:not([class^=fr-icon-]):not([class*=" fr-icon-"]):not([class^=fr-fi-]):not([class*=" fr-fi-"]):before,.fr-notice--witness .fr-notice__title:not([class^=fr-icon-]):not([class*=" fr-icon-"]):not([class^=fr-fi-]):not([class*=" fr-fi-"]):before{background-image:url(../../assets/images/dfc431c99a853d95e0bd.svg);height:1.5rem;width:1.5rem}.fr-notice--weather-orange .fr-notice__title:not([class^=fr-icon-]):not([class*=" fr-icon-"]):not([class^=fr-fi-]):not([class*=" fr-fi-"]):before{background-image:url(../../assets/images/4f5389d93ee50a10e4f3.svg);height:1.5rem;width:1.5rem}.fr-notice--weather-red .fr-notice__title:not([class^=fr-icon-]):not([class*=" fr-icon-"]):not([class^=fr-fi-]):not([class*=" fr-fi-"]):before{background-image:url(../../assets/images/e4a87ef49cb9cb2ff1de.svg);height:1.5rem;width:1.5rem}.fr-notice--weather-purple .fr-notice__title:not([class^=fr-icon-]):not([class*=" fr-icon-"]):not([class^=fr-fi-]):not([class*=" fr-fi-"]):before{background-image:url(../../assets/images/caa6a8c5c8c33f9b494b.svg);height:1.5rem;width:1.5rem}.fr-notice--kidnapping .fr-notice__title:not([class^=fr-icon-]):not([class*=" fr-icon-"]):not([class^=fr-fi-]):not([class*=" fr-fi-"]):before{background-image:url(../../assets/images/63877971464a91a39805.svg);height:1.5rem;width:1.5rem}.fr-notice--attack .fr-notice__title:not([class^=fr-icon-]):not([class*=" fr-icon-"]):not([class^=fr-fi-]):not([class*=" fr-fi-"]):before{background-image:url(../../assets/images/6833270903716b30531e.svg);height:1.5rem;width:1.5rem}.fr-notice .fr-btn--close:after,.fr-notice .fr-btn--close:before{background-color:transparent;background-image:url(../../assets/images/69dfb9f70fe1180898d7.svg);background-repeat:no-repeat;background-size:100%;height:1rem;width:1rem}.fr-notice{background-color:#eee;color:#161616}.fr-notice--info{background-color:#e8edff;color:#0063cb}.fr-notice--warning,.fr-notice--weather-orange{background-color:#ffe9e6;color:#b34000}.fr-notice--alert{background-color:#ffe9e9;color:#ce0500}.fr-notice--weather-red{color:#fff}.fr-notice--weather-red,.fr-notice--weather-red .fr-btn--close{background-color:#ce0500}.fr-notice--weather-purple{background-color:#6e445a;color:#fff}.fr-notice--weather-purple .fr-btn--close{background-color:#6e445a}.fr-notice--witness{background-image:linear-gradient(0deg,#ce0500,#ce0500);color:#fff}.fr-notice--witness,.fr-notice--witness .fr-btn--close{background-color:#3a3a3a}.fr-notice--attack,.fr-notice--kidnapping{background-color:#ce0500;background-image:linear-gradient(0deg,#3a3a3a,#3a3a3a);color:#fff}.fr-notice--attack .fr-btn--close,.fr-notice--kidnapping .fr-btn--close{background-color:#ce0500}.fr-notice--cyberattack{background-image:linear-gradient(0deg,#0063cb,#0063cb);color:#fff}.fr-notice--cyberattack,.fr-notice--cyberattack .fr-btn--close{background-color:#3a3a3a}.fr-radio-group input[type=radio]+label{background-image:radial-gradient(transparent 10px,#000091 11px,transparent 12px)}.fr-radio-group input[type=radio]:disabled+label{background-image:radial-gradient(transparent 10px,#e5e5e5 11px,transparent 12px)}.fr-radio-group input[type=radio]:checked+label{background-image:radial-gradient(transparent 10px,#000091 11px,transparent 12px),radial-gradient(#000091 5px,transparent 6px)}.fr-radio-group input[type=radio]:checked:disabled+label{background-image:radial-gradient(transparent 10px,#e5e5e5 11px,transparent 12px),radial-gradient(#e5e5e5 5px,transparent 6px)}.fr-fieldset--error .fr-radio-group input[type=radio]+label{background-image:radial-gradient(transparent 10px,#ce0500 11px,transparent 12px)}.fr-fieldset--error .fr-radio-group input[type=radio]:checked+label{background-image:radial-gradient(transparent 10px,#ce0500 11px,transparent 12px),radial-gradient(#000091 5px,transparent 6px)}.fr-fieldset--valid .fr-radio-group input[type=radio]+label{background-image:radial-gradient(transparent 10px,#18753c 11px,transparent 12px)}.fr-fieldset--valid .fr-radio-group input[type=radio]:checked+label{background-image:radial-gradient(transparent 10px,#18753c 11px,transparent 12px),radial-gradient(#000091 5px,transparent 6px)}.fr-fieldset--info .fr-radio-group input[type=radio]+label{background-image:radial-gradient(transparent 10px,#0063cb 11px,transparent 12px)}.fr-fieldset--info .fr-radio-group input[type=radio]:checked+label{background-image:radial-gradient(transparent 10px,#0063cb 11px,transparent 12px),radial-gradient(#000091 5px,transparent 6px)}.fr-fieldset .fr-radio-group input[type=radio]:disabled+label{background-image:radial-gradient(transparent 10px,#e5e5e5 11px,transparent 12px)}.fr-fieldset .fr-radio-group input[type=radio]:disabled:checked+label{background-image:radial-gradient(transparent 10px,#e5e5e5 11px,transparent 12px),radial-gradient(#e5e5e5 5px,transparent 6px)}.fr-radio-group--sm input[type=radio]+label{background-image:radial-gradient(transparent 6px,#000091 7px,transparent 8px)}.fr-radio-group--sm input[type=radio]:disabled+label{background-image:radial-gradient(transparent 6px,#e5e5e5 7px,transparent 8px)}.fr-radio-group--sm input[type=radio]:checked+label{background-image:radial-gradient(transparent 6px,#000091 7px,transparent 8px),radial-gradient(#000091 3px,transparent 4px)}.fr-radio-group--sm input[type=radio]:checked:disabled+label{background-image:radial-gradient(transparent 6px,#e5e5e5 7px,transparent 8px),radial-gradient(#e5e5e5 3px,transparent 4px)}.fr-fieldset--error .fr-radio-group--sm input[type=radio]+label{background-image:radial-gradient(transparent 6px,#ce0500 7px,transparent 8px)}.fr-fieldset--error .fr-radio-group--sm input[type=radio]:checked+label{background-image:radial-gradient(transparent 6px,#ce0500 7px,transparent 8px),radial-gradient(#000091 3px,transparent 4px)}.fr-fieldset--valid .fr-radio-group--sm input[type=radio]+label{background-image:radial-gradient(transparent 6px,#18753c 7px,transparent 8px)}.fr-fieldset--valid .fr-radio-group--sm input[type=radio]:checked+label{background-image:radial-gradient(transparent 6px,#18753c 7px,transparent 8px),radial-gradient(#000091 3px,transparent 4px)}.fr-fieldset--info .fr-radio-group--sm input[type=radio]+label{background-image:radial-gradient(transparent 6px,#0063cb 7px,transparent 8px)}.fr-fieldset--info .fr-radio-group--sm input[type=radio]:checked+label{background-image:radial-gradient(transparent 6px,#0063cb 7px,transparent 8px),radial-gradient(#000091 3px,transparent 4px)}.fr-fieldset .fr-radio-group--sm input[type=radio]:disabled+label{background-image:radial-gradient(transparent 6px,#e5e5e5 7px,transparent 8px)}.fr-fieldset .fr-radio-group--sm input[type=radio]:disabled:checked+label{background-image:radial-gradient(transparent 6px,#e5e5e5 7px,transparent 8px),radial-gradient(#e5e5e5 3px,transparent 4px)}.fr-radio-rich__pictogram{background-color:#fff;background-image:linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd)}.fr-radio-rich input[type=radio]+label{background-color:#fff;background-image:linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),radial-gradient(transparent 6px,#000091 7px,transparent 8px)}.fr-radio-rich input[type=radio]:disabled+label{background-image:linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),radial-gradient(transparent 6px,#e5e5e5 7px,transparent 8px)}.fr-radio-rich input[type=radio]:disabled~.fr-radio-rich__pictogram svg *{fill:#929292}.fr-radio-rich input[type=radio]:checked+label{background-image:linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091),radial-gradient(transparent 6px,#000091 7px,transparent 8px),radial-gradient(#000091 3px,transparent 4px)}.fr-radio-rich input[type=radio]:checked~.fr-radio-rich__pictogram{background-image:linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#ddd,#ddd)}.fr-radio-rich input[type=radio]:checked:disabled+label{background-image:linear-gradient(0deg,#929292,#929292),linear-gradient(0deg,#929292,#929292),linear-gradient(0deg,#929292,#929292),linear-gradient(0deg,#929292,#929292),radial-gradient(transparent 6px,#e5e5e5 7px,transparent 8px),radial-gradient(#e5e5e5 3px,transparent 4px)}.fr-radio-rich input[type=radio]:checked:disabled~.fr-radio-rich__pictogram{background-image:linear-gradient(0deg,#e5e5e5,#e5e5e5),linear-gradient(0deg,#e5e5e5,#e5e5e5),linear-gradient(0deg,#e5e5e5,#e5e5e5),linear-gradient(0deg,#ddd,#ddd)}.fr-fieldset--error .fr-radio-rich input[type=radio]+label{background-image:linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),radial-gradient(transparent 6px,#ce0500 7px,transparent 8px)}.fr-fieldset--error .fr-radio-rich input[type=radio]:checked+label{background-image:linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091),radial-gradient(transparent 6px,#ce0500 7px,transparent 8px),radial-gradient(#000091 3px,transparent 4px)}.fr-fieldset--valid .fr-radio-rich input[type=radio]+label{background-image:linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),radial-gradient(transparent 6px,#18753c 7px,transparent 8px)}.fr-fieldset--valid .fr-radio-rich input[type=radio]:checked+label{background-image:linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091),radial-gradient(transparent 6px,#18753c 7px,transparent 8px),radial-gradient(#000091 3px,transparent 4px)}.fr-fieldset--info .fr-radio-rich input[type=radio]+label{background-image:linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),radial-gradient(transparent 6px,#0063cb 7px,transparent 8px)}.fr-fieldset--info .fr-radio-rich input[type=radio]:checked+label{background-image:linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091),radial-gradient(transparent 6px,#0063cb 7px,transparent 8px),radial-gradient(#000091 3px,transparent 4px)}.fr-fieldset .fr-radio-rich input[type=radio]:disabled+label{background-image:linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),radial-gradient(transparent 6px,#e5e5e5 7px,transparent 8px)}.fr-fieldset .fr-radio-rich input[type=radio]:disabled:checked+label{background-image:linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),radial-gradient(transparent 6px,#e5e5e5 7px,transparent 8px),radial-gradient(#e5e5e5 3px,transparent 4px)}.fr-radio-rich__img{background-color:#fff;background-image:linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd)}.fr-radio-rich input[type=radio]:disabled~.fr-radio-rich__img svg *{fill:#929292}.fr-radio-rich input[type=radio]:checked~.fr-radio-rich__img{background-image:linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#ddd,#ddd)}.fr-radio-rich input[type=radio]:checked:disabled~.fr-radio-rich__img{background-image:linear-gradient(0deg,#929292,#929292),linear-gradient(0deg,#929292,#929292),linear-gradient(0deg,#929292,#929292),linear-gradient(0deg,#ddd,#ddd)}.fr-card--no-icon:after{content:none}.fr-card__desc,.fr-card__title{flex:1 0 auto}.fr-card__title a:after,.fr-card__title button:after{background-image:url(../../assets/images/c7e409a631c94231dfeb.svg)}.fr-card__title [target=_blank]:after,.fr-card__title a:after,.fr-card__title button:after{background-color:transparent;background-repeat:no-repeat;background-size:100%;height:1rem;width:1rem}.fr-card__title [target=_blank]:after{background-image:url(../../assets/images/5fac7fc1e919c8785620.svg)}.fr-card__detail:before{height:1rem;width:1rem}.fr-card--download .fr-tile__title a:after{background-color:transparent;background-image:url(../../assets/images/dbb56e50b667ae162595.svg);background-repeat:no-repeat;background-size:100%}.fr-card--download .fr-card__header{padding-top:56.25%}.fr-card--download .fr-card__header .fr-card__img img{height:auto!important;margin:auto;width:auto}.fr-card.fr-enlarge-link .fr-card__title a{text-decoration:none}.fr-card.fr-enlarge-button .fr-card__title button:after,.fr-card.fr-enlarge-link .fr-card__title a:after{background-color:transparent;height:1.5rem;width:1.5rem}.fr-card--sm .fr-card__title a:after,.fr-card--sm .fr-card__title button:after,.fr-card--sm.fr-enlarge-button .fr-card__title a:after,.fr-card--sm.fr-enlarge-button .fr-card__title button:after,.fr-card--sm.fr-enlarge-link .fr-card__title a:after,.fr-card--sm.fr-enlarge-link .fr-card__title button:after{height:1rem;width:1rem}.fr-card--lg.fr-enlarge-button .fr-card__title a:after,.fr-card--lg.fr-enlarge-button .fr-card__title button:after,.fr-card--lg.fr-enlarge-link .fr-card__title a:after,.fr-card--lg.fr-enlarge-link .fr-card__title button:after{height:2rem;width:2rem}.fr-card--lg .fr-card__title a:after,.fr-card--lg .fr-card__title button:after{height:1.5rem;width:1.5rem}.fr-card>.fr-card__img{flex-shrink:0}.fr-card{background-color:#fff}.fr-card:not(.fr-card--no-border):not(.fr-card--shadow){background-image:linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd)}.fr-card--grey{background-color:#eee}.fr-card--shadow{background-color:#fff;box-shadow:0 0 0 1px rgba(0,0,18,.16);z-index:500}.fr-card--shadow.fr-card--grey{background-color:#eee}.fr-card--no-background{background-color:transparent}.fr-card--no-background:hover{background-color:rgba(0,0,0,.05)}.fr-card--no-background:active{background-color:rgba(0,0,0,.1)}.fr-card--download:not(.fr-card--no-background) .fr-card__header{background-color:#f6f6f6}.fr-card__detail{color:#666}.fr-card__title{color:#161616}.fr-card__title a[href],.fr-card__title button{color:#000091}.fr-card__title button:disabled{color:#929292}.fr-card__title:disabled,a.fr-card__title:not([href]){background-color:#e5e5e5;color:#929292}.fr-checkbox-group input[type=checkbox]{margin-top:0;opacity:1}.fr-fieldset__content .fr-checkbox-group input[type=checkbox]{margin-top:1.5rem}.fr-fieldset__content+.fr-error-text,.fr-fieldset__content+.fr-valid-text{margin-top:1rem}.fr-checkbox-group--error input[type=checkbox]+label,.fr-checkbox-group--error input[type=checkbox]:checked+label{color:#ce0500}.fr-checkbox-group--error:before{background-color:#ce0500}.fr-checkbox-group--valid input[type=checkbox]+label,.fr-checkbox-group--valid input[type=checkbox]:checked+label{color:#18753c}.fr-checkbox-group--valid:before{background-color:#18753c}.fr-segmented{display:block}.fr-segmented--sm .fr-segmented__legend--inline{margin:.25rem 0 0}.fr-segmented__legend--inline{margin:.5rem 0 0}.fr-segmented__elements{box-shadow:inset 0 0 0 1px #ddd;display:inline-flex}.fr-segmented input+label:before{height:1rem;vertical-align:-2px;width:1rem}.fr-segmented input:focus+label:before{outline:none}.fr-segmented__element label{color:#161616}.fr-segmented__element input:checked+label{box-shadow:inset 0 0 0 1px #000091;color:#000091}.fr-segmented__element input:checked:disabled+label{box-shadow:inset 0 0 0 1px #929292;color:#929292}.fr-toggle input[type=checkbox]::-ms-check{display:none}.fr-toggle input[type=checkbox]:checked:after,.fr-toggle input[type=checkbox]:checked:before{background-color:transparent;background-image:url(../../assets/images/b45a007d5340e85bc67c.svg);background-repeat:no-repeat;background-size:100%;height:1.5rem;width:1.5rem}.fr-toggle__list{list-style:none;padding:0}.fr-toggle label{color:#161616}.fr-toggle label:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width=%2740%27 stroke=%27%23000091%27 height=%2724%27 fill=%27transparent%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Crect x=%27.5%27 y=%27.5%27 width=%2739%27 height=%2723%27 rx=%2711.5%27/%3E%3C/svg%3E");color:#000091}.fr-toggle label:after{background-color:#fff;color:#000091}.fr-toggle input[type=checkbox],.fr-toggle label:after{box-shadow:inset 0 0 0 1px #000091}.fr-toggle input[type=checkbox]:checked{background-color:#000091}.fr-toggle input[type=checkbox]:checked~.fr-toggle__label:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width=%2740%27 stroke=%27%23000091%27 height=%2724%27 fill=%27%23000091%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Crect x=%27.5%27 y=%27.5%27 width=%2739%27 height=%2723%27 rx=%2711.5%27/%3E%3C/svg%3E")}.fr-toggle input[type=checkbox]:checked~.fr-toggle__label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath fill=%27%23000091%27 d=%27m10 15.17 9.2-9.2 1.4 1.42L10 18l-6.36-6.36 1.4-1.42z%27/%3E%3C/svg%3E")}.fr-toggle input[type=checkbox]:disabled{box-shadow:inset 0 0 0 1px #e5e5e5}.fr-toggle input[type=checkbox]:disabled:checked{background-color:#e5e5e5}.fr-toggle input[type=checkbox]:disabled:checked~.fr-toggle__label:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width=%2740%27 stroke=%27%23e5e5e5%27 height=%2724%27 fill=%27%23e5e5e5%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Crect x=%27.5%27 y=%27.5%27 width=%2739%27 height=%2723%27 rx=%2711.5%27/%3E%3C/svg%3E")}.fr-toggle input[type=checkbox]:disabled:checked~.fr-toggle__label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath fill=%27%23929292%27 d=%27m10 15.17 9.2-9.2 1.4 1.42L10 18l-6.36-6.36 1.4-1.42z%27/%3E%3C/svg%3E")}.fr-toggle input[type=checkbox]:disabled~.fr-toggle__label:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width=%2740%27 stroke=%27%23e5e5e5%27 height=%2724%27 fill=%27transparent%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Crect x=%27.5%27 y=%27.5%27 width=%2739%27 height=%2723%27 rx=%2711.5%27/%3E%3C/svg%3E");color:#929292}.fr-toggle input[type=checkbox]:disabled~.fr-toggle__label:after{box-shadow:inset 0 0 0 1px #e5e5e5;color:#929292}.fr-toggle .fr-hint-text{color:#666}.fr-toggle--border-bottom{box-shadow:inset 0 -1px 0 0 #ddd}.fr-toggle--valid:before{background-color:#18753c}.fr-toggle--error:before{background-color:#ce0500}.fr-fieldset--error .fr-toggle label,.fr-toggle--error label{color:#ce0500}.fr-fieldset--error .fr-toggle label:before,.fr-toggle--error label:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width=%2740%27 stroke=%27%23ce0500%27 height=%2724%27 fill=%27transparent%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Crect x=%27.5%27 y=%27.5%27 width=%2739%27 height=%2723%27 rx=%2711.5%27/%3E%3C/svg%3E");color:#ce0500}.fr-fieldset--error .fr-toggle label:after,.fr-toggle--error label:after{box-shadow:inset 0 0 0 1px #ce0500}.fr-fieldset--error .fr-toggle input[type=checkbox]:checked~.fr-toggle__label:before,.fr-toggle--error input[type=checkbox]:checked~.fr-toggle__label:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width=%2740%27 stroke=%27%23ce0500%27 height=%2724%27 fill=%27%23000091%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Crect x=%27.5%27 y=%27.5%27 width=%2739%27 height=%2723%27 rx=%2711.5%27/%3E%3C/svg%3E")}.fr-fieldset--valid .fr-toggle label,.fr-toggle--valid label{color:#18753c}.fr-fieldset--valid .fr-toggle label:before,.fr-toggle--valid label:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width=%2740%27 stroke=%27%2318753c%27 height=%2724%27 fill=%27transparent%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Crect x=%27.5%27 y=%27.5%27 width=%2739%27 height=%2723%27 rx=%2711.5%27/%3E%3C/svg%3E");color:#18753c}.fr-fieldset--valid .fr-toggle label:after,.fr-toggle--valid label:after{box-shadow:inset 0 0 0 1px #18753c}.fr-fieldset--valid .fr-toggle input[type=checkbox]:checked~.fr-toggle__label:before,.fr-toggle--valid input[type=checkbox]:checked~.fr-toggle__label:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width=%2740%27 stroke=%27%2318753c%27 height=%2724%27 fill=%27%23000091%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Crect x=%27.5%27 y=%27.5%27 width=%2739%27 height=%2723%27 rx=%2711.5%27/%3E%3C/svg%3E")}.fr-skiplinks ol,.fr-skiplinks ul{list-style-type:none}.fr-skiplinks ol,.fr-skiplinks ul{margin-bottom:0;margin-top:0;padding-left:0}.fr-skiplinks.focus-within{opacity:1;position:relative;transform:translateY(0)}.fr-skiplinks{background-color:#eee}.fr-select::-ms-expand{display:none}.fr-select{background-color:#eee;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath fill=%27%23161616%27 d=%27m12 13.1 5-4.9 1.4 1.4-6.4 6.3-6.4-6.4L7 8.1l5 5z%27/%3E%3C/svg%3E");box-shadow:inset 0 -2px 0 0 #3a3a3a;color:#3a3a3a}.fr-fieldset--valid .fr-select,.fr-select-group--valid .fr-select{box-shadow:inset 0 -2px 0 0 #18753c}.fr-fieldset--error .fr-select,.fr-select-group--error .fr-select{box-shadow:inset 0 -2px 0 0 #ce0500}.fr-select-group--error:before{background-image:linear-gradient(0deg,#ce0500,#ce0500)}.fr-select-group--valid:before{background-image:linear-gradient(0deg,#18753c,#18753c)}.fr-select-group--info:before{background-image:linear-gradient(0deg,#0063cb,#0063cb)}.fr-select:disabled{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath fill=%27%23929292%27 d=%27m12 13.1 5-4.9 1.4 1.4-6.4 6.3-6.4-6.4L7 8.1l5 5z%27/%3E%3C/svg%3E");box-shadow:inset 0 -2px 0 0 #e5e5e5;color:#929292}.fr-select:-webkit-autofill,.fr-select:-webkit-autofill:focus,.fr-select:-webkit-autofill:hover{-webkit-text-fill-color:#161616;box-shadow:inset 0 -2px 0 0 #3a3a3a,inset 0 0 0 1000px #ececfe}.fr-callout__title{color:#161616;margin:0 0 .5rem}.fr-callout__text{margin:0}.fr-callout{background-color:#eee;background-image:linear-gradient(0deg,#6a6af4,#6a6af4)}.fr-callout:before{color:#161616}.fr-callout--green-tilleul-verveine{background-color:#fceeac;background-image:linear-gradient(0deg,#b7a73f,#b7a73f)}.fr-callout--green-bourgeon{background-color:#c9fcac;background-image:linear-gradient(0deg,#68a532,#68a532)}.fr-callout--green-emeraude{background-color:#c3fad5;background-image:linear-gradient(0deg,#00a95f,#00a95f)}.fr-callout--green-menthe{background-color:#bafaee;background-image:linear-gradient(0deg,#009081,#009081)}.fr-callout--green-archipel{background-color:#c7f6fc;background-image:linear-gradient(0deg,#009099,#009099)}.fr-callout--blue-ecume{background-color:#e9edfe;background-image:linear-gradient(0deg,#465f9d,#465f9d)}.fr-callout--blue-cumulus{background-color:#e6eefe;background-image:linear-gradient(0deg,#417dc4,#417dc4)}.fr-callout--purple-glycine{background-color:#fee7fc;background-image:linear-gradient(0deg,#a558a0,#a558a0)}.fr-callout--pink-macaron{background-color:#fee9e6;background-image:linear-gradient(0deg,#e18b76,#e18b76)}.fr-callout--pink-tuile{background-color:#fee9e7;background-image:linear-gradient(0deg,#ce614a,#ce614a)}.fr-callout--yellow-tournesol{background-color:#feecc2;background-image:linear-gradient(0deg,#c8aa39,#c8aa39)}.fr-callout--yellow-moutarde{background-color:#feebd0;background-image:linear-gradient(0deg,#c3992a,#c3992a)}.fr-callout--orange-terre-battue{background-color:#fee9e5;background-image:linear-gradient(0deg,#e4794a,#e4794a)}.fr-callout--brown-cafe-creme{background-color:#f7ecdb;background-image:linear-gradient(0deg,#d1b781,#d1b781)}.fr-callout--brown-caramel{background-color:#f7ebe5;background-image:linear-gradient(0deg,#c08c65,#c08c65)}.fr-callout--brown-opera{background-color:#f7ece4;background-image:linear-gradient(0deg,#bd987a,#bd987a)}.fr-callout--beige-gris-galet{background-color:#f3ede5;background-image:linear-gradient(0deg,#aea397,#aea397)}.fr-modal__body{background-color:#fff;box-shadow:0 0 0 1px rgba(0,0,18,.16);z-index:2000}.fr-modal__title{color:#161616}.fr-modal__footer{background-color:#fff}.fr-modal__body.fr-scroll-divider .fr-modal__footer{background-image:linear-gradient(0deg,#ddd,#ddd)}.fr-nav [href]{text-decoration:none}.fr-nav ol,.fr-nav ul{list-style-type:none}.fr-nav ol,.fr-nav ul{margin-bottom:0;margin-top:0;padding-left:0}.fr-nav__btn:after{background-color:transparent;background-image:url(../../assets/images/4a86895e5ee6121af909.svg);background-repeat:no-repeat;background-size:100%;height:1rem;width:1rem}.fr-mega-menu__category{margin:0}.fr-nav__btn,.fr-nav__link{color:#161616}.fr-nav__btn[aria-current]:not([aria-current=false]),.fr-nav__link[aria-current]:not([aria-current=false]){color:#000091}.fr-nav__btn[aria-current]:not([aria-current=false]):before,.fr-nav__link[aria-current]:not([aria-current=false]):before{background-color:#000091}.fr-nav__btn[aria-expanded=true]:not(:disabled){background-color:#e3e3fd;color:#000091}.fr-nav__item:before{box-shadow:0 -1px 0 0 #ddd,inset 0 -1px 0 0 #ddd}.fr-nav__item:first-child:before{box-shadow:inset 0 -1px 0 0 #ddd}.fr-nav__item:last-child:before{box-shadow:0 -1px 0 0 #ddd}.fr-mega-menu__list:before{box-shadow:0 1px 0 0 #ddd}.fr-share__group>li{list-style:none}.fr-share .fr-btns-group:not(.fr-btns-group--sm):not(.fr-btns-group--lg) .fr-btn:not([class^=fr-icon-]):not([class*=" fr-icon-"]):not([class^=fr-fi-]):not([class*=" fr-fi-"]):after,.fr-share .fr-btns-group:not(.fr-btns-group--sm):not(.fr-btns-group--lg) .fr-btn:not([class^=fr-icon-]):not([class*=" fr-icon-"]):not([class^=fr-fi-]):not([class*=" fr-fi-"]):before{background-color:transparent;background-repeat:no-repeat;background-size:100%;height:1.5rem;width:1.5rem}.fr-share .fr-btn--facebook:before{background-image:url(../../assets/images/efe98820cd74adb214a4.svg)}.fr-share .fr-btn--linkedin:before{background-image:url(../../assets/images/4eeef519520b4becb095.svg)}.fr-share .fr-btn--mastodon:before{background-image:url(../../assets/images/a8e5b45feea1289eb9d4.svg)}.fr-share .fr-btn--threads:before{background-image:url(../../assets/images/1d7277c437ac00bdec04.svg)}.fr-share .fr-btn--twitter:before{background-image:url(../../assets/images/de8a811c2a3e7b36a36c.svg)}.fr-share .fr-btn--twitter-x:before{background-image:url(../../assets/images/bb706a4ee8750dd1fd08.svg)}.fr-share .fr-btn--mail:before{background-image:url(../../assets/images/34b1323ccecacf31feaf.svg)}.fr-share .fr-btn--copy:before,.fr-share .fr-btn--mail:before{background-color:transparent;background-repeat:no-repeat;background-size:100%;height:1.5rem;width:1.5rem}.fr-share .fr-btn--copy:before{background-image:url(../../assets/images/14df53eadfa149231599.svg)}.fr-share .fr-btn{background-color:transparent;box-shadow:inset 0 0 0 1px #ddd;color:#000091}.fr-share .fr-btn:hover{background-color:rgba(0,0,0,.05)}.fr-share .fr-btn:active{background-color:rgba(0,0,0,.1)}.fr-share .fr-btn:disabled,.fr-share a.fr-btn:not([href]){background-color:transparent;box-shadow:inset 0 0 0 1px #e5e5e5;color:#929292}.fr-share .fr-btn:disabled:hover,.fr-share a.fr-btn:not([href]):hover{background-color:rgba(0,0,0,.05)}.fr-share .fr-btn:disabled:active,.fr-share a.fr-btn:not([href]):active{background-color:rgba(0,0,0,.1)}.fr-share__text{color:#666}.fr-share__link{background-color:transparent;box-shadow:inset 0 0 0 1px #ddd;color:#000091}.fr-share__link:hover{background-color:rgba(0,0,0,.05)}.fr-share__link:active{background-color:rgba(0,0,0,.1)}.fr-share__link:disabled,a.fr-share__link:not([href]){background-color:transparent;box-shadow:inset 0 0 0 1px #e5e5e5;color:#929292}.fr-share__link:disabled:hover,a.fr-share__link:not([href]):hover{background-color:rgba(0,0,0,.05)}.fr-share__link:disabled:active,a.fr-share__link:not([href]):active{background-color:rgba(0,0,0,.1)}.fr-footer ol,.fr-footer ul{list-style-type:none}.fr-footer ol,.fr-footer ul{margin-bottom:0;margin-top:0;padding-left:0}.fr-footer__content-desc [href]{text-decoration:underline}.fr-footer{box-shadow:inset 0 2px 0 0 #000091,inset 0 -1px 0 0 #ddd}.fr-footer__content-link{color:#3a3a3a}.fr-footer__top-cat{color:#161616}.fr-footer__top{background-color:#f6f6f6}.fr-footer__bottom{box-shadow:inset 0 1px 0 0 #ddd}.fr-footer__bottom .fr-btn{color:#666}.fr-footer__bottom-item:before{box-shadow:inset 0 0 0 1px #ddd}.fr-footer__bottom-copy,.fr-footer__bottom-link{color:#666}.fr-footer__partners{box-shadow:inset 0 1px 0 0 #ddd}.fr-footer__partners-title{color:#3a3a3a}.fr-footer__partners .fr-footer__logo{background-color:#fff;box-shadow:inset 0 0 0 1px #ddd}.fr-tile--download .fr-tile__body,.fr-tile--horizontal .fr-tile__body{flex-basis:100%}.fr-tile__body,.fr-tile__body>*{max-width:100%}.fr-tile__title{color:#161616;margin:0 0 .5rem;max-width:100%}.fr-tile__title a:after,.fr-tile__title button:after{background-image:url(../../assets/images/c7e409a631c94231dfeb.svg)}.fr-tile__title [target=_blank]:after,.fr-tile__title a:after,.fr-tile__title button:after{background-color:transparent;background-repeat:no-repeat;background-size:100%;height:1rem;width:1rem}.fr-tile__title [target=_blank]:after{background-image:url(../../assets/images/5fac7fc1e919c8785620.svg)}.fr-tile__desc{margin:0;max-width:100%}.fr-tile__detail,.fr-tile__start{max-width:100%}.fr-tile--download .fr-tile__title a:after,.fr-tile--download .fr-tile__title button:after{background-color:transparent;background-image:url(../../assets/images/dbb56e50b667ae162595.svg);background-repeat:no-repeat;background-size:100%}.fr-tile.fr-enlarge-link .fr-tile__title a{text-decoration:none}.fr-tile.fr-enlarge-button .fr-tile__title button:after,.fr-tile.fr-enlarge-link .fr-tile__title a:after{background-color:transparent;height:1.5rem;width:1.5rem}.fr-tile--sm .fr-tile__title a:after,.fr-tile--sm .fr-tile__title button:after{height:1rem;width:1rem}.fr-tile{background-color:#fff}.fr-tile:not(.fr-tile--no-border):not(.fr-tile--shadow){background-image:linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd)}.fr-tile--grey{background-color:#eee}.fr-tile--shadow{background-color:#fff;box-shadow:0 0 0 1px rgba(0,0,18,.16);z-index:500}.fr-tile--shadow.fr-tile--grey{background-color:#eee}.fr-tile--no-background{background-color:transparent}.fr-tile--no-background:hover{background-color:rgba(0,0,0,.05)}.fr-tile--no-background:active{background-color:rgba(0,0,0,.1)}.fr-tile__title:disabled,a.fr-tile__title:not([href]){background-color:#e5e5e5;color:#929292}.fr-tile__title:before{background-image:linear-gradient(0deg,#3a3a3a,#3a3a3a)}.fr-tile__title a,.fr-tile__title button{color:#000091}.fr-tile__title a:before,.fr-tile__title button:before{background-image:linear-gradient(0deg,#000091,#000091)}.fr-tile__title a:not([href]),.fr-tile__title button:disabled{color:#929292}.fr-tile__title a:not([href]):before,.fr-tile__title button:disabled:before{background-image:linear-gradient(0deg,#e5e5e5,#e5e5e5)}.fr-translate .fr-translate__btn:before{background-image:url(../../assets/images/b7e5c81d618739869908.svg)}.fr-translate .fr-translate__btn:after,.fr-translate .fr-translate__btn:before{background-color:transparent;background-repeat:no-repeat;background-size:100%;height:1rem;width:1rem}.fr-translate .fr-translate__btn:after{background-image:url(../../assets/images/4a86895e5ee6121af909.svg)}.fr-translate .fr-translate__btn[aria-expanded=true]{background-color:#e3e3fd;color:#000091}.fr-translate__menu .fr-translate__language{box-shadow:none}.fr-transcription{position:relative}.fr-transcription__btn:before{background-image:url(../../assets/images/469dc8a59a64f71ab6d7.svg)}.fr-transcription__btn:after,.fr-transcription__btn:before{background-color:transparent;background-repeat:no-repeat;background-size:100%;height:1rem;width:1rem}.fr-transcription__btn:after{background-image:url(../../assets/images/4a86895e5ee6121af909.svg)}.fr-transcription__btn[aria-expanded=true]:after{transform:rotate(-180deg)}ol.fr-transcription__actions-group,ul.fr-transcription__actions-group{list-style-type:none}ol.fr-transcription__actions-group,ul.fr-transcription__actions-group{margin-bottom:0;margin-top:0;padding-left:0}.fr-transcription .fr-modal:not(.fr-modal--opened) .fr-modal__content{max-height:9.5rem}.fr-transcription:before{box-shadow:inset 0 0 0 1px #ddd}.fr-transcription__btn{color:#000091}.fr-transcription__btn[aria-expanded=true]{background-color:#e3e3fd}.fr-transcription .fr-modal:not(.fr-modal--opened):before,.fr-transcription__content:before,.fr-transcription__footer:before{box-shadow:inset 0 1px 0 0 #ddd}.fr-input-wrap--addon .fr-btn{flex-shrink:0}.fr-input{background-color:#eee;box-shadow:inset 0 -2px 0 0 #3a3a3a;color:#3a3a3a}.fr-input::placeholder{color:#666}.fr-input::-webkit-contacts-auto-fill-button{background-color:#161616}.fr-input::-webkit-contacts-auto-fill-button:hover{background-color:#343434}.fr-input::-webkit-contacts-auto-fill-button:active{background-color:#474747}.fr-input:-webkit-autofill,.fr-input:-webkit-autofill:focus,.fr-input:-webkit-autofill:hover,.fr-input:autofill,.fr-input:autofill:focus,.fr-input:autofill:hover{-webkit-text-fill-color:#161616;box-shadow:inset 0 -2px 0 0 #3a3a3a,inset 0 0 0 1000px #e8edff}.fr-input-wrap--addon>.fr-input:not(:last-child){box-shadow:inset 0 -2px 0 0 #000091}.fr-fieldset--valid .fr-input,.fr-fieldset--valid .fr-input-wrap--addon>.fr-input:not(:last-child),.fr-input-group--valid .fr-input,.fr-input-group--valid .fr-input-wrap--addon>.fr-input:not(:last-child){box-shadow:inset 0 -2px 0 0 #18753c}.fr-fieldset--error .fr-input,.fr-fieldset--error .fr-input-wrap--addon>.fr-input:not(:last-child),.fr-input-group--error .fr-input,.fr-input-group--error .fr-input-wrap--addon>.fr-input:not(:last-child){box-shadow:inset 0 -2px 0 0 #ce0500}.fr-input-group--error:before{background-image:linear-gradient(0deg,#ce0500,#ce0500)}.fr-input-group--valid:before{background-image:linear-gradient(0deg,#18753c,#18753c)}.fr-input-group--info:before{background-image:linear-gradient(0deg,#0063cb,#0063cb)}.fr-search-bar .fr-btn:after,.fr-search-bar .fr-btn:before{background-color:transparent;background-image:url(../../assets/images/cbcd275e58cc0064074d.svg);background-repeat:no-repeat;background-size:100%;height:1.5rem;width:1.5rem}.fr-search-bar .fr-input{box-shadow:inset 0 -2px 0 0 #000091}.fr-search-bar .fr-input--valid{box-shadow:inset 0 -2px 0 0 #18753c}.fr-search-bar .fr-input--error{box-shadow:inset 0 -2px 0 0 #ce0500}.fr-search-bar .fr-input::-webkit-search-cancel-button{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2724%27 height=%2724%27%3E%3Cpath fill=%27%23161616%27 d=%27M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm0-11.414L9.172 7.757 7.757 9.172 10.586 12l-2.829 2.828 1.415 1.415L12 13.414l2.828 2.829 1.415-1.415L13.414 12l2.829-2.828-1.415-1.415L12 10.586z%27/%3E%3C/svg%3E")}.fr-content-media .fr-link,.fr-content-media__caption{color:#666}.fr-content-media__transcription .fr-link{background-color:transparent;color:#000091}.fr-content-media__transcription .fr-link:hover{background-color:rgba(0,0,0,.05)}.fr-content-media__transcription .fr-link:active{background-color:rgba(0,0,0,.1)}.fr-content-media__transcription .fr-link:disabled,.fr-content-media__transcription a.fr-link:not([href]){background-color:transparent;color:#929292}.fr-content-media__transcription .fr-link:disabled:hover,.fr-content-media__transcription a.fr-link:not([href]):hover{background-color:rgba(0,0,0,.05)}.fr-content-media__transcription .fr-link:disabled:active,.fr-content-media__transcription a.fr-link:not([href]):active{background-color:rgba(0,0,0,.1)}.fr-consent-service__collapse .fr-consent-service__collapse-btn{text-decoration:underline}.fr-consent-service__collapse .fr-consent-service__collapse-btn:after,.fr-consent-service__collapse .fr-consent-service__collapse-btn:before{background-color:transparent;background-image:url(../../assets/images/4a86895e5ee6121af909.svg);background-repeat:no-repeat;background-size:100%;height:1rem;width:1rem}.fr-consent-service__collapse .fr-consent-service__collapse-btn[aria-expanded=true]:after,.fr-consent-service__collapse .fr-consent-service__collapse-btn[aria-expanded=true]:before{background-color:transparent;background-image:url(../../assets/images/be3a1ed8fd6c6a480611.svg);background-repeat:no-repeat;background-size:100%;height:1rem;width:1rem}.fr-consent-placeholder{background-color:#eee}.fr-consent-banner{background-color:#f6f6f6;box-shadow:0 0 0 1px rgba(0,0,18,.16);box-shadow:inset 0 0 0 1px #ddd;z-index:1500}.fr-consent-manager__header,.fr-consent-service{box-shadow:inset 0 -1px 0 0 #ddd;color:#3a3a3a}.fr-consent-manager__header .fr-radio-group+.fr-radio-group:before,.fr-consent-service .fr-radio-group+.fr-radio-group:before{box-shadow:inset 0 0 0 1px #ddd}.fr-consent-service__title{color:#161616}.fr-consent-service .fr-consent-service,.fr-consent-service:last-of-type{box-shadow:none}.fr-consent-service .fr-consent-service__collapse-btn{color:#000091}.fr-follow__newsletter>*{max-width:100%}.fr-follow .fr-btn--dailymotion:before{background-image:url(../../assets/images/e88887ec9ce5fcacafd6.svg)}.fr-follow .fr-btn--facebook:before{background-image:url(../../assets/images/85e5514df938792c3cf5.svg)}.fr-follow .fr-btn--github:before{background-image:url(../../assets/images/e4064b3b7d67395d8307.svg)}.fr-follow .fr-btn--instagram:before{background-image:url(../../assets/images/284e8ad7601c2a8c992a.svg)}.fr-follow .fr-btn--linkedin:before{background-image:url(../../assets/images/70827b33771f97f3f233.svg)}.fr-follow .fr-btn--mastodon:before{background-image:url(../../assets/images/62f8c1d81e9ebea2e4dd.svg)}.fr-follow .fr-btn--snapchat:before{background-image:url(../../assets/images/d506b9d691335ad9bb34.svg)}.fr-follow .fr-btn--telegram:before{background-image:url(../../assets/images/300e8462a649d7858330.svg)}.fr-follow .fr-btn--threads:before{background-image:url(../../assets/images/42474a6fceb470415b22.svg)}.fr-follow .fr-btn--tiktok:before{background-image:url(../../assets/images/b20bf23e5cf4eca5dbb6.svg)}.fr-follow .fr-btn--twitch:before{background-image:url(../../assets/images/48b06e3ab6048a2775df.svg)}.fr-follow .fr-btn--twitter:before{background-image:url(../../assets/images/cf1c261c76c67048ed18.svg)}.fr-follow .fr-btn--twitter-x:before{background-image:url(../../assets/images/cc1fbccc3b617a58b26f.svg)}.fr-follow .fr-btn--vimeo:before{background-image:url(../../assets/images/4bd179a31bc71a78aab3.svg)}.fr-follow .fr-btn--youtube:before{background-image:url(../../assets/images/b94527160745f1f21bc6.svg)}.fr-follow .fr-btns-group:not(.fr-btns-group--sm):not(.fr-btns-group--lg) .fr-btn:not([class^=fr-icon-]):not([class*=" fr-icon-"]):not([class^=fr-fi-]):not([class*=" fr-fi-"]):after,.fr-follow .fr-btns-group:not(.fr-btns-group--sm):not(.fr-btns-group--lg) .fr-btn:not([class^=fr-icon-]):not([class*=" fr-icon-"]):not([class^=fr-fi-]):not([class*=" fr-fi-"]):before{background-color:transparent;background-repeat:no-repeat;background-size:100%;height:1.5rem;width:1.5rem}.fr-follow .fr-btns-group--lg .fr-btn:not([class^=fr-icon-]):not([class*=" fr-icon-"]):not([class^=fr-fi-]):not([class*=" fr-fi-"]):after,.fr-follow .fr-btns-group--lg .fr-btn:not([class^=fr-icon-]):not([class*=" fr-icon-"]):not([class^=fr-fi-]):not([class*=" fr-fi-"]):before{background-color:transparent;background-repeat:no-repeat;background-size:100%;height:2rem;width:2rem}.fr-follow .fr-link--facebook:after,.fr-follow .fr-link--facebook:before{background-color:transparent;background-image:url(../../assets/images/85e5514df938792c3cf5.svg);background-repeat:no-repeat;background-size:100%;height:1.5rem;width:1.5rem}.fr-follow .fr-link--twitter:after,.fr-follow .fr-link--twitter:before{background-color:transparent;background-image:url(../../assets/images/cf1c261c76c67048ed18.svg);background-repeat:no-repeat;background-size:100%;height:1.5rem;width:1.5rem}.fr-follow .fr-link--twitter-x:after,.fr-follow .fr-link--twitter-x:before{background-color:transparent;background-image:url(../../assets/images/cc1fbccc3b617a58b26f.svg);background-repeat:no-repeat;background-size:100%;height:1.5rem;width:1.5rem}.fr-follow .fr-link--instagram:after,.fr-follow .fr-link--instagram:before{background-color:transparent;background-image:url(../../assets/images/284e8ad7601c2a8c992a.svg);background-repeat:no-repeat;background-size:100%;height:1.5rem;width:1.5rem}.fr-follow .fr-link--linkedin:after,.fr-follow .fr-link--linkedin:before{background-color:transparent;background-image:url(../../assets/images/70827b33771f97f3f233.svg);background-repeat:no-repeat;background-size:100%;height:1.5rem;width:1.5rem}.fr-follow .fr-link--youtube:after,.fr-follow .fr-link--youtube:before{background-image:url(../../assets/images/b94527160745f1f21bc6.svg)}.fr-follow .fr-link--youtube:after,.fr-follow .fr-link--youtube:before,.fr-follow .fr-links-group:not(.fr-links-group--sm):not(.fr-links-group--lg) .fr-link:not([class^=fr-icon-]):not([class*=" fr-icon-"]):not([class^=fr-fi-]):not([class*=" fr-fi-"]):after,.fr-follow .fr-links-group:not(.fr-links-group--sm):not(.fr-links-group--lg) .fr-link:not([class^=fr-icon-]):not([class*=" fr-icon-"]):not([class^=fr-fi-]):not([class*=" fr-fi-"]):before{background-color:transparent;background-repeat:no-repeat;background-size:100%;height:1.5rem;width:1.5rem}.fr-follow .fr-links-group--lg .fr-link:not([class^=fr-icon-]):not([class*=" fr-icon-"]):not([class^=fr-fi-]):not([class*=" fr-fi-"]):after,.fr-follow .fr-links-group--lg .fr-link:not([class^=fr-icon-]):not([class*=" fr-icon-"]):not([class^=fr-fi-]):not([class*=" fr-fi-"]):before{background-color:transparent;background-repeat:no-repeat;background-size:100%;height:2rem;width:2rem}.fr-follow{background-color:#f5f5fe}.fr-follow .fr-input{background-color:#fff}.fr-follow__title{color:#161616}.fr-follow__newsletter-legal{color:#666}.fr-follow__social .fr-btn{background-color:transparent;color:#000091}.fr-follow__social .fr-btn:hover{background-color:rgba(0,0,0,.05)}.fr-follow__social .fr-btn:active{background-color:rgba(0,0,0,.1)}.fr-follow__social .fr-btn:disabled,.fr-follow__social a.fr-btn:not([href]){background-color:transparent;color:#929292}.fr-follow__social .fr-btn:disabled:hover,.fr-follow__social a.fr-btn:not([href]):hover{background-color:rgba(0,0,0,.05)}.fr-follow__social .fr-btn:disabled:active,.fr-follow__social a.fr-btn:not([href]):active{background-color:rgba(0,0,0,.1)}.fr-follow .fr-grid-row>:not(:first-child){box-shadow:0 -1px 0 0 #6a6af4}.fr-follow__social .fr-link{background-color:transparent;color:#000091}.fr-follow__social .fr-link:hover{background-color:rgba(0,0,0,.05)}.fr-follow__social .fr-link:active{background-color:rgba(0,0,0,.1)}.fr-follow__social .fr-link:disabled,.fr-follow__social a.fr-link:not([href]){background-color:transparent;color:#929292}.fr-follow__social .fr-link:disabled:hover,.fr-follow__social a.fr-link:not([href]):hover{background-color:rgba(0,0,0,.05)}.fr-follow__social .fr-link:disabled:active,.fr-follow__social a.fr-link:not([href]):active{background-color:rgba(0,0,0,.1)}.fr-password__checkbox{margin:0;position:absolute;right:0;top:0}.fr-password__btn{background-color:transparent;color:#000091}.fr-password__btn:hover{background-color:rgba(0,0,0,.05)}.fr-password__btn:active{background-color:rgba(0,0,0,.1)}.fr-password__btn:disabled,a.fr-password__btn:not([href]){background-color:transparent;color:#929292}.fr-password__btn:disabled:hover,a.fr-password__btn:not([href]):hover{background-color:rgba(0,0,0,.05)}.fr-password__btn:disabled:active,a.fr-password__btn:not([href]):active{background-color:rgba(0,0,0,.1)}.fr-password [data-fr-capslock]:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath fill=%27%23161616%27 d=%27M22.668 0C23.402 0 24 .598 24 1.332v21.336c0 .734-.598 1.332-1.332 1.332H1.332A1.334 1.334 0 0 1 0 22.668V1.332C0 .598.598 0 1.332 0Zm-1.336 2.668H2.668v18.664h18.664Zm-4.664 12.664V18H7.332v-2.668ZM12 5.332 16.668 10H14v3.332h-4V10H7.332Zm0 0%27/%3E%3C/svg%3E")}.fr-password .fr-password__checkbox input[type=checkbox]+label{color:#161616}.fr-header ol,.fr-header ul{list-style-type:none}.fr-header ol,.fr-header ul{margin-bottom:0;margin-top:0;padding-left:0}.fr-header [href]{text-decoration:none}.fr-header .fr-btns-group:not(.fr-btns-group--sm):not(.fr-btns-group--lg):not([class^=fr-btns-group--icon-]):not([class*=" fr-btns-group--icon-"]) .fr-btn.fr-btn--display:before,.fr-header .fr-btns-group:not(.fr-btns-group--sm):not(.fr-btns-group--lg):not([class^=fr-btns-group--icon-]):not([class*=" fr-btns-group--icon-"]) .fr-btn:not([class^=fr-icon-]):not([class*=" fr-icon-"]):not([class^=fr-fi-]):not([class*=" fr-fi-"]):not(.fr-btn--display):before,.fr-header .fr-btns-group:not(.fr-btns-group--sm):not(.fr-btns-group--lg):not([class^=fr-btns-group--icon-]):not([class*=" fr-btns-group--icon-"]) .fr-btn[class*=" fr-fi-"]:before,.fr-header .fr-btns-group:not(.fr-btns-group--sm):not(.fr-btns-group--lg):not([class^=fr-btns-group--icon-]):not([class*=" fr-btns-group--icon-"]) .fr-btn[class*=" fr-icon-"]:before,.fr-header .fr-btns-group:not(.fr-btns-group--sm):not(.fr-btns-group--lg):not([class^=fr-btns-group--icon-]):not([class*=" fr-btns-group--icon-"]) .fr-btn[class^=fr-fi-]:before,.fr-header .fr-btns-group:not(.fr-btns-group--sm):not(.fr-btns-group--lg):not([class^=fr-btns-group--icon-]):not([class*=" fr-btns-group--icon-"]) .fr-btn[class^=fr-icon-]:before{height:1rem;width:1rem}.fr-header__tools-links .fr-link{background-color:transparent;color:#000091;overflow:visible}.fr-header__operator img{height:auto!important}.fr-header__brand{background-color:#fff;box-shadow:0 0 0 1px rgba(0,0,18,.16);z-index:750}.fr-header__service{color:#161616}.fr-header__service:before{background-color:#ddd}.fr-header__menu-links:after{box-shadow:inset 0 1px 0 0 #ddd}.fr-header__menu-links .fr-btn{background-color:transparent;box-shadow:none;color:#000091}.fr-header__menu-links .fr-btn:hover{background-color:rgba(0,0,0,.05)}.fr-header__menu-links .fr-btn:active{background-color:rgba(0,0,0,.1)}.fr-header__menu-links .fr-btn:disabled,.fr-header__menu-links a.fr-btn:not([href]){background-color:transparent;color:#929292}.fr-header__menu-links .fr-btn:disabled:hover,.fr-header__menu-links a.fr-btn:not([href]):hover{background-color:rgba(0,0,0,.05)}.fr-header__menu-links .fr-btn:disabled:active,.fr-header__menu-links a.fr-btn:not([href]):active{background-color:rgba(0,0,0,.1)}.fr-header__tools-links .fr-btn{background-color:transparent;color:#000091}.fr-header__tools-links .fr-btn:hover{background-color:rgba(0,0,0,.05)}.fr-header__tools-links .fr-btn:active{background-color:rgba(0,0,0,.1)}.fr-header__tools-links .fr-btn:disabled,.fr-header__tools-links a.fr-btn:not([href]){background-color:transparent;color:#929292}.fr-header__tools-links .fr-btn:disabled:hover,.fr-header__tools-links a.fr-btn:not([href]):hover{background-color:rgba(0,0,0,.05)}.fr-header__tools-links .fr-btn:disabled:active,.fr-header__tools-links a.fr-btn:not([href]):active{background-color:rgba(0,0,0,.1)}.fr-header__tools-links>.fr-translate:first-child:last-child .fr-btn{background-color:transparent;box-shadow:inset 0 0 0 1px #ddd;color:#000091}.fr-header__tools-links>.fr-translate:first-child:last-child .fr-btn:hover{background-color:rgba(0,0,0,.05)}.fr-header__tools-links>.fr-translate:first-child:last-child .fr-btn:active{background-color:rgba(0,0,0,.1)}.fr-header__tools-links>.fr-translate:first-child:last-child .fr-btn:disabled,.fr-header__tools-links>.fr-translate:first-child:last-child a.fr-btn:not([href]){background-color:transparent;box-shadow:inset 0 0 0 1px #e5e5e5;color:#929292}.fr-header__tools-links>.fr-translate:first-child:last-child .fr-btn:disabled:hover,.fr-header__tools-links>.fr-translate:first-child:last-child a.fr-btn:not([href]):hover{background-color:rgba(0,0,0,.05)}.fr-header__tools-links>.fr-translate:first-child:last-child .fr-btn:disabled:active,.fr-header__tools-links>.fr-translate:first-child:last-child a.fr-btn:not([href]):active{background-color:rgba(0,0,0,.1)}.fr-header__navbar .fr-service__title{color:#161616}.fr-header__navbar .fr-btn{background-color:transparent;color:#000091}.fr-header__navbar .fr-btn:hover{background-color:rgba(0,0,0,.05)}.fr-header__navbar .fr-btn:active{background-color:rgba(0,0,0,.1)}.fr-header__navbar .fr-btn:disabled,.fr-header__navbar a.fr-btn:not([href]){background-color:transparent;color:#929292}.fr-header__navbar .fr-btn:disabled:hover,.fr-header__navbar a.fr-btn:not([href]):hover{background-color:rgba(0,0,0,.05)}.fr-header__navbar .fr-btn:disabled:active,.fr-header__navbar a.fr-btn:not([href]):active{background-color:rgba(0,0,0,.1)}.fr-header__navbar .fr-btn--menu{background-color:transparent;box-shadow:inset 0 0 0 1px #ddd;color:#000091}.fr-header__navbar .fr-btn--menu:hover{background-color:rgba(0,0,0,.05)}.fr-header__navbar .fr-btn--menu:active{background-color:rgba(0,0,0,.1)}.fr-header__navbar .fr-btn--menu:disabled,.fr-header__navbar a.fr-btn--menu:not([href]){background-color:transparent;box-shadow:inset 0 0 0 1px #e5e5e5;color:#929292}.fr-header__navbar .fr-btn--menu:disabled:hover,.fr-header__navbar a.fr-btn--menu:not([href]):hover{background-color:rgba(0,0,0,.05)}.fr-header__navbar .fr-btn--menu:disabled:active,.fr-header__navbar a.fr-btn--menu:not([href]):active{background-color:rgba(0,0,0,.1)}.fr-header .fr-modal{background-color:#fff}.fr-header__menu-links .fr-link{background-color:transparent;box-shadow:inset 0 -1px 0 0 #ddd;color:#000091}.fr-header__menu-links .fr-link:hover{background-color:rgba(0,0,0,.05)}.fr-header__menu-links .fr-link:active{background-color:rgba(0,0,0,.1)}.fr-header__menu-links .fr-link:disabled,.fr-header__menu-links a.fr-link:not([href]){background-color:transparent;color:#929292}.fr-header__menu-links .fr-link:disabled:hover,.fr-header__menu-links a.fr-link:not([href]):hover{background-color:rgba(0,0,0,.05)}.fr-header__menu-links .fr-link:disabled:active,.fr-header__menu-links a.fr-link:not([href]):active{background-color:rgba(0,0,0,.1)}.fr-header__tools-links .fr-link:hover{background-color:rgba(0,0,0,.05)}.fr-header__tools-links .fr-link:active{background-color:rgba(0,0,0,.1)}.fr-header__tools-links .fr-link:disabled,.fr-header__tools-links a.fr-link:not([href]){background-color:transparent;color:#929292}.fr-header__tools-links .fr-link:disabled:hover,.fr-header__tools-links a.fr-link:not([href]):hover{background-color:rgba(0,0,0,.05)}.fr-header__tools-links .fr-link:disabled:active,.fr-header__tools-links a.fr-link:not([href]):active{background-color:rgba(0,0,0,.1)}}@media screen and (min-width:48em) and (min-width:0\0) and (min-resolution:72dpi){.fr-sidemenu,.fr-sidemenu__title{box-shadow:none}.fr-sidemenu__inner{box-shadow:inset -1px 0 0 0 #ddd}.fr-sidemenu--right .fr-sidemenu__inner{box-shadow:inset 1px 0 0 0 #ddd}.fr-follow .fr-grid-row>:not(:first-child){box-shadow:-1px 0 0 0 #6a6af4}}@media screen and (min-width:0\0) and (min-resolution:72dpi) and (min-width:48em){.fr-tabs__panel>*{margin-left:2rem;margin-right:2rem}.fr-tabs__panel>:first-child{margin-top:1.75rem}.fr-tabs__panel>:last-child{margin-bottom:2rem}.fr-card--download .fr-card__header{padding-top:0}.fr-card--download .fr-card__body,.fr-card--horizontal .fr-card__body,.fr-card--horizontal-half .fr-card__body,.fr-card--horizontal-tier .fr-card__body{flex-basis:100%}.fr-tile--download.fr-tile--vertical\@md .fr-tile__body,.fr-tile--horizontal.fr-tile--vertical\@md .fr-tile__body{flex-basis:auto}}@media screen and (forced-colors:active) and (min-width:0\0) and (min-resolution:72dpi),screen and (prefers-contrast:more) and (min-width:0\0) and (min-resolution:72dpi){.fr-pagination__link[aria-current]:not([aria-current=false]){border:1px solid #000091}}@media screen and (min-width:62em) and (min-width:0\0) and (min-resolution:72dpi){.fr-nav__item{position:static}.fr-nav__item--align-right .fr-collapse{transform:translateX(-100%)}.fr-menu .fr-menu__list{margin-bottom:2rem}.fr-menu{z-index:1000}.fr-menu__list{background-color:#fff;background-image:linear-gradient(0deg,#e3e3fd,#e3e3fd);box-shadow:0 0 0 1px rgba(0,0,18,.16)}.fr-menu__list>:first-child,.fr-menu__list>:first-child>.fr-nav__link,.fr-menu__list>:hover,.fr-menu__list>:hover+*,.fr-menu__list>:hover+*>.fr-nav__link,.fr-menu__list>:hover>.fr-nav__link{box-shadow:none}.fr-menu .fr-nav__link{box-shadow:0 calc(-1rem - 1px) 0 -1rem #ddd}.fr-mega-menu{background-color:#fff;box-shadow:0 0 0 1px rgba(0,0,18,.16);box-shadow:inset 0 1px 0 0 #e3e3fd;z-index:1000}.fr-mega-menu__category{box-shadow:0 calc(1rem + 1px) 0 -1rem #ddd}.fr-header{background-color:#fff;box-shadow:0 0 0 1px rgba(0,0,18,.16);z-index:750}.fr-header__brand{background:transparent;box-shadow:none;z-index:auto}.fr-header__service{box-shadow:none}.fr-header .fr-header__menu{box-shadow:inset 0 1px 0 0 #ddd}}@media screen and (min-width:0\0) and (min-resolution:72dpi) and (min-width:62em){.fr-tile--download.fr-tile--vertical\@lg .fr-tile__body,.fr-tile--horizontal.fr-tile--vertical\@lg .fr-tile__body{flex-basis:auto}.fr-header .fr-modal{overflow:visible;position:static}}@media print{body{background-color:#fff;color:#3a3a3a}a:not([href]),audio:not([href]),button:disabled,input:disabled,input[type=checkbox]:disabled,input[type=checkbox]:disabled+label,input[type=radio]:disabled,input[type=radio]:disabled+label,textarea:disabled,video:not([href]){color:#929292}.fr-artwork-decorative{fill:#ececfe}.fr-artwork-minor{fill:#e1000f}.fr-artwork-major{fill:#000091}.fr-artwork-background{fill:#f6f6f6}.fr-artwork-motif{fill:#e5e5e5}.fr-artwork--green-tilleul-verveine .fr-artwork-minor{fill:#b7a73f}.fr-artwork--green-bourgeon .fr-artwork-minor{fill:#68a532}.fr-artwork--green-emeraude .fr-artwork-minor{fill:#00a95f}.fr-artwork--green-menthe .fr-artwork-minor{fill:#009081}.fr-artwork--green-archipel .fr-artwork-minor{fill:#009099}.fr-artwork--blue-ecume .fr-artwork-minor{fill:#465f9d}.fr-artwork--blue-cumulus .fr-artwork-minor{fill:#417dc4}.fr-artwork--purple-glycine .fr-artwork-minor{fill:#a558a0}.fr-artwork--pink-macaron .fr-artwork-minor{fill:#e18b76}.fr-artwork--pink-tuile .fr-artwork-minor{fill:#ce614a}.fr-artwork--yellow-tournesol .fr-artwork-minor{fill:#c8aa39}.fr-artwork--yellow-moutarde .fr-artwork-minor{fill:#c3992a}.fr-artwork--orange-terre-battue .fr-artwork-minor{fill:#e4794a}.fr-artwork--brown-cafe-creme .fr-artwork-minor{fill:#d1b781}.fr-artwork--brown-caramel .fr-artwork-minor{fill:#c08c65}.fr-artwork--brown-opera .fr-artwork-minor{fill:#bd987a}.fr-artwork--beige-gris-galet .fr-artwork-minor{fill:#aea397}[disabled] .fr-artwork *{fill:#929292}.fr-display-lg,.fr-display-md,.fr-display-sm,.fr-display-xl,.fr-display-xs,.fr-h1,.fr-h2,.fr-h3,.fr-h4,.fr-h5,.fr-h6,h1,h2,h3,h4,h5,h6{color:#161616}hr{background-image:linear-gradient(0deg,#ddd,#ddd)}.fr-hr-or:after,.fr-hr-or:before{background-color:#ddd}.fr-hr{background-image:linear-gradient(0deg,#ddd,#ddd)}.fr-no-print{display:none}h1,h2,h3,h4{break-after:avoid;page-break-after:avoid}p{orphans:3;widows:3}.fr-text--sm,.fr-text--xs{font-size:1rem!important;line-height:1.5rem!important;margin:var(--text-spacing)}.fr-upload{font-size:1rem;line-height:1.5rem}.fr-accordion:before{box-shadow:inset 0 1px 0 0 #ddd,0 1px 0 0 #ddd}.fr-accordion__btn{color:#000091}.fr-accordion__btn[aria-expanded=true]{background-color:#e3e3fd}.fr-accordion__btn:after{transform:rotate(-180deg)}.fr-accordion .fr-collapse:not(.fr-collapse--expanded){--collapse-max-height:none!important;--collapse:inherit!important;padding:1rem;visibility:visible}.fr-badge{background-color:#eee;color:#3a3a3a}.fr-badge--info{background-color:#e8edff;color:#0063cb}.fr-badge--error{background-color:#ffe9e9;color:#ce0500}.fr-badge--success{background-color:#b8fec9;color:#18753c}.fr-badge--warning{background-color:#ffe9e6;color:#b34000}.fr-badge--new{background-color:#feebd0;color:#695240}.fr-badge--green-tilleul-verveine{background-color:#fceeac;color:#66673d}.fr-badge--green-bourgeon{background-color:#c9fcac;color:#447049}.fr-badge--green-emeraude{background-color:#c3fad5;color:#297254}.fr-badge--green-menthe{background-color:#bafaee;color:#37635f}.fr-badge--green-archipel{background-color:#c7f6fc;color:#006a6f}.fr-badge--blue-ecume{background-color:#e9edfe;color:#2f4077}.fr-badge--blue-cumulus{background-color:#e6eefe;color:#3558a2}.fr-badge--purple-glycine{background-color:#fee7fc;color:#6e445a}.fr-badge--pink-macaron{background-color:#fee9e6;color:#8d533e}.fr-badge--pink-tuile{background-color:#fee9e7;color:#a94645}.fr-badge--yellow-tournesol{background-color:#feecc2;color:#716043}.fr-badge--yellow-moutarde{background-color:#feebd0;color:#695240}.fr-badge--orange-terre-battue{background-color:#fee9e5;color:#755348}.fr-badge--brown-cafe-creme{background-color:#f7ecdb;color:#685c48}.fr-badge--brown-caramel{background-color:#f7ebe5;color:#845d48}.fr-badge--brown-opera{background-color:#f7ece4;color:#745b47}.fr-badge--beige-gris-galet{background-color:#f3ede5;color:#6a6156}.fr-logo{color:#000}.fr-logo:after{background-position:0 calc(100% + 1.875rem)!important}.fr-btn{background-color:#000091;color:#f5f5fe}.fr-btn:hover{background-color:#1212ff}.fr-btn:active{background-color:#2323ff}.fr-btn:disabled,a.fr-btn:not([href]){background-color:#e5e5e5;color:#929292}.fr-btn--secondary{box-shadow:inset 0 0 0 1px #000091;color:#000091}.fr-btn--secondary:disabled,a.fr-btn--secondary:not([href]){box-shadow:inset 0 0 0 1px #e5e5e5;color:#929292}.fr-btn--account,.fr-btn--sort,.fr-btn--tertiary{box-shadow:inset 0 0 0 1px #ddd;color:#000091}.fr-btn--account:disabled,.fr-btn--sort:disabled,.fr-btn--tertiary:disabled,a.fr-btn--account:not([href]),a.fr-btn--sort:not([href]),a.fr-btn--tertiary:not([href]){box-shadow:inset 0 0 0 1px #e5e5e5;color:#929292}.fr-btn--briefcase,.fr-btn--close,.fr-btn--display,.fr-btn--fullscreen,.fr-btn--team,.fr-btn--tertiary-no-outline,.fr-btn--tooltip{color:#000091}.fr-btn--briefcase:disabled,.fr-btn--close:disabled,.fr-btn--display:disabled,.fr-btn--fullscreen:disabled,.fr-btn--team:disabled,.fr-btn--tertiary-no-outline:disabled,.fr-btn--tooltip:disabled,a.fr-btn--briefcase:not([href]),a.fr-btn--close:not([href]),a.fr-btn--display:not([href]),a.fr-btn--fullscreen:not([href]),a.fr-btn--team:not([href]),a.fr-btn--tertiary-no-outline:not([href]),a.fr-btn--tooltip:not([href]){color:#929292}.fr-btn--close,.fr-btn--display,.fr-btn--fullscreen,.fr-btn--secondary,.fr-btn--tertiary,.fr-btn--tertiary-no-outline,.fr-btn--tooltip{background-color:transparent}.fr-connect{background-color:#000091;color:#f5f5fe}.fr-connect:disabled,a.fr-connect:not([href]){background-color:#e5e5e5;color:#929292}.fr-connect-group .fr-connect+p a{color:#000091;font-size:1rem;line-height:1.5rem}.fr-connect-group p{color:#666;font-size:1rem;line-height:1.5rem}.fr-quote{background-image:linear-gradient(0deg,#ddd,#ddd)}.fr-quote:before{color:#6a6af4}.fr-quote--green-tilleul-verveine:before{color:#b7a73f}.fr-quote--green-bourgeon:before{color:#68a532}.fr-quote--green-emeraude:before{color:#00a95f}.fr-quote--green-menthe:before{color:#009081}.fr-quote--green-archipel:before{color:#009099}.fr-quote--blue-ecume:before{color:#465f9d}.fr-quote--blue-cumulus:before{color:#417dc4}.fr-quote--purple-glycine:before{color:#a558a0}.fr-quote--pink-macaron:before{color:#e18b76}.fr-quote--pink-tuile:before{color:#ce614a}.fr-quote--yellow-tournesol:before{color:#c8aa39}.fr-quote--yellow-moutarde:before{color:#c3992a}.fr-quote--orange-terre-battue:before{color:#e4794a}.fr-quote--brown-cafe-creme:before{color:#d1b781}.fr-quote--brown-caramel:before{color:#c08c65}.fr-quote--brown-opera:before{color:#bd987a}.fr-quote--beige-gris-galet:before{color:#aea397}.fr-quote__source{color:#666}.fr-quote cite,.fr-quote figcaption li,.fr-quote__author{font-size:1rem;line-height:1.5rem}.fr-breadcrumb{color:#666;display:none}.fr-breadcrumb__link[aria-current]:not([aria-current=false]){color:#3a3a3a}.fr-input-group--valid label,.fr-range-group--valid label,.fr-select-group--valid label,.fr-upload-group--valid label{color:#18753c}.fr-input-group--error label,.fr-range-group--error label,.fr-select-group--error label,.fr-upload-group--error label{color:#ce0500}.fr-input-group--info label,.fr-range-group--info label,.fr-select-group--info label,.fr-upload-group--info label{color:#0063cb}.fr-input-group--disabled .fr-hint-text,.fr-input-group--disabled label,.fr-range-group--disabled .fr-hint-text,.fr-range-group--disabled label,.fr-select-group--disabled .fr-hint-text,.fr-select-group--disabled label,.fr-upload-group--disabled .fr-hint-text,.fr-upload-group--disabled label{color:#929292}.fr-label{color:#161616}.fr-label--error{color:#ce0500}.fr-label--success{color:#18753c}.fr-label--info{color:#0063cb}.fr-label--disabled,.fr-label--disabled .fr-hint-text{color:#929292}.fr-hint-text,.fr-message{color:#666;font-size:1rem;line-height:1.5rem}.fr-message--error{color:#ce0500}.fr-message--valid{color:#18753c}.fr-message--info{color:#0063cb}.fr-fieldset input:disabled+label,.fr-fieldset input:disabled+label .fr-hint-text,.fr-fieldset input:disabled+label+.fr-hint-text,.fr-fieldset:disabled .fr-fieldset__legend,.fr-fieldset:disabled .fr-hint-text,.fr-fieldset:disabled .fr-label{color:#929292}.fr-fieldset__legend{color:#161616}.fr-fieldset--error,.fr-fieldset--error .fr-fieldset__legend{background-image:linear-gradient(0deg,#ce0500,#ce0500)}.fr-fieldset--error .fr-fieldset__legend,.fr-fieldset--error .fr-label{color:#ce0500}.fr-fieldset--valid,.fr-fieldset--valid .fr-fieldset__legend{background-image:linear-gradient(0deg,#18753c,#18753c)}.fr-fieldset--valid .fr-fieldset__legend,.fr-fieldset--valid .fr-label{color:#18753c}.fr-fieldset--info,.fr-fieldset--info .fr-fieldset__legend{background-image:linear-gradient(0deg,#0063cb,#0063cb)}.fr-fieldset--info .fr-fieldset__legend,.fr-fieldset--info .fr-label{color:#0063cb}.fr-stepper__title{color:#161616}.fr-stepper__details,.fr-stepper__state{color:#666}.fr-stepper__steps{background-image:repeating-linear-gradient(to right,#000091 0,#000091 var(--active-inner),transparent var(--active-inner),transparent var(--active-outer)),repeating-linear-gradient(to right,#eee 0,#eee var(--default-inner),transparent var(--default-inner),transparent var(--default-outer))}.fr-stepper__details,.fr-stepper__state{font-size:1rem;line-height:1.5rem}.fr-tooltip{color:#3a3a3a;display:none}.fr-tooltip.fr-placement{background-image:linear-gradient(90deg,#fff,#fff)}.fr-link{color:#000091}.fr-link__detail{color:#666}.fr-links-group li::marker{color:#000091}.fr-links-group--bordered{box-shadow:inset 0 0 0 1px #ddd}.fr-sidemenu{box-shadow:inset 0 -1px 0 0 #ddd,inset 0 1px 0 0 #ddd;display:none}.fr-sidemenu__title{box-shadow:inset 0 -1px 0 0 #ddd;color:#161616}.fr-sidemenu__item .fr-sidemenu__btn,.fr-sidemenu__item .fr-sidemenu__link{color:#161616}.fr-sidemenu__item:before{box-shadow:0 -1px 0 0 #ddd,inset 0 -1px 0 0 #ddd}.fr-sidemenu__item:first-child:before{box-shadow:inset 0 -1px 0 0 #ddd}.fr-sidemenu__item:last-child:before{box-shadow:0 -1px 0 0 #ddd}.fr-sidemenu__btn,.fr-sidemenu__btn[aria-current]:not([aria-current=false]),.fr-sidemenu__link,.fr-sidemenu__link[aria-current]:not([aria-current=false]){color:#000091}.fr-sidemenu__btn[aria-current]:not([aria-current=false]):before,.fr-sidemenu__link[aria-current]:not([aria-current=false]):before{background-color:#000091}.fr-sidemenu__btn[aria-expanded=true]{background-color:#e3e3fd}.fr-highlight{background-image:linear-gradient(0deg,#6a6af4,#6a6af4)}.fr-highlight--green-tilleul-verveine{background-image:linear-gradient(0deg,#b7a73f,#b7a73f)}.fr-highlight--green-bourgeon{background-image:linear-gradient(0deg,#68a532,#68a532)}.fr-highlight--green-emeraude{background-image:linear-gradient(0deg,#00a95f,#00a95f)}.fr-highlight--green-menthe{background-image:linear-gradient(0deg,#009081,#009081)}.fr-highlight--green-archipel{background-image:linear-gradient(0deg,#009099,#009099)}.fr-highlight--blue-ecume{background-image:linear-gradient(0deg,#465f9d,#465f9d)}.fr-highlight--blue-cumulus{background-image:linear-gradient(0deg,#417dc4,#417dc4)}.fr-highlight--purple-glycine{background-image:linear-gradient(0deg,#a558a0,#a558a0)}.fr-highlight--pink-macaron{background-image:linear-gradient(0deg,#e18b76,#e18b76)}.fr-highlight--pink-tuile{background-image:linear-gradient(0deg,#ce614a,#ce614a)}.fr-highlight--yellow-tournesol{background-image:linear-gradient(0deg,#c8aa39,#c8aa39)}.fr-highlight--yellow-moutarde{background-image:linear-gradient(0deg,#c3992a,#c3992a)}.fr-highlight--orange-terre-battue{background-image:linear-gradient(0deg,#e4794a,#e4794a)}.fr-highlight--brown-cafe-creme{background-image:linear-gradient(0deg,#d1b781,#d1b781)}.fr-highlight--brown-caramel{background-image:linear-gradient(0deg,#c08c65,#c08c65)}.fr-highlight--brown-opera{background-image:linear-gradient(0deg,#bd987a,#bd987a)}.fr-highlight--beige-gris-galet{background-image:linear-gradient(0deg,#aea397,#aea397)}.fr-tabs{box-shadow:inset 0 -1px 0 0 #ddd}.fr-tabs:before{box-shadow:inset 0 1px 0 0 #ddd,inset 1px 0 0 0 #ddd,inset -1px 0 0 0 #ddd}.fr-tabs__tab{background-image:linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd);box-shadow:0 2px 0 0 #fff}.fr-tabs__tab:not([aria-selected=true]){background-color:#e3e3fd;color:#161616}.fr-tabs__tab[aria-selected=true]:not(:disabled){background-color:#fff;background-image:linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd);color:#000091}.fr-tabs__tab:disabled{background-color:#e5e5e5;color:#929292}.fr-pagination{color:#161616}.fr-pagination__link[aria-current]:not([aria-current=false]){background-color:#000091;color:#f5f5fe}.fr-pagination__link[aria-current]:not([aria-current=false]):hover{background-color:#1212ff}.fr-pagination__link[aria-current]:not([aria-current=false]):active{background-color:#2323ff}.fr-pagination__link:not([aria-current]):disabled,.fr-pagination__link[aria-current=false]:disabled,a.fr-pagination__link:not([aria-current]):not([href]),a.fr-pagination__link[aria-current=false]:not([href]){color:#929292}.fr-summary{background-color:#eee;display:none}.fr-summary li>a,.fr-summary__title{color:#161616}.fr-table__wrapper:after{background-image:linear-gradient(0deg,#929292,#929292),linear-gradient(0deg,#929292,#929292),linear-gradient(0deg,#929292,#929292),linear-gradient(0deg,#929292,#929292)}.fr-table__content table caption{color:#161616}.fr-table__content table thead th{background-color:#f6f6f6;background-image:linear-gradient(0deg,#3a3a3a,#3a3a3a),linear-gradient(0deg,#929292,#929292)}.fr-table__content table thead th[role=columnheader]{background-image:linear-gradient(0deg,#3a3a3a,#3a3a3a),linear-gradient(0deg,#3a3a3a,#3a3a3a)}.fr-table__content table thead th:last-child{background-color:#f6f6f6;background-image:linear-gradient(0deg,#3a3a3a,#3a3a3a)}.fr-table__content table tbody tr:after{background-image:linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091)}.fr-table__content table tbody td{background-color:#fff;background-image:linear-gradient(0deg,#929292,#929292),linear-gradient(0deg,#929292,#929292)}.fr-table__content table tbody th{background-color:#f6f6f6;background-image:linear-gradient(0deg,#929292,#929292),linear-gradient(0deg,#3a3a3a,#3a3a3a)}.fr-table__detail{color:#666}.fr-table td,.fr-table th{font-size:1rem;line-height:1.5rem}.fr-tag{background-color:#eee;color:#161616}.fr-tag[aria-pressed=false]{background-color:#e3e3fd;color:#000091}.fr-tag[aria-pressed=false]:hover{background-color:#c1c1fb}.fr-tag[aria-pressed=false]:active{background-color:#adadf9}.fr-tag.fr-tag--dismiss{background-color:#000091;color:#f5f5fe}.fr-tag.fr-tag--dismiss:hover{background-color:#1212ff}.fr-tag.fr-tag--dismiss:active{background-color:#2323ff}a.fr-tag,button.fr-tag,input[type=button].fr-tag,input[type=image].fr-tag,input[type=reset].fr-tag,input[type=submit].fr-tag{background-color:#e3e3fd;color:#000091}a.fr-tag:hover,button.fr-tag:hover,input[type=button].fr-tag:hover,input[type=image].fr-tag:hover,input[type=reset].fr-tag:hover,input[type=submit].fr-tag:hover{background-color:#c1c1fb}a.fr-tag:active,button.fr-tag:active,input[type=button].fr-tag:active,input[type=image].fr-tag:active,input[type=reset].fr-tag:active,input[type=submit].fr-tag:active{background-color:#adadf9}a.fr-tag--green-tilleul-verveine,button.fr-tag--green-tilleul-verveine,input[type=button].fr-tag--green-tilleul-verveine,input[type=image].fr-tag--green-tilleul-verveine,input[type=reset].fr-tag--green-tilleul-verveine,input[type=submit].fr-tag--green-tilleul-verveine{background-color:#fbe769;color:#66673d}a.fr-tag--green-tilleul-verveine:hover,button.fr-tag--green-tilleul-verveine:hover,input[type=button].fr-tag--green-tilleul-verveine:hover,input[type=image].fr-tag--green-tilleul-verveine:hover,input[type=reset].fr-tag--green-tilleul-verveine:hover,input[type=submit].fr-tag--green-tilleul-verveine:hover{background-color:#d7c655}a.fr-tag--green-tilleul-verveine:active,button.fr-tag--green-tilleul-verveine:active,input[type=button].fr-tag--green-tilleul-verveine:active,input[type=image].fr-tag--green-tilleul-verveine:active,input[type=reset].fr-tag--green-tilleul-verveine:active,input[type=submit].fr-tag--green-tilleul-verveine:active{background-color:#c2b24c}a.fr-tag--green-bourgeon,button.fr-tag--green-bourgeon,input[type=button].fr-tag--green-bourgeon,input[type=image].fr-tag--green-bourgeon,input[type=reset].fr-tag--green-bourgeon,input[type=submit].fr-tag--green-bourgeon{background-color:#a9fb68;color:#447049}a.fr-tag--green-bourgeon:hover,button.fr-tag--green-bourgeon:hover,input[type=button].fr-tag--green-bourgeon:hover,input[type=image].fr-tag--green-bourgeon:hover,input[type=reset].fr-tag--green-bourgeon:hover,input[type=submit].fr-tag--green-bourgeon:hover{background-color:#8ed654}a.fr-tag--green-bourgeon:active,button.fr-tag--green-bourgeon:active,input[type=button].fr-tag--green-bourgeon:active,input[type=image].fr-tag--green-bourgeon:active,input[type=reset].fr-tag--green-bourgeon:active,input[type=submit].fr-tag--green-bourgeon:active{background-color:#7fc04b}a.fr-tag--green-emeraude,button.fr-tag--green-emeraude,input[type=button].fr-tag--green-emeraude,input[type=image].fr-tag--green-emeraude,input[type=reset].fr-tag--green-emeraude,input[type=submit].fr-tag--green-emeraude{background-color:#9ef9be;color:#297254}a.fr-tag--green-emeraude:hover,button.fr-tag--green-emeraude:hover,input[type=button].fr-tag--green-emeraude:hover,input[type=image].fr-tag--green-emeraude:hover,input[type=reset].fr-tag--green-emeraude:hover,input[type=submit].fr-tag--green-emeraude:hover{background-color:#69df97}a.fr-tag--green-emeraude:active,button.fr-tag--green-emeraude:active,input[type=button].fr-tag--green-emeraude:active,input[type=image].fr-tag--green-emeraude:active,input[type=reset].fr-tag--green-emeraude:active,input[type=submit].fr-tag--green-emeraude:active{background-color:#5ec988}a.fr-tag--green-menthe,button.fr-tag--green-menthe,input[type=button].fr-tag--green-menthe,input[type=image].fr-tag--green-menthe,input[type=reset].fr-tag--green-menthe,input[type=submit].fr-tag--green-menthe{background-color:#8bf8e7;color:#37635f}a.fr-tag--green-menthe:hover,button.fr-tag--green-menthe:hover,input[type=button].fr-tag--green-menthe:hover,input[type=image].fr-tag--green-menthe:hover,input[type=reset].fr-tag--green-menthe:hover,input[type=submit].fr-tag--green-menthe:hover{background-color:#6ed5c5}a.fr-tag--green-menthe:active,button.fr-tag--green-menthe:active,input[type=button].fr-tag--green-menthe:active,input[type=image].fr-tag--green-menthe:active,input[type=reset].fr-tag--green-menthe:active,input[type=submit].fr-tag--green-menthe:active{background-color:#62bfb1}a.fr-tag--green-archipel,button.fr-tag--green-archipel,input[type=button].fr-tag--green-archipel,input[type=image].fr-tag--green-archipel,input[type=reset].fr-tag--green-archipel,input[type=submit].fr-tag--green-archipel{background-color:#a6f2fa;color:#006a6f}a.fr-tag--green-archipel:hover,button.fr-tag--green-archipel:hover,input[type=button].fr-tag--green-archipel:hover,input[type=image].fr-tag--green-archipel:hover,input[type=reset].fr-tag--green-archipel:hover,input[type=submit].fr-tag--green-archipel:hover{background-color:#62dbe5}a.fr-tag--green-archipel:active,button.fr-tag--green-archipel:active,input[type=button].fr-tag--green-archipel:active,input[type=image].fr-tag--green-archipel:active,input[type=reset].fr-tag--green-archipel:active,input[type=submit].fr-tag--green-archipel:active{background-color:#58c5cf}a.fr-tag--blue-ecume,button.fr-tag--blue-ecume,input[type=button].fr-tag--blue-ecume,input[type=image].fr-tag--blue-ecume,input[type=reset].fr-tag--blue-ecume,input[type=submit].fr-tag--blue-ecume{background-color:#dee5fd;color:#2f4077}a.fr-tag--blue-ecume:hover,button.fr-tag--blue-ecume:hover,input[type=button].fr-tag--blue-ecume:hover,input[type=image].fr-tag--blue-ecume:hover,input[type=reset].fr-tag--blue-ecume:hover,input[type=submit].fr-tag--blue-ecume:hover{background-color:#b4c5fb}a.fr-tag--blue-ecume:active,button.fr-tag--blue-ecume:active,input[type=button].fr-tag--blue-ecume:active,input[type=image].fr-tag--blue-ecume:active,input[type=reset].fr-tag--blue-ecume:active,input[type=submit].fr-tag--blue-ecume:active{background-color:#99b3f9}a.fr-tag--blue-cumulus,button.fr-tag--blue-cumulus,input[type=button].fr-tag--blue-cumulus,input[type=image].fr-tag--blue-cumulus,input[type=reset].fr-tag--blue-cumulus,input[type=submit].fr-tag--blue-cumulus{background-color:#dae6fd;color:#3558a2}a.fr-tag--blue-cumulus:hover,button.fr-tag--blue-cumulus:hover,input[type=button].fr-tag--blue-cumulus:hover,input[type=image].fr-tag--blue-cumulus:hover,input[type=reset].fr-tag--blue-cumulus:hover,input[type=submit].fr-tag--blue-cumulus:hover{background-color:#a9c8fb}a.fr-tag--blue-cumulus:active,button.fr-tag--blue-cumulus:active,input[type=button].fr-tag--blue-cumulus:active,input[type=image].fr-tag--blue-cumulus:active,input[type=reset].fr-tag--blue-cumulus:active,input[type=submit].fr-tag--blue-cumulus:active{background-color:#8ab8f9}a.fr-tag--purple-glycine,button.fr-tag--purple-glycine,input[type=button].fr-tag--purple-glycine,input[type=image].fr-tag--purple-glycine,input[type=reset].fr-tag--purple-glycine,input[type=submit].fr-tag--purple-glycine{background-color:#fddbfa;color:#6e445a}a.fr-tag--purple-glycine:hover,button.fr-tag--purple-glycine:hover,input[type=button].fr-tag--purple-glycine:hover,input[type=image].fr-tag--purple-glycine:hover,input[type=reset].fr-tag--purple-glycine:hover,input[type=submit].fr-tag--purple-glycine:hover{background-color:#fbaff5}a.fr-tag--purple-glycine:active,button.fr-tag--purple-glycine:active,input[type=button].fr-tag--purple-glycine:active,input[type=image].fr-tag--purple-glycine:active,input[type=reset].fr-tag--purple-glycine:active,input[type=submit].fr-tag--purple-glycine:active{background-color:#fa96f2}a.fr-tag--pink-macaron,button.fr-tag--pink-macaron,input[type=button].fr-tag--pink-macaron,input[type=image].fr-tag--pink-macaron,input[type=reset].fr-tag--pink-macaron,input[type=submit].fr-tag--pink-macaron{background-color:#fddfda;color:#8d533e}a.fr-tag--pink-macaron:hover,button.fr-tag--pink-macaron:hover,input[type=button].fr-tag--pink-macaron:hover,input[type=image].fr-tag--pink-macaron:hover,input[type=reset].fr-tag--pink-macaron:hover,input[type=submit].fr-tag--pink-macaron:hover{background-color:#fbb8ab}a.fr-tag--pink-macaron:active,button.fr-tag--pink-macaron:active,input[type=button].fr-tag--pink-macaron:active,input[type=image].fr-tag--pink-macaron:active,input[type=reset].fr-tag--pink-macaron:active,input[type=submit].fr-tag--pink-macaron:active{background-color:#faa18d}a.fr-tag--pink-tuile,button.fr-tag--pink-tuile,input[type=button].fr-tag--pink-tuile,input[type=image].fr-tag--pink-tuile,input[type=reset].fr-tag--pink-tuile,input[type=submit].fr-tag--pink-tuile{background-color:#fddfdb;color:#a94645}a.fr-tag--pink-tuile:hover,button.fr-tag--pink-tuile:hover,input[type=button].fr-tag--pink-tuile:hover,input[type=image].fr-tag--pink-tuile:hover,input[type=reset].fr-tag--pink-tuile:hover,input[type=submit].fr-tag--pink-tuile:hover{background-color:#fbb8ad}a.fr-tag--pink-tuile:active,button.fr-tag--pink-tuile:active,input[type=button].fr-tag--pink-tuile:active,input[type=image].fr-tag--pink-tuile:active,input[type=reset].fr-tag--pink-tuile:active,input[type=submit].fr-tag--pink-tuile:active{background-color:#faa191}a.fr-tag--yellow-tournesol,button.fr-tag--yellow-tournesol,input[type=button].fr-tag--yellow-tournesol,input[type=image].fr-tag--yellow-tournesol,input[type=reset].fr-tag--yellow-tournesol,input[type=submit].fr-tag--yellow-tournesol{background-color:#fde39c;color:#716043}a.fr-tag--yellow-tournesol:hover,button.fr-tag--yellow-tournesol:hover,input[type=button].fr-tag--yellow-tournesol:hover,input[type=image].fr-tag--yellow-tournesol:hover,input[type=reset].fr-tag--yellow-tournesol:hover,input[type=submit].fr-tag--yellow-tournesol:hover{background-color:#e9c53b}a.fr-tag--yellow-tournesol:active,button.fr-tag--yellow-tournesol:active,input[type=button].fr-tag--yellow-tournesol:active,input[type=image].fr-tag--yellow-tournesol:active,input[type=reset].fr-tag--yellow-tournesol:active,input[type=submit].fr-tag--yellow-tournesol:active{background-color:#d3b235}a.fr-tag--yellow-moutarde,button.fr-tag--yellow-moutarde,input[type=button].fr-tag--yellow-moutarde,input[type=image].fr-tag--yellow-moutarde,input[type=reset].fr-tag--yellow-moutarde,input[type=submit].fr-tag--yellow-moutarde{background-color:#fde2b5;color:#695240}a.fr-tag--yellow-moutarde:hover,button.fr-tag--yellow-moutarde:hover,input[type=button].fr-tag--yellow-moutarde:hover,input[type=image].fr-tag--yellow-moutarde:hover,input[type=reset].fr-tag--yellow-moutarde:hover,input[type=submit].fr-tag--yellow-moutarde:hover{background-color:#f6c43c}a.fr-tag--yellow-moutarde:active,button.fr-tag--yellow-moutarde:active,input[type=button].fr-tag--yellow-moutarde:active,input[type=image].fr-tag--yellow-moutarde:active,input[type=reset].fr-tag--yellow-moutarde:active,input[type=submit].fr-tag--yellow-moutarde:active{background-color:#dfb135}a.fr-tag--orange-terre-battue,button.fr-tag--orange-terre-battue,input[type=button].fr-tag--orange-terre-battue,input[type=image].fr-tag--orange-terre-battue,input[type=reset].fr-tag--orange-terre-battue,input[type=submit].fr-tag--orange-terre-battue{background-color:#fddfd8;color:#755348}a.fr-tag--orange-terre-battue:hover,button.fr-tag--orange-terre-battue:hover,input[type=button].fr-tag--orange-terre-battue:hover,input[type=image].fr-tag--orange-terre-battue:hover,input[type=reset].fr-tag--orange-terre-battue:hover,input[type=submit].fr-tag--orange-terre-battue:hover{background-color:#fbb8a5}a.fr-tag--orange-terre-battue:active,button.fr-tag--orange-terre-battue:active,input[type=button].fr-tag--orange-terre-battue:active,input[type=image].fr-tag--orange-terre-battue:active,input[type=reset].fr-tag--orange-terre-battue:active,input[type=submit].fr-tag--orange-terre-battue:active{background-color:#faa184}a.fr-tag--brown-cafe-creme,button.fr-tag--brown-cafe-creme,input[type=button].fr-tag--brown-cafe-creme,input[type=image].fr-tag--brown-cafe-creme,input[type=reset].fr-tag--brown-cafe-creme,input[type=submit].fr-tag--brown-cafe-creme{background-color:#f4e3c7;color:#685c48}a.fr-tag--brown-cafe-creme:hover,button.fr-tag--brown-cafe-creme:hover,input[type=button].fr-tag--brown-cafe-creme:hover,input[type=image].fr-tag--brown-cafe-creme:hover,input[type=reset].fr-tag--brown-cafe-creme:hover,input[type=submit].fr-tag--brown-cafe-creme:hover{background-color:#e1c386}a.fr-tag--brown-cafe-creme:active,button.fr-tag--brown-cafe-creme:active,input[type=button].fr-tag--brown-cafe-creme:active,input[type=image].fr-tag--brown-cafe-creme:active,input[type=reset].fr-tag--brown-cafe-creme:active,input[type=submit].fr-tag--brown-cafe-creme:active{background-color:#ccb078}a.fr-tag--brown-caramel,button.fr-tag--brown-caramel,input[type=button].fr-tag--brown-caramel,input[type=image].fr-tag--brown-caramel,input[type=reset].fr-tag--brown-caramel,input[type=submit].fr-tag--brown-caramel{background-color:#f3e2d9;color:#845d48}a.fr-tag--brown-caramel:hover,button.fr-tag--brown-caramel:hover,input[type=button].fr-tag--brown-caramel:hover,input[type=image].fr-tag--brown-caramel:hover,input[type=reset].fr-tag--brown-caramel:hover,input[type=submit].fr-tag--brown-caramel:hover{background-color:#e7bea6}a.fr-tag--brown-caramel:active,button.fr-tag--brown-caramel:active,input[type=button].fr-tag--brown-caramel:active,input[type=image].fr-tag--brown-caramel:active,input[type=reset].fr-tag--brown-caramel:active,input[type=submit].fr-tag--brown-caramel:active{background-color:#e1a982}a.fr-tag--brown-opera,button.fr-tag--brown-opera,input[type=button].fr-tag--brown-opera,input[type=image].fr-tag--brown-opera,input[type=reset].fr-tag--brown-opera,input[type=submit].fr-tag--brown-opera{background-color:#f3e2d7;color:#745b47}a.fr-tag--brown-opera:hover,button.fr-tag--brown-opera:hover,input[type=button].fr-tag--brown-opera:hover,input[type=image].fr-tag--brown-opera:hover,input[type=reset].fr-tag--brown-opera:hover,input[type=submit].fr-tag--brown-opera:hover{background-color:#e7bfa0}a.fr-tag--brown-opera:active,button.fr-tag--brown-opera:active,input[type=button].fr-tag--brown-opera:active,input[type=image].fr-tag--brown-opera:active,input[type=reset].fr-tag--brown-opera:active,input[type=submit].fr-tag--brown-opera:active{background-color:#deaa7e}a.fr-tag--beige-gris-galet,button.fr-tag--beige-gris-galet,input[type=button].fr-tag--beige-gris-galet,input[type=image].fr-tag--beige-gris-galet,input[type=reset].fr-tag--beige-gris-galet,input[type=submit].fr-tag--beige-gris-galet{background-color:#eee4d9;color:#6a6156}a.fr-tag--beige-gris-galet:hover,button.fr-tag--beige-gris-galet:hover,input[type=button].fr-tag--beige-gris-galet:hover,input[type=image].fr-tag--beige-gris-galet:hover,input[type=reset].fr-tag--beige-gris-galet:hover,input[type=submit].fr-tag--beige-gris-galet:hover{background-color:#dbc3a4}a.fr-tag--beige-gris-galet:active,button.fr-tag--beige-gris-galet:active,input[type=button].fr-tag--beige-gris-galet:active,input[type=image].fr-tag--beige-gris-galet:active,input[type=reset].fr-tag--beige-gris-galet:active,input[type=submit].fr-tag--beige-gris-galet:active{background-color:#c6b094}button.fr-tag[aria-pressed=true]:not(:disabled),input[type=button].fr-tag[aria-pressed=true]:not(:disabled){background-image:radial-gradient(circle at 100% .25rem,transparent .578125rem,#000091 .625rem);color:#f5f5fe}button.fr-tag[aria-pressed=true]:not(:disabled):hover,input[type=button].fr-tag[aria-pressed=true]:not(:disabled):hover{background-image:radial-gradient(circle at 100% .25rem,transparent .578125rem,#1212ff .625rem)}button.fr-tag[aria-pressed=true]:not(:disabled):active,input[type=button].fr-tag[aria-pressed=true]:not(:disabled):active{background-image:radial-gradient(circle at 100% .25rem,transparent .578125rem,#2323ff .625rem)}button.fr-tag[aria-pressed=true]:after,input[type=button].fr-tag[aria-pressed=true]:after{color:#000091}button.fr-tag[aria-pressed=true]:disabled,input[type=button].fr-tag[aria-pressed=true]:disabled{background-image:radial-gradient(circle at 100% .25rem,transparent .578125rem,#e5e5e5 .625rem)}button.fr-tag[aria-pressed=true]:disabled:after,input[type=button].fr-tag[aria-pressed=true]:disabled:after{color:#929292}button.fr-tag[aria-pressed=true].fr-tag--sm,input[type=button].fr-tag[aria-pressed=true].fr-tag--sm{background-image:radial-gradient(circle at 100% .1875rem,transparent .4475rem,#000091 .5rem)}button.fr-tag[aria-pressed=true].fr-tag--sm:hover,input[type=button].fr-tag[aria-pressed=true].fr-tag--sm:hover{background-image:radial-gradient(circle at 100% .1875rem,transparent .4475rem,#1212ff .5rem)}button.fr-tag[aria-pressed=true].fr-tag--sm:active,input[type=button].fr-tag[aria-pressed=true].fr-tag--sm:active{background-image:radial-gradient(circle at 100% .1875rem,transparent .4475rem,#2323ff .5rem)}button.fr-tag[aria-pressed=true].fr-tag--sm:disabled,input[type=button].fr-tag[aria-pressed=true].fr-tag--sm:disabled{background-image:radial-gradient(circle at 100% .1875rem,transparent .4475rem,#e5e5e5 .5rem)}button.fr-tag:disabled,input[type=button].fr-tag:disabled{background-color:#e5e5e5;color:#929292}a:not([href]).fr-tag,button.fr-tag:disabled:hover,input[type=button].fr-tag:disabled:hover{background-color:#e5e5e5}a:not([href]).fr-tag{color:#929292}.fr-tags-group.fr-tags-group--sm button.fr-tag[aria-pressed=true],.fr-tags-group.fr-tags-group--sm input[type=button].fr-tag[aria-pressed=true]{background-image:radial-gradient(circle at 100% .1875rem,transparent .4475rem,#000091 .5rem)}.fr-tags-group.fr-tags-group--sm button.fr-tag[aria-pressed=true]:hover,.fr-tags-group.fr-tags-group--sm input[type=button].fr-tag[aria-pressed=true]:hover{background-image:radial-gradient(circle at 100% .1875rem,transparent .4475rem,#1212ff .5rem)}.fr-tags-group.fr-tags-group--sm button.fr-tag[aria-pressed=true]:active,.fr-tags-group.fr-tags-group--sm input[type=button].fr-tag[aria-pressed=true]:active{background-image:radial-gradient(circle at 100% .1875rem,transparent .4475rem,#2323ff .5rem)}.fr-tags-group.fr-tags-group--sm button.fr-tag[aria-pressed=true]:disabled,.fr-tags-group.fr-tags-group--sm input[type=button].fr-tag[aria-pressed=true]:disabled{background-image:radial-gradient(circle at 100% .1875rem,transparent .4475rem,#e5e5e5 .5rem)}.fr-alert{background-image:linear-gradient(0deg,#3a3a3a,#3a3a3a),linear-gradient(0deg,#3a3a3a,#3a3a3a),linear-gradient(0deg,#3a3a3a,#3a3a3a),linear-gradient(0deg,#3a3a3a,#3a3a3a),linear-gradient(0deg,#3a3a3a,#3a3a3a)}.fr-alert:before{color:#fff}.fr-alert--info{background-image:linear-gradient(0deg,#0063cb,#0063cb),linear-gradient(0deg,#0063cb,#0063cb),linear-gradient(0deg,#0063cb,#0063cb),linear-gradient(0deg,#0063cb,#0063cb),linear-gradient(0deg,#0063cb,#0063cb)}.fr-alert--error{background-image:linear-gradient(0deg,#ce0500,#ce0500),linear-gradient(0deg,#ce0500,#ce0500),linear-gradient(0deg,#ce0500,#ce0500),linear-gradient(0deg,#ce0500,#ce0500),linear-gradient(0deg,#ce0500,#ce0500)}.fr-alert--success{background-image:linear-gradient(0deg,#18753c,#18753c),linear-gradient(0deg,#18753c,#18753c),linear-gradient(0deg,#18753c,#18753c),linear-gradient(0deg,#18753c,#18753c),linear-gradient(0deg,#18753c,#18753c)}.fr-alert--warning{background-image:linear-gradient(0deg,#b34000,#b34000),linear-gradient(0deg,#b34000,#b34000),linear-gradient(0deg,#b34000,#b34000),linear-gradient(0deg,#b34000,#b34000),linear-gradient(0deg,#b34000,#b34000)}.fr-notice{background-color:#eee;color:#161616}.fr-notice--info{background-color:#e8edff;color:#0063cb}.fr-notice--warning,.fr-notice--weather-orange{background-color:#ffe9e6;color:#b34000}.fr-notice--alert{background-color:#ffe9e9;color:#ce0500}.fr-notice--weather-red{color:#fff}.fr-notice--weather-red,.fr-notice--weather-red .fr-btn--close{background-color:#ce0500}.fr-notice--weather-purple{background-color:#6e445a;color:#fff}.fr-notice--weather-purple .fr-btn--close{background-color:#6e445a}.fr-notice--witness{background-image:linear-gradient(0deg,#ce0500,#ce0500);color:#fff}.fr-notice--witness,.fr-notice--witness .fr-btn--close{background-color:#3a3a3a}.fr-notice--attack,.fr-notice--kidnapping{background-color:#ce0500;background-image:linear-gradient(0deg,#3a3a3a,#3a3a3a);color:#fff}.fr-notice--attack .fr-btn--close,.fr-notice--kidnapping .fr-btn--close{background-color:#ce0500}.fr-notice--cyberattack{background-image:linear-gradient(0deg,#0063cb,#0063cb);color:#fff}.fr-notice--cyberattack,.fr-notice--cyberattack .fr-btn--close{background-color:#3a3a3a}.fr-radio-group input[type=radio]+label{background-image:radial-gradient(transparent 10px,#000091 11px,transparent 12px)}.fr-radio-group input[type=radio]:disabled+label{background-image:radial-gradient(transparent 10px,#e5e5e5 11px,transparent 12px)}.fr-radio-group input[type=radio]:checked+label{background-image:radial-gradient(transparent 10px,#000091 11px,transparent 12px),radial-gradient(#000091 5px,transparent 6px)}.fr-radio-group input[type=radio]:checked:disabled+label{background-image:radial-gradient(transparent 10px,#e5e5e5 11px,transparent 12px),radial-gradient(#e5e5e5 5px,transparent 6px)}.fr-fieldset--error .fr-radio-group input[type=radio]+label{background-image:radial-gradient(transparent 10px,#ce0500 11px,transparent 12px)}.fr-fieldset--error .fr-radio-group input[type=radio]:checked+label{background-image:radial-gradient(transparent 10px,#ce0500 11px,transparent 12px),radial-gradient(#000091 5px,transparent 6px)}.fr-fieldset--valid .fr-radio-group input[type=radio]+label{background-image:radial-gradient(transparent 10px,#18753c 11px,transparent 12px)}.fr-fieldset--valid .fr-radio-group input[type=radio]:checked+label{background-image:radial-gradient(transparent 10px,#18753c 11px,transparent 12px),radial-gradient(#000091 5px,transparent 6px)}.fr-fieldset--info .fr-radio-group input[type=radio]+label{background-image:radial-gradient(transparent 10px,#0063cb 11px,transparent 12px)}.fr-fieldset--info .fr-radio-group input[type=radio]:checked+label{background-image:radial-gradient(transparent 10px,#0063cb 11px,transparent 12px),radial-gradient(#000091 5px,transparent 6px)}.fr-fieldset .fr-radio-group input[type=radio]:disabled+label{background-image:radial-gradient(transparent 10px,#e5e5e5 11px,transparent 12px)}.fr-fieldset .fr-radio-group input[type=radio]:disabled:checked+label{background-image:radial-gradient(transparent 10px,#e5e5e5 11px,transparent 12px),radial-gradient(#e5e5e5 5px,transparent 6px)}.fr-radio-group--sm input[type=radio]+label{background-image:radial-gradient(transparent 6px,#000091 7px,transparent 8px)}.fr-radio-group--sm input[type=radio]:disabled+label{background-image:radial-gradient(transparent 6px,#e5e5e5 7px,transparent 8px)}.fr-radio-group--sm input[type=radio]:checked+label{background-image:radial-gradient(transparent 6px,#000091 7px,transparent 8px),radial-gradient(#000091 3px,transparent 4px)}.fr-radio-group--sm input[type=radio]:checked:disabled+label{background-image:radial-gradient(transparent 6px,#e5e5e5 7px,transparent 8px),radial-gradient(#e5e5e5 3px,transparent 4px)}.fr-fieldset--error .fr-radio-group--sm input[type=radio]+label{background-image:radial-gradient(transparent 6px,#ce0500 7px,transparent 8px)}.fr-fieldset--error .fr-radio-group--sm input[type=radio]:checked+label{background-image:radial-gradient(transparent 6px,#ce0500 7px,transparent 8px),radial-gradient(#000091 3px,transparent 4px)}.fr-fieldset--valid .fr-radio-group--sm input[type=radio]+label{background-image:radial-gradient(transparent 6px,#18753c 7px,transparent 8px)}.fr-fieldset--valid .fr-radio-group--sm input[type=radio]:checked+label{background-image:radial-gradient(transparent 6px,#18753c 7px,transparent 8px),radial-gradient(#000091 3px,transparent 4px)}.fr-fieldset--info .fr-radio-group--sm input[type=radio]+label{background-image:radial-gradient(transparent 6px,#0063cb 7px,transparent 8px)}.fr-fieldset--info .fr-radio-group--sm input[type=radio]:checked+label{background-image:radial-gradient(transparent 6px,#0063cb 7px,transparent 8px),radial-gradient(#000091 3px,transparent 4px)}.fr-fieldset .fr-radio-group--sm input[type=radio]:disabled+label{background-image:radial-gradient(transparent 6px,#e5e5e5 7px,transparent 8px)}.fr-fieldset .fr-radio-group--sm input[type=radio]:disabled:checked+label{background-image:radial-gradient(transparent 6px,#e5e5e5 7px,transparent 8px),radial-gradient(#e5e5e5 3px,transparent 4px)}.fr-radio-rich__pictogram{background-color:#fff;background-image:linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd)}.fr-radio-rich input[type=radio]+label{background-color:#fff;background-image:linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),radial-gradient(transparent 6px,#000091 7px,transparent 8px)}.fr-radio-rich input[type=radio]:disabled+label{background-image:linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),radial-gradient(transparent 6px,#e5e5e5 7px,transparent 8px)}.fr-radio-rich input[type=radio]:disabled~.fr-radio-rich__pictogram svg *{fill:#929292}.fr-radio-rich input[type=radio]:checked+label{background-image:linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091),radial-gradient(transparent 6px,#000091 7px,transparent 8px),radial-gradient(#000091 3px,transparent 4px)}.fr-radio-rich input[type=radio]:checked~.fr-radio-rich__pictogram{background-image:linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#ddd,#ddd)}.fr-radio-rich input[type=radio]:checked:disabled+label{background-image:linear-gradient(0deg,#929292,#929292),linear-gradient(0deg,#929292,#929292),linear-gradient(0deg,#929292,#929292),linear-gradient(0deg,#929292,#929292),radial-gradient(transparent 6px,#e5e5e5 7px,transparent 8px),radial-gradient(#e5e5e5 3px,transparent 4px)}.fr-radio-rich input[type=radio]:checked:disabled~.fr-radio-rich__pictogram{background-image:linear-gradient(0deg,#e5e5e5,#e5e5e5),linear-gradient(0deg,#e5e5e5,#e5e5e5),linear-gradient(0deg,#e5e5e5,#e5e5e5),linear-gradient(0deg,#ddd,#ddd)}.fr-fieldset--error .fr-radio-rich input[type=radio]+label{background-image:linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),radial-gradient(transparent 6px,#ce0500 7px,transparent 8px)}.fr-fieldset--error .fr-radio-rich input[type=radio]:checked+label{background-image:linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091),radial-gradient(transparent 6px,#ce0500 7px,transparent 8px),radial-gradient(#000091 3px,transparent 4px)}.fr-fieldset--valid .fr-radio-rich input[type=radio]+label{background-image:linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),radial-gradient(transparent 6px,#18753c 7px,transparent 8px)}.fr-fieldset--valid .fr-radio-rich input[type=radio]:checked+label{background-image:linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091),radial-gradient(transparent 6px,#18753c 7px,transparent 8px),radial-gradient(#000091 3px,transparent 4px)}.fr-fieldset--info .fr-radio-rich input[type=radio]+label{background-image:linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),radial-gradient(transparent 6px,#0063cb 7px,transparent 8px)}.fr-fieldset--info .fr-radio-rich input[type=radio]:checked+label{background-image:linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091),linear-gradient(0deg,#000091,#000091),radial-gradient(transparent 6px,#0063cb 7px,transparent 8px),radial-gradient(#000091 3px,transparent 4px)}.fr-fieldset .fr-radio-rich input[type=radio]:disabled+label{background-image:linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),radial-gradient(transparent 6px,#e5e5e5 7px,transparent 8px)}.fr-fieldset .fr-radio-rich input[type=radio]:disabled:checked+label{background-image:linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),radial-gradient(transparent 6px,#e5e5e5 7px,transparent 8px),radial-gradient(#e5e5e5 3px,transparent 4px)}.fr-card{background-color:#fff}.fr-card:not(.fr-card--no-border):not(.fr-card--shadow){background-image:linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd)}.fr-card--grey{background-color:#eee}.fr-card--shadow{background-color:#fff}.fr-card--shadow.fr-card--grey{background-color:#eee}.fr-card--download:not(.fr-card--no-background) .fr-card__header{background-color:#f6f6f6}.fr-card__detail{color:#666;line-height:1rem!important}.fr-card__title{color:#161616}.fr-card__title a[href],.fr-card__title button{color:#000091}.fr-card__title button:disabled{color:#929292}.fr-card__title:disabled,a.fr-card__title:not([href]){background-color:#e5e5e5;color:#929292}.fr-card__desc,.fr-card__detail{font-size:1rem;line-height:1.5rem}.fr-checkbox-group input[type=checkbox]+label:before{background-image:radial-gradient(at 5px 4px,transparent 4px,var(--border-action-high-blue-france) 4px,var(--border-action-high-blue-france) 5px,transparent 6px),linear-gradient(var(--border-action-high-blue-france),var(--border-action-high-blue-france)),radial-gradient(at calc(100% - 5px) 4px,transparent 4px,var(--border-action-high-blue-france) 4px,var(--border-action-high-blue-france) 5px,transparent 6px),linear-gradient(var(--border-action-high-blue-france),var(--border-action-high-blue-france)),radial-gradient(at calc(100% - 5px) calc(100% - 4px),transparent 4px,var(--border-action-high-blue-france) 4px,var(--border-action-high-blue-france) 5px,transparent 6px),linear-gradient(var(--border-action-high-blue-france),var(--border-action-high-blue-france)),radial-gradient(at 5px calc(100% - 4px),transparent 4px,var(--border-action-high-blue-france) 4px,var(--border-action-high-blue-france) 5px,transparent 6px),linear-gradient(var(--border-action-high-blue-france),var(--border-action-high-blue-france)),var(--data-uri-svg)}.fr-checkbox-group input[type=checkbox]:checked+label:before{--data-uri-svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath fill=%27%23f5f5fe%27 d=%27m10 15.17 9.2-9.2 1.4 1.42L10 18l-6.36-6.36 1.4-1.42z%27/%3E%3C/svg%3E");background-color:var(--background-active-blue-france);background-image:radial-gradient(at 5px 4px,transparent 4px,var(--border-active-blue-france) 4px,var(--border-active-blue-france) 5px,transparent 6px),linear-gradient(var(--border-active-blue-france),var(--border-active-blue-france)),radial-gradient(at calc(100% - 5px) 4px,transparent 4px,var(--border-active-blue-france) 4px,var(--border-active-blue-france) 5px,transparent 6px),linear-gradient(var(--border-active-blue-france),var(--border-active-blue-france)),radial-gradient(at calc(100% - 5px) calc(100% - 4px),transparent 4px,var(--border-active-blue-france) 4px,var(--border-active-blue-france) 5px,transparent 6px),linear-gradient(var(--border-active-blue-france),var(--border-active-blue-france)),radial-gradient(at 5px calc(100% - 4px),transparent 4px,var(--border-active-blue-france) 4px,var(--border-active-blue-france) 5px,transparent 6px),linear-gradient(var(--border-active-blue-france),var(--border-active-blue-france)),var(--data-uri-svg)}:root[data-fr-theme=dark] .fr-checkbox-group input[type=checkbox]:checked+label:before{--data-uri-svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath fill=%27%23000091%27 d=%27m10 15.17 9.2-9.2 1.4 1.42L10 18l-6.36-6.36 1.4-1.42z%27/%3E%3C/svg%3E")}.fr-checkbox-group input[type=checkbox]:disabled+label:before{background-image:radial-gradient(at 5px 4px,transparent 4px,var(--background-disabled-grey) 4px,var(--background-disabled-grey) 5px,transparent 6px),linear-gradient(var(--background-disabled-grey),var(--background-disabled-grey)),radial-gradient(at calc(100% - 5px) 4px,transparent 4px,var(--background-disabled-grey) 4px,var(--background-disabled-grey) 5px,transparent 6px),linear-gradient(var(--background-disabled-grey),var(--background-disabled-grey)),radial-gradient(at calc(100% - 5px) calc(100% - 4px),transparent 4px,var(--background-disabled-grey) 4px,var(--background-disabled-grey) 5px,transparent 6px),linear-gradient(var(--background-disabled-grey),var(--background-disabled-grey)),radial-gradient(at 5px calc(100% - 4px),transparent 4px,var(--background-disabled-grey) 4px,var(--background-disabled-grey) 5px,transparent 6px),linear-gradient(var(--background-disabled-grey),var(--background-disabled-grey)),var(--data-uri-svg)}.fr-checkbox-group input[type=checkbox]:disabled:checked+label:before{--data-uri-svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath fill=%27%23929292%27 d=%27m10 15.17 9.2-9.2 1.4 1.42L10 18l-6.36-6.36 1.4-1.42z%27/%3E%3C/svg%3E");background-color:var(--background-disabled-grey)}:root[data-fr-theme=dark] .fr-checkbox-group input[type=checkbox]:disabled:checked+label:before{--data-uri-svg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27%3E%3Cpath fill=%27%23666%27 d=%27m10 15.17 9.2-9.2 1.4 1.42L10 18l-6.36-6.36 1.4-1.42z%27/%3E%3C/svg%3E")}.fr-checkbox-group--error input[type=checkbox]+label,.fr-checkbox-group--error input[type=checkbox]:checked+label{color:#ce0500}.fr-checkbox-group--error input[type=checkbox]+label:before,.fr-checkbox-group--error input[type=checkbox]:checked+label:before{background-image:radial-gradient(at 5px 4px,transparent 4px,var(--border-plain-error) 4px,var(--border-plain-error) 5px,transparent 6px),linear-gradient(var(--border-plain-error),var(--border-plain-error)),radial-gradient(at calc(100% - 5px) 4px,transparent 4px,var(--border-plain-error) 4px,var(--border-plain-error) 5px,transparent 6px),linear-gradient(var(--border-plain-error),var(--border-plain-error)),radial-gradient(at calc(100% - 5px) calc(100% - 4px),transparent 4px,var(--border-plain-error) 4px,var(--border-plain-error) 5px,transparent 6px),linear-gradient(var(--border-plain-error),var(--border-plain-error)),radial-gradient(at 5px calc(100% - 4px),transparent 4px,var(--border-plain-error) 4px,var(--border-plain-error) 5px,transparent 6px),linear-gradient(var(--border-plain-error),var(--border-plain-error)),var(--data-uri-svg)}.fr-checkbox-group--error:before{background-color:#ce0500}.fr-checkbox-group--valid input[type=checkbox]+label,.fr-checkbox-group--valid input[type=checkbox]:checked+label{color:#18753c}.fr-checkbox-group--valid input[type=checkbox]+label:before,.fr-checkbox-group--valid input[type=checkbox]:checked+label:before{background-image:radial-gradient(at 5px 4px,transparent 4px,var(--border-plain-success) 4px,var(--border-plain-success) 5px,transparent 6px),linear-gradient(var(--border-plain-success),var(--border-plain-success)),radial-gradient(at calc(100% - 5px) 4px,transparent 4px,var(--border-plain-success) 4px,var(--border-plain-success) 5px,transparent 6px),linear-gradient(var(--border-plain-success),var(--border-plain-success)),radial-gradient(at calc(100% - 5px) calc(100% - 4px),transparent 4px,var(--border-plain-success) 4px,var(--border-plain-success) 5px,transparent 6px),linear-gradient(var(--border-plain-success),var(--border-plain-success)),radial-gradient(at 5px calc(100% - 4px),transparent 4px,var(--border-plain-success) 4px,var(--border-plain-success) 5px,transparent 6px),linear-gradient(var(--border-plain-success),var(--border-plain-success)),var(--data-uri-svg)}.fr-checkbox-group--valid:before{background-color:#18753c}.fr-fieldset--error .fr-checkbox-group input[type=checkbox]+label:before{background-image:radial-gradient(at 5px 4px,transparent 4px,var(--border-plain-error) 4px,var(--border-plain-error) 5px,transparent 6px),linear-gradient(var(--border-plain-error),var(--border-plain-error)),radial-gradient(at calc(100% - 5px) 4px,transparent 4px,var(--border-plain-error) 4px,var(--border-plain-error) 5px,transparent 6px),linear-gradient(var(--border-plain-error),var(--border-plain-error)),radial-gradient(at calc(100% - 5px) calc(100% - 4px),transparent 4px,var(--border-plain-error) 4px,var(--border-plain-error) 5px,transparent 6px),linear-gradient(var(--border-plain-error),var(--border-plain-error)),radial-gradient(at 5px calc(100% - 4px),transparent 4px,var(--border-plain-error) 4px,var(--border-plain-error) 5px,transparent 6px),linear-gradient(var(--border-plain-error),var(--border-plain-error)),var(--data-uri-svg)}.fr-fieldset--valid .fr-checkbox-group input[type=checkbox]+label:before{background-image:radial-gradient(at 5px 4px,transparent 4px,var(--border-plain-success) 4px,var(--border-plain-success) 5px,transparent 6px),linear-gradient(var(--border-plain-success),var(--border-plain-success)),radial-gradient(at calc(100% - 5px) 4px,transparent 4px,var(--border-plain-success) 4px,var(--border-plain-success) 5px,transparent 6px),linear-gradient(var(--border-plain-success),var(--border-plain-success)),radial-gradient(at calc(100% - 5px) calc(100% - 4px),transparent 4px,var(--border-plain-success) 4px,var(--border-plain-success) 5px,transparent 6px),linear-gradient(var(--border-plain-success),var(--border-plain-success)),radial-gradient(at 5px calc(100% - 4px),transparent 4px,var(--border-plain-success) 4px,var(--border-plain-success) 5px,transparent 6px),linear-gradient(var(--border-plain-success),var(--border-plain-success)),var(--data-uri-svg)}.fr-toggle label{color:#161616}.fr-toggle label:before{color:#000091;content:"";display:block;font-size:1rem;line-height:1.5rem}.fr-toggle label:after{background-color:#fff;color:#000091}.fr-toggle input[type=checkbox],.fr-toggle label:after{box-shadow:inset 0 0 0 1px #000091}.fr-toggle input[type=checkbox]:checked{background-color:#000091}.fr-toggle input[type=checkbox]:disabled{box-shadow:inset 0 0 0 1px #e5e5e5}.fr-toggle input[type=checkbox]:disabled:checked{background-color:#e5e5e5}.fr-toggle input[type=checkbox]:disabled~.fr-toggle__label:before{color:#929292}.fr-toggle input[type=checkbox]:disabled~.fr-toggle__label:after{box-shadow:inset 0 0 0 1px #e5e5e5;color:#929292}.fr-toggle .fr-hint-text{color:#666;font-size:1rem;line-height:1.5rem}.fr-toggle--border-bottom{box-shadow:inset 0 -1px 0 0 #ddd}.fr-toggle--valid:before{background-color:#18753c;content:""}.fr-toggle--error:before{background-color:#ce0500;content:""}.fr-fieldset--error .fr-toggle label,.fr-fieldset--error .fr-toggle label:before,.fr-toggle--error label,.fr-toggle--error label:before{color:#ce0500}.fr-fieldset--error .fr-toggle label:after,.fr-toggle--error label:after{box-shadow:inset 0 0 0 1px #ce0500}.fr-fieldset--valid .fr-toggle label,.fr-fieldset--valid .fr-toggle label:before,.fr-toggle--valid label,.fr-toggle--valid label:before{color:#18753c}.fr-fieldset--valid .fr-toggle label:after,.fr-toggle--valid label:after{box-shadow:inset 0 0 0 1px #18753c}.fr-skiplinks{background-color:#eee}.fr-skiplink{display:none}.fr-select{background-color:#eee;box-shadow:inset 0 -2px 0 0 #3a3a3a;color:#3a3a3a}.fr-fieldset--valid .fr-select,.fr-select-group--valid .fr-select{box-shadow:inset 0 -2px 0 0 #18753c}.fr-fieldset--error .fr-select,.fr-select-group--error .fr-select{box-shadow:inset 0 -2px 0 0 #ce0500}.fr-select-group--error:before{background-image:linear-gradient(0deg,#ce0500,#ce0500)}.fr-select-group--valid:before{background-image:linear-gradient(0deg,#18753c,#18753c)}.fr-select-group--info:before{background-image:linear-gradient(0deg,#0063cb,#0063cb)}.fr-select:disabled{box-shadow:inset 0 -2px 0 0 #e5e5e5;color:#929292}.fr-select:-webkit-autofill,.fr-select:-webkit-autofill:focus,.fr-select:-webkit-autofill:hover{-webkit-text-fill-color:#161616;box-shadow:inset 0 -2px 0 0 #3a3a3a,inset 0 0 0 1000px #ececfe}.fr-callout{background-color:#eee;background-image:linear-gradient(0deg,#6a6af4,#6a6af4)}.fr-callout:before,.fr-callout__title{color:#161616}.fr-callout--green-tilleul-verveine{background-color:#fceeac;background-image:linear-gradient(0deg,#b7a73f,#b7a73f)}.fr-callout--green-bourgeon{background-color:#c9fcac;background-image:linear-gradient(0deg,#68a532,#68a532)}.fr-callout--green-emeraude{background-color:#c3fad5;background-image:linear-gradient(0deg,#00a95f,#00a95f)}.fr-callout--green-menthe{background-color:#bafaee;background-image:linear-gradient(0deg,#009081,#009081)}.fr-callout--green-archipel{background-color:#c7f6fc;background-image:linear-gradient(0deg,#009099,#009099)}.fr-callout--blue-ecume{background-color:#e9edfe;background-image:linear-gradient(0deg,#465f9d,#465f9d)}.fr-callout--blue-cumulus{background-color:#e6eefe;background-image:linear-gradient(0deg,#417dc4,#417dc4)}.fr-callout--purple-glycine{background-color:#fee7fc;background-image:linear-gradient(0deg,#a558a0,#a558a0)}.fr-callout--pink-macaron{background-color:#fee9e6;background-image:linear-gradient(0deg,#e18b76,#e18b76)}.fr-callout--pink-tuile{background-color:#fee9e7;background-image:linear-gradient(0deg,#ce614a,#ce614a)}.fr-callout--yellow-tournesol{background-color:#feecc2;background-image:linear-gradient(0deg,#c8aa39,#c8aa39)}.fr-callout--yellow-moutarde{background-color:#feebd0;background-image:linear-gradient(0deg,#c3992a,#c3992a)}.fr-callout--orange-terre-battue{background-color:#fee9e5;background-image:linear-gradient(0deg,#e4794a,#e4794a)}.fr-callout--brown-cafe-creme{background-color:#f7ecdb;background-image:linear-gradient(0deg,#d1b781,#d1b781)}.fr-callout--brown-caramel{background-color:#f7ebe5;background-image:linear-gradient(0deg,#c08c65,#c08c65)}.fr-callout--brown-opera{background-color:#f7ece4;background-image:linear-gradient(0deg,#bd987a,#bd987a)}.fr-callout--beige-gris-galet{background-color:#f3ede5;background-image:linear-gradient(0deg,#aea397,#aea397)}.fr-modal__body{background-color:#fff}.fr-modal__title{color:#161616}.fr-modal__footer{background-color:#fff}.fr-modal__body.fr-scroll-divider .fr-modal__footer{background-image:linear-gradient(0deg,#ddd,#ddd)}.fr-modal,.fr-navigation{display:none}.fr-share .fr-btn{box-shadow:inset 0 0 0 1px #ddd;color:#000091}.fr-share .fr-btn:disabled,.fr-share a.fr-btn:not([href]){box-shadow:inset 0 0 0 1px #e5e5e5;color:#929292}.fr-share__text{color:#666}.fr-footer,.fr-share{display:none}.fr-footer{box-shadow:inset 0 2px 0 0 #000091,inset 0 -1px 0 0 #ddd}.fr-footer__content-link{color:#3a3a3a}.fr-footer__top-cat{color:#161616}.fr-footer__top{background-color:#f6f6f6}.fr-footer__bottom{box-shadow:inset 0 1px 0 0 #ddd}.fr-footer__bottom .fr-btn{color:#666}.fr-footer__bottom-item:before{box-shadow:inset 0 0 0 1px #ddd}.fr-footer__bottom-copy,.fr-footer__bottom-link{color:#666}.fr-footer__partners{box-shadow:inset 0 1px 0 0 #ddd}.fr-footer__partners-title{color:#3a3a3a}.fr-footer__partners .fr-footer__logo{background-color:#fff;box-shadow:inset 0 0 0 1px #ddd}.fr-tile{background-color:#fff}.fr-tile:not(.fr-tile--no-border):not(.fr-tile--shadow){background-image:linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd),linear-gradient(0deg,#ddd,#ddd)}.fr-tile--grey{background-color:#eee}.fr-tile--shadow{background-color:#fff}.fr-tile--shadow.fr-tile--grey{background-color:#eee}.fr-tile__title{color:#161616}.fr-tile__title:disabled,a.fr-tile__title:not([href]){background-color:#e5e5e5;color:#929292}.fr-tile__title:before{background-image:linear-gradient(0deg,#3a3a3a,#3a3a3a)}.fr-tile__title a,.fr-tile__title button{color:#000091}.fr-tile__title a:before,.fr-tile__title button:before{background-image:linear-gradient(0deg,#000091,#000091)}.fr-tile__title a:not([href]),.fr-tile__title button:disabled{color:#929292}.fr-tile__title a:not([href]):before,.fr-tile__title button:disabled:before{background-image:linear-gradient(0deg,#e5e5e5,#e5e5e5)}.fr-tile .fr-tile__desc,.fr-tile .fr-tile__detail,.fr-tile--sm .fr-tile__desc,.fr-tile--sm .fr-tile__detail,.fr-tile--sm__desc,.fr-tile--sm__detail,.fr-tile__desc,.fr-tile__detail{font-size:1rem;line-height:1.5rem}.fr-translate .fr-translate__btn[aria-expanded=true]{background-color:#e3e3fd;color:#000091}.fr-translate .fr-translate__btn[aria-expanded=true]:hover{background-color:var(--hover-tint)}.fr-translate .fr-translate__btn[aria-expanded=true]:active{background-color:var(--active-tint)}.fr-translate .fr-translate__btn{font-size:1rem;line-height:1.5rem}.fr-transcription:before{box-shadow:inset 0 0 0 1px #ddd}.fr-transcription__btn{color:#000091}.fr-transcription__btn[aria-expanded=true]{background-color:#e3e3fd}.fr-transcription .fr-modal:not(.fr-modal--opened):before,.fr-transcription__content:before,.fr-transcription__footer:before{box-shadow:inset 0 1px 0 0 #ddd}.fr-transcription{display:none}.fr-input{background-color:#eee;box-shadow:inset 0 -2px 0 0 #3a3a3a;color:#3a3a3a}.fr-input::placeholder{color:#666}.fr-input::-webkit-contacts-auto-fill-button{background-color:#161616}.fr-input::-webkit-contacts-auto-fill-button:hover{background-color:#343434}.fr-input::-webkit-contacts-auto-fill-button:active{background-color:#474747}.fr-input:disabled{box-shadow:inset 0 -2px 0 0 var(--border-disabled-grey);color:var(--text-disabled-grey)}.fr-input:-webkit-autofill,.fr-input:-webkit-autofill:focus,.fr-input:-webkit-autofill:hover,.fr-input:autofill,.fr-input:autofill:focus,.fr-input:autofill:hover{-webkit-text-fill-color:#161616;box-shadow:inset 0 -2px 0 0 #3a3a3a,inset 0 0 0 1000px #e8edff}.fr-input-wrap--addon>.fr-input:not(:last-child){box-shadow:inset 0 -2px 0 0 #000091}.fr-fieldset--valid .fr-input,.fr-fieldset--valid .fr-input-wrap--addon>.fr-input:not(:last-child),.fr-input-group--valid .fr-input,.fr-input-group--valid .fr-input-wrap--addon>.fr-input:not(:last-child){box-shadow:inset 0 -2px 0 0 #18753c}.fr-fieldset--error .fr-input,.fr-fieldset--error .fr-input-wrap--addon>.fr-input:not(:last-child),.fr-input-group--error .fr-input,.fr-input-group--error .fr-input-wrap--addon>.fr-input:not(:last-child){box-shadow:inset 0 -2px 0 0 #ce0500}.fr-input-group--error:before{background-image:linear-gradient(0deg,#ce0500,#ce0500)}.fr-input-group--valid:before{background-image:linear-gradient(0deg,#18753c,#18753c)}.fr-input-group--info:before{background-image:linear-gradient(0deg,#0063cb,#0063cb)}.fr-search-bar .fr-input{box-shadow:inset 0 -2px 0 0 #000091}.fr-search-bar .fr-input--valid{box-shadow:inset 0 -2px 0 0 #18753c}.fr-search-bar .fr-input--error{box-shadow:inset 0 -2px 0 0 #ce0500}.fr-content-media .fr-link,.fr-content-media__caption{color:#666}.fr-content-media__caption{font-size:1rem;line-height:1.5rem}.fr-content-media__caption .fr-link{font-size:1rem;line-height:1.5rem;padding:0}.fr-content-media__caption .fr-link:after,.fr-content-media__caption .fr-link:before{--icon-size:1rem}.fr-consent-placeholder{background-color:#eee}.fr-consent-banner{background-color:#f6f6f6;box-shadow:inset 0 0 0 1px #ddd;display:none}.fr-consent-manager__header,.fr-consent-service{box-shadow:inset 0 -1px 0 0 #ddd;color:#3a3a3a}.fr-consent-manager__header .fr-radio-group+.fr-radio-group:before,.fr-consent-service .fr-radio-group+.fr-radio-group:before{box-shadow:inset 0 0 0 1px #ddd}.fr-consent-service__title{color:#161616}.fr-consent-service .fr-consent-service__collapse-btn{color:#000091}.fr-follow{background-color:#f5f5fe}.fr-follow .fr-input{background-color:#fff}.fr-follow__title{color:#161616}.fr-follow__newsletter-legal{color:#666}.fr-follow__social .fr-btn{color:#000091}.fr-follow__social .fr-btn:disabled,.fr-follow__social a.fr-btn:not([href]){color:#929292}.fr-follow .fr-grid-row>:not(:first-child){box-shadow:0 -1px 0 0 #6a6af4}.fr-password__btn{color:#000091}.fr-password__btn:disabled,a.fr-password__btn:not([href]){color:#929292}.fr-password .fr-password__checkbox input[type=checkbox]+label{color:#161616}.fr-password .fr-password__checkbox input[type=checkbox]+label:before{background-image:radial-gradient(at 5px 4px,transparent 4px,var(--border-action-high-blue-france) 4px,var(--border-action-high-blue-france) 5px,transparent 6px),linear-gradient(var(--border-action-high-blue-france),var(--border-action-high-blue-france)),radial-gradient(at calc(100% - 5px) 4px,transparent 4px,var(--border-action-high-blue-france) 4px,var(--border-action-high-blue-france) 5px,transparent 6px),linear-gradient(var(--border-action-high-blue-france),var(--border-action-high-blue-france)),radial-gradient(at calc(100% - 5px) calc(100% - 4px),transparent 4px,var(--border-action-high-blue-france) 4px,var(--border-action-high-blue-france) 5px,transparent 6px),linear-gradient(var(--border-action-high-blue-france),var(--border-action-high-blue-france)),radial-gradient(at 5px calc(100% - 4px),transparent 4px,var(--border-action-high-blue-france) 4px,var(--border-action-high-blue-france) 5px,transparent 6px),linear-gradient(var(--border-action-high-blue-france),var(--border-action-high-blue-france)),var(--data-uri-svg)}.fr-header__brand{background-color:#fff;flex-wrap:nowrap}.fr-header__service{box-shadow:none;color:#161616}.fr-header__service:before{background-color:#ddd}.fr-header__menu-links:after{box-shadow:inset 0 1px 0 0 #ddd}.fr-header__menu-links .fr-btn{color:#000091}.fr-header__menu-links .fr-btn:disabled,.fr-header__menu-links a.fr-btn:not([href]){color:#929292}.fr-header__tools-links .fr-btn{color:#000091}.fr-header__tools-links .fr-btn:disabled,.fr-header__tools-links a.fr-btn:not([href]){color:#929292}.fr-header__tools-links>.fr-translate:first-child:last-child .fr-btn{box-shadow:inset 0 0 0 1px #ddd;color:#000091}.fr-header__tools-links>.fr-translate:first-child:last-child .fr-btn:disabled,.fr-header__tools-links>.fr-translate:first-child:last-child a.fr-btn:not([href]){box-shadow:inset 0 0 0 1px #e5e5e5;color:#929292}.fr-header__navbar .fr-service__title{color:#161616}.fr-header__navbar .fr-btn{color:#000091}.fr-header__navbar .fr-btn:disabled,.fr-header__navbar a.fr-btn:not([href]){color:#929292}.fr-header__navbar .fr-btn--menu{box-shadow:inset 0 0 0 1px #ddd;color:#000091}.fr-header__navbar .fr-btn--menu:disabled,.fr-header__navbar a.fr-btn--menu:not([href]){box-shadow:inset 0 0 0 1px #e5e5e5;color:#929292}.fr-header .fr-modal{background-color:#fff}.fr-header__menu{display:none}.fr-header__body-row{padding:0}.fr-header__body .fr-header__navbar,.fr-header__body .fr-header__tools{display:none}.fr-header__brand-top{width:auto}}@media print and (min-width:48em){.fr-sidemenu__inner{box-shadow:inset -1px 0 0 0 #ddd}.fr-sidemenu--right .fr-sidemenu__inner{box-shadow:inset 1px 0 0 0 #ddd}.fr-follow .fr-grid-row>:not(:first-child){box-shadow:-1px 0 0 0 #6a6af4}}@media print and (min-width:62em){.fr-header{background-color:#fff}.fr-header .fr-header__menu{box-shadow:inset 0 1px 0 0 #ddd}} +/*!**********************************************************************************************************************************!*\ + !*** css ./node_modules/css-loader/dist/cjs.js!./node_modules/@gouvfr/dsfr/dist/utility/icons/icons-system/icons-system.min.css ***! + \**********************************************************************************************************************************/ /*! * DSFR v1.12.1 | SPDX-License-Identifier: MIT | License-Filename: LICENSE.md | restricted use (see terms and conditions) */.fr-icon-add-circle-fill:after,.fr-icon-add-circle-fill:before{-webkit-mask-image:url(../../assets/images/accdc547cfa7b034b04d.svg);mask-image:url(../../assets/images/accdc547cfa7b034b04d.svg)}.fr-icon-add-circle-line:after,.fr-icon-add-circle-line:before{-webkit-mask-image:url(../../assets/images/afa9c83f00c108c1761d.svg);mask-image:url(../../assets/images/afa9c83f00c108c1761d.svg)}.fr-icon-add-line:after,.fr-icon-add-line:before{-webkit-mask-image:url(../../assets/images/04fc434400ccc52e3ffb.svg);mask-image:url(../../assets/images/04fc434400ccc52e3ffb.svg)}.fr-icon-alarm-warning-fill:after,.fr-icon-alarm-warning-fill:before{-webkit-mask-image:url(../../assets/images/4f2ce7bdddb2fc202d53.svg);mask-image:url(../../assets/images/4f2ce7bdddb2fc202d53.svg)}.fr-icon-alarm-warning-line:after,.fr-icon-alarm-warning-line:before{-webkit-mask-image:url(../../assets/images/c18eec115bf8edb1cfd8.svg);mask-image:url(../../assets/images/c18eec115bf8edb1cfd8.svg)}.fr-icon-alert-fill:after,.fr-icon-alert-fill:before{-webkit-mask-image:url(../../assets/images/78026453ed9720bc3f24.svg);mask-image:url(../../assets/images/78026453ed9720bc3f24.svg)}.fr-icon-alert-line:after,.fr-icon-alert-line:before{-webkit-mask-image:url(../../assets/images/1cff4fe3ebe1bbc8c2c8.svg);mask-image:url(../../assets/images/1cff4fe3ebe1bbc8c2c8.svg)}.fr-icon-arrow-down-fill:after,.fr-icon-arrow-down-fill:before{-webkit-mask-image:url(../../assets/images/98ac12501cdf8a7453c0.svg);mask-image:url(../../assets/images/98ac12501cdf8a7453c0.svg)}.fr-icon-arrow-down-line:after,.fr-icon-arrow-down-line:before{-webkit-mask-image:url(../../assets/images/40da8b2fcb2f6cd5bf93.svg);mask-image:url(../../assets/images/40da8b2fcb2f6cd5bf93.svg)}.fr-icon-arrow-down-s-fill:after,.fr-icon-arrow-down-s-fill:before{-webkit-mask-image:url(../../assets/images/6c8b4ba4adbad6aee232.svg);mask-image:url(../../assets/images/6c8b4ba4adbad6aee232.svg)}.fr-icon-arrow-down-s-line:after,.fr-icon-arrow-down-s-line:before{-webkit-mask-image:url(../../assets/images/4a86895e5ee6121af909.svg);mask-image:url(../../assets/images/4a86895e5ee6121af909.svg)}.fr-icon-arrow-go-back-fill:after,.fr-icon-arrow-go-back-fill:before{-webkit-mask-image:url(../../assets/images/3eb28dfe4648b9dd77af.svg);mask-image:url(../../assets/images/3eb28dfe4648b9dd77af.svg)}.fr-icon-arrow-go-back-line:after,.fr-icon-arrow-go-back-line:before{-webkit-mask-image:url(../../assets/images/894a7247d08f4daf0c3b.svg);mask-image:url(../../assets/images/894a7247d08f4daf0c3b.svg)}.fr-icon-arrow-go-forward-fill:after,.fr-icon-arrow-go-forward-fill:before{-webkit-mask-image:url(../../assets/images/92471c9e86589b355a95.svg);mask-image:url(../../assets/images/92471c9e86589b355a95.svg)}.fr-icon-arrow-go-forward-line:after,.fr-icon-arrow-go-forward-line:before{-webkit-mask-image:url(../../assets/images/28f5ce47f021995d6827.svg);mask-image:url(../../assets/images/28f5ce47f021995d6827.svg)}.fr-icon-arrow-left-fill:after,.fr-icon-arrow-left-fill:before{-webkit-mask-image:url(../../assets/images/bdd20aff546fe342b364.svg);mask-image:url(../../assets/images/bdd20aff546fe342b364.svg)}.fr-icon-arrow-left-line:after,.fr-icon-arrow-left-line:before{-webkit-mask-image:url(../../assets/images/71b4c61225222e7e32aa.svg);mask-image:url(../../assets/images/71b4c61225222e7e32aa.svg)}.fr-icon-arrow-left-s-fill:after,.fr-icon-arrow-left-s-fill:before{-webkit-mask-image:url(../../assets/images/82be8ff1e8d1fe0a0f6d.svg);mask-image:url(../../assets/images/82be8ff1e8d1fe0a0f6d.svg)}.fr-icon-arrow-left-s-line:after,.fr-icon-arrow-left-s-line:before{-webkit-mask-image:url(../../assets/images/dd6f55cf15bed3c3f4f8.svg);mask-image:url(../../assets/images/dd6f55cf15bed3c3f4f8.svg)}.fr-icon-arrow-right-fill:after,.fr-icon-arrow-right-fill:before{-webkit-mask-image:url(../../assets/images/77c6641c99536c8ce7b5.svg);mask-image:url(../../assets/images/77c6641c99536c8ce7b5.svg)}.fr-icon-arrow-right-line:after,.fr-icon-arrow-right-line:before{-webkit-mask-image:url(../../assets/images/c7e409a631c94231dfeb.svg);mask-image:url(../../assets/images/c7e409a631c94231dfeb.svg)}.fr-icon-arrow-right-s-fill:after,.fr-icon-arrow-right-s-fill:before{-webkit-mask-image:url(../../assets/images/3945c1fcb905717711da.svg);mask-image:url(../../assets/images/3945c1fcb905717711da.svg)}.fr-icon-arrow-right-s-line:after,.fr-icon-arrow-right-s-line:before{-webkit-mask-image:url(../../assets/images/f6aba782df5e024ccbbc.svg);mask-image:url(../../assets/images/f6aba782df5e024ccbbc.svg)}.fr-icon-arrow-right-up-line:after,.fr-icon-arrow-right-up-line:before{-webkit-mask-image:url(../../assets/images/81d3e93b0d1679970bb5.svg);mask-image:url(../../assets/images/81d3e93b0d1679970bb5.svg)}.fr-icon-arrow-up-down-line:after,.fr-icon-arrow-up-down-line:before{-webkit-mask-image:url(../../assets/images/21f69e91424c407eb09a.svg);mask-image:url(../../assets/images/21f69e91424c407eb09a.svg)}.fr-icon-arrow-up-fill:after,.fr-icon-arrow-up-fill:before{-webkit-mask-image:url(../../assets/images/ea925157f68495a3302c.svg);mask-image:url(../../assets/images/ea925157f68495a3302c.svg)}.fr-icon-arrow-up-line:after,.fr-icon-arrow-up-line:before{-webkit-mask-image:url(../../assets/images/4648a2eb31198cc757a8.svg);mask-image:url(../../assets/images/4648a2eb31198cc757a8.svg)}.fr-icon-arrow-up-s-fill:after,.fr-icon-arrow-up-s-fill:before{-webkit-mask-image:url(../../assets/images/90adf7ab45a8f0b94c4c.svg);mask-image:url(../../assets/images/90adf7ab45a8f0b94c4c.svg)}.fr-icon-arrow-up-s-line:after,.fr-icon-arrow-up-s-line:before{-webkit-mask-image:url(../../assets/images/be3a1ed8fd6c6a480611.svg);mask-image:url(../../assets/images/be3a1ed8fd6c6a480611.svg)}.fr-icon-check-line:after,.fr-icon-check-line:before{-webkit-mask-image:url(../../assets/images/b45a007d5340e85bc67c.svg);mask-image:url(../../assets/images/b45a007d5340e85bc67c.svg)}.fr-icon-checkbox-circle-fill:after,.fr-icon-checkbox-circle-fill:before{-webkit-mask-image:url(../../assets/images/0e119699356f690bd361.svg);mask-image:url(../../assets/images/0e119699356f690bd361.svg)}.fr-icon-checkbox-circle-line:after,.fr-icon-checkbox-circle-line:before{-webkit-mask-image:url(../../assets/images/dad78caeb7e4997451a3.svg);mask-image:url(../../assets/images/dad78caeb7e4997451a3.svg)}.fr-icon-checkbox-fill:after,.fr-icon-checkbox-fill:before{-webkit-mask-image:url(../../assets/images/e839a61cafeaa865799b.svg);mask-image:url(../../assets/images/e839a61cafeaa865799b.svg)}.fr-icon-checkbox-line:after,.fr-icon-checkbox-line:before{-webkit-mask-image:url(../../assets/images/8f72ea91958b52fe5a1e.svg);mask-image:url(../../assets/images/8f72ea91958b52fe5a1e.svg)}.fr-icon-close-circle-fill:after,.fr-icon-close-circle-fill:before{-webkit-mask-image:url(../../assets/images/df903ddb6727f1ba9730.svg);mask-image:url(../../assets/images/df903ddb6727f1ba9730.svg)}.fr-icon-close-circle-line:after,.fr-icon-close-circle-line:before{-webkit-mask-image:url(../../assets/images/3f4617d23baf291fb591.svg);mask-image:url(../../assets/images/3f4617d23baf291fb591.svg)}.fr-icon-close-line:after,.fr-icon-close-line:before{-webkit-mask-image:url(../../assets/images/69dfb9f70fe1180898d7.svg);mask-image:url(../../assets/images/69dfb9f70fe1180898d7.svg)}.fr-icon-delete-bin-fill:after,.fr-icon-delete-bin-fill:before{-webkit-mask-image:url(../../assets/images/f4daf316e4582c2bb91d.svg);mask-image:url(../../assets/images/f4daf316e4582c2bb91d.svg)}.fr-icon-delete-bin-line:after,.fr-icon-delete-bin-line:before{-webkit-mask-image:url(../../assets/images/230758cd18def1c1264e.svg);mask-image:url(../../assets/images/230758cd18def1c1264e.svg)}.fr-icon-download-fill:after,.fr-icon-download-fill:before{-webkit-mask-image:url(../../assets/images/138e2a3cece1a3cd8b5b.svg);mask-image:url(../../assets/images/138e2a3cece1a3cd8b5b.svg)}.fr-icon-download-line:after,.fr-icon-download-line:before{-webkit-mask-image:url(../../assets/images/dbb56e50b667ae162595.svg);mask-image:url(../../assets/images/dbb56e50b667ae162595.svg)}.fr-icon-error-warning-fill:after,.fr-icon-error-warning-fill:before{-webkit-mask-image:url(../../assets/images/7d8cb7c3c96865dbc4e7.svg);mask-image:url(../../assets/images/7d8cb7c3c96865dbc4e7.svg)}.fr-icon-error-warning-line:after,.fr-icon-error-warning-line:before{-webkit-mask-image:url(../../assets/images/0e6487e12b42ea53ab30.svg);mask-image:url(../../assets/images/0e6487e12b42ea53ab30.svg)}.fr-icon-external-link-fill:after,.fr-icon-external-link-fill:before{-webkit-mask-image:url(../../assets/images/d65ab4b95a6162aa9693.svg);mask-image:url(../../assets/images/d65ab4b95a6162aa9693.svg)}.fr-icon-external-link-line:after,.fr-icon-external-link-line:before{-webkit-mask-image:url(../../assets/images/5fac7fc1e919c8785620.svg);mask-image:url(../../assets/images/5fac7fc1e919c8785620.svg)}.fr-icon-eye-fill:after,.fr-icon-eye-fill:before{-webkit-mask-image:url(../../assets/images/b5abbb460152c56b95a7.svg);mask-image:url(../../assets/images/b5abbb460152c56b95a7.svg)}.fr-icon-eye-line:after,.fr-icon-eye-line:before{-webkit-mask-image:url(../../assets/images/76ca9b9754640ad96f1f.svg);mask-image:url(../../assets/images/76ca9b9754640ad96f1f.svg)}.fr-icon-eye-off-fill:after,.fr-icon-eye-off-fill:before{-webkit-mask-image:url(../../assets/images/f62b100adae167358976.svg);mask-image:url(../../assets/images/f62b100adae167358976.svg)}.fr-icon-eye-off-line:after,.fr-icon-eye-off-line:before{-webkit-mask-image:url(../../assets/images/56246d86f5b0cb71bdfb.svg);mask-image:url(../../assets/images/56246d86f5b0cb71bdfb.svg)}.fr-icon-filter-fill:after,.fr-icon-filter-fill:before{-webkit-mask-image:url(../../assets/images/c5c3ab65418580eae125.svg);mask-image:url(../../assets/images/c5c3ab65418580eae125.svg)}.fr-icon-filter-line:after,.fr-icon-filter-line:before{-webkit-mask-image:url(../../assets/images/90b486f546096b40e852.svg);mask-image:url(../../assets/images/90b486f546096b40e852.svg)}.fr-icon-alert-warning-2-fill:after,.fr-icon-alert-warning-2-fill:before{-webkit-mask-image:url(../../assets/images/6833270903716b30531e.svg);mask-image:url(../../assets/images/6833270903716b30531e.svg)}.fr-icon-alert-warning-fill:after,.fr-icon-alert-warning-fill:before{-webkit-mask-image:url(../../assets/images/63877971464a91a39805.svg);mask-image:url(../../assets/images/63877971464a91a39805.svg)}.fr-icon-arrow-left-s-first-line:after,.fr-icon-arrow-left-s-first-line:before{-webkit-mask-image:url(../../assets/images/0cdcecad9ad8958941f1.svg);mask-image:url(../../assets/images/0cdcecad9ad8958941f1.svg)}.fr-icon-arrow-left-s-line-double:after,.fr-icon-arrow-left-s-line-double:before{-webkit-mask-image:url(../../assets/images/84e100c87fe2e8458eda.svg);mask-image:url(../../assets/images/84e100c87fe2e8458eda.svg)}.fr-icon-arrow-right-down-circle-fill:after,.fr-icon-arrow-right-down-circle-fill:before{-webkit-mask-image:url(../../assets/images/0ef5119ffdc80907129e.svg);mask-image:url(../../assets/images/0ef5119ffdc80907129e.svg)}.fr-icon-arrow-right-s-last-line:after,.fr-icon-arrow-right-s-last-line:before{-webkit-mask-image:url(../../assets/images/6a8c4f5be92a6a9b36a8.svg);mask-image:url(../../assets/images/6a8c4f5be92a6a9b36a8.svg)}.fr-icon-arrow-right-s-line-double:after,.fr-icon-arrow-right-s-line-double:before{-webkit-mask-image:url(../../assets/images/8177350ca2baf9d0988a.svg);mask-image:url(../../assets/images/8177350ca2baf9d0988a.svg)}.fr-icon-arrow-right-up-circle-fill:after,.fr-icon-arrow-right-up-circle-fill:before{-webkit-mask-image:url(../../assets/images/11c809fc8894c3952778.svg);mask-image:url(../../assets/images/11c809fc8894c3952778.svg)}.fr-icon-capslock-line:after,.fr-icon-capslock-line:before{-webkit-mask-image:url(../../assets/images/a51a93eb3fe93a5d4df6.svg);mask-image:url(../../assets/images/a51a93eb3fe93a5d4df6.svg)}.fr-icon-equal-circle-fill:after,.fr-icon-equal-circle-fill:before{-webkit-mask-image:url(../../assets/images/96edc078a03d0be58738.svg);mask-image:url(../../assets/images/96edc078a03d0be58738.svg)}.fr-icon-error-fill:after,.fr-icon-error-fill:before{-webkit-mask-image:url(../../assets/images/9e33ec01f6d0a9071b3e.svg);mask-image:url(../../assets/images/9e33ec01f6d0a9071b3e.svg)}.fr-icon-error-line:after,.fr-icon-error-line:before{-webkit-mask-image:url(../../assets/images/6e610ede431f1b33fbff.svg);mask-image:url(../../assets/images/6e610ede431f1b33fbff.svg)}.fr-icon-info-fill:after,.fr-icon-info-fill:before{-webkit-mask-image:url(../../assets/images/719d870fd2ef14580ede.svg);mask-image:url(../../assets/images/719d870fd2ef14580ede.svg)}.fr-icon-info-line:after,.fr-icon-info-line:before{-webkit-mask-image:url(../../assets/images/3a04e361ddef98a22234.svg);mask-image:url(../../assets/images/3a04e361ddef98a22234.svg)}.fr-icon-success-fill:after,.fr-icon-success-fill:before{-webkit-mask-image:url(../../assets/images/ea273050d938525cf347.svg);mask-image:url(../../assets/images/ea273050d938525cf347.svg)}.fr-icon-success-line:after,.fr-icon-success-line:before{-webkit-mask-image:url(../../assets/images/f02e2116540448520acd.svg);mask-image:url(../../assets/images/f02e2116540448520acd.svg)}.fr-icon-theme-fill:after,.fr-icon-theme-fill:before{-webkit-mask-image:url(../../assets/images/612a73b3b57ae5174141.svg);mask-image:url(../../assets/images/612a73b3b57ae5174141.svg)}.fr-icon-warning-fill:after,.fr-icon-warning-fill:before{-webkit-mask-image:url(../../assets/images/dfc431c99a853d95e0bd.svg);mask-image:url(../../assets/images/dfc431c99a853d95e0bd.svg)}.fr-icon-warning-line:after,.fr-icon-warning-line:before{-webkit-mask-image:url(../../assets/images/b3edfd4eaf5c560adc97.svg);mask-image:url(../../assets/images/b3edfd4eaf5c560adc97.svg)}.fr-icon-information-fill:after,.fr-icon-information-fill:before{-webkit-mask-image:url(../../assets/images/931866409d1cdad9b511.svg);mask-image:url(../../assets/images/931866409d1cdad9b511.svg)}.fr-icon-information-line:after,.fr-icon-information-line:before{-webkit-mask-image:url(../../assets/images/3ff9e088d67455a0ce76.svg);mask-image:url(../../assets/images/3ff9e088d67455a0ce76.svg)}.fr-icon-lock-fill:after,.fr-icon-lock-fill:before{-webkit-mask-image:url(../../assets/images/589289a74a378a0bbdab.svg);mask-image:url(../../assets/images/589289a74a378a0bbdab.svg)}.fr-icon-lock-line:after,.fr-icon-lock-line:before{-webkit-mask-image:url(../../assets/images/605318391beedf4e17c2.svg);mask-image:url(../../assets/images/605318391beedf4e17c2.svg)}.fr-icon-lock-unlock-fill:after,.fr-icon-lock-unlock-fill:before{-webkit-mask-image:url(../../assets/images/a6bb78c593f87b9ba3e4.svg);mask-image:url(../../assets/images/a6bb78c593f87b9ba3e4.svg)}.fr-icon-lock-unlock-line:after,.fr-icon-lock-unlock-line:before{-webkit-mask-image:url(../../assets/images/d757fc82e2362f02b987.svg);mask-image:url(../../assets/images/d757fc82e2362f02b987.svg)}.fr-icon-logout-box-r-fill:after,.fr-icon-logout-box-r-fill:before{-webkit-mask-image:url(../../assets/images/c8f3c642b457955586dc.svg);mask-image:url(../../assets/images/c8f3c642b457955586dc.svg)}.fr-icon-logout-box-r-line:after,.fr-icon-logout-box-r-line:before{-webkit-mask-image:url(../../assets/images/6c666d2484786507012f.svg);mask-image:url(../../assets/images/6c666d2484786507012f.svg)}.fr-icon-menu-2-fill:after,.fr-icon-menu-2-fill:before{-webkit-mask-image:url(../../assets/images/22d9c6a4b29a1a830405.svg);mask-image:url(../../assets/images/22d9c6a4b29a1a830405.svg)}.fr-icon-menu-fill:after,.fr-icon-menu-fill:before{-webkit-mask-image:url(../../assets/images/439700dbbb8e1d30a7fc.svg);mask-image:url(../../assets/images/439700dbbb8e1d30a7fc.svg)}.fr-icon-more-fill:after,.fr-icon-more-fill:before{-webkit-mask-image:url(../../assets/images/ca6da8beaaddc8e5b228.svg);mask-image:url(../../assets/images/ca6da8beaaddc8e5b228.svg)}.fr-icon-more-line:after,.fr-icon-more-line:before{-webkit-mask-image:url(../../assets/images/cffbf1bb24695d6c6eb4.svg);mask-image:url(../../assets/images/cffbf1bb24695d6c6eb4.svg)}.fr-icon-notification-badge-fill:after,.fr-icon-notification-badge-fill:before{-webkit-mask-image:url(../../assets/images/33808b0b7a66a48293de.svg);mask-image:url(../../assets/images/33808b0b7a66a48293de.svg)}.fr-icon-notification-badge-line:after,.fr-icon-notification-badge-line:before{-webkit-mask-image:url(../../assets/images/c17f733daeb44d77ce3f.svg);mask-image:url(../../assets/images/c17f733daeb44d77ce3f.svg)}.fr-icon-question-fill:after,.fr-icon-question-fill:before{-webkit-mask-image:url(../../assets/images/b989bf139f7180391099.svg);mask-image:url(../../assets/images/b989bf139f7180391099.svg)}.fr-icon-question-line:after,.fr-icon-question-line:before{-webkit-mask-image:url(../../assets/images/e7bac55db823e2fff520.svg);mask-image:url(../../assets/images/e7bac55db823e2fff520.svg)}.fr-icon-refresh-fill:after,.fr-icon-refresh-fill:before{-webkit-mask-image:url(../../assets/images/a15c917199ba3a748016.svg);mask-image:url(../../assets/images/a15c917199ba3a748016.svg)}.fr-icon-refresh-line:after,.fr-icon-refresh-line:before{-webkit-mask-image:url(../../assets/images/3885959274babae97f82.svg);mask-image:url(../../assets/images/3885959274babae97f82.svg)}.fr-icon-search-fill:after,.fr-icon-search-fill:before{-webkit-mask-image:url(../../assets/images/dfb5c16c78387b75af51.svg);mask-image:url(../../assets/images/dfb5c16c78387b75af51.svg)}.fr-icon-search-line:after,.fr-icon-search-line:before{-webkit-mask-image:url(../../assets/images/cbcd275e58cc0064074d.svg);mask-image:url(../../assets/images/cbcd275e58cc0064074d.svg)}.fr-icon-settings-5-fill:after,.fr-icon-settings-5-fill:before{-webkit-mask-image:url(../../assets/images/cc88b59dee64ff1f3d21.svg);mask-image:url(../../assets/images/cc88b59dee64ff1f3d21.svg)}.fr-icon-settings-5-line:after,.fr-icon-settings-5-line:before{-webkit-mask-image:url(../../assets/images/41f5dffd441fc8ce479f.svg);mask-image:url(../../assets/images/41f5dffd441fc8ce479f.svg)}.fr-icon-shield-fill:after,.fr-icon-shield-fill:before{-webkit-mask-image:url(../../assets/images/89c99a868904af09c777.svg);mask-image:url(../../assets/images/89c99a868904af09c777.svg)}.fr-icon-shield-line:after,.fr-icon-shield-line:before{-webkit-mask-image:url(../../assets/images/1806c5ffa104f5abae39.svg);mask-image:url(../../assets/images/1806c5ffa104f5abae39.svg)}.fr-icon-star-fill:after,.fr-icon-star-fill:before{-webkit-mask-image:url(../../assets/images/7a1aa091feef6bd4f4ad.svg);mask-image:url(../../assets/images/7a1aa091feef6bd4f4ad.svg)}.fr-icon-star-line:after,.fr-icon-star-line:before{-webkit-mask-image:url(../../assets/images/0a11327d88b0550f1dbb.svg);mask-image:url(../../assets/images/0a11327d88b0550f1dbb.svg)}.fr-icon-star-s-fill:after,.fr-icon-star-s-fill:before{-webkit-mask-image:url(../../assets/images/b026a140e2cb4353a57d.svg);mask-image:url(../../assets/images/b026a140e2cb4353a57d.svg)}.fr-icon-star-s-line:after,.fr-icon-star-s-line:before{-webkit-mask-image:url(../../assets/images/c73c350b12153869c8b1.svg);mask-image:url(../../assets/images/c73c350b12153869c8b1.svg)}.fr-icon-subtract-line:after,.fr-icon-subtract-line:before{-webkit-mask-image:url(../../assets/images/8867e73b30a386373114.svg);mask-image:url(../../assets/images/8867e73b30a386373114.svg)}.fr-icon-thumb-down-fill:after,.fr-icon-thumb-down-fill:before{-webkit-mask-image:url(../../assets/images/38ace00c5be4ab09e2a9.svg);mask-image:url(../../assets/images/38ace00c5be4ab09e2a9.svg)}.fr-icon-thumb-down-line:after,.fr-icon-thumb-down-line:before{-webkit-mask-image:url(../../assets/images/9e556f5e93cc9b435fff.svg);mask-image:url(../../assets/images/9e556f5e93cc9b435fff.svg)}.fr-icon-thumb-up-fill:after,.fr-icon-thumb-up-fill:before{-webkit-mask-image:url(../../assets/images/fce579e921b1760c1c1f.svg);mask-image:url(../../assets/images/fce579e921b1760c1c1f.svg)}.fr-icon-thumb-up-line:after,.fr-icon-thumb-up-line:before{-webkit-mask-image:url(../../assets/images/ee6e9800972adbc0a2a6.svg);mask-image:url(../../assets/images/ee6e9800972adbc0a2a6.svg)}.fr-icon-time-fill:after,.fr-icon-time-fill:before{-webkit-mask-image:url(../../assets/images/7f5ffed6966a38942d89.svg);mask-image:url(../../assets/images/7f5ffed6966a38942d89.svg)}.fr-icon-time-line:after,.fr-icon-time-line:before{-webkit-mask-image:url(../../assets/images/f29cde50167b3c4ed763.svg);mask-image:url(../../assets/images/f29cde50167b3c4ed763.svg)}.fr-icon-timer-fill:after,.fr-icon-timer-fill:before{-webkit-mask-image:url(../../assets/images/ce9b5099170a6177dff4.svg);mask-image:url(../../assets/images/ce9b5099170a6177dff4.svg)}.fr-icon-timer-line:after,.fr-icon-timer-line:before{-webkit-mask-image:url(../../assets/images/cea920419b89c9f7a098.svg);mask-image:url(../../assets/images/cea920419b89c9f7a098.svg)}.fr-icon-upload-2-fill:after,.fr-icon-upload-2-fill:before{-webkit-mask-image:url(../../assets/images/d5d609277ecae21fd532.svg);mask-image:url(../../assets/images/d5d609277ecae21fd532.svg)}.fr-icon-upload-2-line:after,.fr-icon-upload-2-line:before{-webkit-mask-image:url(../../assets/images/c02a5320fa1103dff6c8.svg);mask-image:url(../../assets/images/c02a5320fa1103dff6c8.svg)}.fr-icon-upload-fill:after,.fr-icon-upload-fill:before{-webkit-mask-image:url(../../assets/images/7cbf8c4e5a800d86da97.svg);mask-image:url(../../assets/images/7cbf8c4e5a800d86da97.svg)}.fr-icon-upload-line:after,.fr-icon-upload-line:before{-webkit-mask-image:url(../../assets/images/519e78e64ab37692184c.svg);mask-image:url(../../assets/images/519e78e64ab37692184c.svg)}.fr-icon-zoom-in-fill:after,.fr-icon-zoom-in-fill:before{-webkit-mask-image:url(../../assets/images/b4f9e1f2751073e99c20.svg);mask-image:url(../../assets/images/b4f9e1f2751073e99c20.svg)}.fr-icon-zoom-in-line:after,.fr-icon-zoom-in-line:before{-webkit-mask-image:url(../../assets/images/057e6f882da74bd7c565.svg);mask-image:url(../../assets/images/057e6f882da74bd7c565.svg)}.fr-icon-zoom-out-fill:after,.fr-icon-zoom-out-fill:before{-webkit-mask-image:url(../../assets/images/b4b09f1027dfaaee51f6.svg);mask-image:url(../../assets/images/b4b09f1027dfaaee51f6.svg)}.fr-icon-zoom-out-line:after,.fr-icon-zoom-out-line:before{-webkit-mask-image:url(../../assets/images/3387116e31581cade23e.svg);mask-image:url(../../assets/images/3387116e31581cade23e.svg)}.fr-fi-add-circle-fill:after,.fr-fi-add-circle-fill:before{-webkit-mask-image:url(../../assets/images/accdc547cfa7b034b04d.svg);mask-image:url(../../assets/images/accdc547cfa7b034b04d.svg)}.fr-fi-add-circle-line:after,.fr-fi-add-circle-line:before{-webkit-mask-image:url(../../assets/images/afa9c83f00c108c1761d.svg);mask-image:url(../../assets/images/afa9c83f00c108c1761d.svg)}.fr-fi-add-line:after,.fr-fi-add-line:before{-webkit-mask-image:url(../../assets/images/04fc434400ccc52e3ffb.svg);mask-image:url(../../assets/images/04fc434400ccc52e3ffb.svg)}.fr-fi-arrow-down-line:after,.fr-fi-arrow-down-line:before{-webkit-mask-image:url(../../assets/images/40da8b2fcb2f6cd5bf93.svg);mask-image:url(../../assets/images/40da8b2fcb2f6cd5bf93.svg)}.fr-fi-arrow-down-s-line:after,.fr-fi-arrow-down-s-line:before{-webkit-mask-image:url(../../assets/images/4a86895e5ee6121af909.svg);mask-image:url(../../assets/images/4a86895e5ee6121af909.svg)}.fr-fi-arrow-go-back-fill:after,.fr-fi-arrow-go-back-fill:before{-webkit-mask-image:url(../../assets/images/3eb28dfe4648b9dd77af.svg);mask-image:url(../../assets/images/3eb28dfe4648b9dd77af.svg)}.fr-fi-arrow-go-back-line:after,.fr-fi-arrow-go-back-line:before{-webkit-mask-image:url(../../assets/images/894a7247d08f4daf0c3b.svg);mask-image:url(../../assets/images/894a7247d08f4daf0c3b.svg)}.fr-fi-arrow-left-line:after,.fr-fi-arrow-left-line:before{-webkit-mask-image:url(../../assets/images/71b4c61225222e7e32aa.svg);mask-image:url(../../assets/images/71b4c61225222e7e32aa.svg)}.fr-fi-arrow-left-s-line:after,.fr-fi-arrow-left-s-line:before{-webkit-mask-image:url(../../assets/images/dd6f55cf15bed3c3f4f8.svg);mask-image:url(../../assets/images/dd6f55cf15bed3c3f4f8.svg)}.fr-fi-arrow-right-line:after,.fr-fi-arrow-right-line:before{-webkit-mask-image:url(../../assets/images/c7e409a631c94231dfeb.svg);mask-image:url(../../assets/images/c7e409a631c94231dfeb.svg)}.fr-fi-arrow-right-s-line:after,.fr-fi-arrow-right-s-line:before{-webkit-mask-image:url(../../assets/images/f6aba782df5e024ccbbc.svg);mask-image:url(../../assets/images/f6aba782df5e024ccbbc.svg)}.fr-fi-arrow-right-up-line:after,.fr-fi-arrow-right-up-line:before{-webkit-mask-image:url(../../assets/images/81d3e93b0d1679970bb5.svg);mask-image:url(../../assets/images/81d3e93b0d1679970bb5.svg)}.fr-fi-arrow-up-fill:after,.fr-fi-arrow-up-fill:before{-webkit-mask-image:url(../../assets/images/ea925157f68495a3302c.svg);mask-image:url(../../assets/images/ea925157f68495a3302c.svg)}.fr-fi-arrow-up-line:after,.fr-fi-arrow-up-line:before{-webkit-mask-image:url(../../assets/images/4648a2eb31198cc757a8.svg);mask-image:url(../../assets/images/4648a2eb31198cc757a8.svg)}.fr-fi-arrow-up-s-line:after,.fr-fi-arrow-up-s-line:before{-webkit-mask-image:url(../../assets/images/be3a1ed8fd6c6a480611.svg);mask-image:url(../../assets/images/be3a1ed8fd6c6a480611.svg)}.fr-fi-check-line:after,.fr-fi-check-line:before{-webkit-mask-image:url(../../assets/images/b45a007d5340e85bc67c.svg);mask-image:url(../../assets/images/b45a007d5340e85bc67c.svg)}.fr-fi-checkbox-circle-line:after,.fr-fi-checkbox-circle-line:before{-webkit-mask-image:url(../../assets/images/dad78caeb7e4997451a3.svg);mask-image:url(../../assets/images/dad78caeb7e4997451a3.svg)}.fr-fi-close-line:after,.fr-fi-close-line:before{-webkit-mask-image:url(../../assets/images/69dfb9f70fe1180898d7.svg);mask-image:url(../../assets/images/69dfb9f70fe1180898d7.svg)}.fr-fi-download-line:after,.fr-fi-download-line:before{-webkit-mask-image:url(../../assets/images/dbb56e50b667ae162595.svg);mask-image:url(../../assets/images/dbb56e50b667ae162595.svg)}.fr-fi-error-warning-fill:after,.fr-fi-error-warning-fill:before{-webkit-mask-image:url(../../assets/images/7d8cb7c3c96865dbc4e7.svg);mask-image:url(../../assets/images/7d8cb7c3c96865dbc4e7.svg)}.fr-fi-error-warning-line:after,.fr-fi-error-warning-line:before{-webkit-mask-image:url(../../assets/images/0e6487e12b42ea53ab30.svg);mask-image:url(../../assets/images/0e6487e12b42ea53ab30.svg)}.fr-fi-external-link-line:after,.fr-fi-external-link-line:before{-webkit-mask-image:url(../../assets/images/5fac7fc1e919c8785620.svg);mask-image:url(../../assets/images/5fac7fc1e919c8785620.svg)}.fr-fi-eye-fill:after,.fr-fi-eye-fill:before{-webkit-mask-image:url(../../assets/images/b5abbb460152c56b95a7.svg);mask-image:url(../../assets/images/b5abbb460152c56b95a7.svg)}.fr-fi-eye-line:after,.fr-fi-eye-line:before{-webkit-mask-image:url(../../assets/images/76ca9b9754640ad96f1f.svg);mask-image:url(../../assets/images/76ca9b9754640ad96f1f.svg)}.fr-fi-eye-off-fill:after,.fr-fi-eye-off-fill:before{-webkit-mask-image:url(../../assets/images/f62b100adae167358976.svg);mask-image:url(../../assets/images/f62b100adae167358976.svg)}.fr-fi-eye-off-line:after,.fr-fi-eye-off-line:before{-webkit-mask-image:url(../../assets/images/56246d86f5b0cb71bdfb.svg);mask-image:url(../../assets/images/56246d86f5b0cb71bdfb.svg)}.fr-fi-filter-fill:after,.fr-fi-filter-fill:before{-webkit-mask-image:url(../../assets/images/c5c3ab65418580eae125.svg);mask-image:url(../../assets/images/c5c3ab65418580eae125.svg)}.fr-fi-filter-line:after,.fr-fi-filter-line:before{-webkit-mask-image:url(../../assets/images/90b486f546096b40e852.svg);mask-image:url(../../assets/images/90b486f546096b40e852.svg)}.fr-fi-arrow-left-s-first-line:after,.fr-fi-arrow-left-s-first-line:before{-webkit-mask-image:url(../../assets/images/0cdcecad9ad8958941f1.svg);mask-image:url(../../assets/images/0cdcecad9ad8958941f1.svg)}.fr-fi-arrow-left-s-line-double:after,.fr-fi-arrow-left-s-line-double:before{-webkit-mask-image:url(../../assets/images/84e100c87fe2e8458eda.svg);mask-image:url(../../assets/images/84e100c87fe2e8458eda.svg)}.fr-fi-arrow-right-s-last-line:after,.fr-fi-arrow-right-s-last-line:before{-webkit-mask-image:url(../../assets/images/6a8c4f5be92a6a9b36a8.svg);mask-image:url(../../assets/images/6a8c4f5be92a6a9b36a8.svg)}.fr-fi-arrow-right-s-line-double:after,.fr-fi-arrow-right-s-line-double:before{-webkit-mask-image:url(../../assets/images/8177350ca2baf9d0988a.svg);mask-image:url(../../assets/images/8177350ca2baf9d0988a.svg)}.fr-fi-error-fill:after,.fr-fi-error-fill:before{-webkit-mask-image:url(../../assets/images/9e33ec01f6d0a9071b3e.svg);mask-image:url(../../assets/images/9e33ec01f6d0a9071b3e.svg)}.fr-fi-error-line:after,.fr-fi-error-line:before{-webkit-mask-image:url(../../assets/images/6e610ede431f1b33fbff.svg);mask-image:url(../../assets/images/6e610ede431f1b33fbff.svg)}.fr-fi-info-fill:after,.fr-fi-info-fill:before{-webkit-mask-image:url(../../assets/images/719d870fd2ef14580ede.svg);mask-image:url(../../assets/images/719d870fd2ef14580ede.svg)}.fr-fi-info-line:after,.fr-fi-info-line:before{-webkit-mask-image:url(../../assets/images/3a04e361ddef98a22234.svg);mask-image:url(../../assets/images/3a04e361ddef98a22234.svg)}.fr-fi-success-fill:after,.fr-fi-success-fill:before{-webkit-mask-image:url(../../assets/images/ea273050d938525cf347.svg);mask-image:url(../../assets/images/ea273050d938525cf347.svg)}.fr-fi-success-line:after,.fr-fi-success-line:before{-webkit-mask-image:url(../../assets/images/f02e2116540448520acd.svg);mask-image:url(../../assets/images/f02e2116540448520acd.svg)}.fr-fi-theme-fill:after,.fr-fi-theme-fill:before{-webkit-mask-image:url(../../assets/images/612a73b3b57ae5174141.svg);mask-image:url(../../assets/images/612a73b3b57ae5174141.svg)}.fr-fi-warning-fill:after,.fr-fi-warning-fill:before{-webkit-mask-image:url(../../assets/images/dfc431c99a853d95e0bd.svg);mask-image:url(../../assets/images/dfc431c99a853d95e0bd.svg)}.fr-fi-warning-line:after,.fr-fi-warning-line:before{-webkit-mask-image:url(../../assets/images/b3edfd4eaf5c560adc97.svg);mask-image:url(../../assets/images/b3edfd4eaf5c560adc97.svg)}.fr-fi-information-fill:after,.fr-fi-information-fill:before{-webkit-mask-image:url(../../assets/images/931866409d1cdad9b511.svg);mask-image:url(../../assets/images/931866409d1cdad9b511.svg)}.fr-fi-information-line:after,.fr-fi-information-line:before{-webkit-mask-image:url(../../assets/images/3ff9e088d67455a0ce76.svg);mask-image:url(../../assets/images/3ff9e088d67455a0ce76.svg)}.fr-fi-lock-fill:after,.fr-fi-lock-fill:before{-webkit-mask-image:url(../../assets/images/589289a74a378a0bbdab.svg);mask-image:url(../../assets/images/589289a74a378a0bbdab.svg)}.fr-fi-lock-line:after,.fr-fi-lock-line:before{-webkit-mask-image:url(../../assets/images/605318391beedf4e17c2.svg);mask-image:url(../../assets/images/605318391beedf4e17c2.svg)}.fr-fi-logout-box-r-fill:after,.fr-fi-logout-box-r-fill:before{-webkit-mask-image:url(../../assets/images/c8f3c642b457955586dc.svg);mask-image:url(../../assets/images/c8f3c642b457955586dc.svg)}.fr-fi-logout-box-r-line:after,.fr-fi-logout-box-r-line:before{-webkit-mask-image:url(../../assets/images/6c666d2484786507012f.svg);mask-image:url(../../assets/images/6c666d2484786507012f.svg)}.fr-fi-menu-2-fill:after,.fr-fi-menu-2-fill:before{-webkit-mask-image:url(../../assets/images/22d9c6a4b29a1a830405.svg);mask-image:url(../../assets/images/22d9c6a4b29a1a830405.svg)}.fr-fi-menu-fill:after,.fr-fi-menu-fill:before{-webkit-mask-image:url(../../assets/images/439700dbbb8e1d30a7fc.svg);mask-image:url(../../assets/images/439700dbbb8e1d30a7fc.svg)}.fr-fi-question-fill:after,.fr-fi-question-fill:before{-webkit-mask-image:url(../../assets/images/b989bf139f7180391099.svg);mask-image:url(../../assets/images/b989bf139f7180391099.svg)}.fr-fi-question-line:after,.fr-fi-question-line:before{-webkit-mask-image:url(../../assets/images/e7bac55db823e2fff520.svg);mask-image:url(../../assets/images/e7bac55db823e2fff520.svg)}.fr-fi-refresh-fill:after,.fr-fi-refresh-fill:before{-webkit-mask-image:url(../../assets/images/a15c917199ba3a748016.svg);mask-image:url(../../assets/images/a15c917199ba3a748016.svg)}.fr-fi-refresh-line:after,.fr-fi-refresh-line:before{-webkit-mask-image:url(../../assets/images/3885959274babae97f82.svg);mask-image:url(../../assets/images/3885959274babae97f82.svg)}.fr-fi-search-fill:after,.fr-fi-search-fill:before{-webkit-mask-image:url(../../assets/images/dfb5c16c78387b75af51.svg);mask-image:url(../../assets/images/dfb5c16c78387b75af51.svg)}.fr-fi-search-line:after,.fr-fi-search-line:before{-webkit-mask-image:url(../../assets/images/cbcd275e58cc0064074d.svg);mask-image:url(../../assets/images/cbcd275e58cc0064074d.svg)}.fr-fi-subtract-line:after,.fr-fi-subtract-line:before{-webkit-mask-image:url(../../assets/images/8867e73b30a386373114.svg);mask-image:url(../../assets/images/8867e73b30a386373114.svg)}.fr-fi-timer-fill:after,.fr-fi-timer-fill:before{-webkit-mask-image:url(../../assets/images/ce9b5099170a6177dff4.svg);mask-image:url(../../assets/images/ce9b5099170a6177dff4.svg)}.fr-fi-timer-line:after,.fr-fi-timer-line:before{-webkit-mask-image:url(../../assets/images/cea920419b89c9f7a098.svg);mask-image:url(../../assets/images/cea920419b89c9f7a098.svg)}.fr-fi-upload-2-fill:after,.fr-fi-upload-2-fill:before{-webkit-mask-image:url(../../assets/images/d5d609277ecae21fd532.svg);mask-image:url(../../assets/images/d5d609277ecae21fd532.svg)}.fr-fi-upload-2-line:after,.fr-fi-upload-2-line:before{-webkit-mask-image:url(../../assets/images/c02a5320fa1103dff6c8.svg);mask-image:url(../../assets/images/c02a5320fa1103dff6c8.svg)}.fr-fi-zoom-in-fill:after,.fr-fi-zoom-in-fill:before{-webkit-mask-image:url(../../assets/images/b4f9e1f2751073e99c20.svg);mask-image:url(../../assets/images/b4f9e1f2751073e99c20.svg)}.fr-fi-zoom-in-line:after,.fr-fi-zoom-in-line:before{-webkit-mask-image:url(../../assets/images/057e6f882da74bd7c565.svg);mask-image:url(../../assets/images/057e6f882da74bd7c565.svg)}.fr-fi-zoom-out-fill:after,.fr-fi-zoom-out-fill:before{-webkit-mask-image:url(../../assets/images/b4b09f1027dfaaee51f6.svg);mask-image:url(../../assets/images/b4b09f1027dfaaee51f6.svg)}.fr-fi-zoom-out-line:after,.fr-fi-zoom-out-line:before{-webkit-mask-image:url(../../assets/images/3387116e31581cade23e.svg);mask-image:url(../../assets/images/3387116e31581cade23e.svg)}.fr-fi-delete-line:after,.fr-fi-delete-line:before{-webkit-mask-image:url(../../assets/images/230758cd18def1c1264e.svg);mask-image:url(../../assets/images/230758cd18def1c1264e.svg)}.fr-fi-delete-fill:after,.fr-fi-delete-fill:before{-webkit-mask-image:url(../../assets/images/f4daf316e4582c2bb91d.svg);mask-image:url(../../assets/images/f4daf316e4582c2bb91d.svg)}.fr-icon-delete-line:after,.fr-icon-delete-line:before{-webkit-mask-image:url(../../assets/images/230758cd18def1c1264e.svg);mask-image:url(../../assets/images/230758cd18def1c1264e.svg)}.fr-icon-delete-fill:after,.fr-icon-delete-fill:before{-webkit-mask-image:url(../../assets/images/f4daf316e4582c2bb91d.svg);mask-image:url(../../assets/images/f4daf316e4582c2bb91d.svg)}@media (min-width:36em){ @@ -405,6 +411,9 @@ /*! media lg */}@media (min-width:78em){ /*! media xl */ /*! media xl */}@media screen and (min-width:0\0) and (min-resolution:72dpi){.fr-icon-add-circle-fill:after,.fr-icon-add-circle-fill:before{background-image:url(../../assets/images/accdc547cfa7b034b04d.svg)}.fr-icon-add-circle-line:after,.fr-icon-add-circle-line:before{background-image:url(../../assets/images/afa9c83f00c108c1761d.svg)}.fr-icon-add-line:after,.fr-icon-add-line:before{background-image:url(../../assets/images/04fc434400ccc52e3ffb.svg)}.fr-icon-alarm-warning-fill:after,.fr-icon-alarm-warning-fill:before{background-image:url(../../assets/images/4f2ce7bdddb2fc202d53.svg)}.fr-icon-alarm-warning-line:after,.fr-icon-alarm-warning-line:before{background-image:url(../../assets/images/c18eec115bf8edb1cfd8.svg)}.fr-icon-alert-fill:after,.fr-icon-alert-fill:before{background-image:url(../../assets/images/78026453ed9720bc3f24.svg)}.fr-icon-alert-line:after,.fr-icon-alert-line:before{background-image:url(../../assets/images/1cff4fe3ebe1bbc8c2c8.svg)}.fr-icon-arrow-down-fill:after,.fr-icon-arrow-down-fill:before{background-image:url(../../assets/images/98ac12501cdf8a7453c0.svg)}.fr-icon-arrow-down-line:after,.fr-icon-arrow-down-line:before{background-image:url(../../assets/images/40da8b2fcb2f6cd5bf93.svg)}.fr-icon-arrow-down-s-fill:after,.fr-icon-arrow-down-s-fill:before{background-image:url(../../assets/images/6c8b4ba4adbad6aee232.svg)}.fr-icon-arrow-down-s-line:after,.fr-icon-arrow-down-s-line:before{background-image:url(../../assets/images/4a86895e5ee6121af909.svg)}.fr-icon-arrow-go-back-fill:after,.fr-icon-arrow-go-back-fill:before{background-image:url(../../assets/images/3eb28dfe4648b9dd77af.svg)}.fr-icon-arrow-go-back-line:after,.fr-icon-arrow-go-back-line:before{background-image:url(../../assets/images/894a7247d08f4daf0c3b.svg)}.fr-icon-arrow-go-forward-fill:after,.fr-icon-arrow-go-forward-fill:before{background-image:url(../../assets/images/92471c9e86589b355a95.svg)}.fr-icon-arrow-go-forward-line:after,.fr-icon-arrow-go-forward-line:before{background-image:url(../../assets/images/28f5ce47f021995d6827.svg)}.fr-icon-arrow-left-fill:after,.fr-icon-arrow-left-fill:before{background-image:url(../../assets/images/bdd20aff546fe342b364.svg)}.fr-icon-arrow-left-line:after,.fr-icon-arrow-left-line:before{background-image:url(../../assets/images/71b4c61225222e7e32aa.svg)}.fr-icon-arrow-left-s-fill:after,.fr-icon-arrow-left-s-fill:before{background-image:url(../../assets/images/82be8ff1e8d1fe0a0f6d.svg)}.fr-icon-arrow-left-s-line:after,.fr-icon-arrow-left-s-line:before{background-image:url(../../assets/images/dd6f55cf15bed3c3f4f8.svg)}.fr-icon-arrow-right-fill:after,.fr-icon-arrow-right-fill:before{background-image:url(../../assets/images/77c6641c99536c8ce7b5.svg)}.fr-icon-arrow-right-line:after,.fr-icon-arrow-right-line:before{background-image:url(../../assets/images/c7e409a631c94231dfeb.svg)}.fr-icon-arrow-right-s-fill:after,.fr-icon-arrow-right-s-fill:before{background-image:url(../../assets/images/3945c1fcb905717711da.svg)}.fr-icon-arrow-right-s-line:after,.fr-icon-arrow-right-s-line:before{background-image:url(../../assets/images/f6aba782df5e024ccbbc.svg)}.fr-icon-arrow-right-up-line:after,.fr-icon-arrow-right-up-line:before{background-image:url(../../assets/images/81d3e93b0d1679970bb5.svg)}.fr-icon-arrow-up-down-line:after,.fr-icon-arrow-up-down-line:before{background-image:url(../../assets/images/21f69e91424c407eb09a.svg)}.fr-icon-arrow-up-fill:after,.fr-icon-arrow-up-fill:before{background-image:url(../../assets/images/ea925157f68495a3302c.svg)}.fr-icon-arrow-up-line:after,.fr-icon-arrow-up-line:before{background-image:url(../../assets/images/4648a2eb31198cc757a8.svg)}.fr-icon-arrow-up-s-fill:after,.fr-icon-arrow-up-s-fill:before{background-image:url(../../assets/images/90adf7ab45a8f0b94c4c.svg)}.fr-icon-arrow-up-s-line:after,.fr-icon-arrow-up-s-line:before{background-image:url(../../assets/images/be3a1ed8fd6c6a480611.svg)}.fr-icon-check-line:after,.fr-icon-check-line:before{background-image:url(../../assets/images/b45a007d5340e85bc67c.svg)}.fr-icon-checkbox-circle-fill:after,.fr-icon-checkbox-circle-fill:before{background-image:url(../../assets/images/0e119699356f690bd361.svg)}.fr-icon-checkbox-circle-line:after,.fr-icon-checkbox-circle-line:before{background-image:url(../../assets/images/dad78caeb7e4997451a3.svg)}.fr-icon-checkbox-fill:after,.fr-icon-checkbox-fill:before{background-image:url(../../assets/images/e839a61cafeaa865799b.svg)}.fr-icon-checkbox-line:after,.fr-icon-checkbox-line:before{background-image:url(../../assets/images/8f72ea91958b52fe5a1e.svg)}.fr-icon-close-circle-fill:after,.fr-icon-close-circle-fill:before{background-image:url(../../assets/images/df903ddb6727f1ba9730.svg)}.fr-icon-close-circle-line:after,.fr-icon-close-circle-line:before{background-image:url(../../assets/images/3f4617d23baf291fb591.svg)}.fr-icon-close-line:after,.fr-icon-close-line:before{background-image:url(../../assets/images/69dfb9f70fe1180898d7.svg)}.fr-icon-delete-bin-fill:after,.fr-icon-delete-bin-fill:before{background-image:url(../../assets/images/f4daf316e4582c2bb91d.svg)}.fr-icon-delete-bin-line:after,.fr-icon-delete-bin-line:before{background-image:url(../../assets/images/230758cd18def1c1264e.svg)}.fr-icon-download-fill:after,.fr-icon-download-fill:before{background-image:url(../../assets/images/138e2a3cece1a3cd8b5b.svg)}.fr-icon-download-line:after,.fr-icon-download-line:before{background-image:url(../../assets/images/dbb56e50b667ae162595.svg)}.fr-icon-error-warning-fill:after,.fr-icon-error-warning-fill:before{background-image:url(../../assets/images/7d8cb7c3c96865dbc4e7.svg)}.fr-icon-error-warning-line:after,.fr-icon-error-warning-line:before{background-image:url(../../assets/images/0e6487e12b42ea53ab30.svg)}.fr-icon-external-link-fill:after,.fr-icon-external-link-fill:before{background-image:url(../../assets/images/d65ab4b95a6162aa9693.svg)}.fr-icon-external-link-line:after,.fr-icon-external-link-line:before{background-image:url(../../assets/images/5fac7fc1e919c8785620.svg)}.fr-icon-eye-fill:after,.fr-icon-eye-fill:before{background-image:url(../../assets/images/b5abbb460152c56b95a7.svg)}.fr-icon-eye-line:after,.fr-icon-eye-line:before{background-image:url(../../assets/images/76ca9b9754640ad96f1f.svg)}.fr-icon-eye-off-fill:after,.fr-icon-eye-off-fill:before{background-image:url(../../assets/images/f62b100adae167358976.svg)}.fr-icon-eye-off-line:after,.fr-icon-eye-off-line:before{background-image:url(../../assets/images/56246d86f5b0cb71bdfb.svg)}.fr-icon-filter-fill:after,.fr-icon-filter-fill:before{background-image:url(../../assets/images/c5c3ab65418580eae125.svg)}.fr-icon-filter-line:after,.fr-icon-filter-line:before{background-image:url(../../assets/images/90b486f546096b40e852.svg)}.fr-icon-alert-warning-2-fill:after,.fr-icon-alert-warning-2-fill:before{background-image:url(../../assets/images/6833270903716b30531e.svg)}.fr-icon-alert-warning-fill:after,.fr-icon-alert-warning-fill:before{background-image:url(../../assets/images/63877971464a91a39805.svg)}.fr-icon-arrow-left-s-first-line:after,.fr-icon-arrow-left-s-first-line:before{background-image:url(../../assets/images/0cdcecad9ad8958941f1.svg)}.fr-icon-arrow-left-s-line-double:after,.fr-icon-arrow-left-s-line-double:before{background-image:url(../../assets/images/84e100c87fe2e8458eda.svg)}.fr-icon-arrow-right-down-circle-fill:after,.fr-icon-arrow-right-down-circle-fill:before{background-image:url(../../assets/images/0ef5119ffdc80907129e.svg)}.fr-icon-arrow-right-s-last-line:after,.fr-icon-arrow-right-s-last-line:before{background-image:url(../../assets/images/6a8c4f5be92a6a9b36a8.svg)}.fr-icon-arrow-right-s-line-double:after,.fr-icon-arrow-right-s-line-double:before{background-image:url(../../assets/images/8177350ca2baf9d0988a.svg)}.fr-icon-arrow-right-up-circle-fill:after,.fr-icon-arrow-right-up-circle-fill:before{background-image:url(../../assets/images/11c809fc8894c3952778.svg)}.fr-icon-capslock-line:after,.fr-icon-capslock-line:before{background-image:url(../../assets/images/a51a93eb3fe93a5d4df6.svg)}.fr-icon-equal-circle-fill:after,.fr-icon-equal-circle-fill:before{background-image:url(../../assets/images/96edc078a03d0be58738.svg)}.fr-icon-error-fill:after,.fr-icon-error-fill:before{background-image:url(../../assets/images/9e33ec01f6d0a9071b3e.svg)}.fr-icon-error-line:after,.fr-icon-error-line:before{background-image:url(../../assets/images/6e610ede431f1b33fbff.svg)}.fr-icon-info-fill:after,.fr-icon-info-fill:before{background-image:url(../../assets/images/719d870fd2ef14580ede.svg)}.fr-icon-info-line:after,.fr-icon-info-line:before{background-image:url(../../assets/images/3a04e361ddef98a22234.svg)}.fr-icon-success-fill:after,.fr-icon-success-fill:before{background-image:url(../../assets/images/ea273050d938525cf347.svg)}.fr-icon-success-line:after,.fr-icon-success-line:before{background-image:url(../../assets/images/f02e2116540448520acd.svg)}.fr-icon-theme-fill:after,.fr-icon-theme-fill:before{background-image:url(../../assets/images/612a73b3b57ae5174141.svg)}.fr-icon-warning-fill:after,.fr-icon-warning-fill:before{background-image:url(../../assets/images/dfc431c99a853d95e0bd.svg)}.fr-icon-warning-line:after,.fr-icon-warning-line:before{background-image:url(../../assets/images/b3edfd4eaf5c560adc97.svg)}.fr-icon-information-fill:after,.fr-icon-information-fill:before{background-image:url(../../assets/images/931866409d1cdad9b511.svg)}.fr-icon-information-line:after,.fr-icon-information-line:before{background-image:url(../../assets/images/3ff9e088d67455a0ce76.svg)}.fr-icon-lock-fill:after,.fr-icon-lock-fill:before{background-image:url(../../assets/images/589289a74a378a0bbdab.svg)}.fr-icon-lock-line:after,.fr-icon-lock-line:before{background-image:url(../../assets/images/605318391beedf4e17c2.svg)}.fr-icon-lock-unlock-fill:after,.fr-icon-lock-unlock-fill:before{background-image:url(../../assets/images/a6bb78c593f87b9ba3e4.svg)}.fr-icon-lock-unlock-line:after,.fr-icon-lock-unlock-line:before{background-image:url(../../assets/images/d757fc82e2362f02b987.svg)}.fr-icon-logout-box-r-fill:after,.fr-icon-logout-box-r-fill:before{background-image:url(../../assets/images/c8f3c642b457955586dc.svg)}.fr-icon-logout-box-r-line:after,.fr-icon-logout-box-r-line:before{background-image:url(../../assets/images/6c666d2484786507012f.svg)}.fr-icon-menu-2-fill:after,.fr-icon-menu-2-fill:before{background-image:url(../../assets/images/22d9c6a4b29a1a830405.svg)}.fr-icon-menu-fill:after,.fr-icon-menu-fill:before{background-image:url(../../assets/images/439700dbbb8e1d30a7fc.svg)}.fr-icon-more-fill:after,.fr-icon-more-fill:before{background-image:url(../../assets/images/ca6da8beaaddc8e5b228.svg)}.fr-icon-more-line:after,.fr-icon-more-line:before{background-image:url(../../assets/images/cffbf1bb24695d6c6eb4.svg)}.fr-icon-notification-badge-fill:after,.fr-icon-notification-badge-fill:before{background-image:url(../../assets/images/33808b0b7a66a48293de.svg)}.fr-icon-notification-badge-line:after,.fr-icon-notification-badge-line:before{background-image:url(../../assets/images/c17f733daeb44d77ce3f.svg)}.fr-icon-question-fill:after,.fr-icon-question-fill:before{background-image:url(../../assets/images/b989bf139f7180391099.svg)}.fr-icon-question-line:after,.fr-icon-question-line:before{background-image:url(../../assets/images/e7bac55db823e2fff520.svg)}.fr-icon-refresh-fill:after,.fr-icon-refresh-fill:before{background-image:url(../../assets/images/a15c917199ba3a748016.svg)}.fr-icon-refresh-line:after,.fr-icon-refresh-line:before{background-image:url(../../assets/images/3885959274babae97f82.svg)}.fr-icon-search-fill:after,.fr-icon-search-fill:before{background-image:url(../../assets/images/dfb5c16c78387b75af51.svg)}.fr-icon-search-line:after,.fr-icon-search-line:before{background-image:url(../../assets/images/cbcd275e58cc0064074d.svg)}.fr-icon-settings-5-fill:after,.fr-icon-settings-5-fill:before{background-image:url(../../assets/images/cc88b59dee64ff1f3d21.svg)}.fr-icon-settings-5-line:after,.fr-icon-settings-5-line:before{background-image:url(../../assets/images/41f5dffd441fc8ce479f.svg)}.fr-icon-shield-fill:after,.fr-icon-shield-fill:before{background-image:url(../../assets/images/89c99a868904af09c777.svg)}.fr-icon-shield-line:after,.fr-icon-shield-line:before{background-image:url(../../assets/images/1806c5ffa104f5abae39.svg)}.fr-icon-star-fill:after,.fr-icon-star-fill:before{background-image:url(../../assets/images/7a1aa091feef6bd4f4ad.svg)}.fr-icon-star-line:after,.fr-icon-star-line:before{background-image:url(../../assets/images/0a11327d88b0550f1dbb.svg)}.fr-icon-star-s-fill:after,.fr-icon-star-s-fill:before{background-image:url(../../assets/images/b026a140e2cb4353a57d.svg)}.fr-icon-star-s-line:after,.fr-icon-star-s-line:before{background-image:url(../../assets/images/c73c350b12153869c8b1.svg)}.fr-icon-subtract-line:after,.fr-icon-subtract-line:before{background-image:url(../../assets/images/8867e73b30a386373114.svg)}.fr-icon-thumb-down-fill:after,.fr-icon-thumb-down-fill:before{background-image:url(../../assets/images/38ace00c5be4ab09e2a9.svg)}.fr-icon-thumb-down-line:after,.fr-icon-thumb-down-line:before{background-image:url(../../assets/images/9e556f5e93cc9b435fff.svg)}.fr-icon-thumb-up-fill:after,.fr-icon-thumb-up-fill:before{background-image:url(../../assets/images/fce579e921b1760c1c1f.svg)}.fr-icon-thumb-up-line:after,.fr-icon-thumb-up-line:before{background-image:url(../../assets/images/ee6e9800972adbc0a2a6.svg)}.fr-icon-time-fill:after,.fr-icon-time-fill:before{background-image:url(../../assets/images/7f5ffed6966a38942d89.svg)}.fr-icon-time-line:after,.fr-icon-time-line:before{background-image:url(../../assets/images/f29cde50167b3c4ed763.svg)}.fr-icon-timer-fill:after,.fr-icon-timer-fill:before{background-image:url(../../assets/images/ce9b5099170a6177dff4.svg)}.fr-icon-timer-line:after,.fr-icon-timer-line:before{background-image:url(../../assets/images/cea920419b89c9f7a098.svg)}.fr-icon-upload-2-fill:after,.fr-icon-upload-2-fill:before{background-image:url(../../assets/images/d5d609277ecae21fd532.svg)}.fr-icon-upload-2-line:after,.fr-icon-upload-2-line:before{background-image:url(../../assets/images/c02a5320fa1103dff6c8.svg)}.fr-icon-upload-fill:after,.fr-icon-upload-fill:before{background-image:url(../../assets/images/7cbf8c4e5a800d86da97.svg)}.fr-icon-upload-line:after,.fr-icon-upload-line:before{background-image:url(../../assets/images/519e78e64ab37692184c.svg)}.fr-icon-zoom-in-fill:after,.fr-icon-zoom-in-fill:before{background-image:url(../../assets/images/b4f9e1f2751073e99c20.svg)}.fr-icon-zoom-in-line:after,.fr-icon-zoom-in-line:before{background-image:url(../../assets/images/057e6f882da74bd7c565.svg)}.fr-icon-zoom-out-fill:after,.fr-icon-zoom-out-fill:before{background-image:url(../../assets/images/b4b09f1027dfaaee51f6.svg)}.fr-icon-zoom-out-line:after,.fr-icon-zoom-out-line:before{background-image:url(../../assets/images/3387116e31581cade23e.svg)}.fr-fi-add-circle-fill:before{background-image:url(../../assets/images/accdc547cfa7b034b04d.svg)}.fr-fi-add-circle-line:before{background-image:url(../../assets/images/afa9c83f00c108c1761d.svg)}.fr-fi-add-line:before{background-image:url(../../assets/images/04fc434400ccc52e3ffb.svg)}.fr-fi-arrow-down-line:before{background-image:url(../../assets/images/40da8b2fcb2f6cd5bf93.svg)}.fr-fi-arrow-down-s-line:before{background-image:url(../../assets/images/4a86895e5ee6121af909.svg)}.fr-fi-arrow-go-back-fill:before{background-image:url(../../assets/images/3eb28dfe4648b9dd77af.svg)}.fr-fi-arrow-go-back-line:before{background-image:url(../../assets/images/894a7247d08f4daf0c3b.svg)}.fr-fi-arrow-left-line:before{background-image:url(../../assets/images/71b4c61225222e7e32aa.svg)}.fr-fi-arrow-left-s-line:before{background-image:url(../../assets/images/dd6f55cf15bed3c3f4f8.svg)}.fr-fi-arrow-right-line:before{background-image:url(../../assets/images/c7e409a631c94231dfeb.svg)}.fr-fi-arrow-right-s-line:before{background-image:url(../../assets/images/f6aba782df5e024ccbbc.svg)}.fr-fi-arrow-right-up-line:before{background-image:url(../../assets/images/81d3e93b0d1679970bb5.svg)}.fr-fi-arrow-up-fill:before{background-image:url(../../assets/images/ea925157f68495a3302c.svg)}.fr-fi-arrow-up-line:before{background-image:url(../../assets/images/4648a2eb31198cc757a8.svg)}.fr-fi-arrow-up-s-line:before{background-image:url(../../assets/images/be3a1ed8fd6c6a480611.svg)}.fr-fi-check-line:before{background-image:url(../../assets/images/b45a007d5340e85bc67c.svg)}.fr-fi-checkbox-circle-line:before{background-image:url(../../assets/images/dad78caeb7e4997451a3.svg)}.fr-fi-close-line:before{background-image:url(../../assets/images/69dfb9f70fe1180898d7.svg)}.fr-fi-download-line:before{background-image:url(../../assets/images/dbb56e50b667ae162595.svg)}.fr-fi-error-warning-fill:before{background-image:url(../../assets/images/7d8cb7c3c96865dbc4e7.svg)}.fr-fi-error-warning-line:before{background-image:url(../../assets/images/0e6487e12b42ea53ab30.svg)}.fr-fi-external-link-line:before{background-image:url(../../assets/images/5fac7fc1e919c8785620.svg)}.fr-fi-eye-fill:before{background-image:url(../../assets/images/b5abbb460152c56b95a7.svg)}.fr-fi-eye-line:before{background-image:url(../../assets/images/76ca9b9754640ad96f1f.svg)}.fr-fi-eye-off-fill:before{background-image:url(../../assets/images/f62b100adae167358976.svg)}.fr-fi-eye-off-line:before{background-image:url(../../assets/images/56246d86f5b0cb71bdfb.svg)}.fr-fi-filter-fill:before{background-image:url(../../assets/images/c5c3ab65418580eae125.svg)}.fr-fi-filter-line:before{background-image:url(../../assets/images/90b486f546096b40e852.svg)}.fr-fi-arrow-left-s-first-line:before{background-image:url(../../assets/images/0cdcecad9ad8958941f1.svg)}.fr-fi-arrow-left-s-line-double:before{background-image:url(../../assets/images/84e100c87fe2e8458eda.svg)}.fr-fi-arrow-right-s-last-line:before{background-image:url(../../assets/images/6a8c4f5be92a6a9b36a8.svg)}.fr-fi-arrow-right-s-line-double:before{background-image:url(../../assets/images/8177350ca2baf9d0988a.svg)}.fr-fi-error-fill:before{background-image:url(../../assets/images/9e33ec01f6d0a9071b3e.svg)}.fr-fi-error-line:before{background-image:url(../../assets/images/6e610ede431f1b33fbff.svg)}.fr-fi-info-fill:before{background-image:url(../../assets/images/719d870fd2ef14580ede.svg)}.fr-fi-info-line:before{background-image:url(../../assets/images/3a04e361ddef98a22234.svg)}.fr-fi-success-fill:before{background-image:url(../../assets/images/ea273050d938525cf347.svg)}.fr-fi-success-line:before{background-image:url(../../assets/images/f02e2116540448520acd.svg)}.fr-fi-theme-fill:before{background-image:url(../../assets/images/612a73b3b57ae5174141.svg)}.fr-fi-warning-fill:before{background-image:url(../../assets/images/dfc431c99a853d95e0bd.svg)}.fr-fi-warning-line:before{background-image:url(../../assets/images/b3edfd4eaf5c560adc97.svg)}.fr-fi-information-fill:before{background-image:url(../../assets/images/931866409d1cdad9b511.svg)}.fr-fi-information-line:before{background-image:url(../../assets/images/3ff9e088d67455a0ce76.svg)}.fr-fi-lock-fill:before{background-image:url(../../assets/images/589289a74a378a0bbdab.svg)}.fr-fi-lock-line:before{background-image:url(../../assets/images/605318391beedf4e17c2.svg)}.fr-fi-logout-box-r-fill:before{background-image:url(../../assets/images/c8f3c642b457955586dc.svg)}.fr-fi-logout-box-r-line:before{background-image:url(../../assets/images/6c666d2484786507012f.svg)}.fr-fi-menu-2-fill:before{background-image:url(../../assets/images/22d9c6a4b29a1a830405.svg)}.fr-fi-menu-fill:before{background-image:url(../../assets/images/439700dbbb8e1d30a7fc.svg)}.fr-fi-question-fill:before{background-image:url(../../assets/images/b989bf139f7180391099.svg)}.fr-fi-question-line:before{background-image:url(../../assets/images/e7bac55db823e2fff520.svg)}.fr-fi-refresh-fill:before{background-image:url(../../assets/images/a15c917199ba3a748016.svg)}.fr-fi-refresh-line:before{background-image:url(../../assets/images/3885959274babae97f82.svg)}.fr-fi-search-fill:before{background-image:url(../../assets/images/dfb5c16c78387b75af51.svg)}.fr-fi-search-line:before{background-image:url(../../assets/images/cbcd275e58cc0064074d.svg)}.fr-fi-subtract-line:before{background-image:url(../../assets/images/8867e73b30a386373114.svg)}.fr-fi-timer-fill:before{background-image:url(../../assets/images/ce9b5099170a6177dff4.svg)}.fr-fi-timer-line:before{background-image:url(../../assets/images/cea920419b89c9f7a098.svg)}.fr-fi-upload-2-fill:before{background-image:url(../../assets/images/d5d609277ecae21fd532.svg)}.fr-fi-upload-2-line:before{background-image:url(../../assets/images/c02a5320fa1103dff6c8.svg)}.fr-fi-zoom-in-fill:before{background-image:url(../../assets/images/b4f9e1f2751073e99c20.svg)}.fr-fi-zoom-in-line:before{background-image:url(../../assets/images/057e6f882da74bd7c565.svg)}.fr-fi-zoom-out-fill:before{background-image:url(../../assets/images/b4b09f1027dfaaee51f6.svg)}.fr-fi-zoom-out-line:before{background-image:url(../../assets/images/3387116e31581cade23e.svg)}.fr-fi-delete-line:after,.fr-fi-delete-line:before{background-image:url(../../assets/images/230758cd18def1c1264e.svg)}.fr-fi-delete-fill:after,.fr-fi-delete-fill:before{background-image:url(../../assets/images/f4daf316e4582c2bb91d.svg)}.fr-icon-delete-line:after,.fr-icon-delete-line:before{background-image:url(../../assets/images/230758cd18def1c1264e.svg)}.fr-icon-delete-fill:after,.fr-icon-delete-fill:before{background-image:url(../../assets/images/f4daf316e4582c2bb91d.svg)}} +/*!**********************************************************************************************************************************!*\ + !*** css ./node_modules/css-loader/dist/cjs.js!./node_modules/@gouvfr/dsfr/dist/utility/icons/icons-design/icons-design.min.css ***! + \**********************************************************************************************************************************/ /*! * DSFR v1.12.1 | SPDX-License-Identifier: MIT | License-Filename: LICENSE.md | restricted use (see terms and conditions) */.fr-icon-ball-pen-fill:after,.fr-icon-ball-pen-fill:before{-webkit-mask-image:url(../../assets/images/126c4c0b9158560d0567.svg);mask-image:url(../../assets/images/126c4c0b9158560d0567.svg)}.fr-icon-ball-pen-line:after,.fr-icon-ball-pen-line:before{-webkit-mask-image:url(../../assets/images/0438c061cf3f09aeee60.svg);mask-image:url(../../assets/images/0438c061cf3f09aeee60.svg)}.fr-icon-brush-3-fill:after,.fr-icon-brush-3-fill:before{-webkit-mask-image:url(../../assets/images/0fd0df898cb08b32aacc.svg);mask-image:url(../../assets/images/0fd0df898cb08b32aacc.svg)}.fr-icon-brush-3-line:after,.fr-icon-brush-3-line:before{-webkit-mask-image:url(../../assets/images/47a9453d201303ba421d.svg);mask-image:url(../../assets/images/47a9453d201303ba421d.svg)}.fr-icon-brush-fill:after,.fr-icon-brush-fill:before{-webkit-mask-image:url(../../assets/images/cc241525b35d3abfb912.svg);mask-image:url(../../assets/images/cc241525b35d3abfb912.svg)}.fr-icon-brush-line:after,.fr-icon-brush-line:before{-webkit-mask-image:url(../../assets/images/8e9105d84150f3fd24f9.svg);mask-image:url(../../assets/images/8e9105d84150f3fd24f9.svg)}.fr-icon-contrast-fill:after,.fr-icon-contrast-fill:before{-webkit-mask-image:url(../../assets/images/8758a7f23f4d3bfc9f23.svg);mask-image:url(../../assets/images/8758a7f23f4d3bfc9f23.svg)}.fr-icon-contrast-line:after,.fr-icon-contrast-line:before{-webkit-mask-image:url(../../assets/images/d34f14d06022f9f1427b.svg);mask-image:url(../../assets/images/d34f14d06022f9f1427b.svg)}.fr-icon-crop-fill:after,.fr-icon-crop-fill:before{-webkit-mask-image:url(../../assets/images/681db73b54946da4dc16.svg);mask-image:url(../../assets/images/681db73b54946da4dc16.svg)}.fr-icon-crop-line:after,.fr-icon-crop-line:before{-webkit-mask-image:url(../../assets/images/b8787666077919614439.svg);mask-image:url(../../assets/images/b8787666077919614439.svg)}.fr-icon-drag-move-2-fill:after,.fr-icon-drag-move-2-fill:before{-webkit-mask-image:url(../../assets/images/238629f7adb27fa15b15.svg);mask-image:url(../../assets/images/238629f7adb27fa15b15.svg)}.fr-icon-drag-move-2-line:after,.fr-icon-drag-move-2-line:before{-webkit-mask-image:url(../../assets/images/df0f09b2515169592b13.svg);mask-image:url(../../assets/images/df0f09b2515169592b13.svg)}.fr-icon-drop-fill:after,.fr-icon-drop-fill:before{-webkit-mask-image:url(../../assets/images/6e7be583efc2a771ae3b.svg);mask-image:url(../../assets/images/6e7be583efc2a771ae3b.svg)}.fr-icon-drop-line:after,.fr-icon-drop-line:before{-webkit-mask-image:url(../../assets/images/1dc0ca2e512259718062.svg);mask-image:url(../../assets/images/1dc0ca2e512259718062.svg)}.fr-icon-edit-box-fill:after,.fr-icon-edit-box-fill:before{-webkit-mask-image:url(../../assets/images/5824340d8a88f42dde97.svg);mask-image:url(../../assets/images/5824340d8a88f42dde97.svg)}.fr-icon-edit-box-line:after,.fr-icon-edit-box-line:before{-webkit-mask-image:url(../../assets/images/b6ed50e0d2143245664d.svg);mask-image:url(../../assets/images/b6ed50e0d2143245664d.svg)}.fr-icon-edit-fill:after,.fr-icon-edit-fill:before{-webkit-mask-image:url(../../assets/images/4d43b9070f3d9153a7c8.svg);mask-image:url(../../assets/images/4d43b9070f3d9153a7c8.svg)}.fr-icon-edit-line:after,.fr-icon-edit-line:before{-webkit-mask-image:url(../../assets/images/cf190b7a5eebc54e3c69.svg);mask-image:url(../../assets/images/cf190b7a5eebc54e3c69.svg)}.fr-icon-ink-bottle-fill:after,.fr-icon-ink-bottle-fill:before{-webkit-mask-image:url(../../assets/images/f5a4195c3286c2fbdfb8.svg);mask-image:url(../../assets/images/f5a4195c3286c2fbdfb8.svg)}.fr-icon-ink-bottle-line:after,.fr-icon-ink-bottle-line:before{-webkit-mask-image:url(../../assets/images/a89c9e5160e232adce94.svg);mask-image:url(../../assets/images/a89c9e5160e232adce94.svg)}.fr-icon-layout-grid-fill:after,.fr-icon-layout-grid-fill:before{-webkit-mask-image:url(../../assets/images/866ff0ecb70bcf7e2dba.svg);mask-image:url(../../assets/images/866ff0ecb70bcf7e2dba.svg)}.fr-icon-layout-grid-line:after,.fr-icon-layout-grid-line:before{-webkit-mask-image:url(../../assets/images/3f7a7b1c35f605f6d256.svg);mask-image:url(../../assets/images/3f7a7b1c35f605f6d256.svg)}.fr-icon-mark-pen-fill:after,.fr-icon-mark-pen-fill:before{-webkit-mask-image:url(../../assets/images/499529d67dd85a0ced77.svg);mask-image:url(../../assets/images/499529d67dd85a0ced77.svg)}.fr-icon-mark-pen-line:after,.fr-icon-mark-pen-line:before{-webkit-mask-image:url(../../assets/images/4d44315a04596f6e55af.svg);mask-image:url(../../assets/images/4d44315a04596f6e55af.svg)}.fr-icon-paint-brush-fill:after,.fr-icon-paint-brush-fill:before{-webkit-mask-image:url(../../assets/images/6e23bbdce8eb37b36aa3.svg);mask-image:url(../../assets/images/6e23bbdce8eb37b36aa3.svg)}.fr-icon-paint-brush-line:after,.fr-icon-paint-brush-line:before{-webkit-mask-image:url(../../assets/images/9afe858e0f49c163cd00.svg);mask-image:url(../../assets/images/9afe858e0f49c163cd00.svg)}.fr-icon-paint-fill:after,.fr-icon-paint-fill:before{-webkit-mask-image:url(../../assets/images/03c3fa2a2a36b53d913b.svg);mask-image:url(../../assets/images/03c3fa2a2a36b53d913b.svg)}.fr-icon-paint-line:after,.fr-icon-paint-line:before{-webkit-mask-image:url(../../assets/images/dfed36ac96b00a86b243.svg);mask-image:url(../../assets/images/dfed36ac96b00a86b243.svg)}.fr-icon-palette-fill:after,.fr-icon-palette-fill:before{-webkit-mask-image:url(../../assets/images/6c004ad59b6c9394b899.svg);mask-image:url(../../assets/images/6c004ad59b6c9394b899.svg)}.fr-icon-palette-line:after,.fr-icon-palette-line:before{-webkit-mask-image:url(../../assets/images/06c14305639de6969e6c.svg);mask-image:url(../../assets/images/06c14305639de6969e6c.svg)}.fr-icon-pantone-fill:after,.fr-icon-pantone-fill:before{-webkit-mask-image:url(../../assets/images/32f0d56f909a1f80cb2d.svg);mask-image:url(../../assets/images/32f0d56f909a1f80cb2d.svg)}.fr-icon-pantone-line:after,.fr-icon-pantone-line:before{-webkit-mask-image:url(../../assets/images/6207d2ad7f7b23c6cbd5.svg);mask-image:url(../../assets/images/6207d2ad7f7b23c6cbd5.svg)}.fr-icon-pen-nib-fill:after,.fr-icon-pen-nib-fill:before{-webkit-mask-image:url(../../assets/images/6deab5b0ad93325eff2d.svg);mask-image:url(../../assets/images/6deab5b0ad93325eff2d.svg)}.fr-icon-pen-nib-line:after,.fr-icon-pen-nib-line:before{-webkit-mask-image:url(../../assets/images/fa3183a875b9ceb99dfd.svg);mask-image:url(../../assets/images/fa3183a875b9ceb99dfd.svg)}.fr-icon-pencil-fill:after,.fr-icon-pencil-fill:before{-webkit-mask-image:url(../../assets/images/56d28ecba2661011c333.svg);mask-image:url(../../assets/images/56d28ecba2661011c333.svg)}.fr-icon-pencil-line:after,.fr-icon-pencil-line:before{-webkit-mask-image:url(../../assets/images/30e44db5d06f613b58b6.svg);mask-image:url(../../assets/images/30e44db5d06f613b58b6.svg)}.fr-icon-pencil-ruler-fill:after,.fr-icon-pencil-ruler-fill:before{-webkit-mask-image:url(../../assets/images/fc7240f86c249734ae0d.svg);mask-image:url(../../assets/images/fc7240f86c249734ae0d.svg)}.fr-icon-pencil-ruler-line:after,.fr-icon-pencil-ruler-line:before{-webkit-mask-image:url(../../assets/images/322a97b5212c9556158a.svg);mask-image:url(../../assets/images/322a97b5212c9556158a.svg)}.fr-icon-shapes-fill:after,.fr-icon-shapes-fill:before{-webkit-mask-image:url(../../assets/images/aa1b814e5a60300830f1.svg);mask-image:url(../../assets/images/aa1b814e5a60300830f1.svg)}.fr-icon-shapes-line:after,.fr-icon-shapes-line:before{-webkit-mask-image:url(../../assets/images/dfa01accd81eae769e7a.svg);mask-image:url(../../assets/images/dfa01accd81eae769e7a.svg)}.fr-icon-sip-fill:after,.fr-icon-sip-fill:before{-webkit-mask-image:url(../../assets/images/72bc942addee3a75ab4a.svg);mask-image:url(../../assets/images/72bc942addee3a75ab4a.svg)}.fr-icon-sip-line:after,.fr-icon-sip-line:before{-webkit-mask-image:url(../../assets/images/8207524b80b222cc639a.svg);mask-image:url(../../assets/images/8207524b80b222cc639a.svg)}.fr-icon-table-fill:after,.fr-icon-table-fill:before{-webkit-mask-image:url(../../assets/images/01f6009448da4309842d.svg);mask-image:url(../../assets/images/01f6009448da4309842d.svg)}.fr-icon-table-line:after,.fr-icon-table-line:before{-webkit-mask-image:url(../../assets/images/b4fb8b6118eab9766c39.svg);mask-image:url(../../assets/images/b4fb8b6118eab9766c39.svg)}.fr-fi-edit-fill:after,.fr-fi-edit-fill:before{-webkit-mask-image:url(../../assets/images/4d43b9070f3d9153a7c8.svg);mask-image:url(../../assets/images/4d43b9070f3d9153a7c8.svg)}.fr-fi-edit-line:after,.fr-fi-edit-line:before{-webkit-mask-image:url(../../assets/images/cf190b7a5eebc54e3c69.svg);mask-image:url(../../assets/images/cf190b7a5eebc54e3c69.svg)}@media (min-width:36em){ @@ -416,6 +425,9 @@ /*! media lg */}@media (min-width:78em){ /*! media xl */ /*! media xl */}@media screen and (min-width:0\0) and (min-resolution:72dpi){.fr-icon-ball-pen-fill:after,.fr-icon-ball-pen-fill:before{background-image:url(../../assets/images/126c4c0b9158560d0567.svg)}.fr-icon-ball-pen-line:after,.fr-icon-ball-pen-line:before{background-image:url(../../assets/images/0438c061cf3f09aeee60.svg)}.fr-icon-brush-3-fill:after,.fr-icon-brush-3-fill:before{background-image:url(../../assets/images/0fd0df898cb08b32aacc.svg)}.fr-icon-brush-3-line:after,.fr-icon-brush-3-line:before{background-image:url(../../assets/images/47a9453d201303ba421d.svg)}.fr-icon-brush-fill:after,.fr-icon-brush-fill:before{background-image:url(../../assets/images/cc241525b35d3abfb912.svg)}.fr-icon-brush-line:after,.fr-icon-brush-line:before{background-image:url(../../assets/images/8e9105d84150f3fd24f9.svg)}.fr-icon-contrast-fill:after,.fr-icon-contrast-fill:before{background-image:url(../../assets/images/8758a7f23f4d3bfc9f23.svg)}.fr-icon-contrast-line:after,.fr-icon-contrast-line:before{background-image:url(../../assets/images/d34f14d06022f9f1427b.svg)}.fr-icon-crop-fill:after,.fr-icon-crop-fill:before{background-image:url(../../assets/images/681db73b54946da4dc16.svg)}.fr-icon-crop-line:after,.fr-icon-crop-line:before{background-image:url(../../assets/images/b8787666077919614439.svg)}.fr-icon-drag-move-2-fill:after,.fr-icon-drag-move-2-fill:before{background-image:url(../../assets/images/238629f7adb27fa15b15.svg)}.fr-icon-drag-move-2-line:after,.fr-icon-drag-move-2-line:before{background-image:url(../../assets/images/df0f09b2515169592b13.svg)}.fr-icon-drop-fill:after,.fr-icon-drop-fill:before{background-image:url(../../assets/images/6e7be583efc2a771ae3b.svg)}.fr-icon-drop-line:after,.fr-icon-drop-line:before{background-image:url(../../assets/images/1dc0ca2e512259718062.svg)}.fr-icon-edit-box-fill:after,.fr-icon-edit-box-fill:before{background-image:url(../../assets/images/5824340d8a88f42dde97.svg)}.fr-icon-edit-box-line:after,.fr-icon-edit-box-line:before{background-image:url(../../assets/images/b6ed50e0d2143245664d.svg)}.fr-icon-edit-fill:after,.fr-icon-edit-fill:before{background-image:url(../../assets/images/4d43b9070f3d9153a7c8.svg)}.fr-icon-edit-line:after,.fr-icon-edit-line:before{background-image:url(../../assets/images/cf190b7a5eebc54e3c69.svg)}.fr-icon-ink-bottle-fill:after,.fr-icon-ink-bottle-fill:before{background-image:url(../../assets/images/f5a4195c3286c2fbdfb8.svg)}.fr-icon-ink-bottle-line:after,.fr-icon-ink-bottle-line:before{background-image:url(../../assets/images/a89c9e5160e232adce94.svg)}.fr-icon-layout-grid-fill:after,.fr-icon-layout-grid-fill:before{background-image:url(../../assets/images/866ff0ecb70bcf7e2dba.svg)}.fr-icon-layout-grid-line:after,.fr-icon-layout-grid-line:before{background-image:url(../../assets/images/3f7a7b1c35f605f6d256.svg)}.fr-icon-mark-pen-fill:after,.fr-icon-mark-pen-fill:before{background-image:url(../../assets/images/499529d67dd85a0ced77.svg)}.fr-icon-mark-pen-line:after,.fr-icon-mark-pen-line:before{background-image:url(../../assets/images/4d44315a04596f6e55af.svg)}.fr-icon-paint-brush-fill:after,.fr-icon-paint-brush-fill:before{background-image:url(../../assets/images/6e23bbdce8eb37b36aa3.svg)}.fr-icon-paint-brush-line:after,.fr-icon-paint-brush-line:before{background-image:url(../../assets/images/9afe858e0f49c163cd00.svg)}.fr-icon-paint-fill:after,.fr-icon-paint-fill:before{background-image:url(../../assets/images/03c3fa2a2a36b53d913b.svg)}.fr-icon-paint-line:after,.fr-icon-paint-line:before{background-image:url(../../assets/images/dfed36ac96b00a86b243.svg)}.fr-icon-palette-fill:after,.fr-icon-palette-fill:before{background-image:url(../../assets/images/6c004ad59b6c9394b899.svg)}.fr-icon-palette-line:after,.fr-icon-palette-line:before{background-image:url(../../assets/images/06c14305639de6969e6c.svg)}.fr-icon-pantone-fill:after,.fr-icon-pantone-fill:before{background-image:url(../../assets/images/32f0d56f909a1f80cb2d.svg)}.fr-icon-pantone-line:after,.fr-icon-pantone-line:before{background-image:url(../../assets/images/6207d2ad7f7b23c6cbd5.svg)}.fr-icon-pen-nib-fill:after,.fr-icon-pen-nib-fill:before{background-image:url(../../assets/images/6deab5b0ad93325eff2d.svg)}.fr-icon-pen-nib-line:after,.fr-icon-pen-nib-line:before{background-image:url(../../assets/images/fa3183a875b9ceb99dfd.svg)}.fr-icon-pencil-fill:after,.fr-icon-pencil-fill:before{background-image:url(../../assets/images/56d28ecba2661011c333.svg)}.fr-icon-pencil-line:after,.fr-icon-pencil-line:before{background-image:url(../../assets/images/30e44db5d06f613b58b6.svg)}.fr-icon-pencil-ruler-fill:after,.fr-icon-pencil-ruler-fill:before{background-image:url(../../assets/images/fc7240f86c249734ae0d.svg)}.fr-icon-pencil-ruler-line:after,.fr-icon-pencil-ruler-line:before{background-image:url(../../assets/images/322a97b5212c9556158a.svg)}.fr-icon-shapes-fill:after,.fr-icon-shapes-fill:before{background-image:url(../../assets/images/aa1b814e5a60300830f1.svg)}.fr-icon-shapes-line:after,.fr-icon-shapes-line:before{background-image:url(../../assets/images/dfa01accd81eae769e7a.svg)}.fr-icon-sip-fill:after,.fr-icon-sip-fill:before{background-image:url(../../assets/images/72bc942addee3a75ab4a.svg)}.fr-icon-sip-line:after,.fr-icon-sip-line:before{background-image:url(../../assets/images/8207524b80b222cc639a.svg)}.fr-icon-table-fill:after,.fr-icon-table-fill:before{background-image:url(../../assets/images/01f6009448da4309842d.svg)}.fr-icon-table-line:after,.fr-icon-table-line:before{background-image:url(../../assets/images/b4fb8b6118eab9766c39.svg)}.fr-fi-edit-fill:before{background-image:url(../../assets/images/4d43b9070f3d9153a7c8.svg)}.fr-fi-edit-line:before{background-image:url(../../assets/images/cf190b7a5eebc54e3c69.svg)}} +/*!**************************************************************************************************************************************!*\ + !*** css ./node_modules/css-loader/dist/cjs.js!./node_modules/@gouvfr/dsfr/dist/utility/icons/icons-business/icons-business.min.css ***! + \**************************************************************************************************************************************/ /*! * DSFR v1.12.1 | SPDX-License-Identifier: MIT | License-Filename: LICENSE.md | restricted use (see terms and conditions) */.fr-icon-archive-fill:after,.fr-icon-archive-fill:before{-webkit-mask-image:url(../../assets/images/e585c9a7f5b5fcae6e85.svg);mask-image:url(../../assets/images/e585c9a7f5b5fcae6e85.svg)}.fr-icon-archive-line:after,.fr-icon-archive-line:before{-webkit-mask-image:url(../../assets/images/4149439215b868fd359f.svg);mask-image:url(../../assets/images/4149439215b868fd359f.svg)}.fr-icon-attachment-fill:after,.fr-icon-attachment-fill:before{-webkit-mask-image:url(../../assets/images/451cd6c027fe3b56f588.svg);mask-image:url(../../assets/images/451cd6c027fe3b56f588.svg)}.fr-icon-attachment-line:after,.fr-icon-attachment-line:before{-webkit-mask-image:url(../../assets/images/fd6fdc8a44828e0f467e.svg);mask-image:url(../../assets/images/fd6fdc8a44828e0f467e.svg)}.fr-icon-award-fill:after,.fr-icon-award-fill:before{-webkit-mask-image:url(../../assets/images/0808e25f31743f7ae617.svg);mask-image:url(../../assets/images/0808e25f31743f7ae617.svg)}.fr-icon-award-line:after,.fr-icon-award-line:before{-webkit-mask-image:url(../../assets/images/88764910ebfbb7ad54d1.svg);mask-image:url(../../assets/images/88764910ebfbb7ad54d1.svg)}.fr-icon-bar-chart-box-fill:after,.fr-icon-bar-chart-box-fill:before{-webkit-mask-image:url(../../assets/images/dc90304880e7ffcbdb77.svg);mask-image:url(../../assets/images/dc90304880e7ffcbdb77.svg)}.fr-icon-bar-chart-box-line:after,.fr-icon-bar-chart-box-line:before{-webkit-mask-image:url(../../assets/images/f7b861a2538acd1e79ef.svg);mask-image:url(../../assets/images/f7b861a2538acd1e79ef.svg)}.fr-icon-bookmark-fill:after,.fr-icon-bookmark-fill:before{-webkit-mask-image:url(../../assets/images/e18f164d7ec671be7dc0.svg);mask-image:url(../../assets/images/e18f164d7ec671be7dc0.svg)}.fr-icon-bookmark-line:after,.fr-icon-bookmark-line:before{-webkit-mask-image:url(../../assets/images/9c2ef82426e5ff8f4d3a.svg);mask-image:url(../../assets/images/9c2ef82426e5ff8f4d3a.svg)}.fr-icon-briefcase-fill:after,.fr-icon-briefcase-fill:before{-webkit-mask-image:url(../../assets/images/4cc7b952227d89154a3c.svg);mask-image:url(../../assets/images/4cc7b952227d89154a3c.svg)}.fr-icon-briefcase-line:after,.fr-icon-briefcase-line:before{-webkit-mask-image:url(../../assets/images/75a27318532944dc5ea3.svg);mask-image:url(../../assets/images/75a27318532944dc5ea3.svg)}.fr-icon-calendar-2-fill:after,.fr-icon-calendar-2-fill:before{-webkit-mask-image:url(../../assets/images/c4415062cb807d7fc432.svg);mask-image:url(../../assets/images/c4415062cb807d7fc432.svg)}.fr-icon-calendar-2-line:after,.fr-icon-calendar-2-line:before{-webkit-mask-image:url(../../assets/images/0650f76e30cd51eb7234.svg);mask-image:url(../../assets/images/0650f76e30cd51eb7234.svg)}.fr-icon-calendar-event-fill:after,.fr-icon-calendar-event-fill:before{-webkit-mask-image:url(../../assets/images/c5eee5f8166ffe1979c0.svg);mask-image:url(../../assets/images/c5eee5f8166ffe1979c0.svg)}.fr-icon-calendar-event-line:after,.fr-icon-calendar-event-line:before{-webkit-mask-image:url(../../assets/images/80e36090bde842590400.svg);mask-image:url(../../assets/images/80e36090bde842590400.svg)}.fr-icon-calendar-fill:after,.fr-icon-calendar-fill:before{-webkit-mask-image:url(../../assets/images/cf0a6742f768bffdc5fc.svg);mask-image:url(../../assets/images/cf0a6742f768bffdc5fc.svg)}.fr-icon-calendar-line:after,.fr-icon-calendar-line:before{-webkit-mask-image:url(../../assets/images/1367dd20d027c63962d5.svg);mask-image:url(../../assets/images/1367dd20d027c63962d5.svg)}.fr-icon-cloud-fill:after,.fr-icon-cloud-fill:before{-webkit-mask-image:url(../../assets/images/5793591419c3a3fc1ec0.svg);mask-image:url(../../assets/images/5793591419c3a3fc1ec0.svg)}.fr-icon-cloud-line:after,.fr-icon-cloud-line:before{-webkit-mask-image:url(../../assets/images/9d5b0517f7b8847067e7.svg);mask-image:url(../../assets/images/9d5b0517f7b8847067e7.svg)}.fr-icon-copyright-fill:after,.fr-icon-copyright-fill:before{-webkit-mask-image:url(../../assets/images/d327db52e9d7634343c6.svg);mask-image:url(../../assets/images/d327db52e9d7634343c6.svg)}.fr-icon-copyright-line:after,.fr-icon-copyright-line:before{-webkit-mask-image:url(../../assets/images/6efe4dc889dde83cf07d.svg);mask-image:url(../../assets/images/6efe4dc889dde83cf07d.svg)}.fr-icon-customer-service-fill:after,.fr-icon-customer-service-fill:before{-webkit-mask-image:url(../../assets/images/f41ee8bf39e4ca562b44.svg);mask-image:url(../../assets/images/f41ee8bf39e4ca562b44.svg)}.fr-icon-customer-service-line:after,.fr-icon-customer-service-line:before{-webkit-mask-image:url(../../assets/images/5e383fbc3b01bfba6644.svg);mask-image:url(../../assets/images/5e383fbc3b01bfba6644.svg)}.fr-icon-flag-fill:after,.fr-icon-flag-fill:before{-webkit-mask-image:url(../../assets/images/0920b574bfb48420ce30.svg);mask-image:url(../../assets/images/0920b574bfb48420ce30.svg)}.fr-icon-flag-line:after,.fr-icon-flag-line:before{-webkit-mask-image:url(../../assets/images/a5404c8e58bce14de6a0.svg);mask-image:url(../../assets/images/a5404c8e58bce14de6a0.svg)}.fr-icon-global-fill:after,.fr-icon-global-fill:before{-webkit-mask-image:url(../../assets/images/c0905af49e071b3bb51c.svg);mask-image:url(../../assets/images/c0905af49e071b3bb51c.svg)}.fr-icon-global-line:after,.fr-icon-global-line:before{-webkit-mask-image:url(../../assets/images/2883097d2b883a8dbc4f.svg);mask-image:url(../../assets/images/2883097d2b883a8dbc4f.svg)}.fr-icon-line-chart-fill:after,.fr-icon-line-chart-fill:before{-webkit-mask-image:url(../../assets/images/c9c6ef45884e31cf71cb.svg);mask-image:url(../../assets/images/c9c6ef45884e31cf71cb.svg)}.fr-icon-line-chart-line:after,.fr-icon-line-chart-line:before{-webkit-mask-image:url(../../assets/images/3643cce4434173e02b64.svg);mask-image:url(../../assets/images/3643cce4434173e02b64.svg)}.fr-icon-links-fill:after,.fr-icon-links-fill:before{-webkit-mask-image:url(../../assets/images/14df53eadfa149231599.svg);mask-image:url(../../assets/images/14df53eadfa149231599.svg)}.fr-icon-links-line:after,.fr-icon-links-line:before{-webkit-mask-image:url(../../assets/images/c168f040029901794b81.svg);mask-image:url(../../assets/images/c168f040029901794b81.svg)}.fr-icon-mail-fill:after,.fr-icon-mail-fill:before{-webkit-mask-image:url(../../assets/images/e6f19d12d70eedfc9dc5.svg);mask-image:url(../../assets/images/e6f19d12d70eedfc9dc5.svg)}.fr-icon-mail-line:after,.fr-icon-mail-line:before{-webkit-mask-image:url(../../assets/images/34b1323ccecacf31feaf.svg);mask-image:url(../../assets/images/34b1323ccecacf31feaf.svg)}.fr-icon-mail-open-fill:after,.fr-icon-mail-open-fill:before{-webkit-mask-image:url(../../assets/images/1377647f601a195e0fa1.svg);mask-image:url(../../assets/images/1377647f601a195e0fa1.svg)}.fr-icon-mail-open-line:after,.fr-icon-mail-open-line:before{-webkit-mask-image:url(../../assets/images/7a79f2234361008ebe6c.svg);mask-image:url(../../assets/images/7a79f2234361008ebe6c.svg)}.fr-icon-medal-fill:after,.fr-icon-medal-fill:before{-webkit-mask-image:url(../../assets/images/f8256cb516d75186b8e6.svg);mask-image:url(../../assets/images/f8256cb516d75186b8e6.svg)}.fr-icon-medal-line:after,.fr-icon-medal-line:before{-webkit-mask-image:url(../../assets/images/1e85ae5fb44e3f9d18a1.svg);mask-image:url(../../assets/images/1e85ae5fb44e3f9d18a1.svg)}.fr-icon-pie-chart-2-fill:after,.fr-icon-pie-chart-2-fill:before{-webkit-mask-image:url(../../assets/images/5541949c1e3941134c1d.svg);mask-image:url(../../assets/images/5541949c1e3941134c1d.svg)}.fr-icon-pie-chart-2-line:after,.fr-icon-pie-chart-2-line:before{-webkit-mask-image:url(../../assets/images/d023c7067888333d0cc6.svg);mask-image:url(../../assets/images/d023c7067888333d0cc6.svg)}.fr-icon-pie-chart-box-fill:after,.fr-icon-pie-chart-box-fill:before{-webkit-mask-image:url(../../assets/images/5f9f4f2124ec78f93652.svg);mask-image:url(../../assets/images/5f9f4f2124ec78f93652.svg)}.fr-icon-pie-chart-box-line:after,.fr-icon-pie-chart-box-line:before{-webkit-mask-image:url(../../assets/images/39bc9680e929a549776a.svg);mask-image:url(../../assets/images/39bc9680e929a549776a.svg)}.fr-icon-printer-fill:after,.fr-icon-printer-fill:before{-webkit-mask-image:url(../../assets/images/e8ba3e7fbe53fa5bb1ae.svg);mask-image:url(../../assets/images/e8ba3e7fbe53fa5bb1ae.svg)}.fr-icon-printer-line:after,.fr-icon-printer-line:before{-webkit-mask-image:url(../../assets/images/9c55e93651755dee2516.svg);mask-image:url(../../assets/images/9c55e93651755dee2516.svg)}.fr-icon-profil-fill:after,.fr-icon-profil-fill:before{-webkit-mask-image:url(../../assets/images/8e9570c01f2c2585a71a.svg);mask-image:url(../../assets/images/8e9570c01f2c2585a71a.svg)}.fr-icon-profil-line:after,.fr-icon-profil-line:before{-webkit-mask-image:url(../../assets/images/0fb16b395738a79ccdfd.svg);mask-image:url(../../assets/images/0fb16b395738a79ccdfd.svg)}.fr-icon-projector-2-fill:after,.fr-icon-projector-2-fill:before{-webkit-mask-image:url(../../assets/images/30c6165f3249b1178834.svg);mask-image:url(../../assets/images/30c6165f3249b1178834.svg)}.fr-icon-projector-2-line:after,.fr-icon-projector-2-line:before{-webkit-mask-image:url(../../assets/images/c8fca71e653fb7e25f96.svg);mask-image:url(../../assets/images/c8fca71e653fb7e25f96.svg)}.fr-icon-send-plane-fill:after,.fr-icon-send-plane-fill:before{-webkit-mask-image:url(../../assets/images/45ba8620869a8d1de2d4.svg);mask-image:url(../../assets/images/45ba8620869a8d1de2d4.svg)}.fr-icon-send-plane-line:after,.fr-icon-send-plane-line:before{-webkit-mask-image:url(../../assets/images/7ffecc0d96f7711cfcef.svg);mask-image:url(../../assets/images/7ffecc0d96f7711cfcef.svg)}.fr-icon-slideshow-fill:after,.fr-icon-slideshow-fill:before{-webkit-mask-image:url(../../assets/images/8bf93d267e43b42b9361.svg);mask-image:url(../../assets/images/8bf93d267e43b42b9361.svg)}.fr-icon-slideshow-line:after,.fr-icon-slideshow-line:before{-webkit-mask-image:url(../../assets/images/9c8888660ac2f115845e.svg);mask-image:url(../../assets/images/9c8888660ac2f115845e.svg)}.fr-icon-window-fill:after,.fr-icon-window-fill:before{-webkit-mask-image:url(../../assets/images/bbbb356df779b55cc0e0.svg);mask-image:url(../../assets/images/bbbb356df779b55cc0e0.svg)}.fr-icon-window-line:after,.fr-icon-window-line:before{-webkit-mask-image:url(../../assets/images/b19470eec5c167d28b9c.svg);mask-image:url(../../assets/images/b19470eec5c167d28b9c.svg)}.fr-fi-attachment-fill:after,.fr-fi-attachment-fill:before{-webkit-mask-image:url(../../assets/images/451cd6c027fe3b56f588.svg);mask-image:url(../../assets/images/451cd6c027fe3b56f588.svg)}.fr-fi-attachment-line:after,.fr-fi-attachment-line:before{-webkit-mask-image:url(../../assets/images/fd6fdc8a44828e0f467e.svg);mask-image:url(../../assets/images/fd6fdc8a44828e0f467e.svg)}.fr-fi-calendar-fill:after,.fr-fi-calendar-fill:before{-webkit-mask-image:url(../../assets/images/cf0a6742f768bffdc5fc.svg);mask-image:url(../../assets/images/cf0a6742f768bffdc5fc.svg)}.fr-fi-calendar-line:after,.fr-fi-calendar-line:before{-webkit-mask-image:url(../../assets/images/1367dd20d027c63962d5.svg);mask-image:url(../../assets/images/1367dd20d027c63962d5.svg)}.fr-fi-line-chart-fill:after,.fr-fi-line-chart-fill:before{-webkit-mask-image:url(../../assets/images/c9c6ef45884e31cf71cb.svg);mask-image:url(../../assets/images/c9c6ef45884e31cf71cb.svg)}.fr-fi-line-chart-line:after,.fr-fi-line-chart-line:before{-webkit-mask-image:url(../../assets/images/3643cce4434173e02b64.svg);mask-image:url(../../assets/images/3643cce4434173e02b64.svg)}.fr-fi-links-fill:after,.fr-fi-links-fill:before{-webkit-mask-image:url(../../assets/images/14df53eadfa149231599.svg);mask-image:url(../../assets/images/14df53eadfa149231599.svg)}.fr-fi-mail-fill:after,.fr-fi-mail-fill:before{-webkit-mask-image:url(../../assets/images/e6f19d12d70eedfc9dc5.svg);mask-image:url(../../assets/images/e6f19d12d70eedfc9dc5.svg)}.fr-fi-mail-line:after,.fr-fi-mail-line:before{-webkit-mask-image:url(../../assets/images/34b1323ccecacf31feaf.svg);mask-image:url(../../assets/images/34b1323ccecacf31feaf.svg)}.fr-fi-printer-fill:after,.fr-fi-printer-fill:before{-webkit-mask-image:url(../../assets/images/e8ba3e7fbe53fa5bb1ae.svg);mask-image:url(../../assets/images/e8ba3e7fbe53fa5bb1ae.svg)}.fr-fi-printer-line:after,.fr-fi-printer-line:before{-webkit-mask-image:url(../../assets/images/9c55e93651755dee2516.svg);mask-image:url(../../assets/images/9c55e93651755dee2516.svg)}@media (min-width:36em){ @@ -427,6 +439,9 @@ /*! media lg */}@media (min-width:78em){ /*! media xl */ /*! media xl */}@media screen and (min-width:0\0) and (min-resolution:72dpi){.fr-icon-archive-fill:after,.fr-icon-archive-fill:before{background-image:url(../../assets/images/e585c9a7f5b5fcae6e85.svg)}.fr-icon-archive-line:after,.fr-icon-archive-line:before{background-image:url(../../assets/images/4149439215b868fd359f.svg)}.fr-icon-attachment-fill:after,.fr-icon-attachment-fill:before{background-image:url(../../assets/images/451cd6c027fe3b56f588.svg)}.fr-icon-attachment-line:after,.fr-icon-attachment-line:before{background-image:url(../../assets/images/fd6fdc8a44828e0f467e.svg)}.fr-icon-award-fill:after,.fr-icon-award-fill:before{background-image:url(../../assets/images/0808e25f31743f7ae617.svg)}.fr-icon-award-line:after,.fr-icon-award-line:before{background-image:url(../../assets/images/88764910ebfbb7ad54d1.svg)}.fr-icon-bar-chart-box-fill:after,.fr-icon-bar-chart-box-fill:before{background-image:url(../../assets/images/dc90304880e7ffcbdb77.svg)}.fr-icon-bar-chart-box-line:after,.fr-icon-bar-chart-box-line:before{background-image:url(../../assets/images/f7b861a2538acd1e79ef.svg)}.fr-icon-bookmark-fill:after,.fr-icon-bookmark-fill:before{background-image:url(../../assets/images/e18f164d7ec671be7dc0.svg)}.fr-icon-bookmark-line:after,.fr-icon-bookmark-line:before{background-image:url(../../assets/images/9c2ef82426e5ff8f4d3a.svg)}.fr-icon-briefcase-fill:after,.fr-icon-briefcase-fill:before{background-image:url(../../assets/images/4cc7b952227d89154a3c.svg)}.fr-icon-briefcase-line:after,.fr-icon-briefcase-line:before{background-image:url(../../assets/images/75a27318532944dc5ea3.svg)}.fr-icon-calendar-2-fill:after,.fr-icon-calendar-2-fill:before{background-image:url(../../assets/images/c4415062cb807d7fc432.svg)}.fr-icon-calendar-2-line:after,.fr-icon-calendar-2-line:before{background-image:url(../../assets/images/0650f76e30cd51eb7234.svg)}.fr-icon-calendar-event-fill:after,.fr-icon-calendar-event-fill:before{background-image:url(../../assets/images/c5eee5f8166ffe1979c0.svg)}.fr-icon-calendar-event-line:after,.fr-icon-calendar-event-line:before{background-image:url(../../assets/images/80e36090bde842590400.svg)}.fr-icon-calendar-fill:after,.fr-icon-calendar-fill:before{background-image:url(../../assets/images/cf0a6742f768bffdc5fc.svg)}.fr-icon-calendar-line:after,.fr-icon-calendar-line:before{background-image:url(../../assets/images/1367dd20d027c63962d5.svg)}.fr-icon-cloud-fill:after,.fr-icon-cloud-fill:before{background-image:url(../../assets/images/5793591419c3a3fc1ec0.svg)}.fr-icon-cloud-line:after,.fr-icon-cloud-line:before{background-image:url(../../assets/images/9d5b0517f7b8847067e7.svg)}.fr-icon-copyright-fill:after,.fr-icon-copyright-fill:before{background-image:url(../../assets/images/d327db52e9d7634343c6.svg)}.fr-icon-copyright-line:after,.fr-icon-copyright-line:before{background-image:url(../../assets/images/6efe4dc889dde83cf07d.svg)}.fr-icon-customer-service-fill:after,.fr-icon-customer-service-fill:before{background-image:url(../../assets/images/f41ee8bf39e4ca562b44.svg)}.fr-icon-customer-service-line:after,.fr-icon-customer-service-line:before{background-image:url(../../assets/images/5e383fbc3b01bfba6644.svg)}.fr-icon-flag-fill:after,.fr-icon-flag-fill:before{background-image:url(../../assets/images/0920b574bfb48420ce30.svg)}.fr-icon-flag-line:after,.fr-icon-flag-line:before{background-image:url(../../assets/images/a5404c8e58bce14de6a0.svg)}.fr-icon-global-fill:after,.fr-icon-global-fill:before{background-image:url(../../assets/images/c0905af49e071b3bb51c.svg)}.fr-icon-global-line:after,.fr-icon-global-line:before{background-image:url(../../assets/images/2883097d2b883a8dbc4f.svg)}.fr-icon-line-chart-fill:after,.fr-icon-line-chart-fill:before{background-image:url(../../assets/images/c9c6ef45884e31cf71cb.svg)}.fr-icon-line-chart-line:after,.fr-icon-line-chart-line:before{background-image:url(../../assets/images/3643cce4434173e02b64.svg)}.fr-icon-links-fill:after,.fr-icon-links-fill:before{background-image:url(../../assets/images/14df53eadfa149231599.svg)}.fr-icon-links-line:after,.fr-icon-links-line:before{background-image:url(../../assets/images/c168f040029901794b81.svg)}.fr-icon-mail-fill:after,.fr-icon-mail-fill:before{background-image:url(../../assets/images/e6f19d12d70eedfc9dc5.svg)}.fr-icon-mail-line:after,.fr-icon-mail-line:before{background-image:url(../../assets/images/34b1323ccecacf31feaf.svg)}.fr-icon-mail-open-fill:after,.fr-icon-mail-open-fill:before{background-image:url(../../assets/images/1377647f601a195e0fa1.svg)}.fr-icon-mail-open-line:after,.fr-icon-mail-open-line:before{background-image:url(../../assets/images/7a79f2234361008ebe6c.svg)}.fr-icon-medal-fill:after,.fr-icon-medal-fill:before{background-image:url(../../assets/images/f8256cb516d75186b8e6.svg)}.fr-icon-medal-line:after,.fr-icon-medal-line:before{background-image:url(../../assets/images/1e85ae5fb44e3f9d18a1.svg)}.fr-icon-pie-chart-2-fill:after,.fr-icon-pie-chart-2-fill:before{background-image:url(../../assets/images/5541949c1e3941134c1d.svg)}.fr-icon-pie-chart-2-line:after,.fr-icon-pie-chart-2-line:before{background-image:url(../../assets/images/d023c7067888333d0cc6.svg)}.fr-icon-pie-chart-box-fill:after,.fr-icon-pie-chart-box-fill:before{background-image:url(../../assets/images/5f9f4f2124ec78f93652.svg)}.fr-icon-pie-chart-box-line:after,.fr-icon-pie-chart-box-line:before{background-image:url(../../assets/images/39bc9680e929a549776a.svg)}.fr-icon-printer-fill:after,.fr-icon-printer-fill:before{background-image:url(../../assets/images/e8ba3e7fbe53fa5bb1ae.svg)}.fr-icon-printer-line:after,.fr-icon-printer-line:before{background-image:url(../../assets/images/9c55e93651755dee2516.svg)}.fr-icon-profil-fill:after,.fr-icon-profil-fill:before{background-image:url(../../assets/images/8e9570c01f2c2585a71a.svg)}.fr-icon-profil-line:after,.fr-icon-profil-line:before{background-image:url(../../assets/images/0fb16b395738a79ccdfd.svg)}.fr-icon-projector-2-fill:after,.fr-icon-projector-2-fill:before{background-image:url(../../assets/images/30c6165f3249b1178834.svg)}.fr-icon-projector-2-line:after,.fr-icon-projector-2-line:before{background-image:url(../../assets/images/c8fca71e653fb7e25f96.svg)}.fr-icon-send-plane-fill:after,.fr-icon-send-plane-fill:before{background-image:url(../../assets/images/45ba8620869a8d1de2d4.svg)}.fr-icon-send-plane-line:after,.fr-icon-send-plane-line:before{background-image:url(../../assets/images/7ffecc0d96f7711cfcef.svg)}.fr-icon-slideshow-fill:after,.fr-icon-slideshow-fill:before{background-image:url(../../assets/images/8bf93d267e43b42b9361.svg)}.fr-icon-slideshow-line:after,.fr-icon-slideshow-line:before{background-image:url(../../assets/images/9c8888660ac2f115845e.svg)}.fr-icon-window-fill:after,.fr-icon-window-fill:before{background-image:url(../../assets/images/bbbb356df779b55cc0e0.svg)}.fr-icon-window-line:after,.fr-icon-window-line:before{background-image:url(../../assets/images/b19470eec5c167d28b9c.svg)}.fr-fi-attachment-fill:before{background-image:url(../../assets/images/451cd6c027fe3b56f588.svg)}.fr-fi-attachment-line:before{background-image:url(../../assets/images/fd6fdc8a44828e0f467e.svg)}.fr-fi-calendar-fill:before{background-image:url(../../assets/images/cf0a6742f768bffdc5fc.svg)}.fr-fi-calendar-line:before{background-image:url(../../assets/images/1367dd20d027c63962d5.svg)}.fr-fi-line-chart-fill:before{background-image:url(../../assets/images/c9c6ef45884e31cf71cb.svg)}.fr-fi-line-chart-line:before{background-image:url(../../assets/images/3643cce4434173e02b64.svg)}.fr-fi-links-fill:before{background-image:url(../../assets/images/14df53eadfa149231599.svg)}.fr-fi-mail-fill:before{background-image:url(../../assets/images/e6f19d12d70eedfc9dc5.svg)}.fr-fi-mail-line:before{background-image:url(../../assets/images/34b1323ccecacf31feaf.svg)}.fr-fi-printer-fill:before{background-image:url(../../assets/images/e8ba3e7fbe53fa5bb1ae.svg)}.fr-fi-printer-line:before{background-image:url(../../assets/images/9c55e93651755dee2516.svg)}} +/*!*************************************************************************!*\ + !*** css ./node_modules/css-loader/dist/cjs.js!./assets/styles/map.css ***! + \*************************************************************************/ #map__wrapper { position: relative; } @@ -704,7 +719,13 @@ input[type="range"]::-moz-range-thumb { box-shadow: -407px 0 0 400px #000091; } +/*!*************************************************************************************************!*\ + !*** css ./node_modules/css-loader/dist/cjs.js!./node_modules/maplibre-gl/dist/maplibre-gl.css ***! + \*************************************************************************************************/ .maplibregl-map{-webkit-tap-highlight-color:rgb(0 0 0/0);font:12px/20px Helvetica Neue,Arial,Helvetica,sans-serif;overflow:hidden;position:relative}.maplibregl-canvas{left:0;position:absolute;top:0}.maplibregl-map:fullscreen{height:100%;width:100%}.maplibregl-ctrl-group button.maplibregl-ctrl-compass{touch-action:none}.maplibregl-canvas-container.maplibregl-interactive,.maplibregl-ctrl-group button.maplibregl-ctrl-compass{cursor:grab;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.maplibregl-canvas-container.maplibregl-interactive.maplibregl-track-pointer{cursor:pointer}.maplibregl-canvas-container.maplibregl-interactive:active,.maplibregl-ctrl-group button.maplibregl-ctrl-compass:active{cursor:grabbing}.maplibregl-canvas-container.maplibregl-touch-zoom-rotate,.maplibregl-canvas-container.maplibregl-touch-zoom-rotate .maplibregl-canvas{touch-action:pan-x pan-y}.maplibregl-canvas-container.maplibregl-touch-drag-pan,.maplibregl-canvas-container.maplibregl-touch-drag-pan .maplibregl-canvas{touch-action:pinch-zoom}.maplibregl-canvas-container.maplibregl-touch-zoom-rotate.maplibregl-touch-drag-pan,.maplibregl-canvas-container.maplibregl-touch-zoom-rotate.maplibregl-touch-drag-pan .maplibregl-canvas{touch-action:none}.maplibregl-canvas-container.maplibregl-touch-drag-pan.maplibregl-cooperative-gestures,.maplibregl-canvas-container.maplibregl-touch-drag-pan.maplibregl-cooperative-gestures .maplibregl-canvas{touch-action:pan-x pan-y}.maplibregl-ctrl-bottom-left,.maplibregl-ctrl-bottom-right,.maplibregl-ctrl-top-left,.maplibregl-ctrl-top-right{pointer-events:none;position:absolute;z-index:2}.maplibregl-ctrl-top-left{left:0;top:0}.maplibregl-ctrl-top-right{right:0;top:0}.maplibregl-ctrl-bottom-left{bottom:0;left:0}.maplibregl-ctrl-bottom-right{bottom:0;right:0}.maplibregl-ctrl{clear:both;pointer-events:auto;transform:translate(0)}.maplibregl-ctrl-top-left .maplibregl-ctrl{float:left;margin:10px 0 0 10px}.maplibregl-ctrl-top-right .maplibregl-ctrl{float:right;margin:10px 10px 0 0}.maplibregl-ctrl-bottom-left .maplibregl-ctrl{float:left;margin:0 0 10px 10px}.maplibregl-ctrl-bottom-right .maplibregl-ctrl{float:right;margin:0 10px 10px 0}.maplibregl-ctrl-group{background:#fff;border-radius:4px}.maplibregl-ctrl-group:not(:empty){box-shadow:0 0 0 2px rgba(0,0,0,.1)}@media (-ms-high-contrast:active){.maplibregl-ctrl-group:not(:empty){box-shadow:0 0 0 2px ButtonText}}.maplibregl-ctrl-group button{background-color:transparent;border:0;box-sizing:border-box;cursor:pointer;display:block;height:29px;outline:none;padding:0;width:29px}.maplibregl-ctrl-group button+button{border-top:1px solid #ddd}.maplibregl-ctrl button .maplibregl-ctrl-icon{background-position:50%;background-repeat:no-repeat;display:block;height:100%;width:100%}@media (-ms-high-contrast:active){.maplibregl-ctrl-icon{background-color:transparent}.maplibregl-ctrl-group button+button{border-top:1px solid ButtonText}}.maplibregl-ctrl button::-moz-focus-inner{border:0;padding:0}.maplibregl-ctrl-attrib-button:focus,.maplibregl-ctrl-group button:focus{box-shadow:0 0 2px 2px #0096ff}.maplibregl-ctrl button:disabled{cursor:not-allowed}.maplibregl-ctrl button:disabled .maplibregl-ctrl-icon{opacity:.25}.maplibregl-ctrl button:not(:disabled):hover{background-color:rgb(0 0 0/5%)}.maplibregl-ctrl-group button:focus:focus-visible{box-shadow:0 0 2px 2px #0096ff}.maplibregl-ctrl-group button:focus:not(:focus-visible){box-shadow:none}.maplibregl-ctrl-group button:focus:first-child{border-radius:4px 4px 0 0}.maplibregl-ctrl-group button:focus:last-child{border-radius:0 0 4px 4px}.maplibregl-ctrl-group button:focus:only-child{border-radius:inherit}.maplibregl-ctrl button.maplibregl-ctrl-zoom-out .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%23333%27 viewBox=%270 0 29 29%27%3E%3Cpath d=%27M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z%27/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-zoom-in .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%23333%27 viewBox=%270 0 29 29%27%3E%3Cpath d=%27M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z%27/%3E%3C/svg%3E")}@media (-ms-high-contrast:active){.maplibregl-ctrl button.maplibregl-ctrl-zoom-out .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%23fff%27 viewBox=%270 0 29 29%27%3E%3Cpath d=%27M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z%27/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-zoom-in .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%23fff%27 viewBox=%270 0 29 29%27%3E%3Cpath d=%27M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z%27/%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){.maplibregl-ctrl button.maplibregl-ctrl-zoom-out .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 viewBox=%270 0 29 29%27%3E%3Cpath d=%27M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z%27/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-zoom-in .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 viewBox=%270 0 29 29%27%3E%3Cpath d=%27M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5z%27/%3E%3C/svg%3E")}}.maplibregl-ctrl button.maplibregl-ctrl-fullscreen .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%23333%27 viewBox=%270 0 29 29%27%3E%3Cpath d=%27M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z%27/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-shrink .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 viewBox=%270 0 29 29%27%3E%3Cpath d=%27M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z%27/%3E%3C/svg%3E")}@media (-ms-high-contrast:active){.maplibregl-ctrl button.maplibregl-ctrl-fullscreen .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%23fff%27 viewBox=%270 0 29 29%27%3E%3Cpath d=%27M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z%27/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-shrink .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%23fff%27 viewBox=%270 0 29 29%27%3E%3Cpath d=%27M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z%27/%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){.maplibregl-ctrl button.maplibregl-ctrl-fullscreen .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 viewBox=%270 0 29 29%27%3E%3Cpath d=%27M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3h1zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16h1zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5H13zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1V7.5z%27/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-shrink .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 viewBox=%270 0 29 29%27%3E%3Cpath d=%27M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1h-5.5zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1v-5.5zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1v5.5zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1h5.5z%27/%3E%3C/svg%3E")}}.maplibregl-ctrl button.maplibregl-ctrl-compass .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%23333%27 viewBox=%270 0 29 29%27%3E%3Cpath d=%27m10.5 14 4-8 4 8h-8z%27/%3E%3Cpath fill=%27%23ccc%27 d=%27m10.5 16 4 8 4-8h-8z%27/%3E%3C/svg%3E")}@media (-ms-high-contrast:active){.maplibregl-ctrl button.maplibregl-ctrl-compass .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%23fff%27 viewBox=%270 0 29 29%27%3E%3Cpath d=%27m10.5 14 4-8 4 8h-8z%27/%3E%3Cpath fill=%27%23999%27 d=%27m10.5 16 4 8 4-8h-8z%27/%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){.maplibregl-ctrl button.maplibregl-ctrl-compass .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 viewBox=%270 0 29 29%27%3E%3Cpath d=%27m10.5 14 4-8 4 8h-8z%27/%3E%3Cpath fill=%27%23ccc%27 d=%27m10.5 16 4 8 4-8h-8z%27/%3E%3C/svg%3E")}}.maplibregl-ctrl button.maplibregl-ctrl-terrain .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2722%27 height=%2722%27 fill=%27%23333%27 viewBox=%270 0 22 22%27%3E%3Cpath d=%27m1.754 13.406 4.453-4.851 3.09 3.09 3.281 3.277.969-.969-3.309-3.312 3.844-4.121 6.148 6.886h1.082v-.855l-7.207-8.07-4.84 5.187L6.169 6.57l-5.48 5.965v.871ZM.688 16.844h20.625v1.375H.688Zm0 0%27/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-terrain-enabled .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2722%27 height=%2722%27 fill=%27%2333b5e5%27 viewBox=%270 0 22 22%27%3E%3Cpath d=%27m1.754 13.406 4.453-4.851 3.09 3.09 3.281 3.277.969-.969-3.309-3.312 3.844-4.121 6.148 6.886h1.082v-.855l-7.207-8.07-4.84 5.187L6.169 6.57l-5.48 5.965v.871ZM.688 16.844h20.625v1.375H.688Zm0 0%27/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%23333%27 viewBox=%270 0 20 20%27%3E%3Cpath d=%27M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z%27/%3E%3Ccircle cx=%2710%27 cy=%2710%27 r=%272%27/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate:disabled .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%23aaa%27 viewBox=%270 0 20 20%27%3E%3Cpath d=%27M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z%27/%3E%3Ccircle cx=%2710%27 cy=%2710%27 r=%272%27/%3E%3Cpath fill=%27red%27 d=%27m14 5 1 1-9 9-1-1 9-9z%27/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-active .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%2333b5e5%27 viewBox=%270 0 20 20%27%3E%3Cpath d=%27M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z%27/%3E%3Ccircle cx=%2710%27 cy=%2710%27 r=%272%27/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-active-error .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%23e58978%27 viewBox=%270 0 20 20%27%3E%3Cpath d=%27M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z%27/%3E%3Ccircle cx=%2710%27 cy=%2710%27 r=%272%27/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-background .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%2333b5e5%27 viewBox=%270 0 20 20%27%3E%3Cpath d=%27M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z%27/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-background-error .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%23e54e33%27 viewBox=%270 0 20 20%27%3E%3Cpath d=%27M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z%27/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-waiting .maplibregl-ctrl-icon{animation:maplibregl-spin 2s linear infinite}@media (-ms-high-contrast:active){.maplibregl-ctrl button.maplibregl-ctrl-geolocate .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%23fff%27 viewBox=%270 0 20 20%27%3E%3Cpath d=%27M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z%27/%3E%3Ccircle cx=%2710%27 cy=%2710%27 r=%272%27/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate:disabled .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%23999%27 viewBox=%270 0 20 20%27%3E%3Cpath d=%27M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z%27/%3E%3Ccircle cx=%2710%27 cy=%2710%27 r=%272%27/%3E%3Cpath fill=%27red%27 d=%27m14 5 1 1-9 9-1-1 9-9z%27/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-active .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%2333b5e5%27 viewBox=%270 0 20 20%27%3E%3Cpath d=%27M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z%27/%3E%3Ccircle cx=%2710%27 cy=%2710%27 r=%272%27/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-active-error .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%23e58978%27 viewBox=%270 0 20 20%27%3E%3Cpath d=%27M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z%27/%3E%3Ccircle cx=%2710%27 cy=%2710%27 r=%272%27/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-background .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%2333b5e5%27 viewBox=%270 0 20 20%27%3E%3Cpath d=%27M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z%27/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-background-error .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%23e54e33%27 viewBox=%270 0 20 20%27%3E%3Cpath d=%27M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z%27/%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){.maplibregl-ctrl button.maplibregl-ctrl-geolocate .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 viewBox=%270 0 20 20%27%3E%3Cpath d=%27M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z%27/%3E%3Ccircle cx=%2710%27 cy=%2710%27 r=%272%27/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate:disabled .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2729%27 height=%2729%27 fill=%27%23666%27 viewBox=%270 0 20 20%27%3E%3Cpath d=%27M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1zm0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7z%27/%3E%3Ccircle cx=%2710%27 cy=%2710%27 r=%272%27/%3E%3Cpath fill=%27red%27 d=%27m14 5 1 1-9 9-1-1 9-9z%27/%3E%3C/svg%3E")}}@keyframes maplibregl-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}a.maplibregl-ctrl-logo{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2788%27 height=%2723%27 fill=%27none%27%3E%3Cpath fill=%27%23000%27 fill-opacity=%27.4%27 fill-rule=%27evenodd%27 d=%27M17.408 16.796h-1.827l2.501-12.095h.198l3.324 6.533.988 2.19.988-2.19 3.258-6.533h.181l2.6 12.095h-1.81l-1.218-5.644-.362-1.71-.658 1.71-2.929 5.644h-.098l-2.914-5.644-.757-1.71-.345 1.71zm1.958-3.42-.726 3.663a1.255 1.255 0 0 1-1.232 1.011h-1.827a1.255 1.255 0 0 1-1.229-1.509l2.501-12.095a1.255 1.255 0 0 1 1.23-1.001h.197a1.255 1.255 0 0 1 1.12.685l3.19 6.273 3.125-6.263a1.255 1.255 0 0 1 1.123-.695h.181a1.255 1.255 0 0 1 1.227.991l1.443 6.71a5.11 5.11 0 0 1 .314-.787l.009-.016a4.623 4.623 0 0 1 1.777-1.887c.782-.46 1.668-.667 2.611-.667a4.548 4.548 0 0 1 1.7.32l.306.134c.21-.16.474-.256.759-.256h1.694a1.255 1.255 0 0 1 1.212.925 1.255 1.255 0 0 1 1.212-.925h1.711c.284 0 .545.094.755.252.613-.3 1.312-.45 2.075-.45 1.356 0 2.557.445 3.482 1.4.314.319.566.676.763 1.064V4.701a1.255 1.255 0 0 1 1.255-1.255h1.86A1.255 1.255 0 0 1 54.44 4.7v9.194h2.217c.19 0 .37.043.532.118v-4.77c0-.356.147-.678.385-.906a2.416 2.416 0 0 1-.682-1.71c0-.665.267-1.253.735-1.7a2.448 2.448 0 0 1 1.722-.674 2.43 2.43 0 0 1 1.705.675c.211.2.381.43.504.683V4.7a1.255 1.255 0 0 1 1.255-1.255h1.744A1.255 1.255 0 0 1 65.812 4.7v3.335a4.76 4.76 0 0 1 1.526-.246c.938 0 1.817.214 2.59.69a4.47 4.47 0 0 1 1.67 1.743v-.98a1.255 1.255 0 0 1 1.256-1.256h1.777c.233 0 .451.064.639.174a3.407 3.407 0 0 1 1.567-.372c.346 0 .861.02 1.285.232a1.255 1.255 0 0 1 .689 1.004 4.73 4.73 0 0 1 .853-.588c.795-.44 1.675-.647 2.61-.647 1.385 0 2.65.39 3.525 1.396.836.938 1.168 2.173 1.168 3.528 0 .343-.02.694-.056 1.051a1.255 1.255 0 0 1-.947 1.09l.408.952a1.255 1.255 0 0 1-.477 1.552c-.418.268-.92.463-1.458.612-.613.171-1.304.244-2.049.244-1.06 0-2.043-.207-2.886-.698l-.015-.008c-.798-.48-1.419-1.135-1.818-1.963l-.004-.008a5.815 5.815 0 0 1-.548-2.512c0-.286.017-.567.053-.843a1.255 1.255 0 0 1-.333-.086l-.166-.004c-.223 0-.426.062-.643.228-.03.024-.142.139-.142.59v3.883a1.255 1.255 0 0 1-1.256 1.256h-1.777a1.255 1.255 0 0 1-1.256-1.256V15.69l-.032.057a4.778 4.778 0 0 1-1.86 1.833 5.04 5.04 0 0 1-2.484.634 4.47 4.47 0 0 1-1.935-.424 1.252 1.252 0 0 1-.764.258h-1.71a1.255 1.255 0 0 1-1.256-1.255V7.687a2.402 2.402 0 0 1-.428.625c.253.23.412.561.412.93v7.553a1.255 1.255 0 0 1-1.256 1.255h-1.843a1.25 1.25 0 0 1-.894-.373c-.228.23-.544.373-.894.373H51.32a1.255 1.255 0 0 1-1.256-1.255v-1.251l-.061.117a4.703 4.703 0 0 1-1.782 1.884 4.767 4.767 0 0 1-2.485.67 5.6 5.6 0 0 1-1.485-.188l.009 2.764a1.255 1.255 0 0 1-1.255 1.259h-1.729a1.255 1.255 0 0 1-1.255-1.255v-3.537a1.255 1.255 0 0 1-1.167.793h-1.679a1.25 1.25 0 0 1-.77-.263 4.47 4.47 0 0 1-1.945.429c-.885 0-1.724-.21-2.495-.632l-.017-.01a4.983 4.983 0 0 1-1.081-.836 1.255 1.255 0 0 1-1.254 1.312h-1.81a1.255 1.255 0 0 1-1.228-.99l-.782-3.625-2.044 3.939a1.255 1.255 0 0 1-1.115.676h-.098a1.255 1.255 0 0 1-1.116-.68l-2.061-3.994zM35.92 16.63l.207-.114.223-.15c.329-.237.574-.499.735-.785l.061-.118.033 1.332h1.678V9.242h-1.694l-.033 1.267c-.088-.22-.264-.438-.526-.658l-.032-.028a3.16 3.16 0 0 0-.668-.428l-.27-.12a3.293 3.293 0 0 0-1.235-.23c-.757 0-1.415.163-1.974.493a3.36 3.36 0 0 0-1.3 1.382c-.297.593-.444 1.284-.444 2.074 0 .8.17 1.503.51 2.107a3.795 3.795 0 0 0 1.382 1.381 3.883 3.883 0 0 0 1.893.477c.53 0 1.015-.11 1.455-.33zm-2.789-5.38c-.384.45-.575 1.038-.575 1.762 0 .735.186 1.332.559 1.794.384.45.933.675 1.645.675a2.25 2.25 0 0 0 .934-.19 2.17 2.17 0 0 0 .468-.29l.178-.161a2.163 2.163 0 0 0 .397-.561c.163-.333.244-.717.244-1.15v-.115c0-.472-.098-.894-.296-1.267l-.043-.077a2.211 2.211 0 0 0-.633-.709l-.13-.086-.047-.028a2.099 2.099 0 0 0-1.073-.285c-.702 0-1.244.231-1.629.692zm2.316 2.706c.163-.17.28-.407.28-.83v-.114c0-.292-.06-.508-.15-.68a.958.958 0 0 0-.353-.389.851.851 0 0 0-.464-.127c-.4 0-.56.114-.664.239l-.01.012c-.148.174-.275.45-.275.945 0 .506.122.801.27.99.097.11.266.224.68.224.303 0 .504-.09.687-.269zm7.545 1.705a2.626 2.626 0 0 0 .331.423c.213.22.464.402.755.548l.173.074c.433.17.93.255 1.49.255.68 0 1.295-.165 1.844-.493a3.447 3.447 0 0 0 1.316-1.4c.329-.603.493-1.299.493-2.089 0-1.273-.33-2.243-.988-2.913-.658-.68-1.52-1.02-2.584-1.02-.598 0-1.124.115-1.575.347a2.807 2.807 0 0 0-.415.262l-.199.166a3.35 3.35 0 0 0-.64.82V9.242h-1.712v11.553h1.729l-.017-5.134zm.53-1.138c.137.193.297.36.48.5l.155.11.053.034c.34.197.713.297 1.119.297.714 0 1.262-.225 1.645-.675.385-.46.576-1.048.576-1.762 0-.746-.192-1.338-.576-1.777-.372-.45-.92-.675-1.645-.675-.29 0-.569.053-.835.16a2.366 2.366 0 0 0-.284.136 1.99 1.99 0 0 0-.363.254 2.237 2.237 0 0 0-.46.569l-.082.162a2.56 2.56 0 0 0-.213 1.072v.115c0 .471.098.894.296 1.267l.135.211zm.964-.818a1.11 1.11 0 0 0 .367.385.937.937 0 0 0 .476.118c.423 0 .59-.117.687-.23.159-.194.28-.478.28-.95 0-.53-.133-.8-.266-.952l-.021-.025c-.078-.094-.231-.221-.68-.221a.995.995 0 0 0-.503.135l-.012.007a.859.859 0 0 0-.335.343c-.073.133-.132.324-.132.614v.115a1.43 1.43 0 0 0 .14.66zm15.7-6.222c.232-.23.346-.516.346-.856a1.053 1.053 0 0 0-.345-.79 1.175 1.175 0 0 0-.84-.329c-.34 0-.625.11-.855.33a1.053 1.053 0 0 0-.346.79c0 .34.115.625.346.855.23.23.516.346.856.346.34 0 .62-.115.839-.346zm4.337 9.314.033-1.332c.128.269.324.518.59.747l.098.081a3.727 3.727 0 0 0 .316.224l.223.122a3.21 3.21 0 0 0 1.44.322 3.785 3.785 0 0 0 1.875-.477 3.52 3.52 0 0 0 1.382-1.366c.352-.593.526-1.29.526-2.09 0-.79-.147-1.48-.444-2.073a3.235 3.235 0 0 0-1.283-1.399c-.549-.34-1.195-.51-1.942-.51a3.476 3.476 0 0 0-1.527.344l-.086.043-.165.09a3.412 3.412 0 0 0-.33.214c-.288.21-.507.446-.656.707a1.893 1.893 0 0 0-.099.198l.082-1.283V4.701h-1.744v12.095zm.473-2.509a2.482 2.482 0 0 0 .566.7c.078.065.159.125.245.18l.144.08a2.105 2.105 0 0 0 .975.232c.713 0 1.262-.225 1.645-.675.384-.46.576-1.053.576-1.778 0-.734-.192-1.327-.576-1.777-.373-.46-.921-.692-1.645-.692a2.18 2.18 0 0 0-1.015.235c-.147.075-.285.17-.415.282l-.15.142a2.086 2.086 0 0 0-.42.594c-.149.32-.223.685-.223 1.1v.115c0 .47.097.89.293 1.26zm2.616-.293c.157-.191.28-.479.28-.967 0-.51-.13-.79-.276-.961l-.021-.026c-.082-.1-.232-.225-.67-.225a.868.868 0 0 0-.681.279l-.012.011c-.154.155-.274.38-.274.807v.115c0 .285.057.499.144.669a1.13 1.13 0 0 0 .367.405c.137.082.28.123.455.123.423 0 .59-.118.686-.23zm8.266-3.013c.23-.087.472-.134.724-.14l.069-.002c.329 0 .542.033.642.099l.247-1.794c-.13-.066-.37-.099-.717-.099a2.3 2.3 0 0 0-.545.063 2.086 2.086 0 0 0-.411.148 2.18 2.18 0 0 0-.4.249 2.482 2.482 0 0 0-.485.499 2.659 2.659 0 0 0-.32.581l-.05.137v-1.48h-1.778v7.553h1.777v-3.884c0-.364.053-.678.159-.943a1.49 1.49 0 0 1 .466-.636 2.52 2.52 0 0 1 .399-.253 2.19 2.19 0 0 1 .224-.099zm9.784 2.656.05-.922c0-1.162-.285-2.062-.856-2.698-.559-.647-1.42-.97-2.584-.97-.746 0-1.415.163-2.007.493a3.462 3.462 0 0 0-1.4 1.382c-.329.604-.493 1.306-.493 2.106 0 .714.143 1.371.428 1.975.285.593.73 1.07 1.332 1.432.604.351 1.355.526 2.255.526.649 0 1.204-.062 1.668-.185l.044-.012.135-.04c.409-.122.736-.263.984-.421l-.542-1.267c-.2.108-.415.199-.642.274l-.297.087c-.34.088-.773.131-1.3.131-.636 0-1.135-.147-1.497-.444a1.573 1.573 0 0 1-.192-.193c-.244-.294-.415-.705-.512-1.234l-.004-.021h5.43zm-5.427-1.256-.003.022h3.752v-.138c-.007-.485-.104-.857-.288-1.118a1.056 1.056 0 0 0-.156-.176c-.307-.285-.746-.428-1.316-.428-.657 0-1.155.202-1.494.604-.253.3-.417.712-.494 1.234zm-27.053 2.77V4.7h-1.86v12.095h5.333V15.15zm7.103-5.908v7.553h-1.843V9.242h1.843z%27/%3E%3Cpath fill=%27%23fff%27 d=%27m19.63 11.151-.757-1.71-.345 1.71-1.12 5.644h-1.827L18.083 4.7h.197l3.325 6.533.988 2.19.988-2.19L26.839 4.7h.181l2.6 12.095h-1.81l-1.218-5.644-.362-1.71-.658 1.71-2.93 5.644h-.098l-2.913-5.644zm14.836 5.81c-.68 0-1.311-.16-1.893-.478a3.795 3.795 0 0 1-1.381-1.382c-.34-.604-.51-1.306-.51-2.106 0-.79.147-1.482.444-2.074a3.364 3.364 0 0 1 1.3-1.382c.559-.33 1.217-.494 1.974-.494a3.293 3.293 0 0 1 1.234.231 3.341 3.341 0 0 1 .97.575c.264.22.44.439.527.659l.033-1.267h1.694v7.553H37.18l-.033-1.332c-.186.395-.526.746-1.02 1.053a3.167 3.167 0 0 1-1.662.444zm.296-1.482c.626 0 1.152-.214 1.58-.642.428-.44.642-1.01.642-1.711v-.115c0-.472-.098-.894-.296-1.267a2.211 2.211 0 0 0-.807-.872 2.098 2.098 0 0 0-1.119-.313c-.702 0-1.245.231-1.629.692-.384.45-.575 1.037-.575 1.76 0 .736.186 1.333.559 1.795.384.45.933.675 1.645.675zm6.521-6.237h1.711v1.4c.604-1.065 1.547-1.597 2.83-1.597 1.064 0 1.926.34 2.584 1.02.659.67.988 1.641.988 2.914 0 .79-.164 1.487-.493 2.09a3.456 3.456 0 0 1-1.316 1.399 3.51 3.51 0 0 1-1.844.493c-.636 0-1.19-.11-1.662-.329a2.665 2.665 0 0 1-1.086-.97l.017 5.134h-1.728V9.242zm4.048 6.22c.714 0 1.262-.224 1.645-.674.385-.46.576-1.048.576-1.762 0-.746-.192-1.338-.576-1.777-.372-.45-.92-.675-1.645-.675-.395 0-.768.098-1.12.296-.34.187-.613.46-.822.823-.197.351-.296.763-.296 1.234v.115c0 .472.098.894.296 1.267.209.362.483.647.823.855.34.197.713.297 1.119.297z%27/%3E%3Cpath fill=%27%23e1e3e9%27 d=%27M51.325 4.7h1.86v10.45h3.473v1.646h-5.333zm7.12 4.542h1.843v7.553h-1.843zm.905-1.415a1.159 1.159 0 0 1-.856-.346 1.165 1.165 0 0 1-.346-.856 1.053 1.053 0 0 1 .346-.79c.23-.219.516-.329.856-.329.329 0 .609.11.839.33a1.053 1.053 0 0 1 .345.79 1.159 1.159 0 0 1-.345.855c-.22.23-.5.346-.84.346zm7.875 9.133a3.167 3.167 0 0 1-1.662-.444c-.482-.307-.817-.658-1.004-1.053l-.033 1.332h-1.71V4.701h1.743v4.657l-.082 1.283c.186-.438.548-.812 1.086-1.119a3.486 3.486 0 0 1 1.778-.477c.746 0 1.393.17 1.942.51a3.235 3.235 0 0 1 1.283 1.4c.297.592.444 1.282.444 2.072 0 .8-.175 1.498-.526 2.09a3.52 3.52 0 0 1-1.382 1.366 3.785 3.785 0 0 1-1.876.477zm-.296-1.481c.713 0 1.26-.225 1.645-.675.384-.46.577-1.053.577-1.778 0-.734-.193-1.327-.577-1.776-.373-.46-.921-.692-1.645-.692a2.115 2.115 0 0 0-1.58.659c-.428.428-.642.992-.642 1.694v.115c0 .473.098.895.296 1.267a2.385 2.385 0 0 0 .807.872 2.1 2.1 0 0 0 1.119.313zm5.927-6.237h1.777v1.481c.176-.505.46-.91.856-1.217a2.14 2.14 0 0 1 1.349-.46c.351 0 .593.032.724.098l-.247 1.794c-.099-.066-.313-.099-.642-.099-.516 0-.988.164-1.416.494-.417.329-.626.855-.626 1.58v3.883h-1.777V9.242zm9.534 7.718c-.9 0-1.651-.175-2.255-.526-.603-.362-1.047-.84-1.332-1.432a4.567 4.567 0 0 1-.428-1.975c0-.8.164-1.502.493-2.106a3.462 3.462 0 0 1 1.4-1.382c.592-.33 1.262-.494 2.007-.494 1.163 0 2.024.324 2.584.97.57.637.856 1.537.856 2.7 0 .296-.017.603-.05.92h-5.43c.12.67.356 1.153.708 1.45.362.296.86.443 1.497.443.526 0 .96-.044 1.3-.131a4.123 4.123 0 0 0 .938-.362l.542 1.267c-.274.175-.647.329-1.119.46-.472.132-1.042.197-1.711.197zm1.596-4.558c.01-.68-.137-1.158-.444-1.432-.307-.285-.746-.428-1.316-.428-1.152 0-1.815.62-1.991 1.86h3.752z%27/%3E%3Cg fill-rule=%27evenodd%27 stroke-width=%271.036%27%3E%3Cpath fill=%27%23000%27 fill-opacity=%27.4%27 d=%27m8.166 16.146-.002.002a1.54 1.54 0 0 1-2.009 0l-.002-.002-.043-.034-.002-.002-.199-.162H4.377a.657.657 0 0 0-.659.659v1.84a.657.657 0 0 0 .659.659h5.565a.657.657 0 0 0 .659-.659v-1.84a.657.657 0 0 0-.659-.659H8.411l-.202.164zm-1.121-.905a.29.29 0 0 0 .113.023.286.286 0 0 0 .189-.07l.077-.063c.634-.508 4.672-3.743 4.672-7.575 0-2.55-2.215-4.625-4.938-4.625S2.221 5.006 2.221 7.556c0 3.225 2.86 6.027 4.144 7.137h.004l.04.038.484.4.077.063a.628.628 0 0 0 .074.047zm-2.52-.548a16.898 16.898 0 0 1-1.183-1.315C2.187 11.942.967 9.897.967 7.555c0-3.319 2.855-5.88 6.192-5.88 3.338 0 6.193 2.561 6.193 5.881 0 2.34-1.22 4.387-2.376 5.822a16.898 16.898 0 0 1-1.182 1.315h.15a1.912 1.912 0 0 1 1.914 1.914v1.84a1.912 1.912 0 0 1-1.914 1.914H4.377a1.912 1.912 0 0 1-1.914-1.914v-1.84a1.912 1.912 0 0 1 1.914-1.914zm3.82-6.935c0 .692-.55 1.222-1.187 1.222s-1.185-.529-1.185-1.222.548-1.222 1.185-1.222c.638 0 1.186.529 1.186 1.222zm-1.186 2.477c1.348 0 2.442-1.11 2.442-2.478S8.507 5.28 7.159 5.28 4.72 6.39 4.72 7.758s1.092 2.477 2.44 2.477zm2.048 7.71H5.114v-.838h4.093z%27/%3E%3Cpath fill=%27%23e1e3e9%27 d=%27M2.222 7.555c0-2.55 2.214-4.625 4.937-4.625 2.723 0 4.938 2.075 4.938 4.625 0 3.832-4.038 7.068-4.672 7.575l-.077.063a.286.286 0 0 1-.189.07.286.286 0 0 1-.188-.07l-.077-.063c-.634-.507-4.672-3.743-4.672-7.575zm4.937 2.68c1.348 0 2.442-1.11 2.442-2.478S8.507 5.28 7.159 5.28 4.72 6.39 4.72 7.758s1.092 2.477 2.44 2.477z%27/%3E%3Cpath fill=%27%23fff%27 d=%27M4.377 15.948a.657.657 0 0 0-.659.659v1.84a.657.657 0 0 0 .659.659h5.565a.657.657 0 0 0 .659-.659v-1.84a.657.657 0 0 0-.659-.659zm4.83 1.16H5.114v.838h4.093z%27/%3E%3C/g%3E%3C/svg%3E");background-repeat:no-repeat;cursor:pointer;display:block;height:23px;margin:0 0 -4px -4px;overflow:hidden;width:88px}a.maplibregl-ctrl-logo.maplibregl-compact{width:14px}@media (-ms-high-contrast:active){a.maplibregl-ctrl-logo{background-color:transparent;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2788%27 height=%2723%27 fill=%27none%27%3E%3Cpath fill=%27%23000%27 fill-opacity=%27.4%27 fill-rule=%27evenodd%27 d=%27M17.408 16.796h-1.827l2.501-12.095h.198l3.324 6.533.988 2.19.988-2.19 3.258-6.533h.181l2.6 12.095h-1.81l-1.218-5.644-.362-1.71-.658 1.71-2.929 5.644h-.098l-2.914-5.644-.757-1.71-.345 1.71zm1.958-3.42-.726 3.663a1.255 1.255 0 0 1-1.232 1.011h-1.827a1.255 1.255 0 0 1-1.229-1.509l2.501-12.095a1.255 1.255 0 0 1 1.23-1.001h.197a1.255 1.255 0 0 1 1.12.685l3.19 6.273 3.125-6.263a1.255 1.255 0 0 1 1.123-.695h.181a1.255 1.255 0 0 1 1.227.991l1.443 6.71a5.11 5.11 0 0 1 .314-.787l.009-.016a4.623 4.623 0 0 1 1.777-1.887c.782-.46 1.668-.667 2.611-.667a4.548 4.548 0 0 1 1.7.32l.306.134c.21-.16.474-.256.759-.256h1.694a1.255 1.255 0 0 1 1.212.925 1.255 1.255 0 0 1 1.212-.925h1.711c.284 0 .545.094.755.252.613-.3 1.312-.45 2.075-.45 1.356 0 2.557.445 3.482 1.4.314.319.566.676.763 1.064V4.701a1.255 1.255 0 0 1 1.255-1.255h1.86A1.255 1.255 0 0 1 54.44 4.7v9.194h2.217c.19 0 .37.043.532.118v-4.77c0-.356.147-.678.385-.906a2.416 2.416 0 0 1-.682-1.71c0-.665.267-1.253.735-1.7a2.448 2.448 0 0 1 1.722-.674 2.43 2.43 0 0 1 1.705.675c.211.2.381.43.504.683V4.7a1.255 1.255 0 0 1 1.255-1.255h1.744A1.255 1.255 0 0 1 65.812 4.7v3.335a4.76 4.76 0 0 1 1.526-.246c.938 0 1.817.214 2.59.69a4.47 4.47 0 0 1 1.67 1.743v-.98a1.255 1.255 0 0 1 1.256-1.256h1.777c.233 0 .451.064.639.174a3.407 3.407 0 0 1 1.567-.372c.346 0 .861.02 1.285.232a1.255 1.255 0 0 1 .689 1.004 4.73 4.73 0 0 1 .853-.588c.795-.44 1.675-.647 2.61-.647 1.385 0 2.65.39 3.525 1.396.836.938 1.168 2.173 1.168 3.528 0 .343-.02.694-.056 1.051a1.255 1.255 0 0 1-.947 1.09l.408.952a1.255 1.255 0 0 1-.477 1.552c-.418.268-.92.463-1.458.612-.613.171-1.304.244-2.049.244-1.06 0-2.043-.207-2.886-.698l-.015-.008c-.798-.48-1.419-1.135-1.818-1.963l-.004-.008a5.815 5.815 0 0 1-.548-2.512c0-.286.017-.567.053-.843a1.255 1.255 0 0 1-.333-.086l-.166-.004c-.223 0-.426.062-.643.228-.03.024-.142.139-.142.59v3.883a1.255 1.255 0 0 1-1.256 1.256h-1.777a1.255 1.255 0 0 1-1.256-1.256V15.69l-.032.057a4.778 4.778 0 0 1-1.86 1.833 5.04 5.04 0 0 1-2.484.634 4.47 4.47 0 0 1-1.935-.424 1.252 1.252 0 0 1-.764.258h-1.71a1.255 1.255 0 0 1-1.256-1.255V7.687a2.402 2.402 0 0 1-.428.625c.253.23.412.561.412.93v7.553a1.255 1.255 0 0 1-1.256 1.255h-1.843a1.25 1.25 0 0 1-.894-.373c-.228.23-.544.373-.894.373H51.32a1.255 1.255 0 0 1-1.256-1.255v-1.251l-.061.117a4.703 4.703 0 0 1-1.782 1.884 4.767 4.767 0 0 1-2.485.67 5.6 5.6 0 0 1-1.485-.188l.009 2.764a1.255 1.255 0 0 1-1.255 1.259h-1.729a1.255 1.255 0 0 1-1.255-1.255v-3.537a1.255 1.255 0 0 1-1.167.793h-1.679a1.25 1.25 0 0 1-.77-.263 4.47 4.47 0 0 1-1.945.429c-.885 0-1.724-.21-2.495-.632l-.017-.01a4.983 4.983 0 0 1-1.081-.836 1.255 1.255 0 0 1-1.254 1.312h-1.81a1.255 1.255 0 0 1-1.228-.99l-.782-3.625-2.044 3.939a1.255 1.255 0 0 1-1.115.676h-.098a1.255 1.255 0 0 1-1.116-.68l-2.061-3.994zM35.92 16.63l.207-.114.223-.15c.329-.237.574-.499.735-.785l.061-.118.033 1.332h1.678V9.242h-1.694l-.033 1.267c-.088-.22-.264-.438-.526-.658l-.032-.028a3.16 3.16 0 0 0-.668-.428l-.27-.12a3.293 3.293 0 0 0-1.235-.23c-.757 0-1.415.163-1.974.493a3.36 3.36 0 0 0-1.3 1.382c-.297.593-.444 1.284-.444 2.074 0 .8.17 1.503.51 2.107a3.795 3.795 0 0 0 1.382 1.381 3.883 3.883 0 0 0 1.893.477c.53 0 1.015-.11 1.455-.33zm-2.789-5.38c-.384.45-.575 1.038-.575 1.762 0 .735.186 1.332.559 1.794.384.45.933.675 1.645.675a2.25 2.25 0 0 0 .934-.19 2.17 2.17 0 0 0 .468-.29l.178-.161a2.163 2.163 0 0 0 .397-.561c.163-.333.244-.717.244-1.15v-.115c0-.472-.098-.894-.296-1.267l-.043-.077a2.211 2.211 0 0 0-.633-.709l-.13-.086-.047-.028a2.099 2.099 0 0 0-1.073-.285c-.702 0-1.244.231-1.629.692zm2.316 2.706c.163-.17.28-.407.28-.83v-.114c0-.292-.06-.508-.15-.68a.958.958 0 0 0-.353-.389.851.851 0 0 0-.464-.127c-.4 0-.56.114-.664.239l-.01.012c-.148.174-.275.45-.275.945 0 .506.122.801.27.99.097.11.266.224.68.224.303 0 .504-.09.687-.269zm7.545 1.705a2.626 2.626 0 0 0 .331.423c.213.22.464.402.755.548l.173.074c.433.17.93.255 1.49.255.68 0 1.295-.165 1.844-.493a3.447 3.447 0 0 0 1.316-1.4c.329-.603.493-1.299.493-2.089 0-1.273-.33-2.243-.988-2.913-.658-.68-1.52-1.02-2.584-1.02-.598 0-1.124.115-1.575.347a2.807 2.807 0 0 0-.415.262l-.199.166a3.35 3.35 0 0 0-.64.82V9.242h-1.712v11.553h1.729l-.017-5.134zm.53-1.138c.137.193.297.36.48.5l.155.11.053.034c.34.197.713.297 1.119.297.714 0 1.262-.225 1.645-.675.385-.46.576-1.048.576-1.762 0-.746-.192-1.338-.576-1.777-.372-.45-.92-.675-1.645-.675-.29 0-.569.053-.835.16a2.366 2.366 0 0 0-.284.136 1.99 1.99 0 0 0-.363.254 2.237 2.237 0 0 0-.46.569l-.082.162a2.56 2.56 0 0 0-.213 1.072v.115c0 .471.098.894.296 1.267l.135.211zm.964-.818a1.11 1.11 0 0 0 .367.385.937.937 0 0 0 .476.118c.423 0 .59-.117.687-.23.159-.194.28-.478.28-.95 0-.53-.133-.8-.266-.952l-.021-.025c-.078-.094-.231-.221-.68-.221a.995.995 0 0 0-.503.135l-.012.007a.859.859 0 0 0-.335.343c-.073.133-.132.324-.132.614v.115a1.43 1.43 0 0 0 .14.66zm15.7-6.222c.232-.23.346-.516.346-.856a1.053 1.053 0 0 0-.345-.79 1.175 1.175 0 0 0-.84-.329c-.34 0-.625.11-.855.33a1.053 1.053 0 0 0-.346.79c0 .34.115.625.346.855.23.23.516.346.856.346.34 0 .62-.115.839-.346zm4.337 9.314.033-1.332c.128.269.324.518.59.747l.098.081a3.727 3.727 0 0 0 .316.224l.223.122a3.21 3.21 0 0 0 1.44.322 3.785 3.785 0 0 0 1.875-.477 3.52 3.52 0 0 0 1.382-1.366c.352-.593.526-1.29.526-2.09 0-.79-.147-1.48-.444-2.073a3.235 3.235 0 0 0-1.283-1.399c-.549-.34-1.195-.51-1.942-.51a3.476 3.476 0 0 0-1.527.344l-.086.043-.165.09a3.412 3.412 0 0 0-.33.214c-.288.21-.507.446-.656.707a1.893 1.893 0 0 0-.099.198l.082-1.283V4.701h-1.744v12.095zm.473-2.509a2.482 2.482 0 0 0 .566.7c.078.065.159.125.245.18l.144.08a2.105 2.105 0 0 0 .975.232c.713 0 1.262-.225 1.645-.675.384-.46.576-1.053.576-1.778 0-.734-.192-1.327-.576-1.777-.373-.46-.921-.692-1.645-.692a2.18 2.18 0 0 0-1.015.235c-.147.075-.285.17-.415.282l-.15.142a2.086 2.086 0 0 0-.42.594c-.149.32-.223.685-.223 1.1v.115c0 .47.097.89.293 1.26zm2.616-.293c.157-.191.28-.479.28-.967 0-.51-.13-.79-.276-.961l-.021-.026c-.082-.1-.232-.225-.67-.225a.868.868 0 0 0-.681.279l-.012.011c-.154.155-.274.38-.274.807v.115c0 .285.057.499.144.669a1.13 1.13 0 0 0 .367.405c.137.082.28.123.455.123.423 0 .59-.118.686-.23zm8.266-3.013c.23-.087.472-.134.724-.14l.069-.002c.329 0 .542.033.642.099l.247-1.794c-.13-.066-.37-.099-.717-.099a2.3 2.3 0 0 0-.545.063 2.086 2.086 0 0 0-.411.148 2.18 2.18 0 0 0-.4.249 2.482 2.482 0 0 0-.485.499 2.659 2.659 0 0 0-.32.581l-.05.137v-1.48h-1.778v7.553h1.777v-3.884c0-.364.053-.678.159-.943a1.49 1.49 0 0 1 .466-.636 2.52 2.52 0 0 1 .399-.253 2.19 2.19 0 0 1 .224-.099zm9.784 2.656.05-.922c0-1.162-.285-2.062-.856-2.698-.559-.647-1.42-.97-2.584-.97-.746 0-1.415.163-2.007.493a3.462 3.462 0 0 0-1.4 1.382c-.329.604-.493 1.306-.493 2.106 0 .714.143 1.371.428 1.975.285.593.73 1.07 1.332 1.432.604.351 1.355.526 2.255.526.649 0 1.204-.062 1.668-.185l.044-.012.135-.04c.409-.122.736-.263.984-.421l-.542-1.267c-.2.108-.415.199-.642.274l-.297.087c-.34.088-.773.131-1.3.131-.636 0-1.135-.147-1.497-.444a1.573 1.573 0 0 1-.192-.193c-.244-.294-.415-.705-.512-1.234l-.004-.021h5.43zm-5.427-1.256-.003.022h3.752v-.138c-.007-.485-.104-.857-.288-1.118a1.056 1.056 0 0 0-.156-.176c-.307-.285-.746-.428-1.316-.428-.657 0-1.155.202-1.494.604-.253.3-.417.712-.494 1.234zm-27.053 2.77V4.7h-1.86v12.095h5.333V15.15zm7.103-5.908v7.553h-1.843V9.242h1.843z%27/%3E%3Cpath fill=%27%23fff%27 d=%27m19.63 11.151-.757-1.71-.345 1.71-1.12 5.644h-1.827L18.083 4.7h.197l3.325 6.533.988 2.19.988-2.19L26.839 4.7h.181l2.6 12.095h-1.81l-1.218-5.644-.362-1.71-.658 1.71-2.93 5.644h-.098l-2.913-5.644zm14.836 5.81c-.68 0-1.311-.16-1.893-.478a3.795 3.795 0 0 1-1.381-1.382c-.34-.604-.51-1.306-.51-2.106 0-.79.147-1.482.444-2.074a3.364 3.364 0 0 1 1.3-1.382c.559-.33 1.217-.494 1.974-.494a3.293 3.293 0 0 1 1.234.231 3.341 3.341 0 0 1 .97.575c.264.22.44.439.527.659l.033-1.267h1.694v7.553H37.18l-.033-1.332c-.186.395-.526.746-1.02 1.053a3.167 3.167 0 0 1-1.662.444zm.296-1.482c.626 0 1.152-.214 1.58-.642.428-.44.642-1.01.642-1.711v-.115c0-.472-.098-.894-.296-1.267a2.211 2.211 0 0 0-.807-.872 2.098 2.098 0 0 0-1.119-.313c-.702 0-1.245.231-1.629.692-.384.45-.575 1.037-.575 1.76 0 .736.186 1.333.559 1.795.384.45.933.675 1.645.675zm6.521-6.237h1.711v1.4c.604-1.065 1.547-1.597 2.83-1.597 1.064 0 1.926.34 2.584 1.02.659.67.988 1.641.988 2.914 0 .79-.164 1.487-.493 2.09a3.456 3.456 0 0 1-1.316 1.399 3.51 3.51 0 0 1-1.844.493c-.636 0-1.19-.11-1.662-.329a2.665 2.665 0 0 1-1.086-.97l.017 5.134h-1.728V9.242zm4.048 6.22c.714 0 1.262-.224 1.645-.674.385-.46.576-1.048.576-1.762 0-.746-.192-1.338-.576-1.777-.372-.45-.92-.675-1.645-.675-.395 0-.768.098-1.12.296-.34.187-.613.46-.822.823-.197.351-.296.763-.296 1.234v.115c0 .472.098.894.296 1.267.209.362.483.647.823.855.34.197.713.297 1.119.297z%27/%3E%3Cpath fill=%27%23e1e3e9%27 d=%27M51.325 4.7h1.86v10.45h3.473v1.646h-5.333zm7.12 4.542h1.843v7.553h-1.843zm.905-1.415a1.159 1.159 0 0 1-.856-.346 1.165 1.165 0 0 1-.346-.856 1.053 1.053 0 0 1 .346-.79c.23-.219.516-.329.856-.329.329 0 .609.11.839.33a1.053 1.053 0 0 1 .345.79 1.159 1.159 0 0 1-.345.855c-.22.23-.5.346-.84.346zm7.875 9.133a3.167 3.167 0 0 1-1.662-.444c-.482-.307-.817-.658-1.004-1.053l-.033 1.332h-1.71V4.701h1.743v4.657l-.082 1.283c.186-.438.548-.812 1.086-1.119a3.486 3.486 0 0 1 1.778-.477c.746 0 1.393.17 1.942.51a3.235 3.235 0 0 1 1.283 1.4c.297.592.444 1.282.444 2.072 0 .8-.175 1.498-.526 2.09a3.52 3.52 0 0 1-1.382 1.366 3.785 3.785 0 0 1-1.876.477zm-.296-1.481c.713 0 1.26-.225 1.645-.675.384-.46.577-1.053.577-1.778 0-.734-.193-1.327-.577-1.776-.373-.46-.921-.692-1.645-.692a2.115 2.115 0 0 0-1.58.659c-.428.428-.642.992-.642 1.694v.115c0 .473.098.895.296 1.267a2.385 2.385 0 0 0 .807.872 2.1 2.1 0 0 0 1.119.313zm5.927-6.237h1.777v1.481c.176-.505.46-.91.856-1.217a2.14 2.14 0 0 1 1.349-.46c.351 0 .593.032.724.098l-.247 1.794c-.099-.066-.313-.099-.642-.099-.516 0-.988.164-1.416.494-.417.329-.626.855-.626 1.58v3.883h-1.777V9.242zm9.534 7.718c-.9 0-1.651-.175-2.255-.526-.603-.362-1.047-.84-1.332-1.432a4.567 4.567 0 0 1-.428-1.975c0-.8.164-1.502.493-2.106a3.462 3.462 0 0 1 1.4-1.382c.592-.33 1.262-.494 2.007-.494 1.163 0 2.024.324 2.584.97.57.637.856 1.537.856 2.7 0 .296-.017.603-.05.92h-5.43c.12.67.356 1.153.708 1.45.362.296.86.443 1.497.443.526 0 .96-.044 1.3-.131a4.123 4.123 0 0 0 .938-.362l.542 1.267c-.274.175-.647.329-1.119.46-.472.132-1.042.197-1.711.197zm1.596-4.558c.01-.68-.137-1.158-.444-1.432-.307-.285-.746-.428-1.316-.428-1.152 0-1.815.62-1.991 1.86h3.752z%27/%3E%3Cg fill-rule=%27evenodd%27 stroke-width=%271.036%27%3E%3Cpath fill=%27%23000%27 fill-opacity=%27.4%27 d=%27m8.166 16.146-.002.002a1.54 1.54 0 0 1-2.009 0l-.002-.002-.043-.034-.002-.002-.199-.162H4.377a.657.657 0 0 0-.659.659v1.84a.657.657 0 0 0 .659.659h5.565a.657.657 0 0 0 .659-.659v-1.84a.657.657 0 0 0-.659-.659H8.411l-.202.164zm-1.121-.905a.29.29 0 0 0 .113.023.286.286 0 0 0 .189-.07l.077-.063c.634-.508 4.672-3.743 4.672-7.575 0-2.55-2.215-4.625-4.938-4.625S2.221 5.006 2.221 7.556c0 3.225 2.86 6.027 4.144 7.137h.004l.04.038.484.4.077.063a.628.628 0 0 0 .074.047zm-2.52-.548a16.898 16.898 0 0 1-1.183-1.315C2.187 11.942.967 9.897.967 7.555c0-3.319 2.855-5.88 6.192-5.88 3.338 0 6.193 2.561 6.193 5.881 0 2.34-1.22 4.387-2.376 5.822a16.898 16.898 0 0 1-1.182 1.315h.15a1.912 1.912 0 0 1 1.914 1.914v1.84a1.912 1.912 0 0 1-1.914 1.914H4.377a1.912 1.912 0 0 1-1.914-1.914v-1.84a1.912 1.912 0 0 1 1.914-1.914zm3.82-6.935c0 .692-.55 1.222-1.187 1.222s-1.185-.529-1.185-1.222.548-1.222 1.185-1.222c.638 0 1.186.529 1.186 1.222zm-1.186 2.477c1.348 0 2.442-1.11 2.442-2.478S8.507 5.28 7.159 5.28 4.72 6.39 4.72 7.758s1.092 2.477 2.44 2.477zm2.048 7.71H5.114v-.838h4.093z%27/%3E%3Cpath fill=%27%23e1e3e9%27 d=%27M2.222 7.555c0-2.55 2.214-4.625 4.937-4.625 2.723 0 4.938 2.075 4.938 4.625 0 3.832-4.038 7.068-4.672 7.575l-.077.063a.286.286 0 0 1-.189.07.286.286 0 0 1-.188-.07l-.077-.063c-.634-.507-4.672-3.743-4.672-7.575zm4.937 2.68c1.348 0 2.442-1.11 2.442-2.478S8.507 5.28 7.159 5.28 4.72 6.39 4.72 7.758s1.092 2.477 2.44 2.477z%27/%3E%3Cpath fill=%27%23fff%27 d=%27M4.377 15.948a.657.657 0 0 0-.659.659v1.84a.657.657 0 0 0 .659.659h5.565a.657.657 0 0 0 .659-.659v-1.84a.657.657 0 0 0-.659-.659zm4.83 1.16H5.114v.838h4.093z%27/%3E%3C/g%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){a.maplibregl-ctrl-logo{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2788%27 height=%2723%27 fill=%27none%27%3E%3Cpath fill=%27%23000%27 fill-opacity=%27.4%27 fill-rule=%27evenodd%27 d=%27M17.408 16.796h-1.827l2.501-12.095h.198l3.324 6.533.988 2.19.988-2.19 3.258-6.533h.181l2.6 12.095h-1.81l-1.218-5.644-.362-1.71-.658 1.71-2.929 5.644h-.098l-2.914-5.644-.757-1.71-.345 1.71zm1.958-3.42-.726 3.663a1.255 1.255 0 0 1-1.232 1.011h-1.827a1.255 1.255 0 0 1-1.229-1.509l2.501-12.095a1.255 1.255 0 0 1 1.23-1.001h.197a1.255 1.255 0 0 1 1.12.685l3.19 6.273 3.125-6.263a1.255 1.255 0 0 1 1.123-.695h.181a1.255 1.255 0 0 1 1.227.991l1.443 6.71a5.11 5.11 0 0 1 .314-.787l.009-.016a4.623 4.623 0 0 1 1.777-1.887c.782-.46 1.668-.667 2.611-.667a4.548 4.548 0 0 1 1.7.32l.306.134c.21-.16.474-.256.759-.256h1.694a1.255 1.255 0 0 1 1.212.925 1.255 1.255 0 0 1 1.212-.925h1.711c.284 0 .545.094.755.252.613-.3 1.312-.45 2.075-.45 1.356 0 2.557.445 3.482 1.4.314.319.566.676.763 1.064V4.701a1.255 1.255 0 0 1 1.255-1.255h1.86A1.255 1.255 0 0 1 54.44 4.7v9.194h2.217c.19 0 .37.043.532.118v-4.77c0-.356.147-.678.385-.906a2.416 2.416 0 0 1-.682-1.71c0-.665.267-1.253.735-1.7a2.448 2.448 0 0 1 1.722-.674 2.43 2.43 0 0 1 1.705.675c.211.2.381.43.504.683V4.7a1.255 1.255 0 0 1 1.255-1.255h1.744A1.255 1.255 0 0 1 65.812 4.7v3.335a4.76 4.76 0 0 1 1.526-.246c.938 0 1.817.214 2.59.69a4.47 4.47 0 0 1 1.67 1.743v-.98a1.255 1.255 0 0 1 1.256-1.256h1.777c.233 0 .451.064.639.174a3.407 3.407 0 0 1 1.567-.372c.346 0 .861.02 1.285.232a1.255 1.255 0 0 1 .689 1.004 4.73 4.73 0 0 1 .853-.588c.795-.44 1.675-.647 2.61-.647 1.385 0 2.65.39 3.525 1.396.836.938 1.168 2.173 1.168 3.528 0 .343-.02.694-.056 1.051a1.255 1.255 0 0 1-.947 1.09l.408.952a1.255 1.255 0 0 1-.477 1.552c-.418.268-.92.463-1.458.612-.613.171-1.304.244-2.049.244-1.06 0-2.043-.207-2.886-.698l-.015-.008c-.798-.48-1.419-1.135-1.818-1.963l-.004-.008a5.815 5.815 0 0 1-.548-2.512c0-.286.017-.567.053-.843a1.255 1.255 0 0 1-.333-.086l-.166-.004c-.223 0-.426.062-.643.228-.03.024-.142.139-.142.59v3.883a1.255 1.255 0 0 1-1.256 1.256h-1.777a1.255 1.255 0 0 1-1.256-1.256V15.69l-.032.057a4.778 4.778 0 0 1-1.86 1.833 5.04 5.04 0 0 1-2.484.634 4.47 4.47 0 0 1-1.935-.424 1.252 1.252 0 0 1-.764.258h-1.71a1.255 1.255 0 0 1-1.256-1.255V7.687a2.402 2.402 0 0 1-.428.625c.253.23.412.561.412.93v7.553a1.255 1.255 0 0 1-1.256 1.255h-1.843a1.25 1.25 0 0 1-.894-.373c-.228.23-.544.373-.894.373H51.32a1.255 1.255 0 0 1-1.256-1.255v-1.251l-.061.117a4.703 4.703 0 0 1-1.782 1.884 4.767 4.767 0 0 1-2.485.67 5.6 5.6 0 0 1-1.485-.188l.009 2.764a1.255 1.255 0 0 1-1.255 1.259h-1.729a1.255 1.255 0 0 1-1.255-1.255v-3.537a1.255 1.255 0 0 1-1.167.793h-1.679a1.25 1.25 0 0 1-.77-.263 4.47 4.47 0 0 1-1.945.429c-.885 0-1.724-.21-2.495-.632l-.017-.01a4.983 4.983 0 0 1-1.081-.836 1.255 1.255 0 0 1-1.254 1.312h-1.81a1.255 1.255 0 0 1-1.228-.99l-.782-3.625-2.044 3.939a1.255 1.255 0 0 1-1.115.676h-.098a1.255 1.255 0 0 1-1.116-.68l-2.061-3.994zM35.92 16.63l.207-.114.223-.15c.329-.237.574-.499.735-.785l.061-.118.033 1.332h1.678V9.242h-1.694l-.033 1.267c-.088-.22-.264-.438-.526-.658l-.032-.028a3.16 3.16 0 0 0-.668-.428l-.27-.12a3.293 3.293 0 0 0-1.235-.23c-.757 0-1.415.163-1.974.493a3.36 3.36 0 0 0-1.3 1.382c-.297.593-.444 1.284-.444 2.074 0 .8.17 1.503.51 2.107a3.795 3.795 0 0 0 1.382 1.381 3.883 3.883 0 0 0 1.893.477c.53 0 1.015-.11 1.455-.33zm-2.789-5.38c-.384.45-.575 1.038-.575 1.762 0 .735.186 1.332.559 1.794.384.45.933.675 1.645.675a2.25 2.25 0 0 0 .934-.19 2.17 2.17 0 0 0 .468-.29l.178-.161a2.163 2.163 0 0 0 .397-.561c.163-.333.244-.717.244-1.15v-.115c0-.472-.098-.894-.296-1.267l-.043-.077a2.211 2.211 0 0 0-.633-.709l-.13-.086-.047-.028a2.099 2.099 0 0 0-1.073-.285c-.702 0-1.244.231-1.629.692zm2.316 2.706c.163-.17.28-.407.28-.83v-.114c0-.292-.06-.508-.15-.68a.958.958 0 0 0-.353-.389.851.851 0 0 0-.464-.127c-.4 0-.56.114-.664.239l-.01.012c-.148.174-.275.45-.275.945 0 .506.122.801.27.99.097.11.266.224.68.224.303 0 .504-.09.687-.269zm7.545 1.705a2.626 2.626 0 0 0 .331.423c.213.22.464.402.755.548l.173.074c.433.17.93.255 1.49.255.68 0 1.295-.165 1.844-.493a3.447 3.447 0 0 0 1.316-1.4c.329-.603.493-1.299.493-2.089 0-1.273-.33-2.243-.988-2.913-.658-.68-1.52-1.02-2.584-1.02-.598 0-1.124.115-1.575.347a2.807 2.807 0 0 0-.415.262l-.199.166a3.35 3.35 0 0 0-.64.82V9.242h-1.712v11.553h1.729l-.017-5.134zm.53-1.138c.137.193.297.36.48.5l.155.11.053.034c.34.197.713.297 1.119.297.714 0 1.262-.225 1.645-.675.385-.46.576-1.048.576-1.762 0-.746-.192-1.338-.576-1.777-.372-.45-.92-.675-1.645-.675-.29 0-.569.053-.835.16a2.366 2.366 0 0 0-.284.136 1.99 1.99 0 0 0-.363.254 2.237 2.237 0 0 0-.46.569l-.082.162a2.56 2.56 0 0 0-.213 1.072v.115c0 .471.098.894.296 1.267l.135.211zm.964-.818a1.11 1.11 0 0 0 .367.385.937.937 0 0 0 .476.118c.423 0 .59-.117.687-.23.159-.194.28-.478.28-.95 0-.53-.133-.8-.266-.952l-.021-.025c-.078-.094-.231-.221-.68-.221a.995.995 0 0 0-.503.135l-.012.007a.859.859 0 0 0-.335.343c-.073.133-.132.324-.132.614v.115a1.43 1.43 0 0 0 .14.66zm15.7-6.222c.232-.23.346-.516.346-.856a1.053 1.053 0 0 0-.345-.79 1.175 1.175 0 0 0-.84-.329c-.34 0-.625.11-.855.33a1.053 1.053 0 0 0-.346.79c0 .34.115.625.346.855.23.23.516.346.856.346.34 0 .62-.115.839-.346zm4.337 9.314.033-1.332c.128.269.324.518.59.747l.098.081a3.727 3.727 0 0 0 .316.224l.223.122a3.21 3.21 0 0 0 1.44.322 3.785 3.785 0 0 0 1.875-.477 3.52 3.52 0 0 0 1.382-1.366c.352-.593.526-1.29.526-2.09 0-.79-.147-1.48-.444-2.073a3.235 3.235 0 0 0-1.283-1.399c-.549-.34-1.195-.51-1.942-.51a3.476 3.476 0 0 0-1.527.344l-.086.043-.165.09a3.412 3.412 0 0 0-.33.214c-.288.21-.507.446-.656.707a1.893 1.893 0 0 0-.099.198l.082-1.283V4.701h-1.744v12.095zm.473-2.509a2.482 2.482 0 0 0 .566.7c.078.065.159.125.245.18l.144.08a2.105 2.105 0 0 0 .975.232c.713 0 1.262-.225 1.645-.675.384-.46.576-1.053.576-1.778 0-.734-.192-1.327-.576-1.777-.373-.46-.921-.692-1.645-.692a2.18 2.18 0 0 0-1.015.235c-.147.075-.285.17-.415.282l-.15.142a2.086 2.086 0 0 0-.42.594c-.149.32-.223.685-.223 1.1v.115c0 .47.097.89.293 1.26zm2.616-.293c.157-.191.28-.479.28-.967 0-.51-.13-.79-.276-.961l-.021-.026c-.082-.1-.232-.225-.67-.225a.868.868 0 0 0-.681.279l-.012.011c-.154.155-.274.38-.274.807v.115c0 .285.057.499.144.669a1.13 1.13 0 0 0 .367.405c.137.082.28.123.455.123.423 0 .59-.118.686-.23zm8.266-3.013c.23-.087.472-.134.724-.14l.069-.002c.329 0 .542.033.642.099l.247-1.794c-.13-.066-.37-.099-.717-.099a2.3 2.3 0 0 0-.545.063 2.086 2.086 0 0 0-.411.148 2.18 2.18 0 0 0-.4.249 2.482 2.482 0 0 0-.485.499 2.659 2.659 0 0 0-.32.581l-.05.137v-1.48h-1.778v7.553h1.777v-3.884c0-.364.053-.678.159-.943a1.49 1.49 0 0 1 .466-.636 2.52 2.52 0 0 1 .399-.253 2.19 2.19 0 0 1 .224-.099zm9.784 2.656.05-.922c0-1.162-.285-2.062-.856-2.698-.559-.647-1.42-.97-2.584-.97-.746 0-1.415.163-2.007.493a3.462 3.462 0 0 0-1.4 1.382c-.329.604-.493 1.306-.493 2.106 0 .714.143 1.371.428 1.975.285.593.73 1.07 1.332 1.432.604.351 1.355.526 2.255.526.649 0 1.204-.062 1.668-.185l.044-.012.135-.04c.409-.122.736-.263.984-.421l-.542-1.267c-.2.108-.415.199-.642.274l-.297.087c-.34.088-.773.131-1.3.131-.636 0-1.135-.147-1.497-.444a1.573 1.573 0 0 1-.192-.193c-.244-.294-.415-.705-.512-1.234l-.004-.021h5.43zm-5.427-1.256-.003.022h3.752v-.138c-.007-.485-.104-.857-.288-1.118a1.056 1.056 0 0 0-.156-.176c-.307-.285-.746-.428-1.316-.428-.657 0-1.155.202-1.494.604-.253.3-.417.712-.494 1.234zm-27.053 2.77V4.7h-1.86v12.095h5.333V15.15zm7.103-5.908v7.553h-1.843V9.242h1.843z%27/%3E%3Cpath fill=%27%23fff%27 d=%27m19.63 11.151-.757-1.71-.345 1.71-1.12 5.644h-1.827L18.083 4.7h.197l3.325 6.533.988 2.19.988-2.19L26.839 4.7h.181l2.6 12.095h-1.81l-1.218-5.644-.362-1.71-.658 1.71-2.93 5.644h-.098l-2.913-5.644zm14.836 5.81c-.68 0-1.311-.16-1.893-.478a3.795 3.795 0 0 1-1.381-1.382c-.34-.604-.51-1.306-.51-2.106 0-.79.147-1.482.444-2.074a3.364 3.364 0 0 1 1.3-1.382c.559-.33 1.217-.494 1.974-.494a3.293 3.293 0 0 1 1.234.231 3.341 3.341 0 0 1 .97.575c.264.22.44.439.527.659l.033-1.267h1.694v7.553H37.18l-.033-1.332c-.186.395-.526.746-1.02 1.053a3.167 3.167 0 0 1-1.662.444zm.296-1.482c.626 0 1.152-.214 1.58-.642.428-.44.642-1.01.642-1.711v-.115c0-.472-.098-.894-.296-1.267a2.211 2.211 0 0 0-.807-.872 2.098 2.098 0 0 0-1.119-.313c-.702 0-1.245.231-1.629.692-.384.45-.575 1.037-.575 1.76 0 .736.186 1.333.559 1.795.384.45.933.675 1.645.675zm6.521-6.237h1.711v1.4c.604-1.065 1.547-1.597 2.83-1.597 1.064 0 1.926.34 2.584 1.02.659.67.988 1.641.988 2.914 0 .79-.164 1.487-.493 2.09a3.456 3.456 0 0 1-1.316 1.399 3.51 3.51 0 0 1-1.844.493c-.636 0-1.19-.11-1.662-.329a2.665 2.665 0 0 1-1.086-.97l.017 5.134h-1.728V9.242zm4.048 6.22c.714 0 1.262-.224 1.645-.674.385-.46.576-1.048.576-1.762 0-.746-.192-1.338-.576-1.777-.372-.45-.92-.675-1.645-.675-.395 0-.768.098-1.12.296-.34.187-.613.46-.822.823-.197.351-.296.763-.296 1.234v.115c0 .472.098.894.296 1.267.209.362.483.647.823.855.34.197.713.297 1.119.297z%27/%3E%3Cpath fill=%27%23e1e3e9%27 d=%27M51.325 4.7h1.86v10.45h3.473v1.646h-5.333zm7.12 4.542h1.843v7.553h-1.843zm.905-1.415a1.159 1.159 0 0 1-.856-.346 1.165 1.165 0 0 1-.346-.856 1.053 1.053 0 0 1 .346-.79c.23-.219.516-.329.856-.329.329 0 .609.11.839.33a1.053 1.053 0 0 1 .345.79 1.159 1.159 0 0 1-.345.855c-.22.23-.5.346-.84.346zm7.875 9.133a3.167 3.167 0 0 1-1.662-.444c-.482-.307-.817-.658-1.004-1.053l-.033 1.332h-1.71V4.701h1.743v4.657l-.082 1.283c.186-.438.548-.812 1.086-1.119a3.486 3.486 0 0 1 1.778-.477c.746 0 1.393.17 1.942.51a3.235 3.235 0 0 1 1.283 1.4c.297.592.444 1.282.444 2.072 0 .8-.175 1.498-.526 2.09a3.52 3.52 0 0 1-1.382 1.366 3.785 3.785 0 0 1-1.876.477zm-.296-1.481c.713 0 1.26-.225 1.645-.675.384-.46.577-1.053.577-1.778 0-.734-.193-1.327-.577-1.776-.373-.46-.921-.692-1.645-.692a2.115 2.115 0 0 0-1.58.659c-.428.428-.642.992-.642 1.694v.115c0 .473.098.895.296 1.267a2.385 2.385 0 0 0 .807.872 2.1 2.1 0 0 0 1.119.313zm5.927-6.237h1.777v1.481c.176-.505.46-.91.856-1.217a2.14 2.14 0 0 1 1.349-.46c.351 0 .593.032.724.098l-.247 1.794c-.099-.066-.313-.099-.642-.099-.516 0-.988.164-1.416.494-.417.329-.626.855-.626 1.58v3.883h-1.777V9.242zm9.534 7.718c-.9 0-1.651-.175-2.255-.526-.603-.362-1.047-.84-1.332-1.432a4.567 4.567 0 0 1-.428-1.975c0-.8.164-1.502.493-2.106a3.462 3.462 0 0 1 1.4-1.382c.592-.33 1.262-.494 2.007-.494 1.163 0 2.024.324 2.584.97.57.637.856 1.537.856 2.7 0 .296-.017.603-.05.92h-5.43c.12.67.356 1.153.708 1.45.362.296.86.443 1.497.443.526 0 .96-.044 1.3-.131a4.123 4.123 0 0 0 .938-.362l.542 1.267c-.274.175-.647.329-1.119.46-.472.132-1.042.197-1.711.197zm1.596-4.558c.01-.68-.137-1.158-.444-1.432-.307-.285-.746-.428-1.316-.428-1.152 0-1.815.62-1.991 1.86h3.752z%27/%3E%3Cg fill-rule=%27evenodd%27 stroke-width=%271.036%27%3E%3Cpath fill=%27%23000%27 fill-opacity=%27.4%27 d=%27m8.166 16.146-.002.002a1.54 1.54 0 0 1-2.009 0l-.002-.002-.043-.034-.002-.002-.199-.162H4.377a.657.657 0 0 0-.659.659v1.84a.657.657 0 0 0 .659.659h5.565a.657.657 0 0 0 .659-.659v-1.84a.657.657 0 0 0-.659-.659H8.411l-.202.164zm-1.121-.905a.29.29 0 0 0 .113.023.286.286 0 0 0 .189-.07l.077-.063c.634-.508 4.672-3.743 4.672-7.575 0-2.55-2.215-4.625-4.938-4.625S2.221 5.006 2.221 7.556c0 3.225 2.86 6.027 4.144 7.137h.004l.04.038.484.4.077.063a.628.628 0 0 0 .074.047zm-2.52-.548a16.898 16.898 0 0 1-1.183-1.315C2.187 11.942.967 9.897.967 7.555c0-3.319 2.855-5.88 6.192-5.88 3.338 0 6.193 2.561 6.193 5.881 0 2.34-1.22 4.387-2.376 5.822a16.898 16.898 0 0 1-1.182 1.315h.15a1.912 1.912 0 0 1 1.914 1.914v1.84a1.912 1.912 0 0 1-1.914 1.914H4.377a1.912 1.912 0 0 1-1.914-1.914v-1.84a1.912 1.912 0 0 1 1.914-1.914zm3.82-6.935c0 .692-.55 1.222-1.187 1.222s-1.185-.529-1.185-1.222.548-1.222 1.185-1.222c.638 0 1.186.529 1.186 1.222zm-1.186 2.477c1.348 0 2.442-1.11 2.442-2.478S8.507 5.28 7.159 5.28 4.72 6.39 4.72 7.758s1.092 2.477 2.44 2.477zm2.048 7.71H5.114v-.838h4.093z%27/%3E%3Cpath fill=%27%23e1e3e9%27 d=%27M2.222 7.555c0-2.55 2.214-4.625 4.937-4.625 2.723 0 4.938 2.075 4.938 4.625 0 3.832-4.038 7.068-4.672 7.575l-.077.063a.286.286 0 0 1-.189.07.286.286 0 0 1-.188-.07l-.077-.063c-.634-.507-4.672-3.743-4.672-7.575zm4.937 2.68c1.348 0 2.442-1.11 2.442-2.478S8.507 5.28 7.159 5.28 4.72 6.39 4.72 7.758s1.092 2.477 2.44 2.477z%27/%3E%3Cpath fill=%27%23fff%27 d=%27M4.377 15.948a.657.657 0 0 0-.659.659v1.84a.657.657 0 0 0 .659.659h5.565a.657.657 0 0 0 .659-.659v-1.84a.657.657 0 0 0-.659-.659zm4.83 1.16H5.114v.838h4.093z%27/%3E%3C/g%3E%3C/svg%3E")}}.maplibregl-ctrl.maplibregl-ctrl-attrib{background-color:hsla(0,0%,100%,.5);margin:0;padding:0 5px}@media screen{.maplibregl-ctrl-attrib.maplibregl-compact{background-color:#fff;border-radius:12px;box-sizing:content-box;margin:10px;min-height:20px;padding:2px 24px 2px 0;position:relative}.maplibregl-ctrl-attrib.maplibregl-compact-show{padding:2px 28px 2px 8px;visibility:visible}.maplibregl-ctrl-bottom-left>.maplibregl-ctrl-attrib.maplibregl-compact-show,.maplibregl-ctrl-top-left>.maplibregl-ctrl-attrib.maplibregl-compact-show{border-radius:12px;padding:2px 8px 2px 28px}.maplibregl-ctrl-attrib.maplibregl-compact .maplibregl-ctrl-attrib-inner{display:none}.maplibregl-ctrl-attrib-button{background-color:hsla(0,0%,100%,.5);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2724%27 height=%2724%27 fill-rule=%27evenodd%27 viewBox=%270 0 20 20%27%3E%3Cpath d=%27M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0%27/%3E%3C/svg%3E");border:0;border-radius:12px;box-sizing:border-box;cursor:pointer;display:none;height:24px;outline:none;position:absolute;right:0;top:0;width:24px}.maplibregl-ctrl-attrib summary.maplibregl-ctrl-attrib-button{appearance:none;list-style:none}.maplibregl-ctrl-attrib summary.maplibregl-ctrl-attrib-button::-webkit-details-marker{display:none}.maplibregl-ctrl-bottom-left .maplibregl-ctrl-attrib-button,.maplibregl-ctrl-top-left .maplibregl-ctrl-attrib-button{left:0}.maplibregl-ctrl-attrib.maplibregl-compact .maplibregl-ctrl-attrib-button,.maplibregl-ctrl-attrib.maplibregl-compact-show .maplibregl-ctrl-attrib-inner{display:block}.maplibregl-ctrl-attrib.maplibregl-compact-show .maplibregl-ctrl-attrib-button{background-color:rgb(0 0 0/5%)}.maplibregl-ctrl-bottom-right>.maplibregl-ctrl-attrib.maplibregl-compact:after{bottom:0;right:0}.maplibregl-ctrl-top-right>.maplibregl-ctrl-attrib.maplibregl-compact:after{right:0;top:0}.maplibregl-ctrl-top-left>.maplibregl-ctrl-attrib.maplibregl-compact:after{left:0;top:0}.maplibregl-ctrl-bottom-left>.maplibregl-ctrl-attrib.maplibregl-compact:after{bottom:0;left:0}}@media screen and (-ms-high-contrast:active){.maplibregl-ctrl-attrib.maplibregl-compact:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2724%27 height=%2724%27 fill=%27%23fff%27 fill-rule=%27evenodd%27 viewBox=%270 0 20 20%27%3E%3Cpath d=%27M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0%27/%3E%3C/svg%3E")}}@media screen and (-ms-high-contrast:black-on-white){.maplibregl-ctrl-attrib.maplibregl-compact:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%2724%27 height=%2724%27 fill-rule=%27evenodd%27 viewBox=%270 0 20 20%27%3E%3Cpath d=%27M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0%27/%3E%3C/svg%3E")}}.maplibregl-ctrl-attrib a{color:rgba(0,0,0,.75);text-decoration:none}.maplibregl-ctrl-attrib a:hover{color:inherit;text-decoration:underline}.maplibregl-attrib-empty{display:none}.maplibregl-ctrl-scale{background-color:hsla(0,0%,100%,.75);border:2px solid #333;border-top:#333;box-sizing:border-box;color:#333;font-size:10px;padding:0 5px}.maplibregl-popup{display:flex;left:0;pointer-events:none;position:absolute;top:0;will-change:transform}.maplibregl-popup-anchor-top,.maplibregl-popup-anchor-top-left,.maplibregl-popup-anchor-top-right{flex-direction:column}.maplibregl-popup-anchor-bottom,.maplibregl-popup-anchor-bottom-left,.maplibregl-popup-anchor-bottom-right{flex-direction:column-reverse}.maplibregl-popup-anchor-left{flex-direction:row}.maplibregl-popup-anchor-right{flex-direction:row-reverse}.maplibregl-popup-tip{border:10px solid transparent;height:0;width:0;z-index:1}.maplibregl-popup-anchor-top .maplibregl-popup-tip{align-self:center;border-bottom-color:#fff;border-top:none}.maplibregl-popup-anchor-top-left .maplibregl-popup-tip{align-self:flex-start;border-bottom-color:#fff;border-left:none;border-top:none}.maplibregl-popup-anchor-top-right .maplibregl-popup-tip{align-self:flex-end;border-bottom-color:#fff;border-right:none;border-top:none}.maplibregl-popup-anchor-bottom .maplibregl-popup-tip{align-self:center;border-bottom:none;border-top-color:#fff}.maplibregl-popup-anchor-bottom-left .maplibregl-popup-tip{align-self:flex-start;border-bottom:none;border-left:none;border-top-color:#fff}.maplibregl-popup-anchor-bottom-right .maplibregl-popup-tip{align-self:flex-end;border-bottom:none;border-right:none;border-top-color:#fff}.maplibregl-popup-anchor-left .maplibregl-popup-tip{align-self:center;border-left:none;border-right-color:#fff}.maplibregl-popup-anchor-right .maplibregl-popup-tip{align-self:center;border-left-color:#fff;border-right:none}.maplibregl-popup-close-button{background-color:transparent;border:0;border-radius:0 3px 0 0;cursor:pointer;position:absolute;right:0;top:0}.maplibregl-popup-close-button:hover{background-color:rgb(0 0 0/5%)}.maplibregl-popup-content{background:#fff;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.1);padding:15px 10px;pointer-events:auto;position:relative}.maplibregl-popup-anchor-top-left .maplibregl-popup-content{border-top-left-radius:0}.maplibregl-popup-anchor-top-right .maplibregl-popup-content{border-top-right-radius:0}.maplibregl-popup-anchor-bottom-left .maplibregl-popup-content{border-bottom-left-radius:0}.maplibregl-popup-anchor-bottom-right .maplibregl-popup-content{border-bottom-right-radius:0}.maplibregl-popup-track-pointer{display:none}.maplibregl-popup-track-pointer *{pointer-events:none;user-select:none}.maplibregl-map:hover .maplibregl-popup-track-pointer{display:flex}.maplibregl-map:active .maplibregl-popup-track-pointer{display:none}.maplibregl-marker{left:0;position:absolute;top:0;will-change:transform}.maplibregl-user-location-dot,.maplibregl-user-location-dot:before{background-color:#1da1f2;border-radius:50%;height:15px;width:15px}.maplibregl-user-location-dot:before{animation:maplibregl-user-location-dot-pulse 2s infinite;content:"";position:absolute}.maplibregl-user-location-dot:after{border:2px solid #fff;border-radius:50%;box-shadow:0 0 3px rgba(0,0,0,.35);box-sizing:border-box;content:"";height:19px;left:-2px;position:absolute;top:-2px;width:19px}@keyframes maplibregl-user-location-dot-pulse{0%{opacity:1;transform:scale(1)}70%{opacity:0;transform:scale(3)}to{opacity:0;transform:scale(1)}}.maplibregl-user-location-dot-stale{background-color:#aaa}.maplibregl-user-location-dot-stale:after{display:none}.maplibregl-user-location-accuracy-circle{background-color:#1da1f233;border-radius:100%;height:1px;width:1px}.maplibregl-crosshair,.maplibregl-crosshair .maplibregl-interactive,.maplibregl-crosshair .maplibregl-interactive:active{cursor:crosshair}.maplibregl-boxzoom{background:#fff;border:2px dotted #202020;height:0;left:0;opacity:.5;position:absolute;top:0;width:0}.maplibregl-cooperative-gesture-screen{align-items:center;background:rgba(0,0,0,.4);color:#fff;display:flex;font-size:1.4em;inset:0;justify-content:center;line-height:1.2;opacity:0;padding:1rem;pointer-events:none;position:absolute;transition:opacity 1s ease 1s;z-index:99999}.maplibregl-cooperative-gesture-screen.maplibregl-show{opacity:1;transition:opacity .05s}.maplibregl-cooperative-gesture-screen .maplibregl-mobile-message{display:none}@media (hover:none),(width <= 480px){.maplibregl-cooperative-gesture-screen .maplibregl-desktop-message{display:none}.maplibregl-cooperative-gesture-screen .maplibregl-mobile-message{display:block}}.maplibregl-pseudo-fullscreen{height:100%!important;left:0!important;position:fixed!important;top:0!important;width:100%!important;z-index:99999} +/*!***************************************************************************!*\ + !*** css ./node_modules/css-loader/dist/cjs.js!./assets/styles/index.css ***! + \***************************************************************************/ /* Header logo */ diff --git a/static/img/republique-francaise-logo.svg b/static/img/republique-francaise-logo.svg new file mode 100644 index 000000000..7b92b6841 --- /dev/null +++ b/static/img/republique-francaise-logo.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/templates/footer.html b/templates/footer.html index c0f29e840..82795ecc2 100644 --- a/templates/footer.html +++ b/templates/footer.html @@ -1,4 +1,4 @@ -