From 8267f625c4d52303a0827fcfd71ccea0bed0e26e Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Mon, 24 Jul 2023 16:50:04 +0200 Subject: [PATCH 01/98] Setup unit tests folder structure --- openbb_sdk/extensions/charting/tests/.gitkeep | 0 openbb_sdk/extensions/crypto/tests/.gitkeep | 0 openbb_sdk/extensions/economy/tests/.gitkeep | 0 openbb_sdk/extensions/fixedincome/tests/.gitkeep | 0 openbb_sdk/extensions/forex/tests/.gitkeep | 0 openbb_sdk/extensions/news/tests/.gitkeep | 0 openbb_sdk/extensions/qa/tests/.gitkeep | 0 openbb_sdk/extensions/stocks/tests/.gitkeep | 0 openbb_sdk/extensions/ta/tests/.gitkeep | 0 openbb_sdk/providers/benzinga/tests/.gitkeep | 0 openbb_sdk/providers/fmp/tests/.gitkeep | 0 openbb_sdk/providers/fred/tests/.gitkeep | 0 openbb_sdk/providers/polygon/tests/.gitkeep | 0 openbb_sdk/sdk/core/tests/.gitkeep | 0 openbb_sdk/sdk/provider/tests/.gitkeep | 0 15 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 openbb_sdk/extensions/charting/tests/.gitkeep create mode 100644 openbb_sdk/extensions/crypto/tests/.gitkeep create mode 100644 openbb_sdk/extensions/economy/tests/.gitkeep create mode 100644 openbb_sdk/extensions/fixedincome/tests/.gitkeep create mode 100644 openbb_sdk/extensions/forex/tests/.gitkeep create mode 100644 openbb_sdk/extensions/news/tests/.gitkeep create mode 100644 openbb_sdk/extensions/qa/tests/.gitkeep create mode 100644 openbb_sdk/extensions/stocks/tests/.gitkeep create mode 100644 openbb_sdk/extensions/ta/tests/.gitkeep create mode 100644 openbb_sdk/providers/benzinga/tests/.gitkeep create mode 100644 openbb_sdk/providers/fmp/tests/.gitkeep create mode 100644 openbb_sdk/providers/fred/tests/.gitkeep create mode 100644 openbb_sdk/providers/polygon/tests/.gitkeep create mode 100644 openbb_sdk/sdk/core/tests/.gitkeep create mode 100644 openbb_sdk/sdk/provider/tests/.gitkeep diff --git a/openbb_sdk/extensions/charting/tests/.gitkeep b/openbb_sdk/extensions/charting/tests/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/extensions/crypto/tests/.gitkeep b/openbb_sdk/extensions/crypto/tests/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/extensions/economy/tests/.gitkeep b/openbb_sdk/extensions/economy/tests/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/extensions/fixedincome/tests/.gitkeep b/openbb_sdk/extensions/fixedincome/tests/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/extensions/forex/tests/.gitkeep b/openbb_sdk/extensions/forex/tests/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/extensions/news/tests/.gitkeep b/openbb_sdk/extensions/news/tests/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/extensions/qa/tests/.gitkeep b/openbb_sdk/extensions/qa/tests/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/extensions/stocks/tests/.gitkeep b/openbb_sdk/extensions/stocks/tests/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/extensions/ta/tests/.gitkeep b/openbb_sdk/extensions/ta/tests/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/providers/benzinga/tests/.gitkeep b/openbb_sdk/providers/benzinga/tests/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/providers/fmp/tests/.gitkeep b/openbb_sdk/providers/fmp/tests/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/providers/fred/tests/.gitkeep b/openbb_sdk/providers/fred/tests/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/providers/polygon/tests/.gitkeep b/openbb_sdk/providers/polygon/tests/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/sdk/core/tests/.gitkeep b/openbb_sdk/sdk/core/tests/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/sdk/provider/tests/.gitkeep b/openbb_sdk/sdk/provider/tests/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d From a0e9426b0098a5f4e3ae6e41a30b31cc02260e02 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Mon, 24 Jul 2023 16:55:53 +0200 Subject: [PATCH 02/98] Add confest --- openbb_sdk/tests/conftest.py | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 openbb_sdk/tests/conftest.py diff --git a/openbb_sdk/tests/conftest.py b/openbb_sdk/tests/conftest.py new file mode 100644 index 00000000000..9e6ec5e1b07 --- /dev/null +++ b/openbb_sdk/tests/conftest.py @@ -0,0 +1,2 @@ +# TODO: See if we can dynamically import the test modules under the openbb_sdk +# file structure. From fb9572c296c112ff0689922da3c35ab30fd3ce2d Mon Sep 17 00:00:00 2001 From: montezdesousa <79287829+montezdesousa@users.noreply.github.com> Date: Mon, 24 Jul 2023 17:04:53 +0100 Subject: [PATCH 03/98] Change providers folder structure (#5246) * refactored benzinga provider directory * refactored fmp provider directory * refactor fred provider directory * added polygon provider directory * replace fmp .helpers * fix bad replace * redirect imports * remove standard import comment * remove internal import comment * ruff * remove third-party import comment * fix fred bad import * ruff * codespell --------- Co-authored-by: Pratyush Shukla --- .../openbb_benzinga/models/__init__.py | 0 .../{ => models}/global_news.py | 7 +- .../{ => models}/stock_news.py | 7 +- .../benzinga/openbb_benzinga/provider.py | 8 +- .../openbb_benzinga/utils/__init__.py | 0 .../openbb_benzinga/{ => utils}/helpers.py | 5 +- .../fmp/openbb_fmp/models/__init__.py | 0 .../{ => models}/analyst_estimates.py | 7 +- .../{ => models}/available_indices.py | 5 +- .../openbb_fmp/{ => models}/balance_sheet.py | 7 +- .../fmp/openbb_fmp/{ => models}/cash_flow.py | 7 +- .../{ => models}/company_profile.py | 9 +- .../fmp/openbb_fmp/{ => models}/crypto_eod.py | 7 +- .../openbb_fmp/{ => models}/crypto_price.py | 7 +- .../{ => models}/dividend_calendar.py | 8 +- .../{ => models}/earnings_calendar.py | 7 +- .../{ => models}/earnings_call_transcript.py | 7 +- .../{ => models}/esg_risk_rating.py | 6 +- .../fmp/openbb_fmp/{ => models}/esg_score.py | 6 +- .../fmp/openbb_fmp/{ => models}/esg_sector.py | 6 +- .../{ => models}/executive_compensation.py | 8 +- .../fmp/openbb_fmp/{ => models}/executives.py | 6 +- .../fmp/openbb_fmp/{ => models}/forex_eod.py | 7 +- .../openbb_fmp/{ => models}/forex_pairs.py | 5 +- .../openbb_fmp/{ => models}/forex_price.py | 7 +- .../openbb_fmp/{ => models}/global_news.py | 7 +- .../{ => models}/historical_dividends.py | 8 +- .../{ => models}/historical_employees.py | 8 +- .../{ => models}/historical_stock_splits.py | 7 +- .../{ => models}/income_statement.py | 7 +- .../{ => models}/institutional_ownership.py | 7 +- .../openbb_fmp/{ => models}/key_metrics.py | 7 +- .../major_indices_constituents.py | 7 +- .../{ => models}/major_indices_eod.py | 7 +- .../{ => models}/major_indices_price.py | 7 +- .../openbb_fmp/{ => models}/price_target.py | 8 +- .../{ => models}/price_target_consensus.py | 7 +- .../{ => models}/revenue_business_line.py | 8 +- .../{ => models}/revenue_geographic.py | 8 +- .../openbb_fmp/{ => models}/risk_premium.py | 5 +- .../openbb_fmp/{ => models}/sec_filings.py | 6 +- .../{ => models}/share_statistics.py | 7 +- .../fmp/openbb_fmp/{ => models}/stock_eod.py | 7 +- .../{ => models}/stock_insider_trading.py | 7 +- .../{ => models}/stock_multiples.py | 7 +- .../fmp/openbb_fmp/{ => models}/stock_news.py | 7 +- .../{ => models}/stock_ownership.py | 7 +- .../openbb_fmp/{ => models}/stock_peers.py | 6 +- .../openbb_fmp/{ => models}/stock_price.py | 7 +- .../openbb_fmp/{ => models}/stock_splits.py | 7 +- .../openbb_fmp/{ => models}/treasury_rates.py | 7 +- .../providers/fmp/openbb_fmp/provider.py | 94 ++++--- .../fmp/openbb_fmp/utils/__init__.py | 0 .../fmp/openbb_fmp/{ => utils}/helpers.py | 11 +- .../fred/openbb_fred/{ => models}/cpi.py | 10 +- .../providers/fred/openbb_fred/provider.py | 6 +- .../providers/fred/openbb_fred/utils/cpi.csv | 256 ++++++++++++++++++ .../fred/openbb_fred/{ => utils}/fred_base.py | 4 - .../openbb_fred/{ => utils}/fred_helpers.py | 21 +- .../fred/openbb_fred/utils/harmonized_cpi.csv | 137 ++++++++++ .../polygon/openbb_polygon/models/__init__.py | 0 .../{ => models}/balance_sheet.py | 8 +- .../openbb_polygon/{ => models}/cash_flow.py | 8 +- .../openbb_polygon/{ => models}/crypto_eod.py | 10 +- .../{ => models}/crypto_price.py | 10 +- .../openbb_polygon/{ => models}/forex_eod.py | 9 +- .../{ => models}/forex_price.py | 10 +- .../{ => models}/income_statement.py | 8 +- .../{ => models}/major_indices_eod.py | 9 +- .../{ => models}/major_indices_price.py | 9 +- .../openbb_polygon/{ => models}/stock_eod.py | 10 +- .../openbb_polygon/{ => models}/stock_news.py | 7 +- .../{ => models}/stock_price.py | 10 +- .../polygon/openbb_polygon/provider.py | 28 +- .../polygon/openbb_polygon/utils/__init__.py | 0 .../openbb_polygon/{ => utils}/helpers.py | 5 - .../openbb_polygon/{ => utils}/types.py | 5 +- openbb_sdk/sdk/core/README.md | 2 +- .../provider/openbb_provider/models/cpi.py | 2 +- 79 files changed, 594 insertions(+), 427 deletions(-) create mode 100644 openbb_sdk/providers/benzinga/openbb_benzinga/models/__init__.py rename openbb_sdk/providers/benzinga/openbb_benzinga/{ => models}/global_news.py (96%) rename openbb_sdk/providers/benzinga/openbb_benzinga/{ => models}/stock_news.py (96%) create mode 100644 openbb_sdk/providers/benzinga/openbb_benzinga/utils/__init__.py rename openbb_sdk/providers/benzinga/openbb_benzinga/{ => utils}/helpers.py (94%) create mode 100644 openbb_sdk/providers/fmp/openbb_fmp/models/__init__.py rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/analyst_estimates.py (96%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/available_indices.py (96%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/balance_sheet.py (97%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/cash_flow.py (97%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/company_profile.py (96%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/crypto_eod.py (97%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/crypto_price.py (94%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/dividend_calendar.py (96%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/earnings_calendar.py (95%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/earnings_call_transcript.py (95%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/esg_risk_rating.py (95%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/esg_score.py (94%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/esg_sector.py (94%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/executive_compensation.py (96%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/executives.py (97%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/forex_eod.py (95%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/forex_pairs.py (95%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/forex_price.py (94%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/global_news.py (94%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/historical_dividends.py (96%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/historical_employees.py (96%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/historical_stock_splits.py (94%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/income_statement.py (97%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/institutional_ownership.py (97%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/key_metrics.py (97%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/major_indices_constituents.py (96%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/major_indices_eod.py (97%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/major_indices_price.py (94%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/price_target.py (94%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/price_target_consensus.py (95%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/revenue_business_line.py (96%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/revenue_geographic.py (97%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/risk_premium.py (94%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/sec_filings.py (95%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/share_statistics.py (95%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/stock_eod.py (97%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/stock_insider_trading.py (97%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/stock_multiples.py (98%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/stock_news.py (95%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/stock_ownership.py (94%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/stock_peers.py (94%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/stock_price.py (94%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/stock_splits.py (95%) rename openbb_sdk/providers/fmp/openbb_fmp/{ => models}/treasury_rates.py (96%) create mode 100644 openbb_sdk/providers/fmp/openbb_fmp/utils/__init__.py rename openbb_sdk/providers/fmp/openbb_fmp/{ => utils}/helpers.py (96%) rename openbb_sdk/providers/fred/openbb_fred/{ => models}/cpi.py (94%) create mode 100644 openbb_sdk/providers/fred/openbb_fred/utils/cpi.csv rename openbb_sdk/providers/fred/openbb_fred/{ => utils}/fred_base.py (97%) rename openbb_sdk/providers/fred/openbb_fred/{ => utils}/fred_helpers.py (77%) create mode 100644 openbb_sdk/providers/fred/openbb_fred/utils/harmonized_cpi.csv create mode 100644 openbb_sdk/providers/polygon/openbb_polygon/models/__init__.py rename openbb_sdk/providers/polygon/openbb_polygon/{ => models}/balance_sheet.py (95%) rename openbb_sdk/providers/polygon/openbb_polygon/{ => models}/cash_flow.py (96%) rename openbb_sdk/providers/polygon/openbb_polygon/{ => models}/crypto_eod.py (95%) rename openbb_sdk/providers/polygon/openbb_polygon/{ => models}/crypto_price.py (94%) rename openbb_sdk/providers/polygon/openbb_polygon/{ => models}/forex_eod.py (95%) rename openbb_sdk/providers/polygon/openbb_polygon/{ => models}/forex_price.py (94%) rename openbb_sdk/providers/polygon/openbb_polygon/{ => models}/income_statement.py (97%) rename openbb_sdk/providers/polygon/openbb_polygon/{ => models}/major_indices_eod.py (94%) rename openbb_sdk/providers/polygon/openbb_polygon/{ => models}/major_indices_price.py (95%) rename openbb_sdk/providers/polygon/openbb_polygon/{ => models}/stock_eod.py (94%) rename openbb_sdk/providers/polygon/openbb_polygon/{ => models}/stock_news.py (97%) rename openbb_sdk/providers/polygon/openbb_polygon/{ => models}/stock_price.py (94%) create mode 100644 openbb_sdk/providers/polygon/openbb_polygon/utils/__init__.py rename openbb_sdk/providers/polygon/openbb_polygon/{ => utils}/helpers.py (90%) rename openbb_sdk/providers/polygon/openbb_polygon/{ => utils}/types.py (98%) diff --git a/openbb_sdk/providers/benzinga/openbb_benzinga/models/__init__.py b/openbb_sdk/providers/benzinga/openbb_benzinga/models/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/providers/benzinga/openbb_benzinga/global_news.py b/openbb_sdk/providers/benzinga/openbb_benzinga/models/global_news.py similarity index 96% rename from openbb_sdk/providers/benzinga/openbb_benzinga/global_news.py rename to openbb_sdk/providers/benzinga/openbb_benzinga/models/global_news.py index 6989e0ab0ad..4be137d912a 100644 --- a/openbb_sdk/providers/benzinga/openbb_benzinga/global_news.py +++ b/openbb_sdk/providers/benzinga/openbb_benzinga/models/global_news.py @@ -1,19 +1,16 @@ """Benzinga Global News Fetcher.""" -# IMPORT STANDARD + from datetime import datetime from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer, get_querystring from openbb_provider.models.global_news import GlobalNewsData, GlobalNewsQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field -from openbb_benzinga.helpers import BenzingaBaseNewsData, get_data +from openbb_benzinga.utils.helpers import BenzingaBaseNewsData, get_data class BenzingaGlobalNewsQueryParams(QueryParams): diff --git a/openbb_sdk/providers/benzinga/openbb_benzinga/stock_news.py b/openbb_sdk/providers/benzinga/openbb_benzinga/models/stock_news.py similarity index 96% rename from openbb_sdk/providers/benzinga/openbb_benzinga/stock_news.py rename to openbb_sdk/providers/benzinga/openbb_benzinga/models/stock_news.py index 67c550c7709..af6a81dfa75 100644 --- a/openbb_sdk/providers/benzinga/openbb_benzinga/stock_news.py +++ b/openbb_sdk/providers/benzinga/openbb_benzinga/models/stock_news.py @@ -1,19 +1,16 @@ """Benzinga Stock News Fetcher.""" -# IMPORT STANDARD + from datetime import datetime from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer, get_querystring from openbb_provider.models.stock_news import StockNewsData, StockNewsQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field -from openbb_benzinga.helpers import BenzingaBaseNewsData, get_data +from openbb_benzinga.utils.helpers import BenzingaBaseNewsData, get_data class BenzingaStockNewsQueryParams(QueryParams): diff --git a/openbb_sdk/providers/benzinga/openbb_benzinga/provider.py b/openbb_sdk/providers/benzinga/openbb_benzinga/provider.py index 2eea97cc4a2..3f5eebce09b 100644 --- a/openbb_sdk/providers/benzinga/openbb_benzinga/provider.py +++ b/openbb_sdk/providers/benzinga/openbb_benzinga/provider.py @@ -1,14 +1,10 @@ """Benzinga provider module.""" -# IMPORT STANDARD -# IMPORT THIRD-PARTY - -# IMPORT INTERNAL from openbb_provider.abstract.provider import Provider -from openbb_benzinga.global_news import BenzingaGlobalNewsFetcher -from openbb_benzinga.stock_news import BenzingaStockNewsFetcher +from openbb_benzinga.models.global_news import BenzingaGlobalNewsFetcher +from openbb_benzinga.models.stock_news import BenzingaStockNewsFetcher # mypy: disable-error-code="list-item" diff --git a/openbb_sdk/providers/benzinga/openbb_benzinga/utils/__init__.py b/openbb_sdk/providers/benzinga/openbb_benzinga/utils/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/providers/benzinga/openbb_benzinga/helpers.py b/openbb_sdk/providers/benzinga/openbb_benzinga/utils/helpers.py similarity index 94% rename from openbb_sdk/providers/benzinga/openbb_benzinga/helpers.py rename to openbb_sdk/providers/benzinga/openbb_benzinga/utils/helpers.py index a64543e2449..1a0ff5db7ef 100644 --- a/openbb_sdk/providers/benzinga/openbb_benzinga/helpers.py +++ b/openbb_sdk/providers/benzinga/openbb_benzinga/utils/helpers.py @@ -1,13 +1,10 @@ """Benzinga Helpers.""" -# IMPORT STANDARD + from datetime import datetime from typing import List -# IMPORT THIRD-PARTY import requests - -# IMPORT INTERNAL from openbb_provider.abstract.data import Data from pydantic import BaseModel, Field, validator diff --git a/openbb_sdk/providers/fmp/openbb_fmp/models/__init__.py b/openbb_sdk/providers/fmp/openbb_fmp/models/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/providers/fmp/openbb_fmp/analyst_estimates.py b/openbb_sdk/providers/fmp/openbb_fmp/models/analyst_estimates.py similarity index 96% rename from openbb_sdk/providers/fmp/openbb_fmp/analyst_estimates.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/analyst_estimates.py index 0e8afa54123..5a4ba9523bc 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/analyst_estimates.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/analyst_estimates.py @@ -1,21 +1,18 @@ """FMP Analyst Estimates fetcher.""" -# IMPORT STANDARD + from datetime import date as dateType from typing import Dict, List, Optional from openbb_provider.abstract.data import Data from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.analyst_estimates import ( AnalystEstimatesData, AnalystEstimatesQueryParams, ) -# IMPORT THIRD-PARTY -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPAnalystEstimatesQueryParams(AnalystEstimatesQueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/available_indices.py b/openbb_sdk/providers/fmp/openbb_fmp/models/available_indices.py similarity index 96% rename from openbb_sdk/providers/fmp/openbb_fmp/available_indices.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/available_indices.py index 121826926a8..7f3c5101943 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/available_indices.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/available_indices.py @@ -1,9 +1,8 @@ """FMP Available Indices fetcher.""" -# IMPORT STANDARD + from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer @@ -13,7 +12,7 @@ from openbb_provider.models.available_indices import ( ) from pydantic import Field -from .helpers import get_data_many +from openbb_fmp.utils.helpers import get_data_many class FMPAvailableIndicesQueryParams(QueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/balance_sheet.py b/openbb_sdk/providers/fmp/openbb_fmp/models/balance_sheet.py similarity index 97% rename from openbb_sdk/providers/fmp/openbb_fmp/balance_sheet.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/balance_sheet.py index 011488d75a3..d54a7c9d217 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/balance_sheet.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/balance_sheet.py @@ -1,13 +1,12 @@ """FMP Balance Sheet Fetcher.""" -# IMPORT STANDARD + from datetime import ( date as dateType, datetime, ) from typing import Dict, List, Literal, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer @@ -15,11 +14,9 @@ from openbb_provider.models.balance_sheet import ( BalanceSheetData, BalanceSheetQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import Field, NonNegativeInt, root_validator -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPBalanceSheetQueryParams(QueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/cash_flow.py b/openbb_sdk/providers/fmp/openbb_fmp/models/cash_flow.py similarity index 97% rename from openbb_sdk/providers/fmp/openbb_fmp/cash_flow.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/cash_flow.py index 93491f9d42c..6e0dda9f7bb 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/cash_flow.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/cash_flow.py @@ -1,13 +1,12 @@ """FMP Cash Flow Statement Fetcher.""" -# IMPORT STANDARD + from datetime import ( date as dateType, datetime, ) from typing import Dict, List, Literal, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer @@ -15,11 +14,9 @@ from openbb_provider.models.cash_flows import ( CashFlowStatementData, CashFlowStatementQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import Field, NonNegativeInt, root_validator -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPCashFlowStatementQueryParams(QueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/company_profile.py b/openbb_sdk/providers/fmp/openbb_fmp/models/company_profile.py similarity index 96% rename from openbb_sdk/providers/fmp/openbb_fmp/company_profile.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/company_profile.py index f7073bbe6f4..c5f385dfcc1 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/company_profile.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/company_profile.py @@ -1,22 +1,17 @@ """FMP Company Overview Fetcher.""" -# IMPORT STANDARD + from typing import Dict, Optional from openbb_provider.abstract.data import Data from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.company_overview import ( CompanyOverviewData, CompanyOverviewQueryParams, ) -from .helpers import get_data - -# IMPORT THIRD-PARTY - +from openbb_fmp.utils.helpers import get_data # This part is only provided by FMP and not by the other providers for now. diff --git a/openbb_sdk/providers/fmp/openbb_fmp/crypto_eod.py b/openbb_sdk/providers/fmp/openbb_fmp/models/crypto_eod.py similarity index 97% rename from openbb_sdk/providers/fmp/openbb_fmp/crypto_eod.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/crypto_eod.py index 077cbab9ec8..e9d4d017efc 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/crypto_eod.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/crypto_eod.py @@ -1,19 +1,16 @@ """FMP Cryptos end of day fetcher.""" -# IMPORT STANDARD + from datetime import date, datetime from typing import Dict, List, Literal, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer, get_querystring from openbb_provider.models.crypto_eod import CryptoEODData, CryptoEODQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field, NonNegativeInt, validator -from .helpers import get_data_many +from openbb_fmp.utils.helpers import get_data_many class FMPCryptoEODQueryParams(QueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/crypto_price.py b/openbb_sdk/providers/fmp/openbb_fmp/models/crypto_price.py similarity index 94% rename from openbb_sdk/providers/fmp/openbb_fmp/crypto_price.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/crypto_price.py index adc24a5a498..597de3a3567 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/crypto_price.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/crypto_price.py @@ -1,19 +1,16 @@ """FMP Crypto Price fetcher.""" -# IMPORT STANDARD + from enum import Enum from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer from openbb_provider.models.crypto_price import CryptoPriceData, CryptoPriceQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field -from .helpers import BaseStockPriceData, create_url, get_data_many +from openbb_fmp.utils.helpers import BaseStockPriceData, create_url, get_data_many class Interval(str, Enum): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/dividend_calendar.py b/openbb_sdk/providers/fmp/openbb_fmp/models/dividend_calendar.py similarity index 96% rename from openbb_sdk/providers/fmp/openbb_fmp/dividend_calendar.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/dividend_calendar.py index 943abbb35f6..878937f0f03 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/dividend_calendar.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/dividend_calendar.py @@ -1,21 +1,17 @@ """FMP Dividend Calendar fetcher.""" -# IMPORT STANDARD + from datetime import datetime from typing import Dict, List, Optional from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.dividend_calendar import ( DividendCalendarData, DividendCalendarQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import validator -from .helpers import get_data_many, get_querystring +from openbb_fmp.utils.helpers import get_data_many, get_querystring class FMPDividendCalendarQueryParams(DividendCalendarQueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/earnings_calendar.py b/openbb_sdk/providers/fmp/openbb_fmp/models/earnings_calendar.py similarity index 95% rename from openbb_sdk/providers/fmp/openbb_fmp/earnings_calendar.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/earnings_calendar.py index 2d894313b08..5aaf0d5497e 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/earnings_calendar.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/earnings_calendar.py @@ -1,21 +1,18 @@ """FMP Earnings Calendar fetcher.""" -# IMPORT STANDARD + from datetime import date as dateType from typing import Dict, List, Optional from openbb_provider.abstract.data import Data from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.earnings_calendar import ( EarningsCalendarData, EarningsCalendarQueryParams, ) -# IMPORT THIRD-PARTY -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPEarningsCalendarQueryParams(EarningsCalendarQueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/earnings_call_transcript.py b/openbb_sdk/providers/fmp/openbb_fmp/models/earnings_call_transcript.py similarity index 95% rename from openbb_sdk/providers/fmp/openbb_fmp/earnings_call_transcript.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/earnings_call_transcript.py index 8580e1614d5..61f32eaa153 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/earnings_call_transcript.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/earnings_call_transcript.py @@ -1,21 +1,18 @@ """FMP Earnings Call Transcript fetcher.""" -# IMPORT STANDARD + from typing import Dict, List, Optional from openbb_provider.abstract.data import QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer from openbb_provider.models.base import BaseSymbol - -# IMPORT INTERNAL from openbb_provider.models.earnings_call_transcript import ( EarningsCallTranscriptData, EarningsCallTranscriptQueryParams, ) -# IMPORT THIRD-PARTY -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPEarningsCallTranscriptQueryParams(QueryParams, BaseSymbol): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/esg_risk_rating.py b/openbb_sdk/providers/fmp/openbb_fmp/models/esg_risk_rating.py similarity index 95% rename from openbb_sdk/providers/fmp/openbb_fmp/esg_risk_rating.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/esg_risk_rating.py index 47bc957cf04..113565a0396 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/esg_risk_rating.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/esg_risk_rating.py @@ -1,10 +1,9 @@ """FMP ESG Risk Rating fetcher.""" -# IMPORT STANDARD + from datetime import date from typing import Dict, List, Literal, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer @@ -14,8 +13,7 @@ from openbb_provider.models.esg_risk_rating import ( ) from pydantic import Field -# IMPORT THIRD-PARTY -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many current_year = date.today().year ratings = Literal[ diff --git a/openbb_sdk/providers/fmp/openbb_fmp/esg_score.py b/openbb_sdk/providers/fmp/openbb_fmp/models/esg_score.py similarity index 94% rename from openbb_sdk/providers/fmp/openbb_fmp/esg_score.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/esg_score.py index bed8b495f7d..a8d2fa2182b 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/esg_score.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/esg_score.py @@ -1,18 +1,16 @@ """FMP ESG Score fetcher.""" -# IMPORT STANDARD + from datetime import date, datetime from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer from openbb_provider.models.esg_score import ESGScoreData, ESGScoreQueryParams from pydantic import Field -# IMPORT THIRD-PARTY -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPESGScoreQueryParams(ESGScoreQueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/esg_sector.py b/openbb_sdk/providers/fmp/openbb_fmp/models/esg_sector.py similarity index 94% rename from openbb_sdk/providers/fmp/openbb_fmp/esg_sector.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/esg_sector.py index 2290f9ce682..adcfd526182 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/esg_sector.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/esg_sector.py @@ -1,18 +1,16 @@ """FMP ESG Sector fetcher.""" -# IMPORT STANDARD + from datetime import date from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer from openbb_provider.models.esg_sector import ESGSectorData, ESGSectorQueryParams from pydantic import Field -# IMPORT THIRD-PARTY -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many current_year = date.today().year diff --git a/openbb_sdk/providers/fmp/openbb_fmp/executive_compensation.py b/openbb_sdk/providers/fmp/openbb_fmp/models/executive_compensation.py similarity index 96% rename from openbb_sdk/providers/fmp/openbb_fmp/executive_compensation.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/executive_compensation.py index 9c2e7e7d3cc..ded45d9daa9 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/executive_compensation.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/executive_compensation.py @@ -1,6 +1,6 @@ """FMP Executive Compensation Fetcher.""" -# IMPORT STANDARD + from datetime import ( date as dateType, datetime, @@ -10,17 +10,13 @@ from typing import Dict, List, Optional from openbb_provider.abstract.data import Data from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.executive_compensation import ( ExecutiveCompensationData, ExecutiveCompensationQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import validator -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many # This part is only provided by FMP and not by the other providers for now. diff --git a/openbb_sdk/providers/fmp/openbb_fmp/executives.py b/openbb_sdk/providers/fmp/openbb_fmp/models/executives.py similarity index 97% rename from openbb_sdk/providers/fmp/openbb_fmp/executives.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/executives.py index eb9a6f06d2b..e61e698ce1f 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/executives.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/executives.py @@ -1,10 +1,9 @@ """FMP Key Executives Fetcher.""" -# IMPORT STANDARD + from datetime import datetime from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer @@ -14,8 +13,7 @@ from openbb_provider.models.key_executives import ( KeyExecutivesQueryParams, ) -# IMPORT THIRD-PARTY -from .helpers import get_data +from openbb_fmp.utils.helpers import get_data class FMPKeyExecutivesQueryParams(QueryParams, BaseSymbol): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/forex_eod.py b/openbb_sdk/providers/fmp/openbb_fmp/models/forex_eod.py similarity index 95% rename from openbb_sdk/providers/fmp/openbb_fmp/forex_eod.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/forex_eod.py index 229d09876e4..8e73efb66f0 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/forex_eod.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/forex_eod.py @@ -1,19 +1,16 @@ """FMP Forex end of day fetcher.""" -# IMPORT STANDARD + from datetime import datetime from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer from openbb_provider.models.forex_eod import ForexEODData, ForexEODQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field, validator -from .helpers import get_data_many +from openbb_fmp.utils.helpers import get_data_many class FMPForexEODQueryParams(QueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/forex_pairs.py b/openbb_sdk/providers/fmp/openbb_fmp/models/forex_pairs.py similarity index 95% rename from openbb_sdk/providers/fmp/openbb_fmp/forex_pairs.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/forex_pairs.py index ea4022c44fe..a58519cfbdb 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/forex_pairs.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/forex_pairs.py @@ -1,15 +1,14 @@ """FMP Forex available pairs fetcher.""" -# IMPORT STANDARD + from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer from openbb_provider.models.forex_pairs import ForexPairsData, ForexPairsQueryParams -from .helpers import get_data_many +from openbb_fmp.utils.helpers import get_data_many class FMPForexPairsQueryParams(QueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/forex_price.py b/openbb_sdk/providers/fmp/openbb_fmp/models/forex_price.py similarity index 94% rename from openbb_sdk/providers/fmp/openbb_fmp/forex_price.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/forex_price.py index 4d4b275716e..071df49b015 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/forex_price.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/forex_price.py @@ -1,19 +1,16 @@ """FMP Forex Price fetcher.""" -# IMPORT STANDARD + from enum import Enum from typing import Dict, List, Literal, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer from openbb_provider.models.forex_price import ForexPriceData, ForexPriceQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field -from .helpers import BaseStockPriceData, create_url, get_data_many +from openbb_fmp.utils.helpers import BaseStockPriceData, create_url, get_data_many class Interval(str, Enum): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/global_news.py b/openbb_sdk/providers/fmp/openbb_fmp/models/global_news.py similarity index 94% rename from openbb_sdk/providers/fmp/openbb_fmp/global_news.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/global_news.py index 4d4577bdc59..9f6125518e6 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/global_news.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/global_news.py @@ -1,19 +1,16 @@ """FMP Global News fetcher.""" -# IMPORT STANDARD + from datetime import datetime from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer from openbb_provider.models.global_news import GlobalNewsData, GlobalNewsQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPGlobalNewsQueryParams(QueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/historical_dividends.py b/openbb_sdk/providers/fmp/openbb_fmp/models/historical_dividends.py similarity index 96% rename from openbb_sdk/providers/fmp/openbb_fmp/historical_dividends.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/historical_dividends.py index b8d84bacc79..ae5bed51d20 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/historical_dividends.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/historical_dividends.py @@ -1,5 +1,5 @@ """FMP Historical Dividends fetcher.""" -# IMPORT STANDARD + from datetime import ( date as dateType, datetime, @@ -9,17 +9,13 @@ from typing import Dict, List, Optional from openbb_provider.abstract.data import Data from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.historical_dividends import ( HistoricalDividendsData, HistoricalDividendsQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import validator -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPHistoricalDividendsQueryParams(HistoricalDividendsQueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/historical_employees.py b/openbb_sdk/providers/fmp/openbb_fmp/models/historical_employees.py similarity index 96% rename from openbb_sdk/providers/fmp/openbb_fmp/historical_employees.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/historical_employees.py index 4ca11964664..3c31ab47b4d 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/historical_employees.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/historical_employees.py @@ -1,23 +1,19 @@ """FMP Historical Employees fetcher.""" -# IMPORT STANDARD + from datetime import date, datetime from typing import Dict, List, Optional from openbb_provider.abstract.data import Data - -# IMPORT INTERNAL from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer from openbb_provider.models.historical_employees import ( HistoricalEmployeesData, HistoricalEmployeesQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import Field, validator -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPHistoricalEmployeesQueryParams(HistoricalEmployeesQueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/historical_stock_splits.py b/openbb_sdk/providers/fmp/openbb_fmp/models/historical_stock_splits.py similarity index 94% rename from openbb_sdk/providers/fmp/openbb_fmp/historical_stock_splits.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/historical_stock_splits.py index c9a6a315196..3dadfc6afb2 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/historical_stock_splits.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/historical_stock_splits.py @@ -1,19 +1,16 @@ """FMP Historical Stock Splits fetcher.""" -# IMPORT STANDARD + from typing import Dict, List, Optional from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.historical_stock_splits import ( HistoricalStockSplitsData, HistoricalStockSplitsQueryParams, ) -# IMPORT THIRD-PARTY -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPHistoricalStockSplitsQueryParams(HistoricalStockSplitsQueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/income_statement.py b/openbb_sdk/providers/fmp/openbb_fmp/models/income_statement.py similarity index 97% rename from openbb_sdk/providers/fmp/openbb_fmp/income_statement.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/income_statement.py index 44c74d6674f..6ba49a8252f 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/income_statement.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/income_statement.py @@ -1,13 +1,12 @@ """FMP Income Statement Fetcher.""" -# IMPORT STANDARD + from datetime import ( date as dateType, datetime, ) from typing import Dict, List, Literal, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer @@ -15,11 +14,9 @@ from openbb_provider.models.income_statement import ( IncomeStatementData, IncomeStatementQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import Field, NonNegativeInt, root_validator -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many PeriodType = Literal["annual", "quarter"] diff --git a/openbb_sdk/providers/fmp/openbb_fmp/institutional_ownership.py b/openbb_sdk/providers/fmp/openbb_fmp/models/institutional_ownership.py similarity index 97% rename from openbb_sdk/providers/fmp/openbb_fmp/institutional_ownership.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/institutional_ownership.py index 9c063051a71..d0ca366cbaf 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/institutional_ownership.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/institutional_ownership.py @@ -1,13 +1,12 @@ """FMP Institutional Ownership Fetcher.""" -# IMPORT STANDARD + from datetime import ( date as dateType, datetime, ) from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer @@ -16,11 +15,9 @@ from openbb_provider.models.institutional_ownership import ( InstitutionalOwnershipData, InstitutionalOwnershipQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import Field, validator -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPInstitutionalOwnershipQueryParams(QueryParams, BaseSymbol): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/key_metrics.py b/openbb_sdk/providers/fmp/openbb_fmp/models/key_metrics.py similarity index 97% rename from openbb_sdk/providers/fmp/openbb_fmp/key_metrics.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/key_metrics.py index 05dfd156caf..c22b98201dc 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/key_metrics.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/key_metrics.py @@ -1,19 +1,16 @@ """Key Metrics fetcher.""" -# IMPORT STANDARD + from datetime import date as dateType from typing import Dict, List, Literal, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer from openbb_provider.models.key_metrics import KeyMetricsData, KeyMetricsQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPKeyMetricsQueryParams(QueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/major_indices_constituents.py b/openbb_sdk/providers/fmp/openbb_fmp/models/major_indices_constituents.py similarity index 96% rename from openbb_sdk/providers/fmp/openbb_fmp/major_indices_constituents.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/major_indices_constituents.py index be2e8905f37..61ad3ee37ca 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/major_indices_constituents.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/major_indices_constituents.py @@ -1,21 +1,18 @@ """FMP Major Indices end of day fetcher.""" -# IMPORT STANDARD + from datetime import datetime from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer from openbb_provider.models.major_indices_constituents import ( MajorIndicesConstituentsData, MajorIndicesConstituentsQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import validator -from .helpers import get_data_many +from openbb_fmp.utils.helpers import get_data_many class FMPMajorIndicesConstituentsQueryParams(MajorIndicesConstituentsQueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/major_indices_eod.py b/openbb_sdk/providers/fmp/openbb_fmp/models/major_indices_eod.py similarity index 97% rename from openbb_sdk/providers/fmp/openbb_fmp/major_indices_eod.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/major_indices_eod.py index 0c3aa4a3604..7a9b1384ade 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/major_indices_eod.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/major_indices_eod.py @@ -1,10 +1,9 @@ """FMP Major Indices end of day fetcher.""" -# IMPORT STANDARD + from datetime import date, datetime from typing import Dict, List, Literal, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer, get_querystring @@ -12,11 +11,9 @@ from openbb_provider.models.major_indices_eod import ( MajorIndicesEODData, MajorIndicesEODQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import Field, NonNegativeInt, validator -from .helpers import get_data_many +from openbb_fmp.utils.helpers import get_data_many class FMPMajorIndicesEODQueryParams(QueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/major_indices_price.py b/openbb_sdk/providers/fmp/openbb_fmp/models/major_indices_price.py similarity index 94% rename from openbb_sdk/providers/fmp/openbb_fmp/major_indices_price.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/major_indices_price.py index 63efa0409db..ba77b099d45 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/major_indices_price.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/major_indices_price.py @@ -1,9 +1,8 @@ """FMP Major Indices Price fetcher.""" -# IMPORT STANDARD + from typing import Dict, List, Literal, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer @@ -12,11 +11,9 @@ from openbb_provider.models.major_indices_price import ( MajorIndicesPriceData, MajorIndicesPriceQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import Field -from .helpers import BaseStockPriceData, create_url, get_data_many +from openbb_fmp.utils.helpers import BaseStockPriceData, create_url, get_data_many class FMPMajorIndicesPriceQueryParams(QueryParams, BaseSymbol): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/price_target.py b/openbb_sdk/providers/fmp/openbb_fmp/models/price_target.py similarity index 94% rename from openbb_sdk/providers/fmp/openbb_fmp/price_target.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/price_target.py index af8aa23e9b3..95b39a435ac 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/price_target.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/price_target.py @@ -1,20 +1,16 @@ """FMP Stock Ownership fetcher.""" -# IMPORT STANDARD + from datetime import datetime from typing import Dict, List, Optional from openbb_provider.abstract.data import Data from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.price_target import PriceTargetData, PriceTargetQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPPriceTargetQueryParams(PriceTargetQueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/price_target_consensus.py b/openbb_sdk/providers/fmp/openbb_fmp/models/price_target_consensus.py similarity index 95% rename from openbb_sdk/providers/fmp/openbb_fmp/price_target_consensus.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/price_target_consensus.py index 52f1a1da85f..486da7cf6f8 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/price_target_consensus.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/price_target_consensus.py @@ -1,21 +1,18 @@ """FMP Price Target Consensus fetcher.""" -# IMPORT STANDARD + from enum import Enum from typing import Dict, List, Optional from openbb_provider.abstract.data import Data from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.price_target_consensus import ( PriceTargetConsensusData, PriceTargetConsensusQueryParams, ) -# IMPORT THIRD-PARTY -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class Interval(str, Enum): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/revenue_business_line.py b/openbb_sdk/providers/fmp/openbb_fmp/models/revenue_business_line.py similarity index 96% rename from openbb_sdk/providers/fmp/openbb_fmp/revenue_business_line.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/revenue_business_line.py index abdd032fc73..5552ef2204c 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/revenue_business_line.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/revenue_business_line.py @@ -1,22 +1,18 @@ """FMP Revenue Business Line Fetcher.""" -# IMPORT STANDARD + from datetime import datetime from typing import Dict, List, Optional from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.revenue_business_line import ( RevenueBusinessLineData, RevenueBusinessLineQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import validator -from .helpers import create_url, get_data +from openbb_fmp.utils.helpers import create_url, get_data # This part is only provided by FMP and not by the other providers for now. diff --git a/openbb_sdk/providers/fmp/openbb_fmp/revenue_geographic.py b/openbb_sdk/providers/fmp/openbb_fmp/models/revenue_geographic.py similarity index 97% rename from openbb_sdk/providers/fmp/openbb_fmp/revenue_geographic.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/revenue_geographic.py index 374ef94a792..60a09e59533 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/revenue_geographic.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/revenue_geographic.py @@ -1,22 +1,18 @@ """FMP Revenue Geographic Fetcher.""" -# IMPORT STANDARD + from datetime import datetime from typing import Dict, List, Optional from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.revenue_geographic import ( RevenueGeographicData, RevenueGeographicQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import validator -from .helpers import create_url, get_data +from openbb_fmp.utils.helpers import create_url, get_data # This part is only provided by FMP and not by the other providers for now. diff --git a/openbb_sdk/providers/fmp/openbb_fmp/risk_premium.py b/openbb_sdk/providers/fmp/openbb_fmp/models/risk_premium.py similarity index 94% rename from openbb_sdk/providers/fmp/openbb_fmp/risk_premium.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/risk_premium.py index 1195813f433..d8053471019 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/risk_premium.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/risk_premium.py @@ -1,14 +1,13 @@ """FMP Risk Premium fetcher.""" -# IMPORT STANDARD + from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer from openbb_provider.models.risk_premium import RiskPremiumData, RiskPremiumQueryParams -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPRiskPremiumQueryParams(RiskPremiumQueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/sec_filings.py b/openbb_sdk/providers/fmp/openbb_fmp/models/sec_filings.py similarity index 95% rename from openbb_sdk/providers/fmp/openbb_fmp/sec_filings.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/sec_filings.py index 2b27f14893a..122dfa07fc9 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/sec_filings.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/sec_filings.py @@ -1,21 +1,19 @@ """SEC Filings fetcher.""" -# IMPORT STANDARD + from datetime import ( date as dateType, datetime, ) from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer from openbb_provider.models.sec_filings import SECFilingsData, SECFilingsQueryParams from pydantic import validator -# IMPORT THIRD-PARTY -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPSECFilingsQueryParams(SECFilingsQueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/share_statistics.py b/openbb_sdk/providers/fmp/openbb_fmp/models/share_statistics.py similarity index 95% rename from openbb_sdk/providers/fmp/openbb_fmp/share_statistics.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/share_statistics.py index 18ae5bb73c0..b12961215d4 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/share_statistics.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/share_statistics.py @@ -1,13 +1,12 @@ """FMP Share Statistics Fetcher.""" -# IMPORT STANDARD + from datetime import ( date as dateType, datetime, ) from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer @@ -16,11 +15,9 @@ from openbb_provider.models.share_statistics import ( ShareStatisticsData, ShareStatisticsQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import validator -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPShareStatisticsQueryParams(QueryParams, BaseSymbol): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/stock_eod.py b/openbb_sdk/providers/fmp/openbb_fmp/models/stock_eod.py similarity index 97% rename from openbb_sdk/providers/fmp/openbb_fmp/stock_eod.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/stock_eod.py index d13e63acf96..f8e9806d4cc 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/stock_eod.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/stock_eod.py @@ -1,19 +1,16 @@ """FMP Stocks end of day fetcher.""" -# IMPORT STANDARD + from datetime import date, datetime, timedelta from typing import Dict, List, Literal, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer, get_querystring from openbb_provider.models.stock_eod import StockEODData, StockEODQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field, NonNegativeInt, validator -from .helpers import get_data_many +from openbb_fmp.utils.helpers import get_data_many class FMPStockEODQueryParams(QueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/stock_insider_trading.py b/openbb_sdk/providers/fmp/openbb_fmp/models/stock_insider_trading.py similarity index 97% rename from openbb_sdk/providers/fmp/openbb_fmp/stock_insider_trading.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/stock_insider_trading.py index e82ad847102..2411f29c6e2 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/stock_insider_trading.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/stock_insider_trading.py @@ -1,22 +1,19 @@ """FMP Stock Insider Trading fetcher.""" -# IMPORT STANDARD + from datetime import date, datetime from typing import Dict, List, Optional from openbb_provider.abstract.data import Data from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.stock_insider_trading import ( StockInsiderTradingData, StockInsiderTradingQueryParams, ) from pydantic import Field -# IMPORT THIRD-PARTY -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPStockInsiderTradingQueryParams(StockInsiderTradingQueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/stock_multiples.py b/openbb_sdk/providers/fmp/openbb_fmp/models/stock_multiples.py similarity index 98% rename from openbb_sdk/providers/fmp/openbb_fmp/stock_multiples.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/stock_multiples.py index bdd1a7fdc79..a58a0cf0d26 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/stock_multiples.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/stock_multiples.py @@ -1,20 +1,17 @@ """FMP Stock Multiples Fetcher.""" -# IMPORT STANDARD + from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer from openbb_provider.models.stock_multiples import ( StockMultiplesData, StockMultiplesQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import Field -from .helpers import create_url, get_data_one +from openbb_fmp.utils.helpers import create_url, get_data_one class FMPStockMultiplesQueryParams(StockMultiplesQueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/stock_news.py b/openbb_sdk/providers/fmp/openbb_fmp/models/stock_news.py similarity index 95% rename from openbb_sdk/providers/fmp/openbb_fmp/stock_news.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/stock_news.py index ca1b374bb2e..bc9a5b337d4 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/stock_news.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/stock_news.py @@ -1,19 +1,16 @@ """FMP Stock News fetcher.""" -# IMPORT STANDARD + from datetime import datetime from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer from openbb_provider.models.stock_news import StockNewsData, StockNewsQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field, NonNegativeInt -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPStockNewsQueryParams(QueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/stock_ownership.py b/openbb_sdk/providers/fmp/openbb_fmp/models/stock_ownership.py similarity index 94% rename from openbb_sdk/providers/fmp/openbb_fmp/stock_ownership.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/stock_ownership.py index 33e6851564f..995e046021e 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/stock_ownership.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/stock_ownership.py @@ -1,19 +1,16 @@ """FMP Stock Ownership fetcher.""" -# IMPORT STANDARD + from typing import Dict, List, Optional from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.stock_ownership import ( StockOwnershipData, StockOwnershipQueryParams, ) -# IMPORT THIRD-PARTY -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPStockOwnershipQueryParams(StockOwnershipQueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/stock_peers.py b/openbb_sdk/providers/fmp/openbb_fmp/models/stock_peers.py similarity index 94% rename from openbb_sdk/providers/fmp/openbb_fmp/stock_peers.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/stock_peers.py index 8334c860794..4f0594da452 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/stock_peers.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/stock_peers.py @@ -1,15 +1,13 @@ """FMP Stock Peers fetcher.""" -# IMPORT STANDARD + from typing import Dict, List, Optional from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.stock_peers import StockPeersData, StockPeersQueryParams -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many # FMP SPECIFIC FUNCTIONALITY CURRENTLY diff --git a/openbb_sdk/providers/fmp/openbb_fmp/stock_price.py b/openbb_sdk/providers/fmp/openbb_fmp/models/stock_price.py similarity index 94% rename from openbb_sdk/providers/fmp/openbb_fmp/stock_price.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/stock_price.py index ef67ae201e0..e4905760a38 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/stock_price.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/stock_price.py @@ -1,19 +1,16 @@ """FMP Stock Price fetcher.""" -# IMPORT STANDARD + from enum import Enum from typing import Dict, List, Literal, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer from openbb_provider.models.stock_price import StockPriceData, StockPriceQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field -from .helpers import BaseStockPriceData, create_url, get_data_many +from openbb_fmp.utils.helpers import BaseStockPriceData, create_url, get_data_many class Interval(str, Enum): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/stock_splits.py b/openbb_sdk/providers/fmp/openbb_fmp/models/stock_splits.py similarity index 95% rename from openbb_sdk/providers/fmp/openbb_fmp/stock_splits.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/stock_splits.py index 1d8fb0abf60..ec9083af433 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/stock_splits.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/stock_splits.py @@ -1,20 +1,17 @@ """FMP Stock Splits Calendar fetcher.""" -# IMPORT STANDARD + from datetime import date from typing import Dict, List, Optional from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.stock_splits import ( StockSplitCalendarData, StockSplitCalendarQueryParams, ) -# IMPORT THIRD-PARTY -from .helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_many class FMPStockSplitCalendarQueryParams(StockSplitCalendarQueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/treasury_rates.py b/openbb_sdk/providers/fmp/openbb_fmp/models/treasury_rates.py similarity index 96% rename from openbb_sdk/providers/fmp/openbb_fmp/treasury_rates.py rename to openbb_sdk/providers/fmp/openbb_fmp/models/treasury_rates.py index 5fc821573e4..a7523e92436 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/treasury_rates.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/models/treasury_rates.py @@ -1,10 +1,9 @@ """FMP Treasury Rates fetcher.""" -# IMPORT STANDARD + from datetime import date as dateType from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer, get_querystring @@ -12,11 +11,9 @@ from openbb_provider.models.treasury_rates import ( TreasuryRatesData, TreasuryRatesQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import Field -from .helpers import get_data_many +from openbb_fmp.utils.helpers import get_data_many class FMPTreasuryRatesQueryParams(TreasuryRatesQueryParams): diff --git a/openbb_sdk/providers/fmp/openbb_fmp/provider.py b/openbb_sdk/providers/fmp/openbb_fmp/provider.py index 135318f7c2c..156ceae8325 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/provider.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/provider.py @@ -1,56 +1,54 @@ """FMP Provider module.""" -# IMPORT STANDARD -# IMPORT THIRD-PARTY - -# IMPORT INTERNAL from openbb_provider.abstract.provider import Provider -from .analyst_estimates import FMPAnalystEstimatesFetcher -from .available_indices import FMPAvailableIndicesFetcher -from .balance_sheet import FMPBalanceSheetFetcher -from .cash_flow import FMPCashFlowStatementFetcher -from .company_profile import FMPCompanyProfileFetcher -from .crypto_eod import FMPCryptoEODFetcher -from .crypto_price import FMPCryptoPriceFetcher -from .dividend_calendar import FMPDividendCalendarFetcher -from .earnings_calendar import FMPEarningsCalendarFetcher -from .earnings_call_transcript import FMPEarningsCallTranscriptFetcher -from .esg_risk_rating import FMPESGRiskRatingFetcher -from .esg_score import FMPESGScoreFetcher -from .esg_sector import FMPESGSectorFetcher -from .executive_compensation import FMPExecutiveCompensationFetcher -from .executives import FMPKeyExecutivesFetcher -from .forex_eod import FMPForexEODFetcher -from .forex_pairs import FMPForexPairsFetcher -from .forex_price import FMPForexPriceFetcher -from .global_news import FMPGlobalNewsFetcher -from .historical_dividends import FMPHistoricalDividendsFetcher -from .historical_employees import FMPHistoricalEmployeesFetcher -from .historical_stock_splits import FMPHistoricalStockSplitsFetcher -from .income_statement import FMPIncomeStatementFetcher -from .institutional_ownership import FMPInstitutionalOwnershipFetcher -from .key_metrics import FMPKeyMetricsFetcher -from .major_indices_constituents import FMPMajorIndicesConstituentsFetcher -from .major_indices_eod import FMPMajorIndicesEODFetcher -from .major_indices_price import FMPMajorIndicesPriceFetcher -from .price_target import FMPPriceTargetFetcher -from .price_target_consensus import FMPPriceTargetConsensusFetcher -from .revenue_business_line import FMPRevenueBusinessLineFetcher -from .revenue_geographic import FMPRevenueGeographicFetcher -from .risk_premium import FMPRiskPremiumFetcher -from .sec_filings import FMPSECFilingsFetcher -from .share_statistics import FMPShareStatisticsFetcher -from .stock_eod import FMPStockEODFetcher -from .stock_insider_trading import FMPStockInsiderTradingFetcher -from .stock_multiples import FMPStockMultiplesFetcher -from .stock_news import FMPStockNewsFetcher -from .stock_ownership import FMPStockOwnershipFetcher -from .stock_peers import FMPStockPeersFetcher -from .stock_price import FMPStockPriceFetcher -from .stock_splits import FMPStockSplitCalendarFetcher -from .treasury_rates import FMPTreasuryRatesFetcher +from openbb_fmp.models.analyst_estimates import FMPAnalystEstimatesFetcher +from openbb_fmp.models.available_indices import FMPAvailableIndicesFetcher +from openbb_fmp.models.balance_sheet import FMPBalanceSheetFetcher +from openbb_fmp.models.cash_flow import FMPCashFlowStatementFetcher +from openbb_fmp.models.company_profile import FMPCompanyProfileFetcher +from openbb_fmp.models.crypto_eod import FMPCryptoEODFetcher +from openbb_fmp.models.crypto_price import FMPCryptoPriceFetcher +from openbb_fmp.models.dividend_calendar import FMPDividendCalendarFetcher +from openbb_fmp.models.earnings_calendar import FMPEarningsCalendarFetcher +from openbb_fmp.models.earnings_call_transcript import FMPEarningsCallTranscriptFetcher +from openbb_fmp.models.esg_risk_rating import FMPESGRiskRatingFetcher +from openbb_fmp.models.esg_score import FMPESGScoreFetcher +from openbb_fmp.models.esg_sector import FMPESGSectorFetcher +from openbb_fmp.models.executive_compensation import FMPExecutiveCompensationFetcher +from openbb_fmp.models.executives import FMPKeyExecutivesFetcher +from openbb_fmp.models.forex_eod import FMPForexEODFetcher +from openbb_fmp.models.forex_pairs import FMPForexPairsFetcher +from openbb_fmp.models.forex_price import FMPForexPriceFetcher +from openbb_fmp.models.global_news import FMPGlobalNewsFetcher +from openbb_fmp.models.historical_dividends import FMPHistoricalDividendsFetcher +from openbb_fmp.models.historical_employees import FMPHistoricalEmployeesFetcher +from openbb_fmp.models.historical_stock_splits import FMPHistoricalStockSplitsFetcher +from openbb_fmp.models.income_statement import FMPIncomeStatementFetcher +from openbb_fmp.models.institutional_ownership import FMPInstitutionalOwnershipFetcher +from openbb_fmp.models.key_metrics import FMPKeyMetricsFetcher +from openbb_fmp.models.major_indices_constituents import ( + FMPMajorIndicesConstituentsFetcher, +) +from openbb_fmp.models.major_indices_eod import FMPMajorIndicesEODFetcher +from openbb_fmp.models.major_indices_price import FMPMajorIndicesPriceFetcher +from openbb_fmp.models.price_target import FMPPriceTargetFetcher +from openbb_fmp.models.price_target_consensus import FMPPriceTargetConsensusFetcher +from openbb_fmp.models.revenue_business_line import FMPRevenueBusinessLineFetcher +from openbb_fmp.models.revenue_geographic import FMPRevenueGeographicFetcher +from openbb_fmp.models.risk_premium import FMPRiskPremiumFetcher +from openbb_fmp.models.sec_filings import FMPSECFilingsFetcher +from openbb_fmp.models.share_statistics import FMPShareStatisticsFetcher +from openbb_fmp.models.stock_eod import FMPStockEODFetcher +from openbb_fmp.models.stock_insider_trading import FMPStockInsiderTradingFetcher +from openbb_fmp.models.stock_multiples import FMPStockMultiplesFetcher +from openbb_fmp.models.stock_news import FMPStockNewsFetcher +from openbb_fmp.models.stock_ownership import FMPStockOwnershipFetcher +from openbb_fmp.models.stock_peers import FMPStockPeersFetcher +from openbb_fmp.models.stock_price import FMPStockPriceFetcher +from openbb_fmp.models.stock_splits import FMPStockSplitCalendarFetcher +from openbb_fmp.models.treasury_rates import FMPTreasuryRatesFetcher # mypy: disable-error-code="list-item" diff --git a/openbb_sdk/providers/fmp/openbb_fmp/utils/__init__.py b/openbb_sdk/providers/fmp/openbb_fmp/utils/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/providers/fmp/openbb_fmp/helpers.py b/openbb_sdk/providers/fmp/openbb_fmp/utils/helpers.py similarity index 96% rename from openbb_sdk/providers/fmp/openbb_fmp/helpers.py rename to openbb_sdk/providers/fmp/openbb_fmp/utils/helpers.py index 34eed31c2c2..4de0aa4f73b 100644 --- a/openbb_sdk/providers/fmp/openbb_fmp/helpers.py +++ b/openbb_sdk/providers/fmp/openbb_fmp/utils/helpers.py @@ -1,16 +1,17 @@ """FMP Helpers Module.""" -# IMPORT STANDARD + from datetime import datetime from typing import List, Optional, Type, TypeVar, Union -# IMPORT THIRD-PARTY import requests from openbb_provider.abstract.data import Data - -# IMPORT INTERNAL from openbb_provider.abstract.fetcher import QueryParamsType -from openbb_provider.helpers import BasicResponse, get_querystring, request +from openbb_provider.helpers import ( + BasicResponse, + get_querystring, + request, +) from pydantic import BaseModel, NonNegativeInt, PositiveFloat, validator from requests.exceptions import SSLError diff --git a/openbb_sdk/providers/fred/openbb_fred/cpi.py b/openbb_sdk/providers/fred/openbb_fred/models/cpi.py similarity index 94% rename from openbb_sdk/providers/fred/openbb_fred/cpi.py rename to openbb_sdk/providers/fred/openbb_fred/models/cpi.py index a71ba9c3365..be16ff234e5 100644 --- a/openbb_sdk/providers/fred/openbb_fred/cpi.py +++ b/openbb_sdk/providers/fred/openbb_fred/models/cpi.py @@ -1,18 +1,14 @@ """FRED CPI Fetcher.""" -# IMPORT STANDARD + from typing import Dict, List, Optional +from openbb_fred.utils.fred_base import Fred +from openbb_fred.utils.fred_helpers import all_cpi_options from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT THIRD-PARTY -# IMPORT INTERNAL from openbb_provider.models.cpi import CPIData, CPIDataPoint, CPIQueryParams -from openbb_fred.fred_base import Fred -from openbb_fred.fred_helpers import all_cpi_options - class FREDCPIQueryParams(CPIQueryParams): """CPI query. diff --git a/openbb_sdk/providers/fred/openbb_fred/provider.py b/openbb_sdk/providers/fred/openbb_fred/provider.py index 2c8e60bb69a..9764a39eeef 100644 --- a/openbb_sdk/providers/fred/openbb_fred/provider.py +++ b/openbb_sdk/providers/fred/openbb_fred/provider.py @@ -1,11 +1,9 @@ """FRED provider module.""" -# IMPORT STANDARD -# IMPORT THIRD-PARTY -# IMPORT INTERNAL + from openbb_provider.abstract.provider import Provider -from openbb_fred.cpi import FREDCPIFetcher +from openbb_fred.models.cpi import FREDCPIFetcher # mypy: disable-error-code="list-item" diff --git a/openbb_sdk/providers/fred/openbb_fred/utils/cpi.csv b/openbb_sdk/providers/fred/openbb_fred/utils/cpi.csv new file mode 100644 index 00000000000..c7c7f3c7dc2 --- /dev/null +++ b/openbb_sdk/providers/fred/openbb_fred/utils/cpi.csv @@ -0,0 +1,256 @@ +title,country,frequency,units,series_id +Consumer Price Index for Australia,australia,annual,growth_previous,CPALTT01AUA657N +Consumer Price Index for Australia,australia,annual,growth_same,CPALTT01AUA659N +Consumer Price Index for Australia,australia,quarterly,growth_previous,CPALTT01AUQ657N +Consumer Price Index for Australia,australia,quarterly,growth_same,CPALTT01AUQ659N +Consumer Price Index for Austria,austria,annual,growth_previous,CPALTT01ATA657N +Consumer Price Index for Austria,austria,annual,growth_same,CPALTT01ATA659N +Consumer Price Index for Austria,austria,monthly,growth_previous,CPALTT01ATM657N +Consumer Price Index for Austria,austria,monthly,growth_same,CPALTT01ATM659N +Consumer Price Index for Austria,austria,quarterly,growth_previous,CPALTT01ATQ657N +Consumer Price Index for Austria,austria,quarterly,growth_same,CPALTT01ATQ659N +Consumer Price Index for Belgium,belgium,annual,growth_previous,CPALTT01BEA657N +Consumer Price Index for Belgium,belgium,annual,growth_same,CPALTT01BEA659N +Consumer Price Index for Belgium,belgium,monthly,growth_previous,CPALTT01BEM657N +Consumer Price Index for Belgium,belgium,monthly,growth_same,CPALTT01BEM659N +Consumer Price Index for Belgium,belgium,quarterly,growth_previous,CPALTT01BEQ657N +Consumer Price Index for Belgium,belgium,quarterly,growth_same,CPALTT01BEQ659N +Consumer Price Index for Brazil,brazil,annual,growth_previous,CPALTT01BRA657N +Consumer Price Index for Brazil,brazil,annual,growth_same,CPALTT01BRA659N +Consumer Price Index for Brazil,brazil,monthly,growth_previous,CPALTT01BRM657N +Consumer Price Index for Brazil,brazil,monthly,growth_same,CPALTT01BRM659N +Consumer Price Index for Brazil,brazil,quarterly,growth_previous,CPALTT01BRQ657N +Consumer Price Index for Brazil,brazil,quarterly,growth_same,CPALTT01BRQ659N +Consumer Price Index for Canada,canada,annual,index_2015,CPALCY01CAA661N +Consumer Price Index for Canada,canada,monthly,index_2015,CPALCY01CAM661N +Consumer Price Index for Canada,canada,quarterly,index_2015,CPALCY01CAQ661N +Consumer Price Index for Canada,canada,annual,growth_previous,CPALTT01CAA657N +Consumer Price Index for Canada,canada,annual,growth_same,CPALTT01CAA659N +Consumer Price Index for Canada,canada,monthly,growth_previous,CPALTT01CAM657N +Consumer Price Index for Canada,canada,monthly,growth_same,CPALTT01CAM659N +Consumer Price Index for Canada,canada,quarterly,growth_previous,CPALTT01CAQ657N +Consumer Price Index for Canada,canada,quarterly,growth_same,CPALTT01CAQ659N +Consumer Price Index for Chile,chile,annual,growth_previous,CPALTT01CLA657N +Consumer Price Index for Chile,chile,annual,growth_same,CPALTT01CLA659N +Consumer Price Index for Chile,chile,monthly,growth_previous,CPALTT01CLM657N +Consumer Price Index for Chile,chile,monthly,growth_same,CPALTT01CLM659N +Consumer Price Index for Chile,chile,quarterly,growth_previous,CPALTT01CLQ657N +Consumer Price Index for Chile,chile,quarterly,growth_same,CPALTT01CLQ659N +Consumer Price Index for China,china,annual,growth_previous,CPALTT01CNA657N +Consumer Price Index for China,china,monthly,growth_same,CPALTT01CNM657N +Consumer Price Index for China,china,monthly,growth_previous,CPALTT01CNM659N +Consumer Price Index for China,china,quarterly,growth_same,CPALTT01CNQ657N +Consumer Price Index for China,china,quarterly,growth_previous,CPALTT01CNQ659N +Consumer Price Index for Denmark,denmark,annual,growth_same,CPALTT01DKA657N +Consumer Price Index for Denmark,denmark,annual,growth_previous,CPALTT01DKA659N +Consumer Price Index for Denmark,denmark,monthly,growth_same,CPALTT01DKM657N +Consumer Price Index for Denmark,denmark,monthly,growth_previous,CPALTT01DKM659N +Consumer Price Index for Denmark,denmark,quarterly,growth_same,CPALTT01DKQ657N +Consumer Price Index for Denmark,denmark,quarterly,growth_previous,CPALTT01DKQ659N +Consumer Price Index for Estonia,estonia,annual,growth_same,CPALTT01EEA657N +Consumer Price Index for Estonia,estonia,annual,growth_previous,CPALTT01EEA659N +Consumer Price Index for Estonia,estonia,annual,index_2015,CPALTT01EEA661N +Consumer Price Index for Estonia,estonia,monthly,growth_previous,CPALTT01EEM657N +Consumer Price Index for Estonia,estonia,monthly,growth_same,CPALTT01EEM659N +Consumer Price Index for Estonia,estonia,monthly,index_2015,CPALTT01EEM661N +Consumer Price Index for Estonia,estonia,quarterly,growth_same,CPALTT01EEQ657N +Consumer Price Index for Estonia,estonia,quarterly,growth_previous,CPALTT01EEQ659N +Consumer Price Index for Estonia,estonia,quarterly,index_2015,CPALTT01EEQ661N +Consumer Price Index for Finland,finland,annual,growth_previous,CPALTT01FIA657N +Consumer Price Index for Finland,finland,annual,growth_same,CPALTT01FIA659N +Consumer Price Index for Finland,finland,monthly,growth_previous,CPALTT01FIM657N +Consumer Price Index for Finland,finland,monthly,growth_same,CPALTT01FIM659N +Consumer Price Index for Finland,finland,quarterly,growth_previous,CPALTT01FIQ657N +Consumer Price Index for Finland,finland,quarterly,growth_same,CPALTT01FIQ659N +Consumer Price Index for France,france,annual,growth_previous,CPALTT01FRA657N +Consumer Price Index for France,france,annual,growth_same,CPALTT01FRA659N +Consumer Price Index for France,france,monthly,growth_previous,CPALTT01FRM657N +Consumer Price Index for France,france,monthly,growth_same,CPALTT01FRM659N +Consumer Price Index for France,france,quarterly,growth_previous,CPALTT01FRQ657N +Consumer Price Index for France,france,quarterly,growth_same,CPALTT01FRQ659N +Consumer Price Index for Germany,germany,annual,growth_same,CPALTT01DEA657N +Consumer Price Index for Germany,germany,annual,growth_previous,CPALTT01DEA659N +Consumer Price Index for Germany,germany,monthly,growth_same,CPALTT01DEM657N +Consumer Price Index for Germany,germany,monthly,growth_previous,CPALTT01DEM659N +Consumer Price Index for Germany,germany,quarterly,growth_same,CPALTT01DEQ657N +Consumer Price Index for Germany,germany,quarterly,growth_previous,CPALTT01DEQ659N +Consumer Price Index for Greece,greece,annual,growth_previous,CPALTT01GRA657N +Consumer Price Index for Greece,greece,annual,growth_same,CPALTT01GRA659N +Consumer Price Index for Greece,greece,monthly,growth_previous,CPALTT01GRM657N +Consumer Price Index for Greece,greece,monthly,growth_same,CPALTT01GRM659N +Consumer Price Index for Greece,greece,quarterly,growth_previous,CPALTT01GRQ657N +Consumer Price Index for Greece,greece,quarterly,growth_same,CPALTT01GRQ659N +Consumer Price Index for Hungary,hungary,annual,growth_previous,CPALTT01HUA657N +Consumer Price Index for Hungary,hungary,annual,growth_same,CPALTT01HUA659N +Consumer Price Index for Hungary,hungary,monthly,growth_previous,CPALTT01HUM657N +Consumer Price Index for Hungary,hungary,monthly,growth_same,CPALTT01HUM659N +Consumer Price Index for Hungary,hungary,quarterly,growth_previous,CPALTT01HUQ657N +Consumer Price Index for Hungary,hungary,quarterly,growth_same,CPALTT01HUQ659N +Consumer Price Index for Iceland,iceland,annual,growth_previous,CPALTT01ISA657N +Consumer Price Index for Iceland,iceland,annual,growth_same,CPALTT01ISA659N +Consumer Price Index for Iceland,iceland,monthly,growth_previous,CPALTT01ISM657N +Consumer Price Index for Iceland,iceland,monthly,growth_same,CPALTT01ISM659N +Consumer Price Index for Iceland,iceland,quarterly,growth_previous,CPALTT01ISQ657N +Consumer Price Index for Iceland,iceland,quarterly,growth_same,CPALTT01ISQ659N +Consumer Price Index for India,india,annual,growth_previous,CPALTT01INA657N +Consumer Price Index for India,india,annual,growth_same,CPALTT01INA659N +Consumer Price Index for India,india,monthly,growth_previous,CPALTT01INM657N +Consumer Price Index for India,india,monthly,growth_same,CPALTT01INM659N +Consumer Price Index for India,india,quarterly,growth_previous,CPALTT01INQ657N +Consumer Price Index for India,india,quarterly,growth_same,CPALTT01INQ659N +Consumer Price Index for Indonesia,indonesia,annual,growth_previous,CPALTT01IDA657N +Consumer Price Index for Indonesia,indonesia,annual,growth_same,CPALTT01IDA659N +Consumer Price Index for Indonesia,indonesia,monthly,growth_previous,CPALTT01IDM657N +Consumer Price Index for Indonesia,indonesia,monthly,growth_same,CPALTT01IDM659N +Consumer Price Index for Indonesia,indonesia,quarterly,growth_previous,CPALTT01IDQ657N +Consumer Price Index for Indonesia,indonesia,quarterly,growth_same,CPALTT01IDQ659N +Consumer Price Index for Ireland,ireland,annual,growth_previous,CPALTT01IEA657N +Consumer Price Index for Ireland,ireland,annual,growth_same,CPALTT01IEA659N +Consumer Price Index for Ireland,ireland,monthly,growth_previous,CPALTT01IEM657N +Consumer Price Index for Ireland,ireland,monthly,growth_same,CPALTT01IEM659N +Consumer Price Index for Ireland,ireland,quarterly,growth_previous,CPALTT01IEQ657N +Consumer Price Index for Ireland,ireland,quarterly,growth_same,CPALTT01IEQ659N +Consumer Price Index for Israel,israel,annual,growth_previous,CPALTT01ILA657N +Consumer Price Index for Israel,israel,annual,growth_same,CPALTT01ILA659N +Consumer Price Index for Israel,israel,monthly,growth_previous,CPALTT01ILM657N +Consumer Price Index for Israel,israel,monthly,growth_same,CPALTT01ILM659N +Consumer Price Index for Israel,israel,quarterly,growth_previous,CPALTT01ILQ657N +Consumer Price Index for Israel,israel,quarterly,growth_same,CPALTT01ILQ659N +Consumer Price Index for Italy,italy,annual,growth_previous,CPALTT01ITA657N +Consumer Price Index for Italy,italy,annual,growth_same,CPALTT01ITA659N +Consumer Price Index for Italy,italy,monthly,growth_previous,CPALTT01ITM657N +Consumer Price Index for Italy,italy,monthly,growth_same,CPALTT01ITM659N +Consumer Price Index for Italy,italy,quarterly,growth_previous,CPALTT01ITQ657N +Consumer Price Index for Italy,italy,quarterly,growth_same,CPALTT01ITQ659N +Consumer Price Index for Japan,japan,monthly,index_2015,CPALCY01JPM661N +Consumer Price Index for Japan,japan,quarterly,index_2015,CPALCY01JPQ661N +Consumer Price Index for Japan,japan,monthly,growth_previous,CPALTT01JPM657N +Consumer Price Index for Japan,japan,monthly,growth_same,CPALTT01JPM659N +Consumer Price Index for Japan,japan,monthly,index_2015,CPALTT01JPM661S +Consumer Price Index for Japan,japan,quarterly,growth_same,CPALTT01JPQ657N +Consumer Price Index for Japan,japan,quarterly,growth_previous,CPALTT01JPQ659N +Consumer Price Index for Japan,japan,quarterly,index_2015,CPALTT01JPQ661S +Consumer Price Index for Luxembourg,luxembourg,annual,growth_previous,CPALTT01LUA657N +Consumer Price Index for Luxembourg,luxembourg,annual,growth_same,CPALTT01LUA659N +Consumer Price Index for Luxembourg,luxembourg,monthly,growth_previous,CPALTT01LUM657N +Consumer Price Index for Luxembourg,luxembourg,monthly,growth_same,CPALTT01LUM659N +Consumer Price Index for Luxembourg,luxembourg,quarterly,growth_previous,CPALTT01LUQ657N +Consumer Price Index for Luxembourg,luxembourg,quarterly,growth_same,CPALTT01LUQ659N +Consumer Price Index for Mexico,mexico,annual,index_2015,CPALCY01MXA661N +Consumer Price Index for Mexico,mexico,monthly,index_2015,CPALCY01MXM661N +Consumer Price Index for Mexico,mexico,quarterly,index_2015,CPALCY01MXQ661N +Consumer Price Index for Mexico,mexico,annual,growth_previous,CPALTT01MXA657N +Consumer Price Index for Mexico,mexico,annual,growth_same,CPALTT01MXA659N +Consumer Price Index for Mexico,mexico,monthly,growth_previous,CPALTT01MXM657N +Consumer Price Index for Mexico,mexico,monthly,growth_same,CPALTT01MXM659N +Consumer Price Index for Mexico,mexico,quarterly,growth_previous,CPALTT01MXQ657N +Consumer Price Index for Mexico,mexico,quarterly,growth_same,CPALTT01MXQ659N +Consumer Price Index for New Zealand,new_zealand,annual,index_2015,CPALCY01NZA661N +Consumer Price Index for New Zealand,new_zealand,quarterly,index_2015,CPALCY01NZQ661N +Consumer Price Index for New Zealand,new_zealand,annual,growth_previous,CPALTT01NZA657N +Consumer Price Index for New Zealand,new_zealand,annual,growth_same,CPALTT01NZA659N +Consumer Price Index for New Zealand,new_zealand,quarterly,growth_previous,CPALTT01NZQ657N +Consumer Price Index for New Zealand,new_zealand,quarterly,growth_same,CPALTT01NZQ659N +Consumer Price Index for Norway,norway,annual,growth_previous,CPALTT01NOA657N +Consumer Price Index for Norway,norway,annual,growth_same,CPALTT01NOA659N +Consumer Price Index for Norway,norway,monthly,growth_previous,CPALTT01NOM657N +Consumer Price Index for Norway,norway,monthly,growth_same,CPALTT01NOM659N +Consumer Price Index for Norway,norway,quarterly,growth_previous,CPALTT01NOQ657N +Consumer Price Index for Norway,norway,quarterly,growth_same,CPALTT01NOQ659N +Consumer Price Index for Poland,poland,annual,growth_previous,CPALTT01PLA657N +Consumer Price Index for Poland,poland,annual,growth_same,CPALTT01PLA659N +Consumer Price Index for Poland,poland,monthly,growth_previous,CPALTT01PLM657N +Consumer Price Index for Poland,poland,monthly,growth_same,CPALTT01PLM659N +Consumer Price Index for Poland,poland,quarterly,growth_previous,CPALTT01PLQ657N +Consumer Price Index for Poland,poland,quarterly,growth_same,CPALTT01PLQ659N +Consumer Price Index for Portugal,portugal,annual,growth_previous,CPALTT01PTA657N +Consumer Price Index for Portugal,portugal,annual,growth_same,CPALTT01PTA659N +Consumer Price Index for Portugal,portugal,monthly,growth_previous,CPALTT01PTM657N +Consumer Price Index for Portugal,portugal,monthly,growth_same,CPALTT01PTM659N +Consumer Price Index for Portugal,portugal,quarterly,growth_previous,CPALTT01PTQ657N +Consumer Price Index for Portugal,portugal,quarterly,growth_same,CPALTT01PTQ659N +Consumer Price Index for Slovenia,slovenia,annual,growth_previous,CPALTT01SIA657N +Consumer Price Index for Slovenia,slovenia,annual,growth_same,CPALTT01SIA659N +Consumer Price Index for Slovenia,slovenia,monthly,growth_previous,CPALTT01SIM657N +Consumer Price Index for Slovenia,slovenia,monthly,growth_same,CPALTT01SIM659N +Consumer Price Index for Slovenia,slovenia,quarterly,growth_previous,CPALTT01SIQ657N +Consumer Price Index for Slovenia,slovenia,quarterly,growth_same,CPALTT01SIQ659N +Consumer Price Index for South Africa,south_africa,annual,growth_previous,CPALTT01ZAA657N +Consumer Price Index for South Africa,south_africa,annual,growth_same,CPALTT01ZAA659N +Consumer Price Index for South Africa,south_africa,monthly,growth_previous,CPALTT01ZAM657N +Consumer Price Index for South Africa,south_africa,monthly,growth_same,CPALTT01ZAM659N +Consumer Price Index for South Africa,south_africa,quarterly,growth_previous,CPALTT01ZAQ657N +Consumer Price Index for South Africa,south_africa,quarterly,growth_same,CPALTT01ZAQ659N +Consumer Price Index for Spain,spain,annual,growth_previous,CPALTT01ESA657N +Consumer Price Index for Spain,spain,annual,growth_same,CPALTT01ESA659N +Consumer Price Index for Spain,spain,monthly,growth_previous,CPALTT01ESM657N +Consumer Price Index for Spain,spain,monthly,growth_same,CPALTT01ESM659N +Consumer Price Index for Spain,spain,quarterly,growth_previous,CPALTT01ESQ657N +Consumer Price Index for Spain,spain,quarterly,growth_same,CPALTT01ESQ659N +Consumer Price Index for Sweden,sweden,annual,growth_previous,CPALTT01SEA657N +Consumer Price Index for Sweden,sweden,annual,growth_same,CPALTT01SEA659N +Consumer Price Index for Sweden,sweden,monthly,growth_previous,CPALTT01SEM657N +Consumer Price Index for Sweden,sweden,monthly,growth_same,CPALTT01SEM659N +Consumer Price Index for Sweden,sweden,quarterly,growth_previous,CPALTT01SEQ657N +Consumer Price Index for Sweden,sweden,quarterly,growth_same,CPALTT01SEQ659N +Consumer Price Index for Switzerland,switzerland,annual,growth_previous,CPALTT01CHA657N +Consumer Price Index for Switzerland,switzerland,annual,growth_same,CPALTT01CHA659N +Consumer Price Index for Switzerland,switzerland,monthly,growth_previous,CPALTT01CHM657N +Consumer Price Index for Switzerland,switzerland,monthly,growth_same,CPALTT01CHM659N +Consumer Price Index for Switzerland,switzerland,quarterly,growth_previous,CPALTT01CHQ657N +Consumer Price Index for Switzerland,switzerland,quarterly,growth_same,CPALTT01CHQ659N +Consumer Price Index for the Czech Republic,czech_republic,annual,growth_same,CPALTT01CZA657N +Consumer Price Index for the Czech Republic,czech_republic,annual,growth_previous,CPALTT01CZA659N +Consumer Price Index for the Czech Republic,czech_republic,monthly,growth_same,CPALTT01CZM657N +Consumer Price Index for the Czech Republic,czech_republic,monthly,growth_previous,CPALTT01CZM659N +Consumer Price Index for the Czech Republic,czech_republic,quarterly,growth_same,CPALTT01CZQ657N +Consumer Price Index for the Czech Republic,czech_republic,quarterly,growth_previous,CPALTT01CZQ659N +Consumer Price Index for the Netherlands,netherlands,annual,growth_previous,CPALTT01NLA657N +Consumer Price Index for the Netherlands,netherlands,annual,growth_same,CPALTT01NLA659N +Consumer Price Index for the Netherlands,netherlands,monthly,growth_previous,CPALTT01NLM657N +Consumer Price Index for the Netherlands,netherlands,monthly,growth_same,CPALTT01NLM659N +Consumer Price Index for the Netherlands,netherlands,quarterly,growth_previous,CPALTT01NLQ657N +Consumer Price Index for the Netherlands,netherlands,quarterly,growth_same,CPALTT01NLQ659N +Consumer Price Index for the Republic of Korea,korea,annual,growth_previous,CPALTT01KRA657N +Consumer Price Index for the Republic of Korea,korea,annual,growth_same,CPALTT01KRA659N +Consumer Price Index for the Republic of Korea,korea,monthly,growth_previous,CPALTT01KRM657N +Consumer Price Index for the Republic of Korea,korea,monthly,growth_same,CPALTT01KRM659N +Consumer Price Index for the Republic of Korea,korea,quarterly,growth_previous,CPALTT01KRQ657N +Consumer Price Index for the Republic of Korea,korea,quarterly,growth_same,CPALTT01KRQ659N +Consumer Price Index for the Russian Federation,russian_federation,monthly,growth_previous,CPALTT01RUM657N +Consumer Price Index for the Russian Federation,russian_federation,monthly,growth_same,CPALTT01RUM659N +Consumer Price Index for the Russian Federation,russian_federation,quarterly,growth_previous,CPALTT01RUQ657N +Consumer Price Index for the Russian Federation,russian_federation,quarterly,growth_same,CPALTT01RUQ659N +Consumer Price Index for the Slovak Republic,slovak_republic,annual,growth_previous,CPALTT01SKA657N +Consumer Price Index for the Slovak Republic,slovak_republic,annual,growth_same,CPALTT01SKA659N +Consumer Price Index for the Slovak Republic,slovak_republic,monthly,growth_previous,CPALTT01SKM657N +Consumer Price Index for the Slovak Republic,slovak_republic,monthly,growth_same,CPALTT01SKM659N +Consumer Price Index for the Slovak Republic,slovak_republic,quarterly,growth_previous,CPALTT01SKQ657N +Consumer Price Index for the Slovak Republic,slovak_republic,quarterly,growth_same,CPALTT01SKQ659N +Consumer Price Index for the United Kingdom,the united kingdom,annual,growth_previous,CPALTT01GBA657N +Consumer Price Index for the United Kingdom,united_kingdom,annual,growth_same,CPALTT01GBA659N +Consumer Price Index for the United Kingdom,united_kingdom,monthly,growth_previous,CPALTT01GBM657N +Consumer Price Index for the United Kingdom,united_kingdom,monthly,growth_same,CPALTT01GBM659N +Consumer Price Index for the United Kingdom,united_kingdom,quarterly,growth_previous,CPALTT01GBQ657N +Consumer Price Index for the United Kingdom,united_kingdom,quarterly,growth_same,CPALTT01GBQ659N +Consumer Price Index for the United States,united_states,annual,index_2015,CPALCY01USA661N +Consumer Price Index for the United States,united_states,monthly,index_2015,CPALCY01USM661N +Consumer Price Index for the United States,united_states,quarterly,index_2015,CPALCY01USQ661N +Consumer Price Index for the United States,united_states,annual,growth_previous,CPALTT01USA657N +Consumer Price Index for the United States,united_states,annual,growth_same,CPALTT01USA659N +Consumer Price Index for the United States,united_states,annual,index_2015,CPALTT01USA661S +Consumer Price Index for the United States,united_states,monthly,growth_previous,CPALTT01USM657N +Consumer Price Index for the United States,united_states,monthly,growth_same,CPALTT01USM659N +Consumer Price Index for the United States,united_states,monthly,index_2015,CPALTT01USM661S +Consumer Price Index for the United States,united_states,quarterly,growth_previous,CPALTT01USQ657N +Consumer Price Index for the United States,united_states,quarterly,growth_same,CPALTT01USQ659N +Consumer Price Index for the United States,united_states,quarterly,index_2015,CPALTT01USQ661S +Consumer Price Index for Turkey,turkey,annual,index_2015,CPALCY01TRA661N +Consumer Price Index for Turkey,turkey,monthly,index_2015,CPALCY01TRM661N +Consumer Price Index for Turkey,turkey,quarterly,index_2015,CPALCY01TRQ661N +Consumer Price Index for Turkey,turkey,annual,growth_previous,CPALTT01TRA657N +Consumer Price Index for Turkey,turkey,annual,growth_same,CPALTT01TRA659N +Consumer Price Index for Turkey,turkey,monthly,growth_previous,CPALTT01TRM657N +Consumer Price Index for Turkey,turkey,monthly,growth_same,CPALTT01TRM659N +Consumer Price Index for Turkey,turkey,quarterly,growth_previous,CPALTT01TRQ657N +Consumer Price Index for Turkey,turkey,quarterly,growth_same,CPALTT01TRQ659N \ No newline at end of file diff --git a/openbb_sdk/providers/fred/openbb_fred/fred_base.py b/openbb_sdk/providers/fred/openbb_fred/utils/fred_base.py similarity index 97% rename from openbb_sdk/providers/fred/openbb_fred/fred_base.py rename to openbb_sdk/providers/fred/openbb_fred/utils/fred_base.py index 8374fa162e8..637aad8ac88 100644 --- a/openbb_sdk/providers/fred/openbb_fred/fred_base.py +++ b/openbb_sdk/providers/fred/openbb_fred/utils/fred_base.py @@ -1,13 +1,9 @@ -# IMPORT STANDARD from datetime import date from typing import Optional from urllib.parse import urlencode -# IMPORT THIRD-PARTY import requests -# IMPORT INTERNAL - root_url = "https://api.stlouisfed.org/fred" diff --git a/openbb_sdk/providers/fred/openbb_fred/fred_helpers.py b/openbb_sdk/providers/fred/openbb_fred/utils/fred_helpers.py similarity index 77% rename from openbb_sdk/providers/fred/openbb_fred/fred_helpers.py rename to openbb_sdk/providers/fred/openbb_fred/utils/fred_helpers.py index 3d9cf9f9709..aba13a2ff24 100644 --- a/openbb_sdk/providers/fred/openbb_fred/fred_helpers.py +++ b/openbb_sdk/providers/fred/openbb_fred/utils/fred_helpers.py @@ -1,23 +1,6 @@ -# IMPORT STANDARD import csv -import pathlib from typing import List, Literal -# IMPORT THIRD-PARTY -# IMPORT INTERNAL - - -BASE_DIR = ( - pathlib.Path(__file__).parent.parent.parent.parent.parent - / "openbb_terminal" - / "economy" - / "datasets" -) - -harmonized_cpi_path = BASE_DIR / "harmonized_cpi.csv" -cpi_path = BASE_DIR / "cpi.csv" - - CPI_COUNTRIES = Literal[ "australia", "austria", @@ -78,8 +61,8 @@ CPI_FREQUENCY = Literal["monthly", "quarterly", "annual"] def all_cpi_options(harmonized: bool = False) -> List[dict]: data = [] - the_path = harmonized_cpi_path if harmonized else cpi_path - with open(the_path, encoding="utf-8") as csv_file_handler: + file = "harmonized_cpi.csv" if harmonized else "cpi.csv" + with open(file, encoding="utf-8") as csv_file_handler: csv_reader = csv.DictReader(csv_file_handler) for rows in csv_reader: row = {key.lstrip("\ufeff"): value for key, value in rows.items()} diff --git a/openbb_sdk/providers/fred/openbb_fred/utils/harmonized_cpi.csv b/openbb_sdk/providers/fred/openbb_fred/utils/harmonized_cpi.csv new file mode 100644 index 00000000000..dfb7fabe769 --- /dev/null +++ b/openbb_sdk/providers/fred/openbb_fred/utils/harmonized_cpi.csv @@ -0,0 +1,137 @@ +title,country,frequency,units,series_id +Harmonised CPI for Austria,austria,annual,growth_previous,CPHPTT01ATA657N +Harmonised CPI for Austria,austria,annual,growth_same,CPHPTT01ATA659N +Harmonised CPI for Austria,austria,monthly,growth_previous,CPHPTT01ATM657N +Harmonised CPI for Austria,austria,monthly,growth_same,CPHPTT01ATM659N +Harmonised CPI for Austria,austria,monthly,index_2015,CP0000ATM086NEST +Harmonised CPI for Belgium,belgium,annual,growth_previous,CPHPTT01BEA657N +Harmonised CPI for Belgium,belgium,annual,growth_same,CPHPTT01BEA659N +Harmonised CPI for Belgium,belgium,monthly,growth_previous,CPHPTT01BEM657N +Harmonised CPI for Belgium,belgium,monthly,growth_same,CPHPTT01BEM659N +Harmonised CPI for Belgium,belgium,monthly,index_2015,CP0000BEM086NEST +Harmonised CPI for Bulgaria,bulgaria,monthly,index_2015,CP0000BGM086NEST +Harmonised CPI for Croatia,croatia,monthly,index_2015,CP0000HRM086NEST +Harmonised CPI for Cyprus,cyprus,monthly,index_2015,CP0000CYM086NEST +Harmonised CPI for the Czech Republic,czech_republic,annual,growth_previous,CPHPTT01CZA657N +Harmonised CPI for the Czech Republic,czech_republic,annual,growth_same,CPHPTT01CZA659N +Harmonised CPI for the Czech Republic,czech_republic,monthly,growth_previous,CPHPTT01CZM657N +Harmonised CPI for the Czech Republic,czech_republic,monthly,growth_same,CPHPTT01CZM659N +Harmonised CPI for Czech Republic,czech_republic,monthly,index_2015,CP0000CZM086NEST +Harmonised CPI for Denmark,denmark,annual,growth_previous,CPHPTT01DKA657N +Harmonised CPI for Denmark,denmark,annual,growth_same,CPHPTT01DKA659N +Harmonised CPI for Denmark,denmark,monthly,growth_previous,CPHPTT01DKM657N +Harmonised CPI for Denmark,denmark,monthly,growth_same,CPHPTT01DKM659N +Harmonised CPI for Denmark,denmark,monthly,index_2015,CP0000DKM086NEST +Harmonised CPI for Estonia,estonia,annual,growth_previous,CPHPTT01EEA657N +Harmonised CPI for Estonia,estonia,annual,growth_same,CPHPTT01EEA659N +Harmonised CPI for Estonia,estonia,annual,index_2015,CPHPTT01EEA661N +Harmonised CPI for Estonia,estonia,monthly,growth_previous,CPHPTT01EEM657N +Harmonised CPI for Estonia,estonia,monthly,growth_same,CPHPTT01EEM659N +Harmonised CPI for Estonia,estonia,monthly,index_2015,CPHPTT01EEM661N +Harmonised CPI for the Euro Area ,euro_area,annual,growth_previous,CPHPTT01EZA657N +Harmonised CPI for the Euro Area ,euro_area,annual,growth_same,CPHPTT01EZA659N +Harmonised CPI for the Euro Area ,euro_area,annual,index_2015,CPHPTT01EZA661N +Harmonised CPI for the Euro Area ,euro_area,monthly,growth_previous,CPHPTT01EZM657N +Harmonised CPI for the Euro Area ,euro_area,monthly,growth_same,CPHPTT01EZM659N +Harmonised CPI for the Euro Area ,euro_area,monthly,index_2015,CPHPTT01EZM661N +Harmonised CPI for Finland,finland,annual,growth_previous,CPHPTT01FIA657N +Harmonised CPI for Finland,finland,annual,growth_same,CPHPTT01FIA659N +Harmonised CPI for Finland,finland,monthly,growth_previous,CPHPTT01FIM657N +Harmonised CPI for Finland,finland,monthly,growth_same,CPHPTT01FIM659N +Harmonised CPI for Finland,finland,monthly,index_2015,CP0000FIM086NEST +Harmonised CPI for France,france,monthly,index_2015,CP0000FRM086NEST +Harmonised CPI for France,france,annual,growth_previous,CPHPTT01FRA657N +Harmonised CPI for France,france,annual,growth_same,CPHPTT01FRA659N +Harmonised CPI for France,france,monthly,growth_previous,CPHPTT01FRM657N +Harmonised CPI for France,france,monthly,growth_same,CPHPTT01FRM659N +Harmonised CPI for Germany,germany,annual,growth_previous,CPHPTT01DEA657N +Harmonised CPI for Germany,germany,annual,growth_same,CPHPTT01DEA659N +Harmonised CPI for Germany,germany,monthly,growth_previous,CPHPTT01DEM657N +Harmonised CPI for Germany,germany,monthly,growth_same,CPHPTT01DEM659N +Harmonised CPI for Germany,germany,monthly,index_2015,CP0000DEM086NEST +Harmonised CPI for Greece,greece,monthly,index_2015,CP0000GRM086NEST +Harmonised CPI for Greece,greece,annual,growth_previous,CPHPTT01GRA657N +Harmonised CPI for Greece,greece,annual,growth_same,CPHPTT01GRA659N +Harmonised CPI for Greece,greece,monthly,growth_previous,CPHPTT01GRM657N +Harmonised CPI for Greece,greece,monthly,growth_same,CPHPTT01GRM659N +Harmonised CPI for Hungary,hungary,monthly,index_2015,CP0000HUM086NEST +Harmonised CPI for Hungary,hungary,annual,growth_previous,CPHPTT01HUA657N +Harmonised CPI for Hungary,hungary,annual,growth_same,CPHPTT01HUA659N +Harmonised CPI for Hungary,hungary,monthly,growth_previous,CPHPTT01HUM657N +Harmonised CPI for Hungary,hungary,monthly,growth_same,CPHPTT01HUM659N +Harmonised CPI for Iceland,iceland,monthly,index_2015,CP0000ISM086NEST +Harmonised CPI for Iceland,iceland,annual,growth_previous,CPHPTT01ISA657N +Harmonised CPI for Iceland,iceland,annual,growth_same,CPHPTT01ISA659N +Harmonised CPI for Iceland,iceland,monthly,growth_previous,CPHPTT01ISM657N +Harmonised CPI for Iceland,iceland,monthly,growth_same,CPHPTT01ISM659N +Harmonised CPI for Italy,italy,monthly,index_2015,CP0000ITM086NEST +Harmonised CPI for Italy,italy,annual,growth_previous,CPHPTT01ITA657N +Harmonised CPI for Italy,italy,annual,growth_same,CPHPTT01ITA659N +Harmonised CPI for Italy,italy,monthly,growth_previous,CPHPTT01ITM657N +Harmonised CPI for Italy,italy,monthly,growth_same,CPHPTT01ITM659N +Harmonised CPI for Latvia,latvia,monthly,index_2015,CP0000LVM086NEST +Harmonised CPI for Lithuania,lithuania,monthly,index_2015,CP0000LTM086NEST +Harmonised CPI for Luxembourg,luxembourg,monthly,index_2015,CP0000LUM086NEST +Harmonised CPI for Luxembourg,luxembourg,annual,growth_previous,CPHPTT01LUA657N +Harmonised CPI for Luxembourg,luxembourg,annual,growth_same,CPHPTT01LUA659N +Harmonised CPI for Luxembourg,luxembourg,monthly,growth_previous,CPHPTT01LUM657N +Harmonised CPI for Luxembourg,luxembourg,monthly,growth_same,CPHPTT01LUM659N +Harmonised CPI for Malta,malta,monthly,index_2015,CP0000MTM086NEST +Harmonised CPI for Netherlands,netherlands,monthly,index_2015,CP0000NLM086NEST +Harmonised CPI for the Netherlands,netherlands,annual,growth_previous,CPHPTT01NLA657N +Harmonised CPI for the Netherlands,netherlands,annual,growth_same,CPHPTT01NLA659N +Harmonised CPI for the Netherlands,netherlands,monthly,growth_previous,CPHPTT01NLM657N +Harmonised CPI for the Netherlands,netherlands,monthly,growth_same,CPHPTT01NLM659N +Harmonised CPI for Norway,norway,monthly,index_2015,CP0000NOM086NEST +Harmonised CPI for Norway,norway,annual,growth_previous,CPHPTT01NOA657N +Harmonised CPI for Norway,norway,annual,growth_same,CPHPTT01NOA659N +Harmonised CPI for Norway,norway,monthly,growth_previous,CPHPTT01NOM657N +Harmonised CPI for Norway,norway,monthly,growth_same,CPHPTT01NOM659N +Harmonised CPI for Poland,poland,monthly,index_2015,CP0000PLM086NEST +Harmonised CPI for Poland,poland,annual,growth_previous,CPHPTT01PLA657N +Harmonised CPI for Poland,poland,annual,growth_same,CPHPTT01PLA659N +Harmonised CPI for Poland,poland,monthly,growth_previous,CPHPTT01PLM657N +Harmonised CPI for Poland,poland,monthly,growth_same,CPHPTT01PLM659N +Harmonised CPI for Portugal,portugal,monthly,index_2015,CP0000PTM086NEST +Harmonised CPI for Portugal,portugal,annual,growth_previous,CPHPTT01PTA657N +Harmonised CPI for Portugal,portugal,annual,growth_same,CPHPTT01PTA659N +Harmonised CPI for Portugal,portugal,monthly,growth_previous,CPHPTT01PTM657N +Harmonised CPI for Portugal,portugal,monthly,growth_same,CPHPTT01PTM659N +Harmonised CPI for Romania,romania,monthly,index_2015,CP0000ROM086NEST +Harmonised CPI for the Slovak Republic,slovak_republic,annual,growth_previous,CPHPTT01SKA657N +Harmonised CPI for the Slovak Republic,slovak_republic,annual,growth_same,CPHPTT01SKA659N +Harmonised CPI for the Slovak Republic,slovak_republic,monthly,growth_previous,CPHPTT01SKM657N +Harmonised CPI for the Slovak Republic,slovak_republic,monthly,growth_same,CPHPTT01SKM659N +Harmonised CPI for Slovakia,slovakia,monthly,index_2015,CP0000SKM086NEST +Harmonised CPI for Slovenia,slovenia,monthly,index_2015,CP0000SIM086NEST +Harmonised CPI for Slovenia,slovenia,annual,growth_previous,CPHPTT01SIA657N +Harmonised CPI for Slovenia,slovenia,annual,growth_same,CPHPTT01SIA659N +Harmonised CPI for Slovenia,slovenia,monthly,growth_previous,CPHPTT01SIM657N +Harmonised CPI for Slovenia,slovenia,monthly,growth_same,CPHPTT01SIM659N +Harmonised CPI for Spain,spain,annual,growth_previous,CPHPTT01ESA657N +Harmonised CPI for Spain,spain,annual,growth_same,CPHPTT01ESA659N +Harmonised CPI for Spain,spain,monthly,growth_previous,CPHPTT01ESM657N +Harmonised CPI for Spain,spain,monthly,growth_same,CPHPTT01ESM659N +Harmonised CPI for Spain,spain,monthly,index_2015,CP0000ESM086NEST +Harmonised CPI for Sweden,sweden,monthly,index_2015,CP0000SEM086NEST +Harmonised CPI for Sweden,sweden,annual,growth_previous,CPHPTT01SEA657N +Harmonised CPI for Sweden,sweden,annual,growth_same,CPHPTT01SEA659N +Harmonised CPI for Sweden,sweden,monthly,growth_previous,CPHPTT01SEM657N +Harmonised CPI for Sweden,sweden,monthly,growth_same,CPHPTT01SEM659N +Harmonised CPI for Switzerland,switzerland,annual,growth_previous,CPHPTT01CHA657N +Harmonised CPI for Switzerland,switzerland,annual,growth_same,CPHPTT01CHA659N +Harmonised CPI for Switzerland,switzerland,monthly,growth_previous,CPHPTT01CHM657N +Harmonised CPI for Switzerland,switzerland,monthly,growth_same,CPHPTT01CHM659N +Harmonised CPI for Switzerland,switzerland,monthly,index_2015,CP0000CHM086NEST +Harmonised CPI for Turkey,turkey,monthly,index_2015,CP0000TRM086NEST +Harmonised CPI for Turkey,turkey,annual,growth_previous,CPHPTT01TRA657N +Harmonised CPI for Turkey,turkey,annual,growth_same,CPHPTT01TRA659N +Harmonised CPI for Turkey,turkey,monthly,growth_previous,CPHPTT01TRM657N +Harmonised CPI for Turkey,turkey,monthly,growth_same,CPHPTT01TRM659N +Harmonised CPI for the United Kingdom,united_kingdom,annual,growth_same,CPHPTT01GBA659N +Harmonised CPI for the United Kingdom,united_kingdom,monthly,growth_same,CPHPTT01GBM659N +Harmonised CPI for United States,united_states,monthly,index_2015,CP0000USM086NEST +Harmonised CPI for the United States,united_states,annual,growth_previous,CPHPTT01USA657N +Harmonised CPI for the United States,united_states,annual,growth_same,CPHPTT01USA659N +Harmonised CPI for the United States,united_states,monthly,growth_previous,CPHPTT01USM657N +Harmonised CPI for the United States,united_states,monthly,growth_same,CPHPTT01USM659N \ No newline at end of file diff --git a/openbb_sdk/providers/polygon/openbb_polygon/models/__init__.py b/openbb_sdk/providers/polygon/openbb_polygon/models/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/providers/polygon/openbb_polygon/balance_sheet.py b/openbb_sdk/providers/polygon/openbb_polygon/models/balance_sheet.py similarity index 95% rename from openbb_sdk/providers/polygon/openbb_polygon/balance_sheet.py rename to openbb_sdk/providers/polygon/openbb_polygon/models/balance_sheet.py index 8bd1b22fba8..2835de250e8 100644 --- a/openbb_sdk/providers/polygon/openbb_polygon/balance_sheet.py +++ b/openbb_sdk/providers/polygon/openbb_polygon/models/balance_sheet.py @@ -1,8 +1,6 @@ -# IMPORT STANDARD from datetime import date as dateType from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer, get_querystring @@ -10,12 +8,10 @@ from openbb_provider.models.balance_sheet import ( BalanceSheetData, BalanceSheetQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import Field -from openbb_polygon.helpers import get_data -from openbb_polygon.types import PolygonFundamentalQueryParams +from openbb_polygon.utils.helpers import get_data +from openbb_polygon.utils.types import PolygonFundamentalQueryParams class PolygonBalanceSheetQueryParams(PolygonFundamentalQueryParams): diff --git a/openbb_sdk/providers/polygon/openbb_polygon/cash_flow.py b/openbb_sdk/providers/polygon/openbb_polygon/models/cash_flow.py similarity index 96% rename from openbb_sdk/providers/polygon/openbb_polygon/cash_flow.py rename to openbb_sdk/providers/polygon/openbb_polygon/models/cash_flow.py index b1302f62b35..6c82e04d9fc 100644 --- a/openbb_sdk/providers/polygon/openbb_polygon/cash_flow.py +++ b/openbb_sdk/providers/polygon/openbb_polygon/models/cash_flow.py @@ -1,11 +1,9 @@ -# IMPORT STANDARD from datetime import ( date as dateType, datetime, ) from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer, get_querystring @@ -13,12 +11,10 @@ from openbb_provider.models.cash_flows import ( CashFlowStatementData, CashFlowStatementQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import Field -from openbb_polygon.helpers import get_data -from openbb_polygon.types import PolygonFundamentalQueryParams +from openbb_polygon.utils.helpers import get_data +from openbb_polygon.utils.types import PolygonFundamentalQueryParams # noqa: E501 diff --git a/openbb_sdk/providers/polygon/openbb_polygon/crypto_eod.py b/openbb_sdk/providers/polygon/openbb_polygon/models/crypto_eod.py similarity index 95% rename from openbb_sdk/providers/polygon/openbb_polygon/crypto_eod.py rename to openbb_sdk/providers/polygon/openbb_polygon/models/crypto_eod.py index a2cc03948ae..b79c6a4c469 100644 --- a/openbb_sdk/providers/polygon/openbb_polygon/crypto_eod.py +++ b/openbb_sdk/providers/polygon/openbb_polygon/models/crypto_eod.py @@ -1,20 +1,16 @@ """Polygon crypto end of day fetcher.""" -# IMPORT STANDARD + from datetime import datetime, timedelta from typing import Dict, List, Optional from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.crypto_eod import CryptoEODData, CryptoEODQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field, NonNegativeFloat, PositiveFloat, PositiveInt -from openbb_polygon.helpers import get_data -from openbb_polygon.types import BaseStockData, BaseStockQueryParams +from openbb_polygon.utils.helpers import get_data +from openbb_polygon.utils.types import BaseStockData, BaseStockQueryParams class PolygonCryptoEODQueryParams(BaseStockQueryParams): diff --git a/openbb_sdk/providers/polygon/openbb_polygon/crypto_price.py b/openbb_sdk/providers/polygon/openbb_polygon/models/crypto_price.py similarity index 94% rename from openbb_sdk/providers/polygon/openbb_polygon/crypto_price.py rename to openbb_sdk/providers/polygon/openbb_polygon/models/crypto_price.py index 3938e5f8f00..d02d9f9518e 100644 --- a/openbb_sdk/providers/polygon/openbb_polygon/crypto_price.py +++ b/openbb_sdk/providers/polygon/openbb_polygon/models/crypto_price.py @@ -1,20 +1,16 @@ """Polygon Crypto Price fetcher.""" -# IMPORT STANDARD + from datetime import datetime from typing import Dict, List, Optional from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.crypto_price import CryptoPriceData, CryptoPriceQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field, NonNegativeFloat, PositiveFloat, PositiveInt -from openbb_polygon.helpers import get_data -from openbb_polygon.types import BaseStockData, BaseStockQueryParams +from openbb_polygon.utils.helpers import get_data +from openbb_polygon.utils.types import BaseStockData, BaseStockQueryParams class PolygonCryptoPriceQueryParams(BaseStockQueryParams): diff --git a/openbb_sdk/providers/polygon/openbb_polygon/forex_eod.py b/openbb_sdk/providers/polygon/openbb_polygon/models/forex_eod.py similarity index 95% rename from openbb_sdk/providers/polygon/openbb_polygon/forex_eod.py rename to openbb_sdk/providers/polygon/openbb_polygon/models/forex_eod.py index 93230d86447..7954927b500 100644 --- a/openbb_sdk/providers/polygon/openbb_polygon/forex_eod.py +++ b/openbb_sdk/providers/polygon/openbb_polygon/models/forex_eod.py @@ -1,20 +1,17 @@ """Polygon forex end of day fetcher.""" -# IMPORT STANDARD + from datetime import date, datetime, timedelta from typing import Dict, List, Literal, Optional, Union -# IMPORT INTERNAL from openbb_provider.abstract.data import QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer from openbb_provider.models.forex_eod import ForexEODData, ForexEODQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field, NonNegativeFloat, PositiveFloat, PositiveInt -from openbb_polygon.helpers import get_data -from openbb_polygon.types import BaseStockData, Timespan +from openbb_polygon.utils.helpers import get_data +from openbb_polygon.utils.types import BaseStockData, Timespan class PolygonForexEODQueryParams(QueryParams): diff --git a/openbb_sdk/providers/polygon/openbb_polygon/forex_price.py b/openbb_sdk/providers/polygon/openbb_polygon/models/forex_price.py similarity index 94% rename from openbb_sdk/providers/polygon/openbb_polygon/forex_price.py rename to openbb_sdk/providers/polygon/openbb_polygon/models/forex_price.py index 69459c637ea..fa69051cbaf 100644 --- a/openbb_sdk/providers/polygon/openbb_polygon/forex_price.py +++ b/openbb_sdk/providers/polygon/openbb_polygon/models/forex_price.py @@ -1,20 +1,16 @@ """Polygon Forex Price fetcher.""" -# IMPORT STANDARD + from datetime import datetime from typing import Dict, List, Optional from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.forex_price import ForexPriceData, ForexPriceQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field, NonNegativeFloat, PositiveFloat, PositiveInt -from openbb_polygon.helpers import get_data -from openbb_polygon.types import BaseStockData, BaseStockQueryParams +from openbb_polygon.utils.helpers import get_data +from openbb_polygon.utils.types import BaseStockData, BaseStockQueryParams class PolygonForexPriceQueryParams(BaseStockQueryParams): diff --git a/openbb_sdk/providers/polygon/openbb_polygon/income_statement.py b/openbb_sdk/providers/polygon/openbb_polygon/models/income_statement.py similarity index 97% rename from openbb_sdk/providers/polygon/openbb_polygon/income_statement.py rename to openbb_sdk/providers/polygon/openbb_polygon/models/income_statement.py index 8f807a4888b..26850fdadbe 100644 --- a/openbb_sdk/providers/polygon/openbb_polygon/income_statement.py +++ b/openbb_sdk/providers/polygon/openbb_polygon/models/income_statement.py @@ -1,11 +1,9 @@ -# IMPORT STANDARD from datetime import ( date as dateType, datetime, ) from typing import Dict, List, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer, get_querystring @@ -13,12 +11,10 @@ from openbb_provider.models.income_statement import ( IncomeStatementData, IncomeStatementQueryParams, ) - -# IMPORT THIRD-PARTY from pydantic import Field -from openbb_polygon.helpers import get_data -from openbb_polygon.types import PolygonFundamentalQueryParams +from openbb_polygon.utils.helpers import get_data +from openbb_polygon.utils.types import PolygonFundamentalQueryParams class PolygonIncomeStatementQueryParams(PolygonFundamentalQueryParams): diff --git a/openbb_sdk/providers/polygon/openbb_polygon/major_indices_eod.py b/openbb_sdk/providers/polygon/openbb_polygon/models/major_indices_eod.py similarity index 94% rename from openbb_sdk/providers/polygon/openbb_polygon/major_indices_eod.py rename to openbb_sdk/providers/polygon/openbb_polygon/models/major_indices_eod.py index 179473e5e83..b5faf53da3e 100644 --- a/openbb_sdk/providers/polygon/openbb_polygon/major_indices_eod.py +++ b/openbb_sdk/providers/polygon/openbb_polygon/models/major_indices_eod.py @@ -1,21 +1,18 @@ """Polygon major indices end of day fetcher.""" -# IMPORT STANDARD + from datetime import datetime from typing import Dict, List, Optional from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.major_indices_eod import ( MajorIndicesEODData, MajorIndicesEODQueryParams, ) -# IMPORT THIRD-PARTY -from openbb_polygon.helpers import get_data -from openbb_polygon.types import BaseStockData, BaseStockQueryParams +from openbb_polygon.utils.helpers import get_data +from openbb_polygon.utils.types import BaseStockData, BaseStockQueryParams class PolygonMajorIndicesEODQueryParams(BaseStockQueryParams): diff --git a/openbb_sdk/providers/polygon/openbb_polygon/major_indices_price.py b/openbb_sdk/providers/polygon/openbb_polygon/models/major_indices_price.py similarity index 95% rename from openbb_sdk/providers/polygon/openbb_polygon/major_indices_price.py rename to openbb_sdk/providers/polygon/openbb_polygon/models/major_indices_price.py index f4987eee1ac..9c0c5a8269c 100644 --- a/openbb_sdk/providers/polygon/openbb_polygon/major_indices_price.py +++ b/openbb_sdk/providers/polygon/openbb_polygon/models/major_indices_price.py @@ -1,20 +1,17 @@ """Polygon major indices price fetcher.""" -# IMPORT STANDARD + from typing import Dict, List, Optional from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.major_indices_price import ( MajorIndicesPriceData, MajorIndicesPriceQueryParams, ) -# IMPORT THIRD-PARTY -from .helpers import get_data -from .types import BaseStockData, BaseStockQueryParams +from openbb_polygon.utils.helpers import get_data +from openbb_polygon.utils.types import BaseStockData, BaseStockQueryParams class PolygonMajorIndicesPriceQueryParams(BaseStockQueryParams): diff --git a/openbb_sdk/providers/polygon/openbb_polygon/stock_eod.py b/openbb_sdk/providers/polygon/openbb_polygon/models/stock_eod.py similarity index 94% rename from openbb_sdk/providers/polygon/openbb_polygon/stock_eod.py rename to openbb_sdk/providers/polygon/openbb_polygon/models/stock_eod.py index 045260760f8..8981a248270 100644 --- a/openbb_sdk/providers/polygon/openbb_polygon/stock_eod.py +++ b/openbb_sdk/providers/polygon/openbb_polygon/models/stock_eod.py @@ -1,20 +1,16 @@ """Polygon stocks end of day fetcher.""" -# IMPORT STANDARD + from datetime import datetime, timedelta from typing import Dict, List, Optional from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.stock_eod import StockEODData, StockEODQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field, NonNegativeFloat, PositiveFloat, PositiveInt -from openbb_polygon.helpers import get_data -from openbb_polygon.types import BaseStockData, BaseStockQueryParams +from openbb_polygon.utils.helpers import get_data +from openbb_polygon.utils.types import BaseStockData, BaseStockQueryParams class PolygonStockEODQueryParams(BaseStockQueryParams): diff --git a/openbb_sdk/providers/polygon/openbb_polygon/stock_news.py b/openbb_sdk/providers/polygon/openbb_polygon/models/stock_news.py similarity index 97% rename from openbb_sdk/providers/polygon/openbb_polygon/stock_news.py rename to openbb_sdk/providers/polygon/openbb_polygon/models/stock_news.py index 134d08a55c6..2d27afa2a57 100644 --- a/openbb_sdk/providers/polygon/openbb_polygon/stock_news.py +++ b/openbb_sdk/providers/polygon/openbb_polygon/models/stock_news.py @@ -1,19 +1,16 @@ """Polygon Stock News Fetcher.""" -# IMPORT STANDARD + from datetime import datetime from typing import Dict, List, Literal, Optional -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer, get_querystring from openbb_provider.models.stock_news import StockNewsData, StockNewsQueryParams - -# IMPORT THIRD-PARTY from pydantic import BaseModel, Field -from openbb_polygon.helpers import get_data +from openbb_polygon.utils.helpers import get_data class PolygonStockNewsQueryParams(QueryParams): diff --git a/openbb_sdk/providers/polygon/openbb_polygon/stock_price.py b/openbb_sdk/providers/polygon/openbb_polygon/models/stock_price.py similarity index 94% rename from openbb_sdk/providers/polygon/openbb_polygon/stock_price.py rename to openbb_sdk/providers/polygon/openbb_polygon/models/stock_price.py index a674ce259f6..083ab8338af 100644 --- a/openbb_sdk/providers/polygon/openbb_polygon/stock_price.py +++ b/openbb_sdk/providers/polygon/openbb_polygon/models/stock_price.py @@ -1,20 +1,16 @@ """Polygon stocks price fetcher.""" -# IMPORT STANDARD + from datetime import datetime from typing import Dict, List, Optional from openbb_provider.abstract.fetcher import Fetcher from openbb_provider.helpers import data_transformer - -# IMPORT INTERNAL from openbb_provider.models.stock_price import StockPriceData, StockPriceQueryParams - -# IMPORT THIRD-PARTY from pydantic import Field, NonNegativeFloat, PositiveFloat, PositiveInt -from openbb_polygon.helpers import get_data -from openbb_polygon.types import BaseStockData, BaseStockQueryParams +from openbb_polygon.utils.helpers import get_data +from openbb_polygon.utils.types import BaseStockData, BaseStockQueryParams class PolygonStockPriceQueryParams(BaseStockQueryParams): diff --git a/openbb_sdk/providers/polygon/openbb_polygon/provider.py b/openbb_sdk/providers/polygon/openbb_polygon/provider.py index 32c29b8e9ea..dabee82dc54 100644 --- a/openbb_sdk/providers/polygon/openbb_polygon/provider.py +++ b/openbb_sdk/providers/polygon/openbb_polygon/provider.py @@ -1,24 +1,20 @@ """Polygon provider module.""" -# IMPORT STANDARD -# IMPORT INTERNAL from openbb_provider.abstract.provider import Provider -from openbb_polygon.balance_sheet import PolygonBalanceSheetFetcher -from openbb_polygon.cash_flow import PolygonCashFlowStatementFetcher -from openbb_polygon.crypto_eod import PolygonCryptoEODFetcher -from openbb_polygon.crypto_price import PolygonCryptoPriceFetcher -from openbb_polygon.forex_eod import PolygonForexEODFetcher -from openbb_polygon.forex_price import PolygonForexPriceFetcher -from openbb_polygon.income_statement import PolygonIncomeStatementFetcher -from openbb_polygon.major_indices_eod import PolygonMajorIndicesEODFetcher -from openbb_polygon.major_indices_price import PolygonMajorIndicesPriceFetcher -from openbb_polygon.stock_eod import PolygonStockEODFetcher -from openbb_polygon.stock_news import PolygonStockNewsFetcher -from openbb_polygon.stock_price import PolygonStockPriceFetcher - -# IMPORT THIRD-PARTY +from openbb_polygon.models.balance_sheet import PolygonBalanceSheetFetcher +from openbb_polygon.models.cash_flow import PolygonCashFlowStatementFetcher +from openbb_polygon.models.crypto_eod import PolygonCryptoEODFetcher +from openbb_polygon.models.crypto_price import PolygonCryptoPriceFetcher +from openbb_polygon.models.forex_eod import PolygonForexEODFetcher +from openbb_polygon.models.forex_price import PolygonForexPriceFetcher +from openbb_polygon.models.income_statement import PolygonIncomeStatementFetcher +from openbb_polygon.models.major_indices_eod import PolygonMajorIndicesEODFetcher +from openbb_polygon.models.major_indices_price import PolygonMajorIndicesPriceFetcher +from openbb_polygon.models.stock_eod import PolygonStockEODFetcher +from openbb_polygon.models.stock_news import PolygonStockNewsFetcher +from openbb_polygon.models.stock_price import PolygonStockPriceFetcher # mypy: disable-error-code="list-item" polygon_provider = Provider( diff --git a/openbb_sdk/providers/polygon/openbb_polygon/utils/__init__.py b/openbb_sdk/providers/polygon/openbb_polygon/utils/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/providers/polygon/openbb_polygon/helpers.py b/openbb_sdk/providers/polygon/openbb_polygon/utils/helpers.py similarity index 90% rename from openbb_sdk/providers/polygon/openbb_polygon/helpers.py rename to openbb_sdk/providers/polygon/openbb_polygon/utils/helpers.py index 941181df868..3dd68dad73e 100644 --- a/openbb_sdk/providers/polygon/openbb_polygon/helpers.py +++ b/openbb_sdk/providers/polygon/openbb_polygon/utils/helpers.py @@ -1,11 +1,6 @@ -# IMPORT STANDARD - - # IMPORT THIRD PARTY import requests -# IMPORT INTERNAL - def get_data(url: str) -> dict: r = requests.get(url, timeout=10) diff --git a/openbb_sdk/providers/polygon/openbb_polygon/types.py b/openbb_sdk/providers/polygon/openbb_polygon/utils/types.py similarity index 98% rename from openbb_sdk/providers/polygon/openbb_polygon/types.py rename to openbb_sdk/providers/polygon/openbb_polygon/utils/types.py index a601504e443..fe123d35c25 100644 --- a/openbb_sdk/providers/polygon/openbb_polygon/types.py +++ b/openbb_sdk/providers/polygon/openbb_polygon/utils/types.py @@ -1,14 +1,11 @@ """Polygon types helpers.""" -# IMPORT STANDARD + from datetime import date, datetime, timedelta from enum import Enum from typing import Literal, Optional, Union -# IMPORT INTERNAL from openbb_provider.abstract.data import Data, QueryParams - -# IMPORT THIRD-PARTY from pydantic import Field, PositiveFloat, PositiveInt, validator diff --git a/openbb_sdk/sdk/core/README.md b/openbb_sdk/sdk/core/README.md index a580e62fb8c..781854fc0fc 100644 --- a/openbb_sdk/sdk/core/README.md +++ b/openbb_sdk/sdk/core/README.md @@ -253,7 +253,7 @@ sdk.settings.defaults Check your system settings. Most of the properties are read-only during runtime, so any changes there will be void. -- `debug_mode`: here if you set `debug_mode = True` any exception that occurs during execution will be raised immediatly. +- `debug_mode`: here if you set `debug_mode = True` any exception that occurs during execution will be raised immediately. ```python from openbb import sdk diff --git a/openbb_sdk/sdk/provider/openbb_provider/models/cpi.py b/openbb_sdk/sdk/provider/openbb_provider/models/cpi.py index 0ee7803b458..a20ad37a2e9 100644 --- a/openbb_sdk/sdk/provider/openbb_provider/models/cpi.py +++ b/openbb_sdk/sdk/provider/openbb_provider/models/cpi.py @@ -1,7 +1,7 @@ from datetime import date as dateType from typing import Dict, List, Optional -from openbb_fred.fred_helpers import CPI_COUNTRIES, CPI_FREQUENCY, CPI_UNITS +from openbb_fred.utils.fred_helpers import CPI_COUNTRIES, CPI_FREQUENCY, CPI_UNITS from pydantic import BaseModel, validator from openbb_provider.abstract.data import Data, QueryParams From 703efb954194350ab2114701604fa2ae20d4028f Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Tue, 25 Jul 2023 13:03:56 +0200 Subject: [PATCH 04/98] Provider interface unit tests --- openbb_sdk/sdk/core/pyproject.toml | 1 + .../sdk/core/tests/test_provider_interface.py | 100 ++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 openbb_sdk/sdk/core/tests/test_provider_interface.py diff --git a/openbb_sdk/sdk/core/pyproject.toml b/openbb_sdk/sdk/core/pyproject.toml index 99d6bdbf9ee..753b43804c4 100644 --- a/openbb_sdk/sdk/core/pyproject.toml +++ b/openbb_sdk/sdk/core/pyproject.toml @@ -26,6 +26,7 @@ openbb-provider = { path = "../provider" } [tool.poetry.group.dev.dependencies] openbb-provider = { path = "../provider" } +pytest = "^6.2.2" [build-system] requires = ["poetry-core"] diff --git a/openbb_sdk/sdk/core/tests/test_provider_interface.py b/openbb_sdk/sdk/core/tests/test_provider_interface.py new file mode 100644 index 00000000000..e61fdda19ca --- /dev/null +++ b/openbb_sdk/sdk/core/tests/test_provider_interface.py @@ -0,0 +1,100 @@ +"""Test provider interface.""" +# pylint: disable=redefined-outer-name + +import pytest +from openbb_core.app.provider_interface import ( + ProviderChoices, + ProviderInterface, + ProviderRegistry, + get_provider_interface, +) + + +@pytest.fixture(scope="module") +def provider_interface(): + """Set up provider_interface.""" + return ProviderInterface() + + +def test_init(provider_interface): + """Test init.""" + assert provider_interface + + +def test_get_provider_interface(): + """Test get provider interface.""" + assert isinstance(get_provider_interface(), ProviderInterface) + + +def test_map(provider_interface): + """Test map.""" + provider_interface_map = provider_interface.map + assert isinstance(provider_interface_map, dict) + assert len(provider_interface_map) > 0 + assert "StockEOD" in provider_interface_map + + +def test_required_credentials(provider_interface): + """Test required credentials.""" + required_credentials = provider_interface.required_credentials + assert isinstance(required_credentials, dict) + assert len(required_credentials) > 0 + + +def test_model_providers(provider_interface): + """Test model providers.""" + model_providers = provider_interface.model_providers + assert isinstance(model_providers, dict) + assert len(model_providers) > 0 + + +def test_params(provider_interface): + """Test params.""" + params = provider_interface.params + assert isinstance(params, dict) + assert len(params) > 0 + assert "StockEOD" in params + + +def test_data(provider_interface): + """Test data.""" + data = provider_interface.data + assert isinstance(data, dict) + assert len(data) > 0 + assert "StockEOD" in data + + +def test_merged_data(provider_interface): + """Test merged data.""" + merged_data = provider_interface.merged_data + assert isinstance(merged_data, dict) + assert len(merged_data) > 0 + assert "StockEOD" in merged_data + + +def test_providers_literal(provider_interface): + """Test providers literal.""" + providers_literal = provider_interface.providers_literal + assert isinstance(type(providers_literal), type) + assert len(providers_literal.__args__) > 0 + assert "openbb" not in providers_literal.__args__ + + +def test_provider_choices(provider_interface): + """Test provider choices.""" + provider_choices = provider_interface.provider_choices + assert isinstance(provider_choices, type(ProviderChoices)) + + +def test_models(provider_interface): + """Test models.""" + models = provider_interface.models + assert isinstance(models, list) + assert len(models) > 0 + assert "StockEOD" in models + + +def test_build_registry(provider_interface): + """Test build registry.""" + build_registry = provider_interface.build_registry() + assert isinstance(build_registry, ProviderRegistry) From 4b6ce1c4d32caba88e682911791c93c992366545 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Tue, 25 Jul 2023 13:43:46 +0200 Subject: [PATCH 05/98] Query unit tests --- openbb_sdk/sdk/core/tests/test_query.py | 79 +++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 openbb_sdk/sdk/core/tests/test_query.py diff --git a/openbb_sdk/sdk/core/tests/test_query.py b/openbb_sdk/sdk/core/tests/test_query.py new file mode 100644 index 00000000000..abd5809a59e --- /dev/null +++ b/openbb_sdk/sdk/core/tests/test_query.py @@ -0,0 +1,79 @@ +"""Test the Query class.""" +# pylint: disable=redefined-outer-name + +from dataclasses import dataclass + +import pytest +from openbb_core.app.model.command_context import CommandContext +from openbb_core.app.provider_interface import ( + ExtraParams, + ProviderChoices, + StandardParams, +) +from openbb_core.app.query import Query + + +@pytest.fixture(scope="module") +def query(): + """Set up query.""" + return Query( + cc=CommandContext(), + provider_choices=ProviderChoices(provider="fmp"), + standard_params=StandardParams(), + extra_params=ExtraParams(), + ) + + +def test_init(query): + """Test init.""" + assert query + + +def test_to_query_params(query): + """Test to_query_params.""" + + class StockEOD: + """Mock StockEOD class.""" + + open: float = 0.0 + high: float = 0.0 + + standard_params = StockEOD() + assert query.to_query_params(standard_params) + + +def test_filter_extra_params(query): + """Test filter_extra_params.""" + + @dataclass + class StockEOD: + """Mock ExtraParams dataclass.""" + + sort: str = "desc" + + extra_params = StockEOD() + extra_params = query.filter_extra_params(extra_params, "fmp") + print(extra_params) + assert isinstance(extra_params, dict) + assert len(extra_params) == 0 + + +def test_filter_extra_params_wrong_param(query): + """Test filter_extra_params.""" + + @dataclass + class StockEOD: + """Mock ExtraParams dataclass.""" + + sort: str = "desc" + limit: int = 4 + + extra_params = StockEOD() + + assert not query.filter_extra_params(extra_params, "fmp") + + +@pytest.mark.skip(reason="TODO: see how to properly mock the execute method") +def test_execute(query): + """Test execute.""" + assert query.execute() From 713d1c0b9af3da8e84d5ba405dc35b16d35d9974 Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Tue, 25 Jul 2023 13:05:36 +0100 Subject: [PATCH 06/98] adding tests for handler manager --- .../openbb_core/app/logs/handlers_manager.py | 2 - .../app/logs/models/logging_settings.py | 9 ++- .../tests/app/logs/test_handlers_manager.py | 74 +++++++++++++++++++ 3 files changed, 82 insertions(+), 3 deletions(-) create mode 100644 openbb_sdk/sdk/core/tests/app/logs/test_handlers_manager.py diff --git a/openbb_sdk/sdk/core/openbb_core/app/logs/handlers_manager.py b/openbb_sdk/sdk/core/openbb_core/app/logs/handlers_manager.py index 71c50776c6b..3f2229b13c0 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/logs/handlers_manager.py +++ b/openbb_sdk/sdk/core/openbb_core/app/logs/handlers_manager.py @@ -16,8 +16,6 @@ from openbb_core.app.logs.models.logging_settings import LoggingSettings class HandlersManager: def __init__(self, settings: LoggingSettings): - self.is_initialized = True - self._handlers = settings.handler_list self._settings = settings diff --git a/openbb_sdk/sdk/core/openbb_core/app/logs/models/logging_settings.py b/openbb_sdk/sdk/core/openbb_core/app/logs/models/logging_settings.py index e618167101b..13ef49ccbb3 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/logs/models/logging_settings.py +++ b/openbb_sdk/sdk/core/openbb_core/app/logs/models/logging_settings.py @@ -8,7 +8,14 @@ from openbb_core.app.model.user_settings import UserSettings # pylint: disable=too-many-instance-attributes class LoggingSettings: - def __init__(self, user_settings: UserSettings, system_settings: SystemSettings): + def __init__( + self, + user_settings: Optional[UserSettings] = None, + system_settings: Optional[SystemSettings] = None, + ): + user_settings = user_settings or UserSettings() + system_settings = system_settings or SystemSettings() + user_data_directory = ( str(Path.home() / "OpenBBUserData") if not user_settings.preferences diff --git a/openbb_sdk/sdk/core/tests/app/logs/test_handlers_manager.py b/openbb_sdk/sdk/core/tests/app/logs/test_handlers_manager.py new file mode 100644 index 00000000000..f6abf90be8c --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/logs/test_handlers_manager.py @@ -0,0 +1,74 @@ +import logging +from unittest.mock import Mock, patch + +from openbb_core.app.logs.handlers_manager import HandlersManager + + +class MockPosthogHandler(logging.NullHandler): + def __init__(self, settings): + self.settings = settings + + +class MockPathTrackingFileHandler(logging.NullHandler): + def __init__(self, settings): + self.settings = settings + + +class MockFormatterWithExceptions(logging.Formatter): + def __init__(self, settings): + self.settings = settings + + +def test_handlers_added_correctly(): + with patch( + "openbb_core.app.logs.handlers_manager.PosthogHandler", + MockPosthogHandler, + ), patch( + "openbb_core.app.logs.handlers_manager.PathTrackingFileHandler", + MockPathTrackingFileHandler, + ), patch( + "openbb_core.app.logs.handlers_manager.FormatterWithExceptions", + MockFormatterWithExceptions, + ): + settings = Mock() + settings.handler_list = ["stdout", "stderr", "noop", "file", "posthog"] + _ = HandlersManager(settings=settings) + + handlers = logging.getLogger().handlers + + assert len(handlers) >= 5 + + for handler in handlers: + assert isinstance(handler, (logging.NullHandler, logging.StreamHandler)) + + for mock in [MockPosthogHandler, MockPathTrackingFileHandler]: + assert any(isinstance(handler, mock) for handler in handlers) + + +def test_update_handlers(): + with patch( + "openbb_core.app.logs.handlers_manager.PosthogHandler", + MockPosthogHandler, + ), patch( + "openbb_core.app.logs.handlers_manager.PathTrackingFileHandler", + MockPathTrackingFileHandler, + ), patch( + "openbb_core.app.logs.handlers_manager.FormatterWithExceptions", + MockFormatterWithExceptions, + ): + settings = Mock() + settings.handler_list = ["file", "posthog"] + settings.any_other_attr = "mock_settings" + handlers_manager = HandlersManager(settings=settings) + + changed_settings = Mock() + changed_settings.any_other_attr = "changed_settings" + + handlers_manager.update_handlers(settings=changed_settings) + + handlers = logging.getLogger().handlers + + for hdlr in handlers: + if isinstance(hdlr, (MockPosthogHandler, MockPathTrackingFileHandler)): + assert hdlr.settings == changed_settings + assert hdlr.formatter.settings == changed_settings From 7adc739b02056cb72f42cf6ecd988ca217d8452c Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Tue, 25 Jul 2023 14:19:02 +0200 Subject: [PATCH 07/98] Router command_validator unit tests --- openbb_sdk/sdk/core/tests/.gitkeep | 0 openbb_sdk/sdk/core/tests/test_router.py | 156 +++++++++++++++++++++++ 2 files changed, 156 insertions(+) delete mode 100644 openbb_sdk/sdk/core/tests/.gitkeep create mode 100644 openbb_sdk/sdk/core/tests/test_router.py diff --git a/openbb_sdk/sdk/core/tests/.gitkeep b/openbb_sdk/sdk/core/tests/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/openbb_sdk/sdk/core/tests/test_router.py b/openbb_sdk/sdk/core/tests/test_router.py new file mode 100644 index 00000000000..993582a4783 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/test_router.py @@ -0,0 +1,156 @@ +"""Test router.py file.""" +# pylint: disable=redefined-outer-name + +import pytest +from openbb_core.app.model.command_output import CommandOutput +from openbb_core.app.router import ( + CommandMap, + CommandValidator, + Router, + RouterLoader, + SignatureInspector, +) +from pydantic import BaseModel + + +@pytest.fixture(scope="module") +def command_validator(): + """Set up command_validator.""" + return CommandValidator() + + +def test_command_validator_init(command_validator): + """Test init.""" + assert command_validator + + +@pytest.mark.parametrize( + "type_, expected", + [ + (str, True), + (int, True), + (float, True), + (bool, True), + (list, True), + (BaseModel, False), + ], +) +def test_is_standard_pydantic_type(command_validator, type_, expected): + """Test is_standard_pydantic_type.""" + # assert command_validator.is_standard_pydantic_type(str) + assert command_validator.is_standard_pydantic_type(type_) == expected + + +def test_is_valid_pydantic_model_type(command_validator): + """Test is_valid_pydantic_model_type.""" + assert command_validator.is_valid_pydantic_model_type(BaseModel) + assert not command_validator.is_valid_pydantic_model_type(str) + + +@pytest.mark.parametrize( + "type_, expected", + [ + (str, True), + (int, True), + (float, True), + (bool, True), + (list, True), + (BaseModel, True), + ], +) +def test_is_serializable_value_type(command_validator, type_, expected): + """Test is_serializable_value_type.""" + assert command_validator.is_serializable_value_type(type_) == expected + + +def test_is_annotated_dc(command_validator): + """Test is_annotated_dc.""" + assert not command_validator.is_annotated_dc(str) + + +def test_check_reserved_param(command_validator): + """Test check_reserved_param.""" + assert command_validator.check_reserved_param("name", str, {}, str, str) is None + assert not command_validator.check_reserved_param("name", str, {}, str, int) + + +def test_check_parameters(command_validator): + """Test check_parameters.""" + + def func(): + pass + + assert command_validator.check_parameters(func) is None + assert not command_validator.check_parameters(BaseModel) + + +def test_check_return_error(command_validator): + """Test check_return fail.""" + with pytest.raises(TypeError): + + def func(): + pass + + command_validator.check_return(func) + + +def test_check_return(command_validator): + """Test check_return.""" + + def valid_function() -> CommandOutput[int]: + return CommandOutput(results=[1, 2, 3]) + + assert command_validator.check_return(valid_function) is None + + +def test_check(command_validator): + """Test check.""" + + def valid_function() -> CommandOutput[int]: + return CommandOutput(results=[1, 2, 3]) + + assert command_validator.check(valid_function) is None + + +@pytest.fixture(scope="module") +def router(): + """Set up router.""" + return Router() + + +def test_router_init(router): + """Test init.""" + assert router + + +@pytest.fixture(scope="module") +def router_loader(): + """Set up router_loader.""" + return RouterLoader() + + +def test_router_loader_init(router_loader): + """Test init.""" + assert router_loader + + +@pytest.fixture(scope="module") +def signature_inspector(): + """Set up signature_inspector.""" + return SignatureInspector() + + +def test_signature_inspector_init(signature_inspector): + """Test init.""" + assert signature_inspector + + +@pytest.fixture(scope="module") +def command_map(): + """Set up command_map.""" + return CommandMap() + + +def test_command_map_init(command_map): + """Test init.""" + assert command_map From bd9e0e81d2354c655d73cdd4beaf7082e387bd89 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Tue, 25 Jul 2023 14:19:39 +0200 Subject: [PATCH 08/98] Change settings --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 4a08b390c82..164bac106f4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -183,7 +183,7 @@ select = ["E", "W", "F", "Q", "S", "UP", "I", "PLC", "PLE", "PLR", "PLW", "SIM"] ignore = ["S105", "S106", "S107", "S110", "PLR2004", "PLR0911", "PLR0913", "PLR0912", "PLR0915", "SIM114", "SIM105", "SIM117", "PLC1901", "PLR5501","PLW2901","PLW0603"] [tool.ruff.per-file-ignores] -"tests/*" = ["S101"] +"*tests/*" = ["S101"] [tool.ruff.flake8-import-conventions.aliases] "matplotlib.pyplot" = "plt" From d3973b556ebb15f90a52516d0b16acf0e2bb82a3 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Tue, 25 Jul 2023 15:29:35 +0200 Subject: [PATCH 09/98] Router signature_inspector unit tests --- openbb_sdk/sdk/core/tests/test_router.py | 106 +++++++++++++++++++++++ 1 file changed, 106 insertions(+) diff --git a/openbb_sdk/sdk/core/tests/test_router.py b/openbb_sdk/sdk/core/tests/test_router.py index 993582a4783..77130deb77e 100644 --- a/openbb_sdk/sdk/core/tests/test_router.py +++ b/openbb_sdk/sdk/core/tests/test_router.py @@ -1,8 +1,16 @@ """Test router.py file.""" # pylint: disable=redefined-outer-name +# pylint: disable=unused-argument + import pytest +from openbb_core.app.model.command_context import CommandContext from openbb_core.app.model.command_output import CommandOutput +from openbb_core.app.provider_interface import ( + ExtraParams, + ProviderChoices, + StandardParams, +) from openbb_core.app.router import ( CommandMap, CommandValidator, @@ -123,6 +131,22 @@ def test_router_init(router): assert router +def test_command(router): + """Test command.""" + + @router.command + def valid_function() -> CommandOutput[int]: + return CommandOutput(results=[1, 2, 3]) + + assert valid_function + + +def test_include_router(router): + """Test include_router.""" + some_router = Router() + assert router.include_router(some_router) is None + + @pytest.fixture(scope="module") def router_loader(): """Set up router_loader.""" @@ -145,6 +169,88 @@ def test_signature_inspector_init(signature_inspector): assert signature_inspector +def test_complete_signature(signature_inspector): + """Test complete_signature.""" + + def sample_function( + cc: CommandContext, + provider_choices: ProviderChoices, + standard_params: StandardParams, + extra_params: ExtraParams, + ) -> CommandOutput: + pass + + model = "StockEOD" + + assert signature_inspector.complete_signature(sample_function, model) + + +def test_complete_signature_error(signature_inspector): + """Test complete_signature.""" + + def valid_function() -> CommandOutput[int]: + return CommandOutput(results=[1, 2, 3]) + + with pytest.raises(AttributeError): + signature_inspector.complete_signature(valid_function, "invalid_model") + + +def test_validate_signature(signature_inspector): + """Test validate_signature.""" + + def sample_function( + cc: CommandContext, + provider_choices: ProviderChoices, + standard_params: StandardParams, + extra_params: ExtraParams, + ) -> CommandOutput: + pass + + expected_signature = { + "cc": CommandContext, + "provider_choices": ProviderChoices, + "standard_params": StandardParams, + "extra_params": ExtraParams, + } + + assert ( + signature_inspector.validate_signature(sample_function, expected_signature) + is None + ) + + +def test_inject_dependency(signature_inspector): + """Test inject_dependency.""" + + def sample_function( + cc: CommandContext, + provider_choices: ProviderChoices, + standard_params: StandardParams, + extra_params: ExtraParams, + ) -> CommandOutput: + pass + + assert signature_inspector.inject_dependency(sample_function, "cc", CommandContext) + + +def test_get_description(signature_inspector): + """Test get_description.""" + + def some_function(): + """Some function.""" + + assert signature_inspector.get_description(some_function) == some_function.__doc__ + + +def test_get_description_no_doc(signature_inspector): + """Test get_description.""" + + def some_function(): + pass + + assert signature_inspector.get_description(some_function) == "" + + @pytest.fixture(scope="module") def command_map(): """Set up command_map.""" From 3eb48b3d75ae78039a74a1a4d6561cbe5c795977 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Tue, 25 Jul 2023 15:43:56 +0200 Subject: [PATCH 10/98] Router command_map unit tests --- openbb_sdk/sdk/core/tests/test_router.py | 42 +++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/openbb_sdk/sdk/core/tests/test_router.py b/openbb_sdk/sdk/core/tests/test_router.py index 77130deb77e..dbad3e0cce3 100644 --- a/openbb_sdk/sdk/core/tests/test_router.py +++ b/openbb_sdk/sdk/core/tests/test_router.py @@ -237,7 +237,7 @@ def test_get_description(signature_inspector): """Test get_description.""" def some_function(): - """Some function.""" + """Mock function.""" assert signature_inspector.get_description(some_function) == some_function.__doc__ @@ -260,3 +260,43 @@ def command_map(): def test_command_map_init(command_map): """Test init.""" assert command_map + + +def test_map(command_map): + """Test map.""" + assert isinstance(command_map.map, dict) + + +def test_provider_coverage(command_map): + """Test provider_coverage.""" + assert isinstance(command_map.provider_coverage, dict) + + +def test_command_coverage(command_map): + """Test command_coverage.""" + assert isinstance(command_map.command_coverage, dict) + + +def test_get_command_map(command_map, router): + """Test get_command_map.""" + command_map = command_map.get_command_map(router) + assert isinstance(command_map, dict) + assert len(command_map) > 0 + + +def test_get_provider_coverage(command_map, router): + """Test get_provider_coverage.""" + provider_coverage = command_map.get_provider_coverage(router) + assert isinstance(provider_coverage, dict) + + +def test_get_command_coverage(command_map, router): + """Test get_command_coverage.""" + command_coverage = command_map.get_command_coverage(router) + assert isinstance(command_coverage, dict) + + +def test_get_command(command_map): + """Test get_command.""" + command = command_map.get_command("stocks/load") + assert command is None From c462b03ba0aefc7f0fd17687122c957ae985a740 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Tue, 25 Jul 2023 15:47:30 +0200 Subject: [PATCH 11/98] Router router_loader unit tests --- openbb_sdk/sdk/core/tests/test_router.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/openbb_sdk/sdk/core/tests/test_router.py b/openbb_sdk/sdk/core/tests/test_router.py index dbad3e0cce3..d09eac2a633 100644 --- a/openbb_sdk/sdk/core/tests/test_router.py +++ b/openbb_sdk/sdk/core/tests/test_router.py @@ -158,6 +158,11 @@ def test_router_loader_init(router_loader): assert router_loader +def test_from_extensions(router_loader): + """Test from_extensions.""" + assert router_loader.from_extensions() + + @pytest.fixture(scope="module") def signature_inspector(): """Set up signature_inspector.""" From 1837d3acd0ea86ac110bbef208adc1927de5253e Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Tue, 25 Jul 2023 17:04:15 +0200 Subject: [PATCH 12/98] Query execute unit test --- openbb_sdk/sdk/core/tests/test_query.py | 68 +++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 4 deletions(-) diff --git a/openbb_sdk/sdk/core/tests/test_query.py b/openbb_sdk/sdk/core/tests/test_query.py index abd5809a59e..c6f70663646 100644 --- a/openbb_sdk/sdk/core/tests/test_query.py +++ b/openbb_sdk/sdk/core/tests/test_query.py @@ -2,6 +2,7 @@ # pylint: disable=redefined-outer-name from dataclasses import dataclass +from unittest.mock import MagicMock, patch import pytest from openbb_core.app.model.command_context import CommandContext @@ -11,6 +12,7 @@ from openbb_core.app.provider_interface import ( StandardParams, ) from openbb_core.app.query import Query +from pydantic import BaseModel @pytest.fixture(scope="module") @@ -73,7 +75,65 @@ def test_filter_extra_params_wrong_param(query): assert not query.filter_extra_params(extra_params, "fmp") -@pytest.mark.skip(reason="TODO: see how to properly mock the execute method") -def test_execute(query): - """Test execute.""" - assert query.execute() +@pytest.fixture +def mock_registry(): + """Mock registry.""" + with patch( + "openbb_core.app.provider_interface.get_provider_interface" + ) as mock_get_provider_interface: + mock_registry = MagicMock() + mock_get_provider_interface.return_value.build_registry.return_value = ( + mock_registry + ) + yield mock_registry + + +def create_mock_query(): + """Mock query.""" + + class StockEOD: + """Mock StockEOD class.""" + + start_date = "2020-01-01" + end_date = "2020-01-05" + symbol = "AAPL" + + return StockEOD() + + +def create_mock_extra_params(): + """Mock ExtraParams dataclass.""" + + @dataclass + class StockEOD: + """Mock ExtraParams dataclass.""" + + sort: str = "desc" + + return StockEOD() + + +@pytest.fixture +def query_instance(): + """Set up query.""" + standard_params = create_mock_query() + extra_params = create_mock_extra_params() + + cc = CommandContext() + setattr(cc.user_settings.credentials, "fmp_api_key", "1234") + + return Query( + cc=cc, + provider_choices=ProviderChoices(provider="fmp"), + standard_params=standard_params, + extra_params=extra_params, + ) + + +def test_execute_method_fake_credentials(query_instance, mock_registry): + """Test execute method without setting credentials.""" + mock_fetch_result = BaseModel() # Replace with an actual instance of BaseModel + mock_registry.fetch.return_value = mock_fetch_result + + with pytest.raises(Exception): + query_instance.execute() From 0622894c948740716fab726cf02ea1c675a6b5cf Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Wed, 26 Jul 2023 11:31:54 +0200 Subject: [PATCH 13/98] Cleanup --- openbb_sdk/sdk/core/tests/test_query.py | 69 ++++++++++--------------- 1 file changed, 28 insertions(+), 41 deletions(-) diff --git a/openbb_sdk/sdk/core/tests/test_query.py b/openbb_sdk/sdk/core/tests/test_query.py index c6f70663646..f5856ff573c 100644 --- a/openbb_sdk/sdk/core/tests/test_query.py +++ b/openbb_sdk/sdk/core/tests/test_query.py @@ -15,6 +15,31 @@ from openbb_core.app.query import Query from pydantic import BaseModel +def create_mock_query(): + """Mock query.""" + + class StockEOD: + """Mock StockEOD class.""" + + start_date = "2020-01-01" + end_date = "2020-01-05" + symbol = "AAPL" + + return StockEOD() + + +def create_mock_extra_params(): + """Mock ExtraParams dataclass.""" + + @dataclass + class StockEOD: + """Mock ExtraParams dataclass.""" + + sort: str = "desc" + + return StockEOD() + + @pytest.fixture(scope="module") def query(): """Set up query.""" @@ -33,29 +58,16 @@ def test_init(query): def test_to_query_params(query): """Test to_query_params.""" + standard_params = create_mock_query() - class StockEOD: - """Mock StockEOD class.""" - - open: float = 0.0 - high: float = 0.0 - - standard_params = StockEOD() assert query.to_query_params(standard_params) def test_filter_extra_params(query): """Test filter_extra_params.""" - - @dataclass - class StockEOD: - """Mock ExtraParams dataclass.""" - - sort: str = "desc" - - extra_params = StockEOD() + extra_params = create_mock_extra_params() extra_params = query.filter_extra_params(extra_params, "fmp") - print(extra_params) + assert isinstance(extra_params, dict) assert len(extra_params) == 0 @@ -88,31 +100,6 @@ def mock_registry(): yield mock_registry -def create_mock_query(): - """Mock query.""" - - class StockEOD: - """Mock StockEOD class.""" - - start_date = "2020-01-01" - end_date = "2020-01-05" - symbol = "AAPL" - - return StockEOD() - - -def create_mock_extra_params(): - """Mock ExtraParams dataclass.""" - - @dataclass - class StockEOD: - """Mock ExtraParams dataclass.""" - - sort: str = "desc" - - return StockEOD() - - @pytest.fixture def query_instance(): """Set up query.""" From aeed2e591d38e5e816b463356f6ee4633f54cd97 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Wed, 26 Jul 2023 11:47:17 +0200 Subject: [PATCH 14/98] Test static filters --- .../core/openbb_core/app/static/filters.py | 10 +++-- .../sdk/core/tests/test_static_filters.py | 44 +++++++++++++++++++ 2 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 openbb_sdk/sdk/core/tests/test_static_filters.py diff --git a/openbb_sdk/sdk/core/openbb_core/app/static/filters.py b/openbb_sdk/sdk/core/openbb_core/app/static/filters.py index 8af1c1eb2bd..4be2b0f1df8 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/static/filters.py +++ b/openbb_sdk/sdk/core/openbb_core/app/static/filters.py @@ -1,3 +1,5 @@ +"""OpenBB filters.""" + import builtins from functools import wraps @@ -10,10 +12,12 @@ from openbb_core.app.utils import df_to_basemodel class OpenBBError(Exception): - pass + """A custom exception for OpenBB errors.""" def filter_call(func): + """Filter command call.""" + @wraps(wrapped=func) def inner(*args, **kwargs): self = args[0] @@ -36,7 +40,7 @@ def filter_call(func): def filter_inputs(**kwargs) -> dict: - """Filter command inputs""" + """Filter command inputs.""" for key, value in kwargs.items(): if isinstance(value, pd.DataFrame): kwargs[key] = df_to_basemodel(value, index=True) @@ -45,7 +49,7 @@ def filter_inputs(**kwargs) -> dict: def filter_output(command_output: CommandOutput) -> CommandOutput: - """Filter command output""" + """Filter command output.""" if command_output.warnings: for w in command_output.warnings: category = getattr(builtins, w.category, OpenBBWarning) diff --git a/openbb_sdk/sdk/core/tests/test_static_filters.py b/openbb_sdk/sdk/core/tests/test_static_filters.py new file mode 100644 index 00000000000..642244e8f08 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/test_static_filters.py @@ -0,0 +1,44 @@ +"""Test the app/static/filters.py file.""" + +import pytest +from openbb_core.app.model.command_output import CommandOutput +from openbb_core.app.static.filters import filter_call, filter_inputs, filter_output +from pandas import DataFrame + + +def test_filter_call_error(): + """Test filter_call.""" + + class Test: + @filter_call + def test(self): + return 1 / 0 + + test = Test() + + with pytest.raises(Exception): + test.test() + + +def test_filter_inputs_not_df(): + """Test filter_inputs.""" + kwargs = {"num": 1} + kwargs = filter_inputs(**kwargs) + + assert kwargs["num"] == 1 + + +def test_filter_inputs_df(): + """Test filter_inputs.""" + df = DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]}) + kwargs = {"df": df} + kwargs = filter_inputs(**kwargs) + + assert isinstance(kwargs["df"], list) + + +def test_filter_output(): + """Test filter_output.""" + command_output = filter_output(CommandOutput()) + + assert command_output is not None From 84e332222a1286e1134bb2073bb0daae36188d8a Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Wed, 26 Jul 2023 11:50:44 +0200 Subject: [PATCH 15/98] Test static coverage --- .../core/openbb_core/app/static/coverage.py | 5 ++++ .../sdk/core/tests/test_static_coverage.py | 30 +++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 openbb_sdk/sdk/core/tests/test_static_coverage.py diff --git a/openbb_sdk/sdk/core/openbb_core/app/static/coverage.py b/openbb_sdk/sdk/core/openbb_core/app/static/coverage.py index 3af92cd7e14..d15a480c047 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/static/coverage.py +++ b/openbb_sdk/sdk/core/openbb_core/app/static/coverage.py @@ -1,14 +1,19 @@ +"""Coverage module.""" from openbb_core.app.router import CommandMap class Coverage: + """Coverage class.""" + def __init__(self): self.__command_map = CommandMap() @property def providers(self): + """Return providers coverage.""" return self.__command_map.provider_coverage @property def commands(self): + """Return commands coverage.""" return self.__command_map.command_coverage diff --git a/openbb_sdk/sdk/core/tests/test_static_coverage.py b/openbb_sdk/sdk/core/tests/test_static_coverage.py new file mode 100644 index 00000000000..123751e31a9 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/test_static_coverage.py @@ -0,0 +1,30 @@ +"""Test the app/static/coverage.py file.""" +# pylint: disable=redefined-outer-name + +import pytest +from openbb_core.app.static.coverage import Coverage + + +@pytest.fixture(scope="module") +def coverage(): + """Return coverage.""" + return Coverage() + + +def test_coverage_init(coverage): + """Test coverage init.""" + assert coverage + + +def test_coverage_providers(coverage): + """Test coverage providers.""" + provider_coverage = coverage.providers + assert provider_coverage + assert isinstance(provider_coverage, dict) + + +def test_coverage_commands(coverage): + """Test coverage commands.""" + command_coverage = coverage.commands + assert command_coverage + assert isinstance(command_coverage, dict) From ff4a46904711d6d8f1d7f15e15e960148385c93a Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Wed, 26 Jul 2023 11:55:59 +0200 Subject: [PATCH 16/98] Test static container --- openbb_sdk/sdk/core/openbb_core/app/static/container.py | 3 +++ openbb_sdk/sdk/core/tests/test_static_container.py | 9 +++++++++ 2 files changed, 12 insertions(+) create mode 100644 openbb_sdk/sdk/core/tests/test_static_container.py diff --git a/openbb_sdk/sdk/core/openbb_core/app/static/container.py b/openbb_sdk/sdk/core/openbb_core/app/static/container.py index 75cd907ab74..43da30fb6ed 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/static/container.py +++ b/openbb_sdk/sdk/core/openbb_core/app/static/container.py @@ -1,6 +1,9 @@ +"""Container class.""" from openbb_core.app.command_runner import CommandRunnerSession class Container: + """Container class for the command runner session.""" + def __init__(self, command_runner_session: CommandRunnerSession) -> None: self._command_runner_session = command_runner_session diff --git a/openbb_sdk/sdk/core/tests/test_static_container.py b/openbb_sdk/sdk/core/tests/test_static_container.py new file mode 100644 index 00000000000..5329647c988 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/test_static_container.py @@ -0,0 +1,9 @@ +"""Test the app/static/container.py file.""" + +from openbb_core.app.static.container import Container + + +def test_container_init(): + """Test container init.""" + container = Container(None) + assert container From b7cf6b556e7e02fc796c40a18f6bd829d4d77b1f Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Wed, 26 Jul 2023 12:05:01 +0200 Subject: [PATCH 17/98] Test static app factory --- .../openbb_core/app/static/app_factory.py | 2 + .../sdk/core/tests/test_static_app_factory.py | 48 +++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 openbb_sdk/sdk/core/tests/test_static_app_factory.py diff --git a/openbb_sdk/sdk/core/openbb_core/app/static/app_factory.py b/openbb_sdk/sdk/core/openbb_core/app/static/app_factory.py index 41d3defbb3b..22e15454da1 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/static/app_factory.py +++ b/openbb_sdk/sdk/core/openbb_core/app/static/app_factory.py @@ -1,3 +1,4 @@ +"""App factory.""" # pylint: disable=W0231:super-init-not-called from openbb_core.app.command_runner import CommandRunnerSession @@ -8,6 +9,7 @@ from openbb_core.app.static.coverage import Coverage def create_app(): + """Create the app.""" try: # pylint: disable=import-outside-toplevel from openbb_core.app.static.package.__commands__ import Commands diff --git a/openbb_sdk/sdk/core/tests/test_static_app_factory.py b/openbb_sdk/sdk/core/tests/test_static_app_factory.py new file mode 100644 index 00000000000..863ca944117 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/test_static_app_factory.py @@ -0,0 +1,48 @@ +"""Test static app factory.""" +# pylint: disable=redefined-outer-name + +import pytest +from openbb_core.app.model.system_settings import SystemSettings +from openbb_core.app.model.user_settings import UserSettings +from openbb_core.app.static.account import Account +from openbb_core.app.static.app_factory import create_app +from openbb_core.app.static.coverage import Coverage + + +@pytest.fixture(scope="module") +def app_factory(): + """Return app factory.""" + return create_app() + + +def test_app_factory_init(app_factory): + """Test app factory init.""" + assert app_factory + + +def test_app_system_settings(app_factory): + """Test app system settings.""" + system_settings = app_factory.system + assert system_settings + assert isinstance(system_settings, SystemSettings) + + +def test_app_user_settings(app_factory): + """Test app user settings.""" + user_settings = app_factory.settings + assert user_settings + assert isinstance(user_settings, UserSettings) + + +def test_app_account(app_factory): + """Test app account.""" + account = app_factory.account + assert account + assert isinstance(account, Account) + + +def test_app_coverage(app_factory): + """Test app coverage.""" + coverage = app_factory.coverage + assert coverage + assert isinstance(coverage, Coverage) From 5f905b21057312d979d040cf31ecad842ccf939e Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Wed, 26 Jul 2023 11:06:31 +0100 Subject: [PATCH 18/98] test logging_manager --- .../tests/app/logs/test_logging_manager.py | 188 ++++++++++++++++++ 1 file changed, 188 insertions(+) create mode 100644 openbb_sdk/sdk/core/tests/app/logs/test_logging_manager.py diff --git a/openbb_sdk/sdk/core/tests/app/logs/test_logging_manager.py b/openbb_sdk/sdk/core/tests/app/logs/test_logging_manager.py new file mode 100644 index 00000000000..b409b3489aa --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/logs/test_logging_manager.py @@ -0,0 +1,188 @@ +import json +from typing import Optional +from unittest.mock import MagicMock, Mock, patch + +import pytest +from openbb_core.app.logs.logging_manager import LoggingManager +from pydantic import BaseModel + + +class MockLoggingSettings: + def __init__(self, system_settings, user_settings): + self.system_settings = system_settings + self.user_settings = user_settings + + +class MockCommandOutput(BaseModel): + output: Optional[str] + error: Optional[str] + + +@pytest.fixture(scope="function") +def logging_manager(): + mock_system_settings = Mock() + mock_system_settings = "mock_system_settings" + mock_user_settings = Mock() + mock_user_settings = "mock_user_settings" + mock_setup_handlers = Mock() + mock_log_startup = Mock() + + with patch( + "openbb_core.app.logs.logging_manager.LoggingSettings", + MockLoggingSettings, + ), patch( + "openbb_core.app.logs.logging_manager.LoggingManager._setup_handlers", + mock_setup_handlers, + ), patch( + "openbb_core.app.logs.logging_manager.LoggingManager._log_startup", + mock_log_startup, + ): + logging_manager = LoggingManager( + system_settings=mock_system_settings, + user_settings=mock_user_settings, + ) + + assert mock_setup_handlers.assert_called_once + assert mock_log_startup.assert_called_once + + return logging_manager + + +def test_correctly_initialized(logging_manager): + assert logging_manager + + +def test_logging_settings_property(logging_manager): + assert logging_manager.logging_settings.system_settings == "mock_system_settings" + assert logging_manager.logging_settings.user_settings == "mock_user_settings" + + +def test_logging_settings_setter(logging_manager): + custom_user_settings = "custom_user_settings" + custom_system_settings = "custom_system_settings" + + with patch( + "openbb_core.app.logs.logging_manager.LoggingSettings", + MockLoggingSettings, + ): + logging_manager.logging_settings = ( + custom_system_settings, + custom_user_settings, + ) + + assert logging_manager.logging_settings.system_settings == "custom_system_settings" + assert logging_manager.logging_settings.user_settings == "custom_user_settings" + + +def test_log_startup(logging_manager): + with patch("logging.getLogger") as mock_get_logger: + mock_info = mock_get_logger.return_value.info + + class MockCredentials(BaseModel): + username: str + password: str + + logging_manager._user_settings = MagicMock( + preferences="your_preferences", + credentials=MockCredentials(username="username", password="password"), + ) + logging_manager._system_settings = "your_system_settings" + + logging_manager._log_startup() + + expected_log_data = { + "PREFERENCES": "your_preferences", + "KEYS": {"username": "defined", "password": "defined"}, + "SYSTEM": "your_system_settings", + } + mock_info.assert_called_once_with( + "STARTUP: %s ", + json.dumps(expected_log_data), + ) + mock_get_logger.assert_called_once + + +@pytest.mark.parametrize( + "user_settings, system_settings, command_output, route, func, kwargs", + [ + ( + "mock_settings", + "mock_system", + MockCommandOutput(output="mock_output"), + "mock_route", + "mock_func", + {}, + ), + ( + "mock_settings", + "mock_system", + MockCommandOutput(error="mock_error"), + "mock_route", + "mock_func", + {}, + ), + ( + "mock_settings", + "mock_system", + MockCommandOutput(error="mock_error"), + "login", + "mock_func", + {}, + ), + ], +) +def test_log( + logging_manager, user_settings, system_settings, command_output, route, func, kwargs +): + with patch( + "openbb_core.app.logs.logging_manager.LoggingSettings", + MockLoggingSettings, + ), patch("logging.getLogger") as mock_get_logger: + if route == "login": + with patch( + "openbb_core.app.logs.logging_manager.LoggingManager._log_startup" + ) as mock_log_startup: + logging_manager.log( + user_settings=user_settings, + system_settings=system_settings, + command_output=command_output, + route=route, + func=func, + kwargs=kwargs, + ) + assert mock_log_startup.assert_called_once + + else: + mock_info = mock_get_logger.return_value.info + mock_error = mock_get_logger.return_value.error + + mock_callable = Mock() + mock_callable.__name__ = func + + logging_manager.log( + user_settings=user_settings, + system_settings=system_settings, + command_output=command_output, + route=route, + func=mock_callable, + kwargs=kwargs, + ) + + expected_log_data = { + "route": route, + "input": kwargs, + "error": command_output.error, + } + + if command_output.error: + mock_error.assert_called_once_with( + "ERROR: %s", + json.dumps(expected_log_data), + extra={"func_name_override": func}, + ) + else: + mock_info.assert_called_once_with( + "CMD: %s", + json.dumps(expected_log_data), + extra={"func_name_override": func}, + ) From 87e99b55056cd64e75d4760c0b0042fc7bff1f40 Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Wed, 26 Jul 2023 13:05:53 +0100 Subject: [PATCH 19/98] tests for logs utils --- .../core/openbb_core/app/logs/utils/utils.py | 25 ++++- .../app/logs/utils/test_expired_files.py | 6 ++ .../tests/app/logs/utils/test_system_utils.py | 1 + .../core/tests/app/logs/utils/test_utils.py | 94 +++++++++++++++++++ 4 files changed, 122 insertions(+), 4 deletions(-) create mode 100644 openbb_sdk/sdk/core/tests/app/logs/utils/test_expired_files.py create mode 100644 openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py create mode 100644 openbb_sdk/sdk/core/tests/app/logs/utils/test_utils.py diff --git a/openbb_sdk/sdk/core/openbb_core/app/logs/utils/utils.py b/openbb_sdk/sdk/core/openbb_core/app/logs/utils/utils.py index 97548fa5be4..a43ae854dbb 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/logs/utils/utils.py +++ b/openbb_sdk/sdk/core/openbb_core/app/logs/utils/utils.py @@ -24,8 +24,7 @@ def get_app_id(contextual_user_data_directory: str) -> str: print( "Note for macOS users: copy `OpenBB Terminal` folder outside the DMG." ) - else: - raise e + raise e except Exception as e: raise e @@ -35,19 +34,37 @@ def get_app_id(contextual_user_data_directory: str) -> str: def get_log_dir(contextual_user_data_directory: str) -> Path: """Retrieve application's log directory.""" - log_dir = Path(contextual_user_data_directory).joinpath("logs").absolute() + log_dir = create_log_dir_if_not_exists(contextual_user_data_directory) + logging_uuid = create_log_uuid_if_not_exists(log_dir) + uuid_log_dir = create_uuid_dir_if_not_exists(log_dir, logging_uuid) + return uuid_log_dir + + +def create_log_dir_if_not_exists(contextual_user_data_directory: str) -> None: + log_dir = Path(contextual_user_data_directory).joinpath("logs").absolute() if not log_dir.is_dir(): log_dir.mkdir(parents=True, exist_ok=True) - log_id = (log_dir / ".logid").absolute() + return log_dir + +def create_log_uuid_if_not_exists(log_dir: Path) -> str: + log_id = get_log_id(log_dir) if not log_id.is_file(): logging_id = f"{uuid.uuid4()}" log_id.write_text(logging_id, encoding="utf-8") else: logging_id = log_id.read_text(encoding="utf-8").rstrip() + return logging_id + + +def get_log_id(log_dir): + return (log_dir / ".logid").absolute() + + +def create_uuid_dir_if_not_exists(log_dir, logging_id) -> str: uuid_log_dir = (log_dir / logging_id).absolute() if not uuid_log_dir.is_dir(): diff --git a/openbb_sdk/sdk/core/tests/app/logs/utils/test_expired_files.py b/openbb_sdk/sdk/core/tests/app/logs/utils/test_expired_files.py new file mode 100644 index 00000000000..6a57a55ee93 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/logs/utils/test_expired_files.py @@ -0,0 +1,6 @@ +from openbb_core.app.logs.utils.expired_files import get_timestamp_from_x_days + + +def test_get_timestamp_from_x_days(): + result = get_timestamp_from_x_days(0) + assert isinstance(result, float) diff --git a/openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py b/openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py new file mode 100644 index 00000000000..057442b87f5 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py @@ -0,0 +1 @@ +# TODO : add tests once the code is fixed diff --git a/openbb_sdk/sdk/core/tests/app/logs/utils/test_utils.py b/openbb_sdk/sdk/core/tests/app/logs/utils/test_utils.py new file mode 100644 index 00000000000..cf563c48284 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/logs/utils/test_utils.py @@ -0,0 +1,94 @@ +import pytest +import uuid +from pathlib import Path + +from unittest.mock import patch + +from openbb_core.app.logs.utils.utils import get_session_id, get_app_id, get_log_dir + +## get_session_id + + +def test_get_session_id_return_type(): + # Test if the returned value is a string + session_id = get_session_id() + assert isinstance(session_id, str) + + +def test_get_session_id_format(): + # Test if the returned string has the format "UUID-current_time" + session_id = get_session_id() + + parts = session_id.split("-") + + assert len(parts) == 6 + + uuid_part = "-".join(parts[0:5]) + time_part = str(parts[5]) + + # Check if the first part (UUID) is a valid UUID + assert uuid.UUID(uuid_part) + + # Check if the second part (current_time) is numeric + assert int(time_part) + + +def test_get_session_id_uniqueness(): + # Test if subsequent calls return different session IDs + session_id1 = get_session_id() + session_id2 = get_session_id() + assert session_id1 != session_id2 + + +## get_app_id + + +def test_get_app_id_success(): + # Mock the return value of get_log_dir to simulate a successful scenario + with patch("openbb_core.app.logs.utils.utils.get_log_dir") as mock_get_log_dir: + mock_get_log_dir + mock_get_log_dir.return_value = Path( + "/path/to/contextual_user_data_directory/app_id.log" + ) + app_id = get_app_id("/path/to/contextual_user_data_directory") + assert app_id == "app_id" + + +def test_get_app_id_os_error(): + # Test handling of OSError with errno 30 (Read-only file system) + with patch("openbb_core.app.logs.utils.utils.get_log_dir") as mock_get_log_dir: + mock_get_log_dir.side_effect = OSError(30, "Read-only file system") + with pytest.raises(OSError): + get_app_id("/path/to/contextual_user_data_directory") + + +def test_get_app_id_other_exception(): + # Test handling of other exceptions + with patch("openbb_core.app.logs.utils.utils.get_log_dir") as mock_get_log_dir: + mock_get_log_dir.side_effect = Exception("Some other error") + with pytest.raises(Exception, match="Some other error"): + get_app_id("/path/to/contextual_user_data_directory") + + +## get_log_dir + + +def test_get_log_dir(): + with patch( + "openbb_core.app.logs.utils.utils.create_log_dir_if_not_exists", + return_value="/test_dir", + ) as mock_create_log_dir, patch( + "openbb_core.app.logs.utils.utils.create_log_uuid_if_not_exists", + return_value="12345", + ) as mock_create_log_uuid, patch( + "openbb_core.app.logs.utils.utils.create_uuid_dir_if_not_exists", + return_value="/test_dir/12345", + ) as mock_create_uuid_dir: + # Call the get_log_dir function + result = get_log_dir("contextual_user_data_directory") + + # Assertions + assert result == "/test_dir/12345" + mock_create_log_dir.assert_called_once_with("contextual_user_data_directory") + mock_create_log_uuid.assert_called_once_with("/test_dir") + mock_create_uuid_dir.assert_called_once_with("/test_dir", "12345") From 1457d1bd6cbcabf01e046e31355202b904f3eafd Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Wed, 26 Jul 2023 17:26:56 +0200 Subject: [PATCH 20/98] Test static package_builder --- openbb_sdk/pyproject.toml | 4 + .../openbb_core/app/static/package_builder.py | 48 +- openbb_sdk/sdk/core/pyproject.toml | 1 - .../core/tests/test_static_package_builder.py | 437 ++++++++++++++++++ 4 files changed, 485 insertions(+), 5 deletions(-) create mode 100644 openbb_sdk/sdk/core/tests/test_static_package_builder.py diff --git a/openbb_sdk/pyproject.toml b/openbb_sdk/pyproject.toml index 13487a2e048..15f9bdd8616 100644 --- a/openbb_sdk/pyproject.toml +++ b/openbb_sdk/pyproject.toml @@ -22,6 +22,10 @@ openbb-fmp = { path = "./providers/fmp" } openbb-polygon = { path = "./providers/polygon" } openbb-fred = { path = "./providers/fred" } + +[tool.poetry.group.dev.dependencies] +pytest = "^6.2.2" + [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" diff --git a/openbb_sdk/sdk/core/openbb_core/app/static/package_builder.py b/openbb_sdk/sdk/core/openbb_core/app/static/package_builder.py index 5be1fb330fb..d39df854f3d 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/static/package_builder.py +++ b/openbb_sdk/sdk/core/openbb_core/app/static/package_builder.py @@ -106,8 +106,11 @@ class PackageBuilder: class ModuleBuilder: + """Build the module for the SDK.""" + @staticmethod def build(path: str) -> str: + """Build the module.""" code = "### THIS FILE IS AUTO-GENERATED. DO NOT EDIT. ###\n" code += ImportDefinition.build(path=path) code += ClassDefinition.build(path=path) @@ -116,8 +119,11 @@ class ModuleBuilder: class ImportDefinition: + """Build the import definition for the SDK.""" + @staticmethod def filter_hint_type_list(hint_type_list: List[Type]) -> List[Type]: + """Filter the hint type list.""" new_hint_type_list = [] for hint_type in hint_type_list: if hint_type != _empty and hint_type.__module__ != "builtins": @@ -129,6 +135,7 @@ class ImportDefinition: @classmethod def get_function_hint_type_list(cls, func: Callable) -> List[Type]: + """Get the hint type list from the function.""" sig = signature(func) parameter_map = sig.parameters return_type = sig.return_annotation @@ -148,6 +155,7 @@ class ImportDefinition: @classmethod def get_path_hint_type_list(cls, path: str) -> List[Type]: + """Get the hint type list from the path.""" route_map = PathHandler.build_route_map() path_list = PathHandler.build_path_list(route_map=route_map) child_path_list = PathHandler.get_child_path_list( @@ -165,6 +173,7 @@ class ImportDefinition: @classmethod def build(cls, path: str) -> str: + """Build the import definition.""" hint_type_list = cls.get_path_hint_type_list(path=path) code = "\nfrom openbb_core.app.static.container import Container" code += "\nfrom openbb_core.app.model.command_output import CommandOutput" @@ -195,8 +204,11 @@ class ImportDefinition: class ClassDefinition: + """Build the class definition for the SDK.""" + @staticmethod def build(path: str) -> str: + """Build the class definition.""" class_name = PathHandler.build_module_class(path=path) code = f"\nclass {class_name}(Container):\n" route_map = PathHandler.build_route_map() @@ -343,8 +355,11 @@ class DocstringGenerator: class MethodDefinition: + """Build the method definition for the SDK.""" + @staticmethod def build_class_loader_method(path: str) -> str: + """Build the class loader method.""" module_name = PathHandler.build_module_name(path=path) class_name = PathHandler.build_module_class(path=path) function_name = path.rsplit("/", maxsplit=1)[-1].strip("/") @@ -358,6 +373,7 @@ class MethodDefinition: @staticmethod def get_type(field: Any) -> type: + """Get the type of the field.""" field_type = getattr(field, "type", Parameter.empty) if isclass(field_type): name = field_type.__name__ @@ -369,24 +385,26 @@ class MethodDefinition: @staticmethod def get_default(field: Any): + """Get the default value of the field.""" field_default = getattr(field, "default", None) if field_default is None or field_default is MISSING: return Parameter.empty - default_default = getattr(field_default, "default", None) - if default_default is MISSING or default_default is Ellipsis: - return Parameter.empty + if field_default is not Ellipsis: + return field_default - return default_default + return Parameter.empty @staticmethod def is_annotated_dc(annotation) -> bool: + """Check if the annotation is an annotated dataclass.""" return get_origin(annotation) == Annotated and hasattr( annotation.__args__[0], "__dataclass_fields__" ) @staticmethod def reorder_params(params: Dict[str, Parameter]) -> OrderedDict[str, Parameter]: + """Reorder the params.""" formatted_keys = list(params.keys()) for k in ["provider", "extra_params"]: if k in formatted_keys: @@ -403,6 +421,7 @@ class MethodDefinition: def format_params( parameter_map: Dict[str, Parameter] ) -> OrderedDict[str, Parameter]: + """Format the params.""" # These are types we want to expand. # For example, start_date is always a 'date', but we also accept 'str' as input. # Be careful, if the type is not coercible by pydantic to the original type, you @@ -466,6 +485,7 @@ class MethodDefinition: @staticmethod def build_func_params(parameter_map: Dict[str, Parameter]) -> str: + """Build the function parameters.""" od = MethodDefinition.format_params(parameter_map=parameter_map) func_params = ", ".join(str(param) for param in od.values()) func_params = func_params.replace("NoneType", "None") @@ -477,6 +497,7 @@ class MethodDefinition: @staticmethod def build_func_returns(return_type: type) -> str: + """Build the function returns.""" if return_type == _empty: func_returns = "None" elif return_type.__module__ == "builtins": @@ -501,6 +522,7 @@ class MethodDefinition: def build_command_method_signature( func_name: str, parameter_map: Dict[str, Parameter], return_type: type ) -> str: + """Build the command method signature.""" func_params = MethodDefinition.build_func_params(parameter_map) func_returns = MethodDefinition.build_func_returns(return_type) code = "\n @filter_call" @@ -517,12 +539,14 @@ class MethodDefinition: @staticmethod def build_command_method_doc(func: Callable): + """Build the command method docstring.""" code = f' """{func.__doc__}"""\n' if func.__doc__ else "" return code @staticmethod def build_command_method_implementation(path: str, func: Callable): + """Build the command method implementation.""" sig = signature(func) parameter_map = dict(sig.parameters) parameter_map.pop("cc", None) @@ -560,6 +584,7 @@ class MethodDefinition: def build_command_method( cls, path: str, func: Callable, model_name: Optional[str] ) -> str: + """Build the command method.""" func_name = func.__name__ sig = signature(func) @@ -582,8 +607,11 @@ class MethodDefinition: class PathHandler: + """Handle the paths for the SDK.""" + @staticmethod def build_route_map() -> Dict[str, BaseRoute]: + """Build the route map.""" router = RouterLoader.from_extensions() route_map = {route.path: route for route in router.api_router.routes} # type: ignore @@ -591,6 +619,7 @@ class PathHandler: @staticmethod def build_path_list(route_map: Dict[str, BaseRoute]) -> List[str]: + """Build the path list.""" path_list = [] for route_path in route_map: if route_path not in path_list: @@ -607,10 +636,12 @@ class PathHandler: @staticmethod def get_route(path: str, route_map: Dict[str, BaseRoute]): + """Get the route from the path.""" return route_map.get(path, None) @staticmethod def get_child_path_list(path: str, path_list: List[str]) -> List[str]: + """Get the child path list.""" direct_children = [] for p in path_list: if p.startswith(path): @@ -622,28 +653,34 @@ class PathHandler: @staticmethod def clean_path(path: str) -> str: + """Clean the path.""" if path.startswith("/"): path = path[1:] return path.replace("-", "_").replace("/", "_") @classmethod def build_module_name(cls, path: str) -> str: + """Build the module name.""" if path == "": return "__commands__" return cls.clean_path(path=path) @classmethod def build_module_class(cls, path: str) -> str: + """Build the module class.""" if path == "": return "Commands" return f"CLASS_{cls.clean_path(path=path)}" class Linters: + """Run the linters for the SDK.""" + current_folder = str(Path(Path(__file__).parent, "package").absolute()) @staticmethod def print_separator(symbol: str, length: int = 160): + """Print a separator.""" print(symbol * length) @staticmethod @@ -665,12 +702,15 @@ class Linters: @classmethod def black(cls): + """Run black.""" cls.run(linter="black") @classmethod def ruff(cls): + """Run ruff.""" cls.run(linter="ruff", flags=["--fix"]) @classmethod def mypy(cls): + """Run mypy.""" cls.run(linter="mypy", flags=["--ignore-missing-imports"]) diff --git a/openbb_sdk/sdk/core/pyproject.toml b/openbb_sdk/sdk/core/pyproject.toml index 753b43804c4..99d6bdbf9ee 100644 --- a/openbb_sdk/sdk/core/pyproject.toml +++ b/openbb_sdk/sdk/core/pyproject.toml @@ -26,7 +26,6 @@ openbb-provider = { path = "../provider" } [tool.poetry.group.dev.dependencies] openbb-provider = { path = "../provider" } -pytest = "^6.2.2" [build-system] requires = ["poetry-core"] diff --git a/openbb_sdk/sdk/core/tests/test_static_package_builder.py b/openbb_sdk/sdk/core/tests/test_static_package_builder.py new file mode 100644 index 00000000000..6cbb16f4a07 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/test_static_package_builder.py @@ -0,0 +1,437 @@ +"""Test the app/static/package_builder.py file.""" +# pylint: disable=redefined-outer-name + +from dataclasses import dataclass +from inspect import _empty +from typing import Annotated + +import pytest +from openbb_core.app.static.package_builder import ( + ClassDefinition, + ImportDefinition, + Linters, + MethodDefinition, + ModuleBuilder, + PackageBuilder, + Parameter, + PathHandler, +) + + +@pytest.fixture(scope="module") +def package_builder(): + """Return package builder.""" + return PackageBuilder() + + +def test_package_builder_init(package_builder): + """Test package builder init.""" + assert package_builder + + +@pytest.mark.skip("Rebuilds the packages which takes some time.") +def test_package_builder_build(package_builder): + """Test package builder build.""" + package_builder.build() + + +@pytest.mark.skip() +def test_save_module_map(package_builder): + """Test save module map.""" + package_builder.save_module_map() + + +@pytest.mark.skip() +def test_save_modules(package_builder): + """Test save module.""" + package_builder.save_modules() + + +@pytest.mark.skip() +def test_save_package(package_builder): + """Test save package.""" + package_builder.save_package() + + +def test_run_linters(package_builder): + """Test run linters.""" + package_builder.run_linters() + + +@pytest.mark.skip("We avoid writing to the package.") +def test_write_to_package(package_builder): + """Test save to package.""" + package_builder.write_to_package() + + +@pytest.fixture(scope="module") +def module_builder(): + """Return module builder.""" + return ModuleBuilder() + + +def test_module_builder_init(module_builder): + """Test module builder init.""" + assert module_builder + + +@pytest.fixture(scope="module") +def class_definition(): + """Return class definition.""" + return ClassDefinition() + + +def test_class_definition_init(class_definition): + """Test class definition init.""" + assert class_definition + + +def test_build(class_definition): + """Test build.""" + code = class_definition.build("openbb_core.app.static.container.Container") + assert code + + +@pytest.fixture(scope="module") +def method_definition(): + """Return method definition.""" + return MethodDefinition() + + +def test_method_definition_init(method_definition): + """Test method definition init.""" + assert method_definition + + +def test_build_class_loader_method(method_definition): + """Test build class loader method.""" + code = method_definition.build_class_loader_method( + "openbb_core.app.static.container.Container" + ) + assert code + + +def test_get_type(method_definition): + """Test get type.""" + type_ = method_definition.get_type(field=Parameter.empty) + assert type_ + assert isinstance(type_, type) + + +def test_get_type_hint(method_definition): + """Test get type hint.""" + + class TestField: + type = int + + field = TestField() + result = method_definition.get_type(field) + assert result == int + + +def test_field_with_type_attribute_missing_type(method_definition): + """Test field with type attribute missing type.""" + + class TestField: + type = Parameter.empty + + field = TestField() + result = method_definition.get_type(field) + assert result is Parameter.empty + + +def test_get_default(method_definition): + """Test get default.""" + + class TestField: + default = 42 + + field = TestField() + result = method_definition.get_default(field) + assert result == 42 + + +def test_get_default_default_value(method_definition): + """Test get default default value.""" + + class TestField: + default = type(Ellipsis)() + + field = TestField() + result = method_definition.get_default(field) + assert result == _empty + + +def test_get_default_no_default(method_definition): + """Test get default no default.""" + + class TestField: + pass + + field = TestField() + result = method_definition.get_default(field) + assert result == _empty + + +def test_is_annotated_dc(method_definition): + """Test is annotated dc.""" + result = method_definition.is_annotated_dc(annotation=Parameter.empty) + assert not result + + +def test_is_annotated_dc_annotated(method_definition): + """Test is annotated dc annotated.""" + + @dataclass + class TestAnnotatedDataClass: + """Test annotated data class.""" + + value: int + + annotated_dataclass = Annotated[TestAnnotatedDataClass, "test_annotation"] + result = method_definition.is_annotated_dc(annotation=annotated_dataclass) + assert result + + +def test_reorder_params(method_definition): + """Test reorder params.""" + params = { + "provider": Parameter.empty, + "extra_params": Parameter.empty, + "param1": Parameter.empty, + "param2": Parameter.empty, + } + result = method_definition.reorder_params(params=params) + assert result + assert list(result.keys()) == ["param1", "param2", "provider", "extra_params"] + + +def test_build_func_params(method_definition): + """Test build func params.""" + param_map = { + "param1": Parameter("NoneType", kind=Parameter.POSITIONAL_OR_KEYWORD), + "param2": Parameter("int", kind=Parameter.POSITIONAL_OR_KEYWORD), + } + + expected_output = "param1, param2, chart: bool = False" + output = method_definition.build_func_params(param_map) + + assert output == expected_output + + +@pytest.mark.parametrize( + "return_type, expected_output", + [ + (_empty, "None"), + (int, "int"), + ], +) +def test_build_func_returns(method_definition, return_type, expected_output): + """Test build func returns.""" + output = method_definition.build_func_returns(return_type=return_type) + assert output == expected_output + + +def test_build_command_method_signature(method_definition): + """Test build command method signature.""" + parameter_map = { + "param1": Parameter("NoneType", kind=Parameter.POSITIONAL_OR_KEYWORD), + "param2": Parameter("int", kind=Parameter.POSITIONAL_OR_KEYWORD), + } + return_type = int + output = method_definition.build_command_method_signature( + func_name="test_func", parameter_map=parameter_map, return_type=return_type + ) + assert output + + +def test_build_command_method_doc(method_definition): + """Test build command method doc.""" + + def some_func(): + """Do some func doc.""" + + output = method_definition.build_command_method_doc(func=some_func) + assert output + assert isinstance(output, str) + + +def test_build_command_method_implementation(method_definition): + """Test build command method implementation.""" + + def some_func(): + """Do some func doc.""" + return 42 + + output = method_definition.build_command_method_implementation( + path="openbb_core.app.static.container.Container", func=some_func + ) + + assert output + assert isinstance(output, str) + + +def test_build_command_method(method_definition): + """Test build command method.""" + + def some_func(): + """Do some func doc.""" + return 42 + + output = method_definition.build_command_method( + path="openbb_core.app.static.container.Container", + func=some_func, + model_name=None, + ) + + assert output + assert isinstance(output, str) + + +@pytest.fixture(scope="module") +def import_definition(): + """Return import definition.""" + return ImportDefinition() + + +def test_import_definition_init(import_definition): + """Test import definition init.""" + assert import_definition + + +def test_filter_hint_type_list(import_definition): + """Test filter type hint list.""" + output = import_definition.filter_hint_type_list( + hint_type_list=[int, str, float, bool, _empty, _empty, _empty, _empty] + ) + assert output == [] + + +def test_import_definition_get_path_hint_type_list(import_definition): + """Test import definition get path hint type list.""" + hint_type_list = import_definition.get_path_hint_type_list( + path="openbb_core.app.static.container.Container" + ) + assert hint_type_list == [] + + +def test_import_definition_build(import_definition): + """Test import definition build.""" + code = import_definition.build(path="openbb_core.app.static.container.Container") + assert code + + +@pytest.fixture(scope="module") +def path_handler(): + """Return path handler.""" + return PathHandler() + + +def test_path_handler_init(path_handler): + """Test path handler init.""" + assert path_handler + + +@pytest.fixture(scope="module") +def route_map(path_handler): + """Return route map.""" + return path_handler.build_route_map() + + +def test_build_route_map(route_map): + """Test build route map.""" + assert route_map + assert isinstance(route_map, dict) + + +@pytest.fixture(scope="module") +def path_list(path_handler, route_map): + """Return path list.""" + return path_handler.build_path_list(route_map=route_map) + + +def test_build_path_list(path_list): + """Test build path list.""" + assert path_list + assert isinstance(path_list, list) + + +def test_get_route(path_handler, route_map): + """Test get route.""" + route = path_handler.get_route(route_map=route_map, path="/stocks/load") + + assert route + + +def test_get_child_path_list(path_handler, path_list): + """Test get child path list.""" + child_path_list = path_handler.get_child_path_list( + path="/stocks", path_list=path_list + ) + + assert child_path_list + assert isinstance(child_path_list, list) + + +def test_clean_path(path_handler): + """Test clean path.""" + path = "/stocks/load" + result = path_handler.clean_path(path=path) + assert result == "stocks_load" + + +def test_build_module_name(path_handler): + """Test build module name.""" + module_name = path_handler.build_module_name(path="") + assert module_name == "__commands__" + + module_name = path_handler.build_module_name(path="/stocks/load") + assert module_name == "stocks_load" + + +def test_build_module_class(path_handler): + """Test build module class.""" + module_class = path_handler.build_module_class(path="") + assert module_class == "Commands" + + module_class = path_handler.build_module_class(path="/stocks/load") + assert module_class == "CLASS_stocks_load" + + +@pytest.fixture(scope="module") +def linters(): + """Return linters.""" + return Linters() + + +def test_linters_init(linters): + """Test linters init.""" + assert linters + + +def test_print_separator(linters): + """Test print separator.""" + linters.print_separator(symbol="AAPL") + + +def test_run(linters): + """Test run.""" + linters.run(linter="ruff") + + +def test_ruff(linters): + """Test ruff.""" + linters.ruff() + + +def test_black(linters): + """Test black.""" + linters.black() + + +def test_mypy(linters): + """Test mypy.""" + linters.mypy() + + +# TODO: Implement unit test for the DocstringGenerator class once refactored. From 45bdef10b8a3358e48920b04b8cd9b83c5c3efe1 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Wed, 26 Jul 2023 17:43:34 +0200 Subject: [PATCH 21/98] Test static package_builder update --- .../openbb_core/app/static/package/economy.py | 58 +++++++++---------- .../app/static/package/fixedincome.py | 2 +- .../app/static/package/stocks_fa.py | 4 +- .../openbb_core/app/static/package_builder.py | 7 ++- .../core/tests/test_static_package_builder.py | 16 ++++- 5 files changed, 50 insertions(+), 37 deletions(-) diff --git a/openbb_sdk/sdk/core/openbb_core/app/static/package/economy.py b/openbb_sdk/sdk/core/openbb_core/app/static/package/economy.py index ce7fd38bc5f..1f21772dec6 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/static/package/economy.py +++ b/openbb_sdk/sdk/core/openbb_core/app/static/package/economy.py @@ -19,7 +19,7 @@ class CLASS_economy(Container): def corecpi( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """CORECPI.""" inputs = filter_inputs( @@ -248,7 +248,7 @@ class CLASS_economy(Container): def cpi_options( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """Get the options for v3 cpi(options=True)""" inputs = filter_inputs( @@ -448,7 +448,7 @@ class CLASS_economy(Container): def macro( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """Query EconDB for macro data.""" inputs = filter_inputs( @@ -470,7 +470,7 @@ class CLASS_economy(Container): def macro_countries( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """MACRO_COUNTRIES.""" inputs = filter_inputs( @@ -492,7 +492,7 @@ class CLASS_economy(Container): def macro_parameters( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """MACRO_PARAMETERS.""" inputs = filter_inputs( @@ -514,7 +514,7 @@ class CLASS_economy(Container): def balance( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """BALANCE.""" inputs = filter_inputs( @@ -536,7 +536,7 @@ class CLASS_economy(Container): def bigmac( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """BIGMAC.""" inputs = filter_inputs( @@ -558,7 +558,7 @@ class CLASS_economy(Container): def country_codes( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """COUNTRY_CODES.""" inputs = filter_inputs( @@ -580,7 +580,7 @@ class CLASS_economy(Container): def currencies( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """CURRENCIES.""" inputs = filter_inputs( @@ -602,7 +602,7 @@ class CLASS_economy(Container): def debt( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """DEBT.""" inputs = filter_inputs( @@ -624,7 +624,7 @@ class CLASS_economy(Container): def events( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """EVENTS.""" inputs = filter_inputs( @@ -646,7 +646,7 @@ class CLASS_economy(Container): def fgdp( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """FGDP.""" inputs = filter_inputs( @@ -668,7 +668,7 @@ class CLASS_economy(Container): def fred( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """FRED.""" inputs = filter_inputs( @@ -690,7 +690,7 @@ class CLASS_economy(Container): def fred_search( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """FRED Search (was fred_notes).""" inputs = filter_inputs( @@ -712,7 +712,7 @@ class CLASS_economy(Container): def futures( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """FUTURES. 2 sources""" inputs = filter_inputs( @@ -734,7 +734,7 @@ class CLASS_economy(Container): def gdp( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """GDP.""" inputs = filter_inputs( @@ -756,7 +756,7 @@ class CLASS_economy(Container): def glbonds( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """GLBONDS.""" inputs = filter_inputs( @@ -778,7 +778,7 @@ class CLASS_economy(Container): def indices( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """INDICES.""" inputs = filter_inputs( @@ -800,7 +800,7 @@ class CLASS_economy(Container): def overview( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """OVERVIEW.""" inputs = filter_inputs( @@ -822,7 +822,7 @@ class CLASS_economy(Container): def perfmap( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """PERFMAP.""" inputs = filter_inputs( @@ -844,7 +844,7 @@ class CLASS_economy(Container): def performance( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """PERFORMANCE.""" inputs = filter_inputs( @@ -866,7 +866,7 @@ class CLASS_economy(Container): def revenue( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """REVENUE.""" inputs = filter_inputs( @@ -888,7 +888,7 @@ class CLASS_economy(Container): def rgdp( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """RGDP.""" inputs = filter_inputs( @@ -910,7 +910,7 @@ class CLASS_economy(Container): def rtps( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """RTPS.""" inputs = filter_inputs( @@ -932,7 +932,7 @@ class CLASS_economy(Container): def search_index( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """SEARCH_INDEX.""" inputs = filter_inputs( @@ -954,7 +954,7 @@ class CLASS_economy(Container): def spending( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """SPENDING.""" inputs = filter_inputs( @@ -976,7 +976,7 @@ class CLASS_economy(Container): def trust( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """TRUST.""" inputs = filter_inputs( @@ -998,7 +998,7 @@ class CLASS_economy(Container): def usbonds( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """USBONDS.""" inputs = filter_inputs( @@ -1020,7 +1020,7 @@ class CLASS_economy(Container): def valuation( self, chart: bool = False, - provider: Optional[Literal["fred", "polygon", "benzinga", "fmp"]] = None, + provider: Optional[Literal["polygon", "fmp", "fred", "benzinga"]] = None, ) -> CommandOutput[openbb_core.app.model.results.empty.Empty]: """VALUATION.""" inputs = filter_inputs( diff --git a/openbb_sdk/sdk/core/openbb_core/app/static/package/fixedincome.py b/openbb_sdk/sdk/core/openbb_core/app/static/package/fixedincome.py index a46f8309ceb..51d71a38625 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/static/package/fixedincome.py +++ b/openbb_sdk/sdk/core/openbb_core/app/static/package/fixedincome.py @@ -18,7 +18,7 @@ class CLASS_fixedincome(Container): def treasury( self, start_date: Optional[str] = None, - end_date: Optional[str] = "2023-07-24", + end_date: Optional[str] = "2023-07-26", chart: bool = False, provider: Optional[Literal["fmp"]] = None, **kwargs diff --git a/openbb_sdk/sdk/core/openbb_core/app/static/package/stocks_fa.py b/openbb_sdk/sdk/core/openbb_core/app/static/package/stocks_fa.py index f7fd3c64475..c854f49d230 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/static/package/stocks_fa.py +++ b/openbb_sdk/sdk/core/openbb_core/app/static/package/stocks_fa.py @@ -206,8 +206,8 @@ class CLASS_stocks_fa(Container): @validate_arguments def cal( self, - start_date: Union[datetime.date, None, str] = datetime.date(2023, 6, 23), - end_date: Union[datetime.date, None, str] = datetime.date(2023, 7, 23), + start_date: Union[datetime.date, None, str] = datetime.date(2023, 6, 25), + end_date: Union[datetime.date, None, str] = datetime.date(2023, 7, 25), chart: bool = False, provider: Optional[Literal["fmp"]] = None, **kwargs diff --git a/openbb_sdk/sdk/core/openbb_core/app/static/package_builder.py b/openbb_sdk/sdk/core/openbb_core/app/static/package_builder.py index d39df854f3d..4d1b6950b53 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/static/package_builder.py +++ b/openbb_sdk/sdk/core/openbb_core/app/static/package_builder.py @@ -390,10 +390,11 @@ class MethodDefinition: if field_default is None or field_default is MISSING: return Parameter.empty - if field_default is not Ellipsis: - return field_default + default_default = getattr(field_default, "default", None) + if default_default is MISSING or default_default is Ellipsis: + return Parameter.empty - return Parameter.empty + return default_default @staticmethod def is_annotated_dc(annotation) -> bool: diff --git a/openbb_sdk/sdk/core/tests/test_static_package_builder.py b/openbb_sdk/sdk/core/tests/test_static_package_builder.py index 6cbb16f4a07..7e075d011e2 100644 --- a/openbb_sdk/sdk/core/tests/test_static_package_builder.py +++ b/openbb_sdk/sdk/core/tests/test_static_package_builder.py @@ -16,6 +16,7 @@ from openbb_core.app.static.package_builder import ( Parameter, PathHandler, ) +from pydantic import Field @pytest.fixture(scope="module") @@ -144,13 +145,24 @@ def test_get_default(method_definition): """Test get default.""" class TestField: - default = 42 + default = Field(default=42) field = TestField() result = method_definition.get_default(field) assert result == 42 +def test_get_default_none(method_definition): + """Test get default.""" + + class TestField: + default = 42 + + field = TestField() + result = method_definition.get_default(field) + assert result is None + + def test_get_default_default_value(method_definition): """Test get default default value.""" @@ -159,7 +171,7 @@ def test_get_default_default_value(method_definition): field = TestField() result = method_definition.get_default(field) - assert result == _empty + assert result is None def test_get_default_no_default(method_definition): From 84e18749ef2478eaba4df54e82df2fb4d44dd0dc Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Thu, 27 Jul 2023 08:24:33 +0100 Subject: [PATCH 22/98] boilerplate for tests --- .../app/logs/formatters/test_formatter_with_exceptions.py | 5 +++++ .../app/logs/handlers/test_path_tracking_file_handler.py | 0 .../sdk/core/tests/app/logs/handlers/test_posthog_handler.py | 0 3 files changed, 5 insertions(+) create mode 100644 openbb_sdk/sdk/core/tests/app/logs/formatters/test_formatter_with_exceptions.py create mode 100644 openbb_sdk/sdk/core/tests/app/logs/handlers/test_path_tracking_file_handler.py create mode 100644 openbb_sdk/sdk/core/tests/app/logs/handlers/test_posthog_handler.py diff --git a/openbb_sdk/sdk/core/tests/app/logs/formatters/test_formatter_with_exceptions.py b/openbb_sdk/sdk/core/tests/app/logs/formatters/test_formatter_with_exceptions.py new file mode 100644 index 00000000000..f67e3151da9 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/logs/formatters/test_formatter_with_exceptions.py @@ -0,0 +1,5 @@ +import pytest + +from openbb_core.app.logs.formatters.formatter_with_exceptions import ( + FormatterWithExceptions, +) diff --git a/openbb_sdk/sdk/core/tests/app/logs/handlers/test_path_tracking_file_handler.py b/openbb_sdk/sdk/core/tests/app/logs/handlers/test_path_tracking_file_handler.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/sdk/core/tests/app/logs/handlers/test_posthog_handler.py b/openbb_sdk/sdk/core/tests/app/logs/handlers/test_posthog_handler.py new file mode 100644 index 00000000000..e69de29bb2d From 7db92c292765a438c60b8b89c43c0c3f3d4165b9 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Thu, 27 Jul 2023 13:45:18 +0200 Subject: [PATCH 23/98] Test user_service --- .../openbb_core/app/service/user_service.py | 15 +++ .../core/tests/test_service_user_service.py | 119 ++++++++++++++++++ 2 files changed, 134 insertions(+) create mode 100644 openbb_sdk/sdk/core/tests/test_service_user_service.py diff --git a/openbb_sdk/sdk/core/openbb_core/app/service/user_service.py b/openbb_sdk/sdk/core/openbb_core/app/service/user_service.py index 963d9ca3fb8..e26d2d1ab25 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/service/user_service.py +++ b/openbb_sdk/sdk/core/openbb_core/app/service/user_service.py @@ -1,3 +1,4 @@ +"""User service.""" from functools import reduce from pathlib import Path from typing import Any, Dict, List, MutableMapping, Optional @@ -26,6 +27,8 @@ from pymongo.mongo_client import MongoClient class UserService: + """User service.""" + REPOSITORY_DIRECTORY = Path(__file__).parent.parent.parent.parent USER_SETTINGS_PATH = USER_SETTINGS_PATH USER_SETTINGS_ALLOWED_FIELD_SET = {"credentials", "preferences", "defaults"} @@ -36,6 +39,7 @@ class UserService: mongodb_client: Optional[MongoClient] = None, access_token_repository: Optional[AbstractAccessTokenRepository] = None, ) -> AbstractAccessTokenRepository: + """Build token repository.""" if access_token_repository: pass elif mongodb_client and valid_client: @@ -52,6 +56,7 @@ class UserService: mongodb_client: Optional[MongoClient] = None, user_settings_repository: Optional[AbstractUserSettingsRepository] = None, ) -> AbstractUserSettingsRepository: + """Build user settings repository.""" if user_settings_repository: pass elif mongodb_client and valid_client: @@ -64,6 +69,7 @@ class UserService: @staticmethod def valid_client(client: Optional[MongoClient] = None) -> bool: + """Check if the client is valid.""" if client is None: return False @@ -77,6 +83,7 @@ class UserService: @classmethod def read_default_user_settings(cls, path: Optional[Path] = None) -> UserSettings: + """Read default user settings.""" path = path or cls.USER_SETTINGS_PATH if path.exists(): @@ -95,6 +102,7 @@ class UserService: user_settings: UserSettings, path: Optional[Path] = None, ) -> None: + """Write default user settings.""" path = path or cls.USER_SETTINGS_PATH user_settings_json = user_settings.json( @@ -107,6 +115,7 @@ class UserService: @classmethod def update_default(cls, user_settings: UserSettings) -> UserSettings: + """Update default user settings.""" d1 = cls.read_default_user_settings().dict() d2 = user_settings.dict() if user_settings else {} updated = cls.merge_dicts([d1, d2]) @@ -158,25 +167,31 @@ class UserService: @property def mongodb_client(self) -> Optional[MongoClient]: + """Return MongoDB client.""" return self._mongodb_client @property def default_user_settings(self) -> UserSettings: + """Return default user settings.""" return self._default_user_settings @default_user_settings.setter def default_user_settings(self, default_user_settings: UserSettings) -> None: + """Set default user settings.""" self._default_user_settings = default_user_settings @property def access_token_repository(self) -> AbstractAccessTokenRepository: + """Access token repository.""" return self._token_repository @property def user_settings_repository(self) -> AbstractUserSettingsRepository: + """User settings repository.""" return self._user_settings_repository def refresh_default_default_user_settings(self) -> UserSettings: + """Refresh default default user settings.""" self._default_user_settings = self.read_default_user_settings() return self._default_user_settings diff --git a/openbb_sdk/sdk/core/tests/test_service_user_service.py b/openbb_sdk/sdk/core/tests/test_service_user_service.py new file mode 100644 index 00000000000..b8c2d0532d6 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/test_service_user_service.py @@ -0,0 +1,119 @@ +"""Test the ../app/service/user_service.py module.""" + +from pathlib import Path +from unittest.mock import MagicMock + +import pytest +from openbb_core.app.service.user_service import ( + AbstractAccessTokenRepository, + InMemoryAccessTokenRepository, + MongoClient, + MongoDBAccessTokenRepository, + UserService, + UserSettings, +) + + +def test_build_token_repository_with_given_repository(): + """Test build with repository.""" + mock_repository = MagicMock(spec=AbstractAccessTokenRepository) + result = UserService.build_token_repository( + valid_client=True, access_token_repository=mock_repository + ) + + assert result == mock_repository + + +def test_build_token_repository_with_mongodb_client(): + """Test build with mongodb client.""" + mock_client = MagicMock(spec=MongoClient) + result = UserService.build_token_repository( + valid_client=True, mongodb_client=mock_client + ) + + assert isinstance(result, MongoDBAccessTokenRepository) + + +def test_build_token_repository_memory(): + """Test build with in-memory access.""" + result = UserService.build_token_repository(valid_client=True) + + assert isinstance(result, InMemoryAccessTokenRepository) + + +def test_build_user_settings_repository_with_given_repository(): + """Test build with repository.""" + mock_repository = MagicMock(spec=AbstractAccessTokenRepository) + result = UserService.build_user_settings_repository( + valid_client=True, user_settings_repository=mock_repository + ) + + assert result == mock_repository + + +def test_build_user_settings_repository_with_mongodb_client(): + """Test build with mongodb client.""" + mock_client = MagicMock(spec=MongoClient) + result = UserService.build_user_settings_repository( + valid_client=True, mongodb_client=mock_client + ) + + assert result + assert isinstance(type(result), type(MongoDBAccessTokenRepository)) + + +def test_build_user_settings_repository_memory(): + """Test build with in-memory access.""" + result = UserService.build_user_settings_repository(valid_client=True) + + assert result + assert isinstance(type(result), type(InMemoryAccessTokenRepository)) + + +def test_valid_client_false(): + """Test valid client.""" + result = UserService.valid_client() + + assert result is False + + +def test_valid_client_true(): + """Test valid client.""" + mock_client = MagicMock(spec=MongoClient) + result = UserService.valid_client(client=mock_client) + + assert result is True + + +# @pytest.mark.skip(reason="TODO") +def test_read_default_user_settings_file_exists(): + """Test read default user settings.""" + result = UserService.read_default_user_settings(path=Path("some_path")) + + assert result + assert isinstance(result, UserSettings) + + +@pytest.mark.skip(reason="TODO") +def test_write_default_user_settings(): + """Test write default user settings.""" + + +@pytest.mark.skip(reason="TODO") +def test_update_default(): + """Test update default user settings.""" + + +def test_merge_dicts(): + """Test merge dicts.""" + result = UserService.merge_dicts( + list_of_dicts=[ + {"a": 1, "b": 2}, + {"a": 3, "b": 4}, + ] + ) + + assert result + assert isinstance(result, dict) + assert result["a"] == 3 + assert result["b"] == 4 From 2fcb23b36d36b1d510cdb6e89fb4f8a17e97af4d Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Thu, 27 Jul 2023 13:55:21 +0200 Subject: [PATCH 24/98] Test system_settings --- .../openbb_core/app/service/system_service.py | 7 +++ .../core/tests/test_service_system_service.py | 54 +++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 openbb_sdk/sdk/core/tests/test_service_system_service.py diff --git a/openbb_sdk/sdk/core/openbb_core/app/service/system_service.py b/openbb_sdk/sdk/core/openbb_core/app/service/system_service.py index f9bc25cc7b9..d479b48fbae 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/service/system_service.py +++ b/openbb_sdk/sdk/core/openbb_core/app/service/system_service.py @@ -6,6 +6,8 @@ from openbb_core.app.model.system_settings import SystemSettings class SystemService: + """System service.""" + SYSTEM_SETTINGS_PATH = SYSTEM_SETTINGS_PATH SYSTEM_SETTINGS_ALLOWED_FIELD_SET = {"run_in_isolation", "dbms_uri"} @@ -13,6 +15,7 @@ class SystemService: def read_default_system_settings( cls, path: Optional[Path] = None ) -> SystemSettings: + """Read default system settings.""" path = path or cls.SYSTEM_SETTINGS_PATH if path.exists(): @@ -31,6 +34,7 @@ class SystemService: system_settings: SystemSettings, path: Optional[Path] = None, ) -> None: + """Write default system settings.""" path = path or cls.SYSTEM_SETTINGS_PATH system_settings_json = system_settings.json( @@ -50,13 +54,16 @@ class SystemService: @property def system_settings(self) -> SystemSettings: + """Get system settings.""" return self._system_settings @system_settings.setter def system_settings(self, system_settings: SystemSettings) -> None: + """Set system settings.""" self._system_settings = system_settings def refresh_system_settings(self) -> SystemSettings: + """Refresh system settings.""" self._system_settings = self.read_default_system_settings() return self._system_settings diff --git a/openbb_sdk/sdk/core/tests/test_service_system_service.py b/openbb_sdk/sdk/core/tests/test_service_system_service.py new file mode 100644 index 00000000000..79e6c4a0ab2 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/test_service_system_service.py @@ -0,0 +1,54 @@ +"""Test the ../openbb_core/app/service/system_service.py module.""" +# pylint: disable=redefined-outer-name + +import pytest +from openbb_core.app.service.system_service import SystemService + + +@pytest.fixture +def system_service(): + """Fixture for system service.""" + return SystemService() + + +def test_system_service_init(system_service): + """Test system service init.""" + assert system_service + + +def test_read_default_system_settings(system_service): + """Test read default system settings.""" + system_settings = system_service.read_default_system_settings() + + assert system_settings + + +def test_write_default_system_settings(system_service): + """Test write default system settings.""" + system_settings = system_service.read_default_system_settings() + system_service.write_default_system_settings(system_settings=system_settings) + + assert system_service + + +def test_system_settings(system_service): + """Test system settings.""" + system_settings = system_service.system_settings + + assert system_settings + + +def test_system_settings_setter(system_service): + """Test system settings setter.""" + system_settings = system_service.system_settings + + system_service.system_settings = system_settings + + assert system_service.system_settings == system_settings + + +def test_refresh_system_settings(system_service): + """Test refresh system settings.""" + system_settings = system_service.refresh_system_settings() + + assert system_settings From d0ec9d86500d065089ffcf3e906b5222719f1e55 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Thu, 27 Jul 2023 14:05:19 +0200 Subject: [PATCH 25/98] Test journal_service --- .../app/service/journal_service.py | 5 + .../tests/test_service_journal_service.py | 103 ++++++++++++++++++ 2 files changed, 108 insertions(+) create mode 100644 openbb_sdk/sdk/core/tests/test_service_journal_service.py diff --git a/openbb_sdk/sdk/core/openbb_core/app/service/journal_service.py b/openbb_sdk/sdk/core/openbb_core/app/service/journal_service.py index ff348767de4..085f80bd533 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/service/journal_service.py +++ b/openbb_sdk/sdk/core/openbb_core/app/service/journal_service.py @@ -22,8 +22,11 @@ from pymongo.mongo_client import MongoClient class JournalService: + """Journal service.""" + @staticmethod def valid_client(mongodb_client: Optional[MongoClient] = None) -> bool: + """Check if the client is valid.""" if mongodb_client is None: return False @@ -41,6 +44,7 @@ class JournalService: mongodb_client: Optional[MongoClient] = None, journal_entry_repository: Optional[AbstractJournalEntryRepository] = None, ) -> AbstractJournalEntryRepository: + """Build journal entry repository.""" if journal_entry_repository: pass elif mongodb_client and valid_client: @@ -57,6 +61,7 @@ class JournalService: mongodb_client: Optional[MongoClient] = None, journal_repository: Optional[AbstractJournalRepository] = None, ) -> AbstractJournalRepository: + """Build journal repository.""" if journal_repository: pass elif mongodb_client and valid_client: diff --git a/openbb_sdk/sdk/core/tests/test_service_journal_service.py b/openbb_sdk/sdk/core/tests/test_service_journal_service.py new file mode 100644 index 00000000000..b22edab68f6 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/test_service_journal_service.py @@ -0,0 +1,103 @@ +"""Test the ../openbb_core/app/service/journal_service.py module.""" +# pylint: disable=redefined-outer-name + +from unittest.mock import MagicMock + +import pytest +from openbb_core.app.service.journal_service import ( + AbstractJournalEntryRepository, + InMemoryJournalEntryRepository, + JournalService, + MongoClient, + MongoDBJournalEntryRepository, +) + + +@pytest.fixture +def journal_service(): + """Fixture for journal service.""" + return JournalService() + + +def test_journal_service_init(journal_service): + """Test journal service init.""" + assert journal_service + + +def test_invalid_client(journal_service): + """Test valid client.""" + assert not journal_service.valid_client() + + +def test_build_journal_entry_repository_with_given_repository(): + """Test build with repository.""" + mock_repository = MagicMock(spec=AbstractJournalEntryRepository) + result = JournalService.build_journal_entry_repository( + valid_client=True, journal_entry_repository=mock_repository + ) + + assert result == mock_repository + + +def test_build_journal_entry_repository_with_mongodb_client(): + """Test build with mongodb client.""" + mock_client = MagicMock(spec=MongoClient) + result = JournalService.build_journal_entry_repository( + valid_client=True, mongodb_client=mock_client + ) + + assert isinstance(result, MongoDBJournalEntryRepository) + + +def test_build_journal_entry_repository_memory(): + """Test build with in-memory access.""" + result = JournalService.build_journal_entry_repository(valid_client=True) + + assert isinstance(result, InMemoryJournalEntryRepository) + + +def test_build_journal_repository_with_given_repository(): + """Test build with repository.""" + mock_repository = MagicMock(spec=AbstractJournalEntryRepository) + result = JournalService.build_journal_entry_repository( + valid_client=True, journal_entry_repository=mock_repository + ) + + assert result == mock_repository + + +def test_build_journal_repository_with_mongodb_client(): + """Test build with mongodb client.""" + mock_client = MagicMock(spec=MongoClient) + result = JournalService.build_journal_entry_repository( + valid_client=True, mongodb_client=mock_client + ) + + assert isinstance(result, MongoDBJournalEntryRepository) + + +def test_build_journal_repository_memory(): + """Test build with in-memory access.""" + result = JournalService.build_journal_entry_repository(valid_client=True) + + assert isinstance(result, InMemoryJournalEntryRepository) + + +def test_journal_service_mongodb_client(journal_service): + """Test mongodb client.""" + assert journal_service.mongodb_client is None + + +def test_journal_service_journal_entry_repository(journal_service): + """Test journal entry repository.""" + assert isinstance( + journal_service.journal_entry_repository, InMemoryJournalEntryRepository + ) + + +def test_journal_service_journal_repository(journal_service): + """Test journal repository.""" + assert journal_service.journal_repository + assert isinstance( + type(journal_service.journal_repository), type(InMemoryJournalEntryRepository) + ) From d72adfd29c5b0fc8fd89aded432d2dae26b5ea52 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Thu, 27 Jul 2023 14:57:26 +0200 Subject: [PATCH 26/98] Hub service tests and file restructure. --- .../openbb_core/app/service/hub_service.py | 5 +- .../app/service/journal_service.py | 4 + .../tests/app/service/test_hub_service.py | 164 ++++++++++++++++++ .../service/test_journal_service.py} | 2 +- .../service/test_system_service.py} | 2 +- .../service/test_user_service.py} | 2 +- .../static/test_app_factory.py} | 0 .../static/test_container.py} | 2 +- .../static/test_coverage.py} | 2 +- .../static/test_filters.py} | 2 +- .../static/test_package_builder.py} | 2 +- 11 files changed, 178 insertions(+), 9 deletions(-) create mode 100644 openbb_sdk/sdk/core/tests/app/service/test_hub_service.py rename openbb_sdk/sdk/core/tests/{test_service_journal_service.py => app/service/test_journal_service.py} (97%) rename openbb_sdk/sdk/core/tests/{test_service_system_service.py => app/service/test_system_service.py} (95%) rename openbb_sdk/sdk/core/tests/{test_service_user_service.py => app/service/test_user_service.py} (98%) rename openbb_sdk/sdk/core/tests/{test_static_app_factory.py => app/static/test_app_factory.py} (100%) rename openbb_sdk/sdk/core/tests/{test_static_container.py => app/static/test_container.py} (78%) rename openbb_sdk/sdk/core/tests/{test_static_coverage.py => app/static/test_coverage.py} (93%) rename openbb_sdk/sdk/core/tests/{test_static_filters.py => app/static/test_filters.py} (95%) rename openbb_sdk/sdk/core/tests/{test_static_package_builder.py => app/static/test_package_builder.py} (99%) diff --git a/openbb_sdk/sdk/core/openbb_core/app/service/hub_service.py b/openbb_sdk/sdk/core/openbb_core/app/service/hub_service.py index 9611f0f9220..ee5c4d37548 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/service/hub_service.py +++ b/openbb_sdk/sdk/core/openbb_core/app/service/hub_service.py @@ -1,3 +1,4 @@ +"""Hub manager class.""" from typing import Optional import requests @@ -11,11 +12,11 @@ from openbb_core.app.model.user_settings import UserSettings class OpenBBError(Exception): - pass + """OpenBB error.""" class HubService: - """Hub manager class""" + """Manage Hub service class.""" BASE_URL = "https://payments.openbb.dev" TIMEOUT = 10 diff --git a/openbb_sdk/sdk/core/openbb_core/app/service/journal_service.py b/openbb_sdk/sdk/core/openbb_core/app/service/journal_service.py index 085f80bd533..b75bf03d1eb 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/service/journal_service.py +++ b/openbb_sdk/sdk/core/openbb_core/app/service/journal_service.py @@ -1,3 +1,4 @@ +"""Journal service.""" from typing import Optional from openbb_core.app.repository.abstract.journal_entry_repository import ( @@ -92,12 +93,15 @@ class JournalService: @property def mongodb_client(self) -> Optional[MongoClient]: + """Return mongodb client.""" return self._mongodb_client @property def journal_entry_repository(self) -> AbstractJournalEntryRepository: + """Return journal entry repository.""" return self._journal_entry_repository @property def journal_repository(self) -> AbstractJournalRepository: + """Return journal repository.""" return self._journal_repository diff --git a/openbb_sdk/sdk/core/tests/app/service/test_hub_service.py b/openbb_sdk/sdk/core/tests/app/service/test_hub_service.py new file mode 100644 index 00000000000..a6bab27c696 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/service/test_hub_service.py @@ -0,0 +1,164 @@ +"""Test the hub_service.py module.""" + + +from unittest.mock import MagicMock, patch + +import pytest +from openbb_core.app.service.hub_service import ( + Credentials, + HubService, + HubSession, + HubUserSettings, + OpenBBError, +) + + +@pytest.fixture +def mocker(): + """Fixture for mocker.""" + with patch("openbb_core.app.service.hub_service.HubService") as mock: + yield mock + + +def test_connect_with_email_password(): + """Test connect with email and password.""" + mock_hub_session = MagicMock(spec=HubSession) + with patch( + "requests.post", return_value=MagicMock(status_code=200, json=lambda: {}) + ): + with patch.object( + HubService, "get_session_from_email_password", return_value=mock_hub_session + ): + hub_service = HubService() + result = hub_service.connect(email="test@example.com", password="password") + + assert result == mock_hub_session + assert hub_service.session == mock_hub_session + + +def test_connect_with_sdk_token(): + """Test connect with SDK personal access token.""" + mock_hub_session = MagicMock(spec=HubSession) + with patch( + "requests.post", return_value=MagicMock(status_code=200, json=lambda: {}) + ): + with patch.object( + HubService, "get_session_from_sdk_token", return_value=mock_hub_session + ): + hub_service = HubService() + result = hub_service.connect(sdk_token="sdk_token") + + assert result == mock_hub_session + assert hub_service.session == mock_hub_session + + +def test_connect_without_credentials(): + """Test connect without credentials.""" + hub_service = HubService() + with pytest.raises( + OpenBBError, match="Please provide 'email' and 'password' or 'sdk_token'" + ): + hub_service.connect() + + +@patch("requests.post") +def test_get_session_from_email_password(mock_post): + """Test get session from email and password.""" + mock_post.return_value = MagicMock( + status_code=200, + json=lambda: { + "access_token": "token", + "token_type": "Bearer", + "uuid": "uuid", + "email": "email", + "username": "username", + "primary_usage": "primary_usage", + }, + ) + result = HubService.get_session_from_email_password("email", "password") + assert isinstance(result, HubSession) + + +@patch("requests.post") +def test_get_session_from_sdk_token(mock_post): + """Test get session from SDK personal access token.""" + mock_post.return_value = MagicMock( + status_code=200, + json=lambda: { + "access_token": "token", + "token_type": "Bearer", + "uuid": "uuid", + "username": "username", + "email": "email", + "primary_usage": "primary_usage", + }, + ) + result = HubService.get_session_from_sdk_token("token") + assert isinstance(result, HubSession) + + +@patch("requests.get") +def test_disconnect(mock_get): + """Test disconnect.""" + mock_get.return_value = MagicMock(status_code=200, json=lambda: {"success": True}) + mock_hub_session = MagicMock( + spec=HubSession, access_token="token", token_type="Bearer" + ) + hub_service = HubService(session=mock_hub_session) + + assert hub_service.disconnect() is True + assert hub_service.session is None + + +@patch("requests.get") +def test_get_user_settings(mock_get): + """Test get user settings.""" + mock_get.return_value = MagicMock(status_code=200, json=lambda: {}) + mock_hub_session = MagicMock( + spec=HubSession, access_token="token", token_type="Bearer" + ) + + user_settings = HubService.get_user_settings(mock_hub_session) + assert isinstance(user_settings, HubUserSettings) + + +@patch("requests.put") +def test_put_user_settings(mock_put): + """Test put user settings.""" + mock_put.return_value = MagicMock(status_code=200) + mock_hub_session = MagicMock( + spec=HubSession, access_token="token", token_type="Bearer" + ) + mock_user_settings = MagicMock(spec=HubUserSettings) + + assert HubService.put_user_settings(mock_hub_session, mock_user_settings) is True + + +def test_hub2sdk(): + """Test hub2sdk.""" + mock_user_settings = MagicMock(spec=HubUserSettings) + mock_user_settings.features_keys = MagicMock( + API_KEY_FINANCIALMODELINGPREP="fmp", + API_POLYGON_KEY="polygon", + API_FRED_KEY="fred", + ) + + credentials = HubService.hub2sdk(mock_user_settings) + assert isinstance(credentials, Credentials) + assert credentials.fmp_api_key == "fmp" + assert credentials.polygon_api_key == "polygon" + assert credentials.fred_api_key == "fred" + + +def test_sdk2hub(): + """Test sdk2hub.""" + mock_credentials = MagicMock(spec=Credentials) + mock_credentials.fmp_api_key = "fmp" + mock_credentials.polygon_api_key = "polygon" + mock_credentials.fred_api_key = "fred" + + user_settings = HubService.sdk2hub(mock_credentials) + assert isinstance(user_settings, HubUserSettings) + assert user_settings.features_keys.API_KEY_FINANCIALMODELINGPREP == "fmp" + assert user_settings.features_keys.API_POLYGON_KEY == "polygon" + assert user_settings.features_keys.API_FRED_KEY == "fred" diff --git a/openbb_sdk/sdk/core/tests/test_service_journal_service.py b/openbb_sdk/sdk/core/tests/app/service/test_journal_service.py similarity index 97% rename from openbb_sdk/sdk/core/tests/test_service_journal_service.py rename to openbb_sdk/sdk/core/tests/app/service/test_journal_service.py index b22edab68f6..2e735c43d17 100644 --- a/openbb_sdk/sdk/core/tests/test_service_journal_service.py +++ b/openbb_sdk/sdk/core/tests/app/service/test_journal_service.py @@ -1,4 +1,4 @@ -"""Test the ../openbb_core/app/service/journal_service.py module.""" +"""Test the journal_service.py module.""" # pylint: disable=redefined-outer-name from unittest.mock import MagicMock diff --git a/openbb_sdk/sdk/core/tests/test_service_system_service.py b/openbb_sdk/sdk/core/tests/app/service/test_system_service.py similarity index 95% rename from openbb_sdk/sdk/core/tests/test_service_system_service.py rename to openbb_sdk/sdk/core/tests/app/service/test_system_service.py index 79e6c4a0ab2..6b42c18c581 100644 --- a/openbb_sdk/sdk/core/tests/test_service_system_service.py +++ b/openbb_sdk/sdk/core/tests/app/service/test_system_service.py @@ -1,4 +1,4 @@ -"""Test the ../openbb_core/app/service/system_service.py module.""" +"""Test the system_service.py module.""" # pylint: disable=redefined-outer-name import pytest diff --git a/openbb_sdk/sdk/core/tests/test_service_user_service.py b/openbb_sdk/sdk/core/tests/app/service/test_user_service.py similarity index 98% rename from openbb_sdk/sdk/core/tests/test_service_user_service.py rename to openbb_sdk/sdk/core/tests/app/service/test_user_service.py index b8c2d0532d6..11b3ee4ba7f 100644 --- a/openbb_sdk/sdk/core/tests/test_service_user_service.py +++ b/openbb_sdk/sdk/core/tests/app/service/test_user_service.py @@ -1,4 +1,4 @@ -"""Test the ../app/service/user_service.py module.""" +"""Test the user_service.py module.""" from pathlib import Path from unittest.mock import MagicMock diff --git a/openbb_sdk/sdk/core/tests/test_static_app_factory.py b/openbb_sdk/sdk/core/tests/app/static/test_app_factory.py similarity index 100% rename from openbb_sdk/sdk/core/tests/test_static_app_factory.py rename to openbb_sdk/sdk/core/tests/app/static/test_app_factory.py diff --git a/openbb_sdk/sdk/core/tests/test_static_container.py b/openbb_sdk/sdk/core/tests/app/static/test_container.py similarity index 78% rename from openbb_sdk/sdk/core/tests/test_static_container.py rename to openbb_sdk/sdk/core/tests/app/static/test_container.py index 5329647c988..dc1e01b2801 100644 --- a/openbb_sdk/sdk/core/tests/test_static_container.py +++ b/openbb_sdk/sdk/core/tests/app/static/test_container.py @@ -1,4 +1,4 @@ -"""Test the app/static/container.py file.""" +"""Test the container.py file.""" from openbb_core.app.static.container import Container diff --git a/openbb_sdk/sdk/core/tests/test_static_coverage.py b/openbb_sdk/sdk/core/tests/app/static/test_coverage.py similarity index 93% rename from openbb_sdk/sdk/core/tests/test_static_coverage.py rename to openbb_sdk/sdk/core/tests/app/static/test_coverage.py index 123751e31a9..2131d24cefb 100644 --- a/openbb_sdk/sdk/core/tests/test_static_coverage.py +++ b/openbb_sdk/sdk/core/tests/app/static/test_coverage.py @@ -1,4 +1,4 @@ -"""Test the app/static/coverage.py file.""" +"""Test the coverage.py file.""" # pylint: disable=redefined-outer-name import pytest diff --git a/openbb_sdk/sdk/core/tests/test_static_filters.py b/openbb_sdk/sdk/core/tests/app/static/test_filters.py similarity index 95% rename from openbb_sdk/sdk/core/tests/test_static_filters.py rename to openbb_sdk/sdk/core/tests/app/static/test_filters.py index 642244e8f08..5b014933991 100644 --- a/openbb_sdk/sdk/core/tests/test_static_filters.py +++ b/openbb_sdk/sdk/core/tests/app/static/test_filters.py @@ -1,4 +1,4 @@ -"""Test the app/static/filters.py file.""" +"""Test the filters.py file.""" import pytest from openbb_core.app.model.command_output import CommandOutput diff --git a/openbb_sdk/sdk/core/tests/test_static_package_builder.py b/openbb_sdk/sdk/core/tests/app/static/test_package_builder.py similarity index 99% rename from openbb_sdk/sdk/core/tests/test_static_package_builder.py rename to openbb_sdk/sdk/core/tests/app/static/test_package_builder.py index 7e075d011e2..e922fa1cf3a 100644 --- a/openbb_sdk/sdk/core/tests/test_static_package_builder.py +++ b/openbb_sdk/sdk/core/tests/app/static/test_package_builder.py @@ -1,4 +1,4 @@ -"""Test the app/static/package_builder.py file.""" +"""Test the package_builder.py file.""" # pylint: disable=redefined-outer-name from dataclasses import dataclass From a3c6cf9807132e4491275594872c6d19221fd338 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Thu, 27 Jul 2023 15:30:59 +0200 Subject: [PATCH 27/98] API dependency tests --- .../core/openbb_core/api/dependency/system.py | 3 + .../openbb_core/api/model/access_token.py | 5 +- .../openbb_core/api/model/token_response.py | 3 + .../core/tests/api/dependency/test_system.py | 34 ++++++++ .../core/tests/api/dependency/test_user.py | 80 +++++++++++++++++++ .../sdk/core/tests/api/router/test_system.py | 0 6 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 openbb_sdk/sdk/core/tests/api/dependency/test_system.py create mode 100644 openbb_sdk/sdk/core/tests/api/dependency/test_user.py create mode 100644 openbb_sdk/sdk/core/tests/api/router/test_system.py diff --git a/openbb_sdk/sdk/core/openbb_core/api/dependency/system.py b/openbb_sdk/sdk/core/openbb_core/api/dependency/system.py index b908e3ba490..4ccc1c5e0b4 100644 --- a/openbb_sdk/sdk/core/openbb_core/api/dependency/system.py +++ b/openbb_sdk/sdk/core/openbb_core/api/dependency/system.py @@ -1,3 +1,4 @@ +"""System dependency.""" from copy import deepcopy from openbb_core.app.model.system_settings import SystemSettings @@ -7,10 +8,12 @@ __system_service = SystemService() async def get_system_settings() -> SystemSettings: + """Get system settings.""" global __system_service # noqa: PLW0602 # pylint: disable=global-variable-not-assigned return deepcopy(__system_service.system_settings) async def get_system_service() -> SystemService: + """Get system service.""" global __system_service # noqa: PLW0602 # pylint: disable=global-variable-not-assigned return __system_service diff --git a/openbb_sdk/sdk/core/openbb_core/api/model/access_token.py b/openbb_sdk/sdk/core/openbb_core/api/model/access_token.py index 3fe5988507d..c21d92b5951 100644 --- a/openbb_sdk/sdk/core/openbb_core/api/model/access_token.py +++ b/openbb_sdk/sdk/core/openbb_core/api/model/access_token.py @@ -1,3 +1,4 @@ +"""Access Token Model.""" from datetime import datetime from openbb_core.app.model.abstract.tagged import Tagged @@ -5,10 +6,12 @@ from pydantic import Field class AccessToken(Tagged): - """This will be turn into a JWT Token""" + """Turn into a JWT Token.""" sub: str = Field(description="Subject of the token, here : `UserSettings.id`") exp: datetime = Field(description="Expiration datetime of the `access_token`.") class Config: + """Pydantic Config.""" + validate_assignment = True diff --git a/openbb_sdk/sdk/core/openbb_core/api/model/token_response.py b/openbb_sdk/sdk/core/openbb_core/api/model/token_response.py index a67d7fd087c..d3980f13d81 100644 --- a/openbb_sdk/sdk/core/openbb_core/api/model/token_response.py +++ b/openbb_sdk/sdk/core/openbb_core/api/model/token_response.py @@ -1,6 +1,9 @@ +"""Token response model.""" from pydantic import BaseModel class TokenResponse(BaseModel): + """Token response model.""" + access_token: str token_type: str diff --git a/openbb_sdk/sdk/core/tests/api/dependency/test_system.py b/openbb_sdk/sdk/core/tests/api/dependency/test_system.py new file mode 100644 index 00000000000..11e08d06838 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/api/dependency/test_system.py @@ -0,0 +1,34 @@ +"""Test the system module.""" +import asyncio +from unittest.mock import MagicMock, patch + +from openbb_core.api.dependency.system import ( + SystemSettings, + get_system_service, + get_system_settings, +) + + +@patch("openbb_core.api.dependency.system.SystemService") +def test_get_system_settings(mock_system_service): + """Test get_system_settings.""" + mock_system_settings = MagicMock(spec=SystemSettings) + mock_system_service.system_settings = mock_system_settings + + with patch( + "openbb_core.api.dependency.system.__system_service", new=mock_system_service + ): + system_settings = asyncio.run(get_system_settings()) + + assert system_settings == mock_system_settings + + +@patch("openbb_core.api.dependency.system.SystemService") +def test_get_system_service(mock_system_service): + """Test get_system_service.""" + with patch( + "openbb_core.api.dependency.system.__system_service", new=mock_system_service + ): + system_service = asyncio.run(get_system_service()) + + assert system_service == mock_system_service diff --git a/openbb_sdk/sdk/core/tests/api/dependency/test_user.py b/openbb_sdk/sdk/core/tests/api/dependency/test_user.py new file mode 100644 index 00000000000..091e0d4f07d --- /dev/null +++ b/openbb_sdk/sdk/core/tests/api/dependency/test_user.py @@ -0,0 +1,80 @@ +"""Test the user module.""" +import asyncio +from unittest.mock import MagicMock, patch + +from openbb_core.api.dependency.user import ( + AccessToken, + SystemSettings, + UserSettings, + authenticate_user, + create_access_token, + create_jwt_token, + get_password_hash, + get_user, + get_user_service, + verify_password, +) + + +def test_password_functions(): + """Test password functions.""" + password = "my_password" + hashed_password = get_password_hash(password) + assert verify_password(password, hashed_password) + + +@patch("openbb_core.api.dependency.user.UserService") +def test_authenticate_user(mock_user_service): + """Test authenticate_user.""" + mock_user_settings = MagicMock( + spec=UserSettings, profile=MagicMock(password_hash="hashed_password") + ) + mock_user_service.user_settings_repository.read_by_profile.return_value = ( + mock_user_settings + ) + with patch("openbb_core.api.dependency.user.verify_password", return_value=True): + result = authenticate_user("password", "username", mock_user_service) + + assert result == mock_user_settings + + +def test_create_access_token(): + """Test create_access_token.""" + sub = "subject" + access_token = create_access_token(sub) + + assert isinstance(access_token, AccessToken) + assert access_token.sub == sub + + +def test_create_jwt_token(): + """Test create_jwt_token.""" + mock_access_token = MagicMock( + spec=AccessToken, dict=lambda: {"sub": "subject", "exp": 12345} + ) + jwt_token = create_jwt_token(mock_access_token) + + assert isinstance(jwt_token, str) + + +@patch("openbb_core.api.dependency.user.UserService") +def test_get_user_service(mock_user_service): + """Test get_user_service.""" + mock_system_settings = MagicMock(spec=SystemSettings, dbms_uri=None) + with patch("openbb_core.api.dependency.user.__user_service", new=None): + asyncio.run(get_user_service(mock_system_settings)) + + mock_user_service.assert_called_once_with() + + +@patch("openbb_core.api.dependency.user.jwt.decode") +@patch("openbb_core.api.dependency.user.UserService") +def test_get_user(mock_user_service, mock_decode): + """Test get_user.""" + mock_decode.return_value = {"sub": "user_id"} + mock_user_settings = MagicMock(spec=UserSettings, profile=MagicMock(active=True)) + mock_user_service.user_settings_repository.read.return_value = mock_user_settings + with patch("openbb_core.api.dependency.user.__user_service", new=mock_user_service): + result = asyncio.run(get_user("jwt_token", mock_user_service)) + + assert result == mock_user_settings diff --git a/openbb_sdk/sdk/core/tests/api/router/test_system.py b/openbb_sdk/sdk/core/tests/api/router/test_system.py new file mode 100644 index 00000000000..e69de29bb2d From 2db1ce548404c5e31455dca1f526415522f6c375 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Thu, 27 Jul 2023 15:32:24 +0200 Subject: [PATCH 28/98] Docstring improve --- openbb_sdk/sdk/core/openbb_core/api/dependency/user.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/openbb_sdk/sdk/core/openbb_core/api/dependency/user.py b/openbb_sdk/sdk/core/openbb_core/api/dependency/user.py index ffdd8c4337a..9e0eb932f76 100644 --- a/openbb_sdk/sdk/core/openbb_core/api/dependency/user.py +++ b/openbb_sdk/sdk/core/openbb_core/api/dependency/user.py @@ -1,3 +1,4 @@ +"""User dependency.""" from datetime import datetime, timedelta from typing import Annotated, Optional @@ -22,10 +23,12 @@ pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") def verify_password(plain_password, hashed_password): + """Verify password.""" return pwd_context.verify(plain_password, hashed_password) def get_password_hash(password): + """Get password hash.""" return pwd_context.hash(password) @@ -34,6 +37,7 @@ def authenticate_user( username: str, user_service: UserService, ) -> Optional[UserSettings]: + """Authenticate user.""" user = user_service.user_settings_repository.read_by_profile( filter_list=[("username", username)], ) @@ -52,6 +56,7 @@ def create_access_token( sub: str, expiration_delta: Optional[timedelta] = None, ) -> AccessToken: + """Create access token.""" if expiration_delta is None: expiration_delta = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES) @@ -67,6 +72,7 @@ def create_jwt_token( key=SECRET_KEY, algorithm=ALGORITHM, ) -> str: + """Create JWT token.""" claims = access_token.dict() encoded_jwt = jwt.encode(claims=claims, key=key, algorithm=algorithm) return encoded_jwt @@ -75,6 +81,7 @@ def create_jwt_token( async def get_user_service( system_settings: Annotated[SystemSettings, Depends(get_system_settings)] ) -> UserService: + """Get user service.""" global __user_service # pylint: disable=global-statement if __user_service is None: @@ -92,6 +99,7 @@ async def get_user( jwt_token: Annotated[str, Depends(oauth2_scheme)], user_service: Annotated[UserService, Depends(get_user_service)], ): + """Get user.""" credentials_exception = HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Could not validate credentials", From 4f86b6c8f8a65ae47ddd5865c12b5f69cf494247 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Thu, 27 Jul 2023 16:17:50 +0200 Subject: [PATCH 29/98] Edits --- openbb_sdk/sdk/core/openbb_core/api/router/system.py | 2 ++ openbb_sdk/sdk/core/tests/api/router/test_system.py | 0 2 files changed, 2 insertions(+) delete mode 100644 openbb_sdk/sdk/core/tests/api/router/test_system.py diff --git a/openbb_sdk/sdk/core/openbb_core/api/router/system.py b/openbb_sdk/sdk/core/openbb_core/api/router/system.py index 8a9c8e834e6..17e8f0a9d4a 100644 --- a/openbb_sdk/sdk/core/openbb_core/api/router/system.py +++ b/openbb_sdk/sdk/core/openbb_core/api/router/system.py @@ -1,3 +1,4 @@ +"""System router.""" from typing import Annotated from fastapi import APIRouter, Depends @@ -11,4 +12,5 @@ router = APIRouter(prefix="/system", tags=["System"]) async def get_system_model( system_settings: Annotated[SystemSettings, Depends(get_system_settings)], ) -> SystemSettings: + """Get system model.""" return system_settings diff --git a/openbb_sdk/sdk/core/tests/api/router/test_system.py b/openbb_sdk/sdk/core/tests/api/router/test_system.py deleted file mode 100644 index e69de29bb2d..00000000000 From a7e1d2bc1fd56cbe9be08c1aedfb503ba9b27613 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Fri, 28 Jul 2023 12:02:15 +0200 Subject: [PATCH 30/98] Test router coverage, system, and settings. --- .../core/openbb_core/api/router/coverage.py | 2 ++ .../core/openbb_core/api/router/settings.py | 8 ++--- .../core/tests/api/router/test_coverage.py | 29 ++++++++++++++++ .../core/tests/api/router/test_settings.py | 33 +++++++++++++++++++ .../sdk/core/tests/api/router/test_system.py | 18 ++++++++++ 5 files changed, 85 insertions(+), 5 deletions(-) create mode 100644 openbb_sdk/sdk/core/tests/api/router/test_coverage.py create mode 100644 openbb_sdk/sdk/core/tests/api/router/test_settings.py create mode 100644 openbb_sdk/sdk/core/tests/api/router/test_system.py diff --git a/openbb_sdk/sdk/core/openbb_core/api/router/coverage.py b/openbb_sdk/sdk/core/openbb_core/api/router/coverage.py index 4b3af70b484..9075a370646 100644 --- a/openbb_sdk/sdk/core/openbb_core/api/router/coverage.py +++ b/openbb_sdk/sdk/core/openbb_core/api/router/coverage.py @@ -8,9 +8,11 @@ router = APIRouter(prefix="/coverage", tags=["Coverage"]) @router.get("/providers") async def get_provider_coverage() -> Dict[str, List[str]]: + """Get provider coverage.""" return CommandMap().provider_coverage @router.get("/commands") async def get_command_coverage() -> Dict[str, List[str]]: + """Get command coverage.""" return CommandMap().command_coverage diff --git a/openbb_sdk/sdk/core/openbb_core/api/router/settings.py b/openbb_sdk/sdk/core/openbb_core/api/router/settings.py index c47f7436b20..c3afa864c5c 100644 --- a/openbb_sdk/sdk/core/openbb_core/api/router/settings.py +++ b/openbb_sdk/sdk/core/openbb_core/api/router/settings.py @@ -1,11 +1,7 @@ from typing import Annotated from fastapi import APIRouter, Depends -from openbb_core.api.dependency.user import ( - UserService, - get_user, - get_user_service, -) +from openbb_core.api.dependency.user import UserService, get_user, get_user_service from openbb_core.app.model.credentials import Credentials from openbb_core.app.model.user_settings import UserSettings @@ -16,6 +12,7 @@ router = APIRouter(prefix="/settings", tags=["Settings"]) async def read_users_settings( user_settings: Annotated[UserSettings, Depends(get_user)], ) -> UserSettings: + """Read users settings.""" return user_settings @@ -25,6 +22,7 @@ async def patch_user_credentials( user_settings: Annotated[UserSettings, Depends(get_user)], user_service: Annotated[UserService, Depends(get_user_service)], ) -> UserSettings: + """Patch user credentials.""" current = user_settings.credentials.dict() incoming = credentials.dict(exclude_none=True) current.update(incoming) diff --git a/openbb_sdk/sdk/core/tests/api/router/test_coverage.py b/openbb_sdk/sdk/core/tests/api/router/test_coverage.py new file mode 100644 index 00000000000..38738080b20 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/api/router/test_coverage.py @@ -0,0 +1,29 @@ +"""Test coverage for the router module.""" + + +from unittest.mock import patch + +from openbb_core.api.router.coverage import get_command_coverage, get_provider_coverage + + +@patch("openbb_core.api.router.coverage.CommandMap") +def test_get_provider_coverage(mock_command_map): + """Test get provider coverage.""" + mock_command_map.return_value.provider_coverage = { + "provider1": ["coverage1", "coverage2"] + } + + response = get_provider_coverage() + + assert response + + +@patch("openbb_core.api.router.coverage.CommandMap") +def test_get_command_coverage(mock_command_map): + """Test get command coverage.""" + mock_command_map.return_value.command_coverage = { + "command1": ["coverage1", "coverage2"] + } + + response = get_command_coverage() + assert response diff --git a/openbb_sdk/sdk/core/tests/api/router/test_settings.py b/openbb_sdk/sdk/core/tests/api/router/test_settings.py new file mode 100644 index 00000000000..f7d48b8b21f --- /dev/null +++ b/openbb_sdk/sdk/core/tests/api/router/test_settings.py @@ -0,0 +1,33 @@ +"""Test the router settings.py module.""" +import asyncio +from unittest.mock import Mock + +from openbb_core.api.router.settings import patch_user_credentials, read_users_settings +from openbb_core.app.model.credentials import Credentials +from openbb_core.app.model.user_settings import UserSettings + + +def test_read_users_settings(): + """Test read users settings.""" + mock_user_settings = Mock() + + result = asyncio.run(read_users_settings(user_settings=mock_user_settings)) + + assert result == mock_user_settings + + +def test_patch_user_credentials(): + """Test patch user credentials.""" + credentials = Credentials(username="testuser", password="testpass") + user_settings = UserSettings(credentials=credentials) + + mock_user_service = Mock() + + result = asyncio.run( + patch_user_credentials(credentials, user_settings, mock_user_service) + ) + + assert result == user_settings + mock_user_service.user_settings_repository.update.assert_called_once_with( + user_settings + ) diff --git a/openbb_sdk/sdk/core/tests/api/router/test_system.py b/openbb_sdk/sdk/core/tests/api/router/test_system.py new file mode 100644 index 00000000000..1f916f70ab2 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/api/router/test_system.py @@ -0,0 +1,18 @@ +"""Test the router system module.""" + +import asyncio +from unittest.mock import Mock, patch + +from openbb_core.api.router.system import get_system_model +from openbb_core.app.model.system_settings import SystemSettings + + +@patch("openbb_core.api.router.system.get_system_settings") +def test_get_system_model(mock_get_system_settings): + """Test get system model.""" + mock_system_settings = Mock(spec=SystemSettings) + mock_get_system_settings.return_value = mock_system_settings + + response = asyncio.run(get_system_model(system_settings=mock_system_settings)) + + assert response == mock_system_settings From 12aee25d9a8bb88e2e7dd0612cc5b00d30cabed7 Mon Sep 17 00:00:00 2001 From: James Maslek Date: Fri, 28 Jul 2023 10:32:16 -0400 Subject: [PATCH 31/98] First action --- .github/workflows/sdkv4-core.yml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 .github/workflows/sdkv4-core.yml diff --git a/.github/workflows/sdkv4-core.yml b/.github/workflows/sdkv4-core.yml new file mode 100644 index 00000000000..1a30af2de5f --- /dev/null +++ b/.github/workflows/sdkv4-core.yml @@ -0,0 +1,25 @@ +name: My Workflow + +on: + pull_request: + branches: + - feature/openbb-sdk-v4 + + +jobs: + unit_tests: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + with: + ref: ${{ github.event.pull_request.head.ref }} + - name: Install dependencies + run: | + python -m venv .venv + source .venv/bin/activate + pip install ./openbb_sdk + pip install pytest + - name: Run tests + run: | + pytest openbb_sdk/sdk/core/tests From 37aabe14a87f266177f5f84618134874e3edf0ca Mon Sep 17 00:00:00 2001 From: James Maslek Date: Fri, 28 Jul 2023 10:42:46 -0400 Subject: [PATCH 32/98] Fix syntax --- .github/workflows/sdkv4-core.yml | 35 ++++++++++++++++---------------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/.github/workflows/sdkv4-core.yml b/.github/workflows/sdkv4-core.yml index 1a30af2de5f..1c18f5f89ca 100644 --- a/.github/workflows/sdkv4-core.yml +++ b/.github/workflows/sdkv4-core.yml @@ -1,25 +1,24 @@ -name: My Workflow +name: Test SDKV4 on: pull_request: branches: - feature/openbb-sdk-v4 - jobs: - unit_tests: - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v2 - with: - ref: ${{ github.event.pull_request.head.ref }} - - name: Install dependencies - run: | - python -m venv .venv - source .venv/bin/activate - pip install ./openbb_sdk - pip install pytest - - name: Run tests - run: | - pytest openbb_sdk/sdk/core/tests + unit_tests: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + with: + ref: ${{ github.event.pull_request.head.ref }} + - name: Install dependencies + run: | + python -m venv .venv + source .venv/bin/activate + pip install ./openbb_sdk + pip install pytest + - name: Run tests + run: | + pytest openbb_sdk/sdk/core/tests From b398959ea7cff3f72d511a7ec878d7c083779b2b Mon Sep 17 00:00:00 2001 From: James Maslek Date: Fri, 28 Jul 2023 10:51:10 -0400 Subject: [PATCH 33/98] didnt activate venv --- .github/workflows/sdkv4-core.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/sdkv4-core.yml b/.github/workflows/sdkv4-core.yml index 1c18f5f89ca..b66e2deee82 100644 --- a/.github/workflows/sdkv4-core.yml +++ b/.github/workflows/sdkv4-core.yml @@ -21,4 +21,5 @@ jobs: pip install pytest - name: Run tests run: | + source .venv/bin/activate pytest openbb_sdk/sdk/core/tests From 54e80b09427da56c40c3b5ac474ed5304ab63ac0 Mon Sep 17 00:00:00 2001 From: James Maslek Date: Fri, 28 Jul 2023 11:04:51 -0400 Subject: [PATCH 34/98] init file --- openbb_sdk/sdk/core/tests/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 openbb_sdk/sdk/core/tests/__init__.py diff --git a/openbb_sdk/sdk/core/tests/__init__.py b/openbb_sdk/sdk/core/tests/__init__.py new file mode 100644 index 00000000000..e69de29bb2d From 631308bc9bba5c81e39ea28a562ab02dcab0c09c Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Fri, 28 Jul 2023 17:15:21 +0200 Subject: [PATCH 35/98] Rename test files --- .../api/router/{test_coverage.py => test_router_coverage.py} | 0 .../tests/api/router/{test_system.py => test_router_system.py} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename openbb_sdk/sdk/core/tests/api/router/{test_coverage.py => test_router_coverage.py} (100%) rename openbb_sdk/sdk/core/tests/api/router/{test_system.py => test_router_system.py} (100%) diff --git a/openbb_sdk/sdk/core/tests/api/router/test_coverage.py b/openbb_sdk/sdk/core/tests/api/router/test_router_coverage.py similarity index 100% rename from openbb_sdk/sdk/core/tests/api/router/test_coverage.py rename to openbb_sdk/sdk/core/tests/api/router/test_router_coverage.py diff --git a/openbb_sdk/sdk/core/tests/api/router/test_system.py b/openbb_sdk/sdk/core/tests/api/router/test_router_system.py similarity index 100% rename from openbb_sdk/sdk/core/tests/api/router/test_system.py rename to openbb_sdk/sdk/core/tests/api/router/test_router_system.py From 74b1d0f038218fb950e960d7d5b867058eb5e4dc Mon Sep 17 00:00:00 2001 From: James Maslek Date: Fri, 28 Jul 2023 11:30:44 -0400 Subject: [PATCH 36/98] Change how action runs tests --- .github/workflows/sdkv4-core.yml | 5 ++--- noxfile.py | 8 ++++++++ 2 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 noxfile.py diff --git a/.github/workflows/sdkv4-core.yml b/.github/workflows/sdkv4-core.yml index b66e2deee82..8e85ccea50a 100644 --- a/.github/workflows/sdkv4-core.yml +++ b/.github/workflows/sdkv4-core.yml @@ -17,9 +17,8 @@ jobs: run: | python -m venv .venv source .venv/bin/activate - pip install ./openbb_sdk - pip install pytest + pip install nox - name: Run tests run: | source .venv/bin/activate - pytest openbb_sdk/sdk/core/tests + nox -s tests diff --git a/noxfile.py b/noxfile.py new file mode 100644 index 00000000000..9f92d0e0f6e --- /dev/null +++ b/noxfile.py @@ -0,0 +1,8 @@ +import nox + + +@nox.session(python=["3.8", "3.9", "3.10", "3.11"]) +def tests(session): + session.install("./openbb_sdk") + session.install("pytest") + session.run("pytest", "openbb_sdk/sdk/core/tests") From f76cb10c8b113d5b8953bcb0bc7ce3b01306f6f4 Mon Sep 17 00:00:00 2001 From: James Maslek Date: Fri, 28 Jul 2023 11:51:18 -0400 Subject: [PATCH 37/98] update --- .github/workflows/sdkv4-core.yml | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/.github/workflows/sdkv4-core.yml b/.github/workflows/sdkv4-core.yml index 8e85ccea50a..c4e1e44a632 100644 --- a/.github/workflows/sdkv4-core.yml +++ b/.github/workflows/sdkv4-core.yml @@ -5,20 +5,29 @@ on: branches: - feature/openbb-sdk-v4 +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} + cancel-in-progress: true + jobs: unit_tests: runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python_version: + ["3.8", "3.9", "3.10", "3.11", "3.12"] steps: - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: ${{ github.event.pull_request.head.ref }} - - name: Install dependencies - run: | - python -m venv .venv - source .venv/bin/activate - pip install nox + - name: Install Python ${{ matrix.python_version }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python_version }} + cache: "pip" + - name: Run tests run: | - source .venv/bin/activate - nox -s tests + nox -s tests --python ${{ matrix.python_version }} From ea19fb1408f96172ace806fcb9acba3017fb8759 Mon Sep 17 00:00:00 2001 From: James Maslek Date: Fri, 28 Jul 2023 11:53:07 -0400 Subject: [PATCH 38/98] missed import --- .github/workflows/sdkv4-core.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/sdkv4-core.yml b/.github/workflows/sdkv4-core.yml index c4e1e44a632..3742497149d 100644 --- a/.github/workflows/sdkv4-core.yml +++ b/.github/workflows/sdkv4-core.yml @@ -30,4 +30,5 @@ jobs: - name: Run tests run: | + pip install nox nox -s tests --python ${{ matrix.python_version }} From 399b342a8e294bc806e447b684377e526a43ce21 Mon Sep 17 00:00:00 2001 From: James Maslek Date: Fri, 28 Jul 2023 11:54:15 -0400 Subject: [PATCH 39/98] cache --- .github/workflows/sdkv4-core.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/sdkv4-core.yml b/.github/workflows/sdkv4-core.yml index 3742497149d..93b969738bc 100644 --- a/.github/workflows/sdkv4-core.yml +++ b/.github/workflows/sdkv4-core.yml @@ -26,7 +26,6 @@ jobs: uses: actions/setup-python@v4 with: python-version: ${{ matrix.python_version }} - cache: "pip" - name: Run tests run: | From 60255c054a7106b6787b88924b14e0c847494140 Mon Sep 17 00:00:00 2001 From: James Maslek Date: Fri, 28 Jul 2023 12:01:11 -0400 Subject: [PATCH 40/98] fix 3.12 --- .github/workflows/sdkv4-core.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/sdkv4-core.yml b/.github/workflows/sdkv4-core.yml index 93b969738bc..018d76f32ea 100644 --- a/.github/workflows/sdkv4-core.yml +++ b/.github/workflows/sdkv4-core.yml @@ -26,6 +26,8 @@ jobs: uses: actions/setup-python@v4 with: python-version: ${{ matrix.python_version }} + allow-pre-releases: true + cache: "pip" - name: Run tests run: | From cc19511eb1b574af803dafcfd5ff84d0c5fd6d2d Mon Sep 17 00:00:00 2001 From: James Maslek Date: Fri, 28 Jul 2023 12:02:32 -0400 Subject: [PATCH 41/98] wrong ar --- .github/workflows/sdkv4-core.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sdkv4-core.yml b/.github/workflows/sdkv4-core.yml index 018d76f32ea..6fc3e603b16 100644 --- a/.github/workflows/sdkv4-core.yml +++ b/.github/workflows/sdkv4-core.yml @@ -26,7 +26,7 @@ jobs: uses: actions/setup-python@v4 with: python-version: ${{ matrix.python_version }} - allow-pre-releases: true + allow-prereleases: true cache: "pip" - name: Run tests From ecf9e58e083930dd0f85a3bd03aa194b293807fc Mon Sep 17 00:00:00 2001 From: James Maslek Date: Fri, 28 Jul 2023 12:04:12 -0400 Subject: [PATCH 42/98] update version --- noxfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/noxfile.py b/noxfile.py index 9f92d0e0f6e..6f2fffcfc44 100644 --- a/noxfile.py +++ b/noxfile.py @@ -1,7 +1,7 @@ import nox -@nox.session(python=["3.8", "3.9", "3.10", "3.11"]) +@nox.session(python=["3.8", "3.9", "3.10", "3.11", "3.12"]) def tests(session): session.install("./openbb_sdk") session.install("pytest") From 2fe81e03d84274a9cc748030370c72b79c78993b Mon Sep 17 00:00:00 2001 From: James Maslek Date: Fri, 28 Jul 2023 12:08:02 -0400 Subject: [PATCH 43/98] <= 3.12 --- openbb_sdk/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openbb_sdk/pyproject.toml b/openbb_sdk/pyproject.toml index 15f9bdd8616..2eb2f4393ac 100644 --- a/openbb_sdk/pyproject.toml +++ b/openbb_sdk/pyproject.toml @@ -7,7 +7,7 @@ readme = "README.md" packages = [{ include = "openbb" }] [tool.poetry.dependencies] -python = ">=3.8,<3.12" +python = ">=3.8,<=3.12" openbb-provider = { path = "./sdk/provider" } openbb-core = { path = "./sdk/core" } openbb-stocks = { path = "./extensions/stocks" } From 088c9a324c73a357a0339f3a6cbcac10b85cec35 Mon Sep 17 00:00:00 2001 From: James Maslek Date: Fri, 28 Jul 2023 12:34:39 -0400 Subject: [PATCH 44/98] Pandas doesnt work with 3.12 yet --- .github/workflows/sdkv4-core.yml | 2 +- noxfile.py | 2 +- openbb_sdk/pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/sdkv4-core.yml b/.github/workflows/sdkv4-core.yml index 6fc3e603b16..31cfb32bde2 100644 --- a/.github/workflows/sdkv4-core.yml +++ b/.github/workflows/sdkv4-core.yml @@ -16,7 +16,7 @@ jobs: fail-fast: false matrix: python_version: - ["3.8", "3.9", "3.10", "3.11", "3.12"] + ["3.8", "3.9", "3.10", "3.11"] steps: - name: Checkout code uses: actions/checkout@v3 diff --git a/noxfile.py b/noxfile.py index 6f2fffcfc44..9f92d0e0f6e 100644 --- a/noxfile.py +++ b/noxfile.py @@ -1,7 +1,7 @@ import nox -@nox.session(python=["3.8", "3.9", "3.10", "3.11", "3.12"]) +@nox.session(python=["3.8", "3.9", "3.10", "3.11"]) def tests(session): session.install("./openbb_sdk") session.install("pytest") diff --git a/openbb_sdk/pyproject.toml b/openbb_sdk/pyproject.toml index 2eb2f4393ac..15f9bdd8616 100644 --- a/openbb_sdk/pyproject.toml +++ b/openbb_sdk/pyproject.toml @@ -7,7 +7,7 @@ readme = "README.md" packages = [{ include = "openbb" }] [tool.poetry.dependencies] -python = ">=3.8,<=3.12" +python = ">=3.8,<3.12" openbb-provider = { path = "./sdk/provider" } openbb-core = { path = "./sdk/core" } openbb-stocks = { path = "./extensions/stocks" } From dc30ab3d36549449178f5e85bd015434196010e4 Mon Sep 17 00:00:00 2001 From: teh_coderer Date: Fri, 28 Jul 2023 21:13:42 -0500 Subject: [PATCH 45/98] Hotfix/ locking when deploying streamlit app (#5261) * fix locking when deploying streamlit app * Update streamlit_run.py * Update streamlit_run.py --- openbb_terminal/core/plots/no_import.py | 10 +++++----- openbb_terminal/dashboards/streamlit_run.py | 7 +++++-- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/openbb_terminal/core/plots/no_import.py b/openbb_terminal/core/plots/no_import.py index eb3fa1f1029..3d9a22d084c 100644 --- a/openbb_terminal/core/plots/no_import.py +++ b/openbb_terminal/core/plots/no_import.py @@ -72,11 +72,11 @@ class DummyBackend: and get_current_system().LOGGING_SUB_APP != "sdk" ): console.print(pywry_missing) - if console.input( - "If you prefer to continue without interactive plots/tables, " - "press [green]enter[/] or [red]ctrl+c[/] to exit." - ): - dotenv.set_key(SETTINGS_ENV_FILE, "PLOT_ENABLE_PYWRY", "0") + console.print( + "\n\nContinuing with default plotly behaviour (open in browser).", + style="yellow", + ) + dotenv.set_key(SETTINGS_ENV_FILE, "PLOT_ENABLE_PYWRY", "0") current_user.preferences.USE_INTERACTIVE_DF = False set_current_user(current_user) diff --git a/openbb_terminal/dashboards/streamlit_run.py b/openbb_terminal/dashboards/streamlit_run.py index 7c14766b76d..3fe378a5884 100644 --- a/openbb_terminal/dashboards/streamlit_run.py +++ b/openbb_terminal/dashboards/streamlit_run.py @@ -5,9 +5,12 @@ from pathlib import Path import streamlit.web.bootstrap from openbb_terminal.core.config.paths import REPOSITORY_DIRECTORY -from openbb_terminal.core.plots.plotly_helper import theme +from openbb_terminal.core.session.current_system import set_system_variable +from openbb_terminal.core.session.current_user import set_preference -theme.apply_style("dark") +set_system_variable("LOGGING_SUPPRESS", True) +set_preference("CHART_STYLE", "dark") +set_preference("PLOT_ENABLE_PYWRY", "False") def main(): From cfb3045fe9dc0f295d35f89c3165e64d079299c0 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Mon, 31 Jul 2023 12:02:27 +0200 Subject: [PATCH 46/98] Add mock JWT token --- .../sdk/core/tests/app/service/test_hub_service.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/openbb_sdk/sdk/core/tests/app/service/test_hub_service.py b/openbb_sdk/sdk/core/tests/app/service/test_hub_service.py index a6bab27c696..ff3ff68ed1e 100644 --- a/openbb_sdk/sdk/core/tests/app/service/test_hub_service.py +++ b/openbb_sdk/sdk/core/tests/app/service/test_hub_service.py @@ -93,7 +93,17 @@ def test_get_session_from_sdk_token(mock_post): "primary_usage": "primary_usage", }, ) - result = HubService.get_session_from_sdk_token("token") + + mock_token = ( + "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6ImRiMjEyZDdhZj" + "c2MWI0ZTNlOGNjZGM3OWQ5Zjk4YWM5In0.eyJhY2Nlc3NfdG9rZW4iOiJ0" + "b2tlbiIsInRva2VuX3R5cGUiOiJCZWFyZXIiLCJ1dWlkIjoidXVpZCIsInV" + "zZXJuYW1lIjoidXNlcm5hbWUiLCJlbWFpbCI6ImVtYWlsIiwicHJpbWFyeV9" + "1c2FnZSI6InByaW1hcnlfdXNhZ2UifQ.FAtE8-a1a-313Zoa6dREIxGZOHaW9" + "-JLZnFzyJ6dlHBZnkjQT2tfaaefxnTdAlSmToQwxGykvuatmI7L0wztPQ" + ) + + result = HubService.get_session_from_sdk_token(mock_token) assert isinstance(result, HubSession) From 59b19b3c2326b169344921be7d4d13abb7cc52bb Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Mon, 31 Jul 2023 14:54:20 +0100 Subject: [PATCH 47/98] adding tests for logs --- .../formatters/formatter_with_exceptions.py | 4 +- .../app/logs/utils/expired_files.py | 4 +- .../test_formatter_with_exceptions.py | 305 +++++++++++++++++- .../test_path_tracking_file_handler.py | 64 ++++ .../app/logs/handlers/test_posthog_handler.py | 225 +++++++++++++ .../app/logs/utils/test_expired_files.py | 145 ++++++++- 6 files changed, 741 insertions(+), 6 deletions(-) diff --git a/openbb_sdk/sdk/core/openbb_core/app/logs/formatters/formatter_with_exceptions.py b/openbb_sdk/sdk/core/openbb_core/app/logs/formatters/formatter_with_exceptions.py index 2cd52fd4125..c67bf2ae7e6 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/logs/formatters/formatter_with_exceptions.py +++ b/openbb_sdk/sdk/core/openbb_core/app/logs/formatters/formatter_with_exceptions.py @@ -82,8 +82,8 @@ class FormatterWithExceptions(logging.Formatter): return text_mocked - @classmethod - def filter_special_tags(cls, text: str) -> str: + @staticmethod + def filter_special_tags(text: str) -> str: text_filtered = text.replace("\n", " MOCKING_BREAKLINE ") text_filtered = text_filtered.replace("'Traceback", "Traceback") diff --git a/openbb_sdk/sdk/core/openbb_core/app/logs/utils/expired_files.py b/openbb_sdk/sdk/core/openbb_core/app/logs/utils/expired_files.py index 0e4bcb0c523..4f101d23db8 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/logs/utils/expired_files.py +++ b/openbb_sdk/sdk/core/openbb_core/app/logs/utils/expired_files.py @@ -15,8 +15,8 @@ def get_timestamp_from_x_days(x: int) -> float: def get_expired_file_list(directory: Path, before_timestamp: float) -> List[Path]: - expired_files = list() - if directory.exists and directory.is_dir(): # type: ignore + expired_files = [] + if directory.is_dir(): # Check if the directory exists and is a directory for file in directory.iterdir(): if file.is_file() and file.lstat().st_mtime < before_timestamp: expired_files.append(file) diff --git a/openbb_sdk/sdk/core/tests/app/logs/formatters/test_formatter_with_exceptions.py b/openbb_sdk/sdk/core/tests/app/logs/formatters/test_formatter_with_exceptions.py index f67e3151da9..613d8e521aa 100644 --- a/openbb_sdk/sdk/core/tests/app/logs/formatters/test_formatter_with_exceptions.py +++ b/openbb_sdk/sdk/core/tests/app/logs/formatters/test_formatter_with_exceptions.py @@ -1,5 +1,308 @@ -import pytest +import logging +import os +from unittest.mock import Mock +import pytest from openbb_core.app.logs.formatters.formatter_with_exceptions import ( FormatterWithExceptions, ) + +logging_settings = Mock() +logging_settings.app_name = "test_app_name" +logging_settings.app_id = "test_app_id" +logging_settings.session_id = "test_session_id" +logging_settings.commit_hash = "test_commit_hash" +logging_settings.user_id = "test_user_id" + + +@pytest.fixture +def formatter(): + return FormatterWithExceptions(logging_settings) + + +# Test when exc_text is not empty (should return "X") +def test_level_name_with_exc_text(formatter): + record = logging.LogRecord( + name="test_logger", + level=logging.INFO, + pathname="", + lineno=0, + msg="", + args=None, + exc_info=None, + func=None, + ) + record.exc_text = "Exception occurred!" + assert formatter.calculate_level_name(record) == "X" + + +# Test when levelname is not empty (should return the first character of levelname) +def test_level_name_with_levelname(formatter): + record = logging.LogRecord( + name="test_logger", + level=logging.WARNING, + pathname="", + lineno=0, + msg="", + args=None, + exc_info=None, + func=None, + ) + record.levelname = "WARNING" + assert formatter.calculate_level_name(record) == "W" + + +# Test when func_name_override and session_id are present in the record +def test_extract_log_extra_with_override_and_session_id(formatter): + record = logging.LogRecord( + name="test_logger", + level=logging.INFO, + pathname="", + lineno=0, + msg="", + args=None, + exc_info=None, + func=None, + ) + record.func_name_override = "custom_function" + record.session_id = "1234567890" + + log_extra = formatter.extract_log_extra(record) + + assert log_extra == { + "sessionId": "1234567890", + } + + +# Test when only func_name_override is present in the record +def test_extract_log_extra_with_override(formatter): + record = logging.LogRecord( + name="test_logger", + level=logging.INFO, + pathname="", + lineno=0, + msg="", + args=None, + exc_info=None, + func=None, + ) + record.func_name_override = "custom_function" + + log_extra = formatter.extract_log_extra(record) + + assert log_extra == {} + assert record.funcName == "custom_function" + assert record.lineno == 0 + + +# Test when only session_id is present in the record +def test_extract_log_extra_with_session_id(formatter): + record = logging.LogRecord( + name="test_logger", + level=logging.INFO, + pathname="", + lineno=0, + msg="", + args=None, + exc_info=None, + func=None, + ) + record.session_id = "1234567890" + + log_extra = formatter.extract_log_extra(record) + + assert log_extra == { + "sessionId": "1234567890", + } + + +# Test when neither func_name_override nor session_id are present in the record +def test_extract_log_extra_with_no_override_or_session_id(formatter): + record = logging.LogRecord( + name="test_logger", + level=logging.INFO, + pathname="", + lineno=0, + msg="", + args=None, + exc_info=None, + func=None, + ) + + log_extra = formatter.extract_log_extra(record) + + assert log_extra == {} + + +@pytest.mark.parametrize( + "input_text, expected_output", + [ + ("Hello, this is 192.168.1.1", "Hello, this is FILTERED_IP "), + ("IP address: 10.0.0.1", "IP address: FILTERED_IP "), + ("No IPs here!", "No IPs here!"), + ("Another IP: 172.16.32.1", "Another IP: FILTERED_IP "), + ("1.2.3.4", " FILTERED_IP "), + ], +) +def test_mock_ipv4(input_text, expected_output, formatter): + assert formatter.mock_ipv4(input_text) == expected_output + + +@pytest.mark.parametrize( + "input_text, expected_output", + [ + ("Send an email to john@example.com", "Send an email to FILTERED_EMAIL "), + ("No emails here!", "No emails here!"), + ("Another email: alice@example.co.uk", "Another email: FILTERED_EMAIL "), + ("Contact us: support@example.net", "Contact us: FILTERED_EMAIL "), + ("myemail@example.com 12345", " FILTERED_EMAIL 12345"), + ], +) +def test_mock_email(input_text, expected_output, formatter): + assert formatter.mock_email(input_text) == expected_output + + +@pytest.mark.parametrize( + "input_text, expected_output", + [ + ('{"password": "secure_pass_123"}', '{"password": " FILTERED_PASSWORD "}'), + ('{"password": "p@$$w0rd!"}', '{"password": " FILTERED_PASSWORD "}'), + ('{"password": "12345"}', '{"password": " FILTERED_PASSWORD "}'), + ('{"password": "abc"}', '{"password": " FILTERED_PASSWORD "}'), + ( + '{"password": "my_password"} {"password": "test123"}', + '{"password": " FILTERED_PASSWORD "} {"password": " FILTERED_PASSWORD "}', + ), + ], +) +def test_mock_password(input_text, expected_output, formatter): + assert formatter.mock_password(input_text) == expected_output + + +@pytest.mark.parametrize( + "input_text, expected_output", + [ + ('{"FLAIR": "[python]"}', '{"FLAIR": "[ FILTERED_FLAIR ]"}'), + ('{"FLAIR": "[question]"}', '{"FLAIR": "[ FILTERED_FLAIR ]"}'), + ('{"FLAIR": "[bug]"}', '{"FLAIR": "[ FILTERED_FLAIR ]"}'), + ('{"FLAIR": "[feature]"}', '{"FLAIR": "[ FILTERED_FLAIR ]"}'), + ('{"FLAIR": "[announcement]"}', '{"FLAIR": "[ FILTERED_FLAIR ]"}'), + ('{"FLAIR": "[FILTERED_FLAIR]"}', '{"FLAIR": "[ FILTERED_FLAIR ]"}'), + ], +) +def test_mock_flair(input_text, expected_output, formatter): + assert formatter.mock_flair(input_text) == expected_output + + +@pytest.mark.parametrize( + "input_text, expected_output", + [ + ( + "This is C:\\Users\\username\\file.txt", + "This is C:\\Users\\username\\file.txt", + ), + ("No home directory here!", "No home directory here!"), + ( + f"This is {os.path.expanduser('~')}\\file.txt", + "This is MOCKING_USER_PATH\\file.txt", + ), + ( + f"Some path: {os.path.expanduser('~/subfolder')}", + "Some path: MOCKING_USER_PATH/subfolder", + ), + ], +) +def test_mock_home_directory(input_text, expected_output, formatter): + assert formatter.mock_home_directory(input_text) == expected_output + + +@pytest.mark.parametrize( + "input_text, expected_output", + [ + ( + "This is a string with a\nnewline", + "This is a string with a MOCKING_BREAKLINE newline", + ), + ("'Traceback occurred", "Traceback occurred"), + ("No newlines or 'Traceback'", "No newlines or Traceback'"), + ("'Traceback in the\nmiddle'", "Traceback in the MOCKING_BREAKLINE middle'"), + ( + "Multiple\n\nnewlines", + "Multiple MOCKING_BREAKLINE MOCKING_BREAKLINE newlines", + ), + ], +) +def test_filter_special_tags(input_text, expected_output, formatter): + assert formatter.filter_special_tags(input_text) == expected_output + + +@pytest.mark.parametrize( + "input_text, expected_output", + [ + ( + f"This is {os.path.expanduser('~')}\\file.txt", + "This is MOCKING_USER_PATH\\file.txt", + ), + ('{"FLAIR": "[announcement]"}', '{"FLAIR": "[ FILTERED_FLAIR ]"}'), + ("Another email: alice@example.co.uk", "Another email: FILTERED_EMAIL "), + ("Another IP: 172.16.32.1", "Another IP: FILTERED_IP "), + ('{"password": "secure_pass_123"}', '{"password": " FILTERED_PASSWORD "}'), + ], +) +def test_filter_piis(input_text, expected_output, formatter): + assert formatter.filter_piis(input_text) == expected_output + + +@pytest.mark.parametrize( + "input_text, expected_output", + [ + ( + f"This is {os.path.expanduser('~')}\\file.txt", + "This is MOCKING_USER_PATH\\file.txt", + ), + ('{"FLAIR": "[announcement]"}', '{"FLAIR": "[ FILTERED_FLAIR ]"}'), + ("Another email: alice@example.co.uk", "Another email: FILTERED_EMAIL "), + ("Another IP: 172.16.32.1", "Another IP: FILTERED_IP "), + ('{"password": "secure_pass_123"}', '{"password": " FILTERED_PASSWORD "}'), + ("'Traceback in the\nmiddle'", "Traceback in the MOCKING_BREAKLINE middle'"), + ], +) +def test_filter_log_line(input_text, expected_output, formatter): + assert formatter.filter_log_line(input_text) == expected_output + + +def test_formatException_invalid(): + with pytest.raises(Exception): + formatter.formatException(Exception("Big bad error")) + + +def test_format(formatter): + # Prepare the log record + log_record = logging.LogRecord( + name="test_logger", + level=logging.INFO, + pathname="/path/to/module.py", + lineno=42, + msg="This is a test log message with | symbol", + args=(), + exc_info=None, + ) + + # Set up the mock objects + formatter.calculate_level_name = Mock(return_value="INFO") + formatter.filter_log_line = Mock(return_value="Filtered log message") + + # Call the format method + formatted_log = formatter.format(log_record) + + # Assertions + expected_log = "INFO|test_app_name|test_commit_hash|test_app_id|test_session_id|test_user_id|Filtered log message" + + print(expected_log) + print(formatted_log) + + assert formatted_log == expected_log + + # Check if the mock methods were called + formatter.calculate_level_name.assert_called_once() + formatter.filter_log_line.assert_called_once() diff --git a/openbb_sdk/sdk/core/tests/app/logs/handlers/test_path_tracking_file_handler.py b/openbb_sdk/sdk/core/tests/app/logs/handlers/test_path_tracking_file_handler.py index e69de29bb2d..ea53d2e3dd5 100644 --- a/openbb_sdk/sdk/core/tests/app/logs/handlers/test_path_tracking_file_handler.py +++ b/openbb_sdk/sdk/core/tests/app/logs/handlers/test_path_tracking_file_handler.py @@ -0,0 +1,64 @@ +from pathlib import Path +from unittest.mock import MagicMock, patch + +import pytest +from openbb_core.app.logs.handlers.path_tracking_file_handler import ( + PathTrackingFileHandler, +) + + +class MockLoggingSettings: + def __init__(self, app_name, user_logs_directory, session_id, frequency): + self.app_name = app_name + self.user_logs_directory = Path(user_logs_directory) + self.session_id = session_id + self.frequency = frequency + + +logging_settings = MagicMock(spec=MockLoggingSettings) +logging_settings.app_name = "test_app_name_xpto" +logging_settings.user_logs_directory = MagicMock() +logging_settings.user_logs_directory.absolute.return_value = Path( + "/mocked/logs/directory" +) +logging_settings.session_id = "test_session_id" +logging_settings.frequency = "H" + + +@pytest.fixture +def handler(): + # patch `pathlib.Path.joinpath` to return a string containing the joined path + with patch.object(Path, "joinpath", return_value=Path("mocked_path")): + return PathTrackingFileHandler(logging_settings) + + +def test_build_log_file_path(handler): + # Define a sample LoggingSettings object with mock attributes + settings = MagicMock(spec=MockLoggingSettings) + settings.app_name = "my_app" + settings.user_logs_directory = MagicMock() + settings.user_logs_directory.absolute.return_value = Path("/mocked/logs/directory") + settings.session_id = "abc123" + + # patch `pathlib.Path.joinpath` to return a string containing the joined path + with patch.object( + Path, "joinpath", return_value=Path("mocked_path") + ) as mock_joinpath: + result_path = handler.build_log_file_path(settings) + + # Assert the result is correct + assert result_path == Path("mocked_path") + + mock_joinpath.assert_called_once_with("my_app_abc123") + + +def test_clean_expired_files(handler): + with patch( + "openbb_core.app.logs.handlers.path_tracking_file_handler.get_expired_file_list" + ) as mock_get_expired_file_list, patch( + "openbb_core.app.logs.handlers.path_tracking_file_handler.remove_file_list" + ) as mock_remove_file_list: + handler.clean_expired_files(123) + + assert mock_get_expired_file_list.call_count == 3 + assert mock_remove_file_list.call_count == 3 diff --git a/openbb_sdk/sdk/core/tests/app/logs/handlers/test_posthog_handler.py b/openbb_sdk/sdk/core/tests/app/logs/handlers/test_posthog_handler.py index e69de29bb2d..3d29a26417a 100644 --- a/openbb_sdk/sdk/core/tests/app/logs/handlers/test_posthog_handler.py +++ b/openbb_sdk/sdk/core/tests/app/logs/handlers/test_posthog_handler.py @@ -0,0 +1,225 @@ +from pathlib import Path +from unittest.mock import MagicMock, patch + +import pytest +from openbb_core.app.logs.handlers.posthog_handler import ( + PosthogHandler, +) +import logging + + +class MockLoggingSettings: + def __init__( + self, + app_name, + user_logs_directory, + session_id, + frequency, + appid, + commit_hash, + platform, + python_version, + terminal_version, + branch, + userid, + ): + self.app_name = app_name + self.user_logs_directory = Path(user_logs_directory) + self.session_id = session_id + self.frequency = frequency + self.app_id = appid + self.commit_hash = commit_hash + self.platform = platform + self.python_version = python_version + self.terminal_version = terminal_version + self.branch = branch + self.user_id = userid + + +logging_settings = MagicMock(spec=MockLoggingSettings) +logging_settings.app_name = "TestApp" +logging_settings.user_logs_directory = MagicMock() +logging_settings.user_logs_directory.absolute.return_value = Path( + "/mocked/logs/directory" +) +logging_settings.session_id = "session123" +logging_settings.frequency = "H" +logging_settings.app_id = "test123" +logging_settings.commit_hash = "commit123" +logging_settings.platform = "Windows" +logging_settings.python_version = "3.9" +logging_settings.terminal_version = "1.2.3" +logging_settings.branch = "main" +logging_settings.user_id = "user123" + + +@pytest.fixture +def handler(): + return PosthogHandler(logging_settings) + + +def test_emit_calls_send(mocker, handler): + # Arrange + record = logging.LogRecord( + name="test_logger", + level=logging.INFO, + pathname="test.py", + lineno=42, + msg="Test message", + args=None, + exc_info=None, + ) + + # Mock the send method + handler.send = mocker.MagicMock() + + # Act + handler.emit(record) + + # Assert + handler.send.assert_called_once_with(record=record) + + +def test_emit_calls_handleError_when_send_raises_exception(mocker, handler): + # Arrange + record = logging.LogRecord( + name="test_logger", + level=logging.ERROR, + pathname="test.py", + lineno=42, + msg="Test error message", + args=None, + exc_info=None, + ) + + # Mock the send method to raise an exception + handler.send = mocker.MagicMock(side_effect=Exception) + + # Mock the handleError method + handler.handleError = mocker.MagicMock() + + # Act + handler.emit(record) + + # Assert + handler.send.assert_called_once_with(record=record) + handler.handleError.assert_called_once_with(record) + + +def test_emit_calls_handleError_when_send_raises_exception_of_specific_type( + mocker, handler +): + # Arrange + record = logging.LogRecord( + name="test_logger", + level=logging.ERROR, + pathname="test.py", + lineno=42, + msg="Test error message", + args=None, + exc_info=None, + ) + + # Mock the send method to raise an exception of a specific type + handler.send = mocker.MagicMock(side_effect=ValueError) + + # Mock the handleError method + handler.handleError = mocker.MagicMock() + + # Act + handler.emit(record) + + # Assert + handler.send.assert_called_once_with(record=record) + handler.handleError.assert_called_once_with(record) + + +def test_emit_calls_handleError_when_send_raises_exception_of_another_type( + mocker, handler +): + # Arrange + record = logging.LogRecord( + name="test_logger", + level=logging.ERROR, + pathname="test.py", + lineno=42, + msg="Test error message", + args=None, + exc_info=None, + ) + + # Mock the send method to raise an exception of another type + handler.send = mocker.MagicMock(side_effect=TypeError) + + # Mock the handleError method + handler.handleError = mocker.MagicMock() + + # Act + handler.emit(record) + + # Assert + handler.send.assert_called_once_with(record=record) + handler.handleError.assert_called_once_with(record) + + +@pytest.mark.parametrize( + "log_info, expected_dict", + [ + ( + 'STARTUP: {"status": "success"}', + {"STARTUP": {"status": "success"}}, + ), + ( + '{"INPUT": {"something_something":"something_something"}}', + { + "SDK": {"INPUT": {"something_something": "something_something"}}, + }, + ), + ( + 'CMD: {"path": "/stocks/", "known_cmd": "load", "other_args": "aapl", "input": "load aapl"}', + { + "CMD": { + "path": "/stocks/", + "known_cmd": "load", + "other_args": "aapl", + "input": "load aapl", + } + }, + ), + ], +) +def test_log_to_dict(handler, log_info, expected_dict): + # Act + result = handler.log_to_dict(log_info) + + # Assert + assert result == expected_dict + + +@pytest.mark.parametrize( + "record, expected_extra", + [ + ( + logging.LogRecord( + "name", logging.INFO, "pathname", 42, "message", (), None, None + ), + { + "appName": "TestApp", + "appId": "test123", + "sessionId": "session123", + "commitHash": "commit123", + "platform": "Windows", + "pythonVersion": "3.9", + "terminalVersion": "1.2.3", + "branch": "main", + "userId": "user123", + }, + ), + ], +) +def test_extract_log_extra(handler, record, expected_extra): + # Act + result = handler.extract_log_extra(record) + + # Assert + assert result == expected_extra diff --git a/openbb_sdk/sdk/core/tests/app/logs/utils/test_expired_files.py b/openbb_sdk/sdk/core/tests/app/logs/utils/test_expired_files.py index 6a57a55ee93..77ba2742dbd 100644 --- a/openbb_sdk/sdk/core/tests/app/logs/utils/test_expired_files.py +++ b/openbb_sdk/sdk/core/tests/app/logs/utils/test_expired_files.py @@ -1,6 +1,149 @@ -from openbb_core.app.logs.utils.expired_files import get_timestamp_from_x_days +import os +import tempfile +from pathlib import Path +from time import time + +import pytest +from openbb_core.app.logs.utils.expired_files import ( + get_expired_file_list, + get_timestamp_from_x_days, + remove_file_list, +) + +from unittest.mock import MagicMock + + +@pytest.fixture +def temp_test_files(): + with tempfile.TemporaryDirectory() as temp_dir: + temp_files = [ + Path(temp_dir) / "file1.txt", + Path(temp_dir) / "file2.txt", + Path(temp_dir) / "file3.txt", + ] + + # Create some test files + for file_path in temp_files: + file_path.touch() + + yield temp_dir, temp_files def test_get_timestamp_from_x_days(): result = get_timestamp_from_x_days(0) assert isinstance(result, float) + + +# Test case when all files are expired +def test_all_files_expired(temp_test_files): + temp_dir, temp_files = temp_test_files + before_timestamp = time() + 3 * 86400 # timestmap 3 days from now + expired_files = get_expired_file_list(Path(temp_dir), before_timestamp) + assert set(expired_files) == set(temp_files) + + +# Test case when no files are expired +def test_no_files_expired(temp_test_files): + temp_dir, _ = temp_test_files + before_timestamp = 0 + expired_files = get_expired_file_list(Path(temp_dir), before_timestamp) + assert expired_files == [] + + +# Test case when some files are expired and some are not +def test_some_files_expired(temp_test_files): + temp_dir, _ = temp_test_files + + # add temp file to temp_dir with timestamp in the future + temp_file = Path(temp_dir) / "file4.txt" + temp_file.touch() + time_in_future = time() + 4 * 86400 # timestmap 4 days from now + os.utime(temp_file, times=(time_in_future, time_in_future)) + + before_timestamp = time() + 3 * 86400 # timestmap 3 days from now + expired_files = get_expired_file_list(Path(temp_dir), before_timestamp) + assert len(expired_files) == 3 + + # assert number of files in temp_dir is 4 + assert len(list(Path(temp_dir).iterdir())) == 4 + + +# Test case when the directory does not exist +def test_directory_not_exists(): + directory = Path("/path/that/does/not/exist") + before_timestamp = time() + expired_files = get_expired_file_list(directory, before_timestamp) + assert expired_files == [] + + +# Test case when the directory is not a directory +def test_directory_not_dir(temp_test_files): + _, temp_files = temp_test_files + before_timestamp = time() + expired_files = get_expired_file_list(temp_files[0], before_timestamp) + assert expired_files == [] + + +@pytest.fixture +def mock_path(): + # Create a MagicMock for the Path class to represent a file path + return MagicMock() + + +def test_remove_file_list_no_files(mock_path, mocker): + # Arrange + # Let's assume the file list is empty, meaning there are no files to remove + file_list = [] + + # Act + remove_file_list(file_list) + + # Assert + # No interaction with the filesystem should occur + assert not mock_path.unlink.called + + +def test_remove_file_list_remove_files_successfully(mock_path, mocker): + # Arrange + # Let's assume we have three files in the file list + file_list = [mock_path, mock_path, mock_path] + + # Mock the unlink method to avoid actual filesystem interaction + mocker.patch.object(mock_path, "unlink") + + # Act + remove_file_list(file_list) + + # Assert + # unlink should have been called three times since there are three files in the list + assert mock_path.unlink.call_count == 3 + + +def test_remove_file_list_ignore_permission_error(mock_path, mocker): + # Arrange + # Let's assume we have three files in the file list + file_list = [mock_path, mock_path, mock_path] + + # Mock the unlink method to raise a PermissionError + mocker.patch.object(mock_path, "unlink", side_effect=PermissionError) + + # Act + remove_file_list(file_list) + + # Assert + # unlink should have been called three times since there are three files in the list + assert mock_path.unlink.call_count == 3 + + +def test_remove_file_list_other_exception(mock_path, mocker): + # Arrange + # Let's assume we have three files in the file list + file_list = [mock_path, mock_path, mock_path] + + # Mock the unlink method to raise an exception other than PermissionError + mocker.patch.object(mock_path, "unlink", side_effect=OSError) + + # Act & Assert + # The exception should be raised since it is not suppressed by the contextlib + with pytest.raises(OSError): + remove_file_list(file_list) From 89dba242bb1c30d99bd9c5c8e082cba66651516d Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Mon, 31 Jul 2023 14:57:42 +0100 Subject: [PATCH 48/98] typo --- .../sdk/core/tests/app/logs/utils/test_expired_files.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openbb_sdk/sdk/core/tests/app/logs/utils/test_expired_files.py b/openbb_sdk/sdk/core/tests/app/logs/utils/test_expired_files.py index 77ba2742dbd..da4be842997 100644 --- a/openbb_sdk/sdk/core/tests/app/logs/utils/test_expired_files.py +++ b/openbb_sdk/sdk/core/tests/app/logs/utils/test_expired_files.py @@ -37,7 +37,7 @@ def test_get_timestamp_from_x_days(): # Test case when all files are expired def test_all_files_expired(temp_test_files): temp_dir, temp_files = temp_test_files - before_timestamp = time() + 3 * 86400 # timestmap 3 days from now + before_timestamp = time() + 3 * 86400 # timestamp 3 days from now expired_files = get_expired_file_list(Path(temp_dir), before_timestamp) assert set(expired_files) == set(temp_files) @@ -57,10 +57,10 @@ def test_some_files_expired(temp_test_files): # add temp file to temp_dir with timestamp in the future temp_file = Path(temp_dir) / "file4.txt" temp_file.touch() - time_in_future = time() + 4 * 86400 # timestmap 4 days from now + time_in_future = time() + 4 * 86400 # timestamp 4 days from now os.utime(temp_file, times=(time_in_future, time_in_future)) - before_timestamp = time() + 3 * 86400 # timestmap 3 days from now + before_timestamp = time() + 3 * 86400 # timestamp 3 days from now expired_files = get_expired_file_list(Path(temp_dir), before_timestamp) assert len(expired_files) == 3 From a2d7b9f33c7a34057e8a2a298cb40a7f8b24fdf1 Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Mon, 31 Jul 2023 14:58:26 +0100 Subject: [PATCH 49/98] ruff --- .../sdk/core/tests/app/logs/handlers/test_posthog_handler.py | 4 ++-- .../sdk/core/tests/app/logs/utils/test_expired_files.py | 3 +-- openbb_sdk/sdk/core/tests/app/logs/utils/test_utils.py | 5 ++--- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/openbb_sdk/sdk/core/tests/app/logs/handlers/test_posthog_handler.py b/openbb_sdk/sdk/core/tests/app/logs/handlers/test_posthog_handler.py index 3d29a26417a..704c44b803d 100644 --- a/openbb_sdk/sdk/core/tests/app/logs/handlers/test_posthog_handler.py +++ b/openbb_sdk/sdk/core/tests/app/logs/handlers/test_posthog_handler.py @@ -1,11 +1,11 @@ +import logging from pathlib import Path -from unittest.mock import MagicMock, patch +from unittest.mock import MagicMock import pytest from openbb_core.app.logs.handlers.posthog_handler import ( PosthogHandler, ) -import logging class MockLoggingSettings: diff --git a/openbb_sdk/sdk/core/tests/app/logs/utils/test_expired_files.py b/openbb_sdk/sdk/core/tests/app/logs/utils/test_expired_files.py index da4be842997..4be38a6892d 100644 --- a/openbb_sdk/sdk/core/tests/app/logs/utils/test_expired_files.py +++ b/openbb_sdk/sdk/core/tests/app/logs/utils/test_expired_files.py @@ -2,6 +2,7 @@ import os import tempfile from pathlib import Path from time import time +from unittest.mock import MagicMock import pytest from openbb_core.app.logs.utils.expired_files import ( @@ -10,8 +11,6 @@ from openbb_core.app.logs.utils.expired_files import ( remove_file_list, ) -from unittest.mock import MagicMock - @pytest.fixture def temp_test_files(): diff --git a/openbb_sdk/sdk/core/tests/app/logs/utils/test_utils.py b/openbb_sdk/sdk/core/tests/app/logs/utils/test_utils.py index cf563c48284..f3715abc434 100644 --- a/openbb_sdk/sdk/core/tests/app/logs/utils/test_utils.py +++ b/openbb_sdk/sdk/core/tests/app/logs/utils/test_utils.py @@ -1,10 +1,9 @@ -import pytest import uuid from pathlib import Path - from unittest.mock import patch -from openbb_core.app.logs.utils.utils import get_session_id, get_app_id, get_log_dir +import pytest +from openbb_core.app.logs.utils.utils import get_app_id, get_log_dir, get_session_id ## get_session_id From d212a8e2704aa9756d42d0deb53b5d5676b6352d Mon Sep 17 00:00:00 2001 From: Danglewood <85772166+deeleeramone@users.noreply.github.com> Date: Mon, 31 Jul 2023 09:05:22 -0700 Subject: [PATCH 50/98] hotfix/gdp-units - better GDP units (#5262) * better GDP units * mypy * remove not needed dict * test_oecd_view.py * test_oecd_model.py --- openbb_terminal/economy/economy_controller.py | 6 ++--- openbb_terminal/economy/oecd_model.py | 21 ++++++++++------- openbb_terminal/economy/oecd_view.py | 23 +++++++++++-------- .../test_oecd_model/test_get_gdp.yaml | 8 +++---- .../csv/test_oecd_model/test_get_gdp.csv | 4 ++-- .../economy/test_economy_controller.py | 2 +- .../economy/test_oecd_model.py | 4 ++-- .../openbb_terminal/economy/test_oecd_view.py | 5 +++- 8 files changed, 42 insertions(+), 31 deletions(-) diff --git a/openbb_terminal/economy/economy_controller.py b/openbb_terminal/economy/economy_controller.py index 9c75d92e09f..d47c4482526 100644 --- a/openbb_terminal/economy/economy_controller.py +++ b/openbb_terminal/economy/economy_controller.py @@ -596,9 +596,9 @@ class EconomyController(BaseController): "--units", type=str, dest="units", - help="Use either USD_CAP (US dollars per capita) or MLN_USD (millions of US dollars)", - choices=["USD_CAP", "MLN_USD"], - default="USD_CAP", + help="Use either USD or USD_CAP (USD Per Capita)", + choices=["USD", "USD_CAP"], + default="USD", ) parser.add_argument( diff --git a/openbb_terminal/economy/oecd_model.py b/openbb_terminal/economy/oecd_model.py index 2c315dfaf07..bc8d7ad4739 100644 --- a/openbb_terminal/economy/oecd_model.py +++ b/openbb_terminal/economy/oecd_model.py @@ -473,8 +473,8 @@ def no_data_message(error: str): @log_start_end(log=logger) def get_gdp( - countries: Optional[List[str]], - units: str = "USD_CAP", + countries: Optional[str] = "united_states", + units: str = "USD", start_date="", end_date="", ) -> pd.DataFrame: @@ -496,7 +496,7 @@ def get_gdp( countries: list List of countries to get data for units: str - Units to get data in. Either 'USD_CAP' or 'MLN_USD'. + Units to get data in. Either 'USD' or 'USD_CAP'. Default is US dollars per capita. start_date: str Start date of data, in YYYY-MM-DD format @@ -518,17 +518,21 @@ def get_gdp( if isinstance(end_date, datetime): end_date = end_date.date() - if units not in ["USD_CAP", "MLN_USD"]: - return console.print( - "Use either USD_CAP (US dollars per capita) " - "or MLN_USD (millions of US dollars) for units" + units_dict = {"USD": "MLN_USD", "USD_CAP": "USD_CAP"} + + if units not in units_dict: + console.print( + "Invalid choice, choices are either USD or USD_CAP. Defaulting to USD." ) + units = "USD" + + countries = [countries] if isinstance(countries, str) else countries # type: ignore[assignment] df = pd.DataFrame() try: df = pd.read_csv( - f"https://stats.oecd.org/sdmx-json/data/DP_LIVE/.GDP.TOT.{units}.A/OECD?contentType=csv&detail=code" + f"https://stats.oecd.org/sdmx-json/data/DP_LIVE/.GDP.TOT.{units_dict[units]}.A/OECD?contentType=csv&detail=code" f"&separator=comma&csv-lang=en&startPeriod={start_date}&endPeriod={end_date}", index_col=5, ) @@ -552,6 +556,7 @@ def get_gdp( result.index = pd.to_datetime(result.index, format="%Y") result.sort_index(inplace=True) + result = result * 1000000 if units == "USD" else result return result diff --git a/openbb_terminal/economy/oecd_view.py b/openbb_terminal/economy/oecd_view.py index 79c5187aa22..a7f3cc6e5b1 100644 --- a/openbb_terminal/economy/oecd_view.py +++ b/openbb_terminal/economy/oecd_view.py @@ -21,19 +21,19 @@ YAXIS_TITLES = { "AGRWTH": "Annual Growth Rate (%)", "IDX": "Index (Base = 2015)", "IDX2015": "Index (Base = 2015)", - "MLN_USD": "Millions of US Dollars", + "USD": "Nominal Value in USD", "PC_CHGPY": "Same Quarter of the Previous Year (% Change)", "PC_CHGPP": "Previous Quarter (% Change)", "PC_GDP": "Percentage of GDP (%)", "THND_USD_CAP": "Thousands of USD per Capita", - "USD_CAP": "US Dollars per Capita", + "USD_CAP": "USD per Capita", } @log_start_end(log=logger) def plot_gdp( - countries: Optional[List[str]], - units: str = "USD_CAP", + countries: Optional[str] = "united_states", + units: str = "USD", start_date: str = "", end_date: str = "", raw: bool = False, @@ -59,7 +59,7 @@ def plot_gdp( countries: list List of countries to get data for units: str - Units to get data in. Either 'USD_CAP' or 'MLN_USD'. + Units to get data in. Either 'USD' or 'USD_CAP'. Default is US dollars per capita. start_date: str Start date of data, in YYYY-MM-DD format @@ -79,11 +79,13 @@ def plot_gdp( Union[OpenBBFigure, None] OpenBBFigure object if external_axes is True, else None (opens plot in a window) """ - if units not in ["USD_CAP", "MLN_USD"]: - return console.print( - "Use either USD_CAP (US dollars per capita) " - "or MLN_USD (millions of US dollars) for units" + countries = [countries] if isinstance(countries, str) else countries # type: ignore[assignment] + + if units not in ["USD", "USD_CAP"]: + console.print( + "Invalid choice, choices are either USD or USD_CAP. Defaulting to USD." ) + units = "USD" df = oecd_model.get_gdp(countries, units, start_date, end_date) @@ -102,7 +104,8 @@ def plot_gdp( showlegend=True, ) - title = "Nominal Gross Domestic Product (GDP)" + title = "Nominal Gross Domestic Product (USD)" + title = title + " Per Capita" if units == "USD_CAP" else title fig.set_title(title) if raw: diff --git a/tests/openbb_terminal/economy/cassettes/test_oecd_model/test_get_gdp.yaml b/tests/openbb_terminal/economy/cassettes/test_oecd_model/test_get_gdp.yaml index 9db6e834e45..2079d460a20 100644 --- a/tests/openbb_terminal/economy/cassettes/test_oecd_model/test_get_gdp.yaml +++ b/tests/openbb_terminal/economy/cassettes/test_oecd_model/test_get_gdp.yaml @@ -9,11 +9,11 @@ interactions: User-Agent: - Python-urllib/3.10 method: GET - uri: https://stats.oecd.org/sdmx-json/data/DP_LIVE/.GDP.TOT.USD_CAP.A/OECD?contentType=csv&detail=code&separator=comma&csv-lang=en&startPeriod=2020-01-01&endPeriod=2022-01-31 + uri: https://stats.oecd.org/sdmx-json/data/DP_LIVE/.GDP.TOT.MLN_USD.A/OECD?contentType=csv&detail=code&separator=comma&csv-lang=en&startPeriod=2020-01-01&endPeriod=2022-01-31 response: body: string: "\uFEFF\"LOCATION\",\"INDICATOR\",\"SUBJECT\",\"MEASURE\",\"FREQUENCY\",\"TIME\",\"Value\",\"Flag - Codes\"\r\n\"AUS\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",55690.9186,\r\n\"AUS\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",61977.196179,\r\n\"AUT\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",57253.300563,\r\n\"AUT\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",59976.264665,\r\n\"BEL\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",54539.032525,\"P\"\r\n\"BEL\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",58806.119249,\"P\"\r\n\"CAN\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",47265.698235,\r\n\"CAN\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",53101.315002,\r\n\"CZE\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",42813.74134,\r\n\"CZE\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",44801.666875,\r\n\"DNK\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",60840.940164,\r\n\"DNK\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",64897.769113,\r\n\"FIN\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",52289.303157,\r\n\"FIN\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",54687.859802,\r\n\"FRA\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",47823.919578,\r\n\"FRA\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",50998.933198,\"P\"\r\n\"DEU\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",56476.934309,\"P\"\r\n\"DEU\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",58784.138861,\"P\"\r\n\"GRC\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",28413.784684,\"P\"\r\n\"GRC\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",31289.247761,\"P\"\r\n\"HUN\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",34156.840044,\r\n\"HUN\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",36677.803167,\"P\"\r\n\"ISL\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",54649.872164,\r\n\"ISL\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",58297.114413,\r\n\"IRL\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",94028.901163,\r\n\"IRL\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",106852.122229,\r\n\"ITA\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",43140.246576,\r\n\"ITA\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",46674.614118,\r\n\"JPN\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",41770.933602,\r\n\"JPN\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",42782.469082,\r\n\"KOR\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",44698.282816,\r\n\"KOR\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",46888.679035,\"P\"\r\n\"LUX\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",119871.429414,\r\n\"LUX\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",131277.948732,\"P\"\r\n\"MEX\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",18466.909979,\"P\"\r\n\"MEX\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",19445.00585,\"P\"\r\n\"NLD\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",59815.501543,\"P\"\r\n\"NLD\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",63418.747204,\"P\"\r\n\"NZL\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",45414.702452,\r\n\"NZL\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",47045.373087,\"E\"\r\n\"NOR\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",65129.643836,\r\n\"NOR\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",81850.933065,\r\n\"POL\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",34893.459765,\r\n\"POL\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",37710.71133,\r\n\"PRT\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",34952.243057,\r\n\"PRT\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",36760.996583,\"P\"\r\n\"SVK\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",32898.852987,\r\n\"SVK\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",33941.41438,\r\n\"ESP\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",37992.368883,\"P\"\r\n\"ESP\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",40724.034713,\"P\"\r\n\"SWE\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",56135.141361,\r\n\"SWE\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",60111.612638,\r\n\"CHE\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",70804.014012,\r\n\"CHE\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",75950.570423,\r\n\"TUR\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",27971.203588,\r\n\"TUR\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",30671.746024,\r\n\"GBR\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",45867.757803,\r\n\"GBR\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",49765.080563,\r\n\"USA\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",63480.861222,\r\n\"USA\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",70181.12175,\r\n\"CHL\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",24606.968439,\r\n\"CHL\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",28105.05092,\r\n\"CHN\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",17176.865661,\r\n\"CHN\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",19334.953602,\r\n\"COL\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",15650.441829,\"P\"\r\n\"COL\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",17436.951542,\"E\"\r\n\"EST\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",39456.812096,\r\n\"EST\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",43494.06995,\r\n\"ISR\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",40223.17989,\r\n\"ISR\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",44060.518619,\r\n\"RUS\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",29819.046969,\"E\"\r\n\"SVN\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",40860.470781,\r\n\"SVN\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",43970.371468,\r\n\"ZAF\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",12293.489021,\r\n\"OECD\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",45359.343025,\"P\"\r\n\"OECD\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",49021.954326,\"E\"\r\n\"OECDE\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",44618.19283,\"P\"\r\n\"OECDE\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",47872.813415,\"P\"\r\n\"LVA\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",33008.225642,\r\n\"LVA\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",35037.056459,\r\n\"LTU\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",40124.47344,\r\n\"LTU\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",43688.013736,\r\n\"SAU\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",46378.343249,\r\n\"EA19\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",48238.265758,\r\n\"EA19\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",51333.028282,\r\n\"ARG\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",20769.015441,\r\n\"ARG\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",23627.366959,\r\n\"CRI\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",21763.124576,\r\n\"CRI\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",22700.254928,\"E\"\r\n\"BGR\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",25167.305528,\r\n\"BGR\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",26793.309833,\"P\"\r\n\"HRV\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",29690.20613,\r\n\"HRV\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",34022.550299,\"P\"\r\n\"CYP\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",40897.780537,\"P\"\r\n\"CYP\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",43317.904519,\"P\"\r\n\"MLT\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",44509.304787,\r\n\"MLT\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",48726.138109,\r\n\"ROU\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",33080.128126,\"P\"\r\n\"ROU\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",35946.765464,\"P\"\r\n\"ZMB\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",3358.004891,\r\n\"HKG\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",58988.697181,\"E\"\r\n\"HKG\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",66159.314319,\"E\"\r\n\"MDG\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",1540.394877,\"E\"\r\n\"MAR\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",8051.435771,\"E\"\r\n\"MAR\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",9073.558801,\"E\"\r\n\"SGP\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",98148.67364,\r\n\"EU27_2020\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",45843.543522,\r\n\"EU27_2020\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",48924.776134,\r\n\"ALB\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",14033.967211,\"P\"\r\n\"SRB\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",19547.72567,\r\n\"SRB\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2021\",21588.39529,\"P\"\r\n\"GEO\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",14731.202573,\r\n\"CMR\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",3867.183996,\r\n\"SEN\",\"GDP\",\"TOT\",\"USD_CAP\",\"A\",\"2020\",3513.149951,\r\n" + Codes\"\r\n\"AUS\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",1430866.404,\r\n\"AUS\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",1595112.956,\r\n\"AUT\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",510568.008,\r\n\"AUT\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",537014.574,\r\n\"BEL\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",629660.776,\"P\"\r\n\"BEL\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",682137.395,\"P\"\r\n\"CAN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",1794940.001,\r\n\"CAN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",2026899.115,\r\n\"CZE\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",458157.819,\r\n\"CZE\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",479378.76,\r\n\"DNK\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",354277.793,\r\n\"DNK\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",387053.183,\r\n\"FIN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",289224.32,\r\n\"FIN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",303523.797,\r\n\"FRA\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",3252531.255,\r\n\"FRA\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",3479874.481,\"P\"\r\n\"DEU\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",4697130.976,\"P\"\r\n\"DEU\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",4891842.639,\"P\"\r\n\"GRC\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",304016.729,\"P\"\r\n\"GRC\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",333014.632,\"P\"\r\n\"HUN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",333161.834,\r\n\"HUN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",357064.87,\"P\"\r\n\"ISL\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",19900.372,\r\n\"ISL\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",21678.937,\r\n\"IRL\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",471371.126,\r\n\"IRL\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",546184.137,\r\n\"ITA\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",2564455.924,\r\n\"ITA\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",2760717.633,\r\n\"JPN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",5263052.866,\r\n\"JPN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",5383426.681,\r\n\"KOR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",2316806.899,\r\n\"KOR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",2425556.12,\"P\"\r\n\"LUX\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",75656.711,\r\n\"LUX\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",84175.446,\r\n\"MEX\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",2333740.769,\"P\"\r\n\"MEX\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",2480684.356,\"P\"\r\n\"NLD\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",1043402.526,\r\n\"NLD\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",1130684.908,\r\n\"NZL\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",231699.786,\r\n\"NZL\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",245363.98,\r\n\"NOR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",350366.117,\r\n\"NOR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",442761.845,\r\n\"POL\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",1338432.734,\r\n\"POL\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",1443514.646,\r\n\"PRT\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",359941.428,\r\n\"PRT\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",378292.824,\"P\"\r\n\"SVK\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",179715.845,\r\n\"SVK\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",188085.979,\r\n\"ESP\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",1799328.046,\"P\"\r\n\"ESP\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",1928019.184,\"P\"\r\n\"SWE\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",581247.942,\r\n\"SWE\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",629080.783,\r\n\"CHE\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",611675.806,\r\n\"CHE\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",661282.472,\r\n\"TUR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",2332603.593,\r\n\"TUR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",2581588.441,\r\n\"GBR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",3077151.591,\r\n\"GBR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",3355086.227,\r\n\"USA\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",21060474,\r\n\"USA\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",23315081,\r\n\"CHL\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",481373.694,\r\n\"CHL\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",552379.782,\r\n\"CHN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",24255795.538,\r\n\"CHN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",27445503.77,\r\n\"COL\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",769209.548,\"P\"\r\n\"COL\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",881190.92,\"P\"\r\n\"EST\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",52438.777,\r\n\"EST\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",57864.708,\r\n\"IND\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",9005119.325,\r\n\"IDN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",3303238.766,\r\n\"IDN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",3567505.282,\r\n\"ISR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",370624.727,\r\n\"ISR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",412651.502,\r\n\"RUS\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",4367291.715,\r\n\"SVN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",85929.679,\r\n\"SVN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",92701.12,\r\n\"ZAF\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",796453.237,\r\n\"ZAF\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",870861.683,\r\n\"OECD\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",62111314.203,\"P\"\r\n\"OECD\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",67376333.253,\"E\"\r\n\"OECDE\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",25947386.546,\"P\"\r\n\"OECDE\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",27941283.242,\"P\"\r\n\"LVA\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",62750.162,\r\n\"LVA\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",65991.926,\r\n\"BRA\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",3213097.741,\r\n\"LTU\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",112288.658,\r\n\"LTU\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",122667.694,\r\n\"SAU\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",1628533.458,\r\n\"SAU\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",1751177.858,\r\n\"EA19\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",16561861.2,\r\n\"EA19\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",17651090.34,\r\n\"ARG\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",942170.824,\r\n\"ARG\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",1083361.763,\r\n\"CRI\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",111138.964,\r\n\"CRI\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",116703.599,\"E\"\r\n\"BGR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",175386.724,\r\n\"BGR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",193304.902,\r\n\"HRV\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",120226.026,\r\n\"HRV\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",134736.734,\"P\"\r\n\"CYP\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",36948.39,\r\n\"CYP\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",39970.121,\r\n\"MLT\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",23149.335,\r\n\"MLT\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",25907.066,\r\n\"ROU\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",642164.611,\r\n\"ROU\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",693440.505,\"P\"\r\n\"MKD\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",35902.666,\r\n\"MKD\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",37872.917,\"P\"\r\n\"ZMB\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",63559.36,\r\n\"HKG\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",441000.955,\r\n\"HKG\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",488461.722,\r\n\"MDG\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",43227.888,\"E\"\r\n\"MAR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",292347.633,\r\n\"MAR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",332718.328,\r\n\"SGP\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",558073.358,\r\n\"EU27_2020\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",20565206.685,\r\n\"EU27_2020\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",21972441.797,\r\n\"ALB\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",39826.28,\"P\"\r\n\"SRB\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",134862.222,\r\n\"SRB\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2021\",147874.29,\"P\"\r\n\"GEO\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",54840.076,\r\n\"CMR\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",102499.678,\r\n\"SEN\",\"GDP\",\"TOT\",\"MLN_USD\",\"A\",\"2020\",58676.63,\r\n" headers: Access-Control-Allow-Headers: - Content-Type @@ -26,11 +26,11 @@ interactions: Connection: - close Content-Disposition: - - attachment;filename=DP_LIVE_20032023141550584.csv + - attachment;filename=DP_LIVE_29072023210803524.csv Content-Type: - text/csv Date: - - Mon, 20 Mar 2023 13:15:50 GMT + - Sat, 29 Jul 2023 19:08:03 GMT Transfer-Encoding: - chunked status: diff --git a/tests/openbb_terminal/economy/csv/test_oecd_model/test_get_gdp.csv b/tests/openbb_terminal/economy/csv/test_oecd_model/test_get_gdp.csv index 1cc65f4b2af..9782b0b3159 100644 --- a/tests/openbb_terminal/economy/csv/test_oecd_model/test_get_gdp.csv +++ b/tests/openbb_terminal/economy/csv/test_oecd_model/test_get_gdp.csv @@ -1,3 +1,3 @@ TIME,united_states,canada -2020-01-01,63480.861222,47265.698235 -2021-01-01,70181.12175,53101.315002 +2020-01-01,21060474000000.0,1794940001000.0 +2021-01-01,23315081000000.0,2026899115000.0 diff --git a/tests/openbb_terminal/economy/test_economy_controller.py b/tests/openbb_terminal/economy/test_economy_controller.py index ad74d47977d..f6f985a0c40 100644 --- a/tests/openbb_terminal/economy/test_economy_controller.py +++ b/tests/openbb_terminal/economy/test_economy_controller.py @@ -609,7 +609,7 @@ def test_call_func_expect_queue(expected_queue, func, queue): countries=["united states"], start_date=datetime.datetime(2021, 1, 1, 0, 0), end_date=datetime.datetime(2023, 1, 1, 0, 0), - units="USD_CAP", + units="USD", raw=False, export="csv", sheet_name=None, diff --git a/tests/openbb_terminal/economy/test_oecd_model.py b/tests/openbb_terminal/economy/test_oecd_model.py index fa3f7f90351..816d55c9a81 100644 --- a/tests/openbb_terminal/economy/test_oecd_model.py +++ b/tests/openbb_terminal/economy/test_oecd_model.py @@ -11,8 +11,8 @@ def test_get_gdp(recorder): """Test get_gdp""" data = oecd_model.get_gdp( countries=["united_states", "canada"], - start_date=datetime.strptime("2020-01-01", "%Y-%m-%d"), - end_date=datetime.strptime("2022-01-31", "%Y-%m-%d"), + start_date="2020-01-01", + end_date="2022-01-31", ) assert isinstance(data, pd.DataFrame) recorder.capture(data) diff --git a/tests/openbb_terminal/economy/test_oecd_view.py b/tests/openbb_terminal/economy/test_oecd_view.py index b1f36e7ef1b..921ad7a9056 100644 --- a/tests/openbb_terminal/economy/test_oecd_view.py +++ b/tests/openbb_terminal/economy/test_oecd_view.py @@ -9,7 +9,10 @@ from openbb_terminal.economy import oecd_view @pytest.mark.parametrize( "countries, kwargs", [ - (["united_states"], {"start_date": "2019-01-01", "end_date": "2021-12-31"}), + ( + ["united_states"], + {"units": "USD_CAP", "start_date": "2019-01-01", "end_date": "2021-12-31"}, + ), ], ) def test_plot_gdp(countries, kwargs): From e2956367d3cbfe15dff5e0b7a75240b21736b3d9 Mon Sep 17 00:00:00 2001 From: Igor Radovanovic <74266147+IgorWounds@users.noreply.github.com> Date: Mon, 31 Jul 2023 18:14:55 +0200 Subject: [PATCH 51/98] Move --- .../core/tests/app/test_provider_interface.py | 100 ++++++ openbb_sdk/sdk/core/tests/app/test_query.py | 126 +++++++ openbb_sdk/sdk/core/tests/app/test_router.py | 307 ++++++++++++++++++ 3 files changed, 533 insertions(+) create mode 100644 openbb_sdk/sdk/core/tests/app/test_provider_interface.py create mode 100644 openbb_sdk/sdk/core/tests/app/test_query.py create mode 100644 openbb_sdk/sdk/core/tests/app/test_router.py diff --git a/openbb_sdk/sdk/core/tests/app/test_provider_interface.py b/openbb_sdk/sdk/core/tests/app/test_provider_interface.py new file mode 100644 index 00000000000..e61fdda19ca --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/test_provider_interface.py @@ -0,0 +1,100 @@ +"""Test provider interface.""" +# pylint: disable=redefined-outer-name + +import pytest +from openbb_core.app.provider_interface import ( + ProviderChoices, + ProviderInterface, + ProviderRegistry, + get_provider_interface, +) + + +@pytest.fixture(scope="module") +def provider_interface(): + """Set up provider_interface.""" + return ProviderInterface() + + +def test_init(provider_interface): + """Test init.""" + assert provider_interface + + +def test_get_provider_interface(): + """Test get provider interface.""" + assert isinstance(get_provider_interface(), ProviderInterface) + + +def test_map(provider_interface): + """Test map.""" + provider_interface_map = provider_interface.map + assert isinstance(provider_interface_map, dict) + assert len(provider_interface_map) > 0 + assert "StockEOD" in provider_interface_map + + +def test_required_credentials(provider_interface): + """Test required credentials.""" + required_credentials = provider_interface.required_credentials + assert isinstance(required_credentials, dict) + assert len(required_credentials) > 0 + + +def test_model_providers(provider_interface): + """Test model providers.""" + model_providers = provider_interface.model_providers + assert isinstance(model_providers, dict) + assert len(model_providers) > 0 + + +def test_params(provider_interface): + """Test params.""" + params = provider_interface.params + assert isinstance(params, dict) + assert len(params) > 0 + assert "StockEOD" in params + + +def test_data(provider_interface): + """Test data.""" + data = provider_interface.data + assert isinstance(data, dict) + assert len(data) > 0 + assert "StockEOD" in data + + +def test_merged_data(provider_interface): + """Test merged data.""" + merged_data = provider_interface.merged_data + assert isinstance(merged_data, dict) + assert len(merged_data) > 0 + assert "StockEOD" in merged_data + + +def test_providers_literal(provider_interface): + """Test providers literal.""" + providers_literal = provider_interface.providers_literal + assert isinstance(type(providers_literal), type) + assert len(providers_literal.__args__) > 0 + assert "openbb" not in providers_literal.__args__ + + +def test_provider_choices(provider_interface): + """Test provider choices.""" + provider_choices = provider_interface.provider_choices + assert isinstance(provider_choices, type(ProviderChoices)) + + +def test_models(provider_interface): + """Test models.""" + models = provider_interface.models + assert isinstance(models, list) + assert len(models) > 0 + assert "StockEOD" in models + + +def test_build_registry(provider_interface): + """Test build registry.""" + build_registry = provider_interface.build_registry() + assert isinstance(build_registry, ProviderRegistry) diff --git a/openbb_sdk/sdk/core/tests/app/test_query.py b/openbb_sdk/sdk/core/tests/app/test_query.py new file mode 100644 index 00000000000..f5856ff573c --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/test_query.py @@ -0,0 +1,126 @@ +"""Test the Query class.""" +# pylint: disable=redefined-outer-name + +from dataclasses import dataclass +from unittest.mock import MagicMock, patch + +import pytest +from openbb_core.app.model.command_context import CommandContext +from openbb_core.app.provider_interface import ( + ExtraParams, + ProviderChoices, + StandardParams, +) +from openbb_core.app.query import Query +from pydantic import BaseModel + + +def create_mock_query(): + """Mock query.""" + + class StockEOD: + """Mock StockEOD class.""" + + start_date = "2020-01-01" + end_date = "2020-01-05" + symbol = "AAPL" + + return StockEOD() + + +def create_mock_extra_params(): + """Mock ExtraParams dataclass.""" + + @dataclass + class StockEOD: + """Mock ExtraParams dataclass.""" + + sort: str = "desc" + + return StockEOD() + + +@pytest.fixture(scope="module") +def query(): + """Set up query.""" + return Query( + cc=CommandContext(), + provider_choices=ProviderChoices(provider="fmp"), + standard_params=StandardParams(), + extra_params=ExtraParams(), + ) + + +def test_init(query): + """Test init.""" + assert query + + +def test_to_query_params(query): + """Test to_query_params.""" + standard_params = create_mock_query() + + assert query.to_query_params(standard_params) + + +def test_filter_extra_params(query): + """Test filter_extra_params.""" + extra_params = create_mock_extra_params() + extra_params = query.filter_extra_params(extra_params, "fmp") + + assert isinstance(extra_params, dict) + assert len(extra_params) == 0 + + +def test_filter_extra_params_wrong_param(query): + """Test filter_extra_params.""" + + @dataclass + class StockEOD: + """Mock ExtraParams dataclass.""" + + sort: str = "desc" + limit: int = 4 + + extra_params = StockEOD() + + assert not query.filter_extra_params(extra_params, "fmp") + + +@pytest.fixture +def mock_registry(): + """Mock registry.""" + with patch( + "openbb_core.app.provider_interface.get_provider_interface" + ) as mock_get_provider_interface: + mock_registry = MagicMock() + mock_get_provider_interface.return_value.build_registry.return_value = ( + mock_registry + ) + yield mock_registry + + +@pytest.fixture +def query_instance(): + """Set up query.""" + standard_params = create_mock_query() + extra_params = create_mock_extra_params() + + cc = CommandContext() + setattr(cc.user_settings.credentials, "fmp_api_key", "1234") + + return Query( + cc=cc, + provider_choices=ProviderChoices(provider="fmp"), + standard_params=standard_params, + extra_params=extra_params, + ) + + +def test_execute_method_fake_credentials(query_instance, mock_registry): + """Test execute method without setting credentials.""" + mock_fetch_result = BaseModel() # Replace with an actual instance of BaseModel + mock_registry.fetch.return_value = mock_fetch_result + + with pytest.raises(Exception): + query_instance.execute() diff --git a/openbb_sdk/sdk/core/tests/app/test_router.py b/openbb_sdk/sdk/core/tests/app/test_router.py new file mode 100644 index 00000000000..d09eac2a633 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/test_router.py @@ -0,0 +1,307 @@ +"""Test router.py file.""" +# pylint: disable=redefined-outer-name +# pylint: disable=unused-argument + + +import pytest +from openbb_core.app.model.command_context import CommandContext +from openbb_core.app.model.command_output import CommandOutput +from openbb_core.app.provider_interface import ( + ExtraParams, + ProviderChoices, + StandardParams, +) +from openbb_core.app.router import ( + CommandMap, + CommandValidator, + Router, + RouterLoader, + SignatureInspector, +) +from pydantic import BaseModel + + +@pytest.fixture(scope="module") +def command_validator(): + """Set up command_validator.""" + return CommandValidator() + + +def test_command_validator_init(command_validator): + """Test init.""" + assert command_validator + + +@pytest.mark.parametrize( + "type_, expected", + [ + (str, True), + (int, True), + (float, True), + (bool, True), + (list, True), + (BaseModel, False), + ], +) +def test_is_standard_pydantic_type(command_validator, type_, expected): + """Test is_standard_pydantic_type.""" + # assert command_validator.is_standard_pydantic_type(str) + assert command_validator.is_standard_pydantic_type(type_) == expected + + +def test_is_valid_pydantic_model_type(command_validator): + """Test is_valid_pydantic_model_type.""" + assert command_validator.is_valid_pydantic_model_type(BaseModel) + assert not command_validator.is_valid_pydantic_model_type(str) + + +@pytest.mark.parametrize( + "type_, expected", + [ + (str, True), + (int, True), + (float, True), + (bool, True), + (list, True), + (BaseModel, True), + ], +) +def test_is_serializable_value_type(command_validator, type_, expected): + """Test is_serializable_value_type.""" + assert command_validator.is_serializable_value_type(type_) == expected + + +def test_is_annotated_dc(command_validator): + """Test is_annotated_dc.""" + assert not command_validator.is_annotated_dc(str) + + +def test_check_reserved_param(command_validator): + """Test check_reserved_param.""" + assert command_validator.check_reserved_param("name", str, {}, str, str) is None + assert not command_validator.check_reserved_param("name", str, {}, str, int) + + +def test_check_parameters(command_validator): + """Test check_parameters.""" + + def func(): + pass + + assert command_validator.check_parameters(func) is None + assert not command_validator.check_parameters(BaseModel) + + +def test_check_return_error(command_validator): + """Test check_return fail.""" + with pytest.raises(TypeError): + + def func(): + pass + + command_validator.check_return(func) + + +def test_check_return(command_validator): + """Test check_return.""" + + def valid_function() -> CommandOutput[int]: + return CommandOutput(results=[1, 2, 3]) + + assert command_validator.check_return(valid_function) is None + + +def test_check(command_validator): + """Test check.""" + + def valid_function() -> CommandOutput[int]: + return CommandOutput(results=[1, 2, 3]) + + assert command_validator.check(valid_function) is None + + +@pytest.fixture(scope="module") +def router(): + """Set up router.""" + return Router() + + +def test_router_init(router): + """Test init.""" + assert router + + +def test_command(router): + """Test command.""" + + @router.command + def valid_function() -> CommandOutput[int]: + return CommandOutput(results=[1, 2, 3]) + + assert valid_function + + +def test_include_router(router): + """Test include_router.""" + some_router = Router() + assert router.include_router(some_router) is None + + +@pytest.fixture(scope="module") +def router_loader(): + """Set up router_loader.""" + return RouterLoader() + + +def test_router_loader_init(router_loader): + """Test init.""" + assert router_loader + + +def test_from_extensions(router_loader): + """Test from_extensions.""" + assert router_loader.from_extensions() + + +@pytest.fixture(scope="module") +def signature_inspector(): + """Set up signature_inspector.""" + return SignatureInspector() + + +def test_signature_inspector_init(signature_inspector): + """Test init.""" + assert signature_inspector + + +def test_complete_signature(signature_inspector): + """Test complete_signature.""" + + def sample_function( + cc: CommandContext, + provider_choices: ProviderChoices, + standard_params: StandardParams, + extra_params: ExtraParams, + ) -> CommandOutput: + pass + + model = "StockEOD" + + assert signature_inspector.complete_signature(sample_function, model) + + +def test_complete_signature_error(signature_inspector): + """Test complete_signature.""" + + def valid_function() -> CommandOutput[int]: + return CommandOutput(results=[1, 2, 3]) + + with pytest.raises(AttributeError): + signature_inspector.complete_signature(valid_function, "invalid_model") + + +def test_validate_signature(signature_inspector): + """Test validate_signature.""" + + def sample_function( + cc: CommandContext, + provider_choices: ProviderChoices, + standard_params: StandardParams, + extra_params: ExtraParams, + ) -> CommandOutput: + pass + + expected_signature = { + "cc": CommandContext, + "provider_choices": ProviderChoices, + "standard_params": StandardParams, + "extra_params": ExtraParams, + } + + assert ( + signature_inspector.validate_signature(sample_function, expected_signature) + is None + ) + + +def test_inject_dependency(signature_inspector): + """Test inject_dependency.""" + + def sample_function( + cc: CommandContext, + provider_choices: ProviderChoices, + standard_params: StandardParams, + extra_params: ExtraParams, + ) -> CommandOutput: + pass + + assert signature_inspector.inject_dependency(sample_function, "cc", CommandContext) + + +def test_get_description(signature_inspector): + """Test get_description.""" + + def some_function(): + """Mock function.""" + + assert signature_inspector.get_description(some_function) == some_function.__doc__ + + +def test_get_description_no_doc(signature_inspector): + """Test get_description.""" + + def some_function(): + pass + + assert signature_inspector.get_description(some_function) == "" + + +@pytest.fixture(scope="module") +def command_map(): + """Set up command_map.""" + return CommandMap() + + +def test_command_map_init(command_map): + """Test init.""" + assert command_map + + +def test_map(command_map): + """Test map.""" + assert isinstance(command_map.map, dict) + + +def test_provider_coverage(command_map): + """Test provider_coverage.""" + assert isinstance(command_map.provider_coverage, dict) + + +def test_command_coverage(command_map): + """Test command_coverage.""" + assert isinstance(command_map.command_coverage, dict) + + +def test_get_command_map(command_map, router): + """Test get_command_map.""" + command_map = command_map.get_command_map(router) + assert isinstance(command_map, dict) + assert len(command_map) > 0 + + +def test_get_provider_coverage(command_map, router): + """Test get_provider_coverage.""" + provider_coverage = command_map.get_provider_coverage(router) + assert isinstance(provider_coverage, dict) + + +def test_get_command_coverage(command_map, router): + """Test get_command_coverage.""" + command_coverage = command_map.get_command_coverage(router) + assert isinstance(command_coverage, dict) + + +def test_get_command(command_map): + """Test get_command.""" + command = command_map.get_command("stocks/load") + assert command is None From 83ed6f167503ee9ac5450475b90a7b7b644b30e3 Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Tue, 1 Aug 2023 05:29:31 +0100 Subject: [PATCH 52/98] placeholders --- .../sdk/core/tests/app/logs/utils/test_system_utils.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py b/openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py index 057442b87f5..f0c9b123da5 100644 --- a/openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py +++ b/openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py @@ -1 +1,11 @@ # TODO : add tests once the code is fixed + +from openbb_core.app.logs.utils.system_utils import get_commit_hash, get_branch + + +def test_get_commit_hash(): + pass + + +def test_get_branch(): + pass From d9b45e22ee6819b352a21d84c2c3fe593a5486a6 Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Tue, 1 Aug 2023 06:30:57 +0100 Subject: [PATCH 53/98] some more tests for models --- .../app/model/charts/charting_settings.py | 26 ++++++---- .../tests/app/models/abstract/test_error.py | 24 +++++++++ .../tests/app/models/abstract/test_results.py | 9 ++++ .../app/models/abstract/test_singleton.py | 32 ++++++++++++ .../tests/app/models/abstract/test_tagged.py | 14 +++++ .../tests/app/models/abstract/test_warning.py | 36 +++++++++++++ .../tests/app/models/charts/test_chart.py | 51 +++++++++++++++++++ .../app/models/charts/test_chart_settings.py | 49 ++++++++++++++++++ 8 files changed, 230 insertions(+), 11 deletions(-) create mode 100644 openbb_sdk/sdk/core/tests/app/models/abstract/test_error.py create mode 100644 openbb_sdk/sdk/core/tests/app/models/abstract/test_results.py create mode 100644 openbb_sdk/sdk/core/tests/app/models/abstract/test_singleton.py create mode 100644 openbb_sdk/sdk/core/tests/app/models/abstract/test_tagged.py create mode 100644 openbb_sdk/sdk/core/tests/app/models/abstract/test_warning.py create mode 100644 openbb_sdk/sdk/core/tests/app/models/charts/test_chart.py create mode 100644 openbb_sdk/sdk/core/tests/app/models/charts/test_chart_settings.py diff --git a/openbb_sdk/sdk/core/openbb_core/app/model/charts/charting_settings.py b/openbb_sdk/sdk/core/openbb_core/app/model/charts/charting_settings.py index 843d91cff62..f0ab0d68466 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/model/charts/charting_settings.py +++ b/openbb_sdk/sdk/core/openbb_core/app/model/charts/charting_settings.py @@ -26,22 +26,26 @@ class ChartingSettings: # System self.log_collect: bool = system_settings.log_collect - self.version = system_settings.version - self.python_version = system_settings.python_version + self.version: str = system_settings.version + self.python_version: str = system_settings.python_version self.test_mode = system_settings.test_mode self.app_id: str = get_app_id(user_data_directory) self.debug_mode: bool = system_settings.debug_mode self.headless: bool = system_settings.headless # User - self.plot_enable_pywry = user_settings.preferences.plot_enable_pywry - self.plot_pywry_width = user_settings.preferences.plot_pywry_width - self.plot_pywry_height = user_settings.preferences.plot_pywry_height - self.plot_open_export = user_settings.preferences.plot_open_export - self.user_email = user_settings.profile.hub_session.email if has_hub else None - self.user_uuid = ( + self.plot_enable_pywry: bool = user_settings.preferences.plot_enable_pywry + self.plot_pywry_width: int = user_settings.preferences.plot_pywry_width + self.plot_pywry_height: int = user_settings.preferences.plot_pywry_height + self.plot_open_export: bool = user_settings.preferences.plot_open_export + self.user_email: Optional[str] = ( + user_settings.profile.hub_session.email if has_hub else None + ) + self.user_uuid: Optional[str] = ( user_settings.profile.hub_session.user_uuid if has_hub else None ) - self.user_exports_directory = user_settings.preferences.export_directory - self.user_styles_directory = user_settings.preferences.user_styles_directory + self.user_exports_directory: str = user_settings.preferences.export_directory + self.user_styles_directory: str = ( + user_settings.preferences.user_styles_directory + ) # Theme - self.chart_style = user_settings.preferences.chart_style + self.chart_style: str = user_settings.preferences.chart_style diff --git a/openbb_sdk/sdk/core/tests/app/models/abstract/test_error.py b/openbb_sdk/sdk/core/tests/app/models/abstract/test_error.py new file mode 100644 index 00000000000..11b5c05bb0e --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/models/abstract/test_error.py @@ -0,0 +1,24 @@ +from openbb_core.app.model.abstract.error import Error +import pytest + + +@pytest.mark.parametrize( + "error_kind, message", + [ + ("test", "test"), + ("test2", "test2"), + ], +) +def test_error_model(error_kind, message): + err = Error(error_kind=error_kind, message=message) + + assert err.error_kind == error_kind + assert err.message == message + + +def test_fields(): + fields = Error.__fields__ + fields_keys = fields.keys() + + assert "error_kind" in fields_keys + assert "message" in fields_keys diff --git a/openbb_sdk/sdk/core/tests/app/models/abstract/test_results.py b/openbb_sdk/sdk/core/tests/app/models/abstract/test_results.py new file mode 100644 index 00000000000..185f82c7925 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/models/abstract/test_results.py @@ -0,0 +1,9 @@ +from openbb_core.app.model.abstract.results import Results + +from pydantic import BaseModel + + +def test_results_model(): + res = Results() + + assert isinstance(res, BaseModel) diff --git a/openbb_sdk/sdk/core/tests/app/models/abstract/test_singleton.py b/openbb_sdk/sdk/core/tests/app/models/abstract/test_singleton.py new file mode 100644 index 00000000000..d87502e2f67 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/models/abstract/test_singleton.py @@ -0,0 +1,32 @@ +from openbb_core.app.model.abstract.singleton import SingletonMeta + + +class MyClass(metaclass=SingletonMeta): + def __init__(self, value): + self.value = value + + +def test_singleton_instance_creation(): + # Arrange + instance1 = MyClass(42) + instance2 = MyClass(100) + + # Act & Assert + assert instance1 is instance2 + assert instance1.value == instance2.value + assert instance1.value == 42 + + +def test_singleton_multiple_classes(): + # Arrange + class AnotherClass(metaclass=SingletonMeta): + def __init__(self, data): + self.data = data + + instance1 = MyClass(42) + instance2 = AnotherClass("test") + + # Act & Assert + assert instance1 is not instance2 + assert instance1.value == 42 + assert instance2.data == "test" diff --git a/openbb_sdk/sdk/core/tests/app/models/abstract/test_tagged.py b/openbb_sdk/sdk/core/tests/app/models/abstract/test_tagged.py new file mode 100644 index 00000000000..9a8ecd6c12e --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/models/abstract/test_tagged.py @@ -0,0 +1,14 @@ +from openbb_core.app.model.abstract.tagged import Tagged + + +def test_tagged_model(): + tagged = Tagged() + + assert hasattr(tagged, "id") + + +def test_fields(): + fields = Tagged.__fields__ + fields_keys = fields.keys() + + assert "id" in fields_keys diff --git a/openbb_sdk/sdk/core/tests/app/models/abstract/test_warning.py b/openbb_sdk/sdk/core/tests/app/models/abstract/test_warning.py new file mode 100644 index 00000000000..fcf833e12a0 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/models/abstract/test_warning.py @@ -0,0 +1,36 @@ +from openbb_core.app.model.abstract.warning import Warning_, cast_warning + +import pytest +from unittest.mock import Mock + + +@pytest.mark.parametrize( + "category, message", + [ + ("test", "test"), + ("test2", "test2"), + ], +) +def test_warn_model(category, message): + war = Warning_(category=category, message=message) + + assert war.category == category + assert war.message == message + + +def test_fields(): + fields = Warning_.__fields__ + fields_keys = fields.keys() + + assert "category" in fields_keys + assert "message" in fields_keys + + +def test_cast_warning(): + mock_warning_message = Mock() + mock_warning_message.category.__name__ = "test" + mock_warning_message.message = "test" + warning = cast_warning(mock_warning_message) + + assert warning.category == "test" + assert warning.message == "test" diff --git a/openbb_sdk/sdk/core/tests/app/models/charts/test_chart.py b/openbb_sdk/sdk/core/tests/app/models/charts/test_chart.py new file mode 100644 index 00000000000..fc1cff860e0 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/models/charts/test_chart.py @@ -0,0 +1,51 @@ +from openbb_core.app.model.charts.chart import Chart, ChartFormat, Error + +import pytest + + +def test_chart_default_values(): + # Arrange & Act + chart = Chart() + + # Assert + assert chart.content is None + assert chart.format == ChartFormat.plotly + assert chart.error is None + + +def test_chart_custom_values(): + # Arrange + content = {"data": [1, 2, 3]} + chart_format = ChartFormat.plotly + error = Error(message="Test Error") + + # Act + chart = Chart(content=content, format=chart_format, error=error) + + # Assert + assert chart.content == content + assert chart.format == chart_format + assert chart.error == error + + +def test_chart_assignment_validation(): + # Arrange + chart = Chart() + + # Act & Assert + with pytest.raises(ValueError): + chart.invalid_field = "Invalid Value" + + +def test_chart_config_validation(): + # Arrange + content = {"data": [1, 2, 3]} + chart_format = ChartFormat.plotly + + chart = Chart(content=content, format=chart_format) + + with pytest.raises(ValueError): + chart.content = "Invalid Content" + + assert chart.content == content + assert chart.format == chart_format diff --git a/openbb_sdk/sdk/core/tests/app/models/charts/test_chart_settings.py b/openbb_sdk/sdk/core/tests/app/models/charts/test_chart_settings.py new file mode 100644 index 00000000000..595310aecf2 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/models/charts/test_chart_settings.py @@ -0,0 +1,49 @@ +from openbb_core.app.model.charts.charting_settings import ChartingSettings + +from unittest.mock import MagicMock + +mock_user_settings = MagicMock() +mock_user_settings.preferences.data_directory = "mock_data_directory" +mock_user_settings.preferences.plot_enable_pywry = True +mock_user_settings.preferences.plot_pywry_width = 100 +mock_user_settings.preferences.plot_pywry_height = 100 +mock_user_settings.preferences.plot_open_export = True +mock_user_settings.profile.hub_session.email = "mock_email" +mock_user_settings.profile.hub_session.user_uuid = "mock_uuid" +mock_user_settings.preferences.export_directory = "mock_export_directory" +mock_user_settings.preferences.user_styles_directory = "mock_styles_directory" +mock_user_settings.preferences.chart_style = "mock_chart_style" + +mock_system_settings = MagicMock() +mock_system_settings.log_collect = True +mock_system_settings.version = "mock_version" +mock_system_settings.python_version = "mock_python_version" +mock_system_settings.test_mode = True +mock_system_settings.debug_mode = True +mock_system_settings.headless = True + + +def test_charting_settings(mocker): + mocker.patch( + target="openbb_core.app.model.charts.charting_settings.get_app_id", + new=mocker.Mock(return_value="mock_app_id"), + ) + charting_settings = ChartingSettings( + user_settings=mock_user_settings, system_settings=mock_system_settings + ) + assert charting_settings.log_collect is True + assert charting_settings.version == "mock_version" + assert charting_settings.python_version == "mock_python_version" + assert charting_settings.test_mode is True + assert charting_settings.app_id == "mock_app_id" + assert charting_settings.debug_mode is True + assert charting_settings.headless is True + assert charting_settings.plot_enable_pywry is True + assert charting_settings.plot_pywry_width == 100 + assert charting_settings.plot_pywry_height == 100 + assert charting_settings.plot_open_export is True + assert charting_settings.user_email == "mock_email" + assert charting_settings.user_uuid == "mock_uuid" + assert charting_settings.user_exports_directory == "mock_export_directory" + assert charting_settings.user_styles_directory == "mock_styles_directory" + assert charting_settings.chart_style == "mock_chart_style" From b3f7e7f0422ebc19ce16afd3725500d1b0b5efc1 Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Tue, 1 Aug 2023 06:48:08 +0100 Subject: [PATCH 54/98] more tests for models --- .../openbb_core/app/model/error/__init__.py | 0 .../tests/app/models/test_features_keys.py | 8 +++++ .../core/tests/app/models/test_hub_session.py | 30 +++++++++++++++++++ .../app/models/test_hub_user_settings.py | 7 +++++ .../sdk/core/tests/app/results/test_empty.py | 10 +++++++ 5 files changed, 55 insertions(+) delete mode 100644 openbb_sdk/sdk/core/openbb_core/app/model/error/__init__.py create mode 100644 openbb_sdk/sdk/core/tests/app/models/test_features_keys.py create mode 100644 openbb_sdk/sdk/core/tests/app/models/test_hub_session.py create mode 100644 openbb_sdk/sdk/core/tests/app/models/test_hub_user_settings.py create mode 100644 openbb_sdk/sdk/core/tests/app/results/test_empty.py diff --git a/openbb_sdk/sdk/core/openbb_core/app/model/error/__init__.py b/openbb_sdk/sdk/core/openbb_core/app/model/error/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/openbb_sdk/sdk/core/tests/app/models/test_features_keys.py b/openbb_sdk/sdk/core/tests/app/models/test_features_keys.py new file mode 100644 index 00000000000..19eda989243 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/models/test_features_keys.py @@ -0,0 +1,8 @@ +from openbb_core.app.model.hub.features_keys import FeaturesKeys + + +def test_features_keys(): + fk = FeaturesKeys(API_BITQUERY_KEY="test", API_BIZTOC_TOKEN="test2") + + assert fk.API_BITQUERY_KEY == "test" + assert fk.API_BIZTOC_TOKEN == "test2" diff --git a/openbb_sdk/sdk/core/tests/app/models/test_hub_session.py b/openbb_sdk/sdk/core/tests/app/models/test_hub_session.py new file mode 100644 index 00000000000..1f55189599c --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/models/test_hub_session.py @@ -0,0 +1,30 @@ +from openbb_core.app.model.hub.hub_session import HubSession + + +def test_hub_session(): + session = HubSession( + access_token="mock_access_token", + token_type="mock_token_type", + email="mock_email", + user_uuid="mock_user_uuid", + username="mock_username", + primary_usage="mock_primary_usage", + ) + assert session.access_token == "mock_access_token" + assert session.token_type == "mock_token_type" + assert session.email == "mock_email" + assert session.user_uuid == "mock_user_uuid" + assert session.username == "mock_username" + assert session.primary_usage == "mock_primary_usage" + + +def test_fields(): + fields = HubSession.__fields__ + fields_keys = fields.keys() + + assert "access_token" in fields_keys + assert "token_type" in fields_keys + assert "email" in fields_keys + assert "user_uuid" in fields_keys + assert "username" in fields_keys + assert "primary_usage" in fields_keys diff --git a/openbb_sdk/sdk/core/tests/app/models/test_hub_user_settings.py b/openbb_sdk/sdk/core/tests/app/models/test_hub_user_settings.py new file mode 100644 index 00000000000..ca2f78ff9a8 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/models/test_hub_user_settings.py @@ -0,0 +1,7 @@ +from openbb_core.app.model.hub.hub_user_settings import HubUserSettings + + +def test_hub_user_settings(): + hub_settings = HubUserSettings() + + assert isinstance(hub_settings, HubUserSettings) diff --git a/openbb_sdk/sdk/core/tests/app/results/test_empty.py b/openbb_sdk/sdk/core/tests/app/results/test_empty.py new file mode 100644 index 00000000000..79d9796505a --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/results/test_empty.py @@ -0,0 +1,10 @@ +from openbb_core.app.model.results.empty import Empty + +from pydantic import BaseModel + + +def test_empty_model(): + empty = Empty() + + assert isinstance(empty, Empty) + assert isinstance(empty, BaseModel) From 2b899b83c2af71d0e9fe431ab97e4bf18a96c6ab Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Tue, 1 Aug 2023 06:48:22 +0100 Subject: [PATCH 55/98] ruff --- openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py | 1 - openbb_sdk/sdk/core/tests/app/models/abstract/test_error.py | 2 +- openbb_sdk/sdk/core/tests/app/models/abstract/test_results.py | 1 - openbb_sdk/sdk/core/tests/app/models/abstract/test_warning.py | 4 ++-- openbb_sdk/sdk/core/tests/app/models/charts/test_chart.py | 3 +-- .../sdk/core/tests/app/models/charts/test_chart_settings.py | 4 ++-- openbb_sdk/sdk/core/tests/app/results/test_empty.py | 1 - 7 files changed, 6 insertions(+), 10 deletions(-) diff --git a/openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py b/openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py index f0c9b123da5..45233ce1c59 100644 --- a/openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py +++ b/openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py @@ -1,6 +1,5 @@ # TODO : add tests once the code is fixed -from openbb_core.app.logs.utils.system_utils import get_commit_hash, get_branch def test_get_commit_hash(): diff --git a/openbb_sdk/sdk/core/tests/app/models/abstract/test_error.py b/openbb_sdk/sdk/core/tests/app/models/abstract/test_error.py index 11b5c05bb0e..4e16d152580 100644 --- a/openbb_sdk/sdk/core/tests/app/models/abstract/test_error.py +++ b/openbb_sdk/sdk/core/tests/app/models/abstract/test_error.py @@ -1,5 +1,5 @@ -from openbb_core.app.model.abstract.error import Error import pytest +from openbb_core.app.model.abstract.error import Error @pytest.mark.parametrize( diff --git a/openbb_sdk/sdk/core/tests/app/models/abstract/test_results.py b/openbb_sdk/sdk/core/tests/app/models/abstract/test_results.py index 185f82c7925..da1fc0776b6 100644 --- a/openbb_sdk/sdk/core/tests/app/models/abstract/test_results.py +++ b/openbb_sdk/sdk/core/tests/app/models/abstract/test_results.py @@ -1,5 +1,4 @@ from openbb_core.app.model.abstract.results import Results - from pydantic import BaseModel diff --git a/openbb_sdk/sdk/core/tests/app/models/abstract/test_warning.py b/openbb_sdk/sdk/core/tests/app/models/abstract/test_warning.py index fcf833e12a0..5c466442f12 100644 --- a/openbb_sdk/sdk/core/tests/app/models/abstract/test_warning.py +++ b/openbb_sdk/sdk/core/tests/app/models/abstract/test_warning.py @@ -1,7 +1,7 @@ -from openbb_core.app.model.abstract.warning import Warning_, cast_warning +from unittest.mock import Mock import pytest -from unittest.mock import Mock +from openbb_core.app.model.abstract.warning import Warning_, cast_warning @pytest.mark.parametrize( diff --git a/openbb_sdk/sdk/core/tests/app/models/charts/test_chart.py b/openbb_sdk/sdk/core/tests/app/models/charts/test_chart.py index fc1cff860e0..4e7f930eaea 100644 --- a/openbb_sdk/sdk/core/tests/app/models/charts/test_chart.py +++ b/openbb_sdk/sdk/core/tests/app/models/charts/test_chart.py @@ -1,6 +1,5 @@ -from openbb_core.app.model.charts.chart import Chart, ChartFormat, Error - import pytest +from openbb_core.app.model.charts.chart import Chart, ChartFormat, Error def test_chart_default_values(): diff --git a/openbb_sdk/sdk/core/tests/app/models/charts/test_chart_settings.py b/openbb_sdk/sdk/core/tests/app/models/charts/test_chart_settings.py index 595310aecf2..d1174804186 100644 --- a/openbb_sdk/sdk/core/tests/app/models/charts/test_chart_settings.py +++ b/openbb_sdk/sdk/core/tests/app/models/charts/test_chart_settings.py @@ -1,7 +1,7 @@ -from openbb_core.app.model.charts.charting_settings import ChartingSettings - from unittest.mock import MagicMock +from openbb_core.app.model.charts.charting_settings import ChartingSettings + mock_user_settings = MagicMock() mock_user_settings.preferences.data_directory = "mock_data_directory" mock_user_settings.preferences.plot_enable_pywry = True diff --git a/openbb_sdk/sdk/core/tests/app/results/test_empty.py b/openbb_sdk/sdk/core/tests/app/results/test_empty.py index 79d9796505a..23a73ff369e 100644 --- a/openbb_sdk/sdk/core/tests/app/results/test_empty.py +++ b/openbb_sdk/sdk/core/tests/app/results/test_empty.py @@ -1,5 +1,4 @@ from openbb_core.app.model.results.empty import Empty - from pydantic import BaseModel From 938e126df8c9030ecd44795265c2c08d482ee868 Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Tue, 1 Aug 2023 07:47:29 +0100 Subject: [PATCH 56/98] some more tests and moves --- .../{models => model}/abstract/test_error.py | 0 .../abstract/test_results.py | 0 .../abstract/test_singleton.py | 0 .../{models => model}/abstract/test_tagged.py | 0 .../abstract/test_warning.py | 0 .../{models => model}/charts/test_chart.py | 0 .../charts/test_chart_settings.py | 0 .../hub}/test_features_keys.py | 0 .../{models => model/hub}/test_hub_session.py | 0 .../hub}/test_hub_user_settings.py | 0 .../tests/app/model/test_command_context.py | 20 ++++++++++++ .../tests/app/model/test_command_output.py | 0 .../core/tests/app/model/test_credentials.py | 23 +++++++++++++ .../sdk/core/tests/app/model/test_defaults.py | 14 ++++++++ .../sdk/core/tests/app/model/test_journal.py | 19 +++++++++++ .../tests/app/model/test_journal_entry.py | 32 +++++++++++++++++++ .../tests/app/model/test_journal_query.py | 19 +++++++++++ .../core/tests/app/model/test_preferences.py | 6 ++++ .../sdk/core/tests/app/model/test_profile.py | 6 ++++ .../tests/app/model/test_system_settings.py | 0 .../tests/app/model/test_user_settings.py | 13 ++++++++ 21 files changed, 152 insertions(+) rename openbb_sdk/sdk/core/tests/app/{models => model}/abstract/test_error.py (100%) rename openbb_sdk/sdk/core/tests/app/{models => model}/abstract/test_results.py (100%) rename openbb_sdk/sdk/core/tests/app/{models => model}/abstract/test_singleton.py (100%) rename openbb_sdk/sdk/core/tests/app/{models => model}/abstract/test_tagged.py (100%) rename openbb_sdk/sdk/core/tests/app/{models => model}/abstract/test_warning.py (100%) rename openbb_sdk/sdk/core/tests/app/{models => model}/charts/test_chart.py (100%) rename openbb_sdk/sdk/core/tests/app/{models => model}/charts/test_chart_settings.py (100%) rename openbb_sdk/sdk/core/tests/app/{models => model/hub}/test_features_keys.py (100%) rename openbb_sdk/sdk/core/tests/app/{models => model/hub}/test_hub_session.py (100%) rename openbb_sdk/sdk/core/tests/app/{models => model/hub}/test_hub_user_settings.py (100%) create mode 100644 openbb_sdk/sdk/core/tests/app/model/test_command_context.py create mode 100644 openbb_sdk/sdk/core/tests/app/model/test_command_output.py create mode 100644 openbb_sdk/sdk/core/tests/app/model/test_credentials.py create mode 100644 openbb_sdk/sdk/core/tests/app/model/test_defaults.py create mode 100644 openbb_sdk/sdk/core/tests/app/model/test_journal.py create mode 100644 openbb_sdk/sdk/core/tests/app/model/test_journal_entry.py create mode 100644 openbb_sdk/sdk/core/tests/app/model/test_journal_query.py create mode 100644 openbb_sdk/sdk/core/tests/app/model/test_preferences.py create mode 100644 openbb_sdk/sdk/core/tests/app/model/test_profile.py create mode 100644 openbb_sdk/sdk/core/tests/app/model/test_system_settings.py create mode 100644 openbb_sdk/sdk/core/tests/app/model/test_user_settings.py diff --git a/openbb_sdk/sdk/core/tests/app/models/abstract/test_error.py b/openbb_sdk/sdk/core/tests/app/model/abstract/test_error.py similarity index 100% rename from openbb_sdk/sdk/core/tests/app/models/abstract/test_error.py rename to openbb_sdk/sdk/core/tests/app/model/abstract/test_error.py diff --git a/openbb_sdk/sdk/core/tests/app/models/abstract/test_results.py b/openbb_sdk/sdk/core/tests/app/model/abstract/test_results.py similarity index 100% rename from openbb_sdk/sdk/core/tests/app/models/abstract/test_results.py rename to openbb_sdk/sdk/core/tests/app/model/abstract/test_results.py diff --git a/openbb_sdk/sdk/core/tests/app/models/abstract/test_singleton.py b/openbb_sdk/sdk/core/tests/app/model/abstract/test_singleton.py similarity index 100% rename from openbb_sdk/sdk/core/tests/app/models/abstract/test_singleton.py rename to openbb_sdk/sdk/core/tests/app/model/abstract/test_singleton.py diff --git a/openbb_sdk/sdk/core/tests/app/models/abstract/test_tagged.py b/openbb_sdk/sdk/core/tests/app/model/abstract/test_tagged.py similarity index 100% rename from openbb_sdk/sdk/core/tests/app/models/abstract/test_tagged.py rename to openbb_sdk/sdk/core/tests/app/model/abstract/test_tagged.py diff --git a/openbb_sdk/sdk/core/tests/app/models/abstract/test_warning.py b/openbb_sdk/sdk/core/tests/app/model/abstract/test_warning.py similarity index 100% rename from openbb_sdk/sdk/core/tests/app/models/abstract/test_warning.py rename to openbb_sdk/sdk/core/tests/app/model/abstract/test_warning.py diff --git a/openbb_sdk/sdk/core/tests/app/models/charts/test_chart.py b/openbb_sdk/sdk/core/tests/app/model/charts/test_chart.py similarity index 100% rename from openbb_sdk/sdk/core/tests/app/models/charts/test_chart.py rename to openbb_sdk/sdk/core/tests/app/model/charts/test_chart.py diff --git a/openbb_sdk/sdk/core/tests/app/models/charts/test_chart_settings.py b/openbb_sdk/sdk/core/tests/app/model/charts/test_chart_settings.py similarity index 100% rename from openbb_sdk/sdk/core/tests/app/models/charts/test_chart_settings.py rename to openbb_sdk/sdk/core/tests/app/model/charts/test_chart_settings.py diff --git a/openbb_sdk/sdk/core/tests/app/models/test_features_keys.py b/openbb_sdk/sdk/core/tests/app/model/hub/test_features_keys.py similarity index 100% rename from openbb_sdk/sdk/core/tests/app/models/test_features_keys.py rename to openbb_sdk/sdk/core/tests/app/model/hub/test_features_keys.py diff --git a/openbb_sdk/sdk/core/tests/app/models/test_hub_session.py b/openbb_sdk/sdk/core/tests/app/model/hub/test_hub_session.py similarity index 100% rename from openbb_sdk/sdk/core/tests/app/models/test_hub_session.py rename to openbb_sdk/sdk/core/tests/app/model/hub/test_hub_session.py diff --git a/openbb_sdk/sdk/core/tests/app/models/test_hub_user_settings.py b/openbb_sdk/sdk/core/tests/app/model/hub/test_hub_user_settings.py similarity index 100% rename from openbb_sdk/sdk/core/tests/app/models/test_hub_user_settings.py rename to openbb_sdk/sdk/core/tests/app/model/hub/test_hub_user_settings.py diff --git a/openbb_sdk/sdk/core/tests/app/model/test_command_context.py b/openbb_sdk/sdk/core/tests/app/model/test_command_context.py new file mode 100644 index 00000000000..4d86b5bff78 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/model/test_command_context.py @@ -0,0 +1,20 @@ +from openbb_core.app.model.command_context import ( + CommandContext, + UserSettings, + SystemSettings, +) + + +def test_command_context(): + cc = CommandContext() + assert isinstance(cc, CommandContext) + assert isinstance(cc.user_settings, UserSettings) + assert isinstance(cc.system_settings, SystemSettings) + + +def test_fields(): + fields = CommandContext.__fields__ + fields_keys = fields.keys() + + assert "user_settings" in fields_keys + assert "system_settings" in fields_keys diff --git a/openbb_sdk/sdk/core/tests/app/model/test_command_output.py b/openbb_sdk/sdk/core/tests/app/model/test_command_output.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/sdk/core/tests/app/model/test_credentials.py b/openbb_sdk/sdk/core/tests/app/model/test_credentials.py new file mode 100644 index 00000000000..ba635a2174f --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/model/test_credentials.py @@ -0,0 +1,23 @@ +from unittest.mock import patch + +import typing + + +def test_credentials(): + with patch( + target="openbb_core.app.model.credentials.get_provider_interface" + ) as mock_provider_interface: + mock_provider_interface.required_credentials = { + "benzinga_api_key": (typing.Optional[str], None), + "polygon_api_key": (typing.Optional[str], None), + } + from openbb_core.app.model.credentials import Credentials + + creds = Credentials( + benzinga_api_key="mock_benzinga_api_key", + polygon_api_key="mock_polygon_api_key", + ) + + assert isinstance(creds, Credentials) + assert creds.benzinga_api_key == "mock_benzinga_api_key" + assert creds.polygon_api_key == "mock_polygon_api_key" diff --git a/openbb_sdk/sdk/core/tests/app/model/test_defaults.py b/openbb_sdk/sdk/core/tests/app/model/test_defaults.py new file mode 100644 index 00000000000..e134eb36214 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/model/test_defaults.py @@ -0,0 +1,14 @@ +from openbb_core.app.model.defaults import Defaults + + +def test_defaultst(): + cc = Defaults(routes={"test": {"test": "test"}}) + assert isinstance(cc, Defaults) + assert cc.routes == {"test": {"test": "test"}} + + +def test_fields(): + fields = Defaults.__fields__ + fields_keys = fields.keys() + + assert "routes" in fields_keys diff --git a/openbb_sdk/sdk/core/tests/app/model/test_journal.py b/openbb_sdk/sdk/core/tests/app/model/test_journal.py new file mode 100644 index 00000000000..2a90a627616 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/model/test_journal.py @@ -0,0 +1,19 @@ +from openbb_core.app.model.journal import Journal + + +def test_journal_query(): + journal_query = Journal( + name="mock_name", + journal_entry_id_list=["id_1", "id_2"], + ) + assert isinstance(journal_query, Journal) + assert journal_query.name == "mock_name" + assert journal_query.journal_entry_id_list == ["id_1", "id_2"] + + +def test_fields(): + fields = Journal.__fields__ + fields_keys = fields.keys() + + assert "name" in fields_keys + assert "journal_entry_id_list" in fields_keys diff --git a/openbb_sdk/sdk/core/tests/app/model/test_journal_entry.py b/openbb_sdk/sdk/core/tests/app/model/test_journal_entry.py new file mode 100644 index 00000000000..b2a60221f25 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/model/test_journal_entry.py @@ -0,0 +1,32 @@ +from openbb_core.app.model.journal_entry import JournalEntry + +from unittest.mock import Mock + +import datetime + + +def test_journal_entry(): + journal = JournalEntry( + journal_id="mock_journal_id", + arguments={"mock_key": "mock_value"}, + duration=19, + output={}, + route="mock_route", + timestamp=datetime.datetime(2021, 1, 1), + alias_list=["mock_alias"], + ) + assert isinstance(journal, JournalEntry) + + +def test_fields(): + fields = JournalEntry.__fields__ + fields_keys = fields.keys() + + assert "id" in fields_keys + assert "journal_id" in fields_keys + assert "arguments" in fields_keys + assert "duration" in fields_keys + assert "output" in fields_keys + assert "route" in fields_keys + assert "timestamp" in fields_keys + assert "alias_list" in fields_keys diff --git a/openbb_sdk/sdk/core/tests/app/model/test_journal_query.py b/openbb_sdk/sdk/core/tests/app/model/test_journal_query.py new file mode 100644 index 00000000000..0db1432beb0 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/model/test_journal_query.py @@ -0,0 +1,19 @@ +from openbb_core.app.model.journal_query import JournalQuery + + +def test_journal_query(): + journal_query = JournalQuery( + journal_entry_id="mock_journal_entry_id", + ignore_error_output=True, + ) + assert isinstance(journal_query, JournalQuery) + assert journal_query.journal_entry_id == "mock_journal_entry_id" + assert journal_query.ignore_error_output is True + + +def test_fields(): + fields = JournalQuery.__fields__ + fields_keys = fields.keys() + + assert "journal_entry_id" in fields_keys + assert "ignore_error_output" in fields_keys diff --git a/openbb_sdk/sdk/core/tests/app/model/test_preferences.py b/openbb_sdk/sdk/core/tests/app/model/test_preferences.py new file mode 100644 index 00000000000..ca3bae14af0 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/model/test_preferences.py @@ -0,0 +1,6 @@ +from openbb_core.app.model.preferences import Preferences + + +def test_preferences(): + preferences = Preferences() + assert isinstance(preferences, Preferences) diff --git a/openbb_sdk/sdk/core/tests/app/model/test_profile.py b/openbb_sdk/sdk/core/tests/app/model/test_profile.py new file mode 100644 index 00000000000..5c22d7ee73d --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/model/test_profile.py @@ -0,0 +1,6 @@ +from openbb_core.app.model.profile import Profile + + +def test_preferences(): + preferences = Profile() + assert isinstance(preferences, Profile) diff --git a/openbb_sdk/sdk/core/tests/app/model/test_system_settings.py b/openbb_sdk/sdk/core/tests/app/model/test_system_settings.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/openbb_sdk/sdk/core/tests/app/model/test_user_settings.py b/openbb_sdk/sdk/core/tests/app/model/test_user_settings.py new file mode 100644 index 00000000000..8651782d528 --- /dev/null +++ b/openbb_sdk/sdk/core/tests/app/model/test_user_settings.py @@ -0,0 +1,13 @@ +from openbb_core.app.model.user_settings import UserSettings + +from unittest.mock import MagicMock + + +def test_user_settings(): + settings = UserSettings( + credentials=MagicMock(), + profile=MagicMock(), + preferences=MagicMock(), + defaults=MagicMock(), + ) + assert isinstance(settings, UserSettings) From c8f82e1f8fe6150fcc1548a8f92f1d0e710f78c3 Mon Sep 17 00:00:00 2001 From: Diogo Sousa Date: Tue, 1 Aug 2023 12:04:16 +0100 Subject: [PATCH 57/98] reorder system settings attrs --- .../openbb_core/app/model/system_settings.py | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/openbb_sdk/sdk/core/openbb_core/app/model/system_settings.py b/openbb_sdk/sdk/core/openbb_core/app/model/system_settings.py index 7d39030216a..b883a7d191b 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/model/system_settings.py +++ b/openbb_sdk/sdk/core/openbb_core/app/model/system_settings.py @@ -20,17 +20,6 @@ FrozenField = partial(Field, allow_mutation=False) class SystemSettings(Tagged): - run_in_isolation: bool = Field( - default=False, - description="Whether or not to run each command in total isolation.", - allow_mutation=False, - ) - dbms_uri: Optional[str] = Field( - default=None, - description="Connection URI like : `mongodb://root:example@localhost:27017/`", - allow_mutation=False, - ) - # System section os: str = FrozenField(default=str(pl.system())) python_version: str = FrozenField(default=str(pl.python_version())) @@ -60,6 +49,14 @@ class SystemSettings(Tagged): test_mode: bool = False debug_mode: bool = False headless: bool = False + run_in_isolation: bool = FrozenField( + default=False, + description="Whether or not to run each command in total isolation.", + ) + dbms_uri: Optional[str] = FrozenField( + default=None, + description="Connection URI like : `mongodb://root:example@localhost:27017/`", + ) class Config: validate_assignment = True From fe1073da095cc4ccd77b9bc41fbe895119413d66 Mon Sep 17 00:00:00 2001 From: Diogo Sousa Date: Tue, 1 Aug 2023 12:29:42 +0100 Subject: [PATCH 58/98] only allow setup for allowed system fields --- .../openbb_core/app/service/system_service.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/openbb_sdk/sdk/core/openbb_core/app/service/system_service.py b/openbb_sdk/sdk/core/openbb_core/app/service/system_service.py index f9bc25cc7b9..5e974a195e4 100644 --- a/openbb_sdk/sdk/core/openbb_core/app/service/system_service.py +++ b/openbb_sdk/sdk/core/openbb_core/app/service/system_service.py @@ -1,3 +1,4 @@ +import json from pathlib import Path from typing import Optional @@ -7,7 +8,14 @@ from openbb_core.app.model.system_settings import SystemSettings class SystemService: SYSTEM_SETTINGS_PATH = SYSTEM_SETTINGS_PATH - SYSTEM_SETTINGS_ALLOWED_FIELD_SET = {"run_in_isolation", "dbms_uri"} + SYSTEM_SETTINGS_ALLOWED_FIELD_SET = { + "log_collect", + "test_mode", + "headless", + "debug_mode", + "run_in_isolation", + "dbms_uri", + } @classmethod def read_default_system_settings( @@ -19,7 +27,13 @@ class SystemService: with path.open(mode="r") as file: system_settings_json = file.read() - system_settings = SystemSettings.parse_raw(system_settings_json) + system_settings_dict = json.loads(system_settings_json) + S = system_settings_dict.copy() + for field in S: + if field not in cls.SYSTEM_SETTINGS_ALLOWED_FIELD_SET: + del system_settings_dict[field] + + system_settings = SystemSettings.parse_obj(system_settings_dict) else: system_settings = SystemSettings() From b1ecbc75e63d438eeb29efef0173fd6fd64c3853 Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Tue, 1 Aug 2023 13:08:14 +0100 Subject: [PATCH 59/98] add tests for command_output --- .../core/tests/app/model/charts/test_chart.py | 5 + .../tests/app/model/test_command_output.py | 183 ++++++++++++++++++ 2 files changed, 188 insertions(+) diff --git a/openbb_sdk/sdk/core/tests/app/model/charts/test_chart.py b/openbb_sdk/sdk/core/tests/app/model/charts/test_chart.py index 4e7f930eaea..176f5815701 100644 --- a/openbb_sdk/sdk/core/tests/app/model/charts/test_chart.py +++ b/openbb_sdk/sdk/core/tests/app/model/charts/test_chart.py @@ -48,3 +48,8 @@ def test_chart_config_validation(): assert chart.content == content assert chart.format == chart_format + + +def test_show(): + # TODO : add test after the function is properly refactored + pass diff --git a/openbb_sdk/sdk/core/tests/app/model/test_command_output.py b/openbb_sdk/sdk/core/tests/app/model/test_command_output.py index e69de29bb2d..4a2dd998f1a 100644 --- a/openbb_sdk/sdk/core/tests/app/model/test_command_output.py +++ b/openbb_sdk/sdk/core/tests/app/model/test_command_output.py @@ -0,0 +1,183 @@ +from openbb_core.app.model.command_output import CommandOutput, OpenBBError, Chart + +import pytest +import pandas as pd + +from unittest.mock import patch, MagicMock + + +def test_command_output(): + co = CommandOutput() + assert isinstance(co, CommandOutput) + + +def test_fields(): + fields = CommandOutput.__fields__.keys() + + assert "results" in fields + assert "provider" in fields + assert "warnings" in fields + assert "error" in fields + assert "chart" in fields + + +def test_to_dataframe_no_results(): + co = CommandOutput() + with pytest.raises(Exception): + co.to_dataframe() + + +@pytest.mark.parametrize( + "results, expected_df", + [ + # Test case 1: Normal results with "date" column + ( + [{"date": "2023-07-30", "value": 10}, {"date": "2023-07-31", "value": 20}], + pd.DataFrame( + {"value": [10, 20]}, + index=pd.to_datetime(["2023-07-30", "2023-07-31"]), + ), + ), + # Test case 2: Normal results without "date" column + ( + [{"value": 10}, {"value": 20}], + pd.DataFrame({"value": [10, 20]}, index=pd.RangeIndex(start=0, stop=2)), + ), + # Test case 3: Empty results + ([], pd.DataFrame()), + # Test case 4: Results as None, should raise OpenBBError + (None, OpenBBError("Results not found.")), + ], +) +def test_to_dataframe(results, expected_df): + # Arrange + co = CommandOutput(results=results) + + # Act and Assert + if isinstance(expected_df, pd.DataFrame): + result = co.to_dataframe() + assert result.equals(expected_df) + else: + with pytest.raises(expected_df.__class__) as exc_info: + co.to_dataframe() + + assert str(exc_info.value) == str(expected_df) + + +@pytest.mark.parametrize( + "results, expected", + [ + # Test case 1: Normal results with "date" column + ( + [{"date": "2023-07-30", "value": 10}, {"date": "2023-07-31", "value": 20}], + { + "date": [pd.to_datetime("2023-07-30"), pd.to_datetime("2023-07-31")], + "value": [10, 20], + }, + ), + # Test case 2: Normal results without "date" column + ( + [{"value": 10}, {"value": 20}], + { + "value": [10, 20], + }, + ), + # Test case 3: Empty results + ([], {}), + ], +) +def test_to_dict(results, expected): + # Arrange + co = CommandOutput(results=results) + + # Act + result = co.to_dict() + result.pop("index", None) + + # Assert + assert result == expected + + +@patch("openbb_core.app.model.command_output.ChartingManager") +@patch("openbb_core.app.model.command_output.Chart") +def test_to_plotly_json_with_existing_chart(mock_chart, mock_charting_manager): + # Arrange + mock_instance = CommandOutput() + mock_instance.chart = Chart(content={"existing_chart_data": "some_data"}) + + # Act + result = mock_instance.to_plotly_json() + + # Assert + assert result == {"existing_chart_data": "some_data"} + + # Ensure ChartingManager and Chart constructors were not called + mock_charting_manager.assert_not_called() + mock_chart.assert_not_called() + + +@patch("openbb_core.app.model.command_output.CommandOutput.to_dataframe") +@patch("openbb_core.app.model.command_output.ChartingManager") +@patch("openbb_core.app.model.command_output.Chart") +def test_to_plotly_json_with_new_chart( + mock_chart, + mock_charting_manager, + mock_to_dataframe, +): + def get_mock_dataframe(): + data = { + "col1": [1, 2, 3], + "col2": ["a", "b", "c"], + "col3": [True, False, True], + } + + return pd.DataFrame(data) + + # Arrange + mock_instance = CommandOutput() + mock_charting_manager_instance = mock_charting_manager.return_value + mock_charting_manager_instance.to_plotly_json.return_value = { + "new_chart_data": "some_data" + } + mock_to_dataframe.return_value = get_mock_dataframe() + + # Act + result = mock_instance.to_plotly_json( + create_chart=True, chart_option="option_value" + ) + + # Assert + assert result == {"new_chart_data": "some_data"} + + # Ensure self.to_dataframe() was called + mock_to_dataframe.assert_called_once() + + # Ensure ChartingManager was called with the correct parameters + mock_charting_manager_instance.to_plotly_json.assert_called_once() + + # Ensure Chart constructor was called with the correct parameters + mock_chart.assert_called_once_with( + content={"new_chart_data": "some_data"}, format="plotly" + ) + + +def test_show_chart_exists(): + mock_instance = CommandOutput() + # Arrange + mock_instance.chart = MagicMock(spec=Chart) + + # Act + mock_instance.show() + + # Assert + mock_instance.chart.show.assert_called_once() + + +def test_show_chart_not_found(): + mock_instance = CommandOutput() + # Arrange + mock_instance.chart = None + + # Act and Assert + with pytest.raises(OpenBBError, match="Chart not found."): + mock_instance.show() From a6b2c1fac710d514da8ebf62d11b34dc95287272 Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Tue, 1 Aug 2023 14:04:25 +0100 Subject: [PATCH 60/98] ruff --- .../sdk/core/tests/app/model/test_command_context.py | 2 +- openbb_sdk/sdk/core/tests/app/model/test_command_output.py | 7 +++---- openbb_sdk/sdk/core/tests/app/model/test_credentials.py | 3 +-- openbb_sdk/sdk/core/tests/app/model/test_journal_entry.py | 6 ++---- openbb_sdk/sdk/core/tests/app/model/test_user_settings.py | 4 ++-- 5 files changed, 9 insertions(+), 13 deletions(-) diff --git a/openbb_sdk/sdk/core/tests/app/model/test_command_context.py b/openbb_sdk/sdk/core/tests/app/model/test_command_context.py index 4d86b5bff78..38a346b2387 100644 --- a/openbb_sdk/sdk/core/tests/app/model/test_command_context.py +++ b/openbb_sdk/sdk/core/tests/app/model/test_command_context.py @@ -1,7 +1,7 @@ from openbb_core.app.model.command_context import ( CommandContext, - UserSettings, SystemSettings, + UserSettings, ) diff --git a/openbb_sdk/sdk/core/tests/app/model/test_command_output.py b/openbb_sdk/sdk/core/tests/app/model/test_command_output.py index 4a2dd998f1a..82a9ea57322 100644 --- a/openbb_sdk/sdk/core/tests/app/model/test_command_output.py +++ b/openbb_sdk/sdk/core/tests/app/model/test_command_output.py @@ -1,9 +1,8 @@ -from openbb_core.app.model.command_output import CommandOutput, OpenBBError, Chart +from unittest.mock import MagicMock, patch -import pytest import pandas as pd - -from unittest.mock import patch, MagicMock +import pytest +from openbb_core.app.model.command_output import Chart, CommandOutput, OpenBBError def test_command_output(): diff --git a/openbb_sdk/sdk/core/tests/app/model/test_credentials.py b/openbb_sdk/sdk/core/tests/app/model/test_credentials.py index ba635a2174f..099142989d7 100644 --- a/openbb_sdk/sdk/core/tests/app/model/test_credentials.py +++ b/openbb_sdk/sdk/core/tests/app/model/test_credentials.py @@ -1,6 +1,5 @@ -from unittest.mock import patch - import typing +from unittest.mock import patch def test_credentials(): diff --git a/openbb_sdk/sdk/core/tests/app/model/test_journal_entry.py b/openbb_sdk/sdk/core/tests/app/model/test_journal_entry.py index b2a60221f25..b1fc6ecd234 100644 --- a/openbb_sdk/sdk/core/tests/app/model/test_journal_entry.py +++ b/openbb_sdk/sdk/core/tests/app/model/test_journal_entry.py @@ -1,9 +1,7 @@ -from openbb_core.app.model.journal_entry import JournalEntry - -from unittest.mock import Mock - import datetime +from openbb_core.app.model.journal_entry import JournalEntry + def test_journal_entry(): journal = JournalEntry( diff --git a/openbb_sdk/sdk/core/tests/app/model/test_user_settings.py b/openbb_sdk/sdk/core/tests/app/model/test_user_settings.py index 8651782d528..85fe58e1375 100644 --- a/openbb_sdk/sdk/core/tests/app/model/test_user_settings.py +++ b/openbb_sdk/sdk/core/tests/app/model/test_user_settings.py @@ -1,7 +1,7 @@ -from openbb_core.app.model.user_settings import UserSettings - from unittest.mock import MagicMock +from openbb_core.app.model.user_settings import UserSettings + def test_user_settings(): settings = UserSettings( From 3b5fc53cc770a4b6cc1bbd9a7390013d1167c2c6 Mon Sep 17 00:00:00 2001 From: Danglewood <85772166+deeleeramone@users.noreply.github.com> Date: Tue, 1 Aug 2023 06:41:21 -0700 Subject: [PATCH 61/98] Adds details/image for installing C++ Build Tools (#5268) * Adds details/image for installing C++ Build Tools * Update installation_updates.md with screenshots * Update installation_updates.md Screenshots for MS C++ Build Tools --- website/content/sdk/faqs/installation_updates.md | 10 ++++++++++ website/content/terminal/faqs/installation_updates.md | 4 ++++ website/content/terminal/installation/source.md | 11 +++++++++++ 3 files changed, 25 insertions(+) diff --git a/website/content/sdk/faqs/installation_updates.md b/website/content/sdk/faqs/installation_updates.md index 58498bb91d5..68651eec43a 100644 --- a/website/content/sdk/faqs/installation_updates.md +++ b/website/content/sdk/faqs/installation_updates.md @@ -32,6 +32,16 @@ import HeadTitle from '@site/src/components/General/HeadTitle.tsx'; ## Installation and Updates +
"Microsoft Visual C++ 14.0 or greater is required" + +Download and install [C++ Build Tools](https://visualstudio.microsoft.com/visual-cpp-build-tools/), restart the machine, then try again. + +![image](https://github.com/OpenBB-finance/OpenBBTerminal/assets/85772166/ceb57be0-6dae-42f2-aca6-bf62ce7d6135) + +![image](https://github.com/OpenBB-finance/OpenBBTerminal/assets/85772166/f8aef8fc-a080-4164-bd36-460714ec44f3) + +
+
Do I have to use Miniconda? There are certain dependencies which are sourced exclusively from the `conda-forge` directory. Other virtual environment managers, such a `venv`, may not solve the environment properly, resulting in failed package installations or incorrect builds. We highly recommend using Miniconda as the Python virtual environment manager for installing the OpenBB SDK. diff --git a/website/content/terminal/faqs/installation_updates.md b/website/content/terminal/faqs/installation_updates.md index 7c35712c2c2..c49bca56200 100644 --- a/website/content/terminal/faqs/installation_updates.md +++ b/website/content/terminal/faqs/installation_updates.md @@ -74,6 +74,10 @@ poetry install -E all Download and install [C++ Build Tools](https://visualstudio.microsoft.com/visual-cpp-build-tools/), restart the machine, then try again. +![image](https://github.com/OpenBB-finance/OpenBBTerminal/assets/85772166/ceb57be0-6dae-42f2-aca6-bf62ce7d6135) + +![image](https://github.com/OpenBB-finance/OpenBBTerminal/assets/85772166/f8aef8fc-a080-4164-bd36-460714ec44f3) +
Error: failed building wheel for bt diff --git a/website/content/terminal/installation/source.md b/website/content/terminal/installation/source.md index 540cf33657a..5f06c3b639f 100644 --- a/website/content/terminal/installation/source.md +++ b/website/content/terminal/installation/source.md @@ -59,6 +59,12 @@ If Miniconda is installed, a version number will be displayed, for example: conda 23.1.0 ``` +There is a good chance the version of Conda is not current. Update it with the command below: + +```shell +conda update -n base -c conda-forge conda +``` +
Git @@ -89,6 +95,11 @@ Or follow the instructions [here](https://git-scm.com/book/en/v2/Getting-Started Use the instructions [here](https://visualstudio.microsoft.com/visual-cpp-build-tools/) to install or update Microsoft C++ Build Tools. +![image](https://github.com/OpenBB-finance/OpenBBTerminal/assets/85772166/ceb57be0-6dae-42f2-aca6-bf62ce7d6135) + +![image](https://github.com/OpenBB-finance/OpenBBTerminal/assets/85772166/f8aef8fc-a080-4164-bd36-460714ec44f3) + +
Rosetta2 (Apple Silicon only) From a618e325ecaf3b789e557fecec8cf524daaab7ff Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Tue, 1 Aug 2023 14:52:32 +0100 Subject: [PATCH 62/98] tests for system settings --- .../tests/app/model/test_system_settings.py | 202 ++++++++++++++++++ 1 file changed, 202 insertions(+) diff --git a/openbb_sdk/sdk/core/tests/app/model/test_system_settings.py b/openbb_sdk/sdk/core/tests/app/model/test_system_settings.py index e69de29bb2d..1f4d33a862c 100644 --- a/openbb_sdk/sdk/core/tests/app/model/test_system_settings.py +++ b/openbb_sdk/sdk/core/tests/app/model/test_system_settings.py @@ -0,0 +1,202 @@ +from openbb_core.app.model.system_settings import SystemSettings +import os +import pytest +from unittest.mock import patch + + +def test_system_settings(): + sys = SystemSettings() + assert isinstance(sys, SystemSettings) + + +def test_create_openbb_directory_directory_and_files_not_exist(tmpdir): + # Arrange + values = { + "openbb_directory": str(tmpdir.join("openbb")), + "user_settings_path": str(tmpdir.join("user_settings.json")), + "system_settings_path": str(tmpdir.join("system_settings.json")), + } + + # Act + SystemSettings.create_openbb_directory(values) + + # Assert + assert os.path.exists(values["openbb_directory"]) + assert os.path.exists(values["user_settings_path"]) + assert os.path.exists(values["system_settings_path"]) + + +def test_create_openbb_directory_directory_exists_user_settings_missing(tmpdir): + # Arrange + values = { + "openbb_directory": str(tmpdir.join("openbb")), + "user_settings_path": str(tmpdir.join("user_settings.json")), + "system_settings_path": str(tmpdir.join("system_settings.json")), + } + + # Create the openbb directory + os.makedirs(values["openbb_directory"]) + + # Act + SystemSettings.create_openbb_directory(values) + + # Assert + assert os.path.exists(values["openbb_directory"]) + assert os.path.exists(values["user_settings_path"]) + assert os.path.exists(values["system_settings_path"]) + + +def test_create_openbb_directory_directory_exists_system_settings_missing(tmpdir): + # Arrange + values = { + "openbb_directory": str(tmpdir.join("openbb")), + "user_settings_path": str(tmpdir.join("user_settings.json")), + "system_settings_path": str(tmpdir.join("system_settings.json")), + } + + # Create the openbb directory + os.makedirs(values["openbb_directory"]) + + # Create the user_settings.json file + with open(values["user_settings_path"], "w") as f: + f.write("{}") + + # Act + SystemSettings.create_openbb_directory(values) + + # Assert + assert os.path.exists(values["openbb_directory"]) + assert os.path.exists(values["user_settings_path"]) + assert os.path.exists(values["system_settings_path"]) + + +@pytest.mark.parametrize( + "values, expected_handlers", + [ + # Test case: test_mode is True, logging_suppress is True + ( + { + "test_mode": True, + "logging_suppress": True, + "log_collect": True, + "logging_handlers": [], + }, + [], + ), + # Test case: test_mode is False, logging_suppress is True + ( + { + "test_mode": False, + "logging_suppress": True, + "log_collect": True, + "logging_handlers": [], + }, + [], + ), + # Test case: test_mode is False, logging_suppress is False, log_collect is True, + # and "posthog" handler is not present in logging_handlers + ( + { + "test_mode": False, + "logging_suppress": False, + "log_collect": True, + "logging_handlers": ["file", "console"], + }, + ["file", "console", "posthog"], + ), + # Test case: test_mode is False, logging_suppress is False, log_collect is True, + # and "posthog" handler is already present in logging_handlers + ( + { + "test_mode": False, + "logging_suppress": False, + "log_collect": True, + "logging_handlers": ["file", "console", "posthog"], + }, + ["file", "console", "posthog"], + ), + ], +) +def test_validate_posthog_handler(values, expected_handlers): + # Act + result = SystemSettings.validate_posthog_handler(values) + + # Assert + assert result["logging_handlers"] == expected_handlers + + +@pytest.mark.parametrize( + "handlers, valid", + [ + # Test case: Valid handlers + (["stdout", "file", "noop"], True), + # Test case: Invalid handler + (["stdout", "invalid_handler", "file"], False), + # Test case: Empty list of handlers + ([], True), + # Test case: Repeated valid handlers + (["stdout", "stderr", "stdout", "noop", "stderr"], True), + ], +) +def test_validate_logging_handlers(handlers, valid): + # Act and Assert + if valid: + assert SystemSettings.validate_logging_handlers(handlers) == handlers + else: + with pytest.raises(ValueError, match="Invalid logging handler"): + SystemSettings.validate_logging_handlers(handlers) + + +@pytest.mark.parametrize( + "commit_hash, expected_result", + [ + # Test case: Valid commit hash provided + ("1234567890", "1234567890"), + # Test case: Empty commit hash, mocked get_commit_hash returns "abcdef1234" + ("", "abcdef1234"), + ], +) +def test_validate_commit_hash(commit_hash, expected_result): + with patch( + "openbb_core.app.model.system_settings.get_commit_hash", + return_value="abcdef1234", + ): + # Act + result = SystemSettings.validate_commit_hash(commit_hash) + + # Assert + assert result == expected_result + + +@patch("openbb_core.app.model.system_settings.get_branch", return_value="main") +@pytest.mark.parametrize( + "branch, commit_hash, expected_branch", + [ + # Test case: Empty branch, non-empty commit hash + ("", "abcdef1234", "main"), + # Test case: Non-empty branch, non-empty commit hash + ("feature-branch", "abcdef1234", "feature-branch"), + # Test case: Empty branch, empty commit hash + ("", "", ""), + # Test case: Non-empty branch, empty commit hash + ("feature-branch", "", "feature-branch"), + ], +) +def test_validate_branch(mock_get_branch, branch, commit_hash, expected_branch): + # Arrange + values = { + "logging_branch": branch, + "logging_commit_hash": commit_hash, + } + + # Act + result = SystemSettings.validate_branch(values) + + # Assert + assert result["logging_branch"] == expected_branch + + # Ensure that get_branch was called with the correct commit_hash + if not branch and commit_hash: + mock_get_branch.assert_called_once_with(commit_hash) + else: + mock_get_branch.assert_not_called() From a7584c8a3d2398f662b01ad281deb07198bf5799 Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Tue, 1 Aug 2023 15:01:29 +0100 Subject: [PATCH 63/98] ruff --- openbb_sdk/sdk/core/tests/app/model/test_system_settings.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/openbb_sdk/sdk/core/tests/app/model/test_system_settings.py b/openbb_sdk/sdk/core/tests/app/model/test_system_settings.py index 1f4d33a862c..a34b124a24c 100644 --- a/openbb_sdk/sdk/core/tests/app/model/test_system_settings.py +++ b/openbb_sdk/sdk/core/tests/app/model/test_system_settings.py @@ -1,8 +1,9 @@ -from openbb_core.app.model.system_settings import SystemSettings import os -import pytest from unittest.mock import patch +import pytest +from openbb_core.app.model.system_settings import SystemSettings + def test_system_settings(): sys = SystemSettings() From 35dd4ec3f188ef82ef147420ad92b2f9fa8ca08a Mon Sep 17 00:00:00 2001 From: hjoaquim Date: Tue, 1 Aug 2023 15:44:12 +0100 Subject: [PATCH 64/98] black --- openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py | 1 - 1 file changed, 1 deletion(-) diff --git a/openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py b/openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py index 45233ce1c59..1995a8adbe0 100644 --- a/openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py +++ b/openbb_sdk/sdk/core/tests/app/logs/utils/test_system_utils.py @@ -1,7 +1,6 @@ # TODO : add tests once the code is fixed - def test_get_commit_hash(): pass From ae91a3f9b9cba56c18323091a266acfd6e1d7595 Mon Sep 17 00:00:00 2001 From: teh_coderer Date: Tue, 1 Aug 2023 11:05:29 -0500 Subject: [PATCH 65/98] Hotfix `economy/overview` rates displaying as dates (#5269) * fix: `economy/overview` rates displaying as dates * Fix Test --------- Co-authored-by: James Maslek --- .../tables/src/components/Table/index.tsx | 4 +- openbb_terminal/core/plots/table.html | 90 +++++++++---------- .../test_display_curve[YI].txt | 3 +- 3 files changed, 48 insertions(+), 49 deletions(-) diff --git a/frontend-components/tables/src/components/Table/index.tsx b/frontend-components/tables/src/components/Table/index.tsx index e948185ece6..ee46a822208 100644 --- a/frontend-components/tables/src/components/Table/index.tsx +++ b/frontend-components/tables/src/components/Table/index.tsx @@ -181,7 +181,7 @@ export default function Table({ : columns[0]; const indexValue = indexLabel ? row[indexLabel] : null; const value = row[column]; - const only_numbers = value?.toString().replace(/[^0-9]/g, "") ?? ""; + const only_numbers = value?.toString()?.split(".")?.pop()?.replace(/[^0-9]/g, "") ?? ""; const probablyDate = only_numbers?.length >= 4 && (includesDateNames(column) || @@ -219,7 +219,7 @@ export default function Table({ const indexValue = indexLabel ? row.original[indexLabel] : null; const value = row.original[column]; const valueType = typeof value; - const only_numbers = value?.toString().replace(/[^0-9]/g, "") ?? ""; + const only_numbers = value?.toString()?.split(".")?.pop()?.replace(/[^0-9]/g, "") ?? ""; const probablyDate = only_numbers?.length >= 4 && (includesDateNames(column) || diff --git a/openbb_terminal/core/plots/table.html b/openbb_terminal/core/plots/table.html index 98161f92834..351a979165b 100644 --- a/openbb_terminal/core/plots/table.html +++ b/openbb_terminal/core/plots/table.html @@ -79,7 +79,7 @@ } '];return t.cellXfs.forEach(function(n,i){var o=[];o.push(fe("NumberFormat",null,{"ss:Format":Be(rt[n.numFmtId])}));var a={"ss:ID":"s"+(21+i)};r.push(fe("Style",o.join(""),a))}),fe("Styles",r.join(""))}function Gw(e){return fe("NamedRange",null,{"ss:Name":e.Name,"ss:RefersTo":"="+Xd(e.Ref,{r:0,c:0})})}function GD(e){if(!((e||{}).Workbook||{}).Names)return"";for(var t=e.Workbook.Names,r=[],n=0;n"),e["!margins"].header&&i.push(fe("Header",null,{"x:Margin":e["!margins"].header})),e["!margins"].footer&&i.push(fe("Footer",null,{"x:Margin":e["!margins"].footer})),i.push(fe("PageMargins",null,{"x:Bottom":e["!margins"].bottom||"0.75","x:Left":e["!margins"].left||"0.7","x:Right":e["!margins"].right||"0.7","x:Top":e["!margins"].top||"0.75"})),i.push("")),n&&n.Workbook&&n.Workbook.Sheets&&n.Workbook.Sheets[r])if(n.Workbook.Sheets[r].Hidden)i.push(fe("Visible",n.Workbook.Sheets[r].Hidden==1?"SheetHidden":"SheetVeryHidden",{}));else{for(var o=0;o")}return((((n||{}).Workbook||{}).Views||[])[0]||{}).RTL&&i.push(""),e["!protect"]&&(i.push(Et("ProtectContents","True")),e["!protect"].objects&&i.push(Et("ProtectObjects","True")),e["!protect"].scenarios&&i.push(Et("ProtectScenarios","True")),e["!protect"].selectLockedCells!=null&&!e["!protect"].selectLockedCells?i.push(Et("EnableSelection","NoSelection")):e["!protect"].selectUnlockedCells!=null&&!e["!protect"].selectUnlockedCells&&i.push(Et("EnableSelection","UnlockedCells")),[["formatCells","AllowFormatCells"],["formatColumns","AllowSizeCols"],["formatRows","AllowSizeRows"],["insertColumns","AllowInsertCols"],["insertRows","AllowInsertRows"],["insertHyperlinks","AllowInsertHyperlinks"],["deleteColumns","AllowDeleteCols"],["deleteRows","AllowDeleteRows"],["sort","AllowSort"],["autoFilter","AllowFilter"],["pivotTables","AllowUsePivotTables"]].forEach(function(a){e["!protect"][a[0]]&&i.push("<"+a[1]+"/>")})),i.length==0?"":fe("WorksheetOptions",i.join(""),{xmlns:Qt.x})}function KD(e){return e.map(function(t){var r=Z4(t.t||""),n=fe("ss:Data",r,{xmlns:"http://www.w3.org/TR/REC-html40"});return fe("Comment",n,{"ss:Author":t.a})}).join("")}function YD(e,t,r,n,i,o,a){if(!e||e.v==null&&e.f==null)return"";var s={};if(e.f&&(s["ss:Formula"]="="+Be(Xd(e.f,a))),e.F&&e.F.slice(0,t.length)==t){var l=dt(e.F.slice(t.length+1));s["ss:ArrayRange"]="RC:R"+(l.r==a.r?"":"["+(l.r-a.r)+"]")+"C"+(l.c==a.c?"":"["+(l.c-a.c)+"]")}if(e.l&&e.l.Target&&(s["ss:HRef"]=Be(e.l.Target),e.l.Tooltip&&(s["x:HRefScreenTip"]=Be(e.l.Tooltip))),r["!merges"])for(var u=r["!merges"],c=0;c!=u.length;++c)u[c].s.c!=a.c||u[c].s.r!=a.r||(u[c].e.c>u[c].s.c&&(s["ss:MergeAcross"]=u[c].e.c-u[c].s.c),u[c].e.r>u[c].s.r&&(s["ss:MergeDown"]=u[c].e.r-u[c].s.r));var f="",d="";switch(e.t){case"z":if(!n.sheetStubs)return"";break;case"n":f="Number",d=String(e.v);break;case"b":f="Boolean",d=e.v?"1":"0";break;case"e":f="Error",d=ls[e.v];break;case"d":f="DateTime",d=new Date(e.v).toISOString(),e.z==null&&(e.z=e.z||rt[14]);break;case"s":f="String",d=Q4(e.v||"");break}var h=Wn(n.cellXfs,e,n);s["ss:StyleID"]="s"+(21+h),s["ss:Index"]=a.c+1;var m=e.v!=null?d:"",p=e.t=="z"?"":''+m+"";return(e.c||[]).length>0&&(p+=KD(e.c)),fe("Cell",p,s)}function qD(e,t){var r='"}function QD(e,t,r,n){if(!e["!ref"])return"";var i=Xe(e["!ref"]),o=e["!merges"]||[],a=0,s=[];e["!cols"]&&e["!cols"].forEach(function(g,v){Gd(g);var w=!!g.width,y=Ou(v,g),E={"ss:Index":v+1};w&&(E["ss:Width"]=Gl(y.width)),g.hidden&&(E["ss:Hidden"]="1"),s.push(fe("Column",null,E))});for(var l=Array.isArray(e),u=i.s.r;u<=i.e.r;++u){for(var c=[qD(u,(e["!rows"]||[])[u])],f=i.s.c;f<=i.e.c;++f){var d=!1;for(a=0;a!=o.length;++a)if(!(o[a].s.c>f)&&!(o[a].s.r>u)&&!(o[a].e.c"),c.length>2&&s.push(c.join(""))}return s.join("")}function ZD(e,t,r){var n=[],i=r.SheetNames[e],o=r.Sheets[i],a=o?jD(o,t,e,r):"";return a.length>0&&n.push(""+a+""),a=o?QD(o,t,e,r):"",a.length>0&&n.push(""+a+"
"),n.push(XD(o,t,e,r)),n.join("")}function JD(e,t){t||(t={}),e.SSF||(e.SSF=Kt(rt)),e.SSF&&(_u(),Su(e.SSF),t.revssf=Tu(e.SSF),t.revssf[e.SSF[65535]]=0,t.ssf=e.SSF,t.cellXfs=[],Wn(t.cellXfs,{},{revssf:{General:0}}));var r=[];r.push(VD(e,t)),r.push(WD()),r.push(""),r.push("");for(var n=0;n-1||dw.indexOf(i[o][0])>-1||i[o][1]!=null&&u.push(i[o]);n.length&&He.utils.cfb_add(t,"/SummaryInformation",Bg(n,Mc.SI,l,kg)),(r.length||u.length)&&He.utils.cfb_add(t,"/DocumentSummaryInformation",Bg(r,Mc.DSI,s,bg,u.length?u:null,Mc.UDI))}function t6(e,t){var r=t||{},n=He.utils.cfb_new({root:"R"}),i="/Workbook";switch(r.bookType||"xls"){case"xls":r.bookType="biff8";case"xla":r.bookType||(r.bookType="xla");case"biff8":i="/Workbook",r.biff=8;break;case"biff5":i="/Book",r.biff=5;break;default:throw new Error("invalid type "+r.bookType+" for XLS CFB")}return He.utils.cfb_add(n,i,jw(e,r)),r.biff==8&&(e.Props||e.Custprops)&&e6(e,n),r.biff==8&&e.vbaraw&&wR(n,He.read(e.vbaraw,{type:typeof e.vbaraw=="string"?"binary":"buffer"})),n}var r6={0:{f:oF},1:{f:hF},2:{f:bF},3:{f:EF},4:{f:vF},5:{f:FF},6:{f:LF},7:{f:CF},8:{f:GF},9:{f:zF},10:{f:VF},11:{f:WF},12:{f:gF},13:{f:$F},14:{f:_F},15:{f:wF},16:{f:PF},17:{f:UF},18:{f:RF},19:{f:Hd},20:{},21:{},22:{},23:{},24:{},25:{},26:{},27:{},28:{},29:{},30:{},31:{},32:{},33:{},34:{},35:{T:1},36:{T:-1},37:{T:1},38:{T:-1},39:{f:DD},40:{},42:{},43:{f:LA},44:{f:NA},45:{f:HA},46:{f:WA},47:{f:VA},48:{},49:{f:g3},50:{},51:{f:oR},52:{T:1},53:{T:-1},54:{T:1},55:{T:-1},56:{T:1},57:{T:-1},58:{},59:{},60:{f:mA},62:{f:MF},63:{f:fR},64:{f:sD},65:{},66:{},67:{},68:{},69:{},70:{},128:{},129:{T:1},130:{T:-1},131:{T:1,f:$r,p:0},132:{T:-1},133:{T:1},134:{T:-1},135:{T:1},136:{T:-1},137:{T:1,f:nD},138:{T:-1},139:{T:1},140:{T:-1},141:{T:1},142:{T:-1},143:{T:1},144:{T:-1},145:{T:1},146:{T:-1},147:{f:fF},148:{f:lF,p:16},151:{f:QF},152:{},153:{f:OD},154:{},155:{},156:{f:AD},157:{},158:{},159:{T:1,f:AA},160:{T:-1},161:{T:1,f:_i},162:{T:-1},163:{T:1},164:{T:-1},165:{T:1},166:{T:-1},167:{},168:{},169:{},170:{},171:{},172:{T:1},173:{T:-1},174:{},175:{},176:{f:jF},177:{T:1},178:{T:-1},179:{T:1},180:{T:-1},181:{T:1},182:{T:-1},183:{T:1},184:{T:-1},185:{T:1},186:{T:-1},187:{T:1},188:{T:-1},189:{T:1},190:{T:-1},191:{T:1},192:{T:-1},193:{T:1},194:{T:-1},195:{T:1},196:{T:-1},197:{T:1},198:{T:-1},199:{T:1},200:{T:-1},201:{T:1},202:{T:-1},203:{T:1},204:{T:-1},205:{T:1},206:{T:-1},207:{T:1},208:{T:-1},209:{T:1},210:{T:-1},211:{T:1},212:{T:-1},213:{T:1},214:{T:-1},215:{T:1},216:{T:-1},217:{T:1},218:{T:-1},219:{T:1},220:{T:-1},221:{T:1},222:{T:-1},223:{T:1},224:{T:-1},225:{T:1},226:{T:-1},227:{T:1},228:{T:-1},229:{T:1},230:{T:-1},231:{T:1},232:{T:-1},233:{T:1},234:{T:-1},235:{T:1},236:{T:-1},237:{T:1},238:{T:-1},239:{T:1},240:{T:-1},241:{T:1},242:{T:-1},243:{T:1},244:{T:-1},245:{T:1},246:{T:-1},247:{T:1},248:{T:-1},249:{T:1},250:{T:-1},251:{T:1},252:{T:-1},253:{T:1},254:{T:-1},255:{T:1},256:{T:-1},257:{T:1},258:{T:-1},259:{T:1},260:{T:-1},261:{T:1},262:{T:-1},263:{T:1},264:{T:-1},265:{T:1},266:{T:-1},267:{T:1},268:{T:-1},269:{T:1},270:{T:-1},271:{T:1},272:{T:-1},273:{T:1},274:{T:-1},275:{T:1},276:{T:-1},277:{},278:{T:1},279:{T:-1},280:{T:1},281:{T:-1},282:{T:1},283:{T:1},284:{T:-1},285:{T:1},286:{T:-1},287:{T:1},288:{T:-1},289:{T:1},290:{T:-1},291:{T:1},292:{T:-1},293:{T:1},294:{T:-1},295:{T:1},296:{T:-1},297:{T:1},298:{T:-1},299:{T:1},300:{T:-1},301:{T:1},302:{T:-1},303:{T:1},304:{T:-1},305:{T:1},306:{T:-1},307:{T:1},308:{T:-1},309:{T:1},310:{T:-1},311:{T:1},312:{T:-1},313:{T:-1},314:{T:1},315:{T:-1},316:{T:1},317:{T:-1},318:{T:1},319:{T:-1},320:{T:1},321:{T:-1},322:{T:1},323:{T:-1},324:{T:1},325:{T:-1},326:{T:1},327:{T:-1},328:{T:1},329:{T:-1},330:{T:1},331:{T:-1},332:{T:1},333:{T:-1},334:{T:1},335:{f:nR},336:{T:-1},337:{f:lR,T:1},338:{T:-1},339:{T:1},340:{T:-1},341:{T:1},342:{T:-1},343:{T:1},344:{T:-1},345:{T:1},346:{T:-1},347:{T:1},348:{T:-1},349:{T:1},350:{T:-1},351:{},352:{},353:{T:1},354:{T:-1},355:{f:Jf},357:{},358:{},359:{},360:{T:1},361:{},362:{f:cA},363:{},364:{},366:{},367:{},368:{},369:{},370:{},371:{},372:{T:1},373:{T:-1},374:{T:1},375:{T:-1},376:{T:1},377:{T:-1},378:{T:1},379:{T:-1},380:{T:1},381:{T:-1},382:{T:1},383:{T:-1},384:{T:1},385:{T:-1},386:{T:1},387:{T:-1},388:{T:1},389:{T:-1},390:{T:1},391:{T:-1},392:{T:1},393:{T:-1},394:{T:1},395:{T:-1},396:{},397:{},398:{},399:{},400:{},401:{T:1},403:{},404:{},405:{},406:{},407:{},408:{},409:{},410:{},411:{},412:{},413:{},414:{},415:{},416:{},417:{},418:{},419:{},420:{},421:{},422:{T:1},423:{T:1},424:{T:-1},425:{T:-1},426:{f:ZF},427:{f:JF},428:{},429:{T:1},430:{T:-1},431:{T:1},432:{T:-1},433:{T:1},434:{T:-1},435:{T:1},436:{T:-1},437:{T:1},438:{T:-1},439:{T:1},440:{T:-1},441:{T:1},442:{T:-1},443:{T:1},444:{T:-1},445:{T:1},446:{T:-1},447:{T:1},448:{T:-1},449:{T:1},450:{T:-1},451:{T:1},452:{T:-1},453:{T:1},454:{T:-1},455:{T:1},456:{T:-1},457:{T:1},458:{T:-1},459:{T:1},460:{T:-1},461:{T:1},462:{T:-1},463:{T:1},464:{T:-1},465:{T:1},466:{T:-1},467:{T:1},468:{T:-1},469:{T:1},470:{T:-1},471:{},472:{},473:{T:1},474:{T:-1},475:{},476:{f:tD},477:{},478:{},479:{T:1},480:{T:-1},481:{T:1},482:{T:-1},483:{T:1},484:{T:-1},485:{f:cF},486:{T:1},487:{T:-1},488:{T:1},489:{T:-1},490:{T:1},491:{T:-1},492:{T:1},493:{T:-1},494:{f:YF},495:{T:1},496:{T:-1},497:{T:1},498:{T:-1},499:{},500:{T:1},501:{T:-1},502:{T:1},503:{T:-1},504:{},505:{T:1},506:{T:-1},507:{},508:{T:1},509:{T:-1},510:{T:1},511:{T:-1},512:{},513:{},514:{T:1},515:{T:-1},516:{T:1},517:{T:-1},518:{T:1},519:{T:-1},520:{T:1},521:{T:-1},522:{},523:{},524:{},525:{},526:{},527:{},528:{T:1},529:{T:-1},530:{T:1},531:{T:-1},532:{T:1},533:{T:-1},534:{},535:{},536:{},537:{},538:{T:1},539:{T:-1},540:{T:1},541:{T:-1},542:{T:1},548:{},549:{},550:{f:Jf},551:{},552:{},553:{},554:{T:1},555:{T:-1},556:{T:1},557:{T:-1},558:{T:1},559:{T:-1},560:{T:1},561:{T:-1},562:{},564:{},565:{T:1},566:{T:-1},569:{T:1},570:{T:-1},572:{},573:{T:1},574:{T:-1},577:{},578:{},579:{},580:{},581:{},582:{},583:{},584:{},585:{},586:{},587:{},588:{T:-1},589:{},590:{T:1},591:{T:-1},592:{T:1},593:{T:-1},594:{T:1},595:{T:-1},596:{},597:{T:1},598:{T:-1},599:{T:1},600:{T:-1},601:{T:1},602:{T:-1},603:{T:1},604:{T:-1},605:{T:1},606:{T:-1},607:{},608:{T:1},609:{T:-1},610:{},611:{T:1},612:{T:-1},613:{T:1},614:{T:-1},615:{T:1},616:{T:-1},617:{T:1},618:{T:-1},619:{T:1},620:{T:-1},625:{},626:{T:1},627:{T:-1},628:{T:1},629:{T:-1},630:{T:1},631:{T:-1},632:{f:mR},633:{T:1},634:{T:-1},635:{T:1,f:pR},636:{T:-1},637:{f:w3},638:{T:1},639:{},640:{T:-1},641:{T:1},642:{T:-1},643:{T:1},644:{},645:{T:-1},646:{T:1},648:{T:1},649:{},650:{T:-1},651:{f:yD},652:{},653:{T:1},654:{T:-1},655:{T:1},656:{T:-1},657:{T:1},658:{T:-1},659:{},660:{T:1},661:{},662:{T:-1},663:{},664:{T:1},665:{},666:{T:-1},667:{},668:{},669:{},671:{T:1},672:{T:-1},673:{T:1},674:{T:-1},675:{},676:{},677:{},678:{},679:{},680:{},681:{},1024:{},1025:{},1026:{T:1},1027:{T:-1},1028:{T:1},1029:{T:-1},1030:{},1031:{T:1},1032:{T:-1},1033:{T:1},1034:{T:-1},1035:{},1036:{},1037:{},1038:{T:1},1039:{T:-1},1040:{},1041:{T:1},1042:{T:-1},1043:{},1044:{},1045:{},1046:{T:1},1047:{T:-1},1048:{T:1},1049:{T:-1},1050:{},1051:{T:1},1052:{T:1},1053:{f:lD},1054:{T:1},1055:{},1056:{T:1},1057:{T:-1},1058:{T:1},1059:{T:-1},1061:{},1062:{T:1},1063:{T:-1},1064:{T:1},1065:{T:-1},1066:{T:1},1067:{T:-1},1068:{T:1},1069:{T:-1},1070:{T:1},1071:{T:-1},1072:{T:1},1073:{T:-1},1075:{T:1},1076:{T:-1},1077:{T:1},1078:{T:-1},1079:{T:1},1080:{T:-1},1081:{T:1},1082:{T:-1},1083:{T:1},1084:{T:-1},1085:{},1086:{T:1},1087:{T:-1},1088:{T:1},1089:{T:-1},1090:{T:1},1091:{T:-1},1092:{T:1},1093:{T:-1},1094:{T:1},1095:{T:-1},1096:{},1097:{T:1},1098:{},1099:{T:-1},1100:{T:1},1101:{T:-1},1102:{},1103:{},1104:{},1105:{},1111:{},1112:{},1113:{T:1},1114:{T:-1},1115:{T:1},1116:{T:-1},1117:{},1118:{T:1},1119:{T:-1},1120:{T:1},1121:{T:-1},1122:{T:1},1123:{T:-1},1124:{T:1},1125:{T:-1},1126:{},1128:{T:1},1129:{T:-1},1130:{},1131:{T:1},1132:{T:-1},1133:{T:1},1134:{T:-1},1135:{T:1},1136:{T:-1},1137:{T:1},1138:{T:-1},1139:{T:1},1140:{T:-1},1141:{},1142:{T:1},1143:{T:-1},1144:{T:1},1145:{T:-1},1146:{},1147:{T:1},1148:{T:-1},1149:{T:1},1150:{T:-1},1152:{T:1},1153:{T:-1},1154:{T:-1},1155:{T:-1},1156:{T:-1},1157:{T:1},1158:{T:-1},1159:{T:1},1160:{T:-1},1161:{T:1},1162:{T:-1},1163:{T:1},1164:{T:-1},1165:{T:1},1166:{T:-1},1167:{T:1},1168:{T:-1},1169:{T:1},1170:{T:-1},1171:{},1172:{T:1},1173:{T:-1},1177:{},1178:{T:1},1180:{},1181:{},1182:{},2048:{T:1},2049:{T:-1},2050:{},2051:{T:1},2052:{T:-1},2053:{},2054:{},2055:{T:1},2056:{T:-1},2057:{T:1},2058:{T:-1},2060:{},2067:{},2068:{T:1},2069:{T:-1},2070:{},2071:{},2072:{T:1},2073:{T:-1},2075:{},2076:{},2077:{T:1},2078:{T:-1},2079:{},2080:{T:1},2081:{T:-1},2082:{},2083:{T:1},2084:{T:-1},2085:{T:1},2086:{T:-1},2087:{T:1},2088:{T:-1},2089:{T:1},2090:{T:-1},2091:{},2092:{},2093:{T:1},2094:{T:-1},2095:{},2096:{T:1},2097:{T:-1},2098:{T:1},2099:{T:-1},2100:{T:1},2101:{T:-1},2102:{},2103:{T:1},2104:{T:-1},2105:{},2106:{T:1},2107:{T:-1},2108:{},2109:{T:1},2110:{T:-1},2111:{T:1},2112:{T:-1},2113:{T:1},2114:{T:-1},2115:{},2116:{},2117:{},2118:{T:1},2119:{T:-1},2120:{},2121:{T:1},2122:{T:-1},2123:{T:1},2124:{T:-1},2125:{},2126:{T:1},2127:{T:-1},2128:{},2129:{T:1},2130:{T:-1},2131:{T:1},2132:{T:-1},2133:{T:1},2134:{},2135:{},2136:{},2137:{T:1},2138:{T:-1},2139:{T:1},2140:{T:-1},2141:{},3072:{},3073:{},4096:{T:1},4097:{T:-1},5002:{T:1},5003:{T:-1},5081:{T:1},5082:{T:-1},5083:{},5084:{T:1},5085:{T:-1},5086:{T:1},5087:{T:-1},5088:{},5089:{},5090:{},5092:{T:1},5093:{T:-1},5094:{},5095:{T:1},5096:{T:-1},5097:{},5099:{},65535:{n:""}};function de(e,t,r,n){var i=t;if(!isNaN(i)){var o=n||(r||[]).length||0,a=e.next(4);a.write_shift(2,i),a.write_shift(2,o),o>0&&Ld(r)&&e.push(r)}}function n6(e,t,r,n){var i=n||(r||[]).length||0;if(i<=8224)return de(e,t,r,i);var o=t;if(!isNaN(o)){for(var a=r.parts||[],s=0,l=0,u=0;u+(a[s]||8224)<=8224;)u+=a[s]||8224,s++;var c=e.next(4);for(c.write_shift(2,o),c.write_shift(2,u),e.push(r.slice(l,l+u)),l+=u;l=0&&i<65536?de(e,2,yA(r,n,i)):de(e,3,wA(r,n,i));return;case"b":case"e":de(e,5,i6(r,n,t.v,t.t));return;case"s":case"str":de(e,4,o6(r,n,(t.v||"").slice(0,255)));return}de(e,1,cs(null,r,n))}function s6(e,t,r,n){var i=Array.isArray(t),o=Xe(t["!ref"]||"A1"),a,s="",l=[];if(o.e.c>255||o.e.r>16383){if(n.WTF)throw new Error("Range "+(t["!ref"]||"A1")+" exceeds format limit A1:IV16384");o.e.c=Math.min(o.e.c,255),o.e.r=Math.min(o.e.c,16383),a=ot(o)}for(var u=o.s.r;u<=o.e.r;++u){s=St(u);for(var c=o.s.c;c<=o.e.c;++c){u===o.s.r&&(l[c]=Ft(c)),a=l[c]+s;var f=i?(t[u]||[])[c]:t[a];f&&a6(e,f,u,c)}}}function l6(e,t){for(var r=t||{},n=jt(),i=0,o=0;o255||h.e.r>=m){if(t.WTF)throw new Error("Range "+(o["!ref"]||"A1")+" exceeds format limit A1:IV16384");h.e.c=Math.min(h.e.c,255),h.e.r=Math.min(h.e.c,m-1)}de(n,2057,zd(r,16,t)),de(n,13,ar(1)),de(n,12,ar(100)),de(n,15,$t(!0)),de(n,17,$t(!1)),de(n,16,li(.001)),de(n,95,$t(!0)),de(n,42,$t(!1)),de(n,43,$t(!1)),de(n,130,ar(1)),de(n,128,sA([0,0])),de(n,131,$t(!1)),de(n,132,$t(!1)),u&&p6(n,o["!cols"]),de(n,512,aA(h,t)),u&&(o["!links"]=[]);for(var p=h.s.r;p<=h.e.r;++p){f=St(p);for(var g=h.s.c;g<=h.e.c;++g){p===h.s.r&&(d[g]=Ft(g)),c=d[g]+f;var v=l?(o[p]||[])[g]:o[c];v&&(g6(n,v,p,g,t),u&&v.l&&o["!links"].push([c,v.l]))}}var w=s.CodeName||s.name||i;return u&&de(n,574,tA((a.Views||[])[0])),u&&(o["!merges"]||[]).length&&de(n,229,dA(o["!merges"])),u&&h6(n,o),de(n,442,ww(w)),u&&f6(n,o),de(n,10),n.end()}function v6(e,t,r){var n=jt(),i=(e||{}).Workbook||{},o=i.Sheets||[],a=i.WBProps||{},s=r.biff==8,l=r.biff==5;if(de(n,2057,zd(e,5,r)),r.bookType=="xla"&&de(n,135),de(n,225,s?ar(1200):null),de(n,193,V3(2)),l&&de(n,191),l&&de(n,192),de(n,226),de(n,92,Q3("SheetJS",r)),de(n,66,ar(s?1200:1252)),s&&de(n,353,ar(0)),s&&de(n,448),de(n,317,xA(e.SheetNames.length)),s&&e.vbaraw&&de(n,211),s&&e.vbaraw){var u=a.CodeName||"ThisWorkbook";de(n,442,ww(u))}de(n,156,ar(17)),de(n,25,$t(!1)),de(n,18,$t(!1)),de(n,19,ar(0)),s&&de(n,431,$t(!1)),s&&de(n,444,ar(0)),de(n,61,eA()),de(n,64,$t(!1)),de(n,141,ar(0)),de(n,34,$t(SD(e)=="true")),de(n,14,$t(!0)),s&&de(n,439,$t(!1)),de(n,218,ar(0)),u6(n,e,r),c6(n,e.SSF,r),d6(n,r),s&&de(n,352,$t(!1));var c=n.end(),f=jt();s&&de(f,140,gA()),s&&r.Strings&&n6(f,252,J3(r.Strings)),de(f,10);var d=f.end(),h=jt(),m=0,p=0;for(p=0;p255&&typeof console<"u"&&console.error&&console.error("Worksheet '"+e.SheetNames[r]+"' extends beyond column IV (255). Data may be lost.")}}var o=t||{};switch(o.biff||2){case 8:case 5:return x6(e,t);case 4:case 3:case 2:return l6(e,t)}throw new Error("invalid type "+o.bookType+" for BIFF")}function w6(e,t,r,n){for(var i=e["!merges"]||[],o=[],a=t.s.c;a<=t.e.c;++a){for(var s=0,l=0,u=0;ur||i[u].s.c>a)&&!(i[u].e.r1&&(h.rowspan=s),l>1&&(h.colspan=l),n.editable?d=''+d+"":f&&(h["data-t"]=f&&f.t||"z",f.v!=null&&(h["data-v"]=f.v),f.z!=null&&(h["data-z"]=f.z),f.l&&(f.l.Target||"#").charAt(0)!="#"&&(d=''+d+"")),h.id=(n.id||"sjs")+"-"+c,o.push(fe("td",d,h))}}var m="";return m+o.join("")+""}var y6='SheetJS Table Export',E6="";function S6(e,t,r){var n=[];return n.join("")+""}function Xw(e,t){var r=t||{},n=r.header!=null?r.header:y6,i=r.footer!=null?r.footer:E6,o=[n],a=tr(e["!ref"]);r.dense=Array.isArray(e),o.push(S6(e,a,r));for(var s=a.s.r;s<=a.e.r;++s)o.push(w6(e,a,s,r));return o.push(""+i),o.join("")}function Kw(e,t,r){var n=r||{},i=0,o=0;if(n.origin!=null)if(typeof n.origin=="number")i=n.origin;else{var a=typeof n.origin=="string"?dt(n.origin):n.origin;i=a.r,o=a.c}var s=t.getElementsByTagName("tr"),l=Math.min(n.sheetRows||1e7,s.length),u={s:{r:0,c:0},e:{r:i,c:o}};if(e["!ref"]){var c=tr(e["!ref"]);u.s.r=Math.min(u.s.r,c.s.r),u.s.c=Math.min(u.s.c,c.s.c),u.e.r=Math.max(u.e.r,c.e.r),u.e.c=Math.max(u.e.c,c.e.c),i==-1&&(u.e.r=i=c.e.r+1)}var f=[],d=0,h=e["!rows"]||(e["!rows"]=[]),m=0,p=0,g=0,v=0,w=0,y=0;for(e["!cols"]||(e["!cols"]=[]);m1||y>1)&&f.push({s:{r:p+i,c:v+o},e:{r:p+i+(w||1)-1,c:v+o+(y||1)-1}});var L={t:"s",v:_},B=k.getAttribute("data-t")||k.getAttribute("t")||"";_!=null&&(_.length==0?L.t=B||"z":n.raw||_.trim().length==0||B=="s"||(_==="TRUE"?L={t:"b",v:!0}:_==="FALSE"?L={t:"b",v:!1}:isNaN(Qr(_))?isNaN(za(_).getDate())||(L={t:"d",v:Lt(_)},n.cellDates||(L={t:"n",v:Xt(L.v)}),L.z=n.dateNF||rt[14]):L={t:"n",v:Qr(_)})),L.z===void 0&&C!=null&&(L.z=C);var U="",H=k.getElementsByTagName("A");if(H&&H.length)for(var G=0;G=l&&(e["!fullref"]=ot((u.e.r=s.length-m+p-1+i,u))),e}function Yw(e,t){var r=t||{},n=r.dense?[]:{};return Kw(n,e,t)}function _6(e,t){return wi(Yw(e,t),t)}function Kg(e){var t="",r=T6(e);return r&&(t=r(e).getPropertyValue("display")),t||(t=e.style&&e.style.display),t==="none"}function T6(e){return e.ownerDocument.defaultView&&typeof e.ownerDocument.defaultView.getComputedStyle=="function"?e.ownerDocument.defaultView.getComputedStyle:typeof getComputedStyle=="function"?getComputedStyle:null}var C6=function(){var e=["",'',"",'',"",'',"",""].join(""),t=""+e+"";return function(){return at+t}}(),Yg=function(){var e=function(o){return Be(o).replace(/ +/g,function(a){return''}).replace(/\t/g,"").replace(/\n/g,"").replace(/^ /,"").replace(/ $/,"")},t=` +`;t.push(Et("t",Be(a)))}t.push("")}),t.push(""),t.length>2&&(t[t.length]="",t[1]=t[1].replace("/>",">")),t.join("")}function dR(e,t,r){var n=[at,fe("ThreadedComments",null,{xmlns:ft.TCMNT}).replace(/[\/]>/,">")];return e.forEach(function(i){var o="";(i[1]||[]).forEach(function(a,s){if(!a.T){delete a.ID;return}a.a&&t.indexOf(a.a)==-1&&t.push(a.a);var l={ref:i[0],id:"{54EE7951-7262-4200-6969-"+("000000000000"+r.tcid++).slice(-12)+"}"};s==0?o=l.id:l.parentId=o,a.ID=l.id,a.a&&(l.personId="{54EE7950-7262-4200-6969-"+("000000000000"+t.indexOf(a.a)).slice(-12)+"}"),n.push(fe("threadedComment",Et("text",a.t||""),l))})}),n.push(""),n.join("")}function hR(e){var t=[at,fe("personList",null,{xmlns:ft.TCMNT,"xmlns:x":Oo[0]}).replace(/[\/]>/,">")];return e.forEach(function(r,n){t.push(fe("person",null,{displayName:r,id:"{54EE7950-7262-4200-6969-"+("000000000000"+n).slice(-12)+"}",userId:r,providerId:"None"}))}),t.push(""),t.join("")}function pR(e){var t={};t.iauthor=e.read_shift(4);var r=Si(e);return t.rfx=r.s,t.ref=Ue(r.s),e.l+=16,t}function gR(e,t){return t==null&&(t=Z(36)),t.write_shift(4,e[1].iauthor),Do(e[0],t),t.write_shift(4,0),t.write_shift(4,0),t.write_shift(4,0),t.write_shift(4,0),t}var mR=Dt;function vR(e){return ht(e.slice(0,54))}function xR(e){var t=jt(),r=[];return ie(t,628),ie(t,630),e.forEach(function(n){n[1].forEach(function(i){r.indexOf(i.a)>-1||(r.push(i.a.slice(0,54)),ie(t,632,vR(i.a)))})}),ie(t,631),ie(t,633),e.forEach(function(n){n[1].forEach(function(i){i.iauthor=r.indexOf(i.a);var o={s:dt(n[0]),e:dt(n[0])};ie(t,635,gR([o,i])),i.t&&i.t.length>0&&ie(t,637,y3(i)),ie(t,636),delete i.iauthor})}),ie(t,634),ie(t,629),t.end()}function wR(e,t){t.FullPaths.forEach(function(r,n){if(n!=0){var i=r.replace(/[^\/]*[\/]/,"/_VBA_PROJECT_CUR/");i.slice(-1)!=="/"&&He.utils.cfb_add(e,i,t.FileIndex[n].content)}})}var Iw=["xlsb","xlsm","xlam","biff8","xla"],yR=function(){var e=/(^|[^A-Za-z_])R(\[?-?\d+\]|[1-9]\d*|)C(\[?-?\d+\]|[1-9]\d*|)(?![A-Za-z0-9_])/g,t={r:0,c:0};function r(n,i,o,a){var s=!1,l=!1;o.length==0?l=!0:o.charAt(0)=="["&&(l=!0,o=o.slice(1,-1)),a.length==0?s=!0:a.charAt(0)=="["&&(s=!0,a=a.slice(1,-1));var u=o.length>0?parseInt(o,10)|0:0,c=a.length>0?parseInt(a,10)|0:0;return s?c+=t.c:--c,l?u+=t.r:--u,i+(s?"":"$")+Ft(c)+(l?"":"$")+_t(u)}return function(i,o){return t=o,i.replace(e,r)}}(),jd=/(^|[^._A-Z0-9])([$]?)([A-Z]{1,2}|[A-W][A-Z]{2}|X[A-E][A-Z]|XF[A-D])([$]?)(10[0-3]\d{4}|104[0-7]\d{3}|1048[0-4]\d{2}|10485[0-6]\d|104857[0-6]|[1-9]\d{0,5})(?![_.\(A-Za-z0-9])/g,Xd=function(){return function(t,r){return t.replace(jd,function(n,i,o,a,s,l){var u=Ud(a)-(o?0:r.c),c=Bd(l)-(s?0:r.r),f=c==0?"":s?c+1:"["+c+"]",d=u==0?"":o?u+1:"["+u+"]";return i+"R"+f+"C"+d})}}();function ER(e,t){return e.replace(jd,function(r,n,i,o,a,s){return n+(i=="$"?i+o:Ft(Ud(o)+t.c))+(a=="$"?a+s:_t(Bd(s)+t.r))})}function _R(e){return e.length!=1}function it(e){e.l+=1}function Mn(e,t){var r=e.read_shift(t==1?1:2);return[r&16383,r>>14&1,r>>15&1]}function bw(e,t,r){var n=2;if(r){if(r.biff>=2&&r.biff<=5)return kw(e);r.biff==12&&(n=4)}var i=e.read_shift(n),o=e.read_shift(n),a=Mn(e,2),s=Mn(e,2);return{s:{r:i,c:a[0],cRel:a[1],rRel:a[2]},e:{r:o,c:s[0],cRel:s[1],rRel:s[2]}}}function kw(e){var t=Mn(e,2),r=Mn(e,2),n=e.read_shift(1),i=e.read_shift(1);return{s:{r:t[0],c:n,cRel:t[1],rRel:t[2]},e:{r:r[0],c:i,cRel:r[1],rRel:r[2]}}}function SR(e,t,r){if(r.biff<8)return kw(e);var n=e.read_shift(r.biff==12?4:2),i=e.read_shift(r.biff==12?4:2),o=Mn(e,2),a=Mn(e,2);return{s:{r:n,c:o[0],cRel:o[1],rRel:o[2]},e:{r:i,c:a[0],cRel:a[1],rRel:a[2]}}}function $w(e,t,r){if(r&&r.biff>=2&&r.biff<=5)return TR(e);var n=e.read_shift(r&&r.biff==12?4:2),i=Mn(e,2);return{r:n,c:i[0],cRel:i[1],rRel:i[2]}}function TR(e){var t=Mn(e,2),r=e.read_shift(1);return{r:t[0],c:r,cRel:t[1],rRel:t[2]}}function CR(e){var t=e.read_shift(2),r=e.read_shift(2);return{r:t,c:r&255,fQuoted:!!(r&16384),cRel:r>>15,rRel:r>>15}}function AR(e,t,r){var n=r&&r.biff?r.biff:8;if(n>=2&&n<=5)return RR(e);var i=e.read_shift(n>=12?4:2),o=e.read_shift(2),a=(o&16384)>>14,s=(o&32768)>>15;if(o&=16383,s==1)for(;i>524287;)i-=1048576;if(a==1)for(;o>8191;)o=o-16384;return{r:i,c:o,cRel:a,rRel:s}}function RR(e){var t=e.read_shift(2),r=e.read_shift(1),n=(t&32768)>>15,i=(t&16384)>>14;return t&=16383,n==1&&t>=8192&&(t=t-16384),i==1&&r>=128&&(r=r-256),{r:t,c:r,cRel:i,rRel:n}}function OR(e,t,r){var n=(e[e.l++]&96)>>5,i=bw(e,r.biff>=2&&r.biff<=5?6:8,r);return[n,i]}function FR(e,t,r){var n=(e[e.l++]&96)>>5,i=e.read_shift(2,"i"),o=8;if(r)switch(r.biff){case 5:e.l+=12,o=6;break;case 12:o=12;break}var a=bw(e,o,r);return[n,i,a]}function DR(e,t,r){var n=(e[e.l++]&96)>>5;return e.l+=r&&r.biff>8?12:r.biff<8?6:8,[n]}function PR(e,t,r){var n=(e[e.l++]&96)>>5,i=e.read_shift(2),o=8;if(r)switch(r.biff){case 5:e.l+=12,o=6;break;case 12:o=12;break}return e.l+=o,[n,i]}function IR(e,t,r){var n=(e[e.l++]&96)>>5,i=SR(e,t-1,r);return[n,i]}function bR(e,t,r){var n=(e[e.l++]&96)>>5;return e.l+=r.biff==2?6:r.biff==12?14:7,[n]}function Gg(e){var t=e[e.l+1]&1,r=1;return e.l+=4,[t,r]}function kR(e,t,r){e.l+=2;for(var n=e.read_shift(r&&r.biff==2?1:2),i=[],o=0;o<=n;++o)i.push(e.read_shift(r&&r.biff==2?1:2));return i}function $R(e,t,r){var n=e[e.l+1]&255?1:0;return e.l+=2,[n,e.read_shift(r&&r.biff==2?1:2)]}function NR(e,t,r){var n=e[e.l+1]&255?1:0;return e.l+=2,[n,e.read_shift(r&&r.biff==2?1:2)]}function MR(e){var t=e[e.l+1]&255?1:0;return e.l+=2,[t,e.read_shift(2)]}function LR(e,t,r){var n=e[e.l+1]&255?1:0;return e.l+=r&&r.biff==2?3:4,[n]}function Nw(e){var t=e.read_shift(1),r=e.read_shift(1);return[t,r]}function BR(e){return e.read_shift(2),Nw(e)}function UR(e){return e.read_shift(2),Nw(e)}function HR(e,t,r){var n=(e[e.l]&96)>>5;e.l+=1;var i=$w(e,0,r);return[n,i]}function VR(e,t,r){var n=(e[e.l]&96)>>5;e.l+=1;var i=AR(e,0,r);return[n,i]}function WR(e,t,r){var n=(e[e.l]&96)>>5;e.l+=1;var i=e.read_shift(2);r&&r.biff==5&&(e.l+=12);var o=$w(e,0,r);return[n,i,o]}function zR(e,t,r){var n=(e[e.l]&96)>>5;e.l+=1;var i=e.read_shift(r&&r.biff<=3?1:2);return[zO[i],Bw[i],n]}function GR(e,t,r){var n=e[e.l++],i=e.read_shift(1),o=r&&r.biff<=3?[n==88?-1:0,e.read_shift(1)]:jR(e);return[i,(o[0]===0?Bw:WO)[o[1]]]}function jR(e){return[e[e.l+1]>>7,e.read_shift(2)&32767]}function XR(e,t,r){e.l+=r&&r.biff==2?3:4}function KR(e,t,r){if(e.l++,r&&r.biff==12)return[e.read_shift(4,"i"),0];var n=e.read_shift(2),i=e.read_shift(r&&r.biff==2?1:2);return[n,i]}function YR(e){return e.l++,ss[e.read_shift(1)]}function qR(e){return e.l++,e.read_shift(2)}function QR(e){return e.l++,e.read_shift(1)!==0}function ZR(e){return e.l++,Po(e)}function JR(e,t,r){return e.l++,xw(e,t-1,r)}function eO(e,t){var r=[e.read_shift(1)];if(t==12)switch(r[0]){case 2:r[0]=4;break;case 4:r[0]=16;break;case 0:r[0]=1;break;case 1:r[0]=2;break}switch(r[0]){case 4:r[1]=W3(e,1)?"TRUE":"FALSE",t!=12&&(e.l+=7);break;case 37:case 16:r[1]=ss[e[e.l]],e.l+=t==12?4:8;break;case 0:e.l+=8;break;case 1:r[1]=Po(e);break;case 2:r[1]=X3(e,0,{biff:t>0&&t<8?2:t});break;default:throw new Error("Bad SerAr: "+r[0])}return r}function tO(e,t,r){for(var n=e.read_shift(r.biff==12?4:2),i=[],o=0;o!=n;++o)i.push((r.biff==12?Si:q3)(e));return i}function rO(e,t,r){var n=0,i=0;r.biff==12?(n=e.read_shift(4),i=e.read_shift(4)):(i=1+e.read_shift(1),n=1+e.read_shift(2)),r.biff>=2&&r.biff<8&&(--n,--i==0&&(i=256));for(var o=0,a=[];o!=n&&(a[o]=[]);++o)for(var s=0;s!=i;++s)a[o][s]=eO(e,r.biff);return a}function nO(e,t,r){var n=e.read_shift(1)>>>5&3,i=!r||r.biff>=8?4:2,o=e.read_shift(i);switch(r.biff){case 2:e.l+=5;break;case 3:case 4:e.l+=8;break;case 5:e.l+=12;break}return[n,0,o]}function iO(e,t,r){if(r.biff==5)return oO(e);var n=e.read_shift(1)>>>5&3,i=e.read_shift(2),o=e.read_shift(4);return[n,i,o]}function oO(e){var t=e.read_shift(1)>>>5&3,r=e.read_shift(2,"i");e.l+=8;var n=e.read_shift(2);return e.l+=12,[t,r,n]}function aO(e,t,r){var n=e.read_shift(1)>>>5&3;e.l+=r&&r.biff==2?3:4;var i=e.read_shift(r&&r.biff==2?1:2);return[n,i]}function sO(e,t,r){var n=e.read_shift(1)>>>5&3,i=e.read_shift(r&&r.biff==2?1:2);return[n,i]}function lO(e,t,r){var n=e.read_shift(1)>>>5&3;return e.l+=4,r.biff<8&&e.l--,r.biff==12&&(e.l+=2),[n]}function uO(e,t,r){var n=(e[e.l++]&96)>>5,i=e.read_shift(2),o=4;if(r)switch(r.biff){case 5:o=15;break;case 12:o=6;break}return e.l+=o,[n,i]}var cO=$r,fO=$r,dO=$r;function ls(e,t,r){return e.l+=2,[CR(e)]}function Kd(e){return e.l+=6,[]}var hO=ls,pO=Kd,gO=Kd,mO=ls;function Mw(e){return e.l+=2,[mw(e),e.read_shift(2)&1]}var vO=ls,xO=Mw,wO=Kd,yO=ls,EO=ls,_O=["Data","All","Headers","??","?Data2","??","?DataHeaders","??","Totals","??","??","??","?DataTotals","??","??","??","?Current"];function SO(e){e.l+=2;var t=e.read_shift(2),r=e.read_shift(2),n=e.read_shift(4),i=e.read_shift(2),o=e.read_shift(2),a=_O[r>>2&31];return{ixti:t,coltype:r&3,rt:a,idx:n,c:i,C:o}}function TO(e){return e.l+=2,[e.read_shift(4)]}function CO(e,t,r){return e.l+=5,e.l+=2,e.l+=r.biff==2?1:4,["PTGSHEET"]}function AO(e,t,r){return e.l+=r.biff==2?4:5,["PTGENDSHEET"]}function RO(e){var t=e.read_shift(1)>>>5&3,r=e.read_shift(2);return[t,r]}function OO(e){var t=e.read_shift(1)>>>5&3,r=e.read_shift(2);return[t,r]}function FO(e){return e.l+=4,[0,0]}var jg={1:{n:"PtgExp",f:KR},2:{n:"PtgTbl",f:dO},3:{n:"PtgAdd",f:it},4:{n:"PtgSub",f:it},5:{n:"PtgMul",f:it},6:{n:"PtgDiv",f:it},7:{n:"PtgPower",f:it},8:{n:"PtgConcat",f:it},9:{n:"PtgLt",f:it},10:{n:"PtgLe",f:it},11:{n:"PtgEq",f:it},12:{n:"PtgGe",f:it},13:{n:"PtgGt",f:it},14:{n:"PtgNe",f:it},15:{n:"PtgIsect",f:it},16:{n:"PtgUnion",f:it},17:{n:"PtgRange",f:it},18:{n:"PtgUplus",f:it},19:{n:"PtgUminus",f:it},20:{n:"PtgPercent",f:it},21:{n:"PtgParen",f:it},22:{n:"PtgMissArg",f:it},23:{n:"PtgStr",f:JR},26:{n:"PtgSheet",f:CO},27:{n:"PtgEndSheet",f:AO},28:{n:"PtgErr",f:YR},29:{n:"PtgBool",f:QR},30:{n:"PtgInt",f:qR},31:{n:"PtgNum",f:ZR},32:{n:"PtgArray",f:bR},33:{n:"PtgFunc",f:zR},34:{n:"PtgFuncVar",f:GR},35:{n:"PtgName",f:nO},36:{n:"PtgRef",f:HR},37:{n:"PtgArea",f:OR},38:{n:"PtgMemArea",f:aO},39:{n:"PtgMemErr",f:cO},40:{n:"PtgMemNoMem",f:fO},41:{n:"PtgMemFunc",f:sO},42:{n:"PtgRefErr",f:lO},43:{n:"PtgAreaErr",f:DR},44:{n:"PtgRefN",f:VR},45:{n:"PtgAreaN",f:IR},46:{n:"PtgMemAreaN",f:RO},47:{n:"PtgMemNoMemN",f:OO},57:{n:"PtgNameX",f:iO},58:{n:"PtgRef3d",f:WR},59:{n:"PtgArea3d",f:FR},60:{n:"PtgRefErr3d",f:uO},61:{n:"PtgAreaErr3d",f:PR},255:{}},DO={64:32,96:32,65:33,97:33,66:34,98:34,67:35,99:35,68:36,100:36,69:37,101:37,70:38,102:38,71:39,103:39,72:40,104:40,73:41,105:41,74:42,106:42,75:43,107:43,76:44,108:44,77:45,109:45,78:46,110:46,79:47,111:47,88:34,120:34,89:57,121:57,90:58,122:58,91:59,123:59,92:60,124:60,93:61,125:61},PO={1:{n:"PtgElfLel",f:Mw},2:{n:"PtgElfRw",f:yO},3:{n:"PtgElfCol",f:hO},6:{n:"PtgElfRwV",f:EO},7:{n:"PtgElfColV",f:mO},10:{n:"PtgElfRadical",f:vO},11:{n:"PtgElfRadicalS",f:wO},13:{n:"PtgElfColS",f:pO},15:{n:"PtgElfColSV",f:gO},16:{n:"PtgElfRadicalLel",f:xO},25:{n:"PtgList",f:SO},29:{n:"PtgSxName",f:TO},255:{}},IO={0:{n:"PtgAttrNoop",f:FO},1:{n:"PtgAttrSemi",f:LR},2:{n:"PtgAttrIf",f:NR},4:{n:"PtgAttrChoose",f:kR},8:{n:"PtgAttrGoto",f:$R},16:{n:"PtgAttrSum",f:XR},32:{n:"PtgAttrBaxcel",f:Gg},33:{n:"PtgAttrBaxcel",f:Gg},64:{n:"PtgAttrSpace",f:BR},65:{n:"PtgAttrSpaceSemi",f:UR},128:{n:"PtgAttrIfError",f:MR},255:{}};function bO(e,t,r,n){if(n.biff<8)return $r(e,t);for(var i=e.l+t,o=[],a=0;a!==r.length;++a)switch(r[a][0]){case"PtgArray":r[a][1]=rO(e,0,n),o.push(r[a][1]);break;case"PtgMemArea":r[a][2]=tO(e,r[a][1],n),o.push(r[a][2]);break;case"PtgExp":n&&n.biff==12&&(r[a][1][1]=e.read_shift(4),o.push(r[a][1]));break;case"PtgList":case"PtgElfRadicalS":case"PtgElfColS":case"PtgElfColSV":throw"Unsupported "+r[a][0]}return t=i-e.l,t!==0&&o.push($r(e,t)),o}function kO(e,t,r){for(var n=e.l+t,i,o,a=[];n!=e.l;)t=n-e.l,o=e[e.l],i=jg[o]||jg[DO[o]],(o===24||o===25)&&(i=(o===24?PO:IO)[e[e.l+1]]),!i||!i.f?$r(e,t):a.push([i.n,i.f(e,t,r)]);return a}function $O(e){for(var t=[],r=0;r=",PtgGt:">",PtgLe:"<=",PtgLt:"<",PtgMul:"*",PtgNe:"<>",PtgPower:"^",PtgSub:"-"};function MO(e,t){if(!e&&!(t&&t.biff<=5&&t.biff>=2))throw new Error("empty sheet name");return/[^\w\u4E00-\u9FFF\u3040-\u30FF]/.test(e)?"'"+e+"'":e}function Lw(e,t,r){if(!e)return"SH33TJSERR0";if(r.biff>8&&(!e.XTI||!e.XTI[t]))return e.SheetNames[t];if(!e.XTI)return"SH33TJSERR6";var n=e.XTI[t];if(r.biff<8)return t>1e4&&(t-=65536),t<0&&(t=-t),t==0?"":e.XTI[t-1];if(!n)return"SH33TJSERR1";var i="";if(r.biff>8)switch(e[n[0]][0]){case 357:return i=n[1]==-1?"#REF":e.SheetNames[n[1]],n[1]==n[2]?i:i+":"+e.SheetNames[n[2]];case 358:return r.SID!=null?e.SheetNames[r.SID]:"SH33TJSSAME"+e[n[0]][0];case 355:default:return"SH33TJSSRC"+e[n[0]][0]}switch(e[n[0]][0][0]){case 1025:return i=n[1]==-1?"#REF":e.SheetNames[n[1]]||"SH33TJSERR3",n[1]==n[2]?i:i+":"+e.SheetNames[n[2]];case 14849:return e[n[0]].slice(1).map(function(o){return o.Name}).join(";;");default:return e[n[0]][0][3]?(i=n[1]==-1?"#REF":e[n[0]][0][3][n[1]]||"SH33TJSERR4",n[1]==n[2]?i:i+":"+e[n[0]][0][3][n[2]]):"SH33TJSERR2"}}function Xg(e,t,r){var n=Lw(e,t,r);return n=="#REF"?n:MO(n,r)}function xo(e,t,r,n,i){var o=i&&i.biff||8,a={s:{c:0,r:0},e:{c:0,r:0}},s=[],l,u,c,f=0,d=0,h,m="";if(!e[0]||!e[0][0])return"";for(var p=-1,g="",v=0,w=e[0].length;v=0){switch(e[0][p][1][0]){case 0:g=Je(" ",e[0][p][1][1]);break;case 1:g=Je("\r",e[0][p][1][1]);break;default:if(g="",i.WTF)throw new Error("Unexpected PtgAttrSpaceType "+e[0][p][1][0])}u=u+g,p=-1}s.push(u+NO[y[0]]+l);break;case"PtgIsect":l=s.pop(),u=s.pop(),s.push(u+" "+l);break;case"PtgUnion":l=s.pop(),u=s.pop(),s.push(u+","+l);break;case"PtgRange":l=s.pop(),u=s.pop(),s.push(u+":"+l);break;case"PtgAttrChoose":break;case"PtgAttrGoto":break;case"PtgAttrIf":break;case"PtgAttrIfError":break;case"PtgRef":c=_a(y[1][1],a,i),s.push(Sa(c,o));break;case"PtgRefN":c=r?_a(y[1][1],r,i):y[1][1],s.push(Sa(c,o));break;case"PtgRef3d":f=y[1][1],c=_a(y[1][2],a,i),m=Xg(n,f,i),s.push(m+"!"+Sa(c,o));break;case"PtgFunc":case"PtgFuncVar":var E=y[1][0],b=y[1][1];E||(E=0),E&=127;var k=E==0?[]:s.slice(-E);s.length-=E,b==="User"&&(b=k.shift()),s.push(b+"("+k.join(",")+")");break;case"PtgBool":s.push(y[1]?"TRUE":"FALSE");break;case"PtgInt":s.push(y[1]);break;case"PtgNum":s.push(String(y[1]));break;case"PtgStr":s.push('"'+y[1].replace(/"/g,'""')+'"');break;case"PtgErr":s.push(y[1]);break;case"PtgAreaN":h=Pg(y[1][1],r?{s:r}:a,i),s.push(kc(h,i));break;case"PtgArea":h=Pg(y[1][1],a,i),s.push(kc(h,i));break;case"PtgArea3d":f=y[1][1],h=y[1][2],m=Xg(n,f,i),s.push(m+"!"+kc(h,i));break;case"PtgAttrSum":s.push("SUM("+s.pop()+")");break;case"PtgAttrBaxcel":case"PtgAttrSemi":break;case"PtgName":d=y[1][2];var S=(n.names||[])[d-1]||(n[0]||[])[d],C=S?S.Name:"SH33TJSNAME"+String(d);C&&C.slice(0,6)=="_xlfn."&&!i.xlfn&&(C=C.slice(6)),s.push(C);break;case"PtgNameX":var A=y[1][1];d=y[1][2];var L;if(i.biff<=5)A<0&&(A=-A),n[A]&&(L=n[A][d]);else{var B="";if(((n[A]||[])[0]||[])[0]==14849||(((n[A]||[])[0]||[])[0]==1025?n[A][d]&&n[A][d].itab>0&&(B=n.SheetNames[n[A][d].itab-1]+"!"):B=n.SheetNames[d-1]+"!"),n[A]&&n[A][d])B+=n[A][d].Name;else if(n[0]&&n[0][d])B+=n[0][d].Name;else{var U=(Lw(n,A,i)||"").split(";;");U[d-1]?B=U[d-1]:B+="SH33TJSERRX"}s.push(B);break}L||(L={Name:"SH33TJSERRY"}),s.push(L.Name);break;case"PtgParen":var H="(",G=")";if(p>=0){switch(g="",e[0][p][1][0]){case 2:H=Je(" ",e[0][p][1][1])+H;break;case 3:H=Je("\r",e[0][p][1][1])+H;break;case 4:G=Je(" ",e[0][p][1][1])+G;break;case 5:G=Je("\r",e[0][p][1][1])+G;break;default:if(i.WTF)throw new Error("Unexpected PtgAttrSpaceType "+e[0][p][1][0])}p=-1}s.push(H+s.pop()+G);break;case"PtgRefErr":s.push("#REF!");break;case"PtgRefErr3d":s.push("#REF!");break;case"PtgExp":c={c:y[1][1],r:y[1][0]};var ee={c:r.c,r:r.r};if(n.sharedf[Ue(c)]){var ae=n.sharedf[Ue(c)];s.push(xo(ae,a,ee,n,i))}else{var he=!1;for(l=0;l!=n.arrayf.length;++l)if(u=n.arrayf[l],!(c.cu[0].e.c)&&!(c.ru[0].e.r)){s.push(xo(u[1],a,ee,n,i)),he=!0;break}he||s.push(y[1])}break;case"PtgArray":s.push("{"+$O(y[1])+"}");break;case"PtgMemArea":break;case"PtgAttrSpace":case"PtgAttrSpaceSemi":p=v;break;case"PtgTbl":break;case"PtgMemErr":break;case"PtgMissArg":s.push("");break;case"PtgAreaErr":s.push("#REF!");break;case"PtgAreaErr3d":s.push("#REF!");break;case"PtgList":s.push("Table"+y[1].idx+"[#"+y[1].rt+"]");break;case"PtgMemAreaN":case"PtgMemNoMemN":case"PtgAttrNoop":case"PtgSheet":case"PtgEndSheet":break;case"PtgMemFunc":break;case"PtgMemNoMem":break;case"PtgElfCol":case"PtgElfColS":case"PtgElfColSV":case"PtgElfColV":case"PtgElfLel":case"PtgElfRadical":case"PtgElfRadicalLel":case"PtgElfRadicalS":case"PtgElfRw":case"PtgElfRwV":throw new Error("Unsupported ELFs");case"PtgSxName":throw new Error("Unrecognized Formula Token: "+String(y));default:throw new Error("Unrecognized Formula Token: "+String(y))}var Te=["PtgAttrSpace","PtgAttrSpaceSemi","PtgAttrGoto"];if(i.biff!=3&&p>=0&&Te.indexOf(e[0][v][0])==-1){y=e[0][p];var oe=!0;switch(y[1][0]){case 4:oe=!1;case 0:g=Je(" ",y[1][1]);break;case 5:oe=!1;case 1:g=Je("\r",y[1][1]);break;default:if(g="",i.WTF)throw new Error("Unexpected PtgAttrSpaceType "+y[1][0])}s.push((oe?g:"")+s.pop()+(oe?"":g)),p=-1}}if(s.length>1&&i.WTF)throw new Error("bad formula stack");return s[0]}function LO(e){if(e==null){var t=Z(8);return t.write_shift(1,3),t.write_shift(1,0),t.write_shift(2,0),t.write_shift(2,0),t.write_shift(2,65535),t}else if(typeof e=="number")return li(e);return li(0)}function BO(e,t,r,n,i){var o=ui(t,r,i),a=LO(e.v),s=Z(6),l=33;s.write_shift(2,l),s.write_shift(4,0);for(var u=Z(e.bf.length),c=0;c0?bO(e,o,i,r):null;return[i,a]}var UO=Au,Ru=Au,HO=Au,VO=Au,WO={0:"BEEP",1:"OPEN",2:"OPEN.LINKS",3:"CLOSE.ALL",4:"SAVE",5:"SAVE.AS",6:"FILE.DELETE",7:"PAGE.SETUP",8:"PRINT",9:"PRINTER.SETUP",10:"QUIT",11:"NEW.WINDOW",12:"ARRANGE.ALL",13:"WINDOW.SIZE",14:"WINDOW.MOVE",15:"FULL",16:"CLOSE",17:"RUN",22:"SET.PRINT.AREA",23:"SET.PRINT.TITLES",24:"SET.PAGE.BREAK",25:"REMOVE.PAGE.BREAK",26:"FONT",27:"DISPLAY",28:"PROTECT.DOCUMENT",29:"PRECISION",30:"A1.R1C1",31:"CALCULATE.NOW",32:"CALCULATION",34:"DATA.FIND",35:"EXTRACT",36:"DATA.DELETE",37:"SET.DATABASE",38:"SET.CRITERIA",39:"SORT",40:"DATA.SERIES",41:"TABLE",42:"FORMAT.NUMBER",43:"ALIGNMENT",44:"STYLE",45:"BORDER",46:"CELL.PROTECTION",47:"COLUMN.WIDTH",48:"UNDO",49:"CUT",50:"COPY",51:"PASTE",52:"CLEAR",53:"PASTE.SPECIAL",54:"EDIT.DELETE",55:"INSERT",56:"FILL.RIGHT",57:"FILL.DOWN",61:"DEFINE.NAME",62:"CREATE.NAMES",63:"FORMULA.GOTO",64:"FORMULA.FIND",65:"SELECT.LAST.CELL",66:"SHOW.ACTIVE.CELL",67:"GALLERY.AREA",68:"GALLERY.BAR",69:"GALLERY.COLUMN",70:"GALLERY.LINE",71:"GALLERY.PIE",72:"GALLERY.SCATTER",73:"COMBINATION",74:"PREFERRED",75:"ADD.OVERLAY",76:"GRIDLINES",77:"SET.PREFERRED",78:"AXES",79:"LEGEND",80:"ATTACH.TEXT",81:"ADD.ARROW",82:"SELECT.CHART",83:"SELECT.PLOT.AREA",84:"PATTERNS",85:"MAIN.CHART",86:"OVERLAY",87:"SCALE",88:"FORMAT.LEGEND",89:"FORMAT.TEXT",90:"EDIT.REPEAT",91:"PARSE",92:"JUSTIFY",93:"HIDE",94:"UNHIDE",95:"WORKSPACE",96:"FORMULA",97:"FORMULA.FILL",98:"FORMULA.ARRAY",99:"DATA.FIND.NEXT",100:"DATA.FIND.PREV",101:"FORMULA.FIND.NEXT",102:"FORMULA.FIND.PREV",103:"ACTIVATE",104:"ACTIVATE.NEXT",105:"ACTIVATE.PREV",106:"UNLOCKED.NEXT",107:"UNLOCKED.PREV",108:"COPY.PICTURE",109:"SELECT",110:"DELETE.NAME",111:"DELETE.FORMAT",112:"VLINE",113:"HLINE",114:"VPAGE",115:"HPAGE",116:"VSCROLL",117:"HSCROLL",118:"ALERT",119:"NEW",120:"CANCEL.COPY",121:"SHOW.CLIPBOARD",122:"MESSAGE",124:"PASTE.LINK",125:"APP.ACTIVATE",126:"DELETE.ARROW",127:"ROW.HEIGHT",128:"FORMAT.MOVE",129:"FORMAT.SIZE",130:"FORMULA.REPLACE",131:"SEND.KEYS",132:"SELECT.SPECIAL",133:"APPLY.NAMES",134:"REPLACE.FONT",135:"FREEZE.PANES",136:"SHOW.INFO",137:"SPLIT",138:"ON.WINDOW",139:"ON.DATA",140:"DISABLE.INPUT",142:"OUTLINE",143:"LIST.NAMES",144:"FILE.CLOSE",145:"SAVE.WORKBOOK",146:"DATA.FORM",147:"COPY.CHART",148:"ON.TIME",149:"WAIT",150:"FORMAT.FONT",151:"FILL.UP",152:"FILL.LEFT",153:"DELETE.OVERLAY",155:"SHORT.MENUS",159:"SET.UPDATE.STATUS",161:"COLOR.PALETTE",162:"DELETE.STYLE",163:"WINDOW.RESTORE",164:"WINDOW.MAXIMIZE",166:"CHANGE.LINK",167:"CALCULATE.DOCUMENT",168:"ON.KEY",169:"APP.RESTORE",170:"APP.MOVE",171:"APP.SIZE",172:"APP.MINIMIZE",173:"APP.MAXIMIZE",174:"BRING.TO.FRONT",175:"SEND.TO.BACK",185:"MAIN.CHART.TYPE",186:"OVERLAY.CHART.TYPE",187:"SELECT.END",188:"OPEN.MAIL",189:"SEND.MAIL",190:"STANDARD.FONT",191:"CONSOLIDATE",192:"SORT.SPECIAL",193:"GALLERY.3D.AREA",194:"GALLERY.3D.COLUMN",195:"GALLERY.3D.LINE",196:"GALLERY.3D.PIE",197:"VIEW.3D",198:"GOAL.SEEK",199:"WORKGROUP",200:"FILL.GROUP",201:"UPDATE.LINK",202:"PROMOTE",203:"DEMOTE",204:"SHOW.DETAIL",206:"UNGROUP",207:"OBJECT.PROPERTIES",208:"SAVE.NEW.OBJECT",209:"SHARE",210:"SHARE.NAME",211:"DUPLICATE",212:"APPLY.STYLE",213:"ASSIGN.TO.OBJECT",214:"OBJECT.PROTECTION",215:"HIDE.OBJECT",216:"SET.EXTRACT",217:"CREATE.PUBLISHER",218:"SUBSCRIBE.TO",219:"ATTRIBUTES",220:"SHOW.TOOLBAR",222:"PRINT.PREVIEW",223:"EDIT.COLOR",224:"SHOW.LEVELS",225:"FORMAT.MAIN",226:"FORMAT.OVERLAY",227:"ON.RECALC",228:"EDIT.SERIES",229:"DEFINE.STYLE",240:"LINE.PRINT",243:"ENTER.DATA",249:"GALLERY.RADAR",250:"MERGE.STYLES",251:"EDITION.OPTIONS",252:"PASTE.PICTURE",253:"PASTE.PICTURE.LINK",254:"SPELLING",256:"ZOOM",259:"INSERT.OBJECT",260:"WINDOW.MINIMIZE",265:"SOUND.NOTE",266:"SOUND.PLAY",267:"FORMAT.SHAPE",268:"EXTEND.POLYGON",269:"FORMAT.AUTO",272:"GALLERY.3D.BAR",273:"GALLERY.3D.SURFACE",274:"FILL.AUTO",276:"CUSTOMIZE.TOOLBAR",277:"ADD.TOOL",278:"EDIT.OBJECT",279:"ON.DOUBLECLICK",280:"ON.ENTRY",281:"WORKBOOK.ADD",282:"WORKBOOK.MOVE",283:"WORKBOOK.COPY",284:"WORKBOOK.OPTIONS",285:"SAVE.WORKSPACE",288:"CHART.WIZARD",289:"DELETE.TOOL",290:"MOVE.TOOL",291:"WORKBOOK.SELECT",292:"WORKBOOK.ACTIVATE",293:"ASSIGN.TO.TOOL",295:"COPY.TOOL",296:"RESET.TOOL",297:"CONSTRAIN.NUMERIC",298:"PASTE.TOOL",302:"WORKBOOK.NEW",305:"SCENARIO.CELLS",306:"SCENARIO.DELETE",307:"SCENARIO.ADD",308:"SCENARIO.EDIT",309:"SCENARIO.SHOW",310:"SCENARIO.SHOW.NEXT",311:"SCENARIO.SUMMARY",312:"PIVOT.TABLE.WIZARD",313:"PIVOT.FIELD.PROPERTIES",314:"PIVOT.FIELD",315:"PIVOT.ITEM",316:"PIVOT.ADD.FIELDS",318:"OPTIONS.CALCULATION",319:"OPTIONS.EDIT",320:"OPTIONS.VIEW",321:"ADDIN.MANAGER",322:"MENU.EDITOR",323:"ATTACH.TOOLBARS",324:"VBAActivate",325:"OPTIONS.CHART",328:"VBA.INSERT.FILE",330:"VBA.PROCEDURE.DEFINITION",336:"ROUTING.SLIP",338:"ROUTE.DOCUMENT",339:"MAIL.LOGON",342:"INSERT.PICTURE",343:"EDIT.TOOL",344:"GALLERY.DOUGHNUT",350:"CHART.TREND",352:"PIVOT.ITEM.PROPERTIES",354:"WORKBOOK.INSERT",355:"OPTIONS.TRANSITION",356:"OPTIONS.GENERAL",370:"FILTER.ADVANCED",373:"MAIL.ADD.MAILER",374:"MAIL.DELETE.MAILER",375:"MAIL.REPLY",376:"MAIL.REPLY.ALL",377:"MAIL.FORWARD",378:"MAIL.NEXT.LETTER",379:"DATA.LABEL",380:"INSERT.TITLE",381:"FONT.PROPERTIES",382:"MACRO.OPTIONS",383:"WORKBOOK.HIDE",384:"WORKBOOK.UNHIDE",385:"WORKBOOK.DELETE",386:"WORKBOOK.NAME",388:"GALLERY.CUSTOM",390:"ADD.CHART.AUTOFORMAT",391:"DELETE.CHART.AUTOFORMAT",392:"CHART.ADD.DATA",393:"AUTO.OUTLINE",394:"TAB.ORDER",395:"SHOW.DIALOG",396:"SELECT.ALL",397:"UNGROUP.SHEETS",398:"SUBTOTAL.CREATE",399:"SUBTOTAL.REMOVE",400:"RENAME.OBJECT",412:"WORKBOOK.SCROLL",413:"WORKBOOK.NEXT",414:"WORKBOOK.PREV",415:"WORKBOOK.TAB.SPLIT",416:"FULL.SCREEN",417:"WORKBOOK.PROTECT",420:"SCROLLBAR.PROPERTIES",421:"PIVOT.SHOW.PAGES",422:"TEXT.TO.COLUMNS",423:"FORMAT.CHARTTYPE",424:"LINK.FORMAT",425:"TRACER.DISPLAY",430:"TRACER.NAVIGATE",431:"TRACER.CLEAR",432:"TRACER.ERROR",433:"PIVOT.FIELD.GROUP",434:"PIVOT.FIELD.UNGROUP",435:"CHECKBOX.PROPERTIES",436:"LABEL.PROPERTIES",437:"LISTBOX.PROPERTIES",438:"EDITBOX.PROPERTIES",439:"PIVOT.REFRESH",440:"LINK.COMBO",441:"OPEN.TEXT",442:"HIDE.DIALOG",443:"SET.DIALOG.FOCUS",444:"ENABLE.OBJECT",445:"PUSHBUTTON.PROPERTIES",446:"SET.DIALOG.DEFAULT",447:"FILTER",448:"FILTER.SHOW.ALL",449:"CLEAR.OUTLINE",450:"FUNCTION.WIZARD",451:"ADD.LIST.ITEM",452:"SET.LIST.ITEM",453:"REMOVE.LIST.ITEM",454:"SELECT.LIST.ITEM",455:"SET.CONTROL.VALUE",456:"SAVE.COPY.AS",458:"OPTIONS.LISTS.ADD",459:"OPTIONS.LISTS.DELETE",460:"SERIES.AXES",461:"SERIES.X",462:"SERIES.Y",463:"ERRORBAR.X",464:"ERRORBAR.Y",465:"FORMAT.CHART",466:"SERIES.ORDER",467:"MAIL.LOGOFF",468:"CLEAR.ROUTING.SLIP",469:"APP.ACTIVATE.MICROSOFT",470:"MAIL.EDIT.MAILER",471:"ON.SHEET",472:"STANDARD.WIDTH",473:"SCENARIO.MERGE",474:"SUMMARY.INFO",475:"FIND.FILE",476:"ACTIVE.CELL.FONT",477:"ENABLE.TIPWIZARD",478:"VBA.MAKE.ADDIN",480:"INSERTDATATABLE",481:"WORKGROUP.OPTIONS",482:"MAIL.SEND.MAILER",485:"AUTOCORRECT",489:"POST.DOCUMENT",491:"PICKLIST",493:"VIEW.SHOW",494:"VIEW.DEFINE",495:"VIEW.DELETE",509:"SHEET.BACKGROUND",510:"INSERT.MAP.OBJECT",511:"OPTIONS.MENONO",517:"MSOCHECKS",518:"NORMAL",519:"LAYOUT",520:"RM.PRINT.AREA",521:"CLEAR.PRINT.AREA",522:"ADD.PRINT.AREA",523:"MOVE.BRK",545:"HIDECURR.NOTE",546:"HIDEALL.NOTES",547:"DELETE.NOTE",548:"TRAVERSE.NOTES",549:"ACTIVATE.NOTES",620:"PROTECT.REVISIONS",621:"UNPROTECT.REVISIONS",647:"OPTIONS.ME",653:"WEB.PUBLISH",667:"NEWWEBQUERY",673:"PIVOT.TABLE.CHART",753:"OPTIONS.SAVE",755:"OPTIONS.SPELL",808:"HIDEALL.INKANNOTS"},Bw={0:"COUNT",1:"IF",2:"ISNA",3:"ISERROR",4:"SUM",5:"AVERAGE",6:"MIN",7:"MAX",8:"ROW",9:"COLUMN",10:"NA",11:"NPV",12:"STDEV",13:"DOLLAR",14:"FIXED",15:"SIN",16:"COS",17:"TAN",18:"ATAN",19:"PI",20:"SQRT",21:"EXP",22:"LN",23:"LOG10",24:"ABS",25:"INT",26:"SIGN",27:"ROUND",28:"LOOKUP",29:"INDEX",30:"REPT",31:"MID",32:"LEN",33:"VALUE",34:"TRUE",35:"FALSE",36:"AND",37:"OR",38:"NOT",39:"MOD",40:"DCOUNT",41:"DSUM",42:"DAVERAGE",43:"DMIN",44:"DMAX",45:"DSTDEV",46:"VAR",47:"DVAR",48:"TEXT",49:"LINEST",50:"TREND",51:"LOGEST",52:"GROWTH",53:"GOTO",54:"HALT",55:"RETURN",56:"PV",57:"FV",58:"NPER",59:"PMT",60:"RATE",61:"MIRR",62:"IRR",63:"RAND",64:"MATCH",65:"DATE",66:"TIME",67:"DAY",68:"MONTH",69:"YEAR",70:"WEEKDAY",71:"HOUR",72:"MINUTE",73:"SECOND",74:"NOW",75:"AREAS",76:"ROWS",77:"COLUMNS",78:"OFFSET",79:"ABSREF",80:"RELREF",81:"ARGUMENT",82:"SEARCH",83:"TRANSPOSE",84:"ERROR",85:"STEP",86:"TYPE",87:"ECHO",88:"SET.NAME",89:"CALLER",90:"DEREF",91:"WINDOWS",92:"SERIES",93:"DOCUMENTS",94:"ACTIVE.CELL",95:"SELECTION",96:"RESULT",97:"ATAN2",98:"ASIN",99:"ACOS",100:"CHOOSE",101:"HLOOKUP",102:"VLOOKUP",103:"LINKS",104:"INPUT",105:"ISREF",106:"GET.FORMULA",107:"GET.NAME",108:"SET.VALUE",109:"LOG",110:"EXEC",111:"CHAR",112:"LOWER",113:"UPPER",114:"PROPER",115:"LEFT",116:"RIGHT",117:"EXACT",118:"TRIM",119:"REPLACE",120:"SUBSTITUTE",121:"CODE",122:"NAMES",123:"DIRECTORY",124:"FIND",125:"CELL",126:"ISERR",127:"ISTEXT",128:"ISNUMBER",129:"ISBLANK",130:"T",131:"N",132:"FOPEN",133:"FCLOSE",134:"FSIZE",135:"FREADLN",136:"FREAD",137:"FWRITELN",138:"FWRITE",139:"FPOS",140:"DATEVALUE",141:"TIMEVALUE",142:"SLN",143:"SYD",144:"DDB",145:"GET.DEF",146:"REFTEXT",147:"TEXTREF",148:"INDIRECT",149:"REGISTER",150:"CALL",151:"ADD.BAR",152:"ADD.MENU",153:"ADD.COMMAND",154:"ENABLE.COMMAND",155:"CHECK.COMMAND",156:"RENAME.COMMAND",157:"SHOW.BAR",158:"DELETE.MENU",159:"DELETE.COMMAND",160:"GET.CHART.ITEM",161:"DIALOG.BOX",162:"CLEAN",163:"MDETERM",164:"MINVERSE",165:"MMULT",166:"FILES",167:"IPMT",168:"PPMT",169:"COUNTA",170:"CANCEL.KEY",171:"FOR",172:"WHILE",173:"BREAK",174:"NEXT",175:"INITIATE",176:"REQUEST",177:"POKE",178:"EXECUTE",179:"TERMINATE",180:"RESTART",181:"HELP",182:"GET.BAR",183:"PRODUCT",184:"FACT",185:"GET.CELL",186:"GET.WORKSPACE",187:"GET.WINDOW",188:"GET.DOCUMENT",189:"DPRODUCT",190:"ISNONTEXT",191:"GET.NOTE",192:"NOTE",193:"STDEVP",194:"VARP",195:"DSTDEVP",196:"DVARP",197:"TRUNC",198:"ISLOGICAL",199:"DCOUNTA",200:"DELETE.BAR",201:"UNREGISTER",204:"USDOLLAR",205:"FINDB",206:"SEARCHB",207:"REPLACEB",208:"LEFTB",209:"RIGHTB",210:"MIDB",211:"LENB",212:"ROUNDUP",213:"ROUNDDOWN",214:"ASC",215:"DBCS",216:"RANK",219:"ADDRESS",220:"DAYS360",221:"TODAY",222:"VDB",223:"ELSE",224:"ELSE.IF",225:"END.IF",226:"FOR.CELL",227:"MEDIAN",228:"SUMPRODUCT",229:"SINH",230:"COSH",231:"TANH",232:"ASINH",233:"ACOSH",234:"ATANH",235:"DGET",236:"CREATE.OBJECT",237:"VOLATILE",238:"LAST.ERROR",239:"CUSTOM.UNDO",240:"CUSTOM.REPEAT",241:"FORMULA.CONVERT",242:"GET.LINK.INFO",243:"TEXT.BOX",244:"INFO",245:"GROUP",246:"GET.OBJECT",247:"DB",248:"PAUSE",251:"RESUME",252:"FREQUENCY",253:"ADD.TOOLBAR",254:"DELETE.TOOLBAR",255:"User",256:"RESET.TOOLBAR",257:"EVALUATE",258:"GET.TOOLBAR",259:"GET.TOOL",260:"SPELLING.CHECK",261:"ERROR.TYPE",262:"APP.TITLE",263:"WINDOW.TITLE",264:"SAVE.TOOLBAR",265:"ENABLE.TOOL",266:"PRESS.TOOL",267:"REGISTER.ID",268:"GET.WORKBOOK",269:"AVEDEV",270:"BETADIST",271:"GAMMALN",272:"BETAINV",273:"BINOMDIST",274:"CHIDIST",275:"CHIINV",276:"COMBIN",277:"CONFIDENCE",278:"CRITBINOM",279:"EVEN",280:"EXPONDIST",281:"FDIST",282:"FINV",283:"FISHER",284:"FISHERINV",285:"FLOOR",286:"GAMMADIST",287:"GAMMAINV",288:"CEILING",289:"HYPGEOMDIST",290:"LOGNORMDIST",291:"LOGINV",292:"NEGBINOMDIST",293:"NORMDIST",294:"NORMSDIST",295:"NORMINV",296:"NORMSINV",297:"STANDARDIZE",298:"ODD",299:"PERMUT",300:"POISSON",301:"TDIST",302:"WEIBULL",303:"SUMXMY2",304:"SUMX2MY2",305:"SUMX2PY2",306:"CHITEST",307:"CORREL",308:"COVAR",309:"FORECAST",310:"FTEST",311:"INTERCEPT",312:"PEARSON",313:"RSQ",314:"STEYX",315:"SLOPE",316:"TTEST",317:"PROB",318:"DEVSQ",319:"GEOMEAN",320:"HARMEAN",321:"SUMSQ",322:"KURT",323:"SKEW",324:"ZTEST",325:"LARGE",326:"SMALL",327:"QUARTILE",328:"PERCENTILE",329:"PERCENTRANK",330:"MODE",331:"TRIMMEAN",332:"TINV",334:"MOVIE.COMMAND",335:"GET.MOVIE",336:"CONCATENATE",337:"POWER",338:"PIVOT.ADD.DATA",339:"GET.PIVOT.TABLE",340:"GET.PIVOT.FIELD",341:"GET.PIVOT.ITEM",342:"RADIANS",343:"DEGREES",344:"SUBTOTAL",345:"SUMIF",346:"COUNTIF",347:"COUNTBLANK",348:"SCENARIO.GET",349:"OPTIONS.LISTS.GET",350:"ISPMT",351:"DATEDIF",352:"DATESTRING",353:"NUMBERSTRING",354:"ROMAN",355:"OPEN.DIALOG",356:"SAVE.DIALOG",357:"VIEW.GET",358:"GETPIVOTDATA",359:"HYPERLINK",360:"PHONETIC",361:"AVERAGEA",362:"MAXA",363:"MINA",364:"STDEVPA",365:"VARPA",366:"STDEVA",367:"VARA",368:"BAHTTEXT",369:"THAIDAYOFWEEK",370:"THAIDIGIT",371:"THAIMONTHOFYEAR",372:"THAINUMSOUND",373:"THAINUMSTRING",374:"THAISTRINGLENGTH",375:"ISTHAIDIGIT",376:"ROUNDBAHTDOWN",377:"ROUNDBAHTUP",378:"THAIYEAR",379:"RTD",380:"CUBEVALUE",381:"CUBEMEMBER",382:"CUBEMEMBERPROPERTY",383:"CUBERANKEDMEMBER",384:"HEX2BIN",385:"HEX2DEC",386:"HEX2OCT",387:"DEC2BIN",388:"DEC2HEX",389:"DEC2OCT",390:"OCT2BIN",391:"OCT2HEX",392:"OCT2DEC",393:"BIN2DEC",394:"BIN2OCT",395:"BIN2HEX",396:"IMSUB",397:"IMDIV",398:"IMPOWER",399:"IMABS",400:"IMSQRT",401:"IMLN",402:"IMLOG2",403:"IMLOG10",404:"IMSIN",405:"IMCOS",406:"IMEXP",407:"IMARGUMENT",408:"IMCONJUGATE",409:"IMAGINARY",410:"IMREAL",411:"COMPLEX",412:"IMSUM",413:"IMPRODUCT",414:"SERIESSUM",415:"FACTDOUBLE",416:"SQRTPI",417:"QUOTIENT",418:"DELTA",419:"GESTEP",420:"ISEVEN",421:"ISODD",422:"MROUND",423:"ERF",424:"ERFC",425:"BESSELJ",426:"BESSELK",427:"BESSELY",428:"BESSELI",429:"XIRR",430:"XNPV",431:"PRICEMAT",432:"YIELDMAT",433:"INTRATE",434:"RECEIVED",435:"DISC",436:"PRICEDISC",437:"YIELDDISC",438:"TBILLEQ",439:"TBILLPRICE",440:"TBILLYIELD",441:"PRICE",442:"YIELD",443:"DOLLARDE",444:"DOLLARFR",445:"NOMINAL",446:"EFFECT",447:"CUMPRINC",448:"CUMIPMT",449:"EDATE",450:"EOMONTH",451:"YEARFRAC",452:"COUPDAYBS",453:"COUPDAYS",454:"COUPDAYSNC",455:"COUPNCD",456:"COUPNUM",457:"COUPPCD",458:"DURATION",459:"MDURATION",460:"ODDLPRICE",461:"ODDLYIELD",462:"ODDFPRICE",463:"ODDFYIELD",464:"RANDBETWEEN",465:"WEEKNUM",466:"AMORDEGRC",467:"AMORLINC",468:"CONVERT",724:"SHEETJS",469:"ACCRINT",470:"ACCRINTM",471:"WORKDAY",472:"NETWORKDAYS",473:"GCD",474:"MULTINOMIAL",475:"LCM",476:"FVSCHEDULE",477:"CUBEKPIMEMBER",478:"CUBESET",479:"CUBESETCOUNT",480:"IFERROR",481:"COUNTIFS",482:"SUMIFS",483:"AVERAGEIF",484:"AVERAGEIFS"},zO={2:1,3:1,10:0,15:1,16:1,17:1,18:1,19:0,20:1,21:1,22:1,23:1,24:1,25:1,26:1,27:2,30:2,31:3,32:1,33:1,34:0,35:0,38:1,39:2,40:3,41:3,42:3,43:3,44:3,45:3,47:3,48:2,53:1,61:3,63:0,65:3,66:3,67:1,68:1,69:1,70:1,71:1,72:1,73:1,74:0,75:1,76:1,77:1,79:2,80:2,83:1,85:0,86:1,89:0,90:1,94:0,95:0,97:2,98:1,99:1,101:3,102:3,105:1,106:1,108:2,111:1,112:1,113:1,114:1,117:2,118:1,119:4,121:1,126:1,127:1,128:1,129:1,130:1,131:1,133:1,134:1,135:1,136:2,137:2,138:2,140:1,141:1,142:3,143:4,144:4,161:1,162:1,163:1,164:1,165:2,172:1,175:2,176:2,177:3,178:2,179:1,184:1,186:1,189:3,190:1,195:3,196:3,197:1,198:1,199:3,201:1,207:4,210:3,211:1,212:2,213:2,214:1,215:1,225:0,229:1,230:1,231:1,232:1,233:1,234:1,235:3,244:1,247:4,252:2,257:1,261:1,271:1,273:4,274:2,275:2,276:2,277:3,278:3,279:1,280:3,281:3,282:3,283:1,284:1,285:2,286:4,287:3,288:2,289:4,290:3,291:3,292:3,293:4,294:1,295:3,296:1,297:3,298:1,299:2,300:3,301:3,302:4,303:2,304:2,305:2,306:2,307:2,308:2,309:3,310:2,311:2,312:2,313:2,314:2,315:2,316:4,325:2,326:2,327:2,328:2,331:2,332:2,337:2,342:1,343:1,346:2,347:1,350:4,351:3,352:1,353:2,360:1,368:1,369:1,370:1,371:1,372:1,373:1,374:1,375:1,376:1,377:1,378:1,382:3,385:1,392:1,393:1,396:2,397:2,398:2,399:1,400:1,401:1,402:1,403:1,404:1,405:1,406:1,407:1,408:1,409:1,410:1,414:4,415:1,416:1,417:2,420:1,421:1,422:2,424:1,425:2,426:2,427:2,428:2,430:3,438:3,439:3,440:3,443:2,444:2,445:2,446:2,447:6,448:6,449:2,450:2,464:2,468:3,476:2,479:1,480:2,65535:0};function GO(e){var t="of:="+e.replace(jd,"$1[.$2$3$4$5]").replace(/\]:\[/g,":");return t.replace(/;/g,"|").replace(/,/g,";")}function jO(e){return e.replace(/\./,"!")}var Ta=typeof Map<"u";function Yd(e,t,r){var n=0,i=e.length;if(r){if(Ta?r.has(t):Object.prototype.hasOwnProperty.call(r,t)){for(var o=Ta?r.get(t):r[t];n-1?(r.width=e0(n),r.customWidth=1):t.width!=null&&(r.width=t.width),t.hidden&&(r.hidden=!0),t.level!=null&&(r.outlineLevel=r.level=t.level),r}function Uw(e,t){if(e){var r=[.7,.7,.75,.75,.3,.3];t=="xlml"&&(r=[1,1,1,1,.5,.5]),e.left==null&&(e.left=r[0]),e.right==null&&(e.right=r[1]),e.top==null&&(e.top=r[2]),e.bottom==null&&(e.bottom=r[3]),e.header==null&&(e.header=r[4]),e.footer==null&&(e.footer=r[5])}}function Wn(e,t,r){var n=r.revssf[t.z!=null?t.z:"General"],i=60,o=e.length;if(n==null&&r.ssf){for(;i<392;++i)if(r.ssf[i]==null){$x(t.z,i),r.ssf[i]=t.z,r.revssf[t.z]=n=i;break}}for(i=0;i!=o;++i)if(e[i].numFmtId===n)return i;return e[o]={numFmtId:n,fontId:0,fillId:0,borderId:0,xfId:0,applyNumberFormat:1},o}function XO(e,t,r){if(e&&e["!ref"]){var n=Xe(e["!ref"]);if(n.e.c',r=0;r!=e.length;++r)t+='';return t+""}function YO(e,t,r,n,i){var o=!1,a={},s=null;if(n.bookType!=="xlsx"&&t.vbaraw){var l=t.SheetNames[r];try{t.Workbook&&(l=t.Workbook.Sheets[r].CodeName||l)}catch{}o=!0,a.codeName=Xr(Be(l))}if(e&&e["!outline"]){var u={summaryBelow:1,summaryRight:1};e["!outline"].above&&(u.summaryBelow=0),e["!outline"].left&&(u.summaryRight=0),s=(s||"")+fe("outlinePr",null,u)}!o&&!s||(i[i.length]=fe("sheetPr",s,a))}var qO=["objects","scenarios","selectLockedCells","selectUnlockedCells"],QO=["formatColumns","formatRows","formatCells","insertColumns","insertRows","insertHyperlinks","deleteColumns","deleteRows","sort","autoFilter","pivotTables"];function ZO(e){var t={sheet:1};return qO.forEach(function(r){e[r]!=null&&e[r]&&(t[r]="1")}),QO.forEach(function(r){e[r]!=null&&!e[r]&&(t[r]="0")}),e.password&&(t.password=Sw(e.password).toString(16).toUpperCase()),fe("sheetProtection",null,t)}function JO(e){return Uw(e),fe("pageMargins",null,e)}function eF(e,t){for(var r=[""],n,i=0;i!=t.length;++i)(n=t[i])&&(r[r.length]=fe("col",null,Ou(i,n)));return r[r.length]="",r.join("")}function tF(e,t,r,n){var i=typeof e.ref=="string"?e.ref:ot(e.ref);r.Workbook||(r.Workbook={Sheets:[]}),r.Workbook.Names||(r.Workbook.Names=[]);var o=r.Workbook.Names,a=tr(i);a.s.r==a.e.r&&(a.e.r=tr(t["!ref"]).e.r,i=ot(a));for(var s=0;s"u"&&(e.z=rt[14]);break;default:i=e.v;break}var s=Et("v",Be(i)),l={r:t},u=Wn(n.cellXfs,e,n);switch(u!==0&&(l.s=u),e.t){case"n":break;case"d":l.t="d";break;case"b":l.t="b";break;case"e":l.t="e";break;case"z":break;default:if(e.v==null){delete e.t;break}if(e.v.length>32767)throw new Error("Text length must not exceed 32767 characters");if(n&&n.bookSST){s=Et("v",""+Yd(n.Strings,e.v,n.revStrings)),l.t="s";break}l.t="str";break}if(e.t!=o&&(e.t=o,e.v=a),typeof e.f=="string"&&e.f){var c=e.F&&e.F.slice(0,t.length)==t?{t:"array",ref:e.F}:null;s=fe("f",Be(e.f),c)+(e.v!=null?s:"")}return e.l&&r["!links"].push([t,e.l]),e.D&&(l.cm=1),fe("c",s,l)}function iF(e,t,r,n){var i=[],o=[],a=Xe(e["!ref"]),s="",l,u="",c=[],f=0,d=0,h=e["!rows"],m=Array.isArray(e),p={r:u},g,v=-1;for(d=a.s.c;d<=a.e.c;++d)c[d]=Ft(d);for(f=a.s.r;f<=a.e.r;++f){for(o=[],u=_t(f),d=a.s.c;d<=a.e.c;++d){l=c[d]+u;var w=m?(e[f]||[])[d]:e[l];w!==void 0&&(s=nF(w,l,e,t))!=null&&o.push(s)}(o.length>0||h&&h[f])&&(p={r:u},h&&h[f]&&(g=h[f],g.hidden&&(p.hidden=1),v=-1,g.hpx?v=jl(g.hpx):g.hpt&&(v=g.hpt),v>-1&&(p.ht=v,p.customHeight=1),g.level&&(p.outlineLevel=g.level)),i[i.length]=fe("row",o.join(""),p))}if(h)for(;f-1&&(p.ht=v,p.customHeight=1),g.level&&(p.outlineLevel=g.level),i[i.length]=fe("row","",p));return i.join("")}function Hw(e,t,r,n){var i=[at,fe("worksheet",null,{xmlns:Oo[0],"xmlns:r":ft.r})],o=r.SheetNames[e],a=0,s="",l=r.Sheets[o];l==null&&(l={});var u=l["!ref"]||"A1",c=Xe(u);if(c.e.c>16383||c.e.r>1048575){if(t.WTF)throw new Error("Range "+u+" exceeds format limit A1:XFD1048576");c.e.c=Math.min(c.e.c,16383),c.e.r=Math.min(c.e.c,1048575),u=ot(c)}n||(n={}),l["!comments"]=[];var f=[];YO(l,r,e,t,i),i[i.length]=fe("dimension",null,{ref:u}),i[i.length]=rF(l,t,e,r),t.sheetFormat&&(i[i.length]=fe("sheetFormatPr",null,{defaultRowHeight:t.sheetFormat.defaultRowHeight||"16",baseColWidth:t.sheetFormat.baseColWidth||"10",outlineLevelRow:t.sheetFormat.outlineLevelRow||"7"})),l["!cols"]!=null&&l["!cols"].length>0&&(i[i.length]=eF(l,l["!cols"])),i[a=i.length]="",l["!links"]=[],l["!ref"]!=null&&(s=iF(l,t),s.length>0&&(i[i.length]=s)),i.length>a+1&&(i[i.length]="",i[a]=i[a].replace("/>",">")),l["!protect"]&&(i[i.length]=ZO(l["!protect"])),l["!autofilter"]!=null&&(i[i.length]=tF(l["!autofilter"],l,r,e)),l["!merges"]!=null&&l["!merges"].length>0&&(i[i.length]=KO(l["!merges"]));var d=-1,h,m=-1;return l["!links"].length>0&&(i[i.length]="",l["!links"].forEach(function(p){p[1].Target&&(h={ref:p[0]},p[1].Target.charAt(0)!="#"&&(m=Le(n,-1,Be(p[1].Target).replace(/#.*$/,""),ke.HLINK),h["r:id"]="rId"+m),(d=p[1].Target.indexOf("#"))>-1&&(h.location=Be(p[1].Target.slice(d+1))),p[1].Tooltip&&(h.tooltip=Be(p[1].Tooltip)),i[i.length]=fe("hyperlink",null,h))}),i[i.length]=""),delete l["!links"],l["!margins"]!=null&&(i[i.length]=JO(l["!margins"])),(!t||t.ignoreEC||t.ignoreEC==null)&&(i[i.length]=Et("ignoredErrors",fe("ignoredError",null,{numberStoredAsText:1,sqref:u}))),f.length>0&&(m=Le(n,-1,"../drawings/drawing"+(e+1)+".xml",ke.DRAW),i[i.length]=fe("drawing",null,{"r:id":"rId"+m}),l["!drawing"]=f),l["!comments"].length>0&&(m=Le(n,-1,"../drawings/vmlDrawing"+(e+1)+".vml",ke.VML),i[i.length]=fe("legacyDrawing",null,{"r:id":"rId"+m}),l["!legacy"]=m),i.length>1&&(i[i.length]="",i[1]=i[1].replace("/>",">")),i.join("")}function oF(e,t){var r={},n=e.l+t;r.r=e.read_shift(4),e.l+=4;var i=e.read_shift(2);e.l+=1;var o=e.read_shift(1);return e.l=n,o&7&&(r.level=o&7),o&16&&(r.hidden=!0),o&32&&(r.hpt=i/20),r}function aF(e,t,r){var n=Z(145),i=(r["!rows"]||[])[e]||{};n.write_shift(4,e),n.write_shift(4,0);var o=320;i.hpx?o=jl(i.hpx)*20:i.hpt&&(o=i.hpt*20),n.write_shift(2,o),n.write_shift(1,0);var a=0;i.level&&(a|=i.level),i.hidden&&(a|=16),(i.hpx||i.hpt)&&(a|=32),n.write_shift(1,a),n.write_shift(1,0);var s=0,l=n.l;n.l+=4;for(var u={r:e,c:0},c=0;c<16;++c)if(!(t.s.c>c+1<<10||t.e.cn.l?n.slice(0,n.l):n}function sF(e,t,r,n){var i=aF(n,r,t);(i.length>17||(t["!rows"]||[])[n])&&ie(e,0,i)}var lF=Si,uF=Do;function cF(){}function fF(e,t){var r={},n=e[e.l];return++e.l,r.above=!(n&64),r.left=!(n&128),e.l+=18,r.name=E3(e),r}function dF(e,t,r){r==null&&(r=Z(84+4*e.length));var n=192;t&&(t.above&&(n&=-65),t.left&&(n&=-129)),r.write_shift(1,n);for(var i=1;i<3;++i)r.write_shift(1,0);return Vl({auto:1},r),r.write_shift(-4,-1),r.write_shift(-4,-1),rw(e,r),r.slice(0,r.l)}function hF(e){var t=gr(e);return[t]}function pF(e,t,r){return r==null&&(r=Z(8)),yi(t,r)}function gF(e){var t=Ei(e);return[t]}function mF(e,t,r){return r==null&&(r=Z(4)),_i(t,r)}function vF(e){var t=gr(e),r=e.read_shift(1);return[t,r,"b"]}function xF(e,t,r){return r==null&&(r=Z(9)),yi(t,r),r.write_shift(1,e.v?1:0),r}function wF(e){var t=Ei(e),r=e.read_shift(1);return[t,r,"b"]}function yF(e,t,r){return r==null&&(r=Z(5)),_i(t,r),r.write_shift(1,e.v?1:0),r}function EF(e){var t=gr(e),r=e.read_shift(1);return[t,r,"e"]}function _F(e,t,r){return r==null&&(r=Z(9)),yi(t,r),r.write_shift(1,e.v),r}function SF(e){var t=Ei(e),r=e.read_shift(1);return[t,r,"e"]}function TF(e,t,r){return r==null&&(r=Z(8)),_i(t,r),r.write_shift(1,e.v),r.write_shift(2,0),r.write_shift(1,0),r}function CF(e){var t=gr(e),r=e.read_shift(4);return[t,r,"s"]}function AF(e,t,r){return r==null&&(r=Z(12)),yi(t,r),r.write_shift(4,t.v),r}function RF(e){var t=Ei(e),r=e.read_shift(4);return[t,r,"s"]}function OF(e,t,r){return r==null&&(r=Z(8)),_i(t,r),r.write_shift(4,t.v),r}function FF(e){var t=gr(e),r=Po(e);return[t,r,"n"]}function DF(e,t,r){return r==null&&(r=Z(16)),yi(t,r),li(e.v,r),r}function PF(e){var t=Ei(e),r=Po(e);return[t,r,"n"]}function IF(e,t,r){return r==null&&(r=Z(12)),_i(t,r),li(e.v,r),r}function bF(e){var t=gr(e),r=nw(e);return[t,r,"n"]}function kF(e,t,r){return r==null&&(r=Z(12)),yi(t,r),iw(e.v,r),r}function $F(e){var t=Ei(e),r=nw(e);return[t,r,"n"]}function NF(e,t,r){return r==null&&(r=Z(8)),_i(t,r),iw(e.v,r),r}function MF(e){var t=gr(e),r=Hd(e);return[t,r,"is"]}function LF(e){var t=gr(e),r=Dt(e);return[t,r,"str"]}function BF(e,t,r){return r==null&&(r=Z(12+4*e.v.length)),yi(t,r),ht(e.v,r),r.length>r.l?r.slice(0,r.l):r}function UF(e){var t=Ei(e),r=Dt(e);return[t,r,"str"]}function HF(e,t,r){return r==null&&(r=Z(8+4*e.v.length)),_i(t,r),ht(e.v,r),r.length>r.l?r.slice(0,r.l):r}function VF(e,t,r){var n=e.l+t,i=gr(e);i.r=r["!row"];var o=e.read_shift(1),a=[i,o,"b"];if(r.cellFormula){e.l+=2;var s=Ru(e,n-e.l,r);a[3]=xo(s,null,i,r.supbooks,r)}else e.l=n;return a}function WF(e,t,r){var n=e.l+t,i=gr(e);i.r=r["!row"];var o=e.read_shift(1),a=[i,o,"e"];if(r.cellFormula){e.l+=2;var s=Ru(e,n-e.l,r);a[3]=xo(s,null,i,r.supbooks,r)}else e.l=n;return a}function zF(e,t,r){var n=e.l+t,i=gr(e);i.r=r["!row"];var o=Po(e),a=[i,o,"n"];if(r.cellFormula){e.l+=2;var s=Ru(e,n-e.l,r);a[3]=xo(s,null,i,r.supbooks,r)}else e.l=n;return a}function GF(e,t,r){var n=e.l+t,i=gr(e);i.r=r["!row"];var o=Dt(e),a=[i,o,"str"];if(r.cellFormula){e.l+=2;var s=Ru(e,n-e.l,r);a[3]=xo(s,null,i,r.supbooks,r)}else e.l=n;return a}var jF=Si,XF=Do;function KF(e,t){return t==null&&(t=Z(4)),t.write_shift(4,e),t}function YF(e,t){var r=e.l+t,n=Si(e),i=Vd(e),o=Dt(e),a=Dt(e),s=Dt(e);e.l=r;var l={rfx:n,relId:i,loc:o,display:s};return a&&(l.Tooltip=a),l}function qF(e,t){var r=Z(50+4*(e[1].Target.length+(e[1].Tooltip||"").length));Do({s:dt(e[0]),e:dt(e[0])},r),Wd("rId"+t,r);var n=e[1].Target.indexOf("#"),i=n==-1?"":e[1].Target.slice(n+1);return ht(i||"",r),ht(e[1].Tooltip||"",r),ht("",r),r.slice(0,r.l)}function QF(){}function ZF(e,t,r){var n=e.l+t,i=ow(e),o=e.read_shift(1),a=[i];if(a[2]=o,r.cellFormula){var s=UO(e,n-e.l,r);a[1]=s}else e.l=n;return a}function JF(e,t,r){var n=e.l+t,i=Si(e),o=[i];if(r.cellFormula){var a=VO(e,n-e.l,r);o[1]=a,e.l=n}else e.l=n;return o}function eD(e,t,r){r==null&&(r=Z(18));var n=Ou(e,t);r.write_shift(-4,e),r.write_shift(-4,e),r.write_shift(4,(n.width||10)*256),r.write_shift(4,0);var i=0;return t.hidden&&(i|=1),typeof n.width=="number"&&(i|=2),t.level&&(i|=t.level<<8),r.write_shift(2,i),r}var Vw=["left","right","top","bottom","header","footer"];function tD(e){var t={};return Vw.forEach(function(r){t[r]=Po(e)}),t}function rD(e,t){return t==null&&(t=Z(6*8)),Uw(e),Vw.forEach(function(r){li(e[r],t)}),t}function nD(e){var t=e.read_shift(2);return e.l+=28,{RTL:t&32}}function iD(e,t,r){r==null&&(r=Z(30));var n=924;return(((t||{}).Views||[])[0]||{}).RTL&&(n|=32),r.write_shift(2,n),r.write_shift(4,0),r.write_shift(4,0),r.write_shift(4,0),r.write_shift(1,0),r.write_shift(1,0),r.write_shift(2,0),r.write_shift(2,100),r.write_shift(2,0),r.write_shift(2,0),r.write_shift(2,0),r.write_shift(4,0),r}function oD(e){var t=Z(24);return t.write_shift(4,4),t.write_shift(4,1),Do(e,t),t}function aD(e,t){return t==null&&(t=Z(16*4+2)),t.write_shift(2,e.password?Sw(e.password):0),t.write_shift(4,1),[["objects",!1],["scenarios",!1],["formatCells",!0],["formatColumns",!0],["formatRows",!0],["insertColumns",!0],["insertRows",!0],["insertHyperlinks",!0],["deleteColumns",!0],["deleteRows",!0],["selectLockedCells",!1],["sort",!0],["autoFilter",!0],["pivotTables",!0],["selectUnlockedCells",!1]].forEach(function(r){r[1]?t.write_shift(4,e[r[0]]!=null&&!e[r[0]]?1:0):t.write_shift(4,e[r[0]]!=null&&e[r[0]]?0:1)}),t}function sD(){}function lD(){}function uD(e,t,r,n,i,o,a){if(t.v===void 0)return!1;var s="";switch(t.t){case"b":s=t.v?"1":"0";break;case"d":t=Kt(t),t.z=t.z||rt[14],t.v=Xt(Lt(t.v)),t.t="n";break;case"n":case"e":s=""+t.v;break;default:s=t.v;break}var l={r,c:n};switch(l.s=Wn(i.cellXfs,t,i),t.l&&o["!links"].push([Ue(l),t.l]),t.c&&o["!comments"].push([Ue(l),t.c]),t.t){case"s":case"str":return i.bookSST?(s=Yd(i.Strings,t.v,i.revStrings),l.t="s",l.v=s,a?ie(e,18,OF(t,l)):ie(e,7,AF(t,l))):(l.t="str",a?ie(e,17,HF(t,l)):ie(e,6,BF(t,l))),!0;case"n":return t.v==(t.v|0)&&t.v>-1e3&&t.v<1e3?a?ie(e,13,NF(t,l)):ie(e,2,kF(t,l)):a?ie(e,16,IF(t,l)):ie(e,5,DF(t,l)),!0;case"b":return l.t="b",a?ie(e,15,yF(t,l)):ie(e,4,xF(t,l)),!0;case"e":return l.t="e",a?ie(e,14,TF(t,l)):ie(e,3,_F(t,l)),!0}return a?ie(e,12,mF(t,l)):ie(e,1,pF(t,l)),!0}function cD(e,t,r,n){var i=Xe(t["!ref"]||"A1"),o,a="",s=[];ie(e,145);var l=Array.isArray(t),u=i.e.r;t["!rows"]&&(u=Math.max(i.e.r,t["!rows"].length-1));for(var c=i.s.r;c<=u;++c){a=_t(c),sF(e,t,i,c);var f=!1;if(c<=i.e.r)for(var d=i.s.c;d<=i.e.c;++d){c===i.s.r&&(s[d]=Ft(d)),o=s[d]+a;var h=l?(t[c]||[])[d]:t[o];if(!h){f=!1;continue}f=uD(e,h,c,d,n,t,f)}}ie(e,146)}function fD(e,t){!t||!t["!merges"]||(ie(e,177,KF(t["!merges"].length)),t["!merges"].forEach(function(r){ie(e,176,XF(r))}),ie(e,178))}function dD(e,t){!t||!t["!cols"]||(ie(e,390),t["!cols"].forEach(function(r,n){r&&ie(e,60,eD(n,r))}),ie(e,391))}function hD(e,t){!t||!t["!ref"]||(ie(e,648),ie(e,649,oD(Xe(t["!ref"]))),ie(e,650))}function pD(e,t,r){t["!links"].forEach(function(n){if(n[1].Target){var i=Le(r,-1,n[1].Target.replace(/#.*$/,""),ke.HLINK);ie(e,494,qF(n,i))}}),delete t["!links"]}function gD(e,t,r,n){if(t["!comments"].length>0){var i=Le(n,-1,"../drawings/vmlDrawing"+(r+1)+".vml",ke.VML);ie(e,551,Wd("rId"+i)),t["!legacy"]=i}}function mD(e,t,r,n){if(t["!autofilter"]){var i=t["!autofilter"],o=typeof i.ref=="string"?i.ref:ot(i.ref);r.Workbook||(r.Workbook={Sheets:[]}),r.Workbook.Names||(r.Workbook.Names=[]);var a=r.Workbook.Names,s=tr(o);s.s.r==s.e.r&&(s.e.r=tr(t["!ref"]).e.r,o=ot(s));for(var l=0;l16383||l.e.r>1048575){if(t.WTF)throw new Error("Range "+(a["!ref"]||"A1")+" exceeds format limit A1:XFD1048576");l.e.c=Math.min(l.e.c,16383),l.e.r=Math.min(l.e.c,1048575)}return a["!links"]=[],a["!comments"]=[],ie(i,129),(r.vbaraw||a["!outline"])&&ie(i,147,dF(s,a["!outline"])),ie(i,148,uF(l)),vD(i,a,r.Workbook),dD(i,a),cD(i,a,e,t),xD(i,a),mD(i,a,r,e),fD(i,a),pD(i,a,n),a["!margins"]&&ie(i,476,rD(a["!margins"])),(!t||t.ignoreEC||t.ignoreEC==null)&&hD(i,a),gD(i,a,e,n),ie(i,130),i.end()}function yD(e,t){e.l+=10;var r=Dt(e);return{name:r}}var ED=[["allowRefreshQuery",!1,"bool"],["autoCompressPictures",!0,"bool"],["backupFile",!1,"bool"],["checkCompatibility",!1,"bool"],["CodeName",""],["date1904",!1,"bool"],["defaultThemeVersion",0,"int"],["filterPrivacy",!1,"bool"],["hidePivotFieldList",!1,"bool"],["promptedSolutions",!1,"bool"],["publishItems",!1,"bool"],["refreshAllConnections",!1,"bool"],["saveExternalLinkValues",!0,"bool"],["showBorderUnselectedTables",!0,"bool"],["showInkAnnotation",!0,"bool"],["showObjects","all"],["showPivotChartFilter",!1,"bool"],["updateLinks","userSet"]];function _D(e){return!e.Workbook||!e.Workbook.WBProps?"false":J4(e.Workbook.WBProps.date1904)?"true":"false"}var SD="][*?/\\".split("");function Ww(e,t){if(e.length>31){if(t)return!1;throw new Error("Sheet names cannot exceed 31 chars")}var r=!0;return SD.forEach(function(n){if(e.indexOf(n)!=-1){if(!t)throw new Error("Sheet name cannot contain : \\ / ? * [ ]");r=!1}}),r}function TD(e,t,r){e.forEach(function(n,i){Ww(n);for(var o=0;o22)throw new Error("Bad Code Name: Worksheet"+a)}})}function CD(e){if(!e||!e.SheetNames||!e.Sheets)throw new Error("Invalid Workbook");if(!e.SheetNames.length)throw new Error("Workbook is empty");var t=e.Workbook&&e.Workbook.Sheets||[];TD(e.SheetNames,t,!!e.vbaraw);for(var r=0;r0,n={codeName:"ThisWorkbook"};e.Workbook&&e.Workbook.WBProps&&(ED.forEach(function(s){e.Workbook.WBProps[s[0]]!=null&&e.Workbook.WBProps[s[0]]!=s[1]&&(n[s[0]]=e.Workbook.WBProps[s[0]])}),e.Workbook.WBProps.CodeName&&(n.codeName=e.Workbook.WBProps.CodeName,delete n.CodeName)),t[t.length]=fe("workbookPr",null,n);var i=e.Workbook&&e.Workbook.Sheets||[],o=0;if(i&&i[0]&&i[0].Hidden){for(t[t.length]="",o=0;o!=e.SheetNames.length&&!(!i[o]||!i[o].Hidden);++o);o==e.SheetNames.length&&(o=0),t[t.length]='',t[t.length]=""}for(t[t.length]="",o=0;o!=e.SheetNames.length;++o){var a={name:Be(e.SheetNames[o].slice(0,31))};if(a.sheetId=""+(o+1),a["r:id"]="rId"+(o+1),i[o])switch(i[o].Hidden){case 1:a.state="hidden";break;case 2:a.state="veryHidden";break}t[t.length]=fe("sheet",null,a)}return t[t.length]="",r&&(t[t.length]="",e.Workbook&&e.Workbook.Names&&e.Workbook.Names.forEach(function(s){var l={name:s.Name};s.Comment&&(l.comment=s.Comment),s.Sheet!=null&&(l.localSheetId=""+s.Sheet),s.Hidden&&(l.hidden="1"),s.Ref&&(t[t.length]=fe("definedName",Be(s.Ref),l))}),t[t.length]=""),t.length>2&&(t[t.length]="",t[1]=t[1].replace("/>",">")),t.join("")}function AD(e,t){var r={};return r.Hidden=e.read_shift(4),r.iTabID=e.read_shift(4),r.strRelID=Jf(e),r.name=Dt(e),r}function RD(e,t){return t||(t=Z(127)),t.write_shift(4,e.Hidden),t.write_shift(4,e.iTabID),Wd(e.strRelID,t),ht(e.name.slice(0,31),t),t.length>t.l?t.slice(0,t.l):t}function OD(e,t){var r={},n=e.read_shift(4);r.defaultThemeVersion=e.read_shift(4);var i=t>8?Dt(e):"";return i.length>0&&(r.CodeName=i),r.autoCompressPictures=!!(n&65536),r.backupFile=!!(n&64),r.checkCompatibility=!!(n&4096),r.date1904=!!(n&1),r.filterPrivacy=!!(n&8),r.hidePivotFieldList=!!(n&1024),r.promptedSolutions=!!(n&16),r.publishItems=!!(n&2048),r.refreshAllConnections=!!(n&262144),r.saveExternalLinkValues=!!(n&128),r.showBorderUnselectedTables=!!(n&4),r.showInkAnnotation=!!(n&32),r.showObjects=["all","placeholders","none"][n>>13&3],r.showPivotChartFilter=!!(n&32768),r.updateLinks=["userSet","never","always"][n>>8&3],r}function FD(e,t){t||(t=Z(72));var r=0;return e&&e.filterPrivacy&&(r|=8),t.write_shift(4,r),t.write_shift(4,0),rw(e&&e.CodeName||"ThisWorkbook",t),t.slice(0,t.l)}function DD(e,t,r){var n=e.l+t;e.l+=4,e.l+=1;var i=e.read_shift(4),o=_3(e),a=HO(e,0,r),s=Vd(e);e.l=n;var l={Name:o,Ptg:a};return i<268435455&&(l.Sheet=i),s&&(l.Comment=s),l}function PD(e,t){ie(e,143);for(var r=0;r!=t.SheetNames.length;++r){var n=t.Workbook&&t.Workbook.Sheets&&t.Workbook.Sheets[r]&&t.Workbook.Sheets[r].Hidden||0,i={Hidden:n,iTabID:r+1,strRelID:"rId"+(r+1),name:t.SheetNames[r]};ie(e,156,RD(i))}ie(e,144)}function ID(e,t){t||(t=Z(127));for(var r=0;r!=4;++r)t.write_shift(4,0);return ht("SheetJS",t),ht($l.version,t),ht($l.version,t),ht("7262",t),t.length>t.l?t.slice(0,t.l):t}function bD(e,t){t||(t=Z(29)),t.write_shift(-4,0),t.write_shift(-4,460),t.write_shift(4,28800),t.write_shift(4,17600),t.write_shift(4,500),t.write_shift(4,e),t.write_shift(4,e);var r=120;return t.write_shift(1,r),t.length>t.l?t.slice(0,t.l):t}function kD(e,t){if(!(!t.Workbook||!t.Workbook.Sheets)){for(var r=t.Workbook.Sheets,n=0,i=-1,o=-1;ni||(ie(e,135),ie(e,158,bD(i)),ie(e,136))}}function $D(e,t){var r=jt();return ie(r,131),ie(r,128,ID()),ie(r,153,FD(e.Workbook&&e.Workbook.WBProps||null)),kD(r,e),PD(r,e),ie(r,132),r.end()}function ND(e,t,r){return(t.slice(-4)===".bin"?$D:zw)(e)}function MD(e,t,r,n,i){return(t.slice(-4)===".bin"?wD:Hw)(e,r,n,i)}function LD(e,t,r){return(t.slice(-4)===".bin"?rR:Aw)(e,r)}function BD(e,t,r){return(t.slice(-4)===".bin"?FA:_w)(e,r)}function UD(e,t,r){return(t.slice(-4)===".bin"?xR:Pw)(e)}function HD(e){return(e.slice(-4)===".bin"?cR:Fw)()}function VD(e,t){var r=[];return e.Props&&r.push(L3(e.Props,t)),e.Custprops&&r.push(B3(e.Props,e.Custprops)),r.join("")}function WD(){return""}function zD(e,t){var r=[''];return t.cellXfs.forEach(function(n,i){var o=[];o.push(fe("NumberFormat",null,{"ss:Format":Be(rt[n.numFmtId])}));var a={"ss:ID":"s"+(21+i)};r.push(fe("Style",o.join(""),a))}),fe("Styles",r.join(""))}function Gw(e){return fe("NamedRange",null,{"ss:Name":e.Name,"ss:RefersTo":"="+Xd(e.Ref,{r:0,c:0})})}function GD(e){if(!((e||{}).Workbook||{}).Names)return"";for(var t=e.Workbook.Names,r=[],n=0;n"),e["!margins"].header&&i.push(fe("Header",null,{"x:Margin":e["!margins"].header})),e["!margins"].footer&&i.push(fe("Footer",null,{"x:Margin":e["!margins"].footer})),i.push(fe("PageMargins",null,{"x:Bottom":e["!margins"].bottom||"0.75","x:Left":e["!margins"].left||"0.7","x:Right":e["!margins"].right||"0.7","x:Top":e["!margins"].top||"0.75"})),i.push("")),n&&n.Workbook&&n.Workbook.Sheets&&n.Workbook.Sheets[r])if(n.Workbook.Sheets[r].Hidden)i.push(fe("Visible",n.Workbook.Sheets[r].Hidden==1?"SheetHidden":"SheetVeryHidden",{}));else{for(var o=0;o")}return((((n||{}).Workbook||{}).Views||[])[0]||{}).RTL&&i.push(""),e["!protect"]&&(i.push(Et("ProtectContents","True")),e["!protect"].objects&&i.push(Et("ProtectObjects","True")),e["!protect"].scenarios&&i.push(Et("ProtectScenarios","True")),e["!protect"].selectLockedCells!=null&&!e["!protect"].selectLockedCells?i.push(Et("EnableSelection","NoSelection")):e["!protect"].selectUnlockedCells!=null&&!e["!protect"].selectUnlockedCells&&i.push(Et("EnableSelection","UnlockedCells")),[["formatCells","AllowFormatCells"],["formatColumns","AllowSizeCols"],["formatRows","AllowSizeRows"],["insertColumns","AllowInsertCols"],["insertRows","AllowInsertRows"],["insertHyperlinks","AllowInsertHyperlinks"],["deleteColumns","AllowDeleteCols"],["deleteRows","AllowDeleteRows"],["sort","AllowSort"],["autoFilter","AllowFilter"],["pivotTables","AllowUsePivotTables"]].forEach(function(a){e["!protect"][a[0]]&&i.push("<"+a[1]+"/>")})),i.length==0?"":fe("WorksheetOptions",i.join(""),{xmlns:Qt.x})}function KD(e){return e.map(function(t){var r=Z4(t.t||""),n=fe("ss:Data",r,{xmlns:"http://www.w3.org/TR/REC-html40"});return fe("Comment",n,{"ss:Author":t.a})}).join("")}function YD(e,t,r,n,i,o,a){if(!e||e.v==null&&e.f==null)return"";var s={};if(e.f&&(s["ss:Formula"]="="+Be(Xd(e.f,a))),e.F&&e.F.slice(0,t.length)==t){var l=dt(e.F.slice(t.length+1));s["ss:ArrayRange"]="RC:R"+(l.r==a.r?"":"["+(l.r-a.r)+"]")+"C"+(l.c==a.c?"":"["+(l.c-a.c)+"]")}if(e.l&&e.l.Target&&(s["ss:HRef"]=Be(e.l.Target),e.l.Tooltip&&(s["x:HRefScreenTip"]=Be(e.l.Tooltip))),r["!merges"])for(var u=r["!merges"],c=0;c!=u.length;++c)u[c].s.c!=a.c||u[c].s.r!=a.r||(u[c].e.c>u[c].s.c&&(s["ss:MergeAcross"]=u[c].e.c-u[c].s.c),u[c].e.r>u[c].s.r&&(s["ss:MergeDown"]=u[c].e.r-u[c].s.r));var f="",d="";switch(e.t){case"z":if(!n.sheetStubs)return"";break;case"n":f="Number",d=String(e.v);break;case"b":f="Boolean",d=e.v?"1":"0";break;case"e":f="Error",d=ss[e.v];break;case"d":f="DateTime",d=new Date(e.v).toISOString(),e.z==null&&(e.z=e.z||rt[14]);break;case"s":f="String",d=Q4(e.v||"");break}var h=Wn(n.cellXfs,e,n);s["ss:StyleID"]="s"+(21+h),s["ss:Index"]=a.c+1;var m=e.v!=null?d:"",p=e.t=="z"?"":''+m+"";return(e.c||[]).length>0&&(p+=KD(e.c)),fe("Cell",p,s)}function qD(e,t){var r='"}function QD(e,t,r,n){if(!e["!ref"])return"";var i=Xe(e["!ref"]),o=e["!merges"]||[],a=0,s=[];e["!cols"]&&e["!cols"].forEach(function(g,v){Gd(g);var w=!!g.width,y=Ou(v,g),E={"ss:Index":v+1};w&&(E["ss:Width"]=zl(y.width)),g.hidden&&(E["ss:Hidden"]="1"),s.push(fe("Column",null,E))});for(var l=Array.isArray(e),u=i.s.r;u<=i.e.r;++u){for(var c=[qD(u,(e["!rows"]||[])[u])],f=i.s.c;f<=i.e.c;++f){var d=!1;for(a=0;a!=o.length;++a)if(!(o[a].s.c>f)&&!(o[a].s.r>u)&&!(o[a].e.c"),c.length>2&&s.push(c.join(""))}return s.join("")}function ZD(e,t,r){var n=[],i=r.SheetNames[e],o=r.Sheets[i],a=o?jD(o,t,e,r):"";return a.length>0&&n.push(""+a+""),a=o?QD(o,t,e,r):"",a.length>0&&n.push(""+a+"
"),n.push(XD(o,t,e,r)),n.join("")}function JD(e,t){t||(t={}),e.SSF||(e.SSF=Kt(rt)),e.SSF&&(Su(),_u(e.SSF),t.revssf=Tu(e.SSF),t.revssf[e.SSF[65535]]=0,t.ssf=e.SSF,t.cellXfs=[],Wn(t.cellXfs,{},{revssf:{General:0}}));var r=[];r.push(VD(e,t)),r.push(WD()),r.push(""),r.push("");for(var n=0;n-1||dw.indexOf(i[o][0])>-1||i[o][1]!=null&&u.push(i[o]);n.length&&He.utils.cfb_add(t,"/SummaryInformation",Bg(n,Mc.SI,l,kg)),(r.length||u.length)&&He.utils.cfb_add(t,"/DocumentSummaryInformation",Bg(r,Mc.DSI,s,bg,u.length?u:null,Mc.UDI))}function t6(e,t){var r=t||{},n=He.utils.cfb_new({root:"R"}),i="/Workbook";switch(r.bookType||"xls"){case"xls":r.bookType="biff8";case"xla":r.bookType||(r.bookType="xla");case"biff8":i="/Workbook",r.biff=8;break;case"biff5":i="/Book",r.biff=5;break;default:throw new Error("invalid type "+r.bookType+" for XLS CFB")}return He.utils.cfb_add(n,i,jw(e,r)),r.biff==8&&(e.Props||e.Custprops)&&e6(e,n),r.biff==8&&e.vbaraw&&wR(n,He.read(e.vbaraw,{type:typeof e.vbaraw=="string"?"binary":"buffer"})),n}var r6={0:{f:oF},1:{f:hF},2:{f:bF},3:{f:EF},4:{f:vF},5:{f:FF},6:{f:LF},7:{f:CF},8:{f:GF},9:{f:zF},10:{f:VF},11:{f:WF},12:{f:gF},13:{f:$F},14:{f:SF},15:{f:wF},16:{f:PF},17:{f:UF},18:{f:RF},19:{f:Hd},20:{},21:{},22:{},23:{},24:{},25:{},26:{},27:{},28:{},29:{},30:{},31:{},32:{},33:{},34:{},35:{T:1},36:{T:-1},37:{T:1},38:{T:-1},39:{f:DD},40:{},42:{},43:{f:LA},44:{f:NA},45:{f:HA},46:{f:WA},47:{f:VA},48:{},49:{f:g3},50:{},51:{f:oR},52:{T:1},53:{T:-1},54:{T:1},55:{T:-1},56:{T:1},57:{T:-1},58:{},59:{},60:{f:mA},62:{f:MF},63:{f:fR},64:{f:sD},65:{},66:{},67:{},68:{},69:{},70:{},128:{},129:{T:1},130:{T:-1},131:{T:1,f:$r,p:0},132:{T:-1},133:{T:1},134:{T:-1},135:{T:1},136:{T:-1},137:{T:1,f:nD},138:{T:-1},139:{T:1},140:{T:-1},141:{T:1},142:{T:-1},143:{T:1},144:{T:-1},145:{T:1},146:{T:-1},147:{f:fF},148:{f:lF,p:16},151:{f:QF},152:{},153:{f:OD},154:{},155:{},156:{f:AD},157:{},158:{},159:{T:1,f:AA},160:{T:-1},161:{T:1,f:Si},162:{T:-1},163:{T:1},164:{T:-1},165:{T:1},166:{T:-1},167:{},168:{},169:{},170:{},171:{},172:{T:1},173:{T:-1},174:{},175:{},176:{f:jF},177:{T:1},178:{T:-1},179:{T:1},180:{T:-1},181:{T:1},182:{T:-1},183:{T:1},184:{T:-1},185:{T:1},186:{T:-1},187:{T:1},188:{T:-1},189:{T:1},190:{T:-1},191:{T:1},192:{T:-1},193:{T:1},194:{T:-1},195:{T:1},196:{T:-1},197:{T:1},198:{T:-1},199:{T:1},200:{T:-1},201:{T:1},202:{T:-1},203:{T:1},204:{T:-1},205:{T:1},206:{T:-1},207:{T:1},208:{T:-1},209:{T:1},210:{T:-1},211:{T:1},212:{T:-1},213:{T:1},214:{T:-1},215:{T:1},216:{T:-1},217:{T:1},218:{T:-1},219:{T:1},220:{T:-1},221:{T:1},222:{T:-1},223:{T:1},224:{T:-1},225:{T:1},226:{T:-1},227:{T:1},228:{T:-1},229:{T:1},230:{T:-1},231:{T:1},232:{T:-1},233:{T:1},234:{T:-1},235:{T:1},236:{T:-1},237:{T:1},238:{T:-1},239:{T:1},240:{T:-1},241:{T:1},242:{T:-1},243:{T:1},244:{T:-1},245:{T:1},246:{T:-1},247:{T:1},248:{T:-1},249:{T:1},250:{T:-1},251:{T:1},252:{T:-1},253:{T:1},254:{T:-1},255:{T:1},256:{T:-1},257:{T:1},258:{T:-1},259:{T:1},260:{T:-1},261:{T:1},262:{T:-1},263:{T:1},264:{T:-1},265:{T:1},266:{T:-1},267:{T:1},268:{T:-1},269:{T:1},270:{T:-1},271:{T:1},272:{T:-1},273:{T:1},274:{T:-1},275:{T:1},276:{T:-1},277:{},278:{T:1},279:{T:-1},280:{T:1},281:{T:-1},282:{T:1},283:{T:1},284:{T:-1},285:{T:1},286:{T:-1},287:{T:1},288:{T:-1},289:{T:1},290:{T:-1},291:{T:1},292:{T:-1},293:{T:1},294:{T:-1},295:{T:1},296:{T:-1},297:{T:1},298:{T:-1},299:{T:1},300:{T:-1},301:{T:1},302:{T:-1},303:{T:1},304:{T:-1},305:{T:1},306:{T:-1},307:{T:1},308:{T:-1},309:{T:1},310:{T:-1},311:{T:1},312:{T:-1},313:{T:-1},314:{T:1},315:{T:-1},316:{T:1},317:{T:-1},318:{T:1},319:{T:-1},320:{T:1},321:{T:-1},322:{T:1},323:{T:-1},324:{T:1},325:{T:-1},326:{T:1},327:{T:-1},328:{T:1},329:{T:-1},330:{T:1},331:{T:-1},332:{T:1},333:{T:-1},334:{T:1},335:{f:nR},336:{T:-1},337:{f:lR,T:1},338:{T:-1},339:{T:1},340:{T:-1},341:{T:1},342:{T:-1},343:{T:1},344:{T:-1},345:{T:1},346:{T:-1},347:{T:1},348:{T:-1},349:{T:1},350:{T:-1},351:{},352:{},353:{T:1},354:{T:-1},355:{f:Jf},357:{},358:{},359:{},360:{T:1},361:{},362:{f:cA},363:{},364:{},366:{},367:{},368:{},369:{},370:{},371:{},372:{T:1},373:{T:-1},374:{T:1},375:{T:-1},376:{T:1},377:{T:-1},378:{T:1},379:{T:-1},380:{T:1},381:{T:-1},382:{T:1},383:{T:-1},384:{T:1},385:{T:-1},386:{T:1},387:{T:-1},388:{T:1},389:{T:-1},390:{T:1},391:{T:-1},392:{T:1},393:{T:-1},394:{T:1},395:{T:-1},396:{},397:{},398:{},399:{},400:{},401:{T:1},403:{},404:{},405:{},406:{},407:{},408:{},409:{},410:{},411:{},412:{},413:{},414:{},415:{},416:{},417:{},418:{},419:{},420:{},421:{},422:{T:1},423:{T:1},424:{T:-1},425:{T:-1},426:{f:ZF},427:{f:JF},428:{},429:{T:1},430:{T:-1},431:{T:1},432:{T:-1},433:{T:1},434:{T:-1},435:{T:1},436:{T:-1},437:{T:1},438:{T:-1},439:{T:1},440:{T:-1},441:{T:1},442:{T:-1},443:{T:1},444:{T:-1},445:{T:1},446:{T:-1},447:{T:1},448:{T:-1},449:{T:1},450:{T:-1},451:{T:1},452:{T:-1},453:{T:1},454:{T:-1},455:{T:1},456:{T:-1},457:{T:1},458:{T:-1},459:{T:1},460:{T:-1},461:{T:1},462:{T:-1},463:{T:1},464:{T:-1},465:{T:1},466:{T:-1},467:{T:1},468:{T:-1},469:{T:1},470:{T:-1},471:{},472:{},473:{T:1},474:{T:-1},475:{},476:{f:tD},477:{},478:{},479:{T:1},480:{T:-1},481:{T:1},482:{T:-1},483:{T:1},484:{T:-1},485:{f:cF},486:{T:1},487:{T:-1},488:{T:1},489:{T:-1},490:{T:1},491:{T:-1},492:{T:1},493:{T:-1},494:{f:YF},495:{T:1},496:{T:-1},497:{T:1},498:{T:-1},499:{},500:{T:1},501:{T:-1},502:{T:1},503:{T:-1},504:{},505:{T:1},506:{T:-1},507:{},508:{T:1},509:{T:-1},510:{T:1},511:{T:-1},512:{},513:{},514:{T:1},515:{T:-1},516:{T:1},517:{T:-1},518:{T:1},519:{T:-1},520:{T:1},521:{T:-1},522:{},523:{},524:{},525:{},526:{},527:{},528:{T:1},529:{T:-1},530:{T:1},531:{T:-1},532:{T:1},533:{T:-1},534:{},535:{},536:{},537:{},538:{T:1},539:{T:-1},540:{T:1},541:{T:-1},542:{T:1},548:{},549:{},550:{f:Jf},551:{},552:{},553:{},554:{T:1},555:{T:-1},556:{T:1},557:{T:-1},558:{T:1},559:{T:-1},560:{T:1},561:{T:-1},562:{},564:{},565:{T:1},566:{T:-1},569:{T:1},570:{T:-1},572:{},573:{T:1},574:{T:-1},577:{},578:{},579:{},580:{},581:{},582:{},583:{},584:{},585:{},586:{},587:{},588:{T:-1},589:{},590:{T:1},591:{T:-1},592:{T:1},593:{T:-1},594:{T:1},595:{T:-1},596:{},597:{T:1},598:{T:-1},599:{T:1},600:{T:-1},601:{T:1},602:{T:-1},603:{T:1},604:{T:-1},605:{T:1},606:{T:-1},607:{},608:{T:1},609:{T:-1},610:{},611:{T:1},612:{T:-1},613:{T:1},614:{T:-1},615:{T:1},616:{T:-1},617:{T:1},618:{T:-1},619:{T:1},620:{T:-1},625:{},626:{T:1},627:{T:-1},628:{T:1},629:{T:-1},630:{T:1},631:{T:-1},632:{f:mR},633:{T:1},634:{T:-1},635:{T:1,f:pR},636:{T:-1},637:{f:w3},638:{T:1},639:{},640:{T:-1},641:{T:1},642:{T:-1},643:{T:1},644:{},645:{T:-1},646:{T:1},648:{T:1},649:{},650:{T:-1},651:{f:yD},652:{},653:{T:1},654:{T:-1},655:{T:1},656:{T:-1},657:{T:1},658:{T:-1},659:{},660:{T:1},661:{},662:{T:-1},663:{},664:{T:1},665:{},666:{T:-1},667:{},668:{},669:{},671:{T:1},672:{T:-1},673:{T:1},674:{T:-1},675:{},676:{},677:{},678:{},679:{},680:{},681:{},1024:{},1025:{},1026:{T:1},1027:{T:-1},1028:{T:1},1029:{T:-1},1030:{},1031:{T:1},1032:{T:-1},1033:{T:1},1034:{T:-1},1035:{},1036:{},1037:{},1038:{T:1},1039:{T:-1},1040:{},1041:{T:1},1042:{T:-1},1043:{},1044:{},1045:{},1046:{T:1},1047:{T:-1},1048:{T:1},1049:{T:-1},1050:{},1051:{T:1},1052:{T:1},1053:{f:lD},1054:{T:1},1055:{},1056:{T:1},1057:{T:-1},1058:{T:1},1059:{T:-1},1061:{},1062:{T:1},1063:{T:-1},1064:{T:1},1065:{T:-1},1066:{T:1},1067:{T:-1},1068:{T:1},1069:{T:-1},1070:{T:1},1071:{T:-1},1072:{T:1},1073:{T:-1},1075:{T:1},1076:{T:-1},1077:{T:1},1078:{T:-1},1079:{T:1},1080:{T:-1},1081:{T:1},1082:{T:-1},1083:{T:1},1084:{T:-1},1085:{},1086:{T:1},1087:{T:-1},1088:{T:1},1089:{T:-1},1090:{T:1},1091:{T:-1},1092:{T:1},1093:{T:-1},1094:{T:1},1095:{T:-1},1096:{},1097:{T:1},1098:{},1099:{T:-1},1100:{T:1},1101:{T:-1},1102:{},1103:{},1104:{},1105:{},1111:{},1112:{},1113:{T:1},1114:{T:-1},1115:{T:1},1116:{T:-1},1117:{},1118:{T:1},1119:{T:-1},1120:{T:1},1121:{T:-1},1122:{T:1},1123:{T:-1},1124:{T:1},1125:{T:-1},1126:{},1128:{T:1},1129:{T:-1},1130:{},1131:{T:1},1132:{T:-1},1133:{T:1},1134:{T:-1},1135:{T:1},1136:{T:-1},1137:{T:1},1138:{T:-1},1139:{T:1},1140:{T:-1},1141:{},1142:{T:1},1143:{T:-1},1144:{T:1},1145:{T:-1},1146:{},1147:{T:1},1148:{T:-1},1149:{T:1},1150:{T:-1},1152:{T:1},1153:{T:-1},1154:{T:-1},1155:{T:-1},1156:{T:-1},1157:{T:1},1158:{T:-1},1159:{T:1},1160:{T:-1},1161:{T:1},1162:{T:-1},1163:{T:1},1164:{T:-1},1165:{T:1},1166:{T:-1},1167:{T:1},1168:{T:-1},1169:{T:1},1170:{T:-1},1171:{},1172:{T:1},1173:{T:-1},1177:{},1178:{T:1},1180:{},1181:{},1182:{},2048:{T:1},2049:{T:-1},2050:{},2051:{T:1},2052:{T:-1},2053:{},2054:{},2055:{T:1},2056:{T:-1},2057:{T:1},2058:{T:-1},2060:{},2067:{},2068:{T:1},2069:{T:-1},2070:{},2071:{},2072:{T:1},2073:{T:-1},2075:{},2076:{},2077:{T:1},2078:{T:-1},2079:{},2080:{T:1},2081:{T:-1},2082:{},2083:{T:1},2084:{T:-1},2085:{T:1},2086:{T:-1},2087:{T:1},2088:{T:-1},2089:{T:1},2090:{T:-1},2091:{},2092:{},2093:{T:1},2094:{T:-1},2095:{},2096:{T:1},2097:{T:-1},2098:{T:1},2099:{T:-1},2100:{T:1},2101:{T:-1},2102:{},2103:{T:1},2104:{T:-1},2105:{},2106:{T:1},2107:{T:-1},2108:{},2109:{T:1},2110:{T:-1},2111:{T:1},2112:{T:-1},2113:{T:1},2114:{T:-1},2115:{},2116:{},2117:{},2118:{T:1},2119:{T:-1},2120:{},2121:{T:1},2122:{T:-1},2123:{T:1},2124:{T:-1},2125:{},2126:{T:1},2127:{T:-1},2128:{},2129:{T:1},2130:{T:-1},2131:{T:1},2132:{T:-1},2133:{T:1},2134:{},2135:{},2136:{},2137:{T:1},2138:{T:-1},2139:{T:1},2140:{T:-1},2141:{},3072:{},3073:{},4096:{T:1},4097:{T:-1},5002:{T:1},5003:{T:-1},5081:{T:1},5082:{T:-1},5083:{},5084:{T:1},5085:{T:-1},5086:{T:1},5087:{T:-1},5088:{},5089:{},5090:{},5092:{T:1},5093:{T:-1},5094:{},5095:{T:1},5096:{T:-1},5097:{},5099:{},65535:{n:""}};function de(e,t,r,n){var i=t;if(!isNaN(i)){var o=n||(r||[]).length||0,a=e.next(4);a.write_shift(2,i),a.write_shift(2,o),o>0&&Ld(r)&&e.push(r)}}function n6(e,t,r,n){var i=n||(r||[]).length||0;if(i<=8224)return de(e,t,r,i);var o=t;if(!isNaN(o)){for(var a=r.parts||[],s=0,l=0,u=0;u+(a[s]||8224)<=8224;)u+=a[s]||8224,s++;var c=e.next(4);for(c.write_shift(2,o),c.write_shift(2,u),e.push(r.slice(l,l+u)),l+=u;l=0&&i<65536?de(e,2,yA(r,n,i)):de(e,3,wA(r,n,i));return;case"b":case"e":de(e,5,i6(r,n,t.v,t.t));return;case"s":case"str":de(e,4,o6(r,n,(t.v||"").slice(0,255)));return}de(e,1,us(null,r,n))}function s6(e,t,r,n){var i=Array.isArray(t),o=Xe(t["!ref"]||"A1"),a,s="",l=[];if(o.e.c>255||o.e.r>16383){if(n.WTF)throw new Error("Range "+(t["!ref"]||"A1")+" exceeds format limit A1:IV16384");o.e.c=Math.min(o.e.c,255),o.e.r=Math.min(o.e.c,16383),a=ot(o)}for(var u=o.s.r;u<=o.e.r;++u){s=_t(u);for(var c=o.s.c;c<=o.e.c;++c){u===o.s.r&&(l[c]=Ft(c)),a=l[c]+s;var f=i?(t[u]||[])[c]:t[a];f&&a6(e,f,u,c)}}}function l6(e,t){for(var r=t||{},n=jt(),i=0,o=0;o255||h.e.r>=m){if(t.WTF)throw new Error("Range "+(o["!ref"]||"A1")+" exceeds format limit A1:IV16384");h.e.c=Math.min(h.e.c,255),h.e.r=Math.min(h.e.c,m-1)}de(n,2057,zd(r,16,t)),de(n,13,ar(1)),de(n,12,ar(100)),de(n,15,$t(!0)),de(n,17,$t(!1)),de(n,16,li(.001)),de(n,95,$t(!0)),de(n,42,$t(!1)),de(n,43,$t(!1)),de(n,130,ar(1)),de(n,128,sA([0,0])),de(n,131,$t(!1)),de(n,132,$t(!1)),u&&p6(n,o["!cols"]),de(n,512,aA(h,t)),u&&(o["!links"]=[]);for(var p=h.s.r;p<=h.e.r;++p){f=_t(p);for(var g=h.s.c;g<=h.e.c;++g){p===h.s.r&&(d[g]=Ft(g)),c=d[g]+f;var v=l?(o[p]||[])[g]:o[c];v&&(g6(n,v,p,g,t),u&&v.l&&o["!links"].push([c,v.l]))}}var w=s.CodeName||s.name||i;return u&&de(n,574,tA((a.Views||[])[0])),u&&(o["!merges"]||[]).length&&de(n,229,dA(o["!merges"])),u&&h6(n,o),de(n,442,ww(w)),u&&f6(n,o),de(n,10),n.end()}function v6(e,t,r){var n=jt(),i=(e||{}).Workbook||{},o=i.Sheets||[],a=i.WBProps||{},s=r.biff==8,l=r.biff==5;if(de(n,2057,zd(e,5,r)),r.bookType=="xla"&&de(n,135),de(n,225,s?ar(1200):null),de(n,193,V3(2)),l&&de(n,191),l&&de(n,192),de(n,226),de(n,92,Q3("SheetJS",r)),de(n,66,ar(s?1200:1252)),s&&de(n,353,ar(0)),s&&de(n,448),de(n,317,xA(e.SheetNames.length)),s&&e.vbaraw&&de(n,211),s&&e.vbaraw){var u=a.CodeName||"ThisWorkbook";de(n,442,ww(u))}de(n,156,ar(17)),de(n,25,$t(!1)),de(n,18,$t(!1)),de(n,19,ar(0)),s&&de(n,431,$t(!1)),s&&de(n,444,ar(0)),de(n,61,eA()),de(n,64,$t(!1)),de(n,141,ar(0)),de(n,34,$t(_D(e)=="true")),de(n,14,$t(!0)),s&&de(n,439,$t(!1)),de(n,218,ar(0)),u6(n,e,r),c6(n,e.SSF,r),d6(n,r),s&&de(n,352,$t(!1));var c=n.end(),f=jt();s&&de(f,140,gA()),s&&r.Strings&&n6(f,252,J3(r.Strings)),de(f,10);var d=f.end(),h=jt(),m=0,p=0;for(p=0;p255&&typeof console<"u"&&console.error&&console.error("Worksheet '"+e.SheetNames[r]+"' extends beyond column IV (255). Data may be lost.")}}var o=t||{};switch(o.biff||2){case 8:case 5:return x6(e,t);case 4:case 3:case 2:return l6(e,t)}throw new Error("invalid type "+o.bookType+" for BIFF")}function w6(e,t,r,n){for(var i=e["!merges"]||[],o=[],a=t.s.c;a<=t.e.c;++a){for(var s=0,l=0,u=0;ur||i[u].s.c>a)&&!(i[u].e.r1&&(h.rowspan=s),l>1&&(h.colspan=l),n.editable?d=''+d+"":f&&(h["data-t"]=f&&f.t||"z",f.v!=null&&(h["data-v"]=f.v),f.z!=null&&(h["data-z"]=f.z),f.l&&(f.l.Target||"#").charAt(0)!="#"&&(d=''+d+"")),h.id=(n.id||"sjs")+"-"+c,o.push(fe("td",d,h))}}var m="";return m+o.join("")+""}var y6='SheetJS Table Export',E6="";function _6(e,t,r){var n=[];return n.join("")+""}function Xw(e,t){var r=t||{},n=r.header!=null?r.header:y6,i=r.footer!=null?r.footer:E6,o=[n],a=tr(e["!ref"]);r.dense=Array.isArray(e),o.push(_6(e,a,r));for(var s=a.s.r;s<=a.e.r;++s)o.push(w6(e,a,s,r));return o.push(""+i),o.join("")}function Kw(e,t,r){var n=r||{},i=0,o=0;if(n.origin!=null)if(typeof n.origin=="number")i=n.origin;else{var a=typeof n.origin=="string"?dt(n.origin):n.origin;i=a.r,o=a.c}var s=t.getElementsByTagName("tr"),l=Math.min(n.sheetRows||1e7,s.length),u={s:{r:0,c:0},e:{r:i,c:o}};if(e["!ref"]){var c=tr(e["!ref"]);u.s.r=Math.min(u.s.r,c.s.r),u.s.c=Math.min(u.s.c,c.s.c),u.e.r=Math.max(u.e.r,c.e.r),u.e.c=Math.max(u.e.c,c.e.c),i==-1&&(u.e.r=i=c.e.r+1)}var f=[],d=0,h=e["!rows"]||(e["!rows"]=[]),m=0,p=0,g=0,v=0,w=0,y=0;for(e["!cols"]||(e["!cols"]=[]);m1||y>1)&&f.push({s:{r:p+i,c:v+o},e:{r:p+i+(w||1)-1,c:v+o+(y||1)-1}});var L={t:"s",v:S},B=k.getAttribute("data-t")||k.getAttribute("t")||"";S!=null&&(S.length==0?L.t=B||"z":n.raw||S.trim().length==0||B=="s"||(S==="TRUE"?L={t:"b",v:!0}:S==="FALSE"?L={t:"b",v:!1}:isNaN(Qr(S))?isNaN(Wa(S).getDate())||(L={t:"d",v:Lt(S)},n.cellDates||(L={t:"n",v:Xt(L.v)}),L.z=n.dateNF||rt[14]):L={t:"n",v:Qr(S)})),L.z===void 0&&C!=null&&(L.z=C);var U="",H=k.getElementsByTagName("A");if(H&&H.length)for(var G=0;G=l&&(e["!fullref"]=ot((u.e.r=s.length-m+p-1+i,u))),e}function Yw(e,t){var r=t||{},n=r.dense?[]:{};return Kw(n,e,t)}function S6(e,t){return wi(Yw(e,t),t)}function Kg(e){var t="",r=T6(e);return r&&(t=r(e).getPropertyValue("display")),t||(t=e.style&&e.style.display),t==="none"}function T6(e){return e.ownerDocument.defaultView&&typeof e.ownerDocument.defaultView.getComputedStyle=="function"?e.ownerDocument.defaultView.getComputedStyle:typeof getComputedStyle=="function"?getComputedStyle:null}var C6=function(){var e=["",'',"",'',"",'',"",""].join(""),t=""+e+"";return function(){return at+t}}(),Yg=function(){var e=function(o){return Be(o).replace(/ +/g,function(a){return''}).replace(/\t/g,"").replace(/\n/g,"
").replace(/^ /,"").replace(/ $/,"")},t=` `,r=` `,n=function(o,a,s){var l=[];l.push(' `);var u=0,c=0,f=tr(o["!ref"]||"A1"),d=o["!merges"]||[],h=0,m=Array.isArray(o);if(o["!cols"])for(c=0;c<=f.e.c;++c)l.push(" `);var p="",g=o["!rows"]||[];for(u=0;u `);for(;u<=f.e.r;++u){for(p=g[u]?' table:style-name="ro'+g[u].ods+'"':"",l.push(" -`),c=0;cc)&&!(d[h].s.r>u)&&!(d[h].e.cc)&&!(d[h].s.r>u)&&!(d[h].e.c `)}return l.push(` `),l.join("")},i=function(o,a){o.push(` @@ -282,17 +282,17 @@ Add a component higher in the tree to provide a loading `),o.push(` `),o.push(` `),o.push(` -`)};return function(a,s){var l=[at],u=Ga({"xmlns:office":"urn:oasis:names:tc:opendocument:xmlns:office:1.0","xmlns:table":"urn:oasis:names:tc:opendocument:xmlns:table:1.0","xmlns:style":"urn:oasis:names:tc:opendocument:xmlns:style:1.0","xmlns:text":"urn:oasis:names:tc:opendocument:xmlns:text:1.0","xmlns:draw":"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0","xmlns:fo":"urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0","xmlns:xlink":"http://www.w3.org/1999/xlink","xmlns:dc":"http://purl.org/dc/elements/1.1/","xmlns:meta":"urn:oasis:names:tc:opendocument:xmlns:meta:1.0","xmlns:number":"urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0","xmlns:presentation":"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0","xmlns:svg":"urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0","xmlns:chart":"urn:oasis:names:tc:opendocument:xmlns:chart:1.0","xmlns:dr3d":"urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0","xmlns:math":"http://www.w3.org/1998/Math/MathML","xmlns:form":"urn:oasis:names:tc:opendocument:xmlns:form:1.0","xmlns:script":"urn:oasis:names:tc:opendocument:xmlns:script:1.0","xmlns:ooo":"http://openoffice.org/2004/office","xmlns:ooow":"http://openoffice.org/2004/writer","xmlns:oooc":"http://openoffice.org/2004/calc","xmlns:dom":"http://www.w3.org/2001/xml-events","xmlns:xforms":"http://www.w3.org/2002/xforms","xmlns:xsd":"http://www.w3.org/2001/XMLSchema","xmlns:xsi":"http://www.w3.org/2001/XMLSchema-instance","xmlns:sheet":"urn:oasis:names:tc:opendocument:sh33tjs:1.0","xmlns:rpt":"http://openoffice.org/2005/report","xmlns:of":"urn:oasis:names:tc:opendocument:xmlns:of:1.2","xmlns:xhtml":"http://www.w3.org/1999/xhtml","xmlns:grddl":"http://www.w3.org/2003/g/data-view#","xmlns:tableooo":"http://openoffice.org/2009/table","xmlns:drawooo":"http://openoffice.org/2010/draw","xmlns:calcext":"urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0","xmlns:loext":"urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0","xmlns:field":"urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0","xmlns:formx":"urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0","xmlns:css3t":"http://www.w3.org/TR/css3-text/","office:version":"1.2"}),c=Ga({"xmlns:config":"urn:oasis:names:tc:opendocument:xmlns:config:1.0","office:mimetype":"application/vnd.oasis.opendocument.spreadsheet"});s.bookType=="fods"?(l.push(" +`)};return function(a,s){var l=[at],u=za({"xmlns:office":"urn:oasis:names:tc:opendocument:xmlns:office:1.0","xmlns:table":"urn:oasis:names:tc:opendocument:xmlns:table:1.0","xmlns:style":"urn:oasis:names:tc:opendocument:xmlns:style:1.0","xmlns:text":"urn:oasis:names:tc:opendocument:xmlns:text:1.0","xmlns:draw":"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0","xmlns:fo":"urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0","xmlns:xlink":"http://www.w3.org/1999/xlink","xmlns:dc":"http://purl.org/dc/elements/1.1/","xmlns:meta":"urn:oasis:names:tc:opendocument:xmlns:meta:1.0","xmlns:number":"urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0","xmlns:presentation":"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0","xmlns:svg":"urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0","xmlns:chart":"urn:oasis:names:tc:opendocument:xmlns:chart:1.0","xmlns:dr3d":"urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0","xmlns:math":"http://www.w3.org/1998/Math/MathML","xmlns:form":"urn:oasis:names:tc:opendocument:xmlns:form:1.0","xmlns:script":"urn:oasis:names:tc:opendocument:xmlns:script:1.0","xmlns:ooo":"http://openoffice.org/2004/office","xmlns:ooow":"http://openoffice.org/2004/writer","xmlns:oooc":"http://openoffice.org/2004/calc","xmlns:dom":"http://www.w3.org/2001/xml-events","xmlns:xforms":"http://www.w3.org/2002/xforms","xmlns:xsd":"http://www.w3.org/2001/XMLSchema","xmlns:xsi":"http://www.w3.org/2001/XMLSchema-instance","xmlns:sheet":"urn:oasis:names:tc:opendocument:sh33tjs:1.0","xmlns:rpt":"http://openoffice.org/2005/report","xmlns:of":"urn:oasis:names:tc:opendocument:xmlns:of:1.2","xmlns:xhtml":"http://www.w3.org/1999/xhtml","xmlns:grddl":"http://www.w3.org/2003/g/data-view#","xmlns:tableooo":"http://openoffice.org/2009/table","xmlns:drawooo":"http://openoffice.org/2010/draw","xmlns:calcext":"urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0","xmlns:loext":"urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0","xmlns:field":"urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0","xmlns:formx":"urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0","xmlns:css3t":"http://www.w3.org/TR/css3-text/","office:version":"1.2"}),c=za({"xmlns:config":"urn:oasis:names:tc:opendocument:xmlns:config:1.0","office:mimetype":"application/vnd.oasis.opendocument.spreadsheet"});s.bookType=="fods"?(l.push(" `),l.push(cw().replace(/office:document-meta/g,"office:meta"))):l.push(" `),i(l,a),l.push(` `),l.push(` `);for(var f=0;f!=a.SheetNames.length;++f)l.push(n(a.Sheets[a.SheetNames[f]],a,f));return l.push(` `),l.push(` -`),s.bookType=="fods"?l.push(""):l.push(""),l.join("")}}();function qw(e,t){if(t.bookType=="fods")return Yg(e,t);var r=kd(),n="",i=[],o=[];return n="mimetype",De(r,n,"application/vnd.oasis.opendocument.spreadsheet"),n="content.xml",De(r,n,Yg(e,t)),i.push([n,"text/xml"]),o.push([n,"ContentFile"]),n="styles.xml",De(r,n,C6(e,t)),i.push([n,"text/xml"]),o.push([n,"StylesFile"]),n="meta.xml",De(r,n,at+cw()),i.push([n,"text/xml"]),o.push([n,"MetadataFile"]),n="manifest.rdf",De(r,n,M3(o)),i.push([n,"application/rdf+xml"]),n="META-INF/manifest.xml",De(r,n,$3(i)),r}/*! sheetjs (C) 2013-present SheetJS -- http://sheetjs.com */function Kl(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}function A6(e){return typeof TextEncoder<"u"?new TextEncoder().encode(e):Er(Xr(e))}function R6(e,t){e:for(var r=0;r<=e.length-t.length;++r){for(var n=0;n>7,e[t+14]|=(n&127)<<1;for(var o=0;i>=1;++o,i/=256)e[t+o]=i&255;e[t+15]|=r>=0?0:128}function ja(e,t){var r=t?t[0]:0,n=e[r]&127;e:if(e[r++]>=128&&(n|=(e[r]&127)<<7,e[r++]<128||(n|=(e[r]&127)<<14,e[r++]<128)||(n|=(e[r]&127)<<21,e[r++]<128)||(n+=(e[r]&127)*Math.pow(2,28),++r,e[r++]<128)||(n+=(e[r]&127)*Math.pow(2,35),++r,e[r++]<128)||(n+=(e[r]&127)*Math.pow(2,42),++r,e[r++]<128)))break e;return t&&(t[0]=r),n}function Me(e){var t=new Uint8Array(7);t[0]=e&127;var r=1;e:if(e>127){if(t[r-1]|=128,t[r]=e>>7&127,++r,e<=16383||(t[r-1]|=128,t[r]=e>>14&127,++r,e<=2097151)||(t[r-1]|=128,t[r]=e>>21&127,++r,e<=268435455)||(t[r-1]|=128,t[r]=e/256>>>21&127,++r,e<=34359738367)||(t[r-1]|=128,t[r]=e/65536>>>21&127,++r,e<=4398046511103))break e;t[r-1]|=128,t[r]=e/16777216>>>21&127,++r}return t.slice(0,r)}function uo(e){var t=0,r=e[t]&127;e:if(e[t++]>=128){if(r|=(e[t]&127)<<7,e[t++]<128||(r|=(e[t]&127)<<14,e[t++]<128)||(r|=(e[t]&127)<<21,e[t++]<128))break e;r|=(e[t]&127)<<28}return r}function st(e){for(var t=[],r=[0];r[0]=128;);s=e.slice(l,r[0])}break;case 5:a=4,s=e.slice(r[0],r[0]+a),r[0]+=a;break;case 1:a=8,s=e.slice(r[0],r[0]+a),r[0]+=a;break;case 2:a=ja(e,r),s=e.slice(r[0],r[0]+a),r[0]+=a;break;case 3:case 4:default:throw new Error("PB Type ".concat(o," for Field ").concat(i," at offset ").concat(n))}var u={data:s,type:o};t[i]==null?t[i]=[u]:t[i].push(u)}return t}function mt(e){var t=[];return e.forEach(function(r,n){r.forEach(function(i){i.data&&(t.push(Me(n*8+i.type)),i.type==2&&t.push(Me(i.data.length)),t.push(i.data))})}),Ln(t)}function vr(e){for(var t,r=[],n=[0];n[0]>>0>0),r.push(a)}return r}function $i(e){var t=[];return e.forEach(function(r){var n=[];n[1]=[{data:Me(r.id),type:0}],n[2]=[],r.merge!=null&&(n[3]=[{data:Me(+!!r.merge),type:0}]);var i=[];r.messages.forEach(function(a){i.push(a.data),a.meta[3]=[{type:0,data:Me(a.data.length)}],n[2].push({data:mt(a.meta),type:2})});var o=mt(n);t.push(Me(o.length)),t.push(o),i.forEach(function(a){return t.push(a)})}),Ln(t)}function F6(e,t){if(e!=0)throw new Error("Unexpected Snappy chunk type ".concat(e));for(var r=[0],n=ja(t,r),i=[];r[0]>2;if(a<60)++a;else{var s=a-59;a=t[r[0]],s>1&&(a|=t[r[0]+1]<<8),s>2&&(a|=t[r[0]+2]<<16),s>3&&(a|=t[r[0]+3]<<24),a>>>=0,a++,r[0]+=s}i.push(t.slice(r[0],r[0]+a)),r[0]+=a;continue}else{var l=0,u=0;if(o==1?(u=(t[r[0]]>>2&7)+4,l=(t[r[0]++]&224)<<3,l|=t[r[0]++]):(u=(t[r[0]++]>>2)+1,o==2?(l=t[r[0]]|t[r[0]+1]<<8,r[0]+=2):(l=(t[r[0]]|t[r[0]+1]<<8|t[r[0]+2]<<16|t[r[0]+3]<<24)>>>0,r[0]+=4)),i=[Ln(i)],l==0)throw new Error("Invalid offset 0");if(l>i[0].length)throw new Error("Invalid offset beyond length");if(u>=l)for(i.push(i[0].slice(-l)),u-=l;u>=i[i.length-1].length;)i.push(i[i.length-1]),u-=i[i.length-1].length;i.push(i[0].slice(-l,-l+u))}}var c=Ln(i);if(c.length!=n)throw new Error("Unexpected length: ".concat(c.length," != ").concat(n));return c}function xr(e){for(var t=[],r=0;r>8&255]))):n<=16777216?(a+=4,t.push(new Uint8Array([248,n-1&255,n-1>>8&255,n-1>>16&255]))):n<=4294967296&&(a+=5,t.push(new Uint8Array([252,n-1&255,n-1>>8&255,n-1>>16&255,n-1>>>24&255]))),t.push(e.slice(r,r+n)),a+=n,i[0]=0,i[1]=a&255,i[2]=a>>8&255,i[3]=a>>16&255,r+=n}return Ln(t)}function Lc(e,t){var r=new Uint8Array(32),n=Kl(r),i=12,o=0;switch(r[0]=5,e.t){case"n":r[1]=2,O6(r,i,e.v),o|=1,i+=16;break;case"b":r[1]=6,n.setFloat64(i,e.v?1:0,!0),o|=2,i+=8;break;case"s":if(t.indexOf(e.v)==-1)throw new Error("Value ".concat(e.v," missing from SST!"));r[1]=3,n.setUint32(i,t.indexOf(e.v),!0),o|=8,i+=4;break;default:throw"unsupported cell type "+e.t}return n.setUint32(8,o,!0),r.slice(0,i)}function Bc(e,t){var r=new Uint8Array(32),n=Kl(r),i=12,o=0;switch(r[0]=3,e.t){case"n":r[2]=2,n.setFloat64(i,e.v,!0),o|=32,i+=8;break;case"b":r[2]=6,n.setFloat64(i,e.v?1:0,!0),o|=32,i+=8;break;case"s":if(t.indexOf(e.v)==-1)throw new Error("Value ".concat(e.v," missing from SST!"));r[2]=3,n.setUint32(i,t.indexOf(e.v),!0),o|=16,i+=4;break;default:throw"unsupported cell type "+e.t}return n.setUint32(4,o,!0),r.slice(0,i)}function cn(e){var t=st(e);return ja(t[1][0].data)}function D6(e,t,r){var n,i,o,a;if(!((n=e[6])!=null&&n[0])||!((i=e[7])!=null&&i[0]))throw"Mutation only works on post-BNC storages!";var s=((a=(o=e[8])==null?void 0:o[0])==null?void 0:a.data)&&uo(e[8][0].data)>0||!1;if(s)throw"Math only works with normal offsets";for(var l=0,u=Kl(e[7][0].data),c=0,f=[],d=Kl(e[4][0].data),h=0,m=[],p=0;p1&&console.error("The Numbers writer currently writes only the first table");var n=tr(r["!ref"]);n.s.r=n.s.c=0;var i=!1;n.e.c>9&&(i=!0,n.e.c=9),n.e.r>49&&(i=!0,n.e.r=49),i&&console.error("The Numbers writer is currently limited to ".concat(ot(n)));var o=Yl(r,{range:n,header:1}),a=["~Sh33tJ5~"];o.forEach(function(M){return M.forEach(function(N){typeof N=="string"&&a.push(N)})});var s={},l=[],u=He.read(t.numbers,{type:"base64"});u.FileIndex.map(function(M,N){return[M,u.FullPaths[N]]}).forEach(function(M){var N=M[0],F=M[1];if(N.type==2&&N.name.match(/\.iwa/)){var V=N.content,Y=xr(V),J=vr(Y);J.forEach(function(W){l.push(W.id),s[W.id]={deps:[],location:F,type:uo(W.messages[0].meta[1][0].data)}})}}),l.sort(function(M,N){return M-N});var c=l.filter(function(M){return M>1}).map(function(M){return[M,Me(M)]});u.FileIndex.map(function(M,N){return[M,u.FullPaths[N]]}).forEach(function(M){var N=M[0];if(M[1],!!N.name.match(/\.iwa/)){var F=vr(xr(N.content));F.forEach(function(V){V.messages.forEach(function(Y){c.forEach(function(J){V.messages.some(function(W){return uo(W.meta[1][0].data)!=11006&&R6(W.data,J[1])})&&s[J[0]].deps.push(V.id)})})})}});for(var f=He.find(u,s[1].location),d=vr(xr(f.content)),h,m=0;m-1,i=sw();qd(t=t||{});var o=kd(),a="",s=0;if(t.cellXfs=[],Wn(t.cellXfs,{},{revssf:{General:0}}),e.Props||(e.Props={}),a="docProps/core.xml",De(o,a,fw(e.Props,t)),i.coreprops.push(a),Le(t.rels,2,a,ke.CORE_PROPS),a="docProps/app.xml",!(e.Props&&e.Props.SheetNames))if(!e.Workbook||!e.Workbook.Sheets)e.Props.SheetNames=e.SheetNames;else{for(var l=[],u=0;u0&&(a="docProps/custom.xml",De(o,a,pw(e.Custprops)),i.custprops.push(a),Le(t.rels,4,a,ke.CUST_PROPS)),s=1;s<=e.SheetNames.length;++s){var c={"!id":{}},f=e.Sheets[e.SheetNames[s-1]],d=(f||{})["!type"]||"sheet";switch(d){case"chart":default:a="xl/worksheets/sheet"+s+"."+r,De(o,a,MD(s-1,a,t,e,c)),i.sheets.push(a),Le(t.wbrels,-1,"worksheets/sheet"+s+"."+r,ke.WS[0])}if(f){var h=f["!comments"],m=!1,p="";h&&h.length>0&&(p="xl/comments"+s+"."+r,De(o,p,UD(h,p)),i.comments.push(p),Le(c,-1,"../comments"+s+"."+r,ke.CMNT),m=!0),f["!legacy"]&&m&&De(o,"xl/drawings/vmlDrawing"+s+".vml",Dw(s,f["!comments"])),delete f["!comments"],delete f["!legacy"]}c["!id"].rId1&&De(o,uw(a),so(c))}return t.Strings!=null&&t.Strings.length>0&&(a="xl/sharedStrings."+r,De(o,a,BD(t.Strings,a,t)),i.strs.push(a),Le(t.wbrels,-1,"sharedStrings."+r,ke.SST)),a="xl/workbook."+r,De(o,a,ND(e,a)),i.workbooks.push(a),Le(t.rels,1,a,ke.WB),a="xl/theme/theme1.xml",De(o,a,Ow(e.Themes,t)),i.themes.push(a),Le(t.wbrels,-1,"theme/theme1.xml",ke.THEME),a="xl/styles."+r,De(o,a,LD(e,a,t)),i.styles.push(a),Le(t.wbrels,-1,"styles."+r,ke.STY),e.vbaraw&&n&&(a="xl/vbaProject.bin",De(o,a,e.vbaraw),i.vba.push(a),Le(t.wbrels,-1,"vbaProject.bin",ke.VBA)),a="xl/metadata."+r,De(o,a,HD(a)),i.metadata.push(a),Le(t.wbrels,-1,"metadata."+r,ke.XLMETA),De(o,"[Content_Types].xml",lw(i,t)),De(o,"_rels/.rels",so(t.rels)),De(o,"xl/_rels/workbook."+r+".rels",so(t.wbrels)),delete t.revssf,delete t.ssf,o}function $6(e,t){Xi=1024,e&&!e.SSF&&(e.SSF=Kt(rt)),e&&e.SSF&&(_u(),Su(e.SSF),t.revssf=Tu(e.SSF),t.revssf[e.SSF[65535]]=0,t.ssf=e.SSF),t.rels={},t.wbrels={},t.Strings=[],t.Strings.Count=0,t.Strings.Unique=0,Ta?t.revStrings=new Map:(t.revStrings={},t.revStrings.foo=[],delete t.revStrings.foo);var r="xml",n=Iw.indexOf(t.bookType)>-1,i=sw();qd(t=t||{});var o=kd(),a="",s=0;if(t.cellXfs=[],Wn(t.cellXfs,{},{revssf:{General:0}}),e.Props||(e.Props={}),a="docProps/core.xml",De(o,a,fw(e.Props,t)),i.coreprops.push(a),Le(t.rels,2,a,ke.CORE_PROPS),a="docProps/app.xml",!(e.Props&&e.Props.SheetNames))if(!e.Workbook||!e.Workbook.Sheets)e.Props.SheetNames=e.SheetNames;else{for(var l=[],u=0;u0&&(a="docProps/custom.xml",De(o,a,pw(e.Custprops)),i.custprops.push(a),Le(t.rels,4,a,ke.CUST_PROPS));var c=["SheetJ5"];for(t.tcid=0,s=1;s<=e.SheetNames.length;++s){var f={"!id":{}},d=e.Sheets[e.SheetNames[s-1]],h=(d||{})["!type"]||"sheet";switch(h){case"chart":default:a="xl/worksheets/sheet"+s+"."+r,De(o,a,Hw(s-1,t,e,f)),i.sheets.push(a),Le(t.wbrels,-1,"worksheets/sheet"+s+"."+r,ke.WS[0])}if(d){var m=d["!comments"],p=!1,g="";if(m&&m.length>0){var v=!1;m.forEach(function(w){w[1].forEach(function(y){y.T==!0&&(v=!0)})}),v&&(g="xl/threadedComments/threadedComment"+s+"."+r,De(o,g,dR(m,c,t)),i.threadedcomments.push(g),Le(f,-1,"../threadedComments/threadedComment"+s+"."+r,ke.TCMNT)),g="xl/comments"+s+"."+r,De(o,g,Pw(m)),i.comments.push(g),Le(f,-1,"../comments"+s+"."+r,ke.CMNT),p=!0}d["!legacy"]&&p&&De(o,"xl/drawings/vmlDrawing"+s+".vml",Dw(s,d["!comments"])),delete d["!comments"],delete d["!legacy"]}f["!id"].rId1&&De(o,uw(a),so(f))}return t.Strings!=null&&t.Strings.length>0&&(a="xl/sharedStrings."+r,De(o,a,Sw(t.Strings,t)),i.strs.push(a),Le(t.wbrels,-1,"sharedStrings."+r,ke.SST)),a="xl/workbook."+r,De(o,a,zw(e)),i.workbooks.push(a),Le(t.rels,1,a,ke.WB),a="xl/theme/theme1.xml",De(o,a,Ow(e.Themes,t)),i.themes.push(a),Le(t.wbrels,-1,"theme/theme1.xml",ke.THEME),a="xl/styles."+r,De(o,a,Aw(e,t)),i.styles.push(a),Le(t.wbrels,-1,"styles."+r,ke.STY),e.vbaraw&&n&&(a="xl/vbaProject.bin",De(o,a,e.vbaraw),i.vba.push(a),Le(t.wbrels,-1,"vbaProject.bin",ke.VBA)),a="xl/metadata."+r,De(o,a,Fw()),i.metadata.push(a),Le(t.wbrels,-1,"metadata."+r,ke.XLMETA),c.length>1&&(a="xl/persons/person.xml",De(o,a,hR(c)),i.people.push(a),Le(t.wbrels,-1,"persons/person.xml",ke.PEOPLE)),De(o,"[Content_Types].xml",lw(i,t)),De(o,"_rels/.rels",so(t.rels)),De(o,"xl/_rels/workbook."+r+".rels",so(t.wbrels)),delete t.revssf,delete t.ssf,o}function N6(e,t){var r="";switch((t||{}).type||"base64"){case"buffer":return[e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7]];case"base64":r=nn(e.slice(0,12));break;case"binary":r=e;break;case"array":return[e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7]];default:throw new Error("Unrecognized type "+(t&&t.type||"undefined"))}return[r.charCodeAt(0),r.charCodeAt(1),r.charCodeAt(2),r.charCodeAt(3),r.charCodeAt(4),r.charCodeAt(5),r.charCodeAt(6),r.charCodeAt(7)]}function Qw(e,t){switch(t.type){case"base64":case"binary":break;case"buffer":case"array":t.type="";break;case"file":return as(t.file,He.write(e,{type:Ne?"buffer":""}));case"string":throw new Error("'string' output type invalid for '"+t.bookType+"' files");default:throw new Error("Unrecognized type "+t.type)}return He.write(e,t)}function M6(e,t){var r=Kt(t||{}),n=b6(e,r);return L6(n,r)}function L6(e,t){var r={},n=Ne?"nodebuffer":typeof Uint8Array<"u"?"array":"string";if(t.compression&&(r.compression="DEFLATE"),t.password)r.type=n;else switch(t.type){case"base64":r.type="base64";break;case"binary":r.type="string";break;case"string":throw new Error("'string' output type invalid for '"+t.bookType+"' files");case"buffer":case"file":r.type=n;break;default:throw new Error("Unrecognized type "+t.type)}var i=e.FullPaths?He.write(e,{fileType:"zip",type:{nodebuffer:"buffer",string:"binary"}[r.type]||r.type,compression:!!t.compression}):e.generate(r);if(typeof Deno<"u"&&typeof i=="string"){if(t.type=="binary"||t.type=="base64")return i;i=new Uint8Array(Eu(i))}return t.password&&typeof encrypt_agile<"u"?Qw(encrypt_agile(i,t.password),t):t.type==="file"?as(t.file,i):t.type=="string"?ya(i):i}function B6(e,t){var r=t||{},n=t6(e,r);return Qw(n,r)}function Or(e,t,r){r||(r="");var n=r+e;switch(t.type){case"base64":return Wa(Xr(n));case"binary":return Xr(n);case"string":return e;case"file":return as(t.file,n,"utf8");case"buffer":return Ne?un(n,"utf8"):typeof TextEncoder<"u"?new TextEncoder().encode(n):Or(n,{type:"binary"}).split("").map(function(i){return i.charCodeAt(0)})}throw new Error("Unrecognized type "+t.type)}function U6(e,t){switch(t.type){case"base64":return Wa(e);case"binary":return e;case"string":return e;case"file":return as(t.file,e,"binary");case"buffer":return Ne?un(e,"binary"):e.split("").map(function(r){return r.charCodeAt(0)})}throw new Error("Unrecognized type "+t.type)}function Ws(e,t){switch(t.type){case"string":case"base64":case"binary":for(var r="",n=0;n0&&(i=0);var f=St(l.s.r),d=[],h=[],m=0,p=0,g=Array.isArray(e),v=l.s.r,w=0,y={};g&&!e[v]&&(e[v]=[]);var E=u.skipHidden&&e["!cols"]||[],b=u.skipHidden&&e["!rows"]||[];for(w=l.s.c;w<=l.e.c;++w)if(!(E[w]||{}).hidden)switch(d[w]=Ft(w),r=g?e[v][w]:e[d[w]+f],n){case 1:o[w]=w-l.s.c;break;case 2:o[w]=d[w];break;case 3:o[w]=u.header[w-l.s.c];break;default:if(r==null&&(r={w:"__EMPTY",t:"s"}),s=a=on(r,null,u),p=y[a]||0,!p)y[a]=1;else{do s=a+"_"+p++;while(y[s]);y[a]=p,y[s]=1}o[w]=s}for(v=l.s.r+i;v<=l.e.r;++v)if(!(b[v]||{}).hidden){var k=W6(e,l,v,d,n,o,g,u);(k.isempty===!1||(n===1?u.blankrows!==!1:u.blankrows))&&(h[m++]=k.row)}return h.length=m,h}var qg=/"/g;function z6(e,t,r,n,i,o,a,s){for(var l=!0,u=[],c="",f=St(r),d=t.s.c;d<=t.e.c;++d)if(n[d]){var h=s.dense?(e[r]||[])[d]:e[n[d]+f];if(h==null)c="";else if(h.v!=null){l=!1,c=""+(s.rawNumbers&&h.t=="n"?h.v:on(h,null,s));for(var m=0,p=0;m!==c.length;++m)if((p=c.charCodeAt(m))===i||p===o||p===34||s.forceQuotes){c='"'+c.replace(qg,'""')+'"';break}c=="ID"&&(c='"ID"')}else h.f!=null&&!h.F?(l=!1,c="="+h.f,c.indexOf(",")>=0&&(c='"'+c.replace(qg,'""')+'"')):c="";u.push(c)}return s.blankrows===!1&&l?null:u.join(a)}function Qd(e,t){var r=[],n=t??{};if(e==null||e["!ref"]==null)return"";var i=Xe(e["!ref"]),o=n.FS!==void 0?n.FS:",",a=o.charCodeAt(0),s=n.RS!==void 0?n.RS:` +`),s.bookType=="fods"?l.push(""):l.push(""),l.join("")}}();function qw(e,t){if(t.bookType=="fods")return Yg(e,t);var r=kd(),n="",i=[],o=[];return n="mimetype",De(r,n,"application/vnd.oasis.opendocument.spreadsheet"),n="content.xml",De(r,n,Yg(e,t)),i.push([n,"text/xml"]),o.push([n,"ContentFile"]),n="styles.xml",De(r,n,C6(e,t)),i.push([n,"text/xml"]),o.push([n,"StylesFile"]),n="meta.xml",De(r,n,at+cw()),i.push([n,"text/xml"]),o.push([n,"MetadataFile"]),n="manifest.rdf",De(r,n,M3(o)),i.push([n,"application/rdf+xml"]),n="META-INF/manifest.xml",De(r,n,$3(i)),r}/*! sheetjs (C) 2013-present SheetJS -- http://sheetjs.com */function Xl(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}function A6(e){return typeof TextEncoder<"u"?new TextEncoder().encode(e):Er(Xr(e))}function R6(e,t){e:for(var r=0;r<=e.length-t.length;++r){for(var n=0;n>7,e[t+14]|=(n&127)<<1;for(var o=0;i>=1;++o,i/=256)e[t+o]=i&255;e[t+15]|=r>=0?0:128}function Ga(e,t){var r=t?t[0]:0,n=e[r]&127;e:if(e[r++]>=128&&(n|=(e[r]&127)<<7,e[r++]<128||(n|=(e[r]&127)<<14,e[r++]<128)||(n|=(e[r]&127)<<21,e[r++]<128)||(n+=(e[r]&127)*Math.pow(2,28),++r,e[r++]<128)||(n+=(e[r]&127)*Math.pow(2,35),++r,e[r++]<128)||(n+=(e[r]&127)*Math.pow(2,42),++r,e[r++]<128)))break e;return t&&(t[0]=r),n}function Me(e){var t=new Uint8Array(7);t[0]=e&127;var r=1;e:if(e>127){if(t[r-1]|=128,t[r]=e>>7&127,++r,e<=16383||(t[r-1]|=128,t[r]=e>>14&127,++r,e<=2097151)||(t[r-1]|=128,t[r]=e>>21&127,++r,e<=268435455)||(t[r-1]|=128,t[r]=e/256>>>21&127,++r,e<=34359738367)||(t[r-1]|=128,t[r]=e/65536>>>21&127,++r,e<=4398046511103))break e;t[r-1]|=128,t[r]=e/16777216>>>21&127,++r}return t.slice(0,r)}function uo(e){var t=0,r=e[t]&127;e:if(e[t++]>=128){if(r|=(e[t]&127)<<7,e[t++]<128||(r|=(e[t]&127)<<14,e[t++]<128)||(r|=(e[t]&127)<<21,e[t++]<128))break e;r|=(e[t]&127)<<28}return r}function st(e){for(var t=[],r=[0];r[0]=128;);s=e.slice(l,r[0])}break;case 5:a=4,s=e.slice(r[0],r[0]+a),r[0]+=a;break;case 1:a=8,s=e.slice(r[0],r[0]+a),r[0]+=a;break;case 2:a=Ga(e,r),s=e.slice(r[0],r[0]+a),r[0]+=a;break;case 3:case 4:default:throw new Error("PB Type ".concat(o," for Field ").concat(i," at offset ").concat(n))}var u={data:s,type:o};t[i]==null?t[i]=[u]:t[i].push(u)}return t}function mt(e){var t=[];return e.forEach(function(r,n){r.forEach(function(i){i.data&&(t.push(Me(n*8+i.type)),i.type==2&&t.push(Me(i.data.length)),t.push(i.data))})}),Ln(t)}function vr(e){for(var t,r=[],n=[0];n[0]>>0>0),r.push(a)}return r}function $i(e){var t=[];return e.forEach(function(r){var n=[];n[1]=[{data:Me(r.id),type:0}],n[2]=[],r.merge!=null&&(n[3]=[{data:Me(+!!r.merge),type:0}]);var i=[];r.messages.forEach(function(a){i.push(a.data),a.meta[3]=[{type:0,data:Me(a.data.length)}],n[2].push({data:mt(a.meta),type:2})});var o=mt(n);t.push(Me(o.length)),t.push(o),i.forEach(function(a){return t.push(a)})}),Ln(t)}function F6(e,t){if(e!=0)throw new Error("Unexpected Snappy chunk type ".concat(e));for(var r=[0],n=Ga(t,r),i=[];r[0]>2;if(a<60)++a;else{var s=a-59;a=t[r[0]],s>1&&(a|=t[r[0]+1]<<8),s>2&&(a|=t[r[0]+2]<<16),s>3&&(a|=t[r[0]+3]<<24),a>>>=0,a++,r[0]+=s}i.push(t.slice(r[0],r[0]+a)),r[0]+=a;continue}else{var l=0,u=0;if(o==1?(u=(t[r[0]]>>2&7)+4,l=(t[r[0]++]&224)<<3,l|=t[r[0]++]):(u=(t[r[0]++]>>2)+1,o==2?(l=t[r[0]]|t[r[0]+1]<<8,r[0]+=2):(l=(t[r[0]]|t[r[0]+1]<<8|t[r[0]+2]<<16|t[r[0]+3]<<24)>>>0,r[0]+=4)),i=[Ln(i)],l==0)throw new Error("Invalid offset 0");if(l>i[0].length)throw new Error("Invalid offset beyond length");if(u>=l)for(i.push(i[0].slice(-l)),u-=l;u>=i[i.length-1].length;)i.push(i[i.length-1]),u-=i[i.length-1].length;i.push(i[0].slice(-l,-l+u))}}var c=Ln(i);if(c.length!=n)throw new Error("Unexpected length: ".concat(c.length," != ").concat(n));return c}function xr(e){for(var t=[],r=0;r>8&255]))):n<=16777216?(a+=4,t.push(new Uint8Array([248,n-1&255,n-1>>8&255,n-1>>16&255]))):n<=4294967296&&(a+=5,t.push(new Uint8Array([252,n-1&255,n-1>>8&255,n-1>>16&255,n-1>>>24&255]))),t.push(e.slice(r,r+n)),a+=n,i[0]=0,i[1]=a&255,i[2]=a>>8&255,i[3]=a>>16&255,r+=n}return Ln(t)}function Lc(e,t){var r=new Uint8Array(32),n=Xl(r),i=12,o=0;switch(r[0]=5,e.t){case"n":r[1]=2,O6(r,i,e.v),o|=1,i+=16;break;case"b":r[1]=6,n.setFloat64(i,e.v?1:0,!0),o|=2,i+=8;break;case"s":if(t.indexOf(e.v)==-1)throw new Error("Value ".concat(e.v," missing from SST!"));r[1]=3,n.setUint32(i,t.indexOf(e.v),!0),o|=8,i+=4;break;default:throw"unsupported cell type "+e.t}return n.setUint32(8,o,!0),r.slice(0,i)}function Bc(e,t){var r=new Uint8Array(32),n=Xl(r),i=12,o=0;switch(r[0]=3,e.t){case"n":r[2]=2,n.setFloat64(i,e.v,!0),o|=32,i+=8;break;case"b":r[2]=6,n.setFloat64(i,e.v?1:0,!0),o|=32,i+=8;break;case"s":if(t.indexOf(e.v)==-1)throw new Error("Value ".concat(e.v," missing from SST!"));r[2]=3,n.setUint32(i,t.indexOf(e.v),!0),o|=16,i+=4;break;default:throw"unsupported cell type "+e.t}return n.setUint32(4,o,!0),r.slice(0,i)}function cn(e){var t=st(e);return Ga(t[1][0].data)}function D6(e,t,r){var n,i,o,a;if(!((n=e[6])!=null&&n[0])||!((i=e[7])!=null&&i[0]))throw"Mutation only works on post-BNC storages!";var s=((a=(o=e[8])==null?void 0:o[0])==null?void 0:a.data)&&uo(e[8][0].data)>0||!1;if(s)throw"Math only works with normal offsets";for(var l=0,u=Xl(e[7][0].data),c=0,f=[],d=Xl(e[4][0].data),h=0,m=[],p=0;p1&&console.error("The Numbers writer currently writes only the first table");var n=tr(r["!ref"]);n.s.r=n.s.c=0;var i=!1;n.e.c>9&&(i=!0,n.e.c=9),n.e.r>49&&(i=!0,n.e.r=49),i&&console.error("The Numbers writer is currently limited to ".concat(ot(n)));var o=Kl(r,{range:n,header:1}),a=["~Sh33tJ5~"];o.forEach(function(M){return M.forEach(function(N){typeof N=="string"&&a.push(N)})});var s={},l=[],u=He.read(t.numbers,{type:"base64"});u.FileIndex.map(function(M,N){return[M,u.FullPaths[N]]}).forEach(function(M){var N=M[0],F=M[1];if(N.type==2&&N.name.match(/\.iwa/)){var V=N.content,Y=xr(V),J=vr(Y);J.forEach(function(W){l.push(W.id),s[W.id]={deps:[],location:F,type:uo(W.messages[0].meta[1][0].data)}})}}),l.sort(function(M,N){return M-N});var c=l.filter(function(M){return M>1}).map(function(M){return[M,Me(M)]});u.FileIndex.map(function(M,N){return[M,u.FullPaths[N]]}).forEach(function(M){var N=M[0];if(M[1],!!N.name.match(/\.iwa/)){var F=vr(xr(N.content));F.forEach(function(V){V.messages.forEach(function(Y){c.forEach(function(J){V.messages.some(function(W){return uo(W.meta[1][0].data)!=11006&&R6(W.data,J[1])})&&s[J[0]].deps.push(V.id)})})})}});for(var f=He.find(u,s[1].location),d=vr(xr(f.content)),h,m=0;m-1,i=sw();qd(t=t||{});var o=kd(),a="",s=0;if(t.cellXfs=[],Wn(t.cellXfs,{},{revssf:{General:0}}),e.Props||(e.Props={}),a="docProps/core.xml",De(o,a,fw(e.Props,t)),i.coreprops.push(a),Le(t.rels,2,a,ke.CORE_PROPS),a="docProps/app.xml",!(e.Props&&e.Props.SheetNames))if(!e.Workbook||!e.Workbook.Sheets)e.Props.SheetNames=e.SheetNames;else{for(var l=[],u=0;u0&&(a="docProps/custom.xml",De(o,a,pw(e.Custprops)),i.custprops.push(a),Le(t.rels,4,a,ke.CUST_PROPS)),s=1;s<=e.SheetNames.length;++s){var c={"!id":{}},f=e.Sheets[e.SheetNames[s-1]],d=(f||{})["!type"]||"sheet";switch(d){case"chart":default:a="xl/worksheets/sheet"+s+"."+r,De(o,a,MD(s-1,a,t,e,c)),i.sheets.push(a),Le(t.wbrels,-1,"worksheets/sheet"+s+"."+r,ke.WS[0])}if(f){var h=f["!comments"],m=!1,p="";h&&h.length>0&&(p="xl/comments"+s+"."+r,De(o,p,UD(h,p)),i.comments.push(p),Le(c,-1,"../comments"+s+"."+r,ke.CMNT),m=!0),f["!legacy"]&&m&&De(o,"xl/drawings/vmlDrawing"+s+".vml",Dw(s,f["!comments"])),delete f["!comments"],delete f["!legacy"]}c["!id"].rId1&&De(o,uw(a),so(c))}return t.Strings!=null&&t.Strings.length>0&&(a="xl/sharedStrings."+r,De(o,a,BD(t.Strings,a,t)),i.strs.push(a),Le(t.wbrels,-1,"sharedStrings."+r,ke.SST)),a="xl/workbook."+r,De(o,a,ND(e,a)),i.workbooks.push(a),Le(t.rels,1,a,ke.WB),a="xl/theme/theme1.xml",De(o,a,Ow(e.Themes,t)),i.themes.push(a),Le(t.wbrels,-1,"theme/theme1.xml",ke.THEME),a="xl/styles."+r,De(o,a,LD(e,a,t)),i.styles.push(a),Le(t.wbrels,-1,"styles."+r,ke.STY),e.vbaraw&&n&&(a="xl/vbaProject.bin",De(o,a,e.vbaraw),i.vba.push(a),Le(t.wbrels,-1,"vbaProject.bin",ke.VBA)),a="xl/metadata."+r,De(o,a,HD(a)),i.metadata.push(a),Le(t.wbrels,-1,"metadata."+r,ke.XLMETA),De(o,"[Content_Types].xml",lw(i,t)),De(o,"_rels/.rels",so(t.rels)),De(o,"xl/_rels/workbook."+r+".rels",so(t.wbrels)),delete t.revssf,delete t.ssf,o}function $6(e,t){Xi=1024,e&&!e.SSF&&(e.SSF=Kt(rt)),e&&e.SSF&&(Su(),_u(e.SSF),t.revssf=Tu(e.SSF),t.revssf[e.SSF[65535]]=0,t.ssf=e.SSF),t.rels={},t.wbrels={},t.Strings=[],t.Strings.Count=0,t.Strings.Unique=0,Ta?t.revStrings=new Map:(t.revStrings={},t.revStrings.foo=[],delete t.revStrings.foo);var r="xml",n=Iw.indexOf(t.bookType)>-1,i=sw();qd(t=t||{});var o=kd(),a="",s=0;if(t.cellXfs=[],Wn(t.cellXfs,{},{revssf:{General:0}}),e.Props||(e.Props={}),a="docProps/core.xml",De(o,a,fw(e.Props,t)),i.coreprops.push(a),Le(t.rels,2,a,ke.CORE_PROPS),a="docProps/app.xml",!(e.Props&&e.Props.SheetNames))if(!e.Workbook||!e.Workbook.Sheets)e.Props.SheetNames=e.SheetNames;else{for(var l=[],u=0;u0&&(a="docProps/custom.xml",De(o,a,pw(e.Custprops)),i.custprops.push(a),Le(t.rels,4,a,ke.CUST_PROPS));var c=["SheetJ5"];for(t.tcid=0,s=1;s<=e.SheetNames.length;++s){var f={"!id":{}},d=e.Sheets[e.SheetNames[s-1]],h=(d||{})["!type"]||"sheet";switch(h){case"chart":default:a="xl/worksheets/sheet"+s+"."+r,De(o,a,Hw(s-1,t,e,f)),i.sheets.push(a),Le(t.wbrels,-1,"worksheets/sheet"+s+"."+r,ke.WS[0])}if(d){var m=d["!comments"],p=!1,g="";if(m&&m.length>0){var v=!1;m.forEach(function(w){w[1].forEach(function(y){y.T==!0&&(v=!0)})}),v&&(g="xl/threadedComments/threadedComment"+s+"."+r,De(o,g,dR(m,c,t)),i.threadedcomments.push(g),Le(f,-1,"../threadedComments/threadedComment"+s+"."+r,ke.TCMNT)),g="xl/comments"+s+"."+r,De(o,g,Pw(m)),i.comments.push(g),Le(f,-1,"../comments"+s+"."+r,ke.CMNT),p=!0}d["!legacy"]&&p&&De(o,"xl/drawings/vmlDrawing"+s+".vml",Dw(s,d["!comments"])),delete d["!comments"],delete d["!legacy"]}f["!id"].rId1&&De(o,uw(a),so(f))}return t.Strings!=null&&t.Strings.length>0&&(a="xl/sharedStrings."+r,De(o,a,_w(t.Strings,t)),i.strs.push(a),Le(t.wbrels,-1,"sharedStrings."+r,ke.SST)),a="xl/workbook."+r,De(o,a,zw(e)),i.workbooks.push(a),Le(t.rels,1,a,ke.WB),a="xl/theme/theme1.xml",De(o,a,Ow(e.Themes,t)),i.themes.push(a),Le(t.wbrels,-1,"theme/theme1.xml",ke.THEME),a="xl/styles."+r,De(o,a,Aw(e,t)),i.styles.push(a),Le(t.wbrels,-1,"styles."+r,ke.STY),e.vbaraw&&n&&(a="xl/vbaProject.bin",De(o,a,e.vbaraw),i.vba.push(a),Le(t.wbrels,-1,"vbaProject.bin",ke.VBA)),a="xl/metadata."+r,De(o,a,Fw()),i.metadata.push(a),Le(t.wbrels,-1,"metadata."+r,ke.XLMETA),c.length>1&&(a="xl/persons/person.xml",De(o,a,hR(c)),i.people.push(a),Le(t.wbrels,-1,"persons/person.xml",ke.PEOPLE)),De(o,"[Content_Types].xml",lw(i,t)),De(o,"_rels/.rels",so(t.rels)),De(o,"xl/_rels/workbook."+r+".rels",so(t.wbrels)),delete t.revssf,delete t.ssf,o}function N6(e,t){var r="";switch((t||{}).type||"base64"){case"buffer":return[e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7]];case"base64":r=nn(e.slice(0,12));break;case"binary":r=e;break;case"array":return[e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7]];default:throw new Error("Unrecognized type "+(t&&t.type||"undefined"))}return[r.charCodeAt(0),r.charCodeAt(1),r.charCodeAt(2),r.charCodeAt(3),r.charCodeAt(4),r.charCodeAt(5),r.charCodeAt(6),r.charCodeAt(7)]}function Qw(e,t){switch(t.type){case"base64":case"binary":break;case"buffer":case"array":t.type="";break;case"file":return os(t.file,He.write(e,{type:Ne?"buffer":""}));case"string":throw new Error("'string' output type invalid for '"+t.bookType+"' files");default:throw new Error("Unrecognized type "+t.type)}return He.write(e,t)}function M6(e,t){var r=Kt(t||{}),n=b6(e,r);return L6(n,r)}function L6(e,t){var r={},n=Ne?"nodebuffer":typeof Uint8Array<"u"?"array":"string";if(t.compression&&(r.compression="DEFLATE"),t.password)r.type=n;else switch(t.type){case"base64":r.type="base64";break;case"binary":r.type="string";break;case"string":throw new Error("'string' output type invalid for '"+t.bookType+"' files");case"buffer":case"file":r.type=n;break;default:throw new Error("Unrecognized type "+t.type)}var i=e.FullPaths?He.write(e,{fileType:"zip",type:{nodebuffer:"buffer",string:"binary"}[r.type]||r.type,compression:!!t.compression}):e.generate(r);if(typeof Deno<"u"&&typeof i=="string"){if(t.type=="binary"||t.type=="base64")return i;i=new Uint8Array(Eu(i))}return t.password&&typeof encrypt_agile<"u"?Qw(encrypt_agile(i,t.password),t):t.type==="file"?os(t.file,i):t.type=="string"?ya(i):i}function B6(e,t){var r=t||{},n=t6(e,r);return Qw(n,r)}function Or(e,t,r){r||(r="");var n=r+e;switch(t.type){case"base64":return Va(Xr(n));case"binary":return Xr(n);case"string":return e;case"file":return os(t.file,n,"utf8");case"buffer":return Ne?un(n,"utf8"):typeof TextEncoder<"u"?new TextEncoder().encode(n):Or(n,{type:"binary"}).split("").map(function(i){return i.charCodeAt(0)})}throw new Error("Unrecognized type "+t.type)}function U6(e,t){switch(t.type){case"base64":return Va(e);case"binary":return e;case"string":return e;case"file":return os(t.file,e,"binary");case"buffer":return Ne?un(e,"binary"):e.split("").map(function(r){return r.charCodeAt(0)})}throw new Error("Unrecognized type "+t.type)}function Vs(e,t){switch(t.type){case"string":case"base64":case"binary":for(var r="",n=0;n0&&(i=0);var f=_t(l.s.r),d=[],h=[],m=0,p=0,g=Array.isArray(e),v=l.s.r,w=0,y={};g&&!e[v]&&(e[v]=[]);var E=u.skipHidden&&e["!cols"]||[],b=u.skipHidden&&e["!rows"]||[];for(w=l.s.c;w<=l.e.c;++w)if(!(E[w]||{}).hidden)switch(d[w]=Ft(w),r=g?e[v][w]:e[d[w]+f],n){case 1:o[w]=w-l.s.c;break;case 2:o[w]=d[w];break;case 3:o[w]=u.header[w-l.s.c];break;default:if(r==null&&(r={w:"__EMPTY",t:"s"}),s=a=on(r,null,u),p=y[a]||0,!p)y[a]=1;else{do s=a+"_"+p++;while(y[s]);y[a]=p,y[s]=1}o[w]=s}for(v=l.s.r+i;v<=l.e.r;++v)if(!(b[v]||{}).hidden){var k=W6(e,l,v,d,n,o,g,u);(k.isempty===!1||(n===1?u.blankrows!==!1:u.blankrows))&&(h[m++]=k.row)}return h.length=m,h}var qg=/"/g;function z6(e,t,r,n,i,o,a,s){for(var l=!0,u=[],c="",f=_t(r),d=t.s.c;d<=t.e.c;++d)if(n[d]){var h=s.dense?(e[r]||[])[d]:e[n[d]+f];if(h==null)c="";else if(h.v!=null){l=!1,c=""+(s.rawNumbers&&h.t=="n"?h.v:on(h,null,s));for(var m=0,p=0;m!==c.length;++m)if((p=c.charCodeAt(m))===i||p===o||p===34||s.forceQuotes){c='"'+c.replace(qg,'""')+'"';break}c=="ID"&&(c='"ID"')}else h.f!=null&&!h.F?(l=!1,c="="+h.f,c.indexOf(",")>=0&&(c='"'+c.replace(qg,'""')+'"')):c="";u.push(c)}return s.blankrows===!1&&l?null:u.join(a)}function Qd(e,t){var r=[],n=t??{};if(e==null||e["!ref"]==null)return"";var i=Xe(e["!ref"]),o=n.FS!==void 0?n.FS:",",a=o.charCodeAt(0),s=n.RS!==void 0?n.RS:` `,l=s.charCodeAt(0),u=new RegExp((o=="|"?"\\|":o)+"+$"),c="",f=[];n.dense=Array.isArray(e);for(var d=n.skipHidden&&e["!cols"]||[],h=n.skipHidden&&e["!rows"]||[],m=i.s.c;m<=i.e.c;++m)(d[m]||{}).hidden||(f[m]=Ft(m));for(var p=0,g=i.s.r;g<=i.e.r;++g)(h[g]||{}).hidden||(c=z6(e,i,g,f,a,l,o,n),c!=null&&(n.strip&&(c=c.replace(u,"")),(c||n.blankrows!==!1)&&r.push((p++?s:"")+c)));return delete n.dense,r.join("")}function Jw(e,t){t||(t={}),t.FS=" ",t.RS=` -`;var r=Qd(e,t);return r}function G6(e){var t="",r,n="";if(e==null||e["!ref"]==null)return[];var i=Xe(e["!ref"]),o="",a=[],s,l=[],u=Array.isArray(e);for(s=i.s.c;s<=i.e.c;++s)a[s]=Ft(s);for(var c=i.s.r;c<=i.e.r;++c)for(o=St(c),s=i.s.c;s<=i.e.c;++s)if(t=a[s]+o,r=u?(e[c]||[])[s]:e[t],n="",r!==void 0){if(r.F!=null){if(t=r.F,!r.f)continue;n=r.f,t.indexOf(":")==-1&&(t=t+":"+t)}if(r.f!=null)n=r.f;else{if(r.t=="z")continue;if(r.t=="n"&&r.v!=null)n=""+r.v;else if(r.t=="b")n=r.v?"TRUE":"FALSE";else if(r.w!==void 0)n="'"+r.w;else{if(r.v===void 0)continue;r.t=="s"?n="'"+r.v:n=""+r.v}}l[l.length]=t+"="+n}return l}function e2(e,t,r){var n=r||{},i=+!n.skipHeader,o=e||{},a=0,s=0;if(o&&n.origin!=null)if(typeof n.origin=="number")a=n.origin;else{var l=typeof n.origin=="string"?dt(n.origin):n.origin;a=l.r,s=l.c}var u,c={s:{c:0,r:0},e:{c:s,r:a+t.length-1+i}};if(o["!ref"]){var f=Xe(o["!ref"]);c.e.c=Math.max(c.e.c,f.e.c),c.e.r=Math.max(c.e.r,f.e.r),a==-1&&(a=f.e.r+1,c.e.r=a+t.length-1+i)}else a==-1&&(a=0,c.e.r=t.length-1+i);var d=n.header||[],h=0;t.forEach(function(p,g){Tt(p).forEach(function(v){(h=d.indexOf(v))==-1&&(d[h=d.length]=v);var w=p[v],y="z",E="",b=Ue({c:s+h,r:a+g+i});u=Xa(o,b),w&&typeof w=="object"&&!(w instanceof Date)?o[b]=w:(typeof w=="number"?y="n":typeof w=="boolean"?y="b":typeof w=="string"?y="s":w instanceof Date?(y="d",n.cellDates||(y="n",w=Xt(w)),E=n.dateNF||rt[14]):w===null&&n.nullError&&(y="e",w=0),u?(u.t=y,u.v=w,delete u.w,delete u.R,E&&(u.z=E)):o[b]=u={t:y,v:w},E&&(u.z=E))})}),c.e.c=Math.max(c.e.c,s+d.length-1);var m=St(a);if(i)for(h=0;h=0&&e.SheetNames.length>t)return t;throw new Error("Cannot find sheet # "+t)}else if(typeof t=="string"){var r=e.SheetNames.indexOf(t);if(r>-1)return r;throw new Error("Cannot find sheet name |"+t+"|")}else throw new Error("Cannot find sheet |"+t+"|")}function K6(){return{SheetNames:[],Sheets:{}}}function Y6(e,t,r,n){var i=1;if(!r)for(;i<=65535&&e.SheetNames.indexOf(r="Sheet"+i)!=-1;++i,r=void 0);if(!r||e.SheetNames.length>=65535)throw new Error("Too many worksheets");if(n&&e.SheetNames.indexOf(r)>=0){var o=r.match(/(^.*?)(\d+)$/);i=o&&+o[2]||0;var a=o&&o[1]||r;for(++i;i<=65535&&e.SheetNames.indexOf(r=a+i)!=-1;++i);}if(Ww(r),e.SheetNames.indexOf(r)>=0)throw new Error("Worksheet with name |"+r+"| already exists!");return e.SheetNames.push(r),e.Sheets[r]=t,r}function q6(e,t,r){e.Workbook||(e.Workbook={}),e.Workbook.Sheets||(e.Workbook.Sheets=[]);var n=X6(e,t);switch(e.Workbook.Sheets[n]||(e.Workbook.Sheets[n]={}),r){case 0:case 1:case 2:break;default:throw new Error("Bad sheet visibility setting "+r)}e.Workbook.Sheets[n].Hidden=r}function Q6(e,t){return e.z=t,e}function t2(e,t,r){return t?(e.l={Target:t},r&&(e.l.Tooltip=r)):delete e.l,e}function Z6(e,t,r){return t2(e,"#"+t,r)}function J6(e,t,r){e.c||(e.c=[]),e.c.push({t,a:r||"SheetJS"})}function eP(e,t,r,n){for(var i=typeof t!="string"?t:Xe(t),o=typeof t=="string"?t:ot(t),a=i.s.r;a<=i.e.r;++a)for(var s=i.s.c;s<=i.e.c;++s){var l=Xa(e,a,s);l.t="n",l.F=o,delete l.v,a==i.s.r&&s==i.s.c&&(l.f=r,n&&(l.D=!0))}return e}var Uc={encode_col:Ft,encode_row:St,encode_cell:Ue,encode_range:ot,decode_col:Ud,decode_row:Bd,split_cell:p3,decode_cell:dt,decode_range:tr,format_cell:on,sheet_add_aoa:tw,sheet_add_json:e2,sheet_add_dom:Kw,aoa_to_sheet:Fo,json_to_sheet:j6,table_to_sheet:Yw,table_to_book:_6,sheet_to_csv:Qd,sheet_to_txt:Jw,sheet_to_json:Yl,sheet_to_html:Xw,sheet_to_formulae:G6,sheet_to_row_object_array:Yl,sheet_get_cell:Xa,book_new:K6,book_append_sheet:Y6,book_set_sheet_visibility:q6,cell_set_number_format:Q6,cell_set_hyperlink:t2,cell_set_internal_link:Z6,cell_add_comment:J6,sheet_set_array_formula:eP,consts:{SHEET_VISIBLE:0,SHEET_HIDDEN:1,SHEET_VERY_HIDDEN:2}};function t0(e){if(typeof e=="string"){const t=e.replace(/[^a-zA-Z]/g,"").trim(),r=["","K","M","B","T"].indexOf(t.replace(/\s/g,""));e=Number(e.replace(/[^0-9.]/g,"").trim())*Math.pow(10,r*3)}return e}function tP(e,t){var r;if(typeof e=="string"&&(e=Number(t0(e))),e%1!==0){const n=Math.max(2,((r=e.toString().split(".")[1])==null?void 0:r.length)||0),i=Math.min(4,n);if(e<5)return e.toFixed(i)||0;e=Number(e.toFixed(2))}if((e>1e5||e<-1e5)&&!n2(t||"")){const n=Math.min(4,Math.floor(Math.log10(Math.abs(e))/3)),i=["","K","M","B","T"][n];return`${(e/10**(n*3)).toFixed(3).replace(/\.?0+$/,"")} ${i}`}return e>1e3||e<-1e3?r2(e):e}function r2(e){if(e>1e3||e<-1e3){const t=e.toString().split("."),r=t[0].replace(/\B(?=(\d{3})+(?!\d))/g,","),n=t[1]?`.${t[1]}`:"";return`${r}${n}`}return e}function ql(e){return["date","day","time","timestamp","year"].some(t=>e==null?void 0:e.toLowerCase().includes(t))}function n2(e){return["price","open","close"].some(t=>e==null?void 0:e.toLowerCase().includes(t))}function Ki(e,t){const r=window.document.getElementById("loading"),n=window.document.getElementById("loading_text");return new Promise(i=>{t?r.classList.remove("show"):(n.innerHTML=e,r.classList.add("show"));const o=setInterval(function(){(t?!r.classList.contains("show"):r.classList.contains("show"))&&(clearInterval(o),i(!0))},.01)})}function rP(e,t){if(e===t)return!0;if(e==null||t==null||(e==null?void 0:e.length)!==(t==null?void 0:t.length))return!1;for(let r=0;r<(e==null?void 0:e.length);++r)if(e[r]!==t[r])return!1;return!0}const nP=(e,t,r,n)=>{const i=n4(e.getValue(t),r);return n(i),i},iP=async({fileHandle:e,blob:t})=>{e&&await oP({fileHandle:e,blob:t})},oP=async({fileHandle:e,blob:t})=>{const r=await e.createWritable();await r.write(t),await r.close()},aP=[{description:"PNG Image",accept:{"image/png":[".png"]}},{description:"JPEG Image",accept:{"image/jpeg":[".jpeg"]}}],i2=({filename:e,is_image:t})=>{try{if("showSaveFilePicker"in window){const r={suggestedName:e,types:t?aP:[{description:"CSV File",accept:{"image/csv":[".csv"]}}],excludeAcceptAllOption:!0};return showSaveFilePicker(r)}}catch(r){console.error(r)}return new Promise(r=>{r(null)})},o2=(e,t,r)=>{try{if(r===null)throw new Error("Cannot access filesystem");iP({fileHandle:r,blob:e})}catch(n){console.error("oops, something went wrong!",n);const i=URL.createObjectURL(e),o=document.createElement("a");o.setAttribute("href",i),o.setAttribute("download",t),o.style.visibility="hidden",document.body.appendChild(o),o.click(),document.body.removeChild(o)}return new Promise(n=>{n(!0)})};async function Qg(e,t,r,n){const i=t,o=r.map(u=>i.map(c=>u[c])),a=[i,...o];if(e==="csv"){const u=a.map(d=>d.join(",")).join(` -`),c=new Blob([u],{type:"text/csv;charset=utf-8;"}),f=`${window.title}.csv`;try{const d=await i2({filename:f});let h="csv";d!==null&&(h=d.name.split(".").pop()),await Ki(`Saving ${h.toUpperCase()}`),r0(async function(){o2(c,f,d).then(async function(){await new Promise(m=>setTimeout(m,1500)),await Ki("",!0),d||n(!0)})},2)()}catch(d){console.error(d)}return}const s=Uc.book_new(),l=Uc.aoa_to_sheet(a);Uc.book_append_sheet(s,l,"Sheet1"),await Ki("Saving XLSX"),r0(async function(){await new Promise(u=>setTimeout(u,1500)),V6(s,`${window.title}.xlsx`),await Ki("",!0),n==null||n(!0)},2)()}async function sP(e,t){const r=document.getElementById(e),n=`${window.title}.png`;try{const i=await i2({filename:n,is_image:!0});let o="png";i!==null&&(o=i.name.split(".").pop()),await Ki(`Saving ${o.toUpperCase()}`),r0(async function(){c4.toBlob(r).then(function(a){o2(a,n,i).then(async function(){await new Promise(s=>setTimeout(s,1500)),await Ki("",!0),i||t(!0)})})},2)()}catch(i){console.error(i)}}const r0=(e,t)=>{let r;return function(){const n=this,i=arguments;clearTimeout(r),r=setTimeout(()=>e.apply(n,i),t)}},Ql=({title:e,titleId:t,...r})=>X("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,...r,children:X("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18L18 6M6 6l12 12"})});function Zg(e,[t,r]){return Math.min(r,Math.max(t,e))}function Fu(e){const t=e+"CollectionProvider",[r,n]=ln(t),[i,o]=r(t,{collectionRef:{current:null},itemMap:new Map}),a=h=>{const{scope:m,children:p}=h,g=or.useRef(null),v=or.useRef(new Map).current;return or.createElement(i,{scope:m,itemMap:v,collectionRef:g},p)},s=e+"CollectionSlot",l=or.forwardRef((h,m)=>{const{scope:p,children:g}=h,v=o(s,p),w=Ve(m,v.collectionRef);return or.createElement(ai,{ref:w},g)}),u=e+"CollectionItemSlot",c="data-radix-collection-item",f=or.forwardRef((h,m)=>{const{scope:p,children:g,...v}=h,w=or.useRef(null),y=Ve(m,w),E=o(u,p);return or.useEffect(()=>(E.itemMap.set(w,{ref:w,...v}),()=>void E.itemMap.delete(w))),or.createElement(ai,{[c]:"",ref:y},g)});function d(h){const m=o(e+"CollectionConsumer",h);return or.useCallback(()=>{const g=m.collectionRef.current;if(!g)return[];const v=Array.from(g.querySelectorAll(`[${c}]`));return Array.from(m.itemMap.values()).sort((E,b)=>v.indexOf(E.ref.current)-v.indexOf(b.ref.current))},[m.collectionRef,m.itemMap])}return[{Provider:a,Slot:l,ItemSlot:f},d,n]}const lP=x.createContext(void 0);function Zd(e){const t=x.useContext(lP);return e||t||"ltr"}function Io(e){return e.split("-")[1]}function Jd(e){return e==="y"?"height":"width"}function Jr(e){return e.split("-")[0]}function Ti(e){return["top","bottom"].includes(Jr(e))?"x":"y"}function Jg(e,t,r){let{reference:n,floating:i}=e;const o=n.x+n.width/2-i.width/2,a=n.y+n.height/2-i.height/2,s=Ti(t),l=Jd(s),u=n[l]/2-i[l]/2,c=s==="x";let f;switch(Jr(t)){case"top":f={x:o,y:n.y-i.height};break;case"bottom":f={x:o,y:n.y+n.height};break;case"right":f={x:n.x+n.width,y:a};break;case"left":f={x:n.x-i.width,y:a};break;default:f={x:n.x,y:n.y}}switch(Io(t)){case"start":f[s]-=u*(r&&c?-1:1);break;case"end":f[s]+=u*(r&&c?-1:1)}return f}const uP=async(e,t,r)=>{const{placement:n="bottom",strategy:i="absolute",middleware:o=[],platform:a}=r,s=o.filter(Boolean),l=await(a.isRTL==null?void 0:a.isRTL(t));let u=await a.getElementRects({reference:e,floating:t,strategy:i}),{x:c,y:f}=Jg(u,n,l),d=n,h={},m=0;for(let p=0;p({name:"arrow",options:e,async fn(t){const{x:r,y:n,placement:i,rects:o,platform:a,elements:s}=t,{element:l,padding:u=0}=an(e,t)||{};if(l==null)return{};const c=a2(u),f={x:r,y:n},d=Ti(i),h=Jd(d),m=await a.getDimensions(l),p=d==="y",g=p?"top":"left",v=p?"bottom":"right",w=p?"clientHeight":"clientWidth",y=o.reference[h]+o.reference[d]-f[d]-o.floating[h],E=f[d]-o.reference[d],b=await(a.getOffsetParent==null?void 0:a.getOffsetParent(l));let k=b?b[w]:0;k&&await(a.isElement==null?void 0:a.isElement(b))||(k=s.floating[w]||o.floating[h]);const _=y/2-E/2,C=k/2-m[h]/2-1,A=Ya(c[g],C),L=Ya(c[v],C),B=A,U=k-m[h]-L,H=k/2-m[h]/2+_,G=n0(B,H,U),ee=Io(i)!=null&&H!=G&&o.reference[h]/2-(He.concat(t,t+"-start",t+"-end"),[]);const cP={left:"right",right:"left",bottom:"top",top:"bottom"};function Jl(e){return e.replace(/left|right|bottom|top/g,t=>cP[t])}function fP(e,t,r){r===void 0&&(r=!1);const n=Io(e),i=Ti(e),o=Jd(i);let a=i==="x"?n===(r?"end":"start")?"right":"left":n==="start"?"bottom":"top";return t.reference[o]>t.floating[o]&&(a=Jl(a)),{main:a,cross:Jl(a)}}const dP={start:"end",end:"start"};function Hc(e){return e.replace(/start|end/g,t=>dP[t])}const hP=function(e){return e===void 0&&(e={}),{name:"flip",options:e,async fn(t){var r;const{placement:n,middlewareData:i,rects:o,initialPlacement:a,platform:s,elements:l}=t,{mainAxis:u=!0,crossAxis:c=!0,fallbackPlacements:f,fallbackStrategy:d="bestFit",fallbackAxisSideDirection:h="none",flipAlignment:m=!0,...p}=an(e,t),g=Jr(n),v=Jr(a)===a,w=await(s.isRTL==null?void 0:s.isRTL(l.floating)),y=f||(v||!m?[Jl(a)]:function(B){const U=Jl(B);return[Hc(B),U,Hc(U)]}(a));f||h==="none"||y.push(...function(B,U,H,G){const ee=Io(B);let ae=function(he,Te,oe){const ye=["left","right"],te=["right","left"],O=["top","bottom"],M=["bottom","top"];switch(he){case"top":case"bottom":return oe?Te?te:ye:Te?ye:te;case"left":case"right":return Te?O:M;default:return[]}}(Jr(B),H==="start",G);return ee&&(ae=ae.map(he=>he+"-"+ee),U&&(ae=ae.concat(ae.map(Hc)))),ae}(a,m,h,w));const E=[a,...y],b=await Ka(t,p),k=[];let _=((r=i.flip)==null?void 0:r.overflows)||[];if(u&&k.push(b[g]),c){const{main:B,cross:U}=fP(n,o,w);k.push(b[B],b[U])}if(_=[..._,{placement:n,overflows:k}],!k.every(B=>B<=0)){var C,A;const B=(((C=i.flip)==null?void 0:C.index)||0)+1,U=E[B];if(U)return{data:{index:B,overflows:_},reset:{placement:U}};let H=(A=_.filter(G=>G.overflows[0]<=0).sort((G,ee)=>G.overflows[1]-ee.overflows[1])[0])==null?void 0:A.placement;if(!H)switch(d){case"bestFit":{var L;const G=(L=_.map(ee=>[ee.placement,ee.overflows.filter(ae=>ae>0).reduce((ae,he)=>ae+he,0)]).sort((ee,ae)=>ee[1]-ae[1])[0])==null?void 0:L[0];G&&(H=G);break}case"initialPlacement":H=a}if(n!==H)return{reset:{placement:H}}}return{}}}};function t1(e,t){return{top:e.top-t.height,right:e.right-t.width,bottom:e.bottom-t.height,left:e.left-t.width}}function r1(e){return s2.some(t=>e[t]>=0)}const pP=function(e){return e===void 0&&(e={}),{name:"hide",options:e,async fn(t){const{rects:r}=t,{strategy:n="referenceHidden",...i}=an(e,t);switch(n){case"referenceHidden":{const o=t1(await Ka(t,{...i,elementContext:"reference"}),r.reference);return{data:{referenceHiddenOffsets:o,referenceHidden:r1(o)}}}case"escaped":{const o=t1(await Ka(t,{...i,altBoundary:!0}),r.floating);return{data:{escapedOffsets:o,escaped:r1(o)}}}default:return{}}}}},gP=function(e){return e===void 0&&(e=0),{name:"offset",options:e,async fn(t){const{x:r,y:n}=t,i=await async function(o,a){const{placement:s,platform:l,elements:u}=o,c=await(l.isRTL==null?void 0:l.isRTL(u.floating)),f=Jr(s),d=Io(s),h=Ti(s)==="x",m=["left","top"].includes(f)?-1:1,p=c&&h?-1:1,g=an(a,o);let{mainAxis:v,crossAxis:w,alignmentAxis:y}=typeof g=="number"?{mainAxis:g,crossAxis:0,alignmentAxis:null}:{mainAxis:0,crossAxis:0,alignmentAxis:null,...g};return d&&typeof y=="number"&&(w=d==="end"?-1*y:y),h?{x:w*p,y:v*m}:{x:v*m,y:w*p}}(t,e);return{x:r+i.x,y:n+i.y,data:i}}}};function l2(e){return e==="x"?"y":"x"}const mP=function(e){return e===void 0&&(e={}),{name:"shift",options:e,async fn(t){const{x:r,y:n,placement:i}=t,{mainAxis:o=!0,crossAxis:a=!1,limiter:s={fn:g=>{let{x:v,y:w}=g;return{x:v,y:w}}},...l}=an(e,t),u={x:r,y:n},c=await Ka(t,l),f=Ti(Jr(i)),d=l2(f);let h=u[f],m=u[d];if(o){const g=f==="y"?"bottom":"right";h=n0(h+c[f==="y"?"top":"left"],h,h-c[g])}if(a){const g=d==="y"?"bottom":"right";m=n0(m+c[d==="y"?"top":"left"],m,m-c[g])}const p=s.fn({...t,[f]:h,[d]:m});return{...p,data:{x:p.x-r,y:p.y-n}}}}},vP=function(e){return e===void 0&&(e={}),{options:e,fn(t){const{x:r,y:n,placement:i,rects:o,middlewareData:a}=t,{offset:s=0,mainAxis:l=!0,crossAxis:u=!0}=an(e,t),c={x:r,y:n},f=Ti(i),d=l2(f);let h=c[f],m=c[d];const p=an(s,t),g=typeof p=="number"?{mainAxis:p,crossAxis:0}:{mainAxis:0,crossAxis:0,...p};if(l){const y=f==="y"?"height":"width",E=o.reference[f]-o.floating[y]+g.mainAxis,b=o.reference[f]+o.reference[y]-g.mainAxis;hb&&(h=b)}if(u){var v,w;const y=f==="y"?"width":"height",E=["top","left"].includes(Jr(i)),b=o.reference[d]-o.floating[y]+(E&&((v=a.offset)==null?void 0:v[d])||0)+(E?0:g.crossAxis),k=o.reference[d]+o.reference[y]+(E?0:((w=a.offset)==null?void 0:w[d])||0)-(E?g.crossAxis:0);mk&&(m=k)}return{[f]:h,[d]:m}}}},xP=function(e){return e===void 0&&(e={}),{name:"size",options:e,async fn(t){const{placement:r,rects:n,platform:i,elements:o}=t,{apply:a=()=>{},...s}=an(e,t),l=await Ka(t,s),u=Jr(r),c=Io(r),f=Ti(r)==="x",{width:d,height:h}=n.floating;let m,p;u==="top"||u==="bottom"?(m=u,p=c===(await(i.isRTL==null?void 0:i.isRTL(o.floating))?"start":"end")?"left":"right"):(p=u,m=c==="end"?"top":"bottom");const g=h-l[m],v=d-l[p],w=!t.middlewareData.shift;let y=g,E=v;if(f){const k=d-l.left-l.right;E=c||w?Ya(v,k):k}else{const k=h-l.top-l.bottom;y=c||w?Ya(g,k):k}if(w&&!c){const k=Xn(l.left,0),_=Xn(l.right,0),C=Xn(l.top,0),A=Xn(l.bottom,0);f?E=d-2*(k!==0||_!==0?k+_:Xn(l.left,l.right)):y=h-2*(C!==0||A!==0?C+A:Xn(l.top,l.bottom))}await a({...t,availableWidth:E,availableHeight:y});const b=await i.getDimensions(o.floating);return d!==b.width||h!==b.height?{reset:{rects:!0}}:{}}}};function Jt(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function Nr(e){return Jt(e).getComputedStyle(e)}function u2(e){return e instanceof Jt(e).Node}function Bn(e){return u2(e)?(e.nodeName||"").toLowerCase():"#document"}function Ar(e){return e instanceof HTMLElement||e instanceof Jt(e).HTMLElement}function n1(e){return typeof ShadowRoot<"u"&&(e instanceof Jt(e).ShadowRoot||e instanceof ShadowRoot)}function qa(e){const{overflow:t,overflowX:r,overflowY:n,display:i}=Nr(e);return/auto|scroll|overlay|hidden|clip/.test(t+n+r)&&!["inline","contents"].includes(i)}function wP(e){return["table","td","th"].includes(Bn(e))}function i0(e){const t=eh(),r=Nr(e);return r.transform!=="none"||r.perspective!=="none"||!!r.containerType&&r.containerType!=="normal"||!t&&!!r.backdropFilter&&r.backdropFilter!=="none"||!t&&!!r.filter&&r.filter!=="none"||["transform","perspective","filter"].some(n=>(r.willChange||"").includes(n))||["paint","layout","strict","content"].some(n=>(r.contain||"").includes(n))}function eh(){return!(typeof CSS>"u"||!CSS.supports)&&CSS.supports("-webkit-backdrop-filter","none")}function Du(e){return["html","body","#document"].includes(Bn(e))}const o0=Math.min,co=Math.max,eu=Math.round,zs=Math.floor,Un=e=>({x:e,y:e});function c2(e){const t=Nr(e);let r=parseFloat(t.width)||0,n=parseFloat(t.height)||0;const i=Ar(e),o=i?e.offsetWidth:r,a=i?e.offsetHeight:n,s=eu(r)!==o||eu(n)!==a;return s&&(r=o,n=a),{width:r,height:n,$:s}}function en(e){return e instanceof Element||e instanceof Jt(e).Element}function th(e){return en(e)?e:e.contextElement}function fo(e){const t=th(e);if(!Ar(t))return Un(1);const r=t.getBoundingClientRect(),{width:n,height:i,$:o}=c2(t);let a=(o?eu(r.width):r.width)/n,s=(o?eu(r.height):r.height)/i;return a&&Number.isFinite(a)||(a=1),s&&Number.isFinite(s)||(s=1),{x:a,y:s}}const yP=Un(0);function f2(e){const t=Jt(e);return eh()&&t.visualViewport?{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}:yP}function ci(e,t,r,n){t===void 0&&(t=!1),r===void 0&&(r=!1);const i=e.getBoundingClientRect(),o=th(e);let a=Un(1);t&&(n?en(n)&&(a=fo(n)):a=fo(e));const s=function(d,h,m){return h===void 0&&(h=!1),!(!m||h&&m!==Jt(d))&&h}(o,r,n)?f2(o):Un(0);let l=(i.left+s.x)/a.x,u=(i.top+s.y)/a.y,c=i.width/a.x,f=i.height/a.y;if(o){const d=Jt(o),h=n&&en(n)?Jt(n):n;let m=d.frameElement;for(;m&&n&&h!==d;){const p=fo(m),g=m.getBoundingClientRect(),v=getComputedStyle(m),w=g.left+(m.clientLeft+parseFloat(v.paddingLeft))*p.x,y=g.top+(m.clientTop+parseFloat(v.paddingTop))*p.y;l*=p.x,u*=p.y,c*=p.x,f*=p.y,l+=w,u+=y,m=Jt(m).frameElement}}return Zl({width:c,height:f,x:l,y:u})}function Pu(e){return en(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function tn(e){var t;return(t=(u2(e)?e.ownerDocument:e.document)||window.document)==null?void 0:t.documentElement}function d2(e){return ci(tn(e)).left+Pu(e).scrollLeft}function wo(e){if(Bn(e)==="html")return e;const t=e.assignedSlot||e.parentNode||n1(e)&&e.host||tn(e);return n1(t)?t.host:t}function h2(e){const t=wo(e);return Du(t)?e.ownerDocument?e.ownerDocument.body:e.body:Ar(t)&&qa(t)?t:h2(t)}function tu(e,t){var r;t===void 0&&(t=[]);const n=h2(e),i=n===((r=e.ownerDocument)==null?void 0:r.body),o=Jt(n);return i?t.concat(o,o.visualViewport||[],qa(n)?n:[]):t.concat(n,tu(n))}function i1(e,t,r){let n;if(t==="viewport")n=function(i,o){const a=Jt(i),s=tn(i),l=a.visualViewport;let u=s.clientWidth,c=s.clientHeight,f=0,d=0;if(l){u=l.width,c=l.height;const h=eh();(!h||h&&o==="fixed")&&(f=l.offsetLeft,d=l.offsetTop)}return{width:u,height:c,x:f,y:d}}(e,r);else if(t==="document")n=function(i){const o=tn(i),a=Pu(i),s=i.ownerDocument.body,l=co(o.scrollWidth,o.clientWidth,s.scrollWidth,s.clientWidth),u=co(o.scrollHeight,o.clientHeight,s.scrollHeight,s.clientHeight);let c=-a.scrollLeft+d2(i);const f=-a.scrollTop;return Nr(s).direction==="rtl"&&(c+=co(o.clientWidth,s.clientWidth)-l),{width:l,height:u,x:c,y:f}}(tn(e));else if(en(t))n=function(i,o){const a=ci(i,!0,o==="fixed"),s=a.top+i.clientTop,l=a.left+i.clientLeft,u=Ar(i)?fo(i):Un(1);return{width:i.clientWidth*u.x,height:i.clientHeight*u.y,x:l*u.x,y:s*u.y}}(t,r);else{const i=f2(e);n={...t,x:t.x-i.x,y:t.y-i.y}}return Zl(n)}function p2(e,t){const r=wo(e);return!(r===t||!en(r)||Du(r))&&(Nr(r).position==="fixed"||p2(r,t))}function EP(e,t,r){const n=Ar(t),i=tn(t),o=r==="fixed",a=ci(e,!0,o,t);let s={scrollLeft:0,scrollTop:0};const l=Un(0);if(n||!n&&!o)if((Bn(t)!=="body"||qa(i))&&(s=Pu(t)),Ar(t)){const u=ci(t,!0,o,t);l.x=u.x+t.clientLeft,l.y=u.y+t.clientTop}else i&&(l.x=d2(i));return{x:a.left+s.scrollLeft-l.x,y:a.top+s.scrollTop-l.y,width:a.width,height:a.height}}function o1(e,t){return Ar(e)&&Nr(e).position!=="fixed"?t?t(e):e.offsetParent:null}function a1(e,t){const r=Jt(e);if(!Ar(e))return r;let n=o1(e,t);for(;n&&wP(n)&&Nr(n).position==="static";)n=o1(n,t);return n&&(Bn(n)==="html"||Bn(n)==="body"&&Nr(n).position==="static"&&!i0(n))?r:n||function(i){let o=wo(i);for(;Ar(o)&&!Du(o);){if(i0(o))return o;o=wo(o)}return null}(e)||r}const SP={convertOffsetParentRelativeRectToViewportRelativeRect:function(e){let{rect:t,offsetParent:r,strategy:n}=e;const i=Ar(r),o=tn(r);if(r===o)return t;let a={scrollLeft:0,scrollTop:0},s=Un(1);const l=Un(0);if((i||!i&&n!=="fixed")&&((Bn(r)!=="body"||qa(o))&&(a=Pu(r)),Ar(r))){const u=ci(r);s=fo(r),l.x=u.x+r.clientLeft,l.y=u.y+r.clientTop}return{width:t.width*s.x,height:t.height*s.y,x:t.x*s.x-a.scrollLeft*s.x+l.x,y:t.y*s.y-a.scrollTop*s.y+l.y}},getDocumentElement:tn,getClippingRect:function(e){let{element:t,boundary:r,rootBoundary:n,strategy:i}=e;const o=[...r==="clippingAncestors"?function(l,u){const c=u.get(l);if(c)return c;let f=tu(l).filter(p=>en(p)&&Bn(p)!=="body"),d=null;const h=Nr(l).position==="fixed";let m=h?wo(l):l;for(;en(m)&&!Du(m);){const p=Nr(m),g=i0(m);g||p.position!=="fixed"||(d=null),(h?!g&&!d:!g&&p.position==="static"&&d&&["absolute","fixed"].includes(d.position)||qa(m)&&!g&&p2(l,m))?f=f.filter(v=>v!==m):d=p,m=wo(m)}return u.set(l,f),f}(t,this._c):[].concat(r),n],a=o[0],s=o.reduce((l,u)=>{const c=i1(t,u,i);return l.top=co(c.top,l.top),l.right=o0(c.right,l.right),l.bottom=o0(c.bottom,l.bottom),l.left=co(c.left,l.left),l},i1(t,a,i));return{width:s.right-s.left,height:s.bottom-s.top,x:s.left,y:s.top}},getOffsetParent:a1,getElementRects:async function(e){let{reference:t,floating:r,strategy:n}=e;const i=this.getOffsetParent||a1,o=this.getDimensions;return{reference:EP(t,await i(r),n),floating:{x:0,y:0,...await o(r)}}},getClientRects:function(e){return Array.from(e.getClientRects())},getDimensions:function(e){return c2(e)},getScale:fo,isElement:en,isRTL:function(e){return getComputedStyle(e).direction==="rtl"}};function _P(e,t,r,n){n===void 0&&(n={});const{ancestorScroll:i=!0,ancestorResize:o=!0,elementResize:a=typeof ResizeObserver=="function",layoutShift:s=typeof IntersectionObserver=="function",animationFrame:l=!1}=n,u=th(e),c=i||o?[...u?tu(u):[],...tu(t)]:[];c.forEach(g=>{i&&g.addEventListener("scroll",r,{passive:!0}),o&&g.addEventListener("resize",r)});const f=u&&s?function(g,v){let w,y=null;const E=tn(g);function b(){clearTimeout(w),y&&y.disconnect(),y=null}return function k(_,C){_===void 0&&(_=!1),C===void 0&&(C=1),b();const{left:A,top:L,width:B,height:U}=g.getBoundingClientRect();if(_||v(),!B||!U)return;const H={rootMargin:-zs(L)+"px "+-zs(E.clientWidth-(A+B))+"px "+-zs(E.clientHeight-(L+U))+"px "+-zs(A)+"px",threshold:co(0,o0(1,C))||1};let G=!0;function ee(ae){const he=ae[0].intersectionRatio;if(he!==C){if(!G)return k();he?k(!1,he):w=setTimeout(()=>{k(!1,1e-7)},100)}G=!1}try{y=new IntersectionObserver(ee,{...H,root:E.ownerDocument})}catch{y=new IntersectionObserver(ee,H)}y.observe(g)}(!0),b}(u,r):null;let d,h=-1,m=null;a&&(m=new ResizeObserver(g=>{let[v]=g;v&&v.target===u&&m&&(m.unobserve(t),cancelAnimationFrame(h),h=requestAnimationFrame(()=>{m&&m.observe(t)})),r()}),u&&!l&&m.observe(u),m.observe(t));let p=l?ci(e):null;return l&&function g(){const v=ci(e);!p||v.x===p.x&&v.y===p.y&&v.width===p.width&&v.height===p.height||r(),p=v,d=requestAnimationFrame(g)}(),r(),()=>{c.forEach(g=>{i&&g.removeEventListener("scroll",r),o&&g.removeEventListener("resize",r)}),f&&f(),m&&m.disconnect(),m=null,l&&cancelAnimationFrame(d)}}const TP=(e,t,r)=>{const n=new Map,i={platform:SP,...r},o={...i.platform,_c:n};return uP(e,t,{...i,platform:o})},CP=e=>{function t(r){return{}.hasOwnProperty.call(r,"current")}return{name:"arrow",options:e,fn(r){const{element:n,padding:i}=typeof e=="function"?e(r):e;return n&&t(n)?n.current!=null?e1({element:n.current,padding:i}).fn(r):{}:n?e1({element:n,padding:i}).fn(r):{}}}};var ul=typeof document<"u"?x.useLayoutEffect:x.useEffect;function ru(e,t){if(e===t)return!0;if(typeof e!=typeof t)return!1;if(typeof e=="function"&&e.toString()===t.toString())return!0;let r,n,i;if(e&&t&&typeof e=="object"){if(Array.isArray(e)){if(r=e.length,r!=t.length)return!1;for(n=r;n--!==0;)if(!ru(e[n],t[n]))return!1;return!0}if(i=Object.keys(e),r=i.length,r!==Object.keys(t).length)return!1;for(n=r;n--!==0;)if(!{}.hasOwnProperty.call(t,i[n]))return!1;for(n=r;n--!==0;){const o=i[n];if(!(o==="_owner"&&e.$$typeof)&&!ru(e[o],t[o]))return!1}return!0}return e!==e&&t!==t}function g2(e){return typeof window>"u"?1:(e.ownerDocument.defaultView||window).devicePixelRatio||1}function s1(e,t){const r=g2(e);return Math.round(t*r)/r}function l1(e){const t=x.useRef(e);return ul(()=>{t.current=e}),t}function AP(e){e===void 0&&(e={});const{placement:t="bottom",strategy:r="absolute",middleware:n=[],platform:i,elements:{reference:o,floating:a}={},transform:s=!0,whileElementsMounted:l,open:u}=e,[c,f]=x.useState({x:0,y:0,strategy:r,placement:t,middlewareData:{},isPositioned:!1}),[d,h]=x.useState(n);ru(d,n)||h(n);const[m,p]=x.useState(null),[g,v]=x.useState(null),w=x.useCallback(ae=>{ae!=k.current&&(k.current=ae,p(ae))},[p]),y=x.useCallback(ae=>{ae!==_.current&&(_.current=ae,v(ae))},[v]),E=o||m,b=a||g,k=x.useRef(null),_=x.useRef(null),C=x.useRef(c),A=l1(l),L=l1(i),B=x.useCallback(()=>{if(!k.current||!_.current)return;const ae={placement:t,strategy:r,middleware:d};L.current&&(ae.platform=L.current),TP(k.current,_.current,ae).then(he=>{const Te={...he,isPositioned:!0};U.current&&!ru(C.current,Te)&&(C.current=Te,mi.flushSync(()=>{f(Te)}))})},[d,t,r,L]);ul(()=>{u===!1&&C.current.isPositioned&&(C.current.isPositioned=!1,f(ae=>({...ae,isPositioned:!1})))},[u]);const U=x.useRef(!1);ul(()=>(U.current=!0,()=>{U.current=!1}),[]),ul(()=>{if(E&&(k.current=E),b&&(_.current=b),E&&b){if(A.current)return A.current(E,b,B);B()}},[E,b,B,A]);const H=x.useMemo(()=>({reference:k,floating:_,setReference:w,setFloating:y}),[w,y]),G=x.useMemo(()=>({reference:E,floating:b}),[E,b]),ee=x.useMemo(()=>{const ae={position:r,left:0,top:0};if(!G.floating)return ae;const he=s1(G.floating,c.x),Te=s1(G.floating,c.y);return s?{...ae,transform:"translate("+he+"px, "+Te+"px)",...g2(G.floating)>=1.5&&{willChange:"transform"}}:{position:r,left:he,top:Te}},[r,s,G.floating,c.x,c.y]);return x.useMemo(()=>({...c,update:B,refs:H,elements:G,floatingStyles:ee}),[c,B,H,G,ee])}function RP(e){const[t,r]=x.useState(void 0);return Bt(()=>{if(e){r({width:e.offsetWidth,height:e.offsetHeight});const n=new ResizeObserver(i=>{if(!Array.isArray(i)||!i.length)return;const o=i[0];let a,s;if("borderBoxSize"in o){const l=o.borderBoxSize,u=Array.isArray(l)?l[0]:l;a=u.inlineSize,s=u.blockSize}else a=e.offsetWidth,s=e.offsetHeight;r({width:a,height:s})});return n.observe(e,{box:"border-box"}),()=>n.unobserve(e)}else r(void 0)},[e]),t}const m2="Popper",[v2,Iu]=ln(m2),[OP,x2]=v2(m2),FP=e=>{const{__scopePopper:t,children:r}=e,[n,i]=x.useState(null);return x.createElement(OP,{scope:t,anchor:n,onAnchorChange:i},r)},DP="PopperAnchor",PP=x.forwardRef((e,t)=>{const{__scopePopper:r,virtualRef:n,...i}=e,o=x2(DP,r),a=x.useRef(null),s=Ve(t,a);return x.useEffect(()=>{o.onAnchorChange((n==null?void 0:n.current)||a.current)}),n?null:x.createElement(Ie.div,ge({},i,{ref:s}))}),w2="PopperContent",[IP,r$]=v2(w2),bP=x.forwardRef((e,t)=>{var r,n,i,o,a,s,l,u;const{__scopePopper:c,side:f="bottom",sideOffset:d=0,align:h="center",alignOffset:m=0,arrowPadding:p=0,collisionBoundary:g=[],collisionPadding:v=0,sticky:w="partial",hideWhenDetached:y=!1,avoidCollisions:E=!0,onPlaced:b,...k}=e,_=x2(w2,c),[C,A]=x.useState(null),L=Ve(t,ie=>A(ie)),[B,U]=x.useState(null),H=RP(B),G=(r=H==null?void 0:H.width)!==null&&r!==void 0?r:0,ee=(n=H==null?void 0:H.height)!==null&&n!==void 0?n:0,ae=f+(h!=="center"?"-"+h:""),he=typeof v=="number"?v:{top:0,right:0,bottom:0,left:0,...v},Te=Array.isArray(g)?g:[g],oe=Te.length>0,ye={padding:he,boundary:Te.filter(kP),altBoundary:oe},{refs:te,floatingStyles:O,placement:M,isPositioned:N,middlewareData:F}=AP({strategy:"fixed",placement:ae,whileElementsMounted:_P,elements:{reference:_.anchor},middleware:[gP({mainAxis:d+ee,alignmentAxis:m}),E&&mP({mainAxis:!0,crossAxis:!1,limiter:w==="partial"?vP():void 0,...ye}),E&&hP({...ye}),xP({...ye,apply:({elements:ie,rects:$e,availableWidth:Pe,availableHeight:ve})=>{const{width:ut,height:gt}=$e.reference,bt=ie.floating.style;bt.setProperty("--radix-popper-available-width",`${Pe}px`),bt.setProperty("--radix-popper-available-height",`${ve}px`),bt.setProperty("--radix-popper-anchor-width",`${ut}px`),bt.setProperty("--radix-popper-anchor-height",`${gt}px`)}}),B&&CP({element:B,padding:p}),$P({arrowWidth:G,arrowHeight:ee}),y&&pP({strategy:"referenceHidden"})]}),[V,Y]=y2(M),J=It(b);Bt(()=>{N&&(J==null||J())},[N,J]);const W=(i=F.arrow)===null||i===void 0?void 0:i.x,Q=(o=F.arrow)===null||o===void 0?void 0:o.y,le=((a=F.arrow)===null||a===void 0?void 0:a.centerOffset)!==0,[me,_e]=x.useState();return Bt(()=>{C&&_e(window.getComputedStyle(C).zIndex)},[C]),x.createElement("div",{ref:te.setFloating,"data-radix-popper-content-wrapper":"",style:{...O,transform:N?O.transform:"translate(0, -200%)",minWidth:"max-content",zIndex:me,"--radix-popper-transform-origin":[(s=F.transformOrigin)===null||s===void 0?void 0:s.x,(l=F.transformOrigin)===null||l===void 0?void 0:l.y].join(" ")},dir:e.dir},x.createElement(IP,{scope:c,placedSide:V,onArrowChange:U,arrowX:W,arrowY:Q,shouldHideArrow:le},x.createElement(Ie.div,ge({"data-side":V,"data-align":Y},k,{ref:L,style:{...k.style,animation:N?void 0:"none",opacity:(u=F.hide)!==null&&u!==void 0&&u.referenceHidden?0:void 0}}))))});function kP(e){return e!==null}const $P=e=>({name:"transformOrigin",options:e,fn(t){var r,n,i,o,a;const{placement:s,rects:l,middlewareData:u}=t,f=((r=u.arrow)===null||r===void 0?void 0:r.centerOffset)!==0,d=f?0:e.arrowWidth,h=f?0:e.arrowHeight,[m,p]=y2(s),g={start:"0%",center:"50%",end:"100%"}[p],v=((n=(i=u.arrow)===null||i===void 0?void 0:i.x)!==null&&n!==void 0?n:0)+d/2,w=((o=(a=u.arrow)===null||a===void 0?void 0:a.y)!==null&&o!==void 0?o:0)+h/2;let y="",E="";return m==="bottom"?(y=f?g:`${v}px`,E=`${-h}px`):m==="top"?(y=f?g:`${v}px`,E=`${l.floating.height+h}px`):m==="right"?(y=`${-h}px`,E=f?g:`${w}px`):m==="left"&&(y=`${l.floating.width+h}px`,E=f?g:`${w}px`),{data:{x:y,y:E}}}});function y2(e){const[t,r="center"]=e.split("-");return[t,r]}const E2=FP,S2=PP,_2=bP;function NP(e){const t=x.useRef({value:e,previous:e});return x.useMemo(()=>(t.current.value!==e&&(t.current.previous=t.current.value,t.current.value=e),t.current.previous),[e])}const rh=x.forwardRef((e,t)=>x.createElement(Ie.span,ge({},e,{ref:t,style:{position:"absolute",border:0,width:1,height:1,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",wordWrap:"normal",...e.style}}))),MP=[" ","Enter","ArrowUp","ArrowDown"],LP=[" ","Enter"],bu="Select",[ku,$u,BP]=Fu(bu),[bo,n$]=ln(bu,[BP,Iu]),nh=Iu(),[UP,Ci]=bo(bu),[HP,VP]=bo(bu),WP=e=>{const{__scopeSelect:t,children:r,open:n,defaultOpen:i,onOpenChange:o,value:a,defaultValue:s,onValueChange:l,dir:u,name:c,autoComplete:f,disabled:d,required:h}=e,m=nh(t),[p,g]=x.useState(null),[v,w]=x.useState(null),[y,E]=x.useState(!1),b=Zd(u),[k=!1,_]=vo({prop:n,defaultProp:i,onChange:o}),[C,A]=vo({prop:a,defaultProp:s,onChange:l}),L=x.useRef(null),B=p?!!p.closest("form"):!0,[U,H]=x.useState(new Set),G=Array.from(U).map(ee=>ee.props.value).join(";");return x.createElement(E2,m,x.createElement(UP,{required:h,scope:t,trigger:p,onTriggerChange:g,valueNode:v,onValueNodeChange:w,valueNodeHasChildren:y,onValueNodeHasChildrenChange:E,contentId:Yr(),value:C,onValueChange:A,open:k,onOpenChange:_,dir:b,triggerPointerDownPosRef:L,disabled:d},x.createElement(ku.Provider,{scope:t},x.createElement(HP,{scope:e.__scopeSelect,onNativeOptionAdd:x.useCallback(ee=>{H(ae=>new Set(ae).add(ee))},[]),onNativeOptionRemove:x.useCallback(ee=>{H(ae=>{const he=new Set(ae);return he.delete(ee),he})},[])},r)),B?x.createElement(R2,{key:G,"aria-hidden":!0,required:h,tabIndex:-1,name:c,autoComplete:f,value:C,onChange:ee=>A(ee.target.value),disabled:d},C===void 0?x.createElement("option",{value:""}):null,Array.from(U)):null))},zP="SelectTrigger",GP=x.forwardRef((e,t)=>{const{__scopeSelect:r,disabled:n=!1,...i}=e,o=nh(r),a=Ci(zP,r),s=a.disabled||n,l=Ve(t,a.onTriggerChange),u=$u(r),[c,f,d]=O2(m=>{const p=u().filter(w=>!w.disabled),g=p.find(w=>w.value===a.value),v=F2(p,m,g);v!==void 0&&a.onValueChange(v.value)}),h=()=>{s||(a.onOpenChange(!0),d())};return x.createElement(S2,ge({asChild:!0},o),x.createElement(Ie.button,ge({type:"button",role:"combobox","aria-controls":a.contentId,"aria-expanded":a.open,"aria-required":a.required,"aria-autocomplete":"none",dir:a.dir,"data-state":a.open?"open":"closed",disabled:s,"data-disabled":s?"":void 0,"data-placeholder":a.value===void 0?"":void 0},i,{ref:l,onClick:Se(i.onClick,m=>{m.currentTarget.focus()}),onPointerDown:Se(i.onPointerDown,m=>{const p=m.target;p.hasPointerCapture(m.pointerId)&&p.releasePointerCapture(m.pointerId),m.button===0&&m.ctrlKey===!1&&(h(),a.triggerPointerDownPosRef.current={x:Math.round(m.pageX),y:Math.round(m.pageY)},m.preventDefault())}),onKeyDown:Se(i.onKeyDown,m=>{const p=c.current!=="";!(m.ctrlKey||m.altKey||m.metaKey)&&m.key.length===1&&f(m.key),!(p&&m.key===" ")&&MP.includes(m.key)&&(h(),m.preventDefault())})})))}),jP="SelectValue",XP=x.forwardRef((e,t)=>{const{__scopeSelect:r,className:n,style:i,children:o,placeholder:a,...s}=e,l=Ci(jP,r),{onValueNodeHasChildrenChange:u}=l,c=o!==void 0,f=Ve(t,l.onValueNodeChange);return Bt(()=>{u(c)},[u,c]),x.createElement(Ie.span,ge({},s,{ref:f,style:{pointerEvents:"none"}}),l.value===void 0&&a!==void 0?a:o)}),KP=x.forwardRef((e,t)=>{const{__scopeSelect:r,children:n,...i}=e;return x.createElement(Ie.span,ge({"aria-hidden":!0},i,{ref:t}),n||"▼")}),YP=e=>x.createElement(xu,ge({asChild:!0},e)),yo="SelectContent",qP=x.forwardRef((e,t)=>{const r=Ci(yo,e.__scopeSelect),[n,i]=x.useState();if(Bt(()=>{i(new DocumentFragment)},[]),!r.open){const o=n;return o?mi.createPortal(x.createElement(T2,{scope:e.__scopeSelect},x.createElement(ku.Slot,{scope:e.__scopeSelect},x.createElement("div",null,e.children))),o):null}return x.createElement(QP,ge({},e,{ref:t}))}),Vr=10,[T2,Ai]=bo(yo),QP=x.forwardRef((e,t)=>{const{__scopeSelect:r,position:n="item-aligned",onCloseAutoFocus:i,onEscapeKeyDown:o,onPointerDownOutside:a,side:s,sideOffset:l,align:u,alignOffset:c,arrowPadding:f,collisionBoundary:d,collisionPadding:h,sticky:m,hideWhenDetached:p,avoidCollisions:g,...v}=e,w=Ci(yo,r),[y,E]=x.useState(null),[b,k]=x.useState(null),_=Ve(t,Y=>E(Y)),[C,A]=x.useState(null),[L,B]=x.useState(null),U=$u(r),[H,G]=x.useState(!1),ee=x.useRef(!1);x.useEffect(()=>{if(y)return _d(y)},[y]),Ed();const ae=x.useCallback(Y=>{const[J,...W]=U().map(me=>me.ref.current),[Q]=W.slice(-1),le=document.activeElement;for(const me of Y)if(me===le||(me==null||me.scrollIntoView({block:"nearest"}),me===J&&b&&(b.scrollTop=0),me===Q&&b&&(b.scrollTop=b.scrollHeight),me==null||me.focus(),document.activeElement!==le))return},[U,b]),he=x.useCallback(()=>ae([C,y]),[ae,C,y]);x.useEffect(()=>{H&&he()},[H,he]);const{onOpenChange:Te,triggerPointerDownPosRef:oe}=w;x.useEffect(()=>{if(y){let Y={x:0,y:0};const J=Q=>{var le,me,_e,ie;Y={x:Math.abs(Math.round(Q.pageX)-((le=(me=oe.current)===null||me===void 0?void 0:me.x)!==null&&le!==void 0?le:0)),y:Math.abs(Math.round(Q.pageY)-((_e=(ie=oe.current)===null||ie===void 0?void 0:ie.y)!==null&&_e!==void 0?_e:0))}},W=Q=>{Y.x<=10&&Y.y<=10?Q.preventDefault():y.contains(Q.target)||Te(!1),document.removeEventListener("pointermove",J),oe.current=null};return oe.current!==null&&(document.addEventListener("pointermove",J),document.addEventListener("pointerup",W,{capture:!0,once:!0})),()=>{document.removeEventListener("pointermove",J),document.removeEventListener("pointerup",W,{capture:!0})}}},[y,Te,oe]),x.useEffect(()=>{const Y=()=>Te(!1);return window.addEventListener("blur",Y),window.addEventListener("resize",Y),()=>{window.removeEventListener("blur",Y),window.removeEventListener("resize",Y)}},[Te]);const[ye,te]=O2(Y=>{const J=U().filter(le=>!le.disabled),W=J.find(le=>le.ref.current===document.activeElement),Q=F2(J,Y,W);Q&&setTimeout(()=>Q.ref.current.focus())}),O=x.useCallback((Y,J,W)=>{const Q=!ee.current&&!W;(w.value!==void 0&&w.value===J||Q)&&(A(Y),Q&&(ee.current=!0))},[w.value]),M=x.useCallback(()=>y==null?void 0:y.focus(),[y]),N=x.useCallback((Y,J,W)=>{const Q=!ee.current&&!W;(w.value!==void 0&&w.value===J||Q)&&B(Y)},[w.value]),F=n==="popper"?u1:ZP,V=F===u1?{side:s,sideOffset:l,align:u,alignOffset:c,arrowPadding:f,collisionBoundary:d,collisionPadding:h,sticky:m,hideWhenDetached:p,avoidCollisions:g}:{};return x.createElement(T2,{scope:r,content:y,viewport:b,onViewportChange:k,itemRefCallback:O,selectedItem:C,onItemLeave:M,itemTextRefCallback:N,focusSelectedItem:he,selectedItemText:L,position:n,isPositioned:H,searchRef:ye},x.createElement(Sd,{as:ai,allowPinchZoom:!0},x.createElement(yd,{asChild:!0,trapped:w.open,onMountAutoFocus:Y=>{Y.preventDefault()},onUnmountAutoFocus:Se(i,Y=>{var J;(J=w.trigger)===null||J===void 0||J.focus({preventScroll:!0}),Y.preventDefault()})},x.createElement(vu,{asChild:!0,disableOutsidePointerEvents:!0,onEscapeKeyDown:o,onPointerDownOutside:a,onFocusOutside:Y=>Y.preventDefault(),onDismiss:()=>w.onOpenChange(!1)},x.createElement(F,ge({role:"listbox",id:w.contentId,"data-state":w.open?"open":"closed",dir:w.dir,onContextMenu:Y=>Y.preventDefault()},v,V,{onPlaced:()=>G(!0),ref:_,style:{display:"flex",flexDirection:"column",outline:"none",...v.style},onKeyDown:Se(v.onKeyDown,Y=>{const J=Y.ctrlKey||Y.altKey||Y.metaKey;if(Y.key==="Tab"&&Y.preventDefault(),!J&&Y.key.length===1&&te(Y.key),["ArrowUp","ArrowDown","Home","End"].includes(Y.key)){let Q=U().filter(le=>!le.disabled).map(le=>le.ref.current);if(["ArrowUp","End"].includes(Y.key)&&(Q=Q.slice().reverse()),["ArrowUp","ArrowDown"].includes(Y.key)){const le=Y.target,me=Q.indexOf(le);Q=Q.slice(me+1)}setTimeout(()=>ae(Q)),Y.preventDefault()}})}))))))}),ZP=x.forwardRef((e,t)=>{const{__scopeSelect:r,onPlaced:n,...i}=e,o=Ci(yo,r),a=Ai(yo,r),[s,l]=x.useState(null),[u,c]=x.useState(null),f=Ve(t,_=>c(_)),d=$u(r),h=x.useRef(!1),m=x.useRef(!0),{viewport:p,selectedItem:g,selectedItemText:v,focusSelectedItem:w}=a,y=x.useCallback(()=>{if(o.trigger&&o.valueNode&&s&&u&&p&&g&&v){const _=o.trigger.getBoundingClientRect(),C=u.getBoundingClientRect(),A=o.valueNode.getBoundingClientRect(),L=v.getBoundingClientRect();if(o.dir!=="rtl"){const le=L.left-C.left,me=A.left-le,_e=_.left-me,ie=_.width+_e,$e=Math.max(ie,C.width),Pe=window.innerWidth-Vr,ve=Zg(me,[Vr,Pe-$e]);s.style.minWidth=ie+"px",s.style.left=ve+"px"}else{const le=C.right-L.right,me=window.innerWidth-A.right-le,_e=window.innerWidth-_.right-me,ie=_.width+_e,$e=Math.max(ie,C.width),Pe=window.innerWidth-Vr,ve=Zg(me,[Vr,Pe-$e]);s.style.minWidth=ie+"px",s.style.right=ve+"px"}const B=d(),U=window.innerHeight-Vr*2,H=p.scrollHeight,G=window.getComputedStyle(u),ee=parseInt(G.borderTopWidth,10),ae=parseInt(G.paddingTop,10),he=parseInt(G.borderBottomWidth,10),Te=parseInt(G.paddingBottom,10),oe=ee+ae+H+Te+he,ye=Math.min(g.offsetHeight*5,oe),te=window.getComputedStyle(p),O=parseInt(te.paddingTop,10),M=parseInt(te.paddingBottom,10),N=_.top+_.height/2-Vr,F=U-N,V=g.offsetHeight/2,Y=g.offsetTop+V,J=ee+ae+Y,W=oe-J;if(J<=N){const le=g===B[B.length-1].ref.current;s.style.bottom="0px";const me=u.clientHeight-p.offsetTop-p.offsetHeight,_e=Math.max(F,V+(le?M:0)+me+he),ie=J+_e;s.style.height=ie+"px"}else{const le=g===B[0].ref.current;s.style.top="0px";const _e=Math.max(N,ee+p.offsetTop+(le?O:0)+V)+W;s.style.height=_e+"px",p.scrollTop=J-N+p.offsetTop}s.style.margin=`${Vr}px 0`,s.style.minHeight=ye+"px",s.style.maxHeight=U+"px",n==null||n(),requestAnimationFrame(()=>h.current=!0)}},[d,o.trigger,o.valueNode,s,u,p,g,v,o.dir,n]);Bt(()=>y(),[y]);const[E,b]=x.useState();Bt(()=>{u&&b(window.getComputedStyle(u).zIndex)},[u]);const k=x.useCallback(_=>{_&&m.current===!0&&(y(),w==null||w(),m.current=!1)},[y,w]);return x.createElement(JP,{scope:r,contentWrapper:s,shouldExpandOnScrollRef:h,onScrollButtonChange:k},x.createElement("div",{ref:l,style:{display:"flex",flexDirection:"column",position:"fixed",zIndex:E}},x.createElement(Ie.div,ge({},i,{ref:f,style:{boxSizing:"border-box",maxHeight:"100%",...i.style}}))))}),u1=x.forwardRef((e,t)=>{const{__scopeSelect:r,align:n="start",collisionPadding:i=Vr,...o}=e,a=nh(r);return x.createElement(_2,ge({},a,o,{ref:t,align:n,collisionPadding:i,style:{boxSizing:"border-box",...o.style,"--radix-select-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-select-content-available-width":"var(--radix-popper-available-width)","--radix-select-content-available-height":"var(--radix-popper-available-height)","--radix-select-trigger-width":"var(--radix-popper-anchor-width)","--radix-select-trigger-height":"var(--radix-popper-anchor-height)"}}))}),[JP,ih]=bo(yo,{}),c1="SelectViewport",eI=x.forwardRef((e,t)=>{const{__scopeSelect:r,...n}=e,i=Ai(c1,r),o=ih(c1,r),a=Ve(t,i.onViewportChange),s=x.useRef(0);return x.createElement(x.Fragment,null,x.createElement("style",{dangerouslySetInnerHTML:{__html:"[data-radix-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-select-viewport]::-webkit-scrollbar{display:none}"}}),x.createElement(ku.Slot,{scope:r},x.createElement(Ie.div,ge({"data-radix-select-viewport":"",role:"presentation"},n,{ref:a,style:{position:"relative",flex:1,overflow:"auto",...n.style},onScroll:Se(n.onScroll,l=>{const u=l.currentTarget,{contentWrapper:c,shouldExpandOnScrollRef:f}=o;if(f!=null&&f.current&&c){const d=Math.abs(s.current-u.scrollTop);if(d>0){const h=window.innerHeight-Vr*2,m=parseFloat(c.style.minHeight),p=parseFloat(c.style.height),g=Math.max(m,p);if(g0?y:0,c.style.justifyContent="flex-end")}}}s.current=u.scrollTop})}))))}),tI="SelectGroup",[rI,nI]=bo(tI),iI=x.forwardRef((e,t)=>{const{__scopeSelect:r,...n}=e,i=Yr();return x.createElement(rI,{scope:r,id:i},x.createElement(Ie.div,ge({role:"group","aria-labelledby":i},n,{ref:t})))}),oI="SelectLabel",aI=x.forwardRef((e,t)=>{const{__scopeSelect:r,...n}=e,i=nI(oI,r);return x.createElement(Ie.div,ge({id:i.id},n,{ref:t}))}),a0="SelectItem",[sI,C2]=bo(a0),lI=x.forwardRef((e,t)=>{const{__scopeSelect:r,value:n,disabled:i=!1,textValue:o,...a}=e,s=Ci(a0,r),l=Ai(a0,r),u=s.value===n,[c,f]=x.useState(o??""),[d,h]=x.useState(!1),m=Ve(t,v=>{var w;return(w=l.itemRefCallback)===null||w===void 0?void 0:w.call(l,v,n,i)}),p=Yr(),g=()=>{i||(s.onValueChange(n),s.onOpenChange(!1))};return x.createElement(sI,{scope:r,value:n,disabled:i,textId:p,isSelected:u,onItemTextChange:x.useCallback(v=>{f(w=>{var y;return w||((y=v==null?void 0:v.textContent)!==null&&y!==void 0?y:"").trim()})},[])},x.createElement(ku.ItemSlot,{scope:r,value:n,disabled:i,textValue:c},x.createElement(Ie.div,ge({role:"option","aria-labelledby":p,"data-highlighted":d?"":void 0,"aria-selected":u&&d,"data-state":u?"checked":"unchecked","aria-disabled":i||void 0,"data-disabled":i?"":void 0,tabIndex:i?void 0:-1},a,{ref:m,onFocus:Se(a.onFocus,()=>h(!0)),onBlur:Se(a.onBlur,()=>h(!1)),onPointerUp:Se(a.onPointerUp,g),onPointerMove:Se(a.onPointerMove,v=>{if(i){var w;(w=l.onItemLeave)===null||w===void 0||w.call(l)}else v.currentTarget.focus({preventScroll:!0})}),onPointerLeave:Se(a.onPointerLeave,v=>{if(v.currentTarget===document.activeElement){var w;(w=l.onItemLeave)===null||w===void 0||w.call(l)}}),onKeyDown:Se(a.onKeyDown,v=>{var w;((w=l.searchRef)===null||w===void 0?void 0:w.current)!==""&&v.key===" "||(LP.includes(v.key)&&g(),v.key===" "&&v.preventDefault())})}))))}),Gs="SelectItemText",uI=x.forwardRef((e,t)=>{const{__scopeSelect:r,className:n,style:i,...o}=e,a=Ci(Gs,r),s=Ai(Gs,r),l=C2(Gs,r),u=VP(Gs,r),[c,f]=x.useState(null),d=Ve(t,v=>f(v),l.onItemTextChange,v=>{var w;return(w=s.itemTextRefCallback)===null||w===void 0?void 0:w.call(s,v,l.value,l.disabled)}),h=c==null?void 0:c.textContent,m=x.useMemo(()=>x.createElement("option",{key:l.value,value:l.value,disabled:l.disabled},h),[l.disabled,l.value,h]),{onNativeOptionAdd:p,onNativeOptionRemove:g}=u;return Bt(()=>(p(m),()=>g(m)),[p,g,m]),x.createElement(x.Fragment,null,x.createElement(Ie.span,ge({id:l.textId},o,{ref:d})),l.isSelected&&a.valueNode&&!a.valueNodeHasChildren?mi.createPortal(o.children,a.valueNode):null)}),cI="SelectItemIndicator",fI=x.forwardRef((e,t)=>{const{__scopeSelect:r,...n}=e;return C2(cI,r).isSelected?x.createElement(Ie.span,ge({"aria-hidden":!0},n,{ref:t})):null}),f1="SelectScrollUpButton",dI=x.forwardRef((e,t)=>{const r=Ai(f1,e.__scopeSelect),n=ih(f1,e.__scopeSelect),[i,o]=x.useState(!1),a=Ve(t,n.onScrollButtonChange);return Bt(()=>{if(r.viewport&&r.isPositioned){let u=function(){const c=l.scrollTop>0;o(c)};var s=u;const l=r.viewport;return u(),l.addEventListener("scroll",u),()=>l.removeEventListener("scroll",u)}},[r.viewport,r.isPositioned]),i?x.createElement(A2,ge({},e,{ref:a,onAutoScroll:()=>{const{viewport:s,selectedItem:l}=r;s&&l&&(s.scrollTop=s.scrollTop-l.offsetHeight)}})):null}),d1="SelectScrollDownButton",hI=x.forwardRef((e,t)=>{const r=Ai(d1,e.__scopeSelect),n=ih(d1,e.__scopeSelect),[i,o]=x.useState(!1),a=Ve(t,n.onScrollButtonChange);return Bt(()=>{if(r.viewport&&r.isPositioned){let u=function(){const c=l.scrollHeight-l.clientHeight,f=Math.ceil(l.scrollTop)l.removeEventListener("scroll",u)}},[r.viewport,r.isPositioned]),i?x.createElement(A2,ge({},e,{ref:a,onAutoScroll:()=>{const{viewport:s,selectedItem:l}=r;s&&l&&(s.scrollTop=s.scrollTop+l.offsetHeight)}})):null}),A2=x.forwardRef((e,t)=>{const{__scopeSelect:r,onAutoScroll:n,...i}=e,o=Ai("SelectScrollButton",r),a=x.useRef(null),s=$u(r),l=x.useCallback(()=>{a.current!==null&&(window.clearInterval(a.current),a.current=null)},[]);return x.useEffect(()=>()=>l(),[l]),Bt(()=>{var u;const c=s().find(f=>f.ref.current===document.activeElement);c==null||(u=c.ref.current)===null||u===void 0||u.scrollIntoView({block:"nearest"})},[s]),x.createElement(Ie.div,ge({"aria-hidden":!0},i,{ref:t,style:{flexShrink:0,...i.style},onPointerDown:Se(i.onPointerDown,()=>{a.current===null&&(a.current=window.setInterval(n,50))}),onPointerMove:Se(i.onPointerMove,()=>{var u;(u=o.onItemLeave)===null||u===void 0||u.call(o),a.current===null&&(a.current=window.setInterval(n,50))}),onPointerLeave:Se(i.onPointerLeave,()=>{l()})}))}),R2=x.forwardRef((e,t)=>{const{value:r,...n}=e,i=x.useRef(null),o=Ve(t,i),a=NP(r);return x.useEffect(()=>{const s=i.current,l=window.HTMLSelectElement.prototype,c=Object.getOwnPropertyDescriptor(l,"value").set;if(a!==r&&c){const f=new Event("change",{bubbles:!0});c.call(s,r),s.dispatchEvent(f)}},[a,r]),x.createElement(rh,{asChild:!0},x.createElement("select",ge({},n,{ref:o,defaultValue:r})))});R2.displayName="BubbleSelect";function O2(e){const t=It(e),r=x.useRef(""),n=x.useRef(0),i=x.useCallback(a=>{const s=r.current+a;t(s),function l(u){r.current=u,window.clearTimeout(n.current),u!==""&&(n.current=window.setTimeout(()=>l(""),1e3))}(s)},[t]),o=x.useCallback(()=>{r.current="",window.clearTimeout(n.current)},[]);return x.useEffect(()=>()=>window.clearTimeout(n.current),[]),[r,i,o]}function F2(e,t,r){const i=t.length>1&&Array.from(t).every(u=>u===t[0])?t[0]:t,o=r?e.indexOf(r):-1;let a=pI(e,Math.max(o,0));i.length===1&&(a=a.filter(u=>u!==r));const l=a.find(u=>u.textValue.toLowerCase().startsWith(i.toLowerCase()));return l!==r?l:void 0}function pI(e,t){return e.map((r,n)=>e[(t+n)%e.length])}const gI=WP,mI=GP,vI=XP,xI=KP,wI=YP,yI=qP,EI=eI,Vc=iI,h1=aI,SI=lI,_I=uI,TI=fI,CI=dI,AI=hI;function oh(e,t){if(e==null)return{};var r={},n=Object.keys(e),i,o;for(o=0;o=0)&&(r[i]=e[i]);return r}var RI=["color"],OI=x.forwardRef(function(e,t){var r=e.color,n=r===void 0?"currentColor":r,i=oh(e,RI);return x.createElement("svg",Object.assign({width:"15",height:"15",viewBox:"0 0 15 15",fill:"none",xmlns:"http://www.w3.org/2000/svg"},i,{ref:t}),x.createElement("path",{d:"M11.4669 3.72684C11.7558 3.91574 11.8369 4.30308 11.648 4.59198L7.39799 11.092C7.29783 11.2452 7.13556 11.3467 6.95402 11.3699C6.77247 11.3931 6.58989 11.3355 6.45446 11.2124L3.70446 8.71241C3.44905 8.48022 3.43023 8.08494 3.66242 7.82953C3.89461 7.57412 4.28989 7.55529 4.5453 7.78749L6.75292 9.79441L10.6018 3.90792C10.7907 3.61902 11.178 3.53795 11.4669 3.72684Z",fill:n,fillRule:"evenodd",clipRule:"evenodd"}))}),FI=["color"],s0=x.forwardRef(function(e,t){var r=e.color,n=r===void 0?"currentColor":r,i=oh(e,FI);return x.createElement("svg",Object.assign({width:"15",height:"15",viewBox:"0 0 15 15",fill:"none",xmlns:"http://www.w3.org/2000/svg"},i,{ref:t}),x.createElement("path",{d:"M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z",fill:n,fillRule:"evenodd",clipRule:"evenodd"}))}),DI=["color"],PI=x.forwardRef(function(e,t){var r=e.color,n=r===void 0?"currentColor":r,i=oh(e,DI);return x.createElement("svg",Object.assign({width:"15",height:"15",viewBox:"0 0 15 15",fill:"none",xmlns:"http://www.w3.org/2000/svg"},i,{ref:t}),x.createElement("path",{d:"M3.13523 8.84197C3.3241 9.04343 3.64052 9.05363 3.84197 8.86477L7.5 5.43536L11.158 8.86477C11.3595 9.05363 11.6759 9.04343 11.8648 8.84197C12.0536 8.64051 12.0434 8.32409 11.842 8.13523L7.84197 4.38523C7.64964 4.20492 7.35036 4.20492 7.15803 4.38523L3.15803 8.13523C2.95657 8.32409 2.94637 8.64051 3.13523 8.84197Z",fill:n,fillRule:"evenodd",clipRule:"evenodd"}))});const Yi=({value:e,onChange:t,label:r="Select",placeholder:n="Select a fruit…",groups:i,labelType:o="col"})=>{const a=(i==null?void 0:i.length)===1;return Ce(gI,{value:e,onValueChange:t,children:[Ce(Vc,{className:Nt("flex gap-1",{"flex-row items-center gap-2":o==="row","flex-col":o==="col"}),children:[X(h1,{className:"whitespace-nowrap",children:r}),Ce(mI,{className:"justify-between bg-white text-black dark:text-white dark:bg-grey-900 whitespace-nowrap h-[36px] border-[1.5px] border-grey-700 rounded p-3 inline-flex items-center leading-none gap-[5px] shadow-[0_2px_10px] shadow-black/10 focus:shadow-[0_0_0_2px] focus:shadow-black data-[placeholder]:text-white outline-none","aria-label":r,children:[X(vI,{placeholder:n}),X(xI,{children:X(s0,{})})]})]}),X(wI,{children:Ce(yI,{className:"z-50 bg-white/80 dark:bg-grey-900/80 backdrop-filter backdrop-blur overflow-hidden border-[1.5px] border-grey-700 rounded p-3 shadow-[0px_10px_38px_-10px_rgba(22,_23,_24,_0.35),0px_10px_20px_-15px_rgba(22,_23,_24,_0.2)]",children:[X(CI,{className:"flex items-center justify-center h-[25px] cursor-default dark:text-white text-black",children:X(PI,{})}),X(EI,{className:"p-[5px]",children:a?X(Vc,{children:i[0].items.map(s=>X(p1,{value:s.value,disabled:s.disabled,children:s.label}))}):i.map((s,l)=>Ce(Vc,{children:[X(h1,{className:"text-xs leading-[25px]",children:s.label}),s.items.map(u=>X(p1,{value:u.value,disabled:u.disabled,children:u.label},u.value))]},s.label))}),X(AI,{className:"flex items-center justify-center h-[25px] cursor-default dark:text-white text-black",children:X(s0,{})})]})})]})},p1=x.forwardRef(({children:e,className:t,...r},n)=>Ce(SI,{className:Nt("text-[13px] leading-none rounded-[3px] flex items-center h-[25px] pr-[35px] pl-[25px] relative select-none data-[disabled]:text-grey-400 data-[disabled]:pointer-events-none data-[highlighted]:outline-none data-[highlighted]:bg-grey-600 data-[highlighted]:text-white text-black dark:text-white",t),...r,ref:n,children:[X(_I,{children:e}),X(TI,{className:"absolute left-0 w-[25px] inline-flex items-center justify-center",children:X(OI,{})})]})),D2="ToastProvider",[ah,II,bI]=Fu("Toast"),[P2,i$]=ln("Toast",[bI]),[kI,Nu]=P2(D2),I2=e=>{const{__scopeToast:t,label:r="Notification",duration:n=5e3,swipeDirection:i="right",swipeThreshold:o=50,children:a}=e,[s,l]=x.useState(null),[u,c]=x.useState(0),f=x.useRef(!1),d=x.useRef(!1);return x.createElement(ah.Provider,{scope:t},x.createElement(kI,{scope:t,label:r,duration:n,swipeDirection:i,swipeThreshold:o,toastCount:u,viewport:s,onViewportChange:l,onToastAdd:x.useCallback(()=>c(h=>h+1),[]),onToastRemove:x.useCallback(()=>c(h=>h-1),[]),isFocusedToastEscapeKeyDownRef:f,isClosePausedRef:d},a))};I2.propTypes={label(e){if(e.label&&typeof e.label=="string"&&!e.label.trim()){const t=`Invalid prop \`label\` supplied to \`${D2}\`. Expected non-empty \`string\`.`;return new Error(t)}return null}};const $I="ToastViewport",NI=["F8"],l0="toast.viewportPause",u0="toast.viewportResume",MI=x.forwardRef((e,t)=>{const{__scopeToast:r,hotkey:n=NI,label:i="Notifications ({hotkey})",...o}=e,a=Nu($I,r),s=II(r),l=x.useRef(null),u=x.useRef(null),c=x.useRef(null),f=x.useRef(null),d=Ve(t,f,a.onViewportChange),h=n.join("+").replace(/Key/g,"").replace(/Digit/g,""),m=a.toastCount>0;x.useEffect(()=>{const g=v=>{var w;n.every(E=>v[E]||v.code===E)&&((w=f.current)===null||w===void 0||w.focus())};return document.addEventListener("keydown",g),()=>document.removeEventListener("keydown",g)},[n]),x.useEffect(()=>{const g=l.current,v=f.current;if(m&&g&&v){const w=()=>{if(!a.isClosePausedRef.current){const k=new CustomEvent(l0);v.dispatchEvent(k),a.isClosePausedRef.current=!0}},y=()=>{if(a.isClosePausedRef.current){const k=new CustomEvent(u0);v.dispatchEvent(k),a.isClosePausedRef.current=!1}},E=k=>{!g.contains(k.relatedTarget)&&y()},b=()=>{g.contains(document.activeElement)||y()};return g.addEventListener("focusin",w),g.addEventListener("focusout",E),g.addEventListener("pointermove",w),g.addEventListener("pointerleave",b),window.addEventListener("blur",w),window.addEventListener("focus",y),()=>{g.removeEventListener("focusin",w),g.removeEventListener("focusout",E),g.removeEventListener("pointermove",w),g.removeEventListener("pointerleave",b),window.removeEventListener("blur",w),window.removeEventListener("focus",y)}}},[m,a.isClosePausedRef]);const p=x.useCallback(({tabbingDirection:g})=>{const w=s().map(y=>{const E=y.ref.current,b=[E,...e5(E)];return g==="forwards"?b:b.reverse()});return(g==="forwards"?w.reverse():w).flat()},[s]);return x.useEffect(()=>{const g=f.current;if(g){const v=w=>{const y=w.altKey||w.ctrlKey||w.metaKey;if(w.key==="Tab"&&!y){const C=document.activeElement,A=w.shiftKey;if(w.target===g&&A){var b;(b=u.current)===null||b===void 0||b.focus();return}const U=p({tabbingDirection:A?"backwards":"forwards"}),H=U.findIndex(G=>G===C);if(Wc(U.slice(H+1)))w.preventDefault();else{var k,_;A?(k=u.current)===null||k===void 0||k.focus():(_=c.current)===null||_===void 0||_.focus()}}};return g.addEventListener("keydown",v),()=>g.removeEventListener("keydown",v)}},[s,p]),x.createElement(s_,{ref:l,role:"region","aria-label":i.replace("{hotkey}",h),tabIndex:-1,style:{pointerEvents:m?void 0:"none"}},m&&x.createElement(g1,{ref:u,onFocusFromOutsideViewport:()=>{const g=p({tabbingDirection:"forwards"});Wc(g)}}),x.createElement(ah.Slot,{scope:r},x.createElement(Ie.ol,ge({tabIndex:-1},o,{ref:d}))),m&&x.createElement(g1,{ref:c,onFocusFromOutsideViewport:()=>{const g=p({tabbingDirection:"backwards"});Wc(g)}}))}),LI="ToastFocusProxy",g1=x.forwardRef((e,t)=>{const{__scopeToast:r,onFocusFromOutsideViewport:n,...i}=e,o=Nu(LI,r);return x.createElement(rh,ge({"aria-hidden":!0,tabIndex:0},i,{ref:t,style:{position:"fixed"},onFocus:a=>{var s;const l=a.relatedTarget;!((s=o.viewport)!==null&&s!==void 0&&s.contains(l))&&n()}}))}),Mu="Toast",BI="toast.swipeStart",UI="toast.swipeMove",HI="toast.swipeCancel",VI="toast.swipeEnd",WI=x.forwardRef((e,t)=>{const{forceMount:r,open:n,defaultOpen:i,onOpenChange:o,...a}=e,[s=!0,l]=vo({prop:n,defaultProp:i,onChange:o});return x.createElement(vi,{present:r||s},x.createElement(b2,ge({open:s},a,{ref:t,onClose:()=>l(!1),onPause:It(e.onPause),onResume:It(e.onResume),onSwipeStart:Se(e.onSwipeStart,u=>{u.currentTarget.setAttribute("data-swipe","start")}),onSwipeMove:Se(e.onSwipeMove,u=>{const{x:c,y:f}=u.detail.delta;u.currentTarget.setAttribute("data-swipe","move"),u.currentTarget.style.setProperty("--radix-toast-swipe-move-x",`${c}px`),u.currentTarget.style.setProperty("--radix-toast-swipe-move-y",`${f}px`)}),onSwipeCancel:Se(e.onSwipeCancel,u=>{u.currentTarget.setAttribute("data-swipe","cancel"),u.currentTarget.style.removeProperty("--radix-toast-swipe-move-x"),u.currentTarget.style.removeProperty("--radix-toast-swipe-move-y"),u.currentTarget.style.removeProperty("--radix-toast-swipe-end-x"),u.currentTarget.style.removeProperty("--radix-toast-swipe-end-y")}),onSwipeEnd:Se(e.onSwipeEnd,u=>{const{x:c,y:f}=u.detail.delta;u.currentTarget.setAttribute("data-swipe","end"),u.currentTarget.style.removeProperty("--radix-toast-swipe-move-x"),u.currentTarget.style.removeProperty("--radix-toast-swipe-move-y"),u.currentTarget.style.setProperty("--radix-toast-swipe-end-x",`${c}px`),u.currentTarget.style.setProperty("--radix-toast-swipe-end-y",`${f}px`),l(!1)})})))}),[zI,GI]=P2(Mu,{onClose(){}}),b2=x.forwardRef((e,t)=>{const{__scopeToast:r,type:n="foreground",duration:i,open:o,onClose:a,onEscapeKeyDown:s,onPause:l,onResume:u,onSwipeStart:c,onSwipeMove:f,onSwipeCancel:d,onSwipeEnd:h,...m}=e,p=Nu(Mu,r),[g,v]=x.useState(null),w=Ve(t,G=>v(G)),y=x.useRef(null),E=x.useRef(null),b=i||p.duration,k=x.useRef(0),_=x.useRef(b),C=x.useRef(0),{onToastAdd:A,onToastRemove:L}=p,B=It(()=>{var G;(g==null?void 0:g.contains(document.activeElement))&&((G=p.viewport)===null||G===void 0||G.focus()),a()}),U=x.useCallback(G=>{!G||G===1/0||(window.clearTimeout(C.current),k.current=new Date().getTime(),C.current=window.setTimeout(B,G))},[B]);x.useEffect(()=>{const G=p.viewport;if(G){const ee=()=>{U(_.current),u==null||u()},ae=()=>{const he=new Date().getTime()-k.current;_.current=_.current-he,window.clearTimeout(C.current),l==null||l()};return G.addEventListener(l0,ae),G.addEventListener(u0,ee),()=>{G.removeEventListener(l0,ae),G.removeEventListener(u0,ee)}}},[p.viewport,b,l,u,U]),x.useEffect(()=>{o&&!p.isClosePausedRef.current&&U(b)},[o,b,p.isClosePausedRef,U]),x.useEffect(()=>(A(),()=>L()),[A,L]);const H=x.useMemo(()=>g?N2(g):null,[g]);return p.viewport?x.createElement(x.Fragment,null,H&&x.createElement(jI,{__scopeToast:r,role:"status","aria-live":n==="foreground"?"assertive":"polite","aria-atomic":!0},H),x.createElement(zI,{scope:r,onClose:B},mi.createPortal(x.createElement(ah.ItemSlot,{scope:r},x.createElement(a_,{asChild:!0,onEscapeKeyDown:Se(s,()=>{p.isFocusedToastEscapeKeyDownRef.current||B(),p.isFocusedToastEscapeKeyDownRef.current=!1})},x.createElement(Ie.li,ge({role:"status","aria-live":"off","aria-atomic":!0,tabIndex:0,"data-state":o?"open":"closed","data-swipe-direction":p.swipeDirection},m,{ref:w,style:{userSelect:"none",touchAction:"none",...e.style},onKeyDown:Se(e.onKeyDown,G=>{G.key==="Escape"&&(s==null||s(G.nativeEvent),G.nativeEvent.defaultPrevented||(p.isFocusedToastEscapeKeyDownRef.current=!0,B()))}),onPointerDown:Se(e.onPointerDown,G=>{G.button===0&&(y.current={x:G.clientX,y:G.clientY})}),onPointerMove:Se(e.onPointerMove,G=>{if(!y.current)return;const ee=G.clientX-y.current.x,ae=G.clientY-y.current.y,he=!!E.current,Te=["left","right"].includes(p.swipeDirection),oe=["left","up"].includes(p.swipeDirection)?Math.min:Math.max,ye=Te?oe(0,ee):0,te=Te?0:oe(0,ae),O=G.pointerType==="touch"?10:2,M={x:ye,y:te},N={originalEvent:G,delta:M};he?(E.current=M,js(UI,f,N,{discrete:!1})):m1(M,p.swipeDirection,O)?(E.current=M,js(BI,c,N,{discrete:!1}),G.target.setPointerCapture(G.pointerId)):(Math.abs(ee)>O||Math.abs(ae)>O)&&(y.current=null)}),onPointerUp:Se(e.onPointerUp,G=>{const ee=E.current,ae=G.target;if(ae.hasPointerCapture(G.pointerId)&&ae.releasePointerCapture(G.pointerId),E.current=null,y.current=null,ee){const he=G.currentTarget,Te={originalEvent:G,delta:ee};m1(ee,p.swipeDirection,p.swipeThreshold)?js(VI,h,Te,{discrete:!0}):js(HI,d,Te,{discrete:!0}),he.addEventListener("click",oe=>oe.preventDefault(),{once:!0})}})})))),p.viewport))):null});b2.propTypes={type(e){if(e.type&&!["foreground","background"].includes(e.type)){const t=`Invalid prop \`type\` supplied to \`${Mu}\`. Expected \`foreground | background\`.`;return new Error(t)}return null}};const jI=e=>{const{__scopeToast:t,children:r,...n}=e,i=Nu(Mu,t),[o,a]=x.useState(!1),[s,l]=x.useState(!1);return ZI(()=>a(!0)),x.useEffect(()=>{const u=window.setTimeout(()=>l(!0),1e3);return()=>window.clearTimeout(u)},[]),s?null:x.createElement(xu,{asChild:!0},x.createElement(rh,n,o&&x.createElement(x.Fragment,null,i.label," ",r)))},XI=x.forwardRef((e,t)=>{const{__scopeToast:r,...n}=e;return x.createElement(Ie.div,ge({},n,{ref:t}))}),KI=x.forwardRef((e,t)=>{const{__scopeToast:r,...n}=e;return x.createElement(Ie.div,ge({},n,{ref:t}))}),YI="ToastAction",qI=x.forwardRef((e,t)=>{const{altText:r,...n}=e;return r?x.createElement($2,{altText:r,asChild:!0},x.createElement(k2,ge({},n,{ref:t}))):null});qI.propTypes={altText(e){return e.altText?null:new Error(`Missing prop \`altText\` expected on \`${YI}\``)}};const QI="ToastClose",k2=x.forwardRef((e,t)=>{const{__scopeToast:r,...n}=e,i=GI(QI,r);return x.createElement($2,{asChild:!0},x.createElement(Ie.button,ge({type:"button"},n,{ref:t,onClick:Se(e.onClick,i.onClose)})))}),$2=x.forwardRef((e,t)=>{const{__scopeToast:r,altText:n,...i}=e;return x.createElement(Ie.div,ge({"data-radix-toast-announce-exclude":"","data-radix-toast-announce-alt":n||void 0},i,{ref:t}))});function N2(e){const t=[];return Array.from(e.childNodes).forEach(n=>{if(n.nodeType===n.TEXT_NODE&&n.textContent&&t.push(n.textContent),JI(n)){const i=n.ariaHidden||n.hidden||n.style.display==="none",o=n.dataset.radixToastAnnounceExclude==="";if(!i)if(o){const a=n.dataset.radixToastAnnounceAlt;a&&t.push(a)}else t.push(...N2(n))}}),t}function js(e,t,r,{discrete:n}){const i=r.originalEvent.currentTarget,o=new CustomEvent(e,{bubbles:!0,cancelable:!0,detail:r});t&&i.addEventListener(e,t,{once:!0}),n?wd(i,o):i.dispatchEvent(o)}const m1=(e,t,r=0)=>{const n=Math.abs(e.x),i=Math.abs(e.y),o=n>i;return t==="left"||t==="right"?o&&n>r:!o&&i>r};function ZI(e=()=>{}){const t=It(e);Bt(()=>{let r=0,n=0;return r=window.requestAnimationFrame(()=>n=window.requestAnimationFrame(t)),()=>{window.cancelAnimationFrame(r),window.cancelAnimationFrame(n)}},[t])}function JI(e){return e.nodeType===e.ELEMENT_NODE}function e5(e){const t=[],r=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:n=>{const i=n.tagName==="INPUT"&&n.type==="hidden";return n.disabled||n.hidden||i?NodeFilter.FILTER_SKIP:n.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;r.nextNode();)t.push(r.currentNode);return t}function Wc(e){const t=document.activeElement;return e.some(r=>r===t?!0:(r.focus(),document.activeElement!==t))}const t5=I2,r5=MI,n5=WI,i5=XI,o5=KI,a5=k2,s5=({title:e,titleId:t,...r})=>Ce("svg",{viewBox:"0 0 18 18",width:18,height:18,fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-labelledby":t,...r,children:[e?X("title",{id:t,children:e}):null,X("path",{d:"M9 16.5a7.5 7.5 0 1 0 0-15 7.5 7.5 0 0 0 0 15ZM11.25 6.75l-4.5 4.5M6.75 6.75l4.5 4.5",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round"})]}),l5=({title:e,titleId:t,...r})=>Ce("svg",{viewBox:"0 0 24 24",width:24,height:24,fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-labelledby":t,...r,children:[e?X("title",{id:t,children:e}):null,X("path",{d:"M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2 2 6.477 2 12s4.477 10 10 10ZM12 16v-4M12 8h.01",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round"})]}),u5=({title:e,titleId:t,...r})=>Ce("svg",{width:18,height:18,viewBox:"0 0 18 18",fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-labelledby":t,...r,children:[e?X("title",{id:t,children:e}):null,X("path",{d:"M16.5 8.31V9a7.5 7.5 0 1 1-4.447-6.855",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round"}),X("path",{d:"M16.5 3 9 10.508l-2.25-2.25",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round"})]}),c5=({title:e,titleId:t,...r})=>Ce("svg",{viewBox:"0 0 18 18",width:18,height:18,fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-labelledby":t,...r,children:[e?X("title",{id:t,children:e}):null,X("path",{d:"M7.718 2.895 1.366 13.5a1.5 1.5 0 0 0 1.282 2.25h12.705a1.5 1.5 0 0 0 1.283-2.25L10.283 2.895a1.5 1.5 0 0 0-2.565 0v0ZM9 6.75v3M9 12.75h.008",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round"})]}),f5=({toast:e,open:t,setOpen:r})=>Ce(t5,{children:[Ce(n5,{open:t,onOpenChange:n=>{e.preventClose||r(n)},className:Nt("z-50 fixed bottom-4 md:left-1/2 md:-translate-x-[50%] inset-x-4 w-auto shadow-lg md:max-w-[658px] duration-300","radix-state-open:animate-fade-in","radix-state-closed:animate-toast-hide","radix-swipe-end:animate-toast-swipe-out","translate-x-radix-toast-swipe-move-x","radix-swipe-cancel:translate-x-0 radix-swipe-cancel:duration-200 radix-swipe-cancel:ease-[ease]","px-[40px] md:px-[58px] py-6 flex flex-col border rounded-[4px]",{"bg-green-100 text-green-600 border-green-600":e.status==="success","bg-red-200 text-red-600 border-red-600":e.status==="error","bg-blue-100 text-blue-700 border-blue-600":e.status==="info","bg-orange-200 text-orange-600 border-orange-600":e.status==="warning"},{"h-[72px]":!e.description}),children:[e.status==="success"?X(u5,{className:"absolute left-[8px] md:left-[25px] top-[25px]"}):e.status==="warning"?X(c5,{className:"absolute left-[8px] md:left-[25px] top-[25px]"}):e.status==="error"?X(s5,{className:"absolute left-[8px] md:left-[25px] top-[25px]"}):X(l5,{className:"absolute left-[8px] md:left-[25px] top-[25px]"}),X(i5,{className:"text-grey-900 font-bold text-sm",children:e.title}),e.description&&X(o5,{className:"mt-2 text-[10px] md:text-xs text-grey-800",children:e.description}),X(a5,{className:"absolute top-7 right-5 md:right-7",children:X(Ql,{className:"w-4 h-4 text-grey-900"})})]}),X(r5,{})]}),zc="rovingFocusGroup.onEntryFocus",d5={bubbles:!1,cancelable:!0},sh="RovingFocusGroup",[c0,M2,h5]=Fu(sh),[p5,L2]=ln(sh,[h5]),[g5,m5]=p5(sh),v5=x.forwardRef((e,t)=>x.createElement(c0.Provider,{scope:e.__scopeRovingFocusGroup},x.createElement(c0.Slot,{scope:e.__scopeRovingFocusGroup},x.createElement(x5,ge({},e,{ref:t}))))),x5=x.forwardRef((e,t)=>{const{__scopeRovingFocusGroup:r,orientation:n,loop:i=!1,dir:o,currentTabStopId:a,defaultCurrentTabStopId:s,onCurrentTabStopIdChange:l,onEntryFocus:u,...c}=e,f=x.useRef(null),d=Ve(t,f),h=Zd(o),[m=null,p]=vo({prop:a,defaultProp:s,onChange:l}),[g,v]=x.useState(!1),w=It(u),y=M2(r),E=x.useRef(!1),[b,k]=x.useState(0);return x.useEffect(()=>{const _=f.current;if(_)return _.addEventListener(zc,w),()=>_.removeEventListener(zc,w)},[w]),x.createElement(g5,{scope:r,orientation:n,dir:h,loop:i,currentTabStopId:m,onItemFocus:x.useCallback(_=>p(_),[p]),onItemShiftTab:x.useCallback(()=>v(!0),[]),onFocusableItemAdd:x.useCallback(()=>k(_=>_+1),[]),onFocusableItemRemove:x.useCallback(()=>k(_=>_-1),[])},x.createElement(Ie.div,ge({tabIndex:g||b===0?-1:0,"data-orientation":n},c,{ref:d,style:{outline:"none",...e.style},onMouseDown:Se(e.onMouseDown,()=>{E.current=!0}),onFocus:Se(e.onFocus,_=>{const C=!E.current;if(_.target===_.currentTarget&&C&&!g){const A=new CustomEvent(zc,d5);if(_.currentTarget.dispatchEvent(A),!A.defaultPrevented){const L=y().filter(ee=>ee.focusable),B=L.find(ee=>ee.active),U=L.find(ee=>ee.id===m),G=[B,U,...L].filter(Boolean).map(ee=>ee.ref.current);B2(G)}}E.current=!1}),onBlur:Se(e.onBlur,()=>v(!1))})))}),w5="RovingFocusGroupItem",y5=x.forwardRef((e,t)=>{const{__scopeRovingFocusGroup:r,focusable:n=!0,active:i=!1,tabStopId:o,...a}=e,s=Yr(),l=o||s,u=m5(w5,r),c=u.currentTabStopId===l,f=M2(r),{onFocusableItemAdd:d,onFocusableItemRemove:h}=u;return x.useEffect(()=>{if(n)return d(),()=>h()},[n,d,h]),x.createElement(c0.ItemSlot,{scope:r,id:l,focusable:n,active:i},x.createElement(Ie.span,ge({tabIndex:c?0:-1,"data-orientation":u.orientation},a,{ref:t,onMouseDown:Se(e.onMouseDown,m=>{n?u.onItemFocus(l):m.preventDefault()}),onFocus:Se(e.onFocus,()=>u.onItemFocus(l)),onKeyDown:Se(e.onKeyDown,m=>{if(m.key==="Tab"&&m.shiftKey){u.onItemShiftTab();return}if(m.target!==m.currentTarget)return;const p=_5(m,u.orientation,u.dir);if(p!==void 0){m.preventDefault();let v=f().filter(w=>w.focusable).map(w=>w.ref.current);if(p==="last")v.reverse();else if(p==="prev"||p==="next"){p==="prev"&&v.reverse();const w=v.indexOf(m.currentTarget);v=u.loop?T5(v,w+1):v.slice(w+1)}setTimeout(()=>B2(v))}})})))}),E5={ArrowLeft:"prev",ArrowUp:"prev",ArrowRight:"next",ArrowDown:"next",PageUp:"first",Home:"first",PageDown:"last",End:"last"};function S5(e,t){return t!=="rtl"?e:e==="ArrowLeft"?"ArrowRight":e==="ArrowRight"?"ArrowLeft":e}function _5(e,t,r){const n=S5(e.key,r);if(!(t==="vertical"&&["ArrowLeft","ArrowRight"].includes(n))&&!(t==="horizontal"&&["ArrowUp","ArrowDown"].includes(n)))return E5[n]}function B2(e){const t=document.activeElement;for(const r of e)if(r===t||(r.focus(),document.activeElement!==t))return}function T5(e,t){return e.map((r,n)=>e[(t+n)%e.length])}const C5=v5,A5=y5,R5=["Enter"," "],O5=["ArrowDown","PageUp","Home"],U2=["ArrowUp","PageDown","End"],F5=[...O5,...U2],Lu="Menu",[f0,D5,P5]=Fu(Lu),[Ri,Bu]=ln(Lu,[P5,Iu,L2]),lh=Iu(),H2=L2(),[I5,fs]=Ri(Lu),[b5,uh]=Ri(Lu),k5=e=>{const{__scopeMenu:t,open:r=!1,children:n,dir:i,onOpenChange:o,modal:a=!0}=e,s=lh(t),[l,u]=x.useState(null),c=x.useRef(!1),f=It(o),d=Zd(i);return x.useEffect(()=>{const h=()=>{c.current=!0,document.addEventListener("pointerdown",m,{capture:!0,once:!0}),document.addEventListener("pointermove",m,{capture:!0,once:!0})},m=()=>c.current=!1;return document.addEventListener("keydown",h,{capture:!0}),()=>{document.removeEventListener("keydown",h,{capture:!0}),document.removeEventListener("pointerdown",m,{capture:!0}),document.removeEventListener("pointermove",m,{capture:!0})}},[]),x.createElement(E2,s,x.createElement(I5,{scope:t,open:r,onOpenChange:f,content:l,onContentChange:u},x.createElement(b5,{scope:t,onClose:x.useCallback(()=>f(!1),[f]),isUsingKeyboardRef:c,dir:d,modal:a},n)))},$5=x.forwardRef((e,t)=>{const{__scopeMenu:r,...n}=e,i=lh(r);return x.createElement(S2,ge({},i,n,{ref:t}))}),V2="MenuPortal",[N5,M5]=Ri(V2,{forceMount:void 0}),L5=e=>{const{__scopeMenu:t,forceMount:r,children:n,container:i}=e,o=fs(V2,t);return x.createElement(N5,{scope:t,forceMount:r},x.createElement(vi,{present:r||o.open},x.createElement(xu,{asChild:!0,container:i},n)))},Fn="MenuContent",[B5,W2]=Ri(Fn),U5=x.forwardRef((e,t)=>{const r=M5(Fn,e.__scopeMenu),{forceMount:n=r.forceMount,...i}=e,o=fs(Fn,e.__scopeMenu),a=uh(Fn,e.__scopeMenu);return x.createElement(f0.Provider,{scope:e.__scopeMenu},x.createElement(vi,{present:n||o.open},x.createElement(f0.Slot,{scope:e.__scopeMenu},a.modal?x.createElement(H5,ge({},i,{ref:t})):x.createElement(V5,ge({},i,{ref:t})))))}),H5=x.forwardRef((e,t)=>{const r=fs(Fn,e.__scopeMenu),n=x.useRef(null),i=Ve(t,n);return x.useEffect(()=>{const o=n.current;if(o)return _d(o)},[]),x.createElement(z2,ge({},e,{ref:i,trapFocus:r.open,disableOutsidePointerEvents:r.open,disableOutsideScroll:!0,onFocusOutside:Se(e.onFocusOutside,o=>o.preventDefault(),{checkForDefaultPrevented:!1}),onDismiss:()=>r.onOpenChange(!1)}))}),V5=x.forwardRef((e,t)=>{const r=fs(Fn,e.__scopeMenu);return x.createElement(z2,ge({},e,{ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,disableOutsideScroll:!1,onDismiss:()=>r.onOpenChange(!1)}))}),z2=x.forwardRef((e,t)=>{const{__scopeMenu:r,loop:n=!1,trapFocus:i,onOpenAutoFocus:o,onCloseAutoFocus:a,disableOutsidePointerEvents:s,onEntryFocus:l,onEscapeKeyDown:u,onPointerDownOutside:c,onFocusOutside:f,onInteractOutside:d,onDismiss:h,disableOutsideScroll:m,...p}=e,g=fs(Fn,r),v=uh(Fn,r),w=lh(r),y=H2(r),E=D5(r),[b,k]=x.useState(null),_=x.useRef(null),C=Ve(t,_,g.onContentChange),A=x.useRef(0),L=x.useRef(""),B=x.useRef(0),U=x.useRef(null),H=x.useRef("right"),G=x.useRef(0),ee=m?Sd:x.Fragment,ae=m?{as:ai,allowPinchZoom:!0}:void 0,he=oe=>{var ye,te;const O=L.current+oe,M=E().filter(W=>!W.disabled),N=document.activeElement,F=(ye=M.find(W=>W.ref.current===N))===null||ye===void 0?void 0:ye.textValue,V=M.map(W=>W.textValue),Y=J5(V,O,F),J=(te=M.find(W=>W.textValue===Y))===null||te===void 0?void 0:te.ref.current;(function W(Q){L.current=Q,window.clearTimeout(A.current),Q!==""&&(A.current=window.setTimeout(()=>W(""),1e3))})(O),J&&setTimeout(()=>J.focus())};x.useEffect(()=>()=>window.clearTimeout(A.current),[]),Ed();const Te=x.useCallback(oe=>{var ye,te;return H.current===((ye=U.current)===null||ye===void 0?void 0:ye.side)&&tb(oe,(te=U.current)===null||te===void 0?void 0:te.area)},[]);return x.createElement(B5,{scope:r,searchRef:L,onItemEnter:x.useCallback(oe=>{Te(oe)&&oe.preventDefault()},[Te]),onItemLeave:x.useCallback(oe=>{var ye;Te(oe)||((ye=_.current)===null||ye===void 0||ye.focus(),k(null))},[Te]),onTriggerLeave:x.useCallback(oe=>{Te(oe)&&oe.preventDefault()},[Te]),pointerGraceTimerRef:B,onPointerGraceIntentChange:x.useCallback(oe=>{U.current=oe},[])},x.createElement(ee,ae,x.createElement(yd,{asChild:!0,trapped:i,onMountAutoFocus:Se(o,oe=>{var ye;oe.preventDefault(),(ye=_.current)===null||ye===void 0||ye.focus()}),onUnmountAutoFocus:a},x.createElement(vu,{asChild:!0,disableOutsidePointerEvents:s,onEscapeKeyDown:u,onPointerDownOutside:c,onFocusOutside:f,onInteractOutside:d,onDismiss:h},x.createElement(C5,ge({asChild:!0},y,{dir:v.dir,orientation:"vertical",loop:n,currentTabStopId:b,onCurrentTabStopIdChange:k,onEntryFocus:Se(l,oe=>{v.isUsingKeyboardRef.current||oe.preventDefault()})}),x.createElement(_2,ge({role:"menu","aria-orientation":"vertical","data-state":q5(g.open),"data-radix-menu-content":"",dir:v.dir},w,p,{ref:C,style:{outline:"none",...p.style},onKeyDown:Se(p.onKeyDown,oe=>{const te=oe.target.closest("[data-radix-menu-content]")===oe.currentTarget,O=oe.ctrlKey||oe.altKey||oe.metaKey,M=oe.key.length===1;te&&(oe.key==="Tab"&&oe.preventDefault(),!O&&M&&he(oe.key));const N=_.current;if(oe.target!==N||!F5.includes(oe.key))return;oe.preventDefault();const V=E().filter(Y=>!Y.disabled).map(Y=>Y.ref.current);U2.includes(oe.key)&&V.reverse(),Q5(V)}),onBlur:Se(e.onBlur,oe=>{oe.currentTarget.contains(oe.target)||(window.clearTimeout(A.current),L.current="")}),onPointerMove:Se(e.onPointerMove,h0(oe=>{const ye=oe.target,te=G.current!==oe.clientX;if(oe.currentTarget.contains(ye)&&te){const O=oe.clientX>G.current?"right":"left";H.current=O,G.current=oe.clientX}}))})))))))}),W5=x.forwardRef((e,t)=>{const{__scopeMenu:r,...n}=e;return x.createElement(Ie.div,ge({role:"group"},n,{ref:t}))}),z5=x.forwardRef((e,t)=>{const{__scopeMenu:r,...n}=e;return x.createElement(Ie.div,ge({},n,{ref:t}))}),d0="MenuItem",v1="menu.itemSelect",G5=x.forwardRef((e,t)=>{const{disabled:r=!1,onSelect:n,...i}=e,o=x.useRef(null),a=uh(d0,e.__scopeMenu),s=W2(d0,e.__scopeMenu),l=Ve(t,o),u=x.useRef(!1),c=()=>{const f=o.current;if(!r&&f){const d=new CustomEvent(v1,{bubbles:!0,cancelable:!0});f.addEventListener(v1,h=>n==null?void 0:n(h),{once:!0}),wd(f,d),d.defaultPrevented?u.current=!1:a.onClose()}};return x.createElement(j5,ge({},i,{ref:l,disabled:r,onClick:Se(e.onClick,c),onPointerDown:f=>{var d;(d=e.onPointerDown)===null||d===void 0||d.call(e,f),u.current=!0},onPointerUp:Se(e.onPointerUp,f=>{var d;u.current||(d=f.currentTarget)===null||d===void 0||d.click()}),onKeyDown:Se(e.onKeyDown,f=>{const d=s.searchRef.current!=="";r||d&&f.key===" "||R5.includes(f.key)&&(f.currentTarget.click(),f.preventDefault())})}))}),j5=x.forwardRef((e,t)=>{const{__scopeMenu:r,disabled:n=!1,textValue:i,...o}=e,a=W2(d0,r),s=H2(r),l=x.useRef(null),u=Ve(t,l),[c,f]=x.useState(!1),[d,h]=x.useState("");return x.useEffect(()=>{const m=l.current;if(m){var p;h(((p=m.textContent)!==null&&p!==void 0?p:"").trim())}},[o.children]),x.createElement(f0.ItemSlot,{scope:r,disabled:n,textValue:i??d},x.createElement(A5,ge({asChild:!0},s,{focusable:!n}),x.createElement(Ie.div,ge({role:"menuitem","data-highlighted":c?"":void 0,"aria-disabled":n||void 0,"data-disabled":n?"":void 0},o,{ref:u,onPointerMove:Se(e.onPointerMove,h0(m=>{n?a.onItemLeave(m):(a.onItemEnter(m),m.defaultPrevented||m.currentTarget.focus())})),onPointerLeave:Se(e.onPointerLeave,h0(m=>a.onItemLeave(m))),onFocus:Se(e.onFocus,()=>f(!0)),onBlur:Se(e.onBlur,()=>f(!1))}))))}),X5="MenuRadioGroup";Ri(X5,{value:void 0,onValueChange:()=>{}});const K5="MenuItemIndicator";Ri(K5,{checked:!1});const Y5="MenuSub";Ri(Y5);function q5(e){return e?"open":"closed"}function Q5(e){const t=document.activeElement;for(const r of e)if(r===t||(r.focus(),document.activeElement!==t))return}function Z5(e,t){return e.map((r,n)=>e[(t+n)%e.length])}function J5(e,t,r){const i=t.length>1&&Array.from(t).every(u=>u===t[0])?t[0]:t,o=r?e.indexOf(r):-1;let a=Z5(e,Math.max(o,0));i.length===1&&(a=a.filter(u=>u!==r));const l=a.find(u=>u.toLowerCase().startsWith(i.toLowerCase()));return l!==r?l:void 0}function eb(e,t){const{x:r,y:n}=e;let i=!1;for(let o=0,a=t.length-1;on!=c>n&&r<(u-s)*(n-l)/(c-l)+s&&(i=!i)}return i}function tb(e,t){if(!t)return!1;const r={x:e.clientX,y:e.clientY};return eb(r,t)}function h0(e){return t=>t.pointerType==="mouse"?e(t):void 0}const G2=k5,j2=$5,X2=L5,K2=U5,rb=W5,nb=z5,ib=G5,Y2="ContextMenu",[ob,o$]=ln(Y2,[Bu]),Uu=Bu(),[ab,q2]=ob(Y2),sb=e=>{const{__scopeContextMenu:t,children:r,onOpenChange:n,dir:i,modal:o=!0}=e,[a,s]=x.useState(!1),l=Uu(t),u=It(n),c=x.useCallback(f=>{s(f),u(f)},[u]);return x.createElement(ab,{scope:t,open:a,onOpenChange:c,modal:o},x.createElement(G2,ge({},l,{dir:i,open:a,onOpenChange:c,modal:o}),r))},lb="ContextMenuTrigger",ub=x.forwardRef((e,t)=>{const{__scopeContextMenu:r,disabled:n=!1,...i}=e,o=q2(lb,r),a=Uu(r),s=x.useRef({x:0,y:0}),l=x.useRef({getBoundingClientRect:()=>DOMRect.fromRect({width:0,height:0,...s.current})}),u=x.useRef(0),c=x.useCallback(()=>window.clearTimeout(u.current),[]),f=d=>{s.current={x:d.clientX,y:d.clientY},o.onOpenChange(!0)};return x.useEffect(()=>c,[c]),x.useEffect(()=>void(n&&c()),[n,c]),x.createElement(x.Fragment,null,x.createElement(j2,ge({},a,{virtualRef:l})),x.createElement(Ie.span,ge({"data-state":o.open?"open":"closed","data-disabled":n?"":void 0},i,{ref:t,style:{WebkitTouchCallout:"none",...e.style},onContextMenu:n?e.onContextMenu:Se(e.onContextMenu,d=>{c(),f(d),d.preventDefault()}),onPointerDown:n?e.onPointerDown:Se(e.onPointerDown,Xs(d=>{c(),u.current=window.setTimeout(()=>f(d),700)})),onPointerMove:n?e.onPointerMove:Se(e.onPointerMove,Xs(c)),onPointerCancel:n?e.onPointerCancel:Se(e.onPointerCancel,Xs(c)),onPointerUp:n?e.onPointerUp:Se(e.onPointerUp,Xs(c))})))}),cb=e=>{const{__scopeContextMenu:t,...r}=e,n=Uu(t);return x.createElement(X2,ge({},n,r))},fb="ContextMenuContent",db=x.forwardRef((e,t)=>{const{__scopeContextMenu:r,...n}=e,i=q2(fb,r),o=Uu(r),a=x.useRef(!1);return x.createElement(K2,ge({},o,n,{ref:t,side:"right",sideOffset:2,align:"start",onCloseAutoFocus:s=>{var l;(l=e.onCloseAutoFocus)===null||l===void 0||l.call(e,s),!s.defaultPrevented&&a.current&&s.preventDefault(),a.current=!1},onInteractOutside:s=>{var l;(l=e.onInteractOutside)===null||l===void 0||l.call(e,s),!s.defaultPrevented&&!i.modal&&(a.current=!0)},style:{...e.style,"--radix-context-menu-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-context-menu-content-available-width":"var(--radix-popper-available-width)","--radix-context-menu-content-available-height":"var(--radix-popper-available-height)","--radix-context-menu-trigger-width":"var(--radix-popper-anchor-width)","--radix-context-menu-trigger-height":"var(--radix-popper-anchor-height)"}}))});function Xs(e){return t=>t.pointerType!=="mouse"?e(t):void 0}const hb=sb,pb=ub,gb=cb,mb=db,Q2=x.createContext({dragDropManager:void 0});function nr(e){return"Minified Redux error #"+e+"; visit https://redux.js.org/Errors?code="+e+" for the full message or use the non-minified dev environment for full errors. "}var x1=function(){return typeof Symbol=="function"&&Symbol.observable||"@@observable"}(),Gc=function(){return Math.random().toString(36).substring(7).split("").join(".")},w1={INIT:"@@redux/INIT"+Gc(),REPLACE:"@@redux/REPLACE"+Gc(),PROBE_UNKNOWN_ACTION:function(){return"@@redux/PROBE_UNKNOWN_ACTION"+Gc()}};function vb(e){if(typeof e!="object"||e===null)return!1;for(var t=e;Object.getPrototypeOf(t)!==null;)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t}function Z2(e,t,r){var n;if(typeof t=="function"&&typeof r=="function"||typeof r=="function"&&typeof arguments[3]=="function")throw new Error(nr(0));if(typeof t=="function"&&typeof r>"u"&&(r=t,t=void 0),typeof r<"u"){if(typeof r!="function")throw new Error(nr(1));return r(Z2)(e,t)}if(typeof e!="function")throw new Error(nr(2));var i=e,o=t,a=[],s=a,l=!1;function u(){s===a&&(s=a.slice())}function c(){if(l)throw new Error(nr(3));return o}function f(p){if(typeof p!="function")throw new Error(nr(4));if(l)throw new Error(nr(5));var g=!0;return u(),s.push(p),function(){if(g){if(l)throw new Error(nr(6));g=!1,u();var w=s.indexOf(p);s.splice(w,1),a=null}}}function d(p){if(!vb(p))throw new Error(nr(7));if(typeof p.type>"u")throw new Error(nr(8));if(l)throw new Error(nr(9));try{l=!0,o=i(o,p)}finally{l=!1}for(var g=a=s,v=0;vn&&n[i]?n[i]:r||null,e)}function yb(e,t){return e.filter(r=>r!==t)}function J2(e){return typeof e=="object"}function Eb(e,t){const r=new Map,n=o=>{r.set(o,r.has(o)?r.get(o)+1:1)};e.forEach(n),t.forEach(n);const i=[];return r.forEach((o,a)=>{o===1&&i.push(a)}),i}function Sb(e,t){return e.filter(r=>t.indexOf(r)>-1)}const ch="dnd-core/INIT_COORDS",Hu="dnd-core/BEGIN_DRAG",fh="dnd-core/PUBLISH_DRAG_SOURCE",Vu="dnd-core/HOVER",Wu="dnd-core/DROP",zu="dnd-core/END_DRAG";function y1(e,t){return{type:ch,payload:{sourceClientOffset:t||null,clientOffset:e||null}}}const _b={type:ch,payload:{clientOffset:null,sourceClientOffset:null}};function Tb(e){return function(r=[],n={publishSource:!0}){const{publishSource:i=!0,clientOffset:o,getSourceClientOffset:a}=n,s=e.getMonitor(),l=e.getRegistry();e.dispatch(y1(o)),Cb(r,s,l);const u=Ob(r,s);if(u==null){e.dispatch(_b);return}let c=null;if(o){if(!a)throw new Error("getSourceClientOffset must be defined");Ab(a),c=a(u)}e.dispatch(y1(o,c));const d=l.getSource(u).beginDrag(s,u);if(d==null)return;Rb(d),l.pinSource(u);const h=l.getSourceType(u);return{type:Hu,payload:{itemType:h,item:d,sourceId:u,clientOffset:o||null,sourceClientOffset:c||null,isSourcePublic:!!i}}}}function Cb(e,t,r){Fe(!t.isDragging(),"Cannot call beginDrag while dragging."),e.forEach(function(n){Fe(r.getSource(n),"Expected sourceIds to be registered.")})}function Ab(e){Fe(typeof e=="function","When clientOffset is provided, getSourceClientOffset must be a function.")}function Rb(e){Fe(J2(e),"Item must be an object.")}function Ob(e,t){let r=null;for(let n=e.length-1;n>=0;n--)if(t.canDragSource(e[n])){r=e[n];break}return r}function Fb(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function Db(e){for(var t=1;t{const l=bb(a,s,i,n),u={type:Wu,payload:{dropResult:Db({},r,l)}};e.dispatch(u)})}}function Ib(e){Fe(e.isDragging(),"Cannot call drop while not dragging."),Fe(!e.didDrop(),"Cannot call drop twice during one drag operation.")}function bb(e,t,r,n){const i=r.getTarget(e);let o=i?i.drop(n,e):void 0;return kb(o),typeof o>"u"&&(o=t===0?{}:n.getDropResult()),o}function kb(e){Fe(typeof e>"u"||J2(e),"Drop result must either be an object or undefined.")}function $b(e){const t=e.getTargetIds().filter(e.canDropOnTarget,e);return t.reverse(),t}function Nb(e){return function(){const r=e.getMonitor(),n=e.getRegistry();Mb(r);const i=r.getSourceId();return i!=null&&(n.getSource(i,!0).endDrag(r,i),n.unpinSource()),{type:zu}}}function Mb(e){Fe(e.isDragging(),"Cannot call endDrag while not dragging.")}function p0(e,t){return t===null?e===null:Array.isArray(e)?e.some(r=>r===t):e===t}function Lb(e){return function(r,{clientOffset:n}={}){Bb(r);const i=r.slice(0),o=e.getMonitor(),a=e.getRegistry(),s=o.getItemType();return Hb(i,a,s),Ub(i,o,a),Vb(i,o,a),{type:Vu,payload:{targetIds:i,clientOffset:n||null}}}}function Bb(e){Fe(Array.isArray(e),"Expected targetIds to be an array.")}function Ub(e,t,r){Fe(t.isDragging(),"Cannot call hover while not dragging."),Fe(!t.didDrop(),"Cannot call hover after drop.");for(let n=0;n=0;n--){const i=e[n],o=t.getTargetType(i);p0(o,r)||e.splice(n,1)}}function Vb(e,t,r){e.forEach(function(n){r.getTarget(n).hover(t,n)})}function Wb(e){return function(){if(e.getMonitor().isDragging())return{type:fh}}}function zb(e){return{beginDrag:Tb(e),publishDragSource:Wb(e),hover:Lb(e),drop:Pb(e),endDrag:Nb(e)}}class Gb{receiveBackend(t){this.backend=t}getMonitor(){return this.monitor}getBackend(){return this.backend}getRegistry(){return this.monitor.registry}getActions(){const t=this,{dispatch:r}=this.store;function n(o){return(...a)=>{const s=o.apply(t,a);typeof s<"u"&&r(s)}}const i=zb(this);return Object.keys(i).reduce((o,a)=>{const s=i[a];return o[a]=n(s),o},{})}dispatch(t){this.store.dispatch(t)}constructor(t,r){this.isSetUp=!1,this.handleRefCountChange=()=>{const n=this.store.getState().refCount>0;this.backend&&(n&&!this.isSetUp?(this.backend.setup(),this.isSetUp=!0):!n&&this.isSetUp&&(this.backend.teardown(),this.isSetUp=!1))},this.store=t,this.monitor=r,t.subscribe(this.handleRefCountChange)}}function jb(e,t){return{x:e.x+t.x,y:e.y+t.y}}function ey(e,t){return{x:e.x-t.x,y:e.y-t.y}}function Xb(e){const{clientOffset:t,initialClientOffset:r,initialSourceClientOffset:n}=e;return!t||!r||!n?null:ey(jb(t,n),r)}function Kb(e){const{clientOffset:t,initialClientOffset:r}=e;return!t||!r?null:ey(t,r)}const Ca=[],dh=[];Ca.__IS_NONE__=!0;dh.__IS_ALL__=!0;function Yb(e,t){return e===Ca?!1:e===dh||typeof t>"u"?!0:Sb(t,e).length>0}class qb{subscribeToStateChange(t,r={}){const{handlerIds:n}=r;Fe(typeof t=="function","listener must be a function."),Fe(typeof n>"u"||Array.isArray(n),"handlerIds, when specified, must be an array of strings.");let i=this.store.getState().stateId;const o=()=>{const a=this.store.getState(),s=a.stateId;try{s===i||s===i+1&&!Yb(a.dirtyHandlerIds,n)||t()}finally{i=s}};return this.store.subscribe(o)}subscribeToOffsetChange(t){Fe(typeof t=="function","listener must be a function.");let r=this.store.getState().dragOffset;const n=()=>{const i=this.store.getState().dragOffset;i!==r&&(r=i,t())};return this.store.subscribe(n)}canDragSource(t){if(!t)return!1;const r=this.registry.getSource(t);return Fe(r,`Expected to find a valid source. sourceId=${t}`),this.isDragging()?!1:r.canDrag(this,t)}canDropOnTarget(t){if(!t)return!1;const r=this.registry.getTarget(t);if(Fe(r,`Expected to find a valid target. targetId=${t}`),!this.isDragging()||this.didDrop())return!1;const n=this.registry.getTargetType(t),i=this.getItemType();return p0(n,i)&&r.canDrop(this,t)}isDragging(){return!!this.getItemType()}isDraggingSource(t){if(!t)return!1;const r=this.registry.getSource(t,!0);if(Fe(r,`Expected to find a valid source. sourceId=${t}`),!this.isDragging()||!this.isSourcePublic())return!1;const n=this.registry.getSourceType(t),i=this.getItemType();return n!==i?!1:r.isDragging(this,t)}isOverTarget(t,r={shallow:!1}){if(!t)return!1;const{shallow:n}=r;if(!this.isDragging())return!1;const i=this.registry.getTargetType(t),o=this.getItemType();if(o&&!p0(i,o))return!1;const a=this.getTargetIds();if(!a.length)return!1;const s=a.indexOf(t);return n?s===a.length-1:s>-1}getItemType(){return this.store.getState().dragOperation.itemType}getItem(){return this.store.getState().dragOperation.item}getSourceId(){return this.store.getState().dragOperation.sourceId}getTargetIds(){return this.store.getState().dragOperation.targetIds}getDropResult(){return this.store.getState().dragOperation.dropResult}didDrop(){return this.store.getState().dragOperation.didDrop}isSourcePublic(){return!!this.store.getState().dragOperation.isSourcePublic}getInitialClientOffset(){return this.store.getState().dragOffset.initialClientOffset}getInitialSourceClientOffset(){return this.store.getState().dragOffset.initialSourceClientOffset}getClientOffset(){return this.store.getState().dragOffset.clientOffset}getSourceClientOffset(){return Xb(this.store.getState().dragOffset)}getDifferenceFromInitialOffset(){return Kb(this.store.getState().dragOffset)}constructor(t,r){this.store=t,this.registry=r}}const E1=typeof global<"u"?global:self,ty=E1.MutationObserver||E1.WebKitMutationObserver;function ry(e){return function(){const r=setTimeout(i,0),n=setInterval(i,50);function i(){clearTimeout(r),clearInterval(n),e()}}}function Qb(e){let t=1;const r=new ty(e),n=document.createTextNode("");return r.observe(n,{characterData:!0}),function(){t=-t,n.data=t}}const Zb=typeof ty=="function"?Qb:ry;class Jb{enqueueTask(t){const{queue:r,requestFlush:n}=this;r.length||(n(),this.flushing=!0),r[r.length]=t}constructor(){this.queue=[],this.pendingErrors=[],this.flushing=!1,this.index=0,this.capacity=1024,this.flush=()=>{const{queue:t}=this;for(;this.indexthis.capacity){for(let n=0,i=t.length-this.index;n{this.pendingErrors.push(t),this.requestErrorThrow()},this.requestFlush=Zb(this.flush),this.requestErrorThrow=ry(()=>{if(this.pendingErrors.length)throw this.pendingErrors.shift()})}}class e8{call(){try{this.task&&this.task()}catch(t){this.onError(t)}finally{this.task=null,this.release(this)}}constructor(t,r){this.onError=t,this.release=r,this.task=null}}class t8{create(t){const r=this.freeTasks,n=r.length?r.pop():new e8(this.onError,i=>r[r.length]=i);return n.task=t,n}constructor(t){this.onError=t,this.freeTasks=[]}}const ny=new Jb,r8=new t8(ny.registerPendingError);function n8(e){ny.enqueueTask(r8.create(e))}const hh="dnd-core/ADD_SOURCE",ph="dnd-core/ADD_TARGET",gh="dnd-core/REMOVE_SOURCE",Gu="dnd-core/REMOVE_TARGET";function i8(e){return{type:hh,payload:{sourceId:e}}}function o8(e){return{type:ph,payload:{targetId:e}}}function a8(e){return{type:gh,payload:{sourceId:e}}}function s8(e){return{type:Gu,payload:{targetId:e}}}function l8(e){Fe(typeof e.canDrag=="function","Expected canDrag to be a function."),Fe(typeof e.beginDrag=="function","Expected beginDrag to be a function."),Fe(typeof e.endDrag=="function","Expected endDrag to be a function.")}function u8(e){Fe(typeof e.canDrop=="function","Expected canDrop to be a function."),Fe(typeof e.hover=="function","Expected hover to be a function."),Fe(typeof e.drop=="function","Expected beginDrag to be a function.")}function g0(e,t){if(t&&Array.isArray(e)){e.forEach(r=>g0(r,!1));return}Fe(typeof e=="string"||typeof e=="symbol",t?"Type can only be a string, a symbol, or an array of either.":"Type can only be a string or a symbol.")}var sr;(function(e){e.SOURCE="SOURCE",e.TARGET="TARGET"})(sr||(sr={}));let c8=0;function f8(){return c8++}function d8(e){const t=f8().toString();switch(e){case sr.SOURCE:return`S${t}`;case sr.TARGET:return`T${t}`;default:throw new Error(`Unknown Handler Role: ${e}`)}}function S1(e){switch(e[0]){case"S":return sr.SOURCE;case"T":return sr.TARGET;default:throw new Error(`Cannot parse handler ID: ${e}`)}}function _1(e,t){const r=e.entries();let n=!1;do{const{done:i,value:[,o]}=r.next();if(o===t)return!0;n=!!i}while(!n);return!1}class h8{addSource(t,r){g0(t),l8(r);const n=this.addHandler(sr.SOURCE,t,r);return this.store.dispatch(i8(n)),n}addTarget(t,r){g0(t,!0),u8(r);const n=this.addHandler(sr.TARGET,t,r);return this.store.dispatch(o8(n)),n}containsHandler(t){return _1(this.dragSources,t)||_1(this.dropTargets,t)}getSource(t,r=!1){return Fe(this.isSourceId(t),"Expected a valid source ID."),r&&t===this.pinnedSourceId?this.pinnedSource:this.dragSources.get(t)}getTarget(t){return Fe(this.isTargetId(t),"Expected a valid target ID."),this.dropTargets.get(t)}getSourceType(t){return Fe(this.isSourceId(t),"Expected a valid source ID."),this.types.get(t)}getTargetType(t){return Fe(this.isTargetId(t),"Expected a valid target ID."),this.types.get(t)}isSourceId(t){return S1(t)===sr.SOURCE}isTargetId(t){return S1(t)===sr.TARGET}removeSource(t){Fe(this.getSource(t),"Expected an existing source."),this.store.dispatch(a8(t)),n8(()=>{this.dragSources.delete(t),this.types.delete(t)})}removeTarget(t){Fe(this.getTarget(t),"Expected an existing target."),this.store.dispatch(s8(t)),this.dropTargets.delete(t),this.types.delete(t)}pinSource(t){const r=this.getSource(t);Fe(r,"Expected an existing source."),this.pinnedSourceId=t,this.pinnedSource=r}unpinSource(){Fe(this.pinnedSource,"No source is pinned at the time."),this.pinnedSourceId=null,this.pinnedSource=null}addHandler(t,r,n){const i=d8(t);return this.types.set(i,r),t===sr.SOURCE?this.dragSources.set(i,n):t===sr.TARGET&&this.dropTargets.set(i,n),i}constructor(t){this.types=new Map,this.dragSources=new Map,this.dropTargets=new Map,this.pinnedSourceId=null,this.pinnedSource=null,this.store=t}}const p8=(e,t)=>e===t;function g8(e,t){return!e&&!t?!0:!e||!t?!1:e.x===t.x&&e.y===t.y}function m8(e,t,r=p8){if(e.length!==t.length)return!1;for(let n=0;n0||!m8(r,n)))return Ca;const a=n[n.length-1],s=r[r.length-1];return a!==s&&(a&&i.push(a),s&&i.push(s)),i}function x8(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function w8(e){for(var t=1;t=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}function I8(e,t){if(e==null)return{};var r={},n=Object.keys(e),i,o;for(o=0;o=0)&&(r[i]=e[i]);return r}let C1=0;const cl=Symbol.for("__REACT_DND_CONTEXT_INSTANCE__");var b8=x.memo(function(t){var{children:r}=t,n=P8(t,["children"]);const[i,o]=k8(n);return x.useEffect(()=>{if(o){const a=iy();return++C1,()=>{--C1===0&&(a[cl]=null)}}},[]),X(Q2.Provider,{value:i,children:r})});function k8(e){if("manager"in e)return[{dragDropManager:e.manager},!1];const t=$8(e.backend,e.context,e.options,e.debugMode),r=!e.context;return[t,r]}function $8(e,t=iy(),r,n){const i=t;return i[cl]||(i[cl]={dragDropManager:F8(e,t,r,n)}),i[cl]}function iy(){return typeof global<"u"?global:window}var N8=function e(t,r){if(t===r)return!0;if(t&&r&&typeof t=="object"&&typeof r=="object"){if(t.constructor!==r.constructor)return!1;var n,i,o;if(Array.isArray(t)){if(n=t.length,n!=r.length)return!1;for(i=n;i--!==0;)if(!e(t[i],r[i]))return!1;return!0}if(t.constructor===RegExp)return t.source===r.source&&t.flags===r.flags;if(t.valueOf!==Object.prototype.valueOf)return t.valueOf()===r.valueOf();if(t.toString!==Object.prototype.toString)return t.toString()===r.toString();if(o=Object.keys(t),n=o.length,n!==Object.keys(r).length)return!1;for(i=n;i--!==0;)if(!Object.prototype.hasOwnProperty.call(r,o[i]))return!1;for(i=n;i--!==0;){var a=o[i];if(!e(t[a],r[a]))return!1}return!0}return t!==t&&r!==r};const M8=Qa(N8),fi=typeof window<"u"?x.useLayoutEffect:x.useEffect;function L8(e,t,r){const[n,i]=x.useState(()=>t(e)),o=x.useCallback(()=>{const a=t(e);M8(n,a)||(i(a),r&&r())},[n,e,r]);return fi(o),[n,o]}function B8(e,t,r){const[n,i]=L8(e,t,r);return fi(function(){const a=e.getHandlerId();if(a!=null)return e.subscribeToStateChange(i,{handlerIds:[a]})},[e,i]),n}function oy(e,t,r){return B8(t,e||(()=>({})),()=>r.reconnect())}function ay(e,t){const r=[...t||[]];return t==null&&typeof e!="function"&&r.push(e),x.useMemo(()=>typeof e=="function"?e():e,r)}function U8(e){return x.useMemo(()=>e.hooks.dragSource(),[e])}function H8(e){return x.useMemo(()=>e.hooks.dragPreview(),[e])}let jc=!1,Xc=!1;class V8{receiveHandlerId(t){this.sourceId=t}getHandlerId(){return this.sourceId}canDrag(){Fe(!jc,"You may not call monitor.canDrag() inside your canDrag() implementation. Read more: http://react-dnd.github.io/react-dnd/docs/api/drag-source-monitor");try{return jc=!0,this.internalMonitor.canDragSource(this.sourceId)}finally{jc=!1}}isDragging(){if(!this.sourceId)return!1;Fe(!Xc,"You may not call monitor.isDragging() inside your isDragging() implementation. Read more: http://react-dnd.github.io/react-dnd/docs/api/drag-source-monitor");try{return Xc=!0,this.internalMonitor.isDraggingSource(this.sourceId)}finally{Xc=!1}}subscribeToStateChange(t,r){return this.internalMonitor.subscribeToStateChange(t,r)}isDraggingSource(t){return this.internalMonitor.isDraggingSource(t)}isOverTarget(t,r){return this.internalMonitor.isOverTarget(t,r)}getTargetIds(){return this.internalMonitor.getTargetIds()}isSourcePublic(){return this.internalMonitor.isSourcePublic()}getSourceId(){return this.internalMonitor.getSourceId()}subscribeToOffsetChange(t){return this.internalMonitor.subscribeToOffsetChange(t)}canDragSource(t){return this.internalMonitor.canDragSource(t)}canDropOnTarget(t){return this.internalMonitor.canDropOnTarget(t)}getItemType(){return this.internalMonitor.getItemType()}getItem(){return this.internalMonitor.getItem()}getDropResult(){return this.internalMonitor.getDropResult()}didDrop(){return this.internalMonitor.didDrop()}getInitialClientOffset(){return this.internalMonitor.getInitialClientOffset()}getInitialSourceClientOffset(){return this.internalMonitor.getInitialSourceClientOffset()}getSourceClientOffset(){return this.internalMonitor.getSourceClientOffset()}getClientOffset(){return this.internalMonitor.getClientOffset()}getDifferenceFromInitialOffset(){return this.internalMonitor.getDifferenceFromInitialOffset()}constructor(t){this.sourceId=null,this.internalMonitor=t.getMonitor()}}let Kc=!1;class W8{receiveHandlerId(t){this.targetId=t}getHandlerId(){return this.targetId}subscribeToStateChange(t,r){return this.internalMonitor.subscribeToStateChange(t,r)}canDrop(){if(!this.targetId)return!1;Fe(!Kc,"You may not call monitor.canDrop() inside your canDrop() implementation. Read more: http://react-dnd.github.io/react-dnd/docs/api/drop-target-monitor");try{return Kc=!0,this.internalMonitor.canDropOnTarget(this.targetId)}finally{Kc=!1}}isOver(t){return this.targetId?this.internalMonitor.isOverTarget(this.targetId,t):!1}getItemType(){return this.internalMonitor.getItemType()}getItem(){return this.internalMonitor.getItem()}getDropResult(){return this.internalMonitor.getDropResult()}didDrop(){return this.internalMonitor.didDrop()}getInitialClientOffset(){return this.internalMonitor.getInitialClientOffset()}getInitialSourceClientOffset(){return this.internalMonitor.getInitialSourceClientOffset()}getSourceClientOffset(){return this.internalMonitor.getSourceClientOffset()}getClientOffset(){return this.internalMonitor.getClientOffset()}getDifferenceFromInitialOffset(){return this.internalMonitor.getDifferenceFromInitialOffset()}constructor(t){this.targetId=null,this.internalMonitor=t.getMonitor()}}function z8(e,t,r){const n=r.getRegistry(),i=n.addTarget(e,t);return[i,()=>n.removeTarget(i)]}function G8(e,t,r){const n=r.getRegistry(),i=n.addSource(e,t);return[i,()=>n.removeSource(i)]}function m0(e,t,r,n){let i=r?r.call(n,e,t):void 0;if(i!==void 0)return!!i;if(e===t)return!0;if(typeof e!="object"||!e||typeof t!="object"||!t)return!1;const o=Object.keys(e),a=Object.keys(t);if(o.length!==a.length)return!1;const s=Object.prototype.hasOwnProperty.bind(t);for(let l=0;l, or turn it into a drag source or a drop target itself.`)}function X8(e){return(t=null,r=null)=>{if(!x.isValidElement(t)){const o=t;return e(o,r),o}const n=t;return j8(n),K8(n,r?o=>e(o,r):e)}}function sy(e){const t={};return Object.keys(e).forEach(r=>{const n=e[r];if(r.endsWith("Ref"))t[r]=e[r];else{const i=X8(n);t[r]=()=>i}}),t}function A1(e,t){typeof e=="function"?e(t):e.current=t}function K8(e,t){const r=e.ref;return Fe(typeof r!="string","Cannot connect React DnD to an element with an existing string ref. Please convert it to use a callback ref instead, or wrap it into a or
. Read more: https://reactjs.org/docs/refs-and-the-dom.html#callback-refs"),r?x.cloneElement(e,{ref:n=>{A1(r,n),A1(t,n)}}):x.cloneElement(e,{ref:t})}class Y8{receiveHandlerId(t){this.handlerId!==t&&(this.handlerId=t,this.reconnect())}get connectTarget(){return this.dragSource}get dragSourceOptions(){return this.dragSourceOptionsInternal}set dragSourceOptions(t){this.dragSourceOptionsInternal=t}get dragPreviewOptions(){return this.dragPreviewOptionsInternal}set dragPreviewOptions(t){this.dragPreviewOptionsInternal=t}reconnect(){const t=this.reconnectDragSource();this.reconnectDragPreview(t)}reconnectDragSource(){const t=this.dragSource,r=this.didHandlerIdChange()||this.didConnectedDragSourceChange()||this.didDragSourceOptionsChange();return r&&this.disconnectDragSource(),this.handlerId?t?(r&&(this.lastConnectedHandlerId=this.handlerId,this.lastConnectedDragSource=t,this.lastConnectedDragSourceOptions=this.dragSourceOptions,this.dragSourceUnsubscribe=this.backend.connectDragSource(this.handlerId,t,this.dragSourceOptions)),r):(this.lastConnectedDragSource=t,r):r}reconnectDragPreview(t=!1){const r=this.dragPreview,n=t||this.didHandlerIdChange()||this.didConnectedDragPreviewChange()||this.didDragPreviewOptionsChange();if(n&&this.disconnectDragPreview(),!!this.handlerId){if(!r){this.lastConnectedDragPreview=r;return}n&&(this.lastConnectedHandlerId=this.handlerId,this.lastConnectedDragPreview=r,this.lastConnectedDragPreviewOptions=this.dragPreviewOptions,this.dragPreviewUnsubscribe=this.backend.connectDragPreview(this.handlerId,r,this.dragPreviewOptions))}}didHandlerIdChange(){return this.lastConnectedHandlerId!==this.handlerId}didConnectedDragSourceChange(){return this.lastConnectedDragSource!==this.dragSource}didConnectedDragPreviewChange(){return this.lastConnectedDragPreview!==this.dragPreview}didDragSourceOptionsChange(){return!m0(this.lastConnectedDragSourceOptions,this.dragSourceOptions)}didDragPreviewOptionsChange(){return!m0(this.lastConnectedDragPreviewOptions,this.dragPreviewOptions)}disconnectDragSource(){this.dragSourceUnsubscribe&&(this.dragSourceUnsubscribe(),this.dragSourceUnsubscribe=void 0)}disconnectDragPreview(){this.dragPreviewUnsubscribe&&(this.dragPreviewUnsubscribe(),this.dragPreviewUnsubscribe=void 0,this.dragPreviewNode=null,this.dragPreviewRef=null)}get dragSource(){return this.dragSourceNode||this.dragSourceRef&&this.dragSourceRef.current}get dragPreview(){return this.dragPreviewNode||this.dragPreviewRef&&this.dragPreviewRef.current}clearDragSource(){this.dragSourceNode=null,this.dragSourceRef=null}clearDragPreview(){this.dragPreviewNode=null,this.dragPreviewRef=null}constructor(t){this.hooks=sy({dragSource:(r,n)=>{this.clearDragSource(),this.dragSourceOptions=n||null,v0(r)?this.dragSourceRef=r:this.dragSourceNode=r,this.reconnectDragSource()},dragPreview:(r,n)=>{this.clearDragPreview(),this.dragPreviewOptions=n||null,v0(r)?this.dragPreviewRef=r:this.dragPreviewNode=r,this.reconnectDragPreview()}}),this.handlerId=null,this.dragSourceRef=null,this.dragSourceOptionsInternal=null,this.dragPreviewRef=null,this.dragPreviewOptionsInternal=null,this.lastConnectedHandlerId=null,this.lastConnectedDragSource=null,this.lastConnectedDragSourceOptions=null,this.lastConnectedDragPreview=null,this.lastConnectedDragPreviewOptions=null,this.backend=t}}class q8{get connectTarget(){return this.dropTarget}reconnect(){const t=this.didHandlerIdChange()||this.didDropTargetChange()||this.didOptionsChange();t&&this.disconnectDropTarget();const r=this.dropTarget;if(this.handlerId){if(!r){this.lastConnectedDropTarget=r;return}t&&(this.lastConnectedHandlerId=this.handlerId,this.lastConnectedDropTarget=r,this.lastConnectedDropTargetOptions=this.dropTargetOptions,this.unsubscribeDropTarget=this.backend.connectDropTarget(this.handlerId,r,this.dropTargetOptions))}}receiveHandlerId(t){t!==this.handlerId&&(this.handlerId=t,this.reconnect())}get dropTargetOptions(){return this.dropTargetOptionsInternal}set dropTargetOptions(t){this.dropTargetOptionsInternal=t}didHandlerIdChange(){return this.lastConnectedHandlerId!==this.handlerId}didDropTargetChange(){return this.lastConnectedDropTarget!==this.dropTarget}didOptionsChange(){return!m0(this.lastConnectedDropTargetOptions,this.dropTargetOptions)}disconnectDropTarget(){this.unsubscribeDropTarget&&(this.unsubscribeDropTarget(),this.unsubscribeDropTarget=void 0)}get dropTarget(){return this.dropTargetNode||this.dropTargetRef&&this.dropTargetRef.current}clearDropTarget(){this.dropTargetRef=null,this.dropTargetNode=null}constructor(t){this.hooks=sy({dropTarget:(r,n)=>{this.clearDropTarget(),this.dropTargetOptions=n,v0(r)?this.dropTargetRef=r:this.dropTargetNode=r,this.reconnect()}}),this.handlerId=null,this.dropTargetRef=null,this.dropTargetOptionsInternal=null,this.lastConnectedHandlerId=null,this.lastConnectedDropTarget=null,this.lastConnectedDropTargetOptions=null,this.backend=t}}function ko(){const{dragDropManager:e}=x.useContext(Q2);return Fe(e!=null,"Expected drag drop context"),e}function Q8(e,t){const r=ko(),n=x.useMemo(()=>new Y8(r.getBackend()),[r]);return fi(()=>(n.dragSourceOptions=e||null,n.reconnect(),()=>n.disconnectDragSource()),[n,e]),fi(()=>(n.dragPreviewOptions=t||null,n.reconnect(),()=>n.disconnectDragPreview()),[n,t]),n}function Z8(){const e=ko();return x.useMemo(()=>new V8(e),[e])}class J8{beginDrag(){const t=this.spec,r=this.monitor;let n=null;return typeof t.item=="object"?n=t.item:typeof t.item=="function"?n=t.item(r):n={},n??null}canDrag(){const t=this.spec,r=this.monitor;return typeof t.canDrag=="boolean"?t.canDrag:typeof t.canDrag=="function"?t.canDrag(r):!0}isDragging(t,r){const n=this.spec,i=this.monitor,{isDragging:o}=n;return o?o(i):r===t.getSourceId()}endDrag(){const t=this.spec,r=this.monitor,n=this.connector,{end:i}=t;i&&i(r.getItem(),r),n.reconnect()}constructor(t,r,n){this.spec=t,this.monitor=r,this.connector=n}}function ek(e,t,r){const n=x.useMemo(()=>new J8(e,t,r),[t,r]);return x.useEffect(()=>{n.spec=e},[e]),n}function tk(e){return x.useMemo(()=>{const t=e.type;return Fe(t!=null,"spec.type must be defined"),t},[e])}function rk(e,t,r){const n=ko(),i=ek(e,t,r),o=tk(e);fi(function(){if(o!=null){const[s,l]=G8(o,i,n);return t.receiveHandlerId(s),r.receiveHandlerId(s),l}},[n,t,r,i,o])}function nk(e,t){const r=ay(e,t);Fe(!r.begin,"useDrag::spec.begin was deprecated in v14. Replace spec.begin() with spec.item(). (see more here - https://react-dnd.github.io/react-dnd/docs/api/use-drag)");const n=Z8(),i=Q8(r.options,r.previewOptions);return rk(r,n,i),[oy(r.collect,n,i),U8(i),H8(i)]}function ik(e){return x.useMemo(()=>e.hooks.dropTarget(),[e])}function ok(e){const t=ko(),r=x.useMemo(()=>new q8(t.getBackend()),[t]);return fi(()=>(r.dropTargetOptions=e||null,r.reconnect(),()=>r.disconnectDropTarget()),[e]),r}function ak(){const e=ko();return x.useMemo(()=>new W8(e),[e])}function sk(e){const{accept:t}=e;return x.useMemo(()=>(Fe(e.accept!=null,"accept must be defined"),Array.isArray(t)?t:[t]),[t])}class lk{canDrop(){const t=this.spec,r=this.monitor;return t.canDrop?t.canDrop(r.getItem(),r):!0}hover(){const t=this.spec,r=this.monitor;t.hover&&t.hover(r.getItem(),r)}drop(){const t=this.spec,r=this.monitor;if(t.drop)return t.drop(r.getItem(),r)}constructor(t,r){this.spec=t,this.monitor=r}}function uk(e,t){const r=x.useMemo(()=>new lk(e,t),[t]);return x.useEffect(()=>{r.spec=e},[e]),r}function ck(e,t,r){const n=ko(),i=uk(e,t),o=sk(e);fi(function(){const[s,l]=z8(o,i,n);return t.receiveHandlerId(s),r.receiveHandlerId(s),l},[n,t,i,r,o.map(a=>a.toString()).join("|")])}function fk(e,t){const r=ay(e,t),n=ak(),i=ok(r.options);return ck(r,n,i),[oy(r.collect,n,i),ik(i)]}const ly=new RegExp("^([0-9]+)(\\s)([kKmMbBtT])$"),Aa=new RegExp("^\\d{4}$"),dk=new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}|\\d{4}-\\d{2}-\\d{2}$");function hk({column:e,table:t,numberOfColumns:r}){function n(f){if(!f)return null;const d=new Date(f),h=d.toISOString().split("T")[0],m=d.toTimeString().split(" ")[0];return`${h} ${m}`}const i=t.getPreFilteredRowModel().flatRows.map(f=>f.original[e.id]),o=i.every(f=>typeof f=="string"||f===null),a=i.every(f=>typeof f=="number"||ly.test(f)||f===null||f===""),s=i.some(f=>typeof f=="string"&&f.includes(" ")),l=e.getFilterValue();let u="date";const c=i.every(f=>{const d=f==null?void 0:f.toString().replace(/[^0-9]/g,"").trim();return dk.test(f==null?void 0:f.toString())&&(u="datetime-local"),Aa.test(f==null?void 0:f.toString())&&(u="number"),(d==null?void 0:d.length)>=4&&(ql(e.id)||e.id.toLowerCase()==="index"&&!s)});return c&&u==="number"?Ce("div",{className:"flex gap-2 h-6",children:[X("input",{type:u,value:(l==null?void 0:l[0])??"",onChange:f=>{e.setFilterValue(d=>[`${f.target.value}`,`${d==null?void 0:d[1]}`])},min:i.reduce((f,d)=>Math.min(f,parseInt(d,10)),1/0),max:i.reduce((f,d)=>Math.max(f,parseInt(d,10)),-1/0),placeholder:"Start year",className:"_input",title:"Start year"}),X("input",{type:u,value:(l==null?void 0:l[1])??"",onChange:f=>{e.setFilterValue(d=>[`${d==null?void 0:d[0]}`,`${f.target.value}`])},min:i.reduce((f,d)=>Math.min(f,parseInt(d,10)),1/0),max:i.reduce((f,d)=>Math.max(f,parseInt(d,10)),-1/0),placeholder:"End year",className:"_input",title:"End year"})]}):c&&u!=="number"?Ce("div",{className:"flex gap-2 h-6",children:[X("input",{type:u,value:n(l==null?void 0:l[0])??"",onChange:f=>{const d=new Date(f.target.value).getTime();e.setFilterValue(h=>[d,h==null?void 0:h[1]])},placeholder:"Start date",className:"_input",title:"Start date"}),X("input",{type:u,value:n(l==null?void 0:l[1])??"",onChange:f=>{const d=new Date(f.target.value).getTime();e.setFilterValue(h=>[h==null?void 0:h[0],d])},placeholder:"End date",className:"_input",title:"End date"})]}):a?Ce("div",{className:"flex gap-0.5 h-6",children:[X("input",{type:"number",value:(l==null?void 0:l[0])??"",onChange:f=>e.setFilterValue(d=>[f.target.value,d==null?void 0:d[1]]),placeholder:"Min",className:"_input p-0.5",title:"Min"}),X("input",{type:"number",value:(l==null?void 0:l[1])??"",onChange:f=>e.setFilterValue(d=>[d==null?void 0:d[0],f.target.value]),placeholder:"Max",className:"_input p-0.5",title:"Max"})]}):o?X("div",{className:"h-6",children:X("input",{type:"text",value:l??"",onChange:f=>e.setFilterValue(f.target.value),placeholder:"Search...",className:"_input",title:"Search"})}):X("div",{className:"h-6"})}const pk=(e,t,r)=>(r.splice(r.indexOf(t),0,r.splice(r.indexOf(e),1)[0]),[...r]),gk=({header:e,table:t,advanced:r,idx:n,lockFirstColumn:i,setLockFirstColumn:o})=>{const{getState:a,setColumnOrder:s}=t,{columnOrder:l}=a(),{column:u}=e,[,c]=fk({accept:"column",drop:p=>{const g=pk(p.id,u.id,l);s(g)}}),[{isDragging:f},d,h]=nk({collect:p=>({isDragging:p.isDragging()}),item:()=>u,type:"column"}),m=()=>X("div",{ref:h,className:"flex gap-1 flex-col",children:e.isPlaceholder?null:Ce(q1,{children:[Ce("div",{className:"font-bold uppercase text-grey-700 dark:text-white tracking-widest flex gap-2 whitespace-nowrap justify-between",children:[Ce("div",{onClick:u.getToggleSortingHandler(),className:Nt("flex gap-1",{"cursor-pointer select-none":u.getCanSort()}),children:[Kf(u.columnDef.header,e.getContext()),u.getCanSort()&&Ce("div",{className:"flex flex-col gap-0.5 items-center justify-center",children:[X("button",{className:Nt({"text-[#669DCB]":u.getIsSorted()==="asc","text-grey-600":u.getIsSorted()!=="asc"}),children:X("svg",{xmlns:"http://www.w3.org/2000/svg",width:"6",height:"4",fill:"none",viewBox:"0 0 11 5",children:X("path",{fill:"currentColor",d:"M10.333 5l-5-5-5 5"})})}),X("button",{className:Nt({"text-[#669DCB]":e.column.getIsSorted()==="desc","text-grey-600":e.column.getIsSorted()!=="desc"}),children:X("svg",{xmlns:"http://www.w3.org/2000/svg",width:"6",height:"4",fill:"none",viewBox:"0 0 11 5",children:X("path",{fill:"currentColor",d:"M.333 0l5 5 5-5"})})})]})]}),r&&u.id!=="select"&&X("button",{ref:d,className:"text-grey-600 hover:text-grey-800 dark:hover:text-white",children:X("svg",{xmlns:"http://www.w3.org/2000/svg",width:"12",height:"11",fill:"none",viewBox:"0 0 17 16",children:X("path",{stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",d:"M3.667 6l-2 2 2 2M6.333 3.333l2-2 2 2M10.333 12.667l-2 2-2-2M13 6l2 2-2 2M1.667 8H15M8.333 1.333v13.334"})})})]}),r&&u.getCanFilter()?X("div",{children:X(hk,{column:u,table:t,numberOfColumns:(l==null?void 0:l.length)??0})}):null]})});return Ce("th",{className:Nt("h-[70px] p-4 sticky",{"left-0 z-50 bg-white dark:bg-grey-900":n===0&&i}),colSpan:e.colSpan,style:{width:e.getSize()+10,opacity:f?.5:1},ref:c,children:[n===0?Ce(hb,{children:[X(pb,{asChild:!0,children:m()}),X(gb,{children:X(mb,{className:"bg-white text-black dark:text-white dark:bg-grey-900 border border-grey-200 dark:border-grey-800 rounded-md shadow-lg p-2 z-50 text-xs",children:X("div",{className:"flex flex-col gap-2",children:Ce("button",{onClick:()=>{o(!i)},className:"hover:bg-grey-300 dark:hover:bg-grey-800 rounded-md p-2",children:[i?"Unlock":"Lock"," first column"]})})})})]}):m(),X("button",{className:"resizer bg-grey-300/20 dark:hover:bg-white absolute top-0 right-0 w-0.5 h-full",onMouseDown:e.getResizeHandler(),onTouchStart:e.getResizeHandler()})]})};function mk({open:e,close:t}){const r=window.download_path||"~/OpenBBUserData/exports";return Ce(jv,{open:e,onOpenChange:t,children:[Ce("div",{id:"loading",className:"saving",children:[X("div",{id:"loading_text",className:"loading_text"}),X("div",{id:"loader",className:"loader"})]}),X(Xv,{onClick:t,className:"_modal-overlay"}),Ce(Kv,{className:"_modal",children:[X(Wf,{children:X(Ql,{})}),X(Wf,{className:"_modal-close",onClick:t,style:{float:"right",marginTop:20},children:X(Ql,{className:"w-6 h-6"})}),X(Yv,{className:"_modal-title",children:"Success"}),Ce("div",{id:"popup_title",className:"popup_content",style:{padding:"0px 2px 2px 5px",marginTop:5},children:[X("div",{style:{display:"flex",flexDirection:"column",gap:0,fontSize:14},children:X("div",{children:Ce("label",{htmlFor:"title_text",children:[X("b",{children:window.title})," has been downloaded to",X("br",{}),X("br",{}),X("a",{style:{color:"#FFDD00",marginTop:15},href:`${r}`,onClick:n=>{n.preventDefault(),window.pywry.open_file(r)},children:r})]})})}),X("div",{style:{float:"right",marginTop:20},children:X("button",{className:"_btn",style:{padding:"8px 16px",width:"100%"},onClick:t,children:"Close"})})]})]})]})}function vk({columns:e,data:t,type:r,setType:n,downloadFinished:i}){const o=()=>{switch(r){case"csv":Qg("csv",e,t,i);break;case"xlsx":Qg("xlsx",e,t,i);break;case"png":sP("table",i);break}};return Ce("div",{className:"flex gap-2 items-center",children:[X(Yi,{labelType:"row",value:r,onChange:a=>{n(a)},label:"Type",placeholder:"Select type",groups:[{label:"Type",items:w0.map(a=>({label:a,value:a}))}]}),X("button",{onClick:o,className:"_btn",children:"Export"})]})}const uy="DropdownMenu",[xk,a$]=ln(uy,[Bu]),Oi=Bu(),[wk,cy]=xk(uy),yk=e=>{const{__scopeDropdownMenu:t,children:r,dir:n,open:i,defaultOpen:o,onOpenChange:a,modal:s=!0}=e,l=Oi(t),u=x.useRef(null),[c=!1,f]=vo({prop:i,defaultProp:o,onChange:a});return x.createElement(wk,{scope:t,triggerId:Yr(),triggerRef:u,contentId:Yr(),open:c,onOpenChange:f,onOpenToggle:x.useCallback(()=>f(d=>!d),[f]),modal:s},x.createElement(G2,ge({},l,{open:c,onOpenChange:f,dir:n,modal:s}),r))},Ek="DropdownMenuTrigger",Sk=x.forwardRef((e,t)=>{const{__scopeDropdownMenu:r,disabled:n=!1,...i}=e,o=cy(Ek,r),a=Oi(r);return x.createElement(j2,ge({asChild:!0},a),x.createElement(Ie.button,ge({type:"button",id:o.triggerId,"aria-haspopup":"menu","aria-expanded":o.open,"aria-controls":o.open?o.contentId:void 0,"data-state":o.open?"open":"closed","data-disabled":n?"":void 0,disabled:n},i,{ref:xd(t,o.triggerRef),onPointerDown:Se(e.onPointerDown,s=>{!n&&s.button===0&&s.ctrlKey===!1&&(o.onOpenToggle(),o.open||s.preventDefault())}),onKeyDown:Se(e.onKeyDown,s=>{n||(["Enter"," "].includes(s.key)&&o.onOpenToggle(),s.key==="ArrowDown"&&o.onOpenChange(!0),["Enter"," ","ArrowDown"].includes(s.key)&&s.preventDefault())})})))}),_k=e=>{const{__scopeDropdownMenu:t,...r}=e,n=Oi(t);return x.createElement(X2,ge({},n,r))},Tk="DropdownMenuContent",Ck=x.forwardRef((e,t)=>{const{__scopeDropdownMenu:r,...n}=e,i=cy(Tk,r),o=Oi(r),a=x.useRef(!1);return x.createElement(K2,ge({id:i.contentId,"aria-labelledby":i.triggerId},o,n,{ref:t,onCloseAutoFocus:Se(e.onCloseAutoFocus,s=>{var l;a.current||(l=i.triggerRef.current)===null||l===void 0||l.focus(),a.current=!1,s.preventDefault()}),onInteractOutside:Se(e.onInteractOutside,s=>{const l=s.detail.originalEvent,u=l.button===0&&l.ctrlKey===!0,c=l.button===2||u;(!i.modal||c)&&(a.current=!0)}),style:{...e.style,"--radix-dropdown-menu-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-dropdown-menu-content-available-width":"var(--radix-popper-available-width)","--radix-dropdown-menu-content-available-height":"var(--radix-popper-available-height)","--radix-dropdown-menu-trigger-width":"var(--radix-popper-anchor-width)","--radix-dropdown-menu-trigger-height":"var(--radix-popper-anchor-height)"}}))}),Ak=x.forwardRef((e,t)=>{const{__scopeDropdownMenu:r,...n}=e,i=Oi(r);return x.createElement(rb,ge({},i,n,{ref:t}))}),Rk=x.forwardRef((e,t)=>{const{__scopeDropdownMenu:r,...n}=e,i=Oi(r);return x.createElement(nb,ge({},i,n,{ref:t}))}),Ok=x.forwardRef((e,t)=>{const{__scopeDropdownMenu:r,...n}=e,i=Oi(r);return x.createElement(ib,ge({},i,n,{ref:t}))}),Fk=yk,R1=Sk,Dk=_k,Pk=Ck,Ik=Ak,bk=Rk,Yc=Ok;function kk(e,t){x.useEffect(()=>{const r=n=>{!e.current||e.current.contains(n.target)||t(n)};return document.addEventListener("mousedown",r),document.addEventListener("touchstart",r),()=>{document.removeEventListener("mousedown",r),document.removeEventListener("touchstart",r)}},[e,t])}function O1({label:e,table:t,onlyIconTrigger:r=!1}){const[n,i]=x.useState(!1),o=x.useRef(null);kk(o,()=>i(!1)),x.useEffect(()=>{const s=l=>{l.key==="Escape"&&i(!1)};return document.addEventListener("keydown",s),()=>document.removeEventListener("keydown",s)},[]);function a(){t.resetColumnFilters(),i(!1)}return Ce(Fk,{open:n,children:[r?X(R1,{title:"Filter columns",onClick:()=>i(!n),children:X("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor",className:"w-7 h-7",children:X("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 3c2.755 0 5.455.232 8.083.678.533.09.917.556.917 1.096v1.044a2.25 2.25 0 01-.659 1.591l-5.432 5.432a2.25 2.25 0 00-.659 1.591v2.927a2.25 2.25 0 01-1.244 2.013L9.75 21v-6.568a2.25 2.25 0 00-.659-1.591L3.659 7.409A2.25 2.25 0 013 5.818V4.774c0-.54.384-1.006.917-1.096A48.32 48.32 0 0112 3z"})})}):Ce(Ik,{className:"flex flex-row items-center gap-2",children:[X(bk,{className:"whitespace-nowrap",children:e}),Ce(R1,{onClick:()=>i(!n),className:"bg-white text-black dark:bg-grey-900 dark:text-white whitespace-nowrap h-[36px] border-[1.5px] border-grey-700 rounded p-3 inline-flex items-center justify-center leading-none gap-[5px] shadow-[0_2px_10px] shadow-black/10 focus:shadow-[0_0_0_2px] focus:shadow-black data-[placeholder]:text-white outline-none","aria-label":e,children:[X("span",{children:"Filter columns"}),X(s0,{className:Nt({"transform rotate-180 duration-200 transition":n})})]})]}),X(Dk,{children:Ce(Pk,{sideOffset:10,ref:o,className:"z-50 bg-white/80 dark:bg-grey-900/80 backdrop-filter backdrop-blur flex flex-col gap-4 overflow-auto border-[1.5px] border-grey-700 rounded p-3 max-h-[500px] text-black dark:text-white",children:[X(Yc,{children:X("button",{className:"_btn w-full",onClick:a,children:"Clear Filters"})}),X(Yc,{children:Ce("label",{className:"flex items-center gap-2",children:[X("input",{type:"checkbox",checked:t.getIsAllColumnsVisible(),onChange:t.getToggleAllColumnsVisibilityHandler()}),"Toggle All"]})}),t.getAllLeafColumns().filter(s=>s.id!=="select").map(s=>X(Yc,{children:Ce("label",{className:"flex items-center gap-2",children:[X("input",{type:"checkbox",checked:s.getIsVisible(),onChange:s.getToggleVisibilityHandler()}),s.id]})},s.id))]})})]})}function fy(e){return typeof e!="number"?typeof e=="string"&&e.includes("All")?e:x0:e<1?x0:e}function $k({table:e,currentPage:t,setCurrentPage:r}){const n=e.getFilteredRowModel().rows.length||0;return Ce("div",{className:"hidden md:flex items-center gap-3",children:[X(Yi,{value:t,onChange:i=>{const o=fy(i);r(o),o.toString().includes("All")?e.setPageSize(n):e.setPageSize(o)},labelType:"row",label:"Rows per page",placeholder:"Select rows per page",groups:[{label:"Rows per page",items:[10,20,30,40,50,`All (${n})`].map(i=>({label:`${i}`,value:i}))}]}),Ce("span",{className:"flex items-center gap-1",children:[X("strong",{children:e.getState().pagination.pageIndex+1}),"of",X("strong",{children:e.getPageCount()})]}),Ce("div",{className:"hidden mdl:block",children:[X("button",{className:Nt("px-2",{"text-grey-400 dark:text-grey-700":!e.getCanPreviousPage(),"dark:text-white":e.getCanPreviousPage()}),onClick:()=>e.setPageIndex(0),disabled:!e.getCanPreviousPage(),children:"<<"}),X("button",{className:Nt("px-2",{"text-grey-400 dark:text-grey-700":!e.getCanPreviousPage(),"dark:text-white":e.getCanPreviousPage()}),onClick:()=>e.previousPage(),disabled:!e.getCanPreviousPage(),children:"<"}),X("button",{className:Nt("px-2",{"text-grey-400 dark:text-grey-700":!e.getCanNextPage(),"dark:text-white":e.getCanNextPage()}),onClick:()=>e.nextPage(),disabled:!e.getCanNextPage(),children:">"}),X("button",{className:Nt("px-2",{"text-grey-400 dark:text-grey-700":!e.getCanNextPage(),"dark:text-white":e.getCanNextPage()}),onClick:()=>e.setPageIndex(e.getPageCount()-1),disabled:!e.getCanNextPage(),children:">>"})]})]})}const Nk=new Date,Mk=50,x0=30;function Lk(e,t){try{const r=e.hasOwnProperty("index")?"index":e.hasOwnProperty("Index")?"Index":null,n=r?e[r]:null,i=e[t],o=typeof i,a=i==null?void 0:i.toString().replace(/[^0-9]/g,""),s=(a==null?void 0:a.length)>=4&&(ql(t)||t.toLowerCase()==="index"||n&&typeof n=="string"&&(n.toLowerCase().includes("date")||n.toLowerCase().includes("day")||n.toLowerCase().includes("time")||n.toLowerCase().includes("timestamp")||n.toLowerCase().includes("year")||n.toLowerCase().includes("month")||n.toLowerCase().includes("week")||n.toLowerCase().includes("hour")||n.toLowerCase().includes("minute")));if(o==="string"&&i.startsWith("http")||!s)return(i==null?void 0:i.toString().length)??0;if(s&&!isNaN(new Date(i).getTime())&&!Aa.test(i==null?void 0:i.toString())){if(typeof i=="string")return(i==null?void 0:i.toString().length)??0;try{const u=new Date(i);let c="";return u.getUTCHours()===0&&u.getUTCMinutes()===0&&u.getUTCSeconds()===0&&u.getMilliseconds()===0?c=u.toISOString().split("T")[0]:(c=u.toISOString(),c=`${c.split("T")[0]} ${c.split("T")[1].split(".")[0]}`),(c==null?void 0:c.toString().length)??0}catch{return(i==null?void 0:i.toString().length)??0}}return(i==null?void 0:i.toString().length)??0}catch{return 0}}const w0=["csv","xlsx","png"];function Bk({data:e,columns:t,title:r,initialTheme:n,cmd:i=""}){const[o,a]=Jo("exportType",w0[0]),[s,l]=x.useState(!1),[u,c]=JC(n),[f,d]=x.useState(u==="dark"),h=W=>{c(u),d(W)},[m,p]=Jo("rowsPerPage",x0,fy),[g,v]=Jo("advanced",!1),[w,y]=Jo("colors",!1),[E,b]=x.useState([]),[k,_]=x.useState(""),[C,A]=Jo("fontSize","1"),[L,B]=x.useState(!1),U=t.reduce((W,Q,le)=>(W[Q]=le{const ie=Math.max(...W.map($e=>Lk($e,Q)),le!=null&&le.length?(le==null?void 0:le.length)+8:0);return Math.min(200,ie*12)},ae=x.useMemo(()=>[...t.map((W,Q)=>({accessorKey:W,accessorFn:le=>{var ve,ut,gt;const me=le.hasOwnProperty("index")?"index":le.hasOwnProperty("Index")?"Index":t[0],_e=me?le[me]:null,ie=le[W],$e=((gt=(ut=(ve=ie==null?void 0:ie.toString())==null?void 0:ve.split("."))==null?void 0:ut.pop())==null?void 0:gt.replace(/[^0-9]/g,""))??"",Pe=($e==null?void 0:$e.length)>=4&&(ql(W)||W.toLowerCase()==="index"||_e&&typeof _e=="string"&&(_e.toLowerCase().includes("date")||_e.toLowerCase().includes("time")||_e.toLowerCase().includes("timestamp")||_e.toLowerCase().includes("year")||_e.toLowerCase().includes("month")||_e.toLowerCase().includes("week")||_e.toLowerCase().includes("hour")||_e.toLowerCase().includes("minute")));return Pe&&Aa.test(ie==null?void 0:ie.toString())?ie:Pe?typeof ie=="number"?ie:new Date(ie).getTime():ie},id:W,header:W,size:ee(e,W,W),footer:W,cell:({row:le})=>{var gt,bt,Br,$o;const me=le.original.hasOwnProperty("index")?"index":le.original.hasOwnProperty("Index")?"Index":t[0],_e=me?le.original[me]:null,ie=le.original[W],$e=typeof ie,Pe=((Br=(bt=(gt=ie==null?void 0:ie.toString())==null?void 0:gt.split("."))==null?void 0:bt.pop())==null?void 0:Br.replace(/[^0-9]/g,""))??"",ve=(Pe==null?void 0:Pe.length)>=4&&(ql(W)||W.toLowerCase()==="index"||_e&&typeof _e=="string"&&(_e.toLowerCase().includes("date")||_e.toLowerCase().includes("time")||_e.toLowerCase().includes("timestamp")||_e.toLowerCase().includes("year")));if($e==="string"&&ie.startsWith("http"))return X("a",{className:"_hyper-link",href:ie,target:"_blank",rel:"noreferrer",children:(ie==null?void 0:ie.length)>25?`${ie.substring(0,25)}...`:ie});if(ve&&Aa.test(ie==null?void 0:ie.toString()))return X("p",{children:ie});if(ve&&!isNaN(new Date(ie).getTime())&&!Aa.test(ie==null?void 0:ie.toString())){if(typeof ie=="string"){const Ze=ie.split("T")[0],We=($o=ie.split("T")[1])==null?void 0:$o.split(".")[0];return We==="00:00:00"?X("p",{children:Ze}):Ce("p",{children:[Ze," ",We]})}try{const Ze=new Date(ie);let We="";return Ze.getUTCHours()===0&&Ze.getUTCMinutes()===0&&Ze.getUTCSeconds()===0&&Ze.getMilliseconds()===0?We=Ze.toISOString().split("T")[0]:(We=Ze.toISOString(),We=`${We.split("T")[0]} ${We.split("T")[1].split(".")[0]}`),X("p",{children:We})}catch{return X("p",{children:ie})}}if($e==="number"||ly.test(ie==null?void 0:ie.toString())){let Ze=tP(ie,W);const We=Number(t0(ie));if(typeof _e=="string"&&n2(_e)){Ze=Number(t0(ie));const Fi=Ze<2?4:2;Ze=Ze.toLocaleString("en-US",{maximumFractionDigits:Fi,minimumFractionDigits:2})}return X("p",{className:Nt("whitespace-nowrap",{"text-black dark:text-white":!w,"text-[#16A34A]":We>0&&w,"text-[#F87171]":We<0&&w,"text-[#404040]":We===0&&w}),title:r2(ie).toString()??"",children:We!==0?We>0?`${Ze}`:`${Ze}`:Ze})}else if($e==="string")return X("div",{dangerouslySetInnerHTML:{__html:ZC(ie)}});return X("p",{children:ie})}}))],[g,w]),[he,Te]=x.useState(!1),[oe,ye]=x.useState(ae.map(W=>W.id)),te=()=>ye(t.map(W=>W.id)),O=x.useMemo(()=>{const W=oe.map(le=>le),Q=ae.map(le=>le.id);return!rP(W,Q)},[oe,ae]),M=aC({data:e,columns:ae,getCoreRowModel:YT(),getSortedRowModel:eC(),getFilteredRowModel:JT(),getPaginationRowModel:rC(),columnResizeMode:"onChange",onColumnVisibilityChange:G,onColumnOrderChange:ye,onSortingChange:b,onGlobalFilterChange:_,globalFilterFn:nP,state:{sorting:E,globalFilter:k,columnOrder:oe,columnVisibility:H},initialState:{pagination:{pageIndex:0,pageSize:typeof m=="string"?m.includes("All")?e==null?void 0:e.length:parseInt(m):m}}}),N=x.useRef(null),{rows:F}=M.getRowModel(),V=M.getVisibleFlatColumns(),[Y,J]=x.useState(!1);return x.useEffect(()=>{s&&(l(!1),J(!0))},[s]),Ce(q1,{children:[X(f5,{toast:{id:"max-columns",title:"Max 12 columns are visible by default",description:"You can change this by clicking on advanced and then top right 'Filter' button",status:"info"},open:L,setOpen:B}),X(mk,{open:Y,close:()=>J(!1)}),Ce("div",{ref:N,className:Nt("overflow-x-hidden h-screen"),children:[Ce("div",{className:"relative p-4",id:"table",children:[X("div",{className:"absolute -inset-0.5 bg-gradient-to-r rounded-md blur-md from-[#072e49]/30 via-[#0d345f]/30 to-[#0d3362]/30"}),Ce("div",{className:"border border-grey-500/60 dark:border-grey-200/60 bg-white dark:bg-grey-900 rounded overflow-hidden relative z-20",children:[Ce("div",{className:"_header relative gap-4 py-2 text-center text-xs flex items-center justify-between px-4 text-white",style:{fontSize:`${Number(C)*90}%`},children:[X("div",{className:"w-1/3",children:X("svg",{xmlns:"http://www.w3.org/2000/svg",width:"64",height:"40",fill:"none",viewBox:"0 0 64 40",children:X("path",{fill:"#fff",d:"M61.283 3.965H33.608v27.757h25.699V19.826H37.561v-3.965H63.26V3.965h-1.977zM39.538 23.792h15.815v3.965H37.561v-3.965h1.977zM59.306 9.913v1.983H37.561V7.931h21.745v1.982zM33.606 0h-3.954v3.965H33.606V0zM25.7 3.966H0V15.86h25.7v3.965H3.953v11.896h25.7V3.966h-3.955zm0 21.808v1.983H7.907v-3.965h17.791v1.982zm0-15.86v1.982H3.953V7.931h21.745v1.982zM37.039 35.693v2.952l-.246-.246-.245-.245-.245-.247-.245-.246-.246-.246-.245-.245-.245-.247-.247-.246-.245-.246-.245-.246-.245-.246-.246-.246h-.49v3.936h.49v-3.198l.246.246.245.246.245.246.245.246.246.246.246.246.245.247.246.245.245.246.245.247.245.246.246.245.245.246h.245v-3.936h-.49zM44.938 37.17h-.491v-1.477h-2.944v3.937h3.93v-2.46h-.495zm-2.944-.246v-.739h1.962v.984h-1.962v-.245zm2.944.984v1.23h-2.944V37.66h2.944v.247zM52.835 37.17h-.49v-1.477h-2.946v3.937h3.925v-2.46h-.489zm-2.944-.246v-.739h1.963v.984h-1.965l.002-.245zm2.944.984v1.23H49.89V37.66h2.946v.247zM29.174 35.693H25.739v3.936H29.663v-.491H26.229v-.984h2.943v-.493H26.229v-1.476h3.434v-.492h-.489zM13.37 35.693H9.934v3.937h3.925v-3.937h-.49zm0 .738v2.709h-2.945v-2.955h2.943l.001.246zM21.276 35.693h-3.435v3.937h.491v-1.476h3.434v-2.461h-.49zm0 .738v1.23h-2.944v-1.476h2.944v.246z"})})}),X("p",{className:"font-bold w-1/3 flex flex-col gap-0.5 items-center",children:r}),Ce("p",{className:"w-1/3 text-right text-xs",children:[new Intl.DateTimeFormat("en-GB",{dateStyle:"full",timeStyle:"long"}).format(Nk).replace(/:\d\d /," "),X("br",{}),X("span",{className:"text-grey-400",children:i})]})]}),X("div",{className:"overflow-auto max-h-[calc(100vh-170px)] smh:max-h-[calc(100vh-95px)]",children:Ce("table",{className:"text-sm relative",children:[X("thead",{className:"sticky top-0 bg-white dark:bg-grey-900",style:{fontSize:`${Number(C)*100}%`},children:M.getHeaderGroups().map((W,Q)=>X("tr",{children:W.headers.map((le,me)=>X(gk,{setLockFirstColumn:Te,lockFirstColumn:he,idx:me,advanced:g,header:le,table:M},le.id))},W.id))}),X("tbody",{children:M.getRowModel().rows.map((W,Q)=>X("tr",{className:"!h-[64px] border-b border-grey-400",style:{fontSize:`${Number(C)*100}%`},children:W.getVisibleCells().map((le,me)=>X("td",{className:Nt("whitespace-normal p-4 text-black dark:text-white",{"bg-white dark:bg-grey-850":Q%2===0,"bg-grey-100 dark:bg-[#202020]":Q%2===1,"sticky left-0 z-10":me===0&&he}),style:{width:le.column.getSize()},children:Kf(le.column.columnDef.cell,le.getContext())},le.id))},W.id))}),(F==null?void 0:F.length)>30&&(V==null?void 0:V.length)>4&&X("tfoot",{children:M.getFooterGroups().map(W=>X("tr",{children:W.headers.map(Q=>X("th",{colSpan:Q.colSpan,className:"text-grey-500 bg-grey-100 dark:bg-grey-850 font-normal text-left text-sm h-10 p-4",style:{width:Q.getSize(),fontSize:`${Number(C)*100}%`},children:Q.isPlaceholder?null:Kf(Q.column.columnDef.footer,Q.getContext())},Q.id))},W.id))})]})})]})]}),Ce("div",{className:"smh:hidden flex max-h-[68px] overflow-x-auto bg-white/70 dark:bg-grey-900/70 backdrop-filter backdrop-blur z-20 bottom-0 left-0 w-full gap-10 justify-between py-4 px-4 text-sm",children:[Ce("div",{className:"flex items-center gap-10",children:[Ce(jv,{children:[X(pT,{className:"_btn",children:"Settings"}),Ce(gT,{children:[X(Xv,{className:"_modal-overlay"}),Ce(Kv,{className:"_modal",children:[X(Wf,{className:"absolute top-[40px] right-[46px] text-grey-200 hover:text-white rounded-[4px] focus:outline focus:outline-2 focus:outline-grey-500",children:X(Ql,{className:"w-6 h-6"})}),X(Yv,{className:"uppercase font-bold tracking-widest",children:"Settings"}),Ce("div",{className:"grid grid-cols-2 gap-2 mt-10 text-sm",children:[O&&X("button",{onClick:()=>te(),className:"_btn h-9",children:"Reset Order"}),X(Yi,{labelType:"row",value:f?"light":"dark",onChange:W=>{h(W!=="dark")},label:"Theme",placeholder:"Select theme",groups:[{label:"Theme",items:[{label:"Dark",value:"dark"},{label:"Light",value:"light"}]}]}),X(Yi,{labelType:"row",value:o,onChange:W=>{a(W)},label:"Export type",placeholder:"Select export type",groups:[{label:"Export type",items:w0.map(W=>({label:W,value:W}))}]}),X(Yi,{labelType:"row",value:C,onChange:A,label:"Font size",placeholder:"Select font size",groups:[{label:"Font size",items:[{label:"50%",value:"0.5"},{label:"75%",value:"0.75"},{label:"100%",value:"1"},{label:"125%",value:"1.25"},{label:"150%",value:"1.5"},{label:"175%",value:"1.75"},{label:"200%",value:"2"}]}]}),X(O1,{table:M,label:"Filter"}),X("div",{className:"flex gap-2 items-center",children:X(Yi,{labelType:"row",value:g?"advanced":"simple",onChange:W=>{v(W==="advanced")},label:"Type",placeholder:"Select type",groups:[{label:"Type",items:[{label:"Simple",value:"simple"},{label:"Advanced",value:"advanced"}]}]})}),Ce("div",{className:"flex gap-2 items-center",children:[X("label",{htmlFor:"colors",children:"Colors"}),X("input",{id:"colors",type:"checkbox",checked:w,onChange:()=>y(!w)})]})]})]})]})]}),X(O1,{onlyIconTrigger:!0,table:M,label:""})]}),X($k,{currentPage:m,setCurrentPage:p,table:M}),X(vk,{setType:a,type:o,columns:t,data:e,downloadFinished:l})]})]})]})}function dy(e){let t=null;return()=>(t==null&&(t=e()),t)}function Uk(e,t){return e.filter(r=>r!==t)}function Hk(e,t){const r=new Set,n=o=>r.add(o);e.forEach(n),t.forEach(n);const i=[];return r.forEach(o=>i.push(o)),i}class Vk{enter(t){const r=this.entered.length,n=i=>this.isNodeInDocument(i)&&(!i.contains||i.contains(t));return this.entered=Hk(this.entered.filter(n),[t]),r===0&&this.entered.length>0}leave(t){const r=this.entered.length;return this.entered=Uk(this.entered.filter(this.isNodeInDocument),t),r>0&&this.entered.length===0}reset(){this.entered=[]}constructor(t){this.entered=[],this.isNodeInDocument=t}}class Wk{initializeExposedProperties(){Object.keys(this.config.exposeProperties).forEach(t=>{Object.defineProperty(this.item,t,{configurable:!0,enumerable:!0,get(){return console.warn(`Browser doesn't allow reading "${t}" until the drop event.`),null}})})}loadDataTransfer(t){if(t){const r={};Object.keys(this.config.exposeProperties).forEach(n=>{const i=this.config.exposeProperties[n];i!=null&&(r[n]={value:i(t,this.config.matchesTypes),configurable:!0,enumerable:!0})}),Object.defineProperties(this.item,r)}}canDrag(){return!0}beginDrag(){return this.item}isDragging(t,r){return r===t.getSourceId()}endDrag(){}constructor(t){this.config=t,this.item={},this.initializeExposedProperties()}}const hy="__NATIVE_FILE__",py="__NATIVE_URL__",gy="__NATIVE_TEXT__",my="__NATIVE_HTML__",F1=Object.freeze(Object.defineProperty({__proto__:null,FILE:hy,HTML:my,TEXT:gy,URL:py},Symbol.toStringTag,{value:"Module"}));function qc(e,t,r){const n=t.reduce((i,o)=>i||e.getData(o),"");return n??r}const y0={[hy]:{exposeProperties:{files:e=>Array.prototype.slice.call(e.files),items:e=>e.items,dataTransfer:e=>e},matchesTypes:["Files"]},[my]:{exposeProperties:{html:(e,t)=>qc(e,t,""),dataTransfer:e=>e},matchesTypes:["Html","text/html"]},[py]:{exposeProperties:{urls:(e,t)=>qc(e,t,"").split(` -`),dataTransfer:e=>e},matchesTypes:["Url","text/uri-list"]},[gy]:{exposeProperties:{text:(e,t)=>qc(e,t,""),dataTransfer:e=>e},matchesTypes:["Text","text/plain"]}};function zk(e,t){const r=y0[e];if(!r)throw new Error(`native type ${e} has no configuration`);const n=new Wk(r);return n.loadDataTransfer(t),n}function Qc(e){if(!e)return null;const t=Array.prototype.slice.call(e.types||[]);return Object.keys(y0).filter(r=>{const n=y0[r];return n!=null&&n.matchesTypes?n.matchesTypes.some(i=>t.indexOf(i)>-1):!1})[0]||null}const Gk=dy(()=>/firefox/i.test(navigator.userAgent)),vy=dy(()=>!!window.safari);class D1{interpolate(t){const{xs:r,ys:n,c1s:i,c2s:o,c3s:a}=this;let s=r.length-1;if(t===r[s])return n[s];let l=0,u=a.length-1,c;for(;l<=u;){c=Math.floor(.5*(l+u));const h=r[c];if(ht)u=c-1;else return n[c]}s=Math.max(0,u);const f=t-r[s],d=f*f;return n[s]+i[s]*f+o[s]*d+a[s]*f*d}constructor(t,r){const{length:n}=t,i=[];for(let h=0;ht[h]{let k=new D1([0,.5,1],[l.y,l.y/c*m,l.y+m-c]).interpolate(d);return vy()&&o&&(k+=(window.devicePixelRatio-1)*m),k},g=()=>new D1([0,.5,1],[l.x,l.x/u*h,l.x+h-u]).interpolate(f),{offsetX:v,offsetY:w}=i,y=v===0||v,E=w===0||w;return{x:y?v:g(),y:E?w:p()}}class qk{get window(){if(this.globalContext)return this.globalContext;if(typeof window<"u")return window}get document(){var t;return!((t=this.globalContext)===null||t===void 0)&&t.document?this.globalContext.document:this.window?this.window.document:void 0}get rootElement(){var t;return((t=this.optionsArgs)===null||t===void 0?void 0:t.rootElement)||this.window}constructor(t,r){this.ownerDocument=null,this.globalContext=t,this.optionsArgs=r}}function Qk(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function P1(e){for(var t=1;t{this.sourcePreviewNodes.delete(t),this.sourcePreviewNodeOptions.delete(t)}}connectDragSource(t,r,n){this.sourceNodes.set(t,r),this.sourceNodeOptions.set(t,n);const i=a=>this.handleDragStart(a,t),o=a=>this.handleSelectStart(a);return r.setAttribute("draggable","true"),r.addEventListener("dragstart",i),r.addEventListener("selectstart",o),()=>{this.sourceNodes.delete(t),this.sourceNodeOptions.delete(t),r.removeEventListener("dragstart",i),r.removeEventListener("selectstart",o),r.setAttribute("draggable","false")}}connectDropTarget(t,r){const n=a=>this.handleDragEnter(a,t),i=a=>this.handleDragOver(a,t),o=a=>this.handleDrop(a,t);return r.addEventListener("dragenter",n),r.addEventListener("dragover",i),r.addEventListener("drop",o),()=>{r.removeEventListener("dragenter",n),r.removeEventListener("dragover",i),r.removeEventListener("drop",o)}}addEventListeners(t){t.addEventListener&&(t.addEventListener("dragstart",this.handleTopDragStart),t.addEventListener("dragstart",this.handleTopDragStartCapture,!0),t.addEventListener("dragend",this.handleTopDragEndCapture,!0),t.addEventListener("dragenter",this.handleTopDragEnter),t.addEventListener("dragenter",this.handleTopDragEnterCapture,!0),t.addEventListener("dragleave",this.handleTopDragLeaveCapture,!0),t.addEventListener("dragover",this.handleTopDragOver),t.addEventListener("dragover",this.handleTopDragOverCapture,!0),t.addEventListener("drop",this.handleTopDrop),t.addEventListener("drop",this.handleTopDropCapture,!0))}removeEventListeners(t){t.removeEventListener&&(t.removeEventListener("dragstart",this.handleTopDragStart),t.removeEventListener("dragstart",this.handleTopDragStartCapture,!0),t.removeEventListener("dragend",this.handleTopDragEndCapture,!0),t.removeEventListener("dragenter",this.handleTopDragEnter),t.removeEventListener("dragenter",this.handleTopDragEnterCapture,!0),t.removeEventListener("dragleave",this.handleTopDragLeaveCapture,!0),t.removeEventListener("dragover",this.handleTopDragOver),t.removeEventListener("dragover",this.handleTopDragOverCapture,!0),t.removeEventListener("drop",this.handleTopDrop),t.removeEventListener("drop",this.handleTopDropCapture,!0))}getCurrentSourceNodeOptions(){const t=this.monitor.getSourceId(),r=this.sourceNodeOptions.get(t);return P1({dropEffect:this.altKeyPressed?"copy":"move"},r||{})}getCurrentDropEffect(){return this.isDraggingNativeItem()?"copy":this.getCurrentSourceNodeOptions().dropEffect}getCurrentSourcePreviewNodeOptions(){const t=this.monitor.getSourceId(),r=this.sourcePreviewNodeOptions.get(t);return P1({anchorX:.5,anchorY:.5,captureDraggingState:!1},r||{})}isDraggingNativeItem(){const t=this.monitor.getItemType();return Object.keys(F1).some(r=>F1[r]===t)}beginDragNativeItem(t,r){this.clearCurrentDragSourceNode(),this.currentNativeSource=zk(t,r),this.currentNativeHandle=this.registry.addSource(t,this.currentNativeSource),this.actions.beginDrag([this.currentNativeHandle])}setCurrentDragSourceNode(t){this.clearCurrentDragSourceNode(),this.currentDragSourceNode=t;const r=1e3;this.mouseMoveTimeoutTimer=setTimeout(()=>{var n;return(n=this.rootElement)===null||n===void 0?void 0:n.addEventListener("mousemove",this.endDragIfSourceWasRemovedFromDOM,!0)},r)}clearCurrentDragSourceNode(){if(this.currentDragSourceNode){if(this.currentDragSourceNode=null,this.rootElement){var t;(t=this.window)===null||t===void 0||t.clearTimeout(this.mouseMoveTimeoutTimer||void 0),this.rootElement.removeEventListener("mousemove",this.endDragIfSourceWasRemovedFromDOM,!0)}return this.mouseMoveTimeoutTimer=null,!0}return!1}handleDragStart(t,r){t.defaultPrevented||(this.dragStartSourceIds||(this.dragStartSourceIds=[]),this.dragStartSourceIds.unshift(r))}handleDragEnter(t,r){this.dragEnterTargetIds.unshift(r)}handleDragOver(t,r){this.dragOverTargetIds===null&&(this.dragOverTargetIds=[]),this.dragOverTargetIds.unshift(r)}handleDrop(t,r){this.dropTargetIds.unshift(r)}constructor(t,r,n){this.sourcePreviewNodes=new Map,this.sourcePreviewNodeOptions=new Map,this.sourceNodes=new Map,this.sourceNodeOptions=new Map,this.dragStartSourceIds=null,this.dropTargetIds=[],this.dragEnterTargetIds=[],this.currentNativeSource=null,this.currentNativeHandle=null,this.currentDragSourceNode=null,this.altKeyPressed=!1,this.mouseMoveTimeoutTimer=null,this.asyncEndDragFrameId=null,this.dragOverTargetIds=null,this.lastClientOffset=null,this.hoverRafId=null,this.getSourceClientOffset=i=>{const o=this.sourceNodes.get(i);return o&&xy(o)||null},this.endDragNativeItem=()=>{this.isDraggingNativeItem()&&(this.actions.endDrag(),this.currentNativeHandle&&this.registry.removeSource(this.currentNativeHandle),this.currentNativeHandle=null,this.currentNativeSource=null)},this.isNodeInDocument=i=>!!(i&&this.document&&this.document.body&&this.document.body.contains(i)),this.endDragIfSourceWasRemovedFromDOM=()=>{const i=this.currentDragSourceNode;i==null||this.isNodeInDocument(i)||(this.clearCurrentDragSourceNode()&&this.monitor.isDragging()&&this.actions.endDrag(),this.cancelHover())},this.scheduleHover=i=>{this.hoverRafId===null&&typeof requestAnimationFrame<"u"&&(this.hoverRafId=requestAnimationFrame(()=>{this.monitor.isDragging()&&this.actions.hover(i||[],{clientOffset:this.lastClientOffset}),this.hoverRafId=null}))},this.cancelHover=()=>{this.hoverRafId!==null&&typeof cancelAnimationFrame<"u"&&(cancelAnimationFrame(this.hoverRafId),this.hoverRafId=null)},this.handleTopDragStartCapture=()=>{this.clearCurrentDragSourceNode(),this.dragStartSourceIds=[]},this.handleTopDragStart=i=>{if(i.defaultPrevented)return;const{dragStartSourceIds:o}=this;this.dragStartSourceIds=null;const a=Ks(i);this.monitor.isDragging()&&(this.actions.endDrag(),this.cancelHover()),this.actions.beginDrag(o||[],{publishSource:!1,getSourceClientOffset:this.getSourceClientOffset,clientOffset:a});const{dataTransfer:s}=i,l=Qc(s);if(this.monitor.isDragging()){if(s&&typeof s.setDragImage=="function"){const c=this.monitor.getSourceId(),f=this.sourceNodes.get(c),d=this.sourcePreviewNodes.get(c)||f;if(d){const{anchorX:h,anchorY:m,offsetX:p,offsetY:g}=this.getCurrentSourcePreviewNodeOptions(),y=Yk(f,d,a,{anchorX:h,anchorY:m},{offsetX:p,offsetY:g});s.setDragImage(d,y.x,y.y)}}try{s==null||s.setData("application/json",{})}catch{}this.setCurrentDragSourceNode(i.target);const{captureDraggingState:u}=this.getCurrentSourcePreviewNodeOptions();u?this.actions.publishDragSource():setTimeout(()=>this.actions.publishDragSource(),0)}else if(l)this.beginDragNativeItem(l);else{if(s&&!s.types&&(i.target&&!i.target.hasAttribute||!i.target.hasAttribute("draggable")))return;i.preventDefault()}},this.handleTopDragEndCapture=()=>{this.clearCurrentDragSourceNode()&&this.monitor.isDragging()&&this.actions.endDrag(),this.cancelHover()},this.handleTopDragEnterCapture=i=>{if(this.dragEnterTargetIds=[],this.isDraggingNativeItem()){var o;(o=this.currentNativeSource)===null||o===void 0||o.loadDataTransfer(i.dataTransfer)}if(!this.enterLeaveCounter.enter(i.target)||this.monitor.isDragging())return;const{dataTransfer:s}=i,l=Qc(s);l&&this.beginDragNativeItem(l,s)},this.handleTopDragEnter=i=>{const{dragEnterTargetIds:o}=this;if(this.dragEnterTargetIds=[],!this.monitor.isDragging())return;this.altKeyPressed=i.altKey,o.length>0&&this.actions.hover(o,{clientOffset:Ks(i)}),o.some(s=>this.monitor.canDropOnTarget(s))&&(i.preventDefault(),i.dataTransfer&&(i.dataTransfer.dropEffect=this.getCurrentDropEffect()))},this.handleTopDragOverCapture=i=>{if(this.dragOverTargetIds=[],this.isDraggingNativeItem()){var o;(o=this.currentNativeSource)===null||o===void 0||o.loadDataTransfer(i.dataTransfer)}},this.handleTopDragOver=i=>{const{dragOverTargetIds:o}=this;if(this.dragOverTargetIds=[],!this.monitor.isDragging()){i.preventDefault(),i.dataTransfer&&(i.dataTransfer.dropEffect="none");return}this.altKeyPressed=i.altKey,this.lastClientOffset=Ks(i),this.scheduleHover(o),(o||[]).some(s=>this.monitor.canDropOnTarget(s))?(i.preventDefault(),i.dataTransfer&&(i.dataTransfer.dropEffect=this.getCurrentDropEffect())):this.isDraggingNativeItem()?i.preventDefault():(i.preventDefault(),i.dataTransfer&&(i.dataTransfer.dropEffect="none"))},this.handleTopDragLeaveCapture=i=>{this.isDraggingNativeItem()&&i.preventDefault(),this.enterLeaveCounter.leave(i.target)&&(this.isDraggingNativeItem()&&setTimeout(()=>this.endDragNativeItem(),0),this.cancelHover())},this.handleTopDropCapture=i=>{if(this.dropTargetIds=[],this.isDraggingNativeItem()){var o;i.preventDefault(),(o=this.currentNativeSource)===null||o===void 0||o.loadDataTransfer(i.dataTransfer)}else Qc(i.dataTransfer)&&i.preventDefault();this.enterLeaveCounter.reset()},this.handleTopDrop=i=>{const{dropTargetIds:o}=this;this.dropTargetIds=[],this.actions.hover(o,{clientOffset:Ks(i)}),this.actions.drop({dropEffect:this.getCurrentDropEffect()}),this.isDraggingNativeItem()?this.endDragNativeItem():this.monitor.isDragging()&&this.actions.endDrag(),this.cancelHover()},this.handleSelectStart=i=>{const o=i.target;typeof o.dragDrop=="function"&&(o.tagName==="INPUT"||o.tagName==="SELECT"||o.tagName==="TEXTAREA"||o.isContentEditable||(i.preventDefault(),o.dragDrop()))},this.options=new qk(r,n),this.actions=t.getActions(),this.monitor=t.getMonitor(),this.registry=t.getRegistry(),this.enterLeaveCounter=new Vk(this.isNodeInDocument)}}const Jk=function(t,r,n){return new Zk(t,r,n)};function e$(){const[e,t]=x.useState(null),[r,n]=x.useState("Interactive Table");x.useEffect(()=>{const a=setInterval(()=>{if(window.json_data){const s=JSON.parse(window.json_data);console.log(s),t(s),s.title&&typeof s.title=="string"&&n(s.title),clearInterval(a)}},100);return()=>clearInterval(a)},[]);const o=(a=>{var h;if(!a)return null;const s=(h=a.title)==null?void 0:h.replace(/|<\/b>/g,"").replace(/ /g,"_"),l=new Date().toISOString().slice(0,10).replace(/-/g,""),u=new Date().toISOString().slice(11,19).replace(/:/g,"");window.title=`openbb_${s}_${l}_${u}`;const c=a.columns;a.index;const d=a.data.map((m,p)=>{const g={};return m.forEach((v,w)=>{g[c[w]]=v||(v===0?0:"")}),g});return{columns:c,data:d}})(e);return X("div",{className:"relative h-full bg-white dark:bg-black text-black dark:text-white",children:X(b8,{backend:Jk,children:o&&X(Bk,{title:r,data:o.data,columns:o.columns,initialTheme:e.theme&&typeof e.theme=="string"&&e.theme==="dark"?"dark":"light",cmd:(e==null?void 0:e.command_location)??""})})})}Ov.render(X(or.StrictMode,{children:X(e$,{})}),document.getElementById("root")); +`;var r=Qd(e,t);return r}function G6(e){var t="",r,n="";if(e==null||e["!ref"]==null)return[];var i=Xe(e["!ref"]),o="",a=[],s,l=[],u=Array.isArray(e);for(s=i.s.c;s<=i.e.c;++s)a[s]=Ft(s);for(var c=i.s.r;c<=i.e.r;++c)for(o=_t(c),s=i.s.c;s<=i.e.c;++s)if(t=a[s]+o,r=u?(e[c]||[])[s]:e[t],n="",r!==void 0){if(r.F!=null){if(t=r.F,!r.f)continue;n=r.f,t.indexOf(":")==-1&&(t=t+":"+t)}if(r.f!=null)n=r.f;else{if(r.t=="z")continue;if(r.t=="n"&&r.v!=null)n=""+r.v;else if(r.t=="b")n=r.v?"TRUE":"FALSE";else if(r.w!==void 0)n="'"+r.w;else{if(r.v===void 0)continue;r.t=="s"?n="'"+r.v:n=""+r.v}}l[l.length]=t+"="+n}return l}function e2(e,t,r){var n=r||{},i=+!n.skipHeader,o=e||{},a=0,s=0;if(o&&n.origin!=null)if(typeof n.origin=="number")a=n.origin;else{var l=typeof n.origin=="string"?dt(n.origin):n.origin;a=l.r,s=l.c}var u,c={s:{c:0,r:0},e:{c:s,r:a+t.length-1+i}};if(o["!ref"]){var f=Xe(o["!ref"]);c.e.c=Math.max(c.e.c,f.e.c),c.e.r=Math.max(c.e.r,f.e.r),a==-1&&(a=f.e.r+1,c.e.r=a+t.length-1+i)}else a==-1&&(a=0,c.e.r=t.length-1+i);var d=n.header||[],h=0;t.forEach(function(p,g){Tt(p).forEach(function(v){(h=d.indexOf(v))==-1&&(d[h=d.length]=v);var w=p[v],y="z",E="",b=Ue({c:s+h,r:a+g+i});u=ja(o,b),w&&typeof w=="object"&&!(w instanceof Date)?o[b]=w:(typeof w=="number"?y="n":typeof w=="boolean"?y="b":typeof w=="string"?y="s":w instanceof Date?(y="d",n.cellDates||(y="n",w=Xt(w)),E=n.dateNF||rt[14]):w===null&&n.nullError&&(y="e",w=0),u?(u.t=y,u.v=w,delete u.w,delete u.R,E&&(u.z=E)):o[b]=u={t:y,v:w},E&&(u.z=E))})}),c.e.c=Math.max(c.e.c,s+d.length-1);var m=_t(a);if(i)for(h=0;h=0&&e.SheetNames.length>t)return t;throw new Error("Cannot find sheet # "+t)}else if(typeof t=="string"){var r=e.SheetNames.indexOf(t);if(r>-1)return r;throw new Error("Cannot find sheet name |"+t+"|")}else throw new Error("Cannot find sheet |"+t+"|")}function K6(){return{SheetNames:[],Sheets:{}}}function Y6(e,t,r,n){var i=1;if(!r)for(;i<=65535&&e.SheetNames.indexOf(r="Sheet"+i)!=-1;++i,r=void 0);if(!r||e.SheetNames.length>=65535)throw new Error("Too many worksheets");if(n&&e.SheetNames.indexOf(r)>=0){var o=r.match(/(^.*?)(\d+)$/);i=o&&+o[2]||0;var a=o&&o[1]||r;for(++i;i<=65535&&e.SheetNames.indexOf(r=a+i)!=-1;++i);}if(Ww(r),e.SheetNames.indexOf(r)>=0)throw new Error("Worksheet with name |"+r+"| already exists!");return e.SheetNames.push(r),e.Sheets[r]=t,r}function q6(e,t,r){e.Workbook||(e.Workbook={}),e.Workbook.Sheets||(e.Workbook.Sheets=[]);var n=X6(e,t);switch(e.Workbook.Sheets[n]||(e.Workbook.Sheets[n]={}),r){case 0:case 1:case 2:break;default:throw new Error("Bad sheet visibility setting "+r)}e.Workbook.Sheets[n].Hidden=r}function Q6(e,t){return e.z=t,e}function t2(e,t,r){return t?(e.l={Target:t},r&&(e.l.Tooltip=r)):delete e.l,e}function Z6(e,t,r){return t2(e,"#"+t,r)}function J6(e,t,r){e.c||(e.c=[]),e.c.push({t,a:r||"SheetJS"})}function eP(e,t,r,n){for(var i=typeof t!="string"?t:Xe(t),o=typeof t=="string"?t:ot(t),a=i.s.r;a<=i.e.r;++a)for(var s=i.s.c;s<=i.e.c;++s){var l=ja(e,a,s);l.t="n",l.F=o,delete l.v,a==i.s.r&&s==i.s.c&&(l.f=r,n&&(l.D=!0))}return e}var Uc={encode_col:Ft,encode_row:_t,encode_cell:Ue,encode_range:ot,decode_col:Ud,decode_row:Bd,split_cell:p3,decode_cell:dt,decode_range:tr,format_cell:on,sheet_add_aoa:tw,sheet_add_json:e2,sheet_add_dom:Kw,aoa_to_sheet:Fo,json_to_sheet:j6,table_to_sheet:Yw,table_to_book:S6,sheet_to_csv:Qd,sheet_to_txt:Jw,sheet_to_json:Kl,sheet_to_html:Xw,sheet_to_formulae:G6,sheet_to_row_object_array:Kl,sheet_get_cell:ja,book_new:K6,book_append_sheet:Y6,book_set_sheet_visibility:q6,cell_set_number_format:Q6,cell_set_hyperlink:t2,cell_set_internal_link:Z6,cell_add_comment:J6,sheet_set_array_formula:eP,consts:{SHEET_VISIBLE:0,SHEET_HIDDEN:1,SHEET_VERY_HIDDEN:2}};function t0(e){if(typeof e=="string"){const t=e.replace(/[^a-zA-Z]/g,"").trim(),r=["","K","M","B","T"].indexOf(t.replace(/\s/g,""));e=Number(e.replace(/[^0-9.]/g,"").trim())*Math.pow(10,r*3)}return e}function tP(e,t){var r;if(typeof e=="string"&&(e=Number(t0(e))),e%1!==0){const n=Math.max(2,((r=e.toString().split(".")[1])==null?void 0:r.length)||0),i=Math.min(4,n);if(e<5)return e.toFixed(i)||0;e=Number(e.toFixed(2))}if((e>1e5||e<-1e5)&&!n2(t||"")){const n=Math.min(4,Math.floor(Math.log10(Math.abs(e))/3)),i=["","K","M","B","T"][n];return`${(e/10**(n*3)).toFixed(3).replace(/\.?0+$/,"")} ${i}`}return e>1e3||e<-1e3?r2(e):e}function r2(e){if(e>1e3||e<-1e3){const t=e.toString().split("."),r=t[0].replace(/\B(?=(\d{3})+(?!\d))/g,","),n=t[1]?`.${t[1]}`:"";return`${r}${n}`}return e}function Yl(e){return["date","day","time","timestamp","year"].some(t=>e==null?void 0:e.toLowerCase().includes(t))}function n2(e){return["price","open","close"].some(t=>e==null?void 0:e.toLowerCase().includes(t))}function Ki(e,t){const r=window.document.getElementById("loading"),n=window.document.getElementById("loading_text");return new Promise(i=>{t?r.classList.remove("show"):(n.innerHTML=e,r.classList.add("show"));const o=setInterval(function(){(t?!r.classList.contains("show"):r.classList.contains("show"))&&(clearInterval(o),i(!0))},.01)})}function rP(e,t){if(e===t)return!0;if(e==null||t==null||(e==null?void 0:e.length)!==(t==null?void 0:t.length))return!1;for(let r=0;r<(e==null?void 0:e.length);++r)if(e[r]!==t[r])return!1;return!0}const nP=(e,t,r,n)=>{const i=n4(e.getValue(t),r);return n(i),i},iP=async({fileHandle:e,blob:t})=>{e&&await oP({fileHandle:e,blob:t})},oP=async({fileHandle:e,blob:t})=>{const r=await e.createWritable();await r.write(t),await r.close()},aP=[{description:"PNG Image",accept:{"image/png":[".png"]}},{description:"JPEG Image",accept:{"image/jpeg":[".jpeg"]}}],i2=({filename:e,is_image:t})=>{try{if("showSaveFilePicker"in window){const r={suggestedName:e,types:t?aP:[{description:"CSV File",accept:{"image/csv":[".csv"]}}],excludeAcceptAllOption:!0};return showSaveFilePicker(r)}}catch(r){console.error(r)}return new Promise(r=>{r(null)})},o2=(e,t,r)=>{try{if(r===null)throw new Error("Cannot access filesystem");iP({fileHandle:r,blob:e})}catch(n){console.error("oops, something went wrong!",n);const i=URL.createObjectURL(e),o=document.createElement("a");o.setAttribute("href",i),o.setAttribute("download",t),o.style.visibility="hidden",document.body.appendChild(o),o.click(),document.body.removeChild(o)}return new Promise(n=>{n(!0)})};async function Qg(e,t,r,n){const i=t,o=r.map(u=>i.map(c=>u[c])),a=[i,...o];if(e==="csv"){const u=a.map(d=>d.join(",")).join(` +`),c=new Blob([u],{type:"text/csv;charset=utf-8;"}),f=`${window.title}.csv`;try{const d=await i2({filename:f});let h="csv";d!==null&&(h=d.name.split(".").pop()),await Ki(`Saving ${h.toUpperCase()}`),r0(async function(){o2(c,f,d).then(async function(){await new Promise(m=>setTimeout(m,1500)),await Ki("",!0),d||n(!0)})},2)()}catch(d){console.error(d)}return}const s=Uc.book_new(),l=Uc.aoa_to_sheet(a);Uc.book_append_sheet(s,l,"Sheet1"),await Ki("Saving XLSX"),r0(async function(){await new Promise(u=>setTimeout(u,1500)),V6(s,`${window.title}.xlsx`),await Ki("",!0),n==null||n(!0)},2)()}async function sP(e,t){const r=document.getElementById(e),n=`${window.title}.png`;try{const i=await i2({filename:n,is_image:!0});let o="png";i!==null&&(o=i.name.split(".").pop()),await Ki(`Saving ${o.toUpperCase()}`),r0(async function(){c4.toBlob(r).then(function(a){o2(a,n,i).then(async function(){await new Promise(s=>setTimeout(s,1500)),await Ki("",!0),i||t(!0)})})},2)()}catch(i){console.error(i)}}const r0=(e,t)=>{let r;return function(){const n=this,i=arguments;clearTimeout(r),r=setTimeout(()=>e.apply(n,i),t)}},ql=({title:e,titleId:t,...r})=>X("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,...r,children:X("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18L18 6M6 6l12 12"})});function Zg(e,[t,r]){return Math.min(r,Math.max(t,e))}function Fu(e){const t=e+"CollectionProvider",[r,n]=ln(t),[i,o]=r(t,{collectionRef:{current:null},itemMap:new Map}),a=h=>{const{scope:m,children:p}=h,g=or.useRef(null),v=or.useRef(new Map).current;return or.createElement(i,{scope:m,itemMap:v,collectionRef:g},p)},s=e+"CollectionSlot",l=or.forwardRef((h,m)=>{const{scope:p,children:g}=h,v=o(s,p),w=Ve(m,v.collectionRef);return or.createElement(ai,{ref:w},g)}),u=e+"CollectionItemSlot",c="data-radix-collection-item",f=or.forwardRef((h,m)=>{const{scope:p,children:g,...v}=h,w=or.useRef(null),y=Ve(m,w),E=o(u,p);return or.useEffect(()=>(E.itemMap.set(w,{ref:w,...v}),()=>void E.itemMap.delete(w))),or.createElement(ai,{[c]:"",ref:y},g)});function d(h){const m=o(e+"CollectionConsumer",h);return or.useCallback(()=>{const g=m.collectionRef.current;if(!g)return[];const v=Array.from(g.querySelectorAll(`[${c}]`));return Array.from(m.itemMap.values()).sort((E,b)=>v.indexOf(E.ref.current)-v.indexOf(b.ref.current))},[m.collectionRef,m.itemMap])}return[{Provider:a,Slot:l,ItemSlot:f},d,n]}const lP=x.createContext(void 0);function Zd(e){const t=x.useContext(lP);return e||t||"ltr"}function Io(e){return e.split("-")[1]}function Jd(e){return e==="y"?"height":"width"}function Jr(e){return e.split("-")[0]}function Ti(e){return["top","bottom"].includes(Jr(e))?"x":"y"}function Jg(e,t,r){let{reference:n,floating:i}=e;const o=n.x+n.width/2-i.width/2,a=n.y+n.height/2-i.height/2,s=Ti(t),l=Jd(s),u=n[l]/2-i[l]/2,c=s==="x";let f;switch(Jr(t)){case"top":f={x:o,y:n.y-i.height};break;case"bottom":f={x:o,y:n.y+n.height};break;case"right":f={x:n.x+n.width,y:a};break;case"left":f={x:n.x-i.width,y:a};break;default:f={x:n.x,y:n.y}}switch(Io(t)){case"start":f[s]-=u*(r&&c?-1:1);break;case"end":f[s]+=u*(r&&c?-1:1)}return f}const uP=async(e,t,r)=>{const{placement:n="bottom",strategy:i="absolute",middleware:o=[],platform:a}=r,s=o.filter(Boolean),l=await(a.isRTL==null?void 0:a.isRTL(t));let u=await a.getElementRects({reference:e,floating:t,strategy:i}),{x:c,y:f}=Jg(u,n,l),d=n,h={},m=0;for(let p=0;p({name:"arrow",options:e,async fn(t){const{x:r,y:n,placement:i,rects:o,platform:a,elements:s}=t,{element:l,padding:u=0}=an(e,t)||{};if(l==null)return{};const c=a2(u),f={x:r,y:n},d=Ti(i),h=Jd(d),m=await a.getDimensions(l),p=d==="y",g=p?"top":"left",v=p?"bottom":"right",w=p?"clientHeight":"clientWidth",y=o.reference[h]+o.reference[d]-f[d]-o.floating[h],E=f[d]-o.reference[d],b=await(a.getOffsetParent==null?void 0:a.getOffsetParent(l));let k=b?b[w]:0;k&&await(a.isElement==null?void 0:a.isElement(b))||(k=s.floating[w]||o.floating[h]);const S=y/2-E/2,C=k/2-m[h]/2-1,A=Ka(c[g],C),L=Ka(c[v],C),B=A,U=k-m[h]-L,H=k/2-m[h]/2+S,G=n0(B,H,U),ee=Io(i)!=null&&H!=G&&o.reference[h]/2-(He.concat(t,t+"-start",t+"-end"),[]);const cP={left:"right",right:"left",bottom:"top",top:"bottom"};function Zl(e){return e.replace(/left|right|bottom|top/g,t=>cP[t])}function fP(e,t,r){r===void 0&&(r=!1);const n=Io(e),i=Ti(e),o=Jd(i);let a=i==="x"?n===(r?"end":"start")?"right":"left":n==="start"?"bottom":"top";return t.reference[o]>t.floating[o]&&(a=Zl(a)),{main:a,cross:Zl(a)}}const dP={start:"end",end:"start"};function Hc(e){return e.replace(/start|end/g,t=>dP[t])}const hP=function(e){return e===void 0&&(e={}),{name:"flip",options:e,async fn(t){var r;const{placement:n,middlewareData:i,rects:o,initialPlacement:a,platform:s,elements:l}=t,{mainAxis:u=!0,crossAxis:c=!0,fallbackPlacements:f,fallbackStrategy:d="bestFit",fallbackAxisSideDirection:h="none",flipAlignment:m=!0,...p}=an(e,t),g=Jr(n),v=Jr(a)===a,w=await(s.isRTL==null?void 0:s.isRTL(l.floating)),y=f||(v||!m?[Zl(a)]:function(B){const U=Zl(B);return[Hc(B),U,Hc(U)]}(a));f||h==="none"||y.push(...function(B,U,H,G){const ee=Io(B);let ae=function(he,Te,oe){const ye=["left","right"],te=["right","left"],O=["top","bottom"],M=["bottom","top"];switch(he){case"top":case"bottom":return oe?Te?te:ye:Te?ye:te;case"left":case"right":return Te?O:M;default:return[]}}(Jr(B),H==="start",G);return ee&&(ae=ae.map(he=>he+"-"+ee),U&&(ae=ae.concat(ae.map(Hc)))),ae}(a,m,h,w));const E=[a,...y],b=await Xa(t,p),k=[];let S=((r=i.flip)==null?void 0:r.overflows)||[];if(u&&k.push(b[g]),c){const{main:B,cross:U}=fP(n,o,w);k.push(b[B],b[U])}if(S=[...S,{placement:n,overflows:k}],!k.every(B=>B<=0)){var C,A;const B=(((C=i.flip)==null?void 0:C.index)||0)+1,U=E[B];if(U)return{data:{index:B,overflows:S},reset:{placement:U}};let H=(A=S.filter(G=>G.overflows[0]<=0).sort((G,ee)=>G.overflows[1]-ee.overflows[1])[0])==null?void 0:A.placement;if(!H)switch(d){case"bestFit":{var L;const G=(L=S.map(ee=>[ee.placement,ee.overflows.filter(ae=>ae>0).reduce((ae,he)=>ae+he,0)]).sort((ee,ae)=>ee[1]-ae[1])[0])==null?void 0:L[0];G&&(H=G);break}case"initialPlacement":H=a}if(n!==H)return{reset:{placement:H}}}return{}}}};function t1(e,t){return{top:e.top-t.height,right:e.right-t.width,bottom:e.bottom-t.height,left:e.left-t.width}}function r1(e){return s2.some(t=>e[t]>=0)}const pP=function(e){return e===void 0&&(e={}),{name:"hide",options:e,async fn(t){const{rects:r}=t,{strategy:n="referenceHidden",...i}=an(e,t);switch(n){case"referenceHidden":{const o=t1(await Xa(t,{...i,elementContext:"reference"}),r.reference);return{data:{referenceHiddenOffsets:o,referenceHidden:r1(o)}}}case"escaped":{const o=t1(await Xa(t,{...i,altBoundary:!0}),r.floating);return{data:{escapedOffsets:o,escaped:r1(o)}}}default:return{}}}}},gP=function(e){return e===void 0&&(e=0),{name:"offset",options:e,async fn(t){const{x:r,y:n}=t,i=await async function(o,a){const{placement:s,platform:l,elements:u}=o,c=await(l.isRTL==null?void 0:l.isRTL(u.floating)),f=Jr(s),d=Io(s),h=Ti(s)==="x",m=["left","top"].includes(f)?-1:1,p=c&&h?-1:1,g=an(a,o);let{mainAxis:v,crossAxis:w,alignmentAxis:y}=typeof g=="number"?{mainAxis:g,crossAxis:0,alignmentAxis:null}:{mainAxis:0,crossAxis:0,alignmentAxis:null,...g};return d&&typeof y=="number"&&(w=d==="end"?-1*y:y),h?{x:w*p,y:v*m}:{x:v*m,y:w*p}}(t,e);return{x:r+i.x,y:n+i.y,data:i}}}};function l2(e){return e==="x"?"y":"x"}const mP=function(e){return e===void 0&&(e={}),{name:"shift",options:e,async fn(t){const{x:r,y:n,placement:i}=t,{mainAxis:o=!0,crossAxis:a=!1,limiter:s={fn:g=>{let{x:v,y:w}=g;return{x:v,y:w}}},...l}=an(e,t),u={x:r,y:n},c=await Xa(t,l),f=Ti(Jr(i)),d=l2(f);let h=u[f],m=u[d];if(o){const g=f==="y"?"bottom":"right";h=n0(h+c[f==="y"?"top":"left"],h,h-c[g])}if(a){const g=d==="y"?"bottom":"right";m=n0(m+c[d==="y"?"top":"left"],m,m-c[g])}const p=s.fn({...t,[f]:h,[d]:m});return{...p,data:{x:p.x-r,y:p.y-n}}}}},vP=function(e){return e===void 0&&(e={}),{options:e,fn(t){const{x:r,y:n,placement:i,rects:o,middlewareData:a}=t,{offset:s=0,mainAxis:l=!0,crossAxis:u=!0}=an(e,t),c={x:r,y:n},f=Ti(i),d=l2(f);let h=c[f],m=c[d];const p=an(s,t),g=typeof p=="number"?{mainAxis:p,crossAxis:0}:{mainAxis:0,crossAxis:0,...p};if(l){const y=f==="y"?"height":"width",E=o.reference[f]-o.floating[y]+g.mainAxis,b=o.reference[f]+o.reference[y]-g.mainAxis;hb&&(h=b)}if(u){var v,w;const y=f==="y"?"width":"height",E=["top","left"].includes(Jr(i)),b=o.reference[d]-o.floating[y]+(E&&((v=a.offset)==null?void 0:v[d])||0)+(E?0:g.crossAxis),k=o.reference[d]+o.reference[y]+(E?0:((w=a.offset)==null?void 0:w[d])||0)-(E?g.crossAxis:0);mk&&(m=k)}return{[f]:h,[d]:m}}}},xP=function(e){return e===void 0&&(e={}),{name:"size",options:e,async fn(t){const{placement:r,rects:n,platform:i,elements:o}=t,{apply:a=()=>{},...s}=an(e,t),l=await Xa(t,s),u=Jr(r),c=Io(r),f=Ti(r)==="x",{width:d,height:h}=n.floating;let m,p;u==="top"||u==="bottom"?(m=u,p=c===(await(i.isRTL==null?void 0:i.isRTL(o.floating))?"start":"end")?"left":"right"):(p=u,m=c==="end"?"top":"bottom");const g=h-l[m],v=d-l[p],w=!t.middlewareData.shift;let y=g,E=v;if(f){const k=d-l.left-l.right;E=c||w?Ka(v,k):k}else{const k=h-l.top-l.bottom;y=c||w?Ka(g,k):k}if(w&&!c){const k=Xn(l.left,0),S=Xn(l.right,0),C=Xn(l.top,0),A=Xn(l.bottom,0);f?E=d-2*(k!==0||S!==0?k+S:Xn(l.left,l.right)):y=h-2*(C!==0||A!==0?C+A:Xn(l.top,l.bottom))}await a({...t,availableWidth:E,availableHeight:y});const b=await i.getDimensions(o.floating);return d!==b.width||h!==b.height?{reset:{rects:!0}}:{}}}};function Jt(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function Nr(e){return Jt(e).getComputedStyle(e)}function u2(e){return e instanceof Jt(e).Node}function Bn(e){return u2(e)?(e.nodeName||"").toLowerCase():"#document"}function Ar(e){return e instanceof HTMLElement||e instanceof Jt(e).HTMLElement}function n1(e){return typeof ShadowRoot<"u"&&(e instanceof Jt(e).ShadowRoot||e instanceof ShadowRoot)}function Ya(e){const{overflow:t,overflowX:r,overflowY:n,display:i}=Nr(e);return/auto|scroll|overlay|hidden|clip/.test(t+n+r)&&!["inline","contents"].includes(i)}function wP(e){return["table","td","th"].includes(Bn(e))}function i0(e){const t=eh(),r=Nr(e);return r.transform!=="none"||r.perspective!=="none"||!!r.containerType&&r.containerType!=="normal"||!t&&!!r.backdropFilter&&r.backdropFilter!=="none"||!t&&!!r.filter&&r.filter!=="none"||["transform","perspective","filter"].some(n=>(r.willChange||"").includes(n))||["paint","layout","strict","content"].some(n=>(r.contain||"").includes(n))}function eh(){return!(typeof CSS>"u"||!CSS.supports)&&CSS.supports("-webkit-backdrop-filter","none")}function Du(e){return["html","body","#document"].includes(Bn(e))}const o0=Math.min,co=Math.max,Jl=Math.round,Ws=Math.floor,Un=e=>({x:e,y:e});function c2(e){const t=Nr(e);let r=parseFloat(t.width)||0,n=parseFloat(t.height)||0;const i=Ar(e),o=i?e.offsetWidth:r,a=i?e.offsetHeight:n,s=Jl(r)!==o||Jl(n)!==a;return s&&(r=o,n=a),{width:r,height:n,$:s}}function en(e){return e instanceof Element||e instanceof Jt(e).Element}function th(e){return en(e)?e:e.contextElement}function fo(e){const t=th(e);if(!Ar(t))return Un(1);const r=t.getBoundingClientRect(),{width:n,height:i,$:o}=c2(t);let a=(o?Jl(r.width):r.width)/n,s=(o?Jl(r.height):r.height)/i;return a&&Number.isFinite(a)||(a=1),s&&Number.isFinite(s)||(s=1),{x:a,y:s}}const yP=Un(0);function f2(e){const t=Jt(e);return eh()&&t.visualViewport?{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}:yP}function ci(e,t,r,n){t===void 0&&(t=!1),r===void 0&&(r=!1);const i=e.getBoundingClientRect(),o=th(e);let a=Un(1);t&&(n?en(n)&&(a=fo(n)):a=fo(e));const s=function(d,h,m){return h===void 0&&(h=!1),!(!m||h&&m!==Jt(d))&&h}(o,r,n)?f2(o):Un(0);let l=(i.left+s.x)/a.x,u=(i.top+s.y)/a.y,c=i.width/a.x,f=i.height/a.y;if(o){const d=Jt(o),h=n&&en(n)?Jt(n):n;let m=d.frameElement;for(;m&&n&&h!==d;){const p=fo(m),g=m.getBoundingClientRect(),v=getComputedStyle(m),w=g.left+(m.clientLeft+parseFloat(v.paddingLeft))*p.x,y=g.top+(m.clientTop+parseFloat(v.paddingTop))*p.y;l*=p.x,u*=p.y,c*=p.x,f*=p.y,l+=w,u+=y,m=Jt(m).frameElement}}return Ql({width:c,height:f,x:l,y:u})}function Pu(e){return en(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function tn(e){var t;return(t=(u2(e)?e.ownerDocument:e.document)||window.document)==null?void 0:t.documentElement}function d2(e){return ci(tn(e)).left+Pu(e).scrollLeft}function wo(e){if(Bn(e)==="html")return e;const t=e.assignedSlot||e.parentNode||n1(e)&&e.host||tn(e);return n1(t)?t.host:t}function h2(e){const t=wo(e);return Du(t)?e.ownerDocument?e.ownerDocument.body:e.body:Ar(t)&&Ya(t)?t:h2(t)}function eu(e,t){var r;t===void 0&&(t=[]);const n=h2(e),i=n===((r=e.ownerDocument)==null?void 0:r.body),o=Jt(n);return i?t.concat(o,o.visualViewport||[],Ya(n)?n:[]):t.concat(n,eu(n))}function i1(e,t,r){let n;if(t==="viewport")n=function(i,o){const a=Jt(i),s=tn(i),l=a.visualViewport;let u=s.clientWidth,c=s.clientHeight,f=0,d=0;if(l){u=l.width,c=l.height;const h=eh();(!h||h&&o==="fixed")&&(f=l.offsetLeft,d=l.offsetTop)}return{width:u,height:c,x:f,y:d}}(e,r);else if(t==="document")n=function(i){const o=tn(i),a=Pu(i),s=i.ownerDocument.body,l=co(o.scrollWidth,o.clientWidth,s.scrollWidth,s.clientWidth),u=co(o.scrollHeight,o.clientHeight,s.scrollHeight,s.clientHeight);let c=-a.scrollLeft+d2(i);const f=-a.scrollTop;return Nr(s).direction==="rtl"&&(c+=co(o.clientWidth,s.clientWidth)-l),{width:l,height:u,x:c,y:f}}(tn(e));else if(en(t))n=function(i,o){const a=ci(i,!0,o==="fixed"),s=a.top+i.clientTop,l=a.left+i.clientLeft,u=Ar(i)?fo(i):Un(1);return{width:i.clientWidth*u.x,height:i.clientHeight*u.y,x:l*u.x,y:s*u.y}}(t,r);else{const i=f2(e);n={...t,x:t.x-i.x,y:t.y-i.y}}return Ql(n)}function p2(e,t){const r=wo(e);return!(r===t||!en(r)||Du(r))&&(Nr(r).position==="fixed"||p2(r,t))}function EP(e,t,r){const n=Ar(t),i=tn(t),o=r==="fixed",a=ci(e,!0,o,t);let s={scrollLeft:0,scrollTop:0};const l=Un(0);if(n||!n&&!o)if((Bn(t)!=="body"||Ya(i))&&(s=Pu(t)),Ar(t)){const u=ci(t,!0,o,t);l.x=u.x+t.clientLeft,l.y=u.y+t.clientTop}else i&&(l.x=d2(i));return{x:a.left+s.scrollLeft-l.x,y:a.top+s.scrollTop-l.y,width:a.width,height:a.height}}function o1(e,t){return Ar(e)&&Nr(e).position!=="fixed"?t?t(e):e.offsetParent:null}function a1(e,t){const r=Jt(e);if(!Ar(e))return r;let n=o1(e,t);for(;n&&wP(n)&&Nr(n).position==="static";)n=o1(n,t);return n&&(Bn(n)==="html"||Bn(n)==="body"&&Nr(n).position==="static"&&!i0(n))?r:n||function(i){let o=wo(i);for(;Ar(o)&&!Du(o);){if(i0(o))return o;o=wo(o)}return null}(e)||r}const _P={convertOffsetParentRelativeRectToViewportRelativeRect:function(e){let{rect:t,offsetParent:r,strategy:n}=e;const i=Ar(r),o=tn(r);if(r===o)return t;let a={scrollLeft:0,scrollTop:0},s=Un(1);const l=Un(0);if((i||!i&&n!=="fixed")&&((Bn(r)!=="body"||Ya(o))&&(a=Pu(r)),Ar(r))){const u=ci(r);s=fo(r),l.x=u.x+r.clientLeft,l.y=u.y+r.clientTop}return{width:t.width*s.x,height:t.height*s.y,x:t.x*s.x-a.scrollLeft*s.x+l.x,y:t.y*s.y-a.scrollTop*s.y+l.y}},getDocumentElement:tn,getClippingRect:function(e){let{element:t,boundary:r,rootBoundary:n,strategy:i}=e;const o=[...r==="clippingAncestors"?function(l,u){const c=u.get(l);if(c)return c;let f=eu(l).filter(p=>en(p)&&Bn(p)!=="body"),d=null;const h=Nr(l).position==="fixed";let m=h?wo(l):l;for(;en(m)&&!Du(m);){const p=Nr(m),g=i0(m);g||p.position!=="fixed"||(d=null),(h?!g&&!d:!g&&p.position==="static"&&d&&["absolute","fixed"].includes(d.position)||Ya(m)&&!g&&p2(l,m))?f=f.filter(v=>v!==m):d=p,m=wo(m)}return u.set(l,f),f}(t,this._c):[].concat(r),n],a=o[0],s=o.reduce((l,u)=>{const c=i1(t,u,i);return l.top=co(c.top,l.top),l.right=o0(c.right,l.right),l.bottom=o0(c.bottom,l.bottom),l.left=co(c.left,l.left),l},i1(t,a,i));return{width:s.right-s.left,height:s.bottom-s.top,x:s.left,y:s.top}},getOffsetParent:a1,getElementRects:async function(e){let{reference:t,floating:r,strategy:n}=e;const i=this.getOffsetParent||a1,o=this.getDimensions;return{reference:EP(t,await i(r),n),floating:{x:0,y:0,...await o(r)}}},getClientRects:function(e){return Array.from(e.getClientRects())},getDimensions:function(e){return c2(e)},getScale:fo,isElement:en,isRTL:function(e){return getComputedStyle(e).direction==="rtl"}};function SP(e,t,r,n){n===void 0&&(n={});const{ancestorScroll:i=!0,ancestorResize:o=!0,elementResize:a=typeof ResizeObserver=="function",layoutShift:s=typeof IntersectionObserver=="function",animationFrame:l=!1}=n,u=th(e),c=i||o?[...u?eu(u):[],...eu(t)]:[];c.forEach(g=>{i&&g.addEventListener("scroll",r,{passive:!0}),o&&g.addEventListener("resize",r)});const f=u&&s?function(g,v){let w,y=null;const E=tn(g);function b(){clearTimeout(w),y&&y.disconnect(),y=null}return function k(S,C){S===void 0&&(S=!1),C===void 0&&(C=1),b();const{left:A,top:L,width:B,height:U}=g.getBoundingClientRect();if(S||v(),!B||!U)return;const H={rootMargin:-Ws(L)+"px "+-Ws(E.clientWidth-(A+B))+"px "+-Ws(E.clientHeight-(L+U))+"px "+-Ws(A)+"px",threshold:co(0,o0(1,C))||1};let G=!0;function ee(ae){const he=ae[0].intersectionRatio;if(he!==C){if(!G)return k();he?k(!1,he):w=setTimeout(()=>{k(!1,1e-7)},100)}G=!1}try{y=new IntersectionObserver(ee,{...H,root:E.ownerDocument})}catch{y=new IntersectionObserver(ee,H)}y.observe(g)}(!0),b}(u,r):null;let d,h=-1,m=null;a&&(m=new ResizeObserver(g=>{let[v]=g;v&&v.target===u&&m&&(m.unobserve(t),cancelAnimationFrame(h),h=requestAnimationFrame(()=>{m&&m.observe(t)})),r()}),u&&!l&&m.observe(u),m.observe(t));let p=l?ci(e):null;return l&&function g(){const v=ci(e);!p||v.x===p.x&&v.y===p.y&&v.width===p.width&&v.height===p.height||r(),p=v,d=requestAnimationFrame(g)}(),r(),()=>{c.forEach(g=>{i&&g.removeEventListener("scroll",r),o&&g.removeEventListener("resize",r)}),f&&f(),m&&m.disconnect(),m=null,l&&cancelAnimationFrame(d)}}const TP=(e,t,r)=>{const n=new Map,i={platform:_P,...r},o={...i.platform,_c:n};return uP(e,t,{...i,platform:o})},CP=e=>{function t(r){return{}.hasOwnProperty.call(r,"current")}return{name:"arrow",options:e,fn(r){const{element:n,padding:i}=typeof e=="function"?e(r):e;return n&&t(n)?n.current!=null?e1({element:n.current,padding:i}).fn(r):{}:n?e1({element:n,padding:i}).fn(r):{}}}};var ll=typeof document<"u"?x.useLayoutEffect:x.useEffect;function tu(e,t){if(e===t)return!0;if(typeof e!=typeof t)return!1;if(typeof e=="function"&&e.toString()===t.toString())return!0;let r,n,i;if(e&&t&&typeof e=="object"){if(Array.isArray(e)){if(r=e.length,r!=t.length)return!1;for(n=r;n--!==0;)if(!tu(e[n],t[n]))return!1;return!0}if(i=Object.keys(e),r=i.length,r!==Object.keys(t).length)return!1;for(n=r;n--!==0;)if(!{}.hasOwnProperty.call(t,i[n]))return!1;for(n=r;n--!==0;){const o=i[n];if(!(o==="_owner"&&e.$$typeof)&&!tu(e[o],t[o]))return!1}return!0}return e!==e&&t!==t}function g2(e){return typeof window>"u"?1:(e.ownerDocument.defaultView||window).devicePixelRatio||1}function s1(e,t){const r=g2(e);return Math.round(t*r)/r}function l1(e){const t=x.useRef(e);return ll(()=>{t.current=e}),t}function AP(e){e===void 0&&(e={});const{placement:t="bottom",strategy:r="absolute",middleware:n=[],platform:i,elements:{reference:o,floating:a}={},transform:s=!0,whileElementsMounted:l,open:u}=e,[c,f]=x.useState({x:0,y:0,strategy:r,placement:t,middlewareData:{},isPositioned:!1}),[d,h]=x.useState(n);tu(d,n)||h(n);const[m,p]=x.useState(null),[g,v]=x.useState(null),w=x.useCallback(ae=>{ae!=k.current&&(k.current=ae,p(ae))},[p]),y=x.useCallback(ae=>{ae!==S.current&&(S.current=ae,v(ae))},[v]),E=o||m,b=a||g,k=x.useRef(null),S=x.useRef(null),C=x.useRef(c),A=l1(l),L=l1(i),B=x.useCallback(()=>{if(!k.current||!S.current)return;const ae={placement:t,strategy:r,middleware:d};L.current&&(ae.platform=L.current),TP(k.current,S.current,ae).then(he=>{const Te={...he,isPositioned:!0};U.current&&!tu(C.current,Te)&&(C.current=Te,mi.flushSync(()=>{f(Te)}))})},[d,t,r,L]);ll(()=>{u===!1&&C.current.isPositioned&&(C.current.isPositioned=!1,f(ae=>({...ae,isPositioned:!1})))},[u]);const U=x.useRef(!1);ll(()=>(U.current=!0,()=>{U.current=!1}),[]),ll(()=>{if(E&&(k.current=E),b&&(S.current=b),E&&b){if(A.current)return A.current(E,b,B);B()}},[E,b,B,A]);const H=x.useMemo(()=>({reference:k,floating:S,setReference:w,setFloating:y}),[w,y]),G=x.useMemo(()=>({reference:E,floating:b}),[E,b]),ee=x.useMemo(()=>{const ae={position:r,left:0,top:0};if(!G.floating)return ae;const he=s1(G.floating,c.x),Te=s1(G.floating,c.y);return s?{...ae,transform:"translate("+he+"px, "+Te+"px)",...g2(G.floating)>=1.5&&{willChange:"transform"}}:{position:r,left:he,top:Te}},[r,s,G.floating,c.x,c.y]);return x.useMemo(()=>({...c,update:B,refs:H,elements:G,floatingStyles:ee}),[c,B,H,G,ee])}function RP(e){const[t,r]=x.useState(void 0);return Bt(()=>{if(e){r({width:e.offsetWidth,height:e.offsetHeight});const n=new ResizeObserver(i=>{if(!Array.isArray(i)||!i.length)return;const o=i[0];let a,s;if("borderBoxSize"in o){const l=o.borderBoxSize,u=Array.isArray(l)?l[0]:l;a=u.inlineSize,s=u.blockSize}else a=e.offsetWidth,s=e.offsetHeight;r({width:a,height:s})});return n.observe(e,{box:"border-box"}),()=>n.unobserve(e)}else r(void 0)},[e]),t}const m2="Popper",[v2,Iu]=ln(m2),[OP,x2]=v2(m2),FP=e=>{const{__scopePopper:t,children:r}=e,[n,i]=x.useState(null);return x.createElement(OP,{scope:t,anchor:n,onAnchorChange:i},r)},DP="PopperAnchor",PP=x.forwardRef((e,t)=>{const{__scopePopper:r,virtualRef:n,...i}=e,o=x2(DP,r),a=x.useRef(null),s=Ve(t,a);return x.useEffect(()=>{o.onAnchorChange((n==null?void 0:n.current)||a.current)}),n?null:x.createElement(Ie.div,ge({},i,{ref:s}))}),w2="PopperContent",[IP,r$]=v2(w2),bP=x.forwardRef((e,t)=>{var r,n,i,o,a,s,l,u;const{__scopePopper:c,side:f="bottom",sideOffset:d=0,align:h="center",alignOffset:m=0,arrowPadding:p=0,collisionBoundary:g=[],collisionPadding:v=0,sticky:w="partial",hideWhenDetached:y=!1,avoidCollisions:E=!0,onPlaced:b,...k}=e,S=x2(w2,c),[C,A]=x.useState(null),L=Ve(t,ne=>A(ne)),[B,U]=x.useState(null),H=RP(B),G=(r=H==null?void 0:H.width)!==null&&r!==void 0?r:0,ee=(n=H==null?void 0:H.height)!==null&&n!==void 0?n:0,ae=f+(h!=="center"?"-"+h:""),he=typeof v=="number"?v:{top:0,right:0,bottom:0,left:0,...v},Te=Array.isArray(g)?g:[g],oe=Te.length>0,ye={padding:he,boundary:Te.filter(kP),altBoundary:oe},{refs:te,floatingStyles:O,placement:M,isPositioned:N,middlewareData:F}=AP({strategy:"fixed",placement:ae,whileElementsMounted:SP,elements:{reference:S.anchor},middleware:[gP({mainAxis:d+ee,alignmentAxis:m}),E&&mP({mainAxis:!0,crossAxis:!1,limiter:w==="partial"?vP():void 0,...ye}),E&&hP({...ye}),xP({...ye,apply:({elements:ne,rects:$e,availableWidth:Pe,availableHeight:ve})=>{const{width:ut,height:gt}=$e.reference,bt=ne.floating.style;bt.setProperty("--radix-popper-available-width",`${Pe}px`),bt.setProperty("--radix-popper-available-height",`${ve}px`),bt.setProperty("--radix-popper-anchor-width",`${ut}px`),bt.setProperty("--radix-popper-anchor-height",`${gt}px`)}}),B&&CP({element:B,padding:p}),$P({arrowWidth:G,arrowHeight:ee}),y&&pP({strategy:"referenceHidden"})]}),[V,Y]=y2(M),J=It(b);Bt(()=>{N&&(J==null||J())},[N,J]);const W=(i=F.arrow)===null||i===void 0?void 0:i.x,Q=(o=F.arrow)===null||o===void 0?void 0:o.y,le=((a=F.arrow)===null||a===void 0?void 0:a.centerOffset)!==0,[me,Se]=x.useState();return Bt(()=>{C&&Se(window.getComputedStyle(C).zIndex)},[C]),x.createElement("div",{ref:te.setFloating,"data-radix-popper-content-wrapper":"",style:{...O,transform:N?O.transform:"translate(0, -200%)",minWidth:"max-content",zIndex:me,"--radix-popper-transform-origin":[(s=F.transformOrigin)===null||s===void 0?void 0:s.x,(l=F.transformOrigin)===null||l===void 0?void 0:l.y].join(" ")},dir:e.dir},x.createElement(IP,{scope:c,placedSide:V,onArrowChange:U,arrowX:W,arrowY:Q,shouldHideArrow:le},x.createElement(Ie.div,ge({"data-side":V,"data-align":Y},k,{ref:L,style:{...k.style,animation:N?void 0:"none",opacity:(u=F.hide)!==null&&u!==void 0&&u.referenceHidden?0:void 0}}))))});function kP(e){return e!==null}const $P=e=>({name:"transformOrigin",options:e,fn(t){var r,n,i,o,a;const{placement:s,rects:l,middlewareData:u}=t,f=((r=u.arrow)===null||r===void 0?void 0:r.centerOffset)!==0,d=f?0:e.arrowWidth,h=f?0:e.arrowHeight,[m,p]=y2(s),g={start:"0%",center:"50%",end:"100%"}[p],v=((n=(i=u.arrow)===null||i===void 0?void 0:i.x)!==null&&n!==void 0?n:0)+d/2,w=((o=(a=u.arrow)===null||a===void 0?void 0:a.y)!==null&&o!==void 0?o:0)+h/2;let y="",E="";return m==="bottom"?(y=f?g:`${v}px`,E=`${-h}px`):m==="top"?(y=f?g:`${v}px`,E=`${l.floating.height+h}px`):m==="right"?(y=`${-h}px`,E=f?g:`${w}px`):m==="left"&&(y=`${l.floating.width+h}px`,E=f?g:`${w}px`),{data:{x:y,y:E}}}});function y2(e){const[t,r="center"]=e.split("-");return[t,r]}const E2=FP,_2=PP,S2=bP;function NP(e){const t=x.useRef({value:e,previous:e});return x.useMemo(()=>(t.current.value!==e&&(t.current.previous=t.current.value,t.current.value=e),t.current.previous),[e])}const rh=x.forwardRef((e,t)=>x.createElement(Ie.span,ge({},e,{ref:t,style:{position:"absolute",border:0,width:1,height:1,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",wordWrap:"normal",...e.style}}))),MP=[" ","Enter","ArrowUp","ArrowDown"],LP=[" ","Enter"],bu="Select",[ku,$u,BP]=Fu(bu),[bo,n$]=ln(bu,[BP,Iu]),nh=Iu(),[UP,Ci]=bo(bu),[HP,VP]=bo(bu),WP=e=>{const{__scopeSelect:t,children:r,open:n,defaultOpen:i,onOpenChange:o,value:a,defaultValue:s,onValueChange:l,dir:u,name:c,autoComplete:f,disabled:d,required:h}=e,m=nh(t),[p,g]=x.useState(null),[v,w]=x.useState(null),[y,E]=x.useState(!1),b=Zd(u),[k=!1,S]=vo({prop:n,defaultProp:i,onChange:o}),[C,A]=vo({prop:a,defaultProp:s,onChange:l}),L=x.useRef(null),B=p?!!p.closest("form"):!0,[U,H]=x.useState(new Set),G=Array.from(U).map(ee=>ee.props.value).join(";");return x.createElement(E2,m,x.createElement(UP,{required:h,scope:t,trigger:p,onTriggerChange:g,valueNode:v,onValueNodeChange:w,valueNodeHasChildren:y,onValueNodeHasChildrenChange:E,contentId:Yr(),value:C,onValueChange:A,open:k,onOpenChange:S,dir:b,triggerPointerDownPosRef:L,disabled:d},x.createElement(ku.Provider,{scope:t},x.createElement(HP,{scope:e.__scopeSelect,onNativeOptionAdd:x.useCallback(ee=>{H(ae=>new Set(ae).add(ee))},[]),onNativeOptionRemove:x.useCallback(ee=>{H(ae=>{const he=new Set(ae);return he.delete(ee),he})},[])},r)),B?x.createElement(R2,{key:G,"aria-hidden":!0,required:h,tabIndex:-1,name:c,autoComplete:f,value:C,onChange:ee=>A(ee.target.value),disabled:d},C===void 0?x.createElement("option",{value:""}):null,Array.from(U)):null))},zP="SelectTrigger",GP=x.forwardRef((e,t)=>{const{__scopeSelect:r,disabled:n=!1,...i}=e,o=nh(r),a=Ci(zP,r),s=a.disabled||n,l=Ve(t,a.onTriggerChange),u=$u(r),[c,f,d]=O2(m=>{const p=u().filter(w=>!w.disabled),g=p.find(w=>w.value===a.value),v=F2(p,m,g);v!==void 0&&a.onValueChange(v.value)}),h=()=>{s||(a.onOpenChange(!0),d())};return x.createElement(_2,ge({asChild:!0},o),x.createElement(Ie.button,ge({type:"button",role:"combobox","aria-controls":a.contentId,"aria-expanded":a.open,"aria-required":a.required,"aria-autocomplete":"none",dir:a.dir,"data-state":a.open?"open":"closed",disabled:s,"data-disabled":s?"":void 0,"data-placeholder":a.value===void 0?"":void 0},i,{ref:l,onClick:_e(i.onClick,m=>{m.currentTarget.focus()}),onPointerDown:_e(i.onPointerDown,m=>{const p=m.target;p.hasPointerCapture(m.pointerId)&&p.releasePointerCapture(m.pointerId),m.button===0&&m.ctrlKey===!1&&(h(),a.triggerPointerDownPosRef.current={x:Math.round(m.pageX),y:Math.round(m.pageY)},m.preventDefault())}),onKeyDown:_e(i.onKeyDown,m=>{const p=c.current!=="";!(m.ctrlKey||m.altKey||m.metaKey)&&m.key.length===1&&f(m.key),!(p&&m.key===" ")&&MP.includes(m.key)&&(h(),m.preventDefault())})})))}),jP="SelectValue",XP=x.forwardRef((e,t)=>{const{__scopeSelect:r,className:n,style:i,children:o,placeholder:a,...s}=e,l=Ci(jP,r),{onValueNodeHasChildrenChange:u}=l,c=o!==void 0,f=Ve(t,l.onValueNodeChange);return Bt(()=>{u(c)},[u,c]),x.createElement(Ie.span,ge({},s,{ref:f,style:{pointerEvents:"none"}}),l.value===void 0&&a!==void 0?a:o)}),KP=x.forwardRef((e,t)=>{const{__scopeSelect:r,children:n,...i}=e;return x.createElement(Ie.span,ge({"aria-hidden":!0},i,{ref:t}),n||"▼")}),YP=e=>x.createElement(xu,ge({asChild:!0},e)),yo="SelectContent",qP=x.forwardRef((e,t)=>{const r=Ci(yo,e.__scopeSelect),[n,i]=x.useState();if(Bt(()=>{i(new DocumentFragment)},[]),!r.open){const o=n;return o?mi.createPortal(x.createElement(T2,{scope:e.__scopeSelect},x.createElement(ku.Slot,{scope:e.__scopeSelect},x.createElement("div",null,e.children))),o):null}return x.createElement(QP,ge({},e,{ref:t}))}),Vr=10,[T2,Ai]=bo(yo),QP=x.forwardRef((e,t)=>{const{__scopeSelect:r,position:n="item-aligned",onCloseAutoFocus:i,onEscapeKeyDown:o,onPointerDownOutside:a,side:s,sideOffset:l,align:u,alignOffset:c,arrowPadding:f,collisionBoundary:d,collisionPadding:h,sticky:m,hideWhenDetached:p,avoidCollisions:g,...v}=e,w=Ci(yo,r),[y,E]=x.useState(null),[b,k]=x.useState(null),S=Ve(t,Y=>E(Y)),[C,A]=x.useState(null),[L,B]=x.useState(null),U=$u(r),[H,G]=x.useState(!1),ee=x.useRef(!1);x.useEffect(()=>{if(y)return Sd(y)},[y]),Ed();const ae=x.useCallback(Y=>{const[J,...W]=U().map(me=>me.ref.current),[Q]=W.slice(-1),le=document.activeElement;for(const me of Y)if(me===le||(me==null||me.scrollIntoView({block:"nearest"}),me===J&&b&&(b.scrollTop=0),me===Q&&b&&(b.scrollTop=b.scrollHeight),me==null||me.focus(),document.activeElement!==le))return},[U,b]),he=x.useCallback(()=>ae([C,y]),[ae,C,y]);x.useEffect(()=>{H&&he()},[H,he]);const{onOpenChange:Te,triggerPointerDownPosRef:oe}=w;x.useEffect(()=>{if(y){let Y={x:0,y:0};const J=Q=>{var le,me,Se,ne;Y={x:Math.abs(Math.round(Q.pageX)-((le=(me=oe.current)===null||me===void 0?void 0:me.x)!==null&&le!==void 0?le:0)),y:Math.abs(Math.round(Q.pageY)-((Se=(ne=oe.current)===null||ne===void 0?void 0:ne.y)!==null&&Se!==void 0?Se:0))}},W=Q=>{Y.x<=10&&Y.y<=10?Q.preventDefault():y.contains(Q.target)||Te(!1),document.removeEventListener("pointermove",J),oe.current=null};return oe.current!==null&&(document.addEventListener("pointermove",J),document.addEventListener("pointerup",W,{capture:!0,once:!0})),()=>{document.removeEventListener("pointermove",J),document.removeEventListener("pointerup",W,{capture:!0})}}},[y,Te,oe]),x.useEffect(()=>{const Y=()=>Te(!1);return window.addEventListener("blur",Y),window.addEventListener("resize",Y),()=>{window.removeEventListener("blur",Y),window.removeEventListener("resize",Y)}},[Te]);const[ye,te]=O2(Y=>{const J=U().filter(le=>!le.disabled),W=J.find(le=>le.ref.current===document.activeElement),Q=F2(J,Y,W);Q&&setTimeout(()=>Q.ref.current.focus())}),O=x.useCallback((Y,J,W)=>{const Q=!ee.current&&!W;(w.value!==void 0&&w.value===J||Q)&&(A(Y),Q&&(ee.current=!0))},[w.value]),M=x.useCallback(()=>y==null?void 0:y.focus(),[y]),N=x.useCallback((Y,J,W)=>{const Q=!ee.current&&!W;(w.value!==void 0&&w.value===J||Q)&&B(Y)},[w.value]),F=n==="popper"?u1:ZP,V=F===u1?{side:s,sideOffset:l,align:u,alignOffset:c,arrowPadding:f,collisionBoundary:d,collisionPadding:h,sticky:m,hideWhenDetached:p,avoidCollisions:g}:{};return x.createElement(T2,{scope:r,content:y,viewport:b,onViewportChange:k,itemRefCallback:O,selectedItem:C,onItemLeave:M,itemTextRefCallback:N,focusSelectedItem:he,selectedItemText:L,position:n,isPositioned:H,searchRef:ye},x.createElement(_d,{as:ai,allowPinchZoom:!0},x.createElement(yd,{asChild:!0,trapped:w.open,onMountAutoFocus:Y=>{Y.preventDefault()},onUnmountAutoFocus:_e(i,Y=>{var J;(J=w.trigger)===null||J===void 0||J.focus({preventScroll:!0}),Y.preventDefault()})},x.createElement(vu,{asChild:!0,disableOutsidePointerEvents:!0,onEscapeKeyDown:o,onPointerDownOutside:a,onFocusOutside:Y=>Y.preventDefault(),onDismiss:()=>w.onOpenChange(!1)},x.createElement(F,ge({role:"listbox",id:w.contentId,"data-state":w.open?"open":"closed",dir:w.dir,onContextMenu:Y=>Y.preventDefault()},v,V,{onPlaced:()=>G(!0),ref:S,style:{display:"flex",flexDirection:"column",outline:"none",...v.style},onKeyDown:_e(v.onKeyDown,Y=>{const J=Y.ctrlKey||Y.altKey||Y.metaKey;if(Y.key==="Tab"&&Y.preventDefault(),!J&&Y.key.length===1&&te(Y.key),["ArrowUp","ArrowDown","Home","End"].includes(Y.key)){let Q=U().filter(le=>!le.disabled).map(le=>le.ref.current);if(["ArrowUp","End"].includes(Y.key)&&(Q=Q.slice().reverse()),["ArrowUp","ArrowDown"].includes(Y.key)){const le=Y.target,me=Q.indexOf(le);Q=Q.slice(me+1)}setTimeout(()=>ae(Q)),Y.preventDefault()}})}))))))}),ZP=x.forwardRef((e,t)=>{const{__scopeSelect:r,onPlaced:n,...i}=e,o=Ci(yo,r),a=Ai(yo,r),[s,l]=x.useState(null),[u,c]=x.useState(null),f=Ve(t,S=>c(S)),d=$u(r),h=x.useRef(!1),m=x.useRef(!0),{viewport:p,selectedItem:g,selectedItemText:v,focusSelectedItem:w}=a,y=x.useCallback(()=>{if(o.trigger&&o.valueNode&&s&&u&&p&&g&&v){const S=o.trigger.getBoundingClientRect(),C=u.getBoundingClientRect(),A=o.valueNode.getBoundingClientRect(),L=v.getBoundingClientRect();if(o.dir!=="rtl"){const le=L.left-C.left,me=A.left-le,Se=S.left-me,ne=S.width+Se,$e=Math.max(ne,C.width),Pe=window.innerWidth-Vr,ve=Zg(me,[Vr,Pe-$e]);s.style.minWidth=ne+"px",s.style.left=ve+"px"}else{const le=C.right-L.right,me=window.innerWidth-A.right-le,Se=window.innerWidth-S.right-me,ne=S.width+Se,$e=Math.max(ne,C.width),Pe=window.innerWidth-Vr,ve=Zg(me,[Vr,Pe-$e]);s.style.minWidth=ne+"px",s.style.right=ve+"px"}const B=d(),U=window.innerHeight-Vr*2,H=p.scrollHeight,G=window.getComputedStyle(u),ee=parseInt(G.borderTopWidth,10),ae=parseInt(G.paddingTop,10),he=parseInt(G.borderBottomWidth,10),Te=parseInt(G.paddingBottom,10),oe=ee+ae+H+Te+he,ye=Math.min(g.offsetHeight*5,oe),te=window.getComputedStyle(p),O=parseInt(te.paddingTop,10),M=parseInt(te.paddingBottom,10),N=S.top+S.height/2-Vr,F=U-N,V=g.offsetHeight/2,Y=g.offsetTop+V,J=ee+ae+Y,W=oe-J;if(J<=N){const le=g===B[B.length-1].ref.current;s.style.bottom="0px";const me=u.clientHeight-p.offsetTop-p.offsetHeight,Se=Math.max(F,V+(le?M:0)+me+he),ne=J+Se;s.style.height=ne+"px"}else{const le=g===B[0].ref.current;s.style.top="0px";const Se=Math.max(N,ee+p.offsetTop+(le?O:0)+V)+W;s.style.height=Se+"px",p.scrollTop=J-N+p.offsetTop}s.style.margin=`${Vr}px 0`,s.style.minHeight=ye+"px",s.style.maxHeight=U+"px",n==null||n(),requestAnimationFrame(()=>h.current=!0)}},[d,o.trigger,o.valueNode,s,u,p,g,v,o.dir,n]);Bt(()=>y(),[y]);const[E,b]=x.useState();Bt(()=>{u&&b(window.getComputedStyle(u).zIndex)},[u]);const k=x.useCallback(S=>{S&&m.current===!0&&(y(),w==null||w(),m.current=!1)},[y,w]);return x.createElement(JP,{scope:r,contentWrapper:s,shouldExpandOnScrollRef:h,onScrollButtonChange:k},x.createElement("div",{ref:l,style:{display:"flex",flexDirection:"column",position:"fixed",zIndex:E}},x.createElement(Ie.div,ge({},i,{ref:f,style:{boxSizing:"border-box",maxHeight:"100%",...i.style}}))))}),u1=x.forwardRef((e,t)=>{const{__scopeSelect:r,align:n="start",collisionPadding:i=Vr,...o}=e,a=nh(r);return x.createElement(S2,ge({},a,o,{ref:t,align:n,collisionPadding:i,style:{boxSizing:"border-box",...o.style,"--radix-select-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-select-content-available-width":"var(--radix-popper-available-width)","--radix-select-content-available-height":"var(--radix-popper-available-height)","--radix-select-trigger-width":"var(--radix-popper-anchor-width)","--radix-select-trigger-height":"var(--radix-popper-anchor-height)"}}))}),[JP,ih]=bo(yo,{}),c1="SelectViewport",eI=x.forwardRef((e,t)=>{const{__scopeSelect:r,...n}=e,i=Ai(c1,r),o=ih(c1,r),a=Ve(t,i.onViewportChange),s=x.useRef(0);return x.createElement(x.Fragment,null,x.createElement("style",{dangerouslySetInnerHTML:{__html:"[data-radix-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-select-viewport]::-webkit-scrollbar{display:none}"}}),x.createElement(ku.Slot,{scope:r},x.createElement(Ie.div,ge({"data-radix-select-viewport":"",role:"presentation"},n,{ref:a,style:{position:"relative",flex:1,overflow:"auto",...n.style},onScroll:_e(n.onScroll,l=>{const u=l.currentTarget,{contentWrapper:c,shouldExpandOnScrollRef:f}=o;if(f!=null&&f.current&&c){const d=Math.abs(s.current-u.scrollTop);if(d>0){const h=window.innerHeight-Vr*2,m=parseFloat(c.style.minHeight),p=parseFloat(c.style.height),g=Math.max(m,p);if(g0?y:0,c.style.justifyContent="flex-end")}}}s.current=u.scrollTop})}))))}),tI="SelectGroup",[rI,nI]=bo(tI),iI=x.forwardRef((e,t)=>{const{__scopeSelect:r,...n}=e,i=Yr();return x.createElement(rI,{scope:r,id:i},x.createElement(Ie.div,ge({role:"group","aria-labelledby":i},n,{ref:t})))}),oI="SelectLabel",aI=x.forwardRef((e,t)=>{const{__scopeSelect:r,...n}=e,i=nI(oI,r);return x.createElement(Ie.div,ge({id:i.id},n,{ref:t}))}),a0="SelectItem",[sI,C2]=bo(a0),lI=x.forwardRef((e,t)=>{const{__scopeSelect:r,value:n,disabled:i=!1,textValue:o,...a}=e,s=Ci(a0,r),l=Ai(a0,r),u=s.value===n,[c,f]=x.useState(o??""),[d,h]=x.useState(!1),m=Ve(t,v=>{var w;return(w=l.itemRefCallback)===null||w===void 0?void 0:w.call(l,v,n,i)}),p=Yr(),g=()=>{i||(s.onValueChange(n),s.onOpenChange(!1))};return x.createElement(sI,{scope:r,value:n,disabled:i,textId:p,isSelected:u,onItemTextChange:x.useCallback(v=>{f(w=>{var y;return w||((y=v==null?void 0:v.textContent)!==null&&y!==void 0?y:"").trim()})},[])},x.createElement(ku.ItemSlot,{scope:r,value:n,disabled:i,textValue:c},x.createElement(Ie.div,ge({role:"option","aria-labelledby":p,"data-highlighted":d?"":void 0,"aria-selected":u&&d,"data-state":u?"checked":"unchecked","aria-disabled":i||void 0,"data-disabled":i?"":void 0,tabIndex:i?void 0:-1},a,{ref:m,onFocus:_e(a.onFocus,()=>h(!0)),onBlur:_e(a.onBlur,()=>h(!1)),onPointerUp:_e(a.onPointerUp,g),onPointerMove:_e(a.onPointerMove,v=>{if(i){var w;(w=l.onItemLeave)===null||w===void 0||w.call(l)}else v.currentTarget.focus({preventScroll:!0})}),onPointerLeave:_e(a.onPointerLeave,v=>{if(v.currentTarget===document.activeElement){var w;(w=l.onItemLeave)===null||w===void 0||w.call(l)}}),onKeyDown:_e(a.onKeyDown,v=>{var w;((w=l.searchRef)===null||w===void 0?void 0:w.current)!==""&&v.key===" "||(LP.includes(v.key)&&g(),v.key===" "&&v.preventDefault())})}))))}),zs="SelectItemText",uI=x.forwardRef((e,t)=>{const{__scopeSelect:r,className:n,style:i,...o}=e,a=Ci(zs,r),s=Ai(zs,r),l=C2(zs,r),u=VP(zs,r),[c,f]=x.useState(null),d=Ve(t,v=>f(v),l.onItemTextChange,v=>{var w;return(w=s.itemTextRefCallback)===null||w===void 0?void 0:w.call(s,v,l.value,l.disabled)}),h=c==null?void 0:c.textContent,m=x.useMemo(()=>x.createElement("option",{key:l.value,value:l.value,disabled:l.disabled},h),[l.disabled,l.value,h]),{onNativeOptionAdd:p,onNativeOptionRemove:g}=u;return Bt(()=>(p(m),()=>g(m)),[p,g,m]),x.createElement(x.Fragment,null,x.createElement(Ie.span,ge({id:l.textId},o,{ref:d})),l.isSelected&&a.valueNode&&!a.valueNodeHasChildren?mi.createPortal(o.children,a.valueNode):null)}),cI="SelectItemIndicator",fI=x.forwardRef((e,t)=>{const{__scopeSelect:r,...n}=e;return C2(cI,r).isSelected?x.createElement(Ie.span,ge({"aria-hidden":!0},n,{ref:t})):null}),f1="SelectScrollUpButton",dI=x.forwardRef((e,t)=>{const r=Ai(f1,e.__scopeSelect),n=ih(f1,e.__scopeSelect),[i,o]=x.useState(!1),a=Ve(t,n.onScrollButtonChange);return Bt(()=>{if(r.viewport&&r.isPositioned){let u=function(){const c=l.scrollTop>0;o(c)};var s=u;const l=r.viewport;return u(),l.addEventListener("scroll",u),()=>l.removeEventListener("scroll",u)}},[r.viewport,r.isPositioned]),i?x.createElement(A2,ge({},e,{ref:a,onAutoScroll:()=>{const{viewport:s,selectedItem:l}=r;s&&l&&(s.scrollTop=s.scrollTop-l.offsetHeight)}})):null}),d1="SelectScrollDownButton",hI=x.forwardRef((e,t)=>{const r=Ai(d1,e.__scopeSelect),n=ih(d1,e.__scopeSelect),[i,o]=x.useState(!1),a=Ve(t,n.onScrollButtonChange);return Bt(()=>{if(r.viewport&&r.isPositioned){let u=function(){const c=l.scrollHeight-l.clientHeight,f=Math.ceil(l.scrollTop)l.removeEventListener("scroll",u)}},[r.viewport,r.isPositioned]),i?x.createElement(A2,ge({},e,{ref:a,onAutoScroll:()=>{const{viewport:s,selectedItem:l}=r;s&&l&&(s.scrollTop=s.scrollTop+l.offsetHeight)}})):null}),A2=x.forwardRef((e,t)=>{const{__scopeSelect:r,onAutoScroll:n,...i}=e,o=Ai("SelectScrollButton",r),a=x.useRef(null),s=$u(r),l=x.useCallback(()=>{a.current!==null&&(window.clearInterval(a.current),a.current=null)},[]);return x.useEffect(()=>()=>l(),[l]),Bt(()=>{var u;const c=s().find(f=>f.ref.current===document.activeElement);c==null||(u=c.ref.current)===null||u===void 0||u.scrollIntoView({block:"nearest"})},[s]),x.createElement(Ie.div,ge({"aria-hidden":!0},i,{ref:t,style:{flexShrink:0,...i.style},onPointerDown:_e(i.onPointerDown,()=>{a.current===null&&(a.current=window.setInterval(n,50))}),onPointerMove:_e(i.onPointerMove,()=>{var u;(u=o.onItemLeave)===null||u===void 0||u.call(o),a.current===null&&(a.current=window.setInterval(n,50))}),onPointerLeave:_e(i.onPointerLeave,()=>{l()})}))}),R2=x.forwardRef((e,t)=>{const{value:r,...n}=e,i=x.useRef(null),o=Ve(t,i),a=NP(r);return x.useEffect(()=>{const s=i.current,l=window.HTMLSelectElement.prototype,c=Object.getOwnPropertyDescriptor(l,"value").set;if(a!==r&&c){const f=new Event("change",{bubbles:!0});c.call(s,r),s.dispatchEvent(f)}},[a,r]),x.createElement(rh,{asChild:!0},x.createElement("select",ge({},n,{ref:o,defaultValue:r})))});R2.displayName="BubbleSelect";function O2(e){const t=It(e),r=x.useRef(""),n=x.useRef(0),i=x.useCallback(a=>{const s=r.current+a;t(s),function l(u){r.current=u,window.clearTimeout(n.current),u!==""&&(n.current=window.setTimeout(()=>l(""),1e3))}(s)},[t]),o=x.useCallback(()=>{r.current="",window.clearTimeout(n.current)},[]);return x.useEffect(()=>()=>window.clearTimeout(n.current),[]),[r,i,o]}function F2(e,t,r){const i=t.length>1&&Array.from(t).every(u=>u===t[0])?t[0]:t,o=r?e.indexOf(r):-1;let a=pI(e,Math.max(o,0));i.length===1&&(a=a.filter(u=>u!==r));const l=a.find(u=>u.textValue.toLowerCase().startsWith(i.toLowerCase()));return l!==r?l:void 0}function pI(e,t){return e.map((r,n)=>e[(t+n)%e.length])}const gI=WP,mI=GP,vI=XP,xI=KP,wI=YP,yI=qP,EI=eI,Vc=iI,h1=aI,_I=lI,SI=uI,TI=fI,CI=dI,AI=hI;function oh(e,t){if(e==null)return{};var r={},n=Object.keys(e),i,o;for(o=0;o=0)&&(r[i]=e[i]);return r}var RI=["color"],OI=x.forwardRef(function(e,t){var r=e.color,n=r===void 0?"currentColor":r,i=oh(e,RI);return x.createElement("svg",Object.assign({width:"15",height:"15",viewBox:"0 0 15 15",fill:"none",xmlns:"http://www.w3.org/2000/svg"},i,{ref:t}),x.createElement("path",{d:"M11.4669 3.72684C11.7558 3.91574 11.8369 4.30308 11.648 4.59198L7.39799 11.092C7.29783 11.2452 7.13556 11.3467 6.95402 11.3699C6.77247 11.3931 6.58989 11.3355 6.45446 11.2124L3.70446 8.71241C3.44905 8.48022 3.43023 8.08494 3.66242 7.82953C3.89461 7.57412 4.28989 7.55529 4.5453 7.78749L6.75292 9.79441L10.6018 3.90792C10.7907 3.61902 11.178 3.53795 11.4669 3.72684Z",fill:n,fillRule:"evenodd",clipRule:"evenodd"}))}),FI=["color"],s0=x.forwardRef(function(e,t){var r=e.color,n=r===void 0?"currentColor":r,i=oh(e,FI);return x.createElement("svg",Object.assign({width:"15",height:"15",viewBox:"0 0 15 15",fill:"none",xmlns:"http://www.w3.org/2000/svg"},i,{ref:t}),x.createElement("path",{d:"M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z",fill:n,fillRule:"evenodd",clipRule:"evenodd"}))}),DI=["color"],PI=x.forwardRef(function(e,t){var r=e.color,n=r===void 0?"currentColor":r,i=oh(e,DI);return x.createElement("svg",Object.assign({width:"15",height:"15",viewBox:"0 0 15 15",fill:"none",xmlns:"http://www.w3.org/2000/svg"},i,{ref:t}),x.createElement("path",{d:"M3.13523 8.84197C3.3241 9.04343 3.64052 9.05363 3.84197 8.86477L7.5 5.43536L11.158 8.86477C11.3595 9.05363 11.6759 9.04343 11.8648 8.84197C12.0536 8.64051 12.0434 8.32409 11.842 8.13523L7.84197 4.38523C7.64964 4.20492 7.35036 4.20492 7.15803 4.38523L3.15803 8.13523C2.95657 8.32409 2.94637 8.64051 3.13523 8.84197Z",fill:n,fillRule:"evenodd",clipRule:"evenodd"}))});const Yi=({value:e,onChange:t,label:r="Select",placeholder:n="Select a fruit…",groups:i,labelType:o="col"})=>{const a=(i==null?void 0:i.length)===1;return Ce(gI,{value:e,onValueChange:t,children:[Ce(Vc,{className:Nt("flex gap-1",{"flex-row items-center gap-2":o==="row","flex-col":o==="col"}),children:[X(h1,{className:"whitespace-nowrap",children:r}),Ce(mI,{className:"justify-between bg-white text-black dark:text-white dark:bg-grey-900 whitespace-nowrap h-[36px] border-[1.5px] border-grey-700 rounded p-3 inline-flex items-center leading-none gap-[5px] shadow-[0_2px_10px] shadow-black/10 focus:shadow-[0_0_0_2px] focus:shadow-black data-[placeholder]:text-white outline-none","aria-label":r,children:[X(vI,{placeholder:n}),X(xI,{children:X(s0,{})})]})]}),X(wI,{children:Ce(yI,{className:"z-50 bg-white/80 dark:bg-grey-900/80 backdrop-filter backdrop-blur overflow-hidden border-[1.5px] border-grey-700 rounded p-3 shadow-[0px_10px_38px_-10px_rgba(22,_23,_24,_0.35),0px_10px_20px_-15px_rgba(22,_23,_24,_0.2)]",children:[X(CI,{className:"flex items-center justify-center h-[25px] cursor-default dark:text-white text-black",children:X(PI,{})}),X(EI,{className:"p-[5px]",children:a?X(Vc,{children:i[0].items.map(s=>X(p1,{value:s.value,disabled:s.disabled,children:s.label}))}):i.map((s,l)=>Ce(Vc,{children:[X(h1,{className:"text-xs leading-[25px]",children:s.label}),s.items.map(u=>X(p1,{value:u.value,disabled:u.disabled,children:u.label},u.value))]},s.label))}),X(AI,{className:"flex items-center justify-center h-[25px] cursor-default dark:text-white text-black",children:X(s0,{})})]})})]})},p1=x.forwardRef(({children:e,className:t,...r},n)=>Ce(_I,{className:Nt("text-[13px] leading-none rounded-[3px] flex items-center h-[25px] pr-[35px] pl-[25px] relative select-none data-[disabled]:text-grey-400 data-[disabled]:pointer-events-none data-[highlighted]:outline-none data-[highlighted]:bg-grey-600 data-[highlighted]:text-white text-black dark:text-white",t),...r,ref:n,children:[X(SI,{children:e}),X(TI,{className:"absolute left-0 w-[25px] inline-flex items-center justify-center",children:X(OI,{})})]})),D2="ToastProvider",[ah,II,bI]=Fu("Toast"),[P2,i$]=ln("Toast",[bI]),[kI,Nu]=P2(D2),I2=e=>{const{__scopeToast:t,label:r="Notification",duration:n=5e3,swipeDirection:i="right",swipeThreshold:o=50,children:a}=e,[s,l]=x.useState(null),[u,c]=x.useState(0),f=x.useRef(!1),d=x.useRef(!1);return x.createElement(ah.Provider,{scope:t},x.createElement(kI,{scope:t,label:r,duration:n,swipeDirection:i,swipeThreshold:o,toastCount:u,viewport:s,onViewportChange:l,onToastAdd:x.useCallback(()=>c(h=>h+1),[]),onToastRemove:x.useCallback(()=>c(h=>h-1),[]),isFocusedToastEscapeKeyDownRef:f,isClosePausedRef:d},a))};I2.propTypes={label(e){if(e.label&&typeof e.label=="string"&&!e.label.trim()){const t=`Invalid prop \`label\` supplied to \`${D2}\`. Expected non-empty \`string\`.`;return new Error(t)}return null}};const $I="ToastViewport",NI=["F8"],l0="toast.viewportPause",u0="toast.viewportResume",MI=x.forwardRef((e,t)=>{const{__scopeToast:r,hotkey:n=NI,label:i="Notifications ({hotkey})",...o}=e,a=Nu($I,r),s=II(r),l=x.useRef(null),u=x.useRef(null),c=x.useRef(null),f=x.useRef(null),d=Ve(t,f,a.onViewportChange),h=n.join("+").replace(/Key/g,"").replace(/Digit/g,""),m=a.toastCount>0;x.useEffect(()=>{const g=v=>{var w;n.every(E=>v[E]||v.code===E)&&((w=f.current)===null||w===void 0||w.focus())};return document.addEventListener("keydown",g),()=>document.removeEventListener("keydown",g)},[n]),x.useEffect(()=>{const g=l.current,v=f.current;if(m&&g&&v){const w=()=>{if(!a.isClosePausedRef.current){const k=new CustomEvent(l0);v.dispatchEvent(k),a.isClosePausedRef.current=!0}},y=()=>{if(a.isClosePausedRef.current){const k=new CustomEvent(u0);v.dispatchEvent(k),a.isClosePausedRef.current=!1}},E=k=>{!g.contains(k.relatedTarget)&&y()},b=()=>{g.contains(document.activeElement)||y()};return g.addEventListener("focusin",w),g.addEventListener("focusout",E),g.addEventListener("pointermove",w),g.addEventListener("pointerleave",b),window.addEventListener("blur",w),window.addEventListener("focus",y),()=>{g.removeEventListener("focusin",w),g.removeEventListener("focusout",E),g.removeEventListener("pointermove",w),g.removeEventListener("pointerleave",b),window.removeEventListener("blur",w),window.removeEventListener("focus",y)}}},[m,a.isClosePausedRef]);const p=x.useCallback(({tabbingDirection:g})=>{const w=s().map(y=>{const E=y.ref.current,b=[E,...e5(E)];return g==="forwards"?b:b.reverse()});return(g==="forwards"?w.reverse():w).flat()},[s]);return x.useEffect(()=>{const g=f.current;if(g){const v=w=>{const y=w.altKey||w.ctrlKey||w.metaKey;if(w.key==="Tab"&&!y){const C=document.activeElement,A=w.shiftKey;if(w.target===g&&A){var b;(b=u.current)===null||b===void 0||b.focus();return}const U=p({tabbingDirection:A?"backwards":"forwards"}),H=U.findIndex(G=>G===C);if(Wc(U.slice(H+1)))w.preventDefault();else{var k,S;A?(k=u.current)===null||k===void 0||k.focus():(S=c.current)===null||S===void 0||S.focus()}}};return g.addEventListener("keydown",v),()=>g.removeEventListener("keydown",v)}},[s,p]),x.createElement(sS,{ref:l,role:"region","aria-label":i.replace("{hotkey}",h),tabIndex:-1,style:{pointerEvents:m?void 0:"none"}},m&&x.createElement(g1,{ref:u,onFocusFromOutsideViewport:()=>{const g=p({tabbingDirection:"forwards"});Wc(g)}}),x.createElement(ah.Slot,{scope:r},x.createElement(Ie.ol,ge({tabIndex:-1},o,{ref:d}))),m&&x.createElement(g1,{ref:c,onFocusFromOutsideViewport:()=>{const g=p({tabbingDirection:"backwards"});Wc(g)}}))}),LI="ToastFocusProxy",g1=x.forwardRef((e,t)=>{const{__scopeToast:r,onFocusFromOutsideViewport:n,...i}=e,o=Nu(LI,r);return x.createElement(rh,ge({"aria-hidden":!0,tabIndex:0},i,{ref:t,style:{position:"fixed"},onFocus:a=>{var s;const l=a.relatedTarget;!((s=o.viewport)!==null&&s!==void 0&&s.contains(l))&&n()}}))}),Mu="Toast",BI="toast.swipeStart",UI="toast.swipeMove",HI="toast.swipeCancel",VI="toast.swipeEnd",WI=x.forwardRef((e,t)=>{const{forceMount:r,open:n,defaultOpen:i,onOpenChange:o,...a}=e,[s=!0,l]=vo({prop:n,defaultProp:i,onChange:o});return x.createElement(vi,{present:r||s},x.createElement(b2,ge({open:s},a,{ref:t,onClose:()=>l(!1),onPause:It(e.onPause),onResume:It(e.onResume),onSwipeStart:_e(e.onSwipeStart,u=>{u.currentTarget.setAttribute("data-swipe","start")}),onSwipeMove:_e(e.onSwipeMove,u=>{const{x:c,y:f}=u.detail.delta;u.currentTarget.setAttribute("data-swipe","move"),u.currentTarget.style.setProperty("--radix-toast-swipe-move-x",`${c}px`),u.currentTarget.style.setProperty("--radix-toast-swipe-move-y",`${f}px`)}),onSwipeCancel:_e(e.onSwipeCancel,u=>{u.currentTarget.setAttribute("data-swipe","cancel"),u.currentTarget.style.removeProperty("--radix-toast-swipe-move-x"),u.currentTarget.style.removeProperty("--radix-toast-swipe-move-y"),u.currentTarget.style.removeProperty("--radix-toast-swipe-end-x"),u.currentTarget.style.removeProperty("--radix-toast-swipe-end-y")}),onSwipeEnd:_e(e.onSwipeEnd,u=>{const{x:c,y:f}=u.detail.delta;u.currentTarget.setAttribute("data-swipe","end"),u.currentTarget.style.removeProperty("--radix-toast-swipe-move-x"),u.currentTarget.style.removeProperty("--radix-toast-swipe-move-y"),u.currentTarget.style.setProperty("--radix-toast-swipe-end-x",`${c}px`),u.currentTarget.style.setProperty("--radix-toast-swipe-end-y",`${f}px`),l(!1)})})))}),[zI,GI]=P2(Mu,{onClose(){}}),b2=x.forwardRef((e,t)=>{const{__scopeToast:r,type:n="foreground",duration:i,open:o,onClose:a,onEscapeKeyDown:s,onPause:l,onResume:u,onSwipeStart:c,onSwipeMove:f,onSwipeCancel:d,onSwipeEnd:h,...m}=e,p=Nu(Mu,r),[g,v]=x.useState(null),w=Ve(t,G=>v(G)),y=x.useRef(null),E=x.useRef(null),b=i||p.duration,k=x.useRef(0),S=x.useRef(b),C=x.useRef(0),{onToastAdd:A,onToastRemove:L}=p,B=It(()=>{var G;(g==null?void 0:g.contains(document.activeElement))&&((G=p.viewport)===null||G===void 0||G.focus()),a()}),U=x.useCallback(G=>{!G||G===1/0||(window.clearTimeout(C.current),k.current=new Date().getTime(),C.current=window.setTimeout(B,G))},[B]);x.useEffect(()=>{const G=p.viewport;if(G){const ee=()=>{U(S.current),u==null||u()},ae=()=>{const he=new Date().getTime()-k.current;S.current=S.current-he,window.clearTimeout(C.current),l==null||l()};return G.addEventListener(l0,ae),G.addEventListener(u0,ee),()=>{G.removeEventListener(l0,ae),G.removeEventListener(u0,ee)}}},[p.viewport,b,l,u,U]),x.useEffect(()=>{o&&!p.isClosePausedRef.current&&U(b)},[o,b,p.isClosePausedRef,U]),x.useEffect(()=>(A(),()=>L()),[A,L]);const H=x.useMemo(()=>g?N2(g):null,[g]);return p.viewport?x.createElement(x.Fragment,null,H&&x.createElement(jI,{__scopeToast:r,role:"status","aria-live":n==="foreground"?"assertive":"polite","aria-atomic":!0},H),x.createElement(zI,{scope:r,onClose:B},mi.createPortal(x.createElement(ah.ItemSlot,{scope:r},x.createElement(aS,{asChild:!0,onEscapeKeyDown:_e(s,()=>{p.isFocusedToastEscapeKeyDownRef.current||B(),p.isFocusedToastEscapeKeyDownRef.current=!1})},x.createElement(Ie.li,ge({role:"status","aria-live":"off","aria-atomic":!0,tabIndex:0,"data-state":o?"open":"closed","data-swipe-direction":p.swipeDirection},m,{ref:w,style:{userSelect:"none",touchAction:"none",...e.style},onKeyDown:_e(e.onKeyDown,G=>{G.key==="Escape"&&(s==null||s(G.nativeEvent),G.nativeEvent.defaultPrevented||(p.isFocusedToastEscapeKeyDownRef.current=!0,B()))}),onPointerDown:_e(e.onPointerDown,G=>{G.button===0&&(y.current={x:G.clientX,y:G.clientY})}),onPointerMove:_e(e.onPointerMove,G=>{if(!y.current)return;const ee=G.clientX-y.current.x,ae=G.clientY-y.current.y,he=!!E.current,Te=["left","right"].includes(p.swipeDirection),oe=["left","up"].includes(p.swipeDirection)?Math.min:Math.max,ye=Te?oe(0,ee):0,te=Te?0:oe(0,ae),O=G.pointerType==="touch"?10:2,M={x:ye,y:te},N={originalEvent:G,delta:M};he?(E.current=M,Gs(UI,f,N,{discrete:!1})):m1(M,p.swipeDirection,O)?(E.current=M,Gs(BI,c,N,{discrete:!1}),G.target.setPointerCapture(G.pointerId)):(Math.abs(ee)>O||Math.abs(ae)>O)&&(y.current=null)}),onPointerUp:_e(e.onPointerUp,G=>{const ee=E.current,ae=G.target;if(ae.hasPointerCapture(G.pointerId)&&ae.releasePointerCapture(G.pointerId),E.current=null,y.current=null,ee){const he=G.currentTarget,Te={originalEvent:G,delta:ee};m1(ee,p.swipeDirection,p.swipeThreshold)?Gs(VI,h,Te,{discrete:!0}):Gs(HI,d,Te,{discrete:!0}),he.addEventListener("click",oe=>oe.preventDefault(),{once:!0})}})})))),p.viewport))):null});b2.propTypes={type(e){if(e.type&&!["foreground","background"].includes(e.type)){const t=`Invalid prop \`type\` supplied to \`${Mu}\`. Expected \`foreground | background\`.`;return new Error(t)}return null}};const jI=e=>{const{__scopeToast:t,children:r,...n}=e,i=Nu(Mu,t),[o,a]=x.useState(!1),[s,l]=x.useState(!1);return ZI(()=>a(!0)),x.useEffect(()=>{const u=window.setTimeout(()=>l(!0),1e3);return()=>window.clearTimeout(u)},[]),s?null:x.createElement(xu,{asChild:!0},x.createElement(rh,n,o&&x.createElement(x.Fragment,null,i.label," ",r)))},XI=x.forwardRef((e,t)=>{const{__scopeToast:r,...n}=e;return x.createElement(Ie.div,ge({},n,{ref:t}))}),KI=x.forwardRef((e,t)=>{const{__scopeToast:r,...n}=e;return x.createElement(Ie.div,ge({},n,{ref:t}))}),YI="ToastAction",qI=x.forwardRef((e,t)=>{const{altText:r,...n}=e;return r?x.createElement($2,{altText:r,asChild:!0},x.createElement(k2,ge({},n,{ref:t}))):null});qI.propTypes={altText(e){return e.altText?null:new Error(`Missing prop \`altText\` expected on \`${YI}\``)}};const QI="ToastClose",k2=x.forwardRef((e,t)=>{const{__scopeToast:r,...n}=e,i=GI(QI,r);return x.createElement($2,{asChild:!0},x.createElement(Ie.button,ge({type:"button"},n,{ref:t,onClick:_e(e.onClick,i.onClose)})))}),$2=x.forwardRef((e,t)=>{const{__scopeToast:r,altText:n,...i}=e;return x.createElement(Ie.div,ge({"data-radix-toast-announce-exclude":"","data-radix-toast-announce-alt":n||void 0},i,{ref:t}))});function N2(e){const t=[];return Array.from(e.childNodes).forEach(n=>{if(n.nodeType===n.TEXT_NODE&&n.textContent&&t.push(n.textContent),JI(n)){const i=n.ariaHidden||n.hidden||n.style.display==="none",o=n.dataset.radixToastAnnounceExclude==="";if(!i)if(o){const a=n.dataset.radixToastAnnounceAlt;a&&t.push(a)}else t.push(...N2(n))}}),t}function Gs(e,t,r,{discrete:n}){const i=r.originalEvent.currentTarget,o=new CustomEvent(e,{bubbles:!0,cancelable:!0,detail:r});t&&i.addEventListener(e,t,{once:!0}),n?wd(i,o):i.dispatchEvent(o)}const m1=(e,t,r=0)=>{const n=Math.abs(e.x),i=Math.abs(e.y),o=n>i;return t==="left"||t==="right"?o&&n>r:!o&&i>r};function ZI(e=()=>{}){const t=It(e);Bt(()=>{let r=0,n=0;return r=window.requestAnimationFrame(()=>n=window.requestAnimationFrame(t)),()=>{window.cancelAnimationFrame(r),window.cancelAnimationFrame(n)}},[t])}function JI(e){return e.nodeType===e.ELEMENT_NODE}function e5(e){const t=[],r=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:n=>{const i=n.tagName==="INPUT"&&n.type==="hidden";return n.disabled||n.hidden||i?NodeFilter.FILTER_SKIP:n.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;r.nextNode();)t.push(r.currentNode);return t}function Wc(e){const t=document.activeElement;return e.some(r=>r===t?!0:(r.focus(),document.activeElement!==t))}const t5=I2,r5=MI,n5=WI,i5=XI,o5=KI,a5=k2,s5=({title:e,titleId:t,...r})=>Ce("svg",{viewBox:"0 0 18 18",width:18,height:18,fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-labelledby":t,...r,children:[e?X("title",{id:t,children:e}):null,X("path",{d:"M9 16.5a7.5 7.5 0 1 0 0-15 7.5 7.5 0 0 0 0 15ZM11.25 6.75l-4.5 4.5M6.75 6.75l4.5 4.5",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round"})]}),l5=({title:e,titleId:t,...r})=>Ce("svg",{viewBox:"0 0 24 24",width:24,height:24,fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-labelledby":t,...r,children:[e?X("title",{id:t,children:e}):null,X("path",{d:"M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2 2 6.477 2 12s4.477 10 10 10ZM12 16v-4M12 8h.01",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round"})]}),u5=({title:e,titleId:t,...r})=>Ce("svg",{width:18,height:18,viewBox:"0 0 18 18",fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-labelledby":t,...r,children:[e?X("title",{id:t,children:e}):null,X("path",{d:"M16.5 8.31V9a7.5 7.5 0 1 1-4.447-6.855",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round"}),X("path",{d:"M16.5 3 9 10.508l-2.25-2.25",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round"})]}),c5=({title:e,titleId:t,...r})=>Ce("svg",{viewBox:"0 0 18 18",width:18,height:18,fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-labelledby":t,...r,children:[e?X("title",{id:t,children:e}):null,X("path",{d:"M7.718 2.895 1.366 13.5a1.5 1.5 0 0 0 1.282 2.25h12.705a1.5 1.5 0 0 0 1.283-2.25L10.283 2.895a1.5 1.5 0 0 0-2.565 0v0ZM9 6.75v3M9 12.75h.008",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round"})]}),f5=({toast:e,open:t,setOpen:r})=>Ce(t5,{children:[Ce(n5,{open:t,onOpenChange:n=>{e.preventClose||r(n)},className:Nt("z-50 fixed bottom-4 md:left-1/2 md:-translate-x-[50%] inset-x-4 w-auto shadow-lg md:max-w-[658px] duration-300","radix-state-open:animate-fade-in","radix-state-closed:animate-toast-hide","radix-swipe-end:animate-toast-swipe-out","translate-x-radix-toast-swipe-move-x","radix-swipe-cancel:translate-x-0 radix-swipe-cancel:duration-200 radix-swipe-cancel:ease-[ease]","px-[40px] md:px-[58px] py-6 flex flex-col border rounded-[4px]",{"bg-green-100 text-green-600 border-green-600":e.status==="success","bg-red-200 text-red-600 border-red-600":e.status==="error","bg-blue-100 text-blue-700 border-blue-600":e.status==="info","bg-orange-200 text-orange-600 border-orange-600":e.status==="warning"},{"h-[72px]":!e.description}),children:[e.status==="success"?X(u5,{className:"absolute left-[8px] md:left-[25px] top-[25px]"}):e.status==="warning"?X(c5,{className:"absolute left-[8px] md:left-[25px] top-[25px]"}):e.status==="error"?X(s5,{className:"absolute left-[8px] md:left-[25px] top-[25px]"}):X(l5,{className:"absolute left-[8px] md:left-[25px] top-[25px]"}),X(i5,{className:"text-grey-900 font-bold text-sm",children:e.title}),e.description&&X(o5,{className:"mt-2 text-[10px] md:text-xs text-grey-800",children:e.description}),X(a5,{className:"absolute top-7 right-5 md:right-7",children:X(ql,{className:"w-4 h-4 text-grey-900"})})]}),X(r5,{})]}),zc="rovingFocusGroup.onEntryFocus",d5={bubbles:!1,cancelable:!0},sh="RovingFocusGroup",[c0,M2,h5]=Fu(sh),[p5,L2]=ln(sh,[h5]),[g5,m5]=p5(sh),v5=x.forwardRef((e,t)=>x.createElement(c0.Provider,{scope:e.__scopeRovingFocusGroup},x.createElement(c0.Slot,{scope:e.__scopeRovingFocusGroup},x.createElement(x5,ge({},e,{ref:t}))))),x5=x.forwardRef((e,t)=>{const{__scopeRovingFocusGroup:r,orientation:n,loop:i=!1,dir:o,currentTabStopId:a,defaultCurrentTabStopId:s,onCurrentTabStopIdChange:l,onEntryFocus:u,...c}=e,f=x.useRef(null),d=Ve(t,f),h=Zd(o),[m=null,p]=vo({prop:a,defaultProp:s,onChange:l}),[g,v]=x.useState(!1),w=It(u),y=M2(r),E=x.useRef(!1),[b,k]=x.useState(0);return x.useEffect(()=>{const S=f.current;if(S)return S.addEventListener(zc,w),()=>S.removeEventListener(zc,w)},[w]),x.createElement(g5,{scope:r,orientation:n,dir:h,loop:i,currentTabStopId:m,onItemFocus:x.useCallback(S=>p(S),[p]),onItemShiftTab:x.useCallback(()=>v(!0),[]),onFocusableItemAdd:x.useCallback(()=>k(S=>S+1),[]),onFocusableItemRemove:x.useCallback(()=>k(S=>S-1),[])},x.createElement(Ie.div,ge({tabIndex:g||b===0?-1:0,"data-orientation":n},c,{ref:d,style:{outline:"none",...e.style},onMouseDown:_e(e.onMouseDown,()=>{E.current=!0}),onFocus:_e(e.onFocus,S=>{const C=!E.current;if(S.target===S.currentTarget&&C&&!g){const A=new CustomEvent(zc,d5);if(S.currentTarget.dispatchEvent(A),!A.defaultPrevented){const L=y().filter(ee=>ee.focusable),B=L.find(ee=>ee.active),U=L.find(ee=>ee.id===m),G=[B,U,...L].filter(Boolean).map(ee=>ee.ref.current);B2(G)}}E.current=!1}),onBlur:_e(e.onBlur,()=>v(!1))})))}),w5="RovingFocusGroupItem",y5=x.forwardRef((e,t)=>{const{__scopeRovingFocusGroup:r,focusable:n=!0,active:i=!1,tabStopId:o,...a}=e,s=Yr(),l=o||s,u=m5(w5,r),c=u.currentTabStopId===l,f=M2(r),{onFocusableItemAdd:d,onFocusableItemRemove:h}=u;return x.useEffect(()=>{if(n)return d(),()=>h()},[n,d,h]),x.createElement(c0.ItemSlot,{scope:r,id:l,focusable:n,active:i},x.createElement(Ie.span,ge({tabIndex:c?0:-1,"data-orientation":u.orientation},a,{ref:t,onMouseDown:_e(e.onMouseDown,m=>{n?u.onItemFocus(l):m.preventDefault()}),onFocus:_e(e.onFocus,()=>u.onItemFocus(l)),onKeyDown:_e(e.onKeyDown,m=>{if(m.key==="Tab"&&m.shiftKey){u.onItemShiftTab();return}if(m.target!==m.currentTarget)return;const p=S5(m,u.orientation,u.dir);if(p!==void 0){m.preventDefault();let v=f().filter(w=>w.focusable).map(w=>w.ref.current);if(p==="last")v.reverse();else if(p==="prev"||p==="next"){p==="prev"&&v.reverse();const w=v.indexOf(m.currentTarget);v=u.loop?T5(v,w+1):v.slice(w+1)}setTimeout(()=>B2(v))}})})))}),E5={ArrowLeft:"prev",ArrowUp:"prev",ArrowRight:"next",ArrowDown:"next",PageUp:"first",Home:"first",PageDown:"last",End:"last"};function _5(e,t){return t!=="rtl"?e:e==="ArrowLeft"?"ArrowRight":e==="ArrowRight"?"ArrowLeft":e}function S5(e,t,r){const n=_5(e.key,r);if(!(t==="vertical"&&["ArrowLeft","ArrowRight"].includes(n))&&!(t==="horizontal"&&["ArrowUp","ArrowDown"].includes(n)))return E5[n]}function B2(e){const t=document.activeElement;for(const r of e)if(r===t||(r.focus(),document.activeElement!==t))return}function T5(e,t){return e.map((r,n)=>e[(t+n)%e.length])}const C5=v5,A5=y5,R5=["Enter"," "],O5=["ArrowDown","PageUp","Home"],U2=["ArrowUp","PageDown","End"],F5=[...O5,...U2],Lu="Menu",[f0,D5,P5]=Fu(Lu),[Ri,Bu]=ln(Lu,[P5,Iu,L2]),lh=Iu(),H2=L2(),[I5,cs]=Ri(Lu),[b5,uh]=Ri(Lu),k5=e=>{const{__scopeMenu:t,open:r=!1,children:n,dir:i,onOpenChange:o,modal:a=!0}=e,s=lh(t),[l,u]=x.useState(null),c=x.useRef(!1),f=It(o),d=Zd(i);return x.useEffect(()=>{const h=()=>{c.current=!0,document.addEventListener("pointerdown",m,{capture:!0,once:!0}),document.addEventListener("pointermove",m,{capture:!0,once:!0})},m=()=>c.current=!1;return document.addEventListener("keydown",h,{capture:!0}),()=>{document.removeEventListener("keydown",h,{capture:!0}),document.removeEventListener("pointerdown",m,{capture:!0}),document.removeEventListener("pointermove",m,{capture:!0})}},[]),x.createElement(E2,s,x.createElement(I5,{scope:t,open:r,onOpenChange:f,content:l,onContentChange:u},x.createElement(b5,{scope:t,onClose:x.useCallback(()=>f(!1),[f]),isUsingKeyboardRef:c,dir:d,modal:a},n)))},$5=x.forwardRef((e,t)=>{const{__scopeMenu:r,...n}=e,i=lh(r);return x.createElement(_2,ge({},i,n,{ref:t}))}),V2="MenuPortal",[N5,M5]=Ri(V2,{forceMount:void 0}),L5=e=>{const{__scopeMenu:t,forceMount:r,children:n,container:i}=e,o=cs(V2,t);return x.createElement(N5,{scope:t,forceMount:r},x.createElement(vi,{present:r||o.open},x.createElement(xu,{asChild:!0,container:i},n)))},Fn="MenuContent",[B5,W2]=Ri(Fn),U5=x.forwardRef((e,t)=>{const r=M5(Fn,e.__scopeMenu),{forceMount:n=r.forceMount,...i}=e,o=cs(Fn,e.__scopeMenu),a=uh(Fn,e.__scopeMenu);return x.createElement(f0.Provider,{scope:e.__scopeMenu},x.createElement(vi,{present:n||o.open},x.createElement(f0.Slot,{scope:e.__scopeMenu},a.modal?x.createElement(H5,ge({},i,{ref:t})):x.createElement(V5,ge({},i,{ref:t})))))}),H5=x.forwardRef((e,t)=>{const r=cs(Fn,e.__scopeMenu),n=x.useRef(null),i=Ve(t,n);return x.useEffect(()=>{const o=n.current;if(o)return Sd(o)},[]),x.createElement(z2,ge({},e,{ref:i,trapFocus:r.open,disableOutsidePointerEvents:r.open,disableOutsideScroll:!0,onFocusOutside:_e(e.onFocusOutside,o=>o.preventDefault(),{checkForDefaultPrevented:!1}),onDismiss:()=>r.onOpenChange(!1)}))}),V5=x.forwardRef((e,t)=>{const r=cs(Fn,e.__scopeMenu);return x.createElement(z2,ge({},e,{ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,disableOutsideScroll:!1,onDismiss:()=>r.onOpenChange(!1)}))}),z2=x.forwardRef((e,t)=>{const{__scopeMenu:r,loop:n=!1,trapFocus:i,onOpenAutoFocus:o,onCloseAutoFocus:a,disableOutsidePointerEvents:s,onEntryFocus:l,onEscapeKeyDown:u,onPointerDownOutside:c,onFocusOutside:f,onInteractOutside:d,onDismiss:h,disableOutsideScroll:m,...p}=e,g=cs(Fn,r),v=uh(Fn,r),w=lh(r),y=H2(r),E=D5(r),[b,k]=x.useState(null),S=x.useRef(null),C=Ve(t,S,g.onContentChange),A=x.useRef(0),L=x.useRef(""),B=x.useRef(0),U=x.useRef(null),H=x.useRef("right"),G=x.useRef(0),ee=m?_d:x.Fragment,ae=m?{as:ai,allowPinchZoom:!0}:void 0,he=oe=>{var ye,te;const O=L.current+oe,M=E().filter(W=>!W.disabled),N=document.activeElement,F=(ye=M.find(W=>W.ref.current===N))===null||ye===void 0?void 0:ye.textValue,V=M.map(W=>W.textValue),Y=J5(V,O,F),J=(te=M.find(W=>W.textValue===Y))===null||te===void 0?void 0:te.ref.current;(function W(Q){L.current=Q,window.clearTimeout(A.current),Q!==""&&(A.current=window.setTimeout(()=>W(""),1e3))})(O),J&&setTimeout(()=>J.focus())};x.useEffect(()=>()=>window.clearTimeout(A.current),[]),Ed();const Te=x.useCallback(oe=>{var ye,te;return H.current===((ye=U.current)===null||ye===void 0?void 0:ye.side)&&tb(oe,(te=U.current)===null||te===void 0?void 0:te.area)},[]);return x.createElement(B5,{scope:r,searchRef:L,onItemEnter:x.useCallback(oe=>{Te(oe)&&oe.preventDefault()},[Te]),onItemLeave:x.useCallback(oe=>{var ye;Te(oe)||((ye=S.current)===null||ye===void 0||ye.focus(),k(null))},[Te]),onTriggerLeave:x.useCallback(oe=>{Te(oe)&&oe.preventDefault()},[Te]),pointerGraceTimerRef:B,onPointerGraceIntentChange:x.useCallback(oe=>{U.current=oe},[])},x.createElement(ee,ae,x.createElement(yd,{asChild:!0,trapped:i,onMountAutoFocus:_e(o,oe=>{var ye;oe.preventDefault(),(ye=S.current)===null||ye===void 0||ye.focus()}),onUnmountAutoFocus:a},x.createElement(vu,{asChild:!0,disableOutsidePointerEvents:s,onEscapeKeyDown:u,onPointerDownOutside:c,onFocusOutside:f,onInteractOutside:d,onDismiss:h},x.createElement(C5,ge({asChild:!0},y,{dir:v.dir,orientation:"vertical",loop:n,currentTabStopId:b,onCurrentTabStopIdChange:k,onEntryFocus:_e(l,oe=>{v.isUsingKeyboardRef.current||oe.preventDefault()})}),x.createElement(S2,ge({role:"menu","aria-orientation":"vertical","data-state":q5(g.open),"data-radix-menu-content":"",dir:v.dir},w,p,{ref:C,style:{outline:"none",...p.style},onKeyDown:_e(p.onKeyDown,oe=>{const te=oe.target.closest("[data-radix-menu-content]")===oe.currentTarget,O=oe.ctrlKey||oe.altKey||oe.metaKey,M=oe.key.length===1;te&&(oe.key==="Tab"&&oe.preventDefault(),!O&&M&&he(oe.key));const N=S.current;if(oe.target!==N||!F5.includes(oe.key))return;oe.preventDefault();const V=E().filter(Y=>!Y.disabled).map(Y=>Y.ref.current);U2.includes(oe.key)&&V.reverse(),Q5(V)}),onBlur:_e(e.onBlur,oe=>{oe.currentTarget.contains(oe.target)||(window.clearTimeout(A.current),L.current="")}),onPointerMove:_e(e.onPointerMove,h0(oe=>{const ye=oe.target,te=G.current!==oe.clientX;if(oe.currentTarget.contains(ye)&&te){const O=oe.clientX>G.current?"right":"left";H.current=O,G.current=oe.clientX}}))})))))))}),W5=x.forwardRef((e,t)=>{const{__scopeMenu:r,...n}=e;return x.createElement(Ie.div,ge({role:"group"},n,{ref:t}))}),z5=x.forwardRef((e,t)=>{const{__scopeMenu:r,...n}=e;return x.createElement(Ie.div,ge({},n,{ref:t}))}),d0="MenuItem",v1="menu.itemSelect",G5=x.forwardRef((e,t)=>{const{disabled:r=!1,onSelect:n,...i}=e,o=x.useRef(null),a=uh(d0,e.__scopeMenu),s=W2(d0,e.__scopeMenu),l=Ve(t,o),u=x.useRef(!1),c=()=>{const f=o.current;if(!r&&f){const d=new CustomEvent(v1,{bubbles:!0,cancelable:!0});f.addEventListener(v1,h=>n==null?void 0:n(h),{once:!0}),wd(f,d),d.defaultPrevented?u.current=!1:a.onClose()}};return x.createElement(j5,ge({},i,{ref:l,disabled:r,onClick:_e(e.onClick,c),onPointerDown:f=>{var d;(d=e.onPointerDown)===null||d===void 0||d.call(e,f),u.current=!0},onPointerUp:_e(e.onPointerUp,f=>{var d;u.current||(d=f.currentTarget)===null||d===void 0||d.click()}),onKeyDown:_e(e.onKeyDown,f=>{const d=s.searchRef.current!=="";r||d&&f.key===" "||R5.includes(f.key)&&(f.currentTarget.click(),f.preventDefault())})}))}),j5=x.forwardRef((e,t)=>{const{__scopeMenu:r,disabled:n=!1,textValue:i,...o}=e,a=W2(d0,r),s=H2(r),l=x.useRef(null),u=Ve(t,l),[c,f]=x.useState(!1),[d,h]=x.useState("");return x.useEffect(()=>{const m=l.current;if(m){var p;h(((p=m.textContent)!==null&&p!==void 0?p:"").trim())}},[o.children]),x.createElement(f0.ItemSlot,{scope:r,disabled:n,textValue:i??d},x.createElement(A5,ge({asChild:!0},s,{focusable:!n}),x.createElement(Ie.div,ge({role:"menuitem","data-highlighted":c?"":void 0,"aria-disabled":n||void 0,"data-disabled":n?"":void 0},o,{ref:u,onPointerMove:_e(e.onPointerMove,h0(m=>{n?a.onItemLeave(m):(a.onItemEnter(m),m.defaultPrevented||m.currentTarget.focus())})),onPointerLeave:_e(e.onPointerLeave,h0(m=>a.onItemLeave(m))),onFocus:_e(e.onFocus,()=>f(!0)),onBlur:_e(e.onBlur,()=>f(!1))}))))}),X5="MenuRadioGroup";Ri(X5,{value:void 0,onValueChange:()=>{}});const K5="MenuItemIndicator";Ri(K5,{checked:!1});const Y5="MenuSub";Ri(Y5);function q5(e){return e?"open":"closed"}function Q5(e){const t=document.activeElement;for(const r of e)if(r===t||(r.focus(),document.activeElement!==t))return}function Z5(e,t){return e.map((r,n)=>e[(t+n)%e.length])}function J5(e,t,r){const i=t.length>1&&Array.from(t).every(u=>u===t[0])?t[0]:t,o=r?e.indexOf(r):-1;let a=Z5(e,Math.max(o,0));i.length===1&&(a=a.filter(u=>u!==r));const l=a.find(u=>u.toLowerCase().startsWith(i.toLowerCase()));return l!==r?l:void 0}function eb(e,t){const{x:r,y:n}=e;let i=!1;for(let o=0,a=t.length-1;on!=c>n&&r<(u-s)*(n-l)/(c-l)+s&&(i=!i)}return i}function tb(e,t){if(!t)return!1;const r={x:e.clientX,y:e.clientY};return eb(r,t)}function h0(e){return t=>t.pointerType==="mouse"?e(t):void 0}const G2=k5,j2=$5,X2=L5,K2=U5,rb=W5,nb=z5,ib=G5,Y2="ContextMenu",[ob,o$]=ln(Y2,[Bu]),Uu=Bu(),[ab,q2]=ob(Y2),sb=e=>{const{__scopeContextMenu:t,children:r,onOpenChange:n,dir:i,modal:o=!0}=e,[a,s]=x.useState(!1),l=Uu(t),u=It(n),c=x.useCallback(f=>{s(f),u(f)},[u]);return x.createElement(ab,{scope:t,open:a,onOpenChange:c,modal:o},x.createElement(G2,ge({},l,{dir:i,open:a,onOpenChange:c,modal:o}),r))},lb="ContextMenuTrigger",ub=x.forwardRef((e,t)=>{const{__scopeContextMenu:r,disabled:n=!1,...i}=e,o=q2(lb,r),a=Uu(r),s=x.useRef({x:0,y:0}),l=x.useRef({getBoundingClientRect:()=>DOMRect.fromRect({width:0,height:0,...s.current})}),u=x.useRef(0),c=x.useCallback(()=>window.clearTimeout(u.current),[]),f=d=>{s.current={x:d.clientX,y:d.clientY},o.onOpenChange(!0)};return x.useEffect(()=>c,[c]),x.useEffect(()=>void(n&&c()),[n,c]),x.createElement(x.Fragment,null,x.createElement(j2,ge({},a,{virtualRef:l})),x.createElement(Ie.span,ge({"data-state":o.open?"open":"closed","data-disabled":n?"":void 0},i,{ref:t,style:{WebkitTouchCallout:"none",...e.style},onContextMenu:n?e.onContextMenu:_e(e.onContextMenu,d=>{c(),f(d),d.preventDefault()}),onPointerDown:n?e.onPointerDown:_e(e.onPointerDown,js(d=>{c(),u.current=window.setTimeout(()=>f(d),700)})),onPointerMove:n?e.onPointerMove:_e(e.onPointerMove,js(c)),onPointerCancel:n?e.onPointerCancel:_e(e.onPointerCancel,js(c)),onPointerUp:n?e.onPointerUp:_e(e.onPointerUp,js(c))})))}),cb=e=>{const{__scopeContextMenu:t,...r}=e,n=Uu(t);return x.createElement(X2,ge({},n,r))},fb="ContextMenuContent",db=x.forwardRef((e,t)=>{const{__scopeContextMenu:r,...n}=e,i=q2(fb,r),o=Uu(r),a=x.useRef(!1);return x.createElement(K2,ge({},o,n,{ref:t,side:"right",sideOffset:2,align:"start",onCloseAutoFocus:s=>{var l;(l=e.onCloseAutoFocus)===null||l===void 0||l.call(e,s),!s.defaultPrevented&&a.current&&s.preventDefault(),a.current=!1},onInteractOutside:s=>{var l;(l=e.onInteractOutside)===null||l===void 0||l.call(e,s),!s.defaultPrevented&&!i.modal&&(a.current=!0)},style:{...e.style,"--radix-context-menu-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-context-menu-content-available-width":"var(--radix-popper-available-width)","--radix-context-menu-content-available-height":"var(--radix-popper-available-height)","--radix-context-menu-trigger-width":"var(--radix-popper-anchor-width)","--radix-context-menu-trigger-height":"var(--radix-popper-anchor-height)"}}))});function js(e){return t=>t.pointerType!=="mouse"?e(t):void 0}const hb=sb,pb=ub,gb=cb,mb=db,Q2=x.createContext({dragDropManager:void 0});function nr(e){return"Minified Redux error #"+e+"; visit https://redux.js.org/Errors?code="+e+" for the full message or use the non-minified dev environment for full errors. "}var x1=function(){return typeof Symbol=="function"&&Symbol.observable||"@@observable"}(),Gc=function(){return Math.random().toString(36).substring(7).split("").join(".")},w1={INIT:"@@redux/INIT"+Gc(),REPLACE:"@@redux/REPLACE"+Gc(),PROBE_UNKNOWN_ACTION:function(){return"@@redux/PROBE_UNKNOWN_ACTION"+Gc()}};function vb(e){if(typeof e!="object"||e===null)return!1;for(var t=e;Object.getPrototypeOf(t)!==null;)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t}function Z2(e,t,r){var n;if(typeof t=="function"&&typeof r=="function"||typeof r=="function"&&typeof arguments[3]=="function")throw new Error(nr(0));if(typeof t=="function"&&typeof r>"u"&&(r=t,t=void 0),typeof r<"u"){if(typeof r!="function")throw new Error(nr(1));return r(Z2)(e,t)}if(typeof e!="function")throw new Error(nr(2));var i=e,o=t,a=[],s=a,l=!1;function u(){s===a&&(s=a.slice())}function c(){if(l)throw new Error(nr(3));return o}function f(p){if(typeof p!="function")throw new Error(nr(4));if(l)throw new Error(nr(5));var g=!0;return u(),s.push(p),function(){if(g){if(l)throw new Error(nr(6));g=!1,u();var w=s.indexOf(p);s.splice(w,1),a=null}}}function d(p){if(!vb(p))throw new Error(nr(7));if(typeof p.type>"u")throw new Error(nr(8));if(l)throw new Error(nr(9));try{l=!0,o=i(o,p)}finally{l=!1}for(var g=a=s,v=0;vn&&n[i]?n[i]:r||null,e)}function yb(e,t){return e.filter(r=>r!==t)}function J2(e){return typeof e=="object"}function Eb(e,t){const r=new Map,n=o=>{r.set(o,r.has(o)?r.get(o)+1:1)};e.forEach(n),t.forEach(n);const i=[];return r.forEach((o,a)=>{o===1&&i.push(a)}),i}function _b(e,t){return e.filter(r=>t.indexOf(r)>-1)}const ch="dnd-core/INIT_COORDS",Hu="dnd-core/BEGIN_DRAG",fh="dnd-core/PUBLISH_DRAG_SOURCE",Vu="dnd-core/HOVER",Wu="dnd-core/DROP",zu="dnd-core/END_DRAG";function y1(e,t){return{type:ch,payload:{sourceClientOffset:t||null,clientOffset:e||null}}}const Sb={type:ch,payload:{clientOffset:null,sourceClientOffset:null}};function Tb(e){return function(r=[],n={publishSource:!0}){const{publishSource:i=!0,clientOffset:o,getSourceClientOffset:a}=n,s=e.getMonitor(),l=e.getRegistry();e.dispatch(y1(o)),Cb(r,s,l);const u=Ob(r,s);if(u==null){e.dispatch(Sb);return}let c=null;if(o){if(!a)throw new Error("getSourceClientOffset must be defined");Ab(a),c=a(u)}e.dispatch(y1(o,c));const d=l.getSource(u).beginDrag(s,u);if(d==null)return;Rb(d),l.pinSource(u);const h=l.getSourceType(u);return{type:Hu,payload:{itemType:h,item:d,sourceId:u,clientOffset:o||null,sourceClientOffset:c||null,isSourcePublic:!!i}}}}function Cb(e,t,r){Fe(!t.isDragging(),"Cannot call beginDrag while dragging."),e.forEach(function(n){Fe(r.getSource(n),"Expected sourceIds to be registered.")})}function Ab(e){Fe(typeof e=="function","When clientOffset is provided, getSourceClientOffset must be a function.")}function Rb(e){Fe(J2(e),"Item must be an object.")}function Ob(e,t){let r=null;for(let n=e.length-1;n>=0;n--)if(t.canDragSource(e[n])){r=e[n];break}return r}function Fb(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function Db(e){for(var t=1;t{const l=bb(a,s,i,n),u={type:Wu,payload:{dropResult:Db({},r,l)}};e.dispatch(u)})}}function Ib(e){Fe(e.isDragging(),"Cannot call drop while not dragging."),Fe(!e.didDrop(),"Cannot call drop twice during one drag operation.")}function bb(e,t,r,n){const i=r.getTarget(e);let o=i?i.drop(n,e):void 0;return kb(o),typeof o>"u"&&(o=t===0?{}:n.getDropResult()),o}function kb(e){Fe(typeof e>"u"||J2(e),"Drop result must either be an object or undefined.")}function $b(e){const t=e.getTargetIds().filter(e.canDropOnTarget,e);return t.reverse(),t}function Nb(e){return function(){const r=e.getMonitor(),n=e.getRegistry();Mb(r);const i=r.getSourceId();return i!=null&&(n.getSource(i,!0).endDrag(r,i),n.unpinSource()),{type:zu}}}function Mb(e){Fe(e.isDragging(),"Cannot call endDrag while not dragging.")}function p0(e,t){return t===null?e===null:Array.isArray(e)?e.some(r=>r===t):e===t}function Lb(e){return function(r,{clientOffset:n}={}){Bb(r);const i=r.slice(0),o=e.getMonitor(),a=e.getRegistry(),s=o.getItemType();return Hb(i,a,s),Ub(i,o,a),Vb(i,o,a),{type:Vu,payload:{targetIds:i,clientOffset:n||null}}}}function Bb(e){Fe(Array.isArray(e),"Expected targetIds to be an array.")}function Ub(e,t,r){Fe(t.isDragging(),"Cannot call hover while not dragging."),Fe(!t.didDrop(),"Cannot call hover after drop.");for(let n=0;n=0;n--){const i=e[n],o=t.getTargetType(i);p0(o,r)||e.splice(n,1)}}function Vb(e,t,r){e.forEach(function(n){r.getTarget(n).hover(t,n)})}function Wb(e){return function(){if(e.getMonitor().isDragging())return{type:fh}}}function zb(e){return{beginDrag:Tb(e),publishDragSource:Wb(e),hover:Lb(e),drop:Pb(e),endDrag:Nb(e)}}class Gb{receiveBackend(t){this.backend=t}getMonitor(){return this.monitor}getBackend(){return this.backend}getRegistry(){return this.monitor.registry}getActions(){const t=this,{dispatch:r}=this.store;function n(o){return(...a)=>{const s=o.apply(t,a);typeof s<"u"&&r(s)}}const i=zb(this);return Object.keys(i).reduce((o,a)=>{const s=i[a];return o[a]=n(s),o},{})}dispatch(t){this.store.dispatch(t)}constructor(t,r){this.isSetUp=!1,this.handleRefCountChange=()=>{const n=this.store.getState().refCount>0;this.backend&&(n&&!this.isSetUp?(this.backend.setup(),this.isSetUp=!0):!n&&this.isSetUp&&(this.backend.teardown(),this.isSetUp=!1))},this.store=t,this.monitor=r,t.subscribe(this.handleRefCountChange)}}function jb(e,t){return{x:e.x+t.x,y:e.y+t.y}}function ey(e,t){return{x:e.x-t.x,y:e.y-t.y}}function Xb(e){const{clientOffset:t,initialClientOffset:r,initialSourceClientOffset:n}=e;return!t||!r||!n?null:ey(jb(t,n),r)}function Kb(e){const{clientOffset:t,initialClientOffset:r}=e;return!t||!r?null:ey(t,r)}const Ca=[],dh=[];Ca.__IS_NONE__=!0;dh.__IS_ALL__=!0;function Yb(e,t){return e===Ca?!1:e===dh||typeof t>"u"?!0:_b(t,e).length>0}class qb{subscribeToStateChange(t,r={}){const{handlerIds:n}=r;Fe(typeof t=="function","listener must be a function."),Fe(typeof n>"u"||Array.isArray(n),"handlerIds, when specified, must be an array of strings.");let i=this.store.getState().stateId;const o=()=>{const a=this.store.getState(),s=a.stateId;try{s===i||s===i+1&&!Yb(a.dirtyHandlerIds,n)||t()}finally{i=s}};return this.store.subscribe(o)}subscribeToOffsetChange(t){Fe(typeof t=="function","listener must be a function.");let r=this.store.getState().dragOffset;const n=()=>{const i=this.store.getState().dragOffset;i!==r&&(r=i,t())};return this.store.subscribe(n)}canDragSource(t){if(!t)return!1;const r=this.registry.getSource(t);return Fe(r,`Expected to find a valid source. sourceId=${t}`),this.isDragging()?!1:r.canDrag(this,t)}canDropOnTarget(t){if(!t)return!1;const r=this.registry.getTarget(t);if(Fe(r,`Expected to find a valid target. targetId=${t}`),!this.isDragging()||this.didDrop())return!1;const n=this.registry.getTargetType(t),i=this.getItemType();return p0(n,i)&&r.canDrop(this,t)}isDragging(){return!!this.getItemType()}isDraggingSource(t){if(!t)return!1;const r=this.registry.getSource(t,!0);if(Fe(r,`Expected to find a valid source. sourceId=${t}`),!this.isDragging()||!this.isSourcePublic())return!1;const n=this.registry.getSourceType(t),i=this.getItemType();return n!==i?!1:r.isDragging(this,t)}isOverTarget(t,r={shallow:!1}){if(!t)return!1;const{shallow:n}=r;if(!this.isDragging())return!1;const i=this.registry.getTargetType(t),o=this.getItemType();if(o&&!p0(i,o))return!1;const a=this.getTargetIds();if(!a.length)return!1;const s=a.indexOf(t);return n?s===a.length-1:s>-1}getItemType(){return this.store.getState().dragOperation.itemType}getItem(){return this.store.getState().dragOperation.item}getSourceId(){return this.store.getState().dragOperation.sourceId}getTargetIds(){return this.store.getState().dragOperation.targetIds}getDropResult(){return this.store.getState().dragOperation.dropResult}didDrop(){return this.store.getState().dragOperation.didDrop}isSourcePublic(){return!!this.store.getState().dragOperation.isSourcePublic}getInitialClientOffset(){return this.store.getState().dragOffset.initialClientOffset}getInitialSourceClientOffset(){return this.store.getState().dragOffset.initialSourceClientOffset}getClientOffset(){return this.store.getState().dragOffset.clientOffset}getSourceClientOffset(){return Xb(this.store.getState().dragOffset)}getDifferenceFromInitialOffset(){return Kb(this.store.getState().dragOffset)}constructor(t,r){this.store=t,this.registry=r}}const E1=typeof global<"u"?global:self,ty=E1.MutationObserver||E1.WebKitMutationObserver;function ry(e){return function(){const r=setTimeout(i,0),n=setInterval(i,50);function i(){clearTimeout(r),clearInterval(n),e()}}}function Qb(e){let t=1;const r=new ty(e),n=document.createTextNode("");return r.observe(n,{characterData:!0}),function(){t=-t,n.data=t}}const Zb=typeof ty=="function"?Qb:ry;class Jb{enqueueTask(t){const{queue:r,requestFlush:n}=this;r.length||(n(),this.flushing=!0),r[r.length]=t}constructor(){this.queue=[],this.pendingErrors=[],this.flushing=!1,this.index=0,this.capacity=1024,this.flush=()=>{const{queue:t}=this;for(;this.indexthis.capacity){for(let n=0,i=t.length-this.index;n{this.pendingErrors.push(t),this.requestErrorThrow()},this.requestFlush=Zb(this.flush),this.requestErrorThrow=ry(()=>{if(this.pendingErrors.length)throw this.pendingErrors.shift()})}}class e8{call(){try{this.task&&this.task()}catch(t){this.onError(t)}finally{this.task=null,this.release(this)}}constructor(t,r){this.onError=t,this.release=r,this.task=null}}class t8{create(t){const r=this.freeTasks,n=r.length?r.pop():new e8(this.onError,i=>r[r.length]=i);return n.task=t,n}constructor(t){this.onError=t,this.freeTasks=[]}}const ny=new Jb,r8=new t8(ny.registerPendingError);function n8(e){ny.enqueueTask(r8.create(e))}const hh="dnd-core/ADD_SOURCE",ph="dnd-core/ADD_TARGET",gh="dnd-core/REMOVE_SOURCE",Gu="dnd-core/REMOVE_TARGET";function i8(e){return{type:hh,payload:{sourceId:e}}}function o8(e){return{type:ph,payload:{targetId:e}}}function a8(e){return{type:gh,payload:{sourceId:e}}}function s8(e){return{type:Gu,payload:{targetId:e}}}function l8(e){Fe(typeof e.canDrag=="function","Expected canDrag to be a function."),Fe(typeof e.beginDrag=="function","Expected beginDrag to be a function."),Fe(typeof e.endDrag=="function","Expected endDrag to be a function.")}function u8(e){Fe(typeof e.canDrop=="function","Expected canDrop to be a function."),Fe(typeof e.hover=="function","Expected hover to be a function."),Fe(typeof e.drop=="function","Expected beginDrag to be a function.")}function g0(e,t){if(t&&Array.isArray(e)){e.forEach(r=>g0(r,!1));return}Fe(typeof e=="string"||typeof e=="symbol",t?"Type can only be a string, a symbol, or an array of either.":"Type can only be a string or a symbol.")}var sr;(function(e){e.SOURCE="SOURCE",e.TARGET="TARGET"})(sr||(sr={}));let c8=0;function f8(){return c8++}function d8(e){const t=f8().toString();switch(e){case sr.SOURCE:return`S${t}`;case sr.TARGET:return`T${t}`;default:throw new Error(`Unknown Handler Role: ${e}`)}}function _1(e){switch(e[0]){case"S":return sr.SOURCE;case"T":return sr.TARGET;default:throw new Error(`Cannot parse handler ID: ${e}`)}}function S1(e,t){const r=e.entries();let n=!1;do{const{done:i,value:[,o]}=r.next();if(o===t)return!0;n=!!i}while(!n);return!1}class h8{addSource(t,r){g0(t),l8(r);const n=this.addHandler(sr.SOURCE,t,r);return this.store.dispatch(i8(n)),n}addTarget(t,r){g0(t,!0),u8(r);const n=this.addHandler(sr.TARGET,t,r);return this.store.dispatch(o8(n)),n}containsHandler(t){return S1(this.dragSources,t)||S1(this.dropTargets,t)}getSource(t,r=!1){return Fe(this.isSourceId(t),"Expected a valid source ID."),r&&t===this.pinnedSourceId?this.pinnedSource:this.dragSources.get(t)}getTarget(t){return Fe(this.isTargetId(t),"Expected a valid target ID."),this.dropTargets.get(t)}getSourceType(t){return Fe(this.isSourceId(t),"Expected a valid source ID."),this.types.get(t)}getTargetType(t){return Fe(this.isTargetId(t),"Expected a valid target ID."),this.types.get(t)}isSourceId(t){return _1(t)===sr.SOURCE}isTargetId(t){return _1(t)===sr.TARGET}removeSource(t){Fe(this.getSource(t),"Expected an existing source."),this.store.dispatch(a8(t)),n8(()=>{this.dragSources.delete(t),this.types.delete(t)})}removeTarget(t){Fe(this.getTarget(t),"Expected an existing target."),this.store.dispatch(s8(t)),this.dropTargets.delete(t),this.types.delete(t)}pinSource(t){const r=this.getSource(t);Fe(r,"Expected an existing source."),this.pinnedSourceId=t,this.pinnedSource=r}unpinSource(){Fe(this.pinnedSource,"No source is pinned at the time."),this.pinnedSourceId=null,this.pinnedSource=null}addHandler(t,r,n){const i=d8(t);return this.types.set(i,r),t===sr.SOURCE?this.dragSources.set(i,n):t===sr.TARGET&&this.dropTargets.set(i,n),i}constructor(t){this.types=new Map,this.dragSources=new Map,this.dropTargets=new Map,this.pinnedSourceId=null,this.pinnedSource=null,this.store=t}}const p8=(e,t)=>e===t;function g8(e,t){return!e&&!t?!0:!e||!t?!1:e.x===t.x&&e.y===t.y}function m8(e,t,r=p8){if(e.length!==t.length)return!1;for(let n=0;n0||!m8(r,n)))return Ca;const a=n[n.length-1],s=r[r.length-1];return a!==s&&(a&&i.push(a),s&&i.push(s)),i}function x8(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function w8(e){for(var t=1;t=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}function I8(e,t){if(e==null)return{};var r={},n=Object.keys(e),i,o;for(o=0;o=0)&&(r[i]=e[i]);return r}let C1=0;const ul=Symbol.for("__REACT_DND_CONTEXT_INSTANCE__");var b8=x.memo(function(t){var{children:r}=t,n=P8(t,["children"]);const[i,o]=k8(n);return x.useEffect(()=>{if(o){const a=iy();return++C1,()=>{--C1===0&&(a[ul]=null)}}},[]),X(Q2.Provider,{value:i,children:r})});function k8(e){if("manager"in e)return[{dragDropManager:e.manager},!1];const t=$8(e.backend,e.context,e.options,e.debugMode),r=!e.context;return[t,r]}function $8(e,t=iy(),r,n){const i=t;return i[ul]||(i[ul]={dragDropManager:F8(e,t,r,n)}),i[ul]}function iy(){return typeof global<"u"?global:window}var N8=function e(t,r){if(t===r)return!0;if(t&&r&&typeof t=="object"&&typeof r=="object"){if(t.constructor!==r.constructor)return!1;var n,i,o;if(Array.isArray(t)){if(n=t.length,n!=r.length)return!1;for(i=n;i--!==0;)if(!e(t[i],r[i]))return!1;return!0}if(t.constructor===RegExp)return t.source===r.source&&t.flags===r.flags;if(t.valueOf!==Object.prototype.valueOf)return t.valueOf()===r.valueOf();if(t.toString!==Object.prototype.toString)return t.toString()===r.toString();if(o=Object.keys(t),n=o.length,n!==Object.keys(r).length)return!1;for(i=n;i--!==0;)if(!Object.prototype.hasOwnProperty.call(r,o[i]))return!1;for(i=n;i--!==0;){var a=o[i];if(!e(t[a],r[a]))return!1}return!0}return t!==t&&r!==r};const M8=qa(N8),fi=typeof window<"u"?x.useLayoutEffect:x.useEffect;function L8(e,t,r){const[n,i]=x.useState(()=>t(e)),o=x.useCallback(()=>{const a=t(e);M8(n,a)||(i(a),r&&r())},[n,e,r]);return fi(o),[n,o]}function B8(e,t,r){const[n,i]=L8(e,t,r);return fi(function(){const a=e.getHandlerId();if(a!=null)return e.subscribeToStateChange(i,{handlerIds:[a]})},[e,i]),n}function oy(e,t,r){return B8(t,e||(()=>({})),()=>r.reconnect())}function ay(e,t){const r=[...t||[]];return t==null&&typeof e!="function"&&r.push(e),x.useMemo(()=>typeof e=="function"?e():e,r)}function U8(e){return x.useMemo(()=>e.hooks.dragSource(),[e])}function H8(e){return x.useMemo(()=>e.hooks.dragPreview(),[e])}let jc=!1,Xc=!1;class V8{receiveHandlerId(t){this.sourceId=t}getHandlerId(){return this.sourceId}canDrag(){Fe(!jc,"You may not call monitor.canDrag() inside your canDrag() implementation. Read more: http://react-dnd.github.io/react-dnd/docs/api/drag-source-monitor");try{return jc=!0,this.internalMonitor.canDragSource(this.sourceId)}finally{jc=!1}}isDragging(){if(!this.sourceId)return!1;Fe(!Xc,"You may not call monitor.isDragging() inside your isDragging() implementation. Read more: http://react-dnd.github.io/react-dnd/docs/api/drag-source-monitor");try{return Xc=!0,this.internalMonitor.isDraggingSource(this.sourceId)}finally{Xc=!1}}subscribeToStateChange(t,r){return this.internalMonitor.subscribeToStateChange(t,r)}isDraggingSource(t){return this.internalMonitor.isDraggingSource(t)}isOverTarget(t,r){return this.internalMonitor.isOverTarget(t,r)}getTargetIds(){return this.internalMonitor.getTargetIds()}isSourcePublic(){return this.internalMonitor.isSourcePublic()}getSourceId(){return this.internalMonitor.getSourceId()}subscribeToOffsetChange(t){return this.internalMonitor.subscribeToOffsetChange(t)}canDragSource(t){return this.internalMonitor.canDragSource(t)}canDropOnTarget(t){return this.internalMonitor.canDropOnTarget(t)}getItemType(){return this.internalMonitor.getItemType()}getItem(){return this.internalMonitor.getItem()}getDropResult(){return this.internalMonitor.getDropResult()}didDrop(){return this.internalMonitor.didDrop()}getInitialClientOffset(){return this.internalMonitor.getInitialClientOffset()}getInitialSourceClientOffset(){return this.internalMonitor.getInitialSourceClientOffset()}getSourceClientOffset(){return this.internalMonitor.getSourceClientOffset()}getClientOffset(){return this.internalMonitor.getClientOffset()}getDifferenceFromInitialOffset(){return this.internalMonitor.getDifferenceFromInitialOffset()}constructor(t){this.sourceId=null,this.internalMonitor=t.getMonitor()}}let Kc=!1;class W8{receiveHandlerId(t){this.targetId=t}getHandlerId(){return this.targetId}subscribeToStateChange(t,r){return this.internalMonitor.subscribeToStateChange(t,r)}canDrop(){if(!this.targetId)return!1;Fe(!Kc,"You may not call monitor.canDrop() inside your canDrop() implementation. Read more: http://react-dnd.github.io/react-dnd/docs/api/drop-target-monitor");try{return Kc=!0,this.internalMonitor.canDropOnTarget(this.targetId)}finally{Kc=!1}}isOver(t){return this.targetId?this.internalMonitor.isOverTarget(this.targetId,t):!1}getItemType(){return this.internalMonitor.getItemType()}getItem(){return this.internalMonitor.getItem()}getDropResult(){return this.internalMonitor.getDropResult()}didDrop(){return this.internalMonitor.didDrop()}getInitialClientOffset(){return this.internalMonitor.getInitialClientOffset()}getInitialSourceClientOffset(){return this.internalMonitor.getInitialSourceClientOffset()}getSourceClientOffset(){return this.internalMonitor.getSourceClientOffset()}getClientOffset(){return this.internalMonitor.getClientOffset()}getDifferenceFromInitialOffset(){return this.internalMonitor.getDifferenceFromInitialOffset()}constructor(t){this.targetId=null,this.internalMonitor=t.getMonitor()}}function z8(e,t,r){const n=r.getRegistry(),i=n.addTarget(e,t);return[i,()=>n.removeTarget(i)]}function G8(e,t,r){const n=r.getRegistry(),i=n.addSource(e,t);return[i,()=>n.removeSource(i)]}function m0(e,t,r,n){let i=r?r.call(n,e,t):void 0;if(i!==void 0)return!!i;if(e===t)return!0;if(typeof e!="object"||!e||typeof t!="object"||!t)return!1;const o=Object.keys(e),a=Object.keys(t);if(o.length!==a.length)return!1;const s=Object.prototype.hasOwnProperty.bind(t);for(let l=0;l, or turn it into a drag source or a drop target itself.`)}function X8(e){return(t=null,r=null)=>{if(!x.isValidElement(t)){const o=t;return e(o,r),o}const n=t;return j8(n),K8(n,r?o=>e(o,r):e)}}function sy(e){const t={};return Object.keys(e).forEach(r=>{const n=e[r];if(r.endsWith("Ref"))t[r]=e[r];else{const i=X8(n);t[r]=()=>i}}),t}function A1(e,t){typeof e=="function"?e(t):e.current=t}function K8(e,t){const r=e.ref;return Fe(typeof r!="string","Cannot connect React DnD to an element with an existing string ref. Please convert it to use a callback ref instead, or wrap it into a or
. Read more: https://reactjs.org/docs/refs-and-the-dom.html#callback-refs"),r?x.cloneElement(e,{ref:n=>{A1(r,n),A1(t,n)}}):x.cloneElement(e,{ref:t})}class Y8{receiveHandlerId(t){this.handlerId!==t&&(this.handlerId=t,this.reconnect())}get connectTarget(){return this.dragSource}get dragSourceOptions(){return this.dragSourceOptionsInternal}set dragSourceOptions(t){this.dragSourceOptionsInternal=t}get dragPreviewOptions(){return this.dragPreviewOptionsInternal}set dragPreviewOptions(t){this.dragPreviewOptionsInternal=t}reconnect(){const t=this.reconnectDragSource();this.reconnectDragPreview(t)}reconnectDragSource(){const t=this.dragSource,r=this.didHandlerIdChange()||this.didConnectedDragSourceChange()||this.didDragSourceOptionsChange();return r&&this.disconnectDragSource(),this.handlerId?t?(r&&(this.lastConnectedHandlerId=this.handlerId,this.lastConnectedDragSource=t,this.lastConnectedDragSourceOptions=this.dragSourceOptions,this.dragSourceUnsubscribe=this.backend.connectDragSource(this.handlerId,t,this.dragSourceOptions)),r):(this.lastConnectedDragSource=t,r):r}reconnectDragPreview(t=!1){const r=this.dragPreview,n=t||this.didHandlerIdChange()||this.didConnectedDragPreviewChange()||this.didDragPreviewOptionsChange();if(n&&this.disconnectDragPreview(),!!this.handlerId){if(!r){this.lastConnectedDragPreview=r;return}n&&(this.lastConnectedHandlerId=this.handlerId,this.lastConnectedDragPreview=r,this.lastConnectedDragPreviewOptions=this.dragPreviewOptions,this.dragPreviewUnsubscribe=this.backend.connectDragPreview(this.handlerId,r,this.dragPreviewOptions))}}didHandlerIdChange(){return this.lastConnectedHandlerId!==this.handlerId}didConnectedDragSourceChange(){return this.lastConnectedDragSource!==this.dragSource}didConnectedDragPreviewChange(){return this.lastConnectedDragPreview!==this.dragPreview}didDragSourceOptionsChange(){return!m0(this.lastConnectedDragSourceOptions,this.dragSourceOptions)}didDragPreviewOptionsChange(){return!m0(this.lastConnectedDragPreviewOptions,this.dragPreviewOptions)}disconnectDragSource(){this.dragSourceUnsubscribe&&(this.dragSourceUnsubscribe(),this.dragSourceUnsubscribe=void 0)}disconnectDragPreview(){this.dragPreviewUnsubscribe&&(this.dragPreviewUnsubscribe(),this.dragPreviewUnsubscribe=void 0,this.dragPreviewNode=null,this.dragPreviewRef=null)}get dragSource(){return this.dragSourceNode||this.dragSourceRef&&this.dragSourceRef.current}get dragPreview(){return this.dragPreviewNode||this.dragPreviewRef&&this.dragPreviewRef.current}clearDragSource(){this.dragSourceNode=null,this.dragSourceRef=null}clearDragPreview(){this.dragPreviewNode=null,this.dragPreviewRef=null}constructor(t){this.hooks=sy({dragSource:(r,n)=>{this.clearDragSource(),this.dragSourceOptions=n||null,v0(r)?this.dragSourceRef=r:this.dragSourceNode=r,this.reconnectDragSource()},dragPreview:(r,n)=>{this.clearDragPreview(),this.dragPreviewOptions=n||null,v0(r)?this.dragPreviewRef=r:this.dragPreviewNode=r,this.reconnectDragPreview()}}),this.handlerId=null,this.dragSourceRef=null,this.dragSourceOptionsInternal=null,this.dragPreviewRef=null,this.dragPreviewOptionsInternal=null,this.lastConnectedHandlerId=null,this.lastConnectedDragSource=null,this.lastConnectedDragSourceOptions=null,this.lastConnectedDragPreview=null,this.lastConnectedDragPreviewOptions=null,this.backend=t}}class q8{get connectTarget(){return this.dropTarget}reconnect(){const t=this.didHandlerIdChange()||this.didDropTargetChange()||this.didOptionsChange();t&&this.disconnectDropTarget();const r=this.dropTarget;if(this.handlerId){if(!r){this.lastConnectedDropTarget=r;return}t&&(this.lastConnectedHandlerId=this.handlerId,this.lastConnectedDropTarget=r,this.lastConnectedDropTargetOptions=this.dropTargetOptions,this.unsubscribeDropTarget=this.backend.connectDropTarget(this.handlerId,r,this.dropTargetOptions))}}receiveHandlerId(t){t!==this.handlerId&&(this.handlerId=t,this.reconnect())}get dropTargetOptions(){return this.dropTargetOptionsInternal}set dropTargetOptions(t){this.dropTargetOptionsInternal=t}didHandlerIdChange(){return this.lastConnectedHandlerId!==this.handlerId}didDropTargetChange(){return this.lastConnectedDropTarget!==this.dropTarget}didOptionsChange(){return!m0(this.lastConnectedDropTargetOptions,this.dropTargetOptions)}disconnectDropTarget(){this.unsubscribeDropTarget&&(this.unsubscribeDropTarget(),this.unsubscribeDropTarget=void 0)}get dropTarget(){return this.dropTargetNode||this.dropTargetRef&&this.dropTargetRef.current}clearDropTarget(){this.dropTargetRef=null,this.dropTargetNode=null}constructor(t){this.hooks=sy({dropTarget:(r,n)=>{this.clearDropTarget(),this.dropTargetOptions=n,v0(r)?this.dropTargetRef=r:this.dropTargetNode=r,this.reconnect()}}),this.handlerId=null,this.dropTargetRef=null,this.dropTargetOptionsInternal=null,this.lastConnectedHandlerId=null,this.lastConnectedDropTarget=null,this.lastConnectedDropTargetOptions=null,this.backend=t}}function ko(){const{dragDropManager:e}=x.useContext(Q2);return Fe(e!=null,"Expected drag drop context"),e}function Q8(e,t){const r=ko(),n=x.useMemo(()=>new Y8(r.getBackend()),[r]);return fi(()=>(n.dragSourceOptions=e||null,n.reconnect(),()=>n.disconnectDragSource()),[n,e]),fi(()=>(n.dragPreviewOptions=t||null,n.reconnect(),()=>n.disconnectDragPreview()),[n,t]),n}function Z8(){const e=ko();return x.useMemo(()=>new V8(e),[e])}class J8{beginDrag(){const t=this.spec,r=this.monitor;let n=null;return typeof t.item=="object"?n=t.item:typeof t.item=="function"?n=t.item(r):n={},n??null}canDrag(){const t=this.spec,r=this.monitor;return typeof t.canDrag=="boolean"?t.canDrag:typeof t.canDrag=="function"?t.canDrag(r):!0}isDragging(t,r){const n=this.spec,i=this.monitor,{isDragging:o}=n;return o?o(i):r===t.getSourceId()}endDrag(){const t=this.spec,r=this.monitor,n=this.connector,{end:i}=t;i&&i(r.getItem(),r),n.reconnect()}constructor(t,r,n){this.spec=t,this.monitor=r,this.connector=n}}function ek(e,t,r){const n=x.useMemo(()=>new J8(e,t,r),[t,r]);return x.useEffect(()=>{n.spec=e},[e]),n}function tk(e){return x.useMemo(()=>{const t=e.type;return Fe(t!=null,"spec.type must be defined"),t},[e])}function rk(e,t,r){const n=ko(),i=ek(e,t,r),o=tk(e);fi(function(){if(o!=null){const[s,l]=G8(o,i,n);return t.receiveHandlerId(s),r.receiveHandlerId(s),l}},[n,t,r,i,o])}function nk(e,t){const r=ay(e,t);Fe(!r.begin,"useDrag::spec.begin was deprecated in v14. Replace spec.begin() with spec.item(). (see more here - https://react-dnd.github.io/react-dnd/docs/api/use-drag)");const n=Z8(),i=Q8(r.options,r.previewOptions);return rk(r,n,i),[oy(r.collect,n,i),U8(i),H8(i)]}function ik(e){return x.useMemo(()=>e.hooks.dropTarget(),[e])}function ok(e){const t=ko(),r=x.useMemo(()=>new q8(t.getBackend()),[t]);return fi(()=>(r.dropTargetOptions=e||null,r.reconnect(),()=>r.disconnectDropTarget()),[e]),r}function ak(){const e=ko();return x.useMemo(()=>new W8(e),[e])}function sk(e){const{accept:t}=e;return x.useMemo(()=>(Fe(e.accept!=null,"accept must be defined"),Array.isArray(t)?t:[t]),[t])}class lk{canDrop(){const t=this.spec,r=this.monitor;return t.canDrop?t.canDrop(r.getItem(),r):!0}hover(){const t=this.spec,r=this.monitor;t.hover&&t.hover(r.getItem(),r)}drop(){const t=this.spec,r=this.monitor;if(t.drop)return t.drop(r.getItem(),r)}constructor(t,r){this.spec=t,this.monitor=r}}function uk(e,t){const r=x.useMemo(()=>new lk(e,t),[t]);return x.useEffect(()=>{r.spec=e},[e]),r}function ck(e,t,r){const n=ko(),i=uk(e,t),o=sk(e);fi(function(){const[s,l]=z8(o,i,n);return t.receiveHandlerId(s),r.receiveHandlerId(s),l},[n,t,i,r,o.map(a=>a.toString()).join("|")])}function fk(e,t){const r=ay(e,t),n=ak(),i=ok(r.options);return ck(r,n,i),[oy(r.collect,n,i),ik(i)]}const ly=new RegExp("^([0-9]+)(\\s)([kKmMbBtT])$"),ru=new RegExp("^\\d{4}$"),dk=new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}|\\d{4}-\\d{2}-\\d{2}$");function hk({column:e,table:t,numberOfColumns:r}){function n(f){if(!f)return null;const d=new Date(f),h=d.toISOString().split("T")[0],m=d.toTimeString().split(" ")[0];return`${h} ${m}`}const i=t.getPreFilteredRowModel().flatRows.map(f=>f.original[e.id]),o=i.every(f=>typeof f=="string"||f===null),a=i.every(f=>typeof f=="number"||ly.test(f)||f===null||f===""),s=i.some(f=>typeof f=="string"&&f.includes(" ")),l=e.getFilterValue();let u="date";const c=i.every(f=>{const d=f==null?void 0:f.toString().replace(/[^0-9]/g,"").trim();return dk.test(f==null?void 0:f.toString())&&(u="datetime-local"),ru.test(f==null?void 0:f.toString())&&(u="number"),(d==null?void 0:d.length)>=4&&(Yl(e.id)||e.id.toLowerCase()==="index"&&!s)});return c&&u==="number"?Ce("div",{className:"flex gap-2 h-6",children:[X("input",{type:u,value:(l==null?void 0:l[0])??"",onChange:f=>{e.setFilterValue(d=>[`${f.target.value}`,`${d==null?void 0:d[1]}`])},min:i.reduce((f,d)=>Math.min(f,parseInt(d,10)),1/0),max:i.reduce((f,d)=>Math.max(f,parseInt(d,10)),-1/0),placeholder:"Start year",className:"_input",title:"Start year"}),X("input",{type:u,value:(l==null?void 0:l[1])??"",onChange:f=>{e.setFilterValue(d=>[`${d==null?void 0:d[0]}`,`${f.target.value}`])},min:i.reduce((f,d)=>Math.min(f,parseInt(d,10)),1/0),max:i.reduce((f,d)=>Math.max(f,parseInt(d,10)),-1/0),placeholder:"End year",className:"_input",title:"End year"})]}):c&&u!=="number"?Ce("div",{className:"flex gap-2 h-6",children:[X("input",{type:u,value:n(l==null?void 0:l[0])??"",onChange:f=>{const d=new Date(f.target.value).getTime();e.setFilterValue(h=>[d,h==null?void 0:h[1]])},placeholder:"Start date",className:"_input",title:"Start date"}),X("input",{type:u,value:n(l==null?void 0:l[1])??"",onChange:f=>{const d=new Date(f.target.value).getTime();e.setFilterValue(h=>[h==null?void 0:h[0],d])},placeholder:"End date",className:"_input",title:"End date"})]}):a?Ce("div",{className:"flex gap-0.5 h-6",children:[X("input",{type:"number",value:(l==null?void 0:l[0])??"",onChange:f=>e.setFilterValue(d=>[f.target.value,d==null?void 0:d[1]]),placeholder:"Min",className:"_input p-0.5",title:"Min"}),X("input",{type:"number",value:(l==null?void 0:l[1])??"",onChange:f=>e.setFilterValue(d=>[d==null?void 0:d[0],f.target.value]),placeholder:"Max",className:"_input p-0.5",title:"Max"})]}):o?X("div",{className:"h-6",children:X("input",{type:"text",value:l??"",onChange:f=>e.setFilterValue(f.target.value),placeholder:"Search...",className:"_input",title:"Search"})}):X("div",{className:"h-6"})}const pk=(e,t,r)=>(r.splice(r.indexOf(t),0,r.splice(r.indexOf(e),1)[0]),[...r]),gk=({header:e,table:t,advanced:r,idx:n,lockFirstColumn:i,setLockFirstColumn:o})=>{const{getState:a,setColumnOrder:s}=t,{columnOrder:l}=a(),{column:u}=e,[,c]=fk({accept:"column",drop:p=>{const g=pk(p.id,u.id,l);s(g)}}),[{isDragging:f},d,h]=nk({collect:p=>({isDragging:p.isDragging()}),item:()=>u,type:"column"}),m=()=>X("div",{ref:h,className:"flex gap-1 flex-col",children:e.isPlaceholder?null:Ce(q1,{children:[Ce("div",{className:"font-bold uppercase text-grey-700 dark:text-white tracking-widest flex gap-2 whitespace-nowrap justify-between",children:[Ce("div",{onClick:u.getToggleSortingHandler(),className:Nt("flex gap-1",{"cursor-pointer select-none":u.getCanSort()}),children:[Kf(u.columnDef.header,e.getContext()),u.getCanSort()&&Ce("div",{className:"flex flex-col gap-0.5 items-center justify-center",children:[X("button",{className:Nt({"text-[#669DCB]":u.getIsSorted()==="asc","text-grey-600":u.getIsSorted()!=="asc"}),children:X("svg",{xmlns:"http://www.w3.org/2000/svg",width:"6",height:"4",fill:"none",viewBox:"0 0 11 5",children:X("path",{fill:"currentColor",d:"M10.333 5l-5-5-5 5"})})}),X("button",{className:Nt({"text-[#669DCB]":e.column.getIsSorted()==="desc","text-grey-600":e.column.getIsSorted()!=="desc"}),children:X("svg",{xmlns:"http://www.w3.org/2000/svg",width:"6",height:"4",fill:"none",viewBox:"0 0 11 5",children:X("path",{fill:"currentColor",d:"M.333 0l5 5 5-5"})})})]})]}),r&&u.id!=="select"&&X("button",{ref:d,className:"text-grey-600 hover:text-grey-800 dark:hover:text-white",children:X("svg",{xmlns:"http://www.w3.org/2000/svg",width:"12",height:"11",fill:"none",viewBox:"0 0 17 16",children:X("path",{stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",d:"M3.667 6l-2 2 2 2M6.333 3.333l2-2 2 2M10.333 12.667l-2 2-2-2M13 6l2 2-2 2M1.667 8H15M8.333 1.333v13.334"})})})]}),r&&u.getCanFilter()?X("div",{children:X(hk,{column:u,table:t,numberOfColumns:(l==null?void 0:l.length)??0})}):null]})});return Ce("th",{className:Nt("h-[70px] p-4 sticky",{"left-0 z-50 bg-white dark:bg-grey-900":n===0&&i}),colSpan:e.colSpan,style:{width:e.getSize()+10,opacity:f?.5:1},ref:c,children:[n===0?Ce(hb,{children:[X(pb,{asChild:!0,children:m()}),X(gb,{children:X(mb,{className:"bg-white text-black dark:text-white dark:bg-grey-900 border border-grey-200 dark:border-grey-800 rounded-md shadow-lg p-2 z-50 text-xs",children:X("div",{className:"flex flex-col gap-2",children:Ce("button",{onClick:()=>{o(!i)},className:"hover:bg-grey-300 dark:hover:bg-grey-800 rounded-md p-2",children:[i?"Unlock":"Lock"," first column"]})})})})]}):m(),X("button",{className:"resizer bg-grey-300/20 dark:hover:bg-white absolute top-0 right-0 w-0.5 h-full",onMouseDown:e.getResizeHandler(),onTouchStart:e.getResizeHandler()})]})};function mk({open:e,close:t}){const r=window.download_path||"~/OpenBBUserData/exports";return Ce(jv,{open:e,onOpenChange:t,children:[Ce("div",{id:"loading",className:"saving",children:[X("div",{id:"loading_text",className:"loading_text"}),X("div",{id:"loader",className:"loader"})]}),X(Xv,{onClick:t,className:"_modal-overlay"}),Ce(Kv,{className:"_modal",children:[X(Wf,{children:X(ql,{})}),X(Wf,{className:"_modal-close",onClick:t,style:{float:"right",marginTop:20},children:X(ql,{className:"w-6 h-6"})}),X(Yv,{className:"_modal-title",children:"Success"}),Ce("div",{id:"popup_title",className:"popup_content",style:{padding:"0px 2px 2px 5px",marginTop:5},children:[X("div",{style:{display:"flex",flexDirection:"column",gap:0,fontSize:14},children:X("div",{children:Ce("label",{htmlFor:"title_text",children:[X("b",{children:window.title})," has been downloaded to",X("br",{}),X("br",{}),X("a",{style:{color:"#FFDD00",marginTop:15},href:`${r}`,onClick:n=>{n.preventDefault(),window.pywry.open_file(r)},children:r})]})})}),X("div",{style:{float:"right",marginTop:20},children:X("button",{className:"_btn",style:{padding:"8px 16px",width:"100%"},onClick:t,children:"Close"})})]})]})]})}function vk({columns:e,data:t,type:r,setType:n,downloadFinished:i}){const o=()=>{switch(r){case"csv":Qg("csv",e,t,i);break;case"xlsx":Qg("xlsx",e,t,i);break;case"png":sP("table",i);break}};return Ce("div",{className:"flex gap-2 items-center",children:[X(Yi,{labelType:"row",value:r,onChange:a=>{n(a)},label:"Type",placeholder:"Select type",groups:[{label:"Type",items:w0.map(a=>({label:a,value:a}))}]}),X("button",{onClick:o,className:"_btn",children:"Export"})]})}const uy="DropdownMenu",[xk,a$]=ln(uy,[Bu]),Oi=Bu(),[wk,cy]=xk(uy),yk=e=>{const{__scopeDropdownMenu:t,children:r,dir:n,open:i,defaultOpen:o,onOpenChange:a,modal:s=!0}=e,l=Oi(t),u=x.useRef(null),[c=!1,f]=vo({prop:i,defaultProp:o,onChange:a});return x.createElement(wk,{scope:t,triggerId:Yr(),triggerRef:u,contentId:Yr(),open:c,onOpenChange:f,onOpenToggle:x.useCallback(()=>f(d=>!d),[f]),modal:s},x.createElement(G2,ge({},l,{open:c,onOpenChange:f,dir:n,modal:s}),r))},Ek="DropdownMenuTrigger",_k=x.forwardRef((e,t)=>{const{__scopeDropdownMenu:r,disabled:n=!1,...i}=e,o=cy(Ek,r),a=Oi(r);return x.createElement(j2,ge({asChild:!0},a),x.createElement(Ie.button,ge({type:"button",id:o.triggerId,"aria-haspopup":"menu","aria-expanded":o.open,"aria-controls":o.open?o.contentId:void 0,"data-state":o.open?"open":"closed","data-disabled":n?"":void 0,disabled:n},i,{ref:xd(t,o.triggerRef),onPointerDown:_e(e.onPointerDown,s=>{!n&&s.button===0&&s.ctrlKey===!1&&(o.onOpenToggle(),o.open||s.preventDefault())}),onKeyDown:_e(e.onKeyDown,s=>{n||(["Enter"," "].includes(s.key)&&o.onOpenToggle(),s.key==="ArrowDown"&&o.onOpenChange(!0),["Enter"," ","ArrowDown"].includes(s.key)&&s.preventDefault())})})))}),Sk=e=>{const{__scopeDropdownMenu:t,...r}=e,n=Oi(t);return x.createElement(X2,ge({},n,r))},Tk="DropdownMenuContent",Ck=x.forwardRef((e,t)=>{const{__scopeDropdownMenu:r,...n}=e,i=cy(Tk,r),o=Oi(r),a=x.useRef(!1);return x.createElement(K2,ge({id:i.contentId,"aria-labelledby":i.triggerId},o,n,{ref:t,onCloseAutoFocus:_e(e.onCloseAutoFocus,s=>{var l;a.current||(l=i.triggerRef.current)===null||l===void 0||l.focus(),a.current=!1,s.preventDefault()}),onInteractOutside:_e(e.onInteractOutside,s=>{const l=s.detail.originalEvent,u=l.button===0&&l.ctrlKey===!0,c=l.button===2||u;(!i.modal||c)&&(a.current=!0)}),style:{...e.style,"--radix-dropdown-menu-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-dropdown-menu-content-available-width":"var(--radix-popper-available-width)","--radix-dropdown-menu-content-available-height":"var(--radix-popper-available-height)","--radix-dropdown-menu-trigger-width":"var(--radix-popper-anchor-width)","--radix-dropdown-menu-trigger-height":"var(--radix-popper-anchor-height)"}}))}),Ak=x.forwardRef((e,t)=>{const{__scopeDropdownMenu:r,...n}=e,i=Oi(r);return x.createElement(rb,ge({},i,n,{ref:t}))}),Rk=x.forwardRef((e,t)=>{const{__scopeDropdownMenu:r,...n}=e,i=Oi(r);return x.createElement(nb,ge({},i,n,{ref:t}))}),Ok=x.forwardRef((e,t)=>{const{__scopeDropdownMenu:r,...n}=e,i=Oi(r);return x.createElement(ib,ge({},i,n,{ref:t}))}),Fk=yk,R1=_k,Dk=Sk,Pk=Ck,Ik=Ak,bk=Rk,Yc=Ok;function kk(e,t){x.useEffect(()=>{const r=n=>{!e.current||e.current.contains(n.target)||t(n)};return document.addEventListener("mousedown",r),document.addEventListener("touchstart",r),()=>{document.removeEventListener("mousedown",r),document.removeEventListener("touchstart",r)}},[e,t])}function O1({label:e,table:t,onlyIconTrigger:r=!1}){const[n,i]=x.useState(!1),o=x.useRef(null);kk(o,()=>i(!1)),x.useEffect(()=>{const s=l=>{l.key==="Escape"&&i(!1)};return document.addEventListener("keydown",s),()=>document.removeEventListener("keydown",s)},[]);function a(){t.resetColumnFilters(),i(!1)}return Ce(Fk,{open:n,children:[r?X(R1,{title:"Filter columns",onClick:()=>i(!n),children:X("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor",className:"w-7 h-7",children:X("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 3c2.755 0 5.455.232 8.083.678.533.09.917.556.917 1.096v1.044a2.25 2.25 0 01-.659 1.591l-5.432 5.432a2.25 2.25 0 00-.659 1.591v2.927a2.25 2.25 0 01-1.244 2.013L9.75 21v-6.568a2.25 2.25 0 00-.659-1.591L3.659 7.409A2.25 2.25 0 013 5.818V4.774c0-.54.384-1.006.917-1.096A48.32 48.32 0 0112 3z"})})}):Ce(Ik,{className:"flex flex-row items-center gap-2",children:[X(bk,{className:"whitespace-nowrap",children:e}),Ce(R1,{onClick:()=>i(!n),className:"bg-white text-black dark:bg-grey-900 dark:text-white whitespace-nowrap h-[36px] border-[1.5px] border-grey-700 rounded p-3 inline-flex items-center justify-center leading-none gap-[5px] shadow-[0_2px_10px] shadow-black/10 focus:shadow-[0_0_0_2px] focus:shadow-black data-[placeholder]:text-white outline-none","aria-label":e,children:[X("span",{children:"Filter columns"}),X(s0,{className:Nt({"transform rotate-180 duration-200 transition":n})})]})]}),X(Dk,{children:Ce(Pk,{sideOffset:10,ref:o,className:"z-50 bg-white/80 dark:bg-grey-900/80 backdrop-filter backdrop-blur flex flex-col gap-4 overflow-auto border-[1.5px] border-grey-700 rounded p-3 max-h-[500px] text-black dark:text-white",children:[X(Yc,{children:X("button",{className:"_btn w-full",onClick:a,children:"Clear Filters"})}),X(Yc,{children:Ce("label",{className:"flex items-center gap-2",children:[X("input",{type:"checkbox",checked:t.getIsAllColumnsVisible(),onChange:t.getToggleAllColumnsVisibilityHandler()}),"Toggle All"]})}),t.getAllLeafColumns().filter(s=>s.id!=="select").map(s=>X(Yc,{children:Ce("label",{className:"flex items-center gap-2",children:[X("input",{type:"checkbox",checked:s.getIsVisible(),onChange:s.getToggleVisibilityHandler()}),s.id]})},s.id))]})})]})}function fy(e){return typeof e!="number"?typeof e=="string"&&e.includes("All")?e:x0:e<1?x0:e}function $k({table:e,currentPage:t,setCurrentPage:r}){const n=e.getFilteredRowModel().rows.length||0;return Ce("div",{className:"hidden md:flex items-center gap-3",children:[X(Yi,{value:t,onChange:i=>{const o=fy(i);r(o),o.toString().includes("All")?e.setPageSize(n):e.setPageSize(o)},labelType:"row",label:"Rows per page",placeholder:"Select rows per page",groups:[{label:"Rows per page",items:[10,20,30,40,50,`All (${n})`].map(i=>({label:`${i}`,value:i}))}]}),Ce("span",{className:"flex items-center gap-1",children:[X("strong",{children:e.getState().pagination.pageIndex+1}),"of",X("strong",{children:e.getPageCount()})]}),Ce("div",{className:"hidden mdl:block",children:[X("button",{className:Nt("px-2",{"text-grey-400 dark:text-grey-700":!e.getCanPreviousPage(),"dark:text-white":e.getCanPreviousPage()}),onClick:()=>e.setPageIndex(0),disabled:!e.getCanPreviousPage(),children:"<<"}),X("button",{className:Nt("px-2",{"text-grey-400 dark:text-grey-700":!e.getCanPreviousPage(),"dark:text-white":e.getCanPreviousPage()}),onClick:()=>e.previousPage(),disabled:!e.getCanPreviousPage(),children:"<"}),X("button",{className:Nt("px-2",{"text-grey-400 dark:text-grey-700":!e.getCanNextPage(),"dark:text-white":e.getCanNextPage()}),onClick:()=>e.nextPage(),disabled:!e.getCanNextPage(),children:">"}),X("button",{className:Nt("px-2",{"text-grey-400 dark:text-grey-700":!e.getCanNextPage(),"dark:text-white":e.getCanNextPage()}),onClick:()=>e.setPageIndex(e.getPageCount()-1),disabled:!e.getCanNextPage(),children:">>"})]})]})}const Nk=new Date,Mk=50,x0=30;function Lk(e,t){try{const r=e.hasOwnProperty("index")?"index":e.hasOwnProperty("Index")?"Index":null,n=r?e[r]:null,i=e[t],o=typeof i,a=i==null?void 0:i.toString().replace(/[^0-9]/g,""),s=(a==null?void 0:a.length)>=4&&(Yl(t)||t.toLowerCase()==="index"||n&&typeof n=="string"&&(n.toLowerCase().includes("date")||n.toLowerCase().includes("day")||n.toLowerCase().includes("time")||n.toLowerCase().includes("timestamp")||n.toLowerCase().includes("year")||n.toLowerCase().includes("month")||n.toLowerCase().includes("week")||n.toLowerCase().includes("hour")||n.toLowerCase().includes("minute")));if(o==="string"&&i.startsWith("http")||!s)return(i==null?void 0:i.toString().length)??0;if(s&&!isNaN(new Date(i).getTime())&&!ru.test(i==null?void 0:i.toString())){if(typeof i=="string")return(i==null?void 0:i.toString().length)??0;try{const u=new Date(i);let c="";return u.getUTCHours()===0&&u.getUTCMinutes()===0&&u.getUTCSeconds()===0&&u.getMilliseconds()===0?c=u.toISOString().split("T")[0]:(c=u.toISOString(),c=`${c.split("T")[0]} ${c.split("T")[1].split(".")[0]}`),(c==null?void 0:c.toString().length)??0}catch{return(i==null?void 0:i.toString().length)??0}}return(i==null?void 0:i.toString().length)??0}catch{return 0}}const w0=["csv","xlsx","png"];function Bk({data:e,columns:t,title:r,initialTheme:n,cmd:i=""}){const[o,a]=Jo("exportType",w0[0]),[s,l]=x.useState(!1),[u,c]=JC(n),[f,d]=x.useState(u==="dark"),h=W=>{c(u),d(W)},[m,p]=Jo("rowsPerPage",x0,fy),[g,v]=Jo("advanced",!1),[w,y]=Jo("colors",!1),[E,b]=x.useState([]),[k,S]=x.useState(""),[C,A]=Jo("fontSize","1"),[L,B]=x.useState(!1),U=t.reduce((W,Q,le)=>(W[Q]=le{const ne=Math.max(...W.map($e=>Lk($e,Q)),le!=null&&le.length?(le==null?void 0:le.length)+8:0);return Math.min(200,ne*12)},ae=x.useMemo(()=>[...t.map((W,Q)=>({accessorKey:W,accessorFn:le=>{var ve,ut,gt;const me=le.hasOwnProperty("index")?"index":le.hasOwnProperty("Index")?"Index":t[0],Se=me?le[me]:null,ne=le[W],$e=((gt=(ut=(ve=ne==null?void 0:ne.toString())==null?void 0:ve.split("."))==null?void 0:ut[0])==null?void 0:gt.replace(/[^0-9]/g,""))??"",Pe=($e==null?void 0:$e.length)>=4&&(Yl(W)||W.toLowerCase()==="index"||Se&&typeof Se=="string"&&(Se.toLowerCase().includes("date")||Se.toLowerCase().includes("time")||Se.toLowerCase().includes("timestamp")||Se.toLowerCase().includes("year")||Se.toLowerCase().includes("month")||Se.toLowerCase().includes("week")||Se.toLowerCase().includes("hour")||Se.toLowerCase().includes("minute")));return Pe&&(ne==null?void 0:ne.length)===4&&ru.test(ne==null?void 0:ne.toString())?ne:Pe?typeof ne=="number"?ne:new Date(ne).getTime():ne},id:W,header:W,size:ee(e,W,W),footer:W,cell:({row:le})=>{var gt,bt,Br,$o;const me=le.original.hasOwnProperty("index")?"index":le.original.hasOwnProperty("Index")?"Index":t[0],Se=me?le.original[me]:null,ne=le.original[W],$e=typeof ne,Pe=((Br=(bt=(gt=ne==null?void 0:ne.toString())==null?void 0:gt.split("."))==null?void 0:bt[0])==null?void 0:Br.replace(/[^0-9]/g,""))??"",ve=(Pe==null?void 0:Pe.length)>=4&&(Yl(W)||W.toLowerCase()==="index"||Se&&typeof Se=="string"&&(Se.toLowerCase().includes("date")||Se.toLowerCase().includes("time")||Se.toLowerCase().includes("timestamp")||Se.toLowerCase().includes("year")));if($e==="string"&&ne.startsWith("http"))return X("a",{className:"_hyper-link",href:ne,target:"_blank",rel:"noreferrer",children:(ne==null?void 0:ne.length)>25?`${ne.substring(0,25)}...`:ne});if(ve&&(ne==null?void 0:ne.length)===4&&ru.test(ne==null?void 0:ne.toString()))return X("p",{children:ne});if(ve&&!isNaN(new Date(ne).getTime())){if(typeof ne=="string"){const Ze=ne.split("T")[0],We=($o=ne.split("T")[1])==null?void 0:$o.split(".")[0];return We==="00:00:00"?X("p",{children:Ze}):Ce("p",{children:[Ze," ",We]})}try{const Ze=new Date(ne);let We="";return Ze.getUTCHours()===0&&Ze.getUTCMinutes()===0&&Ze.getUTCSeconds()===0&&Ze.getMilliseconds()===0?We=Ze.toISOString().split("T")[0]:(We=Ze.toISOString(),We=`${We.split("T")[0]} ${We.split("T")[1].split(".")[0]}`),X("p",{children:We})}catch{return X("p",{children:ne})}}if($e==="number"||ly.test(ne==null?void 0:ne.toString())){let Ze=tP(ne,W);const We=Number(t0(ne));if(typeof Se=="string"&&n2(Se)){Ze=Number(t0(ne));const Fi=Ze<2?4:2;Ze=Ze.toLocaleString("en-US",{maximumFractionDigits:Fi,minimumFractionDigits:2})}return X("p",{className:Nt("whitespace-nowrap",{"text-black dark:text-white":!w,"text-[#16A34A]":We>0&&w,"text-[#F87171]":We<0&&w,"text-[#404040]":We===0&&w}),title:r2(ne).toString()??"",children:We!==0?We>0?`${Ze}`:`${Ze}`:Ze})}else if($e==="string")return X("div",{dangerouslySetInnerHTML:{__html:ZC(ne)}});return X("p",{children:ne})}}))],[g,w]),[he,Te]=x.useState(!1),[oe,ye]=x.useState(ae.map(W=>W.id)),te=()=>ye(t.map(W=>W.id)),O=x.useMemo(()=>{const W=oe.map(le=>le),Q=ae.map(le=>le.id);return!rP(W,Q)},[oe,ae]),M=aC({data:e,columns:ae,getCoreRowModel:YT(),getSortedRowModel:eC(),getFilteredRowModel:JT(),getPaginationRowModel:rC(),columnResizeMode:"onChange",onColumnVisibilityChange:G,onColumnOrderChange:ye,onSortingChange:b,onGlobalFilterChange:S,globalFilterFn:nP,state:{sorting:E,globalFilter:k,columnOrder:oe,columnVisibility:H},initialState:{pagination:{pageIndex:0,pageSize:typeof m=="string"?m.includes("All")?e==null?void 0:e.length:parseInt(m):m}}}),N=x.useRef(null),{rows:F}=M.getRowModel(),V=M.getVisibleFlatColumns(),[Y,J]=x.useState(!1);return x.useEffect(()=>{s&&(l(!1),J(!0))},[s]),Ce(q1,{children:[X(f5,{toast:{id:"max-columns",title:"Max 12 columns are visible by default",description:"You can change this by clicking on advanced and then top right 'Filter' button",status:"info"},open:L,setOpen:B}),X(mk,{open:Y,close:()=>J(!1)}),Ce("div",{ref:N,className:Nt("overflow-x-hidden h-screen"),children:[Ce("div",{className:"relative p-4",id:"table",children:[X("div",{className:"absolute -inset-0.5 bg-gradient-to-r rounded-md blur-md from-[#072e49]/30 via-[#0d345f]/30 to-[#0d3362]/30"}),Ce("div",{className:"border border-grey-500/60 dark:border-grey-200/60 bg-white dark:bg-grey-900 rounded overflow-hidden relative z-20",children:[Ce("div",{className:"_header relative gap-4 py-2 text-center text-xs flex items-center justify-between px-4 text-white",style:{fontSize:`${Number(C)*90}%`},children:[X("div",{className:"w-1/3",children:X("svg",{xmlns:"http://www.w3.org/2000/svg",width:"64",height:"40",fill:"none",viewBox:"0 0 64 40",children:X("path",{fill:"#fff",d:"M61.283 3.965H33.608v27.757h25.699V19.826H37.561v-3.965H63.26V3.965h-1.977zM39.538 23.792h15.815v3.965H37.561v-3.965h1.977zM59.306 9.913v1.983H37.561V7.931h21.745v1.982zM33.606 0h-3.954v3.965H33.606V0zM25.7 3.966H0V15.86h25.7v3.965H3.953v11.896h25.7V3.966h-3.955zm0 21.808v1.983H7.907v-3.965h17.791v1.982zm0-15.86v1.982H3.953V7.931h21.745v1.982zM37.039 35.693v2.952l-.246-.246-.245-.245-.245-.247-.245-.246-.246-.246-.245-.245-.245-.247-.247-.246-.245-.246-.245-.246-.245-.246-.246-.246h-.49v3.936h.49v-3.198l.246.246.245.246.245.246.245.246.246.246.246.246.245.247.246.245.245.246.245.247.245.246.246.245.245.246h.245v-3.936h-.49zM44.938 37.17h-.491v-1.477h-2.944v3.937h3.93v-2.46h-.495zm-2.944-.246v-.739h1.962v.984h-1.962v-.245zm2.944.984v1.23h-2.944V37.66h2.944v.247zM52.835 37.17h-.49v-1.477h-2.946v3.937h3.925v-2.46h-.489zm-2.944-.246v-.739h1.963v.984h-1.965l.002-.245zm2.944.984v1.23H49.89V37.66h2.946v.247zM29.174 35.693H25.739v3.936H29.663v-.491H26.229v-.984h2.943v-.493H26.229v-1.476h3.434v-.492h-.489zM13.37 35.693H9.934v3.937h3.925v-3.937h-.49zm0 .738v2.709h-2.945v-2.955h2.943l.001.246zM21.276 35.693h-3.435v3.937h.491v-1.476h3.434v-2.461h-.49zm0 .738v1.23h-2.944v-1.476h2.944v.246z"})})}),X("p",{className:"font-bold w-1/3 flex flex-col gap-0.5 items-center",children:r}),Ce("p",{className:"w-1/3 text-right text-xs",children:[new Intl.DateTimeFormat("en-GB",{dateStyle:"full",timeStyle:"long"}).format(Nk).replace(/:\d\d /," "),X("br",{}),X("span",{className:"text-grey-400",children:i})]})]}),X("div",{className:"overflow-auto max-h-[calc(100vh-170px)] smh:max-h-[calc(100vh-95px)]",children:Ce("table",{className:"text-sm relative",children:[X("thead",{className:"sticky top-0 bg-white dark:bg-grey-900",style:{fontSize:`${Number(C)*100}%`},children:M.getHeaderGroups().map((W,Q)=>X("tr",{children:W.headers.map((le,me)=>X(gk,{setLockFirstColumn:Te,lockFirstColumn:he,idx:me,advanced:g,header:le,table:M},le.id))},W.id))}),X("tbody",{children:M.getRowModel().rows.map((W,Q)=>X("tr",{className:"!h-[64px] border-b border-grey-400",style:{fontSize:`${Number(C)*100}%`},children:W.getVisibleCells().map((le,me)=>X("td",{className:Nt("whitespace-normal p-4 text-black dark:text-white",{"bg-white dark:bg-grey-850":Q%2===0,"bg-grey-100 dark:bg-[#202020]":Q%2===1,"sticky left-0 z-10":me===0&&he}),style:{width:le.column.getSize()},children:Kf(le.column.columnDef.cell,le.getContext())},le.id))},W.id))}),(F==null?void 0:F.length)>30&&(V==null?void 0:V.length)>4&&X("tfoot",{children:M.getFooterGroups().map(W=>X("tr",{children:W.headers.map(Q=>X("th",{colSpan:Q.colSpan,className:"text-grey-500 bg-grey-100 dark:bg-grey-850 font-normal text-left text-sm h-10 p-4",style:{width:Q.getSize(),fontSize:`${Number(C)*100}%`},children:Q.isPlaceholder?null:Kf(Q.column.columnDef.footer,Q.getContext())},Q.id))},W.id))})]})})]})]}),Ce("div",{className:"smh:hidden flex max-h-[68px] overflow-x-auto bg-white/70 dark:bg-grey-900/70 backdrop-filter backdrop-blur z-20 bottom-0 left-0 w-full gap-10 justify-between py-4 px-4 text-sm",children:[Ce("div",{className:"flex items-center gap-10",children:[Ce(jv,{children:[X(pT,{className:"_btn",children:"Settings"}),Ce(gT,{children:[X(Xv,{className:"_modal-overlay"}),Ce(Kv,{className:"_modal",children:[X(Wf,{className:"absolute top-[40px] right-[46px] text-grey-200 hover:text-white rounded-[4px] focus:outline focus:outline-2 focus:outline-grey-500",children:X(ql,{className:"w-6 h-6"})}),X(Yv,{className:"uppercase font-bold tracking-widest",children:"Settings"}),Ce("div",{className:"grid grid-cols-2 gap-2 mt-10 text-sm",children:[O&&X("button",{onClick:()=>te(),className:"_btn h-9",children:"Reset Order"}),X(Yi,{labelType:"row",value:f?"light":"dark",onChange:W=>{h(W!=="dark")},label:"Theme",placeholder:"Select theme",groups:[{label:"Theme",items:[{label:"Dark",value:"dark"},{label:"Light",value:"light"}]}]}),X(Yi,{labelType:"row",value:o,onChange:W=>{a(W)},label:"Export type",placeholder:"Select export type",groups:[{label:"Export type",items:w0.map(W=>({label:W,value:W}))}]}),X(Yi,{labelType:"row",value:C,onChange:A,label:"Font size",placeholder:"Select font size",groups:[{label:"Font size",items:[{label:"50%",value:"0.5"},{label:"75%",value:"0.75"},{label:"100%",value:"1"},{label:"125%",value:"1.25"},{label:"150%",value:"1.5"},{label:"175%",value:"1.75"},{label:"200%",value:"2"}]}]}),X(O1,{table:M,label:"Filter"}),X("div",{className:"flex gap-2 items-center",children:X(Yi,{labelType:"row",value:g?"advanced":"simple",onChange:W=>{v(W==="advanced")},label:"Type",placeholder:"Select type",groups:[{label:"Type",items:[{label:"Simple",value:"simple"},{label:"Advanced",value:"advanced"}]}]})}),Ce("div",{className:"flex gap-2 items-center",children:[X("label",{htmlFor:"colors",children:"Colors"}),X("input",{id:"colors",type:"checkbox",checked:w,onChange:()=>y(!w)})]})]})]})]})]}),X(O1,{onlyIconTrigger:!0,table:M,label:""})]}),X($k,{currentPage:m,setCurrentPage:p,table:M}),X(vk,{setType:a,type:o,columns:t,data:e,downloadFinished:l})]})]})]})}function dy(e){let t=null;return()=>(t==null&&(t=e()),t)}function Uk(e,t){return e.filter(r=>r!==t)}function Hk(e,t){const r=new Set,n=o=>r.add(o);e.forEach(n),t.forEach(n);const i=[];return r.forEach(o=>i.push(o)),i}class Vk{enter(t){const r=this.entered.length,n=i=>this.isNodeInDocument(i)&&(!i.contains||i.contains(t));return this.entered=Hk(this.entered.filter(n),[t]),r===0&&this.entered.length>0}leave(t){const r=this.entered.length;return this.entered=Uk(this.entered.filter(this.isNodeInDocument),t),r>0&&this.entered.length===0}reset(){this.entered=[]}constructor(t){this.entered=[],this.isNodeInDocument=t}}class Wk{initializeExposedProperties(){Object.keys(this.config.exposeProperties).forEach(t=>{Object.defineProperty(this.item,t,{configurable:!0,enumerable:!0,get(){return console.warn(`Browser doesn't allow reading "${t}" until the drop event.`),null}})})}loadDataTransfer(t){if(t){const r={};Object.keys(this.config.exposeProperties).forEach(n=>{const i=this.config.exposeProperties[n];i!=null&&(r[n]={value:i(t,this.config.matchesTypes),configurable:!0,enumerable:!0})}),Object.defineProperties(this.item,r)}}canDrag(){return!0}beginDrag(){return this.item}isDragging(t,r){return r===t.getSourceId()}endDrag(){}constructor(t){this.config=t,this.item={},this.initializeExposedProperties()}}const hy="__NATIVE_FILE__",py="__NATIVE_URL__",gy="__NATIVE_TEXT__",my="__NATIVE_HTML__",F1=Object.freeze(Object.defineProperty({__proto__:null,FILE:hy,HTML:my,TEXT:gy,URL:py},Symbol.toStringTag,{value:"Module"}));function qc(e,t,r){const n=t.reduce((i,o)=>i||e.getData(o),"");return n??r}const y0={[hy]:{exposeProperties:{files:e=>Array.prototype.slice.call(e.files),items:e=>e.items,dataTransfer:e=>e},matchesTypes:["Files"]},[my]:{exposeProperties:{html:(e,t)=>qc(e,t,""),dataTransfer:e=>e},matchesTypes:["Html","text/html"]},[py]:{exposeProperties:{urls:(e,t)=>qc(e,t,"").split(` +`),dataTransfer:e=>e},matchesTypes:["Url","text/uri-list"]},[gy]:{exposeProperties:{text:(e,t)=>qc(e,t,""),dataTransfer:e=>e},matchesTypes:["Text","text/plain"]}};function zk(e,t){const r=y0[e];if(!r)throw new Error(`native type ${e} has no configuration`);const n=new Wk(r);return n.loadDataTransfer(t),n}function Qc(e){if(!e)return null;const t=Array.prototype.slice.call(e.types||[]);return Object.keys(y0).filter(r=>{const n=y0[r];return n!=null&&n.matchesTypes?n.matchesTypes.some(i=>t.indexOf(i)>-1):!1})[0]||null}const Gk=dy(()=>/firefox/i.test(navigator.userAgent)),vy=dy(()=>!!window.safari);class D1{interpolate(t){const{xs:r,ys:n,c1s:i,c2s:o,c3s:a}=this;let s=r.length-1;if(t===r[s])return n[s];let l=0,u=a.length-1,c;for(;l<=u;){c=Math.floor(.5*(l+u));const h=r[c];if(ht)u=c-1;else return n[c]}s=Math.max(0,u);const f=t-r[s],d=f*f;return n[s]+i[s]*f+o[s]*d+a[s]*f*d}constructor(t,r){const{length:n}=t,i=[];for(let h=0;ht[h]{let k=new D1([0,.5,1],[l.y,l.y/c*m,l.y+m-c]).interpolate(d);return vy()&&o&&(k+=(window.devicePixelRatio-1)*m),k},g=()=>new D1([0,.5,1],[l.x,l.x/u*h,l.x+h-u]).interpolate(f),{offsetX:v,offsetY:w}=i,y=v===0||v,E=w===0||w;return{x:y?v:g(),y:E?w:p()}}class qk{get window(){if(this.globalContext)return this.globalContext;if(typeof window<"u")return window}get document(){var t;return!((t=this.globalContext)===null||t===void 0)&&t.document?this.globalContext.document:this.window?this.window.document:void 0}get rootElement(){var t;return((t=this.optionsArgs)===null||t===void 0?void 0:t.rootElement)||this.window}constructor(t,r){this.ownerDocument=null,this.globalContext=t,this.optionsArgs=r}}function Qk(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function P1(e){for(var t=1;t{this.sourcePreviewNodes.delete(t),this.sourcePreviewNodeOptions.delete(t)}}connectDragSource(t,r,n){this.sourceNodes.set(t,r),this.sourceNodeOptions.set(t,n);const i=a=>this.handleDragStart(a,t),o=a=>this.handleSelectStart(a);return r.setAttribute("draggable","true"),r.addEventListener("dragstart",i),r.addEventListener("selectstart",o),()=>{this.sourceNodes.delete(t),this.sourceNodeOptions.delete(t),r.removeEventListener("dragstart",i),r.removeEventListener("selectstart",o),r.setAttribute("draggable","false")}}connectDropTarget(t,r){const n=a=>this.handleDragEnter(a,t),i=a=>this.handleDragOver(a,t),o=a=>this.handleDrop(a,t);return r.addEventListener("dragenter",n),r.addEventListener("dragover",i),r.addEventListener("drop",o),()=>{r.removeEventListener("dragenter",n),r.removeEventListener("dragover",i),r.removeEventListener("drop",o)}}addEventListeners(t){t.addEventListener&&(t.addEventListener("dragstart",this.handleTopDragStart),t.addEventListener("dragstart",this.handleTopDragStartCapture,!0),t.addEventListener("dragend",this.handleTopDragEndCapture,!0),t.addEventListener("dragenter",this.handleTopDragEnter),t.addEventListener("dragenter",this.handleTopDragEnterCapture,!0),t.addEventListener("dragleave",this.handleTopDragLeaveCapture,!0),t.addEventListener("dragover",this.handleTopDragOver),t.addEventListener("dragover",this.handleTopDragOverCapture,!0),t.addEventListener("drop",this.handleTopDrop),t.addEventListener("drop",this.handleTopDropCapture,!0))}removeEventListeners(t){t.removeEventListener&&(t.removeEventListener("dragstart",this.handleTopDragStart),t.removeEventListener("dragstart",this.handleTopDragStartCapture,!0),t.removeEventListener("dragend",this.handleTopDragEndCapture,!0),t.removeEventListener("dragenter",this.handleTopDragEnter),t.removeEventListener("dragenter",this.handleTopDragEnterCapture,!0),t.removeEventListener("dragleave",this.handleTopDragLeaveCapture,!0),t.removeEventListener("dragover",this.handleTopDragOver),t.removeEventListener("dragover",this.handleTopDragOverCapture,!0),t.removeEventListener("drop",this.handleTopDrop),t.removeEventListener("drop",this.handleTopDropCapture,!0))}getCurrentSourceNodeOptions(){const t=this.monitor.getSourceId(),r=this.sourceNodeOptions.get(t);return P1({dropEffect:this.altKeyPressed?"copy":"move"},r||{})}getCurrentDropEffect(){return this.isDraggingNativeItem()?"copy":this.getCurrentSourceNodeOptions().dropEffect}getCurrentSourcePreviewNodeOptions(){const t=this.monitor.getSourceId(),r=this.sourcePreviewNodeOptions.get(t);return P1({anchorX:.5,anchorY:.5,captureDraggingState:!1},r||{})}isDraggingNativeItem(){const t=this.monitor.getItemType();return Object.keys(F1).some(r=>F1[r]===t)}beginDragNativeItem(t,r){this.clearCurrentDragSourceNode(),this.currentNativeSource=zk(t,r),this.currentNativeHandle=this.registry.addSource(t,this.currentNativeSource),this.actions.beginDrag([this.currentNativeHandle])}setCurrentDragSourceNode(t){this.clearCurrentDragSourceNode(),this.currentDragSourceNode=t;const r=1e3;this.mouseMoveTimeoutTimer=setTimeout(()=>{var n;return(n=this.rootElement)===null||n===void 0?void 0:n.addEventListener("mousemove",this.endDragIfSourceWasRemovedFromDOM,!0)},r)}clearCurrentDragSourceNode(){if(this.currentDragSourceNode){if(this.currentDragSourceNode=null,this.rootElement){var t;(t=this.window)===null||t===void 0||t.clearTimeout(this.mouseMoveTimeoutTimer||void 0),this.rootElement.removeEventListener("mousemove",this.endDragIfSourceWasRemovedFromDOM,!0)}return this.mouseMoveTimeoutTimer=null,!0}return!1}handleDragStart(t,r){t.defaultPrevented||(this.dragStartSourceIds||(this.dragStartSourceIds=[]),this.dragStartSourceIds.unshift(r))}handleDragEnter(t,r){this.dragEnterTargetIds.unshift(r)}handleDragOver(t,r){this.dragOverTargetIds===null&&(this.dragOverTargetIds=[]),this.dragOverTargetIds.unshift(r)}handleDrop(t,r){this.dropTargetIds.unshift(r)}constructor(t,r,n){this.sourcePreviewNodes=new Map,this.sourcePreviewNodeOptions=new Map,this.sourceNodes=new Map,this.sourceNodeOptions=new Map,this.dragStartSourceIds=null,this.dropTargetIds=[],this.dragEnterTargetIds=[],this.currentNativeSource=null,this.currentNativeHandle=null,this.currentDragSourceNode=null,this.altKeyPressed=!1,this.mouseMoveTimeoutTimer=null,this.asyncEndDragFrameId=null,this.dragOverTargetIds=null,this.lastClientOffset=null,this.hoverRafId=null,this.getSourceClientOffset=i=>{const o=this.sourceNodes.get(i);return o&&xy(o)||null},this.endDragNativeItem=()=>{this.isDraggingNativeItem()&&(this.actions.endDrag(),this.currentNativeHandle&&this.registry.removeSource(this.currentNativeHandle),this.currentNativeHandle=null,this.currentNativeSource=null)},this.isNodeInDocument=i=>!!(i&&this.document&&this.document.body&&this.document.body.contains(i)),this.endDragIfSourceWasRemovedFromDOM=()=>{const i=this.currentDragSourceNode;i==null||this.isNodeInDocument(i)||(this.clearCurrentDragSourceNode()&&this.monitor.isDragging()&&this.actions.endDrag(),this.cancelHover())},this.scheduleHover=i=>{this.hoverRafId===null&&typeof requestAnimationFrame<"u"&&(this.hoverRafId=requestAnimationFrame(()=>{this.monitor.isDragging()&&this.actions.hover(i||[],{clientOffset:this.lastClientOffset}),this.hoverRafId=null}))},this.cancelHover=()=>{this.hoverRafId!==null&&typeof cancelAnimationFrame<"u"&&(cancelAnimationFrame(this.hoverRafId),this.hoverRafId=null)},this.handleTopDragStartCapture=()=>{this.clearCurrentDragSourceNode(),this.dragStartSourceIds=[]},this.handleTopDragStart=i=>{if(i.defaultPrevented)return;const{dragStartSourceIds:o}=this;this.dragStartSourceIds=null;const a=Xs(i);this.monitor.isDragging()&&(this.actions.endDrag(),this.cancelHover()),this.actions.beginDrag(o||[],{publishSource:!1,getSourceClientOffset:this.getSourceClientOffset,clientOffset:a});const{dataTransfer:s}=i,l=Qc(s);if(this.monitor.isDragging()){if(s&&typeof s.setDragImage=="function"){const c=this.monitor.getSourceId(),f=this.sourceNodes.get(c),d=this.sourcePreviewNodes.get(c)||f;if(d){const{anchorX:h,anchorY:m,offsetX:p,offsetY:g}=this.getCurrentSourcePreviewNodeOptions(),y=Yk(f,d,a,{anchorX:h,anchorY:m},{offsetX:p,offsetY:g});s.setDragImage(d,y.x,y.y)}}try{s==null||s.setData("application/json",{})}catch{}this.setCurrentDragSourceNode(i.target);const{captureDraggingState:u}=this.getCurrentSourcePreviewNodeOptions();u?this.actions.publishDragSource():setTimeout(()=>this.actions.publishDragSource(),0)}else if(l)this.beginDragNativeItem(l);else{if(s&&!s.types&&(i.target&&!i.target.hasAttribute||!i.target.hasAttribute("draggable")))return;i.preventDefault()}},this.handleTopDragEndCapture=()=>{this.clearCurrentDragSourceNode()&&this.monitor.isDragging()&&this.actions.endDrag(),this.cancelHover()},this.handleTopDragEnterCapture=i=>{if(this.dragEnterTargetIds=[],this.isDraggingNativeItem()){var o;(o=this.currentNativeSource)===null||o===void 0||o.loadDataTransfer(i.dataTransfer)}if(!this.enterLeaveCounter.enter(i.target)||this.monitor.isDragging())return;const{dataTransfer:s}=i,l=Qc(s);l&&this.beginDragNativeItem(l,s)},this.handleTopDragEnter=i=>{const{dragEnterTargetIds:o}=this;if(this.dragEnterTargetIds=[],!this.monitor.isDragging())return;this.altKeyPressed=i.altKey,o.length>0&&this.actions.hover(o,{clientOffset:Xs(i)}),o.some(s=>this.monitor.canDropOnTarget(s))&&(i.preventDefault(),i.dataTransfer&&(i.dataTransfer.dropEffect=this.getCurrentDropEffect()))},this.handleTopDragOverCapture=i=>{if(this.dragOverTargetIds=[],this.isDraggingNativeItem()){var o;(o=this.currentNativeSource)===null||o===void 0||o.loadDataTransfer(i.dataTransfer)}},this.handleTopDragOver=i=>{const{dragOverTargetIds:o}=this;if(this.dragOverTargetIds=[],!this.monitor.isDragging()){i.preventDefault(),i.dataTransfer&&(i.dataTransfer.dropEffect="none");return}this.altKeyPressed=i.altKey,this.lastClientOffset=Xs(i),this.scheduleHover(o),(o||[]).some(s=>this.monitor.canDropOnTarget(s))?(i.preventDefault(),i.dataTransfer&&(i.dataTransfer.dropEffect=this.getCurrentDropEffect())):this.isDraggingNativeItem()?i.preventDefault():(i.preventDefault(),i.dataTransfer&&(i.dataTransfer.dropEffect="none"))},this.handleTopDragLeaveCapture=i=>{this.isDraggingNativeItem()&&i.preventDefault(),this.enterLeaveCounter.leave(i.target)&&(this.isDraggingNativeItem()&&setTimeout(()=>this.endDragNativeItem(),0),this.cancelHover())},this.handleTopDropCapture=i=>{if(this.dropTargetIds=[],this.isDraggingNativeItem()){var o;i.preventDefault(),(o=this.currentNativeSource)===null||o===void 0||o.loadDataTransfer(i.dataTransfer)}else Qc(i.dataTransfer)&&i.preventDefault();this.enterLeaveCounter.reset()},this.handleTopDrop=i=>{const{dropTargetIds:o}=this;this.dropTargetIds=[],this.actions.hover(o,{clientOffset:Xs(i)}),this.actions.drop({dropEffect:this.getCurrentDropEffect()}),this.isDraggingNativeItem()?this.endDragNativeItem():this.monitor.isDragging()&&this.actions.endDrag(),this.cancelHover()},this.handleSelectStart=i=>{const o=i.target;typeof o.dragDrop=="function"&&(o.tagName==="INPUT"||o.tagName==="SELECT"||o.tagName==="TEXTAREA"||o.isContentEditable||(i.preventDefault(),o.dragDrop()))},this.options=new qk(r,n),this.actions=t.getActions(),this.monitor=t.getMonitor(),this.registry=t.getRegistry(),this.enterLeaveCounter=new Vk(this.isNodeInDocument)}}const Jk=function(t,r,n){return new Zk(t,r,n)};function e$(){const[e,t]=x.useState(null),[r,n]=x.useState("Interactive Table");x.useEffect(()=>{const a=setInterval(()=>{if(window.json_data){const s=JSON.parse(window.json_data);console.log(s),t(s),s.title&&typeof s.title=="string"&&n(s.title),clearInterval(a)}},100);return()=>clearInterval(a)},[]);const o=(a=>{var h;if(!a)return null;const s=(h=a.title)==null?void 0:h.replace(/|<\/b>/g,"").replace(/ /g,"_"),l=new Date().toISOString().slice(0,10).replace(/-/g,""),u=new Date().toISOString().slice(11,19).replace(/:/g,"");window.title=`openbb_${s}_${l}_${u}`;const c=a.columns;a.index;const d=a.data.map((m,p)=>{const g={};return m.forEach((v,w)=>{g[c[w]]=v||(v===0?0:"")}),g});return{columns:c,data:d}})(e);return X("div",{className:"relative h-full bg-white dark:bg-black text-black dark:text-white",children:X(b8,{backend:Jk,children:o&&X(Bk,{title:r,data:o.data,columns:o.columns,initialTheme:e.theme&&typeof e.theme=="string"&&e.theme==="dark"?"dark":"light",cmd:(e==null?void 0:e.command_location)??""})})})}Ov.render(X(or.StrictMode,{children:X(e$,{})}),document.getElementById("root"));