From e613320bbcf015443c12dad7575927b48e93b316 Mon Sep 17 00:00:00 2001 From: Niraj Adhikari Date: Sun, 28 May 2023 19:22:53 +0545 Subject: [PATCH 01/59] alembic setup --- src/backend/alembic.ini | 47 ++++++++++++++++ src/backend/migrations/README | 1 + src/backend/migrations/env.py | 79 +++++++++++++++++++++++++++ src/backend/migrations/script.py.mako | 24 ++++++++ 4 files changed, 151 insertions(+) create mode 100644 src/backend/alembic.ini create mode 100755 src/backend/migrations/README create mode 100755 src/backend/migrations/env.py create mode 100755 src/backend/migrations/script.py.mako diff --git a/src/backend/alembic.ini b/src/backend/alembic.ini new file mode 100644 index 0000000000..9d4ce51a76 --- /dev/null +++ b/src/backend/alembic.ini @@ -0,0 +1,47 @@ +# A generic, single database configuration. + +[alembic] +# path to migration scripts +script_location = migrations + +version_path_separator = os # Use os.pathsep. Default configuration used for new projects. + + +sqlalchemy.url = postgresql+psycopg2://fmtm:fmtm@fmtm_db:5432/fmtm + +[post_write_hooks] + +# Logging configuration +[loggers] +keys = root,sqlalchemy,alembic + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = WARN +handlers = console +qualname = + +[logger_sqlalchemy] +level = WARN +handlers = +qualname = sqlalchemy.engine + +[logger_alembic] +level = INFO +handlers = +qualname = alembic + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %H:%M:%S diff --git a/src/backend/migrations/README b/src/backend/migrations/README new file mode 100755 index 0000000000..98e4f9c44e --- /dev/null +++ b/src/backend/migrations/README @@ -0,0 +1 @@ +Generic single-database configuration. \ No newline at end of file diff --git a/src/backend/migrations/env.py b/src/backend/migrations/env.py new file mode 100755 index 0000000000..c62888cfba --- /dev/null +++ b/src/backend/migrations/env.py @@ -0,0 +1,79 @@ +from logging.config import fileConfig + +from sqlalchemy import engine_from_config +from sqlalchemy import pool + +from alembic import context + +# this is the Alembic Config object, which provides +# access to the values within the .ini file in use. +config = context.config + +# Interpret the config file for Python logging. +# This line sets up loggers basically. +if config.config_file_name is not None: + fileConfig(config.config_file_name) + +# add your model's MetaData object here +# for 'autogenerate' support +# from myapp import mymodel +# target_metadata = mymodel.Base.metadata +from db.database import FmtmMetadata +target_metadata = FmtmMetadata + +# other values from the config, defined by the needs of env.py, +# can be acquired: +# my_important_option = config.get_main_option("my_important_option") +# ... etc. + + +def run_migrations_offline() -> None: + """Run migrations in 'offline' mode. + + This configures the context with just a URL + and not an Engine, though an Engine is acceptable + here as well. By skipping the Engine creation + we don't even need a DBAPI to be available. + + Calls to context.execute() here emit the given string to the + script output. + + """ + url = config.get_main_option("sqlalchemy.url") + context.configure( + url=url, + target_metadata=target_metadata, + literal_binds=True, + dialect_opts={"paramstyle": "named"}, + ) + + with context.begin_transaction(): + context.run_migrations() + + +def run_migrations_online() -> None: + """Run migrations in 'online' mode. + + In this scenario we need to create an Engine + and associate a connection with the context. + + """ + connectable = engine_from_config( + config.get_section(config.config_ini_section, {}), + prefix="sqlalchemy.", + poolclass=pool.NullPool, + ) + + with connectable.connect() as connection: + context.configure( + connection=connection, target_metadata=target_metadata + ) + + with context.begin_transaction(): + context.run_migrations() + + +if context.is_offline_mode(): + run_migrations_offline() +else: + run_migrations_online() diff --git a/src/backend/migrations/script.py.mako b/src/backend/migrations/script.py.mako new file mode 100755 index 0000000000..55df2863d2 --- /dev/null +++ b/src/backend/migrations/script.py.mako @@ -0,0 +1,24 @@ +"""${message} + +Revision ID: ${up_revision} +Revises: ${down_revision | comma,n} +Create Date: ${create_date} + +""" +from alembic import op +import sqlalchemy as sa +${imports if imports else ""} + +# revision identifiers, used by Alembic. +revision = ${repr(up_revision)} +down_revision = ${repr(down_revision)} +branch_labels = ${repr(branch_labels)} +depends_on = ${repr(depends_on)} + + +def upgrade() -> None: + ${upgrades if upgrades else "pass"} + + +def downgrade() -> None: + ${downgrades if downgrades else "pass"} From 7a7882cfeba7ebf9d7b61d35e825c10a87689d57 Mon Sep 17 00:00:00 2001 From: Niraj Adhikari Date: Thu, 1 Jun 2023 09:27:36 +0545 Subject: [PATCH 02/59] alembic.ini file moved to app directory --- src/backend/alembic.ini | 47 --------------- src/backend/app/alembic.ini | 110 ++++++++++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+), 47 deletions(-) delete mode 100644 src/backend/alembic.ini create mode 100644 src/backend/app/alembic.ini diff --git a/src/backend/alembic.ini b/src/backend/alembic.ini deleted file mode 100644 index 9d4ce51a76..0000000000 --- a/src/backend/alembic.ini +++ /dev/null @@ -1,47 +0,0 @@ -# A generic, single database configuration. - -[alembic] -# path to migration scripts -script_location = migrations - -version_path_separator = os # Use os.pathsep. Default configuration used for new projects. - - -sqlalchemy.url = postgresql+psycopg2://fmtm:fmtm@fmtm_db:5432/fmtm - -[post_write_hooks] - -# Logging configuration -[loggers] -keys = root,sqlalchemy,alembic - -[handlers] -keys = console - -[formatters] -keys = generic - -[logger_root] -level = WARN -handlers = console -qualname = - -[logger_sqlalchemy] -level = WARN -handlers = -qualname = sqlalchemy.engine - -[logger_alembic] -level = INFO -handlers = -qualname = alembic - -[handler_console] -class = StreamHandler -args = (sys.stderr,) -level = NOTSET -formatter = generic - -[formatter_generic] -format = %(levelname)-5.5s [%(name)s] %(message)s -datefmt = %H:%M:%S diff --git a/src/backend/app/alembic.ini b/src/backend/app/alembic.ini new file mode 100644 index 0000000000..a2f396fcde --- /dev/null +++ b/src/backend/app/alembic.ini @@ -0,0 +1,110 @@ +# A generic, single database configuration. + +[alembic] +# path to migration scripts +script_location = migrations + +# template used to generate migration file names; The default value is %%(rev)s_%%(slug)s +# Uncomment the line below if you want the files to be prepended with date and time +# see https://alembic.sqlalchemy.org/en/latest/tutorial.html#editing-the-ini-file +# for all available tokens +# file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d-%%(rev)s_%%(slug)s + +# sys.path path, will be prepended to sys.path if present. +# defaults to the current working directory. +prepend_sys_path = . + +# timezone to use when rendering the date within the migration file +# as well as the filename. +# If specified, requires the python-dateutil library that can be +# installed by adding `alembic[tz]` to the pip requirements +# string value is passed to dateutil.tz.gettz() +# leave blank for localtime +# timezone = + +# max length of characters to apply to the +# "slug" field +# truncate_slug_length = 40 + +# set to 'true' to run the environment during +# the 'revision' command, regardless of autogenerate +# revision_environment = false + +# set to 'true' to allow .pyc and .pyo files without +# a source .py file to be detected as revisions in the +# versions/ directory +# sourceless = false + +# version location specification; This defaults +# to migrations/versions. When using multiple version +# directories, initial revisions must be specified with --version-path. +# The path separator used here should be the separator specified by "version_path_separator" below. +# version_locations = %(here)s/bar:%(here)s/bat:migrations/versions + +# version path separator; As mentioned above, this is the character used to split +# version_locations. The default within new alembic.ini files is "os", which uses os.pathsep. +# If this key is omitted entirely, it falls back to the legacy behavior of splitting on spaces and/or commas. +# Valid values for version_path_separator are: +# +# version_path_separator = : +# version_path_separator = ; +# version_path_separator = space +version_path_separator = os # Use os.pathsep. Default configuration used for new projects. + +# set to 'true' to search source files recursively +# in each "version_locations" directory +# new in Alembic version 1.10 +# recursive_version_locations = false + +# the output encoding used when revision files +# are written from script.py.mako +# output_encoding = utf-8 + +sqlalchemy.url = postgresql+psycopg2://fmtm:fmtm@fmtm-db:5432/testingfmtm + + +[post_write_hooks] +# post_write_hooks defines scripts or Python functions that are run +# on newly generated revision scripts. See the documentation for further +# detail and examples + +# format using "black" - use the console_scripts runner, against the "black" entrypoint +# hooks = black +# black.type = console_scripts +# black.entrypoint = black +# black.options = -l 79 REVISION_SCRIPT_FILENAME + +# Logging configuration +[loggers] +keys = root,sqlalchemy,alembic + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = WARN +handlers = console +qualname = + +[logger_sqlalchemy] +level = WARN +handlers = +qualname = sqlalchemy.engine + +[logger_alembic] +level = INFO +handlers = +qualname = alembic + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %H:%M:%S From bd40e16e91a299bd668abc801b376fdcd862c2f1 Mon Sep 17 00:00:00 2001 From: Niraj Adhikari Date: Thu, 1 Jun 2023 09:29:48 +0545 Subject: [PATCH 03/59] Base.metadata.create_all(bind=engine) removed since alembic is used now for migration --- src/backend/app/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/app/main.py b/src/backend/app/main.py index 57c9fb9885..56ac25a9f5 100644 --- a/src/backend/app/main.py +++ b/src/backend/app/main.py @@ -120,7 +120,7 @@ async def startup_event(): """Commands to run on server startup.""" logger.debug("Starting up FastAPI server.") logger.debug("Connecting to DB with SQLAlchemy") - Base.metadata.create_all(bind=engine) + # Base.metadata.create_all(bind=engine) # Read in XLSForms read_xlsforms(next(get_db()), xlsforms_path) From c96af13e49b5e2cce195142b1e9957ae3874d3b8 Mon Sep 17 00:00:00 2001 From: Niraj Adhikari Date: Thu, 1 Jun 2023 09:30:47 +0545 Subject: [PATCH 04/59] env.py for alembic is moved inside app directory --- src/backend/{ => app}/migrations/env.py | 23 ++++------------------- 1 file changed, 4 insertions(+), 19 deletions(-) rename src/backend/{ => app}/migrations/env.py (66%) mode change 100755 => 100644 diff --git a/src/backend/migrations/env.py b/src/backend/app/migrations/env.py old mode 100755 new mode 100644 similarity index 66% rename from src/backend/migrations/env.py rename to src/backend/app/migrations/env.py index c62888cfba..76f0c6da17 --- a/src/backend/migrations/env.py +++ b/src/backend/app/migrations/env.py @@ -5,26 +5,13 @@ from alembic import context -# this is the Alembic Config object, which provides -# access to the values within the .ini file in use. config = context.config -# Interpret the config file for Python logging. -# This line sets up loggers basically. if config.config_file_name is not None: fileConfig(config.config_file_name) -# add your model's MetaData object here -# for 'autogenerate' support -# from myapp import mymodel -# target_metadata = mymodel.Base.metadata -from db.database import FmtmMetadata -target_metadata = FmtmMetadata - -# other values from the config, defined by the needs of env.py, -# can be acquired: -# my_important_option = config.get_main_option("my_important_option") -# ... etc. +from db.db_models import Base +target_metadata = Base.metadata def run_migrations_offline() -> None: @@ -59,15 +46,13 @@ def run_migrations_online() -> None: """ connectable = engine_from_config( - config.get_section(config.config_ini_section, {}), + config.get_section(config.config_ini_section), prefix="sqlalchemy.", poolclass=pool.NullPool, ) with connectable.connect() as connection: - context.configure( - connection=connection, target_metadata=target_metadata - ) + context.configure(connection=connection, target_metadata=target_metadata) with context.begin_transaction(): context.run_migrations() From b0bfb9ba06bd63ac8c7d98a638c1441d9954947f Mon Sep 17 00:00:00 2001 From: Niraj Adhikari Date: Thu, 1 Jun 2023 09:31:49 +0545 Subject: [PATCH 05/59] script.py.mako is moved inside app directory --- src/backend/{ => app}/migrations/script.py.mako | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/backend/{ => app}/migrations/script.py.mako (100%) mode change 100755 => 100644 diff --git a/src/backend/migrations/script.py.mako b/src/backend/app/migrations/script.py.mako old mode 100755 new mode 100644 similarity index 100% rename from src/backend/migrations/script.py.mako rename to src/backend/app/migrations/script.py.mako From ac24b56f6e347e1da46a8e31562572185b051e9d Mon Sep 17 00:00:00 2001 From: Niraj Adhikari Date: Thu, 1 Jun 2023 09:32:06 +0545 Subject: [PATCH 06/59] readme for alembic moved in app directory --- src/backend/{ => app}/migrations/README | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/backend/{ => app}/migrations/README (100%) mode change 100755 => 100644 diff --git a/src/backend/migrations/README b/src/backend/app/migrations/README old mode 100755 new mode 100644 similarity index 100% rename from src/backend/migrations/README rename to src/backend/app/migrations/README From c9906ecee3891f7ca10baf0bb829a049d5dc2f4c Mon Sep 17 00:00:00 2001 From: Niraj Adhikari Date: Sun, 4 Jun 2023 11:22:34 +0545 Subject: [PATCH 07/59] updated alembic.ini file to exclude postgis exxtension --- src/backend/app/alembic.ini | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/backend/app/alembic.ini b/src/backend/app/alembic.ini index a2f396fcde..ed8b40c909 100644 --- a/src/backend/app/alembic.ini +++ b/src/backend/app/alembic.ini @@ -74,6 +74,10 @@ sqlalchemy.url = postgresql+psycopg2://fmtm:fmtm@fmtm-db:5432/testingfmtm # black.entrypoint = black # black.options = -l 79 REVISION_SCRIPT_FILENAME +# Custom param that enables us to specify tables to ignore when determining migrations +[alembic:exclude] +tables = spatial_ref_sys + # Logging configuration [loggers] keys = root,sqlalchemy,alembic From e81bd03eba3c62bb68cde3c5e8825f37557b9bf9 Mon Sep 17 00:00:00 2001 From: Niraj Adhikari Date: Sun, 4 Jun 2023 11:23:54 +0545 Subject: [PATCH 08/59] updated env.py in migrations to exclude postgis extension --- src/backend/app/migrations/env.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/backend/app/migrations/env.py b/src/backend/app/migrations/env.py index 76f0c6da17..90d1e4240a 100644 --- a/src/backend/app/migrations/env.py +++ b/src/backend/app/migrations/env.py @@ -14,6 +14,20 @@ target_metadata = Base.metadata +exclude_tables = config.get_section("alembic:exclude").get("tables", "").split(",") + +def include_object(object, name, type_, reflected, compare_to): + """ + Custom helper function that enables us to ignore our excluded tables in the autogen sweep + """ + if type_ == "table" and name in exclude_tables: + return False + else: + return alembic_helpers.include_object( + object, name, type_, reflected, compare_to + ) + + def run_migrations_offline() -> None: """Run migrations in 'offline' mode. @@ -29,6 +43,7 @@ def run_migrations_offline() -> None: url = config.get_main_option("sqlalchemy.url") context.configure( url=url, + include_object=include_object, target_metadata=target_metadata, literal_binds=True, dialect_opts={"paramstyle": "named"}, @@ -52,7 +67,9 @@ def run_migrations_online() -> None: ) with connectable.connect() as connection: - context.configure(connection=connection, target_metadata=target_metadata) + context.configure(connection=connection, + include_object=include_object, + target_metadata=target_metadata) with context.begin_transaction(): context.run_migrations() From d125256f48ef6e9b515576aed3da68ff2a55b8ab Mon Sep 17 00:00:00 2001 From: Niraj Adhikari Date: Sun, 4 Jun 2023 11:25:30 +0545 Subject: [PATCH 09/59] sqlalchemy url obtained from settings for alembic migrations --- src/backend/app/alembic.ini | 5 +++-- src/backend/app/migrations/env.py | 3 +++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/backend/app/alembic.ini b/src/backend/app/alembic.ini index ed8b40c909..7166e16918 100644 --- a/src/backend/app/alembic.ini +++ b/src/backend/app/alembic.ini @@ -60,8 +60,7 @@ version_path_separator = os # Use os.pathsep. Default configuration used for ne # are written from script.py.mako # output_encoding = utf-8 -sqlalchemy.url = postgresql+psycopg2://fmtm:fmtm@fmtm-db:5432/testingfmtm - +sqlalchemy.url = [post_write_hooks] # post_write_hooks defines scripts or Python functions that are run @@ -112,3 +111,5 @@ formatter = generic [formatter_generic] format = %(levelname)-5.5s [%(name)s] %(message)s datefmt = %H:%M:%S + + diff --git a/src/backend/app/migrations/env.py b/src/backend/app/migrations/env.py index 90d1e4240a..c3d1cf071b 100644 --- a/src/backend/app/migrations/env.py +++ b/src/backend/app/migrations/env.py @@ -2,10 +2,13 @@ from sqlalchemy import engine_from_config from sqlalchemy import pool +from config import settings +from geoalchemy2 import alembic_helpers from alembic import context config = context.config +config.set_main_option("sqlalchemy.url", settings.SQLALCHEMY_URL) if config.config_file_name is not None: fileConfig(config.config_file_name) From 330cbadd70779108f4fb1abcbaf1634e2a2ef8ed Mon Sep 17 00:00:00 2001 From: Niraj Adhikari Date: Sun, 4 Jun 2023 11:26:04 +0545 Subject: [PATCH 10/59] sqlalchemy url obtained from env in config settings --- src/backend/app/config.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/backend/app/config.py b/src/backend/app/config.py index 634bb3387c..e5e3c25206 100644 --- a/src/backend/app/config.py +++ b/src/backend/app/config.py @@ -113,6 +113,7 @@ def assemble_db_connection(cls, v: str, values: dict[str, Any]) -> Any: OSM_LOGIN_REDIRECT_URI: AnyUrl OSM_SECRET_KEY: str OAUTHLIB_INSECURE_TRANSPORT: Optional[str] = 1 + SQLALCHEMY_URL: Optional[str] class Config: """Pydantic settings config.""" From 9f5d771136aecb74fcae4c696efa396c43041eea Mon Sep 17 00:00:00 2001 From: Niraj Adhikari Date: Sun, 4 Jun 2023 11:28:27 +0545 Subject: [PATCH 11/59] first migration file --- .../ffa958c0e643_create_initial_tables.py | 361 ++++++++++++++++++ 1 file changed, 361 insertions(+) create mode 100644 src/backend/app/migrations/versions/ffa958c0e643_create_initial_tables.py diff --git a/src/backend/app/migrations/versions/ffa958c0e643_create_initial_tables.py b/src/backend/app/migrations/versions/ffa958c0e643_create_initial_tables.py new file mode 100644 index 0000000000..af1f15abf5 --- /dev/null +++ b/src/backend/app/migrations/versions/ffa958c0e643_create_initial_tables.py @@ -0,0 +1,361 @@ +"""create_initial_tables + +Revision ID: ffa958c0e643 +Revises: +Create Date: 2023-06-04 05:10:26.929986 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql +import geoalchemy2 + +# revision identifiers, used by Alembic. +revision = 'ffa958c0e643' +down_revision = None +branch_labels = None +depends_on = None + + +def upgrade() -> None: + op.execute('CREATE EXTENSION IF NOT EXISTS postgis;') + + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('background_tasks', + sa.Column('id', sa.String(), nullable=False), + sa.Column('name', sa.String(), nullable=True), + sa.Column('status', sa.Enum('PENDING', 'FAILED', 'RECEIVED', 'SUCCESS', name='backgroundtaskstatus'), nullable=False), + sa.PrimaryKeyConstraint('id') + ) + op.create_table('licenses', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('name', sa.String(), nullable=True), + sa.Column('description', sa.String(), nullable=True), + sa.Column('plain_text', sa.String(), nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('name') + ) + op.create_table('mapping_issue_categories', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('name', sa.String(), nullable=False), + sa.Column('description', sa.String(), nullable=True), + sa.Column('archived', sa.Boolean(), nullable=False), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('name') + ) + op.create_table('organisations', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('name', sa.String(length=512), nullable=False), + sa.Column('slug', sa.String(length=255), nullable=False), + sa.Column('logo', sa.String(), nullable=True), + sa.Column('description', sa.String(), nullable=True), + sa.Column('url', sa.String(), nullable=True), + sa.Column('type', sa.Enum('FREE', 'DISCOUNTED', 'FULL_FEE', name='organisationtype'), nullable=False), + sa.Column('subscription_tier', sa.Integer(), nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('name'), + sa.UniqueConstraint('slug') + ) + op.create_table('qr_code', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('filename', sa.String(), nullable=True), + sa.Column('image', sa.LargeBinary(), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + op.create_table('users', + sa.Column('id', sa.BigInteger(), nullable=False), + sa.Column('username', sa.String(), nullable=True), + sa.Column('role', sa.Enum('MAPPER', 'ADMIN', 'VALIDATOR', 'FIELD_ADMIN', 'ORGANIZATION_ADMIN', 'READ_ONLY', name='userrole'), nullable=False), + sa.Column('name', sa.String(), nullable=True), + sa.Column('city', sa.String(), nullable=True), + sa.Column('country', sa.String(), nullable=True), + sa.Column('email_address', sa.String(), nullable=True), + sa.Column('is_email_verified', sa.Boolean(), nullable=True), + sa.Column('is_expert', sa.Boolean(), nullable=True), + sa.Column('mapping_level', sa.Enum('BEGINNER', 'INTERMEDIATE', 'ADVANCED', name='mappinglevel'), nullable=False), + sa.Column('tasks_mapped', sa.Integer(), nullable=False), + sa.Column('tasks_validated', sa.Integer(), nullable=False), + sa.Column('tasks_invalidated', sa.Integer(), nullable=False), + sa.Column('projects_mapped', sa.ARRAY(sa.Integer()), nullable=True), + sa.Column('date_registered', sa.DateTime(), nullable=True), + sa.Column('last_validation_date', sa.DateTime(), nullable=True), + sa.Column('password', sa.String(), nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('username') + ) + op.create_index(op.f('ix_users_id'), 'users', ['id'], unique=False) + op.create_table('xlsforms', + sa.Column('id', sa.Integer(), autoincrement=True, nullable=False), + sa.Column('title', sa.String(), nullable=True), + sa.Column('category', sa.String(), nullable=True), + sa.Column('description', sa.String(), nullable=True), + sa.Column('xml', sa.String(), nullable=True), + sa.Column('xls', sa.LargeBinary(), nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('title') + ) + op.create_table('organisation_managers', + sa.Column('organisation_id', sa.Integer(), nullable=False), + sa.Column('user_id', sa.BigInteger(), nullable=False), + sa.ForeignKeyConstraint(['organisation_id'], ['organisations.id'], ), + sa.ForeignKeyConstraint(['user_id'], ['users.id'], ), + sa.UniqueConstraint('organisation_id', 'user_id', name='organisation_user_key') + ) + op.create_table('projects', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('odkid', sa.Integer(), nullable=True), + sa.Column('author_id', sa.BigInteger(), nullable=False), + sa.Column('created', sa.DateTime(), nullable=False), + sa.Column('task_creation_mode', sa.Enum('GRID', 'ROADS', 'UPLOAD', name='taskcreationmode'), nullable=False), + sa.Column('project_name_prefix', sa.String(), nullable=True), + sa.Column('task_type_prefix', sa.String(), nullable=True), + sa.Column('location_str', sa.String(), nullable=True), + sa.Column('outline', geoalchemy2.types.Geometry(geometry_type='POLYGON', srid=4326, from_text='ST_GeomFromEWKT', name='geometry'), nullable=True), + sa.Column('last_updated', sa.DateTime(), nullable=True), + sa.Column('status', sa.Enum('ARCHIVED', 'PUBLISHED', 'DRAFT', name='projectstatus'), nullable=False), + sa.Column('total_tasks', sa.Integer(), nullable=True), + sa.Column('odk_central_src', sa.String(), nullable=True), + sa.Column('xform_title', sa.String(), nullable=True), + sa.Column('private', sa.Boolean(), nullable=True), + sa.Column('mapper_level', sa.Enum('BEGINNER', 'INTERMEDIATE', 'ADVANCED', name='mappinglevel'), nullable=False), + sa.Column('priority', sa.Enum('URGENT', 'HIGH', 'MEDIUM', 'LOW', name='projectpriority'), nullable=True), + sa.Column('featured', sa.Boolean(), nullable=True), + sa.Column('mapping_permission', sa.Enum('ANY', 'LEVEL', 'TEAMS', 'TEAMS_LEVEL', name='mappingpermission'), nullable=True), + sa.Column('validation_permission', sa.Enum('ANY', 'LEVEL', 'TEAMS', 'TEAMS_LEVEL', name='validationpermission'), nullable=True), + sa.Column('organisation_id', sa.Integer(), nullable=True), + sa.Column('due_date', sa.DateTime(), nullable=True), + sa.Column('changeset_comment', sa.String(), nullable=True), + sa.Column('osmcha_filter_id', sa.String(), nullable=True), + sa.Column('imagery', sa.String(), nullable=True), + sa.Column('osm_preset', sa.String(), nullable=True), + sa.Column('odk_preset', sa.String(), nullable=True), + sa.Column('josm_preset', sa.String(), nullable=True), + sa.Column('id_presets', sa.ARRAY(sa.String()), nullable=True), + sa.Column('extra_id_params', sa.String(), nullable=True), + sa.Column('license_id', sa.Integer(), nullable=True), + sa.Column('centroid', geoalchemy2.types.Geometry(geometry_type='POINT', srid=4326, from_text='ST_GeomFromEWKT', name='geometry'), nullable=True), + sa.Column('odk_central_url', sa.String(), nullable=True), + sa.Column('odk_central_user', sa.String(), nullable=True), + sa.Column('odk_central_password', sa.String(), nullable=True), + sa.Column('extract_completed_count', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['author_id'], ['users.id'], name='fk_users'), + sa.ForeignKeyConstraint(['license_id'], ['licenses.id'], name='fk_licenses'), + sa.ForeignKeyConstraint(['organisation_id'], ['organisations.id'], name='fk_organisations'), + sa.ForeignKeyConstraint(['xform_title'], ['xlsforms.title'], name='fk_xform'), + sa.PrimaryKeyConstraint('id') + ) + op.create_index('idx_geometry', 'projects', ['outline'], unique=False, postgresql_using='gist') + # op.create_index('idx_projects_centroid', 'projects', ['centroid'], unique=False, postgresql_using='gist') + # op.create_index('idx_projects_outline', 'projects', ['outline'], unique=False, postgresql_using='gist') + op.create_index(op.f('ix_projects_mapper_level'), 'projects', ['mapper_level'], unique=False) + op.create_index(op.f('ix_projects_organisation_id'), 'projects', ['organisation_id'], unique=False) + op.create_table('teams', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('organisation_id', sa.Integer(), nullable=False), + sa.Column('name', sa.String(length=512), nullable=False), + sa.Column('logo', sa.String(), nullable=True), + sa.Column('description', sa.String(), nullable=True), + sa.Column('invite_only', sa.Boolean(), nullable=False), + sa.Column('visibility', sa.Enum('PUBLIC', 'PRIVATE', name='teamvisibility'), nullable=False), + sa.ForeignKeyConstraint(['organisation_id'], ['organisations.id'], name='fk_organisations'), + sa.PrimaryKeyConstraint('id') + ) + op.create_table('user_licenses', + sa.Column('user', sa.BigInteger(), nullable=True), + sa.Column('license', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['license'], ['licenses.id'], ), + sa.ForeignKeyConstraint(['user'], ['users.id'], ) + ) + op.create_table('project_allowed_users', + sa.Column('project_id', sa.Integer(), nullable=True), + sa.Column('user_id', sa.BigInteger(), nullable=True), + sa.ForeignKeyConstraint(['project_id'], ['projects.id'], ), + sa.ForeignKeyConstraint(['user_id'], ['users.id'], ) + ) + op.create_table('project_chat', + sa.Column('id', sa.BigInteger(), nullable=False), + sa.Column('project_id', sa.Integer(), nullable=False), + sa.Column('user_id', sa.Integer(), nullable=False), + sa.Column('time_stamp', sa.DateTime(), nullable=False), + sa.Column('message', sa.String(), nullable=False), + sa.ForeignKeyConstraint(['project_id'], ['projects.id'], ), + sa.ForeignKeyConstraint(['user_id'], ['users.id'], ), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_project_chat_project_id'), 'project_chat', ['project_id'], unique=False) + op.create_table('project_info', + sa.Column('project_id', sa.Integer(), nullable=False), + sa.Column('project_id_str', sa.String(), nullable=True), + sa.Column('name', sa.String(length=512), nullable=True), + sa.Column('short_description', sa.String(), nullable=True), + sa.Column('description', sa.String(), nullable=True), + sa.Column('text_searchable', postgresql.TSVECTOR(), nullable=True), + sa.Column('per_task_instructions', sa.String(), nullable=True), + sa.ForeignKeyConstraint(['project_id'], ['projects.id'], ), + sa.PrimaryKeyConstraint('project_id') + ) + op.create_index('textsearch_idx', 'project_info', ['text_searchable'], unique=False) + op.create_table('project_teams', + sa.Column('team_id', sa.Integer(), nullable=False), + sa.Column('project_id', sa.Integer(), nullable=False), + sa.Column('role', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['project_id'], ['projects.id'], ), + sa.ForeignKeyConstraint(['team_id'], ['teams.id'], ), + sa.PrimaryKeyConstraint('team_id', 'project_id') + ) + op.create_table('tasks', + sa.Column('id', sa.Integer(), autoincrement=True, nullable=False), + sa.Column('project_id', sa.Integer(), nullable=False), + sa.Column('project_task_index', sa.Integer(), nullable=True), + sa.Column('project_task_name', sa.String(), nullable=True), + sa.Column('outline', geoalchemy2.types.Geometry(geometry_type='POLYGON', srid=4326, from_text='ST_GeomFromEWKT', name='geometry'), nullable=True), + sa.Column('geometry_geojson', sa.String(), nullable=True), + sa.Column('initial_feature_count', sa.Integer(), nullable=True), + sa.Column('task_status', sa.Enum('READY', 'LOCKED_FOR_MAPPING', 'MAPPED', 'LOCKED_FOR_VALIDATION', 'VALIDATED', 'INVALIDATED', 'BAD', 'SPLIT', 'ARCHIVED', name='taskstatus'), nullable=True), + sa.Column('locked_by', sa.BigInteger(), nullable=True), + sa.Column('mapped_by', sa.BigInteger(), nullable=True), + sa.Column('validated_by', sa.BigInteger(), nullable=True), + sa.Column('qr_code_id', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['locked_by'], ['users.id'], name='fk_users_locked'), + sa.ForeignKeyConstraint(['mapped_by'], ['users.id'], name='fk_users_mapper'), + sa.ForeignKeyConstraint(['project_id'], ['projects.id'], ), + sa.ForeignKeyConstraint(['qr_code_id'], ['qr_code.id'], ), + sa.ForeignKeyConstraint(['validated_by'], ['users.id'], name='fk_users_validator'), + sa.PrimaryKeyConstraint('id', 'project_id') + ) + op.create_index(op.f('ix_tasks_locked_by'), 'tasks', ['locked_by'], unique=False) + op.create_index(op.f('ix_tasks_mapped_by'), 'tasks', ['mapped_by'], unique=False) + op.create_index(op.f('ix_tasks_project_id'), 'tasks', ['project_id'], unique=False) + op.create_index(op.f('ix_tasks_qr_code_id'), 'tasks', ['qr_code_id'], unique=False) + op.create_index(op.f('ix_tasks_validated_by'), 'tasks', ['validated_by'], unique=False) + op.create_table('user_roles', + sa.Column('user_id', sa.BigInteger(), nullable=False), + sa.Column('organization_id', sa.Integer(), nullable=True), + sa.Column('project_id', sa.Integer(), nullable=True), + sa.Column('role', sa.Enum('MAPPER', 'ADMIN', 'VALIDATOR', 'FIELD_ADMIN', 'ORGANIZATION_ADMIN', 'READ_ONLY', name='userrole'), nullable=False), + sa.ForeignKeyConstraint(['organization_id'], ['organisations.id'], ), + sa.ForeignKeyConstraint(['project_id'], ['projects.id'], ), + sa.ForeignKeyConstraint(['user_id'], ['users.id'], ), + sa.PrimaryKeyConstraint('user_id') + ) + op.create_table('features', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('project_id', sa.Integer(), nullable=True), + sa.Column('category_title', sa.String(), nullable=True), + sa.Column('task_id', sa.Integer(), nullable=False), + sa.Column('properties', postgresql.JSONB(astext_type=sa.Text()), nullable=True), + sa.Column('geometry', geoalchemy2.types.Geometry(srid=4326, from_text='ST_GeomFromEWKT', name='geometry'), nullable=True), + sa.ForeignKeyConstraint(['category_title'], ['xlsforms.title'], name='fk_xform'), + sa.ForeignKeyConstraint(['project_id'], ['projects.id'], ), + sa.ForeignKeyConstraint(['task_id', 'project_id'], ['tasks.id', 'tasks.project_id'], name='fk_tasks'), + sa.PrimaryKeyConstraint('id') + ) + op.create_index('idx_features_composite', 'features', ['task_id', 'project_id'], unique=False) + op.create_table('task_history', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('project_id', sa.Integer(), nullable=True), + sa.Column('task_id', sa.Integer(), nullable=False), + sa.Column('action', sa.Enum('RELEASED_FOR_MAPPING', 'LOCKED_FOR_MAPPING', 'MARKED_MAPPED', 'LOCKED_FOR_VALIDATION', 'VALIDATED', 'MARKED_INVALID', 'MARKED_BAD', 'SPLIT_NEEDED', 'RECREATED', 'COMMENT', name='taskaction'), nullable=False), + sa.Column('action_text', sa.String(), nullable=True), + sa.Column('action_date', sa.DateTime(), nullable=False), + sa.Column('user_id', sa.BigInteger(), nullable=False), + sa.ForeignKeyConstraint(['project_id'], ['projects.id'], ), + sa.ForeignKeyConstraint(['task_id', 'project_id'], ['tasks.id', 'tasks.project_id'], name='fk_tasks'), + sa.ForeignKeyConstraint(['user_id'], ['users.id'], name='fk_users'), + sa.PrimaryKeyConstraint('id') + ) + op.create_index('idx_task_history_composite', 'task_history', ['task_id', 'project_id'], unique=False) + op.create_index('idx_task_history_project_id_user_id', 'task_history', ['user_id', 'project_id'], unique=False) + op.create_index(op.f('ix_task_history_project_id'), 'task_history', ['project_id'], unique=False) + op.create_index(op.f('ix_task_history_user_id'), 'task_history', ['user_id'], unique=False) + op.create_table('task_invalidation_history', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('project_id', sa.Integer(), nullable=False), + sa.Column('task_id', sa.Integer(), nullable=False), + sa.Column('is_closed', sa.Boolean(), nullable=True), + sa.Column('mapper_id', sa.BigInteger(), nullable=True), + sa.Column('mapped_date', sa.DateTime(), nullable=True), + sa.Column('invalidator_id', sa.BigInteger(), nullable=True), + sa.Column('invalidated_date', sa.DateTime(), nullable=True), + sa.Column('invalidation_history_id', sa.Integer(), nullable=True), + sa.Column('validator_id', sa.BigInteger(), nullable=True), + sa.Column('validated_date', sa.DateTime(), nullable=True), + sa.Column('updated_date', sa.DateTime(), nullable=True), + sa.ForeignKeyConstraint(['invalidation_history_id'], ['task_history.id'], name='fk_invalidation_history'), + sa.ForeignKeyConstraint(['invalidator_id'], ['users.id'], name='fk_invalidators'), + sa.ForeignKeyConstraint(['mapper_id'], ['users.id'], name='fk_mappers'), + sa.ForeignKeyConstraint(['project_id'], ['projects.id'], ), + sa.ForeignKeyConstraint(['task_id', 'project_id'], ['tasks.id', 'tasks.project_id'], name='fk_tasks'), + sa.ForeignKeyConstraint(['validator_id'], ['users.id'], name='fk_validators'), + sa.PrimaryKeyConstraint('id') + ) + op.create_index('idx_task_validation_history_composite', 'task_invalidation_history', ['task_id', 'project_id'], unique=False) + op.create_index('idx_task_validation_mapper_status_composite', 'task_invalidation_history', ['mapper_id', 'is_closed'], unique=False) + op.create_index('idx_task_validation_validator_status_composite', 'task_invalidation_history', ['invalidator_id', 'is_closed'], unique=False) + op.create_table('task_mapping_issues', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('task_history_id', sa.Integer(), nullable=False), + sa.Column('issue', sa.String(), nullable=False), + sa.Column('mapping_issue_category_id', sa.Integer(), nullable=False), + sa.Column('count', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['mapping_issue_category_id'], ['mapping_issue_categories.id'], name='fk_issue_category'), + sa.ForeignKeyConstraint(['task_history_id'], ['task_history.id'], ), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_task_mapping_issues_task_history_id'), 'task_mapping_issues', ['task_history_id'], unique=False) + # ### end Alembic commands ### + + +def downgrade() -> None: + + # ### commands auto generated by Alembic - please adjust! ### + + op.execute('DROP EXTENSION IF EXISTS postgis;') + + op.drop_index(op.f('ix_task_mapping_issues_task_history_id'), table_name='task_mapping_issues') + op.drop_table('task_mapping_issues') + op.drop_index('idx_task_validation_validator_status_composite', table_name='task_invalidation_history') + op.drop_index('idx_task_validation_mapper_status_composite', table_name='task_invalidation_history') + op.drop_index('idx_task_validation_history_composite', table_name='task_invalidation_history') + op.drop_table('task_invalidation_history') + op.drop_index(op.f('ix_task_history_user_id'), table_name='task_history') + op.drop_index(op.f('ix_task_history_project_id'), table_name='task_history') + op.drop_index('idx_task_history_project_id_user_id', table_name='task_history') + op.drop_index('idx_task_history_composite', table_name='task_history') + op.drop_table('task_history') + op.drop_index('idx_features_geometry', table_name='features', postgresql_using='gist') + op.drop_index('idx_features_composite', table_name='features') + op.drop_table('features') + op.drop_table('user_roles') + op.drop_index(op.f('ix_tasks_validated_by'), table_name='tasks') + op.drop_index(op.f('ix_tasks_qr_code_id'), table_name='tasks') + op.drop_index(op.f('ix_tasks_project_id'), table_name='tasks') + op.drop_index(op.f('ix_tasks_mapped_by'), table_name='tasks') + op.drop_index(op.f('ix_tasks_locked_by'), table_name='tasks') + op.drop_index('idx_tasks_outline', table_name='tasks', postgresql_using='gist') + op.drop_index('idx_geometry', table_name='tasks', postgresql_using='gist') + op.drop_table('tasks') + op.drop_table('project_teams') + op.drop_index('textsearch_idx', table_name='project_info') + op.drop_table('project_info') + op.drop_index(op.f('ix_project_chat_project_id'), table_name='project_chat') + op.drop_table('project_chat') + op.drop_table('project_allowed_users') + op.drop_table('user_licenses') + op.drop_table('teams') + op.drop_index(op.f('ix_projects_organisation_id'), table_name='projects') + op.drop_index(op.f('ix_projects_mapper_level'), table_name='projects') + op.drop_index('idx_projects_outline', table_name='projects', postgresql_using='gist') + op.drop_index('idx_projects_centroid', table_name='projects', postgresql_using='gist') + op.drop_index('idx_geometry', table_name='projects', postgresql_using='gist') + op.drop_table('projects') + op.drop_table('organisation_managers') + op.drop_table('xlsforms') + op.drop_index(op.f('ix_users_id'), table_name='users') + op.drop_table('users') + op.drop_table('qr_code') + op.drop_table('organisations') + op.drop_table('mapping_issue_categories') + op.drop_table('licenses') + op.drop_table('background_tasks') + # ### end Alembic commands ### From c543d2ca01f97c0b9df5e3c4dfdf130dde9b6d1e Mon Sep 17 00:00:00 2001 From: Varun Date: Mon, 11 Sep 2023 17:20:35 +0545 Subject: [PATCH 12/59] fix: create project single AOI --- src/frontend/main/src/components/createproject/UploadArea.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/main/src/components/createproject/UploadArea.tsx b/src/frontend/main/src/components/createproject/UploadArea.tsx index d53cf5ec7f..1e0c952c90 100755 --- a/src/frontend/main/src/components/createproject/UploadArea.tsx +++ b/src/frontend/main/src/components/createproject/UploadArea.tsx @@ -119,7 +119,7 @@ const UploadArea: React.FC = ({ geojsonFile, setGeojsonFile, setInputValue, { - dispatch(CreateProjectActions.SetDrawnGeojson(JSON.parse(geojson))); + dispatch(CreateProjectActions.SetDividedTaskGeojson(JSON.parse(geojson))); }} /> From bd1ecc1de2f5430a38ec82633501ab86e05fd6e6 Mon Sep 17 00:00:00 2001 From: Varun Date: Mon, 11 Sep 2023 17:26:01 +0545 Subject: [PATCH 13/59] fix: commented pagination for future --- src/frontend/main/src/views/Home.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/frontend/main/src/views/Home.jsx b/src/frontend/main/src/views/Home.jsx index f5256ffc1b..13baf652a8 100755 --- a/src/frontend/main/src/views/Home.jsx +++ b/src/frontend/main/src/views/Home.jsx @@ -111,7 +111,7 @@ const Home = () => { */} -
+ {/*
1-5 of 10
{ type="number" className="fmtm-w-10 fmtm-rounded-md fmtm-border-[1px] fmtm-border-[#E7E2E2] fmtm-outline-none" /> -
+
*/} ); }; From cddc460379dda53b9a1d23924ed02f5654bcee10 Mon Sep 17 00:00:00 2001 From: Varun Date: Mon, 11 Sep 2023 17:28:46 +0545 Subject: [PATCH 14/59] fix: edit project symbol changes on regex --- .../EditProjectDetailsValidation.ts | 106 +++++++++--------- 1 file changed, 52 insertions(+), 54 deletions(-) diff --git a/src/frontend/main/src/components/editproject/validation/EditProjectDetailsValidation.ts b/src/frontend/main/src/components/editproject/validation/EditProjectDetailsValidation.ts index b10bbd7812..06a0c6676a 100644 --- a/src/frontend/main/src/components/editproject/validation/EditProjectDetailsValidation.ts +++ b/src/frontend/main/src/components/editproject/validation/EditProjectDetailsValidation.ts @@ -1,58 +1,56 @@ - interface ProjectValues { - organization: string; - name: string; - username: string; - id: string; - short_description: string; - description: string; - // odk_central_url: string; - // odk_central_user: string; - // odk_central_password: string; + organization: string; + name: string; + username: string; + id: string; + short_description: string; + description: string; + // odk_central_url: string; + // odk_central_user: string; + // odk_central_password: string; +} +interface ValidationErrors { + organization?: string; + name?: string; + username?: string; + id?: string; + short_description?: string; + description?: string; + // odk_central_url?: string; + // odk_central_user?: string; + // odk_central_password?: string; +} +const regexForSymbol = /_/g; + +function EditProjectValidation(values: ProjectValues) { + const errors: ValidationErrors = {}; + + // if (!values?.organization) { + // errors.organization = 'Organization is Required.'; + // } + // if (!values?.odk_central_url) { + // errors.odk_central_url = 'ODK Central Url is Required.'; + // } + // if (!values?.odk_central_user) { + // errors.odk_central_user = 'ODK Central User is Required.'; + // } + // if (!values?.odk_central_password) { + // errors.odk_central_password = 'ODK Central Password is Required.'; + // } + if (!values?.name) { + errors.name = 'Project Name is Required.'; } - interface ValidationErrors { - organization?: string; - name?: string; - username?: string; - id?: string; - short_description?: string; - description?: string; - // odk_central_url?: string; - // odk_central_user?: string; - // odk_central_password?: string; + if (values?.name && regexForSymbol.test(values.name)) { + errors.name = 'Project Name should not contain _.'; } - const regexForSymbol = /[-_]/g; - - function EditProjectValidation(values: ProjectValues) { - const errors: ValidationErrors = {}; - - // if (!values?.organization) { - // errors.organization = 'Organization is Required.'; - // } - // if (!values?.odk_central_url) { - // errors.odk_central_url = 'ODK Central Url is Required.'; - // } - // if (!values?.odk_central_user) { - // errors.odk_central_user = 'ODK Central User is Required.'; - // } - // if (!values?.odk_central_password) { - // errors.odk_central_password = 'ODK Central Password is Required.'; - // } - if (!values?.name) { - errors.name = 'Project Name is Required.'; - } - if (values?.name && regexForSymbol.test(values.name)) { - errors.name = 'Project Name should not contain symbols.'; - } - if (!values?.short_description) { - errors.short_description = 'Short Description is Required.'; - } - if (!values?.description) { - errors.description = 'Description is Required.'; - } - - return errors; + if (!values?.short_description) { + errors.short_description = 'Short Description is Required.'; } - - export default EditProjectValidation; - \ No newline at end of file + if (!values?.description) { + errors.description = 'Description is Required.'; + } + + return errors; +} + +export default EditProjectValidation; From 3cba9154bb24aa3fcd0ddeb02c7f64a6d8d72204 Mon Sep 17 00:00:00 2001 From: Varun Date: Mon, 11 Sep 2023 17:55:57 +0545 Subject: [PATCH 15/59] fix: remove data extract on different dropdown selection --- .../fmtm_openlayer_map/src/views/DefineAreaMap.jsx | 6 ++++-- .../main/src/components/createproject/DataExtract.tsx | 8 ++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/frontend/fmtm_openlayer_map/src/views/DefineAreaMap.jsx b/src/frontend/fmtm_openlayer_map/src/views/DefineAreaMap.jsx index f2f4c65162..a76ee1095c 100644 --- a/src/frontend/fmtm_openlayer_map/src/views/DefineAreaMap.jsx +++ b/src/frontend/fmtm_openlayer_map/src/views/DefineAreaMap.jsx @@ -53,6 +53,7 @@ const DefineAreaMap = ({ setDataExtractedGeojson(e.target.result); }; } else { + setDataExtractedGeojson(null); } }, [uploadedDataExtractFile]); useEffect(() => { @@ -63,6 +64,7 @@ const DefineAreaMap = ({ setLineExtractedGeojson(e.target.result); }; } else { + setLineExtractedGeojson(null); } }, [uploadedLineExtractFile]); return ( @@ -128,7 +130,7 @@ const DefineAreaMap = ({ constrainResolution: true, duration: 2000, }} - // zoomToLayer + zoomToLayer /> )} {lineExtractedGeojson && ( @@ -151,7 +153,7 @@ const DefineAreaMap = ({ constrainResolution: true, duration: 2000, }} - // zoomToLayer + zoomToLayer /> )} diff --git a/src/frontend/main/src/components/createproject/DataExtract.tsx b/src/frontend/main/src/components/createproject/DataExtract.tsx index aec6af82ce..b99e47b4ef 100755 --- a/src/frontend/main/src/components/createproject/DataExtract.tsx +++ b/src/frontend/main/src/components/createproject/DataExtract.tsx @@ -76,6 +76,14 @@ const DataExtract: React.FC = ({ submission, DataExtractValidation, ); + useEffect(() => { + if (values.data_extract_options === 'Data Extract Ways') { + setDataExtractFile(null); + setDataExtractFileValue(null); + setLineExtractFile(null); + setLineExtractFileValue(null); + } + }, [values.data_extract_options]); return ( Date: Mon, 11 Sep 2023 17:35:38 +0100 Subject: [PATCH 16/59] ci: move pytest and jest workflows to actions --- .../{workflows => actions}/frontend_test.yml | 9 ++----- .github/{workflows => actions}/pytest.yml | 14 +---------- .github/workflows/pr_frontend_tests.yml | 24 +++++++++++++++++++ .github/workflows/pr_pytest.yml | 24 +++++++++++++++++++ 4 files changed, 51 insertions(+), 20 deletions(-) rename .github/{workflows => actions}/frontend_test.yml (63%) rename .github/{workflows => actions}/pytest.yml (88%) create mode 100644 .github/workflows/pr_frontend_tests.yml create mode 100644 .github/workflows/pr_pytest.yml diff --git a/.github/workflows/frontend_test.yml b/.github/actions/frontend_test.yml similarity index 63% rename from .github/workflows/frontend_test.yml rename to .github/actions/frontend_test.yml index ed407a6ed5..376f851928 100644 --- a/.github/workflows/frontend_test.yml +++ b/.github/actions/frontend_test.yml @@ -1,11 +1,6 @@ name: Frontend Tests -on: - push: - paths: - - "src/frontend/**" # Trigger the workflow only when files within srv/frontend change - - ".github/workflows/**" # Also trigger if github workflow changes - workflow_dispatch: +on: [workflow_call] jobs: test: @@ -14,7 +9,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Setup Node.js uses: actions/setup-node@v2 diff --git a/.github/workflows/pytest.yml b/.github/actions/pytest.yml similarity index 88% rename from .github/workflows/pytest.yml rename to .github/actions/pytest.yml index ed2aa6e829..d600f7d8be 100644 --- a/.github/workflows/pytest.yml +++ b/.github/actions/pytest.yml @@ -1,18 +1,6 @@ name: pytest -on: - # Run tests on all pushed branches - push: - branches: - - "*" - # Run tests on PR, prior to merge to main & development. - pull_request: - branches: - - main - - staging - - development - # Allow manual trigger (workflow_dispatch) - workflow_dispatch: +on: [workflow_call] permissions: contents: read diff --git a/.github/workflows/pr_frontend_tests.yml b/.github/workflows/pr_frontend_tests.yml new file mode 100644 index 0000000000..adc7ad2d95 --- /dev/null +++ b/.github/workflows/pr_frontend_tests.yml @@ -0,0 +1,24 @@ +name: PR + +on: + pull_request: + branches: + - main + - staging + - development + paths: + - src/frontend/** + # Allow manual trigger (workflow_dispatch) + workflow_dispatch: + +jobs: + tests: + runs-on: ubuntu-latest + environment: + name: ${{ github.ref_name }} + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: PyTest + uses: ./.github/actions/frontend_test.yml diff --git a/.github/workflows/pr_pytest.yml b/.github/workflows/pr_pytest.yml new file mode 100644 index 0000000000..58debc8873 --- /dev/null +++ b/.github/workflows/pr_pytest.yml @@ -0,0 +1,24 @@ +name: PR + +on: + pull_request: + branches: + - main + - staging + - development + paths: + - src/backend/** + # Allow manual trigger (workflow_dispatch) + workflow_dispatch: + +jobs: + tests: + runs-on: ubuntu-latest + environment: + name: ${{ github.ref_name }} + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: PyTest + uses: ./.github/actions/pytest.yml From 5871741110e0b7166576285bc0e0caf13b38b508 Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Mon, 11 Sep 2023 17:52:51 +0100 Subject: [PATCH 17/59] ci: reusable test actions --> workflows --- .github/workflows/{pr_frontend_tests.yml => pr.yml} | 9 +++++---- .github/workflows/pr_pytest.yml | 4 ++-- .../reusable/frontend_tests.yml} | 5 ++++- .github/{actions => workflows/reusable}/pytest.yml | 5 ++++- 4 files changed, 15 insertions(+), 8 deletions(-) rename .github/workflows/{pr_frontend_tests.yml => pr.yml} (69%) rename .github/{actions/frontend_test.yml => workflows/reusable/frontend_tests.yml} (88%) rename .github/{actions => workflows/reusable}/pytest.yml (97%) diff --git a/.github/workflows/pr_frontend_tests.yml b/.github/workflows/pr.yml similarity index 69% rename from .github/workflows/pr_frontend_tests.yml rename to .github/workflows/pr.yml index adc7ad2d95..58f124eac0 100644 --- a/.github/workflows/pr_frontend_tests.yml +++ b/.github/workflows/pr.yml @@ -6,13 +6,11 @@ on: - main - staging - development - paths: - - src/frontend/** # Allow manual trigger (workflow_dispatch) workflow_dispatch: jobs: - tests: + pytest: runs-on: ubuntu-latest environment: name: ${{ github.ref_name }} @@ -21,4 +19,7 @@ jobs: uses: actions/checkout@v3 - name: PyTest - uses: ./.github/actions/frontend_test.yml + uses: ./.github/workflows/reusable/pytest.yml + + - name: Frontend Tests + uses: ./.github/workflows/reusable/frontend_test.yml diff --git a/.github/workflows/pr_pytest.yml b/.github/workflows/pr_pytest.yml index 58debc8873..7f1009b55f 100644 --- a/.github/workflows/pr_pytest.yml +++ b/.github/workflows/pr_pytest.yml @@ -12,7 +12,7 @@ on: workflow_dispatch: jobs: - tests: + frontend-tests: runs-on: ubuntu-latest environment: name: ${{ github.ref_name }} @@ -21,4 +21,4 @@ jobs: uses: actions/checkout@v3 - name: PyTest - uses: ./.github/actions/pytest.yml + uses: ./.github/workflows/reusable/pytest.yml diff --git a/.github/actions/frontend_test.yml b/.github/workflows/reusable/frontend_tests.yml similarity index 88% rename from .github/actions/frontend_test.yml rename to .github/workflows/reusable/frontend_tests.yml index 376f851928..52cbdae34d 100644 --- a/.github/actions/frontend_test.yml +++ b/.github/workflows/reusable/frontend_tests.yml @@ -1,6 +1,9 @@ name: Frontend Tests -on: [workflow_call] +on: + workflow_call: + paths: + - src/frontend/** jobs: test: diff --git a/.github/actions/pytest.yml b/.github/workflows/reusable/pytest.yml similarity index 97% rename from .github/actions/pytest.yml rename to .github/workflows/reusable/pytest.yml index d600f7d8be..136aef25cf 100644 --- a/.github/actions/pytest.yml +++ b/.github/workflows/reusable/pytest.yml @@ -1,6 +1,9 @@ name: pytest -on: [workflow_call] +on: + workflow_call: + paths: + - src/backend/** permissions: contents: read From 9c6229cdd9f4030284df873c1b28eb6b78047f29 Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Mon, 11 Sep 2023 18:08:07 +0100 Subject: [PATCH 18/59] ci: reusable action --> workflow (pytest, jest) --- .github/workflows/pr.yml | 15 +++------------ .github/workflows/reusable/frontend_tests.yml | 3 +-- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 58f124eac0..1e3219854a 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -11,15 +11,6 @@ on: jobs: pytest: - runs-on: ubuntu-latest - environment: - name: ${{ github.ref_name }} - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: PyTest - uses: ./.github/workflows/reusable/pytest.yml - - - name: Frontend Tests - uses: ./.github/workflows/reusable/frontend_test.yml + uses: ./.github/workflows/reusable/pytest.yml + frontend-tests: + uses: ./.github/workflows/reusable/frontend_tests.yml diff --git a/.github/workflows/reusable/frontend_tests.yml b/.github/workflows/reusable/frontend_tests.yml index 52cbdae34d..56dd3dab30 100644 --- a/.github/workflows/reusable/frontend_tests.yml +++ b/.github/workflows/reusable/frontend_tests.yml @@ -11,8 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - - name: Checkout code - uses: actions/checkout@v3 + - uses: actions/checkout@v3 - name: Setup Node.js uses: actions/setup-node@v2 From fa0406a34a4a5cc3189f1fa6147acb07f0cee963 Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Mon, 11 Sep 2023 15:51:02 +0100 Subject: [PATCH 19/59] fix: set underpass api url via env var --- src/backend/app/config.py | 1 + src/backend/app/projects/project_crud.py | 6 +++--- src/backend/app/tasks/tasks_crud.py | 3 ++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/backend/app/config.py b/src/backend/app/config.py index 56daa0f82a..daa77dc272 100644 --- a/src/backend/app/config.py +++ b/src/backend/app/config.py @@ -110,6 +110,7 @@ def assemble_db_connection(cls, v: Optional[str], info: FieldValidationInfo) -> OSM_SCOPE: str = "read_prefs" OSM_LOGIN_REDIRECT_URI: str = "http://127.0.0.1:8080/osmauth/" + UNDERPASS_API_URL: str = "https://raw-data-api0.hotosm.org/v1" SENTRY_DSN: Optional[str] = None model_config = SettingsConfigDict( diff --git a/src/backend/app/projects/project_crud.py b/src/backend/app/projects/project_crud.py index 3aa7a0db13..adc69cdc9b 100644 --- a/src/backend/app/projects/project_crud.py +++ b/src/backend/app/projects/project_crud.py @@ -581,7 +581,7 @@ def get_osm_extracts(boundary: str): else: query["geometry"] = json_boundary - base_url = "https://raw-data-api0.hotosm.org/v1" + base_url = settings.UNDERPASS_API_URL query_url = f"{base_url}/snapshot/" headers = {"accept": "application/json", "Content-Type": "application/json"} @@ -1394,7 +1394,7 @@ def generate_appuser_files( project_log.info(f"Extracting Data from OSM") # OSM Extracts for whole project - pg = PostgresClient("https://raw-data-api0.hotosm.org/v1", "underpass") + pg = PostgresClient(settings.UNDERPASS_API_URL, "underpass") # This file will store osm extracts outfile = f"/tmp/{prefix}_{xform_title}.geojson" @@ -2019,7 +2019,7 @@ async def update_project_form( db.commit() # OSM Extracts for whole project - pg = PostgresClient("https://raw-data-api0.hotosm.org/v1", "underpass") + pg = PostgresClient(settings.UNDERPASS_API_URL, "underpass") outfile = ( f"/tmp/{project_title}_{category}.geojson" # This file will store osm extracts ) diff --git a/src/backend/app/tasks/tasks_crud.py b/src/backend/app/tasks/tasks_crud.py index 21a9d48afb..5aaea42be7 100644 --- a/src/backend/app/tasks/tasks_crud.py +++ b/src/backend/app/tasks/tasks_crud.py @@ -40,6 +40,7 @@ from ..projects import project_crud from ..tasks import tasks_schemas from ..users import user_crud +from app.config import settings async def get_task_count_in_project(db: Session, project_id: int): @@ -330,7 +331,7 @@ async def update_task_files( task_polygons = f"/tmp/{project_name}_{category}_{task_id}.geojson" # Update data extracts in the odk central - pg = PostgresClient("https://raw-data-api0.hotosm.org/v1", "underpass") + pg = PostgresClient(settings.UNDERPASS_API_URL, "underpass") category = "buildings" From 8f812f53c78ca5d46447f71188901c1c36d3c68d Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Mon, 11 Sep 2023 15:51:17 +0100 Subject: [PATCH 20/59] docs: add UNDERPASS_API_URL to env example --- .env.example | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.env.example b/.env.example index 3d56c58538..540fe6af62 100644 --- a/.env.example +++ b/.env.example @@ -34,3 +34,6 @@ FMTM_DB_HOST=fmtm-db FMTM_DB_USER=fmtm FMTM_DB_PASSWORD=fmtm FMTM_DB_NAME=fmtm + +### Underpass (optional) ### +# UNDERPASS_API_URL= From 15a32d80d2e94f5f808ec5019add9f2d9807ac5b Mon Sep 17 00:00:00 2001 From: "Deepak Pradhan (Varun)" <37866666+varun2948@users.noreply.github.com> Date: Thu, 14 Sep 2023 02:47:51 -0700 Subject: [PATCH 21/59] feat: remove microfrontend (#831) * feat: removed micro frontend map folder and in map integration * fix: loading bar * feat: removed fmtm_map micro frontend from docker and github actions removed fmtm_map micro frontend from docker and github actions --- .env.example | 1 - .github/workflows/build_and_deploy.yml | 18 - .github/workflows/reusable/pytest.yml | 1 - INSTALL.md | 1 - docker-compose.deploy.yml | 33 - docker-compose.noodk.yml | 4 - docker-compose.yml | 28 - docs/dev/Production.md | 1 - docs/dev/Setup.md | 1 - docs/dev/Troubleshooting.md | 2 +- gen-env.sh | 23 - src/backend/app/config.py | 5 +- src/frontend/debug.dockerfile | 2 - src/frontend/fmtm_openlayer_map/.babelrc | 12 - src/frontend/fmtm_openlayer_map/.dockerignore | 3 - src/frontend/fmtm_openlayer_map/.gitignore | 116 - .../fmtm_openlayer_map/package-lock.json | 14899 ---------------- src/frontend/fmtm_openlayer_map/package.json | 50 - src/frontend/fmtm_openlayer_map/src/App.jsx | 14 - .../fmtm_openlayer_map/src/api/Project.js | 180 - .../src/api/SubmissionService.ts | 48 - .../src/components/Activities.jsx | 90 - .../src/components/ActivitiesPanel.jsx | 184 - .../LayerSwitcher/index.js | 163 - .../OpenLayersComponent/Layers/VectorLayer.js | 266 - .../Layers/VectorTileLayer.js | 215 - .../OpenLayersComponent/Layers/index.js | 3 - .../MapContainer/index.jsx | 37 - .../OpenLayersComponent/Popup/index.jsx | 72 - .../OpenLayersComponent/Popup/popup.css | 49 - .../OpenLayersComponent/Popup/popup.css.map | 1 - .../OpenLayersComponent/Popup/popup.scss | 50 - .../helpers/getFeatureGeojson.js | 13 - .../OpenLayersComponent/helpers/layerUtils.js | 62 - .../OpenLayersComponent/helpers/styleUtils.js | 240 - .../MapComponent/OpenLayersComponent/index.js | 3 - .../MapComponent/OpenLayersComponent/map.css | 97 - .../MapComponent/OpenLayersComponent/map.scss | 134 - .../OpenLayersComponent/useOLMap/index.js | 68 - .../ProjectInfo/ProjectInfoCountCard.jsx | 90 - .../ProjectInfoCountCardSkeleton.jsx | 27 - .../ProjectInfoSidebarSkeleton.jsx | 46 - .../SubmissionMap/SubmissionMap.jsx | 69 - .../fmtm_openlayer_map/src/hooks/MapStyles.js | 120 - src/frontend/fmtm_openlayer_map/src/index.css | 7 - .../fmtm_openlayer_map/src/index.html | 18 - src/frontend/fmtm_openlayer_map/src/index.ts | 2 - .../fmtm_openlayer_map/src/routes.jsx | 22 - .../src/utilities/BasicDialog.jsx | 48 - .../src/utilities/IconButtonCard.jsx | 17 - .../fmtm_openlayer_map/src/views/MainView.jsx | 29 - src/frontend/fmtm_openlayer_map/tsconfig.json | 43 - .../fmtm_openlayer_map/webpack.config.js | 175 - .../src/api/Files.js | 16 +- src/frontend/main/src/api/Project.js | 177 + .../src/api/ProjectTaskStatus.js | 40 +- .../main/src/api/SubmissionService.ts | 40 + .../src/api/task.ts | 44 +- .../src/assets/images/acc-down.png | Bin .../src/assets/images/acc-up.png | Bin .../src/assets/images/avatar.png | Bin .../src/assets/images/grid.png | Bin .../src/assets/images/location.png | Bin .../main/src/components/Activities.jsx | 67 + .../main/src/components/ActivitiesPanel.jsx | 182 + .../src/components/DialogTaskActions.jsx | 71 +- .../src/components/GenerateMbTiles.jsx | 111 +- .../components/MapDescriptionComponents.jsx | 34 +- .../src/components/MapLegends.jsx | 0 .../src/components/OpenLayersMap.jsx | 239 +- .../components/ProjectInfo/ProjectCard.jsx | 25 +- .../ProjectInfo/ProjectInfoCountCard.jsx | 80 + .../ProjectInfoCountCardSkeleton.jsx | 22 + .../ProjectInfo/ProjectInfoSidebar.jsx | 83 +- .../ProjectInfoSidebarSkeleton.jsx | 46 + .../components/ProjectInfo/ProjectInfomap.jsx | 137 +- .../src/components/ProjectMap/ProjectMap.jsx | 0 .../src/components/QrcodeComponent.jsx | 102 +- .../SubmissionMap/SubmissionMap.jsx | 64 + .../src/components}/TasksLayer.jsx | 48 +- .../src/components/TasksMap/TasksMap.jsx | 0 .../components/createproject/DataExtract.tsx | 5 +- .../components/createproject/DefineTasks.tsx | 4 +- .../components/createproject/LoadingBar.tsx | 11 + .../components/createproject/UploadArea.tsx | 2 +- .../editproject/UpdateProjectArea.tsx | 8 +- src/frontend/main/src/environment.ts | 1 - src/frontend/main/src/hooks/MapStyles.js | 121 + .../src/hooks/useOlMap.ts | 0 .../src/models/geojsonObjectModel.js | 0 src/frontend/main/src/routes.jsx | 10 +- src/frontend/main/src/store/Store.ts | 1 - .../src/styles/home.scss | 0 .../main/src/utilities/BasicDialog.jsx | 31 + .../main/src/utilities/IconButtonCard.jsx | 16 + .../src/utilities/mapUtils.js | 0 .../src/views/DefineAreaMap.tsx} | 38 +- .../src/views/EditProjectArea.tsx} | 20 +- .../src/views/ProjectDetails.jsx} | 304 +- .../src/views/ProjectInfo.tsx} | 218 +- .../src/views/Submissions.tsx} | 136 +- .../Tasks.jsx => main/src/views/Tasks.tsx} | 240 +- src/frontend/main/webpack.config.js | 43 +- src/frontend/prod.dockerfile | 3 - 104 files changed, 1617 insertions(+), 19125 deletions(-) delete mode 100755 src/frontend/fmtm_openlayer_map/.babelrc delete mode 100755 src/frontend/fmtm_openlayer_map/.dockerignore delete mode 100755 src/frontend/fmtm_openlayer_map/.gitignore delete mode 100644 src/frontend/fmtm_openlayer_map/package-lock.json delete mode 100755 src/frontend/fmtm_openlayer_map/package.json delete mode 100755 src/frontend/fmtm_openlayer_map/src/App.jsx delete mode 100755 src/frontend/fmtm_openlayer_map/src/api/Project.js delete mode 100644 src/frontend/fmtm_openlayer_map/src/api/SubmissionService.ts delete mode 100755 src/frontend/fmtm_openlayer_map/src/components/Activities.jsx delete mode 100755 src/frontend/fmtm_openlayer_map/src/components/ActivitiesPanel.jsx delete mode 100644 src/frontend/fmtm_openlayer_map/src/components/MapComponent/OpenLayersComponent/LayerSwitcher/index.js delete mode 100644 src/frontend/fmtm_openlayer_map/src/components/MapComponent/OpenLayersComponent/Layers/VectorLayer.js delete mode 100644 src/frontend/fmtm_openlayer_map/src/components/MapComponent/OpenLayersComponent/Layers/VectorTileLayer.js delete mode 100644 src/frontend/fmtm_openlayer_map/src/components/MapComponent/OpenLayersComponent/Layers/index.js delete mode 100644 src/frontend/fmtm_openlayer_map/src/components/MapComponent/OpenLayersComponent/MapContainer/index.jsx delete mode 100644 src/frontend/fmtm_openlayer_map/src/components/MapComponent/OpenLayersComponent/Popup/index.jsx delete mode 100644 src/frontend/fmtm_openlayer_map/src/components/MapComponent/OpenLayersComponent/Popup/popup.css delete mode 100644 src/frontend/fmtm_openlayer_map/src/components/MapComponent/OpenLayersComponent/Popup/popup.css.map delete mode 100644 src/frontend/fmtm_openlayer_map/src/components/MapComponent/OpenLayersComponent/Popup/popup.scss delete mode 100644 src/frontend/fmtm_openlayer_map/src/components/MapComponent/OpenLayersComponent/helpers/getFeatureGeojson.js delete mode 100644 src/frontend/fmtm_openlayer_map/src/components/MapComponent/OpenLayersComponent/helpers/layerUtils.js delete mode 100644 src/frontend/fmtm_openlayer_map/src/components/MapComponent/OpenLayersComponent/helpers/styleUtils.js delete mode 100644 src/frontend/fmtm_openlayer_map/src/components/MapComponent/OpenLayersComponent/index.js delete mode 100644 src/frontend/fmtm_openlayer_map/src/components/MapComponent/OpenLayersComponent/map.css delete mode 100644 src/frontend/fmtm_openlayer_map/src/components/MapComponent/OpenLayersComponent/map.scss delete mode 100644 src/frontend/fmtm_openlayer_map/src/components/MapComponent/OpenLayersComponent/useOLMap/index.js delete mode 100644 src/frontend/fmtm_openlayer_map/src/components/ProjectInfo/ProjectInfoCountCard.jsx delete mode 100644 src/frontend/fmtm_openlayer_map/src/components/ProjectInfo/ProjectInfoCountCardSkeleton.jsx delete mode 100644 src/frontend/fmtm_openlayer_map/src/components/ProjectInfo/ProjectInfoSidebarSkeleton.jsx delete mode 100644 src/frontend/fmtm_openlayer_map/src/components/SubmissionMap/SubmissionMap.jsx delete mode 100755 src/frontend/fmtm_openlayer_map/src/hooks/MapStyles.js delete mode 100755 src/frontend/fmtm_openlayer_map/src/index.css delete mode 100755 src/frontend/fmtm_openlayer_map/src/index.html delete mode 100755 src/frontend/fmtm_openlayer_map/src/index.ts delete mode 100755 src/frontend/fmtm_openlayer_map/src/routes.jsx delete mode 100755 src/frontend/fmtm_openlayer_map/src/utilities/BasicDialog.jsx delete mode 100755 src/frontend/fmtm_openlayer_map/src/utilities/IconButtonCard.jsx delete mode 100755 src/frontend/fmtm_openlayer_map/src/views/MainView.jsx delete mode 100644 src/frontend/fmtm_openlayer_map/tsconfig.json delete mode 100755 src/frontend/fmtm_openlayer_map/webpack.config.js rename src/frontend/{fmtm_openlayer_map => main}/src/api/Files.js (72%) create mode 100755 src/frontend/main/src/api/Project.js rename src/frontend/{fmtm_openlayer_map => main}/src/api/ProjectTaskStatus.js (65%) create mode 100644 src/frontend/main/src/api/SubmissionService.ts rename src/frontend/{fmtm_openlayer_map => main}/src/api/task.ts (80%) rename src/frontend/{fmtm_openlayer_map => main}/src/assets/images/acc-down.png (100%) rename src/frontend/{fmtm_openlayer_map => main}/src/assets/images/acc-up.png (100%) rename src/frontend/{fmtm_openlayer_map => main}/src/assets/images/avatar.png (100%) rename src/frontend/{fmtm_openlayer_map => main}/src/assets/images/grid.png (100%) rename src/frontend/{fmtm_openlayer_map => main}/src/assets/images/location.png (100%) create mode 100755 src/frontend/main/src/components/Activities.jsx create mode 100755 src/frontend/main/src/components/ActivitiesPanel.jsx rename src/frontend/{fmtm_openlayer_map => main}/src/components/DialogTaskActions.jsx (68%) rename src/frontend/{fmtm_openlayer_map => main}/src/components/GenerateMbTiles.jsx (65%) rename src/frontend/{fmtm_openlayer_map => main}/src/components/MapDescriptionComponents.jsx (66%) rename src/frontend/{fmtm_openlayer_map => main}/src/components/MapLegends.jsx (100%) rename src/frontend/{fmtm_openlayer_map => main}/src/components/OpenLayersMap.jsx (52%) rename src/frontend/{fmtm_openlayer_map => main}/src/components/ProjectInfo/ProjectCard.jsx (70%) create mode 100644 src/frontend/main/src/components/ProjectInfo/ProjectInfoCountCard.jsx create mode 100644 src/frontend/main/src/components/ProjectInfo/ProjectInfoCountCardSkeleton.jsx rename src/frontend/{fmtm_openlayer_map => main}/src/components/ProjectInfo/ProjectInfoSidebar.jsx (67%) create mode 100644 src/frontend/main/src/components/ProjectInfo/ProjectInfoSidebarSkeleton.jsx rename src/frontend/{fmtm_openlayer_map => main}/src/components/ProjectInfo/ProjectInfomap.jsx (65%) rename src/frontend/{fmtm_openlayer_map => main}/src/components/ProjectMap/ProjectMap.jsx (100%) rename src/frontend/{fmtm_openlayer_map => main}/src/components/QrcodeComponent.jsx (53%) create mode 100644 src/frontend/main/src/components/SubmissionMap/SubmissionMap.jsx rename src/frontend/{fmtm_openlayer_map/src/layers => main/src/components}/TasksLayer.jsx (65%) rename src/frontend/{fmtm_openlayer_map => main}/src/components/TasksMap/TasksMap.jsx (100%) create mode 100755 src/frontend/main/src/hooks/MapStyles.js rename src/frontend/{fmtm_openlayer_map => main}/src/hooks/useOlMap.ts (100%) rename src/frontend/{fmtm_openlayer_map => main}/src/models/geojsonObjectModel.js (100%) rename src/frontend/{fmtm_openlayer_map => main}/src/styles/home.scss (100%) create mode 100755 src/frontend/main/src/utilities/BasicDialog.jsx create mode 100755 src/frontend/main/src/utilities/IconButtonCard.jsx rename src/frontend/{fmtm_openlayer_map => main}/src/utilities/mapUtils.js (100%) rename src/frontend/{fmtm_openlayer_map/src/views/DefineAreaMap.jsx => main/src/views/DefineAreaMap.tsx} (78%) rename src/frontend/{fmtm_openlayer_map/src/views/EditProjectArea.jsx => main/src/views/EditProjectArea.tsx} (75%) rename src/frontend/{fmtm_openlayer_map/src/views/Home.jsx => main/src/views/ProjectDetails.jsx} (59%) rename src/frontend/{fmtm_openlayer_map/src/views/ProjectInfo.jsx => main/src/views/ProjectInfo.tsx} (55%) rename src/frontend/{fmtm_openlayer_map/src/views/Submissions.jsx => main/src/views/Submissions.tsx} (52%) rename src/frontend/{fmtm_openlayer_map/src/views/Tasks.jsx => main/src/views/Tasks.tsx} (55%) diff --git a/.env.example b/.env.example index 540fe6af62..e8fcdce65d 100644 --- a/.env.example +++ b/.env.example @@ -13,7 +13,6 @@ ODK_CENTRAL_PASSWD=fmtm URL_SCHEME=http API_URL=127.0.0.1:8000 FRONTEND_MAIN_URL=127.0.0.1:8080 -FRONTEND_MAP_URL=127.0.0.1:8081 # API_PREFIX=/api ### OSM ### diff --git a/.github/workflows/build_and_deploy.yml b/.github/workflows/build_and_deploy.yml index 0dd127b61c..2bdfb79533 100644 --- a/.github/workflows/build_and_deploy.yml +++ b/.github/workflows/build_and_deploy.yml @@ -51,7 +51,6 @@ jobs: run: | cd src/frontend echo "FRONTEND_MAIN_VERSION=$(jq -r '.version' main/package.json)" >> $GITHUB_ENV - echo "FRONTEND_MAP_VERSION=$(jq -r '.version' fmtm_openlayer_map/package.json)" >> $GITHUB_ENV - name: Build and push backend uses: docker/build-push-action@v4 @@ -77,21 +76,6 @@ jobs: APP_VERSION=${{ env.FRONTEND_MAIN_VERSION }} API_URL=${{ env.URL_SCHEME }}://${{ env.API_URL }} FRONTEND_MAIN_URL=${{ env.URL_SCHEME }}://${{ env.FRONTEND_MAIN_URL }} - FRONTEND_MAP_URL=${{ env.URL_SCHEME }}://${{ env.FRONTEND_MAP_URL }} - - - name: Build and push frontend map - uses: docker/build-push-action@v4 - with: - context: src/frontend - file: src/frontend/prod.dockerfile - push: true - tags: "ghcr.io/hotosm/fmtm/frontend/map:${{ env.FRONTEND_MAP_VERSION }}-${{ github.ref_name }}" - build-args: | - APP_NAME=fmtm_openlayer_map - APP_VERSION=${{ env.FRONTEND_MAP_VERSION }} - API_URL=${{ env.URL_SCHEME }}://${{ env.API_URL }} - FRONTEND_MAIN_URL=${{ env.URL_SCHEME }}://${{ env.FRONTEND_MAIN_URL }} - FRONTEND_MAP_URL=${{ env.URL_SCHEME }}://${{ env.FRONTEND_MAP_URL }} deploy-containers: runs-on: ubuntu-latest @@ -114,14 +98,12 @@ jobs: run: | cd src/frontend echo "FRONTEND_MAIN_VERSION=$(jq -r '.version' main/package.json)" >> $GITHUB_OUTPUT - echo "FRONTEND_MAP_VERSION=$(jq -r '.version' fmtm_openlayer_map/package.json)" >> $GITHUB_OUTPUT - name: Environment to .env run: | echo "${{ secrets.DOTENV }}" > .env echo "API_VERSION=${{ steps.extract_api_version.outputs.API_VERSION }}" >> .env echo "FRONTEND_MAIN_VERSION=${{ steps.extract_frontend_versions.outputs.FRONTEND_MAIN_VERSION }}" >> .env - echo "FRONTEND_MAP_VERSION=${{ steps.extract_frontend_versions.outputs.FRONTEND_MAP_VERSION }}" >> .env - uses: webfactory/ssh-agent@v0.7.0 with: diff --git a/.github/workflows/reusable/pytest.yml b/.github/workflows/reusable/pytest.yml index 136aef25cf..ddc9276005 100644 --- a/.github/workflows/reusable/pytest.yml +++ b/.github/workflows/reusable/pytest.yml @@ -24,7 +24,6 @@ jobs: OSM_CLIENT_SECRET: ${{ vars.OSM_CLIENT_SECRET }} OSM_SECRET_KEY: ${{ vars.OSM_SECRET_KEY }} FRONTEND_MAIN_URL: ${{ vars.FRONTEND_MAIN_URL }} - FRONTEND_MAP_URL: ${{ vars.FRONTEND_MAP_URL }} options: --user root services: diff --git a/INSTALL.md b/INSTALL.md index 60061f4d68..d460db39f2 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -91,7 +91,6 @@ ODK_CENTRAL_PASSWD=`` URL_SCHEME=http API_URL=127.0.0.1:8000 FRONTEND_MAIN_URL=localhost:8080 -FRONTEND_MAP_URL=localhost:8081 # API_PREFIX=/api ### OSM ### diff --git a/docker-compose.deploy.yml b/docker-compose.deploy.yml index de2a27d1fc..5085516a59 100644 --- a/docker-compose.deploy.yml +++ b/docker-compose.deploy.yml @@ -115,7 +115,6 @@ services: APP_VERSION: ${FRONTEND_MAIN_VERSION} API_URL: ${URL_SCHEME}://${API_URL} FRONTEND_MAIN_URL: ${URL_SCHEME}://${FRONTEND_MAIN_URL} - FRONTEND_MAP_URL: ${URL_SCHEME}://${FRONTEND_MAP_URL} container_name: fmtm_main depends_on: - api @@ -126,7 +125,6 @@ services: - BROTLI=true - API_URL=${URL_SCHEME}://${API_URL} - FRONTEND_MAIN_URL=${URL_SCHEME}://${FRONTEND_MAIN_URL} - - FRONTEND_MAP_URL=${URL_SCHEME}://${FRONTEND_MAP_URL} restart: unless-stopped labels: - "traefik.enable=true" @@ -135,34 +133,3 @@ services: - "traefik.http.routers.ui-main.rule=Host(`${FRONTEND_MAIN_URL}`)" - "traefik.http.services.ui-main-svc.loadbalancer.server.port=8080" - "traefik.http.routers.ui-main.service=ui-main-svc" - - ui-map: - image: "ghcr.io/hotosm/fmtm/frontend/map:${FRONTEND_MAP_VERSION}-${GIT_BRANCH}" - build: - context: src/frontend - dockerfile: prod.dockerfile - args: - APP_NAME: fmtm_openlayer_map - APP_VERSION: ${FRONTEND_MAP_VERSION} - API_URL: ${URL_SCHEME}://${API_URL} - FRONTEND_MAIN_URL: ${URL_SCHEME}://${FRONTEND_MAIN_URL} - FRONTEND_MAP_URL: ${URL_SCHEME}://${FRONTEND_MAP_URL} - container_name: fmtm_map - depends_on: - - api - - traefik - networks: - - fmtm-net - environment: - - BROTLI=true - - API_URL=${URL_SCHEME}://${API_URL} - - FRONTEND_MAIN_URL=${URL_SCHEME}://${FRONTEND_MAIN_URL} - - FRONTEND_MAP_URL=${URL_SCHEME}://${FRONTEND_MAP_URL} - restart: unless-stopped - labels: - - "traefik.enable=true" - - "traefik.http.routers.ui-map.tls=true" - - "traefik.http.routers.ui-map.tls.certresolver=letsencrypt" - - "traefik.http.routers.ui-map.rule=Host(`${FRONTEND_MAP_URL}`)" - - "traefik.http.services.ui-map-svc.loadbalancer.server.port=8080" - - "traefik.http.routers.ui-map.service=ui-map-svc" diff --git a/docker-compose.noodk.yml b/docker-compose.noodk.yml index 562f9b0a08..88ac3fa3ed 100644 --- a/docker-compose.noodk.yml +++ b/docker-compose.noodk.yml @@ -76,7 +76,6 @@ services: APP_NAME: main API_URL: ${URL_SCHEME}://${API_URL} FRONTEND_MAIN_URL: ${URL_SCHEME}://${FRONTEND_MAIN_URL} - FRONTEND_MAP_URL: ${URL_SCHEME}://${FRONTEND_MAP_URL} container_name: fmtm_main depends_on: - api @@ -86,7 +85,6 @@ services: environment: - API_URL=${URL_SCHEME}://${API_URL} - FRONTEND_MAIN_URL=${URL_SCHEME}://${FRONTEND_MAIN_URL} - - FRONTEND_MAP_URL=${URL_SCHEME}://${FRONTEND_MAP_URL} ports: - "8081:8081" networks: @@ -102,7 +100,6 @@ services: APP_NAME: fmtm_openlayer_map API_URL: ${URL_SCHEME}://${API_URL} FRONTEND_MAIN_URL: ${URL_SCHEME}://${FRONTEND_MAIN_URL} - FRONTEND_MAP_URL: ${URL_SCHEME}://${FRONTEND_MAP_URL} container_name: fmtm_map depends_on: - api @@ -112,7 +109,6 @@ services: environment: - API_URL=${URL_SCHEME}://${API_URL} - FRONTEND_MAIN_URL=${URL_SCHEME}://${FRONTEND_MAIN_URL} - - FRONTEND_MAP_URL=${URL_SCHEME}://${FRONTEND_MAP_URL} ports: - "8082:8082" networks: diff --git a/docker-compose.yml b/docker-compose.yml index 87ed015feb..de851d2e8d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -83,7 +83,6 @@ services: APP_NAME: main API_URL: ${URL_SCHEME}://${API_URL} FRONTEND_MAIN_URL: ${URL_SCHEME}://${FRONTEND_MAIN_URL} - FRONTEND_MAP_URL: ${URL_SCHEME}://${FRONTEND_MAP_URL} container_name: fmtm_main depends_on: - api @@ -93,39 +92,12 @@ services: environment: - API_URL=${URL_SCHEME}://${API_URL} - FRONTEND_MAIN_URL=${URL_SCHEME}://${FRONTEND_MAIN_URL} - - FRONTEND_MAP_URL=${URL_SCHEME}://${FRONTEND_MAP_URL} ports: - "8080:8080" networks: - fmtm-dev restart: unless-stopped - ui-map: - image: "ghcr.io/hotosm/fmtm/frontend/map:debug" - build: - context: src/frontend - dockerfile: debug.dockerfile - args: - APP_NAME: fmtm_openlayer_map - API_URL: ${URL_SCHEME}://${API_URL} - FRONTEND_MAIN_URL: ${URL_SCHEME}://${FRONTEND_MAIN_URL} - FRONTEND_MAP_URL: ${URL_SCHEME}://${FRONTEND_MAP_URL} - container_name: fmtm_map - depends_on: - - api - volumes: - - ./src/frontend/fmtm_openlayer_map:/app - - /app/node_modules/ - environment: - - API_URL=${URL_SCHEME}://${API_URL} - - FRONTEND_MAIN_URL=${URL_SCHEME}://${FRONTEND_MAIN_URL} - - FRONTEND_MAP_URL=${URL_SCHEME}://${FRONTEND_MAP_URL} - ports: - - "8081:8081" - networks: - - fmtm-dev - restart: unless-stopped - central-db: image: "postgis/postgis:14-3.3-alpine" container_name: central_db diff --git a/docs/dev/Production.md b/docs/dev/Production.md index 9b0667e4ab..6fdf307019 100644 --- a/docs/dev/Production.md +++ b/docs/dev/Production.md @@ -60,7 +60,6 @@ that file to contain the needful (it should look like this): # FMTM API_URL=https://fmtm-api.hotosm.org FRONTEND_MAIN_URL=https://fmtm.hotosm.org - FRONTEND_MAP_URL=https://map.fmtm.hotosm.org # API_PREFIX=/api # OSM diff --git a/docs/dev/Setup.md b/docs/dev/Setup.md index 1cf3459cda..533057b55d 100644 --- a/docs/dev/Setup.md +++ b/docs/dev/Setup.md @@ -270,7 +270,6 @@ ODK_CENTRAL_PASSWD=`` URL_SCHEME=http API_URL=127.0.0.1:8000 FRONTEND_MAIN_URL=localhost:8080 -FRONTEND_MAP_URL=localhost:8081 # API_PREFIX=/api ### OSM ### diff --git a/docs/dev/Troubleshooting.md b/docs/dev/Troubleshooting.md index 65d5f54eb4..c257922f54 100644 --- a/docs/dev/Troubleshooting.md +++ b/docs/dev/Troubleshooting.md @@ -42,7 +42,7 @@ If you would rather not do this, an alternative can be to feed them into the pdm command: ```bash -FRONTEND_MAIN_URL="" FRONTEND_MAP_URL="" \ +FRONTEND_MAIN_URL="" \ OSM_CLIENT_ID="" OSM_CLIENT_SECRET="" OSM_SECRET_KEY="" \ pdm run uvicorn app.main:api --host 0.0.0.0 --port 8000 ``` diff --git a/gen-env.sh b/gen-env.sh index a6462d7675..04f64a4eb2 100644 --- a/gen-env.sh +++ b/gen-env.sh @@ -165,28 +165,6 @@ do fi done -# FRONTEND MAP -echo -echo "Enter the FMTM Map Frontend URL." -echo "If you have a valid domain name, enter it here." -while true -do - read -e -p "Enter d for default 127.0.0.1:8080, else your IP/domain: " frontend_map_url - - if [ "$frontend_map_url" != "d" ] - then - echo "Using $FRONTEND_MAP_URL" - break - elif [ "$api_url" = "" ] - then - echo "Invalid input!" - else - echo "Using $FRONTEND_MAP_URL" - FRONTEND_MAP_URL="frontend_map_url" - break - fi -done - echo echo "Please enter your OSM authentication details" read -e -p "Client ID: " OSM_CLIENT_ID @@ -226,7 +204,6 @@ echo "### FMTM ###" echo "URL_SCHEME=${URL_SCHEME}" >> "${DOTENV_NAME}" echo "API_URL=${API_URL}" >> "${DOTENV_NAME}" echo "FRONTEND_MAIN_URL=${FRONTEND_MAIN_URL}" >> "${DOTENV_NAME}" -echo "FRONTEND_MAP_URL=${FRONTEND_MAP_URL}" >> "${DOTENV_NAME}" echo "### OSM ###" echo "OSM_CLIENT_ID=${OSM_CLIENT_ID}" >> "${DOTENV_NAME}" diff --git a/src/backend/app/config.py b/src/backend/app/config.py index daa77dc272..4d89116e15 100644 --- a/src/backend/app/config.py +++ b/src/backend/app/config.py @@ -33,7 +33,6 @@ class Settings(BaseSettings): URL_SCHEME: Optional[str] = "http" FRONTEND_MAIN_URL: Optional[str] - FRONTEND_MAP_URL: Optional[str] EXTRA_CORS_ORIGINS: Optional[Union[str, list[str]]] = [] @@ -54,11 +53,9 @@ def assemble_cors_origins( # Build default origins from env vars url_scheme = info.data.get("URL_SCHEME") main_url = info.data.get("FRONTEND_MAIN_URL") - map_url = info.data.get("FRONTEND_MAP_URL") - if url_scheme and main_url and map_url: + if url_scheme and main_url: default_origins = [ f"{url_scheme}://{main_url}", - f"{url_scheme}://{map_url}", ] if val is None: diff --git a/src/frontend/debug.dockerfile b/src/frontend/debug.dockerfile index 1c970eec60..dda364d8b5 100755 --- a/src/frontend/debug.dockerfile +++ b/src/frontend/debug.dockerfile @@ -4,8 +4,6 @@ ARG API_URL ENV API_URL="${API_URL}" ARG FRONTEND_MAIN_URL ENV FRONTEND_MAIN_URL="${FRONTEND_MAIN_URL}" -ARG FRONTEND_MAP_URL -ENV FRONTEND_MAP_URL="${FRONTEND_MAP_URL}" WORKDIR /app COPY ./${APP_NAME}/package*.json ./ RUN npm install diff --git a/src/frontend/fmtm_openlayer_map/.babelrc b/src/frontend/fmtm_openlayer_map/.babelrc deleted file mode 100755 index a7fe901ad1..0000000000 --- a/src/frontend/fmtm_openlayer_map/.babelrc +++ /dev/null @@ -1,12 +0,0 @@ -{ - "presets": [ [ - "@babel/preset-env", - { - "useBuiltIns": "entry", - "corejs": "3.22" - } - ],"@babel/preset-typescript", "@babel/preset-react"], - "plugins": [ - ["@babel/transform-runtime"] - ] -} diff --git a/src/frontend/fmtm_openlayer_map/.dockerignore b/src/frontend/fmtm_openlayer_map/.dockerignore deleted file mode 100755 index 91f29054c7..0000000000 --- a/src/frontend/fmtm_openlayer_map/.dockerignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules -dist -.gitignore diff --git a/src/frontend/fmtm_openlayer_map/.gitignore b/src/frontend/fmtm_openlayer_map/.gitignore deleted file mode 100755 index 81610adaf2..0000000000 --- a/src/frontend/fmtm_openlayer_map/.gitignore +++ /dev/null @@ -1,116 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# Snowpack dependency directory (https://snowpack.dev/) -web_modules/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env -.env.test -.env.dev -# parcel-bundler cache (https://parceljs.org/) -.cache -.parcel-cache - -# Next.js build output -.next -out - -# Nuxt.js build / generate output -.nuxt -dist - -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and not Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# TernJS port file -.tern-port - -# Stores VSCode versions used for testing VSCode extensions -.vscode-test - -# yarn v2 -.yarn/cache -.yarn/unplugged -.yarn/build-state.yml -.yarn/install-state.gz -.pnp.* diff --git a/src/frontend/fmtm_openlayer_map/package-lock.json b/src/frontend/fmtm_openlayer_map/package-lock.json deleted file mode 100644 index 0225019885..0000000000 --- a/src/frontend/fmtm_openlayer_map/package-lock.json +++ /dev/null @@ -1,14899 +0,0 @@ -{ - "name": "fmtm_openlayer_map", - "version": "0.1.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "fmtm_openlayer_map", - "version": "0.1.0", - "license": "MIT", - "dependencies": { - "css-minimizer-webpack-plugin": "^5.0.0", - "env-cmd": "^10.1.0", - "ol": "^7.5.2", - "ol-layerswitcher": "^4.1.1", - "react": "^17.0.2", - "react-dom": "^17.0.2", - "react-share-social": "^0.1.55", - "terser-webpack-plugin": "^5.3.7", - "webpack-bundle-analyzer": "^4.8.0" - }, - "devDependencies": { - "@babel/core": "^7.15.8", - "@babel/plugin-transform-runtime": "^7.15.8", - "@babel/preset-env": "^7.21.4", - "@babel/preset-react": "^7.14.5", - "@babel/preset-typescript": "^7.10.4", - "@types/react": "^17.0.2", - "@types/react-dom": "^17.0.2", - "autoprefixer": "^10.1.0", - "babel-loader": "^8.2.2", - "babel-plugin-import": "^1.13.6", - "css-loader": "^6.3.0", - "html-webpack-plugin": "^5.3.2", - "postcss": "^8.2.1", - "postcss-loader": "^4.1.0", - "sass": "^1.58.3", - "sass-loader": "^13.2.0", - "style-loader": "^3.3.0", - "typescript": "^4.5.2", - "webpack": "^5.75.0", - "webpack-cli": "^4.9.0", - "webpack-dev-server": "^4.3.1" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz", - "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.20.12", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", - "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helpers": "^7.20.7", - "@babel/parser": "^7.20.7", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.12", - "@babel/types": "^7.20.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", - "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.21.4", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", - "dev": true, - "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", - "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.21.4", - "@babel/helper-validator-option": "^7.21.0", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.4.tgz", - "integrity": "sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz", - "integrity": "sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.2.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0-0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", - "dev": true, - "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz", - "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.21.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", - "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.20.7", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", - "dev": true, - "dependencies": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz", - "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==", - "dev": true, - "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.13", - "@babel/types": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", - "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "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.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", - "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", - "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", - "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", - "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", - "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", - "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", - "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", - "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", - "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", - "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/template": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", - "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", - "dev": true, - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz", - "integrity": "sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", - "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz", - "integrity": "sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-simple-access": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", - "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", - "dev": true, - "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-identifier": "^7.19.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", - "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", - "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.20.13.tgz", - "integrity": "sha512-MmTZx/bkUrfJhhYAYt3Urjm+h8DQGrPrnKQ94jLo7NLuOU+T89a7IByhKmrb8SKhrIYIQ0FN0CHMbnFRen4qNw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-jsx": "^7.18.6", - "@babel/types": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", - "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", - "dev": true, - "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", - "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", - "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "regenerator-transform": "^0.15.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz", - "integrity": "sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.19.0", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", - "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.13.tgz", - "integrity": "sha512-O7I/THxarGcDZxkgWKMUrk7NK1/WbHAg3Xx86gqS6x9MTrNL6AwIluuZ96ms4xeDe6AVx6rjHbWHP7x26EPQBA==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.20.12", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-typescript": "^7.20.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.4.tgz", - "integrity": "sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.21.4", - "@babel/helper-compilation-targets": "^7.21.4", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.20.7", - "@babel/plugin-proposal-async-generator-functions": "^7.20.7", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.21.0", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.20.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.21.0", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.21.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.20.7", - "@babel/plugin-transform-async-to-generator": "^7.20.7", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.21.0", - "@babel/plugin-transform-classes": "^7.21.0", - "@babel/plugin-transform-computed-properties": "^7.20.7", - "@babel/plugin-transform-destructuring": "^7.21.3", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.21.0", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.20.11", - "@babel/plugin-transform-modules-commonjs": "^7.21.2", - "@babel/plugin-transform-modules-systemjs": "^7.20.11", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.20.5", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.21.3", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.20.5", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.20.7", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.21.4", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-react": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", - "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-react-display-name": "^7.18.6", - "@babel/plugin-transform-react-jsx": "^7.18.6", - "@babel/plugin-transform-react-jsx-development": "^7.18.6", - "@babel/plugin-transform-react-pure-annotations": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", - "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-typescript": "^7.18.6" - }, - "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 - }, - "node_modules/@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", - "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.4", - "@babel/types": "^7.21.4", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", - "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@jest/schemas": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", - "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", - "dependencies": { - "@sinclair/typebox": "^0.25.16" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", - "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", - "dependencies": { - "@jest/schemas": "^29.4.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==", - "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==", - "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/@jest/types/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==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/types/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==" - }, - "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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/types/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==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", - "dev": true - }, - "node_modules/@mapbox/jsonlint-lines-primitives": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", - "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@mapbox/mapbox-gl-style-spec": { - "version": "13.28.0", - "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-style-spec/-/mapbox-gl-style-spec-13.28.0.tgz", - "integrity": "sha512-B8xM7Fp1nh5kejfIl4SWeY0gtIeewbuRencqO3cJDrCHZpaPg7uY+V8abuR+esMeuOjRl5cLhVTP40v+1ywxbg==", - "dependencies": { - "@mapbox/jsonlint-lines-primitives": "~2.0.2", - "@mapbox/point-geometry": "^0.1.0", - "@mapbox/unitbezier": "^0.0.0", - "csscolorparser": "~1.0.2", - "json-stringify-pretty-compact": "^2.0.0", - "minimist": "^1.2.6", - "rw": "^1.3.3", - "sort-object": "^0.3.2" - }, - "bin": { - "gl-style-composite": "bin/gl-style-composite.js", - "gl-style-format": "bin/gl-style-format.js", - "gl-style-migrate": "bin/gl-style-migrate.js", - "gl-style-validate": "bin/gl-style-validate.js" - } - }, - "node_modules/@mapbox/point-geometry": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", - "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==" - }, - "node_modules/@mapbox/unitbezier": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", - "integrity": "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==" - }, - "node_modules/@material-ui/core": { - "version": "4.12.4", - "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.4.tgz", - "integrity": "sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ==", - "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", - "dependencies": { - "@babel/runtime": "^7.4.4", - "@material-ui/styles": "^4.11.5", - "@material-ui/system": "^4.12.2", - "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.3", - "@types/react-transition-group": "^4.2.0", - "clsx": "^1.0.4", - "hoist-non-react-statics": "^3.3.2", - "popper.js": "1.16.1-lts", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0", - "react-transition-group": "^4.4.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, - "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@material-ui/core/node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" - }, - "node_modules/@material-ui/styles": { - "version": "4.11.5", - "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz", - "integrity": "sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA==", - "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", - "dependencies": { - "@babel/runtime": "^7.4.4", - "@emotion/hash": "^0.8.0", - "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.3", - "clsx": "^1.0.4", - "csstype": "^2.5.2", - "hoist-non-react-statics": "^3.3.2", - "jss": "^10.5.1", - "jss-plugin-camel-case": "^10.5.1", - "jss-plugin-default-unit": "^10.5.1", - "jss-plugin-global": "^10.5.1", - "jss-plugin-nested": "^10.5.1", - "jss-plugin-props-sort": "^10.5.1", - "jss-plugin-rule-value-function": "^10.5.1", - "jss-plugin-vendor-prefixer": "^10.5.1", - "prop-types": "^15.7.2" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, - "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@material-ui/styles/node_modules/@emotion/hash": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" - }, - "node_modules/@material-ui/styles/node_modules/csstype": { - "version": "2.6.21", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", - "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" - }, - "node_modules/@material-ui/system": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.2.tgz", - "integrity": "sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw==", - "dependencies": { - "@babel/runtime": "^7.4.4", - "@material-ui/utils": "^4.11.3", - "csstype": "^2.5.2", - "prop-types": "^15.7.2" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, - "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@material-ui/system/node_modules/csstype": { - "version": "2.6.21", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", - "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" - }, - "node_modules/@material-ui/types": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", - "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==", - "peerDependencies": { - "@types/react": "*" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@material-ui/utils": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", - "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", - "dependencies": { - "@babel/runtime": "^7.4.4", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - } - }, - "node_modules/@material-ui/utils/node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" - }, - "node_modules/@petamoriken/float16": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/@petamoriken/float16/-/float16-3.7.1.tgz", - "integrity": "sha512-oXZOc+aePd0FnhTWk15pyqK+Do87n0TyLV1nxdEougE95X/WXWDqmQobfhgnSY7QsWn5euZUWuDVeTQvoQ5VNw==" - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.21", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", - "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==" - }, - "node_modules/@sinclair/typebox": { - "version": "0.25.24", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", - "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==" - }, - "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==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", - "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", - "dev": true, - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/eslint": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.0.tgz", - "integrity": "sha512-35EhHNOXgxnUgh4XCJsGhE7zdlDhYDN/aMG6UbkByCFFNgQ7b3U+uVoqBpicFydR8JEfgdjCF7SJ7MiJfzuiTA==", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" - }, - "node_modules/@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", - "dev": true, - "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.17.33", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", - "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "dev": true - }, - "node_modules/@types/http-proxy": { - "version": "1.17.9", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", - "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" - }, - "node_modules/@types/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", - "dev": true - }, - "node_modules/@types/node": { - "version": "18.13.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz", - "integrity": "sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==" - }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" - }, - "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true - }, - "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true - }, - "node_modules/@types/react": { - "version": "17.0.53", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.53.tgz", - "integrity": "sha512-1yIpQR2zdYu1Z/dc1OxC+MA6GR240u3gcnP4l6mvj/PJiVaqHsQPmWttsvHsfnhfPbU2FuGmo0wSITPygjBmsw==", - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "17.0.18", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.18.tgz", - "integrity": "sha512-rLVtIfbwyur2iFKykP2w0pl/1unw26b5td16d5xMgp7/yjTHomkyxPYChFoCr/FtEX1lN9wY6lFj1qvKdS5kDw==", - "dev": true, - "dependencies": { - "@types/react": "^17" - } - }, - "node_modules/@types/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "dev": true - }, - "node_modules/@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" - }, - "node_modules/@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", - "dev": true, - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", - "dev": true, - "dependencies": { - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webpack-cli/configtest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", - "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", - "dev": true, - "peerDependencies": { - "webpack": "4.x.x || 5.x.x", - "webpack-cli": "4.x.x" - } - }, - "node_modules/@webpack-cli/info": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", - "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", - "dev": true, - "dependencies": { - "envinfo": "^7.7.3" - }, - "peerDependencies": { - "webpack-cli": "4.x.x" - } - }, - "node_modules/@webpack-cli/serve": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", - "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", - "dev": true, - "peerDependencies": { - "webpack-cli": "4.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" - }, - "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==" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "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" - ], - "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", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", - "dependencies": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.13", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", - "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } - ], - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001426", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/babel-loader": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", - "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", - "dev": true, - "dependencies": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - }, - "engines": { - "node": ">= 8.9" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "webpack": ">=2" - } - }, - "node_modules/babel-plugin-import": { - "version": "1.13.6", - "resolved": "https://registry.npmjs.org/babel-plugin-import/-/babel-plugin-import-1.13.6.tgz", - "integrity": "sha512-N7FYnGh0DFsvDRkAPsvFq/metVfVD7P2h1rokOPpEH4cZbdRHCW+2jbXt0nnuqowkm/xhh2ww1anIdEpfYa7ZA==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/batch": { - "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==", - "dev": true - }, - "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, - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "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.1", - "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/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "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, - "dependencies": { - "ms": "2.0.0" - } - }, - "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 - }, - "node_modules/bonjour-service": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.0.tgz", - "integrity": "sha512-LVRinRB3k1/K0XzZ2p58COnWvkQknIY6sf0zF2rpErvcJXpMBttEPQSxK+HEXSS9VmpZlDoDnQWv8ftJT20B0Q==", - "dev": true, - "dependencies": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", - "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==" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "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, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001451", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001451.tgz", - "integrity": "sha512-XY7UbUpGRatZzoRft//5xOa69/1iGJRBlrieH6QYrkKLIFn3m7OVEJ81dSrKoy2BnKsdbX5cLrOispZNYo9v2w==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/classnames": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", - "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" - }, - "node_modules/clean-css": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", - "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", - "dev": true, - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" - }, - "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true - }, - "node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "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, - "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/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "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 - }, - "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 - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "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, - "engines": { - "node": ">=0.8" - } - }, - "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, - "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, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true, - "engines": { - "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 - }, - "node_modules/core-js-compat": { - "version": "3.27.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.2.tgz", - "integrity": "sha512-welaYuF7ZtbYKGrIy7y3eb40d37rG1FvzEOfe7hSLd2iD6duMDqUhRfSvCGyC46HhR6Y8JXXdZ2lnRUMkPBpvg==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4" - }, - "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 - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-declaration-sorter": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz", - "integrity": "sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew==", - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/css-loader": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", - "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.19", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/css-loader/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/css-loader/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/css-loader/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/css-minimizer-webpack-plugin": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.0.tgz", - "integrity": "sha512-1wZ/PYvg+ZKwi5FX6YrvbB31jMAdurS+CmRQLwWCVSlfzJC85l/a6RVICqUHFa+jXyhilfnCyjafzJGbmz5tcA==", - "dependencies": { - "cssnano": "^6.0.0", - "jest-worker": "^29.4.3", - "postcss": "^8.4.21", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@parcel/css": { - "optional": true - }, - "@swc/css": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "lightningcss": { - "optional": true - } - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/css-minimizer-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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/jest-worker": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", - "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.5.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "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==", - "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-vendor": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", - "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", - "dependencies": { - "@babel/runtime": "^7.8.3", - "is-in-browser": "^1.0.2" - } - }, - "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==", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/csscolorparser": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz", - "integrity": "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==" - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.0.0.tgz", - "integrity": "sha512-RGlcbzGhzEBCHuQe3k+Udyj5M00z0pm9S+VurHXFEOXxH+y0sVrJH2sMzoyz2d8N1EScazg+DVvmgyx0lurwwA==", - "dependencies": { - "cssnano-preset-default": "^6.0.0", - "lilconfig": "^2.1.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-default": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.0.0.tgz", - "integrity": "sha512-BDxlaFzObRDXUiCCBQUNQcI+f1/aX2mgoNtXGjV6PG64POcHoDUoX+LgMWw+Q4609QhxwkcSnS65YFs42RA6qQ==", - "dependencies": { - "css-declaration-sorter": "^6.3.1", - "cssnano-utils": "^4.0.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^6.0.0", - "postcss-convert-values": "^6.0.0", - "postcss-discard-comments": "^6.0.0", - "postcss-discard-duplicates": "^6.0.0", - "postcss-discard-empty": "^6.0.0", - "postcss-discard-overridden": "^6.0.0", - "postcss-merge-longhand": "^6.0.0", - "postcss-merge-rules": "^6.0.0", - "postcss-minify-font-values": "^6.0.0", - "postcss-minify-gradients": "^6.0.0", - "postcss-minify-params": "^6.0.0", - "postcss-minify-selectors": "^6.0.0", - "postcss-normalize-charset": "^6.0.0", - "postcss-normalize-display-values": "^6.0.0", - "postcss-normalize-positions": "^6.0.0", - "postcss-normalize-repeat-style": "^6.0.0", - "postcss-normalize-string": "^6.0.0", - "postcss-normalize-timing-functions": "^6.0.0", - "postcss-normalize-unicode": "^6.0.0", - "postcss-normalize-url": "^6.0.0", - "postcss-normalize-whitespace": "^6.0.0", - "postcss-ordered-values": "^6.0.0", - "postcss-reduce-initial": "^6.0.0", - "postcss-reduce-transforms": "^6.0.0", - "postcss-svgo": "^6.0.0", - "postcss-unique-selectors": "^6.0.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.0.tgz", - "integrity": "sha512-Z39TLP+1E0KUcd7LGyF4qMfu8ZufI0rDzhdyAMsa/8UyNUU8wpS0fhdBxbQbv32r64ea00h4878gommRVg2BHw==", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/csso": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", - "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==", - "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==" - }, - "node_modules/csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "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, - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "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 - }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "dev": true - }, - "node_modules/dns-packet": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", - "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", - "dev": true, - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dev": true, - "dependencies": { - "utila": "~0.4" - } - }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.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" - } - ] - }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "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==", - "dev": true, - "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", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" - }, - "node_modules/earcut": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", - "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "node_modules/electron-to-chromium": { - "version": "1.4.294", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.294.tgz", - "integrity": "sha512-PuHZB3jEN7D8WPPjLmBQAsqQz8tWHlkkB4n0E2OYw8RwVdmBYV0Wn+rUFH8JqYyIRb4HQhhedgxlZL163wqLrQ==" - }, - "node_modules/email-addresses": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-3.1.0.tgz", - "integrity": "sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg==" - }, - "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, - "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==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/env-cmd": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/env-cmd/-/env-cmd-10.1.0.tgz", - "integrity": "sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA==", - "dependencies": { - "commander": "^4.0.0", - "cross-spawn": "^7.0.0" - }, - "bin": { - "env-cmd": "bin/env-cmd.js" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/env-cmd/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true, - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "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==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "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, - "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/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dev": true, - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.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/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 - }, - "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, - "dependencies": { - "ms": "2.0.0" - } - }, - "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 - }, - "node_modules/fast-deep-equal": { - "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==" - }, - "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==" - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true, - "engines": { - "node": ">= 4.9.1" - } - }, - "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, - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/filename-reserved-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", - "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/filenamify": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", - "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", - "dependencies": { - "filename-reserved-regex": "^2.0.0", - "strip-outer": "^1.0.1", - "trim-repeated": "^1.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "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, - "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/finalhandler/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, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://www.patreon.com/infusion" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/gensync": { - "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, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/geotiff": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/geotiff/-/geotiff-2.0.7.tgz", - "integrity": "sha512-FKvFTNowMU5K6lHYY2f83d4lS2rsCNdpUC28AX61x9ZzzqPNaWFElWv93xj0eJFaNyOYA63ic5OzJ88dHpoA5Q==", - "dependencies": { - "@petamoriken/float16": "^3.4.7", - "lerc": "^3.0.0", - "pako": "^2.0.4", - "parse-headers": "^2.0.2", - "quick-lru": "^6.1.1", - "web-worker": "^1.2.0", - "xml-utils": "^1.0.2" - }, - "engines": { - "node": ">=10.19" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gh-pages": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-4.0.0.tgz", - "integrity": "sha512-p8S0T3aGJc68MtwOcZusul5qPSNZCalap3NWbhRUZYu1YOdp+EjZ+4kPmRM8h3NNRdqw00yuevRjlkuSzCn7iQ==", - "dependencies": { - "async": "^2.6.1", - "commander": "^2.18.0", - "email-addresses": "^3.0.1", - "filenamify": "^4.3.0", - "find-cache-dir": "^3.3.1", - "fs-extra": "^8.1.0", - "globby": "^6.1.0" - }, - "bin": { - "gh-pages": "bin/gh-pages.js", - "gh-pages-clean": "bin/gh-pages-clean.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gh-pages/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-to-regexp": { - "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==" - }, - "node_modules/globals": { - "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, - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", - "dependencies": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - }, - "node_modules/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "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 - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "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==", - "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==" - }, - "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, - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "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 - }, - "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, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", - "dev": true - }, - "node_modules/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "dev": true, - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-webpack-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", - "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", - "dev": true, - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "webpack": "^5.20.0" - } - }, - "node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "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 - }, - "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==", - "dev": true, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "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 - }, - "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==", - "dev": true, - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "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, - "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, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/hyphenate-style-name": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", - "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" - }, - "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==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/immutable": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz", - "integrity": "sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==", - "dev": true - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "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==", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-in-browser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", - "integrity": "sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==" - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "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, - "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", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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 - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", - "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", - "dependencies": { - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util/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==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "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/jest-util/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==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-util/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==" - }, - "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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-util/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==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/json-schema-traverse": { - "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==" - }, - "node_modules/json-stringify-pretty-compact": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-2.0.0.tgz", - "integrity": "sha512-WRitRfs6BGq4q8gTgOy4ek7iPFXjbra0H3PmDLKm2xnZ+Gh1HUhiKGgCZkSPNULlP7mvfu6FV/mOLhCarspADQ==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/jsonp/-/jsonp-0.2.1.tgz", - "integrity": "sha512-pfog5gdDxPdV4eP7Kg87M8/bHgshlZ5pybl+yKxAnCZ5O7lCIn7Ixydj03wOlnDQesky2BPyA91SQ+5Y/mNwzw==", - "dependencies": { - "debug": "^2.1.3" - } - }, - "node_modules/jsonp/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/jsonp/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/jss": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss/-/jss-10.10.0.tgz", - "integrity": "sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "csstype": "^3.0.2", - "is-in-browser": "^1.1.3", - "tiny-warning": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/jss" - } - }, - "node_modules/jss-plugin-camel-case": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.10.0.tgz", - "integrity": "sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "hyphenate-style-name": "^1.0.3", - "jss": "10.10.0" - } - }, - "node_modules/jss-plugin-default-unit": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.10.0.tgz", - "integrity": "sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0" - } - }, - "node_modules/jss-plugin-global": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.10.0.tgz", - "integrity": "sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0" - } - }, - "node_modules/jss-plugin-nested": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.10.0.tgz", - "integrity": "sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0", - "tiny-warning": "^1.0.2" - } - }, - "node_modules/jss-plugin-props-sort": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.10.0.tgz", - "integrity": "sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0" - } - }, - "node_modules/jss-plugin-rule-value-function": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.10.0.tgz", - "integrity": "sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0", - "tiny-warning": "^1.0.2" - } - }, - "node_modules/jss-plugin-vendor-prefixer": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.10.0.tgz", - "integrity": "sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "css-vendor": "^2.0.8", - "jss": "10.10.0" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/klona": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/lerc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lerc/-/lerc-3.0.0.tgz", - "integrity": "sha512-Rm4J/WaHhRa93nCN2mwWDZFoRVF18G1f47C+kvQWyHGEZxFpTUi73p7lMVSAndyxGt6lJ2/CFbOcf9ra5p8aww==" - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "engines": { - "node": ">=10" - } - }, - "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==", - "dev": true - }, - "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==", - "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, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "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==", - "dev": true, - "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, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mapbox-to-css-font": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/mapbox-to-css-font/-/mapbox-to-css-font-2.4.2.tgz", - "integrity": "sha512-f+NBjJJY4T3dHtlEz1wCG7YFlkODEjFIYlxDdLIDMNpkSksqTt+l/d4rjuwItxuzkuMFvPyrjzV2lxRM4ePcIA==" - }, - "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==" - }, - "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, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "3.4.13", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz", - "integrity": "sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==", - "dev": true, - "dependencies": { - "fs-monkey": "^1.0.3" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "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 - }, - "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==" - }, - "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, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "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, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "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, - "engines": { - "node": ">=6" - } - }, - "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 - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "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, - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "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==", - "dev": true, - "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, - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "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, - "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==", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true, - "funding": { - "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 - }, - "node_modules/ol": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/ol/-/ol-7.5.2.tgz", - "integrity": "sha512-HJbb3CxXrksM6ct367LsP3N+uh+iBBMdP3DeGGipdV9YAYTP0vTJzqGnoqQ6C2IW4qf8krw9yuyQbc9fjOIaOQ==", - "dependencies": { - "earcut": "^2.2.3", - "geotiff": "^2.0.7", - "ol-mapbox-style": "^10.1.0", - "pbf": "3.2.1", - "rbush": "^3.0.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/openlayers" - } - }, - "node_modules/ol-layerswitcher": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ol-layerswitcher/-/ol-layerswitcher-4.1.1.tgz", - "integrity": "sha512-uqIqZCr/23GoOIOl2T1iPzcVBPweJZgkVHTrn8DLNCa3cCuX+aJzz0DhkA+qJjm5NqXO5uCvB7zpk9vWtRWmsQ==", - "peerDependencies": { - "ol": ">=5.0.0" - } - }, - "node_modules/ol-mapbox-style": { - "version": "10.7.0", - "resolved": "https://registry.npmjs.org/ol-mapbox-style/-/ol-mapbox-style-10.7.0.tgz", - "integrity": "sha512-S/UdYBuOjrotcR95Iq9AejGYbifKeZE85D9VtH11ryJLQPTZXZSW1J5bIXcr4AlAH6tyjPPHTK34AdkwB32Myw==", - "dependencies": { - "@mapbox/mapbox-gl-style-spec": "^13.23.1", - "mapbox-to-css-font": "^2.4.1", - "ol": "^7.3.0" - } - }, - "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, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "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, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "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, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.1.tgz", - "integrity": "sha512-/4b7qZNhv6Uhd7jjnREh1NjnPxlTq+XNWPG88Ydkj5AILcA5m3ajvcg57pB24EQjKv0dK62XnDqk9c/hkIG5Kg==", - "dev": true, - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "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", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dev": true, - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/pako": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", - "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "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, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-headers": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", - "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" - }, - "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==", - "dev": true, - "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==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "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 - }, - "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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pbf": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz", - "integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==", - "dependencies": { - "ieee754": "^1.1.12", - "resolve-protobuf-schema": "^2.1.0" - }, - "bin": { - "pbf": "bin/pbf" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/popper.js": { - "version": "1.16.1-lts", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", - "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==" - }, - "node_modules/postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - ], - "dependencies": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "dependencies": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - }, - "peerDependencies": { - "postcss": "^8.2.2" - } - }, - "node_modules/postcss-colormin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.0.0.tgz", - "integrity": "sha512-EuO+bAUmutWoZYgHn2T1dG1pPqHU6L4TjzPlu4t1wZGXQ/fxV16xg2EJmYi0z+6r+MGV1yvpx1BHkUaRrPa2bw==", - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-convert-values": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.0.0.tgz", - "integrity": "sha512-U5D8QhVwqT++ecmy8rnTb+RL9n/B806UVaS3m60lqle4YDFcpbS3ae5bTQIh3wOGUSDHSEtMYLs/38dNG7EYFw==", - "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-comments": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.0.tgz", - "integrity": "sha512-p2skSGqzPMZkEQvJsgnkBhCn8gI7NzRH2683EEjrIkoMiwRELx68yoUJ3q3DGSGuQ8Ug9Gsn+OuDr46yfO+eFw==", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.0.tgz", - "integrity": "sha512-bU1SXIizMLtDW4oSsi5C/xHKbhLlhek/0/yCnoMQany9k3nPBq+Ctsv/9oMmyqbR96HYHxZcHyK2HR5P/mqoGA==", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-empty": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.0.tgz", - "integrity": "sha512-b+h1S1VT6dNhpcg+LpyiUrdnEZfICF0my7HAKgJixJLW7BnNmpRH34+uw/etf5AhOlIhIAuXApSzzDzMI9K/gQ==", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.0.tgz", - "integrity": "sha512-4VELwssYXDFigPYAZ8vL4yX4mUepF/oCBeeIT4OXsJPYOtvJumyz9WflmJWTfDwCUcpDR+z0zvCWBXgTx35SVw==", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.3.0.tgz", - "integrity": "sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==", - "dev": true, - "dependencies": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.4", - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0", - "semver": "^7.3.4" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/postcss-loader/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/postcss-loader/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/postcss-loader/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/postcss-loader/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/postcss-merge-longhand": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.0.tgz", - "integrity": "sha512-4VSfd1lvGkLTLYcxFuISDtWUfFS4zXe0FpF149AyziftPFQIWxjvFSKhA4MIxMe4XM3yTDgQMbSNgzIVxChbIg==", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^6.0.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-merge-rules": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.0.0.tgz", - "integrity": "sha512-rCXkklftzEkniyv3f4mRCQzxD6oE4Quyh61uyWTUbCJ26Pv2hoz+fivJSsSBWxDBeScR4fKCfF3HHTcD7Ybqnw==", - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^4.0.0", - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.0.0.tgz", - "integrity": "sha512-zNRAVtyh5E8ndZEYXA4WS8ZYsAp798HiIQ1V2UF/C/munLp2r1UGHwf1+6JFu7hdEhJFN+W1WJQKBrtjhFgEnA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.0.tgz", - "integrity": "sha512-wO0F6YfVAR+K1xVxF53ueZJza3L+R3E6cp0VwuXJQejnNUH0DjcAFe3JEBeTY1dLwGa0NlDWueCA1VlEfiKgAA==", - "dependencies": { - "colord": "^2.9.1", - "cssnano-utils": "^4.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-params": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.0.0.tgz", - "integrity": "sha512-Fz/wMQDveiS0n5JPcvsMeyNXOIMrwF88n7196puSuQSWSa+/Ofc1gDOSY2xi8+A4PqB5dlYCKk/WfqKqsI+ReQ==", - "dependencies": { - "browserslist": "^4.21.4", - "cssnano-utils": "^4.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.0.tgz", - "integrity": "sha512-ec/q9JNCOC2CRDNnypipGfOhbYPuUkewGwLnbv6omue/PSASbHSU7s6uSQ0tcFRVv731oMIx8k0SP4ZX6be/0g==", - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.0.tgz", - "integrity": "sha512-cqundwChbu8yO/gSWkuFDmKrCZ2vJzDAocheT2JTd0sFNA4HMGoKMfbk2B+J0OmO0t5GUkiAkSM5yF2rSLUjgQ==", - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.0.tgz", - "integrity": "sha512-Qyt5kMrvy7dJRO3OjF7zkotGfuYALETZE+4lk66sziWSPzlBEt7FrUshV6VLECkI4EN8Z863O6Nci4NXQGNzYw==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.0.tgz", - "integrity": "sha512-mPCzhSV8+30FZyWhxi6UoVRYd3ZBJgTRly4hOkaSifo0H+pjDYcii/aVT4YE6QpOil15a5uiv6ftnY3rm0igPg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.0.tgz", - "integrity": "sha512-50W5JWEBiOOAez2AKBh4kRFm2uhrT3O1Uwdxz7k24aKtbD83vqmcVG7zoIwo6xI2FZ/HDlbrCopXhLeTpQib1A==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-string": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.0.tgz", - "integrity": "sha512-KWkIB7TrPOiqb8ZZz6homet2KWKJwIlysF5ICPZrXAylGe2hzX/HSf4NTX2rRPJMAtlRsj/yfkrWGavFuB+c0w==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.0.tgz", - "integrity": "sha512-tpIXWciXBp5CiFs8sem90IWlw76FV4oi6QEWfQwyeREVwUy39VSeSqjAT7X0Qw650yAimYW5gkl2Gd871N5SQg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.0.0.tgz", - "integrity": "sha512-ui5crYkb5ubEUDugDc786L/Me+DXp2dLg3fVJbqyAl0VPkAeALyAijF2zOsnZyaS1HyfPuMH0DwyY18VMFVNkg==", - "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-url": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.0.tgz", - "integrity": "sha512-98mvh2QzIPbb02YDIrYvAg4OUzGH7s1ZgHlD3fIdTHLgPLRpv1ZTKJDnSAKr4Rt21ZQFzwhGMXxpXlfrUBKFHw==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.0.tgz", - "integrity": "sha512-7cfE1AyLiK0+ZBG6FmLziJzqQCpTQY+8XjMhMAz8WSBSCsCNNUKujgIgjCAmDT3cJ+3zjTXFkoD15ZPsckArVw==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-ordered-values": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.0.tgz", - "integrity": "sha512-K36XzUDpvfG/nWkjs6d1hRBydeIxGpKS2+n+ywlKPzx1nMYDYpoGbcjhj5AwVYJK1qV2/SDoDEnHzlPD6s3nMg==", - "dependencies": { - "cssnano-utils": "^4.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.0.0.tgz", - "integrity": "sha512-s2UOnidpVuXu6JiiI5U+fV2jamAw5YNA9Fdi/GRK0zLDLCfXmSGqQtzpUPtfN66RtCbb9fFHoyZdQaxOB3WxVA==", - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.0.tgz", - "integrity": "sha512-FQ9f6xM1homnuy1wLe9lP1wujzxnwt1EwiigtWwuyf8FsqqXUDUp2Ulxf9A5yjlUOTdCJO6lonYjg1mgqIIi2w==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-svgo": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.0.tgz", - "integrity": "sha512-r9zvj/wGAoAIodn84dR/kFqwhINp5YsJkLoujybWG59grR/IHx+uQ2Zo+IcOwM0jskfYX3R0mo+1Kip1VSNcvw==", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^3.0.2" - }, - "engines": { - "node": "^14 || ^16 || >= 18" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.0.tgz", - "integrity": "sha512-EPQzpZNxOxP7777t73RQpZE5e9TrnCrkvp7AH7a0l89JmZiPnS82y216JowHXwpBCQitfyxrof9TK3rYbi7/Yw==", - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "dev": true, - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, - "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 - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/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==" - }, - "node_modules/protocol-buffers-schema": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", - "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==" - }, - "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, - "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, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "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, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/quick-lru": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.1.tgz", - "integrity": "sha512-S27GBT+F0NTRiehtbrgaSE1idUAJ5bX8dPAQTdylEyNlrdcH5X4Lz7Edz3DYzecbsCluD5zO8ZNEe04z3D3u6Q==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/quickselect": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", - "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/rbush": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/rbush/-/rbush-3.0.1.tgz", - "integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==", - "dependencies": { - "quickselect": "^2.0.0" - } - }, - "node_modules/react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - }, - "peerDependencies": { - "react": "17.0.2" - } - }, - "node_modules/react-share": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/react-share/-/react-share-4.4.1.tgz", - "integrity": "sha512-AJ9m9RiJssqvYg7MoJUc9J0D7b/liWrsfQ99ndKc5vJ4oVHHd4Fy87jBlKEQPibT40oYA3AQ/a9/oQY6/yaigw==", - "dependencies": { - "classnames": "^2.3.2", - "jsonp": "^0.2.1" - }, - "engines": { - "node": ">=6.9.0", - "npm": ">=5.0.0" - }, - "peerDependencies": { - "react": "^16.3.0 || ^17 || ^18" - } - }, - "node_modules/react-share-social": { - "version": "0.1.55", - "resolved": "https://registry.npmjs.org/react-share-social/-/react-share-social-0.1.55.tgz", - "integrity": "sha512-Mkm6ucoKjj7ENXldz1B+BDtVA4Z387LEjJgtWhEzdrQGtYFGbK8fktZCsBLKTQhl0F/YvQxTrOlNl9DbxaVtHw==", - "dependencies": { - "@material-ui/core": "^4.11.4", - "gh-pages": "^4.0.0", - "react-share": "^4.3.1" - } - }, - "node_modules/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "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==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dev": true, - "dependencies": { - "resolve": "^1.9.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/regenerate": { - "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 - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "node_modules/regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regexpu-core": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.0.tgz", - "integrity": "sha512-ZdhUQlng0RoscyW7jADnUZ25F5eVtHdMyXSb2PiwafvteRAOJUjFoUPEYZSIfP99fBIs3maLIRfpEddT78wAAQ==", - "dev": true, - "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "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" - } - }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "dev": true, - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "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, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-protobuf-schema": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", - "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", - "dependencies": { - "protocol-buffers-schema": "^3.3.1" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/sass": { - "version": "1.58.3", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.3.tgz", - "integrity": "sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A==", - "dev": true, - "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/sass-loader": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.2.0.tgz", - "integrity": "sha512-JWEp48djQA4nbZxmgC02/Wh0eroSUutulROUusYJO9P9zltRbNN80JCBHqRGzjd4cmZCa/r88xgfkjGD0TXsHg==", - "dev": true, - "dependencies": { - "klona": "^2.0.4", - "neo-async": "^2.6.2" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", - "sass": "^1.3.0", - "sass-embedded": "*", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - } - } - }, - "node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "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 - }, - "node_modules/selfsigned": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", - "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", - "dev": true, - "dependencies": { - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "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/send/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, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "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 - }, - "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/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, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "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==", - "dev": true - }, - "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==", - "dev": true - }, - "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==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "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, - "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/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "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 - }, - "node_modules/sirv": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", - "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", - "dependencies": { - "@polka/url": "^1.0.0-next.20", - "mrmime": "^1.0.0", - "totalist": "^1.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "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, - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "node_modules/sort-asc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/sort-asc/-/sort-asc-0.1.0.tgz", - "integrity": "sha512-jBgdDd+rQ+HkZF2/OHCmace5dvpos/aWQpcxuyRs9QUbPRnkEJmYVo81PIGpjIdpOcsnJ4rGjStfDHsbn+UVyw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sort-desc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/sort-desc/-/sort-desc-0.1.1.tgz", - "integrity": "sha512-jfZacW5SKOP97BF5rX5kQfJmRVZP5/adDUTY8fCSPvNcXDVpUEe2pr/iKGlcyZzchRJZrswnp68fgk3qBXgkJw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sort-object": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/sort-object/-/sort-object-0.3.2.tgz", - "integrity": "sha512-aAQiEdqFTTdsvUFxXm3umdo04J7MRljoVGbBlkH7BgNsMvVNAJyGj7C/wV1A8wHWAJj/YikeZbfuCKqhggNWGA==", - "dependencies": { - "sort-asc": "^0.1.0", - "sort-desc": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "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==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.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, - "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, - "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/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "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, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/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, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "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, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-outer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", - "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", - "dependencies": { - "escape-string-regexp": "^1.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/style-loader": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", - "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", - "dev": true, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/stylehacks": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.0.0.tgz", - "integrity": "sha512-+UT589qhHPwz6mTlCLSt/vMNTJx8dopeJlZAlBMJPWA3ORqu6wmQY7FBXf+qD+FsqoBJODyqNxOUP3jdntFRdw==", - "dependencies": { - "browserslist": "^4.21.4", - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^14 || ^16 || >=18.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "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, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svgo": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.0.2.tgz", - "integrity": "sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==", - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^5.1.0", - "css-tree": "^2.2.1", - "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==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/svgo/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==", - "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/svgo/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==", - "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/svgo/node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/svgo/node_modules/domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/svgo/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/terser": { - "version": "5.16.9", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.9.tgz", - "integrity": "sha512-HPa/FdTB9XGI2H1/keLFZHxl6WNvAI4YalHGtDQTlMnJcoqSab1UwL4l1hGEhs6/GmLHBZIg/YgB++jcbzoOEg==", - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz", - "integrity": "sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.5" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "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 - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, - "node_modules/to-fast-properties": { - "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, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/totalist": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", - "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", - "engines": { - "node": ">=6" - } - }, - "node_modules/trim-repeated": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", - "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", - "dependencies": { - "escape-string-regexp": "^1.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - }, - "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, - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "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, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "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, - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "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, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "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, - "engines": { - "node": ">=4" - } - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "dev": true - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": 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, - "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==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "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, - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/web-worker": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", - "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==" - }, - "node_modules/webpack": { - "version": "5.75.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", - "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-bundle-analyzer": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.8.0.tgz", - "integrity": "sha512-ZzoSBePshOKhr+hd8u6oCkZVwpVaXgpw23ScGLFpR6SjYI7+7iIWYarjN6OEYOfRt8o7ZyZZQk0DuMizJ+LEIg==", - "dependencies": { - "@discoveryjs/json-ext": "0.5.7", - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "chalk": "^4.1.0", - "commander": "^7.2.0", - "gzip-size": "^6.0.0", - "lodash": "^4.17.20", - "opener": "^1.5.2", - "sirv": "^1.0.7", - "ws": "^7.3.1" - }, - "bin": { - "webpack-bundle-analyzer": "lib/bin/analyzer.js" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/webpack-bundle-analyzer/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==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "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/webpack-bundle-analyzer/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==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/webpack-bundle-analyzer/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==" - }, - "node_modules/webpack-bundle-analyzer/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==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-bundle-analyzer/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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/webpack-bundle-analyzer/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==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/webpack-cli": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", - "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", - "dev": true, - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", - "colorette": "^2.0.14", - "commander": "^7.0.0", - "cross-spawn": "^7.0.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "4.x.x || 5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "@webpack-cli/migrate": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/webpack-cli/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==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", - "dev": true, - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-dev-server": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", - "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", - "dev": true, - "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "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.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-server/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/webpack-sources": { - "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==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "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, - "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, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/ws": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", - "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/xml-utils/-/xml-utils-1.3.0.tgz", - "integrity": "sha512-i4PIrX33Wd66dvwo4syicwlwmnr6wuvvn4f2ku9hA67C2Uk62Xubczuhct+Evnd12/DV71qKNeDdJwES8HX1RA==" - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/compat-data": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz", - "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==", - "dev": true - }, - "@babel/core": { - "version": "7.20.12", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", - "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helpers": "^7.20.7", - "@babel/parser": "^7.20.7", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.12", - "@babel/types": "^7.20.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - } - }, - "@babel/generator": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", - "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", - "dev": true, - "requires": { - "@babel/types": "^7.21.4", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", - "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.21.4", - "@babel/helper-validator-option": "^7.21.0", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.4.tgz", - "integrity": "sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz", - "integrity": "sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.2.1" - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", - "dev": true, - "requires": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz", - "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==", - "dev": true, - "requires": { - "@babel/types": "^7.21.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", - "dev": true - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-replace-supers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", - "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.20.7", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" - } - }, - "@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "dev": true, - "requires": { - "@babel/types": "^7.20.2" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", - "dev": true, - "requires": { - "@babel/types": "^7.20.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" - } - }, - "@babel/helpers": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz", - "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==", - "dev": true, - "requires": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.13", - "@babel/types": "^7.20.7" - } - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", - "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", - "dev": true - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "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.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", - "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.7" - } - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-class-static-block": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", - "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", - "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", - "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-async-generators": { - "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, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "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, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "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, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "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, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "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, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.19.0" - } - }, - "@babel/plugin-syntax-json-strings": { - "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, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "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, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "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, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "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, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "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, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "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, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "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, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "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, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "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, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", - "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.19.0" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", - "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", - "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", - "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", - "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", - "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/template": "^7.20.7" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", - "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz", - "integrity": "sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", - "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz", - "integrity": "sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-simple-access": "^7.20.2" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", - "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-identifier": "^7.19.1" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", - "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", - "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.20.13.tgz", - "integrity": "sha512-MmTZx/bkUrfJhhYAYt3Urjm+h8DQGrPrnKQ94jLo7NLuOU+T89a7IByhKmrb8SKhrIYIQ0FN0CHMbnFRen4qNw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-jsx": "^7.18.6", - "@babel/types": "^7.20.7" - } - }, - "@babel/plugin-transform-react-jsx-development": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", - "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", - "dev": true, - "requires": { - "@babel/plugin-transform-react-jsx": "^7.18.6" - } - }, - "@babel/plugin-transform-react-pure-annotations": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", - "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", - "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "regenerator-transform": "^0.15.1" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz", - "integrity": "sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.19.0", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "semver": "^6.3.0" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", - "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-typescript": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.13.tgz", - "integrity": "sha512-O7I/THxarGcDZxkgWKMUrk7NK1/WbHAg3Xx86gqS6x9MTrNL6AwIluuZ96ms4xeDe6AVx6rjHbWHP7x26EPQBA==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.20.12", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-typescript": "^7.20.0" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/preset-env": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.4.tgz", - "integrity": "sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.21.4", - "@babel/helper-compilation-targets": "^7.21.4", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.20.7", - "@babel/plugin-proposal-async-generator-functions": "^7.20.7", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.21.0", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.20.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.21.0", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.21.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.20.7", - "@babel/plugin-transform-async-to-generator": "^7.20.7", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.21.0", - "@babel/plugin-transform-classes": "^7.21.0", - "@babel/plugin-transform-computed-properties": "^7.20.7", - "@babel/plugin-transform-destructuring": "^7.21.3", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.21.0", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.20.11", - "@babel/plugin-transform-modules-commonjs": "^7.21.2", - "@babel/plugin-transform-modules-systemjs": "^7.20.11", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.20.5", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.21.3", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.20.5", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.20.7", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.21.4", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", - "semver": "^6.3.0" - } - }, - "@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/preset-react": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", - "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-react-display-name": "^7.18.6", - "@babel/plugin-transform-react-jsx": "^7.18.6", - "@babel/plugin-transform-react-jsx-development": "^7.18.6", - "@babel/plugin-transform-react-pure-annotations": "^7.18.6" - } - }, - "@babel/preset-typescript": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", - "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-typescript": "^7.18.6" - } - }, - "@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 - }, - "@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", - "requires": { - "regenerator-runtime": "^0.13.11" - } - }, - "@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - } - }, - "@babel/traverse": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", - "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.4", - "@babel/types": "^7.21.4", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", - "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - } - }, - "@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==" - }, - "@jest/schemas": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", - "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", - "requires": { - "@sinclair/typebox": "^0.25.16" - } - }, - "@jest/types": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", - "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", - "requires": { - "@jest/schemas": "^29.4.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" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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==", - "requires": { - "color-name": "~1.1.4" - } - }, - "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==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "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==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" - }, - "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, - "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", - "dev": true - }, - "@mapbox/jsonlint-lines-primitives": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", - "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==" - }, - "@mapbox/mapbox-gl-style-spec": { - "version": "13.28.0", - "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-style-spec/-/mapbox-gl-style-spec-13.28.0.tgz", - "integrity": "sha512-B8xM7Fp1nh5kejfIl4SWeY0gtIeewbuRencqO3cJDrCHZpaPg7uY+V8abuR+esMeuOjRl5cLhVTP40v+1ywxbg==", - "requires": { - "@mapbox/jsonlint-lines-primitives": "~2.0.2", - "@mapbox/point-geometry": "^0.1.0", - "@mapbox/unitbezier": "^0.0.0", - "csscolorparser": "~1.0.2", - "json-stringify-pretty-compact": "^2.0.0", - "minimist": "^1.2.6", - "rw": "^1.3.3", - "sort-object": "^0.3.2" - } - }, - "@mapbox/point-geometry": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", - "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==" - }, - "@mapbox/unitbezier": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", - "integrity": "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==" - }, - "@material-ui/core": { - "version": "4.12.4", - "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.4.tgz", - "integrity": "sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ==", - "requires": { - "@babel/runtime": "^7.4.4", - "@material-ui/styles": "^4.11.5", - "@material-ui/system": "^4.12.2", - "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.3", - "@types/react-transition-group": "^4.2.0", - "clsx": "^1.0.4", - "hoist-non-react-statics": "^3.3.2", - "popper.js": "1.16.1-lts", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0", - "react-transition-group": "^4.4.0" - }, - "dependencies": { - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" - } - } - }, - "@material-ui/styles": { - "version": "4.11.5", - "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz", - "integrity": "sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA==", - "requires": { - "@babel/runtime": "^7.4.4", - "@emotion/hash": "^0.8.0", - "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.3", - "clsx": "^1.0.4", - "csstype": "^2.5.2", - "hoist-non-react-statics": "^3.3.2", - "jss": "^10.5.1", - "jss-plugin-camel-case": "^10.5.1", - "jss-plugin-default-unit": "^10.5.1", - "jss-plugin-global": "^10.5.1", - "jss-plugin-nested": "^10.5.1", - "jss-plugin-props-sort": "^10.5.1", - "jss-plugin-rule-value-function": "^10.5.1", - "jss-plugin-vendor-prefixer": "^10.5.1", - "prop-types": "^15.7.2" - }, - "dependencies": { - "@emotion/hash": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" - }, - "csstype": { - "version": "2.6.21", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", - "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" - } - } - }, - "@material-ui/system": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.2.tgz", - "integrity": "sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw==", - "requires": { - "@babel/runtime": "^7.4.4", - "@material-ui/utils": "^4.11.3", - "csstype": "^2.5.2", - "prop-types": "^15.7.2" - }, - "dependencies": { - "csstype": { - "version": "2.6.21", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", - "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" - } - } - }, - "@material-ui/types": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", - "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==", - "requires": {} - }, - "@material-ui/utils": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", - "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", - "requires": { - "@babel/runtime": "^7.4.4", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0" - }, - "dependencies": { - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" - } - } - }, - "@petamoriken/float16": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/@petamoriken/float16/-/float16-3.7.1.tgz", - "integrity": "sha512-oXZOc+aePd0FnhTWk15pyqK+Do87n0TyLV1nxdEougE95X/WXWDqmQobfhgnSY7QsWn5euZUWuDVeTQvoQ5VNw==" - }, - "@polka/url": { - "version": "1.0.0-next.21", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", - "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==" - }, - "@sinclair/typebox": { - "version": "0.25.24", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", - "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==" - }, - "@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" - }, - "@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/connect-history-api-fallback": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", - "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", - "dev": true, - "requires": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "@types/eslint": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.0.tgz", - "integrity": "sha512-35EhHNOXgxnUgh4XCJsGhE7zdlDhYDN/aMG6UbkByCFFNgQ7b3U+uVoqBpicFydR8JEfgdjCF7SJ7MiJfzuiTA==", - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" - }, - "@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", - "dev": true, - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.33", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", - "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "dev": true - }, - "@types/http-proxy": { - "version": "1.17.9", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", - "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" - }, - "@types/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", - "dev": true - }, - "@types/node": { - "version": "18.13.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz", - "integrity": "sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==" - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" - }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true - }, - "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true - }, - "@types/react": { - "version": "17.0.53", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.53.tgz", - "integrity": "sha512-1yIpQR2zdYu1Z/dc1OxC+MA6GR240u3gcnP4l6mvj/PJiVaqHsQPmWttsvHsfnhfPbU2FuGmo0wSITPygjBmsw==", - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "@types/react-dom": { - "version": "17.0.18", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.18.tgz", - "integrity": "sha512-rLVtIfbwyur2iFKykP2w0pl/1unw26b5td16d5xMgp7/yjTHomkyxPYChFoCr/FtEX1lN9wY6lFj1qvKdS5kDw==", - "dev": true, - "requires": { - "@types/react": "^17" - } - }, - "@types/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==", - "requires": { - "@types/react": "*" - } - }, - "@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "dev": true - }, - "@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" - }, - "@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", - "dev": true, - "requires": { - "@types/express": "*" - } - }, - "@types/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", - "dev": true, - "requires": { - "@types/mime": "*", - "@types/node": "*" - } - }, - "@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" - }, - "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" - }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" - }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@webpack-cli/configtest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", - "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", - "dev": true, - "requires": {} - }, - "@webpack-cli/info": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", - "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", - "dev": true, - "requires": { - "envinfo": "^7.7.3" - } - }, - "@webpack-cli/serve": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", - "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", - "dev": true, - "requires": {} - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" - }, - "@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==" - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==" - }, - "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "requires": {} - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "requires": { - "ajv": "^8.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - } - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "requires": {} - }, - "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 - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==" - }, - "async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "requires": { - "lodash": "^4.17.14" - } - }, - "autoprefixer": { - "version": "10.4.13", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", - "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001426", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "babel-loader": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", - "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", - "dev": true, - "requires": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - } - }, - "babel-plugin-import": { - "version": "1.13.6", - "resolved": "https://registry.npmjs.org/babel-plugin-import/-/babel-plugin-import-1.13.6.tgz", - "integrity": "sha512-N7FYnGh0DFsvDRkAPsvFq/metVfVD7P2h1rokOPpEH4cZbdRHCW+2jbXt0nnuqowkm/xhh2ww1anIdEpfYa7ZA==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0" - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.3" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "batch": { - "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==", - "dev": true - }, - "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 - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "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.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "bonjour-service": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.0.tgz", - "integrity": "sha512-LVRinRB3k1/K0XzZ2p58COnWvkQknIY6sf0zF2rpErvcJXpMBttEPQSxK+HEXSS9VmpZlDoDnQWv8ftJT20B0Q==", - "dev": true, - "requires": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", - "requires": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "requires": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001451", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001451.tgz", - "integrity": "sha512-XY7UbUpGRatZzoRft//5xOa69/1iGJRBlrieH6QYrkKLIFn3m7OVEJ81dSrKoy2BnKsdbX5cLrOispZNYo9v2w==" - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" - }, - "ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==" - }, - "classnames": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", - "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" - }, - "clean-css": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", - "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - } - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==" - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" - }, - "colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true - }, - "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "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 - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "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 - }, - "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, - "requires": { - "safe-buffer": "5.2.1" - } - }, - "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 - }, - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "core-js-compat": { - "version": "3.27.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.2.tgz", - "integrity": "sha512-welaYuF7ZtbYKGrIy7y3eb40d37rG1FvzEOfe7hSLd2iD6duMDqUhRfSvCGyC46HhR6Y8JXXdZ2lnRUMkPBpvg==", - "dev": true, - "requires": { - "browserslist": "^4.21.4" - } - }, - "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 - }, - "cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "css-declaration-sorter": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz", - "integrity": "sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew==", - "requires": {} - }, - "css-loader": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", - "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", - "dev": true, - "requires": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.19", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "css-minimizer-webpack-plugin": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.0.tgz", - "integrity": "sha512-1wZ/PYvg+ZKwi5FX6YrvbB31jMAdurS+CmRQLwWCVSlfzJC85l/a6RVICqUHFa+jXyhilfnCyjafzJGbmz5tcA==", - "requires": { - "cssnano": "^6.0.0", - "jest-worker": "^29.4.3", - "postcss": "^8.4.21", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.1", - "source-map": "^0.6.1" - }, - "dependencies": { - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "jest-worker": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", - "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", - "requires": { - "@types/node": "*", - "jest-util": "^29.5.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "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==", - "requires": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - } - }, - "css-vendor": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", - "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", - "requires": { - "@babel/runtime": "^7.8.3", - "is-in-browser": "^1.0.2" - } - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" - }, - "csscolorparser": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz", - "integrity": "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==" - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" - }, - "cssnano": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.0.0.tgz", - "integrity": "sha512-RGlcbzGhzEBCHuQe3k+Udyj5M00z0pm9S+VurHXFEOXxH+y0sVrJH2sMzoyz2d8N1EScazg+DVvmgyx0lurwwA==", - "requires": { - "cssnano-preset-default": "^6.0.0", - "lilconfig": "^2.1.0" - } - }, - "cssnano-preset-default": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.0.0.tgz", - "integrity": "sha512-BDxlaFzObRDXUiCCBQUNQcI+f1/aX2mgoNtXGjV6PG64POcHoDUoX+LgMWw+Q4609QhxwkcSnS65YFs42RA6qQ==", - "requires": { - "css-declaration-sorter": "^6.3.1", - "cssnano-utils": "^4.0.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^6.0.0", - "postcss-convert-values": "^6.0.0", - "postcss-discard-comments": "^6.0.0", - "postcss-discard-duplicates": "^6.0.0", - "postcss-discard-empty": "^6.0.0", - "postcss-discard-overridden": "^6.0.0", - "postcss-merge-longhand": "^6.0.0", - "postcss-merge-rules": "^6.0.0", - "postcss-minify-font-values": "^6.0.0", - "postcss-minify-gradients": "^6.0.0", - "postcss-minify-params": "^6.0.0", - "postcss-minify-selectors": "^6.0.0", - "postcss-normalize-charset": "^6.0.0", - "postcss-normalize-display-values": "^6.0.0", - "postcss-normalize-positions": "^6.0.0", - "postcss-normalize-repeat-style": "^6.0.0", - "postcss-normalize-string": "^6.0.0", - "postcss-normalize-timing-functions": "^6.0.0", - "postcss-normalize-unicode": "^6.0.0", - "postcss-normalize-url": "^6.0.0", - "postcss-normalize-whitespace": "^6.0.0", - "postcss-ordered-values": "^6.0.0", - "postcss-reduce-initial": "^6.0.0", - "postcss-reduce-transforms": "^6.0.0", - "postcss-svgo": "^6.0.0", - "postcss-unique-selectors": "^6.0.0" - } - }, - "cssnano-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.0.tgz", - "integrity": "sha512-Z39TLP+1E0KUcd7LGyF4qMfu8ZufI0rDzhdyAMsa/8UyNUU8wpS0fhdBxbQbv32r64ea00h4878gommRVg2BHw==", - "requires": {} - }, - "csso": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", - "requires": { - "css-tree": "~2.2.0" - }, - "dependencies": { - "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==", - "requires": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" - } - }, - "mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==" - } - } - }, - "csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "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, - "requires": { - "execa": "^5.0.0" - } - }, - "define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true - }, - "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 - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "dev": true - }, - "dns-packet": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", - "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", - "dev": true, - "requires": { - "@leichtgewicht/ip-codec": "^2.0.1" - } - }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dev": true, - "requires": { - "utila": "~0.4" - } - }, - "dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "requires": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" - }, - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" - }, - "earcut": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", - "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==" - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.4.294", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.294.tgz", - "integrity": "sha512-PuHZB3jEN7D8WPPjLmBQAsqQz8tWHlkkB4n0E2OYw8RwVdmBYV0Wn+rUFH8JqYyIRb4HQhhedgxlZL163wqLrQ==" - }, - "email-addresses": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-3.1.0.tgz", - "integrity": "sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg==" - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true - }, - "enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - }, - "env-cmd": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/env-cmd/-/env-cmd-10.1.0.tgz", - "integrity": "sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA==", - "requires": { - "commander": "^4.0.0", - "cross-spawn": "^7.0.0" - }, - "dependencies": { - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" - } - } - }, - "envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "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" - } - }, - "express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dev": true, - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.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" - }, - "dependencies": { - "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 - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "fast-deep-equal": { - "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==" - }, - "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==" - }, - "fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true - }, - "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, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "filename-reserved-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", - "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==" - }, - "filenamify": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", - "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", - "requires": { - "filename-reserved-regex": "^2.0.0", - "strip-outer": "^1.0.1", - "trim-repeated": "^1.0.0" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true - }, - "fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", - "dev": true - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "gensync": { - "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 - }, - "geotiff": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/geotiff/-/geotiff-2.0.7.tgz", - "integrity": "sha512-FKvFTNowMU5K6lHYY2f83d4lS2rsCNdpUC28AX61x9ZzzqPNaWFElWv93xj0eJFaNyOYA63ic5OzJ88dHpoA5Q==", - "requires": { - "@petamoriken/float16": "^3.4.7", - "lerc": "^3.0.0", - "pako": "^2.0.4", - "parse-headers": "^2.0.2", - "quick-lru": "^6.1.1", - "web-worker": "^1.2.0", - "xml-utils": "^1.0.2" - } - }, - "get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "gh-pages": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-4.0.0.tgz", - "integrity": "sha512-p8S0T3aGJc68MtwOcZusul5qPSNZCalap3NWbhRUZYu1YOdp+EjZ+4kPmRM8h3NNRdqw00yuevRjlkuSzCn7iQ==", - "requires": { - "async": "^2.6.1", - "commander": "^2.18.0", - "email-addresses": "^3.0.1", - "filenamify": "^4.3.0", - "find-cache-dir": "^3.3.1", - "fs-extra": "^8.1.0", - "globby": "^6.1.0" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - } - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "glob-to-regexp": { - "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==" - }, - "globals": { - "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 - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - }, - "gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "requires": { - "duplexer": "^0.1.2" - } - }, - "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 - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "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==", - "requires": { - "react-is": "^16.7.0" - }, - "dependencies": { - "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==" - } - } - }, - "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, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "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" - } - }, - "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 - }, - "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, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", - "dev": true - }, - "html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "dev": true, - "requires": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - } - }, - "html-webpack-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", - "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", - "dev": true, - "requires": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - } - }, - "htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "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 - }, - "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==", - "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "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 - }, - "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==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "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, - "requires": { - "@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" - } - }, - "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 - }, - "hyphenate-style-name": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", - "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "requires": {} - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "immutable": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz", - "integrity": "sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true - }, - "ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-in-browser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", - "integrity": "sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "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 - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "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 - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true - }, - "jest-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", - "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", - "requires": { - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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==", - "requires": { - "color-name": "~1.1.4" - } - }, - "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==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "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==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "json-schema-traverse": { - "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==" - }, - "json-stringify-pretty-compact": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-2.0.0.tgz", - "integrity": "sha512-WRitRfs6BGq4q8gTgOy4ek7iPFXjbra0H3PmDLKm2xnZ+Gh1HUhiKGgCZkSPNULlP7mvfu6FV/mOLhCarspADQ==" - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/jsonp/-/jsonp-0.2.1.tgz", - "integrity": "sha512-pfog5gdDxPdV4eP7Kg87M8/bHgshlZ5pybl+yKxAnCZ5O7lCIn7Ixydj03wOlnDQesky2BPyA91SQ+5Y/mNwzw==", - "requires": { - "debug": "^2.1.3" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "jss": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss/-/jss-10.10.0.tgz", - "integrity": "sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw==", - "requires": { - "@babel/runtime": "^7.3.1", - "csstype": "^3.0.2", - "is-in-browser": "^1.1.3", - "tiny-warning": "^1.0.2" - } - }, - "jss-plugin-camel-case": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.10.0.tgz", - "integrity": "sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw==", - "requires": { - "@babel/runtime": "^7.3.1", - "hyphenate-style-name": "^1.0.3", - "jss": "10.10.0" - } - }, - "jss-plugin-default-unit": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.10.0.tgz", - "integrity": "sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ==", - "requires": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0" - } - }, - "jss-plugin-global": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.10.0.tgz", - "integrity": "sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A==", - "requires": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0" - } - }, - "jss-plugin-nested": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.10.0.tgz", - "integrity": "sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA==", - "requires": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0", - "tiny-warning": "^1.0.2" - } - }, - "jss-plugin-props-sort": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.10.0.tgz", - "integrity": "sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg==", - "requires": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0" - } - }, - "jss-plugin-rule-value-function": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.10.0.tgz", - "integrity": "sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g==", - "requires": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0", - "tiny-warning": "^1.0.2" - } - }, - "jss-plugin-vendor-prefixer": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.10.0.tgz", - "integrity": "sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg==", - "requires": { - "@babel/runtime": "^7.3.1", - "css-vendor": "^2.0.8", - "jss": "10.10.0" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "klona": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", - "dev": true - }, - "lerc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lerc/-/lerc-3.0.0.tgz", - "integrity": "sha512-Rm4J/WaHhRa93nCN2mwWDZFoRVF18G1f47C+kvQWyHGEZxFpTUi73p7lMVSAndyxGt6lJ2/CFbOcf9ra5p8aww==" - }, - "lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==" - }, - "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==", - "dev": true - }, - "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==" - }, - "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, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "requires": { - "tslib": "^2.0.3" - } - }, - "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, - "requires": { - "yallist": "^3.0.2" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - } - }, - "mapbox-to-css-font": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/mapbox-to-css-font/-/mapbox-to-css-font-2.4.2.tgz", - "integrity": "sha512-f+NBjJJY4T3dHtlEz1wCG7YFlkODEjFIYlxDdLIDMNpkSksqTt+l/d4rjuwItxuzkuMFvPyrjzV2lxRM4ePcIA==" - }, - "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==" - }, - "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 - }, - "memfs": { - "version": "3.4.13", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz", - "integrity": "sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==", - "dev": true, - "requires": { - "fs-monkey": "^1.0.3" - } - }, - "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 - }, - "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==" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "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 - }, - "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 - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" - }, - "mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "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, - "requires": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - } - }, - "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "requires": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "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 - }, - "node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true - }, - "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, - "requires": { - "path-key": "^3.0.0" - } - }, - "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==", - "requires": { - "boolbase": "^1.0.0" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" - }, - "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "ol": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/ol/-/ol-7.5.2.tgz", - "integrity": "sha512-HJbb3CxXrksM6ct367LsP3N+uh+iBBMdP3DeGGipdV9YAYTP0vTJzqGnoqQ6C2IW4qf8krw9yuyQbc9fjOIaOQ==", - "requires": { - "earcut": "^2.2.3", - "geotiff": "^2.0.7", - "ol-mapbox-style": "^10.1.0", - "pbf": "3.2.1", - "rbush": "^3.0.1" - } - }, - "ol-layerswitcher": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ol-layerswitcher/-/ol-layerswitcher-4.1.1.tgz", - "integrity": "sha512-uqIqZCr/23GoOIOl2T1iPzcVBPweJZgkVHTrn8DLNCa3cCuX+aJzz0DhkA+qJjm5NqXO5uCvB7zpk9vWtRWmsQ==", - "requires": {} - }, - "ol-mapbox-style": { - "version": "10.7.0", - "resolved": "https://registry.npmjs.org/ol-mapbox-style/-/ol-mapbox-style-10.7.0.tgz", - "integrity": "sha512-S/UdYBuOjrotcR95Iq9AejGYbifKeZE85D9VtH11ryJLQPTZXZSW1J5bIXcr4AlAH6tyjPPHTK34AdkwB32Myw==", - "requires": { - "@mapbox/mapbox-gl-style-spec": "^13.23.1", - "mapbox-to-css-font": "^2.4.1", - "ol": "^7.3.0" - } - }, - "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, - "requires": { - "ee-first": "1.1.1" - } - }, - "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 - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.1.tgz", - "integrity": "sha512-/4b7qZNhv6Uhd7jjnREh1NjnPxlTq+XNWPG88Ydkj5AILcA5m3ajvcg57pB24EQjKv0dK62XnDqk9c/hkIG5Kg==", - "dev": true, - "requires": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - } - }, - "opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==" - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dev": true, - "requires": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "pako": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", - "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" - }, - "param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "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, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-headers": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", - "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" - }, - "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==", - "dev": true, - "requires": { - "@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" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "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 - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pbf": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz", - "integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==", - "requires": { - "ieee754": "^1.1.12", - "resolve-protobuf-schema": "^2.1.0" - } - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", - "requires": { - "pinkie": "^2.0.0" - } - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "requires": { - "find-up": "^4.0.0" - } - }, - "popper.js": { - "version": "1.16.1-lts", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", - "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==" - }, - "postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", - "requires": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "requires": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-colormin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.0.0.tgz", - "integrity": "sha512-EuO+bAUmutWoZYgHn2T1dG1pPqHU6L4TjzPlu4t1wZGXQ/fxV16xg2EJmYi0z+6r+MGV1yvpx1BHkUaRrPa2bw==", - "requires": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-convert-values": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.0.0.tgz", - "integrity": "sha512-U5D8QhVwqT++ecmy8rnTb+RL9n/B806UVaS3m60lqle4YDFcpbS3ae5bTQIh3wOGUSDHSEtMYLs/38dNG7EYFw==", - "requires": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-discard-comments": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.0.tgz", - "integrity": "sha512-p2skSGqzPMZkEQvJsgnkBhCn8gI7NzRH2683EEjrIkoMiwRELx68yoUJ3q3DGSGuQ8Ug9Gsn+OuDr46yfO+eFw==", - "requires": {} - }, - "postcss-discard-duplicates": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.0.tgz", - "integrity": "sha512-bU1SXIizMLtDW4oSsi5C/xHKbhLlhek/0/yCnoMQany9k3nPBq+Ctsv/9oMmyqbR96HYHxZcHyK2HR5P/mqoGA==", - "requires": {} - }, - "postcss-discard-empty": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.0.tgz", - "integrity": "sha512-b+h1S1VT6dNhpcg+LpyiUrdnEZfICF0my7HAKgJixJLW7BnNmpRH34+uw/etf5AhOlIhIAuXApSzzDzMI9K/gQ==", - "requires": {} - }, - "postcss-discard-overridden": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.0.tgz", - "integrity": "sha512-4VELwssYXDFigPYAZ8vL4yX4mUepF/oCBeeIT4OXsJPYOtvJumyz9WflmJWTfDwCUcpDR+z0zvCWBXgTx35SVw==", - "requires": {} - }, - "postcss-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.3.0.tgz", - "integrity": "sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==", - "dev": true, - "requires": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.4", - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0", - "semver": "^7.3.4" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "postcss-merge-longhand": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.0.tgz", - "integrity": "sha512-4VSfd1lvGkLTLYcxFuISDtWUfFS4zXe0FpF149AyziftPFQIWxjvFSKhA4MIxMe4XM3yTDgQMbSNgzIVxChbIg==", - "requires": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^6.0.0" - } - }, - "postcss-merge-rules": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.0.0.tgz", - "integrity": "sha512-rCXkklftzEkniyv3f4mRCQzxD6oE4Quyh61uyWTUbCJ26Pv2hoz+fivJSsSBWxDBeScR4fKCfF3HHTcD7Ybqnw==", - "requires": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^4.0.0", - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-minify-font-values": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.0.0.tgz", - "integrity": "sha512-zNRAVtyh5E8ndZEYXA4WS8ZYsAp798HiIQ1V2UF/C/munLp2r1UGHwf1+6JFu7hdEhJFN+W1WJQKBrtjhFgEnA==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-gradients": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.0.tgz", - "integrity": "sha512-wO0F6YfVAR+K1xVxF53ueZJza3L+R3E6cp0VwuXJQejnNUH0DjcAFe3JEBeTY1dLwGa0NlDWueCA1VlEfiKgAA==", - "requires": { - "colord": "^2.9.1", - "cssnano-utils": "^4.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-params": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.0.0.tgz", - "integrity": "sha512-Fz/wMQDveiS0n5JPcvsMeyNXOIMrwF88n7196puSuQSWSa+/Ofc1gDOSY2xi8+A4PqB5dlYCKk/WfqKqsI+ReQ==", - "requires": { - "browserslist": "^4.21.4", - "cssnano-utils": "^4.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-selectors": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.0.tgz", - "integrity": "sha512-ec/q9JNCOC2CRDNnypipGfOhbYPuUkewGwLnbv6omue/PSASbHSU7s6uSQ0tcFRVv731oMIx8k0SP4ZX6be/0g==", - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "requires": {} - }, - "postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0" - } - }, - "postcss-normalize-charset": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.0.tgz", - "integrity": "sha512-cqundwChbu8yO/gSWkuFDmKrCZ2vJzDAocheT2JTd0sFNA4HMGoKMfbk2B+J0OmO0t5GUkiAkSM5yF2rSLUjgQ==", - "requires": {} - }, - "postcss-normalize-display-values": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.0.tgz", - "integrity": "sha512-Qyt5kMrvy7dJRO3OjF7zkotGfuYALETZE+4lk66sziWSPzlBEt7FrUshV6VLECkI4EN8Z863O6Nci4NXQGNzYw==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-positions": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.0.tgz", - "integrity": "sha512-mPCzhSV8+30FZyWhxi6UoVRYd3ZBJgTRly4hOkaSifo0H+pjDYcii/aVT4YE6QpOil15a5uiv6ftnY3rm0igPg==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-repeat-style": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.0.tgz", - "integrity": "sha512-50W5JWEBiOOAez2AKBh4kRFm2uhrT3O1Uwdxz7k24aKtbD83vqmcVG7zoIwo6xI2FZ/HDlbrCopXhLeTpQib1A==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-string": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.0.tgz", - "integrity": "sha512-KWkIB7TrPOiqb8ZZz6homet2KWKJwIlysF5ICPZrXAylGe2hzX/HSf4NTX2rRPJMAtlRsj/yfkrWGavFuB+c0w==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-timing-functions": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.0.tgz", - "integrity": "sha512-tpIXWciXBp5CiFs8sem90IWlw76FV4oi6QEWfQwyeREVwUy39VSeSqjAT7X0Qw650yAimYW5gkl2Gd871N5SQg==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-unicode": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.0.0.tgz", - "integrity": "sha512-ui5crYkb5ubEUDugDc786L/Me+DXp2dLg3fVJbqyAl0VPkAeALyAijF2zOsnZyaS1HyfPuMH0DwyY18VMFVNkg==", - "requires": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-url": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.0.tgz", - "integrity": "sha512-98mvh2QzIPbb02YDIrYvAg4OUzGH7s1ZgHlD3fIdTHLgPLRpv1ZTKJDnSAKr4Rt21ZQFzwhGMXxpXlfrUBKFHw==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-whitespace": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.0.tgz", - "integrity": "sha512-7cfE1AyLiK0+ZBG6FmLziJzqQCpTQY+8XjMhMAz8WSBSCsCNNUKujgIgjCAmDT3cJ+3zjTXFkoD15ZPsckArVw==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-ordered-values": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.0.tgz", - "integrity": "sha512-K36XzUDpvfG/nWkjs6d1hRBydeIxGpKS2+n+ywlKPzx1nMYDYpoGbcjhj5AwVYJK1qV2/SDoDEnHzlPD6s3nMg==", - "requires": { - "cssnano-utils": "^4.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-reduce-initial": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.0.0.tgz", - "integrity": "sha512-s2UOnidpVuXu6JiiI5U+fV2jamAw5YNA9Fdi/GRK0zLDLCfXmSGqQtzpUPtfN66RtCbb9fFHoyZdQaxOB3WxVA==", - "requires": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0" - } - }, - "postcss-reduce-transforms": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.0.tgz", - "integrity": "sha512-FQ9f6xM1homnuy1wLe9lP1wujzxnwt1EwiigtWwuyf8FsqqXUDUp2Ulxf9A5yjlUOTdCJO6lonYjg1mgqIIi2w==", - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-svgo": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.0.tgz", - "integrity": "sha512-r9zvj/wGAoAIodn84dR/kFqwhINp5YsJkLoujybWG59grR/IHx+uQ2Zo+IcOwM0jskfYX3R0mo+1Kip1VSNcvw==", - "requires": { - "postcss-value-parser": "^4.2.0", - "svgo": "^3.0.2" - } - }, - "postcss-unique-selectors": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.0.tgz", - "integrity": "sha512-EPQzpZNxOxP7777t73RQpZE5e9TrnCrkvp7AH7a0l89JmZiPnS82y216JowHXwpBCQitfyxrof9TK3rYbi7/Yw==", - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "dev": true, - "requires": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, - "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 - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - }, - "dependencies": { - "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==" - } - } - }, - "protocol-buffers-schema": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", - "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==" - }, - "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, - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "dependencies": { - "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 - } - } - }, - "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - }, - "quick-lru": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.1.tgz", - "integrity": "sha512-S27GBT+F0NTRiehtbrgaSE1idUAJ5bX8dPAQTdylEyNlrdcH5X4Lz7Edz3DYzecbsCluD5zO8ZNEe04z3D3u6Q==" - }, - "quickselect": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", - "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - } - } - }, - "rbush": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/rbush/-/rbush-3.0.1.tgz", - "integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==", - "requires": { - "quickselect": "^2.0.0" - } - }, - "react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - } - }, - "react-share": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/react-share/-/react-share-4.4.1.tgz", - "integrity": "sha512-AJ9m9RiJssqvYg7MoJUc9J0D7b/liWrsfQ99ndKc5vJ4oVHHd4Fy87jBlKEQPibT40oYA3AQ/a9/oQY6/yaigw==", - "requires": { - "classnames": "^2.3.2", - "jsonp": "^0.2.1" - } - }, - "react-share-social": { - "version": "0.1.55", - "resolved": "https://registry.npmjs.org/react-share-social/-/react-share-social-0.1.55.tgz", - "integrity": "sha512-Mkm6ucoKjj7ENXldz1B+BDtVA4Z387LEjJgtWhEzdrQGtYFGbK8fktZCsBLKTQhl0F/YvQxTrOlNl9DbxaVtHw==", - "requires": { - "@material-ui/core": "^4.11.4", - "gh-pages": "^4.0.0", - "react-share": "^4.3.1" - } - }, - "react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "requires": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dev": true, - "requires": { - "resolve": "^1.9.0" - } - }, - "regenerate": { - "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 - }, - "regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.2" - } - }, - "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regexpu-core": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.0.tgz", - "integrity": "sha512-ZdhUQlng0RoscyW7jADnUZ25F5eVtHdMyXSb2PiwafvteRAOJUjFoUPEYZSIfP99fBIs3maLIRfpEddT78wAAQ==", - "dev": true, - "requires": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - } - }, - "regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true - } - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "dev": true - }, - "renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "dev": true, - "requires": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "resolve-from": { - "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 - }, - "resolve-protobuf-schema": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", - "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", - "requires": { - "protocol-buffers-schema": "^3.3.1" - } - }, - "retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sass": { - "version": "1.58.3", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.3.tgz", - "integrity": "sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A==", - "dev": true, - "requires": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - } - }, - "sass-loader": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.2.0.tgz", - "integrity": "sha512-JWEp48djQA4nbZxmgC02/Wh0eroSUutulROUusYJO9P9zltRbNN80JCBHqRGzjd4cmZCa/r88xgfkjGD0TXsHg==", - "dev": true, - "requires": { - "klona": "^2.0.4", - "neo-async": "^2.6.2" - } - }, - "scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - } - }, - "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 - }, - "selfsigned": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", - "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", - "dev": true, - "requires": { - "node-forge": "^1" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "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 - } - } - }, - "serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true - } - } - }, - "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, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "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 - }, - "sirv": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", - "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", - "requires": { - "@polka/url": "^1.0.0-next.20", - "mrmime": "^1.0.0", - "totalist": "^1.0.0" - } - }, - "sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, - "requires": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "sort-asc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/sort-asc/-/sort-asc-0.1.0.tgz", - "integrity": "sha512-jBgdDd+rQ+HkZF2/OHCmace5dvpos/aWQpcxuyRs9QUbPRnkEJmYVo81PIGpjIdpOcsnJ4rGjStfDHsbn+UVyw==" - }, - "sort-desc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/sort-desc/-/sort-desc-0.1.1.tgz", - "integrity": "sha512-jfZacW5SKOP97BF5rX5kQfJmRVZP5/adDUTY8fCSPvNcXDVpUEe2pr/iKGlcyZzchRJZrswnp68fgk3qBXgkJw==" - }, - "sort-object": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/sort-object/-/sort-object-0.3.2.tgz", - "integrity": "sha512-aAQiEdqFTTdsvUFxXm3umdo04J7MRljoVGbBlkH7BgNsMvVNAJyGj7C/wV1A8wHWAJj/YikeZbfuCKqhggNWGA==", - "requires": { - "sort-asc": "^0.1.0", - "sort-desc": "^0.1.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" - }, - "source-map-support": { - "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==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - } - }, - "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, - "requires": { - "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" - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - }, - "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, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "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, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "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 - }, - "strip-outer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", - "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", - "requires": { - "escape-string-regexp": "^1.0.2" - } - }, - "style-loader": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", - "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", - "dev": true, - "requires": {} - }, - "stylehacks": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.0.0.tgz", - "integrity": "sha512-+UT589qhHPwz6mTlCLSt/vMNTJx8dopeJlZAlBMJPWA3ORqu6wmQY7FBXf+qD+FsqoBJODyqNxOUP3jdntFRdw==", - "requires": { - "browserslist": "^4.21.4", - "postcss-selector-parser": "^6.0.4" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "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 - }, - "svgo": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.0.2.tgz", - "integrity": "sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==", - "requires": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^5.1.0", - "css-tree": "^2.2.1", - "csso": "^5.0.5", - "picocolors": "^1.0.0" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" - }, - "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==", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - } - }, - "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==", - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - } - }, - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "requires": { - "domelementtype": "^2.3.0" - } - }, - "domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", - "requires": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" - } - }, - "entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" - } - } - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" - }, - "terser": { - "version": "5.16.9", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.9.tgz", - "integrity": "sha512-HPa/FdTB9XGI2H1/keLFZHxl6WNvAI4YalHGtDQTlMnJcoqSab1UwL4l1hGEhs6/GmLHBZIg/YgB++jcbzoOEg==", - "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - } - } - }, - "terser-webpack-plugin": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz", - "integrity": "sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==", - "requires": { - "@jridgewell/trace-mapping": "^0.3.17", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.5" - }, - "dependencies": { - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, - "to-fast-properties": { - "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 - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true - }, - "totalist": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", - "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==" - }, - "trim-repeated": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", - "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", - "requires": { - "escape-string-regexp": "^1.0.2" - } - }, - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - }, - "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, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true - }, - "unicode-canonical-property-names-ecmascript": { - "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 - }, - "unicode-match-property-ecmascript": { - "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, - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - } - }, - "unicode-match-property-value-ecmascript": { - "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 - }, - "unicode-property-aliases-ecmascript": { - "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 - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true - }, - "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 - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true - }, - "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "web-worker": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", - "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==" - }, - "webpack": { - "version": "5.75.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", - "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "dependencies": { - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "webpack-bundle-analyzer": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.8.0.tgz", - "integrity": "sha512-ZzoSBePshOKhr+hd8u6oCkZVwpVaXgpw23ScGLFpR6SjYI7+7iIWYarjN6OEYOfRt8o7ZyZZQk0DuMizJ+LEIg==", - "requires": { - "@discoveryjs/json-ext": "0.5.7", - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "chalk": "^4.1.0", - "commander": "^7.2.0", - "gzip-size": "^6.0.0", - "lodash": "^4.17.20", - "opener": "^1.5.2", - "sirv": "^1.0.7", - "ws": "^7.3.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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==", - "requires": { - "color-name": "~1.1.4" - } - }, - "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==" - }, - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "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==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "requires": {} - } - } - }, - "webpack-cli": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", - "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", - "dev": true, - "requires": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", - "colorette": "^2.0.14", - "commander": "^7.0.0", - "cross-spawn": "^7.0.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", - "webpack-merge": "^5.7.3" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - } - } - }, - "webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", - "dev": true, - "requires": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - } - } - }, - "webpack-dev-server": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", - "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", - "dev": true, - "requires": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "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.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" - }, - "dependencies": { - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - } - } - }, - "webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - } - }, - "webpack-sources": { - "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==" - }, - "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, - "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "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 - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - }, - "wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "ws": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", - "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", - "dev": true, - "requires": {} - }, - "xml-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/xml-utils/-/xml-utils-1.3.0.tgz", - "integrity": "sha512-i4PIrX33Wd66dvwo4syicwlwmnr6wuvvn4f2ku9hA67C2Uk62Xubczuhct+Evnd12/DV71qKNeDdJwES8HX1RA==" - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true - } - } -} diff --git a/src/frontend/fmtm_openlayer_map/package.json b/src/frontend/fmtm_openlayer_map/package.json deleted file mode 100755 index 44da05d3cc..0000000000 --- a/src/frontend/fmtm_openlayer_map/package.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "fmtm_openlayer_map", - "version": "0.1.0", - "scripts": { - "build": "webpack --mode production", - "build:dev": "webpack --mode development", - "build:start": "cd dist && PORT=7000 npx serve", - "start": "env-cmd -f .env.dev webpack serve --open --mode development", - "start:live": "webpack serve --open --mode development --live-reload --hot" - }, - "license": "MIT", - "author": { - "name": "Jack Herrington", - "email": "jherr@pobox.com" - }, - "devDependencies": { - "@babel/core": "^7.15.8", - "@babel/plugin-transform-runtime": "^7.15.8", - "@babel/preset-env": "^7.21.4", - "@babel/preset-react": "^7.14.5", - "@babel/preset-typescript": "^7.10.4", - "@types/react": "^17.0.2", - "@types/react-dom": "^17.0.2", - "autoprefixer": "^10.1.0", - "babel-loader": "^8.2.2", - "babel-plugin-import": "^1.13.6", - "css-loader": "^6.3.0", - "html-webpack-plugin": "^5.3.2", - "postcss": "^8.2.1", - "postcss-loader": "^4.1.0", - "sass": "^1.58.3", - "sass-loader": "^13.2.0", - "style-loader": "^3.3.0", - "typescript": "^4.5.2", - "webpack": "^5.75.0", - "webpack-cli": "^4.9.0", - "webpack-dev-server": "^4.3.1" - }, - "dependencies": { - "css-minimizer-webpack-plugin": "^5.0.0", - "env-cmd": "^10.1.0", - "ol": "^7.5.2", - "ol-layerswitcher": "^4.1.1", - "react": "^17.0.2", - "react-dom": "^17.0.2", - "react-share-social": "^0.1.55", - "terser-webpack-plugin": "^5.3.7", - "webpack-bundle-analyzer": "^4.8.0" - } -} diff --git a/src/frontend/fmtm_openlayer_map/src/App.jsx b/src/frontend/fmtm_openlayer_map/src/App.jsx deleted file mode 100755 index a517ffb619..0000000000 --- a/src/frontend/fmtm_openlayer_map/src/App.jsx +++ /dev/null @@ -1,14 +0,0 @@ - -import './index.css' -import ReactDOM from "react-dom"; -import { store } from "fmtm/Store"; -import routes from "./routes"; -import CoreModules from 'fmtm/CoreModules' - -ReactDOM.render( - - - - , - document.getElementById("app") -); diff --git a/src/frontend/fmtm_openlayer_map/src/api/Project.js b/src/frontend/fmtm_openlayer_map/src/api/Project.js deleted file mode 100755 index be755391bf..0000000000 --- a/src/frontend/fmtm_openlayer_map/src/api/Project.js +++ /dev/null @@ -1,180 +0,0 @@ -import { ProjectActions } from "fmtm/ProjectSlice"; -import CoreModules from "fmtm/CoreModules"; -import environment from 'fmtm/environment'; -export const ProjectById = (url, existingProjectList,projectId) => { - return async (dispatch) => { - // dispatch(HomeActions.HomeProjectLoading(true)) - const fetchProjectById = async (url, existingProjectList,) => { - try { - const project = await CoreModules.axios.get(url); - const taskBbox = await CoreModules.axios.get(`${environment.baseApiUrl}/tasks/point_on_surface?project_id=${projectId}`); - const resp = project.data; - const persistingValues = resp.project_tasks.map((data) => { - return { - id: data.id, - project_task_name: data.project_task_name, - task_status_str: data.task_status_str, - outline_geojson: data.outline_geojson, - outline_centroid: data.outline_centroid, - task_history: data.task_history, - locked_by_uid:data.locked_by_uid, - locked_by_username:data.locked_by_username, - }; - }); - // added centroid from another api to projecttaskboundries - const projectTaskBoundries =[{ id: resp.id, taskBoundries: persistingValues }] - const mergedBboxIntoTask = projectTaskBoundries[0].taskBoundries.map((projectTask) => { - const filteredTaskIdCentroid = taskBbox.data.find((task) => task.id === projectTask.id).point[0]; - return { - ...projectTask, - bbox: filteredTaskIdCentroid, - }; - }); - dispatch( - ProjectActions.SetProjectTaskBoundries([{ ...projectTaskBoundries[0], taskBoundries: mergedBboxIntoTask }]) - ); - dispatch( - ProjectActions.SetProjectInfo({id:resp.id, - outline_geojson: resp.outline_geojson, - priority:resp.priority || 2, - priority_str:resp.priority_str || "MEDIUM", - title:resp.project_info?.[0]?.name, - location_str:resp.location_str, - description:resp.description, - num_contributors:resp.num_contributors, - total_tasks:resp.total_tasks, - tasks_mapped:resp.tasks_mapped, - tasks_validated:resp.tasks_validated, - xform_title:resp.xform_title, - tasks_bad:resp.tasks_bad}) - ); - } catch (error) { - // console.log('error :', error) - } - }; - - await fetchProjectById(url, existingProjectList); - dispatch(ProjectActions.SetNewProjectTrigger()); - }; -}; - -export const DownloadProjectForm = (url,payload) => { - - return async (dispatch) => { - dispatch(ProjectActions.SetDownloadProjectFormLoading({type:payload,loading:true})) - - const fetchProjectForm = async (url,payload) => { - try { - let response; - if(payload=== 'form'){ - response = await CoreModules.axios.get(url,{responseType : 'blob'}); - }else{ - response = await CoreModules.axios.get(url, { - responseType : 'blob', - }); - } - const a = document.createElement("a"); - a.href = window.URL.createObjectURL(response.data); - a.download=`Project_form.${payload=== 'form'? '.xls':'.geojson'}`; - a.click(); - dispatch(ProjectActions.SetDownloadProjectFormLoading({type:payload,loading:false})) - } catch (error) { - dispatch(ProjectActions.SetDownloadProjectFormLoading({type:payload,loading:false})) - } finally{ - dispatch(ProjectActions.SetDownloadProjectFormLoading({type:payload,loading:false})) - } - } - await fetchProjectForm(url,payload); - } -} -export const DownloadDataExtract = (url,payload) => { - - return async (dispatch) => { - dispatch(ProjectActions.SetDownloadDataExtractLoading(true)) - - const getDownloadExtract = async (url,payload) => { - try { - let response; - - response = await CoreModules.axios.get(url, { - responseType : 'blob', - }); - const a = document.createElement("a"); - a.href = window.URL.createObjectURL(response.data); - a.download=`Data_Extract.geojson`; - a.click(); - dispatch(ProjectActions.SetDownloadDataExtractLoading(false)) - } catch (error) { - dispatch(ProjectActions.SetDownloadDataExtractLoading(false)) - } finally{ - dispatch(ProjectActions.SetDownloadDataExtractLoading(false)) - } - } - await getDownloadExtract(url,payload); - } -} -export const GetTilesList = (url) => { - - return async (dispatch) => { - dispatch(ProjectActions.SetTilesListLoading(true)) - - const fetchTilesList = async (url) => { - try { - const response = await CoreModules.axios.get(url); - dispatch( - ProjectActions.SetTilesList(response.data) - ); - dispatch(ProjectActions.SetTilesListLoading(false)) - } catch (error) { - dispatch(ProjectActions.SetTilesListLoading(false)) - } finally{ - dispatch(ProjectActions.SetTilesListLoading(false)) - } - } - await fetchTilesList(url); - } -} -export const GenerateProjectTiles = (url,payload) => { - - return async (dispatch) => { - dispatch(ProjectActions.SetGenerateProjectTilesLoading(true)) - - const generateProjectTiles = async (url,payload) => { - try { - const response = await CoreModules.axios.get(url); - dispatch(GetTilesList(`${environment.baseApiUrl}/projects/tiles_list/${payload}/`)); - dispatch(ProjectActions.SetGenerateProjectTilesLoading(false)) - } catch (error) { - dispatch(ProjectActions.SetGenerateProjectTilesLoading(false)) - } finally{ - dispatch(ProjectActions.SetGenerateProjectTilesLoading(false)) - } - } - await generateProjectTiles(url,payload); - } -} - -export const DownloadTile = (url,payload) => { - - return async (dispatch) => { - dispatch(ProjectActions.SetDownloadTileLoading({type:payload,loading:true})) - - const getDownloadTile = async (url,payload) => { - try { - const response = await CoreModules.axios.get(url, { - responseType : 'blob', - }); - var a = document.createElement("a"); - a.href = window.URL.createObjectURL(response.data); - a.download=`${payload.title}_mbtiles.mbtiles`; - a.click(); - dispatch(ProjectActions.SetDownloadTileLoading({type:payload,loading:false})) - } catch (error) { - dispatch(ProjectActions.SetDownloadTileLoading({type:payload,loading:false})) - } finally{ - dispatch(ProjectActions.SetDownloadTileLoading({type:payload,loading:false})) - } - } - await getDownloadTile(url,payload); - } -} \ No newline at end of file diff --git a/src/frontend/fmtm_openlayer_map/src/api/SubmissionService.ts b/src/frontend/fmtm_openlayer_map/src/api/SubmissionService.ts deleted file mode 100644 index 77cb8b39dd..0000000000 --- a/src/frontend/fmtm_openlayer_map/src/api/SubmissionService.ts +++ /dev/null @@ -1,48 +0,0 @@ -import CoreModules from 'fmtm/CoreModules'; -import { ProjectActions } from 'fmtm/ProjectSlice'; -// import { HomeProjectCardModel } from '../models/home/homeModel'; - -export const ProjectSubmissionService: Function = (url: string) => { - - return async (dispatch) => { - dispatch(ProjectActions.GetProjectSubmissionLoading(true)) - - const fetchProjectSubmission = async (url:string) => { - - try { - const fetchSubmissionData = await CoreModules.axios.get(url) - const resp: any = fetchSubmissionData.data; - dispatch(ProjectActions.SetProjectSubmission(resp)) - dispatch(ProjectActions.GetProjectSubmissionLoading(false)) - } catch (error) { - dispatch(ProjectActions.GetProjectSubmissionLoading(false)) - } - } - - await fetchProjectSubmission(url); - - } - -} -export const ProjectBuildingGeojsonService: Function = (url: string) => { - - return async (dispatch) => { - dispatch(ProjectActions.GetProjectBuildingGeojsonLoading(true)) - - const fetchProjectBuildingGeojson = async (url:string) => { - - try { - const fetchBuildingGeojsonData = await CoreModules.axios.get(url) - const resp: any = fetchBuildingGeojsonData.data; - dispatch(ProjectActions.SetProjectBuildingGeojson(resp)) - dispatch(ProjectActions.GetProjectBuildingGeojsonLoading(false)) - } catch (error) { - dispatch(ProjectActions.GetProjectBuildingGeojsonLoading(false)) - } - } - - await fetchProjectBuildingGeojson(url); - - } - -} diff --git a/src/frontend/fmtm_openlayer_map/src/components/Activities.jsx b/src/frontend/fmtm_openlayer_map/src/components/Activities.jsx deleted file mode 100755 index 71531f4d58..0000000000 --- a/src/frontend/fmtm_openlayer_map/src/components/Activities.jsx +++ /dev/null @@ -1,90 +0,0 @@ -import React from "react"; -import IconButtonCard from "../utilities/IconButtonCard"; -import environment from "fmtm/environment"; -import { easeIn, easeOut } from "ol/easing"; -import CoreModules from "fmtm/CoreModules"; -import AssetModules from "fmtm/AssetModules"; -//Activity Model to be display in Activities panel -const Activities = ({ - history, - defaultTheme, - mapDivPostion, - map, - view, - state, - params, -}) => { - const index = state.projectTaskBoundries.findIndex( - (project) => project.id == environment.decode(params.id) - ); - - return ( - - - - {`Task #${history.taskId}`} - - - - - - - - - {history.action_text} - - - { - const main = document.getElementsByClassName("mainview")[0]; - await main.scrollTo({ - top: mapDivPostion, - }); - - const centroid = state.projectTaskBoundries[ - index - ].taskBoundries.filter((task) => { - return task.id == history.taskId; - })[0].outline_centroid.geometry.coordinates; - - map.getView().setCenter(centroid); - - setTimeout(() => { - view.animate({ zoom: 19, easing: easeOut, duration: 2000 }); - }, 100); - }} - color="info" - aria-label="share qrcode" - > - - - } - /> - - - - - - - - - {history.action_date} - - - - ); -}; -export default Activities; diff --git a/src/frontend/fmtm_openlayer_map/src/components/ActivitiesPanel.jsx b/src/frontend/fmtm_openlayer_map/src/components/ActivitiesPanel.jsx deleted file mode 100755 index 94b8811858..0000000000 --- a/src/frontend/fmtm_openlayer_map/src/components/ActivitiesPanel.jsx +++ /dev/null @@ -1,184 +0,0 @@ -import React, { useEffect, useState } from "react"; -import BasicCard from "fmtm/BasicCard"; -import Activities from "./Activities"; -import environment from "fmtm/environment"; -import CoreModules from 'fmtm/CoreModules'; -import AssetModules from 'fmtm/AssetModules'; - -const Search = AssetModules.styled('div')(({ theme }) => ({ - position: 'relative', - borderRadius: theme.shape.borderRadius, - backgroundColor: AssetModules.alpha(theme.palette.common.white, 0.15), - '&:hover': { - backgroundColor: AssetModules.alpha(theme.palette.common.white, 0.25), - }, - marginRight: theme.spacing(2), - marginLeft: 0, - opacity: 0.8, - border: `1px solid ${theme.palette.warning['main']}`, - width: '100%', - [theme.breakpoints.up('sm')]: { - marginLeft: theme.spacing(3), - width: 'auto', - }, -})); - -const SearchIconWrapper = AssetModules.styled('div')(({ theme }) => ({ - padding: theme.spacing(0, 2), - height: '100%', - position: 'absolute', - pointerEvents: 'none', - display: 'flex', - alignItems: 'center', - justifyContent: 'center', -})); - -const StyledInputBase = AssetModules.styled(CoreModules.InputBase)(({ theme }) => ({ - color: 'primary', - '& .MuiInputBase-input': { - padding: theme.spacing(1, 1, 1, 0), - fontFamily: theme.typography.h3.fontFamily, - // vertical padding + font size from searchIcon - paddingLeft: `calc(1em + ${theme.spacing(4)})`, - transition: theme.transitions.create('width'), - width: '100%', - // [theme.breakpoints.up('md')]: { - // width: '20ch', - // }, - }, -})); - - - - -const ActivitiesPanel = ({ defaultTheme, state, params, map, view, mapDivPostion, states }) => { - - const displayLimit = 10; - const [searchText, setSearchText] = useState('') - const [taskHistories, setTaskHistories] = useState([]) - const [paginationSize, setPaginationSize] = useState(0) - const [taskDisplay, setTaskDisplay] = React.useState(displayLimit) - const [allActivities, setAllActivities] = useState(0) - const [prev, setPrv] = React.useState(0) - - - const handleChange = (event, value) => { - setPrv(((value * displayLimit) - displayLimit)) - setTaskDisplay(value * displayLimit) - }; - - const handleOnchange = (event) => { - setSearchText(event.target.value) - } - - useEffect(() => { - - const index = state.findIndex(project => project.id == environment.decode(params.id)); - let taskHistories = []; - - - if (index != -1) { - state[index].taskBoundries.forEach((task) => { - taskHistories = taskHistories.concat(task.task_history.map(history => { - return { ...history, taskId: task.id, status: task.task_status_str } - })) - }) - } - - let finalTaskHistory = taskHistories.filter((task) => { - return task.taskId.toString().includes(searchText) || task.action_text.split(':')[1].replace(/\s+/g, '').toString().includes(searchText.toString()) - }) - - if (searchText != '') { - - setAllActivities(finalTaskHistory.length) - const tasksToDisplay = finalTaskHistory.filter((task, index) => { - return index <= taskDisplay - 1 && index >= prev - }) - setTaskHistories(tasksToDisplay) - const paginationSize = - finalTaskHistory.length % displayLimit == 0 ? Math.floor(finalTaskHistory.length / displayLimit) - : (Math.floor(finalTaskHistory.length / displayLimit) + 1) - setPaginationSize(paginationSize) - - } else { - - setAllActivities(taskHistories.length) - const tasksToDisplay = taskHistories.filter((task, index) => { - return index <= taskDisplay - 1 && index >= prev - }) - - setTaskHistories(tasksToDisplay) - const paginationSize = - taskHistories.length % displayLimit == 0 ? Math.floor(taskHistories.length / displayLimit) - : (Math.floor(taskHistories.length / displayLimit) + 1) - setPaginationSize(paginationSize) - } - - - }, [taskDisplay, state, searchText]) - - return ( - - - {`Total Activities ${allActivities}`} - - - - - - - - - - - {allActivities === 0 && - No Results found. - } - - {taskHistories.map((history, index) => ( - - } - /> - - ))} - - - - - - - - ) -} - -export default ActivitiesPanel; diff --git a/src/frontend/fmtm_openlayer_map/src/components/MapComponent/OpenLayersComponent/LayerSwitcher/index.js b/src/frontend/fmtm_openlayer_map/src/components/MapComponent/OpenLayersComponent/LayerSwitcher/index.js deleted file mode 100644 index 1481d57db7..0000000000 --- a/src/frontend/fmtm_openlayer_map/src/components/MapComponent/OpenLayersComponent/LayerSwitcher/index.js +++ /dev/null @@ -1,163 +0,0 @@ -/* eslint-disable react/prop-types */ -/* eslint-disable no-unused-vars */ -import 'ol-layerswitcher/dist/ol-layerswitcher.css'; -// import "../../node_modules/ol-layerswitcher/dist/ol-layerswitcher.css"; -import LayerGroup from 'ol/layer/Group'; -import LayerTile from 'ol/layer/Tile'; -import SourceOSM from 'ol/source/OSM'; -import SourceStamen from 'ol/source/Stamen'; -import LayerSwitcher from 'ol-layerswitcher'; -import React,{ useEffect } from 'react'; - -import { XYZ } from 'ol/source'; - -// const mapboxOutdoors = new MapboxVector({ -// styleUrl: 'mapbox://styles/geovation/ckpicg3of094w17nyqyd2ziie', -// accessToken: 'pk.eyJ1IjoiZ2VvdmF0aW9uIiwiYSI6ImNrcGljOXBwbTBoc3oyb3BjMGsxYW9wZ2EifQ.euYtUXb6HJGLHkj4Wi3gjA', -// }); -const osm = (visible) => - new LayerTile({ - title: 'OSM', - type: 'base', - visible: visible === 'osm', - source: new SourceOSM(), - }); -const none = (visible) => - new LayerTile({ - title: 'None', - type: 'base', - visible: visible === 'none', - source: null, - }); -const bingMaps = (visible) => - new LayerTile({ - title: 'Satellite', - type: 'base', - visible: visible === 'satellite', - source: new XYZ({ - url: 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}', - }), - // source: new BingMaps({ - // key: 'AoTlmaazzog43ImdKts9HVztFzUI4PEOT0lmo2V4q7f20rfVorJGAgDREKmfQAgd', - // imagerySet: 'Aerial', - // // use maxZoom 19 to see stretched tiles instead of the BingMaps - // // "no photos at this zoom level" tiles - // maxZoom: 19, - // crossOrigin: 'Anonymous', - // }), - }); -const mapboxMap = (visible) => - new LayerTile({ - title: 'Mapbox Light', - type: 'base', - visible: visible === 'mapbox', - source: new XYZ({ - attributions: - 'Tiles © ArcGIS', - url: 'https://api.mapbox.com/styles/v1/nishon-naxa/ckgkuy7y08rpi19qk46sces9c/tiles/256/{z}/{x}/{y}@2x?access_token=pk.eyJ1IjoibmlzaG9uLW5heGEiLCJhIjoiY2xhYnhwbzN0MDUxYTN1bWhvcWxocWlpaSJ9.0FarR4aPxb7F9BHP31msww', - layer: 'topoMap', - maxZoom: 19, - crossOrigin: 'Anonymous', - }), - }); -const mapboxOutdoors = (visible) => - new LayerTile({ - title: 'Mapbox Outdoors', - type: 'base', - visible: visible === 'outdoors', - source: new XYZ({ - attributions: - 'Tiles © ArcGIS', - // url: - // 'https://api.mapbox.com/styles/v1/geovation/ckpicg3of094w17nyqyd2ziie/tiles/256/{z}/{x}/{y}@2x?access_token=pk.eyJ1IjoiZ2VvdmF0aW9uIiwiYSI6ImNrcGljOXBwbTBoc3oyb3BjMGsxYW9wZ2EifQ.euYtUXb6HJGLHkj4Wi3gjA', - url: 'https://api.mapbox.com/styles/v1/naxa-np/cl50pm1l5001814qpncu8s4ib/tiles/256/{z}/{x}/{y}@2x?access_token=pk.eyJ1IjoibmF4YS1ucCIsImEiOiJja2E5bGp0ZDQwdHE4MnJxdnhmcGxsdGpuIn0.kB42E50iZFlFPcQiqQMClw', - layer: 'topoMap', - maxZoom: 19, - crossOrigin: 'Anonymous', - }), - }); - -const topoMap = (visible = false) => - new LayerTile({ - title: 'Topo Map', - type: 'base', - visible, - source: new XYZ({ - attributions: - 'Tiles © ArcGIS', - url: 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}', - layer: 'topoMap', - maxZoom: 19, - crossOrigin: 'Anonymous', - }), - }); - -const monochrome = (visible = false) => - new LayerTile({ - title: 'Monochrome', - type: 'base', - visible, - source: new XYZ({ - attributions: - 'Tiles © ArcGIS', - url: 'https://api.mapbox.com/styles/v1/geovation/ckqxdp7rd0t5d17lfuxm259c7/tiles/256/{z}/{x}/{y}@2x?access_token=pk.eyJ1IjoiZ2VvdmF0aW9uIiwiYSI6ImNrcGljOXBwbTBoc3oyb3BjMGsxYW9wZ2EifQ.euYtUXb6HJGLHkj4Wi3gjA', - layer: 'topomap', - maxZoom: 19, - crossOrigin: 'Anonymous', - }), - }); - -const monochromeMidNight = (visible = false) => - new LayerTile({ - title: 'Monochrome Midnight', - type: 'base', - visible, - source: new XYZ({ - attributions: - 'Tiles © ArcGIS', - url: 'https://api.mapbox.com/styles/v1/geovation/ckqxdsqu93r0417mcbdc102nb/tiles/256/{z}/{x}/{y}@2x?access_token=pk.eyJ1IjoiZ2VvdmF0aW9uIiwiYSI6ImNrcGljOXBwbTBoc3oyb3BjMGsxYW9wZ2EifQ.euYtUXb6HJGLHkj4Wi3gjA', - layer: 'topomap', - maxZoom: 19, - crossOrigin: 'Anonymous', - }), - }); - -const watercolor = new LayerTile({ - title: 'Water color', - type: 'base', - visible: false, - source: new SourceStamen({ - layer: 'watercolor', - }), -}); - -const LayerSwitcherControl = ({ map, visible = 'osm' }) => { - useEffect(() => { - if (!map) return; - - const baseMaps = new LayerGroup({ - title: 'Base maps', - layers: [bingMaps(visible), osm(visible), mapboxMap(visible), mapboxOutdoors(visible), none(visible)], - }); - - const layerSwitcher = new LayerSwitcher({ - reverse: true, - groupSelectStyle: 'group', - }); - map.addLayer(baseMaps); - map.addControl(layerSwitcher); - // eslint-disable-next-line consistent-return - return () => { - map.removeLayer(baseMaps); - }; - }, [map, visible]); - - return null; -}; - -export default LayerSwitcherControl; diff --git a/src/frontend/fmtm_openlayer_map/src/components/MapComponent/OpenLayersComponent/Layers/VectorLayer.js b/src/frontend/fmtm_openlayer_map/src/components/MapComponent/OpenLayersComponent/Layers/VectorLayer.js deleted file mode 100644 index 0d56e958e2..0000000000 --- a/src/frontend/fmtm_openlayer_map/src/components/MapComponent/OpenLayersComponent/Layers/VectorLayer.js +++ /dev/null @@ -1,266 +0,0 @@ -/* eslint-disable no-console */ -/* eslint-disable consistent-return */ -/* eslint-disable react/forbid-prop-types */ -import React,{ useEffect, useState } from 'react'; -import PropTypes from 'prop-types'; -import { get } from 'ol/proj'; -import Style from 'ol/style/Style'; -import Stroke from 'ol/style/Stroke'; -import GeoJSON from 'ol/format/GeoJSON'; -import { Vector as VectorSource } from 'ol/source'; -import OLVectorLayer from 'ol/layer/Vector'; -import { defaultStyles, getStyles } from '../helpers/styleUtils'; -import { isExtentValid } from '../helpers/layerUtils'; -import { - Draw, - Modify, - Select, - defaults as defaultInteractions, -} from 'ol/interaction.js'; - - -const selectElement = 'singleselect'; - -const selectedCountry = new Style({ - stroke: new Stroke({ - color: '#008099', - width: 3, - }), - // fill: new Fill({ - // color: 'rgba(200,20,20,0.4)', - // }), -}); -let selection = {}; -const layerViewProperties = { - padding: [50, 50, 50, 50], - duration: 900, - constrainResolution: true, -}; - -const VectorLayer = ({ - map, - geojson, - style, - zIndex, - zoomToLayer = false, - visibleOnMap = true, - properties, - viewProperties, - hoverEffect, - mapOnClick, - setStyle, - onModify, - onDraw, -}) => { - const [vectorLayer, setVectorLayer] = useState(null); - - useEffect(() => () => map && vectorLayer && map.removeLayer(vectorLayer), [map, vectorLayer]); - - // Modify Feature - useEffect(() => { - if(!map) return; - if(!vectorLayer) return; - if(!onModify) return; - const select = new Select({ - wrapX: false, - }); - const vectorLayerSource = vectorLayer.getSource(); - const modify = new Modify({ - // features: select.getFeatures(), - source:vectorLayerSource - }); - modify.on('modifyend',function(e){ - var geoJSONFormat = new GeoJSON(); - - var geoJSONString = geoJSONFormat.writeFeatures(vectorLayer.getSource().getFeatures(),{ dataProjection: 'EPSG:4326', featureProjection: 'EPSG:3857'}); - - onModify(geoJSONString); - }); - map.addInteraction(modify); - map.addInteraction(select); - - return () => { - // map.removeInteraction(defaultInteractions().extend([select, modify])) - } - }, [map,vectorLayer,onModify]) - // Modify Feature - useEffect(() => { - if(!map) return; - // if(!vectorLayer) return; - if(!onDraw) return; - const source = new VectorSource({wrapX: false}); - - const vector = new OLVectorLayer({ - source: source, - }); - const draw = new Draw({ - source: source, - type: 'Polygon', - }); - draw.on('drawend',function(e){ - const feature = e.feature; - const geojsonFormat = new GeoJSON(); - const newGeojson = geojsonFormat.writeFeature(feature,{ dataProjection: 'EPSG:4326', featureProjection: 'EPSG:3857'}); - - // Call your function here with the GeoJSON as an argument - onDraw(newGeojson); - // var geoJSONFormat = new GeoJSON(); - - // var geoJSONString = geoJSONFormat.writeFeatures(vectorLayer.getSource().getFeatures(),{ dataProjection: 'EPSG:4326', featureProjection: 'EPSG:3857'}); - // console.log(geoJSONString,'geojsonString'); - // onDraw(geoJSONString); - }); - map.addInteraction(draw); - - return () => { - map.removeInteraction(draw) - } - }, [map,vectorLayer,onDraw]) - - - useEffect(() => { - if (!map) return; - if (!geojson) return; - - const vectorLyr = new OLVectorLayer({ - source: new VectorSource({ - features: new GeoJSON().readFeatures(geojson, { - featureProjection: get('EPSG:3857'), - }), - }), - declutter: true, - }); - map.on('click', (evt) => { - var pixel = evt.pixel; - const feature = map.forEachFeatureAtPixel(pixel, function(feature, layer) { - - if (layer === vectorLyr) { - return feature; - } - }); - - // Perform an action if a feature is found - if (feature) { - // Do something with the feature - console.log('Clicked feature:', feature.getProperties()); - // dispatch() - mapOnClick(feature.getProperties()); - } - }); - setVectorLayer(vectorLyr); - }, [map, geojson]); - - useEffect(() => { - if (!map || !vectorLayer) return; - if (visibleOnMap) { - map.addLayer(vectorLayer); - } else { - map.removeLayer(vectorLayer); - } - }, [map, vectorLayer, visibleOnMap]); - - useEffect(() => { - if (!map || !vectorLayer || !visibleOnMap || !setStyle) return; - vectorLayer.setStyle(setStyle); - }, [map, setStyle, vectorLayer, visibleOnMap]); - - - useEffect(() => { - if (!vectorLayer || !style.visibleOnMap) return; - vectorLayer.setStyle((feature, resolution) => getStyles({ style, feature, resolution })); - }, [vectorLayer, style]); - - useEffect(() => { - if (!vectorLayer) return; - vectorLayer.setZIndex(zIndex); - }, [vectorLayer, zIndex]); - - useEffect(() => { - if (!map || !vectorLayer || !zoomToLayer) return; - const extent = vectorLayer.getSource().getExtent(); - if (!isExtentValid(extent)) return; - map.getView().fit(extent, viewProperties); - }, [map, vectorLayer, zoomToLayer]); - - // set properties to features for identifying popup - useEffect(() => { - if (!vectorLayer || !properties) return; - const features = vectorLayer.getSource().getFeatures(); - features.forEach((feat) => { - feat.setProperties(properties); - }); - }, [vectorLayer, properties]); - - - -// style on hover -useEffect(() => { - if (!map) return null; - if (!vectorLayer) return null; - if (!hoverEffect) return null; - const selectionLayer = new OLVectorLayer({ - map, - renderMode: 'vector', - source: vectorLayer.getSource(), - // eslint-disable-next-line consistent-return - style: (feature) => { - if (feature.getId() in selection) { - return selectedCountry; - } - // return stylex; - }, - }); - function pointerMovefn(event) { - vectorLayer.getFeatures(event.pixel).then((features) => { - if (!features.length) { - selection = {}; - selectionLayer.changed(); - return; - } - const feature = features[0]; - if (!feature) { - return; - } - const fid = feature.getId(); - if (selectElement.startsWith('singleselect')) { - selection = {}; - } - // add selected feature to lookup - selection[fid] = feature; - - selectionLayer.changed(); - }); - } - map.on('pointermove', pointerMovefn); - return () => { - map.un('pointermove', pointerMovefn); - }; -}, [vectorLayer]); - return null; -}; - - - - - -VectorLayer.defaultProps = { - zIndex: 0, - style: { ...defaultStyles }, - zoomToLayer: false, - viewProperties: layerViewProperties, - mapOnClick:()=>{}, - onModify:null, -}; - -VectorLayer.propTypes = { - geojson: PropTypes.object.isRequired, - style: PropTypes.object, - zIndex: PropTypes.number, - zoomToLayer: PropTypes.bool, - viewProperties: PropTypes.object, - mapOnClick:PropTypes.func, - onModify:PropTypes.func, - // Context: PropTypes.object.isRequired, -}; - -export default VectorLayer; diff --git a/src/frontend/fmtm_openlayer_map/src/components/MapComponent/OpenLayersComponent/Layers/VectorTileLayer.js b/src/frontend/fmtm_openlayer_map/src/components/MapComponent/OpenLayersComponent/Layers/VectorTileLayer.js deleted file mode 100644 index bd4afdeaa4..0000000000 --- a/src/frontend/fmtm_openlayer_map/src/components/MapComponent/OpenLayersComponent/Layers/VectorTileLayer.js +++ /dev/null @@ -1,215 +0,0 @@ -import React,{ useEffect, useMemo } from 'react'; -// import * as olExtent from 'ol/extent'; -import VectorTile from 'ol/layer/VectorTile'; -import MVT from 'ol/format/MVT'; -import VectorTileSource from 'ol/source/VectorTile'; -import { transformExtent } from 'ol/proj'; -import Stroke from 'ol/style/Stroke'; -import Style from 'ol/style/Style'; -import { getStyles, defaultStyles } from '../helpers/styleUtils'; -import { isExtentValid } from '../helpers/layerUtils'; - -const selectElement = 'singleselect'; - -const selectedCountry = new Style({ - stroke: new Stroke({ - color: 'rgba(255,255,255,0.8)', - width: 3, - }), - // fill: new Fill({ - // color: 'rgba(200,20,20,0.4)', - // }), -}); -let selection = {}; -const VectorTileLayer = ({ - map, - url, - style = { ...defaultStyles }, - zIndex = 1, - visibleOnMap = true, - authToken, - setStyle, - zoomToLayer = false, - bbox = null, - hoverEffect, - // properties, -}) => { - const vectorTileLayer = useMemo( - () => - new VectorTile({ - renderMode: 'hybrid', - // declutter: true, - }), - [], - ); - - vectorTileLayer.setProperties({ name: 'site' }); - - // add source to layer - useEffect(() => { - if (!map) return; - - const requestHeader = new Headers(); - if (authToken) { - requestHeader.append('Authorization', `Token ${authToken}`); - } - - const vectorTileSource = new VectorTileSource({ - // format: new MVT({ featureClass: Feature }), - format: new MVT({ idProperty: 'id' }), - maxZoom: 19, - url, - transition: 0, - - tileLoadFunction: (tile, vtUrl) => { - tile.setLoader((extent, resolution, projection) => { - fetch(vtUrl, { - headers: requestHeader, - }).then((response) => { - response.arrayBuffer().then((data) => { - const format = tile.getFormat(); - const features = format.readFeatures(data, { - extent, - featureProjection: projection, - }); - tile.setFeatures(features); - }); - }); - }); - }, - }); - vectorTileLayer.setSource(vectorTileSource); - }, [map, url, authToken, vectorTileLayer]); - - // add layer to map - useEffect(() => { - if (!map) return; - if (visibleOnMap) { - map.addLayer(vectorTileLayer); - } else { - map.removeLayer(vectorTileLayer); - } - }, [map, visibleOnMap, vectorTileLayer]); - - // // set style - useEffect(() => { - if (!map || !visibleOnMap || !setStyle) return; - vectorTileLayer.setStyle(setStyle); - }, [map, setStyle, vectorTileLayer, visibleOnMap]); - - // set style - useEffect(() => { - if (!map || !visibleOnMap || setStyle) return; - vectorTileLayer.setStyle((feature, resolution) => getStyles({ style, feature, resolution })); - }, [map, style, vectorTileLayer, visibleOnMap, setStyle]); - - // set z-index - useEffect(() => { - if (!map) return; - vectorTileLayer.setZIndex(zIndex); - }, [map, zIndex, vectorTileLayer]); - - // // set properties to features for identifying popup - // useEffect(() => { - // if (!vectorTileLayer || !properties) return; - // vectorTileLayer.getSource().on('tileloadend', (evt) => { - // // const z = evt.tile.getTileCoord()[0]; - // const features = evt.tile.getFeatures(); - // features.forEach((feat) => { - // feat.setProperties(properties); - // }); - // }); - // // // console.log(vectorTileLayer.getSource(), 'sourcex'); - // // const features = vectorTileLayer.getSource().getFeatures(); - // // features.forEach((feat) => { - // // feat.setProperties(properties); - // // }); - // }, [vectorTileLayer, properties]); - - // useEffect(() => { - // const featuresForZ = []; - // vectorTileLayer.getSource().on('tileloadend', evt => { - // const z = evt.tile.getTileCoord()[0]; - // const feature = evt.tile.getFeatures(); - // if (!Array.isArray(featuresForZ[z])) { - // featuresForZ[z] = []; - // } - // featuresForZ[z] = featuresForZ[z].concat(feature); - // }); - // setFeatures(featuresForZ); - // }, []); - - // useEffect(() => { - // if (!map) return; - // const extent = olExtent.createEmpty(); - // if (isExtentValid(extent)) { - // map.getView().fit(extent, { - // padding: [50, 50, 50, 50], - // duration: 500, - // constrainResolution: true, - // }); - // } - // }, [map]); - - // style on hover - useEffect(() => { - if (!map) return null; - if (!hoverEffect) return null; - const selectionLayer = new VectorTile({ - map, - renderMode: 'vector', - source: vectorTileLayer.getSource(), - // eslint-disable-next-line consistent-return - style: (feature) => { - if (feature.getId() in selection) { - return selectedCountry; - } - // return stylex; - }, - }); - function pointerMovefn(event) { - vectorTileLayer.getFeatures(event.pixel).then((features) => { - if (!features.length) { - selection = {}; - selectionLayer.changed(); - return; - } - const feature = features[0]; - if (!feature) { - return; - } - const fid = feature.getId(); - if (selectElement.startsWith('singleselect')) { - selection = {}; - } - // add selected feature to lookup - selection[fid] = feature; - - selectionLayer.changed(); - }); - } - map.on('pointermove', pointerMovefn); - return () => { - map.un('pointermove', pointerMovefn); - }; - }, [vectorTileLayer]); - - // zoom to layer - useEffect(() => { - if (!map || !vectorTileLayer || !zoomToLayer || !bbox) return; - const transformedExtent = transformExtent(bbox, 'EPSG:4326', 'EPSG:3857'); - if (!isExtentValid(transformedExtent)) return; - map.getView().fit(transformedExtent, { - padding: [50, 50, 50, 50], - duration: 900, - constrainResolution: true, - }); - }, [map, vectorTileLayer, zoomToLayer, bbox]); - - // cleanup - useEffect(() => () => map && map.removeLayer(vectorTileLayer), [map, vectorTileLayer]); - - return null; -}; - -export default VectorTileLayer; diff --git a/src/frontend/fmtm_openlayer_map/src/components/MapComponent/OpenLayersComponent/Layers/index.js b/src/frontend/fmtm_openlayer_map/src/components/MapComponent/OpenLayersComponent/Layers/index.js deleted file mode 100644 index 8292e0e2a4..0000000000 --- a/src/frontend/fmtm_openlayer_map/src/components/MapComponent/OpenLayersComponent/Layers/index.js +++ /dev/null @@ -1,3 +0,0 @@ -export { default as VectorTileLayer } from './VectorTileLayer'; - -export { default as VectorLayer } from './VectorLayer'; diff --git a/src/frontend/fmtm_openlayer_map/src/components/MapComponent/OpenLayersComponent/MapContainer/index.jsx b/src/frontend/fmtm_openlayer_map/src/components/MapComponent/OpenLayersComponent/MapContainer/index.jsx deleted file mode 100644 index b7abafa404..0000000000 --- a/src/frontend/fmtm_openlayer_map/src/components/MapComponent/OpenLayersComponent/MapContainer/index.jsx +++ /dev/null @@ -1,37 +0,0 @@ -/* eslint-disable no-nested-ternary */ -/* eslint-disable react/jsx-props-no-spreading */ -/* eslint-disable react/jsx-no-useless-fragment */ -import React from 'react'; -import PropTypes from 'prop-types'; -import '../map.scss'; - -const { Children, cloneElement, forwardRef } = React; - -const MapContainer = forwardRef(({ children, mapInstance, ...rest }, ref) => { - const childrenCount = Children.count(children); - const props = { - map: mapInstance, - }; - return ( -
- {childrenCount < 1 ? ( - <> - ) : childrenCount > 1 ? ( - Children.map(children, (child) => (child ? cloneElement(child, { ...props }) : <>)) - ) : ( - cloneElement(children, { ...props }) - )} -
- ); -}); - -MapContainer.defaultProps = { - mapInstance: null, -}; - -MapContainer.propTypes = { - children: PropTypes.node.isRequired, - mapInstance: PropTypes.oneOfType([PropTypes.object, PropTypes.number]), -}; - -export default MapContainer; diff --git a/src/frontend/fmtm_openlayer_map/src/components/MapComponent/OpenLayersComponent/Popup/index.jsx b/src/frontend/fmtm_openlayer_map/src/components/MapComponent/OpenLayersComponent/Popup/index.jsx deleted file mode 100644 index 9457978187..0000000000 --- a/src/frontend/fmtm_openlayer_map/src/components/MapComponent/OpenLayersComponent/Popup/index.jsx +++ /dev/null @@ -1,72 +0,0 @@ -/* eslint-disable react/prop-types */ -/* eslint-disable jsx-a11y/anchor-has-content */ -/* eslint-disable func-names */ -/* eslint-disable jsx-a11y/control-has-associated-label */ -import React, { useEffect } from 'react'; -import Overlay from 'ol/Overlay'; -import './popup.scss'; - -const Popup = ({ map, except }) => { - useEffect(() => { - if (!map) return; - - const container = document.getElementById('popup'); - const content = document.getElementById('popup-content'); - const closer = document.getElementById('popup-closer'); - - const overlay = new Overlay({ - element: container, - autoPan: true, - autoPanAnimation: { - duration: 250, - }, - }); - - closer.onclick = function () { - overlay.setPosition(undefined); - closer.blur(); - return false; - }; - - map.on('singleclick', (evt) => { - const { coordinate } = evt; - const features = map.getFeaturesAtPixel(evt.pixel); - if (features.length < 1) { - overlay.setPosition(undefined); - closer.blur(); - content.innerHTML = ''; - return; - } - const properties = features[0].getProperties(); - const { layerId } = properties; - if (layerId === except) { - overlay.setPosition(undefined); - closer.blur(); - return; - } - content.innerHTML = ` - ${Object.keys(properties).reduce( - (str, key) => - `${str} - - - - `, - '', - )} -
${key}${properties[key]} -
`; - overlay.setPosition(coordinate); - map.addOverlay(overlay); - }); - }, [map]); - - return ( - }> - - - ), - }, - ], - }, -]); - -export default routes; diff --git a/src/frontend/fmtm_openlayer_map/src/utilities/BasicDialog.jsx b/src/frontend/fmtm_openlayer_map/src/utilities/BasicDialog.jsx deleted file mode 100755 index 29e7c19831..0000000000 --- a/src/frontend/fmtm_openlayer_map/src/utilities/BasicDialog.jsx +++ /dev/null @@ -1,48 +0,0 @@ -import * as React from 'react'; -import CoreModules from 'fmtm/CoreModules'; -import AssetModules from 'fmtm/AssetModules'; -export default function BasicDialog({ open, actions, title, onClose, subtitle }) { - - return ( - - - - - - - - {title != undefined ? - - - {title} - - - : null} - {subtitle != undefined ? - - - {subtitle} - - - : null} - - - {actions} - - - ); -} diff --git a/src/frontend/fmtm_openlayer_map/src/utilities/IconButtonCard.jsx b/src/frontend/fmtm_openlayer_map/src/utilities/IconButtonCard.jsx deleted file mode 100755 index 87913c213b..0000000000 --- a/src/frontend/fmtm_openlayer_map/src/utilities/IconButtonCard.jsx +++ /dev/null @@ -1,17 +0,0 @@ -import React from 'react' -import CoreModules from 'fmtm/CoreModules'; -export default function IconButtonCard({ element, style, radius }) { - return ( - - - {element} - - ) -} diff --git a/src/frontend/fmtm_openlayer_map/src/views/MainView.jsx b/src/frontend/fmtm_openlayer_map/src/views/MainView.jsx deleted file mode 100755 index 0be7f9b764..0000000000 --- a/src/frontend/fmtm_openlayer_map/src/views/MainView.jsx +++ /dev/null @@ -1,29 +0,0 @@ -import React, { Suspense } from "react"; -import WindowDimension from "fmtm/WindowDimension"; -import CoreModules from "fmtm/CoreModules"; -export default function MainView() { - const { windowSize } = WindowDimension(); - const getTheme = CoreModules.useAppSelector((state) => state.theme.hotTheme); - const theme = CoreModules.createTheme(getTheme); - const PrimaryAppBar = React.lazy(() => import("fmtm/PrimaryAppBar")); - return ( - - - - - - }> - - - - - {/* Footer */} - - - - - - ); -} diff --git a/src/frontend/fmtm_openlayer_map/tsconfig.json b/src/frontend/fmtm_openlayer_map/tsconfig.json deleted file mode 100644 index fc60518219..0000000000 --- a/src/frontend/fmtm_openlayer_map/tsconfig.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "compilerOptions": { - "target": "ESNext", - "useDefineForClassFields": true, - "lib": [ - "DOM", - "DOM.Iterable", - "ESNext" - ], - "allowJs": false, - "checkJs": false, - "skipLibCheck": true, - "esModuleInterop": false, - "allowSyntheticDefaultImports": true, - "strict": true, - "forceConsistentCasingInFileNames": true, - "module": "ESNext", - "moduleResolution": "Node", - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx", - "baseUrl": "./src/", - "noImplicitAny": false, - "strictNullChecks": true, - "strictFunctionTypes": true, - "noImplicitThis": true, - "strictBindCallApply": true, - "noImplicitReturns": true, - "strictPropertyInitialization": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - }, - "include": [ - ".eslintrc.cjs", - "src", - "src/**/*.ts" - ], - "exclude": [ - "node_modules", - "dist" - ], -} \ No newline at end of file diff --git a/src/frontend/fmtm_openlayer_map/webpack.config.js b/src/frontend/fmtm_openlayer_map/webpack.config.js deleted file mode 100755 index 451ba4c708..0000000000 --- a/src/frontend/fmtm_openlayer_map/webpack.config.js +++ /dev/null @@ -1,175 +0,0 @@ -const { EnvironmentPlugin } = require("webpack"); -const HtmlWebPackPlugin = require("html-webpack-plugin"); -const ModuleFederationPlugin = require("webpack/lib/container/ModuleFederationPlugin"); -// const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; -const CssMinimizerPlugin = require("css-minimizer-webpack-plugin"); -const TerserPlugin = require("terser-webpack-plugin"); -const path = require("path"); -const deps = require("./package.json").dependencies; -module.exports = (webpackEnv) => { - const isEnvDevelopment = webpackEnv === "development"; - const isEnvProduction = webpackEnv === "production"; - return { - stats: "errors-warnings", - cache: true, - mode: isEnvProduction ? "production" : isEnvDevelopment && "development", - // Stop compilation early in production - // bail: isEnvProduction, - devtool: isEnvProduction - ? "source-map" - : isEnvDevelopment && "eval-source-map", - output: { - publicPath: `${process.env.FRONTEND_MAP_URL}/`, - path: path.resolve(__dirname, "dist"), - filename: "[name].[contenthash].bundle.js", - clean: true, - }, - resolve: { - extensions: [".tsx", ".ts", ".jsx", ".js", ".json"], - }, - - devServer: { - host: "0.0.0.0", - port: `${new URL(process.env.FRONTEND_MAP_URL).port}`, - historyApiFallback: true, - allowedHosts: [`${process.env.FRONTEND_MAP_URL}`], - headers: { - "Access-Control-Allow-Origin": "*", - "Access-Control-Allow-Headers": - "Origin, X-Requested-With, Content-Type, Accept", - }, - }, - - module: { - rules: [ - { - test: [/\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/, /\.ttf$/, /\.otf$/], - type: "asset", - parser: { - dataUrlCondition: { - maxSize: 1000, - }, - }, - }, - { - test: /\.m?js/, - type: "javascript/auto", - resolve: { - fullySpecified: false, - }, - }, - { - test: /\.(css|s[ac]ss)$/i, - use: ["style-loader", "css-loader", "postcss-loader", "sass-loader"], - }, - { - test: /\.(ts|tsx|js|jsx)$/, - exclude: /node_modules/, - use: { - loader: "babel-loader", - }, - }, - ], - }, - optimization: { - minimize: isEnvProduction, - minimizer: [ - // This is only used in production mode - new TerserPlugin({ - terserOptions: { - terserOptions: { - parse: { - // We want terser to parse ecma 8 code. However, we don't want it - // to apply minification steps that turns valid ecma 5 code - // into invalid ecma 5 code. This is why the `compress` and `output` - ecma: 8, - }, - compress: { - ecma: 5, - warning: false, - inline: 2, - }, - mangle: { - // Find work around for Safari 10+ - safari10: true, - }, - output: { - ecma: 5, - comments: false, - ascii__only: true, - }, - }, - - // Use multi-process parallel running to improve the build speed - parallel: true, - - // Enable file caching - cache: true, - }, - }), - // This is only used in production mode - new CssMinimizerPlugin(), - ], - }, - plugins: [ - // new BundleAnalyzerPlugin(), - new ModuleFederationPlugin({ - name: "fmtm_openlayer_map", - filename: "remoteEntry.js", - remotes: { - fmtm: `fmtm@${process.env.FRONTEND_MAIN_URL}/remoteEntry.js`, - }, - exposes: { - "./ProjectDetails": "./src/views/Home.jsx", - "./Submissions": "./src/views/Submissions.jsx", - "./DefineAreaMap": "./src/views/DefineAreaMap.jsx", - "./EditProjectArea": "./src/views/EditProjectArea.jsx", - "./Tasks": "./src/views/Tasks.jsx", - "./ProjectInfo": "./src/views/ProjectInfo.jsx", - }, - shared: { - ...deps, - react: { - singleton: true, - requiredVersion: deps.react, - }, - "react-dom": { - singleton: true, - requiredVersion: deps["react-dom"], - }, - "react-redux": { - singleton: true, - version: deps["react-router-dom"], - }, - }, - }), - new HtmlWebPackPlugin( - Object.assign( - {}, - { - inject: true, - template: "./src/index.html", - }, - // Only for production - isEnvProduction - ? { - minify: { - removeComments: true, - collapseWhitespace: true, - removeRedundantAttributes: true, - useShortDoctype: true, - removeEmptyAttributes: true, - removeStyleLinkTypeAttributes: true, - keepClosingSlash: true, - minifyJS: true, - minifyCSS: true, - minifyURLs: true, - }, - } - : undefined - ) - ), - new EnvironmentPlugin(["FRONTEND_MAIN_URL", "FRONTEND_MAP_URL"]), - ], - }; -}; diff --git a/src/frontend/fmtm_openlayer_map/src/api/Files.js b/src/frontend/main/src/api/Files.js similarity index 72% rename from src/frontend/fmtm_openlayer_map/src/api/Files.js rename to src/frontend/main/src/api/Files.js index fcfb9fada0..4abf293525 100755 --- a/src/frontend/fmtm_openlayer_map/src/api/Files.js +++ b/src/frontend/main/src/api/Files.js @@ -1,9 +1,9 @@ -import React,{ useEffect, useState } from "react"; -import CoreModules from "fmtm/CoreModules"; - +import React, { useEffect, useState } from 'react'; +import CoreModules from '../shared/CoreModules'; + export const ProjectFilesById = (url, taskId) => { const [loading, setLoading] = useState(true); - const [qrcode, setQrcode] = useState(""); + const [qrcode, setQrcode] = useState(''); const source = CoreModules.axios.CancelToken.source(); useEffect(() => { const fetchProjectFileById = async (url) => { @@ -13,9 +13,7 @@ export const ProjectFilesById = (url, taskId) => { cancelToken: source.token, }); const resp = fileJson.data; - const taskIndex = resp.project_tasks.findIndex( - (task) => task.id == taskId - ); + const taskIndex = resp.project_tasks.findIndex((task) => task.id == taskId); const getQrcodeByIndex = resp.project_tasks[taskIndex].qr_code_base64; setQrcode(getQrcodeByIndex); setLoading(false); @@ -28,9 +26,9 @@ export const ProjectFilesById = (url, taskId) => { const cleanUp = () => { setLoading(false); - setQrcode(""); + setQrcode(''); if (source) { - source.cancel("component unmounted"); + source.cancel('component unmounted'); } }; diff --git a/src/frontend/main/src/api/Project.js b/src/frontend/main/src/api/Project.js new file mode 100755 index 0000000000..2c29146b69 --- /dev/null +++ b/src/frontend/main/src/api/Project.js @@ -0,0 +1,177 @@ +import { ProjectActions } from '../store/slices/ProjectSlice'; +import CoreModules from '../shared/CoreModules'; +import environment from '../environment'; +export const ProjectById = (url, existingProjectList, projectId) => { + return async (dispatch) => { + // dispatch(HomeActions.HomeProjectLoading(true)) + const fetchProjectById = async (url, existingProjectList) => { + try { + const project = await CoreModules.axios.get(url); + const taskBbox = await CoreModules.axios.get( + `${environment.baseApiUrl}/tasks/point_on_surface?project_id=${projectId}`, + ); + const resp = project.data; + const persistingValues = resp.project_tasks.map((data) => { + return { + id: data.id, + project_task_name: data.project_task_name, + task_status_str: data.task_status_str, + outline_geojson: data.outline_geojson, + outline_centroid: data.outline_centroid, + task_history: data.task_history, + locked_by_uid: data.locked_by_uid, + locked_by_username: data.locked_by_username, + }; + }); + // added centroid from another api to projecttaskboundries + const projectTaskBoundries = [{ id: resp.id, taskBoundries: persistingValues }]; + const mergedBboxIntoTask = projectTaskBoundries[0].taskBoundries.map((projectTask) => { + const filteredTaskIdCentroid = taskBbox.data.find((task) => task.id === projectTask.id).point[0]; + return { + ...projectTask, + bbox: filteredTaskIdCentroid, + }; + }); + dispatch( + ProjectActions.SetProjectTaskBoundries([{ ...projectTaskBoundries[0], taskBoundries: mergedBboxIntoTask }]), + ); + dispatch( + ProjectActions.SetProjectInfo({ + id: resp.id, + outline_geojson: resp.outline_geojson, + priority: resp.priority || 2, + priority_str: resp.priority_str || 'MEDIUM', + title: resp.project_info?.[0]?.name, + location_str: resp.location_str, + description: resp.description, + num_contributors: resp.num_contributors, + total_tasks: resp.total_tasks, + tasks_mapped: resp.tasks_mapped, + tasks_validated: resp.tasks_validated, + xform_title: resp.xform_title, + tasks_bad: resp.tasks_bad, + }), + ); + } catch (error) { + // console.log('error :', error) + } + }; + + await fetchProjectById(url, existingProjectList); + dispatch(ProjectActions.SetNewProjectTrigger()); + }; +}; + +export const DownloadProjectForm = (url, payload) => { + return async (dispatch) => { + dispatch(ProjectActions.SetDownloadProjectFormLoading({ type: payload, loading: true })); + + const fetchProjectForm = async (url, payload) => { + try { + let response; + if (payload === 'form') { + response = await CoreModules.axios.get(url, { responseType: 'blob' }); + } else { + response = await CoreModules.axios.get(url, { + responseType: 'blob', + }); + } + const a = document.createElement('a'); + a.href = window.URL.createObjectURL(response.data); + a.download = `Project_form.${payload === 'form' ? '.xls' : '.geojson'}`; + a.click(); + dispatch(ProjectActions.SetDownloadProjectFormLoading({ type: payload, loading: false })); + } catch (error) { + dispatch(ProjectActions.SetDownloadProjectFormLoading({ type: payload, loading: false })); + } finally { + dispatch(ProjectActions.SetDownloadProjectFormLoading({ type: payload, loading: false })); + } + }; + await fetchProjectForm(url, payload); + }; +}; +export const DownloadDataExtract = (url, payload) => { + return async (dispatch) => { + dispatch(ProjectActions.SetDownloadDataExtractLoading(true)); + + const getDownloadExtract = async (url, payload) => { + try { + let response; + + response = await CoreModules.axios.get(url, { + responseType: 'blob', + }); + const a = document.createElement('a'); + a.href = window.URL.createObjectURL(response.data); + a.download = `Data_Extract.geojson`; + a.click(); + dispatch(ProjectActions.SetDownloadDataExtractLoading(false)); + } catch (error) { + dispatch(ProjectActions.SetDownloadDataExtractLoading(false)); + } finally { + dispatch(ProjectActions.SetDownloadDataExtractLoading(false)); + } + }; + await getDownloadExtract(url, payload); + }; +}; +export const GetTilesList = (url) => { + return async (dispatch) => { + dispatch(ProjectActions.SetTilesListLoading(true)); + + const fetchTilesList = async (url) => { + try { + const response = await CoreModules.axios.get(url); + dispatch(ProjectActions.SetTilesList(response.data)); + dispatch(ProjectActions.SetTilesListLoading(false)); + } catch (error) { + dispatch(ProjectActions.SetTilesListLoading(false)); + } finally { + dispatch(ProjectActions.SetTilesListLoading(false)); + } + }; + await fetchTilesList(url); + }; +}; +export const GenerateProjectTiles = (url, payload) => { + return async (dispatch) => { + dispatch(ProjectActions.SetGenerateProjectTilesLoading(true)); + + const generateProjectTiles = async (url, payload) => { + try { + const response = await CoreModules.axios.get(url); + dispatch(GetTilesList(`${environment.baseApiUrl}/projects/tiles_list/${payload}/`)); + dispatch(ProjectActions.SetGenerateProjectTilesLoading(false)); + } catch (error) { + dispatch(ProjectActions.SetGenerateProjectTilesLoading(false)); + } finally { + dispatch(ProjectActions.SetGenerateProjectTilesLoading(false)); + } + }; + await generateProjectTiles(url, payload); + }; +}; + +export const DownloadTile = (url, payload) => { + return async (dispatch) => { + dispatch(ProjectActions.SetDownloadTileLoading({ type: payload, loading: true })); + + const getDownloadTile = async (url, payload) => { + try { + const response = await CoreModules.axios.get(url, { + responseType: 'blob', + }); + var a = document.createElement('a'); + a.href = window.URL.createObjectURL(response.data); + a.download = `${payload.title}_mbtiles.mbtiles`; + a.click(); + dispatch(ProjectActions.SetDownloadTileLoading({ type: payload, loading: false })); + } catch (error) { + dispatch(ProjectActions.SetDownloadTileLoading({ type: payload, loading: false })); + } finally { + dispatch(ProjectActions.SetDownloadTileLoading({ type: payload, loading: false })); + } + }; + await getDownloadTile(url, payload); + }; +}; diff --git a/src/frontend/fmtm_openlayer_map/src/api/ProjectTaskStatus.js b/src/frontend/main/src/api/ProjectTaskStatus.js similarity index 65% rename from src/frontend/fmtm_openlayer_map/src/api/ProjectTaskStatus.js rename to src/frontend/main/src/api/ProjectTaskStatus.js index a55c9e92a2..27ae9a5a3e 100755 --- a/src/frontend/fmtm_openlayer_map/src/api/ProjectTaskStatus.js +++ b/src/frontend/main/src/api/ProjectTaskStatus.js @@ -1,31 +1,17 @@ -import { ProjectActions } from "fmtm/ProjectSlice"; -import { easeIn, easeOut } from "ol/easing"; -import { HomeActions } from "fmtm/HomeSlice"; -import CoreModules from "fmtm/CoreModules"; -import { CommonActions } from "fmtm/CommonSlice"; -const UpdateTaskStatus = ( - url, - style, - existingData, - currentProjectId, - feature, - map, - view, - taskId, - body -) => { +import { ProjectActions } from '../store/slices/ProjectSlice'; +import { easeIn, easeOut } from 'ol/easing'; +import { HomeActions } from '../store/slices/HomeSlice'; +import CoreModules from '../shared/CoreModules'; +import { CommonActions } from '../store/slices/CommonSlice'; +const UpdateTaskStatus = (url, style, existingData, currentProjectId, feature, map, view, taskId, body) => { return async (dispatch) => { - const index = existingData.findIndex( - (project) => project.id == currentProjectId - ); + const index = existingData.findIndex((project) => project.id == currentProjectId); const updateTask = async (url, existingData, body, feature) => { try { dispatch(CommonActions.SetLoading(true)); const response = await CoreModules.axios.post(url, body); - const findIndexForUpdation = existingData[ - index - ].taskBoundries.findIndex((obj) => obj.id == response.data.id); + const findIndexForUpdation = existingData[index].taskBoundries.findIndex((obj) => obj.id == response.data.id); let project_tasks = [...existingData[index].taskBoundries]; project_tasks[findIndexForUpdation] = { ...response.data }; @@ -45,9 +31,9 @@ const UpdateTaskStatus = ( HomeActions.SetSnackBar({ open: true, message: `Task #${response.data.id} has been updated to ${response.data.task_status_str}`, - variant: "success", + variant: 'success', duration: 3000, - }) + }), ); } catch (error) { dispatch(CommonActions.SetLoading(false)); @@ -55,13 +41,13 @@ const UpdateTaskStatus = ( HomeActions.SetSnackBar({ open: true, message: `Failed to update Task #${taskId}`, - variant: "error", + variant: 'error', duration: 4000, - }) + }), ); } }; - await updateTask(url, existingData, body,feature); + await updateTask(url, existingData, body, feature); const centroid = await existingData[index].taskBoundries.filter((task) => { return task.id == taskId; })[0].outline_centroid.geometry.coordinates; diff --git a/src/frontend/main/src/api/SubmissionService.ts b/src/frontend/main/src/api/SubmissionService.ts new file mode 100644 index 0000000000..66aedadc34 --- /dev/null +++ b/src/frontend/main/src/api/SubmissionService.ts @@ -0,0 +1,40 @@ +import CoreModules from '../shared/CoreModules'; +import { ProjectActions } from '../store/slices/ProjectSlice'; +// import { HomeProjectCardModel } from '../models/home/homeModel'; + +export const ProjectSubmissionService: Function = (url: string) => { + return async (dispatch) => { + dispatch(ProjectActions.GetProjectSubmissionLoading(true)); + + const fetchProjectSubmission = async (url: string) => { + try { + const fetchSubmissionData = await CoreModules.axios.get(url); + const resp: any = fetchSubmissionData.data; + dispatch(ProjectActions.SetProjectSubmission(resp)); + dispatch(ProjectActions.GetProjectSubmissionLoading(false)); + } catch (error) { + dispatch(ProjectActions.GetProjectSubmissionLoading(false)); + } + }; + + await fetchProjectSubmission(url); + }; +}; +export const ProjectBuildingGeojsonService: Function = (url: string) => { + return async (dispatch) => { + dispatch(ProjectActions.GetProjectBuildingGeojsonLoading(true)); + + const fetchProjectBuildingGeojson = async (url: string) => { + try { + const fetchBuildingGeojsonData = await CoreModules.axios.get(url); + const resp: any = fetchBuildingGeojsonData.data; + dispatch(ProjectActions.SetProjectBuildingGeojson(resp)); + dispatch(ProjectActions.GetProjectBuildingGeojsonLoading(false)); + } catch (error) { + dispatch(ProjectActions.GetProjectBuildingGeojsonLoading(false)); + } + }; + + await fetchProjectBuildingGeojson(url); + }; +}; diff --git a/src/frontend/fmtm_openlayer_map/src/api/task.ts b/src/frontend/main/src/api/task.ts similarity index 80% rename from src/frontend/fmtm_openlayer_map/src/api/task.ts rename to src/frontend/main/src/api/task.ts index 7dae92b115..787d8b3f06 100644 --- a/src/frontend/fmtm_openlayer_map/src/api/task.ts +++ b/src/frontend/main/src/api/task.ts @@ -1,5 +1,5 @@ -import CoreModules from "fmtm/CoreModules"; -import { CommonActions } from "fmtm/CommonSlice"; +import CoreModules from '../shared/CoreModules'; +import { CommonActions } from '../store/slices/CommonSlice'; export const fetchInfoTask: Function = (url: string) => { return async (dispatch) => { @@ -23,44 +23,44 @@ export const fetchInfoTask: Function = (url: string) => { export const getDownloadProjectSubmission: Function = (url: string) => { return async (dispatch) => { - const params = new URLSearchParams(url.split("?")[1]); - const isExportJson = params.get("export_json"); - const isJsonOrCsv = isExportJson === "true" ? "json" : "csv"; + const params = new URLSearchParams(url.split('?')[1]); + const isExportJson = params.get('export_json'); + const isJsonOrCsv = isExportJson === 'true' ? 'json' : 'csv'; dispatch( CoreModules.TaskActions.GetDownloadProjectSubmissionLoading({ type: isJsonOrCsv, loading: true, - }) + }), ); const getProjectSubmission = async (url: string) => { try { const response = await CoreModules.axios.get(url, { - responseType: "blob", + responseType: 'blob', }); - var a = document.createElement("a"); + var a = document.createElement('a'); a.href = window.URL.createObjectURL(response.data); - a.download = "Submissions"; + a.download = 'Submissions'; a.click(); dispatch( CoreModules.TaskActions.GetDownloadProjectSubmissionLoading({ type: isJsonOrCsv, loading: false, - }) + }), ); } catch (error) { dispatch( CoreModules.TaskActions.GetDownloadProjectSubmissionLoading({ type: isJsonOrCsv, loading: false, - }) + }), ); } finally { dispatch( CoreModules.TaskActions.GetDownloadProjectSubmissionLoading({ type: isJsonOrCsv, loading: false, - }) + }), ); } }; @@ -74,12 +74,12 @@ export const fetchConvertToOsmDetails: Function = (url: string) => { try { const response = await CoreModules.axios.get(url, { - responseType: "blob", + responseType: 'blob', }); - const downloadLink = document.createElement("a"); + const downloadLink = document.createElement('a'); downloadLink.href = window.URL.createObjectURL(new Blob([response.data])); - downloadLink.setAttribute("download", "task.zip"); + downloadLink.setAttribute('download', 'task.zip'); document.body.appendChild(downloadLink); downloadLink.click(); @@ -100,12 +100,10 @@ export const ConvertXMLToJOSM: Function = (url: string, projectBbox) => { const getConvertXMLToJOSM = async (url) => { try { // checkJOSMOpen - To check if JOSM Editor is Open Or Not. - await CoreModules.axios.get( - `http://127.0.0.1:8111/version?jsonp=checkJOSM` - ); + await CoreModules.axios.get(`http://127.0.0.1:8111/version?jsonp=checkJOSM`); //importToJosmEditor - To open JOSM Editor and add XML of Project Submission To JOSM. CoreModules.axios.get( - `http://127.0.0.1:8111/imagery?title=osm&type=tms&url=https://tile.openstreetmap.org/%7Bzoom%7D/%7Bx%7D/%7By%7D.png` + `http://127.0.0.1:8111/imagery?title=osm&type=tms&url=https://tile.openstreetmap.org/%7Bzoom%7D/%7Bx%7D/%7By%7D.png`, ); await CoreModules.axios.get(`http://127.0.0.1:8111/import?url=${url}`); // `http://127.0.0.1:8111/load_and_zoom?left=80.0580&right=88.2015&top=27.9268&bottom=26.3470`; @@ -115,16 +113,16 @@ export const ConvertXMLToJOSM: Function = (url: string, projectBbox) => { bottom: projectBbox[1], right: projectBbox[2], top: projectBbox[3], - changeset_comment: "fmtm", + changeset_comment: 'fmtm', // changeset_source: project.imagery ? project.imagery : '', - new_layer: "true", - layer_name: "OSM Data", + new_layer: 'true', + layer_name: 'OSM Data', }; await CoreModules.axios.get(`http://127.0.0.1:8111/zoom`, { params: loadAndZoomParams, }); } catch (error: any) { - dispatch(CoreModules.TaskActions.SetJosmEditorError("JOSM Error")); + dispatch(CoreModules.TaskActions.SetJosmEditorError('JOSM Error')); // alert(error.response.data); dispatch(CoreModules.TaskActions.SetConvertXMLToJOSMLoading(false)); } finally { diff --git a/src/frontend/fmtm_openlayer_map/src/assets/images/acc-down.png b/src/frontend/main/src/assets/images/acc-down.png similarity index 100% rename from src/frontend/fmtm_openlayer_map/src/assets/images/acc-down.png rename to src/frontend/main/src/assets/images/acc-down.png diff --git a/src/frontend/fmtm_openlayer_map/src/assets/images/acc-up.png b/src/frontend/main/src/assets/images/acc-up.png similarity index 100% rename from src/frontend/fmtm_openlayer_map/src/assets/images/acc-up.png rename to src/frontend/main/src/assets/images/acc-up.png diff --git a/src/frontend/fmtm_openlayer_map/src/assets/images/avatar.png b/src/frontend/main/src/assets/images/avatar.png similarity index 100% rename from src/frontend/fmtm_openlayer_map/src/assets/images/avatar.png rename to src/frontend/main/src/assets/images/avatar.png diff --git a/src/frontend/fmtm_openlayer_map/src/assets/images/grid.png b/src/frontend/main/src/assets/images/grid.png similarity index 100% rename from src/frontend/fmtm_openlayer_map/src/assets/images/grid.png rename to src/frontend/main/src/assets/images/grid.png diff --git a/src/frontend/fmtm_openlayer_map/src/assets/images/location.png b/src/frontend/main/src/assets/images/location.png similarity index 100% rename from src/frontend/fmtm_openlayer_map/src/assets/images/location.png rename to src/frontend/main/src/assets/images/location.png diff --git a/src/frontend/main/src/components/Activities.jsx b/src/frontend/main/src/components/Activities.jsx new file mode 100755 index 0000000000..85cf1d8606 --- /dev/null +++ b/src/frontend/main/src/components/Activities.jsx @@ -0,0 +1,67 @@ +import React from 'react'; +import IconButtonCard from '../utilities/IconButtonCard'; +import environment from '../environment'; +import { easeIn, easeOut } from 'ol/easing'; +import CoreModules from '../shared/CoreModules'; +import AssetModules from '../shared/AssetModules'; +//Activity Model to be display in Activities panel +const Activities = ({ history, defaultTheme, mapDivPostion, map, view, state, params }) => { + const index = state.projectTaskBoundries.findIndex((project) => project.id == environment.decode(params.id)); + + return ( + + + {`Task #${history.taskId}`} + + + + + + + + {history.action_text} + + + { + const main = document.getElementsByClassName('mainview')[0]; + await main.scrollTo({ + top: mapDivPostion, + }); + + const centroid = state.projectTaskBoundries[index].taskBoundries.filter((task) => { + return task.id == history.taskId; + })[0].outline_centroid.geometry.coordinates; + + map.getView().setCenter(centroid); + + setTimeout(() => { + view.animate({ zoom: 19, easing: easeOut, duration: 2000 }); + }, 100); + }} + color="info" + aria-label="share qrcode" + > + + + } + /> + + + + + + + + {history.action_date} + + + ); +}; +export default Activities; diff --git a/src/frontend/main/src/components/ActivitiesPanel.jsx b/src/frontend/main/src/components/ActivitiesPanel.jsx new file mode 100755 index 0000000000..f85cdfd6d7 --- /dev/null +++ b/src/frontend/main/src/components/ActivitiesPanel.jsx @@ -0,0 +1,182 @@ +import React, { useEffect, useState } from 'react'; +import BasicCard from '../utilities/BasicCard'; +import Activities from '../components/Activities'; +import environment from '../environment'; +import CoreModules from '../shared/CoreModules'; +import AssetModules from '../shared/AssetModules'; + +const Search = AssetModules.styled('div')(({ theme }) => ({ + position: 'relative', + borderRadius: theme.shape.borderRadius, + backgroundColor: AssetModules.alpha(theme.palette.common.white, 0.15), + '&:hover': { + backgroundColor: AssetModules.alpha(theme.palette.common.white, 0.25), + }, + marginRight: theme.spacing(2), + marginLeft: 0, + opacity: 0.8, + border: `1px solid ${theme.palette.warning['main']}`, + width: '100%', + [theme.breakpoints.up('sm')]: { + marginLeft: theme.spacing(3), + width: 'auto', + }, +})); + +const SearchIconWrapper = AssetModules.styled('div')(({ theme }) => ({ + padding: theme.spacing(0, 2), + height: '100%', + position: 'absolute', + pointerEvents: 'none', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', +})); + +const StyledInputBase = AssetModules.styled(CoreModules.InputBase)(({ theme }) => ({ + color: 'primary', + '& .MuiInputBase-input': { + padding: theme.spacing(1, 1, 1, 0), + fontFamily: theme.typography.h3.fontFamily, + // vertical padding + font size from searchIcon + paddingLeft: `calc(1em + ${theme.spacing(4)})`, + transition: theme.transitions.create('width'), + width: '100%', + // [theme.breakpoints.up('md')]: { + // width: '20ch', + // }, + }, +})); + +const ActivitiesPanel = ({ defaultTheme, state, params, map, view, mapDivPostion, states }) => { + const displayLimit = 10; + const [searchText, setSearchText] = useState(''); + const [taskHistories, setTaskHistories] = useState([]); + const [paginationSize, setPaginationSize] = useState(0); + const [taskDisplay, setTaskDisplay] = React.useState(displayLimit); + const [allActivities, setAllActivities] = useState(0); + const [prev, setPrv] = React.useState(0); + + const handleChange = (event, value) => { + setPrv(value * displayLimit - displayLimit); + setTaskDisplay(value * displayLimit); + }; + + const handleOnchange = (event) => { + setSearchText(event.target.value); + }; + + useEffect(() => { + const index = state.findIndex((project) => project.id == environment.decode(params.id)); + let taskHistories = []; + + if (index != -1) { + state[index].taskBoundries.forEach((task) => { + taskHistories = taskHistories.concat( + task.task_history.map((history) => { + return { ...history, taskId: task.id, status: task.task_status_str }; + }), + ); + }); + } + + let finalTaskHistory = taskHistories.filter((task) => { + return ( + task.taskId.toString().includes(searchText) || + task.action_text.split(':')[1].replace(/\s+/g, '').toString().includes(searchText.toString()) + ); + }); + + if (searchText != '') { + setAllActivities(finalTaskHistory.length); + const tasksToDisplay = finalTaskHistory.filter((task, index) => { + return index <= taskDisplay - 1 && index >= prev; + }); + setTaskHistories(tasksToDisplay); + const paginationSize = + finalTaskHistory.length % displayLimit == 0 + ? Math.floor(finalTaskHistory.length / displayLimit) + : Math.floor(finalTaskHistory.length / displayLimit) + 1; + setPaginationSize(paginationSize); + } else { + setAllActivities(taskHistories.length); + const tasksToDisplay = taskHistories.filter((task, index) => { + return index <= taskDisplay - 1 && index >= prev; + }); + + setTaskHistories(tasksToDisplay); + const paginationSize = + taskHistories.length % displayLimit == 0 + ? Math.floor(taskHistories.length / displayLimit) + : Math.floor(taskHistories.length / displayLimit) + 1; + setPaginationSize(paginationSize); + } + }, [taskDisplay, state, searchText]); + + return ( + + + {`Total Activities ${allActivities}`} + + + + + + + + + + + {allActivities === 0 && ( + + No Results found. + + )} + + {taskHistories.map((history, index) => ( + + + } + /> + + ))} + + + + + + + + ); +}; + +export default ActivitiesPanel; diff --git a/src/frontend/fmtm_openlayer_map/src/components/DialogTaskActions.jsx b/src/frontend/main/src/components/DialogTaskActions.jsx similarity index 68% rename from src/frontend/fmtm_openlayer_map/src/components/DialogTaskActions.jsx rename to src/frontend/main/src/components/DialogTaskActions.jsx index e858829cd7..44908ecebc 100755 --- a/src/frontend/fmtm_openlayer_map/src/components/DialogTaskActions.jsx +++ b/src/frontend/main/src/components/DialogTaskActions.jsx @@ -1,27 +1,23 @@ -import React, { useState, useEffect } from "react"; -import environment from "fmtm/environment"; -import ProjectTaskStatus from "../api/ProjectTaskStatus"; -import MapStyles from "../hooks/MapStyles"; -import CoreModules from "fmtm/CoreModules"; -import { CommonActions } from "fmtm/CommonSlice"; +import React, { useState, useEffect } from 'react'; +import environment from '../environment'; +import ProjectTaskStatus from '../api/ProjectTaskStatus'; +import MapStyles from '../hooks/MapStyles'; +import CoreModules from '../shared/CoreModules'; +import { CommonActions } from '../store/slices/CommonSlice'; export default function Dialog({ taskId, feature, map, view }) { // const featureStatus = feature.id_ != undefined ? feature.id_.replace("_", ",").split(',')[1] : null; - const projectData = CoreModules.useAppSelector( - (state) => state.project.projectTaskBoundries - ); + const projectData = CoreModules.useAppSelector((state) => state.project.projectTaskBoundries); const token = CoreModules.useAppSelector((state) => state.login.loginToken); const loading = CoreModules.useAppSelector((state) => state.common.loading); const [list_of_task_status, set_list_of_task_status] = useState([]); - const [task_status, set_task_status] = useState("READY"); + const [task_status, set_task_status] = useState('READY'); const geojsonStyles = MapStyles(); const dispatch = CoreModules.useAppDispatch(); const params = CoreModules.useParams(); const currentProjectId = environment.decode(params.id); const currentTaskId = environment.encode(taskId); - const projectIndex = projectData.findIndex( - (project) => project.id == currentProjectId - ); + const projectIndex = projectData.findIndex((project) => project.id == currentProjectId); const currentStatus = { ...projectData?.[projectIndex]?.taskBoundries?.filter((task) => { return task.id == taskId; @@ -36,17 +32,13 @@ export default function Dialog({ taskId, feature, map, view }) { })[0], }; const findCorrectTaskStatusIndex = environment.tasksStatus.findIndex( - (data) => data.label == currentStatus.task_status_str + (data) => data.label == currentStatus.task_status_str, ); const tasksStatus = - feature.id_ != undefined - ? environment.tasksStatus[findCorrectTaskStatusIndex]?.["label"] - : ""; + feature.id_ != undefined ? environment.tasksStatus[findCorrectTaskStatusIndex]?.['label'] : ''; set_task_status(tasksStatus); const tasksStatusList = - feature.id_ != undefined - ? environment.tasksStatus[findCorrectTaskStatusIndex]?.["action"] - : []; + feature.id_ != undefined ? environment.tasksStatus[findCorrectTaskStatusIndex]?.['action'] : []; set_list_of_task_status(tasksStatusList); } @@ -61,7 +53,7 @@ export default function Dialog({ taskId, feature, map, view }) { const body = token != null ? { ...token } : {}; const geoStyle = geojsonStyles[status]; if (event.target.id != undefined) { - if (body.hasOwnProperty("id")) { + if (body.hasOwnProperty('id')) { dispatch( ProjectTaskStatus( `${environment.baseApiUrl}/tasks/${taskId}/new_status/${status}`, @@ -72,53 +64,52 @@ export default function Dialog({ taskId, feature, map, view }) { map, view, taskId, - body - ) + body, + ), ); } else { dispatch( CommonActions.SetSnackBar({ open: true, - message: "Something is wrong with the user.", - variant: "error", + message: 'Something is wrong with the user.', + variant: 'error', duration: 2000, - }) + }), ); } } else { dispatch( CommonActions.SetSnackBar({ open: true, - message: "Oops!, Please try again.", - variant: "error", + message: 'Oops!, Please try again.', + variant: 'error', duration: 2000, - }) + }), ); } }; const checkIfTaskAssignedOrNot = - currentStatus?.locked_by_username === token?.username || - currentStatus?.locked_by_username === null; + currentStatus?.locked_by_username === token?.username || currentStatus?.locked_by_username === null; return ( - - - + + + {`Task : ${taskId}`} - + - {`STATUS : ${task_status?.toString()?.replaceAll("_", " ")}`} + {`STATUS : ${task_status?.toString()?.replaceAll('_', ' ')}`} { +const GenerateMbTiles = ({ setToggleGenerateModal, toggleGenerateModal, projectInfo }) => { const dispatch = CoreModules.useAppDispatch(); const params = CoreModules.useParams(); const encodedId = params.id; const decodedId = environment.decode(encodedId); - const defaultTheme = CoreModules.useAppSelector( - (state) => state.theme.hotTheme - ); - const generateProjectTilesLoading = CoreModules.useAppSelector( - (state) => state.project.generateProjectTilesLoading - ); - const tilesList = CoreModules.useAppSelector( - (state) => state.project.tilesList - ); + const defaultTheme = CoreModules.useAppSelector((state) => state.theme.hotTheme); + const generateProjectTilesLoading = CoreModules.useAppSelector((state) => state.project.generateProjectTilesLoading); + const tilesList = CoreModules.useAppSelector((state) => state.project.tilesList); const [selectedTileSource, setSelectedTileSource] = useState(null); const modalStyle = (theme) => ({ // width: "30%", // height: "24%", - bgcolor: theme.palette.mode === "dark" ? "#0A1929" : "white", - border: "1px solid ", - padding: "16px 32px 24px 32px", + bgcolor: theme.palette.mode === 'dark' ? '#0A1929' : 'white', + border: '1px solid ', + padding: '16px 32px 24px 32px', }); - console.log(projectInfo, "projectInfo"); + console.log(projectInfo, 'projectInfo'); const downloadMbTiles = (tileId) => { - dispatch( - DownloadTile( - `${environment.baseApiUrl}/projects/download_tiles/?tile_id=${tileId}`, - projectInfo - ) - ); + dispatch(DownloadTile(`${environment.baseApiUrl}/projects/download_tiles/?tile_id=${tileId}`, projectInfo)); }; const getTilesList = () => { - dispatch( - GetTilesList( - `${environment.baseApiUrl}/projects/tiles_list/${decodedId}/` - ) - ); + dispatch(GetTilesList(`${environment.baseApiUrl}/projects/tiles_list/${decodedId}/`)); }; useEffect(() => { //Only fetch tiles list when modal is open @@ -67,15 +44,15 @@ const GenerateMbTiles = ({ setToggleGenerateModal(!toggleGenerateModal)} - sx={{ width: "50px", float: "right", display: "block" }} + sx={{ width: '50px', float: 'right', display: 'block' }} > - + { @@ -113,24 +90,24 @@ const GenerateMbTiles = ({ )} */} -
+
{ // setToggleGenerateModal(false); dispatch( GenerateProjectTiles( `${environment.baseApiUrl}/projects/tiles/${decodedId}?source=${selectedTileSource}`, - decodedId - ) + decodedId, + ), ); // dispatch(CoreModules.TaskActions.SetJosmEditorError(null)); }} @@ -138,16 +115,16 @@ const GenerateMbTiles = ({ Generate
-
+
{ getTilesList(); @@ -156,35 +133,23 @@ const GenerateMbTiles = ({ Refresh
- + Id - - Source - - - Status - + Source + Status {tilesList.map((list) => ( - + {list.id} - - {list.tile_source} - + {list.tile_source} {/* Changed Success Display to Completed */} - {list.status === "SUCCESS" ? "COMPLETED" : list.status} + {list.status === 'SUCCESS' ? 'COMPLETED' : list.status} - {list.status === "SUCCESS" ? ( + {list.status === 'SUCCESS' ? ( downloadMbTiles(list.id)} > ) : ( diff --git a/src/frontend/fmtm_openlayer_map/src/components/MapDescriptionComponents.jsx b/src/frontend/main/src/components/MapDescriptionComponents.jsx similarity index 66% rename from src/frontend/fmtm_openlayer_map/src/components/MapDescriptionComponents.jsx rename to src/frontend/main/src/components/MapDescriptionComponents.jsx index 103d54feb4..3fcd0bf23f 100755 --- a/src/frontend/fmtm_openlayer_map/src/components/MapDescriptionComponents.jsx +++ b/src/frontend/main/src/components/MapDescriptionComponents.jsx @@ -1,18 +1,12 @@ -import React from "react"; -import CustomizedMenus from "fmtm/CustomizedMenus"; -import MapLegends from "./MapLegends"; -import CoreModules from "fmtm/CoreModules"; +import React from 'react'; +import CustomizedMenus from '../utilities/CustomizedMenus'; +import CoreModules from '../shared/CoreModules'; const MapDescriptionComponents = ({ type, state, defaultTheme }) => { - const descriptionData = [ { - value: "Descriptions", - element: ( - - {state.projectInfo.description} - - ), + value: 'Descriptions', + element: {state.projectInfo.description}, }, // { // value: "Instructions", @@ -38,20 +32,20 @@ const MapDescriptionComponents = ({ type, state, defaultTheme }) => { return ( {descriptionData.map((data, index) => { return ( @@ -61,11 +55,11 @@ const MapDescriptionComponents = ({ type, state, defaultTheme }) => { btnProps={{ style: { //overidding style - backgroundColor: "white", + backgroundColor: 'white', fontFamily: defaultTheme.typography.h1.fontFamily, fontSize: 16, }, - color: "primary", + color: 'primary', sx: { boxShadow: 2 }, }} element={data.element} diff --git a/src/frontend/fmtm_openlayer_map/src/components/MapLegends.jsx b/src/frontend/main/src/components/MapLegends.jsx similarity index 100% rename from src/frontend/fmtm_openlayer_map/src/components/MapLegends.jsx rename to src/frontend/main/src/components/MapLegends.jsx diff --git a/src/frontend/fmtm_openlayer_map/src/components/OpenLayersMap.jsx b/src/frontend/main/src/components/OpenLayersMap.jsx similarity index 52% rename from src/frontend/fmtm_openlayer_map/src/components/OpenLayersMap.jsx rename to src/frontend/main/src/components/OpenLayersMap.jsx index cc3bc274e0..87a885648e 100755 --- a/src/frontend/fmtm_openlayer_map/src/components/OpenLayersMap.jsx +++ b/src/frontend/main/src/components/OpenLayersMap.jsx @@ -1,21 +1,21 @@ -import React, { useEffect, useState } from "react"; -import DialogTaskActions from "../components/DialogTaskActions"; -import "../styles/home.scss"; -import CoreModules from "fmtm/CoreModules"; -import Control from "ol/control/Control"; -import locationImg from "../assets/images/location.png"; -import accDownImg from "../assets/images/acc-down.png"; -import accUpImg from "../assets/images/acc-up.png"; -import gridIcon from "../assets/images/grid.png"; -import QrcodeComponent from "./QrcodeComponent"; -import * as ol from "ol"; -import { Point } from "ol/geom"; -import Vector from "ol/layer/Vector"; -import VectorSource from "ol/source/Vector"; -import { transform } from "ol/proj"; -import { Icon, Style } from "ol/style"; -import LocationImage from "../assets/images/location.png"; -import AssetModules from "fmtm/AssetModules"; +import React, { useEffect, useState } from 'react'; +import DialogTaskActions from '../components/DialogTaskActions'; +import '../styles/home.scss'; +import CoreModules from '../shared/CoreModules'; +import Control from 'ol/control/Control'; +import locationImg from '../assets/images/location.png'; +import accDownImg from '../assets/images/acc-down.png'; +import accUpImg from '../assets/images/acc-up.png'; +import gridIcon from '../assets/images/grid.png'; +import QrcodeComponent from './QrcodeComponent'; +import * as ol from 'ol'; +import { Point } from 'ol/geom'; +import Vector from 'ol/layer/Vector'; +import VectorSource from 'ol/source/Vector'; +import { transform } from 'ol/proj'; +import { Icon, Style } from 'ol/style'; +import LocationImage from '../assets/images/location.png'; +import AssetModules from '../shared/AssetModules'; let currentLocationLayer = null; const OpenLayersMap = ({ defaultTheme, @@ -34,26 +34,24 @@ const OpenLayersMap = ({ const [toggleCurrentLoc, setToggleCurrentLoc] = useState(false); const [currentLocLayer, setCurrentLocLayer] = useState(null); function elastic(t) { - return ( - Math.pow(2, -10 * t) * Math.sin(((t - 0.075) * (2 * Math.PI)) / 0.3) + 1 - ); + return Math.pow(2, -10 * t) * Math.sin(((t - 0.075) * (2 * Math.PI)) / 0.3) + 1; } useEffect(() => { let btnsPosition = 0; - var btnList = ["add", "minus", "defaultPosition", "taskBoundries"]; + var btnList = ['add', 'minus', 'defaultPosition', 'taskBoundries']; if (map != undefined) { var handleOnClick = function (e) { - if (e.target.id == "add") { + if (e.target.id == 'add') { let actualZoom = map.getView().getZoom(); map.getView().setZoom(actualZoom + 1); - } else if (e.target.id == "minus") { + } else if (e.target.id == 'minus') { let actualZoom = map.getView().getZoom(); map.getView().setZoom(actualZoom - 1); - } else if (e.target.id == "defaultPosition") { - const sourceProjection = "EPSG:4326"; // The current projection of the coordinates - const targetProjection = "EPSG:3857"; // The desired projection + } else if (e.target.id == 'defaultPosition') { + const sourceProjection = 'EPSG:4326'; // The current projection of the coordinates + const targetProjection = 'EPSG:3857'; // The desired projection // Create a style for the marker var markerStyle = new Style({ image: new Icon({ @@ -62,18 +60,12 @@ const OpenLayersMap = ({ scale: 2, // Scale factor for the marker icon }), }); - if ("geolocation" in navigator) { + if ('geolocation' in navigator) { navigator.geolocation.getCurrentPosition((position) => { const lat = position.coords.latitude; const lng = position.coords.longitude; - const convertedCoordinates = transform( - [lng, lat], - sourceProjection, - targetProjection - ); - const positionFeature = new ol.Feature( - new Point(convertedCoordinates) - ); + const convertedCoordinates = transform([lng, lat], sourceProjection, targetProjection); + const positionFeature = new ol.Feature(new Point(convertedCoordinates)); const positionLayer = new Vector({ source: new VectorSource({ features: [positionFeature], @@ -86,15 +78,11 @@ const OpenLayersMap = ({ setToggleCurrentLoc(!toggleCurrentLoc); // map.getView().setZoom(15); - } else if (e.target.id == "taskBoundries") { + } else if (e.target.id == 'taskBoundries') { if (state.projectTaskBoundries.length != 0 && map != undefined) { - if ( - state.projectTaskBoundries.findIndex( - (project) => project.id == environment.decode(params.id) - ) != -1 - ) { + if (state.projectTaskBoundries.findIndex((project) => project.id == environment.decode(params.id)) != -1) { const index = state.projectTaskBoundries.findIndex( - (project) => project.id == environment.decode(params.id) + (project) => project.id == environment.decode(params.id), ); const centroid = state.projectTaskBoundries[index].taskBoundries[ @@ -109,46 +97,46 @@ const OpenLayersMap = ({ } } - map.getTargetElement().classList.remove("spinner"); + map.getTargetElement().classList.remove('spinner'); } }; //List buttons avoiding code duplication btnList.map((elmnt, index) => { //Add Button - let btn = document.createElement("button"); - if (elmnt == "add") { - btn.innerHTML = "+"; + let btn = document.createElement('button'); + if (elmnt == 'add') { + btn.innerHTML = '+'; btn.style.fontSize = defaultTheme.typography.fontSize; - } else if (elmnt == "minus") { - btn.innerHTML = "-"; + } else if (elmnt == 'minus') { + btn.innerHTML = '-'; btn.style.fontSize = defaultTheme.typography.fontSize; - } else if (elmnt == "defaultPosition") { - let img = document.createElement("img"); + } else if (elmnt == 'defaultPosition') { + let img = document.createElement('img'); img.src = locationImg; img.id = `${elmnt}`; - img.addEventListener("click", handleOnClick, false); + img.addEventListener('click', handleOnClick, false); btn.appendChild(img); - } else if (elmnt == "taskBoundries") { - let img = document.createElement("img"); + } else if (elmnt == 'taskBoundries') { + let img = document.createElement('img'); img.src = gridIcon; img.id = `${elmnt}`; - img.addEventListener("click", handleOnClick, false); + img.addEventListener('click', handleOnClick, false); btn.appendChild(img); } btn.id = `${elmnt}`; - btn.style.backgroundColor = "white"; - btn.style.boxShadow = `0 2px 2px 0 ${defaultTheme.palette.info["main"]}`; - btn.style.width = "40px"; - btn.style.height = "40px"; - btn.style.borderRadius = "50%"; - btn.addEventListener("click", handleOnClick, false); + btn.style.backgroundColor = 'white'; + btn.style.boxShadow = `0 2px 2px 0 ${defaultTheme.palette.info['main']}`; + btn.style.width = '40px'; + btn.style.height = '40px'; + btn.style.borderRadius = '50%'; + btn.addEventListener('click', handleOnClick, false); //Add Button Div - let btnDiv = document.createElement("div"); - btnDiv.id = "btnsContainer"; - btnDiv.style.borderRadius = "50%"; - btnDiv.className = "ol-unselectable ol-control"; + let btnDiv = document.createElement('div'); + btnDiv.id = 'btnsContainer'; + btnDiv.style.borderRadius = '50%'; + btnDiv.className = 'ol-unselectable ol-control'; index == 0 ? (btnDiv.style.top = `${(btnsPosition = btnsPosition + 2)}%`) : (btnDiv.style.top = `${(btnsPosition = btnsPosition + 9)}%`); @@ -162,29 +150,29 @@ const OpenLayersMap = ({ const MapDetails = [ { - value: "Ready", + value: 'Ready', color: defaultTheme.palette.mapFeatureColors.ready, - status: "none", + status: 'none', }, { - value: "Locked For Mapping", + value: 'Locked For Mapping', color: defaultTheme.palette.mapFeatureColors.locked_for_mapping, - status: "lock", + status: 'lock', }, { - value: "Ready For Validation", + value: 'Ready For Validation', color: defaultTheme.palette.mapFeatureColors.mapped, - status: "none", + status: 'none', }, { - value: "Locked For Validation", + value: 'Locked For Validation', color: defaultTheme.palette.mapFeatureColors.locked_for_validation, - status: "lock", + status: 'lock', }, { - value: "Validated", + value: 'Validated', color: defaultTheme.palette.mapFeatureColors.validated, - status: "none", + status: 'none', }, // { // value: "Bad", @@ -192,32 +180,32 @@ const OpenLayersMap = ({ // status: "none", // }, { - value: "More mapping needed", + value: 'More mapping needed', color: defaultTheme.palette.mapFeatureColors.invalidated, - status: "none", + status: 'none', }, { - value: "Locked", + value: 'Locked', color: defaultTheme.palette.mapFeatureColors.invalidated, - status: "none", - type: "locked", + status: 'none', + type: 'locked', }, ]; - let legendContainer = document.createElement("div"); - legendContainer.className = "legend-container"; - const legendLabel = document.createElement("span"); - legendLabel.innerHTML = "Legend"; - const legendAccIcon = document.createElement("span"); - legendAccIcon.className = "legend-acc-icon"; - let img = document.createElement("img"); + let legendContainer = document.createElement('div'); + legendContainer.className = 'legend-container'; + const legendLabel = document.createElement('span'); + legendLabel.innerHTML = 'Legend'; + const legendAccIcon = document.createElement('span'); + legendAccIcon.className = 'legend-acc-icon'; + let img = document.createElement('img'); img.src = accDownImg; - img.style.width = "24px"; - img.style.height = "24px"; - img.style.display = "none"; - let accUp = document.createElement("img"); + img.style.width = '24px'; + img.style.height = '24px'; + img.style.display = 'none'; + let accUp = document.createElement('img'); accUp.src = accUpImg; - accUp.style.width = "18px"; - accUp.style.height = "18px"; + accUp.style.width = '18px'; + accUp.style.height = '18px'; // accUp.style.display = 'none'; // img.id = `${elmnt}`; // legendAccIcon.addEventListener("click", function(){ @@ -229,29 +217,29 @@ const OpenLayersMap = ({ legendContainer.appendChild(legendAccIcon); // const legendContainer = document.getElementById('legendContainer'); - let legendContent = document.createElement("div"); - legendContent.className = "legend-content"; - legendContent.style.display = "none"; - legendContainer.style.margin = "552px 6px"; + let legendContent = document.createElement('div'); + legendContent.className = 'legend-content'; + legendContent.style.display = 'none'; + legendContainer.style.margin = '552px 6px'; MapDetails.forEach((detail) => { - const legend = document.createElement("div"); - legend.className = "legend"; + const legend = document.createElement('div'); + legend.className = 'legend'; - const legendText = document.createElement("span"); - legendText.className = "legend-text"; + const legendText = document.createElement('span'); + legendText.className = 'legend-text'; legendText.textContent = detail.value; - if (detail.type === "locked") { - const legendSquare = document.createElement("img"); - legendSquare.className = "legend-lock-img"; + if (detail.type === 'locked') { + const legendSquare = document.createElement('img'); + legendSquare.className = 'legend-lock-img'; // legendSquare.style.width = "20px"; - legendSquare.style.height = "20px"; + legendSquare.style.height = '20px'; legendSquare.src = AssetModules.LockPng; legend.appendChild(legendText); legend.appendChild(legendSquare); } else { - const legendSquare = document.createElement("div"); - legendSquare.className = "legend-square"; + const legendSquare = document.createElement('div'); + legendSquare.className = 'legend-square'; legendSquare.style.backgroundColor = detail.color; legend.appendChild(legendText); legend.appendChild(legendSquare); @@ -261,17 +249,17 @@ const OpenLayersMap = ({ }); legendContainer.appendChild(legendContent); // Add event listener to toggle the accordion content - legendAccIcon.addEventListener("click", function () { - if (legendContent.style.display === "none") { - accUp.style.display = "none"; - img.style.display = "inline"; - legendContent.style.display = "block"; - legendContainer.style.margin = "200px 10px"; + legendAccIcon.addEventListener('click', function () { + if (legendContent.style.display === 'none') { + accUp.style.display = 'none'; + img.style.display = 'inline'; + legendContent.style.display = 'block'; + legendContainer.style.margin = '200px 10px'; } else { - img.style.display = "none"; - accUp.style.display = "inline"; - legendContent.style.display = "none"; - legendContainer.style.margin = "552px 6px"; + img.style.display = 'none'; + accUp.style.display = 'inline'; + legendContent.style.display = 'none'; + legendContainer.style.margin = '552px 6px'; } }); var controlx = new Control({ @@ -296,10 +284,10 @@ const OpenLayersMap = ({ }, [map, currentLocLayer]); return ( - +
@@ -307,17 +295,8 @@ const OpenLayersMap = ({
{featuresLayer != undefined && ( - - + + )}
diff --git a/src/frontend/fmtm_openlayer_map/src/components/ProjectInfo/ProjectCard.jsx b/src/frontend/main/src/components/ProjectInfo/ProjectCard.jsx similarity index 70% rename from src/frontend/fmtm_openlayer_map/src/components/ProjectInfo/ProjectCard.jsx rename to src/frontend/main/src/components/ProjectInfo/ProjectCard.jsx index 930b46223e..d6542004e5 100644 --- a/src/frontend/fmtm_openlayer_map/src/components/ProjectInfo/ProjectCard.jsx +++ b/src/frontend/main/src/components/ProjectInfo/ProjectCard.jsx @@ -1,17 +1,12 @@ -import React from "react"; -import CoreModules from "fmtm/CoreModules"; -import IconButtonCard from "../../utilities/IconButtonCard"; -import AssetModules from "fmtm/AssetModules"; +import React from 'react'; +import CoreModules from '../../shared/CoreModules'; +import IconButtonCard from '../../utilities/IconButtonCard'; +import AssetModules from '../../shared/AssetModules'; const ProjectCard = () => { return ( - - + + #12345 { - - + + Status changed from READY to LOCKED_FOR_MAPPING by: shushila - + @@ -48,7 +43,7 @@ const ProjectCard = () => { - + date diff --git a/src/frontend/main/src/components/ProjectInfo/ProjectInfoCountCard.jsx b/src/frontend/main/src/components/ProjectInfo/ProjectInfoCountCard.jsx new file mode 100644 index 0000000000..cb3837ba6d --- /dev/null +++ b/src/frontend/main/src/components/ProjectInfo/ProjectInfoCountCard.jsx @@ -0,0 +1,80 @@ +import React from 'react'; +import AssetModules from '../../shared/AssetModules'; +import CoreModules from '../../shared/CoreModules'; +import ProjectInfoCountSkeleton from './ProjectInfoCountCardSkeleton'; + +const ProjectInfoCountCard = () => { + const taskData = CoreModules.useAppSelector((state) => state.task.taskData); + const isTaskLoading = CoreModules.useAppSelector((state) => state.task.taskLoading); + + const totalTaskInfoCount = [ + { + count: taskData.task_count, + title: 'Total Tasks', + icon: , + }, + { + count: taskData.submission_count, + title: 'Total Submissions', + icon: , + }, + { + count: taskData.feature_count, + title: 'Total Features', + icon: , + }, + ]; + return ( + +
+ {isTaskLoading ? ( + + ) : ( +
+ {totalTaskInfoCount.map((taskInfo) => ( +
+ +
+

+ {taskInfo.count} +

+
+

{taskInfo.title}

+ {taskInfo.icon} +
+
+
+
+ ))} +
+ )} +
+
+ ); +}; + +export default ProjectInfoCountCard; diff --git a/src/frontend/main/src/components/ProjectInfo/ProjectInfoCountCardSkeleton.jsx b/src/frontend/main/src/components/ProjectInfo/ProjectInfoCountCardSkeleton.jsx new file mode 100644 index 0000000000..631f7225a1 --- /dev/null +++ b/src/frontend/main/src/components/ProjectInfo/ProjectInfoCountCardSkeleton.jsx @@ -0,0 +1,22 @@ +import React from 'react'; +import CoreModules from '../../shared/CoreModules'; + +const ProjectInfoCountCardSkeleton = () => { + return ( +
+ {Array.from({ length: 3 }).map((i) => ( +
+ +
+ ))} +
+ ); +}; + +export default ProjectInfoCountCardSkeleton; diff --git a/src/frontend/fmtm_openlayer_map/src/components/ProjectInfo/ProjectInfoSidebar.jsx b/src/frontend/main/src/components/ProjectInfo/ProjectInfoSidebar.jsx similarity index 67% rename from src/frontend/fmtm_openlayer_map/src/components/ProjectInfo/ProjectInfoSidebar.jsx rename to src/frontend/main/src/components/ProjectInfo/ProjectInfoSidebar.jsx index bbbd202480..317f2456df 100644 --- a/src/frontend/fmtm_openlayer_map/src/components/ProjectInfo/ProjectInfoSidebar.jsx +++ b/src/frontend/main/src/components/ProjectInfo/ProjectInfoSidebar.jsx @@ -1,19 +1,15 @@ -import React from "react"; -import CoreModules from "fmtm/CoreModules"; -import ProjectCard from "./ProjectCard"; -import environment from "fmtm/environment"; -import ProjectInfoSidebarSkeleton from "./ProjectInfoSidebarSkeleton"; +import React from 'react'; +import CoreModules from '../../shared/CoreModules'; +import ProjectCard from './ProjectCard'; +import environment from '../../environment'; +import ProjectInfoSidebarSkeleton from './ProjectInfoSidebarSkeleton'; const ProjectInfoSidebar = ({ projectId, taskInfo }) => { const dispatch = CoreModules.useAppDispatch(); const params = CoreModules.useParams(); const taskInfoData = Array.from(taskInfo); - const selectedTask = CoreModules.useAppSelector( - (state) => state.task.selectedTask - ); - const isTaskLoading = CoreModules.useAppSelector( - (state) => state.task.taskLoading - ); + const selectedTask = CoreModules.useAppSelector((state) => state.task.selectedTask); + const isTaskLoading = CoreModules.useAppSelector((state) => state.task.taskLoading); const encodedId = params.projectId; const onTaskClick = (taskId) => { @@ -21,15 +17,15 @@ const ProjectInfoSidebar = ({ projectId, taskInfo }) => { }; const innerBoxStyles = { boxStyle: { - borderBottom: "1px solid #F0F0F0", + borderBottom: '1px solid #F0F0F0', p: 2, - display: "flex", - flexDirection: "column", + display: 'flex', + flexDirection: 'column', gap: 2, - cursor: "pointer", - borderRadius: "4px", - "&:hover": { - backgroundColor: "#F0FBFF", + cursor: 'pointer', + borderRadius: '4px', + '&:hover': { + backgroundColor: '#F0FBFF', }, }, }; @@ -37,27 +33,27 @@ const ProjectInfoSidebar = ({ projectId, taskInfo }) => { return ( @@ -76,34 +72,29 @@ const ProjectInfoSidebar = ({ projectId, taskInfo }) => { key={index} sx={{ ...innerBoxStyles.boxStyle, - backgroundColor: - task.task_id === selectedTask ? "#F0FBFF" : "#FFFFFF", + backgroundColor: task.task_id === selectedTask ? '#F0FBFF' : '#FFFFFF', }} onClick={() => onTaskClick(+task.task_id)} > - + #{task.task_id} Go To Task Submissions @@ -112,7 +103,7 @@ const ProjectInfoSidebar = ({ projectId, taskInfo }) => { Zoom to Task diff --git a/src/frontend/main/src/components/ProjectInfo/ProjectInfoSidebarSkeleton.jsx b/src/frontend/main/src/components/ProjectInfo/ProjectInfoSidebarSkeleton.jsx new file mode 100644 index 0000000000..15cb754854 --- /dev/null +++ b/src/frontend/main/src/components/ProjectInfo/ProjectInfoSidebarSkeleton.jsx @@ -0,0 +1,46 @@ +import React from 'react'; +import CoreModules from '../../shared/CoreModules'; + +const ProjectInfoSidebarSkeleton = () => { + return ( +
+
+
+
+ +
+
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+ +
+
+ ); +}; + +export default ProjectInfoSidebarSkeleton; diff --git a/src/frontend/fmtm_openlayer_map/src/components/ProjectInfo/ProjectInfomap.jsx b/src/frontend/main/src/components/ProjectInfo/ProjectInfomap.jsx similarity index 65% rename from src/frontend/fmtm_openlayer_map/src/components/ProjectInfo/ProjectInfomap.jsx rename to src/frontend/main/src/components/ProjectInfo/ProjectInfomap.jsx index 8f757aa61b..1154ed3877 100644 --- a/src/frontend/fmtm_openlayer_map/src/components/ProjectInfo/ProjectInfomap.jsx +++ b/src/frontend/main/src/components/ProjectInfo/ProjectInfomap.jsx @@ -1,74 +1,74 @@ -import React, { useCallback, useState, useEffect } from "react"; +import React, { useCallback, useState, useEffect } from 'react'; -import CoreModules from "fmtm/CoreModules"; -import { MapContainer as MapComponent } from "../MapComponent/OpenLayersComponent"; -import { useOLMap } from "../MapComponent/OpenLayersComponent"; -import LayerSwitcherControl from "../MapComponent/OpenLayersComponent/LayerSwitcher"; -import { VectorLayer } from "../MapComponent/OpenLayersComponent/Layers"; -import { Vector as VectorSource } from "ol/source"; -import GeoJSON from "ol/format/GeoJSON"; -import { get } from "ol/proj"; -import { ProjectBuildingGeojsonService } from "../../api/SubmissionService"; -import environment from "fmtm/environment"; -import { getStyles } from "../MapComponent/OpenLayersComponent/helpers/styleUtils"; -import { ProjectActions } from "fmtm/ProjectSlice"; -import { basicGeojsonTemplate } from "../../utilities/mapUtils"; +import CoreModules from '../../shared/CoreModules'; +import { MapContainer as MapComponent } from '../MapComponent/OpenLayersComponent'; +import { useOLMap } from '../MapComponent/OpenLayersComponent'; +import LayerSwitcherControl from '../MapComponent/OpenLayersComponent/LayerSwitcher'; +import { VectorLayer } from '../MapComponent/OpenLayersComponent/Layers'; +import { Vector as VectorSource } from 'ol/source'; +import GeoJSON from 'ol/format/GeoJSON'; +import { get } from 'ol/proj'; +import { ProjectBuildingGeojsonService } from '../../api/SubmissionService'; +import environment from '../../environment'; +import { getStyles } from '../MapComponent/OpenLayersComponent/helpers/styleUtils'; +import { ProjectActions } from '../../store/slices/ProjectSlice'; +import { basicGeojsonTemplate } from '../../utilities/mapUtils'; export const defaultStyles = { - lineColor: "#000000", + lineColor: '#000000', lineOpacity: 70, - fillColor: "#1a2fa2", + fillColor: '#1a2fa2', fillOpacity: 50, lineThickness: 1, circleRadius: 5, dashline: 0, showLabel: false, customLabelText: null, - labelField: "", - labelFont: "Calibri", + labelField: '', + labelFont: 'Calibri', labelFontSize: 14, - labelColor: "#000000", + labelColor: '#000000', labelOpacity: 100, labelOutlineWidth: 3, - labelOutlineColor: "#ffffff", + labelOutlineColor: '#ffffff', labelOffsetX: 0, labelOffsetY: 0, - labelText: "normal", + labelText: 'normal', labelMaxResolution: 400, - labelAlign: "center", - labelBaseline: "middle", + labelAlign: 'center', + labelBaseline: 'middle', labelRotationDegree: 0, - labelFontWeight: "normal", - labelPlacement: "point", + labelFontWeight: 'normal', + labelPlacement: 'point', labelMaxAngleDegree: 45.0, labelOverflow: false, labelLineHeight: 1, visibleOnMap: true, icon: {}, showSublayer: false, - sublayerColumnName: "", + sublayerColumnName: '', sublayer: {}, }; export const municipalStyles = { ...defaultStyles, fillOpacity: 0, - lineColor: "#008099", + lineColor: '#008099', dashline: 5, width: 10, }; const colorCodes = { // '#9edefa': { min: 0, max: 5 }, - "#A9D2F3": { min: 10, max: 50 }, - "#7CB2E8": { min: 50, max: 100 }, - "#4A90D9": { min: 100, max: 130 }, - "#0062AC": { min: 130, max: 160 }, + '#A9D2F3': { min: 10, max: 50 }, + '#7CB2E8': { min: 50, max: 100 }, + '#4A90D9': { min: 100, max: 130 }, + '#0062AC': { min: 130, max: 160 }, }; function colorRange(data, noOfRange) { if (data?.length === 0) return []; - const actualCodes = [{ min: 0, max: 0, color: "#605f5e" }]; - console.log(data, "data"); + const actualCodes = [{ min: 0, max: 0, color: '#605f5e' }]; + console.log(data, 'data'); const maxVal = Math.max(...data?.map((d) => d.count)); const maxValue = maxVal <= noOfRange ? 10 : maxVal; // const minValue = Math.min(...data?.map((d) => d.count)) 0; @@ -89,7 +89,7 @@ function colorRange(data, noOfRange) { return actualCodes; } const getChoroplethColor = (value, colorCodesOutput) => { - let toReturn = "#FF4538"; + let toReturn = '#FF4538'; colorCodesOutput?.map((obj) => { if (obj.min <= value && obj.max >= value) { toReturn = obj.color; @@ -104,9 +104,7 @@ const ProjectInfomap = () => { const dispatch = CoreModules.useAppDispatch(); const [taskBoundaries, setTaskBoundaries] = useState(null); const [buildingGeojson, setBuildingGeojson] = useState(null); - const projectTaskBoundries = CoreModules.useAppSelector( - (state) => state.project.projectTaskBoundries - ); + const projectTaskBoundries = CoreModules.useAppSelector((state) => state.project.projectTaskBoundries); const taskInfo = CoreModules.useAppSelector((state) => state.task.taskInfo); const federalWiseProjectCount = taskInfo?.map((task) => ({ @@ -114,16 +112,12 @@ const ProjectInfomap = () => { count: task.submission_count, })); - const projectBuildingGeojson = CoreModules.useAppSelector( - (state) => state.project.projectBuildingGeojson - ); - const selectedTask = CoreModules.useAppSelector( - (state) => state.task.selectedTask - ); + const projectBuildingGeojson = CoreModules.useAppSelector((state) => state.project.projectBuildingGeojson); + const selectedTask = CoreModules.useAppSelector((state) => state.task.selectedTask); const params = CoreModules.useParams(); const encodedId = params.projectId; const decodedId = environment.decode(encodedId); - const legendColorArray = colorRange(federalWiseProjectCount, "4"); + const legendColorArray = colorRange(federalWiseProjectCount, '4'); const { mapRef, map } = useOLMap({ center: [0, 0], zoom: 4, @@ -183,13 +177,11 @@ const ProjectInfomap = () => { if (!taskBoundaries) return; const filteredSelectedTaskGeojson = { ...basicGeojsonTemplate, - features: taskBoundaries?.features?.filter( - (task) => task.properties.uid === selectedTask - ), + features: taskBoundaries?.features?.filter((task) => task.properties.uid === selectedTask), }; const vectorSource = new VectorSource({ features: new GeoJSON().readFeatures(filteredSelectedTaskGeojson, { - featureProjection: get("EPSG:3857"), + featureProjection: get('EPSG:3857'), }), }); var extent = vectorSource.getExtent(); @@ -205,9 +197,7 @@ const ProjectInfomap = () => { }); dispatch( - ProjectBuildingGeojsonService( - `${environment.baseApiUrl}/projects/${decodedId}/features?task_id=${selectedTask}` - ) + ProjectBuildingGeojsonService(`${environment.baseApiUrl}/projects/${decodedId}/features?task_id=${selectedTask}`), ); }, [selectedTask]); @@ -219,18 +209,13 @@ const ProjectInfomap = () => { (style, feature, resolution) => { const stylex = { ...style }; stylex.fillOpacity = 80; - const getFederal = federalWiseProjectCount?.find( - (d) => d.code === feature.getProperties().uid - ); + const getFederal = federalWiseProjectCount?.find((d) => d.code === feature.getProperties().uid); const getFederalCount = getFederal?.count; stylex.labelMaxResolution = 1000; stylex.showLabel = true; // stylex.labelField = 'district_code'; // stylex.customLabelText = getFederalName; - const choroplethColor = getChoroplethColor( - getFederalCount, - legendColorArray - ); + const choroplethColor = getChoroplethColor(getFederalCount, legendColorArray); stylex.fillColor = choroplethColor; return getStyles({ style: stylex, @@ -238,23 +223,23 @@ const ProjectInfomap = () => { resolution, }); }, - [federalWiseProjectCount] + [federalWiseProjectCount], ); - map?.on("loadstart", function () { - map.getTargetElement().classList.add("spinner"); + map?.on('loadstart', function () { + map.getTargetElement().classList.add('spinner'); }); - map?.on("loadend", function () { - map.getTargetElement().classList.remove("spinner"); + map?.on('loadend', function () { + map.getTargetElement().classList.remove('spinner'); }); return ( { mapInstance={map} className="map naxatw-relative naxatw-min-h-full naxatw-w-full" style={{ - height: "100%", - width: "100%", + height: '100%', + width: '100%', }} > @@ -271,11 +256,7 @@ const ProjectInfomap = () => { - setChoropleth( - { ...municipalStyles, lineThickness: 3 }, - feature, - resolution - ) + setChoropleth({ ...municipalStyles, lineThickness: 3 }, feature, resolution) } geojson={taskBoundaries} mapOnClick={taskOnSelect} @@ -289,13 +270,7 @@ const ProjectInfomap = () => { zIndex={5} /> )} - {buildingGeojson && ( - - )} + {buildingGeojson && } ); diff --git a/src/frontend/fmtm_openlayer_map/src/components/ProjectMap/ProjectMap.jsx b/src/frontend/main/src/components/ProjectMap/ProjectMap.jsx similarity index 100% rename from src/frontend/fmtm_openlayer_map/src/components/ProjectMap/ProjectMap.jsx rename to src/frontend/main/src/components/ProjectMap/ProjectMap.jsx diff --git a/src/frontend/fmtm_openlayer_map/src/components/QrcodeComponent.jsx b/src/frontend/main/src/components/QrcodeComponent.jsx similarity index 53% rename from src/frontend/fmtm_openlayer_map/src/components/QrcodeComponent.jsx rename to src/frontend/main/src/components/QrcodeComponent.jsx index 02217c068a..57ebe37fcd 100755 --- a/src/frontend/fmtm_openlayer_map/src/components/QrcodeComponent.jsx +++ b/src/frontend/main/src/components/QrcodeComponent.jsx @@ -1,12 +1,11 @@ -import React, { useState } from "react"; -import BasicCard from "fmtm/BasicCard"; +import React, { useState } from 'react'; +import BasicCard from '../utilities/BasicCard'; // import Activities from "./Activities"; -import environment from "fmtm/environment"; -import { ProjectFilesById } from "../api/Files"; -import { ShareSocial } from "react-share-social"; -import CoreModules from "fmtm/CoreModules"; -import AssetModules from "fmtm/AssetModules"; -import { HomeActions } from "fmtm/HomeSlice"; +import environment from '../environment'; +import { ProjectFilesById } from '../api/Files'; +import CoreModules from '../shared/CoreModules'; +import AssetModules from '../shared/AssetModules'; +import { HomeActions } from '../store/slices/HomeSlice'; const TasksComponent = ({ type, task, defaultTheme }) => { const dispatch = CoreModules.useAppDispatch(); @@ -14,90 +13,65 @@ const TasksComponent = ({ type, task, defaultTheme }) => { const params = CoreModules.useParams(); const { loading, qrcode } = ProjectFilesById( `${environment.baseApiUrl}/projects/${environment.decode(params.id)}`, - task + task, ); const socialStyles = { copyContainer: { - border: `1px solid ${defaultTheme.palette.info["main"]}`, - background: defaultTheme.palette.info["info"], - color: defaultTheme.palette.info["main"], + border: `1px solid ${defaultTheme.palette.info['main']}`, + background: defaultTheme.palette.info['info'], + color: defaultTheme.palette.info['main'], }, title: { - color: defaultTheme.palette.info["main"], - fontStyle: "italic", + color: defaultTheme.palette.info['main'], + fontStyle: 'italic', }, }; return ( - + - - - {`Qrcode`} - + + + {`Qrcode`} - - {qrcode == "" ? ( + + {qrcode == '' ? ( ) : ( - qrcode + qrcode )} - - + + { const linkSource = `data:image/png;base64,${qrcode}`; - const downloadLink = document.createElement("a"); + const downloadLink = document.createElement('a'); downloadLink.href = linkSource; downloadLink.download = `Task_${task}`; downloadLink.click(); }} - disabled={qrcode == "" ? true : false} + disabled={qrcode == '' ? true : false} color="info" aria-label="download qrcode" > - + { color="error" onClick={() => { document.location.href = - "intent://getodk.org/#Intent;scheme=app;package=org.odk.collect.android;end"; + 'intent://getodk.org/#Intent;scheme=app;package=org.odk.collect.android;end'; }} > Go To ODK - + { dispatch( HomeActions.SetSnackBar({ open: true, message: `not implemented`, - variant: "warning", + variant: 'warning', duration: 3000, - }) + }), ); // setOpen(true); }} - disabled={qrcode == "" ? true : false} + disabled={qrcode == '' ? true : false} color="info" aria-label="share qrcode" > - + {/* { + const { mapRef, map } = useOLMap({ + // center: fromLonLat([85.3, 27.7]), + center: [0, 0], + zoom: 4, + maxZoom: 25, + }); + + return ( +
+ + + {outlineBoundary?.type && ( + + )} + {featureGeojson?.type && } + {/* )} */} + +
+ ); +}; + +SubmissionMap.propTypes = {}; + +export default SubmissionMap; diff --git a/src/frontend/fmtm_openlayer_map/src/layers/TasksLayer.jsx b/src/frontend/main/src/components/TasksLayer.jsx similarity index 65% rename from src/frontend/fmtm_openlayer_map/src/layers/TasksLayer.jsx rename to src/frontend/main/src/components/TasksLayer.jsx index b10514bc9e..34bea911a8 100755 --- a/src/frontend/fmtm_openlayer_map/src/layers/TasksLayer.jsx +++ b/src/frontend/main/src/components/TasksLayer.jsx @@ -1,12 +1,12 @@ -import React, { useEffect } from "react"; -import { Vector as VectorLayer } from "ol/layer.js"; -import GeoJSON from "ol/format/GeoJSON"; -import { Vector as VectorSource } from "ol/source.js"; -import { geojsonObjectModel } from "../models/geojsonObjectModel"; -import MapStyles from "../hooks/MapStyles"; -import environment from "fmtm/environment"; -import CoreModules from "fmtm/CoreModules"; -import { get } from "ol/proj"; +import React, { useEffect } from 'react'; +import { Vector as VectorLayer } from 'ol/layer.js'; +import GeoJSON from 'ol/format/GeoJSON'; +import { Vector as VectorSource } from 'ol/source.js'; +import { geojsonObjectModel } from '../models/geojsonObjectModel'; +import MapStyles from '../hooks/MapStyles'; +import environment from '../environment'; +import CoreModules from '../shared/CoreModules'; +import { get } from 'ol/proj'; let geojsonObject; const TasksLayer = (map, view, feature) => { const params = CoreModules.useParams(); @@ -15,37 +15,31 @@ const TasksLayer = (map, view, feature) => { useEffect(() => { if (state.projectTaskBoundries.length != 0 && map != undefined) { - if ( - state.projectTaskBoundries.findIndex( - (project) => project.id == environment.decode(params.id) - ) != -1 - ) { + if (state.projectTaskBoundries.findIndex((project) => project.id == environment.decode(params.id)) != -1) { geojsonObject = null; - const index = state.projectTaskBoundries.findIndex( - (project) => project.id == environment.decode(params.id) - ); + const index = state.projectTaskBoundries.findIndex((project) => project.id == environment.decode(params.id)); const styleFunction = function (feature) { - let id = feature.getId().toString().replace("_", ","); - geojsonStyles[id.split(",")[1]]; - return geojsonStyles[id.split(",")[1]]; + let id = feature.getId().toString().replace('_', ','); + geojsonStyles[id.split(',')[1]]; + return geojsonStyles[id.split(',')[1]]; }; geojsonObject = { ...geojsonObjectModel }; - geojsonObject["features"] = []; + geojsonObject['features'] = []; state.projectTaskBoundries[index].taskBoundries.forEach((task) => { - geojsonObject["features"].push({ + geojsonObject['features'].push({ id: `${task.id}_${task.task_status_str}`, type: task.outline_geojson.type, geometry: task.outline_geojson.geometry, properties: { centroid: task.bbox }, }); }); - console.log(geojsonObject, "geojsonObject"); - console.log(state.projectTaskBoundries, "projectTaskBoundries"); + console.log(geojsonObject, 'geojsonObject'); + console.log(state.projectTaskBoundries, 'projectTaskBoundries'); const vectorSource = new VectorSource({ features: new GeoJSON().readFeatures(geojsonObject, { - featureProjection: get("EPSG:3857"), + featureProjection: get('EPSG:3857'), }), }); @@ -79,8 +73,8 @@ const TasksLayer = (map, view, feature) => { padding: [50, 50, 50, 200], // Optional padding around the extent }); map.addLayer(vectorLayer); - map.on("loadend", function () { - map.getTargetElement().classList.remove("spinner"); + map.on('loadend', function () { + map.getTargetElement().classList.remove('spinner'); }); } } diff --git a/src/frontend/fmtm_openlayer_map/src/components/TasksMap/TasksMap.jsx b/src/frontend/main/src/components/TasksMap/TasksMap.jsx similarity index 100% rename from src/frontend/fmtm_openlayer_map/src/components/TasksMap/TasksMap.jsx rename to src/frontend/main/src/components/TasksMap/TasksMap.jsx diff --git a/src/frontend/main/src/components/createproject/DataExtract.tsx b/src/frontend/main/src/components/createproject/DataExtract.tsx index b99e47b4ef..640e5f6cf5 100755 --- a/src/frontend/main/src/components/createproject/DataExtract.tsx +++ b/src/frontend/main/src/components/createproject/DataExtract.tsx @@ -1,6 +1,6 @@ import React, { useEffect } from 'react'; import enviroment from '../../environment'; -import CoreModules from '../../shared/CoreModules'; +import CoreModules from '../../shared/CoreModules.js'; import FormGroup from '@mui/material/FormGroup'; import { FormCategoryService } from '../../api/CreateProjectService'; import { useNavigate, Link } from 'react-router-dom'; @@ -8,7 +8,8 @@ import { CreateProjectActions } from '../../store/slices/CreateProjectSlice'; import { Grid, InputLabel, MenuItem, Select } from '@mui/material'; import useForm from '../../hooks/useForm'; //@ts-ignore -import DefineAreaMap from 'map/DefineAreaMap'; +// import DefineAreaMap from './views/DefineAreaMap'; +import DefineAreaMap from '../../views//DefineAreaMap'; import DataExtractValidation from './validation/DataExtractValidation'; // import { SelectPicker } from 'rsuite'; diff --git a/src/frontend/main/src/components/createproject/DefineTasks.tsx b/src/frontend/main/src/components/createproject/DefineTasks.tsx index db86e6a098..80a932d173 100755 --- a/src/frontend/main/src/components/createproject/DefineTasks.tsx +++ b/src/frontend/main/src/components/createproject/DefineTasks.tsx @@ -1,4 +1,4 @@ -import React, { useEffect } from 'react'; +import React from 'react'; import enviroment from '../../environment'; import CoreModules from '../../shared/CoreModules'; import AssetModules from '../../shared/AssetModules.js'; @@ -8,7 +8,7 @@ import { useNavigate, Link } from 'react-router-dom'; import { CreateProjectActions } from '../../store/slices/CreateProjectSlice'; import { InputLabel, MenuItem, Select } from '@mui/material'; //@ts-ignore -import DefineAreaMap from 'map/DefineAreaMap'; +import DefineAreaMap from '../../views/DefineAreaMap'; import useForm from '../../hooks/useForm'; import DefineTaskValidation from './validation/DefineTaskValidation'; import { useAppSelector } from '../../types/reduxTypes'; diff --git a/src/frontend/main/src/components/createproject/LoadingBar.tsx b/src/frontend/main/src/components/createproject/LoadingBar.tsx index 1d839fe1d6..d04c925a8d 100644 --- a/src/frontend/main/src/components/createproject/LoadingBar.tsx +++ b/src/frontend/main/src/components/createproject/LoadingBar.tsx @@ -44,6 +44,17 @@ const LoadingBar = ({ activeStep, totalSteps, title }) => { borderRadius: '20%', }} > + {/*
+
+ + {completedPercentage}% + +
+
*/} import('map/DefineAreaMap')); +const DefineAreaMap = React.lazy(() => import('../../views/DefineAreaMap')); const UploadArea: React.FC = ({ geojsonFile, setGeojsonFile, setInputValue, inputValue }: any) => { const navigate = useNavigate(); diff --git a/src/frontend/main/src/components/editproject/UpdateProjectArea.tsx b/src/frontend/main/src/components/editproject/UpdateProjectArea.tsx index 5ce850c7a4..85097f8619 100644 --- a/src/frontend/main/src/components/editproject/UpdateProjectArea.tsx +++ b/src/frontend/main/src/components/editproject/UpdateProjectArea.tsx @@ -1,7 +1,7 @@ import React, { useEffect, useState } from 'react'; -import CoreModules from '../../shared/CoreModules.js'; -import AssetModules from '../../shared/AssetModules.js'; -import EditProjectArea from 'map/EditProjectArea'; +import CoreModules from '../../shared/CoreModules'; +import AssetModules from '../../shared/AssetModules'; +import EditProjectArea from '../../views/EditProjectArea'; import enviroment from '../../environment'; import { EditProjectBoundaryService, GetDividedTaskFromGeojson } from '../../api/CreateProjectService'; @@ -10,8 +10,6 @@ const UpdateProjectArea = ({ projectId }) => { const [uploadAOI, setUploadAOI] = useState(null); const [geojsonAOI, setGeojsonAOI] = useState(null); const [projectBoundaryDetails, setProjectBoundaryDetails] = useState({ dimension: 10 }); - const outline_geojson = CoreModules.useAppSelector((state) => state.createproject.editProjectDetails.outline_geojson); - const dividedTaskGeojson = CoreModules.useAppSelector((state) => state.createproject.dividedTaskGeojson); const dividedTaskGeojsonLoading = CoreModules.useAppSelector((state) => state.createproject.dividedTaskLoading); const updateBoundaryLoading = CoreModules.useAppSelector((state) => state.createproject.updateBoundaryLoading); const defaultTheme: any = CoreModules.useAppSelector((state) => state.theme.hotTheme); diff --git a/src/frontend/main/src/environment.ts b/src/frontend/main/src/environment.ts index ecc7b554c6..72b95bf22d 100755 --- a/src/frontend/main/src/environment.ts +++ b/src/frontend/main/src/environment.ts @@ -1,5 +1,4 @@ export default { - main_url: process.env.FRONTEND_MAP_URL, nodeEnv: process.env.NODE_ENV, baseApiUrl: process.env.API_URL, decode: (id: any) => { diff --git a/src/frontend/main/src/hooks/MapStyles.js b/src/frontend/main/src/hooks/MapStyles.js new file mode 100755 index 0000000000..57c18fe183 --- /dev/null +++ b/src/frontend/main/src/hooks/MapStyles.js @@ -0,0 +1,121 @@ +import Fill from 'ol/style/Fill'; +import Stroke from 'ol/style/Stroke'; +import { Icon, Style } from 'ol/style'; +import React, { useEffect, useState } from 'react'; +import CoreModules from '../shared/CoreModules'; +import AssetModules from '../shared/AssetModules'; +import { getCenter } from 'ol/extent'; +import Point from 'ol/geom/Point.js'; +import { transform } from 'ol/proj'; + +function createPolygonStyle(fillColor, strokeColor) { + return new Style({ + stroke: new Stroke({ + color: strokeColor, + width: 3, + }), + fill: new Fill({ + color: fillColor, + }), + }); +} +function createIconStyle(iconSrc) { + return new Style({ + image: new Icon({ + anchor: [0.5, 1], + scale: 0.8, + anchorXUnits: 'fraction', + anchorYUnits: 'pixels', + src: iconSrc, + }), + geometry: function (feature) { + // return the coordinates of the centroid of the polygon + // const coordinates = feature.getGeometry().getExtent(); + // const center = getCenter(coordinates); + const convertedCenter = transform(feature.values_.centroid, 'EPSG:4326', 'EPSG:3857'); + return new Point(convertedCenter); + }, + }); +} +export default function MapStyles() { + const mapTheme = CoreModules.useAppSelector((state) => state.theme.hotTheme); + const [style, setStyle] = useState({}); + const strokeColor = 'rgb(0,0,0,0.5)'; + + useEffect(() => { + // Example usage: + const lockedPolygonStyle = createPolygonStyle( + mapTheme.palette.mapFeatureColors.locked_for_mapping_rgb, + strokeColor, + ); + const lockedValidationStyle = createPolygonStyle( + mapTheme.palette.mapFeatureColors.locked_for_validation_rgb, + strokeColor, + ); + const iconStyle = createIconStyle(AssetModules.LockPng); + const redIconStyle = createIconStyle(AssetModules.RedLockPng); + + const geojsonStyles = { + READY: new Style({ + stroke: new Stroke({ + color: strokeColor, + width: 3, + }), + fill: new Fill({ + color: mapTheme.palette.mapFeatureColors.ready_rgb, + }), + }), + LOCKED_FOR_MAPPING: [lockedPolygonStyle, iconStyle], + MAPPED: new Style({ + stroke: new Stroke({ + color: strokeColor, + width: 3, + }), + fill: new Fill({ + color: mapTheme.palette.mapFeatureColors.mapped_rgb, + }), + }), + LOCKED_FOR_VALIDATION: [lockedValidationStyle, redIconStyle], + + VALIDATED: new Style({ + stroke: new Stroke({ + color: strokeColor, + width: 3, + }), + fill: new Fill({ + color: mapTheme.palette.mapFeatureColors.validated_rgb, + }), + }), + INVALIDATED: new Style({ + stroke: new Stroke({ + color: strokeColor, + width: 3, + }), + fill: new Fill({ + color: mapTheme.palette.mapFeatureColors.invalidated_rgb, + }), + }), + BAD: new Style({ + stroke: new Stroke({ + color: strokeColor, + width: 3, + }), + fill: new Fill({ + color: mapTheme.palette.mapFeatureColors.bad_rgb, + }), + }), + SPLIT: new Style({ + stroke: new Stroke({ + color: strokeColor, + width: 3, + }), + fill: new Fill({ + color: mapTheme.palette.mapFeatureColors.split_rgb, + }), + }), + }; + setStyle(geojsonStyles); + }, []); + + return style; +} diff --git a/src/frontend/fmtm_openlayer_map/src/hooks/useOlMap.ts b/src/frontend/main/src/hooks/useOlMap.ts similarity index 100% rename from src/frontend/fmtm_openlayer_map/src/hooks/useOlMap.ts rename to src/frontend/main/src/hooks/useOlMap.ts diff --git a/src/frontend/fmtm_openlayer_map/src/models/geojsonObjectModel.js b/src/frontend/main/src/models/geojsonObjectModel.js similarity index 100% rename from src/frontend/fmtm_openlayer_map/src/models/geojsonObjectModel.js rename to src/frontend/main/src/models/geojsonObjectModel.js diff --git a/src/frontend/main/src/routes.jsx b/src/frontend/main/src/routes.jsx index 0710f68236..61e689d95b 100755 --- a/src/frontend/main/src/routes.jsx +++ b/src/frontend/main/src/routes.jsx @@ -14,12 +14,12 @@ import Organization from './views/Organization'; import CreateOrganization from './views/CreateOrganization'; import Authorized from './views/Authorized'; import SubmissionDetails from './views/SubmissionDetails'; -import ProjectDetails from 'map/ProjectDetails'; +import ProjectDetails from './views/ProjectDetails'; -// const ProjectDetails = React.lazy(() => import('map/ProjectDetails')); -const Submissions = React.lazy(() => import('map/Submissions')); -const Tasks = React.lazy(() => import('map/Tasks')); -const ProjectInfo = React.lazy(() => import('map/ProjectInfo')); +// const ProjectDetails = React.lazy(() => import('./views/ProjectDetails')); +const Submissions = React.lazy(() => import('./views/Submissions')); +const Tasks = React.lazy(() => import('./views/Tasks')); +const ProjectInfo = React.lazy(() => import('./views/ProjectInfo')); const routes = createBrowserRouter([ { diff --git a/src/frontend/main/src/store/Store.ts b/src/frontend/main/src/store/Store.ts index e3d5f94d58..cc0a9cebd5 100755 --- a/src/frontend/main/src/store/Store.ts +++ b/src/frontend/main/src/store/Store.ts @@ -1,6 +1,5 @@ import HomeSlice from './slices/HomeSlice'; import ThemeSlice from './slices/ThemeSlice'; -// import projectSlice from 'map/Project'; import { persistStore } from 'redux-persist'; import storage from 'redux-persist/lib/storage'; import ProjectSlice from './slices/ProjectSlice'; diff --git a/src/frontend/fmtm_openlayer_map/src/styles/home.scss b/src/frontend/main/src/styles/home.scss similarity index 100% rename from src/frontend/fmtm_openlayer_map/src/styles/home.scss rename to src/frontend/main/src/styles/home.scss diff --git a/src/frontend/main/src/utilities/BasicDialog.jsx b/src/frontend/main/src/utilities/BasicDialog.jsx new file mode 100755 index 0000000000..be97285132 --- /dev/null +++ b/src/frontend/main/src/utilities/BasicDialog.jsx @@ -0,0 +1,31 @@ +import * as React from 'react'; +import CoreModules from '../shared/CoreModules'; +import AssetModules from '../shared/AssetModules'; +export default function BasicDialog({ open, actions, title, onClose, subtitle }) { + return ( + + + + + + + + {title != undefined ? ( + + + {title} + + + ) : null} + {subtitle != undefined ? ( + + {subtitle} + + ) : null} + + + {actions} + + + ); +} diff --git a/src/frontend/main/src/utilities/IconButtonCard.jsx b/src/frontend/main/src/utilities/IconButtonCard.jsx new file mode 100755 index 0000000000..3e421028b9 --- /dev/null +++ b/src/frontend/main/src/utilities/IconButtonCard.jsx @@ -0,0 +1,16 @@ +import React from 'react'; +import CoreModules from '../shared/CoreModules'; +export default function IconButtonCard({ element, style, radius }) { + return ( + + {element} + + ); +} diff --git a/src/frontend/fmtm_openlayer_map/src/utilities/mapUtils.js b/src/frontend/main/src/utilities/mapUtils.js similarity index 100% rename from src/frontend/fmtm_openlayer_map/src/utilities/mapUtils.js rename to src/frontend/main/src/utilities/mapUtils.js diff --git a/src/frontend/fmtm_openlayer_map/src/views/DefineAreaMap.jsx b/src/frontend/main/src/views/DefineAreaMap.tsx similarity index 78% rename from src/frontend/fmtm_openlayer_map/src/views/DefineAreaMap.jsx rename to src/frontend/main/src/views/DefineAreaMap.tsx index a76ee1095c..138f31452c 100644 --- a/src/frontend/fmtm_openlayer_map/src/views/DefineAreaMap.jsx +++ b/src/frontend/main/src/views/DefineAreaMap.tsx @@ -1,10 +1,10 @@ -import React, { useEffect, useState } from "react"; -import useOLMap from "../hooks/useOlMap"; -import { MapContainer as MapComponent } from "../components/MapComponent/OpenLayersComponent"; -import LayerSwitcherControl from "../components/MapComponent/OpenLayersComponent/LayerSwitcher/index.js"; -import { VectorLayer } from "../components/MapComponent/OpenLayersComponent/Layers"; -import CoreModules from "fmtm/CoreModules"; -import { CreateProjectActions } from "fmtm/CreateProjectSlice"; +import React, { useEffect, useState } from 'react'; +import useOLMap from '../hooks/useOlMap'; +import { MapContainer as MapComponent } from '../components/MapComponent/OpenLayersComponent'; +import LayerSwitcherControl from '../components/MapComponent/OpenLayersComponent/LayerSwitcher/index.js'; +import { VectorLayer } from '../components/MapComponent/OpenLayersComponent/Layers'; +import CoreModules from '../shared/CoreModules'; +import { CreateProjectActions } from '../store/slices/CreateProjectSlice'; const DefineAreaMap = ({ uploadedGeojson, @@ -13,18 +13,12 @@ const DefineAreaMap = ({ uploadedLineExtractFile, onDraw, }) => { - const drawnGeojson = CoreModules.useAppSelector( - (state) => state.createproject.drawnGeojson - ); - const drawToggle = CoreModules.useAppSelector( - (state) => state.createproject.drawToggle - ); + const drawnGeojson = CoreModules.useAppSelector((state) => state.createproject.drawnGeojson); + const drawToggle = CoreModules.useAppSelector((state) => state.createproject.drawToggle); const dispatch = CoreModules.useAppDispatch(); const [dataExtractedGeojson, setDataExtractedGeojson] = useState(null); const [lineExtractedGeojson, setLineExtractedGeojson] = useState(null); - const dividedTaskGeojson = CoreModules.useAppSelector( - (state) => state.createproject.dividedTaskGeojson - ); + const dividedTaskGeojson = CoreModules.useAppSelector((state) => state.createproject.dividedTaskGeojson); const { mapRef, map } = useOLMap({ // center: fromLonLat([85.3, 27.7]), @@ -37,7 +31,7 @@ const DefineAreaMap = ({ if (dividedTaskGeojson) { } else if (uploadedGeojson) { const fileReader = new FileReader(); - fileReader.readAsText(uploadedGeojson, "UTF-8"); + fileReader.readAsText(uploadedGeojson, 'UTF-8'); fileReader.onload = (e) => { dispatch(CreateProjectActions.SetDividedTaskGeojson(e.target.result)); }; @@ -48,7 +42,7 @@ const DefineAreaMap = ({ useEffect(() => { if (uploadedDataExtractFile) { const fileReader = new FileReader(); - fileReader.readAsText(uploadedDataExtractFile, "UTF-8"); + fileReader.readAsText(uploadedDataExtractFile, 'UTF-8'); fileReader.onload = (e) => { setDataExtractedGeojson(e.target.result); }; @@ -59,7 +53,7 @@ const DefineAreaMap = ({ useEffect(() => { if (uploadedLineExtractFile) { const fileReader = new FileReader(); - fileReader.readAsText(uploadedLineExtractFile, "UTF-8"); + fileReader.readAsText(uploadedLineExtractFile, 'UTF-8'); fileReader.onload = (e) => { setLineExtractedGeojson(e.target.result); }; @@ -68,14 +62,14 @@ const DefineAreaMap = ({ } }, [uploadedLineExtractFile]); return ( -
+
diff --git a/src/frontend/fmtm_openlayer_map/src/views/EditProjectArea.jsx b/src/frontend/main/src/views/EditProjectArea.tsx similarity index 75% rename from src/frontend/fmtm_openlayer_map/src/views/EditProjectArea.jsx rename to src/frontend/main/src/views/EditProjectArea.tsx index b2832467b0..898df1fa30 100644 --- a/src/frontend/fmtm_openlayer_map/src/views/EditProjectArea.jsx +++ b/src/frontend/main/src/views/EditProjectArea.tsx @@ -1,8 +1,8 @@ -import React from "react"; -import useOLMap from "../hooks/useOlMap"; -import { MapContainer as MapComponent } from "../components/MapComponent/OpenLayersComponent"; -import LayerSwitcherControl from "../components/MapComponent/OpenLayersComponent/LayerSwitcher/index.js"; -import { VectorLayer } from "../components/MapComponent/OpenLayersComponent/Layers"; +import React from 'react'; +import useOLMap from '../hooks/useOlMap'; +import { MapContainer as MapComponent } from '../components/MapComponent/OpenLayersComponent'; +import LayerSwitcherControl from '../components/MapComponent/OpenLayersComponent/LayerSwitcher/index.js'; +import { VectorLayer } from '../components/MapComponent/OpenLayersComponent/Layers'; const EditProjectArea = ({ geojson }) => { const { mapRef, map } = useOLMap({ @@ -12,17 +12,15 @@ const EditProjectArea = ({ geojson }) => { maxZoom: 25, }); - - return ( -
+
@@ -38,7 +36,7 @@ const EditProjectArea = ({ geojson }) => { zoomToLayer /> )} - { /* + {/* {dataExtractedGeojson && ( { const dispatch = CoreModules.useAppDispatch(); const params = CoreModules.useParams(); - const defaultTheme = CoreModules.useAppSelector( - (state) => state.theme.hotTheme - ); + const defaultTheme = CoreModules.useAppSelector((state) => state.theme.hotTheme); const state = CoreModules.useAppSelector((state) => state.project); - const projectInfo = CoreModules.useAppSelector( - (state) => state.home.selectedProject - ); - const stateDialog = CoreModules.useAppSelector( - (state) => state.home.dialogStatus - ); - const stateSnackBar = CoreModules.useAppSelector( - (state) => state.home.snackbar - ); + const projectInfo = CoreModules.useAppSelector((state) => state.home.selectedProject); + const stateDialog = CoreModules.useAppSelector((state) => state.home.dialogStatus); + const stateSnackBar = CoreModules.useAppSelector((state) => state.home.snackbar); const [taskId, setTaskId] = useState(); const [toggleGenerateModal, setToggleGenerateModal] = useState(false); const mapElement = useRef(); @@ -62,19 +50,13 @@ const Home = () => { const decodedId = environment.decode(encodedId); const { windowSize, type } = WindowDimension(); const { y } = OnScroll(map, windowSize.width); - const downloadProjectFormLoading = CoreModules.useAppSelector( - (state) => state.project.downloadProjectFormLoading - ); - const downloadDataExtractLoading = CoreModules.useAppSelector( - (state) => state.project.downloadDataExtractLoading - ); - const projectBuildingGeojson = CoreModules.useAppSelector( - (state) => state.project.projectBuildingGeojson - ); + const downloadProjectFormLoading = CoreModules.useAppSelector((state) => state.project.downloadProjectFormLoading); + const downloadDataExtractLoading = CoreModules.useAppSelector((state) => state.project.downloadDataExtractLoading); + const projectBuildingGeojson = CoreModules.useAppSelector((state) => state.project.projectBuildingGeojson); //snackbar handle close funtion const handleClose = (event, reason) => { - if (reason === "clickaway") { + if (reason === 'clickaway') { return; } dispatch( @@ -83,27 +65,23 @@ const Home = () => { message: stateSnackBar.message, variant: stateSnackBar.variant, duration: 0, - }) + }), ); }; //Fetch project for the first time useEffect(() => { dispatch(ProjectActions.SetNewProjectTrigger()); - if ( - state.projectTaskBoundries.findIndex( - (project) => project.id == environment.decode(encodedId) - ) == -1 - ) { + if (state.projectTaskBoundries.findIndex((project) => project.id == environment.decode(encodedId)) == -1) { dispatch(ProjectActions.SetProjectTaskBoundries([])); dispatch( ProjectById( `${environment.baseApiUrl}/projects/${environment.decode(encodedId)}`, state.projectTaskBoundries, - environment.decode(encodedId) + environment.decode(encodedId), ), - state.projectTaskBoundries + state.projectTaskBoundries, ); // dispatch(ProjectBuildingGeojsonService(`${environment.baseApiUrl}/projects/${environment.decode(encodedId)}/features`)) } else { @@ -112,9 +90,9 @@ const Home = () => { ProjectById( `${environment.baseApiUrl}/projects/${environment.decode(encodedId)}`, state.projectTaskBoundries, - environment.decode(encodedId) + environment.decode(encodedId), ), - state.projectTaskBoundries + state.projectTaskBoundries, ); } if (Object.keys(state.projectInfo).length == 0) { @@ -130,8 +108,8 @@ const Home = () => { }, [params.id]); useEffect(() => { - const container = document.getElementById("popup"); - const closer = document.getElementById("popup-closer"); + const container = document.getElementById('popup'); + const closer = document.getElementById('popup-closer'); const overlay = new Overlay({ element: container, @@ -153,8 +131,8 @@ const Home = () => { // Bind the event listener for outside click and trigger handleClickOutside // document.addEventListener("mousedown", handleClickOutside); - closer.style.textDecoration = "none"; - closer.style.color = defaultTheme.palette.info["main"]; + closer.style.textDecoration = 'none'; + closer.style.color = defaultTheme.palette.info['main']; closer.onclick = function () { overlay.setPosition(undefined); closer.blur(); @@ -166,7 +144,7 @@ const Home = () => { }); const view = new View({ - projection: "EPSG:3857", + projection: 'EPSG:3857', center: [0, 0], zoom: 1, }); @@ -193,36 +171,25 @@ const Home = () => { overlays: [overlay], view: view, }); - initialMap.on("click", function (event) { + initialMap.on('click', function (event) { initialMap.forEachFeatureAtPixel(event.pixel, function (feature, layer) { - const status = feature - .getId() - ?.toString() - ?.replace("_", ",") - ?.split(",")?.[1]; - if ( - environment.tasksStatus.findIndex((data) => data.label == status) != - -1 - ) { - setTaskId(feature?.getId()?.split("_")?.[0]); + const status = feature.getId()?.toString()?.replace('_', ',')?.split(',')?.[1]; + if (environment.tasksStatus.findIndex((data) => data.label == status) != -1) { + setTaskId(feature?.getId()?.split('_')?.[0]); const coordinate = event.coordinate; overlay.setPosition(coordinate); setFeaturesLayer(feature); dispatch( ProjectBuildingGeojsonService( - `${ - environment.baseApiUrl - }/projects/${decodedId}/features?task_id=${ - feature?.getId()?.split("_")?.[0] - }` - ) + `${environment.baseApiUrl}/projects/${decodedId}/features?task_id=${feature?.getId()?.split('_')?.[0]}`, + ), ); } }); }); - initialMap.on("loadstart", function () { - initialMap.getTargetElement().classList.add("spinner"); + initialMap.on('loadstart', function () { + initialMap.getTargetElement().classList.add('spinner'); }); setMap(initialMap); @@ -233,7 +200,7 @@ const Home = () => { /** * Removed handleClickOutside Eventlistener on unmount */ - document.removeEventListener("mousedown", handleClickOutside); + document.removeEventListener('mousedown', handleClickOutside); mapElement.current = null; setFeaturesLayer(); setView(); @@ -262,12 +229,9 @@ const Home = () => { }; const initalFeaturesLayer = new VectorLayer({ source: new VectorSource({ - features: new GeoJSON().readFeatures( - taskBuildingGeojsonFeatureCollection, - { - featureProjection: get("EPSG:3857"), - } - ), + features: new GeoJSON().readFeatures(taskBuildingGeojsonFeatureCollection, { + featureProjection: get('EPSG:3857'), + }), }), style: buildingStyle, declutter: true, @@ -281,28 +245,14 @@ const Home = () => { TasksLayer(map, mainView, featuresLayer); const handleDownload = (downloadType) => { - if (downloadType === "form") { - dispatch( - DownloadProjectForm( - `${environment.baseApiUrl}/projects/download_form/${decodedId}/`, - downloadType - ) - ); - } else if (downloadType === "geojson") { - dispatch( - DownloadProjectForm( - `${environment.baseApiUrl}/projects/${decodedId}/download_tasks`, - downloadType - ) - ); + if (downloadType === 'form') { + dispatch(DownloadProjectForm(`${environment.baseApiUrl}/projects/download_form/${decodedId}/`, downloadType)); + } else if (downloadType === 'geojson') { + dispatch(DownloadProjectForm(`${environment.baseApiUrl}/projects/${decodedId}/download_tasks`, downloadType)); } }; const onDataExtractDownload = () => { - dispatch( - DownloadDataExtract( - `${environment.baseApiUrl}/projects/features/download/?project_id=${decodedId}` - ) - ); + dispatch(DownloadDataExtract(`${environment.baseApiUrl}/projects/features/download/?project_id=${decodedId}`)); }; return ( @@ -325,45 +275,40 @@ const Home = () => { {/* Top project details heading medium dimension*/} } > - + - - {state.projectInfo.title} - + {state.projectInfo.title} - + {`#${state.projectInfo.id}`} - + {state.projectInfo.priority_str} @@ -372,34 +317,23 @@ const Home = () => { {/* project Details Title */} - - - - - {state.projectInfo.title} - + + + + {state.projectInfo.title} - - + + {`#${state.projectInfo.id}`} - + {state.projectInfo.priority_str} @@ -407,30 +341,23 @@ const Home = () => { {/* Center description and map */} - - - + + +
handleDownload("form")} - sx={{ width: "unset" }} - loading={ - downloadProjectFormLoading.type === "form" && - downloadProjectFormLoading.loading - } + onClick={() => handleDownload('form')} + sx={{ width: 'unset' }} + loading={downloadProjectFormLoading.type === 'form' && downloadProjectFormLoading.loading} loadingPosition="end" endIcon={} variant="contained" @@ -439,12 +366,9 @@ const Home = () => { Form handleDownload("geojson")} - sx={{ width: "unset" }} - loading={ - downloadProjectFormLoading.type === "geojson" && - downloadProjectFormLoading.loading - } + onClick={() => handleDownload('geojson')} + sx={{ width: 'unset' }} + loading={downloadProjectFormLoading.type === 'geojson' && downloadProjectFormLoading.loading} loadingPosition="end" endIcon={} variant="contained" @@ -454,7 +378,7 @@ const Home = () => { onDataExtractDownload()} - sx={{ width: "unset" }} + sx={{ width: 'unset' }} loading={downloadDataExtractLoading} loadingPosition="end" endIcon={} @@ -466,20 +390,20 @@ const Home = () => {
@@ -490,7 +414,7 @@ const Home = () => { onClick={() => setToggleGenerateModal(true)} variant="contained" color="error" - sx={{ width: "200px", mr: "15px" }} + sx={{ width: '200px', mr: '15px' }} endIcon={} > Generate MbTiles @@ -498,11 +422,11 @@ const Home = () => { @@ -532,9 +456,7 @@ const Home = () => { {/* project Details Tabs */} - + {/* */} { const themes = CoreModules.useAppSelector((state) => state.theme.hotTheme); const taskInfo = CoreModules.useAppSelector((state) => state.task.taskInfo); - const selectedTask = CoreModules.useAppSelector( - (state) => state.task.selectedTask - ); + const selectedTask = CoreModules.useAppSelector((state) => state.task.selectedTask); const state = CoreModules.useAppSelector((state) => state.project); const params = CoreModules.useParams(); @@ -47,37 +40,33 @@ const ProjectInfo = () => { const decodedId = environment.decode(encodedId); const handleDownload = (downloadType) => { - if (downloadType === "csv") { + if (downloadType === 'csv') { dispatch( getDownloadProjectSubmission( - `${environment.baseApiUrl}/submission/download?project_id=${decodedId}&export_json=false` - ) + `${environment.baseApiUrl}/submission/download?project_id=${decodedId}&export_json=false`, + ), ); - } else if (downloadType === "json") { + } else if (downloadType === 'json') { dispatch( getDownloadProjectSubmission( - `${environment.baseApiUrl}/submission/download?project_id=${decodedId}&export_json=true` - ) + `${environment.baseApiUrl}/submission/download?project_id=${decodedId}&export_json=true`, + ), ); } }; //Fetch project for the first time useEffect(() => { dispatch(ProjectActions.SetNewProjectTrigger()); - if ( - state.projectTaskBoundries.findIndex( - (project) => project.id == environment.decode(encodedId) - ) == -1 - ) { + if (state.projectTaskBoundries.findIndex((project) => project.id == environment.decode(encodedId)) == -1) { dispatch(ProjectActions.SetProjectTaskBoundries([])); dispatch( ProjectById( `${environment.baseApiUrl}/projects/${environment.decode(encodedId)}`, state.projectTaskBoundries, - environment.decode(encodedId) + environment.decode(encodedId), ), - state.projectTaskBoundries + state.projectTaskBoundries, ); // dispatch(ProjectBuildingGeojsonService(`${environment.baseApiUrl}/projects/${environment.decode(encodedId)}/features`)) } else { @@ -86,9 +75,9 @@ const ProjectInfo = () => { ProjectById( `${environment.baseApiUrl}/projects/${environment.decode(encodedId)}`, state.projectTaskBoundries, - environment.decode(encodedId) + environment.decode(encodedId), ), - state.projectTaskBoundries + state.projectTaskBoundries, ); } if (Object.keys(state.projectInfo).length == 0) { @@ -102,22 +91,16 @@ const ProjectInfo = () => { const handleConvert = () => { dispatch( fetchConvertToOsmDetails( - `${ - environment.baseApiUrl - }/submission/convert-to-osm?project_id=${decodedId}&${ - selectedTask ? `task_id=${selectedTask}` : "" - }` - ) + `${environment.baseApiUrl}/submission/convert-to-osm?project_id=${decodedId}&${ + selectedTask ? `task_id=${selectedTask}` : '' + }`, + ), ); }; useEffect(() => { const fetchData = () => { - dispatch( - fetchInfoTask( - `${environment.baseApiUrl}/tasks/tasks-features/?project_id=${decodedId}` - ) - ); + dispatch(fetchInfoTask(`${environment.baseApiUrl}/tasks/tasks-features/?project_id=${decodedId}`)); }; fetchData(); let interval; @@ -134,60 +117,47 @@ const ProjectInfo = () => { setIsMonitoring((prevState) => !prevState); }; - const projectInfo = CoreModules.useAppSelector( - (state) => state.project.projectInfo - ); - const josmEditorError = CoreModules.useAppSelector( - (state) => state.task.josmEditorError - ); - const downloadSubmissionLoading = CoreModules.useAppSelector( - (state) => state.task.downloadSubmissionLoading - ); + const projectInfo = CoreModules.useAppSelector((state) => state.project.projectInfo); + const josmEditorError = CoreModules.useAppSelector((state) => state.task.josmEditorError); + const downloadSubmissionLoading = CoreModules.useAppSelector((state) => state.task.downloadSubmissionLoading); const uploadToJOSM = () => { dispatch( ConvertXMLToJOSM( `${environment.baseApiUrl}/submission/get_osm_xml/${decodedId}`, - projectInfo.outline_geojson.bbox - ) + projectInfo.outline_geojson.bbox, + ), ); }; const modalStyle = (theme) => ({ - width: "30%", - height: "24%", - bgcolor: theme.palette.mode === "dark" ? "#0A1929" : "white", - border: "1px solid ", - padding: "16px 32px 24px 32px", + width: '30%', + height: '24%', + bgcolor: theme.palette.mode === 'dark' ? '#0A1929' : 'white', + border: '1px solid ', + padding: '16px 32px 24px 32px', }); return ( <> - + <>

Connection with JOSM failed

-

- {" "} - Please verify if JOSM is running on your computer and the remote - control is enabled. -

+

Please verify if JOSM is running on your computer and the remote control is enabled.

{ dispatch(CoreModules.TaskActions.SetJosmEditorError(null)); @@ -201,19 +171,19 @@ const ProjectInfo = () => { sx={{ px: 3, py: 1, - display: "flex", - flexDirection: "row", - justifyContent: "space-between", - alignItems: "center", + display: 'flex', + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', }} > { @@ -222,10 +192,7 @@ const ProjectInfo = () => { }} color="info" > - + Back @@ -233,19 +200,17 @@ const ProjectInfo = () => { #{projectInfo?.id} - - {projectInfo?.title} - + {projectInfo?.title} - + Upload to JOSM @@ -254,16 +219,16 @@ const ProjectInfo = () => { variant="outlined" color="error" size="small" - sx={{ width: "fit-content", height: "fit-content" }} + sx={{ width: 'fit-content', height: 'fit-content' }} onClick={handleMonitoring} > @@ -271,19 +236,15 @@ const ProjectInfo = () => { - + {/* Project Info side bar */} - + { - + Convert handleDownload("csv")} - sx={{ width: "unset" }} - loading={ - downloadSubmissionLoading.type === "csv" && - downloadSubmissionLoading.loading - } + onClick={() => handleDownload('csv')} + sx={{ width: 'unset' }} + loading={downloadSubmissionLoading.type === 'csv' && downloadSubmissionLoading.loading} loadingPosition="end" endIcon={} variant="contained" @@ -320,12 +273,9 @@ const ProjectInfo = () => { CSV handleDownload("json")} - sx={{ width: "unset" }} - loading={ - downloadSubmissionLoading.type === "json" && - downloadSubmissionLoading.loading - } + onClick={() => handleDownload('json')} + sx={{ width: 'unset' }} + loading={downloadSubmissionLoading.type === 'json' && downloadSubmissionLoading.loading} loadingPosition="end" endIcon={} variant="contained" diff --git a/src/frontend/fmtm_openlayer_map/src/views/Submissions.jsx b/src/frontend/main/src/views/Submissions.tsx similarity index 52% rename from src/frontend/fmtm_openlayer_map/src/views/Submissions.jsx rename to src/frontend/main/src/views/Submissions.tsx index 0d449dfe2b..f93b84bde2 100755 --- a/src/frontend/fmtm_openlayer_map/src/views/Submissions.jsx +++ b/src/frontend/main/src/views/Submissions.tsx @@ -1,30 +1,21 @@ -import React, { useEffect } from "react"; +import React, { useEffect } from 'react'; // import '../styles/home.css' -import "../../node_modules/ol/ol.css"; -import CoreModules from "fmtm/CoreModules"; +import '../../node_modules/ol/ol.css'; +import CoreModules from '../shared/CoreModules'; // import { useLocation, useNavigate } from 'react-router-dom'; -import Avatar from "../assets/images/avatar.png"; -import SubmissionMap from "../components/SubmissionMap/SubmissionMap"; -import environment from "fmtm/environment"; -import { - ProjectBuildingGeojsonService, - ProjectSubmissionService, -} from "../api/SubmissionService"; -import { ProjectActions } from "fmtm/ProjectSlice"; -import { ProjectById } from "../api/Project"; +import Avatar from '../assets/images/avatar.png'; +import SubmissionMap from '../components/SubmissionMap/SubmissionMap'; +import environment from '../environment'; +import { ProjectBuildingGeojsonService, ProjectSubmissionService } from '../api/SubmissionService'; +import { ProjectActions } from '../store/slices/ProjectSlice'; +import { ProjectById } from '../api/Project'; const Submissions = () => { const dispatch = CoreModules.useAppDispatch(); const state = CoreModules.useAppSelector((state) => state.project); - const projectInfo = CoreModules.useAppSelector( - (state) => state.home.selectedProject - ); - const projectSubmissionState = CoreModules.useAppSelector( - (state) => state.project.projectSubmission - ); - const projectState = CoreModules.useAppSelector( - (state) => state.project.project - ); + const projectInfo = CoreModules.useAppSelector((state) => state.home.selectedProject); + const projectSubmissionState = CoreModules.useAppSelector((state) => state.project.projectSubmission); + const projectState = CoreModules.useAppSelector((state) => state.project.project); // const projectTaskBoundries = CoreModules.useAppSelector((state) => state.project.projectTaskBoundries); // const projectBuildingGeojson = CoreModules.useAppSelector((state) => state.project.projectBuildingGeojson); const params = CoreModules.useParams(); @@ -32,33 +23,21 @@ const Submissions = () => { const decodedId = environment.decode(encodedId); // const theme = CoreModules.useAppSelector(state => state.theme.hotTheme) useEffect(() => { - dispatch( - ProjectSubmissionService( - `${environment.baseApiUrl}/submission/?project_id=${decodedId}` - ) - ); - dispatch( - ProjectBuildingGeojsonService( - `${environment.baseApiUrl}/projects/${decodedId}/features` - ) - ); + dispatch(ProjectSubmissionService(`${environment.baseApiUrl}/submission/?project_id=${decodedId}`)); + dispatch(ProjectBuildingGeojsonService(`${environment.baseApiUrl}/projects/${decodedId}/features`)); //creating a manual thunk that will make an API call then autamatically perform state mutation whenever we navigate to home page }, []); // Requesting Task Boundaries on Page Load useEffect(() => { - if ( - state.projectTaskBoundries.findIndex( - (project) => project.id == environment.decode(encodedId) - ) == -1 - ) { + if (state.projectTaskBoundries.findIndex((project) => project.id == environment.decode(encodedId)) == -1) { dispatch( ProjectById( `${environment.baseApiUrl}/projects/${environment.decode(encodedId)}`, state.projectTaskBoundries, - environment.decode(encodedId) + environment.decode(encodedId), ), - state.projectTaskBoundries + state.projectTaskBoundries, ); } else { dispatch(ProjectActions.SetProjectTaskBoundries([])); @@ -66,9 +45,9 @@ const Submissions = () => { ProjectById( `${environment.baseApiUrl}/projects/${environment.decode(encodedId)}`, state.projectTaskBoundries, - environment.decode(encodedId) + environment.decode(encodedId), ), - state.projectTaskBoundries + state.projectTaskBoundries, ); } if (Object.keys(state.projectInfo).length == 0) { @@ -83,17 +62,13 @@ const Submissions = () => { - - + + {/* Project Details SideBar Button for Creating Project */} Monitoring @@ -105,10 +80,7 @@ const Submissions = () => { Convert - + Download CSV @@ -118,62 +90,46 @@ const Submissions = () => { {projectSubmissionState?.map((submission) => { const date = new Date(submission.createdAt); const dateOptions = { - minute: "numeric", - hour: "numeric", - day: "numeric", - weekday: "long", - year: "numeric", - month: "long", + minute: 'numeric', + hour: 'numeric', + day: 'numeric', + weekday: 'long', + year: 'numeric', + month: 'long', }; - const formattedDate = date.toLocaleDateString( - "en-US", - dateOptions - ); + const formattedDate = date.toLocaleDateString('en-US', dateOptions); return ( - {" "} + {' '} - + {submission.submitted_by} - + Submitted {projectState?.project} at {formattedDate} @@ -182,9 +138,7 @@ const Submissions = () => { })} - + diff --git a/src/frontend/fmtm_openlayer_map/src/views/Tasks.jsx b/src/frontend/main/src/views/Tasks.tsx similarity index 55% rename from src/frontend/fmtm_openlayer_map/src/views/Tasks.jsx rename to src/frontend/main/src/views/Tasks.tsx index f757cd22d4..d4cfa9a493 100644 --- a/src/frontend/fmtm_openlayer_map/src/views/Tasks.jsx +++ b/src/frontend/main/src/views/Tasks.tsx @@ -1,38 +1,29 @@ -import React, { useEffect, useState } from "react"; +import React, { useEffect, useState } from 'react'; // import '../styles/home.css' -import "../../node_modules/ol/ol.css"; -import CoreModules from "fmtm/CoreModules"; -import AssetModules from "fmtm/AssetModules"; +import '../../node_modules/ol/ol.css'; +import CoreModules from '../shared/CoreModules'; +import AssetModules from '../shared/AssetModules'; // import { useLocation, useNavigate } from 'react-router-dom'; // import { styled, alpha } from '@mui/material'; -import Avatar from "../assets/images/avatar.png"; -import SubmissionMap from "../components/SubmissionMap/SubmissionMap"; -import environment from "fmtm/environment"; -import { - ProjectBuildingGeojsonService, - ProjectSubmissionService, -} from "../api/SubmissionService"; -import { ProjectActions } from "fmtm/ProjectSlice"; -import { ProjectById } from "../api/Project"; -import { getDownloadProjectSubmission } from "../api/task"; +import Avatar from '../assets/images/avatar.png'; +import SubmissionMap from '../components/SubmissionMap/SubmissionMap'; +import environment from '../environment'; +import { ProjectBuildingGeojsonService, ProjectSubmissionService } from '../api/SubmissionService'; +import { ProjectActions } from '../store/slices/ProjectSlice'; +import { ProjectById } from '../api/Project'; +import { getDownloadProjectSubmission } from '../api/task'; const basicGeojsonTemplate = { - type: "FeatureCollection", + type: 'FeatureCollection', features: [], }; const TasksSubmission = () => { const dispatch = CoreModules.useAppDispatch(); const state = CoreModules.useAppSelector((state) => state.project); - const projectInfo = CoreModules.useAppSelector( - (state) => state.home.selectedProject - ); - const projectSubmissionState = CoreModules.useAppSelector( - (state) => state.project.projectSubmission - ); - const projectState = CoreModules.useAppSelector( - (state) => state.project.project - ); + const projectInfo = CoreModules.useAppSelector((state) => state.home.selectedProject); + const projectSubmissionState = CoreModules.useAppSelector((state) => state.project.projectSubmission); + const projectState = CoreModules.useAppSelector((state) => state.project.project); // const projectTaskBoundries = CoreModules.useAppSelector((state) => state.project.projectTaskBoundries); // const projectBuildingGeojson = CoreModules.useAppSelector((state) => state.project.projectBuildingGeojson); const params = CoreModules.useParams(); @@ -44,51 +35,41 @@ const TasksSubmission = () => { useEffect(() => { dispatch( ProjectSubmissionService( - `${environment.baseApiUrl}/submission/?project_id=${decodedProjectId}&task_id=${decodedTaskId}` - ) + `${environment.baseApiUrl}/submission/?project_id=${decodedProjectId}&task_id=${decodedTaskId}`, + ), ); dispatch( ProjectBuildingGeojsonService( - `${environment.baseApiUrl}/projects/${decodedProjectId}/features?task_id=${decodedTaskId}` - ) + `${environment.baseApiUrl}/projects/${decodedProjectId}/features?task_id=${decodedTaskId}`, + ), ); //creating a manual thunk that will make an API call then autamatically perform state mutation whenever we navigate to home page }, []); //Fetch project for the first time useEffect(() => { - if ( - state.projectTaskBoundries.findIndex( - (project) => project.id == environment.decode(encodedProjectId) - ) == -1 - ) { + if (state.projectTaskBoundries.findIndex((project) => project.id == environment.decode(encodedProjectId)) == -1) { dispatch( ProjectById( - `${environment.baseApiUrl}/projects/${environment.decode( - encodedProjectId - )}`, + `${environment.baseApiUrl}/projects/${environment.decode(encodedProjectId)}`, state.projectTaskBoundries, - environment.decode(encodedProjectId) + environment.decode(encodedProjectId), ), - state.projectTaskBoundries + state.projectTaskBoundries, ); dispatch( ProjectBuildingGeojsonService( - `${environment.baseApiUrl}/projects/${environment.decode( - encodedProjectId - )}/features` - ) + `${environment.baseApiUrl}/projects/${environment.decode(encodedProjectId)}/features`, + ), ); } else { dispatch(ProjectActions.SetProjectTaskBoundries([])); dispatch( ProjectById( - `${environment.baseApiUrl}/projects/${environment.decode( - encodedProjectId - )}`, + `${environment.baseApiUrl}/projects/${environment.decode(encodedProjectId)}`, state.projectTaskBoundries, - environment.decode(encodedProjectId) + environment.decode(encodedProjectId), ), - state.projectTaskBoundries + state.projectTaskBoundries, ); } if (Object.keys(state.projectInfo).length == 0) { @@ -99,12 +80,8 @@ const TasksSubmission = () => { } } }, [params.id]); - const projectTaskBoundries = CoreModules.useAppSelector( - (state) => state.project.projectTaskBoundries - ); - const projectBuildingGeojson = CoreModules.useAppSelector( - (state) => state.project.projectBuildingGeojson - ); + const projectTaskBoundries = CoreModules.useAppSelector((state) => state.project.projectTaskBoundries); + const projectBuildingGeojson = CoreModules.useAppSelector((state) => state.project.projectBuildingGeojson); const [projectBoundaries, setProjectBoundaries] = useState(null); const [buildingBoundaries, setBuildingBoundaries] = useState(null); @@ -120,7 +97,7 @@ const TasksSubmission = () => { })), ], }; - console.log(taskGeojsonFeatureCollection, "taskGeojsonFeatureCollection"); + console.log(taskGeojsonFeatureCollection, 'taskGeojsonFeatureCollection'); setProjectBoundaries(taskGeojsonFeatureCollection); } if (projectBuildingGeojson?.length > 0 && buildingBoundaries === null) { @@ -146,102 +123,79 @@ const TasksSubmission = () => { } } transformOrigin={{ - vertical: "top", - horizontal: "right", + vertical: 'top', + horizontal: 'right', }} {...props} /> ))(({ theme }) => ({ - "& .MuiPaper-root": { + '& .MuiPaper-root': { borderRadius: 6, marginTop: theme.spacing(1), minWidth: 180, - color: - theme.palette.mode === "light" - ? "rgb(55, 65, 81)" - : theme.palette.grey[300], + color: theme.palette.mode === 'light' ? 'rgb(55, 65, 81)' : theme.palette.grey[300], boxShadow: - "rgb(255, 255, 255) 0px 0px 0px 0px, rgba(0, 0, 0, 0.05) 0px 0px 0px 1px, rgba(0, 0, 0, 0.1) 0px 10px 15px -3px, rgba(0, 0, 0, 0.05) 0px 4px 6px -2px", - "& .MuiMenu-list": { - padding: "4px 0", + 'rgb(255, 255, 255) 0px 0px 0px 0px, rgba(0, 0, 0, 0.05) 0px 0px 0px 1px, rgba(0, 0, 0, 0.1) 0px 10px 15px -3px, rgba(0, 0, 0, 0.05) 0px 4px 6px -2px', + '& .MuiMenu-list': { + padding: '4px 0', }, - "& .MuiMenuItem-root": { - "& .MuiSvgIcon-root": { + '& .MuiMenuItem-root': { + '& .MuiSvgIcon-root': { fontSize: 18, color: theme.palette.text.secondary, marginRight: theme.spacing(1.5), }, - "&:active": { - backgroundColor: AssetModules.alpha( - theme.palette.primary.main, - theme.palette.action.selectedOpacity - ), + '&:active': { + backgroundColor: AssetModules.alpha(theme.palette.primary.main, theme.palette.action.selectedOpacity), }, }, }, })); const handleDownload = (downloadType) => { - if (downloadType === "csv") { + if (downloadType === 'csv') { dispatch( getDownloadProjectSubmission( - `${environment.baseApiUrl}/submission/download?project_id=${decodedProjectId}&task_id=${decodedTaskId}&export_json=false` - ) + `${environment.baseApiUrl}/submission/download?project_id=${decodedProjectId}&task_id=${decodedTaskId}&export_json=false`, + ), ); - } else if (downloadType === "json") { + } else if (downloadType === 'json') { dispatch( getDownloadProjectSubmission( - `${environment.baseApiUrl}/submission/download?project_id=${decodedProjectId}&task_id=${decodedTaskId}&export_json=true` - ) + `${environment.baseApiUrl}/submission/download?project_id=${decodedProjectId}&task_id=${decodedTaskId}&export_json=true`, + ), ); } }; - const downloadSubmissionLoading = CoreModules.useAppSelector( - (state) => state.task.downloadSubmissionLoading - ); + const downloadSubmissionLoading = CoreModules.useAppSelector((state) => state.task.downloadSubmissionLoading); return ( - - + + {/* Project Details SideBar Button for Creating Project */} - + Monitoring {/* END */} {/* Upload Area SideBar Button for uploading Area page */} - + Convert handleDownload("csv")} - sx={{ width: "unset" }} - loading={ - downloadSubmissionLoading.type === "csv" && - downloadSubmissionLoading.loading - } + onClick={() => handleDownload('csv')} + sx={{ width: 'unset' }} + loading={downloadSubmissionLoading.type === 'csv' && downloadSubmissionLoading.loading} loadingPosition="end" endIcon={} variant="contained" @@ -251,12 +205,9 @@ const TasksSubmission = () => { handleDownload("json")} - sx={{ width: "unset" }} - loading={ - downloadSubmissionLoading.type === "json" && - downloadSubmissionLoading.loading - } + onClick={() => handleDownload('json')} + sx={{ width: 'unset' }} + loading={downloadSubmissionLoading.type === 'json' && downloadSubmissionLoading.loading} loadingPosition="end" endIcon={} variant="contained" @@ -270,68 +221,52 @@ const TasksSubmission = () => { {projectSubmissionState?.map((submission) => { const date = new Date(submission.createdAt); const dateOptions = { - minute: "numeric", - hour: "numeric", - day: "numeric", - weekday: "long", - year: "numeric", - month: "long", + minute: 'numeric', + hour: 'numeric', + day: 'numeric', + weekday: 'long', + year: 'numeric', + month: 'long', }; - const formattedDate = date.toLocaleDateString( - "en-US", - dateOptions - ); + const formattedDate = date.toLocaleDateString('en-US', dateOptions); return ( - {" "} + {' '} - + {submission.submitted_by} - + Submitted {projectState?.project} at {formattedDate} @@ -341,13 +276,8 @@ const TasksSubmission = () => { })} - - + + diff --git a/src/frontend/main/webpack.config.js b/src/frontend/main/webpack.config.js index 1cb7503676..1f9b0bb6ea 100755 --- a/src/frontend/main/webpack.config.js +++ b/src/frontend/main/webpack.config.js @@ -140,47 +140,6 @@ module.exports = function (webpackEnv) { filename: 'static/css/[name].[contenthash:8].css', chunkFilename: 'static/css/[name].[contenthash:8].chunk.css', }), - new ModuleFederationPlugin({ - name: 'fmtm', - filename: 'remoteEntry.js', - remotes: { - map: `fmtm_openlayer_map@${process.env.FRONTEND_MAP_URL}/remoteEntry.js`, - }, - exposes: { - './ThemeSlice': './src/store/slices/ThemeSlice.ts', - './HomeSlice': './src/store/slices/HomeSlice.ts', - './CommonSlice': './src/store/slices/CommonSlice.ts', - './LoginSlice': './src/store/slices/LoginSlice.ts', - './ProjectSlice': './src/store/slices/ProjectSlice.ts', - './CreateProjectSlice': './src/store/slices/CreateProjectSlice.ts', - './Store': './src/store/Store.ts', - './BasicCard': './src/utilities/BasicCard.tsx', - './CustomizedMenus': './src/utilities/CustomizedMenus.tsx', - './CustomizedSnackbar': './src/utilities/CustomizedSnackbar.jsx', - './PrimaryAppBar': './src/utilities/PrimaryAppBar.tsx', - './environment': './src/environment.ts', - './WindowDimension': './src/hooks/WindowDimension.tsx', - './OnScroll': './src/hooks/OnScroll.tsx', - './CoreModules': './src/shared/CoreModules.js', - './AssetModules': './src/shared/AssetModules.js', - }, - shared: { - ...deps, - react: { - singleton: true, - requiredVersion: deps.react, - }, - 'react-dom': { - singleton: true, - requiredVersion: deps['react-dom'], - // requiredVersion: deps["react-dom", "@material-ui/core", "@material-ui/icons"], - }, - 'react-redux': { - singleton: true, - version: deps['react-router-dom'], - }, - }, - }), new HtmlWebPackPlugin( Object.assign( {}, @@ -209,7 +168,7 @@ module.exports = function (webpackEnv) { ), ), - new EnvironmentPlugin(['API_URL', 'FRONTEND_MAIN_URL', 'FRONTEND_MAP_URL']), + new EnvironmentPlugin(['API_URL', 'FRONTEND_MAIN_URL']), ], }; }; diff --git a/src/frontend/prod.dockerfile b/src/frontend/prod.dockerfile index eab9db4f26..02c9b4db78 100644 --- a/src/frontend/prod.dockerfile +++ b/src/frontend/prod.dockerfile @@ -7,15 +7,12 @@ ARG API_URL ENV API_URL="${API_URL}" ARG FRONTEND_MAIN_URL ENV FRONTEND_MAIN_URL="${FRONTEND_MAIN_URL}" -ARG FRONTEND_MAP_URL -ENV FRONTEND_MAP_URL="${FRONTEND_MAP_URL}" LABEL org.hotosm.fmtm.app-name="${APP_NAME}" \ org.hotosm.fmtm.app-version="${APP_VERSION}" \ org.hotosm.fmtm.maintainer="${MAINTAINER}" \ org.hotosm.fmtm.api-url="${API_URL}" \ org.hotosm.fmtm.main-url="${FRONTEND_MAIN_URL}" \ - org.hotosm.fmtm.fmtm_openlayer_map-url="${FRONTEND_MAP_URL}" WORKDIR /app COPY ./${APP_NAME}/package*.json ./ From 0356f78a6c25855cbae7e140a55ed95f803575bd Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Thu, 14 Sep 2023 10:53:55 +0100 Subject: [PATCH 22/59] build: fix label newline in prod.dockerfile --- src/frontend/prod.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/prod.dockerfile b/src/frontend/prod.dockerfile index 02c9b4db78..4997b710c2 100644 --- a/src/frontend/prod.dockerfile +++ b/src/frontend/prod.dockerfile @@ -12,7 +12,7 @@ LABEL org.hotosm.fmtm.app-name="${APP_NAME}" \ org.hotosm.fmtm.app-version="${APP_VERSION}" \ org.hotosm.fmtm.maintainer="${MAINTAINER}" \ org.hotosm.fmtm.api-url="${API_URL}" \ - org.hotosm.fmtm.main-url="${FRONTEND_MAIN_URL}" \ + org.hotosm.fmtm.main-url="${FRONTEND_MAIN_URL}" WORKDIR /app COPY ./${APP_NAME}/package*.json ./ From 890c2687459271318ce02b18dffdd2b67ca7d30d Mon Sep 17 00:00:00 2001 From: Sam <78538841+spwoodcock@users.noreply.github.com> Date: Wed, 20 Sep 2023 16:03:55 +0200 Subject: [PATCH 23/59] Overhaul CI, use reusable workflows (#830) * ci: overhaul, use reusable workflows * fix: json2osm import from osm-fieldwork --- .github/workflows/build_and_deploy.yml | 140 +++++++++--------- .github/workflows/build_ci_img.yml | 29 ++++ ...odk_image_build.yml => build_odk_imgs.yml} | 19 +-- .github/workflows/ci_img_build.yml | 57 ------- .github/workflows/pr.yml | 8 +- .github/workflows/pr_pytest.yml | 24 --- .github/workflows/r-build_backend.yml | 44 ++++++ .github/workflows/r-build_frontend.yml | 57 +++++++ .github/workflows/r-extract_versions.yml | 42 ++++++ .github/workflows/r-frontend_tests.yml | 36 +++++ .../{reusable/pytest.yml => r-pytest.yml} | 13 +- .github/workflows/reusable/frontend_tests.yml | 25 ---- .github/workflows/tests/pr_payload.json | 10 ++ .github/workflows/tests/push_payload.json | 3 + .github/workflows/tests/test_ci.sh | 30 ++++ src/backend/app/projects/project_crud.py | 2 +- 16 files changed, 349 insertions(+), 190 deletions(-) create mode 100644 .github/workflows/build_ci_img.yml rename .github/workflows/{odk_image_build.yml => build_odk_imgs.yml} (70%) delete mode 100644 .github/workflows/ci_img_build.yml delete mode 100644 .github/workflows/pr_pytest.yml create mode 100644 .github/workflows/r-build_backend.yml create mode 100644 .github/workflows/r-build_frontend.yml create mode 100644 .github/workflows/r-extract_versions.yml create mode 100644 .github/workflows/r-frontend_tests.yml rename .github/workflows/{reusable/pytest.yml => r-pytest.yml} (87%) delete mode 100644 .github/workflows/reusable/frontend_tests.yml create mode 100644 .github/workflows/tests/pr_payload.json create mode 100644 .github/workflows/tests/push_payload.json create mode 100644 .github/workflows/tests/test_ci.sh diff --git a/.github/workflows/build_and_deploy.yml b/.github/workflows/build_and_deploy.yml index 2bdfb79533..00465a56e6 100644 --- a/.github/workflows/build_and_deploy.yml +++ b/.github/workflows/build_and_deploy.yml @@ -13,73 +13,88 @@ on: # Allow manual trigger workflow_dispatch: -env: - REGISTRY: ghcr.io - GIT_BRANCH: ${{ github.ref_name }} - jobs: - build-and-push-images: + pytest: + uses: ./.github/workflows/r-pytest.yml + with: + image_tag: ci-${{ github.ref_name }} + + frontend-main-tests: + uses: ./.github/workflows/r-frontend_tests.yml + + extract-versions: + needs: + - pytest + - frontend-main-tests + uses: ./.github/workflows/r-extract_versions.yml + + backend-build: + uses: ./.github/workflows/r-build_backend.yml + needs: extract-versions + with: + api_version: ${{ needs.extract-versions.outputs.api_version }} + build_target: prod + image_tags: | + "ghcr.io/hotosm/fmtm/backend:${{ needs.extract-versions.outputs.api_version }}-${{ github.ref_name }}" + "ghcr.io/hotosm/fmtm/backend:latest" + + frontend-main-build: + uses: ./.github/workflows/r-build_frontend.yml + needs: extract-versions + with: + environment: ${{ github.ref_name }} + name: main + app_version: ${{ needs.extract-versions.outputs.frontend_main_version }} + build_target: prod + image_tags: | + "ghcr.io/hotosm/fmtm/frontend/main:${{ needs.extract-versions.outputs.frontend_main_version }}-${{ github.ref_name }}" + "ghcr.io/hotosm/fmtm/frontend/main:latest" + + frontend-map-build: + uses: ./.github/workflows/r-build_frontend.yml + needs: extract-versions + with: + environment: ${{ github.ref_name }} + name: fmtm_openlayer_map + app_version: ${{ needs.extract-versions.outputs.frontend_map_version }} + build_target: prod + image_tags: | + "ghcr.io/hotosm/fmtm/frontend/map:${{ needs.extract-versions.outputs.frontend_map_version }}-${{ github.ref_name }}" + "ghcr.io/hotosm/fmtm/frontend/map:latest" + + smoke-test-backend: runs-on: ubuntu-latest + needs: + - extract-versions + - backend-build environment: name: ${{ github.ref_name }} - permissions: - contents: read - packages: write steps: - name: Checkout repository uses: actions/checkout@v3 - - name: Log in to the Container registry - uses: docker/login-action@v2 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Persist env vars - run: echo "${{ secrets.DOTENV }}" >> $GITHUB_ENV - - - name: Extract api version - id: extract_api_version + - name: Environment to .env + env: + API_VERSION: ${{ needs.extract-versions.outputs.api_version }} + FRONTEND_MAIN_VERSION: ${{ needs.extract-versions.outputs.frontend_main_version }} + FRONTEND_MAP_VERSION: ${{ needs.extract-versions.outputs.frontend_map_version }} run: | - cd src/backend - echo "API_VERSION=$(python -c 'from app.__version__ import __version__; print(__version__)')" >> $GITHUB_ENV + echo "${{ secrets.DOTENV }}" > .env + echo "API_VERSION=${API_VERSION}" >> .env + echo "FRONTEND_MAIN_VERSION=${FRONTEND_MAIN_VERSION}" >> .env + echo "FRONTEND_MAP_VERSION=${FRONTEND_MAP_VERSION}" >> .env - - name: Extract frontend versions - id: extract_frontend_versions + - name: Backend smoke test run: | - cd src/frontend - echo "FRONTEND_MAIN_VERSION=$(jq -r '.version' main/package.json)" >> $GITHUB_ENV - - - name: Build and push backend - uses: docker/build-push-action@v4 - with: - context: src/backend - target: prod - push: true - tags: | - "ghcr.io/hotosm/fmtm/backend:${{ env.API_VERSION }}-${{ github.ref_name }}" - "ghcr.io/hotosm/fmtm/backend:latest" - build-args: | - APP_VERSION=${{ env.API_VERSION }} - - - name: Build and push frontend main - uses: docker/build-push-action@v4 - with: - context: src/frontend - file: src/frontend/prod.dockerfile - push: true - tags: "ghcr.io/hotosm/fmtm/frontend/main:${{ env.FRONTEND_MAIN_VERSION }}-${{ github.ref_name }}" - build-args: | - APP_NAME=main - APP_VERSION=${{ env.FRONTEND_MAIN_VERSION }} - API_URL=${{ env.URL_SCHEME }}://${{ env.API_URL }} - FRONTEND_MAIN_URL=${{ env.URL_SCHEME }}://${{ env.FRONTEND_MAIN_URL }} + docker compose --file docker-compose.deploy.yml pull api + docker compose --file docker-compose.deploy.yml up api --exit-code-from api deploy-containers: runs-on: ubuntu-latest - needs: build-and-push-images + needs: + - extract-versions + - smoke-test-backend environment: name: ${{ github.ref_name }} @@ -87,23 +102,16 @@ jobs: - name: Checkout repository uses: actions/checkout@v3 - - name: Extract api version - id: extract_api_version - run: | - cd src/backend - echo "API_VERSION=$(python -c 'from app.__version__ import __version__; print(__version__)')" >> $GITHUB_OUTPUT - - - name: Extract frontend versions - id: extract_frontend_versions - run: | - cd src/frontend - echo "FRONTEND_MAIN_VERSION=$(jq -r '.version' main/package.json)" >> $GITHUB_OUTPUT - - name: Environment to .env + env: + API_VERSION: ${{ needs.extract-versions.outputs.api_version }} + FRONTEND_MAIN_VERSION: ${{ needs.extract-versions.outputs.frontend_main_version }} + FRONTEND_MAP_VERSION: ${{ needs.extract-versions.outputs.frontend_map_version }} run: | echo "${{ secrets.DOTENV }}" > .env - echo "API_VERSION=${{ steps.extract_api_version.outputs.API_VERSION }}" >> .env - echo "FRONTEND_MAIN_VERSION=${{ steps.extract_frontend_versions.outputs.FRONTEND_MAIN_VERSION }}" >> .env + echo "API_VERSION=${API_VERSION}" >> .env + echo "FRONTEND_MAIN_VERSION=${FRONTEND_MAIN_VERSION}" >> .env + echo "FRONTEND_MAP_VERSION=${FRONTEND_MAP_VERSION}" >> .env - uses: webfactory/ssh-agent@v0.7.0 with: diff --git a/.github/workflows/build_ci_img.yml b/.github/workflows/build_ci_img.yml new file mode 100644 index 0000000000..b803856cf2 --- /dev/null +++ b/.github/workflows/build_ci_img.yml @@ -0,0 +1,29 @@ +name: Build CI Img + +on: + # Push includes PR merge + push: + branches: + - main + - staging + - development + paths: + # Workflow is triggered only if deps change + - "src/backend/pyproject.toml" + - "src/backend/Dockerfile" + # Allow manual trigger + workflow_dispatch: + +jobs: + extract-versions: + uses: ./.github/workflows/r-extract_versions.yml + + backend-ci-build: + uses: ./.github/workflows/r-build_backend.yml + needs: [extract-versions] + with: + api_version: ${{ needs.extract-versions.outputs.api_version }} + build_target: ci + image_tags: | + "ghcr.io/hotosm/fmtm/backend:${{ needs.extract-versions.outputs.api_version }}-ci-${{ github.ref_name }}" + "ghcr.io/hotosm/fmtm/backend:ci-${{ github.ref_name }}" diff --git a/.github/workflows/odk_image_build.yml b/.github/workflows/build_odk_imgs.yml similarity index 70% rename from .github/workflows/odk_image_build.yml rename to .github/workflows/build_odk_imgs.yml index 3d42ad3759..7f1ba7cf3e 100644 --- a/.github/workflows/odk_image_build.yml +++ b/.github/workflows/build_odk_imgs.yml @@ -4,20 +4,13 @@ on: # Push includes PR merge push: branches: - - main - - staging - development - - "*-development-*" paths: # Workflow is triggered only if odkcentral dir changes - "odkcentral/**" # Allow manual trigger workflow_dispatch: -env: - REGISTRY: ghcr.io - ODK_CENTRAL_VERSION: v2023.2.1 - jobs: build-and-push-images: runs-on: ubuntu-latest @@ -32,7 +25,7 @@ jobs: - name: Log in to the Container registry uses: docker/login-action@v2 with: - registry: ${{ env.REGISTRY }} + registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} @@ -41,13 +34,17 @@ jobs: with: context: odkcentral/api push: true - tags: "ghcr.io/hotosm/fmtm/odkcentral:${{ env.ODK_CENTRAL_VERSION }}" + tags: | + "ghcr.io/hotosm/fmtm/odkcentral:${{ vars.ODK_CENTRAL_VERSION }}" + "ghcr.io/hotosm/fmtm/odkcentral:latest" build-args: | - ODK_CENTRAL_VERSION=${{ env.ODK_CENTRAL_VERSION }} + ODK_CENTRAL_VERSION=${{ vars.ODK_CENTRAL_VERSION }} - name: Build and push odkcentral proxy uses: docker/build-push-action@v4 with: context: odkcentral/proxy push: true - tags: "ghcr.io/hotosm/fmtm/odkcentral-proxy:latest" + tags: | + "ghcr.io/hotosm/fmtm/odkcentral-proxy:${{ vars.ODK_CENTRAL_VERSION }}" + "ghcr.io/hotosm/fmtm/odkcentral-proxy:latest" diff --git a/.github/workflows/ci_img_build.yml b/.github/workflows/ci_img_build.yml deleted file mode 100644 index 17e40040e1..0000000000 --- a/.github/workflows/ci_img_build.yml +++ /dev/null @@ -1,57 +0,0 @@ -name: Build CI Img - -on: - # Push includes PR merge - push: - branches: - - main - - staging - - development - paths: - # Workflow is triggered only if deps change - - "src/backend/pyproject.toml" - - "src/backend/Dockerfile" - # Allow manual trigger - workflow_dispatch: - -env: - REGISTRY: ghcr.io - GIT_BRANCH: ${{ github.ref_name }} - -jobs: - build-and-push-images: - runs-on: ubuntu-latest - environment: - name: ${{ github.ref_name }} - permissions: - contents: read - packages: write - - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Log in to the Container registry - uses: docker/login-action@v2 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Extract api version - id: extract_api_version - run: | - cd src/backend - echo "API_VERSION=$(python -c 'from app.__version__ import __version__; print(__version__)')" >> $GITHUB_ENV - - - name: Build image - uses: docker/build-push-action@v4 - with: - context: src/backend - target: ci - push: true - tags: | - "ghcr.io/hotosm/fmtm/backend:${{ env.API_VERSION }}-ci-${{ github.ref_name }}" - "ghcr.io/hotosm/fmtm/backend:ci-${{ github.ref_name }}" - build-args: | - API_VERSION=${{ env.API_VERSION }} diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 1e3219854a..7929e7a495 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -11,6 +11,8 @@ on: jobs: pytest: - uses: ./.github/workflows/reusable/pytest.yml - frontend-tests: - uses: ./.github/workflows/reusable/frontend_tests.yml + uses: ./.github/workflows/r-pytest.yml + with: + image_tag: ci-${{ github.base_ref }} + frontend-main-tests: + uses: ./.github/workflows/r-frontend_tests.yml diff --git a/.github/workflows/pr_pytest.yml b/.github/workflows/pr_pytest.yml deleted file mode 100644 index 7f1009b55f..0000000000 --- a/.github/workflows/pr_pytest.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: PR - -on: - pull_request: - branches: - - main - - staging - - development - paths: - - src/backend/** - # Allow manual trigger (workflow_dispatch) - workflow_dispatch: - -jobs: - frontend-tests: - runs-on: ubuntu-latest - environment: - name: ${{ github.ref_name }} - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: PyTest - uses: ./.github/workflows/reusable/pytest.yml diff --git a/.github/workflows/r-build_backend.yml b/.github/workflows/r-build_backend.yml new file mode 100644 index 0000000000..2cbe22d166 --- /dev/null +++ b/.github/workflows/r-build_backend.yml @@ -0,0 +1,44 @@ +name: Build Backend Imgs + +on: + workflow_call: + paths: + - src/backend/** + inputs: + api_version: + required: true + type: string + build_target: + required: true + type: string + image_tags: + required: true + type: string + +jobs: + build-and-push-images: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Log in to the Container registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and push backend + uses: docker/build-push-action@v4 + with: + context: src/backend + target: ${{ inputs.build_target }} + push: true + tags: ${{ inputs.image_tags }} + build-args: | + APP_VERSION=${{ inputs.api_version }} diff --git a/.github/workflows/r-build_frontend.yml b/.github/workflows/r-build_frontend.yml new file mode 100644 index 0000000000..4b23a7824f --- /dev/null +++ b/.github/workflows/r-build_frontend.yml @@ -0,0 +1,57 @@ +name: Build Frontend Imgs + +on: + workflow_call: + paths: + - src/frontend/** + inputs: + environment: + required: true + type: string + name: + required: true + type: string + app_version: + required: true + type: string + build_target: + required: true + type: string + image_tags: + required: true + type: string + +jobs: + build-and-push-images: + runs-on: ubuntu-latest + environment: + name: ${{ inputs.environment }} + permissions: + contents: read + packages: write + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Log in to the Container registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and push frontend + uses: docker/build-push-action@v4 + with: + context: src/frontend + file: src/frontend/prod.dockerfile + target: ${{ inputs.build_target }} + push: true + tags: ${{ inputs.image_tags }} + build-args: | + APP_NAME=${{ inputs.name }} + APP_VERSION=${{ inputs.app_version }} + API_URL=${{ vars.URL_SCHEME }}://${{ vars.API_URL }} + FRONTEND_MAIN_URL=${{ vars.URL_SCHEME }}://${{ vars.FRONTEND_MAIN_URL }} + FRONTEND_MAP_URL=${{ vars.URL_SCHEME }}://${{ vars.FRONTEND_MAP_URL }} diff --git a/.github/workflows/r-extract_versions.yml b/.github/workflows/r-extract_versions.yml new file mode 100644 index 0000000000..cebb301f93 --- /dev/null +++ b/.github/workflows/r-extract_versions.yml @@ -0,0 +1,42 @@ +name: Extract Versions + +on: + workflow_call: + outputs: + api_version: + description: "Backend API Version" + value: ${{ jobs.extract-versions.outputs.api_version }} + frontend_main_version: + description: "Frontend Main Version" + value: ${{ jobs.extract-versions.outputs.frontend_main_version }} + frontend_map_version: + description: "Frontend Map Version" + value: ${{ jobs.extract-versions.outputs.frontend_map_version }} + +jobs: + extract-versions: + runs-on: ubuntu-latest + outputs: + api_version: ${{ steps.extract_api_version.outputs.api_version }} + frontend_main_version: ${{ steps.extract_frontend_versions.outputs.frontend_main_version }} + frontend_map_version: ${{ steps.extract_frontend_versions.outputs.frontend_map_version }} + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Extract api version + id: extract_api_version + run: | + cd src/backend + API_VERSION=$(python -c 'from app.__version__ import __version__; print(__version__)') + echo "api_version=${API_VERSION}" >> $GITHUB_OUTPUT + + - name: Extract frontend versions + id: extract_frontend_versions + run: | + cd src/frontend + FRONTEND_MAIN_VERSION=$(jq -r '.version' main/package.json) + FRONTEND_MAP_VERSION=$(jq -r '.version' fmtm_openlayer_map/package.json) + echo "frontend_main_version=${FRONTEND_MAIN_VERSION}" >> $GITHUB_OUTPUT + echo "frontend_map_version=${FRONTEND_MAP_VERSION}" >> $GITHUB_OUTPUT diff --git a/.github/workflows/r-frontend_tests.yml b/.github/workflows/r-frontend_tests.yml new file mode 100644 index 0000000000..f71021073d --- /dev/null +++ b/.github/workflows/r-frontend_tests.yml @@ -0,0 +1,36 @@ +name: Frontend Tests + +on: + workflow_call: + paths: + - src/frontend/** + +jobs: + test: + name: Run Frontend Tests + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: "18" + + - name: Cache Node Modules + uses: actions/cache@v3 + with: + path: | + src/frontend/main/node_modules + src/frontend/fmtm_openlayer_map/node_modules + keys: node-modules-${{ env.cache_id }} + restore-keys: | + node-modules- + + - name: Test Frontend Main + run: | + cd src/frontend/main + npm ci --only-dev + npm run test diff --git a/.github/workflows/reusable/pytest.yml b/.github/workflows/r-pytest.yml similarity index 87% rename from .github/workflows/reusable/pytest.yml rename to .github/workflows/r-pytest.yml index ddc9276005..39af7a3f80 100644 --- a/.github/workflows/reusable/pytest.yml +++ b/.github/workflows/r-pytest.yml @@ -4,6 +4,13 @@ on: workflow_call: paths: - src/backend/** + inputs: + image_tag: + required: true + type: string + environment: + required: false + type: string permissions: contents: read @@ -12,10 +19,10 @@ jobs: test: runs-on: ubuntu-latest environment: - name: test + name: ${{ inputs.environment || test }} container: - image: ghcr.io/hotosm/fmtm/backend:ci-${{ github.base_ref || github.ref_name }} + image: ghcr.io/hotosm/fmtm/backend:${{ inputs.image_tag }} env: ODK_CENTRAL_URL: ${{ vars.ODK_CENTRAL_URL }} ODK_CENTRAL_USER: ${{ vars.ODK_CENTRAL_USER }} @@ -29,7 +36,7 @@ jobs: services: # Start backend database fmtm-db: - image: postgis/postgis:14-3.3-alpine + image: "postgis/postgis:14-3.3-alpine" env: POSTGRES_PASSWORD: fmtm POSTGRES_DB: fmtm diff --git a/.github/workflows/reusable/frontend_tests.yml b/.github/workflows/reusable/frontend_tests.yml deleted file mode 100644 index 56dd3dab30..0000000000 --- a/.github/workflows/reusable/frontend_tests.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Frontend Tests - -on: - workflow_call: - paths: - - src/frontend/** - -jobs: - test: - name: Run Frontend Tests - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3 - - - name: Setup Node.js - uses: actions/setup-node@v2 - with: - node-version: "18" # Change this to your preferred Node.js version - - - name: Test Frontend Main - run: | - cd src/frontend/main - npm install - npm run test diff --git a/.github/workflows/tests/pr_payload.json b/.github/workflows/tests/pr_payload.json new file mode 100644 index 0000000000..9046102093 --- /dev/null +++ b/.github/workflows/tests/pr_payload.json @@ -0,0 +1,10 @@ +{ + "pull_request": { + "head": { + "ref": "feat/some-new-thing" + }, + "base": { + "ref": "development" + } + } +} diff --git a/.github/workflows/tests/push_payload.json b/.github/workflows/tests/push_payload.json new file mode 100644 index 0000000000..eb2701ab2c --- /dev/null +++ b/.github/workflows/tests/push_payload.json @@ -0,0 +1,3 @@ +{ + "base_ref ": "development" +} diff --git a/.github/workflows/tests/test_ci.sh b/.github/workflows/tests/test_ci.sh new file mode 100644 index 0000000000..e370d28815 --- /dev/null +++ b/.github/workflows/tests/test_ci.sh @@ -0,0 +1,30 @@ +#!/bin/sh + +set -e + +######################################## +# Note: run this from the repo root. +######################################## + +# TODO read personal access token +# read -p +# GITHUB_TOKEN=input +# Feed to act using -s flag: -s GITHUB_TOKEN=input_personal_access_token + +# PR +act pull_request -W .github/workflows/pr.yml -e .github/workflows/tests/pr_payload.json + +# Build and deploy +act push -W .github/workflows/build_and_deploy.yml -e .github/workflows/tests/push_payload.json + +# CI Img Build +act push -W .github/workflows/build_ci_img.yml -e .github/workflows/tests/push_payload.json + +# ODK Img Build +act push -W .github/workflows/build_odk_imgs.yml -e .github/workflows/tests/push_payload.json + +# Docs +act push -W .github/workflows/docs.yml -e .github/workflows/tests/push_payload.json + +# Wiki +act push -W .github/workflows/wiki.yml -e .github/workflows/tests/push_payload.json diff --git a/src/backend/app/projects/project_crud.py b/src/backend/app/projects/project_crud.py index adc69cdc9b..c48e8d4678 100644 --- a/src/backend/app/projects/project_crud.py +++ b/src/backend/app/projects/project_crud.py @@ -45,7 +45,7 @@ from osm_fieldwork.make_data_extract import PostgresClient from osm_fieldwork.OdkCentral import OdkAppUser from osm_fieldwork.xlsforms import xlsforms_path -from osm_fieldwork import json2osm +from osm_fieldwork.json2osm import json2osm from shapely import wkt from shapely.geometry import MultiPolygon, Polygon, mapping, shape from sqlalchemy import and_, column, func, inspect, select, table From 82ef69be50f44f7b75e6abae6c640e1c2e68c18f Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Wed, 20 Sep 2023 15:14:13 +0100 Subject: [PATCH 24/59] ci: fix flow, remove frontend-map refs --- .github/workflows/build_and_deploy.yml | 32 +++++++++++++++----------- .github/workflows/pr.yml | 2 +- .github/workflows/r-pytest.yml | 2 +- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/.github/workflows/build_and_deploy.yml b/.github/workflows/build_and_deploy.yml index 00465a56e6..ebf8bca32a 100644 --- a/.github/workflows/build_and_deploy.yml +++ b/.github/workflows/build_and_deploy.yml @@ -19,13 +19,13 @@ jobs: with: image_tag: ci-${{ github.ref_name }} - frontend-main-tests: + frontend-tests: uses: ./.github/workflows/r-frontend_tests.yml extract-versions: needs: - pytest - - frontend-main-tests + - frontend-tests uses: ./.github/workflows/r-extract_versions.yml backend-build: @@ -50,18 +50,6 @@ jobs: "ghcr.io/hotosm/fmtm/frontend/main:${{ needs.extract-versions.outputs.frontend_main_version }}-${{ github.ref_name }}" "ghcr.io/hotosm/fmtm/frontend/main:latest" - frontend-map-build: - uses: ./.github/workflows/r-build_frontend.yml - needs: extract-versions - with: - environment: ${{ github.ref_name }} - name: fmtm_openlayer_map - app_version: ${{ needs.extract-versions.outputs.frontend_map_version }} - build_target: prod - image_tags: | - "ghcr.io/hotosm/fmtm/frontend/map:${{ needs.extract-versions.outputs.frontend_map_version }}-${{ github.ref_name }}" - "ghcr.io/hotosm/fmtm/frontend/map:latest" - smoke-test-backend: runs-on: ubuntu-latest needs: @@ -90,11 +78,27 @@ jobs: docker compose --file docker-compose.deploy.yml pull api docker compose --file docker-compose.deploy.yml up api --exit-code-from api + smoke-test-frontend: + runs-on: ubuntu-latest + needs: + - extract-versions + - frontend-main-build + environment: + name: ${{ github.ref_name }} + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Frontend smoke test + run: echo "Not implemented" + deploy-containers: runs-on: ubuntu-latest needs: - extract-versions - smoke-test-backend + - smoke-test-frontend environment: name: ${{ github.ref_name }} diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 7929e7a495..1a0cd9920f 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -14,5 +14,5 @@ jobs: uses: ./.github/workflows/r-pytest.yml with: image_tag: ci-${{ github.base_ref }} - frontend-main-tests: + frontend-tests: uses: ./.github/workflows/r-frontend_tests.yml diff --git a/.github/workflows/r-pytest.yml b/.github/workflows/r-pytest.yml index 39af7a3f80..e90f270a9a 100644 --- a/.github/workflows/r-pytest.yml +++ b/.github/workflows/r-pytest.yml @@ -19,7 +19,7 @@ jobs: test: runs-on: ubuntu-latest environment: - name: ${{ inputs.environment || test }} + name: ${{ inputs.environment || 'test' }} container: image: ghcr.io/hotosm/fmtm/backend:${{ inputs.image_tag }} From 53a3e360d9aee46300bc42ffb047788bbe91e84d Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Wed, 20 Sep 2023 15:33:04 +0100 Subject: [PATCH 25/59] ci: set paths on parent workflows, not reusable workflows --- .github/workflows/build_and_deploy.yml | 2 +- .github/workflows/pr.yml | 3 +++ .github/workflows/r-build_backend.yml | 2 -- .github/workflows/r-build_frontend.yml | 2 -- .github/workflows/r-frontend_tests.yml | 2 -- .github/workflows/r-pytest.yml | 2 -- 6 files changed, 4 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build_and_deploy.yml b/.github/workflows/build_and_deploy.yml index ebf8bca32a..caa31a67a9 100644 --- a/.github/workflows/build_and_deploy.yml +++ b/.github/workflows/build_and_deploy.yml @@ -9,7 +9,7 @@ on: - development paths: # Workflow is triggered only if src changes - - "src/**" + - src/** # Allow manual trigger workflow_dispatch: diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 1a0cd9920f..2423749925 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -6,6 +6,9 @@ on: - main - staging - development + # Workflow is triggered only if src changes + paths: + - src/** # Allow manual trigger (workflow_dispatch) workflow_dispatch: diff --git a/.github/workflows/r-build_backend.yml b/.github/workflows/r-build_backend.yml index 2cbe22d166..e862f23aeb 100644 --- a/.github/workflows/r-build_backend.yml +++ b/.github/workflows/r-build_backend.yml @@ -2,8 +2,6 @@ name: Build Backend Imgs on: workflow_call: - paths: - - src/backend/** inputs: api_version: required: true diff --git a/.github/workflows/r-build_frontend.yml b/.github/workflows/r-build_frontend.yml index 4b23a7824f..5e9b5d3dad 100644 --- a/.github/workflows/r-build_frontend.yml +++ b/.github/workflows/r-build_frontend.yml @@ -2,8 +2,6 @@ name: Build Frontend Imgs on: workflow_call: - paths: - - src/frontend/** inputs: environment: required: true diff --git a/.github/workflows/r-frontend_tests.yml b/.github/workflows/r-frontend_tests.yml index f71021073d..a0d6cc35f2 100644 --- a/.github/workflows/r-frontend_tests.yml +++ b/.github/workflows/r-frontend_tests.yml @@ -2,8 +2,6 @@ name: Frontend Tests on: workflow_call: - paths: - - src/frontend/** jobs: test: diff --git a/.github/workflows/r-pytest.yml b/.github/workflows/r-pytest.yml index e90f270a9a..d92b8f8187 100644 --- a/.github/workflows/r-pytest.yml +++ b/.github/workflows/r-pytest.yml @@ -2,8 +2,6 @@ name: pytest on: workflow_call: - paths: - - src/backend/** inputs: image_tag: required: true From 6a554b48a5f565a680f52f797d30f5f6073d6220 Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Wed, 20 Sep 2023 15:34:56 +0100 Subject: [PATCH 26/59] ci: tweak workflows needs ordering --- .github/workflows/build_and_deploy.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/build_and_deploy.yml b/.github/workflows/build_and_deploy.yml index caa31a67a9..68eec5d4b0 100644 --- a/.github/workflows/build_and_deploy.yml +++ b/.github/workflows/build_and_deploy.yml @@ -53,7 +53,6 @@ jobs: smoke-test-backend: runs-on: ubuntu-latest needs: - - extract-versions - backend-build environment: name: ${{ github.ref_name }} @@ -81,7 +80,6 @@ jobs: smoke-test-frontend: runs-on: ubuntu-latest needs: - - extract-versions - frontend-main-build environment: name: ${{ github.ref_name }} @@ -96,7 +94,6 @@ jobs: deploy-containers: runs-on: ubuntu-latest needs: - - extract-versions - smoke-test-backend - smoke-test-frontend environment: From 1010e20207a4113057e8228a1008869975554f58 Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Wed, 20 Sep 2023 15:46:51 +0100 Subject: [PATCH 27/59] ci: remove all refs to frontend-map or ui-map --- .github/workflows/build_and_deploy.yml | 4 ---- .github/workflows/r-build_frontend.yml | 1 - .github/workflows/r-extract_versions.yml | 10 ++-------- .github/workflows/r-frontend_tests.yml | 1 - docker-compose.noodk.yml | 24 ------------------------ 5 files changed, 2 insertions(+), 38 deletions(-) diff --git a/.github/workflows/build_and_deploy.yml b/.github/workflows/build_and_deploy.yml index 68eec5d4b0..166885b065 100644 --- a/.github/workflows/build_and_deploy.yml +++ b/.github/workflows/build_and_deploy.yml @@ -65,12 +65,10 @@ jobs: env: API_VERSION: ${{ needs.extract-versions.outputs.api_version }} FRONTEND_MAIN_VERSION: ${{ needs.extract-versions.outputs.frontend_main_version }} - FRONTEND_MAP_VERSION: ${{ needs.extract-versions.outputs.frontend_map_version }} run: | echo "${{ secrets.DOTENV }}" > .env echo "API_VERSION=${API_VERSION}" >> .env echo "FRONTEND_MAIN_VERSION=${FRONTEND_MAIN_VERSION}" >> .env - echo "FRONTEND_MAP_VERSION=${FRONTEND_MAP_VERSION}" >> .env - name: Backend smoke test run: | @@ -107,12 +105,10 @@ jobs: env: API_VERSION: ${{ needs.extract-versions.outputs.api_version }} FRONTEND_MAIN_VERSION: ${{ needs.extract-versions.outputs.frontend_main_version }} - FRONTEND_MAP_VERSION: ${{ needs.extract-versions.outputs.frontend_map_version }} run: | echo "${{ secrets.DOTENV }}" > .env echo "API_VERSION=${API_VERSION}" >> .env echo "FRONTEND_MAIN_VERSION=${FRONTEND_MAIN_VERSION}" >> .env - echo "FRONTEND_MAP_VERSION=${FRONTEND_MAP_VERSION}" >> .env - uses: webfactory/ssh-agent@v0.7.0 with: diff --git a/.github/workflows/r-build_frontend.yml b/.github/workflows/r-build_frontend.yml index 5e9b5d3dad..1b62d0328c 100644 --- a/.github/workflows/r-build_frontend.yml +++ b/.github/workflows/r-build_frontend.yml @@ -52,4 +52,3 @@ jobs: APP_VERSION=${{ inputs.app_version }} API_URL=${{ vars.URL_SCHEME }}://${{ vars.API_URL }} FRONTEND_MAIN_URL=${{ vars.URL_SCHEME }}://${{ vars.FRONTEND_MAIN_URL }} - FRONTEND_MAP_URL=${{ vars.URL_SCHEME }}://${{ vars.FRONTEND_MAP_URL }} diff --git a/.github/workflows/r-extract_versions.yml b/.github/workflows/r-extract_versions.yml index cebb301f93..4d2dd1c0cd 100644 --- a/.github/workflows/r-extract_versions.yml +++ b/.github/workflows/r-extract_versions.yml @@ -9,17 +9,13 @@ on: frontend_main_version: description: "Frontend Main Version" value: ${{ jobs.extract-versions.outputs.frontend_main_version }} - frontend_map_version: - description: "Frontend Map Version" - value: ${{ jobs.extract-versions.outputs.frontend_map_version }} jobs: extract-versions: runs-on: ubuntu-latest outputs: api_version: ${{ steps.extract_api_version.outputs.api_version }} - frontend_main_version: ${{ steps.extract_frontend_versions.outputs.frontend_main_version }} - frontend_map_version: ${{ steps.extract_frontend_versions.outputs.frontend_map_version }} + frontend_main_version: ${{ steps.extract_frontend_version.outputs.frontend_main_version }} steps: - name: Checkout repository @@ -33,10 +29,8 @@ jobs: echo "api_version=${API_VERSION}" >> $GITHUB_OUTPUT - name: Extract frontend versions - id: extract_frontend_versions + id: extract_frontend_version run: | cd src/frontend FRONTEND_MAIN_VERSION=$(jq -r '.version' main/package.json) - FRONTEND_MAP_VERSION=$(jq -r '.version' fmtm_openlayer_map/package.json) echo "frontend_main_version=${FRONTEND_MAIN_VERSION}" >> $GITHUB_OUTPUT - echo "frontend_map_version=${FRONTEND_MAP_VERSION}" >> $GITHUB_OUTPUT diff --git a/.github/workflows/r-frontend_tests.yml b/.github/workflows/r-frontend_tests.yml index a0d6cc35f2..2745488360 100644 --- a/.github/workflows/r-frontend_tests.yml +++ b/.github/workflows/r-frontend_tests.yml @@ -22,7 +22,6 @@ jobs: with: path: | src/frontend/main/node_modules - src/frontend/fmtm_openlayer_map/node_modules keys: node-modules-${{ env.cache_id }} restore-keys: | node-modules- diff --git a/docker-compose.noodk.yml b/docker-compose.noodk.yml index 88ac3fa3ed..5022cadc6a 100644 --- a/docker-compose.noodk.yml +++ b/docker-compose.noodk.yml @@ -90,27 +90,3 @@ services: networks: - fmtm-dev restart: unless-stopped - - ui-map: - image: "ghcr.io/hotosm/fmtm/frontend/map:debug" - build: - context: src/frontend - dockerfile: debug.dockerfile - args: - APP_NAME: fmtm_openlayer_map - API_URL: ${URL_SCHEME}://${API_URL} - FRONTEND_MAIN_URL: ${URL_SCHEME}://${FRONTEND_MAIN_URL} - container_name: fmtm_map - depends_on: - - api - volumes: - - ./src/frontend/fmtm_openlayer_map:/app - - /app/node_modules/ - environment: - - API_URL=${URL_SCHEME}://${API_URL} - - FRONTEND_MAIN_URL=${URL_SCHEME}://${FRONTEND_MAIN_URL} - ports: - - "8082:8082" - networks: - - fmtm-dev - restart: unless-stopped From 53f033b50f6fd89a0d059e83dd5342ab3ac2e83a Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Wed, 20 Sep 2023 15:47:56 +0100 Subject: [PATCH 28/59] docs: remove all refs to microfrontend --- INSTALL.md | 37 +++++------------------------------ docs/dev/Frontend.md | 46 ++++++++++---------------------------------- 2 files changed, 15 insertions(+), 68 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index d460db39f2..18e0765cd7 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -16,7 +16,6 @@ 3. [Setting up the Frontend](#setting-up-the-frontend) - [Fork and Clone the FMTM repository](#fork-and-clone-the-fmtm-repository-1) - - [The Microfrontend configuration](#the-microfrontend-configuration) - [Start the Frontends with Docker](#start-the-frontends-with-docker) # 1. Software Requirements @@ -191,40 +190,14 @@ Clone the forked repository to your local machine using the following command: Make sure to replace `` with your GitHub username. -## The Microfrontend configuration - -The FMTM frontend is built using a microfrontend architecture, divided into modules that can be developed, tested, and deployed independently. - -Webpack remote modules are used to achieve this, dynamically loading code from other microfrontend applications. - -In theory, this should improve the performance and scalability of the application. -However, great care should be taken with watching dependency versions across modules, to prevent loading more js content than is required. - -List of current microfrontend modules: - -- **main**: - - Description: The main frontend, displays projects and tasks. - - Location: src/frontend/main - - Port: 8080. -- **fmtm_openlayers_map**: - - Description: The map component, displays tasks on a map. - - Location: src/frontend/fmtm_openlayers_map - - Port: 8081. - -## Start the Frontends with Docker - -This is the easiest way to manage multiple frontends at once. - -### Starting the Frontend Containers +## Start the Frontend with Docker 1. You will need to [Install Docker](https://docs.docker.com/engine/install/) and ensure that it is running on your local machine. 2. From the command line: navigate to the top level directory of the FMTM project. -3. From the command line run: `docker compose build ui-main ui-map` - This is essential, as the development containers for the frontend are different to production. -4. Once everything is built, from the command line run: `docker compose up -d ui-main ui-map` +3. From the command line run: `docker compose build ui-main` + This is essential, as the development container for the frontend is different to production. +4. Once everything is built, from the command line run: `docker compose up -d ui-main` -5. If everything goes well you should now be able to **navigate to the project in your browser:** - - **Main:** - - **Map:** +5. If everything goes well you should now be able to **navigate to the project in your browser:** That's it, you have successfully set up the frontend!! diff --git a/docs/dev/Frontend.md b/docs/dev/Frontend.md index 8f4b99e43c..6a2d5e4359 100644 --- a/docs/dev/Frontend.md +++ b/docs/dev/Frontend.md @@ -1,28 +1,8 @@ # Frontend Deployment for Development -## The Microfrontend configuration +## 1. Start the Frontend with Docker -The FMTM frontend is built using a microfrontend architecture, divided into modules that can be developed, tested, and deployed independently. - -Webpack remote modules are used to achieve this, dynamically loading code from other microfrontend applications. - -In theory, this should improve the performance and scalability of the application. -However, great care should be taken with watching dependency versions across modules, to prevent loading more js content than is required. - -List of current microfrontend modules: - -- **main**: - - Description: The main frontend, displays projects and tasks. - - Location: src/frontend/main - - Port: 8080. -- **fmtm_openlayers_map**: - - Description: The map component, displays tasks on a map. - - Location: src/frontend/fmtm_openlayers_map - - Port: 8081. - -## 1. Start the Frontends with Docker - -This is the easiest way to manage multiple frontends at once. +This is the easiest way to manage all of the services together. ### 1A: Starting the API Containers @@ -32,19 +12,17 @@ For details on how to run the API first, please see: [DEV 2. Backend](https://gi 1. You will need to [Install Docker](https://docs.docker.com/engine/install/) and ensure that it is running on your local machine. 2. From the command line: navigate to the top level directory of the FMTM project. -3. From the command line run: `docker compose build ui-main ui-map` - This is essential, as the development containers for the frontend are different to production. -4. Once everything is built, from the command line run: `docker compose up -d ui-main ui-map` +3. From the command line run: `docker compose build ui-main` + This is essential, as the development container for the frontend is different to production. +4. Once everything is built, from the command line run: `docker compose up -d ui-main` -5. If everything goes well you should now be able to **navigate to the project in your browser:** - - **Main:** - - **Map:** +5. If everything goes well you should now be able to **navigate to the project in your browser:** -## 2. Start the Frontends locally +## 2. Start the Frontend locally -### 2A: Navigate to the module subdirectory +### 2A: Navigate to the frontend subdirectory -See [here](#the-microfrontend-configuration) for the module location. +This should like be `src/frontend/main`. ### 2B: Install dependencies @@ -52,14 +30,10 @@ Install the dependencies by running the following command: `npm install` ### 2C. Run the project -Run the microfrontend with hot-reloading: `npm run start:live` +Run the frontend with hot-reloading: `npm run start:live` The frontend should now be accessible at: <<<<<<>>>>>>>. -### 2D. Repeat for each module - -Each module in the microfrontend must be running for it to operate as a whole. - ## Frontend Tips The frontend is built with React and Typescript. Here are some tips on how to work with the frontend: From 962b2c822176314608a75719a06ab740b4e99ffa Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Wed, 20 Sep 2023 15:51:43 +0100 Subject: [PATCH 29/59] build: fix add prod stage to frontend dockerfile --- src/frontend/prod.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/prod.dockerfile b/src/frontend/prod.dockerfile index 4997b710c2..f74b9df4b7 100644 --- a/src/frontend/prod.dockerfile +++ b/src/frontend/prod.dockerfile @@ -23,7 +23,7 @@ COPY ${APP_NAME}/ . RUN npm run build -FROM docker.io/devforth/spa-to-http:1.0.3 +FROM docker.io/devforth/spa-to-http:1.0.3 as prod WORKDIR /app # Add non-root user, permissions RUN adduser -D -u 900 -h /home/appuser appuser From 51aa885305f2ac2d666684415424770c49b20912 Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Wed, 20 Sep 2023 16:19:44 +0100 Subject: [PATCH 30/59] build: remove APP_NAME from frontend (microfrontend) --- .github/workflows/r-build_frontend.yml | 1 - docker-compose.deploy.yml | 1 - docker-compose.noodk.yml | 2 +- src/frontend/debug.dockerfile | 3 +-- src/frontend/prod.dockerfile | 7 +++---- 5 files changed, 5 insertions(+), 9 deletions(-) diff --git a/.github/workflows/r-build_frontend.yml b/.github/workflows/r-build_frontend.yml index 1b62d0328c..80bddecf56 100644 --- a/.github/workflows/r-build_frontend.yml +++ b/.github/workflows/r-build_frontend.yml @@ -48,7 +48,6 @@ jobs: push: true tags: ${{ inputs.image_tags }} build-args: | - APP_NAME=${{ inputs.name }} APP_VERSION=${{ inputs.app_version }} API_URL=${{ vars.URL_SCHEME }}://${{ vars.API_URL }} FRONTEND_MAIN_URL=${{ vars.URL_SCHEME }}://${{ vars.FRONTEND_MAIN_URL }} diff --git a/docker-compose.deploy.yml b/docker-compose.deploy.yml index 5085516a59..014ab46fb7 100644 --- a/docker-compose.deploy.yml +++ b/docker-compose.deploy.yml @@ -111,7 +111,6 @@ services: context: src/frontend dockerfile: prod.dockerfile args: - APP_NAME: main APP_VERSION: ${FRONTEND_MAIN_VERSION} API_URL: ${URL_SCHEME}://${API_URL} FRONTEND_MAIN_URL: ${URL_SCHEME}://${FRONTEND_MAIN_URL} diff --git a/docker-compose.noodk.yml b/docker-compose.noodk.yml index 5022cadc6a..87123c6a0b 100644 --- a/docker-compose.noodk.yml +++ b/docker-compose.noodk.yml @@ -73,7 +73,7 @@ services: context: src/frontend dockerfile: debug.dockerfile args: - APP_NAME: main + APP_VERSION: ${FRONTEND_MAIN_VERSION} API_URL: ${URL_SCHEME}://${API_URL} FRONTEND_MAIN_URL: ${URL_SCHEME}://${FRONTEND_MAIN_URL} container_name: fmtm_main diff --git a/src/frontend/debug.dockerfile b/src/frontend/debug.dockerfile index dda364d8b5..0c25ddc9ff 100755 --- a/src/frontend/debug.dockerfile +++ b/src/frontend/debug.dockerfile @@ -1,11 +1,10 @@ FROM docker.io/node:18 -ARG APP_NAME ARG API_URL ENV API_URL="${API_URL}" ARG FRONTEND_MAIN_URL ENV FRONTEND_MAIN_URL="${FRONTEND_MAIN_URL}" WORKDIR /app -COPY ./${APP_NAME}/package*.json ./ +COPY main/package*.json ./ RUN npm install ENV NODE_ENV development ENTRYPOINT ["npm", "run", "start:live"] diff --git a/src/frontend/prod.dockerfile b/src/frontend/prod.dockerfile index f74b9df4b7..a1bdfe141b 100644 --- a/src/frontend/prod.dockerfile +++ b/src/frontend/prod.dockerfile @@ -1,25 +1,24 @@ FROM docker.io/node:18 as builder ARG MAINTAINER=admin@hotosm.org -ARG APP_NAME ARG APP_VERSION ARG API_URL ENV API_URL="${API_URL}" ARG FRONTEND_MAIN_URL ENV FRONTEND_MAIN_URL="${FRONTEND_MAIN_URL}" -LABEL org.hotosm.fmtm.app-name="${APP_NAME}" \ +LABEL org.hotosm.fmtm.app-name="fmtm-frontend" \ org.hotosm.fmtm.app-version="${APP_VERSION}" \ org.hotosm.fmtm.maintainer="${MAINTAINER}" \ org.hotosm.fmtm.api-url="${API_URL}" \ org.hotosm.fmtm.main-url="${FRONTEND_MAIN_URL}" WORKDIR /app -COPY ./${APP_NAME}/package*.json ./ +COPY main/package*.json ./ RUN npm install ENV NODE_ENV production -COPY ${APP_NAME}/ . +COPY main/ . RUN npm run build From cddb028608df7d720c7022a1499bcd33e2e0fee2 Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Wed, 20 Sep 2023 16:20:02 +0100 Subject: [PATCH 31/59] ci: some secret vars via secrets, env via vars --- .github/workflows/r-pytest.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/r-pytest.yml b/.github/workflows/r-pytest.yml index d92b8f8187..7b6d707d3f 100644 --- a/.github/workflows/r-pytest.yml +++ b/.github/workflows/r-pytest.yml @@ -24,10 +24,10 @@ jobs: env: ODK_CENTRAL_URL: ${{ vars.ODK_CENTRAL_URL }} ODK_CENTRAL_USER: ${{ vars.ODK_CENTRAL_USER }} - ODK_CENTRAL_PASSWD: ${{ vars.ODK_CENTRAL_PASSWD }} - OSM_CLIENT_ID: ${{ vars.OSM_CLIENT_ID }} - OSM_CLIENT_SECRET: ${{ vars.OSM_CLIENT_SECRET }} - OSM_SECRET_KEY: ${{ vars.OSM_SECRET_KEY }} + ODK_CENTRAL_PASSWD: ${{ secret.ODK_CENTRAL_PASSWD }} + OSM_CLIENT_ID: ${{ secret.OSM_CLIENT_ID }} + OSM_CLIENT_SECRET: ${{ secret.OSM_CLIENT_SECRET }} + OSM_SECRET_KEY: ${{ secret.OSM_SECRET_KEY }} FRONTEND_MAIN_URL: ${{ vars.FRONTEND_MAIN_URL }} options: --user root From 3338abd1ceb2863afd4ca90c57255895b3b9613a Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Wed, 20 Sep 2023 16:21:06 +0100 Subject: [PATCH 32/59] ci: fix workflow secret --> secrets --- .github/workflows/r-pytest.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/r-pytest.yml b/.github/workflows/r-pytest.yml index 7b6d707d3f..2080e45937 100644 --- a/.github/workflows/r-pytest.yml +++ b/.github/workflows/r-pytest.yml @@ -24,10 +24,10 @@ jobs: env: ODK_CENTRAL_URL: ${{ vars.ODK_CENTRAL_URL }} ODK_CENTRAL_USER: ${{ vars.ODK_CENTRAL_USER }} - ODK_CENTRAL_PASSWD: ${{ secret.ODK_CENTRAL_PASSWD }} - OSM_CLIENT_ID: ${{ secret.OSM_CLIENT_ID }} - OSM_CLIENT_SECRET: ${{ secret.OSM_CLIENT_SECRET }} - OSM_SECRET_KEY: ${{ secret.OSM_SECRET_KEY }} + ODK_CENTRAL_PASSWD: ${{ secrets.ODK_CENTRAL_PASSWD }} + OSM_CLIENT_ID: ${{ secrets.OSM_CLIENT_ID }} + OSM_CLIENT_SECRET: ${{ secrets.OSM_CLIENT_SECRET }} + OSM_SECRET_KEY: ${{ secrets.OSM_SECRET_KEY }} FRONTEND_MAIN_URL: ${{ vars.FRONTEND_MAIN_URL }} options: --user root From 9026b15db4783c22d260c923fe0ff4079a54a29e Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Wed, 20 Sep 2023 17:01:41 +0100 Subject: [PATCH 33/59] ci: set secret vars in env first (pytest) --- .github/workflows/r-pytest.yml | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/.github/workflows/r-pytest.yml b/.github/workflows/r-pytest.yml index 2080e45937..ade2ccb343 100644 --- a/.github/workflows/r-pytest.yml +++ b/.github/workflows/r-pytest.yml @@ -18,16 +18,21 @@ jobs: runs-on: ubuntu-latest environment: name: ${{ inputs.environment || 'test' }} + env: + ODK_CENTRAL_PASSWD: ${{ secrets.ODK_CENTRAL_PASSWD }} + OSM_CLIENT_ID: ${{ secrets.OSM_CLIENT_ID }} + OSM_CLIENT_SECRET: ${{ secrets.OSM_CLIENT_SECRET }} + OSM_SECRET_KEY: ${{ secrets.OSM_SECRET_KEY }} container: image: ghcr.io/hotosm/fmtm/backend:${{ inputs.image_tag }} env: ODK_CENTRAL_URL: ${{ vars.ODK_CENTRAL_URL }} ODK_CENTRAL_USER: ${{ vars.ODK_CENTRAL_USER }} - ODK_CENTRAL_PASSWD: ${{ secrets.ODK_CENTRAL_PASSWD }} - OSM_CLIENT_ID: ${{ secrets.OSM_CLIENT_ID }} - OSM_CLIENT_SECRET: ${{ secrets.OSM_CLIENT_SECRET }} - OSM_SECRET_KEY: ${{ secrets.OSM_SECRET_KEY }} + ODK_CENTRAL_PASSWD: ${{ env.ODK_CENTRAL_PASSWD }} + OSM_CLIENT_ID: ${{ env.OSM_CLIENT_ID }} + OSM_CLIENT_SECRET: ${{ env.OSM_CLIENT_SECRET }} + OSM_SECRET_KEY: ${{ env.OSM_SECRET_KEY }} FRONTEND_MAIN_URL: ${{ vars.FRONTEND_MAIN_URL }} options: --user root @@ -62,17 +67,9 @@ jobs: central: image: "ghcr.io/hotosm/fmtm/odkcentral:v2023.2.1" env: - DOMAIN: local - SYSADMIN_EMAIL: test@hotosm.org - SYSADMIN_PASSWD: odk - HTTPS_PORT: 443 + SYSADMIN_EMAIL: ${{ vars.ODK_CENTRAL_USER }} + SYSADMIN_PASSWD: ${{ secrets.ODK_CENTRAL_PASSWD }} DB_HOST: central-db - DB_USER: odk - DB_PASSWORD: odk - DB_NAME: odk - SENTRY_ORG_SUBDOMAIN: o130137 - SENTRY_KEY: 3cf75f54983e473da6bd07daddf0d2ee - SENTRY_PROJECT: 1298632 # Start proxy to access ODK Central central-proxy: From 6cfbc086b5b6040e42ea52b79bc6b9fd06360463 Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Wed, 20 Sep 2023 17:10:56 +0100 Subject: [PATCH 34/59] ci: add GIT_BRANCH to deploy workflow --- .github/workflows/build_and_deploy.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/build_and_deploy.yml b/.github/workflows/build_and_deploy.yml index 166885b065..83e89355f0 100644 --- a/.github/workflows/build_and_deploy.yml +++ b/.github/workflows/build_and_deploy.yml @@ -13,6 +13,10 @@ on: # Allow manual trigger workflow_dispatch: +env: + # Required to inject into docker-compose.deploy.yml + GIT_BRANCH: ${{ github.ref_name }} + jobs: pytest: uses: ./.github/workflows/r-pytest.yml From e1525a2f4c34471d93c39d139501e32b03369c98 Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Wed, 20 Sep 2023 17:28:32 +0100 Subject: [PATCH 35/59] ci: add GIT_BRANCH to backend docker compose cmds --- .github/workflows/build_and_deploy.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build_and_deploy.yml b/.github/workflows/build_and_deploy.yml index 83e89355f0..9b1bde92bf 100644 --- a/.github/workflows/build_and_deploy.yml +++ b/.github/workflows/build_and_deploy.yml @@ -13,10 +13,6 @@ on: # Allow manual trigger workflow_dispatch: -env: - # Required to inject into docker-compose.deploy.yml - GIT_BRANCH: ${{ github.ref_name }} - jobs: pytest: uses: ./.github/workflows/r-pytest.yml @@ -67,10 +63,12 @@ jobs: - name: Environment to .env env: + GIT_BRANCH: ${{ github.ref_name }} API_VERSION: ${{ needs.extract-versions.outputs.api_version }} FRONTEND_MAIN_VERSION: ${{ needs.extract-versions.outputs.frontend_main_version }} run: | echo "${{ secrets.DOTENV }}" > .env + echo "GIT_BRANCH=${GIT_BRANCH}" >> .env echo "API_VERSION=${API_VERSION}" >> .env echo "FRONTEND_MAIN_VERSION=${FRONTEND_MAIN_VERSION}" >> .env @@ -107,10 +105,12 @@ jobs: - name: Environment to .env env: + GIT_BRANCH: ${{ github.ref_name }} API_VERSION: ${{ needs.extract-versions.outputs.api_version }} FRONTEND_MAIN_VERSION: ${{ needs.extract-versions.outputs.frontend_main_version }} run: | echo "${{ secrets.DOTENV }}" > .env + echo "GIT_BRANCH=${GIT_BRANCH}" >> .env echo "API_VERSION=${API_VERSION}" >> .env echo "FRONTEND_MAIN_VERSION=${FRONTEND_MAIN_VERSION}" >> .env From 60022de9fe9257f0f984f1f89b8ad166116970a4 Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Wed, 20 Sep 2023 17:42:28 +0100 Subject: [PATCH 36/59] ci: add extract-versions to needs to smoke & deploy --- .github/workflows/build_and_deploy.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/build_and_deploy.yml b/.github/workflows/build_and_deploy.yml index 9b1bde92bf..4c1fc653e8 100644 --- a/.github/workflows/build_and_deploy.yml +++ b/.github/workflows/build_and_deploy.yml @@ -53,6 +53,7 @@ jobs: smoke-test-backend: runs-on: ubuntu-latest needs: + - extract-versions - backend-build environment: name: ${{ github.ref_name }} @@ -80,6 +81,7 @@ jobs: smoke-test-frontend: runs-on: ubuntu-latest needs: + - extract-versions - frontend-main-build environment: name: ${{ github.ref_name }} @@ -94,6 +96,7 @@ jobs: deploy-containers: runs-on: ubuntu-latest needs: + - extract-versions - smoke-test-backend - smoke-test-frontend environment: From 4e84e685db7332784655e1cd2f776c13f45bc4ae Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Wed, 20 Sep 2023 18:10:37 +0100 Subject: [PATCH 37/59] ci: update backend smoke test manual containers --- .github/workflows/build_and_deploy.yml | 29 ++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_and_deploy.yml b/.github/workflows/build_and_deploy.yml index 4c1fc653e8..11fb08cd94 100644 --- a/.github/workflows/build_and_deploy.yml +++ b/.github/workflows/build_and_deploy.yml @@ -75,8 +75,33 @@ jobs: - name: Backend smoke test run: | - docker compose --file docker-compose.deploy.yml pull api - docker compose --file docker-compose.deploy.yml up api --exit-code-from api + source .env + docker network create fmtm + + docker pull "postgis/postgis:14-3.3-alpine" + docker run --rm -d + --name=fmtm-db + --network=fmtm + -e POSTGRES_USER=fmtm + -e POSTGRES_PASSWORD=fmtm + -e POSTGRES_DB=fmtm + "postgis/postgis:14-3.3-alpine" + + docker pull "ghcr.io/hotosm/fmtm/backend:${API_VERSION}-${GIT_BRANCH}" + docker run --rm -d + --network=fmtm + -v 8080:8080 + -e FRONTEND_MAIN_URL="http://test.com" + -e OSM_CLIENT_ID="test" + -e OSM_CLIENT_SECRET="test" + -e OSM_SECRET_KEY="test" + "ghcr.io/hotosm/fmtm/backend:${API_VERSION}-${GIT_BRANCH}" + + # Check the exit status of curl and exit the job if it fails + if ! curl -f http://localhost:8080/docs; then + echo "curl failed to access http://localhost:8080/docs" + exit 1 + fi smoke-test-frontend: runs-on: ubuntu-latest From d0ac9de3f64adc270739487f991b93222e9b3d9b Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Wed, 20 Sep 2023 18:31:30 +0100 Subject: [PATCH 38/59] ci: backend smoke test use multiline --- .github/workflows/build_and_deploy.yml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/build_and_deploy.yml b/.github/workflows/build_and_deploy.yml index 11fb08cd94..db6361eaa6 100644 --- a/.github/workflows/build_and_deploy.yml +++ b/.github/workflows/build_and_deploy.yml @@ -79,22 +79,22 @@ jobs: docker network create fmtm docker pull "postgis/postgis:14-3.3-alpine" - docker run --rm -d - --name=fmtm-db - --network=fmtm - -e POSTGRES_USER=fmtm - -e POSTGRES_PASSWORD=fmtm - -e POSTGRES_DB=fmtm + docker run --rm -d \ + --name=fmtm-db \ + --network=fmtm \ + -e POSTGRES_USER=fmtm \ + -e POSTGRES_PASSWORD=fmtm \ + -e POSTGRES_DB=fmtm \ "postgis/postgis:14-3.3-alpine" docker pull "ghcr.io/hotosm/fmtm/backend:${API_VERSION}-${GIT_BRANCH}" - docker run --rm -d - --network=fmtm - -v 8080:8080 - -e FRONTEND_MAIN_URL="http://test.com" - -e OSM_CLIENT_ID="test" - -e OSM_CLIENT_SECRET="test" - -e OSM_SECRET_KEY="test" + docker run --rm -d \ + --network=fmtm \ + -v 8080:8080 \ + -e FRONTEND_MAIN_URL="http://test.com" \ + -e OSM_CLIENT_ID="test" \ + -e OSM_CLIENT_SECRET="test" \ + -e OSM_SECRET_KEY="test" \ "ghcr.io/hotosm/fmtm/backend:${API_VERSION}-${GIT_BRANCH}" # Check the exit status of curl and exit the job if it fails From 5edb754a976f524ad4941072baa932fba7805330 Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Wed, 20 Sep 2023 18:39:38 +0100 Subject: [PATCH 39/59] ci: backend smoke test port mapping --- .github/workflows/build_and_deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_and_deploy.yml b/.github/workflows/build_and_deploy.yml index db6361eaa6..b80e829044 100644 --- a/.github/workflows/build_and_deploy.yml +++ b/.github/workflows/build_and_deploy.yml @@ -90,7 +90,7 @@ jobs: docker pull "ghcr.io/hotosm/fmtm/backend:${API_VERSION}-${GIT_BRANCH}" docker run --rm -d \ --network=fmtm \ - -v 8080:8080 \ + -p 8080:8080 \ -e FRONTEND_MAIN_URL="http://test.com" \ -e OSM_CLIENT_ID="test" \ -e OSM_CLIENT_SECRET="test" \ From cad4f637bcd1fecfd0fb32250970c7635b9ed5e7 Mon Sep 17 00:00:00 2001 From: spwoodcock Date: Wed, 20 Sep 2023 18:57:17 +0100 Subject: [PATCH 40/59] ci: comment backend smoke tests until db init fixed --- .github/workflows/build_and_deploy.yml | 57 ++++++++++++++------------ 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/.github/workflows/build_and_deploy.yml b/.github/workflows/build_and_deploy.yml index b80e829044..8d3faee8b8 100644 --- a/.github/workflows/build_and_deploy.yml +++ b/.github/workflows/build_and_deploy.yml @@ -75,33 +75,36 @@ jobs: - name: Backend smoke test run: | - source .env - docker network create fmtm - - docker pull "postgis/postgis:14-3.3-alpine" - docker run --rm -d \ - --name=fmtm-db \ - --network=fmtm \ - -e POSTGRES_USER=fmtm \ - -e POSTGRES_PASSWORD=fmtm \ - -e POSTGRES_DB=fmtm \ - "postgis/postgis:14-3.3-alpine" - - docker pull "ghcr.io/hotosm/fmtm/backend:${API_VERSION}-${GIT_BRANCH}" - docker run --rm -d \ - --network=fmtm \ - -p 8080:8080 \ - -e FRONTEND_MAIN_URL="http://test.com" \ - -e OSM_CLIENT_ID="test" \ - -e OSM_CLIENT_SECRET="test" \ - -e OSM_SECRET_KEY="test" \ - "ghcr.io/hotosm/fmtm/backend:${API_VERSION}-${GIT_BRANCH}" - - # Check the exit status of curl and exit the job if it fails - if ! curl -f http://localhost:8080/docs; then - echo "curl failed to access http://localhost:8080/docs" - exit 1 - fi + echo "Not implemented" + # source .env + # docker network create fmtm + + # docker pull "postgis/postgis:14-3.3-alpine" + # docker run --rm -d \ + # --name=fmtm-db \ + # --network=fmtm \ + # -e POSTGRES_USER=fmtm \ + # -e POSTGRES_PASSWORD=fmtm \ + # -e POSTGRES_DB=fmtm \ + # "postgis/postgis:14-3.3-alpine" + + # docker pull "ghcr.io/hotosm/fmtm/backend:${API_VERSION}-${GIT_BRANCH}" + # docker run --rm -d \ + # --network=fmtm \ + # -p 8080:8080 \ + # -e FRONTEND_MAIN_URL="http://test.com" \ + # -e OSM_CLIENT_ID="test" \ + # -e OSM_CLIENT_SECRET="test" \ + # -e OSM_SECRET_KEY="test" \ + # "ghcr.io/hotosm/fmtm/backend:${API_VERSION}-${GIT_BRANCH}" + + # # First wait 10 seconds for API + # sleep 10 + # # Check the exit status of curl and exit the job if it fails + # if ! curl -f http://localhost:8080/docs; then + # echo "curl failed to access http://localhost:8080/docs" + # exit 1 + # fi smoke-test-frontend: runs-on: ubuntu-latest From b14083470694b5a9b1c0fde4ca4bb4ebb0c5965d Mon Sep 17 00:00:00 2001 From: "Deepak Pradhan (Varun)" <37866666+varun2948@users.noreply.github.com> Date: Thu, 21 Sep 2023 20:33:23 -0700 Subject: [PATCH 41/59] Feat New Create Project and Docker Build Changes (#840) * feat (explore projects): steps for form added, create new project new design setup * feat (create new project) layout made for project details, step switcher children updated * feat (input text field): custom input field added * feat (text area): custom input area added * feat (create project): project details form field UI for large screen * feat (custom button): custom button added * fix (step switcher): step switcher made responsive * fix (input field/ explore projects): design fix, id added to text fields * fix (create project): input field rearrangement * fix (step switcher): step switcher children updated * fix (create project): create organization popup feature added * feat (select option): added shadcn select with importing lucide react for select dependency * feat (create project): organization name select dropdown added to project details * fix (create project): navigate to home page when cross icon clicked * feat (radiobutton): custom radio button added * feat (button): primary button color changed * feat (create project): upload area step - UI completed * feat (step swtcher): red-600 color changed to primaryRed color * fix (create project): upload area - previous next toggle added * fix (radio button): radio button column direction updated * fix (create project): upload area - toggle function name updated * fix (create project): data extract - UI completed * fix (create project): split tasks - UI completed * feat (create project): select form - UI completed * feat (create project): update header names * feat (create project/ step switcher): removed children from step form * feat (create project/ button): icons added on button * feat (create project/ radiobutton): icons added on radiobutton * fix (inputtextfield/ textfield): required attribute added * fix (create project): project detials - required mark added to input and textarea * fix (create project): project detials - required mark added to organization name * fix (create project): data extract - radiobutton topic replaced * feat (create project): DataExtract/UploadArea input type file added * fix (Button): onClick made optional in case of onsubmit * fix (InputTextField/TextArea): error message design fix * fix (create project): projectDetails - validations added * fix (create project): each step on step form differentiated with URL, steps navigation done with url * Fix: create project draw bug and route for old create project * feat: pushed out main files outside on frontend * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: NSUWAL123 Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- docker-compose.noodk.yml | 2 +- docker-compose.yml | 2 +- docs/FAQ.md | 30 +- docs/Guide-On-Improving-Documentation.md | 38 +- docs/User-Manual-For-Project-Managers.md | 96 +-- docs/dev/Frontend.md | 2 +- .../import_geojson_as_postgis_with_jsonb.md | 4 +- scripts/postgis_snippets/postgis_resources.md | 9 +- .../task_splitting/task_splitting_readme.md | 34 +- src/backend/app/auth/auth_routes.py | 11 +- src/backend/app/central/central_crud.py | 41 +- src/backend/app/central/central_routes.py | 3 +- src/backend/app/central/central_schemas.py | 3 +- src/backend/app/db/db_models.py | 17 +- src/backend/app/db/postgis_utils.py | 2 +- src/backend/app/models/enums.py | 2 +- .../app/organization/organization_crud.py | 49 +- .../app/organization/organization_routes.py | 29 +- .../app/organization/organization_schemas.py | 3 +- src/backend/app/projects/project_crud.py | 159 ++-- src/backend/app/projects/project_routes.py | 95 ++- src/backend/app/projects/project_schemas.py | 5 +- src/backend/app/projects/utils.py | 10 +- src/backend/app/submission/submission_crud.py | 153 ++-- .../app/submission/submission_routes.py | 64 +- src/backend/app/tasks/tasks_crud.py | 25 +- src/backend/app/tasks/tasks_routes.py | 68 +- src/frontend/.babelrc | 39 +- src/frontend/{main => }/.eslintrc.cjs | 0 src/frontend/.gitignore | 1 + src/frontend/.prettierrc | 7 + src/frontend/debug.dockerfile | 2 +- src/frontend/main/.babelrc | 41 - src/frontend/main/.dockerignore | 3 - src/frontend/main/.gitignore | 122 --- src/frontend/main/.prettierrc | 7 - src/frontend/main/public/manifest.json | 30 - .../main/src/api/OrganizationService.ts | 111 --- .../MapComponent/OpenLayersComponent/map.scss | 16 - .../main/src/components/MapLegends.jsx | 68 -- .../validation/DefineTaskValidation.tsx | 30 - .../components/home/ProjectCardSkeleton.tsx | 72 -- .../constants/EditProjectSidebarContent.ts | 27 - src/frontend/main/src/hooks/OnScroll.tsx | 27 - .../main/src/hooks/WindowDimension.tsx | 59 -- src/frontend/main/src/index.html | 19 - src/frontend/main/src/index.ts | 2 - .../createproject/createProjectModel.ts | 82 -- .../main/src/models/geojsonObjectModel.js | 10 - .../main/src/models/home/homeModel.ts | 12 - .../models/organization/organizationModel.ts | 43 - .../main/src/store/slices/CommonSlice.ts | 30 - .../src/store/slices/organizationSlice.ts | 32 - src/frontend/main/src/styles/home.css | 11 - src/frontend/main/src/utilities/BasicCard.tsx | 27 - .../main/src/utilities/CustomizedImage.jsx | 21 - .../main/src/utilities/CustomizedMenus.tsx | 75 -- .../main/src/utilities/CustomizedSnackbar.jsx | 26 - src/frontend/main/src/utilities/mapUtils.js | 15 - src/frontend/main/test-tsconfig.json | 64 -- src/frontend/{main => }/package-lock.json | 789 ++++++++++++++++++ src/frontend/{main => }/package.json | 2 + src/frontend/{main => }/postcss.config.js | 0 src/frontend/prod.dockerfile | 4 +- .../{main => }/public/icon-192x192.png | Bin .../{main => }/public/icon-256x256.png | Bin .../{main => }/public/icon-384x384.png | Bin .../{main => }/public/icon-512x512.png | Bin src/frontend/public/manifest.json | 30 + src/frontend/{main => }/setupTests.js | 0 src/frontend/{main => }/src/App.jsx | 0 .../src/api/CreateProjectService.ts | 0 src/frontend/{main => }/src/api/Files.js | 0 .../{main => }/src/api/HomeService.ts | 0 src/frontend/src/api/OrganizationService.ts | 100 +++ src/frontend/{main => }/src/api/Project.js | 0 .../{main => }/src/api/ProjectTaskStatus.js | 0 src/frontend/{main => }/src/api/Submission.ts | 0 .../{main => }/src/api/SubmissionService.ts | 0 src/frontend/{main => }/src/api/task.ts | 0 .../fonts/Archivo/Archivo/Archivo-Bold.ttf | Bin .../Archivo/Archivo/Archivo-BoldItalic.ttf | Bin .../fonts/Archivo/Archivo/Archivo-Italic.ttf | Bin .../fonts/Archivo/Archivo/Archivo-Light.ttf | Bin .../fonts/Archivo/Archivo/Archivo-Medium.ttf | Bin .../Archivo/Archivo/Archivo-MediumItalic.ttf | Bin .../fonts/Archivo/Archivo/Archivo-Regular.ttf | Bin .../Archivo/Archivo/Archivo-SemiBold.ttf | Bin .../Archivo/Archivo-SemiBoldItalic.ttf | Bin .../src/assets/fonts/Archivo/Archivo/OFL.txt | 0 .../src/assets/fonts/Barlow/Barlow-Black.ttf | Bin .../fonts/Barlow/Barlow-BlackItalic.ttf | Bin .../src/assets/fonts/Barlow/Barlow-Bold.ttf | Bin .../assets/fonts/Barlow/Barlow-BoldItalic.ttf | Bin .../assets/fonts/Barlow/Barlow-ExtraBold.ttf | Bin .../fonts/Barlow/Barlow-ExtraBoldItalic.ttf | Bin .../assets/fonts/Barlow/Barlow-ExtraLight.ttf | Bin .../fonts/Barlow/Barlow-ExtraLightItalic.ttf | Bin .../src/assets/fonts/Barlow/Barlow-Italic.ttf | Bin .../src/assets/fonts/Barlow/Barlow-Light.ttf | Bin .../fonts/Barlow/Barlow-LightItalic.ttf | Bin .../src/assets/fonts/Barlow/Barlow-Medium.ttf | Bin .../fonts/Barlow/Barlow-MediumItalic.ttf | Bin .../assets/fonts/Barlow/Barlow-Regular.ttf | Bin .../assets/fonts/Barlow/Barlow-SemiBold.ttf | Bin .../fonts/Barlow/Barlow-SemiBoldItalic.ttf | Bin .../src/assets/fonts/Barlow/Barlow-Thin.ttf | Bin .../assets/fonts/Barlow/Barlow-ThinItalic.ttf | Bin .../src/assets/fonts/Barlow/OFL.txt | 0 .../{main => }/src/assets/images/acc-down.png | Bin .../{main => }/src/assets/images/acc-up.png | Bin .../{main => }/src/assets/images/avatar.png | Bin .../{main => }/src/assets/images/favicon.ico | Bin .../{main => }/src/assets/images/favicon.png | Bin .../{main => }/src/assets/images/grid.png | Bin .../{main => }/src/assets/images/hotLog.png | Bin .../{main => }/src/assets/images/location.png | Bin .../{main => }/src/assets/images/lock.png | Bin .../{main => }/src/assets/images/notFound.png | Bin .../src/assets/images/project_icon.png | Bin .../{main => }/src/assets/images/red-lock.png | Bin .../src/assets/images/red_marker.png | Bin .../{main => }/src/components/Activities.jsx | 0 .../src/components/ActivitiesPanel.jsx | 0 .../src/components/DialogTaskActions.jsx | 0 .../src/components/GenerateMbTiles.jsx | 0 .../LayerSwitcher/index.js | 3 +- .../OpenLayersComponent/Layers/VectorLayer.js | 0 .../Layers/VectorTileLayer.js | 2 +- .../OpenLayersComponent/Layers/index.js | 0 .../MapContainer/index.jsx | 0 .../OpenLayersComponent/Popup/index.jsx | 0 .../OpenLayersComponent/Popup/popup.css | 6 +- .../OpenLayersComponent/Popup/popup.css.map | 0 .../OpenLayersComponent/Popup/popup.scss | 2 +- .../helpers/getFeatureGeojson.js | 0 .../OpenLayersComponent/helpers/layerUtils.js | 0 .../OpenLayersComponent/helpers/styleUtils.js | 0 .../MapComponent/OpenLayersComponent/index.js | 0 .../MapComponent/OpenLayersComponent/map.css | 6 +- .../MapComponent/OpenLayersComponent/map.scss | 15 + .../OpenLayersComponent/useOLMap/index.js | 2 +- .../components/MapDescriptionComponents.jsx | 0 src/frontend/src/components/MapLegends.jsx | 68 ++ .../src/components/OpenLayersMap.jsx | 0 .../components/ProjectInfo/ProjectCard.jsx | 0 .../ProjectInfo/ProjectInfoCountCard.jsx | 0 .../ProjectInfoCountCardSkeleton.jsx | 0 .../ProjectInfo/ProjectInfoSidebar.jsx | 0 .../ProjectInfoSidebarSkeleton.jsx | 0 .../components/ProjectInfo/ProjectInfomap.jsx | 0 .../src/components/ProjectMap/ProjectMap.jsx | 40 +- .../src/components/QrcodeComponent.jsx | 0 .../SubmissionMap/SubmissionMap.jsx | 0 .../{main => }/src/components/TasksLayer.jsx | 0 .../src/components/TasksMap/TasksMap.jsx | 24 +- src/frontend/src/components/common/Button.tsx | 47 ++ .../src/components/common/InputTextField.tsx | 74 ++ .../src/components/common/RadioButton.tsx | 43 + src/frontend/src/components/common/Select.tsx | 110 +++ .../src/components/common/StepSwitcher.tsx | 65 ++ .../src/components/common/Switch.tsx | 0 .../src/components/common/TextArea.tsx | 61 ++ .../createnewproject/CreateProjectHeader.tsx | 27 + .../createnewproject/DataExtract.tsx | 120 +++ .../components/createnewproject}/DrawSvg.tsx | 0 .../createnewproject/ProjectDetailsForm.tsx | 218 +++++ .../createnewproject/SelectForm.tsx | 113 +++ .../createnewproject/SplitTasks.tsx | 119 +++ .../createnewproject/UploadArea.tsx | 133 +++ .../createproject/BasemapSelection.tsx | 0 .../components/createproject/DataExtract.tsx | 0 .../components/createproject/DefineTasks.tsx | 0 .../src/components/createproject/DrawSvg.tsx | 49 ++ .../createproject/FormSelection.tsx | 0 .../components/createproject/LoadingBar.tsx | 0 .../createproject/ProjectDetailsForm.tsx | 0 .../components/createproject/UploadArea.tsx | 7 +- .../validation/CreateProjectValidation.tsx | 0 .../validation/DataExtractValidation.tsx | 0 .../validation/DefineTaskValidation.tsx | 27 + .../validation/SelectFormValidation.tsx | 2 - .../editproject/EditProjectDetails.tsx | 0 .../src/components/editproject/UpdateForm.tsx | 0 .../editproject/UpdateProjectArea.tsx | 0 .../EditProjectDetailsValidation.ts | 0 .../components/home/ExploreProjectCard.tsx | 0 .../src/components/home/HomePageFilters.tsx | 0 .../components/home/ProjectCardSkeleton.tsx | 68 ++ .../src/components/home/ProjectListMap.tsx | 0 .../organization/OrganizationAddForm.tsx | 4 +- .../Validation/OrganizationAddValidation.tsx | 0 .../constants/EditProjectSidebarContent.ts | 26 + .../src/constants/StepFormConstants.ts | 43 + .../src/constants/geojsonObjectModal.ts | 0 src/frontend/{main => }/src/environment.ts | 0 .../{main => }/src/hooks/MapStyles.js | 0 src/frontend/src/hooks/OnScroll.tsx | 24 + src/frontend/src/hooks/WindowDimension.tsx | 50 ++ src/frontend/{main => }/src/hooks/useForm.tsx | 0 src/frontend/{main => }/src/hooks/useOlMap.ts | 16 +- src/frontend/{main => }/src/index.css | 24 +- src/frontend/src/index.html | 23 + src/frontend/src/index.ts | 1 + .../createproject/createProjectModel.ts | 81 ++ src/frontend/src/models/geojsonObjectModel.js | 10 + src/frontend/src/models/home/homeModel.ts | 11 + .../models/organization/organizationModel.ts | 42 + .../src/models/submission/submissionModel.ts | 0 src/frontend/{main => }/src/routes.jsx | 61 ++ .../{main => }/src/shared/AssetModules.js | 8 + .../{main => }/src/shared/CoreModules.js | 0 src/frontend/{main => }/src/store/Store.ts | 0 src/frontend/src/store/slices/CommonSlice.ts | 36 + .../src/store/slices/CreateProjectSlice.ts | 2 +- .../{main => }/src/store/slices/HomeSlice.ts | 0 .../{main => }/src/store/slices/LoginSlice.ts | 0 .../src/store/slices/ProjectSlice.ts | 0 .../src/store/slices/SubmissionSlice.ts | 0 .../{main => }/src/store/slices/TaskSlice.ts | 0 .../{main => }/src/store/slices/ThemeSlice.ts | 0 .../src/store/slices/organizationSlice.ts | 32 + .../src/store/types/ICreateProject.ts | 0 src/frontend/src/styles/home.css | 11 + src/frontend/{main => }/src/styles/home.scss | 17 +- .../src/types/modulesDecleration.d.ts | 0 .../{main => }/src/types/reduxTypes.ts | 0 .../src/utilfunctions/compareUtils.js | 0 .../src/utilfunctions/createPopup.ts | 0 .../{main => }/src/utilfunctions/login.ts | 0 .../{main => }/src/utilfunctions/shadcn.ts | 0 .../{main => }/src/utilfunctions/testUtils.js | 0 .../{main => }/src/utilities/AppLoader.jsx | 0 src/frontend/src/utilities/BasicCard.tsx | 28 + .../{main => }/src/utilities/BasicDialog.jsx | 0 .../{main => }/src/utilities/BasicDialog.tsx | 0 .../{main => }/src/utilities/BasicTabs.tsx | 0 .../{main => }/src/utilities/CustomDrawer.jsx | 0 .../src/utilities/CustomizedImage.jsx | 18 + .../src/utilities/CustomizedMenus.tsx | 73 ++ .../src/utilities/CustomizedModal.tsx | 0 .../src/utilities/CustomizedProgressBar.tsx | 0 .../src/utilities/CustomizedSnackbar.jsx | 26 + .../src/utilities/IconButtonCard.jsx | 0 .../src/utilities/MappingHeader.tsx | 22 +- .../src/utilities/PrimaryAppBar.tsx | 0 .../src/utilities/ProtectedRoute.jsx | 0 src/frontend/src/utilities/mapUtils.js | 14 + .../{main => }/src/views/Authorized.tsx | 0 src/frontend/src/views/CreateNewProject.tsx | 88 ++ .../src/views/CreateOrganization.tsx | 0 .../{main => }/src/views/CreateProject.tsx | 0 .../{main => }/src/views/DefineAreaMap.tsx | 0 .../{main => }/src/views/EditProject.tsx | 0 .../{main => }/src/views/EditProjectArea.tsx | 0 src/frontend/{main => }/src/views/Home.jsx | 0 .../{main => }/src/views/MainView.jsx | 0 .../{main => }/src/views/NotFound404.jsx | 8 +- .../{main => }/src/views/Organization.tsx | 0 .../{main => }/src/views/ProjectDetails.jsx | 0 .../{main => }/src/views/ProjectInfo.tsx | 0 .../src/views/SubmissionDetails.tsx | 0 .../{main => }/src/views/Submissions.tsx | 0 src/frontend/{main => }/src/views/Tabbed.tsx | 0 src/frontend/{main => }/src/views/Tasks.tsx | 0 src/frontend/{main => }/tailwind.config.js | 0 src/frontend/test-tsconfig.json | 60 ++ src/frontend/{main => }/tests/App.test.tsx | 0 .../{main => }/tests/CreateProject.test.tsx | 0 .../{main => }/tests/mocks/fileMock.ts | 0 .../{main => }/tests/mocks/styleMock.ts | 0 src/frontend/{main => }/tsconfig.json | 15 +- src/frontend/{main => }/webpack.config.js | 0 273 files changed, 3680 insertions(+), 1657 deletions(-) rename src/frontend/{main => }/.eslintrc.cjs (100%) create mode 100755 src/frontend/.prettierrc delete mode 100755 src/frontend/main/.babelrc delete mode 100755 src/frontend/main/.dockerignore delete mode 100755 src/frontend/main/.gitignore delete mode 100755 src/frontend/main/.prettierrc delete mode 100644 src/frontend/main/public/manifest.json delete mode 100644 src/frontend/main/src/api/OrganizationService.ts delete mode 100644 src/frontend/main/src/components/MapComponent/OpenLayersComponent/map.scss delete mode 100755 src/frontend/main/src/components/MapLegends.jsx delete mode 100644 src/frontend/main/src/components/createproject/validation/DefineTaskValidation.tsx delete mode 100755 src/frontend/main/src/components/home/ProjectCardSkeleton.tsx delete mode 100644 src/frontend/main/src/constants/EditProjectSidebarContent.ts delete mode 100755 src/frontend/main/src/hooks/OnScroll.tsx delete mode 100755 src/frontend/main/src/hooks/WindowDimension.tsx delete mode 100755 src/frontend/main/src/index.html delete mode 100755 src/frontend/main/src/index.ts delete mode 100755 src/frontend/main/src/models/createproject/createProjectModel.ts delete mode 100755 src/frontend/main/src/models/geojsonObjectModel.js delete mode 100755 src/frontend/main/src/models/home/homeModel.ts delete mode 100644 src/frontend/main/src/models/organization/organizationModel.ts delete mode 100755 src/frontend/main/src/store/slices/CommonSlice.ts delete mode 100644 src/frontend/main/src/store/slices/organizationSlice.ts delete mode 100755 src/frontend/main/src/styles/home.css delete mode 100755 src/frontend/main/src/utilities/BasicCard.tsx delete mode 100755 src/frontend/main/src/utilities/CustomizedImage.jsx delete mode 100755 src/frontend/main/src/utilities/CustomizedMenus.tsx delete mode 100755 src/frontend/main/src/utilities/CustomizedSnackbar.jsx delete mode 100644 src/frontend/main/src/utilities/mapUtils.js delete mode 100644 src/frontend/main/test-tsconfig.json rename src/frontend/{main => }/package-lock.json (97%) rename src/frontend/{main => }/package.json (97%) rename src/frontend/{main => }/postcss.config.js (100%) rename src/frontend/{main => }/public/icon-192x192.png (100%) rename src/frontend/{main => }/public/icon-256x256.png (100%) rename src/frontend/{main => }/public/icon-384x384.png (100%) rename src/frontend/{main => }/public/icon-512x512.png (100%) create mode 100644 src/frontend/public/manifest.json rename src/frontend/{main => }/setupTests.js (100%) rename src/frontend/{main => }/src/App.jsx (100%) rename src/frontend/{main => }/src/api/CreateProjectService.ts (100%) rename src/frontend/{main => }/src/api/Files.js (100%) rename src/frontend/{main => }/src/api/HomeService.ts (100%) create mode 100644 src/frontend/src/api/OrganizationService.ts rename src/frontend/{main => }/src/api/Project.js (100%) rename src/frontend/{main => }/src/api/ProjectTaskStatus.js (100%) rename src/frontend/{main => }/src/api/Submission.ts (100%) rename src/frontend/{main => }/src/api/SubmissionService.ts (100%) rename src/frontend/{main => }/src/api/task.ts (100%) rename src/frontend/{main => }/src/assets/fonts/Archivo/Archivo/Archivo-Bold.ttf (100%) rename src/frontend/{main => }/src/assets/fonts/Archivo/Archivo/Archivo-BoldItalic.ttf (100%) rename src/frontend/{main => }/src/assets/fonts/Archivo/Archivo/Archivo-Italic.ttf (100%) rename src/frontend/{main => }/src/assets/fonts/Archivo/Archivo/Archivo-Light.ttf (100%) rename src/frontend/{main => }/src/assets/fonts/Archivo/Archivo/Archivo-Medium.ttf (100%) rename src/frontend/{main => }/src/assets/fonts/Archivo/Archivo/Archivo-MediumItalic.ttf (100%) rename src/frontend/{main => }/src/assets/fonts/Archivo/Archivo/Archivo-Regular.ttf (100%) rename src/frontend/{main => }/src/assets/fonts/Archivo/Archivo/Archivo-SemiBold.ttf (100%) rename src/frontend/{main => }/src/assets/fonts/Archivo/Archivo/Archivo-SemiBoldItalic.ttf (100%) rename src/frontend/{main => }/src/assets/fonts/Archivo/Archivo/OFL.txt (100%) rename src/frontend/{main => }/src/assets/fonts/Barlow/Barlow-Black.ttf (100%) rename src/frontend/{main => }/src/assets/fonts/Barlow/Barlow-BlackItalic.ttf (100%) rename src/frontend/{main => }/src/assets/fonts/Barlow/Barlow-Bold.ttf (100%) rename src/frontend/{main => }/src/assets/fonts/Barlow/Barlow-BoldItalic.ttf (100%) rename src/frontend/{main => }/src/assets/fonts/Barlow/Barlow-ExtraBold.ttf (100%) rename src/frontend/{main => }/src/assets/fonts/Barlow/Barlow-ExtraBoldItalic.ttf (100%) rename src/frontend/{main => }/src/assets/fonts/Barlow/Barlow-ExtraLight.ttf (100%) rename src/frontend/{main => }/src/assets/fonts/Barlow/Barlow-ExtraLightItalic.ttf (100%) rename src/frontend/{main => }/src/assets/fonts/Barlow/Barlow-Italic.ttf (100%) rename src/frontend/{main => }/src/assets/fonts/Barlow/Barlow-Light.ttf (100%) rename src/frontend/{main => }/src/assets/fonts/Barlow/Barlow-LightItalic.ttf (100%) rename src/frontend/{main => }/src/assets/fonts/Barlow/Barlow-Medium.ttf (100%) rename src/frontend/{main => }/src/assets/fonts/Barlow/Barlow-MediumItalic.ttf (100%) rename src/frontend/{main => }/src/assets/fonts/Barlow/Barlow-Regular.ttf (100%) rename src/frontend/{main => }/src/assets/fonts/Barlow/Barlow-SemiBold.ttf (100%) rename src/frontend/{main => }/src/assets/fonts/Barlow/Barlow-SemiBoldItalic.ttf (100%) rename src/frontend/{main => }/src/assets/fonts/Barlow/Barlow-Thin.ttf (100%) rename src/frontend/{main => }/src/assets/fonts/Barlow/Barlow-ThinItalic.ttf (100%) rename src/frontend/{main => }/src/assets/fonts/Barlow/OFL.txt (100%) rename src/frontend/{main => }/src/assets/images/acc-down.png (100%) rename src/frontend/{main => }/src/assets/images/acc-up.png (100%) rename src/frontend/{main => }/src/assets/images/avatar.png (100%) rename src/frontend/{main => }/src/assets/images/favicon.ico (100%) rename src/frontend/{main => }/src/assets/images/favicon.png (100%) rename src/frontend/{main => }/src/assets/images/grid.png (100%) rename src/frontend/{main => }/src/assets/images/hotLog.png (100%) rename src/frontend/{main => }/src/assets/images/location.png (100%) rename src/frontend/{main => }/src/assets/images/lock.png (100%) rename src/frontend/{main => }/src/assets/images/notFound.png (100%) rename src/frontend/{main => }/src/assets/images/project_icon.png (100%) rename src/frontend/{main => }/src/assets/images/red-lock.png (100%) rename src/frontend/{main => }/src/assets/images/red_marker.png (100%) rename src/frontend/{main => }/src/components/Activities.jsx (100%) rename src/frontend/{main => }/src/components/ActivitiesPanel.jsx (100%) rename src/frontend/{main => }/src/components/DialogTaskActions.jsx (100%) rename src/frontend/{main => }/src/components/GenerateMbTiles.jsx (100%) rename src/frontend/{main => }/src/components/MapComponent/OpenLayersComponent/LayerSwitcher/index.js (96%) rename src/frontend/{main => }/src/components/MapComponent/OpenLayersComponent/Layers/VectorLayer.js (100%) rename src/frontend/{main => }/src/components/MapComponent/OpenLayersComponent/Layers/VectorTileLayer.js (95%) rename src/frontend/{main => }/src/components/MapComponent/OpenLayersComponent/Layers/index.js (100%) rename src/frontend/{main => }/src/components/MapComponent/OpenLayersComponent/MapContainer/index.jsx (100%) rename src/frontend/{main => }/src/components/MapComponent/OpenLayersComponent/Popup/index.jsx (100%) rename src/frontend/{main => }/src/components/MapComponent/OpenLayersComponent/Popup/popup.css (85%) rename src/frontend/{main => }/src/components/MapComponent/OpenLayersComponent/Popup/popup.css.map (100%) rename src/frontend/{main => }/src/components/MapComponent/OpenLayersComponent/Popup/popup.scss (91%) rename src/frontend/{main => }/src/components/MapComponent/OpenLayersComponent/helpers/getFeatureGeojson.js (100%) rename src/frontend/{main => }/src/components/MapComponent/OpenLayersComponent/helpers/layerUtils.js (100%) rename src/frontend/{main => }/src/components/MapComponent/OpenLayersComponent/helpers/styleUtils.js (100%) rename src/frontend/{main => }/src/components/MapComponent/OpenLayersComponent/index.js (100%) rename src/frontend/{main => }/src/components/MapComponent/OpenLayersComponent/map.css (90%) create mode 100644 src/frontend/src/components/MapComponent/OpenLayersComponent/map.scss rename src/frontend/{main => }/src/components/MapComponent/OpenLayersComponent/useOLMap/index.js (92%) rename src/frontend/{main => }/src/components/MapDescriptionComponents.jsx (100%) create mode 100755 src/frontend/src/components/MapLegends.jsx rename src/frontend/{main => }/src/components/OpenLayersMap.jsx (100%) rename src/frontend/{main => }/src/components/ProjectInfo/ProjectCard.jsx (100%) rename src/frontend/{main => }/src/components/ProjectInfo/ProjectInfoCountCard.jsx (100%) rename src/frontend/{main => }/src/components/ProjectInfo/ProjectInfoCountCardSkeleton.jsx (100%) rename src/frontend/{main => }/src/components/ProjectInfo/ProjectInfoSidebar.jsx (100%) rename src/frontend/{main => }/src/components/ProjectInfo/ProjectInfoSidebarSkeleton.jsx (100%) rename src/frontend/{main => }/src/components/ProjectInfo/ProjectInfomap.jsx (100%) rename src/frontend/{main => }/src/components/ProjectMap/ProjectMap.jsx (70%) rename src/frontend/{main => }/src/components/QrcodeComponent.jsx (100%) rename src/frontend/{main => }/src/components/SubmissionMap/SubmissionMap.jsx (100%) rename src/frontend/{main => }/src/components/TasksLayer.jsx (100%) rename src/frontend/{main => }/src/components/TasksMap/TasksMap.jsx (71%) create mode 100644 src/frontend/src/components/common/Button.tsx create mode 100644 src/frontend/src/components/common/InputTextField.tsx create mode 100644 src/frontend/src/components/common/RadioButton.tsx create mode 100644 src/frontend/src/components/common/Select.tsx create mode 100644 src/frontend/src/components/common/StepSwitcher.tsx rename src/frontend/{main => }/src/components/common/Switch.tsx (100%) create mode 100644 src/frontend/src/components/common/TextArea.tsx create mode 100644 src/frontend/src/components/createnewproject/CreateProjectHeader.tsx create mode 100644 src/frontend/src/components/createnewproject/DataExtract.tsx rename src/frontend/{main/src/components/createproject => src/components/createnewproject}/DrawSvg.tsx (100%) create mode 100644 src/frontend/src/components/createnewproject/ProjectDetailsForm.tsx create mode 100644 src/frontend/src/components/createnewproject/SelectForm.tsx create mode 100644 src/frontend/src/components/createnewproject/SplitTasks.tsx create mode 100644 src/frontend/src/components/createnewproject/UploadArea.tsx rename src/frontend/{main => }/src/components/createproject/BasemapSelection.tsx (100%) rename src/frontend/{main => }/src/components/createproject/DataExtract.tsx (100%) rename src/frontend/{main => }/src/components/createproject/DefineTasks.tsx (100%) create mode 100644 src/frontend/src/components/createproject/DrawSvg.tsx rename src/frontend/{main => }/src/components/createproject/FormSelection.tsx (100%) rename src/frontend/{main => }/src/components/createproject/LoadingBar.tsx (100%) rename src/frontend/{main => }/src/components/createproject/ProjectDetailsForm.tsx (100%) rename src/frontend/{main => }/src/components/createproject/UploadArea.tsx (94%) rename src/frontend/{main => }/src/components/createproject/validation/CreateProjectValidation.tsx (100%) rename src/frontend/{main => }/src/components/createproject/validation/DataExtractValidation.tsx (100%) create mode 100644 src/frontend/src/components/createproject/validation/DefineTaskValidation.tsx rename src/frontend/{main => }/src/components/createproject/validation/SelectFormValidation.tsx (99%) rename src/frontend/{main => }/src/components/editproject/EditProjectDetails.tsx (100%) rename src/frontend/{main => }/src/components/editproject/UpdateForm.tsx (100%) rename src/frontend/{main => }/src/components/editproject/UpdateProjectArea.tsx (100%) rename src/frontend/{main => }/src/components/editproject/validation/EditProjectDetailsValidation.ts (100%) rename src/frontend/{main => }/src/components/home/ExploreProjectCard.tsx (100%) rename src/frontend/{main => }/src/components/home/HomePageFilters.tsx (100%) create mode 100755 src/frontend/src/components/home/ProjectCardSkeleton.tsx rename src/frontend/{main => }/src/components/home/ProjectListMap.tsx (100%) rename src/frontend/{main => }/src/components/organization/OrganizationAddForm.tsx (98%) rename src/frontend/{main => }/src/components/organization/Validation/OrganizationAddValidation.tsx (100%) create mode 100644 src/frontend/src/constants/EditProjectSidebarContent.ts create mode 100644 src/frontend/src/constants/StepFormConstants.ts rename src/frontend/{main => }/src/constants/geojsonObjectModal.ts (100%) rename src/frontend/{main => }/src/environment.ts (100%) rename src/frontend/{main => }/src/hooks/MapStyles.js (100%) create mode 100755 src/frontend/src/hooks/OnScroll.tsx create mode 100755 src/frontend/src/hooks/WindowDimension.tsx rename src/frontend/{main => }/src/hooks/useForm.tsx (100%) rename src/frontend/{main => }/src/hooks/useOlMap.ts (77%) rename src/frontend/{main => }/src/index.css (77%) create mode 100755 src/frontend/src/index.html create mode 100755 src/frontend/src/index.ts create mode 100755 src/frontend/src/models/createproject/createProjectModel.ts create mode 100755 src/frontend/src/models/geojsonObjectModel.js create mode 100755 src/frontend/src/models/home/homeModel.ts create mode 100644 src/frontend/src/models/organization/organizationModel.ts rename src/frontend/{main => }/src/models/submission/submissionModel.ts (100%) rename src/frontend/{main => }/src/routes.jsx (79%) rename src/frontend/{main => }/src/shared/AssetModules.js (91%) rename src/frontend/{main => }/src/shared/CoreModules.js (100%) rename src/frontend/{main => }/src/store/Store.ts (100%) create mode 100755 src/frontend/src/store/slices/CommonSlice.ts rename src/frontend/{main => }/src/store/slices/CreateProjectSlice.ts (99%) rename src/frontend/{main => }/src/store/slices/HomeSlice.ts (100%) rename src/frontend/{main => }/src/store/slices/LoginSlice.ts (100%) rename src/frontend/{main => }/src/store/slices/ProjectSlice.ts (100%) rename src/frontend/{main => }/src/store/slices/SubmissionSlice.ts (100%) rename src/frontend/{main => }/src/store/slices/TaskSlice.ts (100%) rename src/frontend/{main => }/src/store/slices/ThemeSlice.ts (100%) create mode 100644 src/frontend/src/store/slices/organizationSlice.ts rename src/frontend/{main => }/src/store/types/ICreateProject.ts (100%) create mode 100755 src/frontend/src/styles/home.css rename src/frontend/{main => }/src/styles/home.scss (90%) rename src/frontend/{main => }/src/types/modulesDecleration.d.ts (100%) rename src/frontend/{main => }/src/types/reduxTypes.ts (100%) rename src/frontend/{main => }/src/utilfunctions/compareUtils.js (100%) rename src/frontend/{main => }/src/utilfunctions/createPopup.ts (100%) rename src/frontend/{main => }/src/utilfunctions/login.ts (100%) rename src/frontend/{main => }/src/utilfunctions/shadcn.ts (100%) rename src/frontend/{main => }/src/utilfunctions/testUtils.js (100%) rename src/frontend/{main => }/src/utilities/AppLoader.jsx (100%) create mode 100755 src/frontend/src/utilities/BasicCard.tsx rename src/frontend/{main => }/src/utilities/BasicDialog.jsx (100%) rename src/frontend/{main => }/src/utilities/BasicDialog.tsx (100%) rename src/frontend/{main => }/src/utilities/BasicTabs.tsx (100%) rename src/frontend/{main => }/src/utilities/CustomDrawer.jsx (100%) create mode 100755 src/frontend/src/utilities/CustomizedImage.jsx create mode 100755 src/frontend/src/utilities/CustomizedMenus.tsx rename src/frontend/{main => }/src/utilities/CustomizedModal.tsx (100%) rename src/frontend/{main => }/src/utilities/CustomizedProgressBar.tsx (100%) create mode 100755 src/frontend/src/utilities/CustomizedSnackbar.jsx rename src/frontend/{main => }/src/utilities/IconButtonCard.jsx (100%) rename src/frontend/{main => }/src/utilities/MappingHeader.tsx (63%) rename src/frontend/{main => }/src/utilities/PrimaryAppBar.tsx (100%) rename src/frontend/{main => }/src/utilities/ProtectedRoute.jsx (100%) create mode 100644 src/frontend/src/utilities/mapUtils.js rename src/frontend/{main => }/src/views/Authorized.tsx (100%) create mode 100644 src/frontend/src/views/CreateNewProject.tsx rename src/frontend/{main => }/src/views/CreateOrganization.tsx (100%) rename src/frontend/{main => }/src/views/CreateProject.tsx (100%) rename src/frontend/{main => }/src/views/DefineAreaMap.tsx (100%) rename src/frontend/{main => }/src/views/EditProject.tsx (100%) rename src/frontend/{main => }/src/views/EditProjectArea.tsx (100%) rename src/frontend/{main => }/src/views/Home.jsx (100%) rename src/frontend/{main => }/src/views/MainView.jsx (100%) rename src/frontend/{main => }/src/views/NotFound404.jsx (64%) rename src/frontend/{main => }/src/views/Organization.tsx (100%) rename src/frontend/{main => }/src/views/ProjectDetails.jsx (100%) rename src/frontend/{main => }/src/views/ProjectInfo.tsx (100%) rename src/frontend/{main => }/src/views/SubmissionDetails.tsx (100%) rename src/frontend/{main => }/src/views/Submissions.tsx (100%) rename src/frontend/{main => }/src/views/Tabbed.tsx (100%) rename src/frontend/{main => }/src/views/Tasks.tsx (100%) rename src/frontend/{main => }/tailwind.config.js (100%) create mode 100644 src/frontend/test-tsconfig.json rename src/frontend/{main => }/tests/App.test.tsx (100%) rename src/frontend/{main => }/tests/CreateProject.test.tsx (100%) rename src/frontend/{main => }/tests/mocks/fileMock.ts (100%) rename src/frontend/{main => }/tests/mocks/styleMock.ts (100%) rename src/frontend/{main => }/tsconfig.json (86%) rename src/frontend/{main => }/webpack.config.js (100%) diff --git a/docker-compose.noodk.yml b/docker-compose.noodk.yml index 87123c6a0b..fcb34e3ad1 100644 --- a/docker-compose.noodk.yml +++ b/docker-compose.noodk.yml @@ -80,7 +80,7 @@ services: depends_on: - api volumes: - - ./src/frontend/main:/app + - ./src/frontend:/app - /app/node_modules/ environment: - API_URL=${URL_SCHEME}://${API_URL} diff --git a/docker-compose.yml b/docker-compose.yml index de851d2e8d..a3d61f954d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -87,7 +87,7 @@ services: depends_on: - api volumes: - - ./src/frontend/main:/app + - ./src/frontend:/app - /app/node_modules/ environment: - API_URL=${URL_SCHEME}://${API_URL} diff --git a/docs/FAQ.md b/docs/FAQ.md index 9e65a9fc3d..a0fd7acd5e 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -1,4 +1,4 @@ -## :question: Frequently Asked Questions :question: +## :question: Frequently Asked Questions :question ### For Users @@ -7,6 +7,7 @@ Q: What is FMTM? **A:** FMTM stands for Field Monitoring Task Manager. It is a web-based application that facilitates remote monitoring of field activities for humanitarian organizations. +
**Q:** Do I need to create an account to use the FMTM Web App? @@ -14,6 +15,7 @@ humanitarian organizations. **A:** No, you can use the FMTM Web App without creating an account, but creating an account allows you to contribute to mapping projects and access additional features. +
**Q:** How do I browse and select mapping projects on the FMTM Web App? @@ -22,6 +24,7 @@ access additional features. clicking on the "Projects" tab and selecting a project of interest. You can view project details, tasks, and mapping data on the project page. +
**Q:** How do I contribute to a mapping project on the FMTM Web App? @@ -30,6 +33,7 @@ project page. create an account, select a project of interest, and choose a task to work on. You can then use the mapping tools provided to complete the task. +
**Q:** Can I work on multiple mapping tasks at the same time on the FMTM Web App? @@ -37,6 +41,7 @@ task. **A:** Yes, you can work on multiple mapping tasks at the same time on the FMTM Web App, as long as you can commit the necessary time and effort to each task. +
**Q:** How do I know if my mapping work on the FMTM Web App is accurate? @@ -44,6 +49,7 @@ to each task. **A:** The FMTM Web App has a validation process where other contributors review and validate the mapping work. This helps to ensure the accuracy of the mapping data. +
**Q:** Can I provide feedback on a mapping project on the FMTM Web App? @@ -51,6 +57,7 @@ accuracy of the mapping data. **A:** Yes, you can provide feedback on a mapping project on the FMTM Web App by leaving a comment on the project page or contacting the project manager. +
**Q:** How do I download mapping data from a project on the FMTM Web App? @@ -58,6 +65,7 @@ manager. **A:** To download mapping data from a project on the FMTM Web App, you can select the project of interest and click on the "Export" button on the project page. +
**Q:** Can I use the mapping data from the FMTM Web App for my own research or projects? @@ -66,6 +74,7 @@ the project page. available for use, but it is important to check the specific project requirements and licenses before using the data for your own research or projects. +
### For Contributors @@ -75,12 +84,14 @@ or projects. **A:** The Field Mapping Tasking Manager (FMTM) is an online platform that allows contributors to participate in mapping projects related to humanitarian and development work. +
**Q:** How can I become a contributor to the FMTM? **A:** To become a contributor to the FMTM, you can create an account on the platform and join a mapping project. +
**Q:** Who can contribute to FMTM? @@ -88,6 +99,7 @@ the platform and join a mapping project. **A:** Anyone can contribute to FMTM. It is an open-source project, and contributions from developers, designers, and other contributors are always welcome. +
**Q:** What kind of contributions can I make to FMTM? @@ -113,6 +125,7 @@ improvements. Translation: If you are fluent in a language other than English, you can contribute by translating the application or its documentation into your language. +
**Q:** What technologies are used in FMTM? @@ -120,6 +133,7 @@ into your language. **A:** FMTM is built using several technologies, including Django, Postgres, Redis, Celery, and Vue.js. The codebase is written in Python, HTML, CSS, and JavaScript. +
**Q:** How do I set up FMTM locally? @@ -127,6 +141,7 @@ Python, HTML, CSS, and JavaScript. **A:** To set up FMTM locally, you need to have Python, Postgres, Redis, and Node.js installed on your system. You can follow the instructions in the README file of the FMTM repository to set up the project. +
**Q:** How can I report a bug or suggest a new feature for FMTM? @@ -135,6 +150,7 @@ in the README file of the FMTM repository to set up the project. the FMTM repository on GitHub. Be sure to provide as much detail as possible, including steps to reproduce the bug, screenshots, or mockups for new features. +
**Q:** How can I contribute to FMTM if I'm new to open source or web development? @@ -146,6 +162,7 @@ documentation, asking questions in the community, and contributing to issues labeled as "good first issue." Additionally, you can join the FMTM community on Slack to connect with other contributors and get help with your contributions. +
**Q:** What are the benefits of contributing to the FMTM? @@ -153,6 +170,7 @@ help with your contributions. **A:** Contributing to the FMTM allows you to help with important humanitarian and development work, while also developing your mapping skills and knowledge. +
**Q:** Do I need to have prior mapping experience to contribute to the FMTM? @@ -160,6 +178,7 @@ skills and knowledge. **A:** No, prior mapping experience is not required to contribute to the FMTM. The platform provides training and resources to help new contributors get started. +
**Q:** How do I know which mapping project to join? @@ -168,6 +187,7 @@ contributors get started. location, the organization sponsoring the project, and the mapping goals. Review the project information and choose a project that interests you. +
**Q:** Can I work on multiple mapping projects at the same time? @@ -175,6 +195,7 @@ interests you. **A:** Yes, you can work on multiple mapping projects at the same time. However, it is important to ensure that you can commit the necessary time and effort to each project. +
**Q:** How do I get feedback on my mapping work? @@ -182,6 +203,7 @@ necessary time and effort to each project. **A:** The FMTM provides a validation process where other contributors review and provide feedback on mapping work. You can also contact project managers or experienced contributors for additional feedback. +
**Q:** How can I improve my mapping skills? @@ -189,6 +211,7 @@ project managers or experienced contributors for additional feedback. **A:** The FMTM provides training and resources to help you improve your mapping skills. You can also join mapping communities and forums to connect with other contributors and learn from their experiences. +
**Q:** Can I use the mapping data for my own research or projects? @@ -196,8 +219,3 @@ connect with other contributors and learn from their experiences. **A:** The mapping data on the FMTM is generally open and available for use, but it is important to check the specific project requirements and licenses before using the data for your own research or projects. - - - - - diff --git a/docs/Guide-On-Improving-Documentation.md b/docs/Guide-On-Improving-Documentation.md index 185d1443c1..c228cf0bef 100644 --- a/docs/Guide-On-Improving-Documentation.md +++ b/docs/Guide-On-Improving-Documentation.md @@ -9,6 +9,7 @@ documentation needed by **HOTOSM**. It also includes specific tips for improving already existing documentation. ## Goals + 1. Highlight the definitions of each type of documentation that are commonly used on Github. 2. Provide a foundation to lay information on top of, in order to @@ -27,7 +28,7 @@ documentation may include some Process documentation under the Usage section, demonstrating how to use that product. These 4 types in full, are as follows: -- **Product Documentation** +- **Product Documentation** - **Project Documentation** - **System Documentation** - **Process Documentation** @@ -35,11 +36,12 @@ are as follows: ### 1. Structure for Product Documentation Product documentation is the process of recording key information -(almost everything you need to know) about a product, including how +(almost everything you need to know) about a product, including how to use it. Product documentation may have form of **Process documentation** within it (this will be further explained later on). A flexible and reusable structure of essential components of product documentation is as follows: + - Overview - Introduction: What the product is, what it does, the target audience, etc. - Features: A breakdown of each integral part of the product, their @@ -61,6 +63,7 @@ Project documentation is the process of recording the key project details that are needed to implement a project. It’s like a roadmap of what the project is and all necessary information about what it entails. Main structural components are in the following order: + - Overview - Vision - Aim / Mission @@ -71,7 +74,7 @@ entails. Main structural components are in the following order: - Access - Resources - Support / Guidelines - + ### 3. Structure for System Documentation System documentation is an all-encompassing record of details of a @@ -90,6 +93,7 @@ step. Process documentation is very useful in other documentation forms. As mentioned earlier, it can be used within **System**, **Product** or **Project** documentation, to explain a process. The format is usually: + - Overview - Introduction - Explanation steps (breakdown of the task) @@ -116,20 +120,20 @@ added to and built upon. documentation more user friendly and much easier to understand, since users come from all different backgrounds. For example: - “ODK incorporates a new functionality” can become “ODK has brought in a new feature”. + “ODK incorporates a new functionality” can become “ODK has brought in a new feature”. - “Field Mappers select (or are allocated) individual tasks within a - project’s AOI” could be changed to “Field Mappers choose or are - given tasks that are part of a project’s Areas Of Interest.” + “Field Mappers select (or are allocated) individual tasks within a + project’s AOI” could be changed to “Field Mappers choose or are + given tasks that are part of a project’s Areas Of Interest.” 4. **Avoid long paragraphs**. Short paragraphs that pass a clear - message are less clumsy and flustering for readers. Breaking down - topics into little, easy to understand chunks, is more user - friendly. + message are less clumsy and flustering for readers. Breaking down + topics into little, easy to understand chunks, is more user + friendly. 5. **Maintain a positive tone in the writing.**. Keep the text positive and informative. Avoid words like ‘obviously’ and - ‘basically’, that may be interpreted as demeaning or + ‘basically’, that may be interpreted as demeaning or condescending. Do not expect readers to have a certain amount of knowledge on specific aspects, break down everything that needs to be broken down. @@ -143,9 +147,9 @@ added to and built upon. documentation.This consistency includes but is not limited to elements like numbering, font styles, heading sizes, and spacing. - Using the same font for all headings and subheadings can help - readers quickly identify important sections of the - document. Similarly, using consistent spacing between paragraphs - and sections can make the document more visually appealing and - easier to follow. This helps to create a documentation that is - clear, effective, and easy to use. + Using the same font for all headings and subheadings can help + readers quickly identify important sections of the + document. Similarly, using consistent spacing between paragraphs + and sections can make the document more visually appealing and + easier to follow. This helps to create a documentation that is + clear, effective, and easy to use. diff --git a/docs/User-Manual-For-Project-Managers.md b/docs/User-Manual-For-Project-Managers.md index 5e91836ffa..4071ffd2ba 100644 --- a/docs/User-Manual-For-Project-Managers.md +++ b/docs/User-Manual-For-Project-Managers.md @@ -1,4 +1,5 @@ # User Manual for FMTM +
This manual is a step by step guide for the project managers on how to get started with the Field Mapping Tasking Manager. @@ -9,7 +10,7 @@ This manual is a step by step guide for the project managers on how to get start - [Steps to create a project in FMTM](#steps-to-create-a-project-in-fmtm) - [Steps to start access your project and Start mapping](#steps-to-start-access-your-project-and-start-mapping-or-a-mapping-campaign) - [Help and Support](#help-and-support) -- [Thank you note](#thank-you) +- [Thank you note](#thank-you) ## Introduction @@ -74,54 +75,35 @@ reliability of the data collected by volunteers, **FMTM** helps to provide critical information that can be used to support decision-making and improve the effectiveness of humanitarian efforts. - ## Prerequisites + - Stable Internet connection - Knowledge on field mapping . If you are new to mapping we suggest you to read [this](https://tasks.hotosm.org/learn/map) . - Account on ODK Central Server. [Here are the instructions for setting up an ODK Central server on Digital Ocean](https://docs.getodk.org/central-install-digital-ocean/) (it's very similar on AWS or whatever) ## Video Tutorial + -https://github.com/hotosm/fmtm/assets/97789856/6ad200e7-3af9-418b-bb6e-6666bbab9a15 - - - -https://github.com/hotosm/fmtm/assets/97789856/62646dd8-6130-4612-99fe-4df29ae432d9 - - - -https://github.com/hotosm/fmtm/assets/97789856/8677062c-981c-4ea3-964f-3348c4953f82 - - - - -https://github.com/hotosm/fmtm/assets/97789856/02355809-2f40-470c-856f-afe56250883f - - - -https://github.com/hotosm/fmtm/assets/97789856/084ce707-95ba-4d51-a650-132be84fbe68 - + + -https://github.com/hotosm/fmtm/assets/97789856/6711badb-c93e-4109-9090-0ad1f1554699 + + + -https://github.com/hotosm/fmtm/assets/97789856/b2af3c7d-5392-4e10-bf83-853b2f517c9a - - - - -https://github.com/hotosm/fmtm/assets/97789856/d8b2bf72-e8e0-41bc-a568-77854f45efa6 - + + ## Steps to create a project in FMTM 1. Go to [fmtm](https://fmtm.hotosm.org/) . 2. In the header, you'll find three tabs: Explore Projects, Manage Organization, and Manage Categories. - + ![WhatsApp Image 2023-06-23 at 1 23 07 PM](https://github.com/hotosm/fmtm/assets/97789856/c0d272f0-c69c-483f-9e9d-83dd75b9e748) 3. Start by exploring the projects listed by different nations and world communities for field mapping exercises. @@ -138,33 +120,27 @@ https://github.com/hotosm/fmtm/assets/97789856/d8b2bf72-e8e0-41bc-a568-77854f45e 10. If your organization's name is not listed, you can add it through the "Manage Organization" tab. 11. Provide the necessary credentials for the ODK (Open Data Kit) central setup, including URL, username, and password. 12. Proceed to the next step, which is uploading the area for field mapping. Choose the file option and select the AOI (Area of Interest) file in GEOJSON file format. -Review the displayed map that corresponds to your selected area and click on "Next". + Review the displayed map that corresponds to your selected area and click on "Next". ![3](https://github.com/hotosm/fmtm/assets/97789856/680eb831-790a-48f1-8997-c20b5213909d) 13. Define the tasks of the project. -![WhatsApp Image 2023-06-23 at 1 38 18 PM](https://github.com/hotosm/fmtm/assets/97789856/177d8258-900e-447f-906a-28aeb1fd6b03) + ![WhatsApp Image 2023-06-23 at 1 38 18 PM](https://github.com/hotosm/fmtm/assets/97789856/177d8258-900e-447f-906a-28aeb1fd6b03) If you choose "Divide on Square," specify the dimensions of the square tasks. Click on "Next" to proceed. - ![WhatsApp Image 2023-06-23 at 1 17 37 PM](https://github.com/hotosm/fmtm/assets/97789856/f53d76b4-e6cc-44a4-8c7c-00082eb72693) - 14. Select Form . Select the form category you want to use for the field mapping, such as "Data Extract" or any other relevant category. -Choose a specific form from the existing forms or upload a custom form if needed. -Click on "Submit" to proceed. + Choose a specific form from the existing forms or upload a custom form if needed. + Click on "Submit" to proceed. ![WhatsApp Image 2023-06-23 at 1 37 19 PM](https://github.com/hotosm/fmtm/assets/97789856/f9a4bed7-d1a9-44dd-b2d4-b55f428f9416) - 15. Wait for the system to generate QR codes for each task, which will be used later in the field mapping process. 16. After the QR codes are generated, you can find your project in the project dashboard. - - -
## Steps to start access your project and Start mapping or a mapping campaign @@ -174,29 +150,30 @@ Click on "Submit" to proceed. ![WhatsApp Image 2023-06-23 at 1 26 39 PM](https://github.com/hotosm/fmtm/assets/97789856/162af2e0-dbfa-4787-8037-f03e71417df8) 3. If a task is already locked by another user, choose a different task that is available for mapping.If a task is already locked by another user, choose a different task that is available for mapping. - - The drop down icon beside **LEGEND** displays a color code. This - color code lets you know the status of each task on the map. - - **READY** means that task is available to be mapped - - **LOCKED FOR MAPPING** means that task is already being mapped by another volunteer and therefore unavailable for mapping - - **MAPPED** or **READY FOR VALIDATION** means that task has been completely mapped and ready to be validated. - - **LOCKED FOR VALIDATION** means that task has been mapped and being validated. - - **VALIDATED** means that task has successfully been validated and completely mapped with no errors - - **INVALIDATED** or **MORE MAPPING NEEDED** means that task did not pass the validation process and needs more mapping - - **BAD** means that task is not clear and cannot be mapped +- The drop down icon beside **LEGEND** displays a color code. This + color code lets you know the status of each task on the map. + + - **READY** means that task is available to be mapped + - **LOCKED FOR MAPPING** means that task is already being mapped by another volunteer and therefore unavailable for mapping + - **MAPPED** or **READY FOR VALIDATION** means that task has been completely mapped and ready to be validated. + - **LOCKED FOR VALIDATION** means that task has been mapped and being validated. + - **VALIDATED** means that task has successfully been validated and completely mapped with no errors + - **INVALIDATED** or **MORE MAPPING NEEDED** means that task did not pass the validation process and needs more mapping + - **BAD** means that task is not clear and cannot be mapped > Note: 'task' refers to each section of the map enclosed in the dotted > lines and each task has a corresponding number tag. - ![WhatsApp Image 2023-06-23 at 1 29 10 PM](https://github.com/hotosm/fmtm/assets/97789856/2c0397b0-1829-420a-982e-3d971b514f2c) - - To begin mapping, click on a task closest to you that has the color - code associated with **READY** and change it's status from **READY** - to **LOCKED FOR MAPPING**. Remember to take note of the number tag. - - Scroll to the bottom of the page. The **ACTIVITIES** tab shows the - tasks either **LOCKED FOR MAPPING**, **BAD** or **LOCKED FOR - VALIDATION**. You can search for tasks with the status mentioned - using the number tag associated with each task. +![WhatsApp Image 2023-06-23 at 1 29 10 PM](https://github.com/hotosm/fmtm/assets/97789856/2c0397b0-1829-420a-982e-3d971b514f2c) +- To begin mapping, click on a task closest to you that has the color + code associated with **READY** and change it's status from **READY** + to **LOCKED FOR MAPPING**. Remember to take note of the number tag. +- Scroll to the bottom of the page. The **ACTIVITIES** tab shows the + tasks either **LOCKED FOR MAPPING**, **BAD** or **LOCKED FOR + VALIDATION**. You can search for tasks with the status mentioned + using the number tag associated with each task. 4. Use the QR code to start mapping the selected task using the ODK Collect app on your mobile phone. 5. Install and open the ODK Collect app on your phone. @@ -207,11 +184,14 @@ Click on "Submit" to proceed. 10. After completing the assigned task, go back to the project platform on FMTM and mark it as fully mapped. ## Help and Support + If you encounter any issues or need assistance while using FMTM, you can access the following resources: + - Check the [FAQs](https://github.com/hotosm/fmtm/wiki/FAQ) . - Ask your doubts in the [Slack channel: #fmtm-field-pilots](https://hotosm.slack.com/archives/C04PCBFDEGN) -## Thank you +## Thank you + We are excited to have you join our community of passionate mappers and volunteers. FMTM is a powerful platform developed by the Humanitarian OpenStreetMap Team (HOT) to facilitate mapping projects for disaster response, humanitarian efforts, and community development. With FMTM, you have the opportunity to make a real impact by mapping areas that are in need of support. Your contributions help create detailed and up-to-date maps that aid organizations and communities in their efforts to respond to crises, plan infrastructure, and improve the lives of people around the world. diff --git a/docs/dev/Frontend.md b/docs/dev/Frontend.md index 6a2d5e4359..b2c7dbb1a8 100644 --- a/docs/dev/Frontend.md +++ b/docs/dev/Frontend.md @@ -32,7 +32,7 @@ Install the dependencies by running the following command: `npm install` Run the frontend with hot-reloading: `npm run start:live` -The frontend should now be accessible at: <<<<<<>>>>>>>. +The frontend should now be accessible at: <<<<<<<>>>>>>>>. ## Frontend Tips diff --git a/scripts/postgis_snippets/import_geojson_as_postgis_with_jsonb.md b/scripts/postgis_snippets/import_geojson_as_postgis_with_jsonb.md index 505efa693a..625e33e564 100644 --- a/scripts/postgis_snippets/import_geojson_as_postgis_with_jsonb.md +++ b/scripts/postgis_snippets/import_geojson_as_postgis_with_jsonb.md @@ -1,6 +1,6 @@ # Deprecated; now using pg_dump -Import the GeoJSON file to PostGIS. To function in the same way as a layer directly imported from OSM using osm2psql, the ```tags``` column needs to be jsonb type. +Import the GeoJSON file to PostGIS. To function in the same way as a layer directly imported from OSM using osm2psql, the `tags` column needs to be jsonb type. There probably is a simple way to combine changing the column type and casting the json string to the actual jsonb type, but I don't know how to do it. So here's the workaround: @@ -25,7 +25,7 @@ update "Islington_AOI_polygons" set tags = tagsvarchar::jsonb ``` -- Nuke the renamed column with the varchar, leaving only the ```tags``` column with the jsonb type +- Nuke the renamed column with the varchar, leaving only the `tags` column with the jsonb type ``` alter table "Islington_AOI_polygons" diff --git a/scripts/postgis_snippets/postgis_resources.md b/scripts/postgis_snippets/postgis_resources.md index 9a63ea3118..fd309cbe46 100644 --- a/scripts/postgis_snippets/postgis_resources.md +++ b/scripts/postgis_snippets/postgis_resources.md @@ -1,11 +1,16 @@ # PostGIS resources + ## Paul Ramsey or CleverElephant -Paul Ramsey is a Canadian open source geographical analyst and developer. [His blog](https://blog.cleverelephant.ca/) (which is often *very* technical) is a gold mine of information on many subjects, notably PostGIS. + +Paul Ramsey is a Canadian open source geographical analyst and developer. [His blog](https://blog.cleverelephant.ca/) (which is often _very_ technical) is a gold mine of information on many subjects, notably PostGIS. + - [Overlays of polygons](https://blog.cleverelephant.ca/2019/07/postgis-overlays.html) ## Matt Forest's Spatial SQL Cookbook -- Intended for someone who's already an experienced GIS user and wants to transfer their knowledge to SQL. [Lots of clear, useful recipes](https://forrest.nyc/spatial-sql-cookbook/). + +- Intended for someone who's already an experienced GIS user and wants to transfer their knowledge to SQL. [Lots of clear, useful recipes](https://forrest.nyc/spatial-sql-cookbook/). ## Random + - [A nice Stack Exchange](https://gis.stackexchange.com/questions/172198/constructing-voronoi-diagram-in-postgis/174219#174219) on Voronoi Polygons - [Best answer ever](https://stackoverflow.com/questions/49531535/pass-fields-when-applying-st-voronoipolygons-and-clip-output) on how to subdivide existing areas with Voronoi polygons diff --git a/scripts/postgis_snippets/task_splitting/task_splitting_readme.md b/scripts/postgis_snippets/task_splitting/task_splitting_readme.md index ecdfe35999..7e7f29649b 100644 --- a/scripts/postgis_snippets/task_splitting/task_splitting_readme.md +++ b/scripts/postgis_snippets/task_splitting/task_splitting_readme.md @@ -1,41 +1,45 @@ # Task Splitting -The file ```task_splitting_optimized.sql``` is a spatial Structured Query Language (SQL) script to split an area of interest for field mapping into small "task" areas. +The file `task_splitting_optimized.sql` is a spatial Structured Query Language (SQL) script to split an area of interest for field mapping into small "task" areas. -It operates within a Postgresql database with the the spatial extension PostGIS enabled. It requires write access to the database for performance reasons (there is another version without the suffice "_optimized" that doesn't require write access, but it's not likely to ever work well enough for production. +It operates within a Postgresql database with the the spatial extension PostGIS enabled. It requires write access to the database for performance reasons (there is another version without the suffice "\_optimized" that doesn't require write access, but it's not likely to ever work well enough for production. It takes into account roads, waterways, and railways to avoid forcing mappers to cross such features during mapping. It uses a clustering algorithm to divide the area into discrete polygons containing an average number of tasks. ## Inputs (tables/layers) + This script takes 4 inputs, all of which are Postgresql/PostGIS tables/layers. -- ```project-aoi```, a PostGIS polygon layer containing a single feature: a polygon containing the Area of Interest. -- ```ways_line```, a PostGIS line layer containing all OpenStreetMap "open ways" (the OSM term for linestrings) in the Area of Interest. -- ```ways_poly```, a Postgis polygon layer containing all OpenSTreetMap "closed ways" (the OSM term for polygons) in the AOI. -- ```project-config```, a Postgresql table containing settings (for example, the average number of features desired per task). _This isn't yet implemented; these settings are hard-coded for the moment. The script runs without a ```project-config``` table, but the number of features per task needs to be tweaked within the code._ -OSM data (```ways-line``` and ```ways_poly```) can be loaded into a PostGIS database using the [Underpass](https://github.com/hotosm/underpass) configuration file [raw.lua](https://github.com/hotosm/underpass/blob/master/utils/raw.lua). If these two layers are present in the same database and schema as the ```project-aoi``` layer, the script will make use of them automatically (non-desctructively; it doesn't modify any tables other than the ones it creates unless you're unlucky enough to have tables matching the very specific names I'm using, which I'll later change to names that should avoid all realistically possible collisions). +- `project-aoi`, a PostGIS polygon layer containing a single feature: a polygon containing the Area of Interest. +- `ways_line`, a PostGIS line layer containing all OpenStreetMap "open ways" (the OSM term for linestrings) in the Area of Interest. +- `ways_poly`, a Postgis polygon layer containing all OpenSTreetMap "closed ways" (the OSM term for polygons) in the AOI. +- `project-config`, a Postgresql table containing settings (for example, the average number of features desired per task). _This isn't yet implemented; these settings are hard-coded for the moment. The script runs without a `project-config` table, but the number of features per task needs to be tweaked within the code._ + +OSM data (`ways-line` and `ways_poly`) can be loaded into a PostGIS database using the [Underpass](https://github.com/hotosm/underpass) configuration file [raw.lua](https://github.com/hotosm/underpass/blob/master/utils/raw.lua). If these two layers are present in the same database and schema as the `project-aoi` layer, the script will make use of them automatically (non-desctructively; it doesn't modify any tables other than the ones it creates unless you're unlucky enough to have tables matching the very specific names I'm using, which I'll later change to names that should avoid all realistically possible collisions). ## Running the script + You need a Postgresql database with PostGIS extension enabled. If both Postgresql and PostGIS are installed and you have permissions set up properly (doing both of those things is way beyond scope here), this should do the trick (choose whatever database name you want): ``` createdb [databasename] -O [username] ``` + ``` psql -U [username] -d [databasename] -c 'CREATE EXTENSION POSTGIS' ``` -Now you need to get some OSM data in there. You can get OSM data from the GeoFabrik download tool or the HOT export tool in ```.pbf``` format. +Now you need to get some OSM data in there. You can get OSM data from the GeoFabrik download tool or the HOT export tool in `.pbf` format. -If you have your own way of getting the OSM data into the database, as long as it'll create the ```ways_line``` and ```ways_poly``` layers, go for it. Here's ho I'm doing it: +If you have your own way of getting the OSM data into the database, as long as it'll create the `ways_line` and `ways_poly` layers, go for it. Here's ho I'm doing it: ``` -osm2pgsql --create -H localhost -U [username] -P 5432 -d [database name] -W --extra-attributes --output=flex --style /path/to/git/underpass/utils/raw.lua /path/to/my_extract.osm.pbf +osm2pgsql --create -H localhost -U [username] -P 5432 -d [database name] -W --extra-attributes --output=flex --style /path/to/git/underpass/utils/raw.lua /path/to/my_extract.osm.pbf ``` -Now you need an AOI. I'm using QGIS connect to the database using the Database Manager, then creating a polygon layer (make a "Temporary scratch layer' with polygon geometry, draw an AOI, and import that layer into the database using the Database Manager). If you don't want to use QGIS, you can get a GeoJSON polygon some other way ([geojson.io](geojson.io) comes to mind) and shove it into the database using ogr2ogr or some other tool. Whatever. Just ensure it's a polygon layer in EPSG:4326 and it's called ```project-aoi```. +Now you need an AOI. I'm using QGIS connect to the database using the Database Manager, then creating a polygon layer (make a "Temporary scratch layer' with polygon geometry, draw an AOI, and import that layer into the database using the Database Manager). If you don't want to use QGIS, you can get a GeoJSON polygon some other way ([geojson.io](geojson.io) comes to mind) and shove it into the database using ogr2ogr or some other tool. Whatever. Just ensure it's a polygon layer in EPSG:4326 and it's called `project-aoi`. ``` psql -U [username] -d [database name] -f path/to/fmtm/scripts/postgis_snippets/task_splitting/task_splitting_optimized.sql @@ -44,25 +48,27 @@ psql -U [username] -d [database name] -f path/to/fmtm/scripts/postgis_snippets/t If all is set up correctly, that'll run and spit out some console output. It's moderately likely to include some warning messages due to messy OSM data, and will very likely complain that some tables do not exist (that's because I clobber any tables with colliding names before creating my own tables; don't run this script on random production databases until I collision-proof the names, and probably not even then). ## Outputs + You should now have the following useful layers in your Postgresql/PostGIS database: + - clusteredbuildings - taskpolygons As well as the following non-useful layers (well, they're useful for debugging, but not for end users' purposes): + - buildings - dumpedpoints - lowfeaturecountpolygons - splitpolygons - voronois -The ```taskpolygons``` layer can be exported as GeoJSON and used as a task to upload to the FMTM. This works in at least some cases; I'm not sure if there are cases where whatever was in the AOI and OSM layers causes outputs that break somehow (there are definitely some cases where building footprints in OSM are sufficiently messed up that they create weird task geometries, but so far these haven't actually broken anything). +The `taskpolygons` layer can be exported as GeoJSON and used as a task to upload to the FMTM. This works in at least some cases; I'm not sure if there are cases where whatever was in the AOI and OSM layers causes outputs that break somehow (there are definitely some cases where building footprints in OSM are sufficiently messed up that they create weird task geometries, but so far these haven't actually broken anything). ## Next steps It's working OK now, but needs more work. + - Still simply discards polygon delineated by roads/waterways/railways rather than merging them into neighbors, which causes the task polygons to not tile the full AOI. This isn't necessarily always a problem, but it would be better to have the option to merge rather than discard those areas. - Task polygon edges can be rough, often jagged, occasionally poking into buildings from adjacent polygons (though never, I think to the centroid). Working on simplifying/smoothing these, but there are some complications... - Task polygon edges can contain closed-off loops unconnected to their main bodies. May need to increase density of segmentation of buildings in some places. - Clustering is really pretty good, but not very strict at keeping similar numbers of features per cluster; you get a bit of a range of task sizes (though much, much better than anything we've had previously). I think it's possible to tweak this, though I think it might be expensive in terms of performance. - - diff --git a/src/backend/app/auth/auth_routes.py b/src/backend/app/auth/auth_routes.py index ff62f4eaf3..1d4d5a7181 100644 --- a/src/backend/app/auth/auth_routes.py +++ b/src/backend/app/auth/auth_routes.py @@ -18,13 +18,12 @@ """Auth routes, using OSM OAuth2 endpoints.""" -from loguru import logger as log from fastapi import APIRouter, Depends, HTTPException, Request from fastapi.responses import JSONResponse +from loguru import logger as log from sqlalchemy.orm import Session -from ..config import settings - +from ..config import settings from ..db import database from ..db.db_models import DbUser from ..users import user_crud @@ -68,8 +67,10 @@ def callback(request: Request, osm_auth=Depends(init_osm_auth)): - access_token (string) """ print("Call back api requested", request.url) - - access_token = osm_auth.callback(str(request.url).replace('http',settings.URL_SCHEME)) + + access_token = osm_auth.callback( + str(request.url).replace("http", settings.URL_SCHEME) + ) log.debug(f"Access token returned: {access_token}") return JSONResponse(content={"access_token": access_token}, status_code=200) diff --git a/src/backend/app/central/central_crud.py b/src/backend/app/central/central_crud.py index 737142e4f6..08d61fe0dc 100644 --- a/src/backend/app/central/central_crud.py +++ b/src/backend/app/central/central_crud.py @@ -15,8 +15,6 @@ # You should have received a copy of the GNU General Public License # along with FMTM. If not, see . # -from loguru import logger as log - import base64 import json import os @@ -26,13 +24,13 @@ # import osm_fieldwork # Qr code imports import segno -import xmltodict from fastapi import HTTPException +from fastapi.responses import JSONResponse +from loguru import logger as log from osm_fieldwork.CSVDump import CSVDump from osm_fieldwork.OdkCentral import OdkAppUser, OdkForm, OdkProject from pyxform.xls2xform import xls2xform_convert from sqlalchemy.orm import Session -from fastapi.responses import JSONResponse from ..config import settings from ..db import db_models @@ -154,9 +152,7 @@ def delete_odk_project(project_id: int, odk_central: project_schemas.ODKCentral try: project = get_odk_project(odk_central) result = project.deleteProject(project_id) - log.info( - f"Project {project_id} has been deleted from the ODK Central server." - ) + log.info(f"Project {project_id} has been deleted from the ODK Central server.") return result except Exception: return "Could not delete project from central odk" @@ -284,7 +280,11 @@ def delete_odk_xform( # def list_odk_xforms(project_id: int, odk_central: project_schemas.ODKCentral = None): -def list_odk_xforms(project_id: int, odk_central: project_schemas.ODKCentral = None, metadata:bool = False): +def list_odk_xforms( + project_id: int, + odk_central: project_schemas.ODKCentral = None, + metadata: bool = False, +): """List all XForms in an ODK Central project.""" project = get_odk_project(odk_central) xforms = project.listForms(project_id, metadata) @@ -331,21 +331,21 @@ def list_submissions(project_id: int, odk_central: project_schemas.ODKCentral = def get_form_list(db: Session, skip: int, limit: int): """Returns the list of id and title of xforms from the database.""" try: - forms = ( + forms = ( db.query(db_models.DbXForm.id, db_models.DbXForm.title) .offset(skip) .limit(limit) .all() ) - + result_dict = [] for form in forms: form_dict = { - 'id': form[0], # Assuming the first element is the ID - 'title': form[1] # Assuming the second element is the title + "id": form[0], # Assuming the first element is the ID + "title": form[1], # Assuming the second element is the title } result_dict.append(form_dict) - + return result_dict except Exception as e: @@ -384,7 +384,10 @@ async def test_form_validity(xform_content: str, form_type: str): xls2xform_convert(xlsform_path=xlsform_path, xform_path=outfile, validate=False) return {"message": "Your form is valid"} except Exception as e: - return JSONResponse(content={"message":"Your form is invalid", "possible_reason":str(e)}, status_code=400) + return JSONResponse( + content={"message": "Your form is invalid", "possible_reason": str(e)}, + status_code=400, + ) def generate_updated_xform( @@ -460,12 +463,11 @@ def generate_updated_xform( import xml.etree.ElementTree as ET root = ET.fromstring(data) - head = root.find("h:head",namespaces) - model = head.find("xforms:model",namespaces) - instances = model.findall("xforms:instance",namespaces) + head = root.find("h:head", namespaces) + model = head.find("xforms:model", namespaces) + instances = model.findall("xforms:instance", namespaces) index = 0 - data_tag_present = False for inst in instances: try: if "src" in inst.attrib: @@ -477,8 +479,7 @@ def generate_updated_xform( if data_tags: for dt in data_tags: dt.attrib["id"] = id - data_tag_present = True - except Exception as e: + except Exception: continue index += 1 diff --git a/src/backend/app/central/central_routes.py b/src/backend/app/central/central_routes.py index f8af1e7b8c..167535cafb 100644 --- a/src/backend/app/central/central_routes.py +++ b/src/backend/app/central/central_routes.py @@ -15,12 +15,11 @@ # You should have received a copy of the GNU General Public License # along with FMTM. If not, see . # -from loguru import logger as log - import json from fastapi import APIRouter, Depends, HTTPException from fastapi.responses import JSONResponse +from loguru import logger as log from sqlalchemy import ( column, select, diff --git a/src/backend/app/central/central_schemas.py b/src/backend/app/central/central_schemas.py index dcfcedfe0b..3eeb6d6393 100644 --- a/src/backend/app/central/central_schemas.py +++ b/src/backend/app/central/central_schemas.py @@ -15,10 +15,9 @@ # You should have received a copy of the GNU General Public License # along with FMTM. If not, see . # -from loguru import logger as log - from enum import Enum +from loguru import logger as log from pydantic import BaseModel diff --git a/src/backend/app/db/db_models.py b/src/backend/app/db/db_models.py index 81274eaca9..74ba6e682a 100644 --- a/src/backend/app/db/db_models.py +++ b/src/backend/app/db/db_models.py @@ -524,12 +524,13 @@ def tasks_bad(self): # Count of tasks where osm extracts is completed, used for progress bar. extract_completed_count = Column(Integer, default=0) - form_xls = Column(LargeBinary) # XLSForm file if custom xls is uploaded - form_config_file = Column(LargeBinary) # Yaml config file if custom xls is uploaded + form_xls = Column(LargeBinary) # XLSForm file if custom xls is uploaded + form_config_file = Column(LargeBinary) # Yaml config file if custom xls is uploaded + + data_extract_type = Column(String) # Type of data extract (Polygon or Centroid) + task_split_type = Column(String) # Type of split (Grid or Feature) + hashtags = Column(ARRAY(String)) # Project hashtag - data_extract_type = Column(String) # Type of data extract (Polygon or Centroid) - task_split_type = Column(String) # Type of split (Grid or Feature) - hashtags = Column(ARRAY(String)) # Project hashtag # TODO: Add index on project geometry, tried to add in __table args__ # Index("idx_geometry", DbProject.geometry, postgresql_using="gist") @@ -607,7 +608,7 @@ class DbUserRoles(Base): class DbProjectAOI(Base): __tablename__ = "project_aoi" - + id = Column(Integer, primary_key=True) project_id = Column(String) geom = Column(Geometry(geometry_type="GEOMETRY", srid=4326)) @@ -616,7 +617,7 @@ class DbProjectAOI(Base): class DbOsmLines(Base): __tablename__ = "ways_line" - + id = Column(Integer, primary_key=True) project_id = Column(String) geom = Column(Geometry(geometry_type="GEOMETRY", srid=4326)) @@ -642,4 +643,4 @@ class DbTilesPath(Base): path = Column(String) tile_source = Column(String) background_task_id = Column(String) - created_at = Column(DateTime, default=timestamp) \ No newline at end of file + created_at = Column(DateTime, default=timestamp) diff --git a/src/backend/app/db/postgis_utils.py b/src/backend/app/db/postgis_utils.py index 00ed26cbfc..b21cafd909 100644 --- a/src/backend/app/db/postgis_utils.py +++ b/src/backend/app/db/postgis_utils.py @@ -37,7 +37,7 @@ def geometry_to_geojson(geometry: Geometry, properties: str = {}, id: int = None "geometry": mapping(shape), "properties": properties, "id": id, - "bbox":shape.bounds + "bbox": shape.bounds, } return Feature(**geojson) diff --git a/src/backend/app/models/enums.py b/src/backend/app/models/enums.py index b9a0c3c361..cb8611c50d 100644 --- a/src/backend/app/models/enums.py +++ b/src/backend/app/models/enums.py @@ -221,4 +221,4 @@ class BackgroundTaskStatus(IntEnum, Enum): SUCCESS = 4 -TILES_SOURCE = ["esri", "bing", "google", "topo"] \ No newline at end of file +TILES_SOURCE = ["esri", "bing", "google", "topo"] diff --git a/src/backend/app/organization/organization_crud.py b/src/backend/app/organization/organization_crud.py index df297dd14b..4792e9fe45 100644 --- a/src/backend/app/organization/organization_crud.py +++ b/src/backend/app/organization/organization_crud.py @@ -15,15 +15,16 @@ # You should have received a copy of the GNU General Public License # along with FMTM. If not, see . # -from loguru import logger as log - import os import random -import string -from fastapi import HTTPException, File,UploadFile import re +import string + +from fastapi import HTTPException, UploadFile +from loguru import logger as log from sqlalchemy import func from sqlalchemy.orm import Session + from ..db import db_models IMAGEDIR = "app/images/" @@ -35,11 +36,12 @@ def get_organisations( db_organisation = db.query(db_models.DbOrganisation).all() return db_organisation + def generate_slug(text: str) -> str: # Remove special characters and replace spaces with hyphens - slug = re.sub(r'[^\w\s-]', '', text).strip().lower().replace(' ', '-') + slug = re.sub(r"[^\w\s-]", "", text).strip().lower().replace(" ", "-") # Remove consecutive hyphens - slug = re.sub(r'[-\s]+', '-', slug) + slug = re.sub(r"[-\s]+", "-", slug) return slug @@ -47,7 +49,7 @@ async def get_organisation_by_name(db: Session, name: str): # Use SQLAlchemy's query-building capabilities db_organisation = ( db.query(db_models.DbOrganisation) - .filter(func.lower(db_models.DbOrganisation.name).like(func.lower(f'%{name}%'))) + .filter(func.lower(db_models.DbOrganisation.name).like(func.lower(f"%{name}%"))) .first() ) return db_organisation @@ -58,9 +60,8 @@ async def upload_image(db: Session, file: UploadFile(None)): filename = file.filename file_path = f"{IMAGEDIR}{filename}" while os.path.exists(file_path): - # Generate a random character - random_char = ''.join(random.choices(string.ascii_letters + string.digits, k=3)) + random_char = "".join(random.choices(string.ascii_letters + string.digits, k=3)) # Add the random character to the filename logo_name, extension = os.path.splitext(filename) @@ -77,9 +78,10 @@ async def upload_image(db: Session, file: UploadFile(None)): return filename -async def create_organization(db: Session, name: str, description: str, url: str, logo: UploadFile(None)): - """ - Creates a new organization with the given name, description, url, type, and logo. +async def create_organization( + db: Session, name: str, description: str, url: str, logo: UploadFile(None) +): + """Creates a new organization with the given name, description, url, type, and logo. Saves the logo file to the app/images folder. Args: @@ -93,7 +95,6 @@ async def create_organization(db: Session, name: str, description: str, url: str Returns: bool: True if organization was created successfully """ - # create new organization try: logo_name = await upload_image(db, logo) if logo else None @@ -103,7 +104,7 @@ async def create_organization(db: Session, name: str, description: str, url: str slug=generate_slug(name), description=description, url=url, - logo=logo_name + logo=logo_name, ) db.add(db_organization) @@ -119,8 +120,7 @@ async def create_organization(db: Session, name: str, description: str, url: str async def get_organisation_by_id(db: Session, id: int): - """ - Get an organization by its id. + """Get an organization by its id. Args: db (Session): database session @@ -130,22 +130,25 @@ async def get_organisation_by_id(db: Session, id: int): DbOrganisation: organization with the given id """ db_organization = ( - db.query(db_models.DbOrganisation).filter(db_models.DbOrganisation.id == id).first() + db.query(db_models.DbOrganisation) + .filter(db_models.DbOrganisation.id == id) + .first() ) return db_organization async def update_organization_info( - db: Session, - organization_id, name: str, + db: Session, + organization_id, + name: str, description: str, url: str, - logo: UploadFile - ): + logo: UploadFile, +): organization = await get_organisation_by_id(db, organization_id) if not organization: - raise HTTPException(status_code=404, detail='Organization not found') - + raise HTTPException(status_code=404, detail="Organization not found") + if name: organization.name = name if description: diff --git a/src/backend/app/organization/organization_routes.py b/src/backend/app/organization/organization_routes.py index 8b52db7471..e0ffdd61ad 100644 --- a/src/backend/app/organization/organization_routes.py +++ b/src/backend/app/organization/organization_routes.py @@ -16,7 +16,6 @@ # along with FMTM. If not, see . # -from typing import Union,Optional from fastapi import ( APIRouter, @@ -26,7 +25,6 @@ HTTPException, UploadFile, ) -from loguru import logger as log from sqlalchemy.orm import Session from ..db import database @@ -43,7 +41,6 @@ @router.get("/") def get_organisations( db: Session = Depends(database.get_db), - ): """Get api for fetching organization list.""" organizations = organization_crud.get_organisations(db) @@ -52,10 +49,9 @@ def get_organisations( @router.get("/{organization_id}") async def get_organization_detail( - organization_id: int, - db: Session = Depends(database.get_db) + organization_id: int, db: Session = Depends(database.get_db) ): - """Get API for fetching detail about a organiation based on id""" + """Get API for fetching detail about a organiation based on id.""" organization = await organization_crud.get_organisation_by_id(db, organization_id) if not organization: raise HTTPException(status_code=404, detail="Organization not found") @@ -71,8 +67,7 @@ async def create_organization( logo: UploadFile = File(None), # Optional field for organization logo db: Session = Depends(database.get_db), # Dependency for database session ): - """ - Create an organization with the given details. + """Create an organization with the given details. Parameters: name (str): The name of the organization. Required. @@ -86,7 +81,9 @@ async def create_organization( """ # Check if the organization with the same already exists if await organization_crud.get_organisation_by_name(db, name=name): - raise HTTPException(status_code=400, detail=f"Organization already exists with the name {name}") + raise HTTPException( + status_code=400, detail=f"Organization already exists with the name {name}" + ) await organization_crud.create_organization(db, name, description, url, logo) @@ -95,27 +92,27 @@ async def create_organization( @router.patch("/{organization_id}/") async def update_organization( - organization_id: int, + organization_id: int, name: str = Form(None), description: str = Form(None), url: str = Form(None), logo: UploadFile = File(None), - db: Session = Depends(database.get_db) + db: Session = Depends(database.get_db), ): - """PUT API to update the details of an organization""" + """PUT API to update the details of an organization.""" try: - organization = await organization_crud.update_organization_info(db, organization_id, name, description, url, logo) + organization = await organization_crud.update_organization_info( + db, organization_id, name, description, url, logo + ) return organization except Exception as e: raise HTTPException(status_code=400, detail=f"Error updating organization: {e}") - @router.delete("/{organization_id}") async def delete_organisations( organization_id: int, db: Session = Depends(database.get_db) - ): - +): organization = await organization_crud.get_organisation_by_id(db, organization_id) if not organization: diff --git a/src/backend/app/organization/organization_schemas.py b/src/backend/app/organization/organization_schemas.py index bb9bc3163d..f1994ba069 100644 --- a/src/backend/app/organization/organization_schemas.py +++ b/src/backend/app/organization/organization_schemas.py @@ -18,11 +18,10 @@ from pydantic import BaseModel - class Organisation(BaseModel): # id: int slug: str name: str description: str url: str - # type: int \ No newline at end of file + # type: int diff --git a/src/backend/app/projects/project_crud.py b/src/backend/app/projects/project_crud.py index c48e8d4678..668427f866 100644 --- a/src/backend/app/projects/project_crud.py +++ b/src/backend/app/projects/project_crud.py @@ -15,8 +15,6 @@ # You should have received a copy of the GNU General Public License # along with FMTM. If not, see . # -from loguru import logger as log - import base64 import io import json @@ -33,39 +31,35 @@ import geoalchemy2 import geojson import numpy as np +import pkg_resources import requests import segno import shapely.wkb as wkblib import sqlalchemy -import pkg_resources from fastapi import File, HTTPException, UploadFile from geoalchemy2.shape import from_shape from geojson import dump +from loguru import logger as log from osm_fieldwork import basemapper +from osm_fieldwork.json2osm import json2osm from osm_fieldwork.make_data_extract import PostgresClient from osm_fieldwork.OdkCentral import OdkAppUser from osm_fieldwork.xlsforms import xlsforms_path -from osm_fieldwork.json2osm import json2osm from shapely import wkt from shapely.geometry import MultiPolygon, Polygon, mapping, shape -from sqlalchemy import and_, column, func, inspect, select, table +from sqlalchemy import and_, column, func, inspect, select, table, text from sqlalchemy.dialects.postgresql import insert from sqlalchemy.orm import Session -from sqlalchemy import text from sqlalchemy.sql import text -from cpuinfo import get_cpu_info -from ..db import database -import concurrent.futures from ..central import central_crud from ..config import settings -from ..db import db_models +from ..db import database, db_models from ..db.postgis_utils import geometry_to_geojson, timestamp from ..tasks import tasks_crud from ..users import user_crud from . import project_schemas - QR_CODES_DIR = "QR_codes/" TASK_GEOJSON_DIR = "geojson/" TILESDIR = "/opt/tiles" @@ -438,12 +432,12 @@ def remove_z_dimension(coord): ) db.commit() - - # Generate project outline from tasks - query = text(f"""SELECT ST_AsText(ST_ConvexHull(ST_Collect(outline))) + query = text( + f"""SELECT ST_AsText(ST_ConvexHull(ST_Collect(outline))) FROM tasks - WHERE project_id={project_id};""") + WHERE project_id={project_id};""" + ) log.debug("Generating project outline from tasks") result = db.execute(query) @@ -617,15 +611,17 @@ def get_osm_extracts(boundary: str): return data + async def split_into_tasks( - db: Session, boundary: str, no_of_buildings: int, has_data_extracts:bool + db: Session, boundary: str, no_of_buildings: int, has_data_extracts: bool ): - """ - Splits a project into tasks. + """Splits a project into tasks. + Args: db (Session): A database session. boundary (str): A GeoJSON string representing the boundary of the project to split into tasks. no_of_buildings (int): The number of buildings to include in each task. + Returns: Any: A GeoJSON object containing the tasks for the specified project. """ @@ -634,32 +630,36 @@ async def split_into_tasks( all_results = [] boundary_data = [] result = [] - if outline['type'] == "FeatureCollection": + if outline["type"] == "FeatureCollection": boundary_data.extend(feature["geometry"] for feature in outline["features"]) result.extend( process_polygon(db, project_id, data, no_of_buildings, has_data_extracts) for data in boundary_data - ) + ) for inner_list in result: all_results.extend(iter(inner_list)) - elif outline['type'] == "GeometryCollection": + elif outline["type"] == "GeometryCollection": geometries = outline["geometries"] boundary_data.extend(iter(geometries)) result.extend( process_polygon(db, project_id, data, no_of_buildings, has_data_extracts) for data in boundary_data - ) + ) for inner_list in result: all_results.extend(iter(inner_list)) - elif outline['type'] == "Feature": + elif outline["type"] == "Feature": boundary_data = outline["geometry"] - result = process_polygon(db, project_id, boundary_data, no_of_buildings, has_data_extracts) + result = process_polygon( + db, project_id, boundary_data, no_of_buildings, has_data_extracts + ) all_results.extend(iter(result)) else: boundary_data = outline - result = process_polygon(db, project_id, boundary_data, no_of_buildings, has_data_extracts) + result = process_polygon( + db, project_id, boundary_data, no_of_buildings, has_data_extracts + ) all_results.extend(result) return { "type": "FeatureCollection", @@ -667,7 +667,13 @@ async def split_into_tasks( } -def process_polygon(db:Session, project_id:uuid.UUID, boundary_data:str, no_of_buildings:int, has_data_extracts: bool): +def process_polygon( + db: Session, + project_id: uuid.UUID, + boundary_data: str, + no_of_buildings: int, + has_data_extracts: bool, +): outline = shape(boundary_data) db_task = db_models.DbProjectAOI( project_id=project_id, @@ -681,43 +687,40 @@ def process_polygon(db:Session, project_id:uuid.UUID, boundary_data:str, no_of_b if not data: return None for feature in data["features"]: - feature_shape = shape(feature['geometry']) + feature_shape = shape(feature["geometry"]) wkb_element = from_shape(feature_shape, srid=4326) - if feature['properties'].get('building') == 'yes': + if feature["properties"].get("building") == "yes": db_feature = db_models.DbBuildings( - project_id=project_id, - geom=wkb_element, - tags=feature["properties"] + project_id=project_id, geom=wkb_element, tags=feature["properties"] ) db.add(db_feature) - elif 'highway' in feature['properties']: + elif "highway" in feature["properties"]: db_feature = db_models.DbOsmLines( - project_id=project_id, - geom=wkb_element, - tags=feature["properties"] + project_id=project_id, geom=wkb_element, tags=feature["properties"] ) db.add(db_feature) db.commit() else: # Remove the polygons outside of the project AOI using a parameterized query - query = text(f""" + query = text( + f""" DELETE FROM ways_poly WHERE NOT ST_Within(ST_Centroid(ways_poly.geom), (SELECT geom FROM project_aoi WHERE project_id = '{project_id}')); - """) + """ + ) result = db.execute(query) db.commit() - with open('app/db/split_algorithm.sql', 'r') as sql_file: + with open("app/db/split_algorithm.sql", "r") as sql_file: query = sql_file.read() - result = db.execute(text(query), params={'num_buildings': no_of_buildings}) + result = db.execute(text(query), params={"num_buildings": no_of_buildings}) result = result.fetchall() db.query(db_models.DbBuildings).delete() db.query(db_models.DbOsmLines).delete() db.query(db_models.DbProjectAOI).delete() db.commit() - return result[0][0]['features'] - + return result[0][0]["features"] # def update_project_boundary( @@ -1050,7 +1053,7 @@ def read_xlsforms( if xls.endswith(".xls") or xls.endswith(".xlsx"): file_name = xls.split(".")[0] yaml_file_name = f"data_models/{file_name}.yaml" - if pkg_resources.resource_exists(package_name,yaml_file_name): + if pkg_resources.resource_exists(package_name, yaml_file_name): xlsforms.append(xls) else: continue @@ -1186,7 +1189,7 @@ def generate_task_files( # If app user could not be created, raise an exception. if not appuser: - project_log.error(f"Couldn't create appuser for project") + project_log.error("Couldn't create appuser for project") return False # prefix should be sent instead of name @@ -1214,7 +1217,8 @@ def generate_task_files( # Get the features for this task. # Postgis query to filter task inside this task outline and of this project # Update those features and set task_id - query = text(f"""UPDATE features + query = text( + f"""UPDATE features SET task_id={task_id} WHERE id IN ( SELECT id @@ -1223,12 +1227,14 @@ def generate_task_files( AND ST_IsValid(geometry) AND ST_IsValid('{task.outline}'::Geometry) AND ST_Contains('{task.outline}'::Geometry, ST_Centroid(geometry)) - )""") + )""" + ) result = db.execute(query) # Get the geojson of those features for this task. - query = text(f"""SELECT jsonb_build_object( + query = text( + f"""SELECT jsonb_build_object( 'type', 'FeatureCollection', 'features', jsonb_agg(feature) ) @@ -1241,13 +1247,14 @@ def generate_task_files( ) AS feature FROM features WHERE project_id={project_id} and task_id={task_id} - ) features;""") + ) features;""" + ) result = db.execute(query) features = result.fetchone()[0] - upload_media = False if features['features'] is None else True + upload_media = False if features["features"] is None else True # Update outfile containing osm extracts with the new geojson contents containing title in the properties. with open(extracts, "w") as jsonfile: @@ -1257,10 +1264,11 @@ def generate_task_files( project_log.info(f"Generating xform for task {task_id}") outfile = central_crud.generate_updated_xform(xlsform, xform, form_type) - # Create an odk xform project_log.info(f"Uploading media in {task_id}") - result = central_crud.create_odk_xform(odk_id, task_id, outfile, odk_credentials, False, upload_media) + result = central_crud.create_odk_xform( + odk_id, task_id, outfile, odk_credentials, False, upload_media + ) # result = central_crud.create_odk_xform(odk_id, task_id, outfile, odk_credentials) project_log.info(f"Updating role for app user in task {task_id}") @@ -1294,7 +1302,6 @@ def generate_task_files( return True - def generate_task_files_wrapper(project_id, task, xlsform, form_type, odk_credentials): for db in database.get_db(): generate_task_files(db, project_id, task, xlsform, form_type, odk_credentials) @@ -1324,7 +1331,7 @@ def generate_appuser_files( """ try: project_log = log.bind(task="create_project", project_id=project_id) - + project_log.info(f"Starting generate_appuser_files for project {project_id}") # Get the project table contents. @@ -1387,11 +1394,11 @@ def generate_appuser_files( # Data Extracts if extracts_contents is not None: - project_log.info(f"Uploading data extracts") + project_log.info("Uploading data extracts") upload_custom_data_extracts(db, project_id, extracts_contents) else: - project_log.info(f"Extracting Data from OSM") + project_log.info("Extracting Data from OSM") # OSM Extracts for whole project pg = PostgresClient(settings.UNDERPASS_API_URL, "underpass") @@ -1452,7 +1459,12 @@ def generate_appuser_files( for task in tasks_list: try: generate_task_files( - db, project_id, task, xlsform, form_type, odk_credentials, + db, + project_id, + task, + xlsform, + form_type, + odk_credentials, ) except Exception as e: log.warning(str(e)) @@ -1546,10 +1558,10 @@ def get_task_geometry(db: Session, project_id: int): return json.dumps(feature_collection) -async def get_project_features_geojson(db:Session, project_id:int): - +async def get_project_features_geojson(db: Session, project_id: int): # Get the geojson of those features for this task. - query = text(f"""SELECT jsonb_build_object( + query = text( + f"""SELECT jsonb_build_object( 'type', 'FeatureCollection', 'features', jsonb_agg(feature) ) @@ -1563,7 +1575,8 @@ async def get_project_features_geojson(db:Session, project_id:int): FROM features WHERE project_id={project_id} ) features; - """) + """ + ) result = db.execute(query) features = result.fetchone()[0] @@ -1790,7 +1803,9 @@ def convert_to_project_summary(db_project: db_models.DbProject): summary.num_contributors = ( db_project.tasks_mapped + db_project.tasks_validated ) # TODO: get real number of contributors - summary.organisation_logo = db_project.organisation.logo if db_project.organisation else None + summary.organisation_logo = ( + db_project.organisation.logo if db_project.organisation else None + ) return summary else: @@ -2088,7 +2103,8 @@ async def update_project_form( # Get the features for this task. # Postgis query to filter task inside this task outline and of this project # Update those features and set task_id - query = text(f"""UPDATE features + query = text( + f"""UPDATE features SET task_id={task} WHERE id in ( @@ -2096,12 +2112,14 @@ async def update_project_form( FROM features WHERE project_id={project_id} and ST_Intersects(geometry, '{task_obj.outline}'::Geometry) - )""") + )""" + ) result = db.execute(query) # Get the geojson of those features for this task. - query = text(f"""SELECT jsonb_build_object( + query = text( + f"""SELECT jsonb_build_object( 'type', 'FeatureCollection', 'features', jsonb_agg(feature) ) @@ -2114,7 +2132,8 @@ async def update_project_form( ) AS feature FROM features WHERE project_id={project_id} and task_id={task} - ) features;""") + ) features;""" + ) result = db.execute(query) features = result.fetchone()[0] @@ -2154,7 +2173,8 @@ async def update_odk_credentials( async def get_extracted_data_from_db(db: Session, project_id: int, outfile: str): """Get the geojson of those features for this project.""" - query = text(f"""SELECT jsonb_build_object( + query = text( + f"""SELECT jsonb_build_object( 'type', 'FeatureCollection', 'features', jsonb_agg(feature) ) @@ -2167,7 +2187,8 @@ async def get_extracted_data_from_db(db: Session, project_id: int, outfile: str) ) AS feature FROM features WHERE project_id={project_id} - ) features;""") + ) features;""" + ) result = db.execute(query) features = result.fetchone()[0] @@ -2208,7 +2229,8 @@ def get_project_tiles( db.commit() # Project Outline - query = text(f"""SELECT jsonb_build_object( + query = text( + f"""SELECT jsonb_build_object( 'type', 'FeatureCollection', 'features', jsonb_agg(feature) ) @@ -2220,7 +2242,8 @@ def get_project_tiles( ) AS feature FROM projects WHERE id={project_id} - ) features;""") + ) features;""" + ) result = db.execute(query) features = result.fetchone()[0] diff --git a/src/backend/app/projects/project_routes.py b/src/backend/app/projects/project_routes.py index 0351ac0c69..6ba0578d97 100644 --- a/src/backend/app/projects/project_routes.py +++ b/src/backend/app/projects/project_routes.py @@ -15,8 +15,6 @@ # You should have received a copy of the GNU General Public License # along with FMTM. If not, see . # -from loguru import logger as log - import json import os import uuid @@ -34,6 +32,7 @@ UploadFile, ) from fastapi.responses import FileResponse +from loguru import logger as log from osm_fieldwork.make_data_extract import getChoices from osm_fieldwork.xlsforms import xlsforms_path from sqlalchemy.orm import Session @@ -44,7 +43,6 @@ from ..tasks import tasks_crud from . import project_crud, project_schemas, utils - router = APIRouter( prefix="/projects", tags=["projects"], @@ -85,7 +83,9 @@ async def get_projet_details(project_id: int, db: Session = Depends(database.get odk_central_password=project.odk_central_password, ) - odk_details = await central_crud.get_project_full_details(project.odkid, odk_credentials) + odk_details = await central_crud.get_project_full_details( + project.odkid, odk_credentials + ) # Features count query = f"select count(*) from features where project_id={project_id} and task_id is not null" @@ -93,12 +93,12 @@ async def get_projet_details(project_id: int, db: Session = Depends(database.get features = result.fetchone()[0] return { - 'id':project_id, - 'name':odk_details['name'], - 'createdAt':odk_details['createdAt'], - 'tasks':odk_details['forms'], - 'lastSubmission':odk_details['lastSubmission'], - 'total_features':features + "id": project_id, + "name": odk_details["name"], + "createdAt": odk_details["createdAt"], + "tasks": odk_details["forms"], + "lastSubmission": odk_details["lastSubmission"], + "total_features": features, } @@ -386,10 +386,9 @@ async def task_split( upload: UploadFile = File(...), no_of_buildings: int = Form(50), has_data_extracts: bool = Form(False), - db: Session = Depends(database.get_db) - ): - """ - Split a task into subtasks. + db: Session = Depends(database.get_db), +): + """Split a task into subtasks. Args: upload (UploadFile): The file to split. @@ -398,14 +397,15 @@ async def task_split( Returns: The result of splitting the task into subtasks. - - """ + """ # read entire file await upload.seek(0) content = await upload.read() - result = await project_crud.split_into_tasks(db, content, no_of_buildings, has_data_extracts) + result = await project_crud.split_into_tasks( + db, content, no_of_buildings, has_data_extracts + ) return result @@ -573,13 +573,15 @@ async def generate_files( if config_file: config_file_name = os.path.splitext(config_file.filename) - config_file_ext = config_file_name[1] + config_file_ext = config_file_name[1] if not config_file_ext == ".yaml": - raise HTTPException(status_code=400, detail="Provide a valid .yaml config file") + raise HTTPException( + status_code=400, detail="Provide a valid .yaml config file" + ) await config_file.seek(0) config_file_contents = await config_file.read() project.form_config_file = config_file_contents - + db.commit() if data_extracts: @@ -689,8 +691,13 @@ async def generate_log( with open("/opt/logs/create_project.json", "r") as log_file: logs = [json.loads(line) for line in log_file] - - filtered_logs = [log.get("record",{}).get("message",None) for log in logs if log.get("record", {}).get("extra", {}).get("project_id") == project_id] + + filtered_logs = [ + log.get("record", {}).get("message", None) + for log in logs + if log.get("record", {}).get("extra", {}).get("project_id") + == project_id + ] last_50_logs = filtered_logs[-50:] logs = "\n".join(last_50_logs) @@ -754,7 +761,9 @@ async def preview_tasks(upload: UploadFile = File(...), dimension: int = Form(50 async def add_features( background_tasks: BackgroundTasks, upload: UploadFile = File(...), - feature_type: str = Query(..., description="Select feature type ", enum=["buildings","lines"]), + feature_type: str = Query( + ..., description="Select feature type ", enum=["buildings", "lines"] + ), db: Session = Depends(database.get_db), ): """Add features to a project. @@ -790,7 +799,7 @@ async def add_features( db, features, background_task_id, - feature_type + feature_type, ) return True @@ -915,19 +924,15 @@ async def download_task_boundaries( @router.get("/features/download/") -async def download_features( - project_id: int, - db: Session = Depends(database.get_db) -): +async def download_features(project_id: int, db: Session = Depends(database.get_db)): """Downloads the features of a project as a GeoJSON file. - - Args: - project_id (int): The id of the project. - - Returns: - Response: The HTTP response object containing the downloaded file. - """ + Args: + project_id (int): The id of the project. + + Returns: + Response: The HTTP response object containing the downloaded file. + """ out = await project_crud.get_project_features_geojson(db, project_id) headers = { @@ -1024,15 +1029,16 @@ async def download_task_boundary_osm( response = Response(content=content, media_type="application/xml") return response + from sqlalchemy.sql import text + @router.get("/centroid/") async def project_centroid( - project_id:int = None, - db: Session = Depends(database.get_db), - ): - """ - Get a centroid of each projects. + project_id: int = None, + db: Session = Depends(database.get_db), +): + """Get a centroid of each projects. Parameters: project_id (int): The ID of the project. @@ -1040,12 +1046,13 @@ async def project_centroid( Returns: List[Tuple[int, str]]: A list of tuples containing the task ID and the centroid as a string. """ - - query = text(f"""SELECT id, ARRAY_AGG(ARRAY[ST_X(ST_Centroid(outline)), ST_Y(ST_Centroid(outline))]) AS centroid + query = text( + f"""SELECT id, ARRAY_AGG(ARRAY[ST_X(ST_Centroid(outline)), ST_Y(ST_Centroid(outline))]) AS centroid FROM projects WHERE {f"id={project_id}" if project_id else "1=1"} - GROUP BY id;""") + GROUP BY id;""" + ) result = db.execute(query) result_dict_list = [{"id": row[0], "centroid": row[1]} for row in result.fetchall()] - return result_dict_list \ No newline at end of file + return result_dict_list diff --git a/src/backend/app/projects/project_schemas.py b/src/backend/app/projects/project_schemas.py index c71ce6cbda..f0732142d8 100644 --- a/src/backend/app/projects/project_schemas.py +++ b/src/backend/app/projects/project_schemas.py @@ -16,7 +16,7 @@ # along with FMTM. If not, see . # -from typing import List, Union, Optional +from typing import List, Optional, Union from geojson_pydantic import Feature as GeojsonFeature from pydantic import BaseModel @@ -95,6 +95,3 @@ class ProjectBase(BaseModel): class ProjectOut(ProjectBase): pass - - - diff --git a/src/backend/app/projects/utils.py b/src/backend/app/projects/utils.py index 54b24243e9..0070176678 100644 --- a/src/backend/app/projects/utils.py +++ b/src/backend/app/projects/utils.py @@ -9,12 +9,12 @@ HTTPException, UploadFile, ) -from loguru import logger as log from sqlalchemy.orm import Session from ..db import database from . import project_crud + async def generate_files( background_tasks: BackgroundTasks, project_id: int, @@ -52,11 +52,11 @@ async def generate_files( status_code=428, detail=f"Project with id {project_id} does not exist" ) - project.data_extract_type = 'polygon' if extract_polygon else 'centroid' + project.data_extract_type = "polygon" if extract_polygon else "centroid" db.commit() if upload: - file_ext = 'xls' + file_ext = "xls" contents = upload # generate a unique task ID using uuid @@ -75,8 +75,8 @@ async def generate_files( contents, None, xform_title, - file_ext if upload else 'xls', + file_ext if upload else "xls", background_task_id, ) - return {"Message": f"{project_id}", "task_id": f"{background_task_id}"} \ No newline at end of file + return {"Message": f"{project_id}", "task_id": f"{background_task_id}"} diff --git a/src/backend/app/submission/submission_crud.py b/src/backend/app/submission/submission_crud.py index baebf17927..b58201df8a 100644 --- a/src/backend/app/submission/submission_crud.py +++ b/src/backend/app/submission/submission_crud.py @@ -15,28 +15,25 @@ # You should have received a copy of the GNU General Public License # along with FMTM. If not, see . # -from loguru import logger as log - import asyncio -import os -import zipfile import concurrent.futures -import threading import csv import io +import json import os +import threading import zipfile -import json -from datetime import datetime +from pathlib import Path + from fastapi import HTTPException, Response from fastapi.responses import FileResponse +from loguru import logger as log +from osm_fieldwork.json2osm import JsonDump from sqlalchemy.orm import Session from ..central.central_crud import get_odk_form, get_odk_project -from ..tasks import tasks_crud from ..projects import project_crud, project_schemas -from osm_fieldwork.json2osm import JsonDump -from pathlib import Path +from ..tasks import tasks_crud def get_submission_of_project(db: Session, project_id: int, task_id: int = None): @@ -82,7 +79,6 @@ def get_submission_of_project(db: Session, project_id: int, task_id: int = None) data = [] for id in task_list: - # XML Form Id is a combination or project_name, category and task_id xml_form_id = f"{project_name}_{form_category}_{id}".split("_")[2] submission_list = xform.listSubmissions(odkid, xml_form_id) @@ -171,9 +167,7 @@ def create_zip_file(files, output_file_path): # return osmoutfile - async def convert_json_to_osm_xml(file_path): - # TODO refactor to simply use json2osm(file_path) jsonin = JsonDump() infile = Path(file_path) @@ -191,12 +185,12 @@ async def process_entry_async(entry): return None if len(feature) > 0: if "lat" not in feature["attrs"]: - if 'geometry' in feature['tags']: - if type(feature['tags']['geometry']) == str: - coords = list(feature['tags']['geometry']) + if "geometry" in feature["tags"]: + if type(feature["tags"]["geometry"]) == str: + coords = list(feature["tags"]["geometry"]) else: - coords = feature['tags']['geometry']['coordinates'] - feature['attrs'] = {'lat': coords[1], 'lon': coords[0]} + coords = feature["tags"]["geometry"]["coordinates"] + feature["attrs"] = {"lat": coords[1], "lon": coords[0]} else: log.warning("Bad record! %r" % feature) return None @@ -218,7 +212,6 @@ async def write_osm_async(features): async def convert_json_to_osm(file_path): - # TODO refactor to simply use json2osm(file_path) jsonin = JsonDump() infile = Path(file_path) @@ -240,14 +233,14 @@ async def convert_json_to_osm(file_path): continue if len(feature) > 0: if "lat" not in feature["attrs"]: - if 'geometry' in feature['tags']: - if type(feature['tags']['geometry']) == str: - coords = list(feature['tags']['geometry']) + if "geometry" in feature["tags"]: + if type(feature["tags"]["geometry"]) == str: + coords = list(feature["tags"]["geometry"]) # del feature['tags']['geometry'] else: - coords = feature['tags']['geometry']['coordinates'] + coords = feature["tags"]["geometry"]["coordinates"] # del feature['tags']['geometry'] - feature['attrs'] = {'lat': coords[1], 'lon': coords[0]} + feature["attrs"] = {"lat": coords[1], "lon": coords[0]} else: log.warning("Bad record! %r" % feature) continue @@ -262,7 +255,6 @@ async def convert_json_to_osm(file_path): async def convert_to_osm_for_task(odk_id: int, form_id: int, xform: any): - # This file stores the submission data. file_path = f"/tmp/{odk_id}_{form_id}.json" @@ -280,7 +272,6 @@ async def convert_to_osm_for_task(odk_id: int, form_id: int, xform: any): async def convert_to_osm(db: Session, project_id: int, task_id: int): - project_info = project_crud.get_project(db, project_id) # Return exception if project is not found @@ -311,7 +302,7 @@ async def convert_to_osm(db: Session, project_id: int, task_id: int): # Submission JSON if task_id: submission = xform.getSubmissions(odkid, task_id, None, False, True) - submission = (json.loads(submission))['value'] + submission = (json.loads(submission))["value"] else: submission = await get_all_submissions(db, project_id) @@ -322,29 +313,30 @@ async def convert_to_osm(db: Session, project_id: int, task_id: int): jsoninfile = "/tmp/json_infile.json" # Write the submission to a file - with open(jsoninfile, 'w') as f: + with open(jsoninfile, "w") as f: f.write(json.dumps(submission)) # Convert the submission to osm xml format osmoutfile, jsonoutfile = await convert_json_to_osm(jsoninfile) if osmoutfile and jsonoutfile: - - #FIXME: Need to fix this when generating osm file + # FIXME: Need to fix this when generating osm file # Remove the extra closing tag from the end of the file - with open(osmoutfile, 'r') as f: + with open(osmoutfile, "r") as f: osmoutfile_data = f.read() # Find the last index of the closing tag - last_osm_index = osmoutfile_data.rfind('') + last_osm_index = osmoutfile_data.rfind("") # Remove the extra closing tag from the end - processed_xml_string = osmoutfile_data[:last_osm_index] + osmoutfile_data[last_osm_index + len(''):] + processed_xml_string = ( + osmoutfile_data[:last_osm_index] + + osmoutfile_data[last_osm_index + len("") :] + ) # Write the modified XML data back to the file - with open(osmoutfile, 'w') as f: + with open(osmoutfile, "w") as f: f.write(processed_xml_string) - # Add the files to the ZIP file with zipfile.ZipFile(final_zip_file_path, mode="a") as final_zip_file: final_zip_file.write(osmoutfile) @@ -353,9 +345,8 @@ async def convert_to_osm(db: Session, project_id: int, task_id: int): return FileResponse(final_zip_file_path) - def download_submission_for_project(db, project_id): - print('Download submission for a project') + print("Download submission for a project") project_info = project_crud.get_project(db, project_id) @@ -379,7 +370,9 @@ def download_submission_for_project(db, project_id): xform = get_odk_form(odk_credentials) def download_submission_for_task(task_id): - log.info(f"Thread {threading.current_thread().name} - Downloading submission for Task ID {task_id}") + log.info( + f"Thread {threading.current_thread().name} - Downloading submission for Task ID {task_id}" + ) xml_form_id = f"{project_name}_{form_category}_{task_id}".split("_")[2] file = xform.getSubmissionMedia(odkid, xml_form_id) file_path = f"{project_name}_{form_category}_submission_{task_id}.zip" @@ -388,18 +381,22 @@ def download_submission_for_task(task_id): return file_path def extract_files(zip_file_path): - log.info(f"Thread {threading.current_thread().name} - Extracting files from {zip_file_path}") + log.info( + f"Thread {threading.current_thread().name} - Extracting files from {zip_file_path}" + ) with zipfile.ZipFile(zip_file_path, "r") as zip_file: extract_dir = os.path.splitext(zip_file_path)[0] zip_file.extractall(extract_dir) return [os.path.join(extract_dir, f) for f in zip_file.namelist()] - with concurrent.futures.ThreadPoolExecutor() as executor: task_list = [x.id for x in project_tasks] # Download submissions using thread pool - futures = {executor.submit(download_submission_for_task, task_id): task_id for task_id in task_list} + futures = { + executor.submit(download_submission_for_task, task_id): task_id + for task_id in task_list + } files = [] for future in concurrent.futures.as_completed(futures): @@ -407,20 +404,30 @@ def extract_files(zip_file_path): try: file_path = future.result() files.append(file_path) - log.info(f"Thread {threading.current_thread().name} - Task {task_id} - Download completed.") + log.info( + f"Thread {threading.current_thread().name} - Task {task_id} - Download completed." + ) except Exception as e: - log.error(f"Thread {threading.current_thread().name} - Error occurred while downloading submission for task {task_id}: {e}") + log.error( + f"Thread {threading.current_thread().name} - Error occurred while downloading submission for task {task_id}: {e}" + ) # Extract files using thread pool extracted_files = [] - futures = {executor.submit(extract_files, file_path): file_path for file_path in files} + futures = { + executor.submit(extract_files, file_path): file_path for file_path in files + } for future in concurrent.futures.as_completed(futures): file_path = futures[future] try: extracted_files.extend(future.result()) - log.info(f"Thread {threading.current_thread().name} - Extracted files from {file_path}") + log.info( + f"Thread {threading.current_thread().name} - Extracted files from {file_path}" + ) except Exception as e: - log.error(f"Thread {threading.current_thread().name} - Error occurred while extracting files from {file_path}: {e}") + log.error( + f"Thread {threading.current_thread().name} - Error occurred while extracting files from {file_path}: {e}" + ) # Create a new ZIP file for the extracted files final_zip_file_path = f"{project_name}_{form_category}_submissions_final.zip" @@ -474,15 +481,13 @@ def get_project_submission(db: Session, project_id: int): task_list = [x.id for x in project_tasks] for id in task_list: - xml_form_id = f"{project_name}_{form_category}_{id}".split("_")[ - 2] - file = xform.getSubmissions( - odkid, xml_form_id, None, False, True) + xml_form_id = f"{project_name}_{form_category}_{id}".split("_")[2] + file = xform.getSubmissions(odkid, xml_form_id, None, False, True) if not file: json_data = None else: json_data = json.loads(file) - json_data_value = json_data.get('value') + json_data_value = json_data.get("value") if json_data_value: submissions.extend(json_data_value) @@ -490,7 +495,6 @@ def get_project_submission(db: Session, project_id: int): def download_submission(db: Session, project_id: int, task_id: int, export_json: bool): - project_info = project_crud.get_project(db, project_id) # Return empty list if project is not found @@ -524,11 +528,9 @@ def download_submission(db: Session, project_id: int, task_id: int, export_json: files = [] for id in task_list: - # XML Form Id is a combination or project_name, category and task_id # FIXME: fix xml_form_id - xml_form_id = f"{project_name}_{form_category}_{id}".split("_")[ - 2] + xml_form_id = f"{project_name}_{form_category}_{id}".split("_")[2] file = xform.getSubmissionMedia(odkid, xml_form_id) # Create a new output file for each submission @@ -552,15 +554,16 @@ def download_submission(db: Session, project_id: int, task_id: int, export_json: ] # Add the extracted file paths to the list of extracted files # Create a new ZIP file for the extracted files - final_zip_file_path = f"{project_name}_{form_category}_submissions_final.zip" + final_zip_file_path = ( + f"{project_name}_{form_category}_submissions_final.zip" + ) with zipfile.ZipFile(final_zip_file_path, mode="w") as final_zip_file: for file_path in extracted_files: final_zip_file.write(file_path) return FileResponse(final_zip_file_path) else: - xml_form_id = f"{project_name}_{form_category}_{task_id}".split("_")[ - 2] + xml_form_id = f"{project_name}_{form_category}_{task_id}".split("_")[2] file = xform.getSubmissionMedia(odkid, xml_form_id) with open(file_path, "wb") as f: f.write(file.content) @@ -576,25 +579,23 @@ def download_submission(db: Session, project_id: int, task_id: int, export_json: if task_id is None: task_list = [x.id for x in project_tasks] for id in task_list: - xml_form_id = f"{project_name}_{form_category}_{id}".split("_")[ - 2] - file = xform.getSubmissions( - odkid, xml_form_id, None, False, True) + xml_form_id = f"{project_name}_{form_category}_{id}".split("_")[2] + file = xform.getSubmissions(odkid, xml_form_id, None, False, True) if not file: json_data = None else: json_data = json.loads(file) - json_data_value = json_data.get('value') + json_data_value = json_data.get("value") if json_data_value: files.extend(json_data_value) else: - xml_form_id = f"{project_name}_{form_category}_{task_id}".split("_")[ - 2] + xml_form_id = f"{project_name}_{form_category}_{task_id}".split("_")[2] file = xform.getSubmissions(odkid, xml_form_id, None, False, True) json_data = json.loads(file) response_content = json.dumps( - files if task_id is None else json_data, indent=4).encode() + files if task_id is None else json_data, indent=4 + ).encode() return Response(content=response_content, headers=headers) @@ -637,8 +638,7 @@ def get_submission_points(db: Session, project_id: int, task_id: int = None): # Open the zipfile with zipfile.ZipFile(response_file_obj, "r") as zip_ref: # Find the CSV file in the zipfile (assuming it has a .csv extension) - csv_filename = [ - f for f in zip_ref.namelist() if f.endswith(".csv")][0] + csv_filename = [f for f in zip_ref.namelist() if f.endswith(".csv")][0] # Open the CSV file with zip_ref.open(csv_filename) as csv_file: # Read the CSV data @@ -648,8 +648,7 @@ def get_submission_points(db: Session, project_id: int, task_id: int = None): # Check if the row contains the 'warmup-Latitude' and 'warmup-Longitude' columns # FIXME: fix the column names (they might not be same warmup-Latitude and warmup-Longitude) if "warmup-Latitude" in row and "warmup-Longitude" in row: - point = (row["warmup-Latitude"], - row["warmup-Longitude"]) + point = (row["warmup-Latitude"], row["warmup-Longitude"]) # Create a GeoJSON Feature object geometry.append( @@ -667,9 +666,7 @@ def get_submission_points(db: Session, project_id: int, task_id: int = None): return None -async def get_submission_count_of_a_project(db:Session, - project_id: int): - +async def get_submission_count_of_a_project(db: Session, project_id: int): project_info = project_crud.get_project(db, project_id) # Return empty list if project is not found @@ -695,16 +692,14 @@ async def get_submission_count_of_a_project(db:Session, task_list = [x.id for x in project_tasks] for id in task_list: - xml_form_id = f"{project_name}_{form_category}_{id}".split("_")[ - 2] - file = xform.getSubmissions( - odkid, xml_form_id, None, False, True) + xml_form_id = f"{project_name}_{form_category}_{id}".split("_")[2] + file = xform.getSubmissions(odkid, xml_form_id, None, False, True) if not file: json_data = None else: json_data = json.loads(file) - json_data_value = json_data.get('value') + json_data_value = json_data.get("value") if json_data_value: files.extend(json_data_value) - return len(files) \ No newline at end of file + return len(files) diff --git a/src/backend/app/submission/submission_routes.py b/src/backend/app/submission/submission_routes.py index c6ba45b164..4162e9dce3 100644 --- a/src/backend/app/submission/submission_routes.py +++ b/src/backend/app/submission/submission_routes.py @@ -15,17 +15,17 @@ # You should have received a copy of the GNU General Public License # along with FMTM. If not, see . # -import os import json -from fastapi import APIRouter, Depends, HTTPException, Response -from ..projects import project_crud, project_schemas -from loguru import logger as log -from sqlalchemy.orm import Session +import os + +from fastapi import APIRouter, Depends, Response from fastapi.responses import FileResponse from osm_fieldwork.odk_merge import OdkMerge from osm_fieldwork.osmfile import OsmFile -from ..projects import project_crud +from sqlalchemy.orm import Session + from ..db import database +from ..projects import project_crud from . import submission_crud router = APIRouter( @@ -130,17 +130,14 @@ async def convert_to_osm( task_id: int = None, db: Session = Depends(database.get_db), ): + """This api converts the submission to osm format. + It takes two parameter: project_id and task_id. - """ - This api converts the submission to osm format. - It takes two parameter: project_id and task_id. - - task_id is optional. - If task_id is provided, this endpoint converts the submission of this task. - If task_id is not provided, this endpoint converts the submission of the whole project. + task_id is optional. + If task_id is provided, this endpoint converts the submission of this task. + If task_id is not provided, this endpoint converts the submission of the whole project. """ - return await submission_crud.convert_to_osm(db, project_id, task_id) @@ -148,7 +145,7 @@ async def convert_to_osm( async def get_submission_count( project_id: int, db: Session = Depends(database.get_db), - ): +): return await submission_crud.get_submission_count_of_a_project(db, project_id) @@ -156,8 +153,7 @@ async def get_submission_count( async def conflate_osm_date( project_id: int, db: Session = Depends(database.get_db), - ): - +): # Submission JSON submission = submission_crud.get_all_submissions(db, project_id) @@ -178,28 +174,31 @@ async def conflate_osm_date( os.remove(jsoninfile) # Write the submission to a file - with open(jsoninfile, 'w') as f: + with open(jsoninfile, "w") as f: f.write(json.dumps(submission)) # Convert the submission to osm xml format osmoutfile, jsonoutfile = await submission_crud.convert_json_to_osm(jsoninfile) # Remove the extra closing tag from the end of the file - with open(osmoutfile, 'r') as f: + with open(osmoutfile, "r") as f: osmoutfile_data = f.read() # Find the last index of the closing tag - last_osm_index = osmoutfile_data.rfind('') + last_osm_index = osmoutfile_data.rfind("") # Remove the extra closing tag from the end - processed_xml_string = osmoutfile_data[:last_osm_index] + osmoutfile_data[last_osm_index + len(''):] - + processed_xml_string = ( + osmoutfile_data[:last_osm_index] + + osmoutfile_data[last_osm_index + len("") :] + ) + # Write the modified XML data back to the file - with open(osmoutfile, 'w') as f: + with open(osmoutfile, "w") as f: f.write(processed_xml_string) odkf = OsmFile(outfile) osm = odkf.loadFile(osmoutfile) if osm: - odk_merge = OdkMerge(data_extracts_file,None) + odk_merge = OdkMerge(data_extracts_file, None) data = odk_merge.conflateData(osm) return data return [] @@ -209,7 +208,7 @@ async def conflate_osm_date( async def get_osm_xml( project_id: int, db: Session = Depends(database.get_db), - ): +): # JSON FILE PATH jsoninfile = f"/tmp/{project_id}_json_infile.json" @@ -221,24 +220,27 @@ async def get_osm_xml( submission = await submission_crud.get_all_submissions(db, project_id) # Write the submission to a file - with open(jsoninfile, 'w') as f: + with open(jsoninfile, "w") as f: f.write(json.dumps(submission)) # Convert the submission to osm xml format osmoutfile = await submission_crud.convert_json_to_osm_xml(jsoninfile) # Remove the extra closing tag from the end of the file - with open(osmoutfile, 'r') as f: + with open(osmoutfile, "r") as f: osmoutfile_data = f.read() # Find the last index of the closing tag - last_osm_index = osmoutfile_data.rfind('') + last_osm_index = osmoutfile_data.rfind("") # Remove the extra closing tag from the end - processed_xml_string = osmoutfile_data[:last_osm_index] + osmoutfile_data[last_osm_index + len(''):] + processed_xml_string = ( + osmoutfile_data[:last_osm_index] + + osmoutfile_data[last_osm_index + len("") :] + ) # Write the modified XML data back to the file - with open(osmoutfile, 'w') as f: + with open(osmoutfile, "w") as f: f.write(processed_xml_string) # Create a plain XML response response = Response(content=processed_xml_string, media_type="application/xml") - return response \ No newline at end of file + return response diff --git a/src/backend/app/tasks/tasks_crud.py b/src/backend/app/tasks/tasks_crud.py index 5aaea42be7..9e3d369048 100644 --- a/src/backend/app/tasks/tasks_crud.py +++ b/src/backend/app/tasks/tasks_crud.py @@ -15,20 +15,21 @@ # You should have received a copy of the GNU General Public License # along with FMTM. If not, see . # -from loguru import logger as log - import base64 from typing import List from fastapi import HTTPException from geoalchemy2.shape import from_shape from geojson import dump +from loguru import logger as log from osm_fieldwork.make_data_extract import PostgresClient from shapely.geometry import shape from sqlalchemy import column, select, table from sqlalchemy.orm import Session from sqlalchemy.sql import text +from app.config import settings + from ..central import central_crud from ..db import db_models from ..db.postgis_utils import geometry_to_geojson, get_centroid @@ -40,7 +41,6 @@ from ..projects import project_crud from ..tasks import tasks_schemas from ..users import user_crud -from app.config import settings async def get_task_count_in_project(db: Session, project_id: int): @@ -51,11 +51,13 @@ async def get_task_count_in_project(db: Session, project_id: int): def get_task_lists(db: Session, project_id: int): """Get a list of tasks for a project.""" - query = text(""" + query = text( + """ SELECT id FROM tasks WHERE project_id = :project_id - """) + """ + ) # Then execute the query with the desired parameter result = db.execute(query, {"project_id": project_id}) @@ -109,10 +111,11 @@ def update_task_status(db: Session, user_id: int, task_id: int, new_status: Task db_task = get_task(db, task_id, db_obj=True) if db_task: - if db_task.task_status in [TaskStatus.LOCKED_FOR_MAPPING, TaskStatus.LOCKED_FOR_VALIDATION]: - if not ( - user_id is not db_task.locked_by - ): + if db_task.task_status in [ + TaskStatus.LOCKED_FOR_MAPPING, + TaskStatus.LOCKED_FOR_VALIDATION, + ]: + if not (user_id is not db_task.locked_by): raise HTTPException( status_code=401, detail=f"User {user_id} with username {db_user.username} has not locked this task.", @@ -262,9 +265,7 @@ def convert_to_app_task(db_task: db_models.DbTask): log.debug("Task currently locked by user " f"{app_task.locked_by_username}") if db_task.qr_code: - log.debug( - f"QR code found for task ID {db_task.id}. Converting to base64" - ) + log.debug(f"QR code found for task ID {db_task.id}. Converting to base64") app_task.qr_code_base64 = base64.b64encode(db_task.qr_code.image) else: log.warning(f"No QR code found for task ID {db_task.id}") diff --git a/src/backend/app/tasks/tasks_routes.py b/src/backend/app/tasks/tasks_routes.py index ee1a9dd20e..b0df3fdf0c 100644 --- a/src/backend/app/tasks/tasks_routes.py +++ b/src/backend/app/tasks/tasks_routes.py @@ -17,20 +17,18 @@ # import json -import asyncio from typing import List -from fastapi import APIRouter, Depends, HTTPException, UploadFile, File +from fastapi import APIRouter, Depends, File, HTTPException, UploadFile from sqlalchemy.orm import Session +from sqlalchemy.sql import text +from ..central import central_crud from ..db import database from ..models.enums import TaskStatus +from ..projects import project_crud, project_schemas from ..users import user_schemas from . import tasks_crud, tasks_schemas -from ..projects import project_crud, project_schemas -from ..central import central_crud -from sqlalchemy.sql import text - router = APIRouter( prefix="/tasks", @@ -45,13 +43,13 @@ async def read_task_list( project_id: int, limit: int = 1000, db: Session = Depends(database.get_db), - ): +): tasks = tasks_crud.get_tasks(db, project_id, limit) if tasks: return tasks else: raise HTTPException(status_code=404, detail="Tasks not found") - + @router.get("/", response_model=List[tasks_schemas.TaskOut]) async def read_tasks( @@ -75,13 +73,8 @@ async def read_tasks( @router.get("/point_on_surface") -async def get_point_on_surface( - project_id:int, - db: Session = Depends(database.get_db) - ): - - """ - Get a point on the surface of the geometry for each task of the project. +async def get_point_on_surface(project_id: int, db: Session = Depends(database.get_db)): + """Get a point on the surface of the geometry for each task of the project. Parameters: project_id (int): The ID of the project. @@ -89,12 +82,13 @@ async def get_point_on_surface( Returns: List[Tuple[int, str]]: A list of tuples containing the task ID and the centroid as a string. """ - - query = text(f""" + query = text( + f""" SELECT id, ARRAY_AGG(ARRAY[ST_X(ST_PointOnSurface(outline)), ST_Y(ST_PointOnSurface(outline))]) AS point FROM tasks WHERE project_id = {project_id} - GROUP BY id; """) + GROUP BY id; """ + ) result = db.execute(query) result_dict_list = [{"id": row[0], "point": row[1]} for row in result.fetchall()] @@ -148,13 +142,12 @@ async def edit_task_boundary( task_id: int, boundary: UploadFile = File(...), db: Session = Depends(database.get_db), - ): - +): # read entire file content = await boundary.read() boundary_json = json.loads(content) - edit_boundary = await tasks_crud.edit_task_boundary(db, task_id, boundary_json) + edit_boundary = await tasks_crud.edit_task_boundary(db, task_id, boundary_json) return edit_boundary @@ -163,34 +156,37 @@ async def edit_task_boundary( async def task_features_count( project_id: int, db: Session = Depends(database.get_db), - ): - +): # Get the project object. project = project_crud.get_project(db, project_id) # ODK Credentials odk_credentials = project_schemas.ODKCentral( - odk_central_url = project.odk_central_url, - odk_central_user = project.odk_central_user, - odk_central_password = project.odk_central_password, - ) + odk_central_url=project.odk_central_url, + odk_central_user=project.odk_central_user, + odk_central_password=project.odk_central_password, + ) odk_details = central_crud.list_odk_xforms(project.odkid, odk_credentials, True) # Assemble the final data list data = [] for x in odk_details: - feature_count_query = text(f""" + feature_count_query = text( + f""" select count(*) from features where project_id = {project_id} and task_id = {x['xmlFormId']} - """) + """ + ) result = db.execute(feature_count_query) feature_count = result.fetchone() - data.append({ - 'task_id': x['xmlFormId'], - 'submission_count': x['submissions'], - 'last_submission': x['lastSubmission'], - 'feature_count': feature_count[0] - }) + data.append( + { + "task_id": x["xmlFormId"], + "submission_count": x["submissions"], + "last_submission": x["lastSubmission"], + "feature_count": feature_count[0], + } + ) - return data \ No newline at end of file + return data diff --git a/src/frontend/.babelrc b/src/frontend/.babelrc index 88e14d6a9c..934c0ae8e9 100755 --- a/src/frontend/.babelrc +++ b/src/frontend/.babelrc @@ -1,6 +1,41 @@ { - "presets": ["@babel/preset-typescript", "@babel/preset-react", "@babel/preset-env"], + "presets": [ + [ + "@babel/preset-env", + { + "useBuiltIns": "entry", + "corejs": "3.22" + } + ], + "@babel/preset-typescript", + "@babel/preset-react" + ], "plugins": [ - ["@babel/transform-runtime"] + ["@babel/transform-runtime"], + [ + "import", + { "libraryName": "@mui/material", "libraryDirectory": "", "camel2DashComponentName": false }, + "@mui/material" + ], + [ + "import", + { "libraryName": "@mui/icons-material", "libraryDirectory": "", "camel2DashComponentName": false }, + "@mui/icons-material" + ], + [ + "import", + { "libraryName": "@mui/material/colors", "libraryDirectory": "", "camel2DashComponentName": false }, + "@mui/material/colors" + ] + // [ + // "import", + // { "libraryName": "react-redux", "libraryDirectory": "", "camel2DashComponentName": false }, + // "react-redux" + // ], + // [ + // "import", + // { "libraryName": "swiper", "libraryDirectory": "", "camel2DashComponentName": false }, + // "swiper" + // ] ] } diff --git a/src/frontend/main/.eslintrc.cjs b/src/frontend/.eslintrc.cjs similarity index 100% rename from src/frontend/main/.eslintrc.cjs rename to src/frontend/.eslintrc.cjs diff --git a/src/frontend/.gitignore b/src/frontend/.gitignore index 0a83710767..c5023be94b 100755 --- a/src/frontend/.gitignore +++ b/src/frontend/.gitignore @@ -72,6 +72,7 @@ web_modules/ # dotenv environment variables file .env .env.test +.env.dev # parcel-bundler cache (https://parceljs.org/) .cache diff --git a/src/frontend/.prettierrc b/src/frontend/.prettierrc new file mode 100755 index 0000000000..d4a0fc192a --- /dev/null +++ b/src/frontend/.prettierrc @@ -0,0 +1,7 @@ +{ + "semi": true, + "trailingComma": "all", + "singleQuote": true, + "printWidth": 120, + "endOfLine": "auto" +} diff --git a/src/frontend/debug.dockerfile b/src/frontend/debug.dockerfile index 0c25ddc9ff..df94e8c22a 100755 --- a/src/frontend/debug.dockerfile +++ b/src/frontend/debug.dockerfile @@ -4,7 +4,7 @@ ENV API_URL="${API_URL}" ARG FRONTEND_MAIN_URL ENV FRONTEND_MAIN_URL="${FRONTEND_MAIN_URL}" WORKDIR /app -COPY main/package*.json ./ +COPY ./package*.json ./ RUN npm install ENV NODE_ENV development ENTRYPOINT ["npm", "run", "start:live"] diff --git a/src/frontend/main/.babelrc b/src/frontend/main/.babelrc deleted file mode 100755 index 934c0ae8e9..0000000000 --- a/src/frontend/main/.babelrc +++ /dev/null @@ -1,41 +0,0 @@ -{ - "presets": [ - [ - "@babel/preset-env", - { - "useBuiltIns": "entry", - "corejs": "3.22" - } - ], - "@babel/preset-typescript", - "@babel/preset-react" - ], - "plugins": [ - ["@babel/transform-runtime"], - [ - "import", - { "libraryName": "@mui/material", "libraryDirectory": "", "camel2DashComponentName": false }, - "@mui/material" - ], - [ - "import", - { "libraryName": "@mui/icons-material", "libraryDirectory": "", "camel2DashComponentName": false }, - "@mui/icons-material" - ], - [ - "import", - { "libraryName": "@mui/material/colors", "libraryDirectory": "", "camel2DashComponentName": false }, - "@mui/material/colors" - ] - // [ - // "import", - // { "libraryName": "react-redux", "libraryDirectory": "", "camel2DashComponentName": false }, - // "react-redux" - // ], - // [ - // "import", - // { "libraryName": "swiper", "libraryDirectory": "", "camel2DashComponentName": false }, - // "swiper" - // ] - ] -} diff --git a/src/frontend/main/.dockerignore b/src/frontend/main/.dockerignore deleted file mode 100755 index 91f29054c7..0000000000 --- a/src/frontend/main/.dockerignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules -dist -.gitignore diff --git a/src/frontend/main/.gitignore b/src/frontend/main/.gitignore deleted file mode 100755 index c5023be94b..0000000000 --- a/src/frontend/main/.gitignore +++ /dev/null @@ -1,122 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ -npm-debug.log -yarn-error.log -# Snowpack dependency directory (https://snowpack.dev/) -web_modules/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env -.env.test -.env.dev - -# parcel-bundler cache (https://parceljs.org/) -.cache -.parcel-cache - -# Next.js build output -.next -out - -# Nuxt.js build / generate output -.nuxt -dist - -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and not Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# TernJS port file -.tern-port - -# Stores VSCode versions used for testing VSCode extensions -.vscode-test - -# yarn v2 -.yarn/cache -.yarn/unplugged -.yarn/build-state.yml -.yarn/install-state.gz -.pnp.* - -#extra - - diff --git a/src/frontend/main/.prettierrc b/src/frontend/main/.prettierrc deleted file mode 100755 index 5d33d3bae7..0000000000 --- a/src/frontend/main/.prettierrc +++ /dev/null @@ -1,7 +0,0 @@ -{ - "semi": true, - "trailingComma": "all", - "singleQuote": true, - "printWidth": 120, - "endOfLine": "auto" -} \ No newline at end of file diff --git a/src/frontend/main/public/manifest.json b/src/frontend/main/public/manifest.json deleted file mode 100644 index e2bf572d18..0000000000 --- a/src/frontend/main/public/manifest.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "Field Mapping Tasking Manager", - "short_name": "FMTM", - "start_url": ".", - "display": "fullscreen", - "background_color": "#fff", - "description": "A project to provide tools for Open Mapping campaigns.", - "icons": [ - { - "src": "/icon-192x192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "/icon-256x256.png", - "sizes": "256x256", - "type": "image/png" - }, - { - "src": "/icon-384x384.png", - "sizes": "384x384", - "type": "image/png" - }, - { - "src": "/icon-512x512.png", - "sizes": "512x512", - "type": "image/png" - } - ] -} diff --git a/src/frontend/main/src/api/OrganizationService.ts b/src/frontend/main/src/api/OrganizationService.ts deleted file mode 100644 index a62f1da5d1..0000000000 --- a/src/frontend/main/src/api/OrganizationService.ts +++ /dev/null @@ -1,111 +0,0 @@ -import axios from 'axios'; -import { HomeProjectCardModel } from '../models/home/homeModel'; -import { GetOrganizationDataModel, OrganizationModal } from '../models/organization/organizationModel'; -import { CommonActions } from '../store/slices/CommonSlice'; -import { OrganizationAction } from '../store/slices/organizationSlice'; - - -function appendObjectToFormData(formData, object) { - for (const [key, value] of Object.entries(object)) { - // if (key === 'logo') { - // formData.append(key, value[0]) - // } - formData.append(key, value); - } -} - -export const OrganizationService: Function = (url: string, payload: OrganizationModal) => { - - return async (dispatch) => { - dispatch(CommonActions.PostOrganizationLoading(true)) - - const postOrganization = async (url, payload) => { - - try { - const generateApiFormData = new FormData(); - appendObjectToFormData(generateApiFormData, payload); - await axios.post(url, generateApiFormData, - { - headers: { - "Content-Type": "multipart/form-data", - } - }); - // const resp: HomeProjectCardModel = postOrganizationData.data; - // dispatch(CommonActions.SetOrganizationDetail(resp)) - dispatch(CommonActions.PostOrganizationLoading(false)) - } catch (error) { - dispatch(CommonActions.PostOrganizationLoading(false)) - } - } - - await postOrganization(url, payload); - - } - -} - -export const OrganizationDataService: Function = (url: string) => { - return async (dispatch) => { - dispatch(OrganizationAction.GetOrganizationDataLoading(true)) - const getOrganizationData = async (url) => { - try { - const getOrganizationDataResponse = await axios.get(url); - const response: GetOrganizationDataModel = getOrganizationDataResponse.data; - dispatch(OrganizationAction.GetOrganizationsData(response)) - } catch (error) { - dispatch(OrganizationAction.GetOrganizationDataLoading(false)) - } - } - await getOrganizationData(url); - } -} - -export const PostOrganizationDataService:Function = (url: string, payload: any) => { - return async (dispatch) => { - dispatch(OrganizationAction.PostOrganizationDataLoading(true)); - - const postOrganizationData = async (url, payload) => { - dispatch(OrganizationAction.SetOrganizationFormData(payload)) - - try { - const generateApiFormData = new FormData(); - appendObjectToFormData(generateApiFormData, payload); - - const postOrganizationData = await axios.post( - url, - payload, - { - headers: { - 'Content-Type': 'multipart/form-data', - }, - } - ); - - const resp: HomeProjectCardModel = postOrganizationData.data; - dispatch(OrganizationAction.PostOrganizationDataLoading(false)) - dispatch(OrganizationAction.postOrganizationData(resp)) - dispatch( - CommonActions.SetSnackBar({ - open: true, - message: 'Organization Successfully Created.', - variant: "success", - duration: 2000, - }) - ); - } catch (error:any) { - dispatch( - CommonActions.SetSnackBar({ - open: true, - message: error.response.data.detail, - variant: "error", - duration: 2000, - }) - ); - dispatch(OrganizationAction.PostOrganizationDataLoading(false)) - - } - }; - - await postOrganizationData(url, payload); - }; -}; \ No newline at end of file diff --git a/src/frontend/main/src/components/MapComponent/OpenLayersComponent/map.scss b/src/frontend/main/src/components/MapComponent/OpenLayersComponent/map.scss deleted file mode 100644 index 4e6b38ebf0..0000000000 --- a/src/frontend/main/src/components/MapComponent/OpenLayersComponent/map.scss +++ /dev/null @@ -1,16 +0,0 @@ - -@keyframes blink { - 0% { - opacity: 1; - } - 50% { - opacity: 0; - } - 100% { - opacity: 1; - } - } - -.blink { - animation: blink 1s infinite; -} \ No newline at end of file diff --git a/src/frontend/main/src/components/MapLegends.jsx b/src/frontend/main/src/components/MapLegends.jsx deleted file mode 100755 index f269ff2fd6..0000000000 --- a/src/frontend/main/src/components/MapLegends.jsx +++ /dev/null @@ -1,68 +0,0 @@ -import React from "react"; -import CoreModules from 'fmtm/CoreModules'; -import AssetModules from 'fmtm/AssetModules'; - -const MapLegends = ({ direction, spacing, iconBtnProps, defaultTheme, valueStatus }) => { - - const MapDetails = [ - { - value: 'Ready', - color: defaultTheme.palette.mapFeatureColors.ready, - status: 'none' - }, - { - value: 'Locked For Mapping', - color: defaultTheme.palette.mapFeatureColors.locked_for_mapping, - status: 'lock' - }, - { - value: 'Locked For Validation', - color: defaultTheme.palette.mapFeatureColors.locked_for_validation, - status: 'lock' - }, - { - value: 'Ready For Validation', - color: defaultTheme.palette.mapFeatureColors.mapped, - status: 'none' - }, - { - value: 'Validated', - color: defaultTheme.palette.mapFeatureColors.validated, - status: 'none' - }, - { - value: 'Bad', - color: defaultTheme.palette.mapFeatureColors.bad, - status: 'none' - }, - { - value: 'More mapping needed', - color: defaultTheme.palette.mapFeatureColors.invalidated, - status: 'none' - } - ] - return ( - - { - MapDetails.map((data, index) => { - return ( - - - - - { - valueStatus && - - {data.value} - - - } - - ) - }) - } - - ) -} - -export default MapLegends; diff --git a/src/frontend/main/src/components/createproject/validation/DefineTaskValidation.tsx b/src/frontend/main/src/components/createproject/validation/DefineTaskValidation.tsx deleted file mode 100644 index 23ec348748..0000000000 --- a/src/frontend/main/src/components/createproject/validation/DefineTaskValidation.tsx +++ /dev/null @@ -1,30 +0,0 @@ - -interface ProjectValues { - splitting_algorithm: string; - dimension: number; -} -interface ValidationErrors { - splitting_algorithm?: string; - dimension?: string; -} - -function DefineTaskValidation(values: ProjectValues) { - const errors: ValidationErrors = {}; - - if (!values?.splitting_algorithm) { - errors.splitting_algorithm = 'Splitting Algorithm is Required.'; - } - if (values?.splitting_algorithm === 'Divide on Square' && !values?.dimension) { - errors.dimension = 'Dimension is Required.'; - } - if (values?.splitting_algorithm === 'Divide on Square' && values?.dimension && values.dimension < 9) { - errors.dimension = 'Dimension should be greater than 10 or equal to 10.'; - } - - - - console.log(errors); - return errors; -} - -export default DefineTaskValidation; diff --git a/src/frontend/main/src/components/home/ProjectCardSkeleton.tsx b/src/frontend/main/src/components/home/ProjectCardSkeleton.tsx deleted file mode 100755 index 19ecb1c7ed..0000000000 --- a/src/frontend/main/src/components/home/ProjectCardSkeleton.tsx +++ /dev/null @@ -1,72 +0,0 @@ -import React from "react"; -import CoreModules from '../../shared/CoreModules'; -// Skeleton card main purpose is to perfom loading in case of any delay in retrieving project -const ProjectCardSkeleton = ({ cardsPerRow, defaultTheme }) => { - - return ( - - cardsPerRow.map((data, index) => { - return ( -
- -
-
- - - - - -
-
- - - -
-
- -
-
- - - -
-
- - - - - - -
-
- - - -
-
-
- - ) - }) - ) -} -export default ProjectCardSkeleton; diff --git a/src/frontend/main/src/constants/EditProjectSidebarContent.ts b/src/frontend/main/src/constants/EditProjectSidebarContent.ts deleted file mode 100644 index 993fd036a9..0000000000 --- a/src/frontend/main/src/constants/EditProjectSidebarContent.ts +++ /dev/null @@ -1,27 +0,0 @@ -interface ISidebarContent { - id: number; - name: string; - slug: string; - type?: string; -} - - -const SidebarContent: ISidebarContent[] = [ - { - id: 1, - name: 'Project Description', - slug: 'project-description' - }, - { - id: 2, - name: 'Form Update', - slug: 'form-update' - }, - { - id: 3, - name: 'Update Project Boundary', - slug: 'update-project-boundary' - }, -] - -export default SidebarContent \ No newline at end of file diff --git a/src/frontend/main/src/hooks/OnScroll.tsx b/src/frontend/main/src/hooks/OnScroll.tsx deleted file mode 100755 index 32c9296c7e..0000000000 --- a/src/frontend/main/src/hooks/OnScroll.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import React, { useEffect, useState } from "react"; - -export default function OnScroll(element, dep) { - - const [scrollTop, setScrollTop] = useState(0); - useEffect(() => { - const doc = document.getElementsByClassName('mainview')[0] - - const handleScroll = (event) => { - if (element != undefined) { - setScrollTop(element.getTargetElement().getBoundingClientRect().y) - } - }; - - doc.addEventListener('scroll', handleScroll); - window.addEventListener('resize', handleScroll) - - return () => { - doc.removeEventListener('scroll', handleScroll); - window.removeEventListener('resize', handleScroll) - - }; - }, [element, dep]); - - - return { y: scrollTop } -} diff --git a/src/frontend/main/src/hooks/WindowDimension.tsx b/src/frontend/main/src/hooks/WindowDimension.tsx deleted file mode 100755 index f6b54f789d..0000000000 --- a/src/frontend/main/src/hooks/WindowDimension.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import React, { useEffect, useState } from "react"; -// Extra small.col - < 576px Mobile Display -// Small.col - sm - ≥576px Mobile Display -// Medium.col - md - ≥768px Tablet Display -// Large.col - lg - ≥992px Desktop Display -// Extra large.col - xl - ≥1200px Desktop Display -function calculateWidthType(width) { - if (width >= 1700) { - return 'xl' - } - else if (width >= 1332) { - return 'lg' - } - else if (width >= 1200) { - return 'md' - } else if (width >= 855) { - return 'sm' - } else if (width >= 632) { - return 's' - } else if (width < 632) { - return 'xs' - } -} - -const windowDimention = () => { - - const [windowSize, setWindowSize] = useState({ - width: 0, - height: 0 - }) - - useEffect(() => { - - const handleResize = () => { - setWindowSize({ - width: window.innerWidth, - height: window.innerHeight - }) - } - - handleResize(); - window.addEventListener('resize', handleResize) - - const cleanUp = () => { - window.removeEventListener('resize', handleResize) - } - - return cleanUp; - }, []) - - return { windowSize, type: calculateWidthType(windowSize.width) }; - - - - -} - - -export default windowDimention; diff --git a/src/frontend/main/src/index.html b/src/frontend/main/src/index.html deleted file mode 100755 index 4134e0afc6..0000000000 --- a/src/frontend/main/src/index.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - Field Mapping Tasking Manager - - - -
- - - diff --git a/src/frontend/main/src/index.ts b/src/frontend/main/src/index.ts deleted file mode 100755 index c7ffe8613a..0000000000 --- a/src/frontend/main/src/index.ts +++ /dev/null @@ -1,2 +0,0 @@ - -import("./App"); diff --git a/src/frontend/main/src/models/createproject/createProjectModel.ts b/src/frontend/main/src/models/createproject/createProjectModel.ts deleted file mode 100755 index 3e4dbad39e..0000000000 --- a/src/frontend/main/src/models/createproject/createProjectModel.ts +++ /dev/null @@ -1,82 +0,0 @@ - -export interface ProjectDetailsModel { - id: number; - odkid: number; - author: { - username: string; - id: number; - }; - default_locale: string; - project_info: { - locale: string; - name: string; - short_description: string; - description: string; - instructions: string; - per_task_instructions: string; - }[]; - status: number; - xform_title: string; - location_str: string; - outline_geojson: { - type: string; - geometry: { - coordinates: [string, string]; - type: string; - }; - properties: Record; - id: string; - bbox: [string, string, string, string]; - }; - project_tasks: { - id: number; - project_id: number; - project_task_index: number; - project_task_name: string; - outline_geojson: { - type: string; - geometry: { - coordinates: [string, string]; - type: string; - }; - properties: Record; - id: string; - bbox: [string, string, string, string]; - }; - outline_centroid: { - type: string; - geometry: { - coordinates: [string, string]; - type: string; - }; - properties: Record; - id: string; - bbox: [string, string, string, string]; - }; - task_status: number; - locked_by_uid: number; - locked_by_username: string; - task_history: { - id: number; - action_text: string; - action_date: string; - }[]; - qr_code_base64: string; - task_status_str: string; - }[]; - } - - export interface FormCategoryListModel { - id: number, - title: string, - } - export interface OrganisationListModel { - name: string; - slug: string; - description: string; - type: number; - subscription_tier: null | string; - id: number; - logo: string; - url: string; - } \ No newline at end of file diff --git a/src/frontend/main/src/models/geojsonObjectModel.js b/src/frontend/main/src/models/geojsonObjectModel.js deleted file mode 100755 index 08bb89584b..0000000000 --- a/src/frontend/main/src/models/geojsonObjectModel.js +++ /dev/null @@ -1,10 +0,0 @@ -export const geojsonObjectModel = { - 'type': 'FeatureCollection', - 'SRID': { - 'type': 'name', - 'properties': { - 'name': 'EPSG:3857', - }, - }, - 'features': [] -} diff --git a/src/frontend/main/src/models/home/homeModel.ts b/src/frontend/main/src/models/home/homeModel.ts deleted file mode 100755 index b5319dc5fe..0000000000 --- a/src/frontend/main/src/models/home/homeModel.ts +++ /dev/null @@ -1,12 +0,0 @@ - -export interface HomeProjectCardModel { - id: number, - priority: number, - title: string, - location_str: string, - description: string, - total_tasks: number, - tasks_mapped: number, - tasks_validated: number, - tasks_bad_imagery: number -} \ No newline at end of file diff --git a/src/frontend/main/src/models/organization/organizationModel.ts b/src/frontend/main/src/models/organization/organizationModel.ts deleted file mode 100644 index 256dec9316..0000000000 --- a/src/frontend/main/src/models/organization/organizationModel.ts +++ /dev/null @@ -1,43 +0,0 @@ - -export interface OrganizationModal { - name: string, - description: string, - url: string, - type: number, -} - - export interface FormCategoryListModel { - id: number, - title: string, - } - export interface OrganisationListModel { - name: string; - slug: string; - description: string; - type: number; - subscription_tier: null | string; - id: number; - logo: string; - url: string; - } - - export interface GetOrganizationDataModel { - name : string; - slug : string; - description : string; - type : number; - subscription_tier : null; - id: number; - logo : string; - url : string; - } - export interface PostOrganizationDataModel { - name : string; - slug : string; - description : string; - type : number; - subscription_tier : null; - id: number; - logo : string; - url : string; - } \ No newline at end of file diff --git a/src/frontend/main/src/store/slices/CommonSlice.ts b/src/frontend/main/src/store/slices/CommonSlice.ts deleted file mode 100755 index 1fc4e85df2..0000000000 --- a/src/frontend/main/src/store/slices/CommonSlice.ts +++ /dev/null @@ -1,30 +0,0 @@ - -import CoreModules from "../../shared/CoreModules"; -const CommonSlice = CoreModules.createSlice({ - name: 'common', - initialState: { - snackbar: { - open: false, - message: '', - variant: 'info', - duration: 0 - }, - loading:false, - postOrganizationLoading:false - }, - reducers: { - SetSnackBar(state, action) { - state.snackbar = action.payload - }, - SetLoading(state,action){ - state.loading = action.payload - }, - PostOrganizationLoading(state,action){ - state.organization = action.payload - } - } -}) - - -export const CommonActions = CommonSlice.actions; -export default CommonSlice; diff --git a/src/frontend/main/src/store/slices/organizationSlice.ts b/src/frontend/main/src/store/slices/organizationSlice.ts deleted file mode 100644 index 0690199fa0..0000000000 --- a/src/frontend/main/src/store/slices/organizationSlice.ts +++ /dev/null @@ -1,32 +0,0 @@ -import CoreModules from "../../shared/CoreModules.js" - -const OrganizationSlice = CoreModules.createSlice({ - name: 'organization', - initialState: { - organizationFormData:{}, - organizationData: [], - postOrganizationData: null, - organizationDataLoading: false, - postOrganizationDataLoading: false, - }, - reducers: { - GetOrganizationsData(state, action) { - state.oraganizationData = action.payload - }, - GetOrganizationDataLoading(state, action) { - state.organizationDataLoading = action.payload - }, - postOrganizationData(state, action) { - state.postOrganizationData = action.payload - }, - PostOrganizationDataLoading(state, action) { - state.postOrganizationDataLoading = action.payload - }, - SetOrganizationFormData(state, action) { - state.organizationFormData = action.payload - }, - } -}) - -export const OrganizationAction = OrganizationSlice.actions; -export default OrganizationSlice; \ No newline at end of file diff --git a/src/frontend/main/src/styles/home.css b/src/frontend/main/src/styles/home.css deleted file mode 100755 index 5171ec811f..0000000000 --- a/src/frontend/main/src/styles/home.css +++ /dev/null @@ -1,11 +0,0 @@ -#search { - margin-top: 11.8px; -} - -#searchXs { - width: '15%'; -} - -.dropdown-item { - width: '100%'; -} diff --git a/src/frontend/main/src/utilities/BasicCard.tsx b/src/frontend/main/src/utilities/BasicCard.tsx deleted file mode 100755 index a1a855e836..0000000000 --- a/src/frontend/main/src/utilities/BasicCard.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import * as React from 'react'; -import CoreModules from '../shared/CoreModules'; - -export default function BasicCard({ title, subtitle, content, variant, contentProps, headerStatus }) { - - return ( - - - {headerStatus && - {/* - {title} - - - {subtitle} - */} - } - - {content} - - - - ); -} diff --git a/src/frontend/main/src/utilities/CustomizedImage.jsx b/src/frontend/main/src/utilities/CustomizedImage.jsx deleted file mode 100755 index 9a44f6c0d5..0000000000 --- a/src/frontend/main/src/utilities/CustomizedImage.jsx +++ /dev/null @@ -1,21 +0,0 @@ -import React from "react"; -import cardImg from '../assets/images/project_icon.png'; -import logo from '../assets/images/hotLog.png' -import { LazyLoadImage } from 'react-lazy-load-image-component'; -const Switcher = ({ status,width,height }) => { - switch (status) { - case 'card': - return - case 'logo': - return - - } -} - -const CustomizedImage = ({ status,style }) => { - return ( - - ) -} - -export default CustomizedImage; diff --git a/src/frontend/main/src/utilities/CustomizedMenus.tsx b/src/frontend/main/src/utilities/CustomizedMenus.tsx deleted file mode 100755 index f06f864fc1..0000000000 --- a/src/frontend/main/src/utilities/CustomizedMenus.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import * as React from 'react'; -import { MenuProps } from '@mui/material/Menu'; -import CoreModules from '../shared/CoreModules'; -import AssetModules from '../shared/AssetModules'; - -const StyledMenu = AssetModules.styled((props: MenuProps) => ( - -))(({ theme }) => ({ - '& .MuiPaper-root': { - borderRadius: 6, - marginTop: theme.spacing(1), - minWidth: 180, - boxShadow: - `rgb(255, 255, 255) 0px 0px 0px 0px, - rgba(0, 0, 0, 0.05) 0px 0px 0px 1px, - rgba(0, 0, 0, 0.1) 0px 10px 15px -3px, - rgba(0, 0, 0, 0.05) 0px 4px 6px -2px`, - '& .MuiMenu-list': { - padding: '4px 0', - }, - - }, -})); - -export default function CustomizedMenus({ element, btnProps, btnName }) { - const [anchorEl, setAnchorEl] = React.useState(null); - const open = Boolean(anchorEl); - const handleClick = (event: React.MouseEvent) => { - setAnchorEl(event.currentTarget); - }; - const handleClose = () => { - setAnchorEl(null); - }; - - return ( -
- } - > - {btnName} - - - {element} - -
- ); -} diff --git a/src/frontend/main/src/utilities/CustomizedSnackbar.jsx b/src/frontend/main/src/utilities/CustomizedSnackbar.jsx deleted file mode 100755 index 1c611cc948..0000000000 --- a/src/frontend/main/src/utilities/CustomizedSnackbar.jsx +++ /dev/null @@ -1,26 +0,0 @@ -import * as React from 'react'; -import CoreModules from '../shared/CoreModules'; -const Alert = React.forwardRef(function Alert(props, ref) { - return ; -}); - -function SlideTransition(props) { - return ; -} - -export default function CustomizedSnackbars({ open, message, variant, handleClose, duration }) { - - return ( - - - - - {message} - - - - - ); -} diff --git a/src/frontend/main/src/utilities/mapUtils.js b/src/frontend/main/src/utilities/mapUtils.js deleted file mode 100644 index 2b972ee051..0000000000 --- a/src/frontend/main/src/utilities/mapUtils.js +++ /dev/null @@ -1,15 +0,0 @@ -import { Stroke, Style } from "ol/style"; - -const basicGeojsonTemplate = { - type: "FeatureCollection", - features: [], -}; - -const buildingStyle = new Style({ - stroke: new Stroke({ - color: "#FF0000", - }), - }); - - -export { basicGeojsonTemplate,buildingStyle } \ No newline at end of file diff --git a/src/frontend/main/test-tsconfig.json b/src/frontend/main/test-tsconfig.json deleted file mode 100644 index 58c788aa31..0000000000 --- a/src/frontend/main/test-tsconfig.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "compilerOptions": { - /* Basic Options */ - "target": "esnext" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */, - "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, - "lib": [ - "esnext", - "dom" - ] /* Specify library files to be included in the compilation. */, - // "allowJs": true, /* Allow javascript files to be compiled. */ - // "checkJs": true, /* Report errors in .js files. */ - "jsx": "react-jsx" /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */, - // "declaration": true, /* Generates corresponding '.d.ts' file. */ - // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ - // "sourceMap": true, /* Generates corresponding '.map' file. */ - // "outFile": "./", /* Concatenate and emit output to single file. */ - // "outDir": "./dist/", /* Redirect output structure to the directory. */ - // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ - // "composite": true, /* Enable project compilation */ - // "removeComments": true, /* Do not emit comments to output. */ - "noEmit": false /* Do not emit outputs. */, - // "importHelpers": true /* Import emit helpers from 'tslib'. */, - // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ - // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ - /* Strict Type-Checking Options */ - "strict": false /* Enable all strict type-checking options. */, - // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ - // "strictNullChecks": true, /* Enable strict null checks. */ - // "strictFunctionTypes": true, /* Enable strict checking of function types. */ - // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ - // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ - // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ - // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ - /* Additional Checks */ - "noUnusedLocals": true /* Report errors on unused locals. */, - "noUnusedParameters": true /* Report errors on unused parameters. */, - // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ - // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ - /* Module Resolution Options */ - "moduleResolution": "node" /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */, - // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ - // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ - // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ - // "typeRoots": [], /* List of folders to include type definitions from. */ - // "types": [], /* Type declaration files to be included in compilation. */ - // "allowSyntheticDefaultImports": true /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */, - "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, - // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ - /* Source Map Options */ - // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ - // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ - // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ - /* Experimental Options */ - // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ - // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "resolveJsonModule": true, - "outDir": "dist" - - }, - "exclude": ["node_modules"] - } \ No newline at end of file diff --git a/src/frontend/main/package-lock.json b/src/frontend/package-lock.json similarity index 97% rename from src/frontend/main/package-lock.json rename to src/frontend/package-lock.json index 28d52958d2..e28bf71e4f 100644 --- a/src/frontend/main/package-lock.json +++ b/src/frontend/package-lock.json @@ -12,6 +12,7 @@ "@mui/icons-material": "^5.11.0", "@mui/lab": "^5.0.0-alpha.134", "@mui/material": "^5.11.1", + "@radix-ui/react-select": "^1.2.2", "@radix-ui/react-switch": "^1.0.3", "@reduxjs/toolkit": "^1.9.1", "@sentry/react": "^7.59.3", @@ -29,6 +30,7 @@ "eslint-plugin-prettier": "^5.0.0", "install": "^0.13.0", "jest": "^29.6.1", + "lucide-react": "^0.276.0", "mini-css-extract-plugin": "^2.7.5", "react": "^17.0.2", "react-dom": "^17.0.2", @@ -2084,6 +2086,40 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@floating-ui/core": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.4.1.tgz", + "integrity": "sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==", + "dependencies": { + "@floating-ui/utils": "^0.1.1" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.2.tgz", + "integrity": "sha512-6ArmenS6qJEWmwzczWyhvrXRdI/rI78poBcW0h/456+onlabit+2G+QxHx5xTOX60NBJQXjsCLFbW2CmsXpUog==", + "dependencies": { + "@floating-ui/core": "^1.4.1", + "@floating-ui/utils": "^0.1.1" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.2.tgz", + "integrity": "sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==", + "dependencies": { + "@floating-ui/dom": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.2.tgz", + "integrity": "sha512-ou3elfqG/hZsbmF4bxeJhPHIf3G2pm0ujc39hYEZrfVqt7Vk/Zji6CXc3W0pmYM8BW1g40U+akTl9DKZhFhInQ==" + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", @@ -3287,6 +3323,14 @@ "url": "https://opencollective.com/popperjs" } }, + "node_modules/@radix-ui/number": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.1.tgz", + "integrity": "sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==", + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, "node_modules/@radix-ui/primitive": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.1.tgz", @@ -3295,6 +3339,55 @@ "@babel/runtime": "^7.13.10" } }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz", + "integrity": "sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.3.tgz", + "integrity": "sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-compose-refs": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz", @@ -3329,6 +3422,165 @@ } } }, + "node_modules/@radix-ui/react-direction": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.1.tgz", + "integrity": "sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.4.tgz", + "integrity": "sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-escape-keydown": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz", + "integrity": "sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.3.tgz", + "integrity": "sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.1.tgz", + "integrity": "sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.2.tgz", + "integrity": "sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1", + "@radix-ui/react-use-rect": "1.0.1", + "@radix-ui/react-use-size": "1.0.1", + "@radix-ui/rect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.3.tgz", + "integrity": "sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-primitive": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz", @@ -3352,6 +3604,49 @@ } } }, + "node_modules/@radix-ui/react-select": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-1.2.2.tgz", + "integrity": "sha512-zI7McXr8fNaSrUY9mZe4x/HC0jTLY9fWNhO1oLWYMQGDXuV4UCivIGTxwioSzO0ZCYX9iSLyWmAh/1TOmX3Cnw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/number": "1.0.1", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-collection": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-dismissable-layer": "1.0.4", + "@radix-ui/react-focus-guards": "1.0.1", + "@radix-ui/react-focus-scope": "1.0.3", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-popper": "1.1.2", + "@radix-ui/react-portal": "1.0.3", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1", + "@radix-ui/react-use-previous": "1.0.1", + "@radix-ui/react-visually-hidden": "1.0.3", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-slot": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz", @@ -3434,6 +3729,24 @@ } } }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz", + "integrity": "sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-use-layout-effect": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz", @@ -3468,6 +3781,24 @@ } } }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.0.1.tgz", + "integrity": "sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/rect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-use-size": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.0.1.tgz", @@ -3486,6 +3817,37 @@ } } }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.3.tgz", + "integrity": "sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.0.1.tgz", + "integrity": "sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==", + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, "node_modules/@reduxjs/toolkit": { "version": "1.9.5", "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.5.tgz", @@ -5013,6 +5375,17 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, + "node_modules/aria-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz", + "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/aria-query": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", @@ -6960,6 +7333,11 @@ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -8598,6 +8976,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "engines": { + "node": ">=6" + } + }, "node_modules/get-own-enumerable-property-symbols": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", @@ -9257,6 +9643,14 @@ "node": ">= 0.10" } }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/ipaddr.js": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", @@ -12058,6 +12452,14 @@ "yallist": "^3.0.2" } }, + "node_modules/lucide-react": { + "version": "0.276.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.276.0.tgz", + "integrity": "sha512-ubP1Tyj67nsy84/ikelrFcjj7eEkD6hg9H/1Mhk22CGpbvPtEd3r8sMFQQ1YdpePx70Nt4oYIMfTPHZlag+ZLQ==", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/lz-string": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", @@ -13996,6 +14398,51 @@ } } }, + "node_modules/react-remove-scroll": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", + "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", + "dependencies": { + "react-remove-scroll-bar": "^2.3.3", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", + "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/react-router": { "version": "6.10.0", "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.10.0.tgz", @@ -14035,6 +14482,28 @@ "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", @@ -15933,6 +16402,47 @@ "requires-port": "^1.0.0" } }, + "node_modules/use-callback-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz", + "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/use-sync-external-store": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", @@ -18480,6 +18990,36 @@ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==" }, + "@floating-ui/core": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.4.1.tgz", + "integrity": "sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==", + "requires": { + "@floating-ui/utils": "^0.1.1" + } + }, + "@floating-ui/dom": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.2.tgz", + "integrity": "sha512-6ArmenS6qJEWmwzczWyhvrXRdI/rI78poBcW0h/456+onlabit+2G+QxHx5xTOX60NBJQXjsCLFbW2CmsXpUog==", + "requires": { + "@floating-ui/core": "^1.4.1", + "@floating-ui/utils": "^0.1.1" + } + }, + "@floating-ui/react-dom": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.2.tgz", + "integrity": "sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==", + "requires": { + "@floating-ui/dom": "^1.5.1" + } + }, + "@floating-ui/utils": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.2.tgz", + "integrity": "sha512-ou3elfqG/hZsbmF4bxeJhPHIf3G2pm0ujc39hYEZrfVqt7Vk/Zji6CXc3W0pmYM8BW1g40U+akTl9DKZhFhInQ==" + }, "@humanwhocodes/config-array": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", @@ -19280,6 +19820,14 @@ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==" }, + "@radix-ui/number": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.1.tgz", + "integrity": "sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, "@radix-ui/primitive": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.1.tgz", @@ -19288,6 +19836,27 @@ "@babel/runtime": "^7.13.10" } }, + "@radix-ui/react-arrow": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz", + "integrity": "sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + } + }, + "@radix-ui/react-collection": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.3.tgz", + "integrity": "sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2" + } + }, "@radix-ui/react-compose-refs": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz", @@ -19304,6 +19873,82 @@ "@babel/runtime": "^7.13.10" } }, + "@radix-ui/react-direction": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.1.tgz", + "integrity": "sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-dismissable-layer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.4.tgz", + "integrity": "sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-escape-keydown": "1.0.3" + } + }, + "@radix-ui/react-focus-guards": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz", + "integrity": "sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-focus-scope": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.3.tgz", + "integrity": "sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1" + } + }, + "@radix-ui/react-id": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.1.tgz", + "integrity": "sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.1" + } + }, + "@radix-ui/react-popper": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.2.tgz", + "integrity": "sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==", + "requires": { + "@babel/runtime": "^7.13.10", + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1", + "@radix-ui/react-use-rect": "1.0.1", + "@radix-ui/react-use-size": "1.0.1", + "@radix-ui/rect": "1.0.1" + } + }, + "@radix-ui/react-portal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.3.tgz", + "integrity": "sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + } + }, "@radix-ui/react-primitive": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz", @@ -19313,6 +19958,35 @@ "@radix-ui/react-slot": "1.0.2" } }, + "@radix-ui/react-select": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-1.2.2.tgz", + "integrity": "sha512-zI7McXr8fNaSrUY9mZe4x/HC0jTLY9fWNhO1oLWYMQGDXuV4UCivIGTxwioSzO0ZCYX9iSLyWmAh/1TOmX3Cnw==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/number": "1.0.1", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-collection": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-dismissable-layer": "1.0.4", + "@radix-ui/react-focus-guards": "1.0.1", + "@radix-ui/react-focus-scope": "1.0.3", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-popper": "1.1.2", + "@radix-ui/react-portal": "1.0.3", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1", + "@radix-ui/react-use-previous": "1.0.1", + "@radix-ui/react-visually-hidden": "1.0.3", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + } + }, "@radix-ui/react-slot": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz", @@ -19354,6 +20028,15 @@ "@radix-ui/react-use-callback-ref": "1.0.1" } }, + "@radix-ui/react-use-escape-keydown": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz", + "integrity": "sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.1" + } + }, "@radix-ui/react-use-layout-effect": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz", @@ -19370,6 +20053,15 @@ "@babel/runtime": "^7.13.10" } }, + "@radix-ui/react-use-rect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.0.1.tgz", + "integrity": "sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/rect": "1.0.1" + } + }, "@radix-ui/react-use-size": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.0.1.tgz", @@ -19379,6 +20071,23 @@ "@radix-ui/react-use-layout-effect": "1.0.1" } }, + "@radix-ui/react-visually-hidden": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.3.tgz", + "integrity": "sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + } + }, + "@radix-ui/rect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.0.1.tgz", + "integrity": "sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, "@reduxjs/toolkit": { "version": "1.9.5", "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.5.tgz", @@ -20595,6 +21304,14 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, + "aria-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz", + "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==", + "requires": { + "tslib": "^2.0.0" + } + }, "aria-query": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", @@ -22001,6 +22718,11 @@ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, + "detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, "didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -23237,6 +23959,11 @@ "has-symbols": "^1.0.3" } }, + "get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==" + }, "get-own-enumerable-property-symbols": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", @@ -23707,6 +24434,14 @@ "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", "dev": true }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, "ipaddr.js": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", @@ -25707,6 +26442,12 @@ "yallist": "^3.0.2" } }, + "lucide-react": { + "version": "0.276.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.276.0.tgz", + "integrity": "sha512-ubP1Tyj67nsy84/ikelrFcjj7eEkD6hg9H/1Mhk22CGpbvPtEd3r8sMFQQ1YdpePx70Nt4oYIMfTPHZlag+ZLQ==", + "requires": {} + }, "lz-string": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", @@ -27013,6 +27754,27 @@ "use-sync-external-store": "^1.0.0" } }, + "react-remove-scroll": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", + "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", + "requires": { + "react-remove-scroll-bar": "^2.3.3", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + } + }, + "react-remove-scroll-bar": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", + "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", + "requires": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + } + }, "react-router": { "version": "6.10.0", "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.10.0.tgz", @@ -27036,6 +27798,16 @@ "integrity": "sha512-3e+k56lUkPj0vb5NDXPVFAOkPC//XyhKPJjvcGjyMNPWsBKpplfeyialP74G7H7+It7KzhtET+MvGqbKgAqpZA==", "requires": {} }, + "react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "requires": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + } + }, "react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", @@ -28447,6 +29219,23 @@ "requires-port": "^1.0.0" } }, + "use-callback-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz", + "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==", + "requires": { + "tslib": "^2.0.0" + } + }, + "use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "requires": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + } + }, "use-sync-external-store": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", diff --git a/src/frontend/main/package.json b/src/frontend/package.json similarity index 97% rename from src/frontend/main/package.json rename to src/frontend/package.json index 842192f871..cec692fd0e 100755 --- a/src/frontend/main/package.json +++ b/src/frontend/package.json @@ -52,6 +52,7 @@ "@mui/icons-material": "^5.11.0", "@mui/lab": "^5.0.0-alpha.134", "@mui/material": "^5.11.1", + "@radix-ui/react-select": "^1.2.2", "@radix-ui/react-switch": "^1.0.3", "@reduxjs/toolkit": "^1.9.1", "@sentry/react": "^7.59.3", @@ -69,6 +70,7 @@ "eslint-plugin-prettier": "^5.0.0", "install": "^0.13.0", "jest": "^29.6.1", + "lucide-react": "^0.276.0", "mini-css-extract-plugin": "^2.7.5", "react": "^17.0.2", "react-dom": "^17.0.2", diff --git a/src/frontend/main/postcss.config.js b/src/frontend/postcss.config.js similarity index 100% rename from src/frontend/main/postcss.config.js rename to src/frontend/postcss.config.js diff --git a/src/frontend/prod.dockerfile b/src/frontend/prod.dockerfile index a1bdfe141b..c716c5edeb 100644 --- a/src/frontend/prod.dockerfile +++ b/src/frontend/prod.dockerfile @@ -14,11 +14,11 @@ LABEL org.hotosm.fmtm.app-name="fmtm-frontend" \ org.hotosm.fmtm.main-url="${FRONTEND_MAIN_URL}" WORKDIR /app -COPY main/package*.json ./ +COPY ./package*.json ./ RUN npm install ENV NODE_ENV production -COPY main/ . +COPY . . RUN npm run build diff --git a/src/frontend/main/public/icon-192x192.png b/src/frontend/public/icon-192x192.png similarity index 100% rename from src/frontend/main/public/icon-192x192.png rename to src/frontend/public/icon-192x192.png diff --git a/src/frontend/main/public/icon-256x256.png b/src/frontend/public/icon-256x256.png similarity index 100% rename from src/frontend/main/public/icon-256x256.png rename to src/frontend/public/icon-256x256.png diff --git a/src/frontend/main/public/icon-384x384.png b/src/frontend/public/icon-384x384.png similarity index 100% rename from src/frontend/main/public/icon-384x384.png rename to src/frontend/public/icon-384x384.png diff --git a/src/frontend/main/public/icon-512x512.png b/src/frontend/public/icon-512x512.png similarity index 100% rename from src/frontend/main/public/icon-512x512.png rename to src/frontend/public/icon-512x512.png diff --git a/src/frontend/public/manifest.json b/src/frontend/public/manifest.json new file mode 100644 index 0000000000..380b5a429e --- /dev/null +++ b/src/frontend/public/manifest.json @@ -0,0 +1,30 @@ +{ + "name": "Field Mapping Tasking Manager", + "short_name": "FMTM", + "start_url": ".", + "display": "fullscreen", + "background_color": "#fff", + "description": "A project to provide tools for Open Mapping campaigns.", + "icons": [ + { + "src": "/icon-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/icon-256x256.png", + "sizes": "256x256", + "type": "image/png" + }, + { + "src": "/icon-384x384.png", + "sizes": "384x384", + "type": "image/png" + }, + { + "src": "/icon-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ] +} diff --git a/src/frontend/main/setupTests.js b/src/frontend/setupTests.js similarity index 100% rename from src/frontend/main/setupTests.js rename to src/frontend/setupTests.js diff --git a/src/frontend/main/src/App.jsx b/src/frontend/src/App.jsx similarity index 100% rename from src/frontend/main/src/App.jsx rename to src/frontend/src/App.jsx diff --git a/src/frontend/main/src/api/CreateProjectService.ts b/src/frontend/src/api/CreateProjectService.ts similarity index 100% rename from src/frontend/main/src/api/CreateProjectService.ts rename to src/frontend/src/api/CreateProjectService.ts diff --git a/src/frontend/main/src/api/Files.js b/src/frontend/src/api/Files.js similarity index 100% rename from src/frontend/main/src/api/Files.js rename to src/frontend/src/api/Files.js diff --git a/src/frontend/main/src/api/HomeService.ts b/src/frontend/src/api/HomeService.ts similarity index 100% rename from src/frontend/main/src/api/HomeService.ts rename to src/frontend/src/api/HomeService.ts diff --git a/src/frontend/src/api/OrganizationService.ts b/src/frontend/src/api/OrganizationService.ts new file mode 100644 index 0000000000..1aba3c4fe6 --- /dev/null +++ b/src/frontend/src/api/OrganizationService.ts @@ -0,0 +1,100 @@ +import axios from 'axios'; +import { HomeProjectCardModel } from '../models/home/homeModel'; +import { GetOrganizationDataModel, OrganizationModal } from '../models/organization/organizationModel'; +import { CommonActions } from '../store/slices/CommonSlice'; +import { OrganizationAction } from '../store/slices/organizationSlice'; + +function appendObjectToFormData(formData, object) { + for (const [key, value] of Object.entries(object)) { + // if (key === 'logo') { + // formData.append(key, value[0]) + // } + formData.append(key, value); + } +} + +export const OrganizationService: Function = (url: string, payload: OrganizationModal) => { + return async (dispatch) => { + dispatch(CommonActions.PostOrganizationLoading(true)); + + const postOrganization = async (url, payload) => { + try { + const generateApiFormData = new FormData(); + appendObjectToFormData(generateApiFormData, payload); + await axios.post(url, generateApiFormData, { + headers: { + 'Content-Type': 'multipart/form-data', + }, + }); + // const resp: HomeProjectCardModel = postOrganizationData.data; + // dispatch(CommonActions.SetOrganizationDetail(resp)) + dispatch(CommonActions.PostOrganizationLoading(false)); + } catch (error) { + dispatch(CommonActions.PostOrganizationLoading(false)); + } + }; + + await postOrganization(url, payload); + }; +}; + +export const OrganizationDataService: Function = (url: string) => { + return async (dispatch) => { + dispatch(OrganizationAction.GetOrganizationDataLoading(true)); + const getOrganizationData = async (url) => { + try { + const getOrganizationDataResponse = await axios.get(url); + const response: GetOrganizationDataModel = getOrganizationDataResponse.data; + dispatch(OrganizationAction.GetOrganizationsData(response)); + } catch (error) { + dispatch(OrganizationAction.GetOrganizationDataLoading(false)); + } + }; + await getOrganizationData(url); + }; +}; + +export const PostOrganizationDataService: Function = (url: string, payload: any) => { + return async (dispatch) => { + dispatch(OrganizationAction.PostOrganizationDataLoading(true)); + + const postOrganizationData = async (url, payload) => { + dispatch(OrganizationAction.SetOrganizationFormData(payload)); + + try { + const generateApiFormData = new FormData(); + appendObjectToFormData(generateApiFormData, payload); + + const postOrganizationData = await axios.post(url, payload, { + headers: { + 'Content-Type': 'multipart/form-data', + }, + }); + + const resp: HomeProjectCardModel = postOrganizationData.data; + dispatch(OrganizationAction.PostOrganizationDataLoading(false)); + dispatch(OrganizationAction.postOrganizationData(resp)); + dispatch( + CommonActions.SetSnackBar({ + open: true, + message: 'Organization Successfully Created.', + variant: 'success', + duration: 2000, + }), + ); + } catch (error: any) { + dispatch( + CommonActions.SetSnackBar({ + open: true, + message: error.response.data.detail, + variant: 'error', + duration: 2000, + }), + ); + dispatch(OrganizationAction.PostOrganizationDataLoading(false)); + } + }; + + await postOrganizationData(url, payload); + }; +}; diff --git a/src/frontend/main/src/api/Project.js b/src/frontend/src/api/Project.js similarity index 100% rename from src/frontend/main/src/api/Project.js rename to src/frontend/src/api/Project.js diff --git a/src/frontend/main/src/api/ProjectTaskStatus.js b/src/frontend/src/api/ProjectTaskStatus.js similarity index 100% rename from src/frontend/main/src/api/ProjectTaskStatus.js rename to src/frontend/src/api/ProjectTaskStatus.js diff --git a/src/frontend/main/src/api/Submission.ts b/src/frontend/src/api/Submission.ts similarity index 100% rename from src/frontend/main/src/api/Submission.ts rename to src/frontend/src/api/Submission.ts diff --git a/src/frontend/main/src/api/SubmissionService.ts b/src/frontend/src/api/SubmissionService.ts similarity index 100% rename from src/frontend/main/src/api/SubmissionService.ts rename to src/frontend/src/api/SubmissionService.ts diff --git a/src/frontend/main/src/api/task.ts b/src/frontend/src/api/task.ts similarity index 100% rename from src/frontend/main/src/api/task.ts rename to src/frontend/src/api/task.ts diff --git a/src/frontend/main/src/assets/fonts/Archivo/Archivo/Archivo-Bold.ttf b/src/frontend/src/assets/fonts/Archivo/Archivo/Archivo-Bold.ttf similarity index 100% rename from src/frontend/main/src/assets/fonts/Archivo/Archivo/Archivo-Bold.ttf rename to src/frontend/src/assets/fonts/Archivo/Archivo/Archivo-Bold.ttf diff --git a/src/frontend/main/src/assets/fonts/Archivo/Archivo/Archivo-BoldItalic.ttf b/src/frontend/src/assets/fonts/Archivo/Archivo/Archivo-BoldItalic.ttf similarity index 100% rename from src/frontend/main/src/assets/fonts/Archivo/Archivo/Archivo-BoldItalic.ttf rename to src/frontend/src/assets/fonts/Archivo/Archivo/Archivo-BoldItalic.ttf diff --git a/src/frontend/main/src/assets/fonts/Archivo/Archivo/Archivo-Italic.ttf b/src/frontend/src/assets/fonts/Archivo/Archivo/Archivo-Italic.ttf similarity index 100% rename from src/frontend/main/src/assets/fonts/Archivo/Archivo/Archivo-Italic.ttf rename to src/frontend/src/assets/fonts/Archivo/Archivo/Archivo-Italic.ttf diff --git a/src/frontend/main/src/assets/fonts/Archivo/Archivo/Archivo-Light.ttf b/src/frontend/src/assets/fonts/Archivo/Archivo/Archivo-Light.ttf similarity index 100% rename from src/frontend/main/src/assets/fonts/Archivo/Archivo/Archivo-Light.ttf rename to src/frontend/src/assets/fonts/Archivo/Archivo/Archivo-Light.ttf diff --git a/src/frontend/main/src/assets/fonts/Archivo/Archivo/Archivo-Medium.ttf b/src/frontend/src/assets/fonts/Archivo/Archivo/Archivo-Medium.ttf similarity index 100% rename from src/frontend/main/src/assets/fonts/Archivo/Archivo/Archivo-Medium.ttf rename to src/frontend/src/assets/fonts/Archivo/Archivo/Archivo-Medium.ttf diff --git a/src/frontend/main/src/assets/fonts/Archivo/Archivo/Archivo-MediumItalic.ttf b/src/frontend/src/assets/fonts/Archivo/Archivo/Archivo-MediumItalic.ttf similarity index 100% rename from src/frontend/main/src/assets/fonts/Archivo/Archivo/Archivo-MediumItalic.ttf rename to src/frontend/src/assets/fonts/Archivo/Archivo/Archivo-MediumItalic.ttf diff --git a/src/frontend/main/src/assets/fonts/Archivo/Archivo/Archivo-Regular.ttf b/src/frontend/src/assets/fonts/Archivo/Archivo/Archivo-Regular.ttf similarity index 100% rename from src/frontend/main/src/assets/fonts/Archivo/Archivo/Archivo-Regular.ttf rename to src/frontend/src/assets/fonts/Archivo/Archivo/Archivo-Regular.ttf diff --git a/src/frontend/main/src/assets/fonts/Archivo/Archivo/Archivo-SemiBold.ttf b/src/frontend/src/assets/fonts/Archivo/Archivo/Archivo-SemiBold.ttf similarity index 100% rename from src/frontend/main/src/assets/fonts/Archivo/Archivo/Archivo-SemiBold.ttf rename to src/frontend/src/assets/fonts/Archivo/Archivo/Archivo-SemiBold.ttf diff --git a/src/frontend/main/src/assets/fonts/Archivo/Archivo/Archivo-SemiBoldItalic.ttf b/src/frontend/src/assets/fonts/Archivo/Archivo/Archivo-SemiBoldItalic.ttf similarity index 100% rename from src/frontend/main/src/assets/fonts/Archivo/Archivo/Archivo-SemiBoldItalic.ttf rename to src/frontend/src/assets/fonts/Archivo/Archivo/Archivo-SemiBoldItalic.ttf diff --git a/src/frontend/main/src/assets/fonts/Archivo/Archivo/OFL.txt b/src/frontend/src/assets/fonts/Archivo/Archivo/OFL.txt similarity index 100% rename from src/frontend/main/src/assets/fonts/Archivo/Archivo/OFL.txt rename to src/frontend/src/assets/fonts/Archivo/Archivo/OFL.txt diff --git a/src/frontend/main/src/assets/fonts/Barlow/Barlow-Black.ttf b/src/frontend/src/assets/fonts/Barlow/Barlow-Black.ttf similarity index 100% rename from src/frontend/main/src/assets/fonts/Barlow/Barlow-Black.ttf rename to src/frontend/src/assets/fonts/Barlow/Barlow-Black.ttf diff --git a/src/frontend/main/src/assets/fonts/Barlow/Barlow-BlackItalic.ttf b/src/frontend/src/assets/fonts/Barlow/Barlow-BlackItalic.ttf similarity index 100% rename from src/frontend/main/src/assets/fonts/Barlow/Barlow-BlackItalic.ttf rename to src/frontend/src/assets/fonts/Barlow/Barlow-BlackItalic.ttf diff --git a/src/frontend/main/src/assets/fonts/Barlow/Barlow-Bold.ttf b/src/frontend/src/assets/fonts/Barlow/Barlow-Bold.ttf similarity index 100% rename from src/frontend/main/src/assets/fonts/Barlow/Barlow-Bold.ttf rename to src/frontend/src/assets/fonts/Barlow/Barlow-Bold.ttf diff --git a/src/frontend/main/src/assets/fonts/Barlow/Barlow-BoldItalic.ttf b/src/frontend/src/assets/fonts/Barlow/Barlow-BoldItalic.ttf similarity index 100% rename from src/frontend/main/src/assets/fonts/Barlow/Barlow-BoldItalic.ttf rename to src/frontend/src/assets/fonts/Barlow/Barlow-BoldItalic.ttf diff --git a/src/frontend/main/src/assets/fonts/Barlow/Barlow-ExtraBold.ttf b/src/frontend/src/assets/fonts/Barlow/Barlow-ExtraBold.ttf similarity index 100% rename from src/frontend/main/src/assets/fonts/Barlow/Barlow-ExtraBold.ttf rename to src/frontend/src/assets/fonts/Barlow/Barlow-ExtraBold.ttf diff --git a/src/frontend/main/src/assets/fonts/Barlow/Barlow-ExtraBoldItalic.ttf b/src/frontend/src/assets/fonts/Barlow/Barlow-ExtraBoldItalic.ttf similarity index 100% rename from src/frontend/main/src/assets/fonts/Barlow/Barlow-ExtraBoldItalic.ttf rename to src/frontend/src/assets/fonts/Barlow/Barlow-ExtraBoldItalic.ttf diff --git a/src/frontend/main/src/assets/fonts/Barlow/Barlow-ExtraLight.ttf b/src/frontend/src/assets/fonts/Barlow/Barlow-ExtraLight.ttf similarity index 100% rename from src/frontend/main/src/assets/fonts/Barlow/Barlow-ExtraLight.ttf rename to src/frontend/src/assets/fonts/Barlow/Barlow-ExtraLight.ttf diff --git a/src/frontend/main/src/assets/fonts/Barlow/Barlow-ExtraLightItalic.ttf b/src/frontend/src/assets/fonts/Barlow/Barlow-ExtraLightItalic.ttf similarity index 100% rename from src/frontend/main/src/assets/fonts/Barlow/Barlow-ExtraLightItalic.ttf rename to src/frontend/src/assets/fonts/Barlow/Barlow-ExtraLightItalic.ttf diff --git a/src/frontend/main/src/assets/fonts/Barlow/Barlow-Italic.ttf b/src/frontend/src/assets/fonts/Barlow/Barlow-Italic.ttf similarity index 100% rename from src/frontend/main/src/assets/fonts/Barlow/Barlow-Italic.ttf rename to src/frontend/src/assets/fonts/Barlow/Barlow-Italic.ttf diff --git a/src/frontend/main/src/assets/fonts/Barlow/Barlow-Light.ttf b/src/frontend/src/assets/fonts/Barlow/Barlow-Light.ttf similarity index 100% rename from src/frontend/main/src/assets/fonts/Barlow/Barlow-Light.ttf rename to src/frontend/src/assets/fonts/Barlow/Barlow-Light.ttf diff --git a/src/frontend/main/src/assets/fonts/Barlow/Barlow-LightItalic.ttf b/src/frontend/src/assets/fonts/Barlow/Barlow-LightItalic.ttf similarity index 100% rename from src/frontend/main/src/assets/fonts/Barlow/Barlow-LightItalic.ttf rename to src/frontend/src/assets/fonts/Barlow/Barlow-LightItalic.ttf diff --git a/src/frontend/main/src/assets/fonts/Barlow/Barlow-Medium.ttf b/src/frontend/src/assets/fonts/Barlow/Barlow-Medium.ttf similarity index 100% rename from src/frontend/main/src/assets/fonts/Barlow/Barlow-Medium.ttf rename to src/frontend/src/assets/fonts/Barlow/Barlow-Medium.ttf diff --git a/src/frontend/main/src/assets/fonts/Barlow/Barlow-MediumItalic.ttf b/src/frontend/src/assets/fonts/Barlow/Barlow-MediumItalic.ttf similarity index 100% rename from src/frontend/main/src/assets/fonts/Barlow/Barlow-MediumItalic.ttf rename to src/frontend/src/assets/fonts/Barlow/Barlow-MediumItalic.ttf diff --git a/src/frontend/main/src/assets/fonts/Barlow/Barlow-Regular.ttf b/src/frontend/src/assets/fonts/Barlow/Barlow-Regular.ttf similarity index 100% rename from src/frontend/main/src/assets/fonts/Barlow/Barlow-Regular.ttf rename to src/frontend/src/assets/fonts/Barlow/Barlow-Regular.ttf diff --git a/src/frontend/main/src/assets/fonts/Barlow/Barlow-SemiBold.ttf b/src/frontend/src/assets/fonts/Barlow/Barlow-SemiBold.ttf similarity index 100% rename from src/frontend/main/src/assets/fonts/Barlow/Barlow-SemiBold.ttf rename to src/frontend/src/assets/fonts/Barlow/Barlow-SemiBold.ttf diff --git a/src/frontend/main/src/assets/fonts/Barlow/Barlow-SemiBoldItalic.ttf b/src/frontend/src/assets/fonts/Barlow/Barlow-SemiBoldItalic.ttf similarity index 100% rename from src/frontend/main/src/assets/fonts/Barlow/Barlow-SemiBoldItalic.ttf rename to src/frontend/src/assets/fonts/Barlow/Barlow-SemiBoldItalic.ttf diff --git a/src/frontend/main/src/assets/fonts/Barlow/Barlow-Thin.ttf b/src/frontend/src/assets/fonts/Barlow/Barlow-Thin.ttf similarity index 100% rename from src/frontend/main/src/assets/fonts/Barlow/Barlow-Thin.ttf rename to src/frontend/src/assets/fonts/Barlow/Barlow-Thin.ttf diff --git a/src/frontend/main/src/assets/fonts/Barlow/Barlow-ThinItalic.ttf b/src/frontend/src/assets/fonts/Barlow/Barlow-ThinItalic.ttf similarity index 100% rename from src/frontend/main/src/assets/fonts/Barlow/Barlow-ThinItalic.ttf rename to src/frontend/src/assets/fonts/Barlow/Barlow-ThinItalic.ttf diff --git a/src/frontend/main/src/assets/fonts/Barlow/OFL.txt b/src/frontend/src/assets/fonts/Barlow/OFL.txt similarity index 100% rename from src/frontend/main/src/assets/fonts/Barlow/OFL.txt rename to src/frontend/src/assets/fonts/Barlow/OFL.txt diff --git a/src/frontend/main/src/assets/images/acc-down.png b/src/frontend/src/assets/images/acc-down.png similarity index 100% rename from src/frontend/main/src/assets/images/acc-down.png rename to src/frontend/src/assets/images/acc-down.png diff --git a/src/frontend/main/src/assets/images/acc-up.png b/src/frontend/src/assets/images/acc-up.png similarity index 100% rename from src/frontend/main/src/assets/images/acc-up.png rename to src/frontend/src/assets/images/acc-up.png diff --git a/src/frontend/main/src/assets/images/avatar.png b/src/frontend/src/assets/images/avatar.png similarity index 100% rename from src/frontend/main/src/assets/images/avatar.png rename to src/frontend/src/assets/images/avatar.png diff --git a/src/frontend/main/src/assets/images/favicon.ico b/src/frontend/src/assets/images/favicon.ico similarity index 100% rename from src/frontend/main/src/assets/images/favicon.ico rename to src/frontend/src/assets/images/favicon.ico diff --git a/src/frontend/main/src/assets/images/favicon.png b/src/frontend/src/assets/images/favicon.png similarity index 100% rename from src/frontend/main/src/assets/images/favicon.png rename to src/frontend/src/assets/images/favicon.png diff --git a/src/frontend/main/src/assets/images/grid.png b/src/frontend/src/assets/images/grid.png similarity index 100% rename from src/frontend/main/src/assets/images/grid.png rename to src/frontend/src/assets/images/grid.png diff --git a/src/frontend/main/src/assets/images/hotLog.png b/src/frontend/src/assets/images/hotLog.png similarity index 100% rename from src/frontend/main/src/assets/images/hotLog.png rename to src/frontend/src/assets/images/hotLog.png diff --git a/src/frontend/main/src/assets/images/location.png b/src/frontend/src/assets/images/location.png similarity index 100% rename from src/frontend/main/src/assets/images/location.png rename to src/frontend/src/assets/images/location.png diff --git a/src/frontend/main/src/assets/images/lock.png b/src/frontend/src/assets/images/lock.png similarity index 100% rename from src/frontend/main/src/assets/images/lock.png rename to src/frontend/src/assets/images/lock.png diff --git a/src/frontend/main/src/assets/images/notFound.png b/src/frontend/src/assets/images/notFound.png similarity index 100% rename from src/frontend/main/src/assets/images/notFound.png rename to src/frontend/src/assets/images/notFound.png diff --git a/src/frontend/main/src/assets/images/project_icon.png b/src/frontend/src/assets/images/project_icon.png similarity index 100% rename from src/frontend/main/src/assets/images/project_icon.png rename to src/frontend/src/assets/images/project_icon.png diff --git a/src/frontend/main/src/assets/images/red-lock.png b/src/frontend/src/assets/images/red-lock.png similarity index 100% rename from src/frontend/main/src/assets/images/red-lock.png rename to src/frontend/src/assets/images/red-lock.png diff --git a/src/frontend/main/src/assets/images/red_marker.png b/src/frontend/src/assets/images/red_marker.png similarity index 100% rename from src/frontend/main/src/assets/images/red_marker.png rename to src/frontend/src/assets/images/red_marker.png diff --git a/src/frontend/main/src/components/Activities.jsx b/src/frontend/src/components/Activities.jsx similarity index 100% rename from src/frontend/main/src/components/Activities.jsx rename to src/frontend/src/components/Activities.jsx diff --git a/src/frontend/main/src/components/ActivitiesPanel.jsx b/src/frontend/src/components/ActivitiesPanel.jsx similarity index 100% rename from src/frontend/main/src/components/ActivitiesPanel.jsx rename to src/frontend/src/components/ActivitiesPanel.jsx diff --git a/src/frontend/main/src/components/DialogTaskActions.jsx b/src/frontend/src/components/DialogTaskActions.jsx similarity index 100% rename from src/frontend/main/src/components/DialogTaskActions.jsx rename to src/frontend/src/components/DialogTaskActions.jsx diff --git a/src/frontend/main/src/components/GenerateMbTiles.jsx b/src/frontend/src/components/GenerateMbTiles.jsx similarity index 100% rename from src/frontend/main/src/components/GenerateMbTiles.jsx rename to src/frontend/src/components/GenerateMbTiles.jsx diff --git a/src/frontend/main/src/components/MapComponent/OpenLayersComponent/LayerSwitcher/index.js b/src/frontend/src/components/MapComponent/OpenLayersComponent/LayerSwitcher/index.js similarity index 96% rename from src/frontend/main/src/components/MapComponent/OpenLayersComponent/LayerSwitcher/index.js rename to src/frontend/src/components/MapComponent/OpenLayersComponent/LayerSwitcher/index.js index 23dab94e14..dec28db24b 100644 --- a/src/frontend/main/src/components/MapComponent/OpenLayersComponent/LayerSwitcher/index.js +++ b/src/frontend/src/components/MapComponent/OpenLayersComponent/LayerSwitcher/index.js @@ -6,7 +6,7 @@ import LayerGroup from 'ol/layer/Group'; import LayerTile from 'ol/layer/Tile'; import SourceOSM from 'ol/source/OSM'; import LayerSwitcher from 'ol-layerswitcher'; -import React,{ useEffect } from 'react'; +import React, { useEffect } from 'react'; import { XYZ } from 'ol/source'; @@ -126,7 +126,6 @@ const monochromeMidNight = (visible = false) => }), }); - const LayerSwitcherControl = ({ map, visible = 'osm' }) => { useEffect(() => { if (!map) return; diff --git a/src/frontend/main/src/components/MapComponent/OpenLayersComponent/Layers/VectorLayer.js b/src/frontend/src/components/MapComponent/OpenLayersComponent/Layers/VectorLayer.js similarity index 100% rename from src/frontend/main/src/components/MapComponent/OpenLayersComponent/Layers/VectorLayer.js rename to src/frontend/src/components/MapComponent/OpenLayersComponent/Layers/VectorLayer.js diff --git a/src/frontend/main/src/components/MapComponent/OpenLayersComponent/Layers/VectorTileLayer.js b/src/frontend/src/components/MapComponent/OpenLayersComponent/Layers/VectorTileLayer.js similarity index 95% rename from src/frontend/main/src/components/MapComponent/OpenLayersComponent/Layers/VectorTileLayer.js rename to src/frontend/src/components/MapComponent/OpenLayersComponent/Layers/VectorTileLayer.js index bd4afdeaa4..c7cd0d7f45 100644 --- a/src/frontend/main/src/components/MapComponent/OpenLayersComponent/Layers/VectorTileLayer.js +++ b/src/frontend/src/components/MapComponent/OpenLayersComponent/Layers/VectorTileLayer.js @@ -1,4 +1,4 @@ -import React,{ useEffect, useMemo } from 'react'; +import React, { useEffect, useMemo } from 'react'; // import * as olExtent from 'ol/extent'; import VectorTile from 'ol/layer/VectorTile'; import MVT from 'ol/format/MVT'; diff --git a/src/frontend/main/src/components/MapComponent/OpenLayersComponent/Layers/index.js b/src/frontend/src/components/MapComponent/OpenLayersComponent/Layers/index.js similarity index 100% rename from src/frontend/main/src/components/MapComponent/OpenLayersComponent/Layers/index.js rename to src/frontend/src/components/MapComponent/OpenLayersComponent/Layers/index.js diff --git a/src/frontend/main/src/components/MapComponent/OpenLayersComponent/MapContainer/index.jsx b/src/frontend/src/components/MapComponent/OpenLayersComponent/MapContainer/index.jsx similarity index 100% rename from src/frontend/main/src/components/MapComponent/OpenLayersComponent/MapContainer/index.jsx rename to src/frontend/src/components/MapComponent/OpenLayersComponent/MapContainer/index.jsx diff --git a/src/frontend/main/src/components/MapComponent/OpenLayersComponent/Popup/index.jsx b/src/frontend/src/components/MapComponent/OpenLayersComponent/Popup/index.jsx similarity index 100% rename from src/frontend/main/src/components/MapComponent/OpenLayersComponent/Popup/index.jsx rename to src/frontend/src/components/MapComponent/OpenLayersComponent/Popup/index.jsx diff --git a/src/frontend/main/src/components/MapComponent/OpenLayersComponent/Popup/popup.css b/src/frontend/src/components/MapComponent/OpenLayersComponent/Popup/popup.css similarity index 85% rename from src/frontend/main/src/components/MapComponent/OpenLayersComponent/Popup/popup.css rename to src/frontend/src/components/MapComponent/OpenLayersComponent/Popup/popup.css index bdd5110d88..6a5112f811 100644 --- a/src/frontend/main/src/components/MapComponent/OpenLayersComponent/Popup/popup.css +++ b/src/frontend/src/components/MapComponent/OpenLayersComponent/Popup/popup.css @@ -16,7 +16,7 @@ .ol-popup:before { top: 100%; border: solid transparent; - content: " "; + content: ' '; height: 0; width: 0; position: absolute; @@ -45,5 +45,5 @@ } .ol-popup-closer:after { - content: "✖"; -}/*# sourceMappingURL=popup.css.map */ \ No newline at end of file + content: '✖'; +} /*# sourceMappingURL=popup.css.map */ diff --git a/src/frontend/main/src/components/MapComponent/OpenLayersComponent/Popup/popup.css.map b/src/frontend/src/components/MapComponent/OpenLayersComponent/Popup/popup.css.map similarity index 100% rename from src/frontend/main/src/components/MapComponent/OpenLayersComponent/Popup/popup.css.map rename to src/frontend/src/components/MapComponent/OpenLayersComponent/Popup/popup.css.map diff --git a/src/frontend/main/src/components/MapComponent/OpenLayersComponent/Popup/popup.scss b/src/frontend/src/components/MapComponent/OpenLayersComponent/Popup/popup.scss similarity index 91% rename from src/frontend/main/src/components/MapComponent/OpenLayersComponent/Popup/popup.scss rename to src/frontend/src/components/MapComponent/OpenLayersComponent/Popup/popup.scss index 2890e1b352..1e8ca3f0d8 100644 --- a/src/frontend/main/src/components/MapComponent/OpenLayersComponent/Popup/popup.scss +++ b/src/frontend/src/components/MapComponent/OpenLayersComponent/Popup/popup.scss @@ -4,7 +4,7 @@ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); // padding: 15px; border-radius: 20px; - border: 1px solid #BDBDBD; + border: 1px solid #bdbdbd; min-height: fit-content; // top: 6px; margin-top: 12px; diff --git a/src/frontend/main/src/components/MapComponent/OpenLayersComponent/helpers/getFeatureGeojson.js b/src/frontend/src/components/MapComponent/OpenLayersComponent/helpers/getFeatureGeojson.js similarity index 100% rename from src/frontend/main/src/components/MapComponent/OpenLayersComponent/helpers/getFeatureGeojson.js rename to src/frontend/src/components/MapComponent/OpenLayersComponent/helpers/getFeatureGeojson.js diff --git a/src/frontend/main/src/components/MapComponent/OpenLayersComponent/helpers/layerUtils.js b/src/frontend/src/components/MapComponent/OpenLayersComponent/helpers/layerUtils.js similarity index 100% rename from src/frontend/main/src/components/MapComponent/OpenLayersComponent/helpers/layerUtils.js rename to src/frontend/src/components/MapComponent/OpenLayersComponent/helpers/layerUtils.js diff --git a/src/frontend/main/src/components/MapComponent/OpenLayersComponent/helpers/styleUtils.js b/src/frontend/src/components/MapComponent/OpenLayersComponent/helpers/styleUtils.js similarity index 100% rename from src/frontend/main/src/components/MapComponent/OpenLayersComponent/helpers/styleUtils.js rename to src/frontend/src/components/MapComponent/OpenLayersComponent/helpers/styleUtils.js diff --git a/src/frontend/main/src/components/MapComponent/OpenLayersComponent/index.js b/src/frontend/src/components/MapComponent/OpenLayersComponent/index.js similarity index 100% rename from src/frontend/main/src/components/MapComponent/OpenLayersComponent/index.js rename to src/frontend/src/components/MapComponent/OpenLayersComponent/index.js diff --git a/src/frontend/main/src/components/MapComponent/OpenLayersComponent/map.css b/src/frontend/src/components/MapComponent/OpenLayersComponent/map.css similarity index 90% rename from src/frontend/main/src/components/MapComponent/OpenLayersComponent/map.css rename to src/frontend/src/components/MapComponent/OpenLayersComponent/map.css index d84aeb99db..a1fcd582f9 100644 --- a/src/frontend/main/src/components/MapComponent/OpenLayersComponent/map.css +++ b/src/frontend/src/components/MapComponent/OpenLayersComponent/map.css @@ -86,12 +86,12 @@ border-radius: 5px !important; } .layer-switcher button::before { - font-family: "Material Icons"; - content: "layers"; + font-family: 'Material Icons'; + content: 'layers'; position: relative; top: -3px; } .ol-attribution { display: none !important; -}/*# sourceMappingURL=map.css.map */ \ No newline at end of file +} /*# sourceMappingURL=map.css.map */ diff --git a/src/frontend/src/components/MapComponent/OpenLayersComponent/map.scss b/src/frontend/src/components/MapComponent/OpenLayersComponent/map.scss new file mode 100644 index 0000000000..8f38f9f611 --- /dev/null +++ b/src/frontend/src/components/MapComponent/OpenLayersComponent/map.scss @@ -0,0 +1,15 @@ +@keyframes blink { + 0% { + opacity: 1; + } + 50% { + opacity: 0; + } + 100% { + opacity: 1; + } +} + +.blink { + animation: blink 1s infinite; +} diff --git a/src/frontend/main/src/components/MapComponent/OpenLayersComponent/useOLMap/index.js b/src/frontend/src/components/MapComponent/OpenLayersComponent/useOLMap/index.js similarity index 92% rename from src/frontend/main/src/components/MapComponent/OpenLayersComponent/useOLMap/index.js rename to src/frontend/src/components/MapComponent/OpenLayersComponent/useOLMap/index.js index 487a5b80c8..8881769ee8 100644 --- a/src/frontend/main/src/components/MapComponent/OpenLayersComponent/useOLMap/index.js +++ b/src/frontend/src/components/MapComponent/OpenLayersComponent/useOLMap/index.js @@ -1,5 +1,5 @@ /* eslint-disable consistent-return */ -import React,{ useRef, useState, useEffect } from 'react'; +import React, { useRef, useState, useEffect } from 'react'; import Map from 'ol/Map'; import { View } from 'ol'; import * as olExtent from 'ol/extent'; diff --git a/src/frontend/main/src/components/MapDescriptionComponents.jsx b/src/frontend/src/components/MapDescriptionComponents.jsx similarity index 100% rename from src/frontend/main/src/components/MapDescriptionComponents.jsx rename to src/frontend/src/components/MapDescriptionComponents.jsx diff --git a/src/frontend/src/components/MapLegends.jsx b/src/frontend/src/components/MapLegends.jsx new file mode 100755 index 0000000000..8777d7fc53 --- /dev/null +++ b/src/frontend/src/components/MapLegends.jsx @@ -0,0 +1,68 @@ +import React from 'react'; +import CoreModules from 'fmtm/CoreModules'; +import AssetModules from 'fmtm/AssetModules'; + +const MapLegends = ({ direction, spacing, iconBtnProps, defaultTheme, valueStatus }) => { + const MapDetails = [ + { + value: 'Ready', + color: defaultTheme.palette.mapFeatureColors.ready, + status: 'none', + }, + { + value: 'Locked For Mapping', + color: defaultTheme.palette.mapFeatureColors.locked_for_mapping, + status: 'lock', + }, + { + value: 'Locked For Validation', + color: defaultTheme.palette.mapFeatureColors.locked_for_validation, + status: 'lock', + }, + { + value: 'Ready For Validation', + color: defaultTheme.palette.mapFeatureColors.mapped, + status: 'none', + }, + { + value: 'Validated', + color: defaultTheme.palette.mapFeatureColors.validated, + status: 'none', + }, + { + value: 'Bad', + color: defaultTheme.palette.mapFeatureColors.bad, + status: 'none', + }, + { + value: 'More mapping needed', + color: defaultTheme.palette.mapFeatureColors.invalidated, + status: 'none', + }, + ]; + return ( + + {MapDetails.map((data, index) => { + return ( + + + + + {valueStatus && ( + + {data.value} + + )} + + ); + })} + + ); +}; + +export default MapLegends; diff --git a/src/frontend/main/src/components/OpenLayersMap.jsx b/src/frontend/src/components/OpenLayersMap.jsx similarity index 100% rename from src/frontend/main/src/components/OpenLayersMap.jsx rename to src/frontend/src/components/OpenLayersMap.jsx diff --git a/src/frontend/main/src/components/ProjectInfo/ProjectCard.jsx b/src/frontend/src/components/ProjectInfo/ProjectCard.jsx similarity index 100% rename from src/frontend/main/src/components/ProjectInfo/ProjectCard.jsx rename to src/frontend/src/components/ProjectInfo/ProjectCard.jsx diff --git a/src/frontend/main/src/components/ProjectInfo/ProjectInfoCountCard.jsx b/src/frontend/src/components/ProjectInfo/ProjectInfoCountCard.jsx similarity index 100% rename from src/frontend/main/src/components/ProjectInfo/ProjectInfoCountCard.jsx rename to src/frontend/src/components/ProjectInfo/ProjectInfoCountCard.jsx diff --git a/src/frontend/main/src/components/ProjectInfo/ProjectInfoCountCardSkeleton.jsx b/src/frontend/src/components/ProjectInfo/ProjectInfoCountCardSkeleton.jsx similarity index 100% rename from src/frontend/main/src/components/ProjectInfo/ProjectInfoCountCardSkeleton.jsx rename to src/frontend/src/components/ProjectInfo/ProjectInfoCountCardSkeleton.jsx diff --git a/src/frontend/main/src/components/ProjectInfo/ProjectInfoSidebar.jsx b/src/frontend/src/components/ProjectInfo/ProjectInfoSidebar.jsx similarity index 100% rename from src/frontend/main/src/components/ProjectInfo/ProjectInfoSidebar.jsx rename to src/frontend/src/components/ProjectInfo/ProjectInfoSidebar.jsx diff --git a/src/frontend/main/src/components/ProjectInfo/ProjectInfoSidebarSkeleton.jsx b/src/frontend/src/components/ProjectInfo/ProjectInfoSidebarSkeleton.jsx similarity index 100% rename from src/frontend/main/src/components/ProjectInfo/ProjectInfoSidebarSkeleton.jsx rename to src/frontend/src/components/ProjectInfo/ProjectInfoSidebarSkeleton.jsx diff --git a/src/frontend/main/src/components/ProjectInfo/ProjectInfomap.jsx b/src/frontend/src/components/ProjectInfo/ProjectInfomap.jsx similarity index 100% rename from src/frontend/main/src/components/ProjectInfo/ProjectInfomap.jsx rename to src/frontend/src/components/ProjectInfo/ProjectInfomap.jsx diff --git a/src/frontend/main/src/components/ProjectMap/ProjectMap.jsx b/src/frontend/src/components/ProjectMap/ProjectMap.jsx similarity index 70% rename from src/frontend/main/src/components/ProjectMap/ProjectMap.jsx rename to src/frontend/src/components/ProjectMap/ProjectMap.jsx index 77585d180a..cf6ae604b7 100644 --- a/src/frontend/main/src/components/ProjectMap/ProjectMap.jsx +++ b/src/frontend/src/components/ProjectMap/ProjectMap.jsx @@ -1,30 +1,24 @@ -import React, { useState } from "react"; -import CoreModules from "fmtm/CoreModules"; -import { useOLMap } from "../MapComponent/OpenLayersComponent"; -import { MapContainer as MapComponent } from "../MapComponent/OpenLayersComponent"; -import LayerSwitcherControl from "../MapComponent/OpenLayersComponent/LayerSwitcher/index.js"; -import { VectorLayer } from "../MapComponent/OpenLayersComponent/Layers"; +import React, { useState } from 'react'; +import CoreModules from 'fmtm/CoreModules'; +import { useOLMap } from '../MapComponent/OpenLayersComponent'; +import { MapContainer as MapComponent } from '../MapComponent/OpenLayersComponent'; +import LayerSwitcherControl from '../MapComponent/OpenLayersComponent/LayerSwitcher/index.js'; +import { VectorLayer } from '../MapComponent/OpenLayersComponent/Layers'; const basicGeojsonTemplate = { - type: "FeatureCollection", + type: 'FeatureCollection', features: [], }; const ProjectMap = ({}) => { - const defaultTheme = CoreModules.useAppSelector( - (state) => state.theme.hotTheme - ); + const defaultTheme = CoreModules.useAppSelector((state) => state.theme.hotTheme); const { mapRef, map } = useOLMap({ // center: fromLonLat([85.3, 27.7]), center: [0, 0], zoom: 4, maxZoom: 25, }); - const projectTaskBoundries = CoreModules.useAppSelector( - (state) => state.project.projectTaskBoundries - ); - const projectBuildingGeojson = CoreModules.useAppSelector( - (state) => state.project.projectBuildingGeojson - ); + const projectTaskBoundries = CoreModules.useAppSelector((state) => state.project.projectTaskBoundries); + const projectBuildingGeojson = CoreModules.useAppSelector((state) => state.project.projectBuildingGeojson); const [projectBoundaries, setProjectBoundaries] = useState(null); const [buildingBoundaries, setBuildingBoundaries] = useState(null); @@ -55,20 +49,20 @@ const ProjectMap = ({}) => { setBuildingBoundaries(buildingGeojsonFeatureCollection); } return ( - + -
+
@@ -96,9 +90,7 @@ const ProjectMap = ({}) => { zIndex={5} /> )} - {buildingBoundaries?.type && ( - - )} + {buildingBoundaries?.type && } {/* )} */}
diff --git a/src/frontend/main/src/components/QrcodeComponent.jsx b/src/frontend/src/components/QrcodeComponent.jsx similarity index 100% rename from src/frontend/main/src/components/QrcodeComponent.jsx rename to src/frontend/src/components/QrcodeComponent.jsx diff --git a/src/frontend/main/src/components/SubmissionMap/SubmissionMap.jsx b/src/frontend/src/components/SubmissionMap/SubmissionMap.jsx similarity index 100% rename from src/frontend/main/src/components/SubmissionMap/SubmissionMap.jsx rename to src/frontend/src/components/SubmissionMap/SubmissionMap.jsx diff --git a/src/frontend/main/src/components/TasksLayer.jsx b/src/frontend/src/components/TasksLayer.jsx similarity index 100% rename from src/frontend/main/src/components/TasksLayer.jsx rename to src/frontend/src/components/TasksLayer.jsx diff --git a/src/frontend/main/src/components/TasksMap/TasksMap.jsx b/src/frontend/src/components/TasksMap/TasksMap.jsx similarity index 71% rename from src/frontend/main/src/components/TasksMap/TasksMap.jsx rename to src/frontend/src/components/TasksMap/TasksMap.jsx index 0f7e0b622b..78322e2f3b 100644 --- a/src/frontend/main/src/components/TasksMap/TasksMap.jsx +++ b/src/frontend/src/components/TasksMap/TasksMap.jsx @@ -1,16 +1,14 @@ -import React from "react"; -import useOLMap from "../../hooks/useOlMap"; -import { MapContainer as MapComponent } from "../MapComponent/OpenLayersComponent"; -import LayerSwitcherControl from "../MapComponent/OpenLayersComponent/LayerSwitcher/index.js"; -import { VectorLayer } from "../MapComponent/OpenLayersComponent/Layers"; +import React from 'react'; +import useOLMap from '../../hooks/useOlMap'; +import { MapContainer as MapComponent } from '../MapComponent/OpenLayersComponent'; +import LayerSwitcherControl from '../MapComponent/OpenLayersComponent/LayerSwitcher/index.js'; +import { VectorLayer } from '../MapComponent/OpenLayersComponent/Layers'; function elastic(t) { - return ( - Math.pow(2, -10 * t) * Math.sin(((t - 0.075) * (2 * Math.PI)) / 0.3) + 1 - ); + return Math.pow(2, -10 * t) * Math.sin(((t - 0.075) * (2 * Math.PI)) / 0.3) + 1; } const basicGeojsonTemplate = { - type: "FeatureCollection", + type: 'FeatureCollection', features: [], }; const TasksMap = ({ projectTaskBoundries, projectBuildingGeojson }) => { @@ -23,17 +21,17 @@ const TasksMap = ({ projectTaskBoundries, projectBuildingGeojson }) => { zoom: 4, maxZoom: 25, }); - console.log(projectTaskBoundries, "projectTaskBoundries"); + console.log(projectTaskBoundries, 'projectTaskBoundries'); return ( -
+
diff --git a/src/frontend/src/components/common/Button.tsx b/src/frontend/src/components/common/Button.tsx new file mode 100644 index 0000000000..cbe8cbc2f1 --- /dev/null +++ b/src/frontend/src/components/common/Button.tsx @@ -0,0 +1,47 @@ +import React from 'react'; + +interface IButton { + btnText: string; + btnType: 'primary' | 'secondary' | 'other'; + type: 'submit' | 'button'; + onClick?: (event: React.MouseEvent) => void; + className?: string; + count?: number; + dataTip?: string; + icon?: React.ReactNode; +} + +const btnStyle = (btnType, className) => { + switch (btnType) { + case 'primary': + return `${className} hover:fmtm-bg-red-700 fmtm-flex fmtm-px-4 fmtm-py-1 fmtm-bg-primaryRed fmtm-text-white fmtm-rounded-[8px] fmtm-w-full`; + case 'secondary': + return `hover:fmtm-bg-gray-100 fmtm-flex fmtm-bg-white fmtm-px-4 fmtm-py-1 fmtm-border border-[#E0E0E0] fmtm-rounded-[8px] ${className}`; + + case 'other': + return `fmtm-py-1 fmtm-px-5 fmtm-bg-red-500 fmtm-text-white fmtm-rounded-lg hover:fmtm-bg-red-600`; + + default: + return 'fmtm-primary'; + } +}; +const Button = ({ btnText, btnType, type, onClick, className, count, dataTip, icon }: IButton) => ( +
+ +
+); + +export default Button; diff --git a/src/frontend/src/components/common/InputTextField.tsx b/src/frontend/src/components/common/InputTextField.tsx new file mode 100644 index 0000000000..c029d6edb9 --- /dev/null +++ b/src/frontend/src/components/common/InputTextField.tsx @@ -0,0 +1,74 @@ +/* eslint-disable react/no-unstable-nested-components */ +import React from 'react'; +// import PropTypes from 'prop-types'; +export const blockInvalidChar = (e) => ['e', 'E', '+', '-'].includes(e.key) && e.preventDefault(); + +interface IInputTextFieldProps { + id?: string; + label: string; + onChange: (event: React.ChangeEvent) => void; + onKeyDown?: (event: React.KeyboardEvent) => void; + errorMsg?: string; + value: string; + placeholder?: string; + fieldType: string; + name?: string; + flag?: string; + classNames?: string; + maxRange?: string; + minRange?: string; + maxLength?: number; + disabled?: boolean; + required?: boolean; +} + +function InputTextField({ + id, + label, + onChange, + onKeyDown, + errorMsg, + value, + placeholder, + fieldType, + name, + flag, + classNames, + maxRange, + minRange, + maxLength, + disabled, + required, +}: IInputTextFieldProps) { + return ( +
+
+

{label}

+ {required &&

*

} +
+
+ +
+ {errorMsg &&

{errorMsg}

} +
+ ); +} + +export default InputTextField; diff --git a/src/frontend/src/components/common/RadioButton.tsx b/src/frontend/src/components/common/RadioButton.tsx new file mode 100644 index 0000000000..7bf3f6a207 --- /dev/null +++ b/src/frontend/src/components/common/RadioButton.tsx @@ -0,0 +1,43 @@ +import React from 'react'; + +interface IRadioButton { + name: string; + value: string; + label: string | number; + icon?: React.ReactNode; +} + +interface RadioButtonProps { + topic?: string; + options: IRadioButton[]; + direction: 'row' | 'column'; + onChangeData: (value: string) => void; +} + +const RadioButton: React.FC = ({ topic, options, direction, onChangeData }) => ( +
+
+

{topic}

+
+
+ {options.map((option) => { + return ( +
+ onChangeData(e.target.value)} + /> +

{option.label}

+ {option.icon && option.icon} +
+ ); + })} +
+
+); + +export default RadioButton; diff --git a/src/frontend/src/components/common/Select.tsx b/src/frontend/src/components/common/Select.tsx new file mode 100644 index 0000000000..b76f343b30 --- /dev/null +++ b/src/frontend/src/components/common/Select.tsx @@ -0,0 +1,110 @@ +import * as React from 'react'; +import * as SelectPrimitive from '@radix-ui/react-select'; +import { Check, ChevronDown } from 'lucide-react'; + +import { cn } from '../../utilfunctions/shadcn'; + +const Select = SelectPrimitive.Root; + +const SelectGroup = SelectPrimitive.Group; + +const SelectValue = SelectPrimitive.Value; + +const SelectTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + {children} + + + + +)); +SelectTrigger.displayName = SelectPrimitive.Trigger.displayName; + +const SelectContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, position = 'popper', ...props }, ref) => ( + + + + {children} + + + +)); +SelectContent.displayName = SelectPrimitive.Content.displayName; + +const SelectLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +SelectLabel.displayName = SelectPrimitive.Label.displayName; + +const SelectItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + + {children} + +)); +SelectItem.displayName = SelectPrimitive.Item.displayName; + +const SelectSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +SelectSeparator.displayName = SelectPrimitive.Separator.displayName; + +export { Select, SelectGroup, SelectValue, SelectTrigger, SelectContent, SelectLabel, SelectItem, SelectSeparator }; diff --git a/src/frontend/src/components/common/StepSwitcher.tsx b/src/frontend/src/components/common/StepSwitcher.tsx new file mode 100644 index 0000000000..0d1fd1626a --- /dev/null +++ b/src/frontend/src/components/common/StepSwitcher.tsx @@ -0,0 +1,65 @@ +import React from 'react'; +import AssetModules from '../../shared/AssetModules.js'; +import { CommonActions } from '../../store/slices/CommonSlice'; +import CoreModules from '../../shared/CoreModules.js'; +import { useNavigate } from 'react-router-dom'; + +const StepSwitcher = ({ data, flag }) => { + interface IIndividualStep { + url: string; + step: number; + label: string; + name: string; + } + + const dispatch = CoreModules.useAppDispatch(); + const navigate = useNavigate(); + const currentStep = CoreModules.useAppSelector((state) => state.common.currentStepFormStep[flag]); + + const toggleStep = (step: IIndividualStep) => { + dispatch(CommonActions.SetCurrentStepFormStep({ flag: flag, step: step.step })); + navigate(step.url); + }; + return ( +
+ {data?.map((step: IIndividualStep, i = 1) => { + const index = i + 1; + return ( +
+
+
+
+

{step.label}

+

{step.name}

+
+
+
= index ? 'fmtm-bg-primaryRed' : 'fmtm-bg-transparent' + }`} + onClick={() => toggleStep(step)} + > + = index ? 'fmtm-text-white' : 'fmtm-text-primaryRed' + } lg:fmtm-text-lg xl:fmtm-text-xl`} + /> +
+ {data?.length > index && ( +
= index ? 'fmtm-border-solid' : 'fmtm-border-dashed' + }`} + >
+ )} +
+
+
+
+ ); + })} +
+ ); +}; + +export default StepSwitcher; diff --git a/src/frontend/main/src/components/common/Switch.tsx b/src/frontend/src/components/common/Switch.tsx similarity index 100% rename from src/frontend/main/src/components/common/Switch.tsx rename to src/frontend/src/components/common/Switch.tsx diff --git a/src/frontend/src/components/common/TextArea.tsx b/src/frontend/src/components/common/TextArea.tsx new file mode 100644 index 0000000000..b65fa21170 --- /dev/null +++ b/src/frontend/src/components/common/TextArea.tsx @@ -0,0 +1,61 @@ +/* eslint-disable react/no-unstable-nested-components */ +import React from 'react'; + +interface IInputTextFieldProps { + id?: string; + label: string; + rows: number; + onChange: (event: React.ChangeEvent) => void; + errorMsg?: string; + value: string; + placeholder?: string; + name?: string; + classNames?: string; + maxLength?: number; + disabled?: boolean; + required?: boolean; +} + +function TextArea({ + id, + label, + rows, + onChange, + errorMsg, + value, + placeholder, + name, + classNames, + maxLength, + disabled, + required, +}: IInputTextFieldProps) { + return ( +
+
+

{label}

+ {required &&

*

} +
+
+