diff --git a/.github/workflows/install-lint-test-on-mac.yml b/.github/workflows/install-lint-test-on-mac.yml index 784ceee91..515a447b9 100644 --- a/.github/workflows/install-lint-test-on-mac.yml +++ b/.github/workflows/install-lint-test-on-mac.yml @@ -17,7 +17,7 @@ jobs: matrix: python-version: # github.com/actions/python-versions/releases - 3.12 - # - 3.13.0-beta.4 + # - 3.13 steps: - name: Checkout Repo diff --git a/.github/workflows/install-lint-test-on-ubuntu.yml b/.github/workflows/install-lint-test-on-ubuntu.yml index 7b2ba3b0e..880056400 100644 --- a/.github/workflows/install-lint-test-on-ubuntu.yml +++ b/.github/workflows/install-lint-test-on-ubuntu.yml @@ -17,7 +17,7 @@ jobs: matrix: python-version: # github.com/actions/python-versions/releases - 3.12 - # - 3.13.0-beta.4 + # - 3.13 steps: - name: Checkout Repo diff --git a/.github/workflows/install-lint-test-on-win.yml b/.github/workflows/install-lint-test-on-win.yml index 023b46cd6..2dd54f2aa 100644 --- a/.github/workflows/install-lint-test-on-win.yml +++ b/.github/workflows/install-lint-test-on-win.yml @@ -17,7 +17,7 @@ jobs: matrix: python-version: # github.com/actions/python-versions/releases - 3.12 - - 3.13.0-beta.4 + - 3.13 steps: - name: Checkout Repo diff --git a/.gitignore b/.gitignore index 99c8aa593..fcd569ab9 100644 --- a/.gitignore +++ b/.gitignore @@ -39,6 +39,13 @@ docs/_build/ # DATA & EXAMPLE FILES # ==================== examples/**/*.json +!examples/**/package.json +!examples/**/package-lock.json + + +# Exception +!examples/semiconductor/semiconductor-ui/api/poetry.lock + .openssa/ test*.ipynb tmp/ diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 747814822..5794bc147 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -5,6 +5,8 @@ "charliermarsh.ruff", // Ruff + "davidanson.vscode-markdownlint", // MarkdownLint + "soulcode.vscode-unwanted-recommendations" // Unwanted Recommendations ], diff --git a/README.md b/README.md index feebbac63..74770e1eb 100644 --- a/README.md +++ b/README.md @@ -2,35 +2,30 @@ # OpenSSA: Neurosymbolic Agentic AI for Industrial Problem-Solving -**Why OpenSSA?** OpenSSA is an open-source neurosymbolic agentic AI framework -designed to solve complex, high-stakes problems in industries like semiconductor, manufacturing and finance, -where consistency, accuracy and deterministic outcomes are essential. +designed to solve complex, high-stakes problems in industries like semiconductor, energy and finance, +where consistency, accuracy and deterministic outcomes are paramount. -At the core of OpenSSA is the **Domain-Aware Neurosymbolic Agent (DANA)** architecture, -advancing AI from basic pattern-matching and information retrieval to true problem-solving. -It overcomes the limitations of traditional LLMs and RAG in high-precision, multi-step problem-solving -by combining **Hierarchical Task Plans (HTPs)** to structure complex programs and the **Observe-Orient-Decide-Act Reasoning (OODAR)** paradigm to execute such programs. +At the core of OpenSSA is the [__Domain-Aware Neurosymbolic Agent (DANA)__](https://arxiv.org/abs/2410.02823) architecture, +advancing generative AI from basic pattern matching and information retrieval to industrial-grade problem solving. By integrating domain-specific knowledge with neural and symbolic planning and reasoning, -OpenSSA consistently delivers accurate solutions for complex industrial challenges. +such as __Hierarchical Task Planning (HTP)__ for structuring programs +and __Observe-Orient-Decide-Act Reasoning (OODAR)__ for executing such programs, +OpenSSA DANA agents consistently deliver accurate solutions, often using much smaller models. ## Key Benefits of OpenSSA -- **Consistent Results**: Delivers repeatable, high-precision outcomes for complex tasks. -- **Advanced Problem-Solving**: Combines HTPs and OODAR for multi-step planning and reasoning. -- **Scalable Expertise**: Leverages domain knowledge to scale AI without heavy data requirements. -- **Resource Efficiency**: Uses smaller, resource-efficient models, minimizing computational costs. -- **Extensible and Developer-Friendly**: Supports diverse LLM backends and is fully customizable for industry-specific needs. +- __Consistent and Accurate Results__ for complex industrial problems +- __Scalable Expertise__ through AI agents incorporating deep domain knowledge from human experts +- __Economical and Efficient Computation__ thanks to usage of small models +- __Full Ownership__ of intellectual property when used with open-source models such as Llama ## Getting Started -- Install with __`pip install openssa`__ -_(supports Python 3.12 and 3.13)_ +- Install with __`pip install openssa`__ _(Python 3.12 and 3.13)_ + - For bleeding-edge capabilities: __`pip install https://github.com/aitomatic/openssa/archive/main.zip`__ -- For the latest capabilities: -__`pip install https://github.com/aitomatic/openssa/archive/main.zip`__. - -- Explore the `examples/` directory and developer guides and tutorials on our [documentation site](https://aitomatic.github.io/openssa). +- Explore the `examples/` directory and developer guides and tutorials on our [documentation site](https://aitomatic.github.io/openssa) ## [API Documentation](https://aitomatic.github.io/openssa/modules) @@ -38,7 +33,7 @@ __`pip install https://github.com/aitomatic/openssa/archive/main.zip`__. We welcome contributions from the community! -- Join the discussion on our [Community Forum](https://github.com/aitomatic/openssa/discussions) -- Submit pull requests for bug fixes, enhancements, or new features +- Join discussions on our [Community Forum](https://github.com/aitomatic/openssa/discussions) +- Submit pull requests for bug fixes, enhancements and new features For detailed guidelines, refer to our [Contribution Guide](CONTRIBUTING.md). diff --git a/docs/GETTING_STARTED.md b/docs/GETTING_STARTED.md index 79277276f..96e5025de 100644 --- a/docs/GETTING_STARTED.md +++ b/docs/GETTING_STARTED.md @@ -16,10 +16,10 @@ Go straight to [OpenSSA Streamlit app](https://openssa.streamlit.app/) and start ## Getting Started as a Developer -See some example user programs in the [examples/notebooks](./examples/notebooks) directory. For example, to see the sample use case on ALD semiconductor knowledge, do: +See some example user programs in the [examples](./examples) directory. For example, to see the sample use case on semiconductor knowledge, do: ```bash -% cd examples/notebooks +% cd examples/semiconductor ``` ### Common `make` targets for OpenSSA developers diff --git a/docs/diagrams/ssm-QA-vs-PS.drawio.png b/docs/diagrams/ssm-QA-vs-PS.drawio.png deleted file mode 100644 index b7258c66d..000000000 Binary files a/docs/diagrams/ssm-QA-vs-PS.drawio.png and /dev/null differ diff --git a/docs/diagrams/ssm-class-diagram.drawio.png b/docs/diagrams/ssm-class-diagram.drawio.png deleted file mode 100644 index 6825e32c1..000000000 Binary files a/docs/diagrams/ssm-class-diagram.drawio.png and /dev/null differ diff --git a/docs/diagrams/ssm-composability.drawio.png b/docs/diagrams/ssm-composability.drawio.png deleted file mode 100644 index b72645565..000000000 Binary files a/docs/diagrams/ssm-composability.drawio.png and /dev/null differ diff --git a/docs/diagrams/ssm-full-industrial-use-case.drawio.png b/docs/diagrams/ssm-full-industrial-use-case.drawio.png deleted file mode 100644 index 7d7a14e21..000000000 Binary files a/docs/diagrams/ssm-full-industrial-use-case.drawio.png and /dev/null differ diff --git a/docs/diagrams/ssm-industrial-use-case.drawio.png b/docs/diagrams/ssm-industrial-use-case.drawio.png deleted file mode 100644 index 343182cb4..000000000 Binary files a/docs/diagrams/ssm-industrial-use-case.drawio.png and /dev/null differ diff --git a/docs/diagrams/ssm-key-components.drawio.png b/docs/diagrams/ssm-key-components.drawio.png deleted file mode 100644 index 13770ee7d..000000000 Binary files a/docs/diagrams/ssm-key-components.drawio.png and /dev/null differ diff --git a/docs/diagrams/ssm-llama-index-integration-patterns.drawio.png b/docs/diagrams/ssm-llama-index-integration-patterns.drawio.png deleted file mode 100644 index 00a93dfb0..000000000 Binary files a/docs/diagrams/ssm-llama-index-integration-patterns.drawio.png and /dev/null differ diff --git a/docs/diagrams/ssm-llama-index-integration.drawio.png b/docs/diagrams/ssm-llama-index-integration.drawio.png deleted file mode 100644 index 557106f46..000000000 Binary files a/docs/diagrams/ssm-llama-index-integration.drawio.png and /dev/null differ diff --git a/docs/diagrams/ssm-team-of-experts.drawio.png b/docs/diagrams/ssm-team-of-experts.drawio.png deleted file mode 100644 index dc21e7437..000000000 Binary files a/docs/diagrams/ssm-team-of-experts.drawio.png and /dev/null differ diff --git a/examples/FinanceBench-Lite/.env.template b/examples/FinanceBench-Lite/.env.template new file mode 100644 index 000000000..9c9789785 --- /dev/null +++ b/examples/FinanceBench-Lite/.env.template @@ -0,0 +1,2 @@ +HF_API_KEY=[... HuggingFace API key if running HuggingFace-hosted models ...] +OPENAI_API_KEY=[... OpenAI API key if running on OpenAI services ...] diff --git a/examples/FinanceBench-Lite/.gitignore b/examples/FinanceBench-Lite/.gitignore new file mode 100644 index 000000000..1b80d89fc --- /dev/null +++ b/examples/FinanceBench-Lite/.gitignore @@ -0,0 +1,15 @@ +# data files +.data/ + +# environment variables +.env + +# iPython/Jupyter notebooks +*.ipynb + +# log files +.log/ +*.log + +# Streamlit secrets +.streamlit/secrets.toml diff --git a/examples/FinanceBench-Lite/Makefile b/examples/FinanceBench-Lite/Makefile new file mode 100644 index 000000000..dc5045571 --- /dev/null +++ b/examples/FinanceBench-Lite/Makefile @@ -0,0 +1,33 @@ +dana-solve: + @poetry run python dana.py ${id} + +dana-solve-w-knowledge: + @poetry run python dana.py ${id} --knowledge + +dana-solve-w-prog-store: + @poetry run python dana.py ${id} --prog-store + +dana-solve-w-knowledge-and-prog-store: + @poetry run python dana.py ${id} --knowledge --prog-store + +dana-solve-w-llama3: + @poetry run python dana.py ${id} --llama3 + +dana-solve-w-knowledge-w-llama3: + @poetry run python dana.py ${id} --knowledge --llama3 + +dana-solve-w-prog-store-w-llama3: + @poetry run python dana.py ${id} --prog-store --llama3 + +dana-solve-w-knowledge-and-prog-store-w-llama3: + @poetry run python dana.py ${id} --knowledge --prog-store --llama3 + +dana-solve-all-combos: + @poetry run python dana.py ${id} + @poetry run python dana.py ${id} --knowledge + @poetry run python dana.py ${id} --prog-store + @poetry run python dana.py ${id} --knowledge --prog-store + @poetry run python dana.py ${id} --llama3 + @poetry run python dana.py ${id} --knowledge --llama3 + @poetry run python dana.py ${id} --prog-store --llama3 + @poetry run python dana.py ${id} --knowledge --prog-store --llama3 diff --git a/examples/FinanceBench-Lite/README.md b/examples/FinanceBench-Lite/README.md new file mode 100644 index 000000000..6b27245db --- /dev/null +++ b/examples/FinanceBench-Lite/README.md @@ -0,0 +1,58 @@ + + +# OpenSSA-FinanceBench Lite benchmarking + +This is a lite version of the benchmarking of `OpenSSA` performance +on the `FinanceBench` dataset. We will use 1 question from the dataset to demonstrate the use of `OpenSSA` with `DANA` architecture. + +## [`FinanceBench` Dataset](https://github.com/patronus-ai/financebench/blob/main/financebench_sample_150.csv) + +## Getting Started with DANA Agent + +Have Python 3.12 installed. + +__Install__ project, and update its dependencies from time to time: +__`make install`__. + +Create `.env` file following the `.env.template` and fill in necessary credentials. + +__Solve__ the problem corresponding to a problem `00807` `financebench_id`: +__`make dana-solve id=00807`__. + +### Question + +`Does 3M have a reasonably healthy liquidity profile based on its quick ratio for Q2 of FY2023? If the quick ratio is not relevant to measure liquidity, please state that and explain why.` + +### Knowledge + +To solve this question, you can add knowledge related to `liquidity`. See the example below: + +- Liquidity Metric Formulas + - `(Net) Working Capital` = `(Total) Current Assets` - `(Total) Current Liabilities` + - `Working Capital Ratio` = `(Total) Current Assets` / `(Total) Current Liabilities` + +Go to `knowledge-store.txt` to add relevant knowledge yourself and see how it helps the agent to solve this question. + +### Program + +With the above-provided knowledge, the program we can provide to the agent could be as below: + +- Goal: To assess liquidity health of a company, calculate `quick ratio` + - Task: To calculate `quick ratio`, use this formula + `Quick Ratio` = ( + (`Cash & Cash Equivalents` + + `Short-Term Investments or (Current) Marketable Securities` + + `(Net) Accounts Receivable, a.k.a. (Net) (Trade) Receivables`) + / `(Total) Current Liabilities` + ) + - Sub-task 1: What are values in dollars of `Cash & Cash Equivalents`? + - Sub-task 2: What are values in dollars of `Short-Term Investments or (Current) Marketable Securities`? + - Sub-task 3: What are values in dollars of `(Net) Accounts Receivable, a.k.a. (Net) (Trade) Receivables`? + - Sub-task 4: What are values in dolloars of `(Total) Current Liabilities`? + +Go to `program-store.yml` to see details of the program yourself! You can experimenting with different plans to see how it helps the agent solve the problem as well. + +## Advancing DANA Agent with Domain Knowledge and Program Store + +- To solve the question with added domain knowledge, run `make dana-solve-w-knowledge id=00807` +- To solve the question with added domain knowledge and program store, run `make dana-solve-w-knowledge-and-prog-store id=00807` diff --git a/examples/FinanceBench-Lite/dana.py b/examples/FinanceBench-Lite/dana.py new file mode 100644 index 000000000..92ec4ee61 --- /dev/null +++ b/examples/FinanceBench-Lite/dana.py @@ -0,0 +1,155 @@ +from argparse import ArgumentParser +from functools import cache + +from openssa import DANA, ProgramStore, HTP, HTPlanner, FileResource, LMConfig +from openssa.core.util.lm.huggingface import HuggingFaceLM +from openssa.core.util.lm.openai import OpenAILM, default_llama_index_openai_lm + +# pylint: disable=wrong-import-order,wrong-import-position +from data_and_knowledge import (DocName, FbId, Answer, Doc, FB_ID_COL_NAME, DOC_NAMES_BY_FB_ID, QS_BY_FB_ID, + EXPERT_KNOWLEDGE, EXPERT_PROGRAMS, EXPERT_HTP_COMPANY_KEY, EXPERT_HTP_PERIOD_KEY) +from util import QAFunc, enable_batch_qa_and_eval, log_qa_and_update_output_file + + +@cache +def get_main_lm(use_llama3: bool = False): + return (HuggingFaceLM if use_llama3 else OpenAILM).from_defaults() + + +@cache +def get_or_create_expert_program_store(use_llama3: bool = False) -> ProgramStore: + program_store = ProgramStore(lm=get_main_lm(use_llama3=use_llama3)) + + for program_name, htp_dict in EXPERT_PROGRAMS.items(): + htp = HTP.from_dict(htp_dict) + program_store.add_or_update_program(name=program_name, description=htp.task.ask, program=htp) + + return program_store + + +@cache +def get_or_create_agent(doc_name: DocName, expert_knowledge: bool = False, expert_programs: bool = False, + max_depth=3, max_subtasks_per_decomp=6, + use_llama3: bool = False, + llama_index_openai_lm_name: str = LMConfig.OPENAI_DEFAULT_MODEL) -> DANA: + # pylint: disable=too-many-arguments + return DANA(knowledge={EXPERT_KNOWLEDGE} if expert_knowledge else None, + + program_store=(get_or_create_expert_program_store(use_llama3=use_llama3) + if expert_programs + else ProgramStore()), + + programmer=HTPlanner(lm=get_main_lm(use_llama3=use_llama3), + max_depth=max_depth, max_subtasks_per_decomp=max_subtasks_per_decomp), + + resources={FileResource(path=Doc(name=doc_name).dir_path, + lm=default_llama_index_openai_lm(llama_index_openai_lm_name))}) + + +@cache +def get_or_create_adaptations(doc_name: DocName) -> dict[str, str]: + return {EXPERT_HTP_COMPANY_KEY: (doc := Doc(name=doc_name)).company, EXPERT_HTP_PERIOD_KEY: doc.period} + + +@enable_batch_qa_and_eval(output_name='DANA') +@log_qa_and_update_output_file(output_name='DANA') +def solve(fb_id: FbId) -> Answer: + return get_or_create_agent(doc_name=DOC_NAMES_BY_FB_ID[fb_id]).solve( + problem=QS_BY_FB_ID[fb_id], + adaptations_from_known_programs=get_or_create_adaptations(doc_name=DOC_NAMES_BY_FB_ID[fb_id])) + + +@enable_batch_qa_and_eval(output_name='DANA-wKnowledge') +@log_qa_and_update_output_file(output_name='DANA-wKnowledge') +def solve_with_knowledge(fb_id: FbId) -> Answer: + return get_or_create_agent(doc_name=DOC_NAMES_BY_FB_ID[fb_id], expert_knowledge=True).solve( + problem=QS_BY_FB_ID[fb_id], + adaptations_from_known_programs=get_or_create_adaptations(doc_name=DOC_NAMES_BY_FB_ID[fb_id])) + + +@enable_batch_qa_and_eval(output_name='DANA-wProgStore') +@log_qa_and_update_output_file(output_name='DANA-wProgStore') +def solve_with_program_store(fb_id: FbId) -> Answer: + return get_or_create_agent(doc_name=DOC_NAMES_BY_FB_ID[fb_id], expert_programs=True).solve( + problem=QS_BY_FB_ID[fb_id], + adaptations_from_known_programs=get_or_create_adaptations(doc_name=DOC_NAMES_BY_FB_ID[fb_id])) + + +@enable_batch_qa_and_eval(output_name='DANA-wKnowledge-wProgStore') +@log_qa_and_update_output_file(output_name='DANA-wKnowledge-wProgStore') +def solve_with_knowledge_and_program_store(fb_id: FbId) -> Answer: + return get_or_create_agent(DOC_NAMES_BY_FB_ID[fb_id], expert_knowledge=True, expert_programs=True).solve( + problem=QS_BY_FB_ID[fb_id], + adaptations_from_known_programs=get_or_create_adaptations(doc_name=DOC_NAMES_BY_FB_ID[fb_id])) + + +@enable_batch_qa_and_eval(output_name='DANA-wLlama3') +@log_qa_and_update_output_file(output_name='DANA-wLlama3') +def solve_with_llama3(fb_id: FbId) -> Answer: + return get_or_create_agent(doc_name=DOC_NAMES_BY_FB_ID[fb_id], use_llama3=True).solve( + problem=QS_BY_FB_ID[fb_id], + adaptations_from_known_programs=get_or_create_adaptations(doc_name=DOC_NAMES_BY_FB_ID[fb_id])) + + +@enable_batch_qa_and_eval(output_name='DANA-wKnowledge-wLlama3') +@log_qa_and_update_output_file(output_name='DANA-wKnowledge-wLlama3') +def solve_with_knowledge_with_llama3(fb_id: FbId) -> Answer: + return get_or_create_agent(doc_name=DOC_NAMES_BY_FB_ID[fb_id], expert_knowledge=True, use_llama3=True).solve( + problem=QS_BY_FB_ID[fb_id], + adaptations_from_known_programs=get_or_create_adaptations(doc_name=DOC_NAMES_BY_FB_ID[fb_id])) + + +@enable_batch_qa_and_eval(output_name='DANA-wProgStore-wLlama3') +@log_qa_and_update_output_file(output_name='DANA-wProgStore-wLlama3') +def solve_with_program_store_with_llama3(fb_id: FbId) -> Answer: + return get_or_create_agent(doc_name=DOC_NAMES_BY_FB_ID[fb_id], expert_programs=True, use_llama3=True).solve( + problem=QS_BY_FB_ID[fb_id], + adaptations_from_known_programs=get_or_create_adaptations(doc_name=DOC_NAMES_BY_FB_ID[fb_id])) + + +@enable_batch_qa_and_eval(output_name='DANA-wKnowledge-wProgStore-wLlama3') +@log_qa_and_update_output_file(output_name='DANA-wKnowledge-wProgStore-wLlama3') +def solve_with_knowledge_and_program_store_with_llama3(fb_id: FbId) -> Answer: + return get_or_create_agent(DOC_NAMES_BY_FB_ID[fb_id], expert_knowledge=True, expert_programs=True, use_llama3=True).solve( # noqa: E501 + problem=QS_BY_FB_ID[fb_id], + adaptations_from_known_programs=get_or_create_adaptations(doc_name=DOC_NAMES_BY_FB_ID[fb_id])) + + +if __name__ == '__main__': + arg_parser = ArgumentParser() + arg_parser.add_argument('fb_id') + arg_parser.add_argument('--from-id', action='store_true') + arg_parser.add_argument('--knowledge', action='store_true') + arg_parser.add_argument('--prog-store', action='store_true') + arg_parser.add_argument('--llama3', action='store_true') + args = arg_parser.parse_args() + + match (args.knowledge, args.prog_store, args.llama3): + case (False, False, False): + solve_func: QAFunc = solve + + case (True, False, False): + solve_func: QAFunc = solve_with_knowledge + + case (False, True, False): + solve_func: QAFunc = solve_with_program_store + + case (True, True, False): + solve_func: QAFunc = solve_with_knowledge_and_program_store + + case (False, False, True): + solve_func: QAFunc = solve_with_llama3 + + case (True, False, True): + solve_func: QAFunc = solve_with_knowledge_with_llama3 + + case (False, True, True): + solve_func: QAFunc = solve_with_program_store_with_llama3 + + case (True, True, True): + solve_func: QAFunc = solve_with_knowledge_and_program_store_with_llama3 + + if not (fb_id := args.fb_id).startswith(FB_ID_COL_NAME): + fb_id: FbId = f'{FB_ID_COL_NAME}_{fb_id}' + + solve_func(f'from:{fb_id}' if args.from_id else fb_id) diff --git a/examples/FinanceBench-Lite/data_and_knowledge.py b/examples/FinanceBench-Lite/data_and_knowledge.py new file mode 100644 index 000000000..7dbf1e41e --- /dev/null +++ b/examples/FinanceBench-Lite/data_and_knowledge.py @@ -0,0 +1,332 @@ +from __future__ import annotations + +from collections import Counter +from dataclasses import dataclass, field +import base64 +from enum import StrEnum +from functools import cached_property +from pathlib import Path +from typing import TypedDict, Required, NotRequired, Literal, TYPE_CHECKING + +from dotenv import load_dotenv +from pandas import DataFrame, read_json, read_csv +import requests +import yaml + +if TYPE_CHECKING: + from openssa.core.planning.hierarchical.plan import HTPDict + + +load_dotenv() + + +type DocName = str +type FbId = str +type Question = str +type Answer = str +type ExpertPlanId = str + + +class Category(StrEnum): + RETRIEVE: str = '0-RETRIEVE' + COMPARE: str = '1-COMPARE' + CALC_CHANGE: str = '2-CALC-CHANGE' + CALC_COMPLEX: str = '3-CALC-COMPLEX' + CALC_AND_JUDGE: str = '4-CALC-AND-JUDGE' + EXPLAIN_FACTORS: str = '5-EXPLAIN-FACTORS' + OTHER_ADVANCED: str = '6-OTHER-ADVANCED' + + +type GroundTruth = TypedDict('GroundTruth', {'sector': Required[str], + + 'company': Required[str], + 'period': Required[int], + 'doc-type': Required[str], + 'doc': Required[DocName], + + 'question-type': Required[str], + 'question-reasoning': Required[str], + 'domain-question-num': Required[str | None], + 'question': Required[Question], + + 'answer': Required[Answer], + 'justification': Required[str], + 'page(s)-0based': Required[int], + 'page(s)': Required[str], + + 'category': Required[Category], + 'correctness': Required[str], + 'answer-inadequate': NotRequired[Literal[True]], + 'evaluator-unreliable': NotRequired[Literal[True]]}, + total=False) + + +type RAGGroundTruths = TypedDict('RAGGroundTruths', {'defs': Required[dict[str, str]], + 'ground-truths': Required[dict[str, # doc + dict[str, # statement + dict[str, # line item + dict[int | str, # period + str # ground truth + ]]]]]}) + + +NON_BOT_REQUEST_HEADERS: dict[str, str] = { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3" +} + + +REPO_RAW_CONTENT_URL_PREFIX: str = 'https://raw.githubusercontent.com/patronus-ai/financebench' +DOC_INFO_URL: str = f'{REPO_RAW_CONTENT_URL_PREFIX}/main/data/financebench_document_information.jsonl' +METADATA_JSONL_URL: str = f'{REPO_RAW_CONTENT_URL_PREFIX}/main/data/financebench_open_source.jsonl' +METADATA_CSV_URL: str = f'{REPO_RAW_CONTENT_URL_PREFIX}/641ae9ece2cae93c671cf59c2d53742b51c7f1aa/financebench_sample_150.csv' + +FB_ID_COL_NAME: str = 'financebench_id' + +META_DF: DataFrame = (read_json(METADATA_JSONL_URL, + orient='records', typ='frame', + dtype=True, convert_axes=True, + convert_dates=True, keep_default_dates=True, + precise_float=False, date_unit=None, + encoding='utf-8', encoding_errors='strict', + lines=True, chunksize=None, + compression=None, nrows=None, + storage_options=None, + dtype_backend='pyarrow', engine='ujson') + + .merge(right=read_json( + DOC_INFO_URL, + orient='records', typ='frame', + dtype=True, convert_axes=True, + convert_dates=True, keep_default_dates=True, + precise_float=False, date_unit=None, + encoding='utf-8', encoding_errors='strict', + lines=True, chunksize=None, + compression=None, nrows=None, + storage_options=None, + dtype_backend='pyarrow', engine='ujson'), + + how='left', on='doc_name', # left_on='doc_name', right_on='doc_name', + left_index=False, right_index=False, + sort=False, + suffixes=('', '_'), + copy=False, + indicator=False, + validate=None # TODO: 'many_to_one' after Patronus AI fixes FOOTLOCKER_2022_annualreport + ) + + .set_index(keys=FB_ID_COL_NAME, + drop=True, append=False, + inplace=False, + verify_integrity=True)) + +META_DF.fillna(value='', method=None, axis=None, inplace=True, limit=None) # replace PyArrow NAs + +LEGACY_META_DF: DataFrame = read_csv(METADATA_CSV_URL, + sep=',', # delimiter=',', + header='infer', names=None, index_col=FB_ID_COL_NAME, usecols=None, + dtype=None, engine='pyarrow', converters=None, true_values=None, false_values=None, + skipinitialspace=False, skiprows=None, skipfooter=0, nrows=None, + na_values=None, na_filter=None, keep_default_na=True, + skip_blank_lines=True, + parse_dates=False, date_format=None, dayfirst=False, cache_dates=True, + iterator=False, chunksize=None, compression=None, + thousands=None, decimal='.', + lineterminator=None, + quotechar=None, quoting=0, doublequote=True, + escapechar=None, comment=None, + encoding='utf-8', encoding_errors='strict', + dialect=None, + on_bad_lines='error', + low_memory=True, memory_map=False, + float_precision=None, + storage_options=None, + dtype_backend='pyarrow') + +assert (META_DF.index == LEGACY_META_DF.index).all() +# assert (META_DF.doc_name == LEGACY_META_DF.doc_name).all() # J&J docs have been fixed +assert (META_DF.doc_period == LEGACY_META_DF.doc_period).all() +assert (META_DF.doc_link == LEGACY_META_DF.doc_link).all() +assert (META_DF.question_type == LEGACY_META_DF.question_type).all() +assert (META_DF.question == LEGACY_META_DF.question).all() +# assert (META_DF.answer == LEGACY_META_DF.answer).all() # 01107 answer has been fixed + +DOC_NAMES: list[DocName] = sorted(META_DF.doc_name.unique()) +DOC_LINKS_BY_NAME: dict[DocName, str] = dict(zip(META_DF.doc_name, META_DF.doc_link)) +DOC_NAMES_BY_FB_ID: dict[FbId, DocName] = META_DF.doc_name.to_dict() + +FB_IDS: list[FbId] = META_DF.index.to_list() +FB_IDS_BY_DOC_NAME: dict[DocName, list[FbId]] = META_DF.groupby('doc_name').apply(lambda _: _.index.to_list()) + +QS_BY_FB_ID: dict[FbId, Question] = META_DF.question.to_dict() + + +LOCAL_CACHE_DIR_PATH: Path = Path(__file__).parent / '.data' +LOCAL_CACHE_DOCS_DIR_PATH: Path = LOCAL_CACHE_DIR_PATH / 'docs' +OUTPUT_FILE_PATH: Path = LOCAL_CACHE_DIR_PATH / 'output.csv' + + +GROUND_TRUTHS_FILE_PATH = Path(__file__).parent / 'ground-truths.yml' +with open(file=GROUND_TRUTHS_FILE_PATH, + buffering=-1, + encoding='utf-8', + errors='strict', + newline=None, + closefd=True, + opener=None) as f: + GROUND_TRUTHS: dict[FbId, GroundTruth] = yaml.safe_load(stream=f) + +N_CASES: int = len(GROUND_TRUTHS) +CAT_DISTRIB: Counter[Category] = Counter(ground_truth['category'] for ground_truth in GROUND_TRUTHS.values()) + + +EXPERT_KNOWLEDGE_FILE_PATH: Path = Path(__file__).parent / 'knowledge-store.txt' +with open(file=EXPERT_KNOWLEDGE_FILE_PATH, + buffering=-1, + encoding='utf-8', + errors='strict', + newline=None, + closefd=True, + opener=None) as f: + EXPERT_KNOWLEDGE: str = f.read() + + +EXPERT_PROGRAMS_FILE_PATH: Path = Path(__file__).parent / 'program-store.yml' +with open(file=EXPERT_PROGRAMS_FILE_PATH, + buffering=-1, + encoding='utf-8', + errors='strict', + newline=None, + closefd=True, + opener=None) as f: + EXPERT_PROGRAMS: dict[ExpertPlanId, HTPDict] = yaml.safe_load(stream=f) + +EXPERT_HTP_COMPANY_KEY: str = 'COMPANY' +EXPERT_HTP_PERIOD_KEY: str = 'PERIOD' + + +RAG_GROUND_TRUTHS_FILE_PATH: Path = Path(__file__).parent / 'rag-ground-truths.yml' +with open(file=RAG_GROUND_TRUTHS_FILE_PATH, + buffering=-1, + encoding='utf-8', + errors='strict', + newline=None, + closefd=True, + opener=None) as f: + RAG_GROUND_TRUTHS: RAGGroundTruths = yaml.safe_load(stream=f) + + +@dataclass +class Doc: + name: DocName + company: str = field(init=False, repr=False) + period: str = field(init=False, repr=False) + type: str = field(init=False, repr=False) + + def __post_init__(self): + self.company, self.period, self.type = self.name.split(sep='_', maxsplit=2) + + def request(self) -> requests.Response: + try: + response: requests.Response = requests.get( + url=(url := ((base64.b64decode(doc_link.split(sep=q, maxsplit=-1)[-1], altchars=None) + .decode(encoding='utf-8', errors='strict')) + if (q := '?pdfTarget=') in (doc_link := DOC_LINKS_BY_NAME[self.name]) + else doc_link)), + timeout=60, + stream=True) + + except requests.exceptions.ConnectionError: + response: requests.Response = requests.get( + url=(url := f'{REPO_RAW_CONTENT_URL_PREFIX}/main/pdfs/{self.name}.pdf'), + timeout=60, + stream=True) + + if response.headers.get('Content-Type') != 'application/pdf': + response: requests.Response = requests.get(url=url, + headers=NON_BOT_REQUEST_HEADERS, + timeout=60, + stream=True) + + return response + + @cached_property + def dir_path(self) -> Path: + dir_path: Path = LOCAL_CACHE_DOCS_DIR_PATH / self.name + + if not (file_path := dir_path / f'{self.name}.pdf').is_file(): + dir_path.mkdir(parents=True, exist_ok=True) + + response: requests.Response = self.request() + + with open(file=file_path, mode='wb', buffering=-1, encoding=None, newline=None, closefd=True, opener=None) as f: + f.write(response.content) + + return dir_path + + @cached_property + def file_path(self) -> Path: + return self.dir_path / f'{self.name}.pdf' + + +def create_or_update_ground_truths() -> dict[FbId, GroundTruth]: + ground_truths: dict[FbId, GroundTruth] = {fb_id: {'sector': row.gics_sector, + 'company': row.company, 'period': row.doc_period, 'doc-type': row.doc_type, + 'doc': row.doc_name, + 'question-type': row.question_type, + 'question-reasoning': row.question_reasoning, + 'domain-question-num': row.domain_question_num, + 'question': row.question, + 'answer': row.answer, 'justification': row.justification, + 'page(s)-0based': row.evidence[0]['evidence_page_num']} + for fb_id, row in META_DF.iterrows()} + + if GROUND_TRUTHS_FILE_PATH.is_file(): + with open(file=GROUND_TRUTHS_FILE_PATH, + buffering=-1, + encoding='utf-8', + errors='strict', + newline=None, + closefd=True, + opener=None) as f: + existing_ground_truths: dict[FbId, GroundTruth] = yaml.safe_load(stream=f) + + for fb_id, ground_truth in ground_truths.items(): + if (existing_ground_truth := existing_ground_truths.get(fb_id)): + for existing_key in set(existing_ground_truth).difference(ground_truth): + ground_truth[existing_key] = existing_ground_truth[existing_key] + + with open(file=GROUND_TRUTHS_FILE_PATH, + mode='w', + buffering=-1, + encoding='utf-8', + errors='strict', + newline=None, + closefd=True, + opener=None) as f: + yaml.safe_dump(data=ground_truths, + stream=f, + default_style=None, + default_flow_style=False, + canonical=None, + indent=2, + width=80, + allow_unicode=True, + line_break=None, + encoding='utf-8', + explicit_start=None, + explicit_end=None, + version=None, + tags=None, + sort_keys=False) + + return ground_truths + + +def get_or_create_output_df() -> DataFrame: + output_df: DataFrame = (read_csv(OUTPUT_FILE_PATH, index_col=FB_ID_COL_NAME) + if OUTPUT_FILE_PATH.is_file() + else META_DF[['doc_name', 'question', 'answer']]) + + output_df.loc[:, 'category'] = [GROUND_TRUTHS[fb_id]['category'] for fb_id in output_df.index] + + return output_df diff --git a/examples/FinanceBench-Lite/eval.py b/examples/FinanceBench-Lite/eval.py new file mode 100644 index 000000000..77f491f4f --- /dev/null +++ b/examples/FinanceBench-Lite/eval.py @@ -0,0 +1,301 @@ +from __future__ import annotations + +import argparse +from collections import defaultdict +from functools import cache +from pprint import pprint +from typing import TYPE_CHECKING + +from dotenv import load_dotenv +from loguru import logger +from pandas import DataFrame, notna, read_csv +from tqdm import tqdm + +from openssa.core.util.lm.config import LMConfig +from openssa.core.util.lm.openai import OpenAILM + +# pylint: disable=wrong-import-order +from data_and_knowledge import (FbId, Question, Answer, Category, GroundTruth, + FB_ID_COL_NAME, GROUND_TRUTHS, N_CASES, CAT_DISTRIB, + LOCAL_CACHE_DIR_PATH, OUTPUT_FILE_PATH, get_or_create_output_df) +from log import switch_log_file + +if TYPE_CHECKING: + from openssa.core.util.lm.abstract import AbstractLM + + +EVAL_PROMPT_TEMPLATE: str = \ +"""You shall act as a judge of question-answering correctness. + +Given the posed QUESTION below, evaluate whether the ANSWER below is correct +according to the criteria specified in the CORRECTNESS EVALUATION RUBRIC below. + +- The evaluation should regard the ANSWER as responding to the QUESTION, + and hence the ANSWER does not need to repeat contextual information already in the QUESTION; + +- The evaluation should follow the RUBRIC strictly, + not looking for in the ANSWER more elaboration/explanation than what the RUBRIC explicitly requires; + +- Financial and technical terminology can be treated as case-insensitive. + +Output only a single word, either: +- YES: if you judge the ANSWER to be correct; or +- NO: if you judge the ANSWER to be incorrect. + +QUESTION: +--------- +``` +{question} +``` + +ANSWER TO EVALUATE: +------------------- +``` +{answer} +``` + +CORRECTNESS EVALUATION RUBRIC: +------------------------------ +``` +{rubric} +``` +""" # noqa: E122 + + +load_dotenv() + + +@cache +def get_lm(model='gpt-4o') -> AbstractLM: + return OpenAILM(model=model, api_key=LMConfig.OPENAI_API_KEY, api_base=LMConfig.OPENAI_API_URL) + + +def human_eval_recommended(fb_id: FbId) -> bool | None: + return (ground_truth := GROUND_TRUTHS[fb_id]).get('answer-inadequate') or ground_truth.get('evaluator-unreliable') + + +def eval_correctness(fb_id: FbId, answer: Answer, output_name: str | None = None, # pylint: disable=too-many-arguments + n_times: int = 9, human: bool = True, debug: bool = False) -> bool: + if output_name: + switch_log_file(fb_id=fb_id, output_name=output_name) + + question: Question = (ground_truth := GROUND_TRUTHS[fb_id])['question'] + rubric: str = ground_truth['correctness'] + prompt: str = EVAL_PROMPT_TEMPLATE.format(question=question, answer=answer, rubric=rubric) + + lm: AbstractLM = get_lm() + + for _ in range(n_times): + score: str = '' + + while score not in {'YES', 'NO'}: + score: str = lm.get_response(prompt=prompt, temperature=0) + + if score == 'NO': + logger.warning(f'\n{fb_id}\n{ground_truth['doc']}:\n{question}\n' + '\n' + f'ANSWER JUDGED TO BE INCORRECT:\n{answer}\n' + '\n' + f'RUBRIC:\n{rubric}' + + ('\n\n(*** EXPERT ANSWER KNOWN TO BE INADEQUATE ***)\n' + if GROUND_TRUTHS[fb_id].get('answer-inadequate') + else '\n')) + + if debug: + logger.debug(f'PROMPT:\n{prompt}') + + if human and human_eval_recommended(fb_id=fb_id): + human_eval_str: str = '' + while not human_eval_str: + human_eval_str: str = input('\n*** HUMAN EVALUATION ***: if answer is correct, type "Y": ').strip() + + correct: bool = human_eval_str.lower().startswith('y') + + else: + correct: bool = False + + break + + else: + correct: bool = True + + if output_name: + output_df: DataFrame = get_or_create_output_df() + output_df.loc[fb_id, f'{output_name}---CORRECTNESS']: bool = correct + output_df.to_csv(OUTPUT_FILE_PATH, index=True) + + return correct + + +def eval_all(output_name: str, refresh: bool = True, n_times: int = 9, human: bool = True, debug: bool = False): + # pylint: disable=too-many-locals + output_df: DataFrame = get_or_create_output_df() + + n_yes_scores_by_category: defaultdict = defaultdict(int) + incorrect_answer_fb_ids: dict[FbId, str] = {} + + for fb_id, answer in tqdm(output_df[output_name].items(), total=N_CASES): + ground_truth: GroundTruth = GROUND_TRUTHS[fb_id] + + if (eval_correctness(fb_id=fb_id, answer=answer, output_name=output_name, n_times=n_times, human=human, debug=debug) # noqa: E501 + if refresh + else (notna(correctness := output_df.loc[fb_id, f'{output_name}---CORRECTNESS']) and correctness)): + n_yes_scores_by_category[ground_truth['category']] += 1 + + else: + incorrect_answer_fb_ids[fb_id]: str = ('expert answer inadequate' + if ground_truth.get('answer-inadequate') + else ('evaluator unreliable' + if ground_truth.get('evaluator-unreliable') + else '')) + + logger.info(f'TOTAL CORRECT: {(n := sum(n_yes_scores_by_category.values()))} / {N_CASES} = {n / N_CASES:.1%}') + + pprint(correctness_by_category := {category: (f'{(n := n_yes_scores_by_category[category])} / {n_for_category} ' + f'= {n / n_for_category:.1%}') + for category, n_for_category in CAT_DISTRIB.items()}) + + pprint({ + 'EASY': (f'{(e := sum(n_yes_scores_by_category[easy_cat] + for easy_cat in (Category.RETRIEVE, Category.COMPARE, Category.CALC_CHANGE)))} / ' + f'{(se := sum(CAT_DISTRIB[easy_cat] + for easy_cat in (Category.RETRIEVE, Category.COMPARE, Category.CALC_CHANGE)))} ' + f'= {e / se:.1%}'), + + 'HARD': (f'{(h := sum(n_yes_scores_by_category[hard_cat] + for hard_cat in (Category.CALC_COMPLEX, Category.CALC_AND_JUDGE, + Category.EXPLAIN_FACTORS, Category.OTHER_ADVANCED)))} / ' + f'{(sh := sum(CAT_DISTRIB[hard_cat] + for hard_cat in (Category.CALC_COMPLEX, Category.CALC_AND_JUDGE, + Category.EXPLAIN_FACTORS, Category.OTHER_ADVANCED)))} ' + f'= {h / sh:.1%}') + }) + + logger.warning('INCORRECT:') + pprint(incorrect_answer_fb_ids) + + return correctness_by_category + + +def compare_eval(output_name: str, baseline_output_name: str = 'RAG-Default'): + output_df: DataFrame = get_or_create_output_df() + + baseline_correctness_by_category: dict[str, str] = eval_all(output_name=baseline_output_name, refresh=False) + correctness_by_category: dict[str, str] = eval_all(output_name=output_name, refresh=False) + pprint({category: {output_name: correctness_summary, baseline_output_name: baseline_correctness_by_category[category]} + for category, correctness_summary in correctness_by_category.items()}) + + output_df.loc[:, baseline_output_name] = output_df[f'{baseline_output_name}---CORRECTNESS'] + output_df.loc[:, output_name] = output_df[f'{output_name}---CORRECTNESS'] + return output_df.loc[output_df[output_name] != output_df[baseline_output_name], + ['doc_name', 'category', baseline_output_name, output_name]] + + +def eval_accuracy_and_consistency_wrt_ground_truths(output_name: str, output_file_names: list[str]): + # pylint: disable=too-many-locals + + n_output_files: int = len(output_file_names) + correctness_col_name: str = f'{output_name}---CORRECTNESS' + + n_yes_scores_by_fb_id: defaultdict = defaultdict(int) + incorrect_answer_fb_ids: dict[FbId, str] = {} + + for output_df in (read_csv(LOCAL_CACHE_DIR_PATH / output_file_name, index_col=FB_ID_COL_NAME) + for output_file_name in output_file_names): + + for fb_id, correctness in output_df[correctness_col_name].items(): + ground_truth: GroundTruth = GROUND_TRUTHS[fb_id] + + if notna(correctness) and correctness: + n_yes_scores_by_fb_id[fb_id] += 1 + + else: + incorrect_answer_fb_ids[fb_id]: str = ('expert answer inadequate' + if ground_truth.get('answer-inadequate') + else ('evaluator unreliable' + if ground_truth.get('evaluator-unreliable') + else '')) + + cumu_avg_accuracy_scores_by_category: defaultdict = defaultdict(int) + cumu_consistency_scores_by_category: defaultdict = defaultdict(float) + + for fb_id, ground_truth in GROUND_TRUTHS.items(): + cumu_avg_accuracy_scores_by_category[cat := ground_truth['category']] += (a := n_yes_scores_by_fb_id[fb_id] / n_output_files) + cumu_consistency_scores_by_category[cat] += 2 * abs(a - 0.5) + + print(f'TOTAL CORRECT: {(n := sum(cumu_avg_accuracy_scores_by_category.values()))} / {N_CASES} = {n / N_CASES:.1%}') + + pprint({category: (f'{(n := cumu_avg_accuracy_scores_by_category[category])} / {n_for_category} ' + f'= {n / n_for_category:.1%}') + for category, n_for_category in CAT_DISTRIB.items()}) + + pprint({ + 'EASY': (f'{(e := sum(cumu_avg_accuracy_scores_by_category[easy_cat] + for easy_cat in (Category.RETRIEVE, Category.COMPARE, Category.CALC_CHANGE)))} / ' + f'{(se := sum(CAT_DISTRIB[easy_cat] + for easy_cat in (Category.RETRIEVE, Category.COMPARE, Category.CALC_CHANGE)))} ' + f'= {e / se:.1%}'), + + 'HARD': (f'{(h := sum(cumu_avg_accuracy_scores_by_category[hard_cat] + for hard_cat in (Category.CALC_COMPLEX, Category.CALC_AND_JUDGE, + Category.EXPLAIN_FACTORS, Category.OTHER_ADVANCED)))} / ' + f'{(sh := sum(CAT_DISTRIB[hard_cat] + for hard_cat in (Category.CALC_COMPLEX, Category.CALC_AND_JUDGE, + Category.EXPLAIN_FACTORS, Category.OTHER_ADVANCED)))} ' + f'= {h / sh:.1%}') + }) + + print(f'\nTOTAL CONSISTENT: {(n := sum(cumu_consistency_scores_by_category.values()))} / {N_CASES} = {n / N_CASES:.1%}') + + pprint({category: (f'{(n := cumu_consistency_scores_by_category[category])} / {n_for_category} ' + f'= {n / n_for_category:.1%}') + for category, n_for_category in CAT_DISTRIB.items()}) + + pprint({ + 'EASY': (f'{(e := sum(cumu_consistency_scores_by_category[easy_cat] + for easy_cat in (Category.RETRIEVE, Category.COMPARE, Category.CALC_CHANGE)))} / ' + f'{(se := sum(CAT_DISTRIB[easy_cat] + for easy_cat in (Category.RETRIEVE, Category.COMPARE, Category.CALC_CHANGE)))} ' + f'= {e / se:.1%}'), + + 'HARD': (f'{(h := sum(cumu_consistency_scores_by_category[hard_cat] + for hard_cat in (Category.CALC_COMPLEX, Category.CALC_AND_JUDGE, + Category.EXPLAIN_FACTORS, Category.OTHER_ADVANCED)))} / ' + f'{(sh := sum(CAT_DISTRIB[hard_cat] + for hard_cat in (Category.CALC_COMPLEX, Category.CALC_AND_JUDGE, + Category.EXPLAIN_FACTORS, Category.OTHER_ADVANCED)))} ' + f'= {h / sh:.1%}') + }) + + print('\nINCORRECT:') + pprint(incorrect_answer_fb_ids) + + +if __name__ == '__main__': + arg_parser = argparse.ArgumentParser() + + arg_parser.add_argument('answer_col', help='Name of the column containing answers to evaluate') + arg_parser.add_argument('--id', default='all', help='FinanceBench Case ID') + arg_parser.add_argument('--n-times', type=int, default=9, help='Number of times to evaluate') + + arg_parser.add_argument('--human-eval', dest='human_eval', action='store_true', help='Human Evaluation ON') + arg_parser.add_argument('--no-human-eval', dest='human_eval', action='store_false', help='Human Evaluation OFF') + arg_parser.set_defaults(human_eval=True) + + arg_parser.add_argument('--refresh', dest='refresh', action='store_true', help='Evaluation Refreshing ON') + arg_parser.add_argument('--no-refresh', dest='refresh', action='store_false', help='Evaluation Refreshing OFF') + arg_parser.set_defaults(refresh=True) + + arg_parser.add_argument('--debug', action='store_true', help='Debug by printing out prompts') + + args = arg_parser.parse_args() + + if 'all' in args.id.lower(): + eval_all(output_name=args.answer_col, refresh=args.refresh, n_times=args.n_times, human=args.human_eval, debug=args.debug) # noqa: E501 + + else: + logger.info( + eval_correctness(fb_id=args.id, + answer=read_csv(OUTPUT_FILE_PATH, index_col=FB_ID_COL_NAME).loc[args.id, args.answer_col], + output_name=args.answer_col, + n_times=args.n_times, human=args.human_eval, debug=args.debug)) diff --git a/examples/FinanceBench-Lite/ground-truths.yml b/examples/FinanceBench-Lite/ground-truths.yml new file mode 100644 index 000000000..7cc0d1fc3 --- /dev/null +++ b/examples/FinanceBench-Lite/ground-truths.yml @@ -0,0 +1,4608 @@ +financebench_id_03029: + sector: Industrials + + company: 3M + period: 2018 + doc-type: 10k + doc: 3M_2018_10K + + question-type: metrics-generated + question-reasoning: Information extraction + domain-question-num: '' + question: What is the FY2018 capital expenditure amount (in USD millions) for 3M? + Give a response to the question by relying on the details shown in the cash flow + statement. + + answer: $1577.00 + justification: 'The metric capital expenditures was directly extracted from the + company 10K. The line item name, as seen in the 10K, was: Purchases of property, + plant and equipment (PP&E).' + page(s)-0based: 59 + page(s): '60' + + category: 0-RETRIEVE + correctness: >- + the answer contains a quantity equivalent to or approximately equal to + 1577, 1577 million, 1.577 billion, + 1600, 1600 million or 1.6 billion + + +financebench_id_04672: + sector: Industrials + + company: 3M + period: 2018 + doc-type: 10k + doc: 3M_2018_10K + + question-type: metrics-generated + question-reasoning: Information extraction + domain-question-num: '' + question: 'Assume that you are a public equities analyst. Answer the following question + by primarily using information that is shown in the balance sheet: what is the + year end FY2018 net PPNE for 3M? Answer in USD billions.' + + answer: $8.70 + justification: "The metric ppne, net was directly extracted from the company 10K.\ + \ The line item name, as seen in the 10K, was: Property, plant and equipment â\x80\ + \x94 net." + page(s)-0based: 57 + page(s): '58' + + category: 0-RETRIEVE + correctness: >- + the answer contains a quantity equivalent to or approximately equal to + 8.738, 8.738 billion, 8738 million, + 8.7, 8.7 billion or 8700 million + + evaluator-unreliable: true + + +financebench_id_00499: + sector: Industrials + + company: 3M + period: 2022 + doc-type: 10k + doc: 3M_2022_10K + + question-type: domain-relevant + question-reasoning: Logical reasoning (based on numerical reasoning) + domain-question-num: dg06 + question: Is 3M a capital-intensive business based on FY2022 data? + + answer: 'No, the company is managing its CAPEX and Fixed Assets pretty efficiently, + which is evident from below key metrics: + + CAPEX/Revenue Ratio: 5.1% + + Fixed assets/Total Assets: 20% + + Return on Assets= 12.4%' + justification: 'CAPEX/Revenue + + Fixed Assets/Total Assets + + ROA=Net Income/Total Assets' + page(s)-0based: 47 + page(s): 48,50,52 + + category: 6-OTHER-ADVANCED + correctness: |- + the answer opines that 3M is actually managing capital assets efficiently, and justifies such opinion + by certain calculated financial ratio metric value(s) showing at least one of the following: + - Fixed Assets is not large as proportion of Total Assets; + - Capital Expenditure (CapEx) is not high relative to Revenue; and/or + - Return on (Total) Assets (RoA or RoTA) is quite good + + evaluator-unreliable: true + + +financebench_id_01226: + sector: Industrials + + company: 3M + period: 2022 + doc-type: 10k + doc: 3M_2022_10K + + question-type: domain-relevant + question-reasoning: Logical reasoning (based on numerical reasoning) OR Numerical + reasoning OR Logical reasoning + domain-question-num: dg17 + question: What drove operating margin change as of FY2022 for 3M? If operating margin + is not a useful metric for a company like this, then please state that and explain + why. + + answer: "Operating Margin for 3M in FY2022 has decreased by 1.7% primarily due to:\ + \ \n-Decrease in gross Margin\n-mostly one-off charges including Combat Arms Earplugs\ + \ litigation, impairment related to exiting PFAS manufacturing, costs related\ + \ to exiting Russia and divestiture-related restructuring\ncharges" + justification: '' + page(s)-0based: 26 + page(s): '27' + + category: 0-RETRIEVE + correctness: |- + the answer mentions at least 1 salient change among those discussed below: + + COST OF SALES: + Cost of sales, measured as a percent of sales, increased in 2022 when compared to the same period last year. + Increases were primarily due to 2022 special item costs for significant litigation from additional commitments + to address PFAS-related matters at 3M's Zwijndrecht, Belgium site, higher raw materials and logistics costs, + manufacturing productivity headwinds which were further magnified by the shutdown of certain operations in Belgium + and progress on restarting previously-idled operations, and investments in growth, productivity and sustainability. + On a percent of sales basis, these increases were partially offset by increases in selling prices. + + SELLING, GENERAL AND ADMINISTRATIVE EXPENSES: + SG&A, measured as a percent of sales, increased in 2022 when compared to the same period last year. + SG&A was impacted by increased special item costs for significant litigation primarily related to steps toward + resolving Combat Arms Earplugs litigation resulting in a 2022 second quarter pre-tax charge of approximately $1.2 billion, + certain impairment costs related to exiting PFAS manufacturing, costs related to exiting Russia, + divestiture-related restructuring charges, and continued investment in key growth initiatives. + These increases were partially offset by restructuring benefits and ongoing general 3M cost management. + + RESEARCH, DEVELOPMENT AND RELATED EXPENSES: + R&D, measured as a percent of sales, decreased in 2022 when compared to the same period last year. + 3M continues to invest in a range of R&D activities from application development, product and manufacturing support, + product development and technology development aimed at disruptive innovations. + + GAIN ON BUSINESS DIVESTITURES: + In the third quarter of 2022, 3M recorded a pre-tax gain of $2.7 billion ($2.7 billion after tax) + related to the split-off and combination of its Food Safety business with Neogen Corporation. + + GOODWILL IMPAIRMENT EXPENSE: + As a result of 3M's commitment to exit per- and polyfluoroalkyl substance (PFAS) manufacturing, + 3M recorded a goodwill impairment charge related to the Advanced Materials reporting unit + (within the Transportation and Electronics business). + + +financebench_id_01865: # tricky: Total Sales Change contains zero Acquisitions but non-zero Divestitures + sector: Industrials + + company: 3M + period: 2022 + doc-type: 10k + doc: 3M_2022_10K + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: If we exclude the impact of M&A, which segment has dragged down 3M's overall + growth in 2022? + + answer: The consumer segment shrunk by 0.9% organically. + justification: '' + page(s)-0based: 24 + page(s): '25' + + category: 1-COMPARE + correctness: >- + the answer identifies Consumer segment as negative contributor + + +financebench_id_00807: + sector: Industrials + + company: 3M + period: 2023 + doc-type: 10q + doc: 3M_2023Q2_10Q + + question-type: domain-relevant + question-reasoning: Logical reasoning (based on numerical reasoning) OR Logical + reasoning + domain-question-num: dg01 + question: Does 3M have a reasonably healthy liquidity profile based on its quick + ratio for Q2 of FY2023? If the quick ratio is not relevant to measure liquidity, + please state that and explain why. + + answer: No. The quick ratio for 3M was 0.96 by Jun'23 close, which needs a bit of + an improvement to touch the 1x mark + justification: 'Quick Ratio= (Total current assets-Total inventories)/Total current + liabilities + + (15,754-5,280)/10,936' + page(s)-0based: 4 + page(s): '5' + + category: 4-CALC-AND-JUDGE + correctness: >- + the answer contains a calculated Quick Ratio decimal value that is over 0.75 but less than 1.00, + or, alternatively, a calculated percentage value that is over 75% but less than 100% + + +financebench_id_00941: + sector: Industrials + + company: 3M + period: 2023 + doc-type: 10q + doc: 3M_2023Q2_10Q + + question-type: domain-relevant + question-reasoning: Information extraction + domain-question-num: dg04 + question: Which debt securities are registered to trade on a national securities + exchange under 3M's name as of Q2 of 2023? + + answer: 'Following debt securities registered under 3M''s name are listed to trade + on the New York Stock Exchange: + + -1.500% Notes due 2026 (Trading Symbol: MMM26) + + -1.750% Notes due 2030 (Trading Symbol: MMM30) + + -1.500% Notes due 2031 (Trading Symbol: MMM31)' + justification: '' + page(s)-0based: 0 + page(s): '1' + + category: 0-RETRIEVE + correctness: >- + the answer mentions notes/securities due 2026, 2030 and 2031 + + evaluator-unreliable: true + + +financebench_id_01858: + sector: Industrials + + company: 3M + period: 2023 + doc-type: 10q + doc: 3M_2023Q2_10Q + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: Does 3M maintain a stable trend of dividend distribution? + + answer: Yes, not only they distribute the dividends on a routine basis, 3M has also + been increasing the per share dividend for consecutive 65 years + justification: '' + page(s)-0based: 61 + page(s): '62' + + category: 0-RETRIEVE + correctness: >- + the answer affirms that dividends have been stable, and/or mentions "65 years", "65th year" or something similar + + evaluator-unreliable: true + + +financebench_id_02987: + sector: Communication Services + + company: Activision Blizzard + period: 2019 + doc-type: 10k + doc: ACTIVISIONBLIZZARD_2019_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: 'What is the FY2019 fixed asset turnover ratio for Activision Blizzard? + Fixed asset turnover ratio is defined as: FY2019 revenue / (average PP&E between + FY2018 and FY2019). Round your answer to two decimal places. Base your judgments + on the information provided primarily in the statement of income and the statement + of financial position.' + + answer: '24.26' + justification: 'The metric in question was calculated using other simpler metrics. + The various simpler metrics (from the current and, if relevant, previous fiscal + year(s)) used were: + + + Metric 1: Total revenue. This metric was located in the 10K as a single line item + named: Total net revenues. + + + Metric 2: Ppne, net. This metric was located in the 10K as a single line item + named: Property and equipment, net.' + page(s)-0based: 68 + page(s): 69,70 + + category: 3-CALC-COMPLEX + correctness: >- + the answer contains a calculated Fixed Asset Turnover Ratio decimal value that is in the range from 23.00 to 25.00 + (if the answer is a single number, assume that it is that calculated Fixed Asset Turnover Ratio decimal value) + + evaluator-unreliable: true + + +financebench_id_07966: + sector: Communication Services + + company: Activision Blizzard + period: 2019 + doc-type: 10k + doc: ACTIVISIONBLIZZARD_2019_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: What is the FY2017 - FY2019 3 year average of capex as a % of revenue + for Activision Blizzard? Answer in units of percents and round to one decimal + place. Calculate (or extract) the answer from the statement of income and the + cash flow statement. + + answer: 1.9% + justification: 'The metric in question was calculated using other simpler metrics. + The various simpler metrics (from the current and, if relevant, previous fiscal + year(s)) used were: + + + Metric 1: Capital expenditures. This metric was located in the 10K as a single + line item named: Capital expenditures. + + + Metric 2: Total revenue. This metric was located in the 10K as a single line item + named: Total net revenues.' + page(s)-0based: 69 + page(s): 70,73 + + category: 3-CALC-COMPLEX + correctness: >- + the answer contains a calculated percentage value that is in the range from 1.70% to 2.10%, + or, alternatively, a calculated decimal value that is in the range from 0.0170 to 0.0210 + (if the answer is a single number, assume that it is that calculated metric value) + + evaluator-unreliable: true + + +financebench_id_04735: + sector: Information Technology + + company: Adobe + period: 2015 + doc-type: 10k + doc: ADOBE_2015_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: 'You are an investment banker and your only resource(s) to answer the + following question is (are): the statement of financial position and the cash + flow statement. Here''s the question: what is the FY2015 operating cash flow ratio + for Adobe? Operating cash flow ratio is defined as: cash from operations / total + current liabilities. Round your answer to two decimal places.' + + answer: '0.66' + justification: 'The metric in question was calculated using other simpler metrics. + The various simpler metrics (from the current and, if relevant, previous fiscal + year(s)) used were: + + + Metric 1: Cash from operations. This metric was located in the 10K as a single + line item named: Net cash provided by operating activities. + + + Metric 2: Total current liabilities. This metric was located in the 10K as a single + line item named: Total current liabilities.' + page(s)-0based: 58 + page(s): 59,63 + + category: 3-CALC-COMPLEX + correctness: >- + the answer contains a calculated Operating Cash Flow Ratio decimal value that is in the range from 0.6000 to 0.7000, + or, alternatively, a calculated percentage value that is in the range from 60.00% to 70.00% + (if the answer is a single number, assume that it is that calculated Operating Cash Flow Ratio metric value) + + +financebench_id_07507: + sector: Information Technology + + company: Adobe + period: 2016 + doc-type: 10k + doc: ADOBE_2016_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: What is Adobe's year-over-year change in unadjusted operating income from + FY2015 to FY2016 (in units of percents and round to one decimal place)? Give a + solution to the question by using the income statement. + + answer: 65.4% + justification: 'The metric unadjusted operating income was directly extracted from + the company 10K. The line item name, as seen in the 10K, was: Operating income. + The final step was to execute the desired percent change calculation on unadjusted + operating income.' + page(s)-0based: 61 + page(s): '62' + + category: 2-CALC-CHANGE + correctness: >- + the answer contains a calculated Operating Income change percentage value that is in the range from 60.0% or 70.0% + (if the answer is a single number, assume that it is that calculated Operating Income change percentage value) + + +financebench_id_03856: + sector: Information Technology + + company: Adobe + period: 2017 + doc-type: 10k + doc: ADOBE_2017_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: 'What is the FY2017 operating cash flow ratio for Adobe? Operating cash + flow ratio is defined as: cash from operations / total current liabilities. Round + your answer to two decimal places. Please utilize information provided primarily + within the balance sheet and the cash flow statement.' + + answer: '0.83' + justification: 'The metric in question was calculated using other simpler metrics. + The various simpler metrics (from the current and, if relevant, previous fiscal + year(s)) used were: + + + Metric 1: Cash from operations. This metric was located in the 10K as a single + line item named: Net cash provided by operating activities. + + + Metric 2: Total current liabilities. This metric was located in the 10K as a single + line item named: Total current liabilities.' + page(s)-0based: 56 + page(s): 57,61 + + category: 3-CALC-COMPLEX + correctness: >- + the answer contains a calculated Operating Cash Flow Ratio decimal value that is in the range from 0.8000 to 0.8500, + or, alternatively, a calculated percentage value that is in the range from 80.00% to 85.00% + (if the answer is a single number, assume that it is that calculated Operating Cash Flow Ratio metric value) + + +financebench_id_00438: + sector: Information Technology + + company: Adobe + period: 2022 + doc-type: 10k + doc: ADOBE_2022_10K + + question-type: domain-relevant + question-reasoning: Numerical reasoning OR information extraction + domain-question-num: dg14 + question: Does Adobe have an improving operating margin profile as of FY2022? If + operating margin is not a useful metric for a company like this, then state that + and explain why. + + answer: No the operating margins of Adobe have recently declined from 36.8% in FY + 2021 to 34.6% in FY2022. A drop by 2.2% in a year. + justification: '6098/16388 + + 5802/14573' + page(s)-0based: 53 + page(s): '54' + + category: 4-CALC-AND-JUDGE + correctness: >- + the answer contains calculated Operating Margin percentage or decimal values for 2021 and 2022, + and concludes that such metric decreased + + evaluator-unreliable: true + + +financebench_id_00591: + sector: Information Technology + + company: Adobe + period: 2022 + doc-type: 10k + doc: ADOBE_2022_10K + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: Does Adobe have an improving Free cashflow conversion as of FY2022? + + answer: Yes, the FCF conversion (using net income as the denominator) for Adobe + has improved by ~13% from 143% in 2021 to 156% in 2022 + justification: 'FCF Conversion: (Net cash provided by operating activities - Purchases + of property and equipment)/Net income + + (7838-442)/4756 + + (7230-348)/4822' + page(s)-0based: 56 + page(s): '57' + + category: 4-CALC-AND-JUDGE + correctness: >- + the answer contains calculated Free Cash Flow Conversion Ratio percentage or decimal values for 2021 and 2022, + and concludes that such metric increased + + evaluator-unreliable: true + + +financebench_id_01319: + sector: Utilities + + company: AES Corporation + period: 2022 + doc-type: 10k + doc: AES_2022_10K + + question-type: domain-relevant + question-reasoning: Information extraction + domain-question-num: dg21 + question: What is the quantity of restructuring costs directly outlined in AES Corporation's + income statements for FY2022? If restructuring costs are not explicitly outlined + then state 0. + + answer: '0' + justification: '' + page(s)-0based: 131 + page(s): '132' + + category: 0-RETRIEVE + correctness: >- + the answer states 0, zero, and/or that restructuring costs are not explicitly mentioned/reported + + evaluator-unreliable: true + + +financebench_id_00540: + sector: Utilities + + company: AES Corporation + period: 2022 + doc-type: 10k + doc: AES_2022_10K + + question-type: domain-relevant + question-reasoning: Numerical reasoning OR Logical reasoning + domain-question-num: dg25 + question: Roughly how many times has AES Corporation sold its inventory in FY2022? + Calculate inventory turnover ratio for the FY2022; if conventional inventory management + is not meaningful for the company then state that and explain why. + + answer: AES has converted inventory 9.5 times in FY 2022. + justification: 'Cost of sales/Inventory + + 10069/1055' + page(s)-0based: 129 + page(s): 130,132 + + category: 3-CALC-COMPLEX + correctness: |- + the answer contains a calculated Inventory Turnover Ratio (or Inventory Conversion Ratio) decimal value that is either: + - in the range from 9.0 to 10.0 times (implicitly using ending Inventory as denominator), or + - approximately 12.0 times (implicitly using average Inventory as denominator) + (if the answer is a single number, assume that it is that calculated Inventory Turnover Ratio decimal value) + + +financebench_id_10420: + sector: Utilities + + company: AES Corporation + period: 2022 + doc-type: 10k + doc: AES_2022_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: 'Based on the information provided primarily in the statement of financial + position and the statement of income, what is AES''s FY2022 return on assets (ROA)? + ROA is defined as: FY2022 net income / (average total assets between FY2021 and + FY2022). Round your answer to two decimal places.' + answer: '-0.02' + justification: 'The metric in question was calculated using other simpler metrics. + The various simpler metrics (from the current and, if relevant, previous fiscal + year(s)) used were: + + + Metric 1: Net income. This metric was located in the 10K as a single line item + named: NET INCOME (LOSS) ATTRIBUTABLE TO THE AES CORPORATION. + + + Metric 2: Total assets. This metric was located in the 10K as a single line item + named: TOTAL ASSETS.' + page(s)-0based: 129 + page(s): 130,132 + + category: 3-CALC-COMPLEX + correctness: >- + the answer contains a calculated Return on Assets (RoA) + percentage value that is NEGATIVE and in the range from -2.00% to -1.40%, + or, alternatively, a calculated decimal value that is NEGATIVE and in the range from -0.0200 to -0.0140 + (if the answer is a single number, assume that it is that calculated Return on Assets (RoA) metric value) + + evaluator-unreliable: true + + +financebench_id_06655: + sector: Consumer Discretionary + + company: Amazon + period: 2017 + doc-type: 10k + doc: AMAZON_2017_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: 'What is Amazon''s FY2017 days payable outstanding (DPO)? DPO is defined + as: 365 * (average accounts payable between FY2016 and FY2017) / (FY2017 COGS + + change in inventory between FY2016 and FY2017). Round your answer to two decimal + places. Address the question by using the line items and information shown within + the balance sheet and the P&L statement.' + + answer: '93.86' + justification: 'The metric in question was calculated using other simpler metrics. + The various simpler metrics (from the current and, if relevant, previous fiscal + year(s)) used were: + + + Metric 1: Accounts payable. This metric was located in the 10K as a single line + item named: Accounts payable. + + + Metric 2: Inventories. This metric was located in the 10K as a single line item + named: Inventories. + + + Metric 3: Cost of goods sold. This metric was located in the 10K as a single line + item named: Cost of sales.' + page(s)-0based: 37 + page(s): 38,40 + + category: 3-CALC-COMPLEX + correctness: >- + the answer contains a calculated Days Payable Outstanding (DPO) decimal value that is in the range from 90.00 to 100.00 + (if the answer is a single number, assume that it is that calculated Days Payable Outstanding (DPO) metric value) + + +financebench_id_08135: + sector: Consumer Discretionary + + company: Amazon + period: 2017 + doc-type: 10k + doc: AMAZON_2017_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: What is Amazon's year-over-year change in revenue from FY2016 to FY2017 + (in units of percents and round to one decimal place)? Calculate what was asked + by utilizing the line items clearly shown in the statement of income. + + answer: 30.8% + justification: 'The metric total revenue was directly extracted from the company + 10K. The line item name, as seen in the 10K, was: Total net sales. The final step + was to execute the desired percent change calculation on total revenue.' + page(s)-0based: 37 + page(s): '38' + + category: 2-CALC-CHANGE + correctness: >- + the answer contains a calculated Revenue change percentage value that is in the range from 30.0% to 31.0% + (if the answer is a single number, assume that it is that calculated Revenue change percentage value) + + +financebench_id_08286: + sector: Consumer Discretionary + + company: Amazon + period: 2019 + doc-type: 10k + doc: AMAZON_2019_10K + + question-type: metrics-generated + question-reasoning: Information extraction + domain-question-num: '' + question: By drawing conclusions from the information stated only in the income + statement, what is Amazon's FY2019 net income attributable to shareholders (in + USD millions)? + + answer: $11588.00 + justification: 'The metric net income was directly extracted from the company 10K. + The line item name, as seen in the 10K, was: Net income.' + page(s)-0based: 37 + page(s): '38' + + category: 0-RETRIEVE + correctness: >- + the answer contains a quantity equivalent to or approximately equal to + 11588, 11588 million, 11.588 billion, + 11600, 11600 million or 11.6 billion + + +financebench_id_03882: + sector: Materials + + company: Amcor + period: 2020 + doc-type: 10k + doc: AMCOR_2020_10K + + question-type: metrics-generated + question-reasoning: Information extraction + domain-question-num: '' + question: What is Amcor's year end FY2020 net AR (in USD millions)? Address the + question by adopting the perspective of a financial analyst who can only use the + details shown within the balance sheet. + + answer: $1616.00 + justification: 'The metric accounts receivable, net was directly extracted from + the company 10K. The line item name, as seen in the 10K, was: Trade receivables, + net.' + page(s)-0based: 49 + page(s): '50' + + category: 0-RETRIEVE + correctness: >- + the answer contains a quantity equivalent to or approximately equal to + 1615.9, 1615.9 million, + 1616, 1616 million, 1.616 billion, + 1600, 1600 million or 1.6 billion + + evaluator-unreliable: true + + +financebench_id_01935: + sector: Materials + + company: Amcor + period: 2022 + doc-type: 8k + doc: AMCOR_2022_8K_dated-2022-07-01 + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: What was the key agenda of the AMCOR's 8k filing dated 1st July 2022? + + answer: Amcor Finance (USA), Inc. and Amcor Flexibles North America, Inc., entered + into supplemental indentures relating to Guaranteed Senior Notes due 2026 and + 2028. This involved the substitution of the Substitute Issuer (Amcor Flexibles + North America) for the Former Issuer (Amcor Finance) and the assumption of covenants + under the indentures. (In essence a novation agreement) + justification: '' + page(s)-0based: 1 + page(s): '2' + + category: 0-RETRIEVE + correctness: >- + the answer mentions on of the terms "supplemental", "indendure(s)", "substitute" or "substitution" + + evaluator-unreliable: true + + +financebench_id_00799: + sector: Materials + + company: Amcor + period: 2023 + doc-type: 10k + doc: AMCOR_2023_10K + + question-type: domain-relevant + question-reasoning: Numerical reasoning OR Logical reasoning + domain-question-num: dg02 + question: Has AMCOR's quick ratio improved or declined between FY2023 and FY2022? + If the quick ratio is not something that a financial analyst would ask about a + company like this, then state that and explain why. + + answer: The quick ratio has slightly improved from 0.67 times to 0.69 times between + FY 2023 and FY 2022.(3.4% jump) + justification: 'Quick Ratio= (Total current assets-(Raw materials and supplies+Work + in process and finished goods))/Total current liabilities + + (5308-992-1221)/4476 + + (5853-1114-1325)/5103' + page(s)-0based: 51 + page(s): '52' + + category: 4-CALC-AND-JUDGE + correctness: >- + the answer contains calculated Quick Ratio decimal or percentage values for 2022 and 2023, + both over 0.50 but less than 0.75 (if decimal), or, alternatively, over 50% but less than 75% (if percentage); + the answer then concludes that such metric increased + + +financebench_id_01079: + sector: Materials + + company: Amcor + period: 2023 + doc-type: 10k + doc: AMCOR_2023_10K + + question-type: domain-relevant + question-reasoning: Information extraction + domain-question-num: dg10 + question: What are major acquisitions that AMCOR has done in FY2023, FY2022 and + FY2021? + + answer: 'Amcor completed these acquisitions during FY2023: + + -100% equity interest of a flexibles manufacturing company in the Czech Republic + + - 100% equity interest in a medical device packaging manufacturing site in + + Shanghai, China. + + -acquisition of a New Zealand-based leading manufacturer of state-of-the-art, + automated protein + + packaging machines.' + justification: '' + page(s)-0based: 63 + page(s): '64' + + category: 0-RETRIEVE + correctness: |- + the answer mentions acquisitions in at least 2 of the following: + - Czech Republic; + - New Zealand; and + - Shanghai, China (or, alternatively, just "Shanghai" or just "China") + + +financebench_id_01148: + sector: Materials + + company: Amcor + period: 2023 + doc-type: 10k + doc: AMCOR_2023_10K + + question-type: domain-relevant + question-reasoning: Information extraction OR Logical reasoning OR + domain-question-num: dg12 + question: What industry does AMCOR primarily operate in? + + answer: Amcor is a global leader in packaging production for various use cases. + justification: '' + page(s)-0based: 4 + page(s): '5' + + category: 0-RETRIEVE + correctness: >- + the answer mentions "packaging" + + +financebench_id_00684: + sector: Materials + + company: Amcor + period: 2023 + doc-type: 10k + doc: AMCOR_2023_10K + + question-type: domain-relevant + question-reasoning: Numerical reasoning OR information extraction + domain-question-num: dg13 + question: Does AMCOR have an improving gross margin profile as of FY2023? If gross + margin is not a useful metric for a company like this, then state that and explain + why. + + answer: No. For AMCOR there has been a slight decline in gross margins by 0.8%. + justification: 'Gross Profit/Net Sales + + 2725/14694 + + 2820/14544' + page(s)-0based: 49 + page(s): '50' + + category: 4-CALC-AND-JUDGE + correctness: >- + the answer contains calculated Gross Margin percentage or decimal values for 2022 and 2023, + and concludes that such metric decreased + answer-inadequate: true + + +financebench_id_01936: + sector: Materials + + company: Amcor + period: 2023 + doc-type: 10q + doc: AMCOR_2023Q2_10Q + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: What is the nature & purpose of AMCOR's restructuring liability as oF + Q2 of FY2023 close? + + answer: 87% of the total restructuring liability is related Employee liabilities. + justification: '' + page(s)-0based: 14 + page(s): '15' + + category: 0-RETRIEVE + correctness: |- + the answer mentions Employee costs or Employee liabilities + + +financebench_id_01928: + sector: Materials + + company: Amcor + period: 2023 + doc-type: Earnings + doc: AMCOR_2023Q4_EARNINGS + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: What Was AMCOR's Adjusted Non GAAP EBITDA for FY 2023 + + answer: AMCOR's Adj. EBITDA was $2,018mn in FY 2023 + justification: '' + page(s)-0based: 11 + page(s): '12' + + category: 0-RETRIEVE + correctness: >- + the answer contains a quantity equivalent to or approximately equal to + 2018 million, 2.018 billion, + 2000 million or 2 billion + + evaluator-unreliable: true + + +financebench_id_01930: + sector: Materials + + company: Amcor + period: 2023 + doc-type: Earnings + doc: AMCOR_2023Q4_EARNINGS + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: How much was the Real change in Sales for AMCOR in FY 2023 vs FY 2022, + if we exclude the impact of FX movement, passthrough costs and one-off items? + + answer: The Real Growth was flat in FY 2023 vs FY 2022. + justification: '' + page(s)-0based: 9 + page(s): '10' + + category: 2-CALC-CHANGE + correctness: >- + the answer concludes that the percentage change was approximately 1%, + or, alternatively, concludes that the growth was flat / small + + evaluator-unreliable: true + + +financebench_id_03069: + sector: Information Technology + + company: AMD + period: 2015 + doc-type: 10k + doc: AMD_2015_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: Answer the following question as if you are an equity research analyst + and have lost internet connection so you do not have access to financial metric + providers. According to the details clearly outlined within the P&L statement + and the statement of cash flows, what is the FY2015 depreciation and amortization + (D&A from cash flow statement) % margin for AMD? + + answer: 4.2% + justification: 'The metric in question was calculated using other simpler metrics. + The various simpler metrics (from the current and, if relevant, previous fiscal + year(s)) used were: + + + Metric 1: Depreciation and amortization. This metric was located in the 10K as + a single line item named: Depreciation and amortization. + + + Metric 2: Total revenue. This metric was located in the 10K as a single line item + named: Net revenue.' + page(s)-0based: 55 + page(s): 56,60 + + category: 3-CALC-COMPLEX + correctness: >- + the answer contains a calculated Depreciation & Amortization (D&A) Margin (using Net Revenue as denominator) + percentage value that is in the range from 4.00% to 4.50%, + or, alternatively, a calculated decimal value that is in the range from 0.0400 to 0.0450 + (if the answer is a single number, assume that it is that calculated Depreciation & Amortization (D&A) Margin metric value) + + +financebench_id_00222: + sector: Information Technology + + company: AMD + period: 2022 + doc-type: 10k + doc: AMD_2022_10K + + question-type: domain-relevant + question-reasoning: Logical reasoning (based on numerical reasoning) OR Logical + reasoning + domain-question-num: dg01 + question: Does AMD have a reasonably healthy liquidity profile based on its quick + ratio for FY22? If the quick ratio is not relevant to measure liquidity, please + state that and explain why. + + answer: Yes. The quick ratio is 1.57, calculated as (cash and cash equivalents+Short + term investments+Accounts receivable, net+receivables from related parties)/ (current + liabilities). + justification: '' + page(s)-0based: 55 + page(s): '56' + + category: 4-CALC-AND-JUDGE + correctness: >- + the answer contains a calculated Quick Ratio decimal value that is in the range from 1.40 to 1.90, + or, alternatively, a calculated percentage value that is in the range from 140% to 190% + + +financebench_id_00995: + sector: Information Technology + + company: AMD + period: 2022 + doc-type: 10k + doc: AMD_2022_10K + + question-type: domain-relevant + question-reasoning: Information extraction + domain-question-num: dg07 + question: What are the major products and services that AMD sells as of FY22? + + answer: AMD sells server microprocessors (CPUs) and graphics processing units (GPUs), + data processing units (DPUs), Field Programmable Gate Arrays (FPGAs), and Adaptive + System-on-Chip (SoC) products for data centers; CPUs, accelerated processing units + (APUs) that integrate CPUs and GPUs, and chipsets for desktop and notebook personal + computers; discrete GPUs, and semi-custom SoC products and development services; + and embedded CPUs, GPUs, APUs, FPGAs, and Adaptive SoC products. + justification: '' + page(s)-0based: 3 + page(s): '4' + + category: 0-RETRIEVE + correctness: >- + the answer mentions at least graphics (i.e., GPU) and FPGA products + + evaluator-unreliable: true + + +financebench_id_01198: + sector: Information Technology + + company: AMD + period: 2022 + doc-type: 10k + doc: AMD_2022_10K + + question-type: domain-relevant + question-reasoning: Information extraction + domain-question-num: dg15 + question: What drove revenue change as of the FY22 for AMD? + + answer: In 2022, AMD reported Higher sales of their EPYC server processors, higher + semi-custom product sales, and the inclusion of Xilinx embedded product sales + justification: '' + page(s)-0based: 42 + page(s): '43' + + category: 0-RETRIEVE + correctness: |- + the answer mentions at least 2 of the following: + - "Data Center" and/or "EPYC"; + - "Gaming" and/or "semi-custom"; and + - "Embedded" and/or "Xilinx" + + evaluator-unreliable: true + + +financebench_id_00917: + sector: Information Technology + + company: AMD + period: 2022 + doc-type: 10k + doc: AMD_2022_10K + + question-type: domain-relevant + question-reasoning: Logical reasoning (based on numerical reasoning) OR Numerical + reasoning OR Logical reasoning + domain-question-num: dg17 + question: What drove operating margin change as of the FY22 for AMD? If operating + margin is not a useful metric for a company like this, then please state that + and explain why. + + answer: The decrease in AMD's operating income was primarily driven by amortization + of intangible assets associated with the Xilinx acquisition + justification: '' + page(s)-0based: 42 + page(s): '43' + + category: 0-RETRIEVE + correctness: >- + the answer mentions Xilinx + + +financebench_id_01279: + sector: Information Technology + + company: AMD + period: 2022 + doc-type: 10k + doc: AMD_2022_10K + + question-type: domain-relevant + question-reasoning: Numerical reasoning + domain-question-num: dg19 + question: Among operations, investing, and financing activities, which brought in + the most (or lost the least) cash flow for AMD in FY22? + + answer: In 2022, AMD brought in the most cashflow from Operations + justification: '' + page(s)-0based: 57 + page(s): '58' + + category: 1-COMPARE + correctness: >- + the answer identifies Operations / Operating Cash Flows as bringing in most cash + + +financebench_id_00563: + sector: Information Technology + + company: AMD + period: 2022 + doc-type: 10k + doc: AMD_2022_10K + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: From FY21 to FY22, excluding Embedded, in which AMD reporting segment + did sales proportionally increase the most? + + answer: Data Center + justification: "Data center: \nFY22: 6,043\nFY21: 3,694 \n6,043/3,694-1 = 63,59%\n\ + \nClient: \nFY22: 6,201\nFY21: 6,887 \n6,201/6,887-1 = -9,96%\n\n\nGaming: \n\ + FY22: 6,805\nFY21: 5,607 \n6,805/5,607-1 = 21,37%" + page(s)-0based: 47 + page(s): '48' + + category: 1-COMPARE + correctness: >- + the answer identifies Data Center segment as proportionally growing most strongly + + +financebench_id_00757: + sector: Information Technology + + company: AMD + period: 2022 + doc-type: 10k + doc: AMD_2022_10K + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: Did AMD report customer concentration in FY22? + + answer: Yes, one customer accounted for 16% of consolidated net revenue + justification: One customer ccounting for 16% of net evenue is a high customer concenration + page(s)-0based: 11 + page(s): '12' + + category: 0-RETRIEVE + correctness: >- + the answer mentions that one or a small number of customers + accounted for large portion of revenue + + evaluator-unreliable: true + + +financebench_id_00476: + sector: Financials + + company: American Express + period: 2022 + doc-type: 10k + doc: AMERICANEXPRESS_2022_10K + + question-type: domain-relevant + question-reasoning: Information extraction + domain-question-num: dg04 + question: Which debt securities are registered to trade on a national securities + exchange under American Express' name as of 2022? + + answer: There are none + justification: No debt securities are listed under the securities registered pursuant + to Section 12(b) of the Act, which implies there are none + page(s)-0based: 0 + page(s): '1' + + category: 0-RETRIEVE + correctness: >- + the answer concludes that there are no debt securities traded, + or, alternatively, that no such debt securities are explicitly reported + + evaluator-unreliable: true + + +financebench_id_01028: + sector: Financials + + company: American Express + period: 2022 + doc-type: 10k + doc: AMERICANEXPRESS_2022_10K + + question-type: domain-relevant + question-reasoning: Information extraction + domain-question-num: dg08 + question: What are the geographies that American Express primarily operates in as + of 2022? + + answer: United States, EMEA, APAC, and LACC + justification: '' + page(s)-0based: 154 + page(s): '155' + + category: 0-RETRIEVE + correctness: |- + the answer mentions at least 3 among: + - United States (US); + - Europe, the Middle East and Africa (EMEA); + - Asia Pacific, Australia and New Zealand (APAC); and + - Latin America, Canada and the Caribbean (LACC) + + +financebench_id_00723: + sector: Financials + + company: American Express + period: 2022 + doc-type: 10k + doc: AMERICANEXPRESS_2022_10K + + question-type: domain-relevant + question-reasoning: Numerical reasoning OR information extraction + domain-question-num: dg14 + question: Does AMEX have an improving operating margin profile as of 2022? If operating + margin is not a useful metric for a company like this, then state that and explain + why. + + answer: Performance is not measured through operating margin + justification: It's a financial services company and performance is measured through + the Net Interest Margin. + page(s)-0based: 95 + page(s): '96' + + category: 6-OTHER-ADVANCED + correctness: >- + the answer argues that Operating Margin is not a very relevant/useful metric for this business model and/or industry, + or, alternatively, that performance in this business model and/or industry is usually not judged through Operating Margin + + evaluator-unreliable: true + + +financebench_id_00720: + sector: Financials + + company: American Express + period: 2022 + doc-type: 10k + doc: AMERICANEXPRESS_2022_10K + + question-type: domain-relevant + question-reasoning: Logical reasoning (based on numerical reasoning) OR Numerical + reasoning OR Logical reasoning + domain-question-num: dg16 + question: What drove gross margin change as of the FY2022 for American Express? + If gross margin is not a useful metric for a company like this, then please state + that and explain why. + + answer: Performance is not measured through gross margin + justification: It's a financial services company and performance is measured through + the Net Interest Margin. + page(s)-0based: 95 + page(s): '96' + + category: 6-OTHER-ADVANCED + correctness: >- + the answer argues that Gross Margin is not a very relevant/useful metric for this business model and/or industry, + or, alternatively, that performance in this business model and/or industry is usually not judged through Gross Margin + + evaluator-unreliable: true + + +financebench_id_01351: + sector: Financials + + company: American Express + period: 2022 + doc-type: 10k + doc: AMERICANEXPRESS_2022_10K + + question-type: domain-relevant + question-reasoning: Numerical reasoning + domain-question-num: dg23 + question: How much has the effective tax rate of American Express changed between + FY2021 and FY2022? + + answer: The effective tax rate for American Express has changed/dropped from 24.6% + in FY 2021 to 21.6% in FY 2022. + justification: '' + page(s)-0based: 43 + page(s): '44' + + category: 2-CALC-CHANGE + correctness: >- + the answer says Effective Tax Rate changed from 24.6% to 21.6%, + and/or that it decreased by 3 pencentage points or 3% + + evaluator-unreliable: true + + +financebench_id_01964: + sector: Financials + + company: American Express + period: 2022 + doc-type: 10k + doc: AMERICANEXPRESS_2022_10K + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: What was the largest liability in American Express's Balance Sheet in + 2022? + + answer: Customer deposits + justification: '' + page(s)-0based: 97 + page(s): '98' + + category: 1-COMPARE + correctness: >- + the answer identifies Customer Deposits as largest liability + + evaluator-unreliable: true + + +financebench_id_01981: + sector: Financials + + company: American Express + period: 2022 + doc-type: 10k + doc: AMERICANEXPRESS_2022_10K + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: Was American Express able to retain card members during 2022? + + answer: 'Yes' + justification: '' + page(s)-0based: 44 + page(s): '45' + + category: 0-RETRIEVE + correctness: >- + the answer affirms that retention was good/high + + evaluator-unreliable: true + + +financebench_id_05718: + sector: Utilities + + company: American Water Works + period: 2020 + doc-type: 10k + doc: AMERICANWATERWORKS_2020_10K + + question-type: metrics-generated + question-reasoning: Information extraction + domain-question-num: '' + question: How much (in USD billions) did American Water Works pay out in cash dividends + for FY2020? Compute or extract the answer by primarily using the details outlined + in the statement of cash flows. + + answer: $0.40 + justification: 'The metric total cash dividends paid out was directly extracted + from the company 10K. The line item name, as seen in the 10K, was: Dividends paid.' + page(s)-0based: 85 + page(s): '86' + + category: 0-RETRIEVE + correctness: >- + the answer contains a quantity equivalent to or approximately equal to + 0.389, 0.389 billion, 389 million, + 0.4, 0.4 billion or 400 million + + +financebench_id_04254: + sector: Utilities + + company: American Water Works + period: 2021 + doc-type: 10k + doc: AMERICANWATERWORKS_2021_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: Basing your judgments off of the cash flow statement and the income statement, + what is American Water Works's FY2021 unadjusted operating income + depreciation + and amortization from the cash flow statement (unadjusted EBITDA) in USD millions? + + answer: $1832.00 + justification: 'The metric in question was calculated using other simpler metrics. + The various simpler metrics (from the current and, if relevant, previous fiscal + year(s)) used were: + + + Metric 1: Depreciation and amortization. This metric was located in the 10K as + a single line item named: Depreciation and amortization. + + + Metric 2: Unadjusted operating income. This metric was located in the 10K as a + single line item named: Operating income.' + page(s)-0based: 85 + page(s): 86,88 + + category: 3-CALC-COMPLEX + correctness: >- + the answer contains a quantity equivalent to or approximately equal to + 1832, 1832 million, 1.832 billion, + 1800, 1800 million or 1.8 billion + + +financebench_id_00070: + sector: Utilities + + company: American Water Works + period: 2022 + doc-type: 10k + doc: AMERICANWATERWORKS_2022_10K + + question-type: domain-relevant + question-reasoning: Numerical reasoning OR Logical reasoning + domain-question-num: dg24 + question: Does American Water Works have positive working capital based on FY2022 + data? If working capital is not a useful or relevant metric for this company, + then please state that and explain why. + + answer: No, American Water Works had negative working capital of -$1561M in FY 2022. + justification: 'Accounts receivable+Income tax receivable+Unbilled revenues+Materials + and supplies+other-Accounts payable-Accrued liabilities-Accrued taxes + + 334+114+275+98+312-254-706-49' + page(s)-0based: 80 + page(s): 81,82 + + category: 3-CALC-COMPLEX + correctness: >- + the answer contains a calculated (Net) Working Capital metric value in dollars + that is NEGATIVE and equivalent to or approximately equal to + minus/negative 1561, minus/negative 1561 million, minus/negative 1.561 billion, + minus/negative 1600, minus/negative 1600 million or minus/negative 1.6 billion + + evaluator-unreliable: true + + +financebench_id_02608: + sector: Consumer Discretionary + + company: Best Buy + period: 2017 + doc-type: 10k + doc: BESTBUY_2017_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: In agreement with the information outlined in the income statement, what + is the FY2015 - FY2017 3 year average net profit margin (as a %) for Best Buy? + Answer in units of percents and round to one decimal place. + + answer: 2.8% + justification: 'The metric in question was calculated using other simpler metrics. + The various simpler metrics (from the current and, if relevant, previous fiscal + year(s)) used were: + + + Metric 1: Total revenue. This metric was located in the 10K as a single line item + named: Revenue. + + + Metric 2: Net income. This metric was located in the 10K as a single line item + named: Net earnings attributable to Best Buy Co., Inc. shareholders.' + page(s)-0based: 55 + page(s): '56' + + category: 3-CALC-COMPLEX + correctness: >- + the answer contains a calculated Average Net Profit Margin percentage value that is in the range from 2.50% to 3.00%, + or, alternatively, a calculated decimal value that is in the range from 0.0250 to 0.0300 + (if the answer is a single number, assume that it is that calculated Average Net Profit Margin metric value) + + +financebench_id_04417: + sector: Consumer Discretionary + + company: Best Buy + period: 2019 + doc-type: 10k + doc: BESTBUY_2019_10K + + question-type: metrics-generated + question-reasoning: Information extraction + domain-question-num: '' + question: What is the year end FY2019 total amount of inventories for Best Buy? + Answer in USD millions. Base your judgments on the information provided primarily + in the balance sheet. + + answer: $5409.00 + justification: 'The metric inventories was directly extracted from the company 10K. + The line item name, as seen in the 10K, was: Merchandise inventories.' + page(s)-0based: 51 + page(s): '52' + + category: 0-RETRIEVE + correctness: >- + the answer contains a quantity equivalent to or approximately equal to + 5409, 5409 million, 5.409 billion, + 5400, 5400 million or 5.4 billion + + +financebench_id_00685: + sector: Consumer Discretionary + + company: Best Buy + period: 2023 + doc-type: 10k + doc: BESTBUY_2023_10K + + question-type: domain-relevant + question-reasoning: Logical reasoning (based on numerical reasoning) OR Logical + reasoning + domain-question-num: dg03 + question: Are Best Buy's gross margins historically consistent (not fluctuating + more than roughly 2% each year)? If gross margins are not a relevant metric for + a company like this, then please state that and explain why. + + answer: Yes, the margins have been consistent, there has been a minor decline of + 1.1% in gross margins between FY2022 and FY2023. + justification: 'Gross Profit/Revenue + + 9912/46298 + + 11640/51761' + page(s)-0based: 39 + page(s): '40' + + category: 4-CALC-AND-JUDGE + correctness: >- + the answer contains calculated Gross Margin + percentage values for 2022 and 2023 that are within 2 percentage points (or 2%) of each other, + or, alternatively, calculated decimal values that are within 0.02 of each other + answer-inadequate: true + + +financebench_id_01077: + sector: Consumer Discretionary + + company: Best Buy + period: 2023 + doc-type: 10k + doc: BESTBUY_2023_10K + + question-type: domain-relevant + question-reasoning: Information extraction + domain-question-num: dg10 + question: What are major acquisitions that Best Buy has done in FY2023, FY2022 and + FY2021? + + answer: 'Best Buy closed two acquisitions, both these companies were already partially + owned by Best Buy, but Best Buy acquired all outstanding shares of these two companies + during FY 2022: (1) Current Health Ltd and (2) Two Peaks, LLC d/b/a Yardbird Furniture' + justification: '' + page(s)-0based: 50 + page(s): '51' + + category: 0-RETRIEVE + correctness: >- + the answer mentions Current Health and Two Peaks (which is also alternatively called Yardbird) + + +financebench_id_01275: + sector: Consumer Discretionary + + company: Best Buy + period: 2023 + doc-type: 10k + doc: BESTBUY_2023_10K + + question-type: domain-relevant + question-reasoning: Numerical reasoning + domain-question-num: dg19 + question: Among operations, investing, and financing activities, which brought in + the most (or lost the least) cash flow for Best Buy in FY2023? + + answer: Best Buy generated the most cash flow from operating activities in FY 2023 + ($1.8 bn) + justification: '' + page(s)-0based: 41 + page(s): '42' + + category: 1-COMPARE + correctness: >- + the answer identifies that Operations / Operating Cash Flows as bringing in most cash + + +financebench_id_00288: + sector: Consumer Discretionary + + company: Best Buy + period: 2024 + doc-type: 10q + doc: BESTBUY_2024Q2_10Q + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: Was there any drop in Cash & Cash equivalents between FY 2023 and Q2 of + FY2024? + + answer: Yes, there was a decline of ~42% between FY2023 and Q2 of FY 2024. + justification: 1093/1874-1 + page(s)-0based: 19 + page(s): '20' + + category: 1-COMPARE + correctness: >- + the answer affirms that Cash & Cash Equivalents decreased + + +financebench_id_00460: + sector: Consumer Discretionary + + company: Best Buy + period: 2024 + doc-type: 10q + doc: BESTBUY_2024Q2_10Q + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: Was there any change in the number of Best Buy stores between Q2 of FY2024 + and FY2023? + + answer: Yes, there is decline in number stores by 1.32% from 982 stores in Q2 FY + 2023 to 969 by the end of Q2 FY2024. + justification: 969/982-1 + page(s)-0based: 16 + page(s): '17' + + category: 1-COMPARE + correctness: >- + the answer mentions that number of stores decreased + + evaluator-unreliable: true + + +financebench_id_01902: + sector: Consumer Discretionary + + company: Best Buy + period: 2024 + doc-type: 10q + doc: BESTBUY_2024Q2_10Q + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: Which Best Buy product category performed the best (by top line) in the + domestic (USA) Market during Q2 of FY2024? + + answer: The entertainment segment experienced the highest growth of 9% during Q2 + FY2024, primarily from gaming division. + justification: '' + page(s)-0based: 17 + page(s): '18' + + category: 1-COMPARE + correctness: |- + the answer either: + - identifies Entertainment (or Gaming) category/segment as proportionally growing most; or + - identifies Computing and Mobile Phones category/segment as having highest revenue + + evaluator-unreliable: true + + +financebench_id_04660: + sector: Information Technology + + company: Block + period: 2016 + doc-type: 10k + doc: BLOCK_2016_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: Considering the data in the balance sheet, what is Block's (formerly known + as Square) FY2016 working capital ratio? Define working capital ratio as total + current assets divided by total current liabilities. Round your answer to two + decimal places. + + answer: '1.73' + justification: 'The metric in question was calculated using other simpler metrics. + The various simpler metrics (from the current and, if relevant, previous fiscal + year(s)) used were: + + + Metric 1: Total current liabilities. This metric was located in the 10K as a single + line item named: Total current liabilities. + + + Metric 2: Total current assets. This metric was located in the 10K as a single + line item named: Total current assets.' + page(s)-0based: 67 + page(s): '68' + + category: 3-CALC-COMPLEX + correctness: >- + the answer contains a calculated Working Capital Ratio decimal value that is in the range from 1.70 to 1.80, + or, alternatively, a calculated percentage value that is in the range from 170% to 180% + (if the answer is a single number, assume that it is that calculated Working Capital Ratio metric value) + + +financebench_id_03838: + sector: Information Technology + + company: Block + period: 2020 + doc-type: 10k + doc: BLOCK_2020_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: What is the FY2019 - FY2020 total revenue growth rate for Block (formerly + known as Square)? Answer in units of percents and round to one decimal place. + Approach the question asked by assuming the standpoint of an investment banking + analyst who only has access to the statement of income. + + answer: 101.5% + justification: 'The metric total revenue was directly extracted from the company + 10K. The line item name, as seen in the 10K, was: Total net revenue. The final + step was to execute the desired percent change calculation on total revenue.' + page(s)-0based: 85 + page(s): '86' + + category: 2-CALC-CHANGE + correctness: >- + the answer contains a calculated Revenue growth percentage value that is over 100.0% + (if the answer is a single number, assume that it is that calculated Revenue growth percentage value) + + evaluator-unreliable: true + + +financebench_id_07661: + sector: Information Technology + + company: Block + period: 2020 + doc-type: 10k + doc: BLOCK_2020_10K + + question-type: metrics-generated + question-reasoning: Information extraction + domain-question-num: '' + question: 'Using the cash flow statement, answer the following question to the best + of your abilities: how much did Block (formerly known as Square) generate in cash + flow from operating activities in FY2020? Answer in USD millions.' + + answer: $382.00 + justification: 'The metric cash from operations was directly extracted from the + company 10K. The line item name, as seen in the 10K, was: Net cash provided by + operating activities.' + page(s)-0based: 89 + page(s): '90' + + category: 0-RETRIEVE + correctness: >- + the answer contains a quantity equivalent to or approximately equal to + 381.6, 381.6 million, 0.3816 billion, + 382, 382 million, 0.382 billion, + 400, 400 million or 0.4 billion + + +financebench_id_10285: + sector: Industrials + + company: Boeing + period: 2018 + doc-type: 10k + doc: BOEING_2018_10K + + question-type: metrics-generated + question-reasoning: Information extraction + domain-question-num: '' + question: 'We need to calculate a financial metric by using information only provided + within the balance sheet. Please answer the following question: what is Boeing''s + year end FY2018 net property, plant, and equipment (in USD millions)?' + + answer: $12645.00 + justification: 'The metric ppne, net was directly extracted from the company 10K. + The line item name, as seen in the 10K, was: Property, plant and equipment, net.' + page(s)-0based: 51 + page(s): '52' + + category: 0-RETRIEVE + correctness: >- + the answer contains a quantity equivalent to or approximately equal to + 12645, 12645 million, 12.645 billion, + 12600, 12600 million or 12.6 billion + + evaluator-unreliable: true + + +financebench_id_00517: + sector: Industrials + + company: Boeing + period: 2022 + doc-type: 10k + doc: BOEING_2022_10K + + question-type: domain-relevant + question-reasoning: Logical reasoning (based on numerical reasoning) + domain-question-num: dg09 + question: Are there any product categories / service categories that represent more + than 20% of Boeing's revenue for FY2022? + + answer: Yes. Boeing has product and service categories that represent more than + 20% of Boeing's revenue for FY2022. These categories are Commercial Airplanes + which comprises 39% of total revenue, Defence which comprises 35% of total revenue + and Services which comprises 26% of total revenue. + justification: 'Commercial Airplanes%=Revenues: Commercial Airplanes/Total revenues*100=25,867/66,608*100=39%. + Defence%=Defense, Space & Security/Total revenues*100=23,162/66,608*100=35%. Services%=Global + Services/Total revenues*100=17,611/66,608*100=26%.' + page(s)-0based: 61 + page(s): '62' + + category: 3-CALC-COMPLEX + correctness: |- + the answer mentions at least 1 of following categories: + - Commercial Airplanes; + - Defense/Defence (or fully written "Defense, Space & Security"); and + - Services (or fully written "Global Services") + + evaluator-unreliable: true + + +financebench_id_01091: + sector: Industrials + + company: Boeing + period: 2022 + doc-type: 10k + doc: BOEING_2022_10K + + question-type: domain-relevant + question-reasoning: Information extraction + domain-question-num: dg11 + question: Has Boeing reported any materially important ongoing legal battles from + FY2022? + + answer: Yes. Multiple lawsuits have been filed against Boeing resulting from a 2018 + Lion Air crash and a 2019 Ethiopian Airlines crash. + justification: '' + page(s)-0based: 112 + page(s): '113' + + category: 0-RETRIEVE + correctness: >- + the answer affirms that there have been material lawsuits / legal battles + + evaluator-unreliable: true + + +financebench_id_00678: # note: Gross Income is implicit, with missing label + sector: Industrials + + company: Boeing + period: 2022 + doc-type: 10k + doc: BOEING_2022_10K + + question-type: domain-relevant + question-reasoning: Numerical reasoning OR information extraction + domain-question-num: dg13 + question: Does Boeing have an improving gross margin profile as of FY2022? If gross + margin is not a useful metric for a company like this, then state that and explain + why. + + answer: Yes. Boeing has an improving gross margin profile as of FY2022. Gross profit + improved from $3,017 million in FY2021 to $3,502 million in FY2022. Gross margin + % improved from 4.8% in FY2021 to 5.3% in FY2022. + justification: Gross margin%=Gross margin/Total revenues*100=3,502/66,608*100=5.3% + for 2022 and 3,017/62,286*100=4.8% for 2021. + page(s)-0based: 54 + page(s): '55' + + category: 4-CALC-AND-JUDGE + correctness: >- + the answer contains calculated Gross Margin percentage or decimal values for 2021 and 2022, + and concludes that such metric increased + + evaluator-unreliable: true + + +financebench_id_01290: + sector: Industrials + + company: Boeing + period: 2022 + doc-type: 10k + doc: BOEING_2022_10K + + question-type: domain-relevant + question-reasoning: Information extraction OR Logical reasoning + domain-question-num: dg20 + question: Who are the primary customers of Boeing as of FY2022? + + answer: Boeing's primary customers as of FY2022 are a limited number of commercial + airlines and the US government. The US government accounted for 40% of Boeing's + total revenues in FY2022. + justification: '' + page(s)-0based: 7 + page(s): 8, 10, 14 + + category: 0-RETRIEVE + correctness: >- + the answer mentions airlines and government(s) / military(ies) + + evaluator-unreliable: true + + +financebench_id_00464: + sector: Industrials + + company: Boeing + period: 2022 + doc-type: 10k + doc: BOEING_2022_10K + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: Is Boeing's business subject to cyclicality? + + answer: Yes, Boeing's business is subject to cyclicality due to its exposure to + the airline industry which is a cyclical industry. + justification: A major portion of Boeing's revenue is derived from the sale of aircraft + to commercial airlines. The commercial airlines business is cyclical, and subject + to significant profit swings. + page(s)-0based: 7 + page(s): '8' + + category: 0-RETRIEVE + correctness: >- + the answer affirms that cyclicality is present + + +financebench_id_00494: + sector: Industrials + + company: Boeing + period: 2022 + doc-type: 10k + doc: BOEING_2022_10K + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: What production rate changes is Boeing forecasting for FY2023? + + answer: Boeing forecasts an increase in the production rates for the 737, 777X and + 787 aircrafts in 2023. + justification: Boeing plans to gradually increase production rates for the 737 and + 787 and to resume production of 777X. + page(s)-0based: 8 + page(s): '9' + + category: 0-RETRIEVE + correctness: >- + the answer mentions increase(s) in production rate(s) + + +financebench_id_00585: # note: correct number signs + sector: Industrials + + company: Boeing + period: 2022 + doc-type: 10k + doc: BOEING_2022_10K + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: How does Boeing's effective tax rate in FY2022 compare to FY2021? + + answer: Effective tax rate in FY2022 was 0.62%, compared to -14.76% in FY2021. + justification: Effective tax rate=Income tax (expense) benefit/ Loss before income + taxes*100=(31)/(5,022)*100=0.62% in 2022 and 743/(5,033)*100=-14.76%. + page(s)-0based: 54 + page(s): '55' + + category: 3-CALC-COMPLEX + correctness: >- + the answer contains calculated Effective Tax Rate percentage or decimal values for 2021 and 2022, + with one value being negative and the other value being positive + + evaluator-unreliable: true + + +financebench_id_03473: + sector: Consumer Staples + + company: Coca-Cola + period: 2017 + doc-type: 10k + doc: COCACOLA_2017_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: 'What is the FY2017 return on assets (ROA) for Coca Cola? ROA is defined + as: FY2017 net income / (average total assets between FY2016 and FY2017). Round + your answer to two decimal places. Give a response to the question by relying + on the details shown in the balance sheet and the P&L statement.' + + answer: '0.01' + justification: 'The metric in question was calculated using other simpler metrics. + The various simpler metrics (from the current and, if relevant, previous fiscal + year(s)) used were: + + + Metric 1: Net income. This metric was located in the 10K as a single line item + named: NET INCOME ATTRIBUTABLE TO SHAREOWNERS OF THE COCA-COLA COMPANY. + + + Metric 2: Total assets. This metric was located in the 10K as a single line item + named: TOTAL ASSETS.' + page(s)-0based: 73 + page(s): 74,76 + + category: 3-CALC-COMPLEX + correctness: >- + the answer contains a calculated Return on Assets (RoA) percentage value that is in the range from 0.90% to 2.00%, + or, alternatively, a calculated decimal value that is in the range from 0.0090 to 0.0200 + (if the answer is a single number, assume that it is that calculated Return on Assets (RoA) metric value) + + evaluator-unreliable: true + + +financebench_id_09724: + sector: Consumer Staples + + company: Coca-Cola + period: 2021 + doc-type: 10k + doc: COCACOLA_2021_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: What is Coca Cola's FY2021 COGS % margin? Calculate what was asked by + utilizing the line items clearly shown in the income statement. + + answer: 39.7% + justification: 'The metric in question was calculated using other simpler metrics. + The various simpler metrics (from the current and, if relevant, previous fiscal + year(s)) used were: + + + Metric 1: Cost of goods sold. This metric was located in the 10K as a single line + item named: Cost of goods sold. + + + Metric 2: Total revenue. This metric was located in the 10K as a single line item + named: Net Operating Revenues.' + page(s)-0based: 61 + page(s): '62' + + category: 3-CALC-COMPLEX + correctness: >- + the answer contains a calculated Cost of Goods Sold (COGS) Margin + percentage value that is in the range from 38.00% to 42.00%, + or, alternatively, a calculated decimal value that is in the range from 0.3800 to 0.4200 + (if the answer is a single number, assume that it is that calculated Cost of Goods Sold (COGS) Margin metric value) + + +financebench_id_06272: + sector: Consumer Staples + + company: Coca-Cola + period: 2022 + doc-type: 10k + doc: COCACOLA_2022_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: What is Coca Cola's FY2022 dividend payout ratio (using total cash dividends + paid and net income attributable to shareholders)? Round answer to two decimal + places. Answer the question asked by assuming you only have access to information + clearly displayed in the cash flow statement and the income statement. + + answer: '0.8' + justification: 'The metric in question was calculated using other simpler metrics. + The various simpler metrics (from the current and, if relevant, previous fiscal + year(s)) used were: + + + Metric 1: Total cash dividends paid out. This metric was located in the 10K as + a single line item named: Dividends. + + + Metric 2: Net income. This metric was located in the 10K as a single line item + named: Net Income Attributable to Shareowners of The Coca-Cola Company.' + page(s)-0based: 62 + page(s): 63,66 + + category: 3-CALC-COMPLEX + correctness: >- + the answer contains a calculated Dividend Payout Ratio decimal value that is in the range from 0.7800 to 0.8200, + or, alternatively, a calculated percentage value that is in the range from 78.00% to 82.00% + (if the answer is a single number, assume that it is that calculated Dividend Payout Ratio metric value) + + evaluator-unreliable: true + + +financebench_id_10130: + sector: Information Technology + + company: Corning + period: 2020 + doc-type: 10k + doc: CORNING_2020_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: 'Based on the information provided primarily in the balance sheet and + the statement of income, what is FY2020 days payable outstanding (DPO) for Corning? + DPO is defined as: 365 * (average accounts payable between FY2019 and FY2020) + / (FY2020 COGS + change in inventory between FY2019 and FY2020). Round your answer + to two decimal places.' + + answer: '63.86' + justification: 'The metric in question was calculated using other simpler metrics. + The various simpler metrics (from the current and, if relevant, previous fiscal + year(s)) used were: + + + Metric 1: Accounts payable. This metric was located in the 10K as a single line + item named: Accounts payable. + + + Metric 2: Inventories. This metric was located in the 10K as a single line item + named: Inventories, net (Note 6). + + + Metric 3: Cost of goods sold. This metric was located in the 10K as a single line + item named: Cost of sales.' + page(s)-0based: 69 + page(s): 70,72 + + category: 3-CALC-COMPLEX + correctness: >- + the answer contains a calculated Days Payable Outstanding (DPO) decimal value that is in the range from 60.00 to 70.00 + (if the answer is a single number, assume that it is that calculated Days Payable Outstanding (DPO) decimal value) + + +financebench_id_02981: + sector: Information Technology + + company: Corning + period: 2021 + doc-type: 10k + doc: CORNING_2021_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: Taking into account the information outlined in the income statement, + what is the FY2019 - FY2021 3 year average unadjusted operating income % margin + for Corning? Answer in units of percents and round to one decimal place. + + answer: 10.3% + justification: 'The metric in question was calculated using other simpler metrics. + The various simpler metrics (from the current and, if relevant, previous fiscal + year(s)) used were: + + + Metric 1: Unadjusted operating income. This metric was located in the 10K as a + single line item named: Operating income. + + + Metric 2: Total revenue. This metric was located in the 10K as a single line item + named: Net sales.' + page(s)-0based: 64 + page(s): '65' + + category: 3-CALC-COMPLEX + correctness: >- + the answer constains a calculated Average Operating Income Margin percentage value that is in the range from 9.00% to 12.00%, + or, alternatively, a calculated decimal value that is in the range from 0.0900 to 0.1200 + (if the answer is a single number, assume that it is that calculated Average Operating Income Margin metric value) + + evaluator-unreliable: true + + +financebench_id_01346: + sector: Information Technology + + company: Corning + period: 2022 + doc-type: 10k + doc: CORNING_2022_10K + + question-type: domain-relevant + question-reasoning: Numerical reasoning + domain-question-num: dg23 + question: How much has the effective tax rate of Corning changed between FY2021 + and FY2022? + + answer: The effective tax rate of Corning has changed from 20% in FY2021 to 23% + in FY 2022. + justification: '' + page(s)-0based: 23 + page(s): '24' + + category: 2-CALC-CHANGE + correctness: >- + the answer says that Effective Tax Rate changed + from approximately 20.2% (or 20%) to approximately 22.9% (or 23%), + and/or that it increased by approximately 2.6, 2.7 or 3 percentage points + (or 2.6%, 2.7%, or 3%) + + evaluator-unreliable: true + + +financebench_id_00005: + sector: Information Technology + + company: Corning + period: 2022 + doc-type: 10k + doc: CORNING_2022_10K + + question-type: domain-relevant + question-reasoning: Numerical reasoning OR Logical reasoning + domain-question-num: dg24 + question: Does Corning have positive working capital based on FY2022 data? If working + capital is not a useful or relevant metric for this company, then please state + that and explain why. + + answer: Yes. Corning had a positive working capital amount of $831 million by FY + 2022 close. This answer considers only operating current assets and current liabilities + that were clearly shown in the balance sheet. + justification: 'Trade accounts receivable, net of doubtful accounts+Inventories+Other + current assets-Accounts payable-Other accrued liabilities + + 1721+2904+1157-1804-3147' + page(s)-0based: 59 + page(s): '60' + + category: 3-CALC-COMPLEX + correctness: >- + the answer affirms that Working Capital is/was positive, + proving so by a calculated Working Capital metric value that is positive + + +financebench_id_04209: + sector: Consumer Staples + + company: Costco + period: 2021 + doc-type: 10k + doc: COSTCO_2021_10K + + question-type: metrics-generated + question-reasoning: Information extraction + domain-question-num: '' + question: Using only the information within the balance sheet, how much total assets + did Costco have at the end of FY2021? Answer in USD millions. + + answer: $59268.00 + justification: 'The metric total assets was directly extracted from the company + 10K. The line item name, as seen in the 10K, was: TOTAL ASSETS.' + page(s)-0based: 37 + page(s): '38' + + category: 0-RETRIEVE + correctness: >- + the answer contains a quantity equivalent to or approximately equal to + 59268, 59268 million, 59.268 billion, + 59300, 59300 million, 59.3 billion + 59000, 59000 million or 59 billion + + +financebench_id_05915: + sector: Health Care + + company: CVS Health + period: 2018 + doc-type: 10k + doc: CVSHEALTH_2018_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: 'What is the FY2018 fixed asset turnover ratio for CVS Health? Fixed asset + turnover ratio is defined as: FY2018 revenue / (average PP&E between FY2017 and + FY2018). Round your answer to two decimal places. Calculate what was asked by + utilizing the line items clearly shown in the P&L statement and the balance sheet.' + + answer: '17.98' + justification: 'The metric in question was calculated using other simpler metrics. + The various simpler metrics (from the current and, if relevant, previous fiscal + year(s)) used were: + + + Metric 1: Total revenue. This metric was located in the 10K as a single line item + named: Total revenues. + + + Metric 2: Ppne, net. This metric was located in the 10K as a single line item + named: Property and equipment, net.' + page(s)-0based: 301 + page(s): 302,304 + + category: 3-CALC-COMPLEX + correctness: >- + the answer constains a calculated Fixed Asset Turnover Ratio decimal value that is in the range from 17.00 to 19.00 + (if the answer is a single number, assume that it is that calculated Fixed Asset Turnover Ratio decimal value) + + evaluator-unreliable: true + + +financebench_id_00790: + sector: Health Care + + company: CVS Health + period: 2022 + doc-type: 10k + doc: CVSHEALTH_2022_10K + + question-type: domain-relevant + question-reasoning: Logical reasoning (based on numerical reasoning) + domain-question-num: dg06 + question: Is CVS Health a capital-intensive business based on FY2022 data? + + answer: Yes, CVS Health requires an extensive asset base to operate, which is evident + from its ROA of only 1.82% in 2022 and 3.39% in 2021, though it should be noted + that a significant portion of this asset base is goodwill, and CVS's fixed assets/total + assets ratio is on the lower side of 5.6%. + justification: 'Property and equipment, net/Total Assets + + 12873/228275 + + + ROA=Net Income/Total Assets + + 4165/228275 + + 7898/232999' + page(s)-0based: 107 + page(s): 108,110 + + category: 6-OTHER-ADVANCED + correctness: |- + the answer either: + - mentions that a calculated Return on Assets (RoA) metric value is quite low (which suggests capital intensity); or + - mentions that Fixed Assets form only a small proportion of Total Assets (which suggests the reverse) + + evaluator-unreliable: true + + +financebench_id_01107: + sector: Health Care + + company: CVS Health + period: 2022 + doc-type: 10k + doc: CVSHEALTH_2022_10K + + question-type: domain-relevant + question-reasoning: Information extraction + domain-question-num: dg11 + question: Has CVS Health reported any materially important ongoing legal battles + from 2022, 2021 and 2020? + + answer: "Yes, CVS Health has been involved in multiple ongoing legal battles. Some\ + \ notable legal dispute areas for CVS are: (1) usual and customary pricing litigation:\ + \ where it's claimed that CVSâ\x80\x99s retail pharmacies overcharged for prescription\ + \ drugs; (2) PBM litigation and investigations: where it's claimed that that rebate\ + \ agreements between the drug manufacturers and PBMs caused inflated prices for\ + \ certain drug products; and (3) controlled substances litigation: legal matters\ + \ around opioids for which CVS has agreed to pay up to $4.3 billion to claimants\ + \ in remediation and $625 million to attorneys and fees" + justification: '' + page(s)-0based: 172 + page(s): 173,173,174 + + category: 0-RETRIEVE + correctness: >- + the answer affirms that there have been material lawsuits / legal battles + + +financebench_id_01244: + sector: Health Care + + company: CVS Health + period: 2022 + doc-type: 10k + doc: CVSHEALTH_2022_10K + + question-type: domain-relevant + question-reasoning: Information extraction + domain-question-num: dg18 + question: Has CVS Health paid dividends to common shareholders in Q2 of FY2022? + + answer: Yes, CVS paid a $ 0.55 dividend per share every quarter in FY2022 + justification: '' + page(s)-0based: 67 + page(s): '68' + + category: 0-RETRIEVE + correctness: >- + the answer affirms that dividends have been / were paid + + +financebench_id_00839: + sector: Consumer Discretionary + + company: Foot Locker + period: 2022 + doc-type: 8k + doc: FOOTLOCKER_2022_8K_dated_2022-08-19 + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: Does Foot Locker's new CEO have previous CEO experience in a similar company + to Footlocker? + + answer: Yes. She was previous CEO of Ulta Beauty which means she had to manage a + large retail company that has brick and mortar + online business. So yes she was + a CEO in a similar company to Foot Locker before this. + justification: '' + page(s)-0based: 1 + page(s): '2' + + category: 0-RETRIEVE + correctness: >- + the answer affirms that Dillon has got experience in relevant and similar organizations and roles + + evaluator-unreliable: true + + +financebench_id_00822: + sector: Consumer Discretionary + + company: Foot Locker + period: 2022 + doc-type: 8k + doc: FOOTLOCKER_2022_8K_dated-2022-05-20 + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: Were there any board member nominees who had substantially more votes + against joining than the other nominees? + + answer: Yes, his name is Richard A. Johnson + justification: Richard A. Johnson had roughly 16.1 million votes against him joining + whereas the maximum votes against joining among all other candidates was roughly + 6.1 million. + page(s)-0based: 1 + page(s): '2' + + category: 1-COMPARE + correctness: >- + the answer identifies Johnson as receiving many votes against + + evaluator-unreliable: true + + +financebench_id_04103: + sector: Consumer Staples + + company: General Mills + period: 2019 + doc-type: 10k + doc: GENERALMILLS_2019_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: 'What is the FY2019 cash conversion cycle (CCC) for General Mills? CCC + is defined as: DIO + DSO - DPO. DIO is defined as: 365 * (average inventory between + FY2018 and FY2019) / (FY2019 COGS). DSO is defined as: 365 * (average accounts + receivable between FY2018 and FY2019) / (FY2019 Revenue). DPO is defined as: 365 + * (average accounts payable between FY2018 and FY2019) / (FY2019 COGS + change + in inventory between FY2018 and FY2019). Round your answer to two decimal places. + Address the question by using the line items and information shown within the + income statement and the balance sheet.' + + answer: '-3.7' + justification: 'The metric in question was calculated using other simpler metrics. + The various simpler metrics (from the current and, if relevant, previous fiscal + year(s)) used were: + + + Metric 1: Accounts payable. This metric was located in the 10K as a single line + item named: Accounts payable. + + + Metric 2: Accounts receivable, net. This metric was located in the 10K as a single + line item named: Receivables. + + + Metric 3: Cost of goods sold. This metric was located in the 10K as a single line + item named: Cost of sales. + + + Metric 4: Total revenue. This metric was located in the 10K as a single line item + named: Net sales. + + + Metric 5: Inventories. This metric was located in the 10K as a single line item + named: Inventories.' + page(s)-0based: 52 + page(s): 53,55 + + category: 3-CALC-COMPLEX + correctness: >- + the answer contains a calculated Cash Conversion Cycle (CCC) metric value + that is NEGATIVE and in the range from -5.00 to -2.00, based on supporting calculated + Days Inventory Oustanding (DIO), Days Sales Outstanding (DSO) and Days Payable Outstanding (DPO) metric values + answer-inadequate: true + + +financebench_id_03471: + sector: Consumer Staples + + company: General Mills + period: 2020 + doc-type: 10k + doc: GENERALMILLS_2020_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: By drawing conclusions from the information stated only in the statement + of financial position, what is General Mills's FY2020 working capital ratio? Define + working capital ratio as total current assets divided by total current liabilities. + Round your answer to two decimal places. + + answer: '0.68' + justification: 'The metric in question was calculated using other simpler metrics. + The various simpler metrics (from the current and, if relevant, previous fiscal + year(s)) used were: + + + Metric 1: Total current liabilities. This metric was located in the 10K as a single + line item named: Total current liabilities. + + + Metric 2: Total current assets. This metric was located in the 10K as a single + line item named: Total current assets.' + page(s)-0based: 49 + page(s): '50' + + category: 3-CALC-COMPLEX + correctness: >- + the answer contains a calculated Working Capital Ratio decimal value that is in the range from 0.6500 to 0.7000, + or, alternatively, a calculated percentage value that is in the range from 65.00% to 70.00% + (if the answer is a single number, assume that it is that calculated Working Capital Ratio metric value) + + +financebench_id_04854: + sector: Consumer Staples + + company: General Mills + period: 2020 + doc-type: 10k + doc: GENERALMILLS_2020_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: 'According to the information provided in the statement of cash flows, + what is the FY2020 free cash flow (FCF) for General Mills? FCF here is defined + as: (cash from operations - capex). Answer in USD millions.' + + answer: $3215.00 + justification: 'The metric in question was calculated using other simpler metrics. + The various simpler metrics (from the current and, if relevant, previous fiscal + year(s)) used were: + + + Metric 1: Cash from operations. This metric was located in the 10K as a single + line item named: Net cash provided by operating activities. + + + Metric 2: Capital expenditures. This metric was located in the 10K as a single + line item named: Purchases of land, buildings, and equipment.' + page(s)-0based: 51 + page(s): '52' + + category: 3-CALC-COMPLEX + correctness: >- + the answer contains a calculated Free Cash Flows (FCF) metric value that is equivalent to or approximately equal to + 3215.4, 3215.4 million, 3.2154 billion, + 3215, 3215 million, 3.215 billion, + 3200, 3200 million or 3.2 billion + (if the answer is a single number, assume that it is that calculated Free Cash Flows (FCF) metric value) + + evaluator-unreliable: true + + +financebench_id_10136: + sector: Consumer Staples + + company: General Mills + period: 2022 + doc-type: 10k + doc: GENERALMILLS_2022_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: 'We want to calculate a financial metric. Please help us compute it by + basing your answers off of the cash flow statement and the income statement. Here''s + the question: what is the FY2022 retention ratio (using total cash dividends paid + and net income attributable to shareholders) for General Mills? Round answer to + two decimal places.' + + answer: '0.54' + justification: 'The metric in question was calculated using other simpler metrics. + The various simpler metrics (from the current and, if relevant, previous fiscal + year(s)) used were: + + + Metric 1: Total cash dividends paid out. This metric was located in the 10K as + a single line item named: Dividends paid. + + + Metric 2: Net income. This metric was located in the 10K as a single line item + named: Net earnings attributable to General Mills.' + page(s)-0based: 44 + page(s): 45,49 + + category: 3-CALC-COMPLEX + correctness: >- + the answer contains a calculated Retention Ratio decimal value that is in the range from 0.5000 to 0.6000, + or, alternatively, a calculated percentage value that is in the range from 50.00% to 60.00% + (if the answer is a single number, assume that it is that calculated Retention Ratio metric value) + + +financebench_id_00956: + sector: Health Care + + company: Johnson & Johnson + period: 2022 + doc-type: 10k + doc: JOHNSON_JOHNSON_2022_10K + + question-type: domain-relevant + question-reasoning: Logical reasoning (based on numerical reasoning) + domain-question-num: dg05 + question: Are JnJ's FY2022 financials that of a high growth company? + + answer: No, JnJ's FY2022 financials are not of a high growth company as sales grew + by 1.3% in FY2022. + justification: '' + page(s)-0based: 27 + + category: 0-RETRIEVE + correctness: >- + the answer mentions low/slow Sales Revenue growth + + +financebench_id_00669: + sector: Health Care + + company: Johnson & Johnson + period: 2022 + doc-type: 10k + doc: JOHNSON_JOHNSON_2022_10K + + question-type: domain-relevant + question-reasoning: Logical reasoning (based on numerical reasoning) OR Numerical + reasoning OR Logical reasoning + domain-question-num: dg16 + question: What drove gross margin change as of FY2022 for JnJ? If gross margin is + not a useful metric for a company like this, then please state that and explain + why. + + answer: 'For FY22, JnJ had changes in gross margin due to: One-time COVID-19 vaccine + manufacturing exit related costs, Currency impacts in the Pharmaceutical segment, + Commodity inflation in the MedTech and Consumer Health segments, partially offset + by Supply chain benefits in the Consumer Health segment.' + justification: Gross margin change is equivalent to the increase in cost of products + sold as a percent to sales. + page(s)-0based: 33 + + category: 5-EXPLAIN-FACTORS + correctness: |- + the answer mentions at least 2 of following: + - one-time COVID-19 vaccine manufacturing exit related costs; + - currency impacts in the Pharmaceutical segment; + - commodity inflation in the MedTech and Consumer Health segments; and/or + - supply chain benefits in the Consumer Health segment + + evaluator-unreliable: true + + +financebench_id_00711: + sector: Health Care + + company: Johnson & Johnson + period: 2022 + doc-type: 10k + doc: JOHNSON_JOHNSON_2022_10K + + question-type: domain-relevant + question-reasoning: Numerical reasoning OR Logical reasoning + domain-question-num: dg25 + question: Roughly how many times has JnJ sold its inventory in FY2022? Calculate + inventory turnover ratio for FY2022; if conventional inventory management is not + meaningful for the company then state that and explain why. + + answer: JnJ sold its inventory 2.7 times in FY2022. + justification: Inventory turnover ratio = Cost of products sold/average inventories + = 31,089/((12,483+10,387)/2) = 2.7 + page(s)-0based: 45 + + category: 3-CALC-COMPLEX + correctness: >- + the answer contains a calculated Inventory Turnover Ratio decimal value that is in the range from 2.00 to 3.00 + (if the answer is a single number, assume that it is that calculated Inventory Turnover Ratio decimal value) + + evaluator-unreliable: true + + +financebench_id_00651: # TODO: retrieve growth rates + sector: Health Care + + company: Johnson & Johnson + period: 2022 + doc-type: Earnings + doc: JOHNSON_JOHNSON_2022Q4_EARNINGS + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: Is growth in JnJ's adjusted EPS expected to accelerate in FY2023? + + answer: No, rate of growth in adjusted EPS is expected to decelerate slightly from + 3.6% in FY2022 to 3.5% in FY2023. + justification: FY2023 adjusted EPS growth of 3.5% is slightly lower than FY2022 + adjusted EPS growth of 3.6%. + page(s)-0based: 0 + + category: 1-COMPARE + correctness: >- + the answer mentions 3.5% and 3.6%, + or, alternatively, concludes that growth is NOT expected to accelerate + + evaluator-unreliable: true + + +financebench_id_01484: + sector: Health Care + + company: Johnson & Johnson + period: 2022 + doc-type: Earnings + doc: JOHNSON_JOHNSON_2022Q4_EARNINGS + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: How did JnJ's US sales growth compare to international sales growth in + FY2022? + + answer: US sales increased 3.0% vs international sales decline of 0.6%. + justification: '' + page(s)-0based: 1 + + category: 1-COMPARE + correctness: >- + the answer mentions US sales increased and international sales decreased + + evaluator-unreliable: true + + +financebench_id_01488: + sector: Health Care + + company: Johnson & Johnson + period: 2023 + doc-type: 8k + doc: JOHNSON_JOHNSON_2023_8K_dated-2023-08-30 + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: Which business segment of JnJ will be treated as a discontinued operation + from August 30, 2023 onward? + + answer: The Consumer Health business segment will be treated as a discontinued operation + from August 30, 2023 onward. + justification: '' + page(s)-0based: 3 + + category: 0-RETRIEVE + correctness: >- + the answer identifies Consumer Health as discontinued + + +financebench_id_01490: + sector: Health Care + + company: Johnson & Johnson + period: 2023 + doc-type: 8k + doc: JOHNSON_JOHNSON_2023_8K_dated-2023-08-30 + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: What is the amount of the gain accruing to JnJ as a result of the separation + of its Consumer Health business segment, as of August 30, 2023? + + answer: JnJ will make a gain of approximately $20 billion from the separation of + its Consumer Health business segment. + justification: '' + page(s)-0based: 3 + + category: 0-RETRIEVE + correctness: >- + the answer mentions 20 billion + + +financebench_id_01491: + sector: Health Care + + company: Johnson & Johnson + period: 2023 + doc-type: 8k + doc: JOHNSON_JOHNSON_2023_8K_dated-2023-08-30 + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: What is the amount of the cash proceeds that JnJ realised from the separation + of Kenvue (formerly Consumer Health business segment), as of August 30, 2023? + + answer: JnJ realised $13.2 billion in cash proceeds from the separation of Kenvue. + justification: '' + page(s)-0based: 3 + + category: 0-RETRIEVE + correctness: >- + the answer mentions 13.2 billion, or, alternatively, approximately 13 billion + + +financebench_id_01487: + sector: Health Care + + company: Johnson & Johnson + period: 2023 + doc-type: Earnings + doc: JOHNSON_JOHNSON_2023Q2_EARNINGS + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: Did JnJ's net earnings as a percent of sales increase in Q2 of FY2023 + compared to Q2 of FY2022? + + answer: Yes, net earnings as a percent of sales increased from 20% in Q2 of FY2022 + to 20.1% in Q2 of FY2023. + justification: '' + page(s)-0based: 9 + + category: 1-COMPARE + correctness: >- + the answer mentions 20.0% (or 20%) and 20.1%, or, alternatively, mentions a slight increase + + +financebench_id_00299: + sector: Financials + + company: JPMorgan + period: 2021 + doc-type: 10q + doc: JPMORGAN_2021Q1_10Q + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: Which of JPM's business segments had the lowest net revenue in 2021 Q1? + + answer: Corporate. Its net revenue was -$473 million. + justification: 14,605 > 12,517 > 4,077 > 2,393 > -473 + page(s)-0based: 18 + page(s): '19' + + category: 1-COMPARE + correctness: >- + the answer identifies Corporate segment as having lowest Net Revenue + + +financebench_id_02119: + sector: Financials + + company: JPMorgan + period: 2021 + doc-type: 10q + doc: JPMORGAN_2021Q1_10Q + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: If JPM went bankrupted by the end by 2021 Q1 and liquidated all of its + assets to pay its shareholders, how much could each shareholder get? + + answer: They could receive $66.56 per share. + justification: '' + page(s)-0based: 5 + page(s): '6' + + category: 0-RETRIEVE + correctness: >- + the answer contains a quantity that is in the range from 60.00 to 70.00 + + evaluator-unreliable: true + + +financebench_id_00206: + sector: Financials + + company: JPMorgan + period: 2022 + doc-type: 10k + doc: JPMORGAN_2022_10K + + question-type: domain-relevant + question-reasoning: Logical reasoning (based on numerical reasoning) OR Logical + reasoning + domain-question-num: dg03 + question: Are JPM's gross margins historically consistent (not fluctuating more + than roughly 2% each year)? If gross margins are not a relevant metric for a company + like this, then please state that and explain why. + + answer: Since JPM is a financial institution, gross margin is not a relevant metric. + justification: '' + page(s)-0based: 2 + page(s): '3' + + category: 6-OTHER-ADVANCED + correctness: >- + the answer argues that Gross Margin is not a very relevant/useful metric for this business model and/or industry, + or, alternatively, that performance in this business model and/or industry is usually not judged through Gross Margin + + evaluator-unreliable: true + + +financebench_id_00394: + sector: Financials + + company: JPMorgan + period: 2022 + doc-type: 10q + doc: JPMORGAN_2022Q2_10Q + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: In 2022 Q2, which of JPM's business segments had the highest net income? + + answer: Corporate & Investment Bank. Its net income was $3725 million. + justification: 3725 > 3100 > 1004 > 994 > -174 + page(s)-0based: 20 + page(s): '21' + + category: 1-COMPARE + correctness: >- + the answer identifies Corporate & Investment Bank segment as having higest Net Income + + +financebench_id_02049: + sector: Financials + + company: JPMorgan + period: 2023 + doc-type: 10q + doc: JPMORGAN_2023Q2_10Q + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: Looking at VaR, did the risk that JPM faced in the second fiscal quarter + of 2023 decrease compared to the same period in the prior year? + + answer: Yes. It decreased. + justification: '' + page(s)-0based: 84 + page(s): '85' + + category: 0-RETRIEVE + correctness: >- + the answer affirms that VaR decreased + + +financebench_id_10499: + sector: Consumer Staples + + company: Kraft Heinz + period: 2019 + doc-type: 10k + doc: KRAFTHEINZ_2019_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: 'What is Kraft Heinz''s FY2019 inventory turnover ratio? Inventory turnover + ratio is defined as: (FY2019 COGS) / (average inventory between FY2018 and FY2019). + Round your answer to two decimal places. Please base your judgments on the information + provided primarily in the balance sheet and the P&L statement.' + + answer: '6.25' + justification: 'The metric in question was calculated using other simpler metrics. + The various simpler metrics (from the current and, if relevant, previous fiscal + year(s)) used were: + + + Metric 1: Cost of goods sold. This metric was located in the 10K as a single line + item named: Cost of products sold. + + + Metric 2: Inventories. This metric was located in the 10K as a single line item + named: Inventories.' + page(s)-0based: 49 + page(s): 50,52 + + category: 3-CALC-COMPLEX + correctness: >- + the answer contains a calculated Inventory Turnover Ratio decimal value that is in the range from 6.00 to 6.50 + (if the answer is a single number, assume that it is that calculated Inventory Turnover Ratio decimal value) + + +financebench_id_04412: + sector: Industrials + + company: Lockheed Martin + period: 2020 + doc-type: 10k + doc: LOCKHEEDMARTIN_2020_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: 'We need to calculate a reasonable approximation (or exact number if possible) + of a financial metric. Basing your judgment by information plainly provided in + the balance sheet and the P&L statement, what is Lockheed Martin''s FY2020 asset + turnover ratio? Asset turnover ratio is defined as: FY2020 revenue / (average + total assets between FY2019 and FY2020). Round your answer to two decimal places.' + + answer: '1.33' + justification: 'The metric in question was calculated using other simpler metrics. + The various simpler metrics (from the current and, if relevant, previous fiscal + year(s)) used were: + + + Metric 1: Total revenue. This metric was located in the 10K as a single line item + named: Total net sales. + + + Metric 2: Total assets. This metric was located in the 10K as a single line item + named: Total assets.' + page(s)-0based: 66 + page(s): 67,69 + + category: 3-CALC-COMPLEX + correctness: >- + the answer contains a calculated Asset Turnover Ratio decimal value that is in the range from 1.30 to 1.40 + (if the answer is a single number, assume that it is that calculated Asset Turnover Ratio decimal value) + + +financebench_id_03031: + sector: Industrials + + company: Lockheed Martin + period: 2021 + doc-type: 10k + doc: LOCKHEEDMARTIN_2021_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: What is Lockheed Martin's FY2021 net working capital? Define net working + capital as total current assets less total current liabilities. Answer in USD + millions. Respond to the question by assuming the perspective of an investment + analyst who can only use the details shown within the balance sheet. + + answer: $5818.00 + justification: 'The metric in question was calculated using other simpler metrics. + The various simpler metrics (from the current and, if relevant, previous fiscal + year(s)) used were: + + + Metric 1: Total current liabilities. This metric was located in the 10K as a single + line item named: Total current liabilities. + + + Metric 2: Total current assets. This metric was located in the 10K as a single + line item named: Total current assets.' + page(s)-0based: 67 + page(s): '68' + + category: 3-CALC-COMPLEX + correctness: >- + the answer contains a calculated Net Working Capital metric value that is equivalent to or approximately equal to + 5818, 5818 million, 5.818 billion, + 5800, 5800 million or 5.8 billion + (if the answer is a single number, assume that it is that calculated Net Working Capital metric value) + + +financebench_id_03718: + sector: Industrials + + company: Lockheed Martin + period: 2022 + doc-type: 10k + doc: LOCKHEEDMARTIN_2022_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: What is Lockheed Martin's 2 year total revenue CAGR from FY2020 to FY2022 + (in units of percents and round to one decimal place)? Provide a response to the + question by primarily using the statement of income. + + answer: 0.4% + justification: 'The metric total revenue was directly extracted from the company + 10K. The line item name, as seen in the 10K, was: Total net sales. The final step + was to execute the desired CAGR calculation on total revenue.' + page(s)-0based: 62 + page(s): '63' + + category: 2-CALC-CHANGE + correctness: >- + the answer contains a calculated CAGR percentage value that is in the range from 0.400% to 0.500% + (if the answer is a single number, assume that it is that calculated CAGR percentage value) + + evaluator-unreliable: true + + +financebench_id_04171: + sector: Consumer Discretionary + + company: MGM Resorts + period: 2018 + doc-type: 10k + doc: MGMRESORTS_2018_10K + + question-type: metrics-generated + question-reasoning: Information extraction + domain-question-num: '' + question: Basing your judgments off of the balance sheet, what is the year end FY2018 + amount of accounts payable for MGM Resorts? Answer in USD millions. + + answer: $303.00 + justification: 'The metric accounts payable was directly extracted from the company + 10K. The line item name, as seen in the 10K, was: Accounts payable.' + page(s)-0based: 56 + page(s): '57' + + category: 0-RETRIEVE + correctness: >- + the answer contains a quantity that is equivalent to or approximately equal to + 302.6, 302.6 million, 0.3026 billion, + 303, 303 million, 0.303 billion, + 300, 300 million or 0.3 billion + + evaluator-unreliable: true + + +financebench_id_03849: + sector: Consumer Discretionary + + company: MGM Resorts + period: 2020 + doc-type: 10k + doc: MGMRESORTS_2020_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: What is the FY2018 - FY2020 3 year average of capex as a % of revenue + for MGM Resorts? Answer in units of percents and round to one decimal place. Please + utilize information provided primarily within the statement of cash flows and + the statement of income. + + answer: 7.9% + justification: 'The metric in question was calculated using other simpler metrics. + The various simpler metrics (from the current and, if relevant, previous fiscal + year(s)) used were: + + + Metric 1: Capital expenditures. This metric was located in the 10K as a single + line item named: Capital expenditures, net of construction payable. + + + Metric 2: Total revenue. This metric was located in the 10K as a single line item + named: [blank line item referring to total revenue].' + page(s)-0based: 64 + page(s): 65,67 + + category: 3-CALC-COMPLEX + correctness: >- + the answer contains a calculated metric percentage value that is in the range from 7.50% to 8.50%, + or, alternatively, a calculated decimal value that is in the range from 0.0750 to 0.0850 + (if the answer is a single number, assume that it is that calculated metric value) + + +financebench_id_01254: + sector: Consumer Discretionary + + company: MGM Resorts + period: 2022 + doc-type: 10k + doc: MGMRESORTS_2022_10K + + question-type: domain-relevant + question-reasoning: Information extraction + domain-question-num: dg18 + question: Has MGM Resorts paid dividends to common shareholders in FY2022? + + answer: Yes. MGM maintained 0.01$ per share annual dividend through out FY 2022. + justification: '' + page(s)-0based: 31 + page(s): '32' + + category: 0-RETRIEVE + correctness: >- + the answer affirms that dividends have been / were paid + + evaluator-unreliable: true + + +financebench_id_00382: + sector: Consumer Discretionary + + company: MGM Resorts + period: 2022 + doc-type: Earnings + doc: MGMRESORTS_2022Q4_EARNINGS + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: Which region had the Highest EBITDAR Contribution for MGM during FY2022? + + answer: Las Vegas resorts contributed ~90% of company level EBITDAR during FY2022. + justification: 3142308/3497254 + page(s)-0based: 12 + page(s): '13' + + category: 1-COMPARE + correctness: >- + the answer identifies Las Vegas resorts as having highest EBITDAR + + +financebench_id_01911: + sector: Consumer Discretionary + + company: MGM Resorts + period: 2022 + doc-type: Earnings + doc: MGMRESORTS_2022Q4_EARNINGS + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: What was MGM's interest coverage ratio using FY2022 Adjusted EBIT as the + numerator and annual Interest Expense as the denominator? + + answer: As adjusted EBIT is negative, coverage ratio is zero + justification: '' + page(s)-0based: 13 + page(s): '14' + + category: 3-CALC-COMPLEX + correctness: >- + the answer contains a calculated Interest Coverage Ratio metric value, + or, alternatively, concludes that Interest Coverage Ratio is zero + answer-inadequate: true + + +financebench_id_01912: + sector: Consumer Discretionary + + company: MGM Resorts + period: 2022 + doc-type: Earnings + doc: MGMRESORTS_2022Q4_EARNINGS + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: Which region had the worst topline performance for MGM during FY2022? + + answer: MGM China experienced the worst topline performance amongst the other regions + presented. Its revenue declined 44% in FY2022 whereas the other regions presented + increased their revenues. + justification: '' + page(s)-0based: 2 + page(s): 3,4,4 + + category: 1-COMPARE + correctness: >- + the answer identifies MGM China as having worst top-line Revenue performance + + +financebench_id_00407: + sector: Consumer Discretionary + + company: MGM Resorts + period: 2023 + doc-type: 10q + doc: MGMRESORTS_2023Q2_10Q + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: Which type of debt received the largest investment among the short term + investments for MGM in H1 FY2023? + + answer: the biggest short term investment is in corporate bonds (almost 82% of the + total investment) + justification: 416420/509921 + page(s)-0based: 10 + page(s): '11' + + category: 1-COMPARE + correctness: >- + the answer identifies corporate bonds as having received largest short-term investment + + +financebench_id_04700: + sector: Information Technology + + company: Microsoft + period: 2016 + doc-type: 10k + doc: MICROSOFT_2016_10K + + question-type: metrics-generated + question-reasoning: Information extraction + domain-question-num: '' + question: What is the FY2016 COGS for Microsoft? Please state answer in USD millions. + Provide a response to the question by primarily using the statement of income. + + answer: $32780.00 + justification: 'The metric cost of goods sold was directly extracted from the company + 10K. The line item name, as seen in the 10K, was: Total cost of revenue.' + page(s)-0based: 51 + page(s): '52' + + category: 0-RETRIEVE + correctness: >- + the answer contains a quantity that is equivalent to or approximately equal to + 32780, 32780 million, 32.78 billion, + 32800, 32800 million, 32.8 billion + 33000, 33000 million or 33 billion + + +financebench_id_00552: + sector: Information Technology + + company: Microsoft + period: 2023 + doc-type: 10k + doc: MICROSOFT_2023_10K + + question-type: domain-relevant + question-reasoning: Numerical reasoning + domain-question-num: dg22 + question: Has Microsoft increased its debt on balance sheet between FY2023 and the + FY2022 period? + answer: No. Microsoft decreased its debt by $2.5bn in FY 2023 vs FY 2022. + justification: 'Current portion of long-term debt+Long-term debt + + 5247+41990 + + 2749+47032' + page(s)-0based: 59 + page(s): '60' + + category: 3-CALC-COMPLEX + correctness: >- + the answer contains calculated Total Debt values for 2022 and 2023, and concludes that Total Debt decreased + answer-inadequate: true + + +financebench_id_04458: + sector: Communication Services + + company: Netflix + period: 2015 + doc-type: 10k + doc: NETFLIX_2015_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: 'We want to calculate a financial metric. Please help us compute it by + basing your answers off of the statement of income and the statement of cash flows. + Here''s the question: what is the FY2015 unadjusted EBITDA % margin for Netflix? + Calculate unadjusted EBITDA using unadjusted operating income and D&A (from cash + flow statement).' + + answer: 5.4% + justification: 'The metric in question was calculated using other simpler metrics. + The various simpler metrics (from the current and, if relevant, previous fiscal + year(s)) used were: + + + Metric 1: Depreciation and amortization. This metric was located in the 10K as + a single line item named: Depreciation and amortization of property, equipment + and intangibles. + + + Metric 2: Unadjusted operating income. This metric was located in the 10K as a + single line item named: Operating income. + + + Metric 3: Total revenue. This metric was located in the 10K as a single line item + named: Revenues.' + page(s)-0based: 39 + page(s): 40,42 + + category: 3-CALC-COMPLEX + correctness: >- + the answer contains a calculated EBITDA Margin percentage value that is in the range from 5.00% to 5.50%, + or, alternatively, a calculated decimal value that is in the range from 0.0500 to 0.0550, + assuming that EBITDA = "Operating Income" + "Depreciation & Amortization of Property, Equipment & Intangibles" + (if the answer is a single number, assume that it is that calculated EBITDA Margin metric value) + + +financebench_id_03282: + sector: Communication Services + + company: Netflix + period: 2017 + doc-type: 10k + doc: NETFLIX_2017_10K + + question-type: metrics-generated + question-reasoning: Information extraction + domain-question-num: '' + question: What is Netflix's year end FY2017 total current liabilities (in USD millions)? + Base your judgments on the information provided primarily in the balance sheet. + + answer: $5466.00 + justification: 'The metric total current liabilities was directly extracted from + the company 10K. The line item name, as seen in the 10K, was: Total current liabilities.' + page(s)-0based: 44 + page(s): '45' + + category: 0-RETRIEVE + correctness: >- + the answer contains a quantity that is equivalent to or approximately equal to + 5466.3, 5466.3 million, 5.4663 billion, + 5466, 5466 million, 5.466 billion, + 5500, 5500 million or 5.5 billion + + evaluator-unreliable: true + + +financebench_id_04302: + sector: Consumer Discretionary + + company: Nike + period: 2018 + doc-type: 10k + doc: NIKE_2018_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: We need to calculate a reasonable approximation (or exact number if possible) + of a financial metric. Basing your judgment by information plainly provided in + the statement of income, what is Nike's three year average of cost of goods sold + as a % of revenue from FY2016 to FY2018? Answer in units of percents and round + to one decimal place. + + answer: 55.1% + justification: 'The metric in question was calculated using other simpler metrics. + The various simpler metrics (from the current and, if relevant, previous fiscal + year(s)) used were: + + + Metric 1: Cost of goods sold. This metric was located in the 10K as a single line + item named: Cost of sales. + + + Metric 2: Total revenue. This metric was located in the 10K as a single line item + named: Revenues.' + page(s)-0based: 45 + page(s): '46' + + category: 3-CALC-COMPLEX + correctness: >- + the answer contains a calculated metric percentage value that is in the range from 50.00% to 60.00%, + or, alternatively, a calculated decimal value that is in the range from 0.5000 to 0.6000 + (if the answer is a single number, assume that it is that calculated metric value) + + +financebench_id_03531: + sector: Consumer Discretionary + + company: Nike + period: 2019 + doc-type: 10k + doc: NIKE_2019_10K + + question-type: metrics-generated + question-reasoning: Information extraction + domain-question-num: '' + question: According to the details clearly outlined within the balance sheet, how + much total current assets did Nike have at the end of FY2019? Answer in USD millions. + + answer: $16525.00 + justification: 'The metric total current assets was directly extracted from the + company 10K. The line item name, as seen in the 10K, was: Total current assets.' + page(s)-0based: 53 + page(s): '54' + + category: 0-RETRIEVE + correctness: >- + the answer contains a quantity that is equivalent to or approximately equal to + 16525, 16525 million, 16.525 billion, + 16500, 16500 million or 16.5 billion + + +financebench_id_04080: + sector: Consumer Discretionary + + company: Nike + period: 2021 + doc-type: 10k + doc: NIKE_2021_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: 'When primarily referencing the income statement and the statement of + financial position, what is the FY2021 inventory turnover ratio for Nike? Inventory + turnover ratio is defined as: (FY2021 COGS) / (average inventory between FY2020 + and FY2021). Round your answer to two decimal places.' + + answer: '3.46' + justification: 'The metric in question was calculated using other simpler metrics. + The various simpler metrics (from the current and, if relevant, previous fiscal + year(s)) used were: + + + Metric 1: Cost of goods sold. This metric was located in the 10K as a single line + item named: Cost of sales. + + + Metric 2: Inventories. This metric was located in the 10K as a single line item + named: Inventories.' + page(s)-0based: 58 + page(s): 59,61 + + category: 3-CALC-COMPLEX + correctness: >- + the answer contains a calculated Inventory Turnover Ratio decimal value that is in the range from 3.00 to 4.00 + (if the answer is a single number, assume that it is that calculated Inventory Turnover Ratio decimal value) + + +financebench_id_01163: + sector: Consumer Discretionary + + company: Nike + period: 2023 + doc-type: 10k + doc: NIKE_2023_10K + + question-type: domain-relevant + question-reasoning: Numerical reasoning + domain-question-num: dg19 + question: Among operations, investing, and financing activities, which brought in + the most (or lost the least) cash flow for Nike in FY2023? + + answer: Among the three, cash flow from operations was the highest for Nike in FY2023. + justification: '' + page(s)-0based: 61 + page(s): '62' + + category: 1-COMPARE + correctness: >- + the answer identifies Operations / Operating Cash Flows as bringing in most cash + + +financebench_id_00080: + sector: Financials + + company: Paypal + period: 2022 + doc-type: 10k + doc: PAYPAL_2022_10K + + question-type: domain-relevant + question-reasoning: Numerical reasoning OR Logical reasoning + domain-question-num: dg24 + question: Does Paypal have positive working capital based on FY2022 data? If working + capital is not a useful or relevant metric for this company, then please state + that and explain why. + + answer: Yes. Paypal has a positive working capital of $ 1.6Bn as of FY2022 end. + justification: 'Accounts receivable, net+Loans and interest receivable, net of allowances + +Funds receivable and customer accounts+Prepaid expenses and other current assets-Accounts + payable-Funds payable and amounts due to customers-Accrued expenses and other + current liabilities -Income taxes payable + + 963+7431+36357+1898-126-40107-4055-813' + page(s)-0based: 60 + page(s): '61' + + category: 3-CALC-COMPLEX + correctness: >- + the answer affirms that Working Capital is/was positive, + proving so by a calculated Working Capital metric value that is positive + + +financebench_id_04980: + sector: Consumer Staples + + company: PepsiCo + period: 2021 + doc-type: 10k + doc: PEPSICO_2021_10K + + question-type: metrics-generated + question-reasoning: Information extraction + domain-question-num: '' + question: What is the FY2021 capital expenditure amount (in USD billions) for PepsiCo? + Respond to the question by assuming the perspective of an investment analyst who + can only use the details shown within the statement of cash flows. + + answer: $4.60 + justification: 'The metric capital expenditures was directly extracted from the + company 10K. The line item name, as seen in the 10K, was: Capital spending.' + page(s)-0based: 62 + page(s): '63' + + category: 0-RETRIEVE + correctness: >- + the answer contains a quantity that is equivalent to or approximately equal to + 4.625, 4.625 billion, 4625 million, + 4.6, 4.6 billion or 4600 million + + +financebench_id_01009: + sector: Consumer Staples + + company: PepsiCo + period: 2022 + doc-type: 10k + doc: PEPSICO_2022_10K + + question-type: domain-relevant + question-reasoning: Information extraction + domain-question-num: dg08 + question: What are the geographies that Pepsico primarily operates in as of FY2022? + + answer: 'As of FY2022, Pepsico primarily operates in the following geographies: + North America, Latin America, Europe, Africa, Middle East, South Asia, Asia Pacific, + Australia, New Zealand and China.' + justification: '' + page(s)-0based: 3 + page(s): 4, 5 + + category: 0-RETRIEVE + correctness: |- + the answer mentions at least 3 of following geographies: + - North America, which includes United States and Canada; + - Latin America (LatAm); + - Europe; + - Africa, Middle East and South Asia (AMESA); and + - Asia Pacific, Australia and New Zealand and China (APAC) + + +financebench_id_00735: + sector: Consumer Staples + + company: PepsiCo + period: 2022 + doc-type: 10k + doc: PEPSICO_2022_10K + + question-type: domain-relevant + question-reasoning: Information extraction + domain-question-num: dg11 + question: Has Pepsico reported any materially important ongoing legal battles from + FY2022 and FY2021? + + answer: No, Pepsico is not involved in material legal battles. + justification: Management believes the final outcome of legal proceedings will not + have a material adverse outcome. + page(s)-0based: 25 + page(s): '26' + + category: 0-RETRIEVE + correctness: >- + the answer says that there have NOT been material lawsuits / legal battles, + or, alternatively, that lawsuits / legal battles are unlikely to have materially adverse outcomes + + evaluator-unreliable: true + + +financebench_id_01328: + sector: Consumer Staples + + company: PepsiCo + period: 2022 + doc-type: 10k + doc: PEPSICO_2022_10K + + question-type: domain-relevant + question-reasoning: Information extraction + domain-question-num: dg21 + question: What is the quantity of restructuring costs directly outlined in Pepsico's + income statements for FY2022? If restructuring costs are not explicitly outlined + then state 0. + + answer: Pepsico's restructuring costs in FY2022 amounted to $411 million . + justification: '' + page(s)-0based: 77 + page(s): '78' + + category: 0-RETRIEVE + correctness: |- + the answer either: + - mentions a quantity that is equivalent to or approximately equal to 411 million; or + - states 0, zero, and/or that restructuring costs are not explicitly reported + answer-inadequate: true + + +financebench_id_03620: + sector: Consumer Staples + + company: PepsiCo + period: 2022 + doc-type: 10k + doc: PEPSICO_2022_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: What is the FY2022 unadjusted EBITDA less capex for PepsiCo? Define unadjusted + EBITDA as unadjusted operating income + depreciation and amortization [from cash + flow statement]. Answer in USD millions. Respond to the question by assuming the + perspective of an investment analyst who can only use the details shown within + the statement of cash flows and the income statement. + + answer: $9068.00 + justification: 'The metric in question was calculated using other simpler metrics. + The various simpler metrics (from the current and, if relevant, previous fiscal + year(s)) used were: + + + Metric 1: Depreciation and amortization. This metric was located in the 10K as + a single line item named: Depreciation and amortization. + + + Metric 2: Unadjusted operating income. This metric was located in the 10K as a + single line item named: Operating Profit. + + + Metric 3: Capital expenditures. This metric was located in the 10K as a single + line item named: Capital spending.' + page(s)-0based: 61 + page(s): 62,64 + + category: 3-CALC-COMPLEX + correctness: |- + the answer contains a calculated metric value that is either: + - in the range from 8500 to 9500; + - in the range from 8500 million to 9500 million; + - in the range from 8.5 billion to 9.5 billion; or + - stated as approximately 9000 million or 9 billion + (if the answer is a single number, assume that it is that calculated metric value) + + evaluator-unreliable: true + + +financebench_id_04481: + sector: Consumer Staples + + company: PepsiCo + period: 2022 + doc-type: 10k + doc: PEPSICO_2022_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: What is the FY2022 unadjusted EBITDA % margin for PepsiCo? Calculate unadjusted + EBITDA using unadjusted operating income and D&A (from cash flow statement). Give + a response to the question by relying on the details shown in the statement of + cash flows and the P&L statement. + + answer: 16.5% + justification: 'The metric in question was calculated using other simpler metrics. + The various simpler metrics (from the current and, if relevant, previous fiscal + year(s)) used were: + + + Metric 1: Depreciation and amortization. This metric was located in the 10K as + a single line item named: Depreciation and amortization. + + + Metric 2: Unadjusted operating income. This metric was located in the 10K as a + single line item named: Operating Profit. + + + Metric 3: Total revenue. This metric was located in the 10K as a single line item + named: Net Revenue.' + page(s)-0based: 61 + page(s): 62,64 + + category: 3-CALC-COMPLEX + correctness: |- + the answer contains a calculated EBITDA Margin percentage value that is in the range from 16.00% to 17.00%, + or, alternatively, a calculated decimal value that is in the range from 0.1600 to 0.1700 + (if the answer is a single number, assume that it is that calculated EBITDA Margin metric value) + + +financebench_id_01482: + sector: Consumer Staples + + company: PepsiCo + period: 2023 + doc-type: 8k + doc: PEPSICO_2023_8K_dated-2023-05-05 + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: At the Pepsico AGM held on May 3, 2023, what was the outcome of the shareholder + vote on the shareholder proposal for a congruency report by Pepsico on net-zero + emissions policies? + + answer: The shareholder proposal for a congruency report by Pepsico on net-zero + emissions policies was defeated. + justification: '' + page(s)-0based: 3 + page(s): '4' + + category: 1-COMPARE + correctness: >- + the answer says proposal related to Net-Zero Emissions was defeated / not successful + + +financebench_id_00705: + sector: Consumer Staples + + company: PepsiCo + period: 2023 + doc-type: 8k + doc: PEPSICO_2023_8K_dated-2023-05-30 + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: By how much did Pepsico increase its unsecured five year revolving credit + agreement on May 26, 2023? + + answer: $400,000,000 increase. + justification: Increase in five year unsecured revolving credit agreement = May + 26, 2023, five year unsecured revolving credit agreement amount of $4,200,000,000 + - May 27, 2022, five year unsecured revolving credit agreement amount of $3,800,000,000 + = $400,000,000 + page(s)-0based: 1 + page(s): '2' + + category: 2-CALC-CHANGE + correctness: >- + the answer contains a calculated change quantity that is equivalent to or approximately equal to + 400,000,000, 400 million or 0.4 billion + (if the answer is a single number, assume that it is that calculated change amount) + + +financebench_id_00882: + sector: Consumer Staples + + company: PepsiCo + period: 2023 + doc-type: 8k + doc: PEPSICO_2023_8K_dated-2023-05-30 + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: As of May 26, 2023, what is the total amount Pepsico may borrow under + its unsecured revolving credit agreements? + + answer: Total amount Pepsico may borrow under unsecured revolving credit agreements + = $8,400,000,000. + justification: Total amount that may be borrowed under unsecured revolving credit + agreements = 2023, 364 day unsecured revolving credit agreement amount of $4,200,000,000 + + 2023, five year unsecured revolving credit agreement amount of $4,200,000,000 + = $8,400,000,000. + page(s)-0based: 1 + page(s): '2' + + category: 3-CALC-COMPLEX + correctness: |- + the answer either (or both): + - mentions two separate quantities each equal to 4,200,000,000, 4200 million or 4.2 billion; and/or + - contains a calculated total quantity that is greater than or equal to + 8,400,000,000, 8400 million or 8.4 billion + (if the answer is a single number, assume that it is that latter calculated total amount) + + evaluator-unreliable: true + + +financebench_id_01474: + sector: Consumer Staples + + company: PepsiCo + period: 2023 + doc-type: Earnings + doc: PEPSICO_2023Q1_EARNINGS + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: As of FY2023Q1, why did Pepsico raise full year guidance for FY2023? + + answer: Pepsico experienced a strong start to FY2023. + justification: '' + page(s)-0based: 0 + page(s): '1' + + category: 0-RETRIEVE + correctness: >- + the answer mentions strong business performance + + +financebench_id_01476: + sector: Consumer Staples + + company: PepsiCo + period: 2023 + doc-type: Earnings + doc: PEPSICO_2023Q1_EARNINGS + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: As of FY2023Q1, by how many percentage points did Pepsico raise full year + guidance in respect of core constant currency EPS growth? + + answer: Pepsico raised full year guidance in respect of core constant currency EPS + growth by 1 percentage point. + justification: '' + page(s)-0based: 0 + page(s): '1' + + category: 2-CALC-CHANGE + correctness: >- + the answer mentions growth guidance raised from 8% to 9%, + and/or growth guidance raised by 1 percentage point or 1% + + evaluator-unreliable: true + + +financebench_id_00302: + sector: Health Care + + company: Pfizer + period: 2021 + doc-type: 10k + doc: PFIZER_2021_10K + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: Did Pfizer grow its PPNE between FY20 and FY21? + + answer: Yes, change in PPNE was positive year over year + justification: 14882 - 13745 > 0 + page(s)-0based: 58 + page(s): '59' + + category: 1-COMPARE + correctness: >- + the answer concludes that Property, Plant & Equipment (PP&E or PPNE) increased + + evaluator-unreliable: true + + +financebench_id_00702: + sector: Health Care + + company: Pfizer + period: 2021 + doc-type: 10k + doc: PFIZER_2021_10K + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: Were there any potential events that are not in Pfizer's standard business + operations that substantially increased net income in 2019? + + answer: Yes, the gain on completion of Consumer Healthcare JV Transaction + justification: Income statement shows the gain on completion of Consumer Healthcare + JV transaction occured in FY19. In FY21, this event did not affect the net income + at all due to the seemingly one time nature of the line item + page(s)-0based: 56 + page(s): '57' + + category: 5-EXPLAIN-FACTORS + correctness: >- + the answer mentions Consumer Healthcare JV transaction + + +financebench_id_02416: # note: Therachon is mentioned on separate following page + sector: Health Care + + company: Pfizer + period: 2021 + doc-type: 10k + doc: PFIZER_2021_10K + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: What are three main companies acquired by Pfizer mentioned in this 10K + report? + + answer: Trillium, Array, and Therachon + justification: '' + page(s)-0based: 69 + page(s): 70, 71 + + category: 0-RETRIEVE + correctness: >- + the answer mentions Trillium and Array + + +financebench_id_00283: + sector: Health Care + + company: Pfizer + period: 2023 + doc-type: 10q + doc: Pfizer_2023Q2_10Q + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: How much does Pfizer expect to pay to spin off Upjohn in the future in + USD million? + + answer: '77.78' + justification: '10% cost is remaining amount in the future. Calculation: 700/9 is + 10% of the cost remaining' + page(s)-0based: 40 + page(s): '41' + + category: 6-OTHER-ADVANCED + correctness: >- + the answer mentions 700 million and 90% + + evaluator-unreliable: true + + +financebench_id_00724: + sector: Health Care + + company: Pfizer + period: 2023 + doc-type: 10q + doc: Pfizer_2023Q2_10Q + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: For Pfizer, which geographic region had the biggest drop in Q22023 year + over year revenues (on a percentage basis)? + + answer: Developed Rest of the World + justification: It's plainly stated in table format the year over year revenue changes + for each of the regions + page(s)-0based: 37 + page(s): '38' + + category: 1-COMPARE + correctness: >- + the answer identifies Developed Rest of World as having worst percentage/relative decline + + +financebench_id_02419: # tricky: Upjohn spin-off started in 2020 but would complete in 2023 + sector: Health Care + + company: Pfizer + period: 2023 + doc-type: 10q + doc: Pfizer_2023Q2_10Q + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: As of Q2'2023, is Pfizer spinning off any large business segments? + + answer: Yes, it's spinning off Upjohn. + justification: '' + page(s)-0based: 40 + page(s): '41' + + category: 0-RETRIEVE + correctness: >- + the answer mentions Upjohn + + evaluator-unreliable: true + + +financebench_id_00746: + sector: Consumer Discretionary + + company: Ulta Beauty + period: 2023 + doc-type: 10k + doc: ULTABEAUTY_2023_10K + + question-type: domain-relevant + question-reasoning: Information extraction + domain-question-num: dg04 + question: Which debt securities are registered to trade on a national securities + exchange under Ulta Beauty's name as of FY2023? + + answer: There are none + justification: No debt securities listed under securities registered pursuant to + Section 12(b) of the Act. + page(s)-0based: 0 + page(s): '1' + + category: 0-RETRIEVE + correctness: >- + the answer concludes that there are no debt securities traded, + or, alternatively, that no such debt securities are explicitly reported + + +financebench_id_00521: + sector: Consumer Discretionary + + company: Ulta Beauty + period: 2023 + doc-type: 10k + doc: ULTABEAUTY_2023_10K + + question-type: domain-relevant + question-reasoning: Information extraction + domain-question-num: dg10 + question: What are major acquisitions that Ulta Beauty has done in FY2023 and FY2022? + + answer: Ulta Beauty did not make any acquisitions in FY2023 and FY2022. + justification: Consolidated statement of cash flows reflects - for Acquisitions, + net of cash acquired in FY2023 and FY2022. + page(s)-0based: 56 + page(s): '57' + + category: 0-RETRIEVE + correctness: >- + the answer concludes that there are no major acquisitions, + or, alternatively, that no such major acquisitions are explicitly reported + + +financebench_id_00601: + sector: Consumer Discretionary + + company: Ulta Beauty + period: 2023 + doc-type: Earnings + doc: ULTABEAUTY_2023Q4_EARNINGS + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: What drove the reduction in SG&A expense as a percent of net sales in + FY2023? + + answer: Lower marketing expenses and leverage of incentive compensation due to higher + sales. The answer here assumes FY2023 refers to the 12 months ended on January + 28, 2023 (although the company refers to this period as its fiscal 2022. + justification: Fiscal 2022 = FY2023. Fiscal 2021 = FY2022. + page(s)-0based: 1 + page(s): '2' + + category: 0-RETRIEVE + correctness: >- + the answer mentions marketing expenses and incentive compensation + answer-inadequate: true + + +financebench_id_00603: + sector: Consumer Discretionary + + company: Ulta Beauty + period: 2023 + doc-type: Earnings + doc: ULTABEAUTY_2023Q4_EARNINGS + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: What drove the increase in Ulta Beauty's merchandise inventories balance + at end of FY2023? + + answer: Increase in Merchandise inventories balance was driven by the opening of + 47 new stores. The answer here assumes FY2023 refers to the 12 months ended on + January 28, 2023 (although the company refers to this period as its fiscal 2022. + justification: Fiscal 2022 = FY2023. Fiscal 2021 = FY2022. + page(s)-0based: 2 + page(s): '2' + + category: 0-RETRIEVE + correctness: >- + the answer mentions new stores + + +financebench_id_00605: + sector: Consumer Discretionary + + company: Ulta Beauty + period: 2023 + doc-type: Earnings + doc: ULTABEAUTY_2023Q4_EARNINGS + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: What percent of Ulta Beauty's total spend on stock repurchases for FY + 2023 occurred in Q4 of FY2023? + + answer: 36%. The answer here assumes FY2023 refers to the 12 months ended on January + 28, 2023 (although the company refers to this period as its fiscal 2022. + justification: Fiscal 2022 = FY2023. Fiscal 2021 = FY2022. Percent spent in Q4 of + FY2023 = Amount spent in Q4 of FY2023/Total amount spent in FY2023*100 =$328.1 + million /$900 million * 100 = 36% + page(s)-0based: 2 + page(s): '3' + + category: 3-CALC-COMPLEX + correctness: >- + the answer contains a calculated percentage value that is in the range from 30% to 40% + (if the answer is a single number, assume that it is that calculated percentage value) + + +financebench_id_00606: # tricky: highly implicit wordings + sector: Consumer Discretionary + + company: Ulta Beauty + period: 2023 + doc-type: Earnings + doc: ULTABEAUTY_2023Q4_EARNINGS + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: Did Ulta Beauty's wages expense as a percent of net sales increase or + decrease in FY2023? + + answer: Wages expense as a percent of net sales increased in FY2023. The answer + here assumes FY2023 refers to the 12 months ended on January 28, 2023 (although + the company refers to this period as its fiscal 2022. + justification: Fiscal 2022 = FY2023. Fiscal 2021 = FY2022. Store payroll and benefits + = wages. Store payroll and benefits offsets reduction in SG&A percent of net sales + in FY2023. + page(s)-0based: 1 + page(s): '2' + + category: 6-OTHER-ADVANCED + correctness: >- + the answer concludes that Wages as percent of Net Sales increased + + +financebench_id_00859: + sector: Communication Services + + company: Verizon + period: 2021 + doc-type: 10k + doc: VERIZON_2021_10K + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: Among all of the derivative instruments that Verizon used to manage the + exposure to fluctuations of foreign currencies exchange rates or interest rates, + which one had the highest notional value in FY 2021? + + answer: Cross currency swaps. Its notional value was $32,502 million. + justification: The derivative instruments used to mangae the exposure were interest + rate swaps, cross currency swaps, forward starting interest rate swaps, and foreign + exchange forwards. 32502 > 19779 > 1000 > 932 + page(s)-0based: 84 + page(s): '85' + + category: 1-COMPARE + correctness: >- + the answer identifies Cross Currency Swaps as having highest notional value + + +financebench_id_02024: + sector: Communication Services + + company: Verizon + period: 2021 + doc-type: 10k + doc: VERIZON_2021_10K + + question-type: novel-generated + question-reasoning: '' + domain-question-num: '' + question: As of FY 2021, how much did Verizon expect to pay for its retirees in + 2024? + + answer: The estimated pension benefits were $1097 million, and the estimated health + care and life insurance benefits were $862 million. + justification: '' + page(s)-0based: 62 + page(s): 63, 94 + + category: 0-RETRIEVE + correctness: |- + the answer mentions at least 1 of following: + - amount of 1,097 million, or 1.1 billion, or approximately equivalent amount (explicitly or implicitly for "Pension (Benefits)"); + - amount of 862 million, or approximately equivalent amount (explicitly or implicitly for "Health Care & Life (Insurance)"; or + - total amount of 1,959 million, or 1.96 billion, or 2.0 billion, or an approximately equivalent amount + + +financebench_id_00216: + sector: Communication Services + + company: Verizon + period: 2022 + doc-type: 10k + doc: VERIZON_2022_10K + + question-type: domain-relevant + question-reasoning: Logical reasoning (based on numerical reasoning) OR Logical + reasoning + domain-question-num: dg01 + question: Does Verizon have a reasonably healthy liquidity profile based on its + quick ratio for FY 2022? If the quick ratio is not relevant to measure liquidity, + please state that and explain why. + + answer: No. The quick ratio was approximately 0.54 for Verizon. It indicated that + Verizon does not have a healthy liquidity profile. + justification: Quick ratio = (current assets - inventories - prepaid expenses) / + current liabilities = (37857 - 2388 - 8358) / 50171 = 0.5403719 + page(s)-0based: 55 + page(s): '56' + + category: 4-CALC-AND-JUDGE + correctness: >- + the answer contains a calculated Quick Ratio decimal value that is in the range from 0.40 to 0.80, + or, alternatively, a calculated percentage value that is in the range from 40% to 80% + + +financebench_id_00215: + sector: Communication Services + + company: Verizon + period: 2022 + doc-type: 10k + doc: VERIZON_2022_10K + + question-type: domain-relevant + question-reasoning: Logical reasoning (based on numerical reasoning) + domain-question-num: dg06 + question: Is Verizon a capital intensive business based on FY 2022 data? + + answer: Yes. Verizon's capital intensity ratio was approximately 2.774729. This + means that it took approximately $2.77 of assets to generate $1 of revenue and + thus, Verizon can be considered capital intensive. + justification: capital intensity ratio = total asset / revenue = 379680/ 136835 + = 2.774729, which is relatively high + page(s)-0based: 55 + page(s): 56, 23 + + category: 4-CALC-AND-JUDGE + correctness: >- + the answer opines that Verizon's business is capital-intensive, and justifies such opinion with a calculated ratio + + evaluator-unreliable: true + + +financebench_id_00566: + sector: Communication Services + + company: Verizon + period: 2022 + doc-type: 10k + doc: VERIZON_2022_10K + + question-type: domain-relevant + question-reasoning: Numerical reasoning + domain-question-num: dg22 + question: Has Verizon increased its debt on balance sheet between 2022 and the 2021 + fiscal period? + + answer: No. Verizon's debt decreased by $229 million. + justification: debt change = debt in 2022 - debt in 2021 = 150639 - 150868 = -229 + page(s)-0based: 76 + page(s): '77' + + category: 1-COMPARE + correctness: >- + the answer concludes that debt decreased + + evaluator-unreliable: true + + +financebench_id_06247: + sector: Consumer Staples + + company: Walmart + period: 2018 + doc-type: 10k + doc: WALMART_2018_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: 'What is FY2018 days payable outstanding (DPO) for Walmart? DPO is defined + as: 365 * (average accounts payable between FY2017 and FY2018) / (FY2018 COGS + + change in inventory between FY2017 and FY2018). Round your answer to two decimal + places. Please base your judgments on the information provided primarily in the + statement of financial position and the P&L statement.' + + answer: '42.69' + justification: 'The metric in question was calculated using other simpler metrics. + The various simpler metrics (from the current and, if relevant, previous fiscal + year(s)) used were: + + + Metric 1: Accounts payable. This metric was located in the 10K as a single line + item named: Accounts payable. + + + Metric 2: Inventories. This metric was located in the 10K as a single line item + named: Inventories. + + + Metric 3: Cost of goods sold. This metric was located in the 10K as a single line + item named: Cost of sales.' + page(s)-0based: 56 + page(s): 57,59 + + category: 3-CALC-COMPLEX + correctness: >- + the answer contains a calculated Days Payable Outstanding (DPO) decimal value that is in the range from 35.00 to 50.00 + (if the answer is a single number, assume that it is that calculated Days Payable Outstanding (DPO) decimal value) + + +financebench_id_04784: + sector: Consumer Staples + + company: Walmart + period: 2019 + doc-type: 10k + doc: WALMART_2019_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: Based on the information provided primarily in the statement of income, + what is the FY2018 - FY2019 change in unadjusted operating income % margin for + Walmart? Answer in units of percents and round to one decimal place. + + answer: 0.2% + justification: 'The metric in question was calculated using other simpler metrics. + The various simpler metrics (from the current and, if relevant, previous fiscal + year(s)) used were: + + + Metric 1: Unadjusted operating income. This metric was located in the 10K as a + single line item named: Operating income. + + + Metric 2: Total revenue. This metric was located in the 10K as a single line item + named: Total revenues.' + page(s)-0based: 47 + page(s): '48' + + category: 3-CALC-COMPLEX + correctness: |- + the answer contains either: + - calculated Operating Income Margin percentage values for 2018 and 2019, + and their difference, which is a percentage value less than 0.5% in magnitude; or + - calculated Operating Income Margin decimal values for 2028 and 2019, + and their difference, which is a decimal value less than 0.005 in magnitude + answer-inadequate: true + + +financebench_id_06741: + sector: Consumer Staples + + company: Walmart + period: 2020 + doc-type: 10k + doc: WALMART_2020_10K + + question-type: metrics-generated + question-reasoning: Numerical reasoning + domain-question-num: '' + question: What is the FY2018 - FY2020 3 year average unadjusted EBITDA % margin + for Walmart? Define unadjusted EBITDA as unadjusted operating income + depreciation + and amortization from the cash flow statement. Answer in units of percents and + round to one decimal place. Calculate what was asked by utilizing the line items + clearly shown in the P&L statement and the cash flow statement. + + answer: 6.2% + justification: 'The metric in question was calculated using other simpler metrics. + The various simpler metrics (from the current and, if relevant, previous fiscal + year(s)) used were: + + + Metric 1: Depreciation and amortization. This metric was located in the 10K as + a single line item named: Depreciation and amortization. + + + Metric 2: Unadjusted operating income. This metric was located in the 10K as a + single line item named: Operating income. + + + Metric 3: Total revenue. This metric was located in the 10K as a single line item + named: Total revenues.' + page(s)-0based: 50 + page(s): 51,56 + + category: 3-CALC-COMPLEX + correctness: >- + the answer contains a calculated EBITDA Margin percentage value that is in the range from 5.50% to 6.50%, + or, alternatively, a calculated decimal value that is in the range from 0.0550 to 0.0650 + (if the answer is a single number, assume that it is that calculated EBITDA Margin metric value) diff --git a/examples/FinanceBench-Lite/knowledge-store.txt b/examples/FinanceBench-Lite/knowledge-store.txt new file mode 100644 index 000000000..e623a859d --- /dev/null +++ b/examples/FinanceBench-Lite/knowledge-store.txt @@ -0,0 +1,45 @@ +Liquidity Metric Formulas +------------------------- + +`(Net) Working Capital` = `(Total) Current Assets` - `(Total) Current Liabilities` + +`Working Capital Ratio` = `(Total) Current Assets` / `(Total) Current Liabilities` + +`Quick Ratio` = ( + (`Cash & Cash Equivalents` + + `Short-Term Investments or (Current) Marketable Securities` + + `(Net) Accounts Receivable, a.k.a. (Net) (Trade) Receivables`) + / `(Total) Current Liabilities` +) + +`Operating Cash Flow Ratio` = ( + `(Net) Cash Flows from Operations, a.k.a. (Net) Operating Cash Flows` + / `(Total) Current Liabilities` +) + +`Free Cash Flow, a.k.a. FCF` = ( + `(Net) Cash Flows from Operations, a.k.a. (Net) Operating Cash Flows` - + `Capital Expenditure(s), a.k.a. CapEx, or Capital Spending, or Property, Plant & Equipment (PP&E) Expenditure(s)/Purchase(s)` +) + +`Free Cash Flow Conversion Ratio` = `Free Cash Flow, a.k.a. FCF` / `Earnings before Interest, Tax, Depreciation & Amortization, a.k.a. EBITDA` + +`Days Inventory Outstanding, a.k.a. DIO` = ( + 365 * `average (Total) (Net) Inventory(ies), typically between two consecutive fiscal year-ends` + / `(Total) Cost of Goods Sold, a.k.a. (Total) COGS, or (Total) Cost of Sales, or (Total) Cost of Revenue` +) + +`Days Payable Outstanding, a.k.a. DPO` = ( + 365 * `average Accounts Payable, typically between two consecutive fiscal year-ends` + / (`(Total) Cost of Goods Sold, a.k.a. (Total) COGS, or (Total) Cost of Sales, or (Total) Cost of Revenue` + + `change in (Total) (Net) Inventory(ies), typically between two consecutive fiscal year-ends`) +) + +`Days Sales Oustanding, a.k.a. DSO` = ( + 365 * `average (Net) Accounts Receivable, a.k.a. (Net) (Trade) Receivables, typically between two consecutive fiscal year-ends` + / `(Total) (Net) (Operating) Revenue(s), a.k.a. (Total) (Net) Sales` +) + +`Cash Conversion Cycle, a.k.a. CCC` = ( + `Days Inventory Outstanding, a.k.a. DIO` + `Days Sales Oustanding, a.k.a. DSO` - `Days Payable Outstanding, a.k.a. DPO` +) diff --git a/examples/FinanceBench-Lite/log.py b/examples/FinanceBench-Lite/log.py new file mode 100644 index 000000000..874f12f53 --- /dev/null +++ b/examples/FinanceBench-Lite/log.py @@ -0,0 +1,39 @@ +from pathlib import Path +# import sys + +from loguru import logger + +from data_and_knowledge import FbId, DOC_NAMES_BY_FB_ID + + +LOG_DIR_PATH: Path = Path(__file__).parent / '.log' +CURRENT_LOG_HANDLER_ID: int | None = None + + +# loguru.readthedocs.io/en/stable/api/logger.html#loguru._logger.Logger.add +# logger.add(sink=sys.stdout, level='DEBUG', +# # format=..., +# filter=None, +# colorize=True, +# serialize=False, +# backtrace=True, diagnose=True, +# enqueue=False, context=None, +# catch=True) + + +def switch_log_file(fb_id: FbId, output_name: str): + global CURRENT_LOG_HANDLER_ID # pylint: disable=global-statement + + if CURRENT_LOG_HANDLER_ID is not None: + logger.remove(handler_id=CURRENT_LOG_HANDLER_ID) + + CURRENT_LOG_HANDLER_ID = logger.add(sink=(Path(LOG_DIR_PATH) / + DOC_NAMES_BY_FB_ID[fb_id] / fb_id[16:] / f'{output_name}.log'), + level='DEBUG', + # format=..., + filter=None, + colorize=True, + serialize=False, + backtrace=True, diagnose=True, + enqueue=False, context=None, + catch=True) diff --git a/examples/FinanceBench-Lite/program-store.yml b/examples/FinanceBench-Lite/program-store.yml new file mode 100644 index 000000000..36e65732c --- /dev/null +++ b/examples/FinanceBench-Lite/program-store.yml @@ -0,0 +1,36 @@ +quick-ratio: + task: Assess liquidity health of {COMPANY} through its `Quick Ratio` as at {PERIOD} fiscal period end + + sub-htps: + - task: |- + Calculate `Quick Ratio` of {COMPANY} as at {PERIOD} fiscal period end as decimal value according to formula: + + `Quick Ratio` = ( + (`Cash & Cash Equivalents` + + `Short-Term Investments or (Current) Marketable Securities` + + `(Net) Accounts Receivable, a.k.a. (Net) (Trade) Receivables`) + / `(Total) Current Liabilities` + ) + + sub-htps: + # 1 single Retrieval task for multiple quantities on same statement, for both efficiency & mutual consistency; + # retrieve individual numerator & denominator balance values only, without taking division + # because RAG LMs may not be good at calculation & mathematical reasoning + - task: |- + What are values in dollars of: + - `Cash & Cash Equivalents`; + - `Short-Term Investments or (Current) Marketable Securities`; + - `(Net) Accounts Receivable, a.k.a. (Net) (Trade) Receivables`; and + - `(Total) Current Liabilities` + (or most similar-meaning reported line items to those) + + on one same `(Consolidated) Balance Sheet, a.k.a. Statement of (Consolidated) Financial Position` + (or most similar-meaning statement) of {COMPANY} + (and NOT Balance Sheets of its acquired and/or divested companies) + + as at {PERIOD} fiscal period end? + + - task: |- + Compare calculated `Quick Ratio` decimal value against 1.00 and make assessment: + - `Quick Ratio` >= 1.00: liquidity is healthy; or + - `Quick Ratio` < 1.00: liquidity is not very healthy diff --git a/examples/FinanceBench-Lite/rag-ground-truths.yml b/examples/FinanceBench-Lite/rag-ground-truths.yml new file mode 100644 index 000000000..6ef352009 --- /dev/null +++ b/examples/FinanceBench-Lite/rag-ground-truths.yml @@ -0,0 +1,914 @@ +defs: + + BS: (Consolidated) Balance Sheet, a.k.a. Statement of (Consolidated) Financial Position + + cash-and-equiv: Cash & Cash Equivalents + st-invest: Short-Term Investments or (Current) Marketable Securities + recvables: (Net) Accounts Receivable, a.k.a. (Net) (Trade) Receivables + invent: (Total) (Net) Inventory(ies) + curr-assets: (Total) Current Assets + fixed-assets: (Net) Fixed Assets, a.k.a. (Net) Property, Plant & Equipment (PP&E) + total-assets: Total Assets + + payables: Accounts Payable + st-debt: Short-Term Debt, or Current Portion of (Long-Term) Debt + curr-liabs: (Total) Current Liabilities + lt-debt: Long-Term Debt (EXCLUDING any current/short-term portion) + + + CF: (Consolidated) Cash Flow(s) Statement(s), a.k.a. (Consolidated) Statement(s) of Cash Flows + + d&a: Depreciation & Amortization, a.k.a. D&A (of Fixed Assets or Property, Plant & Equipment (PP&E)) + op-cf: (Net) Cash Flows from Operations, a.k.a. (Net) Operating Cash Flows + + capex: Capital Expenditure(s), a.k.a. CapEx, or Capital Spending, or Property, Plant & Equipment (PP&E) Expenditure(s)/Purchase(s) + + div: Cash Dividends + + + P&L: >- + (Consolidated) Income Statement, a.k.a. (Consolidated) Profit-and-Loss (P&L) Statement, + or (Consolidated) Earnings Statement, or (Consolidated) Operations Statement + + rev: (Total) (Net) (Operating) Revenue(s), a.k.a. (Total) (Net) Sales + cogs: (Total) Cost of Goods Sold, a.k.a. (Total) COGS, or (Total) Cost of Sales, or (Total) Cost of Revenue + gross: Gross Income, a.k.a. Gross Profit, or Gross Earnings (or Loss(es)) + op: (Unadjusted) Operating Income, a.k.a. Operating Profit, or Operating Earnings (or Loss(es)) + ebitda: (Unadjusted) Earnings before Interest, Tax, Depreciation & Amortization, a.k.a. EBITDA + ebit: Earnings before Interest & Tax, a.k.a. EBIT + int: Interest Expense + ebt: Income or Profit or Earnings (or Loss(es)) before (Income) Tax(es) + inc-tax: (Income) Tax Expense + net: Net Income, a.k.a. Net Profit, or Net Earnings (or Loss(es)) (Attributable to Shareholders) + + +ground-truths: + + 3M_2018_10K: + BS: + fixed-assets: + 2018: 8,738 million or 8.7 billion + 2017: 8,866 million or 8.9 billion # unreliable + + + 3M_2022_10K: + BS: + fixed-assets: + 2022: 9,178 million + 2021: 9,429 million + + total-assets: + 2022: 46,455 million + 2021: 47,072 million + + CF: + capex: + 2022: 1,749 million + 2021: 1,603 million + 2020: 1,501 million # unreliable + + P&L: + rev: + 2022: 34,229 million + 2021: 35,355 million + 2020: 32,184 million + + net: + 2022: 5,777 million + 2021: 5,921 million + 2020: 5,449 million + + + 3M_2023Q2_10Q: + BS: + cash-and-equiv: + 2023Q2: 4,258 million # unreliable + 2022: 3,655 million + + st-invest: + 2023Q2: 56 million + 2022: 238 million + + recvables: + 2023Q2: 4,947 million + 2022: 4,532 million + + invent: + 2023Q2: 5,280 million + 2022: 5,372 million + + curr-assets: + 2023Q2: 15,754 million + 2022: 14,688 million + + curr-liabs: + 2023Q2: 10,936 million + 2022: 9,523 million + + + ACTIVISIONBLIZZARD_2019_10K: + BS: + fixed-assets: + 2019: 253 million + 2018: 282 million + + CF: + capex: + 2019: 116 million + 2018: 131 million + 2017: 155 million # unreliable + + P&L: + rev: + 2019: 6,489 million + 2018: 7,500 million + 2017: 7,017 million + + + ADOBE_2015_10K: + BS: + curr-liabs: + 2015: 2,213.556 million or 2,213.6 million or 2.21 billion or 2.2 billion + 2014: 2,494.435 million or 2,494.4 million or 2.49 billion or 2.5 billion + + CF: + op-cf: + 2015: 1,469.502 million or 1,469.5 million or 1.47 billion or 1.5 billion + 2014: 1,287.482 million or 1,287.5 million or 1.29 billion or 1.3 billion + 2013: 1,151.686 million or 1,151.6 million or 1.15 billion or 1.2 billion + + + ADOBE_2016_10K: + P&L: + op: + 2016: 1,493.602 million or 1,493.6 million or 1.49 billion or 1.5 billion # unreliable + 2015: 903.095 million or 903.1 million or 0.9 billion # unreliable + 2014: 412.685 million or 412.7 million or 0.41 billion or 0.4 billion # unreliable + + + ADOBE_2017_10K: + BS: + curr-liabs: + 2017: 3,527.457 million or 3,527.5 million or 3.53 billion or 3.5 billion + 2016: 2,811.635 million or 2,811.6 million or 2.81 billion or 2.8 billion + + CF: + op-cf: + 2017: 2,912.853 million or 2,912.9 million or 2.91 billion or 2.9 billion + 2016: 2,199.728 million or 2,199.7 million or 2.2 billion + 2013: 1,469.502 million or 1,469.5 million or 1.47 billion or 1.5 billion # unreliable + + + ADOBE_2022_10K: + CF: + op-cf: + 2022: 7,838 million + 2021: 7,230 million + 2020: 5,727 million + + capex: + 2022: 442 million # unreliable + 2021: 348 million # unreliable + 2020: 419 million # unreliable + + P&L: + rev: + 2022: 17,606 million # unreliable + 2021: 15,785 million + 2020: 12,868 million + + op: + 2022: 6,098 million + 2021: 5,802 million + 2020: 4,237 million + + net: + 2022: 4,756 million + 2021: 4,822 million + 2020: 5,260 million + + + AES_2022_10K: + BS: + invent: + 2022: 1,055 million + 2021: 604 million + + total-assets: + 2022: 38,363 million + 2021: 32,963 million + + P&L: + cogs: + 2022: 10,069 million # unreliable + 2021: 8,430 million # unreliable + 2020: 6,967 million # unreliable + + net: + 2022: negative (loss) 546 million + 2021: negative (loss) 409 million # unreliable + 2020: 46 million + + + AMAZON_2017_10K: + BS: + invent: + 2017: 16,047 million + 2016: 11,461 million # unreliable + + payables: + 2017: 34,616 million + 2016: 25,309 million + + P&L: + rev: + 2017: 177,866 million + 2016: 135,987 million + 2015: 107,006 million + + cogs: + 2017: 111,934 million # unreliable: often mistaken for Total Operating Expenses $173,760 million + 2016: 88,265 million # unreliable: often mistaken for Total Operating Expenses $131,801 million + 2015: 71,651 million + + + AMCOR_2020_10K: + BS: + recvables: + 2020: 1,615.9 million # unreliable + 2019: 1,864.3 million # unreliable + + + AMCOR_2023_10K: + BS: + cash-and-equiv: + 2023: 689 million + 2022: 775 million + + st-invest: + 2023: 0 (or not explicitly reported) + 2022: 0 (or not explicitly reported) + + recvables: + 2023: 1,875 million # unreliable + 2022: 1,935 million + + invent: + 2023: 992 million + 1,221 million, or 2,213 million + 2022: 1,114 million + 1,325 million, or 2,439 million + + curr-assets: + 2023: 5,308 million + 2022: 5,853 million + + curr-liabs: + 2023: 4,476 million + 2022: 5,103 million + + P&L: + rev: + 2023: 14,694 million + 2022: 14,544 million + 2021: 12,861 million + + gross: + 2023: 2,725 million + 2022: 2,820 million + 2021: 2,732 million + + + AMCOR_2023Q4_EARNINGS: + P&L: + rev: + 2023Q4: 3,673 million + 2023FY: 14,694 million + 2022Q4: 3,909 million + 2022FY: 14,544 million + + ebitda: + 2023Q4: 540 million # unreliable: FY & Quarter numbers often mistaken for each other + 2023FY: 2,018 million # unreliable: FY & Quarter numbers often mistaken for each other + + + AMD_2015_10K: + CF: + d&a: + 2015: 167 million + 2014: 203 million + 2013: 236 million + + P&L: + rev: + 2015: 3,991 million + 2014: 5,506 million + 2013: 5,299 million + + + AMD_2022_10K: + BS: + cash-and-equiv: + 2022: 4,835 million # unreliable + 2021: 2,535 million # unreliable + + st-invest: + 2022: 1,020 million + 2021: 1,073 million + + recvables: + 2022: 4,126 million # unreliable + 2021: 2,706 million # unreliable + + invent: + 2022: 3,771 million + 2021: 1,955 million # unreliable + + curr-assets: + 2022: 15,019 million + 2021: 8,583 million + + curr-liabs: + 2022: 6,369 million + 2021: 4,240 million + + + AMERICANWATERWORKS_2021_10K: + CF: + d&a: + 2021: 636 million # unreliable + 2020: 604 million # unreliable + 2019: 582 million # unreliable + + P&L: + op: + 2021: 1,196 million + 2020: 1,248 million + 2019: 1,214 million + + + AMERICANWATERWORKS_2022_10K: + BS: + curr-assets: + 2022: 1,250 million + 2021: 1,554 million + + curr-liabs: + 2022: 2,811 million + 2021: 2,141 million + + + BESTBUY_2017_10K: + P&L: + rev: + 2017: 39,403 million + 2016: 39,528 million + 2015: 40,339 million + + net: + 2017: 1,228 million # unreliable: often mistaken for Net Earnings (Loss) from Continuing Operations $1,207m + 2016: 897 million # unreliable: often mistaken for Net Earnings (Loss) from Continuing Operations $807m + 2015: 1,233 million # unreliable: often mistaken for Net Earnings (Loss) from Continuing Operations $1,246m + + + BESTBUY_2019_10K: + BS: + invent: + 2019: 5,409 million + 2018: 5,209 million + + + BESTBUY_2023_10K: + P&L: + rev: + 2023: 46,298 million or 46.3 billion + 2022: 51,761 million or 51.8 billion + 2021: 47,262 million or 47.3 billion + + gross: + 2023: 9,912 million or 9.9 billion # unreliable + 2022: 11,640 million or 11.6 billion + 2021: 10,573 million or 10.6 billion + + + BLOCK_2016_10K: + BS: + curr-assets: + 2016: 1,001,425 or 1,001.4 million or 1.0 billion + 2015: 705,563 or 705.6 million or 0.7 billion + + curr-liabs: + 2016: 577,464 or 577.5 million or 0.6 billion # unreliable + 2015: 334,202 or 334.2 million or 0.3 billion # unreliable + + + BOEING_2018_10K: + BS: + fixed-assets: + 2018: 12,645 million # unreliable: 2018 & 2017 numbers often mixed up + 2017: 12,672 million # unreliable: 2018 & 2017 numbers often mixed up + + + BOEING_2022_10K: + P&L: + rev: + 2022: 66,608 million + 2021: 62,286 million + 2020: 58,158 million + + gross: + 2022: 3,502 million # unreliable because of missing line-time label + 2021: 3,017 million # unreliable because of missing line-time label + 2020: negative (loss) 5,685 million # unreliable because of missing line-time label + + ebt: + 2022: negative (loss) 5,022 million + 2021: negative (loss) 5,033 million + 2020: negative (loss) 14,476 million + + inc-tax: + 2022: tax of 31 million + 2021: tax benefit of 743 million + 2020: tax benefit of 2,535 million + + + COCACOLA_2017_10K: + BS: + total-assets: + 2017: 36,545 million # unreliable + 2016: 34,010 million # unreliable + + P&L: + net: + 2017: 1,248 million + 2016: 6,527 million + 2015: 7,351 million + + + COCACOLA_2021_10K: + P&L: + rev: + 2021: 38,655 million + 2020: 33,014 million + 2019: 37,266 million + + cogs: + 2021: 15,357 million + 2020: 13,433 million # unreliable + 2019: 14,619 million # unreliable + + + COCACOLA_2022_10K: + CF: + div: + 2022: 7,616 million + 2021: 7,252 million + 2020: 7,047 million + + P&L: + net: + 2022: 9,542 million + 2021: 9,771 million + 2020: 7,747 million + + + CORNING_2020_10K: + BS: + invent: + 2020: 2,438 million + 2019: 2,320 million + + payables: + 2020: 1,174 million # unreliable: often mistaken for Other Accrued Liabilities #2,437m + 2019: 1,587 million # unreliable: often mistaken for Other Accrued Liabilities $1,923m + + P&L: + cogs: + 2020: 7,772 million # unreliable: often failing to be retrieved at all + 2019: 7,468 million # unreliable: often failing to be retrieved at all + 2018: 6,829 million # unreliable: often failing to be retrieved at all + + + CORNING_2021_10K: + P&L: + rev: + 2021: 14,082 million # unreliable + 2020: 11,303 million + 2019: 11,503 million + + op: + 2021: 2,112 million + 2020: 509 million + 2019: 1,306 million + + + CORNING_2022_10K: + BS: + curr-assets: + 2022: 7,453 million + 2021: 7,659 million + + curr-liabs: + 2022: 5,175 million + 2021: 4,806 million + + + CVSHEALTH_2018_10K: + BS: + fixed-assets: + 2018: 11,349 million # unreliable: often failing to be retrieved at all + 2017: 10,292 million # unreliable: often failing to be retrieved at all + + P&L: + rev: + 2018: 194,579 million # unreliable: often mistaken for Pharmacy Services 2018 revenue $134,128m or Retail/LTC 2018 revenue $83,989m + 2017: 184,786 million # unreliable: often mistaken for Pharmacy Services 2017 revenue $130,601m + 2016: 177,546 million + + + CVSHEALTH_2022_10K: + BS: + fixed-assets: + 2022: 12,873 million # unreliable + 2021: 12,896 million + + total-assets: + 2022: 228,275 million + 2021: 232,999 million + + CF: + capex: + 2022: 2,727 million or 2.7 billion + 2021: 2,520 million or 2.5 billion + 2020: 2,437 million or 2.4 billion + + P&L: + rev: + 2022: 322,467 million + 2021: 292,111 million + 2020: 268,706 million + + net: + 2022: 4,149 million + 2021: 7,910 million # unreliable + 2020: 7,179 million # unreliable + + + GENERALMILLS_2019_10K: + BS: + recvables: + 2019: 1,679.7 million + 2018: 1,684.2 million # unreliable + + invent: + 2019: 1,559.3 million + 2018: 1,642.2 million # unreliable + + payables: + 2019: 2,854.1 million + 2018: 2,746.2 million # unreliable + + P&L: + rev: + 2019: 16,865.2 million + 2018: 15,740.4 million + 2017: 15,619.8 million + + cogs: + 2019: 11,108.4 million + 2018: 10,304.8 million + 2017: 10,052.0 million + + + GENERALMILLS_2020_10K: + BS: + curr-assets: + 2020: 5,121.3 million + 2019: 4,186.5 million + + curr-liabs: + 2020: 7,491.5 million + 2019: 7,087.1 million + + CF: + op-cf: + 2020: 3,676.2 million + 2019: 2,807.0 million + 2018: 2,841.0 million + + capex: + 2020: 460.8 million + 2019: 537.6 million + 2018: 622.7 million + + + GENERALMILLS_2022_10K: + CF: + div: + 2022: 1,244.5 million + 2021: 1,246.4 million + 2020: 1,195.8 million + + P&L: + net: + 2022: 2,707.3 million # unreliable + 2021: 2,339.8 million # unreliable + 2020: 2,181.2 million # unreliable + + + JOHNSON_JOHNSON_2022_10K: + BS: + invent: + 2022: 12,483 million + 2021: 10,387 million + + P&L: + cogs: + 2022: 31,089 million + 2021: 29,855 million + 2020: 28,427 million + + + KRAFTHEINZ_2019_10K: + BS: + invent: + 2019: 2,721 million + 2018: 2,667 million + + P&L: + cogs: + 2019: 16,830 million + 2018: 17,347 million # unreliable + 2017: 17,043 million + + + LOCKHEEDMARTIN_2020_10K: + BS: + total-assets: + 2020: 50,710 million + 2019: 47,528 million + + P&L: + rev: + 2020: 65,398 million + 2019: 59,812 million # unreliable + 2018: 53,762 million + + + LOCKHEEDMARTIN_2021_10K: + BS: + curr-assets: + 2021: 19,815 million + 2020: 19,378 million + + curr-liabs: + 2021: 13,997 million + 2020: 13,933 million + + + LOCKHEEDMARTIN_2022_10K: + P&L: + rev: + 2022: 65,984 million + 2021: 67,044 million + 2020: 65,398 million + + + MGMRESORTS_2018_10K: + BS: + payables: + 2018: 302.578 million or 302.6 million or 0.3 billion + 2017: 255.028 million or 255 million or 0.26 billion or 0.3 billion + + + MGMRESORTS_2020_10K: + CF: + capex: + 2020: 270.579 million or 271 million + 2019: 739.006 million or 739 million # unreliable + 2018: 1,486.843 million or 1,487 million # unreliable + + P&L: + rev: + 2020: 5,162.082 million or 5,162 million + 2019: 12,899.672 million or 12,900 million # unreliable + 2018: 11,763.096 million or 11,763 million + + + # MGMRESORTS_2022Q4_EARNINGS: + # P&L: + # ebit: + # int: + + + MICROSOFT_2016_10K: + P&L: + cogs: + 2016: 32,780 million # unreliable + 2015: 33,038 million # unreliable + 2014: 27,078 million # unreliable + + + MICROSOFT_2023_10K: + BS: + st-debt: + 2023: 5,247 million + 2022: 2,749 million + + lt-debt: + 2023: 41,990 million + 2022: 47,032 million + + + NETFLIX_2015_10K: + CF: + d&a: + 2015: 62.283 million or 62 million # unreliable: often failing to be retrieved at all + 2014: 54.028 million or 54 million # unreliable: often failing to be retrieved at all + 2013: 48.374 million or 48 million # unreliable: often failing to be retrieved at all + + P&L: + rev: + 2015: 6,779.511 million or 6,780 million + 2014: 5,504.656 million or 5,505 million + 2013: 4,374.562 million or 4,375 million + + op: + 2015: 305.826 million or 306 million + 2014: 402.648 million or 403 million + 2013: 228.347 million or 228 million + + + NIKE_2018_10K: + P&L: + rev: + 2018: 36,397 million + 2017: 34,350 million + 2016: 32,376 million + + cogs: + 2018: 20,441 million + 2017: 19,038 million + 2016: 17,405 million + + + NIKE_2021_10K: + BS: + invent: + 2021: 6,854 million + 2020: 7,367 million + + P&L: + cogs: + 2021: 24,576 million + 2020: 21,162 million # unreliable + 2019: 21,643 million + + + PAYPAL_2022_10K: + BS: + curr-assets: + 2022: 57,517 million + 2021: 52,574 million + + curr-liabs: + 2022: 45,101 million + 2021: 43,029 million + + + PEPSICO_2021_10K: + CF: + capex: + 2021: 4,625 million + 2020: 4,240 million + 2019: 4,232 million + + + PEPSICO_2022_10K: + CF: + d&a: + 2022: 2,763 million # unreliable + 2021: 2,710 million # unreliable + 2020: 2,548 million + + capex: + 2022: 5,207 million + 2021: 4,625 million + 2020: 4,240 million + + P&L: + rev: + 2022: 86,392 million # unreliable + 2021: 79,474 million # unreliable + 2020: 70,372 million # unreliable + + op: + 2022: 11,512 million + 2021: 11,162 million + 2020: 10,080 million + + + PFIZER_2021_10K: + BS: + fixed-assets: + 2021: 14,882 million # unreliable + 2020: 13,745 million # unreliable + + + VERIZON_2022_10K: + BS: + cash-and-equiv: + 2022: 2,605 million + 2021: 2,921 million + + st-invest: + 2022: 0 (or not explicitly reported) + 2021: 0 (or not explicitly reported) + + recvables: + 2022: 24,506 million # unreliable + 2021: 23,846 million # unreliable + + invent: + 2022: 2,388 million + 2021: 3,055 million + + curr-assets: + 2022: 37,857 million + 2021: 36,728 million + + fixed-assets: + 2022: 107,434 million + 2021: 99,696 million + + total-assets: + 2022: 379,680 million + 2021: 366,596 million + + curr-liabs: + 2022: 50,171 million + 2021: 47,160 million + + CF: + capex: + 2022: 23,087 million # unreliable + 2021: 20,286 million # unreliable + 2020: 18,192 million # unreliable + + P&L: + rev: + 2022: 136,835 million + 2021: 133,613 million + 2020: 128,292 million + + net: + 2022: 21,256 million # unreliable + 2021: 22,065 million + 2020: 17,801 million + + + WALMART_2018_10K: + BS: + invent: + 2018: 43,783 million + 2017: 43,046 million + + payables: + 2018: 46,092 million + 2017: 41,433 million + + P&L: + cogs: + 2018: 373,396 million # unreliable + 2017: 361,256 million # unreliable + 2016: 360,984 million # unreliable + + + WALMART_2019_10K: + P&L: + rev: + 2019: 514,405 million # unreliable + 2018: 500,343 million # unreliable + 2017: 485,873 million + + op: + 2019: 21,957 million + 2018: 20,437 million + 2017: 22,764 million # unreliable + + + WALMART_2020_10K: + CF: + d&a: + 2020: 10,987 million + 2019: 10,678 million + 2018: 10,529 million + + P&L: + rev: + 2020: 523,964 million # unreliable + 2019: 514,405 million # unreliable + 2018: 500,343 million + + op: + 2020: 20,568 million + 2019: 21,957 million + 2018: 20,437 million diff --git a/examples/FinanceBench-Lite/util.py b/examples/FinanceBench-Lite/util.py new file mode 100644 index 000000000..3025beadb --- /dev/null +++ b/examples/FinanceBench-Lite/util.py @@ -0,0 +1,77 @@ +from __future__ import annotations + +from collections.abc import Callable +from dataclasses import dataclass +from functools import wraps +from typing import TYPE_CHECKING + +from loguru import logger +from tqdm import tqdm + +from data_and_knowledge import FbId, Answer, FB_IDS, DOC_NAMES_BY_FB_ID, QS_BY_FB_ID, OUTPUT_FILE_PATH, get_or_create_output_df # noqa: E501 +from eval import eval_correctness, eval_all +from log import switch_log_file + +if TYPE_CHECKING: + from pandas import DataFrame + + +type QAFunc = Callable[[FbId], Answer] + + +@dataclass +class enable_batch_qa_and_eval: # noqa: N801 + output_name: str + + def __call__(self, qa_func: QAFunc) -> QAFunc: + @wraps(wrapped=qa_func) + def decorated_qa_func(fb_id: FbId) -> Answer | None: + if 'all' in fb_id.lower(): + for _fb_id in tqdm(FB_IDS): + # run inferencing and preliminarily evaluate + eval_correctness(fb_id=_fb_id, answer=qa_func(_fb_id), output_name=self.output_name, human=False) + + # rigorously evaluate again, including human evaluation for difficult cases + eval_all(output_name=self.output_name, refresh=True) + return None + + if 'from:' in fb_id.lower(): + for _fb_id in tqdm(FB_IDS[FB_IDS.index(fb_id[5:]):]): + # run inferencing and preliminarily evaluate + eval_correctness(fb_id=_fb_id, answer=qa_func(_fb_id), output_name=self.output_name, human=False) + + # rigorously evaluate again, including human evaluation for difficult cases + eval_all(output_name=self.output_name, refresh=True) + return None + + # run inferencing and evaluate + eval_correctness(fb_id=fb_id, answer=(answer := qa_func(fb_id)), output_name=self.output_name, human=True) + return answer + + return decorated_qa_func + + +@dataclass +class log_qa_and_update_output_file: # noqa: N801 + output_name: str + + def __call__(self, qa_func: QAFunc) -> QAFunc: + @wraps(wrapped=qa_func) + def decorated_qa_func(fb_id: FbId) -> Answer: + switch_log_file(fb_id=fb_id, output_name=self.output_name) + + logger.info((question := f'\n{fb_id}\n{DOC_NAMES_BY_FB_ID[fb_id]}:\n{QS_BY_FB_ID[fb_id]}\n') + + '\n... solving process starting ...\n', + depth=1) + + logger.info(question + (f'\n{self.output_name.upper()}:\n' + f'{(answer := qa_func(fb_id)).replace('{', '{{').replace('}', '}}')}\n'), + depth=1) + + output_df: DataFrame = get_or_create_output_df() + output_df.loc[fb_id, self.output_name]: str = answer + output_df.to_csv(OUTPUT_FILE_PATH, index=True) + + return answer + + return decorated_qa_func diff --git a/examples/FinanceBench/Makefile b/examples/FinanceBench/Makefile index c5d909647..da1cdec61 100644 --- a/examples/FinanceBench/Makefile +++ b/examples/FinanceBench/Makefile @@ -10,27 +10,27 @@ dana-solve-w-prog-store: dana-solve-w-knowledge-and-prog-store: @poetry run python dana.py ${id} --knowledge --prog-store -dana-solve-w-llama3: - @poetry run python dana.py ${id} --llama3 +dana-solve-w-llama: + @poetry run python dana.py ${id} --llama -dana-solve-w-knowledge-w-llama3: - @poetry run python dana.py ${id} --knowledge --llama3 +dana-solve-w-knowledge-w-llama: + @poetry run python dana.py ${id} --knowledge --llama -dana-solve-w-prog-store-w-llama3: - @poetry run python dana.py ${id} --prog-store --llama3 +dana-solve-w-prog-store-w-llama: + @poetry run python dana.py ${id} --prog-store --llama -dana-solve-w-knowledge-and-prog-store-w-llama3: - @poetry run python dana.py ${id} --knowledge --prog-store --llama3 +dana-solve-w-knowledge-and-prog-store-w-llama: + @poetry run python dana.py ${id} --knowledge --prog-store --llama dana-solve-all-combos: @poetry run python dana.py ${id} @poetry run python dana.py ${id} --knowledge @poetry run python dana.py ${id} --prog-store @poetry run python dana.py ${id} --knowledge --prog-store - @poetry run python dana.py ${id} --llama3 - @poetry run python dana.py ${id} --knowledge --llama3 - @poetry run python dana.py ${id} --prog-store --llama3 - @poetry run python dana.py ${id} --knowledge --prog-store --llama3 + @poetry run python dana.py ${id} --llama + @poetry run python dana.py ${id} --knowledge --llama + @poetry run python dana.py ${id} --prog-store --llama + @poetry run python dana.py ${id} --knowledge --prog-store --llama langchain-react-solve: diff --git a/examples/FinanceBench/dana.py b/examples/FinanceBench/dana.py index 92ec4ee61..2a6a4cb05 100644 --- a/examples/FinanceBench/dana.py +++ b/examples/FinanceBench/dana.py @@ -12,13 +12,13 @@ @cache -def get_main_lm(use_llama3: bool = False): - return (HuggingFaceLM if use_llama3 else OpenAILM).from_defaults() +def get_main_lm(use_llama: bool = False): + return (HuggingFaceLM if use_llama else OpenAILM).from_defaults() @cache -def get_or_create_expert_program_store(use_llama3: bool = False) -> ProgramStore: - program_store = ProgramStore(lm=get_main_lm(use_llama3=use_llama3)) +def get_or_create_expert_program_store(use_llama: bool = False) -> ProgramStore: + program_store = ProgramStore(lm=get_main_lm(use_llama=use_llama)) for program_name, htp_dict in EXPERT_PROGRAMS.items(): htp = HTP.from_dict(htp_dict) @@ -30,16 +30,16 @@ def get_or_create_expert_program_store(use_llama3: bool = False) -> ProgramStore @cache def get_or_create_agent(doc_name: DocName, expert_knowledge: bool = False, expert_programs: bool = False, max_depth=3, max_subtasks_per_decomp=6, - use_llama3: bool = False, + use_llama: bool = False, llama_index_openai_lm_name: str = LMConfig.OPENAI_DEFAULT_MODEL) -> DANA: # pylint: disable=too-many-arguments return DANA(knowledge={EXPERT_KNOWLEDGE} if expert_knowledge else None, - program_store=(get_or_create_expert_program_store(use_llama3=use_llama3) + program_store=(get_or_create_expert_program_store(use_llama=use_llama) if expert_programs else ProgramStore()), - programmer=HTPlanner(lm=get_main_lm(use_llama3=use_llama3), + programmer=HTPlanner(lm=get_main_lm(use_llama=use_llama), max_depth=max_depth, max_subtasks_per_decomp=max_subtasks_per_decomp), resources={FileResource(path=Doc(name=doc_name).dir_path, @@ -83,34 +83,34 @@ def solve_with_knowledge_and_program_store(fb_id: FbId) -> Answer: adaptations_from_known_programs=get_or_create_adaptations(doc_name=DOC_NAMES_BY_FB_ID[fb_id])) -@enable_batch_qa_and_eval(output_name='DANA-wLlama3') -@log_qa_and_update_output_file(output_name='DANA-wLlama3') -def solve_with_llama3(fb_id: FbId) -> Answer: - return get_or_create_agent(doc_name=DOC_NAMES_BY_FB_ID[fb_id], use_llama3=True).solve( +@enable_batch_qa_and_eval(output_name='DANA-wLlama') +@log_qa_and_update_output_file(output_name='DANA-wLlama') +def solve_with_llama(fb_id: FbId) -> Answer: + return get_or_create_agent(doc_name=DOC_NAMES_BY_FB_ID[fb_id], use_llama=True).solve( problem=QS_BY_FB_ID[fb_id], adaptations_from_known_programs=get_or_create_adaptations(doc_name=DOC_NAMES_BY_FB_ID[fb_id])) -@enable_batch_qa_and_eval(output_name='DANA-wKnowledge-wLlama3') -@log_qa_and_update_output_file(output_name='DANA-wKnowledge-wLlama3') -def solve_with_knowledge_with_llama3(fb_id: FbId) -> Answer: - return get_or_create_agent(doc_name=DOC_NAMES_BY_FB_ID[fb_id], expert_knowledge=True, use_llama3=True).solve( +@enable_batch_qa_and_eval(output_name='DANA-wKnowledge-wLlama') +@log_qa_and_update_output_file(output_name='DANA-wKnowledge-wLlama') +def solve_with_knowledge_with_llama(fb_id: FbId) -> Answer: + return get_or_create_agent(doc_name=DOC_NAMES_BY_FB_ID[fb_id], expert_knowledge=True, use_llama=True).solve( problem=QS_BY_FB_ID[fb_id], adaptations_from_known_programs=get_or_create_adaptations(doc_name=DOC_NAMES_BY_FB_ID[fb_id])) -@enable_batch_qa_and_eval(output_name='DANA-wProgStore-wLlama3') -@log_qa_and_update_output_file(output_name='DANA-wProgStore-wLlama3') -def solve_with_program_store_with_llama3(fb_id: FbId) -> Answer: - return get_or_create_agent(doc_name=DOC_NAMES_BY_FB_ID[fb_id], expert_programs=True, use_llama3=True).solve( +@enable_batch_qa_and_eval(output_name='DANA-wProgStore-wLlama') +@log_qa_and_update_output_file(output_name='DANA-wProgStore-wLlama') +def solve_with_program_store_with_llama(fb_id: FbId) -> Answer: + return get_or_create_agent(doc_name=DOC_NAMES_BY_FB_ID[fb_id], expert_programs=True, use_llama=True).solve( problem=QS_BY_FB_ID[fb_id], adaptations_from_known_programs=get_or_create_adaptations(doc_name=DOC_NAMES_BY_FB_ID[fb_id])) -@enable_batch_qa_and_eval(output_name='DANA-wKnowledge-wProgStore-wLlama3') -@log_qa_and_update_output_file(output_name='DANA-wKnowledge-wProgStore-wLlama3') -def solve_with_knowledge_and_program_store_with_llama3(fb_id: FbId) -> Answer: - return get_or_create_agent(DOC_NAMES_BY_FB_ID[fb_id], expert_knowledge=True, expert_programs=True, use_llama3=True).solve( # noqa: E501 +@enable_batch_qa_and_eval(output_name='DANA-wKnowledge-wProgStore-wLlama') +@log_qa_and_update_output_file(output_name='DANA-wKnowledge-wProgStore-wLlama') +def solve_with_knowledge_and_program_store_with_llama(fb_id: FbId) -> Answer: + return get_or_create_agent(DOC_NAMES_BY_FB_ID[fb_id], expert_knowledge=True, expert_programs=True, use_llama=True).solve( # noqa: E501 problem=QS_BY_FB_ID[fb_id], adaptations_from_known_programs=get_or_create_adaptations(doc_name=DOC_NAMES_BY_FB_ID[fb_id])) @@ -121,10 +121,10 @@ def solve_with_knowledge_and_program_store_with_llama3(fb_id: FbId) -> Answer: arg_parser.add_argument('--from-id', action='store_true') arg_parser.add_argument('--knowledge', action='store_true') arg_parser.add_argument('--prog-store', action='store_true') - arg_parser.add_argument('--llama3', action='store_true') + arg_parser.add_argument('--llama', action='store_true') args = arg_parser.parse_args() - match (args.knowledge, args.prog_store, args.llama3): + match (args.knowledge, args.prog_store, args.llama): case (False, False, False): solve_func: QAFunc = solve @@ -138,16 +138,16 @@ def solve_with_knowledge_and_program_store_with_llama3(fb_id: FbId) -> Answer: solve_func: QAFunc = solve_with_knowledge_and_program_store case (False, False, True): - solve_func: QAFunc = solve_with_llama3 + solve_func: QAFunc = solve_with_llama case (True, False, True): - solve_func: QAFunc = solve_with_knowledge_with_llama3 + solve_func: QAFunc = solve_with_knowledge_with_llama case (False, True, True): - solve_func: QAFunc = solve_with_program_store_with_llama3 + solve_func: QAFunc = solve_with_program_store_with_llama case (True, True, True): - solve_func: QAFunc = solve_with_knowledge_and_program_store_with_llama3 + solve_func: QAFunc = solve_with_knowledge_and_program_store_with_llama if not (fb_id := args.fb_id).startswith(FB_ID_COL_NAME): fb_id: FbId = f'{FB_ID_COL_NAME}_{fb_id}' diff --git a/examples/FinanceBench/data_and_knowledge.py b/examples/FinanceBench/data_and_knowledge.py index 68a75b6b4..1c06305cd 100644 --- a/examples/FinanceBench/data_and_knowledge.py +++ b/examples/FinanceBench/data_and_knowledge.py @@ -160,9 +160,9 @@ class Category(StrEnum): QS_BY_FB_ID: dict[FbId, Question] = META_DF.question.to_dict() -LOCAL_CACHE_DIR_PATH: Path = Path(__file__).parent / '.data' -LOCAL_CACHE_DOCS_DIR_PATH: Path = LOCAL_CACHE_DIR_PATH / 'docs' -OUTPUT_FILE_PATH: Path = LOCAL_CACHE_DIR_PATH / 'output.csv' +DATA_LOCAL_DIR_PATH: Path = Path(__file__).parent / '.data' +DOCS_DATA_LOCAL_DIR_PATH: Path = DATA_LOCAL_DIR_PATH / 'docs' +OUTPUT_FILE_PATH: Path = DATA_LOCAL_DIR_PATH / 'output.csv' GROUND_TRUTHS_FILE_PATH = Path(__file__).parent / 'ground-truths.yml' @@ -179,7 +179,9 @@ class Category(StrEnum): CAT_DISTRIB: Counter[Category] = Counter(ground_truth['category'] for ground_truth in GROUND_TRUTHS.values()) -EXPERT_KNOWLEDGE_FILE_PATH: Path = Path(__file__).parent / 'expert-knowledge.txt' +EXPERTISE_DIR_PATH: Path = Path(__file__).parent / 'expertise' + +EXPERT_KNOWLEDGE_FILE_PATH: Path = EXPERTISE_DIR_PATH / 'expert-knowledge.txt' with open(file=EXPERT_KNOWLEDGE_FILE_PATH, buffering=-1, encoding='utf-8', @@ -189,8 +191,7 @@ class Category(StrEnum): opener=None) as f: EXPERT_KNOWLEDGE: str = f.read() - -EXPERT_PROGRAMS_FILE_PATH: Path = Path(__file__).parent / 'expert-programs.yml' +EXPERT_PROGRAMS_FILE_PATH: Path = EXPERTISE_DIR_PATH / 'expert-programs.yml' with open(file=EXPERT_PROGRAMS_FILE_PATH, buffering=-1, encoding='utf-8', @@ -251,7 +252,7 @@ def request(self) -> requests.Response: @cached_property def dir_path(self) -> Path: - dir_path: Path = LOCAL_CACHE_DOCS_DIR_PATH / self.name + dir_path: Path = DOCS_DATA_LOCAL_DIR_PATH / self.name if not (file_path := dir_path / f'{self.name}.pdf').is_file(): dir_path.mkdir(parents=True, exist_ok=True) diff --git a/examples/FinanceBench/eval.py b/examples/FinanceBench/eval.py index 77f491f4f..ec34f1692 100644 --- a/examples/FinanceBench/eval.py +++ b/examples/FinanceBench/eval.py @@ -17,11 +17,11 @@ # pylint: disable=wrong-import-order from data_and_knowledge import (FbId, Question, Answer, Category, GroundTruth, FB_ID_COL_NAME, GROUND_TRUTHS, N_CASES, CAT_DISTRIB, - LOCAL_CACHE_DIR_PATH, OUTPUT_FILE_PATH, get_or_create_output_df) + DATA_LOCAL_DIR_PATH, OUTPUT_FILE_PATH, get_or_create_output_df) from log import switch_log_file if TYPE_CHECKING: - from openssa.core.util.lm.abstract import AbstractLM + from openssa.core.util.lm.base import BaseLM EVAL_PROMPT_TEMPLATE: str = \ @@ -66,7 +66,7 @@ @cache -def get_lm(model='gpt-4o') -> AbstractLM: +def get_lm(model='gpt-4o') -> BaseLM: return OpenAILM(model=model, api_key=LMConfig.OPENAI_API_KEY, api_base=LMConfig.OPENAI_API_URL) @@ -83,7 +83,7 @@ def eval_correctness(fb_id: FbId, answer: Answer, output_name: str | None = None rubric: str = ground_truth['correctness'] prompt: str = EVAL_PROMPT_TEMPLATE.format(question=question, answer=answer, rubric=rubric) - lm: AbstractLM = get_lm() + lm: BaseLM = get_lm() for _ in range(n_times): score: str = '' @@ -200,7 +200,7 @@ def eval_accuracy_and_consistency_wrt_ground_truths(output_name: str, output_fil n_yes_scores_by_fb_id: defaultdict = defaultdict(int) incorrect_answer_fb_ids: dict[FbId, str] = {} - for output_df in (read_csv(LOCAL_CACHE_DIR_PATH / output_file_name, index_col=FB_ID_COL_NAME) + for output_df in (read_csv(DATA_LOCAL_DIR_PATH / output_file_name, index_col=FB_ID_COL_NAME) for output_file_name in output_file_names): for fb_id, correctness in output_df[correctness_col_name].items(): diff --git a/examples/FinanceBench/expert-knowledge.txt b/examples/FinanceBench/expertise/expert-knowledge.txt similarity index 100% rename from examples/FinanceBench/expert-knowledge.txt rename to examples/FinanceBench/expertise/expert-knowledge.txt diff --git a/examples/FinanceBench/expert-programs.yml b/examples/FinanceBench/expertise/expert-programs.yml similarity index 100% rename from examples/FinanceBench/expert-programs.yml rename to examples/FinanceBench/expertise/expert-programs.yml diff --git a/examples/FinanceBench/export-multi-runs.py b/examples/FinanceBench/export-multi-runs.py index d48aa7a1b..932581045 100644 --- a/examples/FinanceBench/export-multi-runs.py +++ b/examples/FinanceBench/export-multi-runs.py @@ -2,7 +2,7 @@ from pandas import DataFrame, read_csv -from data_and_knowledge import FB_ID_COL_NAME, LOCAL_CACHE_DIR_PATH +from data_and_knowledge import FB_ID_COL_NAME, DATA_LOCAL_DIR_PATH EXPORT_FILE_NAME: str = 'export-multi-runs.csv' @@ -14,7 +14,7 @@ args = arg_parser.parse_args() -for i, df in enumerate(read_csv(LOCAL_CACHE_DIR_PATH / output_file_name, index_col=FB_ID_COL_NAME) +for i, df in enumerate(read_csv(DATA_LOCAL_DIR_PATH / output_file_name, index_col=FB_ID_COL_NAME) for output_file_name in args.output_file_names): if not i: export_df: DataFrame = df[['question']] @@ -22,4 +22,4 @@ export_df.loc[:, f'answer {i + 1}'] = df[args.output_name] # pylint: disable=possibly-used-before-assignment -export_df.to_csv(LOCAL_CACHE_DIR_PATH / EXPORT_FILE_NAME, index=True) +export_df.to_csv(DATA_LOCAL_DIR_PATH / EXPORT_FILE_NAME, index=True) diff --git a/examples/FinanceBench/make.bat b/examples/FinanceBench/make.bat index d086751c5..1e66dec83 100644 --- a/examples/FinanceBench/make.bat +++ b/examples/FinanceBench/make.bat @@ -9,10 +9,10 @@ IF "%TARGET%"=="dana-solve" GOTO dana-solve IF "%TARGET%"=="dana-solve-w-prog-store" GOTO dana-solve-w-prog-store IF "%TARGET%"=="dana-solve-w-knowledge" GOTO dana-solve-w-knowledge IF "%TARGET%"=="dana-solve-w-knowledge-and-prog-store" GOTO dana-solve-w-knowledge-and-prog-store -IF "%TARGET%"=="dana-solve-w-llama3" GOTO dana-solve-w-llama3 -IF "%TARGET%"=="dana-solve-w-prog-store-w-llama3" GOTO dana-solve-w-prog-store-w-llama3 -IF "%TARGET%"=="dana-solve-w-knowledge-w-llama3" GOTO dana-solve-w-knowledge-w-llama3 -IF "%TARGET%"=="dana-solve-w-knowledge-and-prog-store-w-llama3" GOTO dana-solve-w-knowledge-and-prog-store-w-llama3 +IF "%TARGET%"=="dana-solve-w-llama" GOTO dana-solve-w-llama +IF "%TARGET%"=="dana-solve-w-prog-store-w-llama" GOTO dana-solve-w-prog-store-w-llama +IF "%TARGET%"=="dana-solve-w-knowledge-w-llama" GOTO dana-solve-w-knowledge-w-llama +IF "%TARGET%"=="dana-solve-w-knowledge-and-prog-store-w-llama" GOTO dana-solve-w-knowledge-and-prog-store-w-llama IF "%TARGET%"=="dana-solve-all-combos" GOTO dana-solve-all-combos IF "%TARGET%"=="langchain-react-solve" GOTO langchain-react-solve @@ -47,20 +47,20 @@ IF "%TARGET%"=="streamlit-run" GOTO streamlit-run poetry run python dana.py %2 --knowledge --prog-store GOTO end -:dana-solve-w-llama3 - poetry run python dana.py %2 --llama3 +:dana-solve-w-llama + poetry run python dana.py %2 --llama GOTO end -:dana-solve-w-knowledge-w-llama3 - poetry run python dana.py %2 --knowledge --llama3 +:dana-solve-w-knowledge-w-llama + poetry run python dana.py %2 --knowledge --llama GOTO end -:dana-solve-w-prog-store-w-llama3 - poetry run python dana.py %2 --prog-store --llama3 +:dana-solve-w-prog-store-w-llama + poetry run python dana.py %2 --prog-store --llama GOTO end -:dana-solve-w-knowledge-and-prog-store-w-llama3 - poetry run python dana.py %2 --knowledge --prog-store --llama3 +:dana-solve-w-knowledge-and-prog-store-w-llama + poetry run python dana.py %2 --knowledge --prog-store --llama GOTO end :dana-solve-all-combos @@ -68,10 +68,10 @@ IF "%TARGET%"=="streamlit-run" GOTO streamlit-run poetry run python dana.py %2 --knowledge poetry run python dana.py %2 --prog-space poetry run python dana.py %2 --knowledge --prog-space - poetry run python dana.py %2 --llama3 - poetry run python dana.py %2 --knowledge --llama3 - poetry run python dana.py %2 --prog-space --llama3 - poetry run python dana.py %2 --knowledge --prog-space --llama3 + poetry run python dana.py %2 --llama + poetry run python dana.py %2 --knowledge --llama + poetry run python dana.py %2 --prog-space --llama + poetry run python dana.py %2 --knowledge --prog-space --llama GOTO end diff --git a/examples/FinanceBench/visualization.py b/examples/FinanceBench/visualization.py new file mode 100644 index 000000000..ff65e680a --- /dev/null +++ b/examples/FinanceBench/visualization.py @@ -0,0 +1,101 @@ +import numpy as np +import matplotlib.pyplot as plt + + +# Define the categories +categories = ['0-RETRIEVE', '1-COMPARE', '2-CALC-CHANGE', + '3-CALC-COMPLEX', '4-CALC-AND-JUDGE', '5-EXPLAIN-FACTORS', '6-OTHER-ADVANCED'] + + +# Create angles for the plot +N = len(categories) +angles = [n / float(N) * 2 * np.pi for n in range(N)] +# Calculate radii for each difficulty level with increased dynamic range +max_radius = 10 +radii = [max_radius * (1 + i * 0.8) for i in range(N)] +# Define percentage zones and colors for background +percentages = [0.25, 0.5, 0.75, 1.0] +colors = ['#FFF3E0', '#FFE0B2', '#FFCC80', '#FFB74D'] + + +# Accuracy Data +accuracy_llamaindex_rag = [71, 83, 78, 30, 14, 70, 43] +accuracy_langchain_react = [85, 90, 69, 88, 60, 70, 37] +accuracy_openai_assistant = [49, 46, 36, 40, 14, 50, 46] +accuracy_openssa_dana = [95, 90, 93, 100, 94, 100, 89] + +# Consistency Data +consistency_llamaindex_rag = [96, 90, 100, 87, 88, 60, 100] +consistency_langchain_react = [86, 91, 78, 84, 68, 60, 66] +consistency_openai_assistant = [76, 65, 87, 73, 72, 100, 77] +consistency_openssa_dana = [96, 97, 87, 100, 92, 100, 94] + + +# Function to plot the data +def plot_data(ax, data, color, label=None): + values = data + r = [radius * value / 100 for radius, value in zip(radii, values)] + ax.plot(angles + [angles[0]], r + [r[0]], 'o-', linewidth=2, label=label, color=color) + ax.fill(angles + [angles[0]], r + [r[0]], color=color, alpha=0.25) + + +# Create the figure and two subplots +fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(18, 10), subplot_kw={'projection': 'polar'}) + + +# Function to set up the polar plot (background, grid, labels) +def setup_polar_plot(ax, title): + # Remove grid and spines + ax.grid(False) + ax.spines['polar'].set_visible(False) + # Plot radial lines (terminating at 100%) + for angle, radius in zip(angles, radii): + ax.plot([angle, angle], [0, radius], color='gray', linestyle='-', linewidth=0.5, alpha=0.5) + # Plot percentage lines and fill background + for i, percentage in enumerate(percentages): + r = [radius * percentage for radius in radii] + theta = np.linspace(0, angles[-1], 1000) + spiral_r = np.interp(theta, angles, r) + ax.plot(theta, spiral_r, color='gray', linestyle='--', linewidth=0.5, alpha=0.7) + if i > 0: + ax.fill(angles + [angles[0]], r + [r[0]], colors[i], alpha=0.1) + # Add full category labels without rotation + for i, category in enumerate(categories): + angle = angles[i] + r = radii[i] * 1.15 + ha = 'left' if -np.pi / 2 <= angle < np.pi / 2 else 'right' + ax.text(angle, r, category, ha=ha, va='center', fontsize=10, fontweight='bold') + # Remove radial labels and ticks + ax.set_yticks([]) + ax.set_yticklabels([]) + ax.set_xticks([]) + ax.set_xticklabels([]) + # Set the ylim to ensure all labels are visible + ax.set_ylim(0, max(radii) * 1.3) + # Set title for the chart + ax.set_title(title, y=0.75, fontsize=14, fontweight='bold') + + +# Set up both subplots +setup_polar_plot(ax1, "AGENT ACCURACY") +setup_polar_plot(ax2, "AGENT CONSISTENCY") + +# Plot accuracy data on the first subplot with labels for the legend +plot_data(ax1, accuracy_llamaindex_rag, 'red', 'LlamaIndex RAG') +plot_data(ax1, accuracy_langchain_react, 'yellow', 'LangChain ReAct') +plot_data(ax1, accuracy_openai_assistant, 'blue', 'OpenAI Assistant') +plot_data(ax1, accuracy_openssa_dana, 'green', 'OpenSSA DANA-NK-NP') + +# Plot consistency data on the second subplot without labels to avoid duplicate legend +plot_data(ax2, consistency_llamaindex_rag, 'red') +plot_data(ax2, consistency_langchain_react, 'yellow') +plot_data(ax2, consistency_openai_assistant, 'blue') +plot_data(ax2, consistency_openssa_dana, 'green') + +# Adjust space between subplots +plt.subplots_adjust(wspace=-0.4) + +# Add a single legend closer to the plots +fig.legend(loc='lower center', bbox_to_anchor=(0.5, 0), fontsize=12, ncol=4) +plt.tight_layout() +plt.savefig('agent_comparison.pdf', bbox_inches='tight') diff --git a/examples/Planning-and-Reasoning.ipynb b/examples/Planning-and-Reasoning.ipynb deleted file mode 100644 index f85d915e9..000000000 --- a/examples/Planning-and-Reasoning.ipynb +++ /dev/null @@ -1,257 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Problem-Solving Agent with Planning, Reasoning & Domain Knowledge: illustrative example using `FinanceBench` financial-analysis dataset\n", - "\n", - "This notebook illustrates the use of `OpenSSA`'s `Agent` and its planning, reasoning & domain knowledge integration capabilities to solve a problem in the financial-analysis domain." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Setups" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from pprint import pprint\n", - "from IPython.display import display, Markdown" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import sys\n", - "\n", - "if cwd_is_root := ('examples' in os.listdir()):\n", - " sys.path.append('examples')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from pathlib import Path\n", - "from dotenv import load_dotenv\n", - "\n", - "load_dotenv(dotenv_path=Path('examples' if cwd_is_root else '.') / '.env')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Imports of Agent, Planning, Reasoning & Resource classes from `OpenSSA`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from openssa import (Agent,\n", - " HTP, AutoHTPlanner,\n", - " OodaReasoner,\n", - " FileResource)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Problem to Solve and Knowledge & Resource available for use" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# problem to solve\n", - "PROBLEM = 'Does AMD have a healthy liquidity profile based on FY22 Quick Ratio?'" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# available domain knowledge (stored as string)\n", - "from FinanceBench.data_and_knowledge import EXPERT_KNOWLEDGE as FINANCIAL_KNOWLEDGE" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# available informational resource: AMD's 2022 10K filing\n", - "\n", - "from FinanceBench.data_and_knowledge import Doc as FinancialDoc\n", - "\n", - "AMD_2022_10K = FileResource(path=FinancialDoc('AMD_2022_10K').dir_path)\n", - "\n", - "display(Markdown(AMD_2022_10K.overview))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Problem-Solving by Agent with Hierarchical Task Planning (HTP) & OODA Reasoning (OODAR)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "agent = Agent(planner=AutoHTPlanner(max_depth=2, max_subtasks_per_decomp=3),\n", - " reasoner=OodaReasoner(),\n", - " resources={AMD_2022_10K})" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Problem-Solving with Automated Dynamic Planning (default)\n", - "\n", - "Without additional domain knowledge and expert inputs, the `agent` can attempt to solve the stated problem by using its Planner to decompose the problem into a 1-level-deep sub-task plan and execute that plan using its OODA Reasoner.\n", - "\n", - "At any point during the OODA reasoning execution, if a confident answer cannot be established for the concerned sub-task, the `agent` would use the Planner again to decompose that sub-task 1 level further. This recursive decomposition can be done up to the `agent`'s maximum allowed planning depth.\n", - "\n", - "This default solving mechanism provides a baseline that is often acceptable for domains that are popularly known/understood." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "solution_from_auto_plan_dynamically_executed = agent.solve(PROBLEM)\n", - "\n", - "display(Markdown(solution_from_auto_plan_dynamically_executed))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Problem-Solving with Expert-Guided Planning\n", - "\n", - "One way to make the solution highly accurate and reliable is to provide the `agent` with plan from a knowledgeable expert:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "expert_plan = HTP.from_dict(\n", - " {\n", - " 'task': PROBLEM,\n", - " 'sub-plans': [\n", - " {\n", - " 'task': 'calculate Quick Ratio conservatively as (`Cash & Cash Equivalents` + `Accounts Receivable`) / Current Liabilities',\n", - " 'sub-plans': [\n", - " {\n", - " 'task': 'retrieve `Cash & Cash Equivalents`, `Accounts Receivable` & `Current Liabilities` from Balance Sheet'\n", - " },\n", - " ]\n", - " },\n", - " {\n", - " 'task': 'see whether Quick Ratio is healthy, i.e. greater than 1'\n", - " },\n", - " ]\n", - " }\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "expert_guided_solution = agent.solve(PROBLEM, plan=expert_plan)\n", - "\n", - "display(Markdown(expert_guided_solution))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Problem-Solving with Domain Knowledge Injection\n", - "\n", - "If expert-guided solution plans are not readily available in your use case, another and sometimes lighter-weight way to achieve consistently good problem-solving outcomes is to give the `agent` access to domain-specific knowledge, so that such knowledge can be used for constructing effective solution plans for problems in the concerned domain, and for reasoning accurately during the execution process:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "agent_with_knowledge = Agent(planner=AutoHTPlanner(max_depth=2, max_subtasks_per_decomp=3),\n", - " reasoner=OodaReasoner(),\n", - " knowledge={FINANCIAL_KNOWLEDGE},\n", - " resources={AMD_2022_10K})" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "solution_from_auto_plan_dynamically_executed_with_knowledge = agent_with_knowledge.solve(PROBLEM, dynamic=False)\n", - "\n", - "display(Markdown(solution_from_auto_plan_dynamically_executed_with_knowledge))" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": ".venv", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/Tutorial.ipynb b/examples/Tutorial.ipynb deleted file mode 100644 index 04d9e4a85..000000000 --- a/examples/Tutorial.ipynb +++ /dev/null @@ -1,783 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Build an AI Agent with SEC Filing Insights in Just 10 Minutes Using OpenSSA\n", - "--------------" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### In this tutorial, you will learn how to:\n", - "\n", - "1. Build an AI Agent from scratch with Hierachichy Task Planing (HTP) using openSSA\n", - "2. Improve agent's performance by:\n", - " - Incorporating external knowledge source\n", - " - Providing customized plan from the expert\n", - " - Enabling dynamic solving capability\n", - "\n", - "### By the end of this tutorial, you will understand:\n", - "- What is HTP and how it works?\n", - "- How to customize OpenSSA components to solve your complex problem?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Setups" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's start by impporting the neccessary dependencies." - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n" - ] - } - ], - "source": [ - "%load_ext autoreload\n", - "%autoreload" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "metadata": {}, - "outputs": [], - "source": [ - "from pathlib import Path\n", - "from pprint import pprint\n", - "import os\n", - "import sys\n", - "\n", - "from IPython.display import display, Markdown\n", - "from dotenv import load_dotenv\n", - "import yaml\n", - "\n", - "from openssa import Agent, HTP, AutoHTPlanner, OodaReasoner, FileResource\n", - "from openssa.utils.llms import OpenAILLM\n", - "from openssa.l2.task import Task" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Make sure you plave your OpenAI API key in `example/.env`\n", - "\n", - "```\n", - "OPENAI_API_KEY=...\n", - "```\n", - "\n", - "[Where do I find my OpenAI API Key?](https://help.openai.com/en/articles/4936850-where-do-i-find-my-openai-api-key)" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "metadata": {}, - "outputs": [], - "source": [ - "# make sure we're in the right folder\n", - "if cwd_is_root := ('examples' in os.listdir()):\n", - " sys.path.append('examples')" - ] - }, - { - "cell_type": "code", - "execution_count": 66, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Sanity check if we have the OpenAI API setup: True\n" - ] - } - ], - "source": [ - "print('Sanity check if we have the OpenAI API setup: ', load_dotenv(dotenv_path=Path('examples' if cwd_is_root else '.') / '.env'))" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [], - "source": [ - "# util function to summarize answer\n", - "def summarize_ans(ans, max_tokens=100):\n", - " llm=OpenAILLM()\n", - " response = llm.call(\n", - " messages=[\n", - " {\"role\": \"system\", \"content\": \"You are a helpful assistant.\"},\n", - " {\"role\": \"user\", \"content\": \"Please summarize the following text into 1-2 sentences: \" + ans}\n", - " ],\n", - " max_tokens=max_tokens,\n", - " temperature=0.7\n", - " )\n", - " summary = response.choices[0].message.content\n", - " return summary" - ] - }, - { - "cell_type": "code", - "execution_count": 120, - "metadata": {}, - "outputs": [], - "source": [ - "# util function to print results\n", - "import textwrap\n", - "\n", - "def namestr(obj, namespace):\n", - " return [name for name in namespace if namespace[name] is obj]\n", - "\n", - "def print_solution(sol, present_full_answer=False):\n", - " agent_name = namestr(sol, globals())[0].upper().replace('_', ' ')\n", - " # print(agent_name)\n", - " print('PROBLEM: ')\n", - " print('='*80)\n", - " print(PROBLEM, '\\n')\n", - " if GROUND_TRUTH_ANSWER:\n", - " print('GROUND TRUTH ANSWER: ')\n", - " print('='*80)\n", - " print(GROUND_TRUTH_ANSWER, '\\n')\n", - " if present_full_answer:\n", - " print(f'{agent_name} FULL:')\n", - " print('='*80)\n", - " print(textwrap.fill(sol, 80))\n", - " else:\n", - " print(f'{agent_name} SUMMARIZED:')\n", - " print('='*80)\n", - " print(textwrap.fill(summarize_ans(sol), 80))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Data preparation" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We're going to use the FinanceBench dataset to demonstrate. FinanceBench is a dataset to benchmark question answering capability in financial domain.\n", - "\n", - "We have loaded a sample SEC filing for 3M from 2022. \n", - "https://github.com/patronus-ai/financebench/blob/main/pdfs/3M_2022_10K.pdf\n", - "\n", - "- Let's look at a sample question: \n", - "\n", - "`Is 3M a capital-intensive business based on FY2022 data`\n", - "\n", - "- The expected answer for this question is:\n", - "\n", - "`No, the company is managing its CAPEX and Fixed Assets pretty efficiently,\n", - " which is evident from below key metrics:\n", - " CAPEX/Revenue Ratio: 5.1%\n", - " Fixed assets/Total Assets: 20%\n", - " Return on Assets= 12.4%`" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [], - "source": [ - "DOC_PATH = 'sample_data/3M_2022_10K/'\n", - "PROBLEM = 'Is 3M a capital-intensive business based on FY2022 data?'\n", - "GROUND_TRUTH_ANSWER ='''\n", - " No, the company is managing its CAPEX and Fixed Assets pretty efficiently,\n", - " which is evident from below key metrics:\n", - " CAPEX/Revenue Ratio: 5.1%\n", - " Fixed assets/Total Assets: 20%\n", - " Return on Assets= 12.4%'''" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now, we'll build an agent from scracth using [OpenSSA](https://www.openssa.org/)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Build an AI Agent from Scratch Using OpenSSA\n", - "------------" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Base Agent" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's build our first agent with all default settings. \n", - "\n", - "" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To build an agent, the first and most basic resource we need is a document. We will learn how to enable hierarchical task planning (HTP) capability and how to customize it's component later. Let's first build a `Base Agent`` with only the document we've prepared in the previous block and see how well it can solve the question. " - ] - }, - { - "cell_type": "code", - "execution_count": 73, - "metadata": {}, - "outputs": [], - "source": [ - "# Build a base agent\n", - "base_agent = Agent(planner=None,\n", - " reasoner=OodaReasoner(),\n", - " knowledge=None,\n", - " resources={FileResource(path=DOC_PATH)})\n", - "\n", - "base_agent_answer = base_agent.solve(problem=PROBLEM,\n", - " plan=None,\n", - " dynamic=False)" - ] - }, - { - "cell_type": "code", - "execution_count": 121, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "PROBLEM: \n", - "================================================================================\n", - "Is 3M a capital-intensive business based on FY2022 data? \n", - "\n", - "GROUND TRUTH ANSWER: \n", - "================================================================================\n", - "\n", - " No, the company is managing its CAPEX and Fixed Assets pretty efficiently,\n", - " which is evident from below key metrics:\n", - " CAPEX/Revenue Ratio: 5.1%\n", - " Fixed assets/Total Assets: 20%\n", - " Return on Assets= 12.4% \n", - "\n", - "BASE AGENT ANSWER SUMMARIZED:\n", - "================================================================================\n", - "3M's financial statements for FY2022 show significant capital investments in\n", - "property, plant, and equipment (PP&E), with capital expenditures amounting to\n", - "$1,831 million and total assets reported at $46,455 million. The company's focus\n", - "on growth, productivity, and sustainability is reflected in its projected\n", - "capital spending of $1.5 billion to $1.8 billion for 2023, demonstrating a\n", - "commitment to supporting business activities and driving future growth through\n", - "capital investments and strategic resource management practices\n" - ] - } - ], - "source": [ - "print_solution(base_agent_answer)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this example, we can see the default answer is not that good. 3M is not a capital intensive business but the agent failed to answer the question correctly." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## How to Add External Knowledge to the Agent" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's incorporate external knowledge to the base agent. We've prepared a sample expert knowledge in `sample-data/expert-knowledge.txt` file, you can load your own knowledge by replacing the sample file with yours.\n", - "\n", - "" - ] - }, - { - "cell_type": "code", - "execution_count": 96, - "metadata": {}, - "outputs": [], - "source": [ - "with open(file='sample_data/expert-knowledge.txt',\n", - " buffering=-1,\n", - " encoding='utf-8',\n", - " errors='strict',\n", - " newline=None,\n", - " closefd=True,\n", - " opener=None) as f:\n", - " EXPERT_KNOWLEDGE: str = f.read()\n", - "\n", - "EXPERT_KNOWLEDGE_SET = set(EXPERT_KNOWLEDGE.split('\\n\\n'))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the added knowledge, we've specified \n", - "\n", - "```\n", - "Capital-Intensiveness / Return-on-Capital Metric Formulas\n", - "---------------------------------------------------------\n", - "\n", - "`Capital Intensity Ratio` = `Total Assets` / `(Total) (Net) (Operating) Revenue(s), a.k.a. (Total) (Net) Sales`\n", - "\n", - "`Return on (Total) Assets, a.k.a. RoA or RoTA` = (\n", - " `Net Income, a.k.a. Net Profit, or Net Earnings (or Loss(es)) (Attributable to Shareholders)` /\n", - " `average Total Assets, typically between two consecutive fiscal year-ends`\n", - ")\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's add the knowledge set to our base agent." - ] - }, - { - "cell_type": "code", - "execution_count": 97, - "metadata": {}, - "outputs": [], - "source": [ - "agent_with_knowledge = Agent(planner=None,\n", - " reasoner=OodaReasoner(),\n", - " knowledge=EXPERT_KNOWLEDGE_SET,\n", - " resources={FileResource(path=DOC_PATH)})\n", - "\n", - "agent_with_knowledge_solution = agent_with_knowledge.solve(problem=PROBLEM,\n", - " plan=None,\n", - " dynamic=False)" - ] - }, - { - "cell_type": "code", - "execution_count": 109, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "PROBLEM: \n", - "================================================================================\n", - "Is 3M a capital-intensive business based on FY2022 data? \n", - "\n", - "GROUND TRUTH ANSWER: \n", - "================================================================================\n", - "\n", - " No, the company is managing its CAPEX and Fixed Assets pretty efficiently,\n", - " which is evident from below key metrics:\n", - " CAPEX/Revenue Ratio: 5.1%\n", - " Fixed assets/Total Assets: 20%\n", - " Return on Assets= 12.4% \n", - "\n", - "AGENT WITH KNOWLEDGE SOLUTION SUMMARIZED:\n", - "================================================================================\n", - "Based on the substantial capital expenditures, large asset base, and planned\n", - "future investments in operational infrastructure and capacity enhancement, it is\n", - "reasonable to classify 3M as a capital-intensive business for FY2022.\n" - ] - } - ], - "source": [ - "print_solution(agent_with_knowledge_solution)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Although the final answer is still incorrect, we can see the reasoning behind is getting better when using external resource - the agent can now recognize `assets`` need to be taken into account when looking at capital intensiveness questions." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Get started with HTP by Adding Auto-Plan on top of Knowledge" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can see the agent is improved with added knowledge. Let's enhance it with OpenSSA's HTP feature: `AutoHTPlanner`.\n", - "\n", - "" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`HTP` is OpenSSA’s default problem-solving task plan structure.\n", - "\n", - "A `HTP` instance is a tree, in which each node can be decomposed into a number of supporting sub-HTPs, each targeting to solve a supporting sub-task.\n", - "\n", - "`HTP` execution involves using a specified Reasoner to work through sub-tasks from the lowest levels and roll up results up to the top level.\n", - "\n", - "There is also a horizontal results-sharing mechanism to enable the execution of a subsequent HTP node to benefit from results from earlier nodes at the same depth level." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`AutoHTPlanner` is OpenSSA’s default Planner to create and update problem-solving HTPs.\n", - "\n", - "Such a planner has an LM for generating new or updated task HTPs, the complexity of which is controlled by 2 key parameters `max_depth` and `max_subtasks_per_decomp`. \n", - "\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "auto_htp_agent_with_knowledge = Agent(planner=AutoHTPlanner(max_depth=2, max_subtasks_per_decomp=4),\n", - " reasoner=OodaReasoner(),\n", - " knowledge=EXPERT_KNOWLEDGE_SET,\n", - " resources={FileResource(path=DOC_PATH)})\n", - "\n", - "auto_htp_agent_with_knowledge_solution = auto_htp_agent_with_knowledge.solve(problem=PROBLEM,\n", - " plan=None,\n", - " dynamic=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can read the full logs of all the intermediate steps in `logs/auto_htp_agent_with_knowledge_logs.txt`" - ] - }, - { - "cell_type": "code", - "execution_count": 110, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "PROBLEM: \n", - "================================================================================\n", - "Is 3M a capital-intensive business based on FY2022 data? \n", - "\n", - "GROUND TRUTH ANSWER: \n", - "================================================================================\n", - "\n", - " No, the company is managing its CAPEX and Fixed Assets pretty efficiently,\n", - " which is evident from below key metrics:\n", - " CAPEX/Revenue Ratio: 5.1%\n", - " Fixed assets/Total Assets: 20%\n", - " Return on Assets= 12.4% \n", - "\n", - "AUTO HTP AGENT WITH KNOWLEDGE SOLUTION SUMMARIZED:\n", - "================================================================================\n", - "Based on the available FY2022 data, 3M's net property, plant, and equipment\n", - "(PP&E) constitutes 19.75% of its total assets, indicating that it may not be\n", - "highly capital-intensive relative to some industries. However, without\n", - "additional information on capital expenditures (CapEx) to sales ratio,\n", - "depreciation and amortization expenses, and return on assets (RoA), a definitive\n", - "assessment of 3M's capital intensity cannot be made.\n" - ] - } - ], - "source": [ - "print_solution(auto_htp_agent_with_knowledge_solution)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can see when breaking down the task into other sub-tasks, the agent gives more concrete reasons to answer the question: `key financial metrics such as the\n", - "proportion of net fixed assets to total assets, capital expenditure relative to\n", - "total net sales, depreciation and amortization expense as a percentage of total\n", - "net sales, and Return on Assets cannot be calculated without specific financial\n", - "data`. However, the final answer is still incorrect - the agent still fails to answer 3M is not a capital-intensive business." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Let's Upgrade the Agent to Solve the Problem Dynamically" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's enable another `HTP` component: `Dynamic` solving. When a problem is solved dynamically, it would be decomposed further if the sub-tasks are still not solvable.\n", - "\n", - "\n", - "" - ] - }, - { - "cell_type": "code", - "execution_count": 103, - "metadata": {}, - "outputs": [], - "source": [ - "dynamic_auto_htp_agent_with_knowledge = Agent(planner=AutoHTPlanner(max_depth=2, max_subtasks_per_decomp=4),\n", - " reasoner=OodaReasoner(),\n", - " knowledge=EXPERT_KNOWLEDGE_SET,\n", - " resources={FileResource(path=DOC_PATH)})\n", - "\n", - "dynamic_auto_htp_agent_with_knowledge_solution = dynamic_auto_htp_agent_with_knowledge.solve(problem=PROBLEM,\n", - " plan=None,\n", - " dynamic=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 111, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "PROBLEM: \n", - "================================================================================\n", - "Is 3M a capital-intensive business based on FY2022 data? \n", - "\n", - "GROUND TRUTH ANSWER: \n", - "================================================================================\n", - "\n", - " No, the company is managing its CAPEX and Fixed Assets pretty efficiently,\n", - " which is evident from below key metrics:\n", - " CAPEX/Revenue Ratio: 5.1%\n", - " Fixed assets/Total Assets: 20%\n", - " Return on Assets= 12.4% \n", - "\n", - "DYNAMIC AUTO HTP AGENT WITH KNOWLEDGE SOLUTION SUMMARIZED:\n", - "================================================================================\n", - "Based on the FY2022 data provided, 3M is identified as a capital-intensive\n", - "business due to its significant capital expenditures, large total asset base,\n", - "focus on environmental expenditures, and structured asset management practices.\n", - "These factors collectively indicate a substantial investment in physical assets\n", - "and operational capabilities characteristic of capital-intensive businesses.\n" - ] - } - ], - "source": [ - "print_solution(dynamic_auto_htp_agent_with_knowledge_solution)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With the added knowledge, neither solving statistically nore dynamically could help the agent to get to the final answer correctly. Let's customize the most powerful component of `HTP`: the plan." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Incorporating Expert HTP instead of Auto-HTP" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With OpenSSA, the user can customize the plan instead of depending on the auto-generated plan. Let's add an expert plan on top of our beginning Base Agent to see how it performs. \n", - "\n", - "" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We've prepared a sample expert plan, but please feel free to customize the expert plan yourself." - ] - }, - { - "cell_type": "code", - "execution_count": 112, - "metadata": {}, - "outputs": [], - "source": [ - "variables = {\n", - " 'COMPANY': '3M',\n", - " 'PERIOD': '2022'\n", - "}\n", - "\n", - "with open('sample_data/expert-plan-templates-sample.yml', 'r') as file:\n", - " EXPERT_PLAN_TEMPLATES_CONTENT = file.read()\n", - "EXPERT_PLAN_TEMPLATES_CONTENT = EXPERT_PLAN_TEMPLATES_CONTENT.format(**variables)\n", - "EXPERT_PLAN = yaml.safe_load(EXPERT_PLAN_TEMPLATES_CONTENT)\n", - "\n", - "EXPERT_HTP = HTP(task=Task.from_dict_or_str(EXPERT_PLAN['task']),\n", - " sub_plans=[HTP.from_dict(d) for d in EXPERT_PLAN.get('sub-plans', [])])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "expert_htp_agent = Agent(planner=AutoHTPlanner(max_depth=2, max_subtasks_per_decomp=4),\n", - " reasoner=OodaReasoner(),\n", - " knowledge=None,\n", - " resources={FileResource(path=DOC_PATH)})\n", - "\n", - "expert_htp_agent_solution = expert_htp_agent.solve(problem=PROBLEM,\n", - " plan=EXPERT_HTP,\n", - " dynamic=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can read the full logs of all the intermediate steps in `logs/expert_htp_agent_logs.txt`" - ] - }, - { - "cell_type": "code", - "execution_count": 114, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "PROBLEM: \n", - "================================================================================\n", - "Is 3M a capital-intensive business based on FY2022 data? \n", - "\n", - "GROUND TRUTH ANSWER: \n", - "================================================================================\n", - "\n", - " No, the company is managing its CAPEX and Fixed Assets pretty efficiently,\n", - " which is evident from below key metrics:\n", - " CAPEX/Revenue Ratio: 5.1%\n", - " Fixed assets/Total Assets: 20%\n", - " Return on Assets= 12.4% \n", - "\n", - "EXPERT HTP AGENT SOLUTION SUMMARIZED:\n", - "================================================================================\n", - "Based on the 2022 fiscal period data, although 3M has a significant investment\n", - "in Net Property, Plant & Equipment and a substantial asset base relative to its\n", - "sales, its Capital Expenditures and Return on Assets metrics do not align with\n", - "typical characteristics of a capital-intensive business. Therefore, 3M does not\n", - "fully exhibit the characteristics of a capital-intensive business according to\n", - "the provided benchmarks.\n" - ] - } - ], - "source": [ - "print_solution(expert_htp_agent_solution)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Yay! By incorporating the expert's plan, we instantly get the correct answer! " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Try It Yourself!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "So now you've learned how OpenSSA's `HTP` works. You can try different combination of knobs that you can turn, including:\n", - "- auto-plan vs expert-plan\n", - "- statistically solving vs dynamically solving\n", - "- external knowledge vs no external knowledge" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Some tips and tricsk:\n", - "- If you want the fastest way to be up and running with HTP with ok-performance: try auto-plan with added knowledge and dynamically solving.\n", - "- If you want a sufficiently good result with least customization and runtime: try adding expert-plan without anything else\n", - "_ If you want the best result: try adding expert-plan with knowledge and dynamically solving!\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": ".venv", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.2" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/financial-research/dataproc.py b/examples/financial-research/dataproc.py index 341c88912..55c69f9b1 100644 --- a/examples/financial-research/dataproc.py +++ b/examples/financial-research/dataproc.py @@ -2,11 +2,11 @@ from pathlib import Path -LOCAL_CACHE_DIR_PATH: Path = Path(__file__).parent / '.data' +DATA_LOCAL_DIR_PATH: Path = Path(__file__).parent / '.data' @cache def get_or_create_cached_dir_path(company: str) -> str: - dir_path: Path = LOCAL_CACHE_DIR_PATH / company + dir_path: Path = DATA_LOCAL_DIR_PATH / company dir_path.mkdir(parents=True, exist_ok=True) return str(dir_path) diff --git a/examples/japanese-easy-demo/main.py b/examples/japanese-easy-demo/main.py index 461cc4806..295e9674c 100644 --- a/examples/japanese-easy-demo/main.py +++ b/examples/japanese-easy-demo/main.py @@ -4,12 +4,12 @@ load_dotenv() -LOCAL_CACHE_DOCS_DIR_PATH: Path = Path(__file__).parent / '.data' +DOCS_DATA_LOCAL_DIR_PATH: Path = Path(__file__).parent / '.data' def get_or_create_agent() -> DANA: return DANA( - resources={FileResource(path=LOCAL_CACHE_DOCS_DIR_PATH)} + resources={FileResource(path=DOCS_DATA_LOCAL_DIR_PATH)} ) diff --git a/examples/llamarine/.env.template b/examples/llamarine/.env.template new file mode 100644 index 000000000..e570b8b55 --- /dev/null +++ b/examples/llamarine/.env.template @@ -0,0 +1 @@ +OPENAI_API_KEY= diff --git a/examples/llamarine/Makefile b/examples/llamarine/Makefile new file mode 100644 index 000000000..04903eaed --- /dev/null +++ b/examples/llamarine/Makefile @@ -0,0 +1,2 @@ +streamlit-run: + @poetry run streamlit run streamlit-main.py --server.allowRunOnSave=true --server.runOnSave=true diff --git a/examples/llamarine/README.md b/examples/llamarine/README.md new file mode 100644 index 000000000..810a0b36a --- /dev/null +++ b/examples/llamarine/README.md @@ -0,0 +1,7 @@ + + +# Maritime-Specific Agents leveraging Open-Source `Llamarine` LM + +## Streamlit App + +Run by `make streamlit-run` diff --git a/examples/llamarine/agent.py b/examples/llamarine/agent.py new file mode 100644 index 000000000..731090a72 --- /dev/null +++ b/examples/llamarine/agent.py @@ -0,0 +1,31 @@ +from __future__ import annotations + +from argparse import ArgumentParser +from functools import cache + +from data_and_knowledge import EXPERT_PROGRAMS, EXPERT_KNOWLEDGE +from openssa import DANA, ProgramStore, HTP, HTPlanner, OpenAILM + + +@cache +def get_or_create_agent(max_depth=2, max_subtasks_per_decomp=4) -> DANA: + lm = OpenAILM.from_defaults() + + program_store = ProgramStore(lm=lm) + if EXPERT_PROGRAMS: + for program_name, htp_dict in EXPERT_PROGRAMS.items(): + htp = HTP.from_dict(htp_dict) + program_store.add_or_update_program(name=program_name, description=htp.task.ask, program=htp) + + return DANA(program_store=program_store, + programmer=HTPlanner(lm=lm, max_depth=max_depth, max_subtasks_per_decomp=max_subtasks_per_decomp), + knowledge={EXPERT_KNOWLEDGE} if EXPERT_KNOWLEDGE else None, + resources={}) + + +if __name__ == '__main__': + arg_parser = ArgumentParser() + arg_parser.add_argument('problem') + args = arg_parser.parse_args() + + print(get_or_create_agent().solve(problem=args.problem)) diff --git a/examples/llamarine/data_and_knowledge.py b/examples/llamarine/data_and_knowledge.py new file mode 100644 index 000000000..dd7c3a9b1 --- /dev/null +++ b/examples/llamarine/data_and_knowledge.py @@ -0,0 +1,35 @@ +from __future__ import annotations + +from pathlib import Path +from typing import TYPE_CHECKING + +from dotenv import load_dotenv +import yaml + +if TYPE_CHECKING: + from openssa.core.programming.hierarchical.plan import HTPDict + + +load_dotenv() + + +EXPERT_KNOWLEDGE_PATH: Path = Path(__file__).parent / 'expert-knowledge.txt' +with open(file=EXPERT_KNOWLEDGE_PATH, + buffering=-1, + encoding='utf-8', + errors='strict', + newline=None, + closefd=True, + opener=None) as f: + EXPERT_KNOWLEDGE: str = f.read() + + +EXPERT_PROGRAMS_PATH: Path = Path(__file__).parent / 'expert-programs.yml' +with open(file=EXPERT_PROGRAMS_PATH, + buffering=-1, + encoding='utf-8', + errors='strict', + newline=None, + closefd=True, + opener=None) as f: + EXPERT_PROGRAMS: dict[str, HTPDict] = yaml.safe_load(stream=f) diff --git a/examples/llamarine/expert-knowledge.txt b/examples/llamarine/expert-knowledge.txt new file mode 100644 index 000000000..136f97868 --- /dev/null +++ b/examples/llamarine/expert-knowledge.txt @@ -0,0 +1,159 @@ +SOG based on the Earth as the reference, might lead to misleading on radar such as display head on situation on the water +as crossing situation. +STW based on water might avoid this ambiguty. + +Be careful with the risk misleading on radar such as display head on situation on the water as crossing situation. +COLREGS was designed to all vessel, even without radar. + +# **Comprehensive and Technical Rule of Thumb for OOW Decision-Making with Focus on COLREGs** + +--- + +## **1. General Watchkeeping Rules** +1. **“If you’re not looking, you’re not navigating.”** + - Constantly scan the horizon and monitor instruments; **complacency kills safety**. + - Set a **visual sweep cycle every 5-10 minutes**, especially in busy waters. + +2. **"Trust your eyes, confirm with instruments."** + - Visual observations are primary—radar and AIS are support tools. **Don’t rely on AIS alone for collision avoidance.** + +3. **“If unsure, act early and decisively.”** + - Uncertainty should trigger **immediate action**—reduce speed or change course to avoid developing a risky situation. + +--- + +## **2. Mastering COLREGs Application** +1. **“When in doubt, give way—always.”** + - If you cannot assess risk or priority clearly, **assume the give-way role** to stay safe. + +2. **“Clear and early course alterations save lives.”** + - Make **large, unambiguous changes** in course or speed—others must know your intentions clearly. + +3. **"Stand-on means stay alert.”** + - Even as the stand-on vessel, **be ready to act** if the give-way vessel fails to maneuver. Monitor closely (Rule 17). + +4. **"Always turn to starboard unless there’s a reason not to.”** + - Meeting head-on? **Starboard turn is default** (Rule 14). Avoid left-turning unless absolutely necessary. + +5. **"You’re overtaking? You must stay clear."** + - If approaching a vessel from more than 22.5° abaft the beam (Rule 13), **you are overtaking**—stay clear until the maneuver is complete. + +--- + +## **3. Risk Assessment and Avoiding Collisions** +1. **"A safe CPA is one you can live with."** + - Set a **minimum CPA threshold (usually 1 NM)** and act if any vessel breaches it. + +2. **“If the TCPA is below 12 minutes, it’s time to act.”** + - If the Time to Closest Point of Approach (TCPA) is under 12-15 minutes, **adjust course or speed early** to prevent a close-quarters situation. + +3. **"Two vessels moving = double the risk."** + - When both vessels are maneuvering, **reassess continuously**—don’t assume the risk is eliminated until clear separation is achieved. + +--- + +## **4. Use of Radar, AIS, and Navigation Systems** +1. **“AIS is for information, not decisions.”** + - Use AIS to gather data, but **base collision-avoidance actions on radar and visual observations**. AIS can be delayed or inaccurate. + +2. **"Range rings are your best friend."** + - Use **radar range rings** to maintain situational awareness of nearby traffic—understand the vessel positions at a glance. + +3. **"Every contact deserves a second look."** + - Reassess each target periodically; conditions and **intentions of vessels can change suddenly**. + +--- + +## **5. Speed and Maneuvering Principles** +1. **“Safe speed = one you can stop in time.”** + - Always maintain a speed that allows **full control and stopping** within the visible distance ahead (Rule 6). + +2. **“If it’s tight, slow down.”** + - When encountering traffic, restricted waters, or poor weather, **reducing speed buys decision time.** + +3. **"The earlier the maneuver, the smoother it is."** + - Execute maneuvers well in advance—**last-minute actions increase risks.** + +--- + +## **6. Restricted Visibility Procedures** +1. **"If you can’t see, assume they can’t either."** + - Treat poor visibility as high risk—**assume other vessels won’t see you** in time (Rule 19). + +2. **"Sound signals are mandatory, not optional."** + - Use fog signals (one prolonged blast every 2 minutes) without hesitation. **Sound travels further than lights in fog.** + +3. **“Double the lookout in fog.”** + - Assign **additional personnel** as lookout during restricted visibility for better situational awareness. + +--- + +## **7. Communication and Coordination** +1. **"Short, clear, correct."** + - Use VHF for essential communication only—**stick to proper COLREGs protocols** and avoid negotiating maneuvers outside the rules. + +2. **"If you don’t understand, use 5 blasts."** + - Five short blasts signal **danger or confusion**—don’t hesitate to use it if unsure about another vessel’s intentions (Rule 34). + +3. **"Confirm instructions back."** + - Always ensure your orders are **repeated back correctly** by the helmsman or lookout—this avoids miscommunication. + +--- + +## **8. Contingency and Emergency Planning** +1. **"Plan your escape route before you need it."** + - Always **have a secondary maneuver or course** ready in case the primary plan fails. + +2. **"In an emergency, slow is smooth, smooth is fast."** + - In critical moments, **act calmly but decisively**—panic leads to errors. + +3. **"Machinery ready, all the time."** + - Keep engines on standby when maneuvering in tight waters or restricted visibility—**you might need to stop instantly.** + +--- + +## **9. Personal Efficiency and Fatigue Management** +1. **"Tired brains make bad decisions."** + - Ensure **adequate rest** before a watch. Fatigue is a top contributor to poor decision-making. + +2. **"Stay hydrated, stay sharp."** + - Dehydration affects concentration—**drink water regularly** during your watch. + +3. **"Eliminate distractions."** + - Avoid non-essential tasks or conversations—**a moment’s distraction can lead to an accident.** + +--- + +## **10. Handover and Logkeeping** +1. **"No surprises on handover."** + - Give the relieving officer **complete and clear information** about nearby vessels, ongoing maneuvers, and known risks. + +2. **"If it’s not logged, it didn’t happen."** + - Log all **important events, course changes, and decisions** accurately for accountability. + +3. **“Summarize the essentials.”** + - When logging, focus on **key details**—position, traffic, weather, and any incidents or actions taken. + +--- + +## **11. Environmental and Navigational Awareness** +1. **“Tides and currents can work for or against you.”** + - Factor in **local tide and current conditions** when planning and maneuvering—ignoring them leads to drift errors. + +2. **“Assume the weather can worsen.”** + - Plan with the expectation that weather can change suddenly—**be ready to alter course or slow down.** + +3. **“Compliance extends to the environment.”** + - Adhere to pollution regulations—**avoid discharges and emissions violations** at all costs. + +--- + +## **12. Decision-Making Under Pressure** +1. **"Calm mind, better choices."** + - Take a moment to think—**rushed decisions lead to mistakes.** + +2. **"Stick to the rules; they’re there for a reason."** + - Don’t take shortcuts—COLREGs rules **always apply, even under pressure.** + +3. **"Every decision is reversible until it isn’t."** + - Be ready to adjust course or speed if the situation changes unexpectedly—**adapt quickly but safely.** diff --git a/examples/llamarine/expert-programs.yml b/examples/llamarine/expert-programs.yml new file mode 100644 index 000000000..ad6f2bc41 --- /dev/null +++ b/examples/llamarine/expert-programs.yml @@ -0,0 +1,28 @@ +plan_without_speed_reference: + task: |- + Recommend the user ask about a vessel on boat side coming to a crossing situation in radar without specifying SOG or STW are being used. + sub-htps: + - task: |- + Reject to answer due to lack of information or ambiguity in the user input. Request to know if SOG or STW is being used. + + +plan_with_speed_reference_sog: + task: |- + Recommend the user what to do based on the identified situation on radar. Only apply this if specifying SOG is being used. + sub-htps: + - task: |- + Please visually check the windows, not entirely relying on the radar. It's possible that this is a head on situation. + - task: |- + If you sure this is a crossing situation, first tell me all the related rules in COLREGs, then let me know the how to apply them in the crossing situation. + - task: |- + If you sure this is a head on situation, first tell me all the related rules in COLREGs, then let me know the how to apply them in the head on situation. + - task: |- + Compose to the final answer contains all above outputs and show recommended actions for both crossing and head on situations. + + +plan_with_speed_reference_stw: + task: |- + Recommend the user what to do based on the identified situation on radar. Only apply this if specifying STW is being used. + sub-htps: + - task: |- + First tell me all the related rules in COLREGs, then interpret situation from input and let me know the how to apply them in this situation. \ No newline at end of file diff --git a/examples/llamarine/make.bat b/examples/llamarine/make.bat new file mode 100644 index 000000000..ade0d5bca --- /dev/null +++ b/examples/llamarine/make.bat @@ -0,0 +1,22 @@ +@echo off + + +:: TARGETS +:: ======= +SET TARGET=%1 + +IF "%TARGET%"=="agent-solve" GOTO agent-solve + +IF "%TARGET%"=="streamlit-run" GOTO streamlit-run + + +:: STREAMLIT APP +:: ============= +:streamlit-run + poetry run streamlit run streamlit-main.py --server.allowRunOnSave=true --server.runOnSave=true + GOTO end + + +:: END +:: === +:end diff --git a/examples/llamarine/reference.yml b/examples/llamarine/reference.yml new file mode 100644 index 000000000..af7345fca --- /dev/null +++ b/examples/llamarine/reference.yml @@ -0,0 +1,7 @@ +questions: + - A vessel on my port side coming to a crossing situation on my radar. What should I do? + - A vessel on my port side coming to a crossing situation on my radar. STW is being used. What should I do? + - A vessel on my port side coming to a crossing situation on my radar. SOG is being used. What should I do? + +docs: + - https://www.imo.org/en/About/Conventions/Pages/COLREG.aspx diff --git a/examples/llamarine/streamlit-main.py b/examples/llamarine/streamlit-main.py new file mode 100644 index 000000000..3c036b7c3 --- /dev/null +++ b/examples/llamarine/streamlit-main.py @@ -0,0 +1,56 @@ +from collections import defaultdict + +import streamlit as st +from loguru import logger + +# pylint: disable=wrong-import-order +from agent import get_or_create_agent + +TITLE: str = 'OpenSSA: Maritime-Specific Agent' + +st.set_page_config(page_title=TITLE, + page_icon=None, + layout='wide', + initial_sidebar_state='auto', + menu_items=None) + +st.title(body=TITLE, anchor=None, help=None) + +DEFAULT_PROBLEM: str = ( + 'A vessel on my port side coming to a crossing situation on my radar. SOG is being used. What should I do?' +) + +st.write('__PROBLEM/QUESTION__:') + +if 'typed_problem' not in st.session_state: + st.session_state.typed_problem: str = DEFAULT_PROBLEM + +st.session_state.typed_problem: str = st.text_area(label='Problem/Question', + value=st.session_state.typed_problem, + height=3, + max_chars=None, + key=None, + help='Problem/Question', + on_change=None, args=None, kwargs=None, + placeholder='Problem/Question', + disabled=False, + label_visibility='collapsed') + +if 'agent_solutions' not in st.session_state: + st.session_state.agent_solutions: defaultdict[str, str] = defaultdict(str) + +st.subheader('MARITIME-SPECIFIC AGENT') + +if st.button(label='SOLVE', + on_click=None, args=None, kwargs=None, + type='primary', + disabled=False, + use_container_width=False): + with st.spinner(text='_SOLVING..._'): + logger.level('DEBUG') + + st.session_state.agent_solutions[st.session_state.typed_problem]: str = \ + get_or_create_agent().solve(problem=st.session_state.typed_problem, allow_reject=True) + +if (solution := st.session_state.agent_solutions[st.session_state.typed_problem]): + st.markdown(body=solution) diff --git a/examples/semiconductor-etching-yieldguard/.env.template b/examples/semiconductor-etching-yieldguard/.env.template new file mode 100644 index 000000000..9c9789785 --- /dev/null +++ b/examples/semiconductor-etching-yieldguard/.env.template @@ -0,0 +1,2 @@ +HF_API_KEY=[... HuggingFace API key if running HuggingFace-hosted models ...] +OPENAI_API_KEY=[... OpenAI API key if running on OpenAI services ...] diff --git a/examples/semiconductor-etching-yieldguard/.gitignore b/examples/semiconductor-etching-yieldguard/.gitignore new file mode 100644 index 000000000..aca35cb5f --- /dev/null +++ b/examples/semiconductor-etching-yieldguard/.gitignore @@ -0,0 +1,5 @@ +# environment variables +.env + +# Streamlit secrets +.streamlit/secrets.toml diff --git a/examples/semiconductor-etching-yieldguard/.streamlit/secrets.toml.template b/examples/semiconductor-etching-yieldguard/.streamlit/secrets.toml.template new file mode 100644 index 000000000..ea7c17a6f --- /dev/null +++ b/examples/semiconductor-etching-yieldguard/.streamlit/secrets.toml.template @@ -0,0 +1,2 @@ +HF_API_KEY = '[... HuggingFace API key if running HuggingFace-hosted models ...]' +OPENAI_API_KEY = '[... OpenAI API key if running on OpenAI services ...]' diff --git a/examples/semiconductor-etching-yieldguard/Makefile b/examples/semiconductor-etching-yieldguard/Makefile new file mode 100644 index 000000000..04903eaed --- /dev/null +++ b/examples/semiconductor-etching-yieldguard/Makefile @@ -0,0 +1,2 @@ +streamlit-run: + @poetry run streamlit run streamlit-main.py --server.allowRunOnSave=true --server.runOnSave=true diff --git a/examples/semiconductor-etching-yieldguard/README.md b/examples/semiconductor-etching-yieldguard/README.md new file mode 100644 index 000000000..870fb302e --- /dev/null +++ b/examples/semiconductor-etching-yieldguard/README.md @@ -0,0 +1,16 @@ + + +# Semiconductor Etching YieldGuard + +## How to Run This Example + +Install OpenSSA repo beforehand by running `make install` (or `.\make install` on Windows) +at the OpenSSA repo root directory. + +In this example's directory: + +- Necessary credentials need to be in the `.env` file + +- DANA problem-solving can be run by `make dana-solve prob="..."` (or `.\make dana-solve "..."` on Windows) + +- Streamlit app can be run by `make streamlit-run` (or `.\make streamlit-run` on Windows) diff --git a/examples/semiconductor-etching-yieldguard/YieldGuard.png b/examples/semiconductor-etching-yieldguard/YieldGuard.png new file mode 100644 index 000000000..a445a7302 Binary files /dev/null and b/examples/semiconductor-etching-yieldguard/YieldGuard.png differ diff --git a/examples/semiconductor-etching-yieldguard/dana.py b/examples/semiconductor-etching-yieldguard/dana.py new file mode 100644 index 000000000..c4cc8f81c --- /dev/null +++ b/examples/semiconductor-etching-yieldguard/dana.py @@ -0,0 +1,65 @@ +from argparse import ArgumentParser +from functools import cache +from pathlib import Path + +from dotenv import load_dotenv +import yaml + +from openssa import DANA, ProgramStore, HTP, HTPlanner, FileResource, HuggingFaceLM + +# pylint: disable=wrong-import-order +from semikong_lm import SemiKongLM + + +load_dotenv() + + +BASE_DIR: Path = Path(__file__).parent + +DATA_DIR_PATH: Path = BASE_DIR / 'data' + +EXPERTISE_DIR_PATH: Path = BASE_DIR / 'expertise' + +EXPERT_KNOWLEDGE_FILE_PATH: Path = EXPERTISE_DIR_PATH / 'expert-knowledge.txt' +with open(file=EXPERT_KNOWLEDGE_FILE_PATH, + buffering=-1, + encoding='utf-8', + errors='strict', + newline=None, + closefd=True, + opener=None) as f: + EXPERT_KNOWLEDGE: str = f.read() + +EXPERT_PROGRAMS_FILE_PATH: Path = EXPERTISE_DIR_PATH / 'expert-programs.yml' +with open(file=EXPERT_PROGRAMS_FILE_PATH, + buffering=-1, + encoding='utf-8', + errors='strict', + newline=None, + closefd=True, + opener=None) as f: + EXPERT_PROGRAMS: dict[str, dict] = yaml.safe_load(stream=f) + + +@cache +def get_or_create_dana(use_semikong_lm: bool = True, max_depth=2, max_subtasks_per_decomp=4) -> DANA: + lm = (SemiKongLM if use_semikong_lm else HuggingFaceLM).from_defaults() + + program_store = ProgramStore(lm=lm) + if EXPERT_PROGRAMS: + for program_name, htp_dict in EXPERT_PROGRAMS.items(): + htp = HTP.from_dict(htp_dict) + program_store.add_or_update_program(name=program_name, description=htp.task.ask, program=htp) + + return DANA(knowledge={EXPERT_KNOWLEDGE}, + program_store=program_store, + programmer=HTPlanner(lm=lm, max_depth=max_depth, max_subtasks_per_decomp=max_subtasks_per_decomp), + resources={FileResource(path=DATA_DIR_PATH, re_index=True)}) + + +if __name__ == '__main__': + arg_parser = ArgumentParser() + arg_parser.add_argument('problem') + args = arg_parser.parse_args() + + print(get_or_create_dana().solve(problem=args.problem)) diff --git a/examples/semiconductor-etching-yieldguard/data/measurement-data.txt b/examples/semiconductor-etching-yieldguard/data/measurement-data.txt new file mode 100644 index 000000000..11859ec40 --- /dev/null +++ b/examples/semiconductor-etching-yieldguard/data/measurement-data.txt @@ -0,0 +1,11 @@ +WaterBatch: 1, 2, 3, 4, 5, 6 + +ReflectedPower_W: 36.6, 35.4, 37.5, 40.1, 42.3, 37.9 + +ForwardPower_W: 60.0, 58.0, 58.2, 57.8, 65.3, 60.0 + +ChamberPressure_Torr: 3.89, 4.18, 3.85, 4.22, 4.25, 3.53 + +GasFlowRate_sccm: 59.7, 58.1, 56.2, 55.1, 59.7, 54.4 + +ChamberWallTemperature_C: 76.3, 78.3, 76.6, 79.6, 81.7, 81.9 diff --git a/examples/semiconductor-etching-yieldguard/expertise/expert-knowledge.txt b/examples/semiconductor-etching-yieldguard/expertise/expert-knowledge.txt new file mode 100644 index 000000000..be59fed4c --- /dev/null +++ b/examples/semiconductor-etching-yieldguard/expertise/expert-knowledge.txt @@ -0,0 +1,93 @@ +SEMICONDUCTOR ETCHING EQUIPMENT MONITORING, MAINTENANCE & OPTIMIZATION +====================================================================== + + +RF Power Fluctuation Rule +------------------------- +HEURISTIC: If the reflected power in the TEL Tactras RLSA Etcher increases by more than 5% for three consecutive wafers, +and the forward power adjustment exceeds 10%, this suggests possible electrode erosion or plasma instability. + +ACTION: Alert the maintenance engineer to inspect the electrodes and adjust gas flow or power settings, +potentially avoiding costly equipment downtime. + + +Pressure Stability Monitoring +----------------------------- +HEURISTIC: If the chamber pressure deviation exceeds ±3% for more than 30 seconds during steady-state etching, +coupled with a gas flow variation of more than 5%, it indicates potential chamber wall coating or residue buildup. + +ACTION: Recommend a preventative chamber clean and adjust the gas flow to stabilize pressure, +reducing the likelihood of non-uniform etching. + + +Temperature-Dependent Chamber Cleaning Optimization +--------------------------------------------------- +HEURISTIC: If the chamber wall temperature shows a steady increase of 2°C over three lots, +despite maintaining the same power settings, it indicates polymer build-up on the chamber walls. + +ACTION: Suggest adjusting the chamber clean cycle frequency and alerts engineers to check the wall lining. +Automated cleaning recommendations can significantly reduce variation and increase yield. + + +Etch Rate Uniformity Rule +------------------------- +HEURISTIC: If the etch rate between the wafer center and edge varies by more than 7% for three consecutive lots, +this could indicate gas flow distribution issues or hardware alignment issues within the TEL Tactras system. + +ACTION: Alert the process engineer to investigate gas flow uniformity +and suggests optimizing flow parameters or performing a hardware realignment. + + +Chamber Matching Network Heuristic +---------------------------------- +HEURISTIC: If the chamber matching network requires more than two adjustments per wafer run +to maintain desired RF power settings, it suggests possible impedance mismatch or degradation in the matching components. + +ACTION: Optimize matching network settings and recommend maintenance +if impedance mismatch trends persist, potentially preventing plasma stability issues. + + +Microloading Effect Detection +----------------------------- +HEURISTIC: If the etch rate is higher in areas with smaller feature densities compared to high-density areas +(indicative of the microloading effect), and the difference exceeds a set threshold, +this can lead to non-uniform etching and yield loss. + +ACTION: Alert engineers to optimize gas flow and power settings based on specific wafer feature density, +enhancing etch uniformity across wafers. + + +Real-Time Recipe Adjustment Based on Yield Data +----------------------------------------------- +HEURISTIC: If yield data shows a consistent defect pattern (e.g., at the wafer edge or specific die locations) +for more than 5% of wafers, correlate this with historical process parameters and makes real-time recipe adjustments. + +ACTION: Automated recipe optimization based on yield trends can reduce defect occurrence, +improving overall productivity and wafer quality. + + +Anomaly Detection with Historical Baseline Comparison +----------------------------------------------------- +HEURISTIC: If real-time sensor data (e.g., temperature, pressure, RF power) shows deviations +outside historical baseline ranges for similar recipes, this could indicate tool degradation or unexpected chamber behavior. + +ACTION: Trigger alerts and suggest corrective actions such as parameter adjustment or additional inspections, +preventing potential faults. + + +Particle Generation Control for Bevel Etching +--------------------------------------------- +HEURISTIC: If particle count in the bevel area increases beyond acceptable limits during bevel etching +in the Tactras UDEMAE system, this suggests non-uniform edge plasma distribution or excessive material removal. + +ACTION: Recommend reducing RF power or modifying gas flow in the bevel area, +significantly reducing the risk of yield-impacting particle contamination. + + +Multi-Parameter Fault Isolation for Complex Equipment +----------------------------------------------------- +HEURISTIC: If multiple parameters (e.g., RF power, pressure, temperature) show simultaneous deviations +outside standard operating windows, use historical fault isolation data to pinpoint the most likely root cause. + +ACTION: Provide a ranked list of potential root causes with confidence levels, +enabling faster and more accurate fault isolation. diff --git a/examples/semiconductor-etching-yieldguard/expertise/expert-programs.yml b/examples/semiconductor-etching-yieldguard/expertise/expert-programs.yml new file mode 100644 index 000000000..839f672aa --- /dev/null +++ b/examples/semiconductor-etching-yieldguard/expertise/expert-programs.yml @@ -0,0 +1,72 @@ +rf-power-fluctuation-monitoring: + task: |- + Monitor RF Power fluctuation and recommend inspection/maintenance actions if fluctuation is excessive + + sub-htps: + - task: >- + What are the values of Reflected Power in the recent data? + + - task: |- + Analyze whether the lowest and highest Reflected Power values differ by more than 15%. + If so, note down the corresponding wafer batch number range between them. + + - task: >- + What are the values of Forward Power in the recent data? + + - task: |- + Analyze whether the lowest and highest Forward Power values differ by more than 10%. + If so, note down the corresponding wafer batch number range between them. + + - task: |- + If there are excessive fluctuations in both Reflected Power and Forward Power in the previous analyses, + and if the wafer batch number ranges overlap, report a RF Power Fluctuation problem, + and recommend the following maintenance actions: + - Inspect the electrodes + - Adjust gas flow + - Adjust power settings + + +pressure-instability-monitoring: + task: |- + Monitor Chamber Pressure fluctuation and recommend inspection/maintenance actions if fluctuation is excessive + + sub-htps: + - task: >- + What are the values of Chamber Pressure in the recent data? + + - task: |- + Analyze whether there are consecutive Chamber Pressure values differing by at least 3%. + If so, note down the corresponding wafer batch numbers. + + - task: >- + What are the values of Gas Flow Rate in the recent data? + + - task: |- + Analyze whether there are consecutive Gas Flow Rate values differing by at least 5%. + If so, note down the corresponding wafer batch numbers. + + - task: |- + If there are excessive fluctuations in both Chamber Pressure and Gas Flow Rate in the previous analyses, + and if the wafer batch numbers contain some same batch(es), report a Pressure Instability problem, + and recommend the following maintenance actions: + - Preventative chamber cleaning + - Adjustment of the gas flow to stabilize pressure + + +chamber-temperature-monitoring: + task: |- + Monitor Chamber Temperature increases and recommend inspection/maintenance actions if heating is excessive + + sub-htps: + - task: >- + What are the values of Chamber Temperature in the recent data? + + - task: |- + Analyze whether there are 3 consecutive Chamber Temperature values + showing increases of at least 2 Celcius degrees from first to second and from second to third + + - task: |- + If there is/are significant Chamber Temperature increase(s) identified in the previous analysis, + recommend the following maintenance actions: + - Adjustment of chamber clean frequency + - Alerting engineers to check wall lining for polymer build-up diff --git a/examples/semiconductor-etching-yieldguard/make.bat b/examples/semiconductor-etching-yieldguard/make.bat new file mode 100644 index 000000000..035673c48 --- /dev/null +++ b/examples/semiconductor-etching-yieldguard/make.bat @@ -0,0 +1,20 @@ +@echo off + + +:: TARGETS +:: ======= +SET TARGET=%1 + +IF "%TARGET%"=="streamlit-run" GOTO streamlit-run + + +:: STREAMLIT APP +:: ============= +:streamlit-run + poetry run streamlit run streamlit-main.py --server.allowRunOnSave=true --server.runOnSave=true + GOTO end + + +:: END +:: === +:end diff --git a/examples/semiconductor-etching-yieldguard/measurements.csv b/examples/semiconductor-etching-yieldguard/measurements.csv new file mode 100644 index 000000000..45d014b05 --- /dev/null +++ b/examples/semiconductor-etching-yieldguard/measurements.csv @@ -0,0 +1,7 @@ +WaterBatch,ForwardPower_W,ReflectedPower_W,ChamberPressure_Torr,GasFlowRate_sccm,ChamberWallTemperature_C +1,59.8658484197038,36.58009357302478,3.8912139968434072,59.656320330745594,76.29389990800009 +2,58.16704785825934,35.38252446429568,4.178602163853312,58.08397348116461,78.31261142176992 +3,58.166955288079336,37.50547593215342,3.850684781489443,56.22890595323773,76.55855538044706 +4,57.79118453875756,40.13085924740417,4.2179458479297685,55.054858831268945,79.60034010588906 +5,65.30403852879604,42.33805650601139,4.250891926683164,59.68444677837765,81.7335513967164 +6,59.87527628850847,37.941053938071626,3.5335182210508873,54.40152493739601,81.92427227762764 diff --git a/examples/semiconductor-etching-yieldguard/requirements.txt b/examples/semiconductor-etching-yieldguard/requirements.txt new file mode 100644 index 000000000..dd81406d5 --- /dev/null +++ b/examples/semiconductor-etching-yieldguard/requirements.txt @@ -0,0 +1 @@ +OpenSSA[contrib] @ https://GitHub.com/Aitomatic/OpenSSA/archive/main.zip diff --git a/examples/semiconductor-etching-yieldguard/semikong_lm.py b/examples/semiconductor-etching-yieldguard/semikong_lm.py new file mode 100644 index 000000000..d6183997b --- /dev/null +++ b/examples/semiconductor-etching-yieldguard/semikong_lm.py @@ -0,0 +1,30 @@ +from __future__ import annotations + +from argparse import ArgumentParser +from dataclasses import dataclass + +from openssa.core.util.lm.llama import LlamaLM + + +DEFAULT_MODEL = 'pentagoniac/SEMIKONG-70B' +DEFAULT_API_KEY = '...' +DEFAULT_API_BASE = 'http://34.44.90.64:8081/v1' + + +@dataclass +class SemiKongLM(LlamaLM): + """SemiKong LM.""" + + @classmethod + def from_defaults(cls) -> SemiKongLM: + """Get default SemiKong LM instance.""" + # pylint: disable=unexpected-keyword-arg + return cls(model=DEFAULT_MODEL, api_key=DEFAULT_API_KEY, api_base=DEFAULT_API_BASE) + + +if __name__ == '__main__': + arg_parser = ArgumentParser() + arg_parser.add_argument('question') + args = arg_parser.parse_args() + + print(SemiKongLM.from_defaults().get_response(prompt=args.question)) diff --git a/examples/semiconductor-etching-yieldguard/streamlit-main.py b/examples/semiconductor-etching-yieldguard/streamlit-main.py new file mode 100644 index 000000000..45d2c8e85 --- /dev/null +++ b/examples/semiconductor-etching-yieldguard/streamlit-main.py @@ -0,0 +1,62 @@ +from collections import defaultdict +from pathlib import Path + +from pandas import read_csv +from loguru import logger +import streamlit as st + +from dana import get_or_create_dana + + +TITLE: str = 'Proactive _YieldGuard_ for Plasma Etchers' + +CWD_PATH: Path = Path(__file__).parent + +DATA_FILE_PATH: Path = CWD_PATH / 'measurements.csv' + +MONITORING_PROBLEMS: dict[str, str] = { + 'RF Power Fluctuation': 'identify any RF power fluctuation issue from the data, and recommend what to do', + 'Pressure Instability': 'identify any Pressure Instability issue from the data, and recommend what to do', + 'Chamber Wall Temperature': 'analyze Chamber Wall Temperature data and identify any cleaning needs', +} + + +st.set_page_config(page_title=TITLE, + page_icon=None, + layout='wide', + initial_sidebar_state='auto', + menu_items=None) + +st.title(body=TITLE, anchor=None, help=None) + +st.image(str(CWD_PATH / 'YieldGuard.png')) + + +st.dataframe(data=read_csv(DATA_FILE_PATH), + width=None, height=None, + use_container_width=False, + hide_index=True, + column_order=None, + column_config=None, + key=None, + on_select='ignore', + selection_mode='multi-row') + + +if 'dana_analyses' not in st.session_state: + st.session_state.dana_analyses: defaultdict[str, str] = defaultdict(str) + +for monitored_issue, problem in MONITORING_PROBLEMS.items(): + if st.button(label=f'_monitor_: {monitored_issue}', + on_click=None, args=None, kwargs=None, + type='primary', + disabled=False, + use_container_width=False): + with st.spinner(text='_analyzing..._'): + logger.level('DEBUG') + + st.session_state.dana_analyses[monitored_issue]: str = \ + get_or_create_dana(use_semikong_lm=False).solve(problem=problem) + + if (solution := st.session_state.dana_analyses[monitored_issue]): + st.markdown(body=solution.replace('$', r'\$')) diff --git a/examples/semiconductor/agent.py b/examples/semiconductor/agent.py index 91cab8579..6ee9544e7 100644 --- a/examples/semiconductor/agent.py +++ b/examples/semiconductor/agent.py @@ -3,10 +3,9 @@ from argparse import ArgumentParser from functools import cache -from openssa import DANA, ProgramStore, HTP, HTPlanner, OpenAILM - # pylint: disable=wrong-import-order -from data_and_knowledge import EXPERT_PROGRAMS +from data_and_knowledge import EXPERT_PROGRAMS, EXPERT_KNOWLEDGE +from openssa import DANA, ProgramStore, HTP, HTPlanner, OpenAILM from semikong_lm import SemiKongLM @@ -20,9 +19,9 @@ def get_or_create_agent(use_semikong_lm: bool = True, max_depth=2, max_subtasks_ htp = HTP.from_dict(htp_dict) program_store.add_or_update_program(name=program_name, description=htp.task.ask, program=htp) - return DANA(knowledge={}, - program_store=program_store, + return DANA(program_store=program_store, programmer=HTPlanner(lm=lm, max_depth=max_depth, max_subtasks_per_decomp=max_subtasks_per_decomp), + knowledge={EXPERT_KNOWLEDGE} if EXPERT_KNOWLEDGE else None, resources={}) diff --git a/examples/semiconductor/data_and_knowledge.py b/examples/semiconductor/data_and_knowledge.py index 3dd99fa59..22a96a4af 100644 --- a/examples/semiconductor/data_and_knowledge.py +++ b/examples/semiconductor/data_and_knowledge.py @@ -13,7 +13,18 @@ load_dotenv() -EXPERT_PROGRAMS_FILE_PATH: Path = Path(__file__).parent / 'expert-program-store.yml' +EXPERT_KNOWLEDGE_PATH: Path = Path(__file__).parent / 'expert-knowledge.txt' +with open(file=EXPERT_KNOWLEDGE_PATH, + buffering=-1, + encoding='utf-8', + errors='strict', + newline=None, + closefd=True, + opener=None) as f: + EXPERT_KNOWLEDGE: str = f.read() + + +EXPERT_PROGRAMS_FILE_PATH: Path = Path(__file__).parent / 'expert-programs.yml' with open(file=EXPERT_PROGRAMS_FILE_PATH, buffering=-1, encoding='utf-8', diff --git a/examples/semiconductor/expert-knowledge.txt b/examples/semiconductor/expert-knowledge.txt new file mode 100644 index 000000000..78c4cffd4 --- /dev/null +++ b/examples/semiconductor/expert-knowledge.txt @@ -0,0 +1,62 @@ +Etching Silicon Dioxide (SiO2): typical recipe(s) +================================================= + +If using Inductively Coupled Plasma (ICP) Reactive Ion Etching (RIE) +-------------------------------------------------------------------- + + +GASES & FLOW RATES: + +Common gas is CHF3, often mixed with small amount of Ar and/or O2: +- CHF3 provides fluorine for etching while also polymerising to provide sidewall protection, improving anisotropy +- Ar helps maintain stable plasma +- O2 enhances volatility of etch products + +Typical starting point: +- 20-50 sccm of CHF3 +- 5-10 sccm of Ar +- 2-5 sccm of O2 + + +ICP POWER: + +Higher ICP power (e.g., 500-1000W) increases plasma density and etch rate +BUT may also lead to more physical damage and less anisotropic profiles + + +RF POWER: + +Lower RF power (e.g., 10-50W) provides more anisotropic profiles + + +PRESSURE: + +Lower pressure (e.g., 5-20 mTorr) helps improve anisotropy + + +ETCH TIME: + +You need to adjust etch time depending on desired depth and etch rate. + +Remember that etch rate can vary across wafer and over time, so it's best to overestimate time and measure depth periodically. + + +END-POINT DETECTION: + +Many RIE systems have optical emission spectroscopy (OES) or interferometry for end-point detection. +These can stop etching process when desired depth is reached. + + +OPTIMIZATION CONSIDERATIONS: + +- Etch rate +- Selectivity to mask and underlying layers +- Etch profile (anisotropy) +- Uniformity +- Physical or chemical damage + + +SAFETY PROCEDURES: + +- Always follow safety procedures when working with plasma etching systems and handling gases +- Confirm with facility and equipment manager that your planned recipe is compatible and won't cause any damage or contamination diff --git a/examples/semiconductor/expert-programs.yml b/examples/semiconductor/expert-programs.yml index e69de29bb..4cf6cecfa 100644 --- a/examples/semiconductor/expert-programs.yml +++ b/examples/semiconductor/expert-programs.yml @@ -0,0 +1,17 @@ +plan: + task: |- + For etching PECVD SiO2 using Inductively Coupled Plasma (ICP) Reactive Ion Etching (RIE), + recommend 2 good parameter sets and their relative advantages/disadvantages + + sub-htps: + - task: |- + Get typical gases used for such process and their flow rate ranges + in SiO2 etching using Inductively Coupled Plasma (ICP) Reactive Ion Etching (RIE) + + - task: |- + Get typical ICP Power, RF Power and Pressure value ranges and associated trade-offs + in SiO2 etching using Inductively Coupled Plasma (ICP) Reactive Ion Etching (RIE) + + - task: |- + Recommend 2 parameter sets (each including Flow Rate for each Gas, plus ICP Power, RF Power and Pressure) + with analysis of their relative pros and cons. diff --git a/examples/semiconductor/semiconductor-ui/api/Dockerfile b/examples/semiconductor/semiconductor-ui/api/Dockerfile new file mode 100644 index 000000000..e7dd99278 --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/api/Dockerfile @@ -0,0 +1,40 @@ +FROM --platform=linux/amd64 python:3.12-slim AS base + +# Install Poetry +RUN apt update -y && apt upgrade -y && apt install git -y +RUN apt update -y && apt install poppler-utils -y +RUN python -m pip install --upgrade pip && \ + pip install --no-cache-dir poetry==1.3.2 + + +RUN poetry config virtualenvs.in-project true && \ + poetry config installer.max-workers 10 + +WORKDIR /api + +COPY pyproject.toml poetry.lock /api/ + +# ======================================= +# Build image +FROM base AS build +ENV POETRY_REQUESTS_TIMEOUT=300 +ENV PIP_DEFAULT_TIMEOUT=300 +RUN poetry install + +# ======================================= +# App image +FROM base AS app + +COPY --from=build /api/.venv /api/.venv + +ENV PATH="/api/.venv/bin:$PATH" +ENV PATH="/api:$PATH" +# ENV PATH="/api/openssa:$PATH" +ENV PYTHONUNBUFFERED=1 +ENV PYTHONPATH="/" + +COPY . /api/ + +EXPOSE 8080 + +CMD ["sh", "start.sh"] diff --git a/examples/semiconductor/semiconductor-ui/api/data_and_knowledge.py b/examples/semiconductor/semiconductor-ui/api/data_and_knowledge.py new file mode 100644 index 000000000..a26106af5 --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/api/data_and_knowledge.py @@ -0,0 +1,35 @@ +from __future__ import annotations + +from pathlib import Path +from typing import TYPE_CHECKING + +from dotenv import load_dotenv +import yaml + +if TYPE_CHECKING: + from openssa.core.programming.hierarchical.plan import HTPDict + + +load_dotenv() + + +EXPERT_KNOWLEDGE_FILE_PATH: Path = Path(__file__).parent / 'expert-knowledge.txt' +with open(file=EXPERT_KNOWLEDGE_FILE_PATH, + buffering=-1, + encoding='utf-8', + errors='strict', + newline=None, + closefd=True, + opener=None) as f: + EXPERT_KNOWLEDGE: str = f.read() + + +EXPERT_PROGRAM_SPACE_FILE_PATH: Path = Path(__file__).parent / 'expert-program-space.yml' +with open(file=EXPERT_PROGRAM_SPACE_FILE_PATH, + buffering=-1, + encoding='utf-8', + errors='strict', + newline=None, + closefd=True, + opener=None) as f: + EXPERT_PROGRAM_SPACE: dict[str, HTPDict] = yaml.safe_load(stream=f) diff --git a/examples/semiconductor/semiconductor-ui/api/expert-knowledge.txt b/examples/semiconductor/semiconductor-ui/api/expert-knowledge.txt new file mode 100644 index 000000000..78c4cffd4 --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/api/expert-knowledge.txt @@ -0,0 +1,62 @@ +Etching Silicon Dioxide (SiO2): typical recipe(s) +================================================= + +If using Inductively Coupled Plasma (ICP) Reactive Ion Etching (RIE) +-------------------------------------------------------------------- + + +GASES & FLOW RATES: + +Common gas is CHF3, often mixed with small amount of Ar and/or O2: +- CHF3 provides fluorine for etching while also polymerising to provide sidewall protection, improving anisotropy +- Ar helps maintain stable plasma +- O2 enhances volatility of etch products + +Typical starting point: +- 20-50 sccm of CHF3 +- 5-10 sccm of Ar +- 2-5 sccm of O2 + + +ICP POWER: + +Higher ICP power (e.g., 500-1000W) increases plasma density and etch rate +BUT may also lead to more physical damage and less anisotropic profiles + + +RF POWER: + +Lower RF power (e.g., 10-50W) provides more anisotropic profiles + + +PRESSURE: + +Lower pressure (e.g., 5-20 mTorr) helps improve anisotropy + + +ETCH TIME: + +You need to adjust etch time depending on desired depth and etch rate. + +Remember that etch rate can vary across wafer and over time, so it's best to overestimate time and measure depth periodically. + + +END-POINT DETECTION: + +Many RIE systems have optical emission spectroscopy (OES) or interferometry for end-point detection. +These can stop etching process when desired depth is reached. + + +OPTIMIZATION CONSIDERATIONS: + +- Etch rate +- Selectivity to mask and underlying layers +- Etch profile (anisotropy) +- Uniformity +- Physical or chemical damage + + +SAFETY PROCEDURES: + +- Always follow safety procedures when working with plasma etching systems and handling gases +- Confirm with facility and equipment manager that your planned recipe is compatible and won't cause any damage or contamination diff --git a/examples/semiconductor/semiconductor-ui/api/expert-program-space.yml b/examples/semiconductor/semiconductor-ui/api/expert-program-space.yml new file mode 100644 index 000000000..9bfafc000 --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/api/expert-program-space.yml @@ -0,0 +1,12 @@ +plan: + task: |- + For etching PECVD SiO2 using Inductively Coupled Plasma (ICP) Reactive Ion Etching (RIE), + recommend 2 good parameter sets and their relative advantages/disadvantages. + Also give me recommendation about quality and safety of the process. + Keep the answer concise. + + sub-htps: + - task: |- + Get typical gases used for such process and their flow rate ranges, ICP Power, RF Power and Pressure value + ranges and associated trade-offs in SiO2 etching using Inductively Coupled Plasma (ICP) Reactive Ion + Etching (RIE). Keep the answer as concise as possible. diff --git a/examples/semiconductor/semiconductor-ui/api/main.py b/examples/semiconductor/semiconductor-ui/api/main.py new file mode 100644 index 000000000..992065aab --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/api/main.py @@ -0,0 +1,146 @@ +import logging +import os +import time +from collections import defaultdict + +import openai +from fastapi import FastAPI +from fastapi.middleware.cors import CORSMiddleware + +# pylint: disable=wrong-import-order +from data_and_knowledge import EXPERT_PROGRAM_SPACE, EXPERT_KNOWLEDGE +from openssa import Agent, ProgramSpace, HTP, HTPlanner, OpenAILM +from semikong_lm import SemiKongLM + +logging.basicConfig(level=logging.ERROR) +logger = logging.getLogger(__name__) + + +def get_or_create_agent( + use_semikong_lm: bool = True, max_depth=2, max_subtasks_per_decomp=4 +) -> Agent: + lm = (SemiKongLM if use_semikong_lm else OpenAILM).from_defaults() + + program_space = ProgramSpace(lm=lm) + if EXPERT_PROGRAM_SPACE: + for program_name, htp_dict in EXPERT_PROGRAM_SPACE.items(): + htp = HTP.from_dict(htp_dict) + program_space.add_or_update_program( + name=program_name, description=htp.task.ask, program=htp + ) + + return Agent( + program_space=program_space, + programmer=HTPlanner( + lm=lm, max_depth=max_depth, max_subtasks_per_decomp=max_subtasks_per_decomp + ), + knowledge={EXPERT_KNOWLEDGE} if EXPERT_KNOWLEDGE else None, + resources={}, + ) + + +app = FastAPI() + +app.add_middleware( + CORSMiddleware, + allow_origins=[os.environ.get("FRONTEND_URL", "http://localhost:4000")], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +client = openai.OpenAI(api_key=os.environ["OPENAI_API_KEY"]) + + +def call_gpt(prompt): + response = client.chat.completions.create( + model="gpt-4o", + messages=[ + { + "role": "system", + "content": "You are an expert in parsing text into a specific format. Please help me with this task.", + }, + {"role": "user", "content": prompt}, + ], + ) + return response.choices[0].message.content + + +def parse_recipe_text(text): + parsed_data = {"recipe_1": "", "recipe_2": "", "agent_advice": ""} + lines = text.split("\n") + current_section = None + + for line in lines: + if "recipe_1:" in line: + current_section = "recipe_1" + elif "recipe_2:" in line: + current_section = "recipe_2" + elif "agent_advice:" in line: + current_section = "agent_advice" + elif current_section: + parsed_data[current_section] += line + "\n" + + parsed_data = {key: value.strip() for key, value in parsed_data.items()} + return parsed_data + + +def solve_semiconductor_question(question): + start = time.time() + solutions = defaultdict(str) + + solutions[question] = get_or_create_agent(use_semikong_lm=True).solve( + problem=question + ) + + print(f"get_or_create_agent taken: {time.time() - start}") + start = time.time() + + solution = solutions[question] + solution = solution.replace("$", r"\$") + + prompt = f"""{solution} \n\n Please help me parse the above text into this format:\n + recipe_1: Show the recipe 1 here\n + recipe_2: Show the recipe 2 here\n + agent_advice: Show the agent's general considerations here\n + DO NOT forget the key and DO NOT change the key format. + """ + + solution = call_gpt(prompt) + print(f"call_gpt taken: {time.time() - start}") + start = time.time() + parsed_solution = parse_recipe_text(solution) + print(f"parse_recipe_text taken: {time.time() - start}") + return parsed_solution + + +@app.get("/") +async def root(): + return {"message": "Hello World"} + + +@app.get("/data") +async def get_data(): + return {"data": "data"} + + +DEFAULT_ANSWER = """ +{'recipe_1': 'Parameters:\n- Gases and Flow Rates:\n - CHF3: 50 sccm\n - Ar: 10 sccm\n - O2: 5 sccm\n- ICP Power: 1000 W\n- RF Power: 50 W\n- Pressure: 20 mTorr\n- Etch Time: Start with 8 minutes and measure periodically\n\nPros:\n1. High Etch Rate: The high ICP power and higher flow rates of CHF3 and O2 increase the density of reactive species, leading to a faster etch rate.\n2. Stable Plasma: The addition of Ar at 10 sccm helps maintain a stable plasma, which is crucial for consistent etching.\n3. Improved Volatility: The higher O2 flow rate enhances the volatility of etch products, improving overall etch efficiency.\n\nCons:\n1. Physical Damage: The high ICP power and RF power can lead to more physical damage to the PR mask and underlying layers due to increased ion bombardment.\n2. Less Anisotropic Profiles: Higher RF power may result in less anisotropic etch profiles, which could be problematic for applications requiring precise vertical etching.\n3. Higher Pressure: The higher pressure may reduce the mean free path of ions, potentially affecting the directionality of the etch.', 'recipe_2': 'Parameters:\n- Gases and Flow Rates:\n - CHF3: 20 sccm\n - Ar: 5 sccm\n - O2: 2 sccm\n- ICP Power: 500 W\n- RF Power: 10 W\n- Pressure: 5 mTorr\n- Etch Time: Start with 15 minutes and measure periodically\n\nPros:\n1. High Anisotropy: The lower RF power and lower pressure will help achieve more anisotropic etch profiles, which is essential for applications requiring precise vertical etching.\n2. Reduced Physical Damage: Lower ICP and RF power reduce the risk of physical damage to the PR mask and underlying layers, making this set suitable for delicate structures.\n3. Directional Etching: The lower pressure improves the directionality of the etch by reducing the number of collisions between ions and neutral species.\n\nCons:\n1. Lower Etch Rate: The lower ICP power and reduced flow rates of CHF3 and O2 will result in a slower etch rate, requiring longer etch times to achieve the desired depth.\n2. Plasma Stability: The lower flow rate of Ar may make it more challenging to maintain a stable plasma, which could affect the consistency of the etch process.\n3. Process Control: The lower pressure and power settings require more precise control of the process parameters to maintain stability and achieve the desired etch profile.', 'agent_advice': '- Etch Rate and Uniformity: Regularly measure the etch depth to ensure uniformity across the wafer. Adjust the etch time accordingly.\n- End-Point Detection: Utilize optical emission spectroscopy (OES) or interferometry if available on the Plasmalab System 100 to accurately determine the end-point of the etch process.\n- Safety Procedures: Always follow safety protocols when handling gases and operating the ICP RIE system. Confirm with the facility manager that the chosen recipe is compatible with the equipment.\n\nBy starting with these recipes and making necessary adjustments based on periodic measurements and observations, you should be able to achieve the desired etch depth and profile for your SiO2 pattern.\n```'} + """ + + +@app.post("/data") +async def post_data(data: dict): + question = data.get("question") + if not question: + return {"error": "No question provided"}, 400 + + try: + parsed_answer = solve_semiconductor_question(question) + except ValueError: + logger.exception("Value error") + return DEFAULT_ANSWER + except RuntimeError: + logger.exception("Runtime error") + return DEFAULT_ANSWER + return parsed_answer diff --git a/examples/semiconductor/semiconductor-ui/api/poetry.lock b/examples/semiconductor/semiconductor-ui/api/poetry.lock new file mode 100644 index 000000000..75028bc80 --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/api/poetry.lock @@ -0,0 +1,4233 @@ +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. + +[[package]] +name = "adlfs" +version = "2024.7.0" +description = "Access Azure Datalake Gen1 with fsspec and dask" +optional = false +python-versions = ">=3.8" +files = [ + {file = "adlfs-2024.7.0-py3-none-any.whl", hash = "sha256:2005c8e124fda3948f2a6abb2dbebb2c936d2d821acaca6afd61932edfa9bc07"}, + {file = "adlfs-2024.7.0.tar.gz", hash = "sha256:106995b91f0eb5e775bcd5957d180d9a14faef3271a063b1f65c66fd5ab05ddf"}, +] + +[package.dependencies] +aiohttp = ">=3.7.0" +azure-core = ">=1.23.1,<2.0.0" +azure-datalake-store = ">=0.0.46,<0.1" +azure-identity = "*" +azure-storage-blob = ">=12.12.0" +fsspec = ">=2023.12.0" + +[package.extras] +docs = ["furo", "myst-parser", "numpydoc", "sphinx"] +tests = ["arrow", "dask[dataframe]", "docker", "pytest", "pytest-mock"] + +[[package]] +name = "aiobotocore" +version = "2.13.1" +description = "Async client for aws services using botocore and aiohttp" +optional = false +python-versions = ">=3.8" +files = [ + {file = "aiobotocore-2.13.1-py3-none-any.whl", hash = "sha256:1bef121b99841ee3cc788e4ed97c332ba32353b1f00e886d1beb3aae95520858"}, + {file = "aiobotocore-2.13.1.tar.gz", hash = "sha256:134f9606c2f91abde38cbc61c3241113e26ff244633e0c31abb7e09da3581c9b"}, +] + +[package.dependencies] +aiohttp = ">=3.9.2,<4.0.0" +aioitertools = ">=0.5.1,<1.0.0" +botocore = ">=1.34.70,<1.34.132" +wrapt = ">=1.10.10,<2.0.0" + +[package.extras] +awscli = ["awscli (>=1.32.70,<1.33.14)"] +boto3 = ["boto3 (>=1.34.70,<1.34.132)"] + +[[package]] +name = "aiohappyeyeballs" +version = "2.3.5" +description = "Happy Eyeballs for asyncio" +optional = false +python-versions = ">=3.8" +files = [ + {file = "aiohappyeyeballs-2.3.5-py3-none-any.whl", hash = "sha256:4d6dea59215537dbc746e93e779caea8178c866856a721c9c660d7a5a7b8be03"}, + {file = "aiohappyeyeballs-2.3.5.tar.gz", hash = "sha256:6fa48b9f1317254f122a07a131a86b71ca6946ca989ce6326fff54a99a920105"}, +] + +[[package]] +name = "aiohttp" +version = "3.10.1" +description = "Async http client/server framework (asyncio)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "aiohttp-3.10.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:47b4c2412960e64d97258f40616efddaebcb34ff664c8a972119ed38fac2a62c"}, + {file = "aiohttp-3.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e7dbf637f87dd315fa1f36aaed8afa929ee2c607454fb7791e74c88a0d94da59"}, + {file = "aiohttp-3.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c8fb76214b5b739ce59e2236a6489d9dc3483649cfd6f563dbf5d8e40dbdd57d"}, + {file = "aiohttp-3.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c577cdcf8f92862363b3d598d971c6a84ed8f0bf824d4cc1ce70c2fb02acb4a"}, + {file = "aiohttp-3.10.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:777e23609899cb230ad2642b4bdf1008890f84968be78de29099a8a86f10b261"}, + {file = "aiohttp-3.10.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b07286a1090483799599a2f72f76ac396993da31f6e08efedb59f40876c144fa"}, + {file = "aiohttp-3.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9db600a86414a9a653e3c1c7f6a2f6a1894ab8f83d11505247bd1b90ad57157"}, + {file = "aiohttp-3.10.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01c3f1eb280008e51965a8d160a108c333136f4a39d46f516c64d2aa2e6a53f2"}, + {file = "aiohttp-3.10.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f5dd109a925fee4c9ac3f6a094900461a2712df41745f5d04782ebcbe6479ccb"}, + {file = "aiohttp-3.10.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:8c81ff4afffef9b1186639506d70ea90888218f5ddfff03870e74ec80bb59970"}, + {file = "aiohttp-3.10.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:2a384dfbe8bfebd203b778a30a712886d147c61943675f4719b56725a8bbe803"}, + {file = "aiohttp-3.10.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:b9fb6508893dc31cfcbb8191ef35abd79751db1d6871b3e2caee83959b4d91eb"}, + {file = "aiohttp-3.10.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:88596384c3bec644a96ae46287bb646d6a23fa6014afe3799156aef42669c6bd"}, + {file = "aiohttp-3.10.1-cp310-cp310-win32.whl", hash = "sha256:68164d43c580c2e8bf8e0eb4960142919d304052ccab92be10250a3a33b53268"}, + {file = "aiohttp-3.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:d6bbe2c90c10382ca96df33b56e2060404a4f0f88673e1e84b44c8952517e5f3"}, + {file = "aiohttp-3.10.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f6979b4f20d3e557a867da9d9227de4c156fcdcb348a5848e3e6190fd7feb972"}, + {file = "aiohttp-3.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:03c0c380c83f8a8d4416224aafb88d378376d6f4cadebb56b060688251055cd4"}, + {file = "aiohttp-3.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1c2b104e81b3c3deba7e6f5bc1a9a0e9161c380530479970766a6655b8b77c7c"}, + {file = "aiohttp-3.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b023b68c61ab0cd48bd38416b421464a62c381e32b9dc7b4bdfa2905807452a4"}, + {file = "aiohttp-3.10.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a07c76a82390506ca0eabf57c0540cf5a60c993c442928fe4928472c4c6e5e6"}, + {file = "aiohttp-3.10.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:41d8dab8c64ded1edf117d2a64f353efa096c52b853ef461aebd49abae979f16"}, + {file = "aiohttp-3.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:615348fab1a9ef7d0960a905e83ad39051ae9cb0d2837da739b5d3a7671e497a"}, + {file = "aiohttp-3.10.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:256ee6044214ee9d66d531bb374f065ee94e60667d6bbeaa25ca111fc3997158"}, + {file = "aiohttp-3.10.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b7d5bb926805022508b7ddeaad957f1fce7a8d77532068d7bdb431056dc630cd"}, + {file = "aiohttp-3.10.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:028faf71b338f069077af6315ad54281612705d68889f5d914318cbc2aab0d50"}, + {file = "aiohttp-3.10.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:5c12310d153b27aa630750be44e79313acc4e864c421eb7d2bc6fa3429c41bf8"}, + {file = "aiohttp-3.10.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:de1a91d5faded9054957ed0a9e01b9d632109341942fc123947ced358c5d9009"}, + {file = "aiohttp-3.10.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9c186b270979fb1dee3ababe2d12fb243ed7da08b30abc83ebac3a928a4ddb15"}, + {file = "aiohttp-3.10.1-cp311-cp311-win32.whl", hash = "sha256:4a9ce70f5e00380377aac0e568abd075266ff992be2e271765f7b35d228a990c"}, + {file = "aiohttp-3.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:a77c79bac8d908d839d32c212aef2354d2246eb9deb3e2cb01ffa83fb7a6ea5d"}, + {file = "aiohttp-3.10.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:2212296cdb63b092e295c3e4b4b442e7b7eb41e8a30d0f53c16d5962efed395d"}, + {file = "aiohttp-3.10.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4dcb127ca3eb0a61205818a606393cbb60d93b7afb9accd2fd1e9081cc533144"}, + {file = "aiohttp-3.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb8b79a65332e1a426ccb6290ce0409e1dc16b4daac1cc5761e059127fa3d134"}, + {file = "aiohttp-3.10.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68cc24f707ed9cb961f6ee04020ca01de2c89b2811f3cf3361dc7c96a14bfbcc"}, + {file = "aiohttp-3.10.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cb54f5725b4b37af12edf6c9e834df59258c82c15a244daa521a065fbb11717"}, + {file = "aiohttp-3.10.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:51d03e948e53b3639ce4d438f3d1d8202898ec6655cadcc09ec99229d4adc2a9"}, + {file = "aiohttp-3.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:786299d719eb5d868f161aeec56d589396b053925b7e0ce36e983d30d0a3e55c"}, + {file = "aiohttp-3.10.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abda4009a30d51d3f06f36bc7411a62b3e647fa6cc935ef667e3e3d3a7dd09b1"}, + {file = "aiohttp-3.10.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:67f7639424c313125213954e93a6229d3a1d386855d70c292a12628f600c7150"}, + {file = "aiohttp-3.10.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:8e5a26d7aac4c0d8414a347da162696eea0629fdce939ada6aedf951abb1d745"}, + {file = "aiohttp-3.10.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:120548d89f14b76a041088b582454d89389370632ee12bf39d919cc5c561d1ca"}, + {file = "aiohttp-3.10.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f5293726943bdcea24715b121d8c4ae12581441d22623b0e6ab12d07ce85f9c4"}, + {file = "aiohttp-3.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1f8605e573ed6c44ec689d94544b2c4bb1390aaa723a8b5a2cc0a5a485987a68"}, + {file = "aiohttp-3.10.1-cp312-cp312-win32.whl", hash = "sha256:e7168782621be4448d90169a60c8b37e9b0926b3b79b6097bc180c0a8a119e73"}, + {file = "aiohttp-3.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:8fbf8c0ded367c5c8eaf585f85ca8dd85ff4d5b73fb8fe1e6ac9e1b5e62e11f7"}, + {file = "aiohttp-3.10.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:54b7f4a20d7cc6bfa4438abbde069d417bb7a119f870975f78a2b99890226d55"}, + {file = "aiohttp-3.10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2fa643ca990323db68911b92f3f7a0ca9ae300ae340d0235de87c523601e58d9"}, + {file = "aiohttp-3.10.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d8311d0d690487359fe2247ec5d2cac9946e70d50dced8c01ce9e72341c21151"}, + {file = "aiohttp-3.10.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:222821c60b8f6a64c5908cb43d69c0ee978a1188f6a8433d4757d39231b42cdb"}, + {file = "aiohttp-3.10.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7b55d9ede66af7feb6de87ff277e0ccf6d51c7db74cc39337fe3a0e31b5872d"}, + {file = "aiohttp-3.10.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a95151a5567b3b00368e99e9c5334a919514f60888a6b6d2054fea5e66e527e"}, + {file = "aiohttp-3.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e9e9171d2fe6bfd9d3838a6fe63b1e91b55e0bf726c16edf265536e4eafed19"}, + {file = "aiohttp-3.10.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a57e73f9523e980f6101dc9a83adcd7ac0006ea8bf7937ca3870391c7bb4f8ff"}, + {file = "aiohttp-3.10.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:0df51a3d70a2bfbb9c921619f68d6d02591f24f10e9c76de6f3388c89ed01de6"}, + {file = "aiohttp-3.10.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:b0de63ff0307eac3961b4af74382d30220d4813f36b7aaaf57f063a1243b4214"}, + {file = "aiohttp-3.10.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:8db9b749f589b5af8e4993623dbda6716b2b7a5fcb0fa2277bf3ce4b278c7059"}, + {file = "aiohttp-3.10.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:6b14c19172eb53b63931d3e62a9749d6519f7c121149493e6eefca055fcdb352"}, + {file = "aiohttp-3.10.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5cd57ad998e3038aa87c38fe85c99ed728001bf5dde8eca121cadee06ee3f637"}, + {file = "aiohttp-3.10.1-cp38-cp38-win32.whl", hash = "sha256:df31641e3f02b77eb3c5fb63c0508bee0fc067cf153da0e002ebbb0db0b6d91a"}, + {file = "aiohttp-3.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:93094eba50bc2ad4c40ff4997ead1fdcd41536116f2e7d6cfec9596a8ecb3615"}, + {file = "aiohttp-3.10.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:440954ddc6b77257e67170d57b1026aa9545275c33312357472504eef7b4cc0b"}, + {file = "aiohttp-3.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f9f8beed277488a52ee2b459b23c4135e54d6a819eaba2e120e57311015b58e9"}, + {file = "aiohttp-3.10.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d8a8221a63602008550022aa3a4152ca357e1dde7ab3dd1da7e1925050b56863"}, + {file = "aiohttp-3.10.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a702bd3663b5cbf3916e84bf332400d24cdb18399f0877ca6b313ce6c08bfb43"}, + {file = "aiohttp-3.10.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1988b370536eb14f0ce7f3a4a5b422ab64c4e255b3f5d7752c5f583dc8c967fc"}, + {file = "aiohttp-3.10.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7ccf1f0a304352c891d124ac1a9dea59b14b2abed1704aaa7689fc90ef9c5be1"}, + {file = "aiohttp-3.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc3ea6ef2a83edad84bbdb5d96e22f587b67c68922cd7b6f9d8f24865e655bcf"}, + {file = "aiohttp-3.10.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89b47c125ab07f0831803b88aeb12b04c564d5f07a1c1a225d4eb4d2f26e8b5e"}, + {file = "aiohttp-3.10.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:21778552ef3d44aac3278cc6f6d13a6423504fa5f09f2df34bfe489ed9ded7f5"}, + {file = "aiohttp-3.10.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:bde0693073fd5e542e46ea100aa6c1a5d36282dbdbad85b1c3365d5421490a92"}, + {file = "aiohttp-3.10.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:bf66149bb348d8e713f3a8e0b4f5b952094c2948c408e1cfef03b49e86745d60"}, + {file = "aiohttp-3.10.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:587237571a85716d6f71f60d103416c9df7d5acb55d96d3d3ced65f39bff9c0c"}, + {file = "aiohttp-3.10.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:bfe33cba6e127d0b5b417623c9aa621f0a69f304742acdca929a9fdab4593693"}, + {file = "aiohttp-3.10.1-cp39-cp39-win32.whl", hash = "sha256:9fbff00646cf8211b330690eb2fd64b23e1ce5b63a342436c1d1d6951d53d8dd"}, + {file = "aiohttp-3.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:5951c328f9ac42d7bce7a6ded535879bc9ae13032818d036749631fa27777905"}, + {file = "aiohttp-3.10.1.tar.gz", hash = "sha256:8b0d058e4e425d3b45e8ec70d49b402f4d6b21041e674798b1f91ba027c73f28"}, +] + +[package.dependencies] +aiohappyeyeballs = ">=2.3.0" +aiosignal = ">=1.1.2" +attrs = ">=17.3.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] + +[[package]] +name = "aioitertools" +version = "0.11.0" +description = "itertools and builtins for AsyncIO and mixed iterables" +optional = false +python-versions = ">=3.6" +files = [ + {file = "aioitertools-0.11.0-py3-none-any.whl", hash = "sha256:04b95e3dab25b449def24d7df809411c10e62aab0cbe31a50ca4e68748c43394"}, + {file = "aioitertools-0.11.0.tar.gz", hash = "sha256:42c68b8dd3a69c2bf7f2233bf7df4bb58b557bca5252ac02ed5187bbc67d6831"}, +] + +[[package]] +name = "aiosignal" +version = "1.3.1" +description = "aiosignal: a list of registered asynchronous callbacks" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] + +[package.dependencies] +frozenlist = ">=1.1.0" + +[[package]] +name = "annotated-types" +version = "0.7.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +files = [ + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, +] + +[[package]] +name = "anyio" +version = "4.4.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.8" +files = [ + {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, + {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, +] + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.23)"] + +[[package]] +name = "attrs" +version = "24.2.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, + {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, +] + +[package.extras] +benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] + +[[package]] +name = "azure-core" +version = "1.30.2" +description = "Microsoft Azure Core Library for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "azure-core-1.30.2.tar.gz", hash = "sha256:a14dc210efcd608821aa472d9fb8e8d035d29b68993819147bc290a8ac224472"}, + {file = "azure_core-1.30.2-py3-none-any.whl", hash = "sha256:cf019c1ca832e96274ae85abd3d9f752397194d9fea3b41487290562ac8abe4a"}, +] + +[package.dependencies] +requests = ">=2.21.0" +six = ">=1.11.0" +typing-extensions = ">=4.6.0" + +[package.extras] +aio = ["aiohttp (>=3.0)"] + +[[package]] +name = "azure-datalake-store" +version = "0.0.53" +description = "Azure Data Lake Store Filesystem Client Library for Python" +optional = false +python-versions = "*" +files = [ + {file = "azure-datalake-store-0.0.53.tar.gz", hash = "sha256:05b6de62ee3f2a0a6e6941e6933b792b800c3e7f6ffce2fc324bc19875757393"}, + {file = "azure_datalake_store-0.0.53-py2.py3-none-any.whl", hash = "sha256:a30c902a6e360aa47d7f69f086b426729784e71c536f330b691647a51dc42b2b"}, +] + +[package.dependencies] +cffi = "*" +msal = ">=1.16.0,<2" +requests = ">=2.20.0" + +[[package]] +name = "azure-identity" +version = "1.17.1" +description = "Microsoft Azure Identity Library for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "azure-identity-1.17.1.tar.gz", hash = "sha256:32ecc67cc73f4bd0595e4f64b1ca65cd05186f4fe6f98ed2ae9f1aa32646efea"}, + {file = "azure_identity-1.17.1-py3-none-any.whl", hash = "sha256:db8d59c183b680e763722bfe8ebc45930e6c57df510620985939f7f3191e0382"}, +] + +[package.dependencies] +azure-core = ">=1.23.0" +cryptography = ">=2.5" +msal = ">=1.24.0" +msal-extensions = ">=0.3.0" +typing-extensions = ">=4.0.0" + +[[package]] +name = "azure-storage-blob" +version = "12.22.0" +description = "Microsoft Azure Blob Storage Client Library for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "azure-storage-blob-12.22.0.tar.gz", hash = "sha256:b3804bb4fe8ab1c32771fa464053da772a682c2737b19da438a3f4e5e3b3736e"}, + {file = "azure_storage_blob-12.22.0-py3-none-any.whl", hash = "sha256:bb7d2d824ce3f11f14a27ee7d9281289f7e072ac8311c52e3652672455b7d5e8"}, +] + +[package.dependencies] +azure-core = ">=1.28.0" +cryptography = ">=2.1.4" +isodate = ">=0.6.1" +typing-extensions = ">=4.6.0" + +[package.extras] +aio = ["azure-core[aio] (>=1.28.0)"] + +[[package]] +name = "beautifulsoup4" +version = "4.12.3" +description = "Screen-scraping library" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, + {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, +] + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "botocore" +version = "1.34.131" +description = "Low-level, data-driven core of boto 3." +optional = false +python-versions = ">=3.8" +files = [ + {file = "botocore-1.34.131-py3-none-any.whl", hash = "sha256:13b011d7b206ce00727dcee26548fa3b550db9046d5a0e90ac25a6e6c8fde6ef"}, + {file = "botocore-1.34.131.tar.gz", hash = "sha256:502ddafe1d627fcf1e4c007c86454e5dd011dba7c58bd8e8a5368a79f3e387dc"}, +] + +[package.dependencies] +jmespath = ">=0.7.1,<2.0.0" +python-dateutil = ">=2.1,<3.0.0" +urllib3 = {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""} + +[package.extras] +crt = ["awscrt (==0.20.11)"] + +[[package]] +name = "cachetools" +version = "5.4.0" +description = "Extensible memoizing collections and decorators" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cachetools-5.4.0-py3-none-any.whl", hash = "sha256:3ae3b49a3d5e28a77a0be2b37dbcb89005058959cb2323858c2657c4a8cab474"}, + {file = "cachetools-5.4.0.tar.gz", hash = "sha256:b8adc2e7c07f105ced7bc56dbb6dfbe7c4a00acce20e2227b3f355be89bc6827"}, +] + +[[package]] +name = "certifi" +version = "2024.7.4" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, + {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, +] + +[[package]] +name = "cffi" +version = "1.17.0" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cffi-1.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f9338cc05451f1942d0d8203ec2c346c830f8e86469903d5126c1f0a13a2bcbb"}, + {file = "cffi-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0ce71725cacc9ebf839630772b07eeec220cbb5f03be1399e0457a1464f8e1a"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c815270206f983309915a6844fe994b2fa47e5d05c4c4cef267c3b30e34dbe42"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6bdcd415ba87846fd317bee0774e412e8792832e7805938987e4ede1d13046d"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a98748ed1a1df4ee1d6f927e151ed6c1a09d5ec21684de879c7ea6aa96f58f2"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a048d4f6630113e54bb4b77e315e1ba32a5a31512c31a273807d0027a7e69ab"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24aa705a5f5bd3a8bcfa4d123f03413de5d86e497435693b638cbffb7d5d8a1b"}, + {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:856bf0924d24e7f93b8aee12a3a1095c34085600aa805693fb7f5d1962393206"}, + {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:4304d4416ff032ed50ad6bb87416d802e67139e31c0bde4628f36a47a3164bfa"}, + {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:331ad15c39c9fe9186ceaf87203a9ecf5ae0ba2538c9e898e3a6967e8ad3db6f"}, + {file = "cffi-1.17.0-cp310-cp310-win32.whl", hash = "sha256:669b29a9eca6146465cc574659058ed949748f0809a2582d1f1a324eb91054dc"}, + {file = "cffi-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:48b389b1fd5144603d61d752afd7167dfd205973a43151ae5045b35793232aa2"}, + {file = "cffi-1.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5d97162c196ce54af6700949ddf9409e9833ef1003b4741c2b39ef46f1d9720"}, + {file = "cffi-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ba5c243f4004c750836f81606a9fcb7841f8874ad8f3bf204ff5e56332b72b9"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bb9333f58fc3a2296fb1d54576138d4cf5d496a2cc118422bd77835e6ae0b9cb"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:435a22d00ec7d7ea533db494da8581b05977f9c37338c80bc86314bec2619424"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1df34588123fcc88c872f5acb6f74ae59e9d182a2707097f9e28275ec26a12d"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df8bb0010fdd0a743b7542589223a2816bdde4d94bb5ad67884348fa2c1c67e8"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8b5b9712783415695663bd463990e2f00c6750562e6ad1d28e072a611c5f2a6"}, + {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ffef8fd58a36fb5f1196919638f73dd3ae0db1a878982b27a9a5a176ede4ba91"}, + {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e67d26532bfd8b7f7c05d5a766d6f437b362c1bf203a3a5ce3593a645e870b8"}, + {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45f7cd36186db767d803b1473b3c659d57a23b5fa491ad83c6d40f2af58e4dbb"}, + {file = "cffi-1.17.0-cp311-cp311-win32.whl", hash = "sha256:a9015f5b8af1bb6837a3fcb0cdf3b874fe3385ff6274e8b7925d81ccaec3c5c9"}, + {file = "cffi-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:b50aaac7d05c2c26dfd50c3321199f019ba76bb650e346a6ef3616306eed67b0"}, + {file = "cffi-1.17.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aec510255ce690d240f7cb23d7114f6b351c733a74c279a84def763660a2c3bc"}, + {file = "cffi-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2770bb0d5e3cc0e31e7318db06efcbcdb7b31bcb1a70086d3177692a02256f59"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db9a30ec064129d605d0f1aedc93e00894b9334ec74ba9c6bdd08147434b33eb"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a47eef975d2b8b721775a0fa286f50eab535b9d56c70a6e62842134cf7841195"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f3e0992f23bbb0be00a921eae5363329253c3b86287db27092461c887b791e5e"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6107e445faf057c118d5050560695e46d272e5301feffda3c41849641222a828"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb862356ee9391dc5a0b3cbc00f416b48c1b9a52d252d898e5b7696a5f9fe150"}, + {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c1c13185b90bbd3f8b5963cd8ce7ad4ff441924c31e23c975cb150e27c2bf67a"}, + {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:17c6d6d3260c7f2d94f657e6872591fe8733872a86ed1345bda872cfc8c74885"}, + {file = "cffi-1.17.0-cp312-cp312-win32.whl", hash = "sha256:c3b8bd3133cd50f6b637bb4322822c94c5ce4bf0d724ed5ae70afce62187c492"}, + {file = "cffi-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:dca802c8db0720ce1c49cce1149ff7b06e91ba15fa84b1d59144fef1a1bc7ac2"}, + {file = "cffi-1.17.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6ce01337d23884b21c03869d2f68c5523d43174d4fc405490eb0091057943118"}, + {file = "cffi-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cab2eba3830bf4f6d91e2d6718e0e1c14a2f5ad1af68a89d24ace0c6b17cced7"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14b9cbc8f7ac98a739558eb86fabc283d4d564dafed50216e7f7ee62d0d25377"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b00e7bcd71caa0282cbe3c90966f738e2db91e64092a877c3ff7f19a1628fdcb"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41f4915e09218744d8bae14759f983e466ab69b178de38066f7579892ff2a555"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4760a68cab57bfaa628938e9c2971137e05ce48e762a9cb53b76c9b569f1204"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:011aff3524d578a9412c8b3cfaa50f2c0bd78e03eb7af7aa5e0df59b158efb2f"}, + {file = "cffi-1.17.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:a003ac9edc22d99ae1286b0875c460351f4e101f8c9d9d2576e78d7e048f64e0"}, + {file = "cffi-1.17.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ef9528915df81b8f4c7612b19b8628214c65c9b7f74db2e34a646a0a2a0da2d4"}, + {file = "cffi-1.17.0-cp313-cp313-win32.whl", hash = "sha256:70d2aa9fb00cf52034feac4b913181a6e10356019b18ef89bc7c12a283bf5f5a"}, + {file = "cffi-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:b7b6ea9e36d32582cda3465f54c4b454f62f23cb083ebc7a94e2ca6ef011c3a7"}, + {file = "cffi-1.17.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:964823b2fc77b55355999ade496c54dde161c621cb1f6eac61dc30ed1b63cd4c"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:516a405f174fd3b88829eabfe4bb296ac602d6a0f68e0d64d5ac9456194a5b7e"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dec6b307ce928e8e112a6bb9921a1cb00a0e14979bf28b98e084a4b8a742bd9b"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4094c7b464cf0a858e75cd14b03509e84789abf7b79f8537e6a72152109c76e"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2404f3de742f47cb62d023f0ba7c5a916c9c653d5b368cc966382ae4e57da401"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3aa9d43b02a0c681f0bfbc12d476d47b2b2b6a3f9287f11ee42989a268a1833c"}, + {file = "cffi-1.17.0-cp38-cp38-win32.whl", hash = "sha256:0bb15e7acf8ab35ca8b24b90af52c8b391690ef5c4aec3d31f38f0d37d2cc499"}, + {file = "cffi-1.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:93a7350f6706b31f457c1457d3a3259ff9071a66f312ae64dc024f049055f72c"}, + {file = "cffi-1.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a2ddbac59dc3716bc79f27906c010406155031a1c801410f1bafff17ea304d2"}, + {file = "cffi-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6327b572f5770293fc062a7ec04160e89741e8552bf1c358d1a23eba68166759"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbc183e7bef690c9abe5ea67b7b60fdbca81aa8da43468287dae7b5c046107d4"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bdc0f1f610d067c70aa3737ed06e2726fd9d6f7bfee4a351f4c40b6831f4e82"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6d872186c1617d143969defeadac5a904e6e374183e07977eedef9c07c8953bf"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d46ee4764b88b91f16661a8befc6bfb24806d885e27436fdc292ed7e6f6d058"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f76a90c345796c01d85e6332e81cab6d70de83b829cf1d9762d0a3da59c7932"}, + {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0e60821d312f99d3e1569202518dddf10ae547e799d75aef3bca3a2d9e8ee693"}, + {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:eb09b82377233b902d4c3fbeeb7ad731cdab579c6c6fda1f763cd779139e47c3"}, + {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:24658baf6224d8f280e827f0a50c46ad819ec8ba380a42448e24459daf809cf4"}, + {file = "cffi-1.17.0-cp39-cp39-win32.whl", hash = "sha256:0fdacad9e0d9fc23e519efd5ea24a70348305e8d7d85ecbb1a5fa66dc834e7fb"}, + {file = "cffi-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:7cbc78dc018596315d4e7841c8c3a7ae31cc4d638c9b627f87d52e8abaaf2d29"}, + {file = "cffi-1.17.0.tar.gz", hash = "sha256:f3157624b7558b914cb039fd1af735e5e8049a87c817cc215109ad1c8779df76"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.3.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] + +[[package]] +name = "chromedriver-autoinstaller" +version = "0.6.4" +description = "Automatically install chromedriver that supports the currently installed version of chrome." +optional = false +python-versions = ">=3.6" +files = [ + {file = "chromedriver-autoinstaller-0.6.4.tar.gz", hash = "sha256:1b4df04b87e6107c730085b98e5fd541db3d1777c32b8bd08e2ca4b1244050af"}, + {file = "chromedriver_autoinstaller-0.6.4-py3-none-any.whl", hash = "sha256:b12ed187ca9fac4d744deb588d221222ed50836384607e5303e6eab98bb9dc64"}, +] + +[package.dependencies] +packaging = ">=23.1" + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "cryptography" +version = "43.0.0" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = false +python-versions = ">=3.7" +files = [ + {file = "cryptography-43.0.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:64c3f16e2a4fc51c0d06af28441881f98c5d91009b8caaff40cf3548089e9c74"}, + {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3dcdedae5c7710b9f97ac6bba7e1052b95c7083c9d0e9df96e02a1932e777895"}, + {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d9a1eca329405219b605fac09ecfc09ac09e595d6def650a437523fcd08dd22"}, + {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ea9e57f8ea880eeea38ab5abf9fbe39f923544d7884228ec67d666abd60f5a47"}, + {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9a8d6802e0825767476f62aafed40532bd435e8a5f7d23bd8b4f5fd04cc80ecf"}, + {file = "cryptography-43.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:cc70b4b581f28d0a254d006f26949245e3657d40d8857066c2ae22a61222ef55"}, + {file = "cryptography-43.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4a997df8c1c2aae1e1e5ac49c2e4f610ad037fc5a3aadc7b64e39dea42249431"}, + {file = "cryptography-43.0.0-cp37-abi3-win32.whl", hash = "sha256:6e2b11c55d260d03a8cf29ac9b5e0608d35f08077d8c087be96287f43af3ccdc"}, + {file = "cryptography-43.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:31e44a986ceccec3d0498e16f3d27b2ee5fdf69ce2ab89b52eaad1d2f33d8778"}, + {file = "cryptography-43.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:7b3f5fe74a5ca32d4d0f302ffe6680fcc5c28f8ef0dc0ae8f40c0f3a1b4fca66"}, + {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac1955ce000cb29ab40def14fd1bbfa7af2017cca696ee696925615cafd0dce5"}, + {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:299d3da8e00b7e2b54bb02ef58d73cd5f55fb31f33ebbf33bd00d9aa6807df7e"}, + {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ee0c405832ade84d4de74b9029bedb7b31200600fa524d218fc29bfa371e97f5"}, + {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cb013933d4c127349b3948aa8aaf2f12c0353ad0eccd715ca789c8a0f671646f"}, + {file = "cryptography-43.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fdcb265de28585de5b859ae13e3846a8e805268a823a12a4da2597f1f5afc9f0"}, + {file = "cryptography-43.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2905ccf93a8a2a416f3ec01b1a7911c3fe4073ef35640e7ee5296754e30b762b"}, + {file = "cryptography-43.0.0-cp39-abi3-win32.whl", hash = "sha256:47ca71115e545954e6c1d207dd13461ab81f4eccfcb1345eac874828b5e3eaaf"}, + {file = "cryptography-43.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:0663585d02f76929792470451a5ba64424acc3cd5227b03921dab0e2f27b1709"}, + {file = "cryptography-43.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2c6d112bf61c5ef44042c253e4859b3cbbb50df2f78fa8fae6747a7814484a70"}, + {file = "cryptography-43.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:844b6d608374e7d08f4f6e6f9f7b951f9256db41421917dfb2d003dde4cd6b66"}, + {file = "cryptography-43.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:51956cf8730665e2bdf8ddb8da0056f699c1a5715648c1b0144670c1ba00b48f"}, + {file = "cryptography-43.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:aae4d918f6b180a8ab8bf6511a419473d107df4dbb4225c7b48c5c9602c38c7f"}, + {file = "cryptography-43.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:232ce02943a579095a339ac4b390fbbe97f5b5d5d107f8a08260ea2768be8cc2"}, + {file = "cryptography-43.0.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5bcb8a5620008a8034d39bce21dc3e23735dfdb6a33a06974739bfa04f853947"}, + {file = "cryptography-43.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:08a24a7070b2b6804c1940ff0f910ff728932a9d0e80e7814234269f9d46d069"}, + {file = "cryptography-43.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e9c5266c432a1e23738d178e51c2c7a5e2ddf790f248be939448c0ba2021f9d1"}, + {file = "cryptography-43.0.0.tar.gz", hash = "sha256:b88075ada2d51aa9f18283532c9f60e72170041bba88d7f37e49cbb10275299e"}, +] + +[package.dependencies] +cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] +nox = ["nox"] +pep8test = ["check-sdist", "click", "mypy", "ruff"] +sdist = ["build"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["certifi", "cryptography-vectors (==43.0.0)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] + +[[package]] +name = "cssselect" +version = "1.2.0" +description = "cssselect parses CSS3 Selectors and translates them to XPath 1.0" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cssselect-1.2.0-py2.py3-none-any.whl", hash = "sha256:da1885f0c10b60c03ed5eccbb6b68d6eff248d91976fcde348f395d54c9fd35e"}, + {file = "cssselect-1.2.0.tar.gz", hash = "sha256:666b19839cfaddb9ce9d36bfe4c969132c647b92fc9088c4e23f786b30f1b3dc"}, +] + +[[package]] +name = "dataclasses-json" +version = "0.6.7" +description = "Easily serialize dataclasses to and from JSON." +optional = false +python-versions = "<4.0,>=3.7" +files = [ + {file = "dataclasses_json-0.6.7-py3-none-any.whl", hash = "sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a"}, + {file = "dataclasses_json-0.6.7.tar.gz", hash = "sha256:b6b3e528266ea45b9535223bc53ca645f5208833c29229e847b3f26a1cc55fc0"}, +] + +[package.dependencies] +marshmallow = ">=3.18.0,<4.0.0" +typing-inspect = ">=0.4.0,<1" + +[[package]] +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +optional = false +python-versions = ">=3.5" +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] + +[[package]] +name = "deprecated" +version = "1.2.14" +description = "Python @deprecated decorator to deprecate old python classes, functions or methods." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "Deprecated-1.2.14-py2.py3-none-any.whl", hash = "sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c"}, + {file = "Deprecated-1.2.14.tar.gz", hash = "sha256:e5323eb936458dccc2582dc6f9c322c852a775a27065ff2b0c4970b9d53d01b3"}, +] + +[package.dependencies] +wrapt = ">=1.10,<2" + +[package.extras] +dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"] + +[[package]] +name = "dirtyjson" +version = "1.0.8" +description = "JSON decoder for Python that can extract data from the muck" +optional = false +python-versions = "*" +files = [ + {file = "dirtyjson-1.0.8-py3-none-any.whl", hash = "sha256:125e27248435a58acace26d5c2c4c11a1c0de0a9c5124c5a94ba78e517d74f53"}, + {file = "dirtyjson-1.0.8.tar.gz", hash = "sha256:90ca4a18f3ff30ce849d100dcf4a003953c79d3a2348ef056f1d9c22231a25fd"}, +] + +[[package]] +name = "distro" +version = "1.9.0" +description = "Distro - an OS platform information API" +optional = false +python-versions = ">=3.6" +files = [ + {file = "distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2"}, + {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, +] + +[[package]] +name = "docx2txt" +version = "0.8" +description = "A pure python-based utility to extract text and images from docx files." +optional = false +python-versions = "*" +files = [ + {file = "docx2txt-0.8.tar.gz", hash = "sha256:2c06d98d7cfe2d3947e5760a57d924e3ff07745b379c8737723922e7009236e5"}, +] + +[[package]] +name = "fastapi" +version = "0.112.0" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fastapi-0.112.0-py3-none-any.whl", hash = "sha256:3487ded9778006a45834b8c816ec4a48d522e2631ca9e75ec5a774f1b052f821"}, + {file = "fastapi-0.112.0.tar.gz", hash = "sha256:d262bc56b7d101d1f4e8fc0ad2ac75bb9935fec504d2b7117686cec50710cf05"}, +] + +[package.dependencies] +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" +starlette = ">=0.37.2,<0.38.0" +typing-extensions = ">=4.8.0" + +[package.extras] +all = ["email_validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] +standard = ["email_validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "jinja2 (>=2.11.2)", "python-multipart (>=0.0.7)", "uvicorn[standard] (>=0.12.0)"] + +[[package]] +name = "feedfinder2" +version = "0.0.4" +description = "Find the feed URLs for a website." +optional = false +python-versions = "*" +files = [ + {file = "feedfinder2-0.0.4.tar.gz", hash = "sha256:3701ee01a6c85f8b865a049c30ba0b4608858c803fe8e30d1d289fdbe89d0efe"}, +] + +[package.dependencies] +beautifulsoup4 = "*" +requests = "*" +six = "*" + +[[package]] +name = "feedparser" +version = "6.0.11" +description = "Universal feed parser, handles RSS 0.9x, RSS 1.0, RSS 2.0, CDF, Atom 0.3, and Atom 1.0 feeds" +optional = false +python-versions = ">=3.6" +files = [ + {file = "feedparser-6.0.11-py3-none-any.whl", hash = "sha256:0be7ee7b395572b19ebeb1d6aafb0028dee11169f1c934e0ed67d54992f4ad45"}, + {file = "feedparser-6.0.11.tar.gz", hash = "sha256:c9d0407b64c6f2a065d0ebb292c2b35c01050cc0dc33757461aaabdc4c4184d5"}, +] + +[package.dependencies] +sgmllib3k = "*" + +[[package]] +name = "filelock" +version = "3.15.4" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.8" +files = [ + {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, + {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-asyncio (>=0.21)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)", "virtualenv (>=20.26.2)"] +typing = ["typing-extensions (>=4.8)"] + +[[package]] +name = "frozenlist" +version = "1.4.1" +description = "A list-like structure which implements collections.abc.MutableSequence" +optional = false +python-versions = ">=3.8" +files = [ + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, + {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, + {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, + {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, + {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, + {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, + {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, + {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, + {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, + {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, + {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, + {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, + {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, +] + +[[package]] +name = "fsspec" +version = "2024.6.1" +description = "File-system specification" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fsspec-2024.6.1-py3-none-any.whl", hash = "sha256:3cb443f8bcd2efb31295a5b9fdb02aee81d8452c80d28f97a6d0959e6cee101e"}, + {file = "fsspec-2024.6.1.tar.gz", hash = "sha256:fad7d7e209dd4c1208e3bbfda706620e0da5142bebbd9c384afb95b07e798e49"}, +] + +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +dev = ["pre-commit", "ruff"] +doc = ["numpydoc", "sphinx", "sphinx-design", "sphinx-rtd-theme", "yarl"] +dropbox = ["dropbox", "dropboxdrivefs", "requests"] +full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] +fuse = ["fusepy"] +gcs = ["gcsfs"] +git = ["pygit2"] +github = ["requests"] +gs = ["gcsfs"] +gui = ["panel"] +hdfs = ["pyarrow (>=1)"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)"] +libarchive = ["libarchive-c"] +oci = ["ocifs"] +s3 = ["s3fs"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] +test = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "numpy", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "requests"] +test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask-expr", "dask[dataframe,test]", "moto[server] (>4,<5)", "pytest-timeout", "xarray"] +test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard"] +tqdm = ["tqdm"] + +[[package]] +name = "gcsfs" +version = "2024.6.1" +description = "Convenient Filesystem interface over GCS" +optional = false +python-versions = ">=3.8" +files = [ + {file = "gcsfs-2024.6.1-py2.py3-none-any.whl", hash = "sha256:13fd18095425e54e248870594fd155812723966b1bda3b102b3a5c44ec436a03"}, + {file = "gcsfs-2024.6.1.tar.gz", hash = "sha256:e8858c7a893b2265e9bfce2fe270a024a2e348c74c23528801db388fc0224ed7"}, +] + +[package.dependencies] +aiohttp = "<4.0.0a0 || >4.0.0a0,<4.0.0a1 || >4.0.0a1" +decorator = ">4.1.2" +fsspec = "2024.6.1" +google-auth = ">=1.2" +google-auth-oauthlib = "*" +google-cloud-storage = "*" +requests = "*" + +[package.extras] +crc = ["crcmod"] +gcsfuse = ["fusepy"] + +[[package]] +name = "google-api-core" +version = "2.19.1" +description = "Google API client core library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-api-core-2.19.1.tar.gz", hash = "sha256:f4695f1e3650b316a795108a76a1c416e6afb036199d1c1f1f110916df479ffd"}, + {file = "google_api_core-2.19.1-py3-none-any.whl", hash = "sha256:f12a9b8309b5e21d92483bbd47ce2c445861ec7d269ef6784ecc0ea8c1fa6125"}, +] + +[package.dependencies] +google-auth = ">=2.14.1,<3.0.dev0" +googleapis-common-protos = ">=1.56.2,<2.0.dev0" +proto-plus = ">=1.22.3,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" +requests = ">=2.18.0,<3.0.0.dev0" + +[package.extras] +grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0)"] +grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] +grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] + +[[package]] +name = "google-api-python-client" +version = "2.140.0" +description = "Google API Client Library for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google_api_python_client-2.140.0-py2.py3-none-any.whl", hash = "sha256:aeb4bb99e9fdd241473da5ff35464a0658fea0db76fe89c0f8c77ecfc3813404"}, + {file = "google_api_python_client-2.140.0.tar.gz", hash = "sha256:0bb973adccbe66a3d0a70abe4e49b3f2f004d849416bfec38d22b75649d389d8"}, +] + +[package.dependencies] +google-api-core = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0.dev0" +google-auth = ">=1.32.0,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0.dev0" +google-auth-httplib2 = ">=0.2.0,<1.0.0" +httplib2 = ">=0.19.0,<1.dev0" +uritemplate = ">=3.0.1,<5" + +[[package]] +name = "google-auth" +version = "2.33.0" +description = "Google Authentication Library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google_auth-2.33.0-py2.py3-none-any.whl", hash = "sha256:8eff47d0d4a34ab6265c50a106a3362de6a9975bb08998700e389f857e4d39df"}, + {file = "google_auth-2.33.0.tar.gz", hash = "sha256:d6a52342160d7290e334b4d47ba390767e4438ad0d45b7630774533e82655b95"}, +] + +[package.dependencies] +cachetools = ">=2.0.0,<6.0" +pyasn1-modules = ">=0.2.1" +rsa = ">=3.1.4,<5" + +[package.extras] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] +enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] +pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] +reauth = ["pyu2f (>=0.1.5)"] +requests = ["requests (>=2.20.0,<3.0.0.dev0)"] + +[[package]] +name = "google-auth-httplib2" +version = "0.2.0" +description = "Google Authentication Library: httplib2 transport" +optional = false +python-versions = "*" +files = [ + {file = "google-auth-httplib2-0.2.0.tar.gz", hash = "sha256:38aa7badf48f974f1eb9861794e9c0cb2a0511a4ec0679b1f886d108f5640e05"}, + {file = "google_auth_httplib2-0.2.0-py2.py3-none-any.whl", hash = "sha256:b65a0a2123300dd71281a7bf6e64d65a0759287df52729bdd1ae2e47dc311a3d"}, +] + +[package.dependencies] +google-auth = "*" +httplib2 = ">=0.19.0" + +[[package]] +name = "google-auth-oauthlib" +version = "1.2.1" +description = "Google Authentication Library" +optional = false +python-versions = ">=3.6" +files = [ + {file = "google_auth_oauthlib-1.2.1-py2.py3-none-any.whl", hash = "sha256:2d58a27262d55aa1b87678c3ba7142a080098cbc2024f903c62355deb235d91f"}, + {file = "google_auth_oauthlib-1.2.1.tar.gz", hash = "sha256:afd0cad092a2eaa53cd8e8298557d6de1034c6cb4a740500b5357b648af97263"}, +] + +[package.dependencies] +google-auth = ">=2.15.0" +requests-oauthlib = ">=0.7.0" + +[package.extras] +tool = ["click (>=6.0.0)"] + +[[package]] +name = "google-cloud-core" +version = "2.4.1" +description = "Google Cloud API client core library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-cloud-core-2.4.1.tar.gz", hash = "sha256:9b7749272a812bde58fff28868d0c5e2f585b82f37e09a1f6ed2d4d10f134073"}, + {file = "google_cloud_core-2.4.1-py2.py3-none-any.whl", hash = "sha256:a9e6a4422b9ac5c29f79a0ede9485473338e2ce78d91f2370c01e730eab22e61"}, +] + +[package.dependencies] +google-api-core = ">=1.31.6,<2.0.dev0 || >2.3.0,<3.0.0dev" +google-auth = ">=1.25.0,<3.0dev" + +[package.extras] +grpc = ["grpcio (>=1.38.0,<2.0dev)", "grpcio-status (>=1.38.0,<2.0.dev0)"] + +[[package]] +name = "google-cloud-storage" +version = "2.18.1" +description = "Google Cloud Storage API client library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google_cloud_storage-2.18.1-py2.py3-none-any.whl", hash = "sha256:9d8db6bde3a979cca7150511cd0e4cb363e5f69d31259d890ba1124fa109418c"}, + {file = "google_cloud_storage-2.18.1.tar.gz", hash = "sha256:6707a6f30a05aee36faca81296419ca2907ac750af1c0457f278bc9a6fb219ad"}, +] + +[package.dependencies] +google-api-core = ">=2.15.0,<3.0.0dev" +google-auth = ">=2.26.1,<3.0dev" +google-cloud-core = ">=2.3.0,<3.0dev" +google-crc32c = ">=1.0,<2.0dev" +google-resumable-media = ">=2.6.0" +requests = ">=2.18.0,<3.0.0dev" + +[package.extras] +protobuf = ["protobuf (<6.0.0dev)"] +tracing = ["opentelemetry-api (>=1.1.0)"] + +[[package]] +name = "google-crc32c" +version = "1.5.0" +description = "A python wrapper of the C library 'Google CRC32C'" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-crc32c-1.5.0.tar.gz", hash = "sha256:89284716bc6a5a415d4eaa11b1726d2d60a0cd12aadf5439828353662ede9dd7"}, + {file = "google_crc32c-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:596d1f98fc70232fcb6590c439f43b350cb762fb5d61ce7b0e9db4539654cc13"}, + {file = "google_crc32c-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:be82c3c8cfb15b30f36768797a640e800513793d6ae1724aaaafe5bf86f8f346"}, + {file = "google_crc32c-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:461665ff58895f508e2866824a47bdee72497b091c730071f2b7575d5762ab65"}, + {file = "google_crc32c-1.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2096eddb4e7c7bdae4bd69ad364e55e07b8316653234a56552d9c988bd2d61b"}, + {file = "google_crc32c-1.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:116a7c3c616dd14a3de8c64a965828b197e5f2d121fedd2f8c5585c547e87b02"}, + {file = "google_crc32c-1.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5829b792bf5822fd0a6f6eb34c5f81dd074f01d570ed7f36aa101d6fc7a0a6e4"}, + {file = "google_crc32c-1.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:64e52e2b3970bd891309c113b54cf0e4384762c934d5ae56e283f9a0afcd953e"}, + {file = "google_crc32c-1.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:02ebb8bf46c13e36998aeaad1de9b48f4caf545e91d14041270d9dca767b780c"}, + {file = "google_crc32c-1.5.0-cp310-cp310-win32.whl", hash = "sha256:2e920d506ec85eb4ba50cd4228c2bec05642894d4c73c59b3a2fe20346bd00ee"}, + {file = "google_crc32c-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:07eb3c611ce363c51a933bf6bd7f8e3878a51d124acfc89452a75120bc436289"}, + {file = "google_crc32c-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cae0274952c079886567f3f4f685bcaf5708f0a23a5f5216fdab71f81a6c0273"}, + {file = "google_crc32c-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1034d91442ead5a95b5aaef90dbfaca8633b0247d1e41621d1e9f9db88c36298"}, + {file = "google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c42c70cd1d362284289c6273adda4c6af8039a8ae12dc451dcd61cdabb8ab57"}, + {file = "google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8485b340a6a9e76c62a7dce3c98e5f102c9219f4cfbf896a00cf48caf078d438"}, + {file = "google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77e2fd3057c9d78e225fa0a2160f96b64a824de17840351b26825b0848022906"}, + {file = "google_crc32c-1.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f583edb943cf2e09c60441b910d6a20b4d9d626c75a36c8fcac01a6c96c01183"}, + {file = "google_crc32c-1.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:a1fd716e7a01f8e717490fbe2e431d2905ab8aa598b9b12f8d10abebb36b04dd"}, + {file = "google_crc32c-1.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:72218785ce41b9cfd2fc1d6a017dc1ff7acfc4c17d01053265c41a2c0cc39b8c"}, + {file = "google_crc32c-1.5.0-cp311-cp311-win32.whl", hash = "sha256:66741ef4ee08ea0b2cc3c86916ab66b6aef03768525627fd6a1b34968b4e3709"}, + {file = "google_crc32c-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:ba1eb1843304b1e5537e1fca632fa894d6f6deca8d6389636ee5b4797affb968"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:98cb4d057f285bd80d8778ebc4fde6b4d509ac3f331758fb1528b733215443ae"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd8536e902db7e365f49e7d9029283403974ccf29b13fc7028b97e2295b33556"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19e0a019d2c4dcc5e598cd4a4bc7b008546b0358bd322537c74ad47a5386884f"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02c65b9817512edc6a4ae7c7e987fea799d2e0ee40c53ec573a692bee24de876"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6ac08d24c1f16bd2bf5eca8eaf8304812f44af5cfe5062006ec676e7e1d50afc"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3359fc442a743e870f4588fcf5dcbc1bf929df1fad8fb9905cd94e5edb02e84c"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e986b206dae4476f41bcec1faa057851f3889503a70e1bdb2378d406223994a"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:de06adc872bcd8c2a4e0dc51250e9e65ef2ca91be023b9d13ebd67c2ba552e1e"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-win32.whl", hash = "sha256:d3515f198eaa2f0ed49f8819d5732d70698c3fa37384146079b3799b97667a94"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:67b741654b851abafb7bc625b6d1cdd520a379074e64b6a128e3b688c3c04740"}, + {file = "google_crc32c-1.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c02ec1c5856179f171e032a31d6f8bf84e5a75c45c33b2e20a3de353b266ebd8"}, + {file = "google_crc32c-1.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:edfedb64740750e1a3b16152620220f51d58ff1b4abceb339ca92e934775c27a"}, + {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84e6e8cd997930fc66d5bb4fde61e2b62ba19d62b7abd7a69920406f9ecca946"}, + {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:024894d9d3cfbc5943f8f230e23950cd4906b2fe004c72e29b209420a1e6b05a"}, + {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:998679bf62b7fb599d2878aa3ed06b9ce688b8974893e7223c60db155f26bd8d"}, + {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:83c681c526a3439b5cf94f7420471705bbf96262f49a6fe546a6db5f687a3d4a"}, + {file = "google_crc32c-1.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4c6fdd4fccbec90cc8a01fc00773fcd5fa28db683c116ee3cb35cd5da9ef6c37"}, + {file = "google_crc32c-1.5.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5ae44e10a8e3407dbe138984f21e536583f2bba1be9491239f942c2464ac0894"}, + {file = "google_crc32c-1.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37933ec6e693e51a5b07505bd05de57eee12f3e8c32b07da7e73669398e6630a"}, + {file = "google_crc32c-1.5.0-cp38-cp38-win32.whl", hash = "sha256:fe70e325aa68fa4b5edf7d1a4b6f691eb04bbccac0ace68e34820d283b5f80d4"}, + {file = "google_crc32c-1.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:74dea7751d98034887dbd821b7aae3e1d36eda111d6ca36c206c44478035709c"}, + {file = "google_crc32c-1.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c6c777a480337ac14f38564ac88ae82d4cd238bf293f0a22295b66eb89ffced7"}, + {file = "google_crc32c-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:759ce4851a4bb15ecabae28f4d2e18983c244eddd767f560165563bf9aefbc8d"}, + {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f13cae8cc389a440def0c8c52057f37359014ccbc9dc1f0827936bcd367c6100"}, + {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e560628513ed34759456a416bf86b54b2476c59144a9138165c9a1575801d0d9"}, + {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1674e4307fa3024fc897ca774e9c7562c957af85df55efe2988ed9056dc4e57"}, + {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:278d2ed7c16cfc075c91378c4f47924c0625f5fc84b2d50d921b18b7975bd210"}, + {file = "google_crc32c-1.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d5280312b9af0976231f9e317c20e4a61cd2f9629b7bfea6a693d1878a264ebd"}, + {file = "google_crc32c-1.5.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8b87e1a59c38f275c0e3676fc2ab6d59eccecfd460be267ac360cc31f7bcde96"}, + {file = "google_crc32c-1.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7c074fece789b5034b9b1404a1f8208fc2d4c6ce9decdd16e8220c5a793e6f61"}, + {file = "google_crc32c-1.5.0-cp39-cp39-win32.whl", hash = "sha256:7f57f14606cd1dd0f0de396e1e53824c371e9544a822648cd76c034d209b559c"}, + {file = "google_crc32c-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:a2355cba1f4ad8b6988a4ca3feed5bff33f6af2d7f134852cf279c2aebfde541"}, + {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f314013e7dcd5cf45ab1945d92e713eec788166262ae8deb2cfacd53def27325"}, + {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b747a674c20a67343cb61d43fdd9207ce5da6a99f629c6e2541aa0e89215bcd"}, + {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f24ed114432de109aa9fd317278518a5af2d31ac2ea6b952b2f7782b43da091"}, + {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8667b48e7a7ef66afba2c81e1094ef526388d35b873966d8a9a447974ed9178"}, + {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:1c7abdac90433b09bad6c43a43af253e688c9cfc1c86d332aed13f9a7c7f65e2"}, + {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6f998db4e71b645350b9ac28a2167e6632c239963ca9da411523bb439c5c514d"}, + {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c99616c853bb585301df6de07ca2cadad344fd1ada6d62bb30aec05219c45d2"}, + {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ad40e31093a4af319dadf503b2467ccdc8f67c72e4bcba97f8c10cb078207b5"}, + {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd67cf24a553339d5062eff51013780a00d6f97a39ca062781d06b3a73b15462"}, + {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:398af5e3ba9cf768787eef45c803ff9614cc3e22a5b2f7d7ae116df8b11e3314"}, + {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b1f8133c9a275df5613a451e73f36c2aea4fe13c5c8997e22cf355ebd7bd0728"}, + {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ba053c5f50430a3fcfd36f75aff9caeba0440b2d076afdb79a318d6ca245f88"}, + {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:272d3892a1e1a2dbc39cc5cde96834c236d5327e2122d3aaa19f6614531bb6eb"}, + {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:635f5d4dd18758a1fbd1049a8e8d2fee4ffed124462d837d1a02a0e009c3ab31"}, + {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c672d99a345849301784604bfeaeba4db0c7aae50b95be04dd651fd2a7310b93"}, +] + +[package.extras] +testing = ["pytest"] + +[[package]] +name = "google-resumable-media" +version = "2.7.1" +description = "Utilities for Google Media Downloads and Resumable Uploads" +optional = false +python-versions = ">=3.7" +files = [ + {file = "google-resumable-media-2.7.1.tar.gz", hash = "sha256:eae451a7b2e2cdbaaa0fd2eb00cc8a1ee5e95e16b55597359cbc3d27d7d90e33"}, + {file = "google_resumable_media-2.7.1-py2.py3-none-any.whl", hash = "sha256:103ebc4ba331ab1bfdac0250f8033627a2cd7cde09e7ccff9181e31ba4315b2c"}, +] + +[package.dependencies] +google-crc32c = ">=1.0,<2.0dev" + +[package.extras] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)", "google-auth (>=1.22.0,<2.0dev)"] +requests = ["requests (>=2.18.0,<3.0.0dev)"] + +[[package]] +name = "googleapis-common-protos" +version = "1.63.2" +description = "Common protobufs used in Google APIs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "googleapis-common-protos-1.63.2.tar.gz", hash = "sha256:27c5abdffc4911f28101e635de1533fb4cfd2c37fbaa9174587c799fac90aa87"}, + {file = "googleapis_common_protos-1.63.2-py2.py3-none-any.whl", hash = "sha256:27a2499c7e8aff199665b22741997e485eccc8645aa9176c7c988e6fae507945"}, +] + +[package.dependencies] +protobuf = ">=3.20.2,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" + +[package.extras] +grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] + +[[package]] +name = "googlesearch-python" +version = "1.2.5" +description = "A Python library for scraping the Google search engine." +optional = false +python-versions = ">=3.6" +files = [ + {file = "googlesearch_python-1.2.5-py3-none-any.whl", hash = "sha256:28ef8ad737951b96ebe8963fbeb9bd2b45cae5c2533df1cc7cb8e72129a785f9"}, + {file = "googlesearch_python-1.2.5.tar.gz", hash = "sha256:3c23488374f477fb36e8e2975abc5e4e18794d898d8a2c9c9bf21a1440213e87"}, +] + +[package.dependencies] +beautifulsoup4 = ">=4.9" +requests = ">=2.20" + +[[package]] +name = "greenlet" +version = "3.0.3" +description = "Lightweight in-process concurrent programming" +optional = false +python-versions = ">=3.7" +files = [ + {file = "greenlet-3.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405"}, + {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f"}, + {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb"}, + {file = "greenlet-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9"}, + {file = "greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22"}, + {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3"}, + {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d"}, + {file = "greenlet-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728"}, + {file = "greenlet-3.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf"}, + {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305"}, + {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6"}, + {file = "greenlet-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2"}, + {file = "greenlet-3.0.3-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41"}, + {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7"}, + {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6"}, + {file = "greenlet-3.0.3-cp37-cp37m-win32.whl", hash = "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d"}, + {file = "greenlet-3.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67"}, + {file = "greenlet-3.0.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4"}, + {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5"}, + {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da"}, + {file = "greenlet-3.0.3-cp38-cp38-win32.whl", hash = "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3"}, + {file = "greenlet-3.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf"}, + {file = "greenlet-3.0.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b"}, + {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6"}, + {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113"}, + {file = "greenlet-3.0.3-cp39-cp39-win32.whl", hash = "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e"}, + {file = "greenlet-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067"}, + {file = "greenlet-3.0.3.tar.gz", hash = "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"}, +] + +[package.extras] +docs = ["Sphinx", "furo"] +test = ["objgraph", "psutil"] + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "html2text" +version = "2024.2.26" +description = "Turn HTML into equivalent Markdown-structured text." +optional = false +python-versions = ">=3.8" +files = [ + {file = "html2text-2024.2.26.tar.gz", hash = "sha256:05f8e367d15aaabc96415376776cdd11afd5127a77fce6e36afc60c563ca2c32"}, +] + +[[package]] +name = "httpcore" +version = "1.0.5" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, + {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<0.26.0)"] + +[[package]] +name = "httplib2" +version = "0.22.0" +description = "A comprehensive HTTP client library." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "httplib2-0.22.0-py3-none-any.whl", hash = "sha256:14ae0a53c1ba8f3d37e9e27cf37eabb0fb9980f435ba405d546948b009dd64dc"}, + {file = "httplib2-0.22.0.tar.gz", hash = "sha256:d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81"}, +] + +[package.dependencies] +pyparsing = {version = ">=2.4.2,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.0.2 || >3.0.2,<3.0.3 || >3.0.3,<4", markers = "python_version > \"3.0\""} + +[[package]] +name = "httpx" +version = "0.27.0" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, + {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "==1.*" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] + +[[package]] +name = "huggingface-hub" +version = "0.24.5" +description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "huggingface_hub-0.24.5-py3-none-any.whl", hash = "sha256:d93fb63b1f1a919a22ce91a14518974e81fc4610bf344dfe7572343ce8d3aced"}, + {file = "huggingface_hub-0.24.5.tar.gz", hash = "sha256:7b45d6744dd53ce9cbf9880957de00e9d10a9ae837f1c9b7255fc8fa4e8264f3"}, +] + +[package.dependencies] +filelock = "*" +fsspec = ">=2023.5.0" +packaging = ">=20.9" +pyyaml = ">=5.1" +requests = "*" +tqdm = ">=4.42.1" +typing-extensions = ">=3.7.4.3" + +[package.extras] +all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.5.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +cli = ["InquirerPy (==0.3.4)"] +dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.5.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] +fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"] +hf-transfer = ["hf-transfer (>=0.1.4)"] +inference = ["aiohttp", "minijinja (>=1.0)"] +quality = ["mypy (==1.5.1)", "ruff (>=0.5.0)"] +tensorflow = ["graphviz", "pydot", "tensorflow"] +tensorflow-testing = ["keras (<3.0)", "tensorflow"] +testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio", "jedi", "minijinja (>=1.0)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] +torch = ["safetensors[torch]", "torch"] +typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"] + +[[package]] +name = "idna" +version = "3.7" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, +] + +[[package]] +name = "isodate" +version = "0.6.1" +description = "An ISO 8601 date/time/duration parser and formatter" +optional = false +python-versions = "*" +files = [ + {file = "isodate-0.6.1-py2.py3-none-any.whl", hash = "sha256:0751eece944162659049d35f4f549ed815792b38793f07cf73381c1c87cbed96"}, + {file = "isodate-0.6.1.tar.gz", hash = "sha256:48c5881de7e8b0a0d648cb024c8062dc84e7b840ed81e864c7614fd3c127bde9"}, +] + +[package.dependencies] +six = "*" + +[[package]] +name = "jieba3k" +version = "0.35.1" +description = "Chinese Words Segementation Utilities" +optional = false +python-versions = "*" +files = [ + {file = "jieba3k-0.35.1.zip", hash = "sha256:980a4f2636b778d312518066be90c7697d410dd5a472385f5afced71a2db1c10"}, +] + +[[package]] +name = "jinja2" +version = "3.1.4" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "jiter" +version = "0.5.0" +description = "Fast iterable JSON parser." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jiter-0.5.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b599f4e89b3def9a94091e6ee52e1d7ad7bc33e238ebb9c4c63f211d74822c3f"}, + {file = "jiter-0.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a063f71c4b06225543dddadbe09d203dc0c95ba352d8b85f1221173480a71d5"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acc0d5b8b3dd12e91dd184b87273f864b363dfabc90ef29a1092d269f18c7e28"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c22541f0b672f4d741382a97c65609332a783501551445ab2df137ada01e019e"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:63314832e302cc10d8dfbda0333a384bf4bcfce80d65fe99b0f3c0da8945a91a"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a25fbd8a5a58061e433d6fae6d5298777c0814a8bcefa1e5ecfff20c594bd749"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:503b2c27d87dfff5ab717a8200fbbcf4714516c9d85558048b1fc14d2de7d8dc"}, + {file = "jiter-0.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6d1f3d27cce923713933a844872d213d244e09b53ec99b7a7fdf73d543529d6d"}, + {file = "jiter-0.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c95980207b3998f2c3b3098f357994d3fd7661121f30669ca7cb945f09510a87"}, + {file = "jiter-0.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:afa66939d834b0ce063f57d9895e8036ffc41c4bd90e4a99631e5f261d9b518e"}, + {file = "jiter-0.5.0-cp310-none-win32.whl", hash = "sha256:f16ca8f10e62f25fd81d5310e852df6649af17824146ca74647a018424ddeccf"}, + {file = "jiter-0.5.0-cp310-none-win_amd64.whl", hash = "sha256:b2950e4798e82dd9176935ef6a55cf6a448b5c71515a556da3f6b811a7844f1e"}, + {file = "jiter-0.5.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d4c8e1ed0ef31ad29cae5ea16b9e41529eb50a7fba70600008e9f8de6376d553"}, + {file = "jiter-0.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c6f16e21276074a12d8421692515b3fd6d2ea9c94fd0734c39a12960a20e85f3"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5280e68e7740c8c128d3ae5ab63335ce6d1fb6603d3b809637b11713487af9e6"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:583c57fc30cc1fec360e66323aadd7fc3edeec01289bfafc35d3b9dcb29495e4"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26351cc14507bdf466b5f99aba3df3143a59da75799bf64a53a3ad3155ecded9"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4829df14d656b3fb87e50ae8b48253a8851c707da9f30d45aacab2aa2ba2d614"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a42a4bdcf7307b86cb863b2fb9bb55029b422d8f86276a50487982d99eed7c6e"}, + {file = "jiter-0.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04d461ad0aebf696f8da13c99bc1b3e06f66ecf6cfd56254cc402f6385231c06"}, + {file = "jiter-0.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e6375923c5f19888c9226582a124b77b622f8fd0018b843c45eeb19d9701c403"}, + {file = "jiter-0.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2cec323a853c24fd0472517113768c92ae0be8f8c384ef4441d3632da8baa646"}, + {file = "jiter-0.5.0-cp311-none-win32.whl", hash = "sha256:aa1db0967130b5cab63dfe4d6ff547c88b2a394c3410db64744d491df7f069bb"}, + {file = "jiter-0.5.0-cp311-none-win_amd64.whl", hash = "sha256:aa9d2b85b2ed7dc7697597dcfaac66e63c1b3028652f751c81c65a9f220899ae"}, + {file = "jiter-0.5.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9f664e7351604f91dcdd557603c57fc0d551bc65cc0a732fdacbf73ad335049a"}, + {file = "jiter-0.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:044f2f1148b5248ad2c8c3afb43430dccf676c5a5834d2f5089a4e6c5bbd64df"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:702e3520384c88b6e270c55c772d4bd6d7b150608dcc94dea87ceba1b6391248"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:528d742dcde73fad9d63e8242c036ab4a84389a56e04efd854062b660f559544"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8cf80e5fe6ab582c82f0c3331df27a7e1565e2dcf06265afd5173d809cdbf9ba"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:44dfc9ddfb9b51a5626568ef4e55ada462b7328996294fe4d36de02fce42721f"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c451f7922992751a936b96c5f5b9bb9312243d9b754c34b33d0cb72c84669f4e"}, + {file = "jiter-0.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:308fce789a2f093dca1ff91ac391f11a9f99c35369117ad5a5c6c4903e1b3e3a"}, + {file = "jiter-0.5.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7f5ad4a7c6b0d90776fdefa294f662e8a86871e601309643de30bf94bb93a64e"}, + {file = "jiter-0.5.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ea189db75f8eca08807d02ae27929e890c7d47599ce3d0a6a5d41f2419ecf338"}, + {file = "jiter-0.5.0-cp312-none-win32.whl", hash = "sha256:e3bbe3910c724b877846186c25fe3c802e105a2c1fc2b57d6688b9f8772026e4"}, + {file = "jiter-0.5.0-cp312-none-win_amd64.whl", hash = "sha256:a586832f70c3f1481732919215f36d41c59ca080fa27a65cf23d9490e75b2ef5"}, + {file = "jiter-0.5.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:f04bc2fc50dc77be9d10f73fcc4e39346402ffe21726ff41028f36e179b587e6"}, + {file = "jiter-0.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6f433a4169ad22fcb550b11179bb2b4fd405de9b982601914ef448390b2954f3"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad4a6398c85d3a20067e6c69890ca01f68659da94d74c800298581724e426c7e"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6baa88334e7af3f4d7a5c66c3a63808e5efbc3698a1c57626541ddd22f8e4fbf"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ece0a115c05efca597c6d938f88c9357c843f8c245dbbb53361a1c01afd7148"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:335942557162ad372cc367ffaf93217117401bf930483b4b3ebdb1223dbddfa7"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:649b0ee97a6e6da174bffcb3c8c051a5935d7d4f2f52ea1583b5b3e7822fbf14"}, + {file = "jiter-0.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f4be354c5de82157886ca7f5925dbda369b77344b4b4adf2723079715f823989"}, + {file = "jiter-0.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5206144578831a6de278a38896864ded4ed96af66e1e63ec5dd7f4a1fce38a3a"}, + {file = "jiter-0.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8120c60f8121ac3d6f072b97ef0e71770cc72b3c23084c72c4189428b1b1d3b6"}, + {file = "jiter-0.5.0-cp38-none-win32.whl", hash = "sha256:6f1223f88b6d76b519cb033a4d3687ca157c272ec5d6015c322fc5b3074d8a5e"}, + {file = "jiter-0.5.0-cp38-none-win_amd64.whl", hash = "sha256:c59614b225d9f434ea8fc0d0bec51ef5fa8c83679afedc0433905994fb36d631"}, + {file = "jiter-0.5.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0af3838cfb7e6afee3f00dc66fa24695199e20ba87df26e942820345b0afc566"}, + {file = "jiter-0.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:550b11d669600dbc342364fd4adbe987f14d0bbedaf06feb1b983383dcc4b961"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:489875bf1a0ffb3cb38a727b01e6673f0f2e395b2aad3c9387f94187cb214bbf"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b250ca2594f5599ca82ba7e68785a669b352156260c5362ea1b4e04a0f3e2389"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ea18e01f785c6667ca15407cd6dabbe029d77474d53595a189bdc813347218e"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:462a52be85b53cd9bffd94e2d788a09984274fe6cebb893d6287e1c296d50653"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92cc68b48d50fa472c79c93965e19bd48f40f207cb557a8346daa020d6ba973b"}, + {file = "jiter-0.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1c834133e59a8521bc87ebcad773608c6fa6ab5c7a022df24a45030826cf10bc"}, + {file = "jiter-0.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab3a71ff31cf2d45cb216dc37af522d335211f3a972d2fe14ea99073de6cb104"}, + {file = "jiter-0.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cccd3af9c48ac500c95e1bcbc498020c87e1781ff0345dd371462d67b76643eb"}, + {file = "jiter-0.5.0-cp39-none-win32.whl", hash = "sha256:368084d8d5c4fc40ff7c3cc513c4f73e02c85f6009217922d0823a48ee7adf61"}, + {file = "jiter-0.5.0-cp39-none-win_amd64.whl", hash = "sha256:ce03f7b4129eb72f1687fa11300fbf677b02990618428934662406d2a76742a1"}, + {file = "jiter-0.5.0.tar.gz", hash = "sha256:1d916ba875bcab5c5f7d927df998c4cb694d27dceddf3392e58beaf10563368a"}, +] + +[[package]] +name = "jmespath" +version = "1.0.1" +description = "JSON Matching Expressions" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, + {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, +] + +[[package]] +name = "joblib" +version = "1.4.2" +description = "Lightweight pipelining with Python functions" +optional = false +python-versions = ">=3.8" +files = [ + {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, + {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, +] + +[[package]] +name = "llama-cloud" +version = "0.0.12" +description = "" +optional = false +python-versions = "<4,>=3.8" +files = [ + {file = "llama_cloud-0.0.12-py3-none-any.whl", hash = "sha256:0bdbe34f8e711eb226239ef2c2178b269bfd203359026a6afa0eec8c1aff88c6"}, + {file = "llama_cloud-0.0.12.tar.gz", hash = "sha256:caa52fd89b4d174c3abd4ae6a46c502d9713487056f76f03681f0b07562f840b"}, +] + +[package.dependencies] +httpx = ">=0.20.0" +pydantic = ">=1.10" + +[[package]] +name = "llama-index" +version = "0.10.62" +description = "Interface between LLMs and your data" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "llama_index-0.10.62-py3-none-any.whl", hash = "sha256:13af83c70860ba570e4ff34e57b8b3e48cf4967c925456f5526c77c52004fb44"}, + {file = "llama_index-0.10.62.tar.gz", hash = "sha256:b649a645bb5281a30077b74671132734f360c77370b6ef453d91a065c0029867"}, +] + +[package.dependencies] +llama-index-agent-openai = ">=0.1.4,<0.3.0" +llama-index-cli = ">=0.1.2,<0.2.0" +llama-index-core = "0.10.62" +llama-index-embeddings-openai = ">=0.1.5,<0.2.0" +llama-index-indices-managed-llama-cloud = ">=0.2.0" +llama-index-legacy = ">=0.9.48,<0.10.0" +llama-index-llms-openai = ">=0.1.27,<0.2.0" +llama-index-multi-modal-llms-openai = ">=0.1.3,<0.2.0" +llama-index-program-openai = ">=0.1.3,<0.2.0" +llama-index-question-gen-openai = ">=0.1.2,<0.2.0" +llama-index-readers-file = ">=0.1.4,<0.2.0" +llama-index-readers-llama-parse = ">=0.1.2" + +[[package]] +name = "llama-index-agent-openai" +version = "0.2.9" +description = "llama-index agent openai integration" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "llama_index_agent_openai-0.2.9-py3-none-any.whl", hash = "sha256:d7f0fd4c87124781acd783be603871f8808b1a3969e876a9c96e2ed0844d46ac"}, + {file = "llama_index_agent_openai-0.2.9.tar.gz", hash = "sha256:debe86da6d9d983db32b445ddca7c798ac140fe59573bafded73595b3995f3d5"}, +] + +[package.dependencies] +llama-index-core = ">=0.10.41,<0.11.0" +llama-index-llms-openai = ">=0.1.5,<0.2.0" +openai = ">=1.14.0" + +[[package]] +name = "llama-index-cli" +version = "0.1.13" +description = "llama-index cli" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "llama_index_cli-0.1.13-py3-none-any.whl", hash = "sha256:5e05bc3ce55ee1bf6e5af7e87631a71d6b6cf8fc2af10cd3947b09b1bac6788d"}, + {file = "llama_index_cli-0.1.13.tar.gz", hash = "sha256:86147ded4439fbab1d6c7c0d72e8f231d2935da9fdf5c9d3f0dde4f35d44aa59"}, +] + +[package.dependencies] +llama-index-core = ">=0.10.11.post1,<0.11.0" +llama-index-embeddings-openai = ">=0.1.1,<0.2.0" +llama-index-llms-openai = ">=0.1.1,<0.2.0" + +[[package]] +name = "llama-index-core" +version = "0.10.62" +description = "Interface between LLMs and your data" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "llama_index_core-0.10.62-py3-none-any.whl", hash = "sha256:c48c4b8bdd0ad6eec3f7c4ca129509cdbe5614f3d2ed76bec30999899a38b962"}, + {file = "llama_index_core-0.10.62.tar.gz", hash = "sha256:227f011829497e654bb32ab6907318f613c3a9a6809e08c20163395c26838606"}, +] + +[package.dependencies] +aiohttp = ">=3.8.6,<4.0.0" +dataclasses-json = "*" +deprecated = ">=1.2.9.3" +dirtyjson = ">=1.0.8,<2.0.0" +fsspec = ">=2023.5.0" +httpx = "*" +nest-asyncio = ">=1.5.8,<2.0.0" +networkx = ">=3.0" +nltk = ">=3.8.1,<4.0.0" +numpy = "<2.0.0" +openai = ">=1.1.0" +pandas = "*" +pillow = ">=9.0.0" +PyYAML = ">=6.0.1" +requests = ">=2.31.0" +SQLAlchemy = {version = ">=1.4.49", extras = ["asyncio"]} +tenacity = ">=8.2.0,<8.4.0 || >8.4.0,<9.0.0" +tiktoken = ">=0.3.3" +tqdm = ">=4.66.1,<5.0.0" +typing-extensions = ">=4.5.0" +typing-inspect = ">=0.8.0" +wrapt = "*" + +[[package]] +name = "llama-index-embeddings-azure-openai" +version = "0.1.11" +description = "llama-index embeddings azure openai integration" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "llama_index_embeddings_azure_openai-0.1.11-py3-none-any.whl", hash = "sha256:afefe55ee69934528c569ddf71fb1e9ddf2992b6c344c4c9d72a03fa8c33cf40"}, + {file = "llama_index_embeddings_azure_openai-0.1.11.tar.gz", hash = "sha256:40a4fd9a31ba74f071739d6c8405187b66e7f584ae2f64a30316c6c7b6a25325"}, +] + +[package.dependencies] +llama-index-core = ">=0.10.11.post1,<0.11.0" +llama-index-embeddings-openai = ">=0.1.3,<0.2.0" +llama-index-llms-azure-openai = ">=0.1.3,<0.2.0" + +[[package]] +name = "llama-index-embeddings-openai" +version = "0.1.11" +description = "llama-index embeddings openai integration" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "llama_index_embeddings_openai-0.1.11-py3-none-any.whl", hash = "sha256:e20806fc4baff6b8f5274decf2c1ca7c5c737648e01865475ffada164e32e173"}, + {file = "llama_index_embeddings_openai-0.1.11.tar.gz", hash = "sha256:6025e229e375201788a9b14d6ebe470329907576cba5f6b7b832c3d68f39db30"}, +] + +[package.dependencies] +llama-index-core = ">=0.10.1,<0.11.0" + +[[package]] +name = "llama-index-indices-managed-llama-cloud" +version = "0.2.7" +description = "llama-index indices llama-cloud integration" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "llama_index_indices_managed_llama_cloud-0.2.7-py3-none-any.whl", hash = "sha256:94335504eab2a6baf7361bbd8bda3ae20a68c7d0111587c9a0793440e9edff21"}, + {file = "llama_index_indices_managed_llama_cloud-0.2.7.tar.gz", hash = "sha256:d7e9b4cc50214b3cfcd75ea63cacce4ee36092cb672c003f15fd23ba31c49ec0"}, +] + +[package.dependencies] +llama-cloud = ">=0.0.11" +llama-index-core = ">=0.10.48.post1,<0.11.0" + +[[package]] +name = "llama-index-legacy" +version = "0.9.48" +description = "Interface between LLMs and your data" +optional = false +python-versions = ">=3.8.1,<4.0" +files = [ + {file = "llama_index_legacy-0.9.48-py3-none-any.whl", hash = "sha256:714ada95beac179b4acefa4d2deff74bb7b2f22b0f699ac247d4cb67738d16d4"}, + {file = "llama_index_legacy-0.9.48.tar.gz", hash = "sha256:82ddc4691edbf49533d65582c249ba22c03fe96fbd3e92f7758dccef28e43834"}, +] + +[package.dependencies] +aiohttp = ">=3.8.6,<4.0.0" +dataclasses-json = "*" +deprecated = ">=1.2.9.3" +dirtyjson = ">=1.0.8,<2.0.0" +fsspec = ">=2023.5.0" +httpx = "*" +nest-asyncio = ">=1.5.8,<2.0.0" +networkx = ">=3.0" +nltk = ">=3.8.1,<4.0.0" +numpy = "*" +openai = ">=1.1.0" +pandas = "*" +requests = ">=2.31.0" +SQLAlchemy = {version = ">=1.4.49", extras = ["asyncio"]} +tenacity = ">=8.2.0,<9.0.0" +tiktoken = ">=0.3.3" +typing-extensions = ">=4.5.0" +typing-inspect = ">=0.8.0" + +[package.extras] +gradientai = ["gradientai (>=1.4.0)"] +html = ["beautifulsoup4 (>=4.12.2,<5.0.0)"] +langchain = ["langchain (>=0.0.303)"] +local-models = ["optimum[onnxruntime] (>=1.13.2,<2.0.0)", "sentencepiece (>=0.1.99,<0.2.0)", "transformers[torch] (>=4.33.1,<5.0.0)"] +postgres = ["asyncpg (>=0.28.0,<0.29.0)", "pgvector (>=0.1.0,<0.2.0)", "psycopg2-binary (>=2.9.9,<3.0.0)"] +query-tools = ["guidance (>=0.0.64,<0.0.65)", "jsonpath-ng (>=1.6.0,<2.0.0)", "lm-format-enforcer (>=0.4.3,<0.5.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "scikit-learn", "spacy (>=3.7.1,<4.0.0)"] + +[[package]] +name = "llama-index-llms-azure-openai" +version = "0.1.10" +description = "llama-index llms azure openai integration" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "llama_index_llms_azure_openai-0.1.10-py3-none-any.whl", hash = "sha256:8666b095118ed9c5087dc2d91a83a826d4549ea4d442b9eef363e243207d3539"}, + {file = "llama_index_llms_azure_openai-0.1.10.tar.gz", hash = "sha256:f1624c9bd7bf4458e98cca6f3b805eec06105fa951536ff24b098d913d2368bd"}, +] + +[package.dependencies] +azure-identity = ">=1.15.0,<2.0.0" +httpx = "*" +llama-index-core = ">=0.10.11.post1,<0.11.0" +llama-index-llms-openai = ">=0.1.1,<0.2.0" + +[[package]] +name = "llama-index-llms-openai" +version = "0.1.29" +description = "llama-index llms openai integration" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "llama_index_llms_openai-0.1.29-py3-none-any.whl", hash = "sha256:8ae9a9f595b3654405fd54f3dbc8b58b259be8eeea2f58650609869e8362cab5"}, + {file = "llama_index_llms_openai-0.1.29.tar.gz", hash = "sha256:15a4fa65a3d2ecf7e29a090273ec595d44553baea72a1ebe5b42fe3c527f7121"}, +] + +[package.dependencies] +llama-index-core = ">=0.10.57,<0.11.0" +openai = ">=1.40.0,<2.0.0" + +[[package]] +name = "llama-index-multi-modal-llms-openai" +version = "0.1.9" +description = "llama-index multi-modal-llms openai integration" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "llama_index_multi_modal_llms_openai-0.1.9-py3-none-any.whl", hash = "sha256:614f40427a4671e72742780be8fda77297dbf2942519bffcb2c9de8696a9edff"}, + {file = "llama_index_multi_modal_llms_openai-0.1.9.tar.gz", hash = "sha256:dbacf44d5c2cca07ca424eacd1337583002d70387a3c1868cf8ae743b1dbec4a"}, +] + +[package.dependencies] +llama-index-core = ">=0.10.1,<0.11.0" +llama-index-llms-openai = ">=0.1.1,<0.2.0" + +[[package]] +name = "llama-index-program-openai" +version = "0.1.7" +description = "llama-index program openai integration" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "llama_index_program_openai-0.1.7-py3-none-any.whl", hash = "sha256:33489b573c1050a3f583ff68fcbc4bcbd49f29e74f3e5baea08ab0d5f363403c"}, + {file = "llama_index_program_openai-0.1.7.tar.gz", hash = "sha256:bf7eb61a073381714be5a049d93b40044dfe51bd4333bee539d1532b7407621f"}, +] + +[package.dependencies] +llama-index-agent-openai = ">=0.1.1,<0.3.0" +llama-index-core = ">=0.10.57,<0.11.0" +llama-index-llms-openai = ">=0.1.1" + +[[package]] +name = "llama-index-question-gen-openai" +version = "0.1.3" +description = "llama-index question_gen openai integration" +optional = false +python-versions = ">=3.8.1,<4.0" +files = [ + {file = "llama_index_question_gen_openai-0.1.3-py3-none-any.whl", hash = "sha256:1f83b49e8b2e665030d1ec8c54687d6985d9fa8426147b64e46628a9e489b302"}, + {file = "llama_index_question_gen_openai-0.1.3.tar.gz", hash = "sha256:4486198117a45457d2e036ae60b93af58052893cc7d78fa9b6f47dd47b81e2e1"}, +] + +[package.dependencies] +llama-index-core = ">=0.10.1,<0.11.0" +llama-index-llms-openai = ">=0.1.1,<0.2.0" +llama-index-program-openai = ">=0.1.1,<0.2.0" + +[[package]] +name = "llama-index-readers-file" +version = "0.1.32" +description = "llama-index readers file integration" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "llama_index_readers_file-0.1.32-py3-none-any.whl", hash = "sha256:699d6f80c5c922321b6202b565c7cc22ab9e27a2d1c6df1e42550089ccd25290"}, + {file = "llama_index_readers_file-0.1.32.tar.gz", hash = "sha256:80a2a2aeefba7deae289dfd4aaec6e8ab8ee331820bcdd1db821d1879bd21515"}, +] + +[package.dependencies] +beautifulsoup4 = ">=4.12.3,<5.0.0" +llama-index-core = ">=0.10.37.post1,<0.11.0" +pypdf = ">=4.0.1,<5.0.0" +striprtf = ">=0.0.26,<0.0.27" + +[package.extras] +pymupdf = ["pymupdf (>=1.23.21,<2.0.0)"] + +[[package]] +name = "llama-index-readers-llama-parse" +version = "0.1.6" +description = "llama-index readers llama-parse integration" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "llama_index_readers_llama_parse-0.1.6-py3-none-any.whl", hash = "sha256:71d445a2357ce4c632e0fada7c913ac62790e77c062f12d916dd86378380ff1f"}, + {file = "llama_index_readers_llama_parse-0.1.6.tar.gz", hash = "sha256:04f2dcfbb0fb87ce70890f5a2f4f89941d79be6a818b43738f053560e4b451cf"}, +] + +[package.dependencies] +llama-index-core = ">=0.10.7,<0.11.0" +llama-parse = ">=0.4.0" + +[[package]] +name = "llama-index-readers-web" +version = "0.1.23" +description = "llama-index readers web integration" +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "llama_index_readers_web-0.1.23-py3-none-any.whl", hash = "sha256:d2c03458fe6c86acf976d332ebabab1c6f0f71a9e6f4610704a950a46df6e0ef"}, + {file = "llama_index_readers_web-0.1.23.tar.gz", hash = "sha256:225ef6c825d89037312afc192950b98132ba9c268cd4562e7493a83798277cf7"}, +] + +[package.dependencies] +aiohttp = ">=3.9.1,<4.0.0" +beautifulsoup4 = ">=4.12.3,<5.0.0" +chromedriver-autoinstaller = ">=0.6.3,<0.7.0" +html2text = ">=2024.2.26,<2025.0.0" +llama-index-core = ">=0.10.1,<0.11.0" +newspaper3k = ">=0.2.8,<0.3.0" +playwright = ">=1.30,<2.0" +requests = ">=2.31.0,<3.0.0" +selenium = ">=4.17.2,<5.0.0" +spider-client = ">=0.0.27,<0.0.28" +urllib3 = ">=1.1.0" + +[[package]] +name = "llama-parse" +version = "0.4.9" +description = "Parse files into RAG-Optimized formats." +optional = false +python-versions = "<4.0,>=3.8.1" +files = [ + {file = "llama_parse-0.4.9-py3-none-any.whl", hash = "sha256:71974a57a73d642608cc406942bee4e7fc1a713fa410f51df67da509479ba544"}, + {file = "llama_parse-0.4.9.tar.gz", hash = "sha256:657f8fa5f7d399f14c0454fc05cae6034da0373f191df6cfca17a1b4a704ef87"}, +] + +[package.dependencies] +llama-index-core = ">=0.10.29" + +[[package]] +name = "loguru" +version = "0.7.2" +description = "Python logging made (stupidly) simple" +optional = false +python-versions = ">=3.5" +files = [ + {file = "loguru-0.7.2-py3-none-any.whl", hash = "sha256:003d71e3d3ed35f0f8984898359d65b79e5b21943f78af86aa5491210429b8eb"}, + {file = "loguru-0.7.2.tar.gz", hash = "sha256:e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac"}, +] + +[package.dependencies] +colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} +win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} + +[package.extras] +dev = ["Sphinx (==7.2.5)", "colorama (==0.4.5)", "colorama (==0.4.6)", "exceptiongroup (==1.1.3)", "freezegun (==1.1.0)", "freezegun (==1.2.2)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v1.4.1)", "mypy (==v1.5.1)", "pre-commit (==3.4.0)", "pytest (==6.1.2)", "pytest (==7.4.0)", "pytest-cov (==2.12.1)", "pytest-cov (==4.1.0)", "pytest-mypy-plugins (==1.9.3)", "pytest-mypy-plugins (==3.0.0)", "sphinx-autobuild (==2021.3.14)", "sphinx-rtd-theme (==1.3.0)", "tox (==3.27.1)", "tox (==4.11.0)"] + +[[package]] +name = "lxml" +version = "5.2.2" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +optional = false +python-versions = ">=3.6" +files = [ + {file = "lxml-5.2.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:364d03207f3e603922d0d3932ef363d55bbf48e3647395765f9bfcbdf6d23632"}, + {file = "lxml-5.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:50127c186f191b8917ea2fb8b206fbebe87fd414a6084d15568c27d0a21d60db"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74e4f025ef3db1c6da4460dd27c118d8cd136d0391da4e387a15e48e5c975147"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:981a06a3076997adf7c743dcd0d7a0415582661e2517c7d961493572e909aa1d"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aef5474d913d3b05e613906ba4090433c515e13ea49c837aca18bde190853dff"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e275ea572389e41e8b039ac076a46cb87ee6b8542df3fff26f5baab43713bca"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5b65529bb2f21ac7861a0e94fdbf5dc0daab41497d18223b46ee8515e5ad297"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bcc98f911f10278d1daf14b87d65325851a1d29153caaf146877ec37031d5f36"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:b47633251727c8fe279f34025844b3b3a3e40cd1b198356d003aa146258d13a2"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:fbc9d316552f9ef7bba39f4edfad4a734d3d6f93341232a9dddadec4f15d425f"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:13e69be35391ce72712184f69000cda04fc89689429179bc4c0ae5f0b7a8c21b"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3b6a30a9ab040b3f545b697cb3adbf3696c05a3a68aad172e3fd7ca73ab3c835"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a233bb68625a85126ac9f1fc66d24337d6e8a0f9207b688eec2e7c880f012ec0"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:dfa7c241073d8f2b8e8dbc7803c434f57dbb83ae2a3d7892dd068d99e96efe2c"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1a7aca7964ac4bb07680d5c9d63b9d7028cace3e2d43175cb50bba8c5ad33316"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ae4073a60ab98529ab8a72ebf429f2a8cc612619a8c04e08bed27450d52103c0"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ffb2be176fed4457e445fe540617f0252a72a8bc56208fd65a690fdb1f57660b"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e290d79a4107d7d794634ce3e985b9ae4f920380a813717adf61804904dc4393"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:96e85aa09274955bb6bd483eaf5b12abadade01010478154b0ec70284c1b1526"}, + {file = "lxml-5.2.2-cp310-cp310-win32.whl", hash = "sha256:f956196ef61369f1685d14dad80611488d8dc1ef00be57c0c5a03064005b0f30"}, + {file = "lxml-5.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:875a3f90d7eb5c5d77e529080d95140eacb3c6d13ad5b616ee8095447b1d22e7"}, + {file = "lxml-5.2.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:45f9494613160d0405682f9eee781c7e6d1bf45f819654eb249f8f46a2c22545"}, + {file = "lxml-5.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b0b3f2df149efb242cee2ffdeb6674b7f30d23c9a7af26595099afaf46ef4e88"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d28cb356f119a437cc58a13f8135ab8a4c8ece18159eb9194b0d269ec4e28083"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:657a972f46bbefdbba2d4f14413c0d079f9ae243bd68193cb5061b9732fa54c1"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b74b9ea10063efb77a965a8d5f4182806fbf59ed068b3c3fd6f30d2ac7bee734"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:07542787f86112d46d07d4f3c4e7c760282011b354d012dc4141cc12a68cef5f"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:303f540ad2dddd35b92415b74b900c749ec2010e703ab3bfd6660979d01fd4ed"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:2eb2227ce1ff998faf0cd7fe85bbf086aa41dfc5af3b1d80867ecfe75fb68df3"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:1d8a701774dfc42a2f0b8ccdfe7dbc140500d1049e0632a611985d943fcf12df"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:56793b7a1a091a7c286b5f4aa1fe4ae5d1446fe742d00cdf2ffb1077865db10d"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:eb00b549b13bd6d884c863554566095bf6fa9c3cecb2e7b399c4bc7904cb33b5"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a2569a1f15ae6c8c64108a2cd2b4a858fc1e13d25846be0666fc144715e32ab"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:8cf85a6e40ff1f37fe0f25719aadf443686b1ac7652593dc53c7ef9b8492b115"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:d237ba6664b8e60fd90b8549a149a74fcc675272e0e95539a00522e4ca688b04"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0b3f5016e00ae7630a4b83d0868fca1e3d494c78a75b1c7252606a3a1c5fc2ad"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23441e2b5339bc54dc949e9e675fa35efe858108404ef9aa92f0456929ef6fe8"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2fb0ba3e8566548d6c8e7dd82a8229ff47bd8fb8c2da237607ac8e5a1b8312e5"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:79d1fb9252e7e2cfe4de6e9a6610c7cbb99b9708e2c3e29057f487de5a9eaefa"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6dcc3d17eac1df7859ae01202e9bb11ffa8c98949dcbeb1069c8b9a75917e01b"}, + {file = "lxml-5.2.2-cp311-cp311-win32.whl", hash = "sha256:4c30a2f83677876465f44c018830f608fa3c6a8a466eb223535035fbc16f3438"}, + {file = "lxml-5.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:49095a38eb333aaf44c06052fd2ec3b8f23e19747ca7ec6f6c954ffea6dbf7be"}, + {file = "lxml-5.2.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7429e7faa1a60cad26ae4227f4dd0459efde239e494c7312624ce228e04f6391"}, + {file = "lxml-5.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:50ccb5d355961c0f12f6cf24b7187dbabd5433f29e15147a67995474f27d1776"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc911208b18842a3a57266d8e51fc3cfaccee90a5351b92079beed912a7914c2"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33ce9e786753743159799fdf8e92a5da351158c4bfb6f2db0bf31e7892a1feb5"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec87c44f619380878bd49ca109669c9f221d9ae6883a5bcb3616785fa8f94c97"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08ea0f606808354eb8f2dfaac095963cb25d9d28e27edcc375d7b30ab01abbf6"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75a9632f1d4f698b2e6e2e1ada40e71f369b15d69baddb8968dcc8e683839b18"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74da9f97daec6928567b48c90ea2c82a106b2d500f397eeb8941e47d30b1ca85"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:0969e92af09c5687d769731e3f39ed62427cc72176cebb54b7a9d52cc4fa3b73"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:9164361769b6ca7769079f4d426a41df6164879f7f3568be9086e15baca61466"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d26a618ae1766279f2660aca0081b2220aca6bd1aa06b2cf73f07383faf48927"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab67ed772c584b7ef2379797bf14b82df9aa5f7438c5b9a09624dd834c1c1aaf"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:3d1e35572a56941b32c239774d7e9ad724074d37f90c7a7d499ab98761bd80cf"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:8268cbcd48c5375f46e000adb1390572c98879eb4f77910c6053d25cc3ac2c67"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e282aedd63c639c07c3857097fc0e236f984ceb4089a8b284da1c526491e3f3d"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfdc2bfe69e9adf0df4915949c22a25b39d175d599bf98e7ddf620a13678585"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4aefd911793b5d2d7a921233a54c90329bf3d4a6817dc465f12ffdfe4fc7b8fe"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:8b8df03a9e995b6211dafa63b32f9d405881518ff1ddd775db4e7b98fb545e1c"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f11ae142f3a322d44513de1018b50f474f8f736bc3cd91d969f464b5bfef8836"}, + {file = "lxml-5.2.2-cp312-cp312-win32.whl", hash = "sha256:16a8326e51fcdffc886294c1e70b11ddccec836516a343f9ed0f82aac043c24a"}, + {file = "lxml-5.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:bbc4b80af581e18568ff07f6395c02114d05f4865c2812a1f02f2eaecf0bfd48"}, + {file = "lxml-5.2.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e3d9d13603410b72787579769469af730c38f2f25505573a5888a94b62b920f8"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38b67afb0a06b8575948641c1d6d68e41b83a3abeae2ca9eed2ac59892b36706"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c689d0d5381f56de7bd6966a4541bff6e08bf8d3871bbd89a0c6ab18aa699573"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:cf2a978c795b54c539f47964ec05e35c05bd045db5ca1e8366988c7f2fe6b3ce"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:739e36ef7412b2bd940f75b278749106e6d025e40027c0b94a17ef7968d55d56"}, + {file = "lxml-5.2.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d8bbcd21769594dbba9c37d3c819e2d5847656ca99c747ddb31ac1701d0c0ed9"}, + {file = "lxml-5.2.2-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:2304d3c93f2258ccf2cf7a6ba8c761d76ef84948d87bf9664e14d203da2cd264"}, + {file = "lxml-5.2.2-cp36-cp36m-win32.whl", hash = "sha256:02437fb7308386867c8b7b0e5bc4cd4b04548b1c5d089ffb8e7b31009b961dc3"}, + {file = "lxml-5.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:edcfa83e03370032a489430215c1e7783128808fd3e2e0a3225deee278585196"}, + {file = "lxml-5.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:28bf95177400066596cdbcfc933312493799382879da504633d16cf60bba735b"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a745cc98d504d5bd2c19b10c79c61c7c3df9222629f1b6210c0368177589fb8"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b590b39ef90c6b22ec0be925b211298e810b4856909c8ca60d27ffbca6c12e6"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b336b0416828022bfd5a2e3083e7f5ba54b96242159f83c7e3eebaec752f1716"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:c2faf60c583af0d135e853c86ac2735ce178f0e338a3c7f9ae8f622fd2eb788c"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:4bc6cb140a7a0ad1f7bc37e018d0ed690b7b6520ade518285dc3171f7a117905"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7ff762670cada8e05b32bf1e4dc50b140790909caa8303cfddc4d702b71ea184"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:57f0a0bbc9868e10ebe874e9f129d2917750adf008fe7b9c1598c0fbbfdde6a6"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:a6d2092797b388342c1bc932077ad232f914351932353e2e8706851c870bca1f"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:60499fe961b21264e17a471ec296dcbf4365fbea611bf9e303ab69db7159ce61"}, + {file = "lxml-5.2.2-cp37-cp37m-win32.whl", hash = "sha256:d9b342c76003c6b9336a80efcc766748a333573abf9350f4094ee46b006ec18f"}, + {file = "lxml-5.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b16db2770517b8799c79aa80f4053cd6f8b716f21f8aca962725a9565ce3ee40"}, + {file = "lxml-5.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7ed07b3062b055d7a7f9d6557a251cc655eed0b3152b76de619516621c56f5d3"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f60fdd125d85bf9c279ffb8e94c78c51b3b6a37711464e1f5f31078b45002421"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a7e24cb69ee5f32e003f50e016d5fde438010c1022c96738b04fc2423e61706"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23cfafd56887eaed93d07bc4547abd5e09d837a002b791e9767765492a75883f"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:19b4e485cd07b7d83e3fe3b72132e7df70bfac22b14fe4bf7a23822c3a35bff5"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7ce7ad8abebe737ad6143d9d3bf94b88b93365ea30a5b81f6877ec9c0dee0a48"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e49b052b768bb74f58c7dda4e0bdf7b79d43a9204ca584ffe1fb48a6f3c84c66"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d14a0d029a4e176795cef99c056d58067c06195e0c7e2dbb293bf95c08f772a3"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:be49ad33819d7dcc28a309b86d4ed98e1a65f3075c6acd3cd4fe32103235222b"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a6d17e0370d2516d5bb9062c7b4cb731cff921fc875644c3d751ad857ba9c5b1"}, + {file = "lxml-5.2.2-cp38-cp38-win32.whl", hash = "sha256:5b8c041b6265e08eac8a724b74b655404070b636a8dd6d7a13c3adc07882ef30"}, + {file = "lxml-5.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:f61efaf4bed1cc0860e567d2ecb2363974d414f7f1f124b1df368bbf183453a6"}, + {file = "lxml-5.2.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fb91819461b1b56d06fa4bcf86617fac795f6a99d12239fb0c68dbeba41a0a30"}, + {file = "lxml-5.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d4ed0c7cbecde7194cd3228c044e86bf73e30a23505af852857c09c24e77ec5d"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54401c77a63cc7d6dc4b4e173bb484f28a5607f3df71484709fe037c92d4f0ed"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:625e3ef310e7fa3a761d48ca7ea1f9d8718a32b1542e727d584d82f4453d5eeb"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:519895c99c815a1a24a926d5b60627ce5ea48e9f639a5cd328bda0515ea0f10c"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c7079d5eb1c1315a858bbf180000757db8ad904a89476653232db835c3114001"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:343ab62e9ca78094f2306aefed67dcfad61c4683f87eee48ff2fd74902447726"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:cd9e78285da6c9ba2d5c769628f43ef66d96ac3085e59b10ad4f3707980710d3"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_ppc64le.whl", hash = "sha256:546cf886f6242dff9ec206331209db9c8e1643ae642dea5fdbecae2453cb50fd"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_s390x.whl", hash = "sha256:02f6a8eb6512fdc2fd4ca10a49c341c4e109aa6e9448cc4859af5b949622715a"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:339ee4a4704bc724757cd5dd9dc8cf4d00980f5d3e6e06d5847c1b594ace68ab"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0a028b61a2e357ace98b1615fc03f76eb517cc028993964fe08ad514b1e8892d"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f90e552ecbad426eab352e7b2933091f2be77115bb16f09f78404861c8322981"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:d83e2d94b69bf31ead2fa45f0acdef0757fa0458a129734f59f67f3d2eb7ef32"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a02d3c48f9bb1e10c7788d92c0c7db6f2002d024ab6e74d6f45ae33e3d0288a3"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6d68ce8e7b2075390e8ac1e1d3a99e8b6372c694bbe612632606d1d546794207"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:453d037e09a5176d92ec0fd282e934ed26d806331a8b70ab431a81e2fbabf56d"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:3b019d4ee84b683342af793b56bb35034bd749e4cbdd3d33f7d1107790f8c472"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb3942960f0beb9f46e2a71a3aca220d1ca32feb5a398656be934320804c0df9"}, + {file = "lxml-5.2.2-cp39-cp39-win32.whl", hash = "sha256:ac6540c9fff6e3813d29d0403ee7a81897f1d8ecc09a8ff84d2eea70ede1cdbf"}, + {file = "lxml-5.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:610b5c77428a50269f38a534057444c249976433f40f53e3b47e68349cca1425"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b537bd04d7ccd7c6350cdaaaad911f6312cbd61e6e6045542f781c7f8b2e99d2"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4820c02195d6dfb7b8508ff276752f6b2ff8b64ae5d13ebe02e7667e035000b9"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a09f6184f17a80897172863a655467da2b11151ec98ba8d7af89f17bf63dae"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:76acba4c66c47d27c8365e7c10b3d8016a7da83d3191d053a58382311a8bf4e1"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b128092c927eaf485928cec0c28f6b8bead277e28acf56800e972aa2c2abd7a2"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ae791f6bd43305aade8c0e22f816b34f3b72b6c820477aab4d18473a37e8090b"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a2f6a1bc2460e643785a2cde17293bd7a8f990884b822f7bca47bee0a82fc66b"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e8d351ff44c1638cb6e980623d517abd9f580d2e53bfcd18d8941c052a5a009"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bec4bd9133420c5c52d562469c754f27c5c9e36ee06abc169612c959bd7dbb07"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:55ce6b6d803890bd3cc89975fca9de1dff39729b43b73cb15ddd933b8bc20484"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8ab6a358d1286498d80fe67bd3d69fcbc7d1359b45b41e74c4a26964ca99c3f8"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:06668e39e1f3c065349c51ac27ae430719d7806c026fec462e5693b08b95696b"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9cd5323344d8ebb9fb5e96da5de5ad4ebab993bbf51674259dbe9d7a18049525"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89feb82ca055af0fe797a2323ec9043b26bc371365847dbe83c7fd2e2f181c34"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e481bba1e11ba585fb06db666bfc23dbe181dbafc7b25776156120bf12e0d5a6"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:9d6c6ea6a11ca0ff9cd0390b885984ed31157c168565702959c25e2191674a14"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3d98de734abee23e61f6b8c2e08a88453ada7d6486dc7cdc82922a03968928db"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:69ab77a1373f1e7563e0fb5a29a8440367dec051da6c7405333699d07444f511"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:34e17913c431f5ae01d8658dbf792fdc457073dcdfbb31dc0cc6ab256e664a8d"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05f8757b03208c3f50097761be2dea0aba02e94f0dc7023ed73a7bb14ff11eb0"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a520b4f9974b0a0a6ed73c2154de57cdfd0c8800f4f15ab2b73238ffed0b36e"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5e097646944b66207023bc3c634827de858aebc226d5d4d6d16f0b77566ea182"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b5e4ef22ff25bfd4ede5f8fb30f7b24446345f3e79d9b7455aef2836437bc38a"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ff69a9a0b4b17d78170c73abe2ab12084bdf1691550c5629ad1fe7849433f324"}, + {file = "lxml-5.2.2.tar.gz", hash = "sha256:bb2dc4898180bea79863d5487e5f9c7c34297414bad54bcd0f0852aee9cfdb87"}, +] + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html-clean = ["lxml-html-clean"] +html5 = ["html5lib"] +htmlsoup = ["BeautifulSoup4"] +source = ["Cython (>=3.0.10)"] + +[[package]] +name = "markupsafe" +version = "2.1.5" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +] + +[[package]] +name = "marshmallow" +version = "3.21.3" +description = "A lightweight library for converting complex datatypes to and from native Python datatypes." +optional = false +python-versions = ">=3.8" +files = [ + {file = "marshmallow-3.21.3-py3-none-any.whl", hash = "sha256:86ce7fb914aa865001a4b2092c4c2872d13bc347f3d42673272cabfdbad386f1"}, + {file = "marshmallow-3.21.3.tar.gz", hash = "sha256:4f57c5e050a54d66361e826f94fba213eb10b67b2fdb02c3e0343ce207ba1662"}, +] + +[package.dependencies] +packaging = ">=17.0" + +[package.extras] +dev = ["marshmallow[tests]", "pre-commit (>=3.5,<4.0)", "tox"] +docs = ["alabaster (==0.7.16)", "autodocsumm (==0.2.12)", "sphinx (==7.3.7)", "sphinx-issues (==4.1.0)", "sphinx-version-warning (==1.1.2)"] +tests = ["pytest", "pytz", "simplejson"] + +[[package]] +name = "mpmath" +version = "1.3.0" +description = "Python library for arbitrary-precision floating-point arithmetic" +optional = false +python-versions = "*" +files = [ + {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, + {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, +] + +[package.extras] +develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"] +docs = ["sphinx"] +gmpy = ["gmpy2 (>=2.1.0a4)"] +tests = ["pytest (>=4.6)"] + +[[package]] +name = "msal" +version = "1.30.0" +description = "The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of users with Microsoft Azure Active Directory accounts (AAD) and Microsoft Accounts (MSA) using industry standard OAuth2 and OpenID Connect." +optional = false +python-versions = ">=3.7" +files = [ + {file = "msal-1.30.0-py3-none-any.whl", hash = "sha256:423872177410cb61683566dc3932db7a76f661a5d2f6f52f02a047f101e1c1de"}, + {file = "msal-1.30.0.tar.gz", hash = "sha256:b4bf00850092e465157d814efa24a18f788284c9a479491024d62903085ea2fb"}, +] + +[package.dependencies] +cryptography = ">=2.5,<45" +PyJWT = {version = ">=1.0.0,<3", extras = ["crypto"]} +requests = ">=2.0.0,<3" + +[package.extras] +broker = ["pymsalruntime (>=0.13.2,<0.17)"] + +[[package]] +name = "msal-extensions" +version = "1.2.0" +description = "Microsoft Authentication Library extensions (MSAL EX) provides a persistence API that can save your data on disk, encrypted on Windows, macOS and Linux. Concurrent data access will be coordinated by a file lock mechanism." +optional = false +python-versions = ">=3.7" +files = [ + {file = "msal_extensions-1.2.0-py3-none-any.whl", hash = "sha256:cf5ba83a2113fa6dc011a254a72f1c223c88d7dfad74cc30617c4679a417704d"}, + {file = "msal_extensions-1.2.0.tar.gz", hash = "sha256:6f41b320bfd2933d631a215c91ca0dd3e67d84bd1a2f50ce917d5874ec646bef"}, +] + +[package.dependencies] +msal = ">=1.29,<2" +portalocker = ">=1.4,<3" + +[[package]] +name = "multidict" +version = "6.0.5" +description = "multidict implementation" +optional = false +python-versions = ">=3.7" +files = [ + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, + {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, + {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, + {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, + {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, + {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, + {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, + {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, + {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, + {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, + {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, + {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, + {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, + {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, + {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, + {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, +] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "nest-asyncio" +version = "1.6.0" +description = "Patch asyncio to allow nested event loops" +optional = false +python-versions = ">=3.5" +files = [ + {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, + {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, +] + +[[package]] +name = "networkx" +version = "3.3" +description = "Python package for creating and manipulating graphs and networks" +optional = false +python-versions = ">=3.10" +files = [ + {file = "networkx-3.3-py3-none-any.whl", hash = "sha256:28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2"}, + {file = "networkx-3.3.tar.gz", hash = "sha256:0c127d8b2f4865f59ae9cb8aafcd60b5c70f3241ebd66f7defad7c4ab90126c9"}, +] + +[package.extras] +default = ["matplotlib (>=3.6)", "numpy (>=1.23)", "pandas (>=1.4)", "scipy (>=1.9,!=1.11.0,!=1.11.1)"] +developer = ["changelist (==0.5)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"] +doc = ["myst-nb (>=1.0)", "numpydoc (>=1.7)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.14)", "sphinx (>=7)", "sphinx-gallery (>=0.14)", "texext (>=0.6.7)"] +extra = ["lxml (>=4.6)", "pydot (>=2.0)", "pygraphviz (>=1.12)", "sympy (>=1.10)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] + +[[package]] +name = "newspaper3k" +version = "0.2.8" +description = "Simplified python article discovery & extraction." +optional = false +python-versions = "*" +files = [ + {file = "newspaper3k-0.2.8-py3-none-any.whl", hash = "sha256:44a864222633d3081113d1030615991c3dbba87239f6bbf59d91240f71a22e3e"}, + {file = "newspaper3k-0.2.8.tar.gz", hash = "sha256:9f1bd3e1fb48f400c715abf875cc7b0a67b7ddcd87f50c9aeeb8fcbbbd9004fb"}, +] + +[package.dependencies] +beautifulsoup4 = ">=4.4.1" +cssselect = ">=0.9.2" +feedfinder2 = ">=0.0.4" +feedparser = ">=5.2.1" +jieba3k = ">=0.35.1" +lxml = ">=3.6.0" +nltk = ">=3.2.1" +Pillow = ">=3.3.0" +python-dateutil = ">=2.5.3" +PyYAML = ">=3.11" +requests = ">=2.10.0" +tinysegmenter = "0.3" +tldextract = ">=2.0.1" + +[[package]] +name = "nltk" +version = "3.8.1" +description = "Natural Language Toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "nltk-3.8.1-py3-none-any.whl", hash = "sha256:fd5c9109f976fa86bcadba8f91e47f5e9293bd034474752e92a520f81c93dda5"}, + {file = "nltk-3.8.1.zip", hash = "sha256:1834da3d0682cba4f2cede2f9aad6b0fafb6461ba451db0efb6f9c39798d64d3"}, +] + +[package.dependencies] +click = "*" +joblib = "*" +regex = ">=2021.8.3" +tqdm = "*" + +[package.extras] +all = ["matplotlib", "numpy", "pyparsing", "python-crfsuite", "requests", "scikit-learn", "scipy", "twython"] +corenlp = ["requests"] +machine-learning = ["numpy", "python-crfsuite", "scikit-learn", "scipy"] +plot = ["matplotlib"] +tgrep = ["pyparsing"] +twitter = ["twython"] + +[[package]] +name = "numpy" +version = "1.26.4" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, +] + +[[package]] +name = "nvidia-cublas-cu12" +version = "12.1.3.1" +description = "CUBLAS native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:ee53ccca76a6fc08fb9701aa95b6ceb242cdaab118c3bb152af4e579af792728"}, + {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-win_amd64.whl", hash = "sha256:2b964d60e8cf11b5e1073d179d85fa340c120e99b3067558f3cf98dd69d02906"}, +] + +[[package]] +name = "nvidia-cuda-cupti-cu12" +version = "12.1.105" +description = "CUDA profiling tools runtime libs." +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:e54fde3983165c624cb79254ae9818a456eb6e87a7fd4d56a2352c24ee542d7e"}, + {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:bea8236d13a0ac7190bd2919c3e8e6ce1e402104276e6f9694479e48bb0eb2a4"}, +] + +[[package]] +name = "nvidia-cuda-nvrtc-cu12" +version = "12.1.105" +description = "NVRTC native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:339b385f50c309763ca65456ec75e17bbefcbbf2893f462cb8b90584cd27a1c2"}, + {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:0a98a522d9ff138b96c010a65e145dc1b4850e9ecb75a0172371793752fd46ed"}, +] + +[[package]] +name = "nvidia-cuda-runtime-cu12" +version = "12.1.105" +description = "CUDA Runtime native Libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:6e258468ddf5796e25f1dc591a31029fa317d97a0a94ed93468fc86301d61e40"}, + {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:dfb46ef84d73fababab44cf03e3b83f80700d27ca300e537f85f636fac474344"}, +] + +[[package]] +name = "nvidia-cudnn-cu12" +version = "8.9.2.26" +description = "cuDNN runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cudnn_cu12-8.9.2.26-py3-none-manylinux1_x86_64.whl", hash = "sha256:5ccb288774fdfb07a7e7025ffec286971c06d8d7b4fb162525334616d7629ff9"}, +] + +[package.dependencies] +nvidia-cublas-cu12 = "*" + +[[package]] +name = "nvidia-cufft-cu12" +version = "11.0.2.54" +description = "CUFFT native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl", hash = "sha256:794e3948a1aa71fd817c3775866943936774d1c14e7628c74f6f7417224cdf56"}, + {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-win_amd64.whl", hash = "sha256:d9ac353f78ff89951da4af698f80870b1534ed69993f10a4cf1d96f21357e253"}, +] + +[[package]] +name = "nvidia-curand-cu12" +version = "10.3.2.106" +description = "CURAND native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:9d264c5036dde4e64f1de8c50ae753237c12e0b1348738169cd0f8a536c0e1e0"}, + {file = "nvidia_curand_cu12-10.3.2.106-py3-none-win_amd64.whl", hash = "sha256:75b6b0c574c0037839121317e17fd01f8a69fd2ef8e25853d826fec30bdba74a"}, +] + +[[package]] +name = "nvidia-cusolver-cu12" +version = "11.4.5.107" +description = "CUDA solver native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl", hash = "sha256:8a7ec542f0412294b15072fa7dab71d31334014a69f953004ea7a118206fe0dd"}, + {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-win_amd64.whl", hash = "sha256:74e0c3a24c78612192a74fcd90dd117f1cf21dea4822e66d89e8ea80e3cd2da5"}, +] + +[package.dependencies] +nvidia-cublas-cu12 = "*" +nvidia-cusparse-cu12 = "*" +nvidia-nvjitlink-cu12 = "*" + +[[package]] +name = "nvidia-cusparse-cu12" +version = "12.1.0.106" +description = "CUSPARSE native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:f3b50f42cf363f86ab21f720998517a659a48131e8d538dc02f8768237bd884c"}, + {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-win_amd64.whl", hash = "sha256:b798237e81b9719373e8fae8d4f091b70a0cf09d9d85c95a557e11df2d8e9a5a"}, +] + +[package.dependencies] +nvidia-nvjitlink-cu12 = "*" + +[[package]] +name = "nvidia-nccl-cu12" +version = "2.19.3" +description = "NVIDIA Collective Communication Library (NCCL) Runtime" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nccl_cu12-2.19.3-py3-none-manylinux1_x86_64.whl", hash = "sha256:a9734707a2c96443331c1e48c717024aa6678a0e2a4cb66b2c364d18cee6b48d"}, +] + +[[package]] +name = "nvidia-nvjitlink-cu12" +version = "12.6.20" +description = "Nvidia JIT LTO Library" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nvjitlink_cu12-12.6.20-py3-none-manylinux2014_aarch64.whl", hash = "sha256:84fb38465a5bc7c70cbc320cfd0963eb302ee25a5e939e9f512bbba55b6072fb"}, + {file = "nvidia_nvjitlink_cu12-12.6.20-py3-none-manylinux2014_x86_64.whl", hash = "sha256:562ab97ea2c23164823b2a89cb328d01d45cb99634b8c65fe7cd60d14562bd79"}, + {file = "nvidia_nvjitlink_cu12-12.6.20-py3-none-win_amd64.whl", hash = "sha256:ed3c43a17f37b0c922a919203d2d36cbef24d41cc3e6b625182f8b58203644f6"}, +] + +[[package]] +name = "nvidia-nvtx-cu12" +version = "12.1.105" +description = "NVIDIA Tools Extension" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:dc21cf308ca5691e7c04d962e213f8a4aa9bbfa23d95412f452254c2caeb09e5"}, + {file = "nvidia_nvtx_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:65f4d98982b31b60026e0e6de73fbdfc09d08a96f4656dd3665ca616a11e1e82"}, +] + +[[package]] +name = "oauthlib" +version = "3.2.2" +description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" +optional = false +python-versions = ">=3.6" +files = [ + {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, + {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, +] + +[package.extras] +rsa = ["cryptography (>=3.0.0)"] +signals = ["blinker (>=1.4.0)"] +signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] + +[[package]] +name = "openai" +version = "1.40.1" +description = "The official Python library for the openai API" +optional = false +python-versions = ">=3.7.1" +files = [ + {file = "openai-1.40.1-py3-none-any.whl", hash = "sha256:cf5929076c6ca31c26f1ed207e9fd19eb05404cc9104f64c9d29bb0ac0c5bcd4"}, + {file = "openai-1.40.1.tar.gz", hash = "sha256:cb1294ac1f8c6a1acbb07e090698eb5ad74a7a88484e77126612a4f22579673d"}, +] + +[package.dependencies] +anyio = ">=3.5.0,<5" +distro = ">=1.7.0,<2" +httpx = ">=0.23.0,<1" +jiter = ">=0.4.0,<1" +pydantic = ">=1.9.0,<3" +sniffio = "*" +tqdm = ">4" +typing-extensions = ">=4.11,<5" + +[package.extras] +datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] + +[[package]] +name = "openssa" +version = "0.24.6.8" +description = "OpenSSA: Small Specialist Agents for Industrial AI" +optional = false +python-versions = ">=3.12,<3.14" +files = [] +develop = false + +[package.dependencies] +adlfs = ">=2024.7" +click = ">=8.1" +docx2txt = ">=0.8" +fsspec = ">=2024.6" +gcsfs = ">=2024.6" +google-api-python-client = ">=2.139" +googlesearch-python = ">=1.2" +httpx = ">=0.27" +huggingface-hub = ">=0.24" +llama-index = ">=0.10" +llama-index-embeddings-azure-openai = ">=0.1" +llama-index-llms-azure-openai = ">=0.1" +llama-index-readers-web = ">=0.1" +loguru = ">=0.7" +openai = ">=1.38" +pycryptodome = ">=3.20" +pydantic = ">=2.8" +pypdf = ">=4.3" +python-dotenv = ">=1.0" +s3fs = ">=2024.6" +torch = ">=2.2,<2.3" +tqdm = ">=4.66" + +[package.extras] +contrib = ["streamlit (>=1.37)", "streamlit-extras (>=0.4)", "streamlit-mic-recorder (>=0.0.8)"] + +[package.source] +type = "git" +url = "https://github.com/aitomatic/openssa.git" +reference = "HEAD" +resolved_reference = "cfae7a6311f47c1d6003946c4eb4bdeb8413114e" + +[[package]] +name = "outcome" +version = "1.3.0.post0" +description = "Capture the outcome of Python function calls." +optional = false +python-versions = ">=3.7" +files = [ + {file = "outcome-1.3.0.post0-py2.py3-none-any.whl", hash = "sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b"}, + {file = "outcome-1.3.0.post0.tar.gz", hash = "sha256:9dcf02e65f2971b80047b377468e72a268e15c0af3cf1238e6ff14f7f91143b8"}, +] + +[package.dependencies] +attrs = ">=19.2.0" + +[[package]] +name = "packaging" +version = "24.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, +] + +[[package]] +name = "pandas" +version = "2.2.2" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"}, + {file = "pandas-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238"}, + {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"}, + {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"}, + {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"}, + {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99"}, + {file = "pandas-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772"}, + {file = "pandas-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288"}, + {file = "pandas-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151"}, + {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b"}, + {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee"}, + {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db"}, + {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1"}, + {file = "pandas-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24"}, + {file = "pandas-2.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef"}, + {file = "pandas-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce"}, + {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad"}, + {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad"}, + {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76"}, + {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"}, + {file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"}, + {file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"}, + {file = "pandas-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd"}, + {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"}, + {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"}, + {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"}, + {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57"}, + {file = "pandas-2.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4"}, + {file = "pandas-2.2.2.tar.gz", hash = "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54"}, +] + +[package.dependencies] +numpy = {version = ">=1.26.0", markers = "python_version >= \"3.12\""} +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.7" + +[package.extras] +all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] +aws = ["s3fs (>=2022.11.0)"] +clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] +compression = ["zstandard (>=0.19.0)"] +computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] +feather = ["pyarrow (>=10.0.1)"] +fss = ["fsspec (>=2022.11.0)"] +gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] +hdf5 = ["tables (>=3.8.0)"] +html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] +mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] +parquet = ["pyarrow (>=10.0.1)"] +performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] +plot = ["matplotlib (>=3.6.3)"] +postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] +pyarrow = ["pyarrow (>=10.0.1)"] +spss = ["pyreadstat (>=1.2.0)"] +sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.9.2)"] + +[[package]] +name = "pillow" +version = "10.4.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, + {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46"}, + {file = "pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984"}, + {file = "pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141"}, + {file = "pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696"}, + {file = "pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496"}, + {file = "pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91"}, + {file = "pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9"}, + {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"}, + {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"}, + {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309"}, + {file = "pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060"}, + {file = "pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea"}, + {file = "pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0"}, + {file = "pillow-10.4.0-cp38-cp38-win32.whl", hash = "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e"}, + {file = "pillow-10.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df"}, + {file = "pillow-10.4.0-cp39-cp39-win32.whl", hash = "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef"}, + {file = "pillow-10.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5"}, + {file = "pillow-10.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3"}, + {file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] + +[[package]] +name = "playwright" +version = "1.45.1" +description = "A high-level API to automate web browsers" +optional = false +python-versions = ">=3.8" +files = [ + {file = "playwright-1.45.1-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:360607e37c00cdf97c74317f010e106ac4671aeaec6a192431dd71a30941da9d"}, + {file = "playwright-1.45.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:20adc2abf164c5e8969f9066011b152e12c210549edec78cd05bd0e9cf4135b7"}, + {file = "playwright-1.45.1-py3-none-macosx_11_0_universal2.whl", hash = "sha256:5f047cdc6accf4c7084dfc7587a2a5ef790cddc44cbb111e471293c5a91119db"}, + {file = "playwright-1.45.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:f06f6659abe0abf263e5f6661d379fbf85c112745dd31d82332ceae914f58df7"}, + {file = "playwright-1.45.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87dc3b3d17e12c68830c29b7fdf5e93315221bbb4c6090e83e967e154e2c1828"}, + {file = "playwright-1.45.1-py3-none-win32.whl", hash = "sha256:2b8f517886ef1e2151982f6e7be84be3ef7d8135bdcf8ee705b4e4e99566e866"}, + {file = "playwright-1.45.1-py3-none-win_amd64.whl", hash = "sha256:0d236cf427784e77de352ba1b7d700693c5fe455b8e5f627f6d84ad5b84b5bf5"}, +] + +[package.dependencies] +greenlet = "3.0.3" +pyee = "11.1.0" + +[[package]] +name = "portalocker" +version = "2.10.1" +description = "Wraps the portalocker recipe for easy usage" +optional = false +python-versions = ">=3.8" +files = [ + {file = "portalocker-2.10.1-py3-none-any.whl", hash = "sha256:53a5984ebc86a025552264b459b46a2086e269b21823cb572f8f28ee759e45bf"}, + {file = "portalocker-2.10.1.tar.gz", hash = "sha256:ef1bf844e878ab08aee7e40184156e1151f228f103aa5c6bd0724cc330960f8f"}, +] + +[package.dependencies] +pywin32 = {version = ">=226", markers = "platform_system == \"Windows\""} + +[package.extras] +docs = ["sphinx (>=1.7.1)"] +redis = ["redis"] +tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "pytest-timeout (>=2.1.0)", "redis", "sphinx (>=6.0.0)", "types-redis"] + +[[package]] +name = "proto-plus" +version = "1.24.0" +description = "Beautiful, Pythonic protocol buffers." +optional = false +python-versions = ">=3.7" +files = [ + {file = "proto-plus-1.24.0.tar.gz", hash = "sha256:30b72a5ecafe4406b0d339db35b56c4059064e69227b8c3bda7462397f966445"}, + {file = "proto_plus-1.24.0-py3-none-any.whl", hash = "sha256:402576830425e5f6ce4c2a6702400ac79897dab0b4343821aa5188b0fab81a12"}, +] + +[package.dependencies] +protobuf = ">=3.19.0,<6.0.0dev" + +[package.extras] +testing = ["google-api-core (>=1.31.5)"] + +[[package]] +name = "protobuf" +version = "5.27.3" +description = "" +optional = false +python-versions = ">=3.8" +files = [ + {file = "protobuf-5.27.3-cp310-abi3-win32.whl", hash = "sha256:dcb307cd4ef8fec0cf52cb9105a03d06fbb5275ce6d84a6ae33bc6cf84e0a07b"}, + {file = "protobuf-5.27.3-cp310-abi3-win_amd64.whl", hash = "sha256:16ddf3f8c6c41e1e803da7abea17b1793a97ef079a912e42351eabb19b2cffe7"}, + {file = "protobuf-5.27.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:68248c60d53f6168f565a8c76dc58ba4fa2ade31c2d1ebdae6d80f969cdc2d4f"}, + {file = "protobuf-5.27.3-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:b8a994fb3d1c11156e7d1e427186662b64694a62b55936b2b9348f0a7c6625ce"}, + {file = "protobuf-5.27.3-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:a55c48f2a2092d8e213bd143474df33a6ae751b781dd1d1f4d953c128a415b25"}, + {file = "protobuf-5.27.3-cp38-cp38-win32.whl", hash = "sha256:043853dcb55cc262bf2e116215ad43fa0859caab79bb0b2d31b708f128ece035"}, + {file = "protobuf-5.27.3-cp38-cp38-win_amd64.whl", hash = "sha256:c2a105c24f08b1e53d6c7ffe69cb09d0031512f0b72f812dd4005b8112dbe91e"}, + {file = "protobuf-5.27.3-cp39-cp39-win32.whl", hash = "sha256:c84eee2c71ed83704f1afbf1a85c3171eab0fd1ade3b399b3fad0884cbcca8bf"}, + {file = "protobuf-5.27.3-cp39-cp39-win_amd64.whl", hash = "sha256:af7c0b7cfbbb649ad26132e53faa348580f844d9ca46fd3ec7ca48a1ea5db8a1"}, + {file = "protobuf-5.27.3-py3-none-any.whl", hash = "sha256:8572c6533e544ebf6899c360e91d6bcbbee2549251643d32c52cf8a5de295ba5"}, + {file = "protobuf-5.27.3.tar.gz", hash = "sha256:82460903e640f2b7e34ee81a947fdaad89de796d324bcbc38ff5430bcdead82c"}, +] + +[[package]] +name = "pyasn1" +version = "0.6.0" +description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyasn1-0.6.0-py2.py3-none-any.whl", hash = "sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473"}, + {file = "pyasn1-0.6.0.tar.gz", hash = "sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c"}, +] + +[[package]] +name = "pyasn1-modules" +version = "0.4.0" +description = "A collection of ASN.1-based protocols modules" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyasn1_modules-0.4.0-py3-none-any.whl", hash = "sha256:be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b"}, + {file = "pyasn1_modules-0.4.0.tar.gz", hash = "sha256:831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6"}, +] + +[package.dependencies] +pyasn1 = ">=0.4.6,<0.7.0" + +[[package]] +name = "pycparser" +version = "2.22" +description = "C parser in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, +] + +[[package]] +name = "pycryptodome" +version = "3.20.0" +description = "Cryptographic library for Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pycryptodome-3.20.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:f0e6d631bae3f231d3634f91ae4da7a960f7ff87f2865b2d2b831af1dfb04e9a"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:baee115a9ba6c5d2709a1e88ffe62b73ecc044852a925dcb67713a288c4ec70f"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:417a276aaa9cb3be91f9014e9d18d10e840a7a9b9a9be64a42f553c5b50b4d1d"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a1250b7ea809f752b68e3e6f3fd946b5939a52eaeea18c73bdab53e9ba3c2dd"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:d5954acfe9e00bc83ed9f5cb082ed22c592fbbef86dc48b907238be64ead5c33"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-win32.whl", hash = "sha256:06d6de87c19f967f03b4cf9b34e538ef46e99a337e9a61a77dbe44b2cbcf0690"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-win_amd64.whl", hash = "sha256:ec0bb1188c1d13426039af8ffcb4dbe3aad1d7680c35a62d8eaf2a529b5d3d4f"}, + {file = "pycryptodome-3.20.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5601c934c498cd267640b57569e73793cb9a83506f7c73a8ec57a516f5b0b091"}, + {file = "pycryptodome-3.20.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d29daa681517f4bc318cd8a23af87e1f2a7bad2fe361e8aa29c77d652a065de4"}, + {file = "pycryptodome-3.20.0-cp27-cp27mu-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3427d9e5310af6680678f4cce149f54e0bb4af60101c7f2c16fdf878b39ccccc"}, + {file = "pycryptodome-3.20.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:3cd3ef3aee1079ae44afaeee13393cf68b1058f70576b11439483e34f93cf818"}, + {file = "pycryptodome-3.20.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac1c7c0624a862f2e53438a15c9259d1655325fc2ec4392e66dc46cdae24d044"}, + {file = "pycryptodome-3.20.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:76658f0d942051d12a9bd08ca1b6b34fd762a8ee4240984f7c06ddfb55eaf15a"}, + {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f35d6cee81fa145333137009d9c8ba90951d7d77b67c79cbe5f03c7eb74d8fe2"}, + {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76cb39afede7055127e35a444c1c041d2e8d2f1f9c121ecef573757ba4cd2c3c"}, + {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a4c4dc60b78ec41d2afa392491d788c2e06edf48580fbfb0dd0f828af49d25"}, + {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fb3b87461fa35afa19c971b0a2b7456a7b1db7b4eba9a8424666104925b78128"}, + {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:acc2614e2e5346a4a4eab6e199203034924313626f9620b7b4b38e9ad74b7e0c"}, + {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:210ba1b647837bfc42dd5a813cdecb5b86193ae11a3f5d972b9a0ae2c7e9e4b4"}, + {file = "pycryptodome-3.20.0-cp35-abi3-win32.whl", hash = "sha256:8d6b98d0d83d21fb757a182d52940d028564efe8147baa9ce0f38d057104ae72"}, + {file = "pycryptodome-3.20.0-cp35-abi3-win_amd64.whl", hash = "sha256:9b3ae153c89a480a0ec402e23db8d8d84a3833b65fa4b15b81b83be9d637aab9"}, + {file = "pycryptodome-3.20.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:4401564ebf37dfde45d096974c7a159b52eeabd9969135f0426907db367a652a"}, + {file = "pycryptodome-3.20.0-pp27-pypy_73-win32.whl", hash = "sha256:ec1f93feb3bb93380ab0ebf8b859e8e5678c0f010d2d78367cf6bc30bfeb148e"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:acae12b9ede49f38eb0ef76fdec2df2e94aad85ae46ec85be3648a57f0a7db04"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f47888542a0633baff535a04726948e876bf1ed880fddb7c10a736fa99146ab3"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e0e4a987d38cfc2e71b4a1b591bae4891eeabe5fa0f56154f576e26287bfdea"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c18b381553638414b38705f07d1ef0a7cf301bc78a5f9bc17a957eb19446834b"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a60fedd2b37b4cb11ccb5d0399efe26db9e0dd149016c1cc6c8161974ceac2d6"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:405002eafad114a2f9a930f5db65feef7b53c4784495dd8758069b89baf68eab"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ab6ab0cb755154ad14e507d1df72de9897e99fd2d4922851a276ccc14f4f1a5"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:acf6e43fa75aca2d33e93409f2dafe386fe051818ee79ee8a3e21de9caa2ac9e"}, + {file = "pycryptodome-3.20.0.tar.gz", hash = "sha256:09609209ed7de61c2b560cc5c8c4fbf892f8b15b1faf7e4cbffac97db1fffda7"}, +] + +[[package]] +name = "pydantic" +version = "2.8.2" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic-2.8.2-py3-none-any.whl", hash = "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8"}, + {file = "pydantic-2.8.2.tar.gz", hash = "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a"}, +] + +[package.dependencies] +annotated-types = ">=0.4.0" +pydantic-core = "2.20.1" +typing-extensions = [ + {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, + {version = ">=4.6.1", markers = "python_version < \"3.13\""}, +] + +[package.extras] +email = ["email-validator (>=2.0.0)"] + +[[package]] +name = "pydantic-core" +version = "2.20.1" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_core-2.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3"}, + {file = "pydantic_core-2.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98"}, + {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a"}, + {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840"}, + {file = "pydantic_core-2.20.1-cp310-none-win32.whl", hash = "sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250"}, + {file = "pydantic_core-2.20.1-cp310-none-win_amd64.whl", hash = "sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c"}, + {file = "pydantic_core-2.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312"}, + {file = "pydantic_core-2.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1"}, + {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b"}, + {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27"}, + {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b"}, + {file = "pydantic_core-2.20.1-cp311-none-win32.whl", hash = "sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a"}, + {file = "pydantic_core-2.20.1-cp311-none-win_amd64.whl", hash = "sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2"}, + {file = "pydantic_core-2.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231"}, + {file = "pydantic_core-2.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e"}, + {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24"}, + {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1"}, + {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd"}, + {file = "pydantic_core-2.20.1-cp312-none-win32.whl", hash = "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688"}, + {file = "pydantic_core-2.20.1-cp312-none-win_amd64.whl", hash = "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d"}, + {file = "pydantic_core-2.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686"}, + {file = "pydantic_core-2.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c"}, + {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83"}, + {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203"}, + {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0"}, + {file = "pydantic_core-2.20.1-cp313-none-win32.whl", hash = "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e"}, + {file = "pydantic_core-2.20.1-cp313-none-win_amd64.whl", hash = "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20"}, + {file = "pydantic_core-2.20.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91"}, + {file = "pydantic_core-2.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598"}, + {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd"}, + {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa"}, + {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987"}, + {file = "pydantic_core-2.20.1-cp38-none-win32.whl", hash = "sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a"}, + {file = "pydantic_core-2.20.1-cp38-none-win_amd64.whl", hash = "sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434"}, + {file = "pydantic_core-2.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c"}, + {file = "pydantic_core-2.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006"}, + {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1"}, + {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09"}, + {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab"}, + {file = "pydantic_core-2.20.1-cp39-none-win32.whl", hash = "sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2"}, + {file = "pydantic_core-2.20.1-cp39-none-win_amd64.whl", hash = "sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99"}, + {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a"}, + {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7"}, + {file = "pydantic_core-2.20.1.tar.gz", hash = "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + +[[package]] +name = "pyee" +version = "11.1.0" +description = "A rough port of Node.js's EventEmitter to Python with a few tricks of its own" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyee-11.1.0-py3-none-any.whl", hash = "sha256:5d346a7d0f861a4b2e6c47960295bd895f816725b27d656181947346be98d7c1"}, + {file = "pyee-11.1.0.tar.gz", hash = "sha256:b53af98f6990c810edd9b56b87791021a8f54fd13db4edd1142438d44ba2263f"}, +] + +[package.dependencies] +typing-extensions = "*" + +[package.extras] +dev = ["black", "build", "flake8", "flake8-black", "isort", "jupyter-console", "mkdocs", "mkdocs-include-markdown-plugin", "mkdocstrings[python]", "pytest", "pytest-asyncio", "pytest-trio", "sphinx", "toml", "tox", "trio", "trio", "trio-typing", "twine", "twisted", "validate-pyproject[all]"] + +[[package]] +name = "pyjwt" +version = "2.9.0" +description = "JSON Web Token implementation in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "PyJWT-2.9.0-py3-none-any.whl", hash = "sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850"}, + {file = "pyjwt-2.9.0.tar.gz", hash = "sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c"}, +] + +[package.dependencies] +cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"crypto\""} + +[package.extras] +crypto = ["cryptography (>=3.4.0)"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] +docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] +tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] + +[[package]] +name = "pyparsing" +version = "3.1.2" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"}, + {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "pypdf" +version = "4.3.1" +description = "A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pypdf-4.3.1-py3-none-any.whl", hash = "sha256:64b31da97eda0771ef22edb1bfecd5deee4b72c3d1736b7df2689805076d6418"}, + {file = "pypdf-4.3.1.tar.gz", hash = "sha256:b2f37fe9a3030aa97ca86067a56ba3f9d3565f9a791b305c7355d8392c30d91b"}, +] + +[package.extras] +crypto = ["PyCryptodome", "cryptography"] +dev = ["black", "flit", "pip-tools", "pre-commit (<2.18.0)", "pytest-cov", "pytest-socket", "pytest-timeout", "pytest-xdist", "wheel"] +docs = ["myst_parser", "sphinx", "sphinx_rtd_theme"] +full = ["Pillow (>=8.0.0)", "PyCryptodome", "cryptography"] +image = ["Pillow (>=8.0.0)"] + +[[package]] +name = "pysocks" +version = "1.7.1" +description = "A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "PySocks-1.7.1-py27-none-any.whl", hash = "sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299"}, + {file = "PySocks-1.7.1-py3-none-any.whl", hash = "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5"}, + {file = "PySocks-1.7.1.tar.gz", hash = "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0"}, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-dotenv" +version = "1.0.1" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, + {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "pytz" +version = "2024.1" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, +] + +[[package]] +name = "pywin32" +version = "306" +description = "Python for Window Extensions" +optional = false +python-versions = "*" +files = [ + {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, + {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, + {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, + {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, + {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, + {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, + {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, + {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, + {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, + {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, + {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, + {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, + {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, + {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, +] + +[[package]] +name = "regex" +version = "2024.7.24" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.8" +files = [ + {file = "regex-2024.7.24-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b0d3f567fafa0633aee87f08b9276c7062da9616931382993c03808bb68ce"}, + {file = "regex-2024.7.24-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3426de3b91d1bc73249042742f45c2148803c111d1175b283270177fdf669024"}, + {file = "regex-2024.7.24-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f273674b445bcb6e4409bf8d1be67bc4b58e8b46fd0d560055d515b8830063cd"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23acc72f0f4e1a9e6e9843d6328177ae3074b4182167e34119ec7233dfeccf53"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65fd3d2e228cae024c411c5ccdffae4c315271eee4a8b839291f84f796b34eca"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c414cbda77dbf13c3bc88b073a1a9f375c7b0cb5e115e15d4b73ec3a2fbc6f59"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf7a89eef64b5455835f5ed30254ec19bf41f7541cd94f266ab7cbd463f00c41"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19c65b00d42804e3fbea9708f0937d157e53429a39b7c61253ff15670ff62cb5"}, + {file = "regex-2024.7.24-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7a5486ca56c8869070a966321d5ab416ff0f83f30e0e2da1ab48815c8d165d46"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6f51f9556785e5a203713f5efd9c085b4a45aecd2a42573e2b5041881b588d1f"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a4997716674d36a82eab3e86f8fa77080a5d8d96a389a61ea1d0e3a94a582cf7"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c0abb5e4e8ce71a61d9446040c1e86d4e6d23f9097275c5bd49ed978755ff0fe"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:18300a1d78cf1290fa583cd8b7cde26ecb73e9f5916690cf9d42de569c89b1ce"}, + {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:416c0e4f56308f34cdb18c3f59849479dde5b19febdcd6e6fa4d04b6c31c9faa"}, + {file = "regex-2024.7.24-cp310-cp310-win32.whl", hash = "sha256:fb168b5924bef397b5ba13aabd8cf5df7d3d93f10218d7b925e360d436863f66"}, + {file = "regex-2024.7.24-cp310-cp310-win_amd64.whl", hash = "sha256:6b9fc7e9cc983e75e2518496ba1afc524227c163e43d706688a6bb9eca41617e"}, + {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:382281306e3adaaa7b8b9ebbb3ffb43358a7bbf585fa93821300a418bb975281"}, + {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4fdd1384619f406ad9037fe6b6eaa3de2749e2e12084abc80169e8e075377d3b"}, + {file = "regex-2024.7.24-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3d974d24edb231446f708c455fd08f94c41c1ff4f04bcf06e5f36df5ef50b95a"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2ec4419a3fe6cf8a4795752596dfe0adb4aea40d3683a132bae9c30b81e8d73"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb563dd3aea54c797adf513eeec819c4213d7dbfc311874eb4fd28d10f2ff0f2"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45104baae8b9f67569f0f1dca5e1f1ed77a54ae1cd8b0b07aba89272710db61e"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:994448ee01864501912abf2bad9203bffc34158e80fe8bfb5b031f4f8e16da51"}, + {file = "regex-2024.7.24-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fac296f99283ac232d8125be932c5cd7644084a30748fda013028c815ba3364"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7e37e809b9303ec3a179085415cb5f418ecf65ec98cdfe34f6a078b46ef823ee"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:01b689e887f612610c869421241e075c02f2e3d1ae93a037cb14f88ab6a8934c"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f6442f0f0ff81775eaa5b05af8a0ffa1dda36e9cf6ec1e0d3d245e8564b684ce"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:871e3ab2838fbcb4e0865a6e01233975df3a15e6fce93b6f99d75cacbd9862d1"}, + {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c918b7a1e26b4ab40409820ddccc5d49871a82329640f5005f73572d5eaa9b5e"}, + {file = "regex-2024.7.24-cp311-cp311-win32.whl", hash = "sha256:2dfbb8baf8ba2c2b9aa2807f44ed272f0913eeeba002478c4577b8d29cde215c"}, + {file = "regex-2024.7.24-cp311-cp311-win_amd64.whl", hash = "sha256:538d30cd96ed7d1416d3956f94d54e426a8daf7c14527f6e0d6d425fcb4cca52"}, + {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fe4ebef608553aff8deb845c7f4f1d0740ff76fa672c011cc0bacb2a00fbde86"}, + {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:74007a5b25b7a678459f06559504f1eec2f0f17bca218c9d56f6a0a12bfffdad"}, + {file = "regex-2024.7.24-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7df9ea48641da022c2a3c9c641650cd09f0cd15e8908bf931ad538f5ca7919c9"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a1141a1dcc32904c47f6846b040275c6e5de0bf73f17d7a409035d55b76f289"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80c811cfcb5c331237d9bad3bea2c391114588cf4131707e84d9493064d267f9"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7214477bf9bd195894cf24005b1e7b496f46833337b5dedb7b2a6e33f66d962c"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d55588cba7553f0b6ec33130bc3e114b355570b45785cebdc9daed8c637dd440"}, + {file = "regex-2024.7.24-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:558a57cfc32adcf19d3f791f62b5ff564922942e389e3cfdb538a23d65a6b610"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a512eed9dfd4117110b1881ba9a59b31433caed0c4101b361f768e7bcbaf93c5"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:86b17ba823ea76256b1885652e3a141a99a5c4422f4a869189db328321b73799"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5eefee9bfe23f6df09ffb6dfb23809f4d74a78acef004aa904dc7c88b9944b05"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:731fcd76bbdbf225e2eb85b7c38da9633ad3073822f5ab32379381e8c3c12e94"}, + {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eaef80eac3b4cfbdd6de53c6e108b4c534c21ae055d1dbea2de6b3b8ff3def38"}, + {file = "regex-2024.7.24-cp312-cp312-win32.whl", hash = "sha256:185e029368d6f89f36e526764cf12bf8d6f0e3a2a7737da625a76f594bdfcbfc"}, + {file = "regex-2024.7.24-cp312-cp312-win_amd64.whl", hash = "sha256:2f1baff13cc2521bea83ab2528e7a80cbe0ebb2c6f0bfad15be7da3aed443908"}, + {file = "regex-2024.7.24-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:66b4c0731a5c81921e938dcf1a88e978264e26e6ac4ec96a4d21ae0354581ae0"}, + {file = "regex-2024.7.24-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:88ecc3afd7e776967fa16c80f974cb79399ee8dc6c96423321d6f7d4b881c92b"}, + {file = "regex-2024.7.24-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:64bd50cf16bcc54b274e20235bf8edbb64184a30e1e53873ff8d444e7ac656b2"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb462f0e346fcf41a901a126b50f8781e9a474d3927930f3490f38a6e73b6950"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a82465ebbc9b1c5c50738536fdfa7cab639a261a99b469c9d4c7dcbb2b3f1e57"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:68a8f8c046c6466ac61a36b65bb2395c74451df2ffb8458492ef49900efed293"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac8e84fff5d27420f3c1e879ce9929108e873667ec87e0c8eeb413a5311adfe"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba2537ef2163db9e6ccdbeb6f6424282ae4dea43177402152c67ef869cf3978b"}, + {file = "regex-2024.7.24-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:43affe33137fcd679bdae93fb25924979517e011f9dea99163f80b82eadc7e53"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:c9bb87fdf2ab2370f21e4d5636e5317775e5d51ff32ebff2cf389f71b9b13750"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:945352286a541406f99b2655c973852da7911b3f4264e010218bbc1cc73168f2"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:8bc593dcce679206b60a538c302d03c29b18e3d862609317cb560e18b66d10cf"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:3f3b6ca8eae6d6c75a6cff525c8530c60e909a71a15e1b731723233331de4169"}, + {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c51edc3541e11fbe83f0c4d9412ef6c79f664a3745fab261457e84465ec9d5a8"}, + {file = "regex-2024.7.24-cp38-cp38-win32.whl", hash = "sha256:d0a07763776188b4db4c9c7fb1b8c494049f84659bb387b71c73bbc07f189e96"}, + {file = "regex-2024.7.24-cp38-cp38-win_amd64.whl", hash = "sha256:8fd5afd101dcf86a270d254364e0e8dddedebe6bd1ab9d5f732f274fa00499a5"}, + {file = "regex-2024.7.24-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0ffe3f9d430cd37d8fa5632ff6fb36d5b24818c5c986893063b4e5bdb84cdf24"}, + {file = "regex-2024.7.24-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:25419b70ba00a16abc90ee5fce061228206173231f004437730b67ac77323f0d"}, + {file = "regex-2024.7.24-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:33e2614a7ce627f0cdf2ad104797d1f68342d967de3695678c0cb84f530709f8"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d33a0021893ede5969876052796165bab6006559ab845fd7b515a30abdd990dc"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04ce29e2c5fedf296b1a1b0acc1724ba93a36fb14031f3abfb7abda2806c1535"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b16582783f44fbca6fcf46f61347340c787d7530d88b4d590a397a47583f31dd"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:836d3cc225b3e8a943d0b02633fb2f28a66e281290302a79df0e1eaa984ff7c1"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:438d9f0f4bc64e8dea78274caa5af971ceff0f8771e1a2333620969936ba10be"}, + {file = "regex-2024.7.24-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:973335b1624859cb0e52f96062a28aa18f3a5fc77a96e4a3d6d76e29811a0e6e"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c5e69fd3eb0b409432b537fe3c6f44ac089c458ab6b78dcec14478422879ec5f"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fbf8c2f00904eaf63ff37718eb13acf8e178cb940520e47b2f05027f5bb34ce3"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2757ace61bc4061b69af19e4689fa4416e1a04840f33b441034202b5cd02d4"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:44fc61b99035fd9b3b9453f1713234e5a7c92a04f3577252b45feefe1b327759"}, + {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:84c312cdf839e8b579f504afcd7b65f35d60b6285d892b19adea16355e8343c9"}, + {file = "regex-2024.7.24-cp39-cp39-win32.whl", hash = "sha256:ca5b2028c2f7af4e13fb9fc29b28d0ce767c38c7facdf64f6c2cd040413055f1"}, + {file = "regex-2024.7.24-cp39-cp39-win_amd64.whl", hash = "sha256:7c479f5ae937ec9985ecaf42e2e10631551d909f203e31308c12d703922742f9"}, + {file = "regex-2024.7.24.tar.gz", hash = "sha256:9cfd009eed1a46b27c14039ad5bbc5e71b6367c5b2e6d5f5da0ea91600817506"}, +] + +[[package]] +name = "requests" +version = "2.32.3" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.8" +files = [ + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "requests-file" +version = "2.1.0" +description = "File transport adapter for Requests" +optional = false +python-versions = "*" +files = [ + {file = "requests_file-2.1.0-py2.py3-none-any.whl", hash = "sha256:cf270de5a4c5874e84599fc5778303d496c10ae5e870bfa378818f35d21bda5c"}, + {file = "requests_file-2.1.0.tar.gz", hash = "sha256:0f549a3f3b0699415ac04d167e9cb39bccfb730cb832b4d20be3d9867356e658"}, +] + +[package.dependencies] +requests = ">=1.0.0" + +[[package]] +name = "requests-oauthlib" +version = "2.0.0" +description = "OAuthlib authentication support for Requests." +optional = false +python-versions = ">=3.4" +files = [ + {file = "requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9"}, + {file = "requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36"}, +] + +[package.dependencies] +oauthlib = ">=3.0.0" +requests = ">=2.0.0" + +[package.extras] +rsa = ["oauthlib[signedtoken] (>=3.0.0)"] + +[[package]] +name = "rsa" +version = "4.9" +description = "Pure-Python RSA implementation" +optional = false +python-versions = ">=3.6,<4" +files = [ + {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, + {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, +] + +[package.dependencies] +pyasn1 = ">=0.1.3" + +[[package]] +name = "s3fs" +version = "2024.6.1" +description = "Convenient Filesystem interface over S3" +optional = false +python-versions = ">=3.8" +files = [ + {file = "s3fs-2024.6.1-py3-none-any.whl", hash = "sha256:ecd20863437409eec1cbfff0b7df5e9772cf7c1926008efab2e17e46f6d52c63"}, + {file = "s3fs-2024.6.1.tar.gz", hash = "sha256:6c2106d6c34fbfbb88e3d20c6f3572896d5ee3d3512896696301c21a3c541bea"}, +] + +[package.dependencies] +aiobotocore = ">=2.5.4,<3.0.0" +aiohttp = "<4.0.0a0 || >4.0.0a0,<4.0.0a1 || >4.0.0a1" +fsspec = "==2024.6.1.*" + +[package.extras] +awscli = ["aiobotocore[awscli] (>=2.5.4,<3.0.0)"] +boto3 = ["aiobotocore[boto3] (>=2.5.4,<3.0.0)"] + +[[package]] +name = "selenium" +version = "4.23.1" +description = "Official Python bindings for Selenium WebDriver" +optional = false +python-versions = ">=3.8" +files = [ + {file = "selenium-4.23.1-py3-none-any.whl", hash = "sha256:3a8d9f23dc636bd3840dd56f00c2739e32ec0c1e34a821dd553e15babef24477"}, + {file = "selenium-4.23.1.tar.gz", hash = "sha256:128d099e66284437e7128d2279176ec7a06e6ec7426e167f5d34987166bd8f46"}, +] + +[package.dependencies] +certifi = ">=2021.10.8" +trio = ">=0.17,<1.0" +trio-websocket = ">=0.9,<1.0" +typing_extensions = ">=4.9,<5.0" +urllib3 = {version = ">=1.26,<3", extras = ["socks"]} +websocket-client = ">=1.8,<2.0" + +[[package]] +name = "sgmllib3k" +version = "1.0.0" +description = "Py3k port of sgmllib." +optional = false +python-versions = "*" +files = [ + {file = "sgmllib3k-1.0.0.tar.gz", hash = "sha256:7868fb1c8bfa764c1ac563d3cf369c381d1325d36124933a726f29fcdaa812e9"}, +] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + +[[package]] +name = "sortedcontainers" +version = "2.4.0" +description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" +optional = false +python-versions = "*" +files = [ + {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, + {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, +] + +[[package]] +name = "soupsieve" +version = "2.5" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.8" +files = [ + {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, + {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, +] + +[[package]] +name = "spider-client" +version = "0.0.27" +description = "Python SDK for Spider Cloud API" +optional = false +python-versions = "*" +files = [ + {file = "spider-client-0.0.27.tar.gz", hash = "sha256:c3feaf5c491bd9a6c509efa0c8789452497073d9f68e70fc90e7626a6a8365aa"}, +] + +[package.dependencies] +requests = "*" + +[[package]] +name = "sqlalchemy" +version = "2.0.32" +description = "Database Abstraction Library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "SQLAlchemy-2.0.32-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0c9045ecc2e4db59bfc97b20516dfdf8e41d910ac6fb667ebd3a79ea54084619"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1467940318e4a860afd546ef61fefb98a14d935cd6817ed07a228c7f7c62f389"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5954463675cb15db8d4b521f3566a017c8789222b8316b1e6934c811018ee08b"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:167e7497035c303ae50651b351c28dc22a40bb98fbdb8468cdc971821b1ae533"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b27dfb676ac02529fb6e343b3a482303f16e6bc3a4d868b73935b8792edb52d0"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bf2360a5e0f7bd75fa80431bf8ebcfb920c9f885e7956c7efde89031695cafb8"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-win32.whl", hash = "sha256:306fe44e754a91cd9d600a6b070c1f2fadbb4a1a257b8781ccf33c7067fd3e4d"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-win_amd64.whl", hash = "sha256:99db65e6f3ab42e06c318f15c98f59a436f1c78179e6a6f40f529c8cc7100b22"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:21b053be28a8a414f2ddd401f1be8361e41032d2ef5884b2f31d31cb723e559f"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b178e875a7a25b5938b53b006598ee7645172fccafe1c291a706e93f48499ff5"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723a40ee2cc7ea653645bd4cf024326dea2076673fc9d3d33f20f6c81db83e1d"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:295ff8689544f7ee7e819529633d058bd458c1fd7f7e3eebd0f9268ebc56c2a0"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:49496b68cd190a147118af585173ee624114dfb2e0297558c460ad7495f9dfe2"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:acd9b73c5c15f0ec5ce18128b1fe9157ddd0044abc373e6ecd5ba376a7e5d961"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-win32.whl", hash = "sha256:9365a3da32dabd3e69e06b972b1ffb0c89668994c7e8e75ce21d3e5e69ddef28"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-win_amd64.whl", hash = "sha256:8bd63d051f4f313b102a2af1cbc8b80f061bf78f3d5bd0843ff70b5859e27924"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6bab3db192a0c35e3c9d1560eb8332463e29e5507dbd822e29a0a3c48c0a8d92"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:19d98f4f58b13900d8dec4ed09dd09ef292208ee44cc9c2fe01c1f0a2fe440e9"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd33c61513cb1b7371fd40cf221256456d26a56284e7d19d1f0b9f1eb7dd7e8"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d6ba0497c1d066dd004e0f02a92426ca2df20fac08728d03f67f6960271feec"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2b6be53e4fde0065524f1a0a7929b10e9280987b320716c1509478b712a7688c"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:916a798f62f410c0b80b63683c8061f5ebe237b0f4ad778739304253353bc1cb"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-win32.whl", hash = "sha256:31983018b74908ebc6c996a16ad3690301a23befb643093fcfe85efd292e384d"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-win_amd64.whl", hash = "sha256:4363ed245a6231f2e2957cccdda3c776265a75851f4753c60f3004b90e69bfeb"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b8afd5b26570bf41c35c0121801479958b4446751a3971fb9a480c1afd85558e"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c750987fc876813f27b60d619b987b057eb4896b81117f73bb8d9918c14f1cad"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ada0102afff4890f651ed91120c1120065663506b760da4e7823913ebd3258be"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:78c03d0f8a5ab4f3034c0e8482cfcc415a3ec6193491cfa1c643ed707d476f16"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:3bd1cae7519283ff525e64645ebd7a3e0283f3c038f461ecc1c7b040a0c932a1"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-win32.whl", hash = "sha256:01438ebcdc566d58c93af0171c74ec28efe6a29184b773e378a385e6215389da"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-win_amd64.whl", hash = "sha256:4979dc80fbbc9d2ef569e71e0896990bc94df2b9fdbd878290bd129b65ab579c"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c742be912f57586ac43af38b3848f7688863a403dfb220193a882ea60e1ec3a"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:62e23d0ac103bcf1c5555b6c88c114089587bc64d048fef5bbdb58dfd26f96da"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:251f0d1108aab8ea7b9aadbd07fb47fb8e3a5838dde34aa95a3349876b5a1f1d"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ef18a84e5116340e38eca3e7f9eeaaef62738891422e7c2a0b80feab165905f"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3eb6a97a1d39976f360b10ff208c73afb6a4de86dd2a6212ddf65c4a6a2347d5"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0c1c9b673d21477cec17ab10bc4decb1322843ba35b481585facd88203754fc5"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-win32.whl", hash = "sha256:c41a2b9ca80ee555decc605bd3c4520cc6fef9abde8fd66b1cf65126a6922d65"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-win_amd64.whl", hash = "sha256:8a37e4d265033c897892279e8adf505c8b6b4075f2b40d77afb31f7185cd6ecd"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:52fec964fba2ef46476312a03ec8c425956b05c20220a1a03703537824b5e8e1"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:328429aecaba2aee3d71e11f2477c14eec5990fb6d0e884107935f7fb6001632"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85a01b5599e790e76ac3fe3aa2f26e1feba56270023d6afd5550ed63c68552b3"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aaf04784797dcdf4c0aa952c8d234fa01974c4729db55c45732520ce12dd95b4"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4488120becf9b71b3ac718f4138269a6be99a42fe023ec457896ba4f80749525"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:14e09e083a5796d513918a66f3d6aedbc131e39e80875afe81d98a03312889e6"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-win32.whl", hash = "sha256:0d322cc9c9b2154ba7e82f7bf25ecc7c36fbe2d82e2933b3642fc095a52cfc78"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-win_amd64.whl", hash = "sha256:7dd8583df2f98dea28b5cd53a1beac963f4f9d087888d75f22fcc93a07cf8d84"}, + {file = "SQLAlchemy-2.0.32-py3-none-any.whl", hash = "sha256:e567a8793a692451f706b363ccf3c45e056b67d90ead58c3bc9471af5d212202"}, + {file = "SQLAlchemy-2.0.32.tar.gz", hash = "sha256:c1b88cc8b02b6a5f0efb0345a03672d4c897dc7d92585176f88c67346f565ea8"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", optional = true, markers = "python_version < \"3.13\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\") or extra == \"asyncio\""} +typing-extensions = ">=4.6.0" + +[package.extras] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] +aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] +asyncio = ["greenlet (!=0.4.17)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] +mssql = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)"] +mysql = ["mysqlclient (>=1.4.0)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx_oracle (>=8)"] +oracle-oracledb = ["oracledb (>=1.0.1)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.29.1)"] +postgresql-psycopg = ["psycopg (>=3.0.7)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] +pymysql = ["pymysql"] +sqlcipher = ["sqlcipher3_binary"] + +[[package]] +name = "starlette" +version = "0.37.2" +description = "The little ASGI library that shines." +optional = false +python-versions = ">=3.8" +files = [ + {file = "starlette-0.37.2-py3-none-any.whl", hash = "sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee"}, + {file = "starlette-0.37.2.tar.gz", hash = "sha256:9af890290133b79fc3db55474ade20f6220a364a0402e0b556e7cd5e1e093823"}, +] + +[package.dependencies] +anyio = ">=3.4.0,<5" + +[package.extras] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"] + +[[package]] +name = "striprtf" +version = "0.0.26" +description = "A simple library to convert rtf to text" +optional = false +python-versions = "*" +files = [ + {file = "striprtf-0.0.26-py3-none-any.whl", hash = "sha256:8c8f9d32083cdc2e8bfb149455aa1cc5a4e0a035893bedc75db8b73becb3a1bb"}, + {file = "striprtf-0.0.26.tar.gz", hash = "sha256:fdb2bba7ac440072d1c41eab50d8d74ae88f60a8b6575c6e2c7805dc462093aa"}, +] + +[[package]] +name = "sympy" +version = "1.13.1" +description = "Computer algebra system (CAS) in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "sympy-1.13.1-py3-none-any.whl", hash = "sha256:db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8"}, + {file = "sympy-1.13.1.tar.gz", hash = "sha256:9cebf7e04ff162015ce31c9c6c9144daa34a93bd082f54fd8f12deca4f47515f"}, +] + +[package.dependencies] +mpmath = ">=1.1.0,<1.4" + +[package.extras] +dev = ["hypothesis (>=6.70.0)", "pytest (>=7.1.0)"] + +[[package]] +name = "tenacity" +version = "8.5.0" +description = "Retry code until it succeeds" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tenacity-8.5.0-py3-none-any.whl", hash = "sha256:b594c2a5945830c267ce6b79a166228323ed52718f30302c1359836112346687"}, + {file = "tenacity-8.5.0.tar.gz", hash = "sha256:8bc6c0c8a09b31e6cad13c47afbed1a567518250a9a171418582ed8d9c20ca78"}, +] + +[package.extras] +doc = ["reno", "sphinx"] +test = ["pytest", "tornado (>=4.5)", "typeguard"] + +[[package]] +name = "tiktoken" +version = "0.7.0" +description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tiktoken-0.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485f3cc6aba7c6b6ce388ba634fbba656d9ee27f766216f45146beb4ac18b25f"}, + {file = "tiktoken-0.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e54be9a2cd2f6d6ffa3517b064983fb695c9a9d8aa7d574d1ef3c3f931a99225"}, + {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79383a6e2c654c6040e5f8506f3750db9ddd71b550c724e673203b4f6b4b4590"}, + {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d4511c52caacf3c4981d1ae2df85908bd31853f33d30b345c8b6830763f769c"}, + {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13c94efacdd3de9aff824a788353aa5749c0faee1fbe3816df365ea450b82311"}, + {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8e58c7eb29d2ab35a7a8929cbeea60216a4ccdf42efa8974d8e176d50c9a3df5"}, + {file = "tiktoken-0.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:21a20c3bd1dd3e55b91c1331bf25f4af522c525e771691adbc9a69336fa7f702"}, + {file = "tiktoken-0.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:10c7674f81e6e350fcbed7c09a65bca9356eaab27fb2dac65a1e440f2bcfe30f"}, + {file = "tiktoken-0.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:084cec29713bc9d4189a937f8a35dbdfa785bd1235a34c1124fe2323821ee93f"}, + {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:811229fde1652fedcca7c6dfe76724d0908775b353556d8a71ed74d866f73f7b"}, + {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86b6e7dc2e7ad1b3757e8a24597415bafcfb454cebf9a33a01f2e6ba2e663992"}, + {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1063c5748be36344c7e18c7913c53e2cca116764c2080177e57d62c7ad4576d1"}, + {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:20295d21419bfcca092644f7e2f2138ff947a6eb8cfc732c09cc7d76988d4a89"}, + {file = "tiktoken-0.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:959d993749b083acc57a317cbc643fb85c014d055b2119b739487288f4e5d1cb"}, + {file = "tiktoken-0.7.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:71c55d066388c55a9c00f61d2c456a6086673ab7dec22dd739c23f77195b1908"}, + {file = "tiktoken-0.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09ed925bccaa8043e34c519fbb2f99110bd07c6fd67714793c21ac298e449410"}, + {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03c6c40ff1db0f48a7b4d2dafeae73a5607aacb472fa11f125e7baf9dce73704"}, + {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d20b5c6af30e621b4aca094ee61777a44118f52d886dbe4f02b70dfe05c15350"}, + {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d427614c3e074004efa2f2411e16c826f9df427d3c70a54725cae860f09e4bf4"}, + {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8c46d7af7b8c6987fac9b9f61041b452afe92eb087d29c9ce54951280f899a97"}, + {file = "tiktoken-0.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:0bc603c30b9e371e7c4c7935aba02af5994a909fc3c0fe66e7004070858d3f8f"}, + {file = "tiktoken-0.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2398fecd38c921bcd68418675a6d155fad5f5e14c2e92fcf5fe566fa5485a858"}, + {file = "tiktoken-0.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f5f6afb52fb8a7ea1c811e435e4188f2bef81b5e0f7a8635cc79b0eef0193d6"}, + {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:861f9ee616766d736be4147abac500732b505bf7013cfaf019b85892637f235e"}, + {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54031f95c6939f6b78122c0aa03a93273a96365103793a22e1793ee86da31685"}, + {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fffdcb319b614cf14f04d02a52e26b1d1ae14a570f90e9b55461a72672f7b13d"}, + {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c72baaeaefa03ff9ba9688624143c858d1f6b755bb85d456d59e529e17234769"}, + {file = "tiktoken-0.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:131b8aeb043a8f112aad9f46011dced25d62629091e51d9dc1adbf4a1cc6aa98"}, + {file = "tiktoken-0.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cabc6dc77460df44ec5b879e68692c63551ae4fae7460dd4ff17181df75f1db7"}, + {file = "tiktoken-0.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8d57f29171255f74c0aeacd0651e29aa47dff6f070cb9f35ebc14c82278f3b25"}, + {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ee92776fdbb3efa02a83f968c19d4997a55c8e9ce7be821ceee04a1d1ee149c"}, + {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e215292e99cb41fbc96988ef62ea63bb0ce1e15f2c147a61acc319f8b4cbe5bf"}, + {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8a81bac94769cab437dd3ab0b8a4bc4e0f9cf6835bcaa88de71f39af1791727a"}, + {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d6d73ea93e91d5ca771256dfc9d1d29f5a554b83821a1dc0891987636e0ae226"}, + {file = "tiktoken-0.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:2bcb28ddf79ffa424f171dfeef9a4daff61a94c631ca6813f43967cb263b83b9"}, + {file = "tiktoken-0.7.0.tar.gz", hash = "sha256:1077266e949c24e0291f6c350433c6f0971365ece2b173a23bc3b9f9defef6b6"}, +] + +[package.dependencies] +regex = ">=2022.1.18" +requests = ">=2.26.0" + +[package.extras] +blobfile = ["blobfile (>=2)"] + +[[package]] +name = "tinysegmenter" +version = "0.3" +description = "Very compact Japanese tokenizer" +optional = false +python-versions = "*" +files = [ + {file = "tinysegmenter-0.3.tar.gz", hash = "sha256:ed1f6d2e806a4758a73be589754384cbadadc7e1a414c81a166fc9adf2d40c6d"}, +] + +[[package]] +name = "tldextract" +version = "5.1.2" +description = "Accurately separates a URL's subdomain, domain, and public suffix, using the Public Suffix List (PSL). By default, this includes the public ICANN TLDs and their exceptions. You can optionally support the Public Suffix List's private domains as well." +optional = false +python-versions = ">=3.8" +files = [ + {file = "tldextract-5.1.2-py3-none-any.whl", hash = "sha256:4dfc4c277b6b97fa053899fcdb892d2dc27295851ab5fac4e07797b6a21b2e46"}, + {file = "tldextract-5.1.2.tar.gz", hash = "sha256:c9e17f756f05afb5abac04fe8f766e7e70f9fe387adb1859f0f52408ee060200"}, +] + +[package.dependencies] +filelock = ">=3.0.8" +idna = "*" +requests = ">=2.1.0" +requests-file = ">=1.4" + +[package.extras] +release = ["build", "twine"] +testing = ["black", "mypy", "pytest", "pytest-gitignore", "pytest-mock", "responses", "ruff", "syrupy", "tox", "types-filelock", "types-requests"] + +[[package]] +name = "torch" +version = "2.2.2" +description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "torch-2.2.2-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:bc889d311a855dd2dfd164daf8cc903a6b7273a747189cebafdd89106e4ad585"}, + {file = "torch-2.2.2-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:15dffa4cc3261fa73d02f0ed25f5fa49ecc9e12bf1ae0a4c1e7a88bbfaad9030"}, + {file = "torch-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:11e8fe261233aeabd67696d6b993eeb0896faa175c6b41b9a6c9f0334bdad1c5"}, + {file = "torch-2.2.2-cp310-none-macosx_10_9_x86_64.whl", hash = "sha256:b2e2200b245bd9f263a0d41b6a2dab69c4aca635a01b30cca78064b0ef5b109e"}, + {file = "torch-2.2.2-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:877b3e6593b5e00b35bbe111b7057464e76a7dd186a287280d941b564b0563c2"}, + {file = "torch-2.2.2-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:ad4c03b786e074f46606f4151c0a1e3740268bcf29fbd2fdf6666d66341c1dcb"}, + {file = "torch-2.2.2-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:32827fa1fbe5da8851686256b4cd94cc7b11be962862c2293811c94eea9457bf"}, + {file = "torch-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:f9ef0a648310435511e76905f9b89612e45ef2c8b023bee294f5e6f7e73a3e7c"}, + {file = "torch-2.2.2-cp311-none-macosx_10_9_x86_64.whl", hash = "sha256:95b9b44f3bcebd8b6cd8d37ec802048c872d9c567ba52c894bba90863a439059"}, + {file = "torch-2.2.2-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:49aa4126ede714c5aeef7ae92969b4b0bbe67f19665106463c39f22e0a1860d1"}, + {file = "torch-2.2.2-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:cf12cdb66c9c940227ad647bc9cf5dba7e8640772ae10dfe7569a0c1e2a28aca"}, + {file = "torch-2.2.2-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:89ddac2a8c1fb6569b90890955de0c34e1724f87431cacff4c1979b5f769203c"}, + {file = "torch-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:451331406b760f4b1ab298ddd536486ab3cfb1312614cfe0532133535be60bea"}, + {file = "torch-2.2.2-cp312-none-macosx_10_9_x86_64.whl", hash = "sha256:eb4d6e9d3663e26cd27dc3ad266b34445a16b54908e74725adb241aa56987533"}, + {file = "torch-2.2.2-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:bf9558da7d2bf7463390b3b2a61a6a3dbb0b45b161ee1dd5ec640bf579d479fc"}, + {file = "torch-2.2.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cd2bf7697c9e95fb5d97cc1d525486d8cf11a084c6af1345c2c2c22a6b0029d0"}, + {file = "torch-2.2.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:b421448d194496e1114d87a8b8d6506bce949544e513742b097e2ab8f7efef32"}, + {file = "torch-2.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:3dbcd563a9b792161640c0cffe17e3270d85e8f4243b1f1ed19cca43d28d235b"}, + {file = "torch-2.2.2-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:31f4310210e7dda49f1fb52b0ec9e59382cfcb938693f6d5378f25b43d7c1d29"}, + {file = "torch-2.2.2-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:c795feb7e8ce2e0ef63f75f8e1ab52e7fd5e1a4d7d0c31367ade1e3de35c9e95"}, + {file = "torch-2.2.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:a6e5770d68158d07456bfcb5318b173886f579fdfbf747543901ce718ea94782"}, + {file = "torch-2.2.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:67dcd726edff108e2cd6c51ff0e416fd260c869904de95750e80051358680d24"}, + {file = "torch-2.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:539d5ef6c4ce15bd3bd47a7b4a6e7c10d49d4d21c0baaa87c7d2ef8698632dfb"}, + {file = "torch-2.2.2-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:dff696de90d6f6d1e8200e9892861fd4677306d0ef604cb18f2134186f719f82"}, + {file = "torch-2.2.2-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:3a4dd910663fd7a124c056c878a52c2b0be4a5a424188058fe97109d4436ee42"}, +] + +[package.dependencies] +filelock = "*" +fsspec = "*" +jinja2 = "*" +networkx = "*" +nvidia-cublas-cu12 = {version = "12.1.3.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-cupti-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-nvrtc-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-runtime-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cudnn-cu12 = {version = "8.9.2.26", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cufft-cu12 = {version = "11.0.2.54", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-curand-cu12 = {version = "10.3.2.106", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusolver-cu12 = {version = "11.4.5.107", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusparse-cu12 = {version = "12.1.0.106", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nccl-cu12 = {version = "2.19.3", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nvtx-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +sympy = "*" +typing-extensions = ">=4.8.0" + +[package.extras] +opt-einsum = ["opt-einsum (>=3.3)"] +optree = ["optree (>=0.9.1)"] + +[[package]] +name = "tqdm" +version = "4.66.5" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.66.5-py3-none-any.whl", hash = "sha256:90279a3770753eafc9194a0364852159802111925aa30eb3f9d85b0e805ac7cd"}, + {file = "tqdm-4.66.5.tar.gz", hash = "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "trio" +version = "0.26.1" +description = "A friendly Python library for async concurrency and I/O" +optional = false +python-versions = ">=3.8" +files = [ + {file = "trio-0.26.1-py3-none-any.whl", hash = "sha256:998bbdc5797621e1976c86820b1bc341cc66b51d2618a31cc8720ddd7df8affe"}, + {file = "trio-0.26.1.tar.gz", hash = "sha256:6d2fe7ee656146d598ec75128ff4a2386576801b42b691f4a91cc2c18508544a"}, +] + +[package.dependencies] +attrs = ">=23.2.0" +cffi = {version = ">=1.14", markers = "os_name == \"nt\" and implementation_name != \"pypy\""} +idna = "*" +outcome = "*" +sniffio = ">=1.3.0" +sortedcontainers = "*" + +[[package]] +name = "trio-websocket" +version = "0.11.1" +description = "WebSocket library for Trio" +optional = false +python-versions = ">=3.7" +files = [ + {file = "trio-websocket-0.11.1.tar.gz", hash = "sha256:18c11793647703c158b1f6e62de638acada927344d534e3c7628eedcb746839f"}, + {file = "trio_websocket-0.11.1-py3-none-any.whl", hash = "sha256:520d046b0d030cf970b8b2b2e00c4c2245b3807853ecd44214acd33d74581638"}, +] + +[package.dependencies] +trio = ">=0.11" +wsproto = ">=0.14" + +[[package]] +name = "typing-extensions" +version = "4.12.2" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, +] + +[[package]] +name = "typing-inspect" +version = "0.9.0" +description = "Runtime inspection utilities for typing module." +optional = false +python-versions = "*" +files = [ + {file = "typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f"}, + {file = "typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78"}, +] + +[package.dependencies] +mypy-extensions = ">=0.3.0" +typing-extensions = ">=3.7.4" + +[[package]] +name = "tzdata" +version = "2024.1" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, +] + +[[package]] +name = "uritemplate" +version = "4.1.1" +description = "Implementation of RFC 6570 URI Templates" +optional = false +python-versions = ">=3.6" +files = [ + {file = "uritemplate-4.1.1-py2.py3-none-any.whl", hash = "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e"}, + {file = "uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0"}, +] + +[[package]] +name = "urllib3" +version = "2.2.2" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, + {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, +] + +[package.dependencies] +pysocks = {version = ">=1.5.6,<1.5.7 || >1.5.7,<2.0", optional = true, markers = "extra == \"socks\""} + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "uvicorn" +version = "0.30.5" +description = "The lightning-fast ASGI server." +optional = false +python-versions = ">=3.8" +files = [ + {file = "uvicorn-0.30.5-py3-none-any.whl", hash = "sha256:b2d86de274726e9878188fa07576c9ceeff90a839e2b6e25c917fe05f5a6c835"}, + {file = "uvicorn-0.30.5.tar.gz", hash = "sha256:ac6fdbd4425c5fd17a9fe39daf4d4d075da6fdc80f653e5894cdc2fd98752bee"}, +] + +[package.dependencies] +click = ">=7.0" +h11 = ">=0.8" + +[package.extras] +standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] + +[[package]] +name = "websocket-client" +version = "1.8.0" +description = "WebSocket client for Python with low level API options" +optional = false +python-versions = ">=3.8" +files = [ + {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, + {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, +] + +[package.extras] +docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx-rtd-theme (>=1.1.0)"] +optional = ["python-socks", "wsaccel"] +test = ["websockets"] + +[[package]] +name = "win32-setctime" +version = "1.1.0" +description = "A small Python utility to set file creation time on Windows" +optional = false +python-versions = ">=3.5" +files = [ + {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, + {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, +] + +[package.extras] +dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] + +[[package]] +name = "wrapt" +version = "1.16.0" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = ">=3.6" +files = [ + {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, + {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, + {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, + {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, + {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, + {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, + {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, + {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, + {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, + {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, + {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, + {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, + {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, + {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, + {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, + {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, + {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, + {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, +] + +[[package]] +name = "wsproto" +version = "1.2.0" +description = "WebSockets state-machine based protocol implementation" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "wsproto-1.2.0-py3-none-any.whl", hash = "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736"}, + {file = "wsproto-1.2.0.tar.gz", hash = "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065"}, +] + +[package.dependencies] +h11 = ">=0.9.0,<1" + +[[package]] +name = "yarl" +version = "1.9.4" +description = "Yet another URL library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, + {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, + {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, + {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, + {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, + {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, + {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, + {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, + {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, + {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, + {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, + {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, + {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, + {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, + {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, + {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + +[metadata] +lock-version = "2.0" +python-versions = ">=3.12,<3.14" +content-hash = "fd1a85a334986736dabec07d2861feade0534770c086115d6b15e2d453b4e510" diff --git a/examples/semiconductor/semiconductor-ui/api/pyproject.toml b/examples/semiconductor/semiconductor-ui/api/pyproject.toml new file mode 100644 index 000000000..aaee18eb1 --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/api/pyproject.toml @@ -0,0 +1,18 @@ +[tool.poetry] +name = "api" +version = "0.1.0" +description = "" +authors = ["Hung Vo "] +readme = "README.md" + +[tool.poetry.dependencies] +python = ">=3.12,<3.14" +uvicorn = "^0.30.5" +fastapi = "^0.112.0" +openai = "^1.40.1" +openssa = {git = "https://github.com/aitomatic/openssa.git"} + + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/examples/semiconductor/semiconductor-ui/api/semikong_lm.py b/examples/semiconductor/semiconductor-ui/api/semikong_lm.py new file mode 100644 index 000000000..4f29e0827 --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/api/semikong_lm.py @@ -0,0 +1,30 @@ +from __future__ import annotations + +from argparse import ArgumentParser +from dataclasses import dataclass + +from openssa.core.util.lm.llama import LlamaLM + + +DEFAULT_MODEL = 'pentagoniac/SEMIKONG-70B' +DEFAULT_API_KEY = '...' +DEFAULT_API_BASE = 'http://semikong70b.aitomatic.com/v1' + + +@dataclass +class SemiKongLM(LlamaLM): + """SemiKong LM.""" + + @classmethod + def from_defaults(cls) -> SemiKongLM: + """Get default SemiKong LM instance.""" + # pylint: disable=unexpected-keyword-arg + return cls(model=DEFAULT_MODEL, api_key=DEFAULT_API_KEY, api_base=DEFAULT_API_BASE) + + +if __name__ == '__main__': + arg_parser = ArgumentParser() + arg_parser.add_argument('question') + args = arg_parser.parse_args() + + print(SemiKongLM.from_defaults().get_response(prompt=args.question)) diff --git a/examples/semiconductor/semiconductor-ui/api/start.sh b/examples/semiconductor/semiconductor-ui/api/start.sh new file mode 100755 index 000000000..bcc119207 --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/api/start.sh @@ -0,0 +1,2 @@ +#!/bin/bash +uvicorn main:app --loop "asyncio" --proxy-headers --host 0.0.0.0 --port 8080 diff --git a/examples/semiconductor/semiconductor-ui/css/style.css b/examples/semiconductor/semiconductor-ui/css/style.css new file mode 100644 index 000000000..aa468c688 --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/css/style.css @@ -0,0 +1,4 @@ +.step-item::after { + content: ''; + border: 1px solid #e0e0e0; +} \ No newline at end of file diff --git a/examples/semiconductor/semiconductor-ui/docker-compose.yml b/examples/semiconductor/semiconductor-ui/docker-compose.yml new file mode 100644 index 000000000..c47e808da --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/docker-compose.yml @@ -0,0 +1,31 @@ +version: "3.9" + +services: + apis: + container_name: apis + restart: always + platform: linux/amd64 + env_file: .env + build: + context: ./api + dockerfile: ./Dockerfile + command: sh start.sh + + ports: + - 9000:8080 + + ui: + container_name: semiconductor-ui + restart: always + build: + context: ./ui + target: development + dockerfile: ./Dockerfile + environment: + - VITE_API_HOST=http://localhost:9000 + volumes: + - ./ui/src:/app/src + - ./ui/public:/app/public + - "./ui/tailwind.config.js:/app/tailwind.config.js" + ports: + - 4000:5173 diff --git a/examples/semiconductor/semiconductor-ui/index.html b/examples/semiconductor/semiconductor-ui/index.html new file mode 100644 index 000000000..8573ad5d6 --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/index.html @@ -0,0 +1,454 @@ + + + + + + Semiconductor UI + + + + + + + + + +
+
+
+ + + +
+
+
Specifications
+
Loremm ipsum dolor sit amet consectetur
+
+
+
+
+ + + +
+
+
Paramters
+
Loremm ipsum dolor sit amet consectetur
+
+
+
+
+ + + +
+
+
Steps
+
Loremm ipsum dolor sit amet consectetur
+
+
+
+
+
+
+
Question
+
+
+ +
+
+ +
+
+
+
+
Specifications
+
+
+
+
+ This recipe is designed to achieve a higher SiO etch rate + while maintaining good selectivity over the PR mask and + minimizing polymer redeposition. +
+
    +
  • + Gases: + +
      +
    • CF4: 50 sccm
    • +
    • CHF3: 20 sccm
    • +
    • Ar: 10 sccm
    • +
    +
  • +
  • ICP Power: 800 W
  • +
  • Bias Power: 100 W
  • +
  • Temperature: 20°C
  • +
+
+
+ +
+
+
+ +
+
+
+
+
Plans
+
+
+ + + + + + + + + + +
+ Main task:sit amet consectetur +
+
+
+ + + + + + + + + + +
+ Subtask 1:sit amet consectetur +
+
+
+ + + + + + + + + + +
+ Subtask 2:sit amet consectetur +
+
+
+ + + + + + + + + + +
+ Subtask 3:sit amet consectetur +
+
+
+ + + + + + + + + + +
+ Subtask 4:sit amet consectetur +
+
+
+
+
+
+
+
Solution
+
+
+
+ First suggested parameter +
+
+ Recommended +
+
+
+
+ Parameter +
+
+ Value +
+
+
+
Ar (Argon)
+
1213 sccm
+
+
+
Power
+
123231 W
+
+
+
+ DCS (Dichlorosilane) +
+
1213 sccm
+
+
+
Temperature
+
123231 W
+
+
+
Pressure
+
1213 sccm
+
+
+
+
+
+
+
+ Second suggested parameter +
+
+ Recommended +
+
+
+
+ Parameter +
+
+ Value +
+
+
+
Ar (Argon)
+
1213 sccm
+
+
+
Power
+
123231 W
+
+
+
+ DCS (Dichlorosilane) +
+
1213 sccm
+
+
+
Temperature
+
123231 W
+
+
+
Pressure
+
1213 sccm
+
+
+
+
+
Steps to Optimize the Etching Process
+
+ +
+
+
+
+ + + + + + diff --git a/examples/semiconductor/semiconductor-ui/js/main.js b/examples/semiconductor/semiconductor-ui/js/main.js new file mode 100644 index 000000000..ce1d53c1b --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/js/main.js @@ -0,0 +1,78 @@ +const { useState } = React; + +const store = zustandVanilla((set) => ({ + count: 0, + inc: () => set((state) => ({ count: state.count + 1 })), +})); + +function MyApp() { + const { count, inc } = useZustand.useZustand(store, (state) => state); + const [str, setStr] = useState("Hello, Tailwind CSS!"); + + return ( +
+
+
+
+
    +
  1. +
    + + 1 + + Step 1 +
    +
  2. +
  3. +
    + + 2 + + Step 2 +
    +
  4. +
  5. +
    + + 3 + + Step 3 +
    +
  6. +
+
+
+
+
+
+
Question
+
+ setStr(e.currentTarget.value)} + /> +
+
+
+
+

+ Hello, Tailwind CSS! +

+

+ This is a simple HTML file with Tailwind CSS included. {count} +

+ +
+
+ ); +} + +const container = document.getElementById("root"); +const root = ReactDOM.createRoot(container); +root.render(); diff --git a/examples/semiconductor/semiconductor-ui/server.py b/examples/semiconductor/semiconductor-ui/server.py new file mode 100644 index 000000000..dbfbb645f --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/server.py @@ -0,0 +1,10 @@ +import http.server +import socketserver + +PORT = 8000 + +Handler = http.server.SimpleHTTPRequestHandler + +with socketserver.TCPServer(("", PORT), Handler) as httpd: + print("Serving at port", PORT) + httpd.serve_forever() diff --git a/examples/semiconductor/semiconductor-ui/ui/.eslintrc.cjs b/examples/semiconductor/semiconductor-ui/ui/.eslintrc.cjs new file mode 100644 index 000000000..3e212e1d4 --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/ui/.eslintrc.cjs @@ -0,0 +1,21 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:react/recommended', + 'plugin:react/jsx-runtime', + 'plugin:react-hooks/recommended', + ], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parserOptions: { ecmaVersion: 'latest', sourceType: 'module' }, + settings: { react: { version: '18.2' } }, + plugins: ['react-refresh'], + rules: { + 'react/jsx-no-target-blank': 'off', + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/examples/semiconductor/semiconductor-ui/ui/.gitignore b/examples/semiconductor/semiconductor-ui/ui/.gitignore new file mode 100644 index 000000000..a547bf36d --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/ui/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/examples/semiconductor/semiconductor-ui/ui/Dockerfile b/examples/semiconductor/semiconductor-ui/ui/Dockerfile new file mode 100644 index 000000000..4e0ab71a9 --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/ui/Dockerfile @@ -0,0 +1,13 @@ +FROM node:18-alpine AS development +ENV NODE_ENV development +# Add a work directory +WORKDIR /app +# Cache and Install dependencies +COPY package*.json . +RUN npm install +# Copy app files +COPY . . +# Expose port +EXPOSE 4000 +# Start the app +CMD [ "npm", "start" ] diff --git a/examples/semiconductor/semiconductor-ui/ui/README.md b/examples/semiconductor/semiconductor-ui/ui/README.md new file mode 100644 index 000000000..ead67daca --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/ui/README.md @@ -0,0 +1,8 @@ +# React with Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh diff --git a/examples/semiconductor/semiconductor-ui/ui/index.html b/examples/semiconductor/semiconductor-ui/ui/index.html new file mode 100644 index 000000000..0c589eccd --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/ui/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + + +
+ + + diff --git a/examples/semiconductor/semiconductor-ui/ui/package-lock.json b/examples/semiconductor/semiconductor-ui/ui/package-lock.json new file mode 100644 index 000000000..0ff39888e --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/ui/package-lock.json @@ -0,0 +1,6808 @@ +{ + "name": "ui", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ui", + "version": "0.0.0", + "dependencies": { + "-": "^0.0.1", + "axios": "^1.7.3", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-markdown": "^9.0.1", + "remark-gfm": "^4.0.0", + "zustand": "^4.5.4" + }, + "devDependencies": { + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^4.3.1", + "autoprefixer": "^10.4.20", + "eslint": "^8.57.0", + "eslint-plugin-react": "^7.34.3", + "eslint-plugin-react-hooks": "^4.6.2", + "eslint-plugin-react-refresh": "^0.4.7", + "postcss": "^8.4.41", + "tailwindcss": "^3.4.7", + "vite": "^5.3.4" + } + }, + "node_modules/-": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/-/-/--0.0.1.tgz", + "integrity": "sha512-3HfneK3DGAm05fpyj20sT3apkNcvPpCuccOThOPdzz8sY7GgQGe0l93XH9bt+YzibcTIgUAIMoyVJI740RtgyQ==" + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", + "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", + "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.25.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", + "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", + "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.25.2" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz", + "integrity": "sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz", + "integrity": "sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", + "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.2", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", + "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.20.0.tgz", + "integrity": "sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.20.0.tgz", + "integrity": "sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.20.0.tgz", + "integrity": "sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.20.0.tgz", + "integrity": "sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.20.0.tgz", + "integrity": "sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.20.0.tgz", + "integrity": "sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.20.0.tgz", + "integrity": "sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.20.0.tgz", + "integrity": "sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.20.0.tgz", + "integrity": "sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.20.0.tgz", + "integrity": "sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.20.0.tgz", + "integrity": "sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.20.0.tgz", + "integrity": "sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.20.0.tgz", + "integrity": "sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.20.0.tgz", + "integrity": "sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.20.0.tgz", + "integrity": "sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.20.0.tgz", + "integrity": "sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" + }, + "node_modules/@types/react": { + "version": "18.3.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", + "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.1.tgz", + "integrity": "sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.24.5", + "@babel/plugin-transform-react-jsx-self": "^7.24.5", + "@babel/plugin-transform-react-jsx-source": "^7.24.1", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0" + } + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/autoprefixer": { + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.3.tgz", + "integrity": "sha512-Ar7ND9pU99eJ9GpoGQKhKf58GpUOgnzuaB7ueNQ5BMi0p+LZ5oaEnfF999fAArcTIBwXTCHAmGcHOZJaWPq9Nw==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001650", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001650.tgz", + "integrity": "sha512-fgEc7hP/LB7iicdXHUI9VsBsMZmUmlVJeQP2qqQW+3lkqVhbmjEU8zp+h5stWeilX+G7uXuIUIIlWlDw9jdt8g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.5.tgz", + "integrity": "sha512-QR7/A7ZkMS8tZuoftC/jfqNkZLQO779SSW3YuZHP4eXpj3EffGLFcB/Xu9AAZQzLccTiCV+EmUo3ha4mQ9wnlA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", + "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.35.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz", + "integrity": "sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.19", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.0", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.9.tgz", + "integrity": "sha512-QK49YrBAo5CLNLseZ7sZgvgTy21E6NEw22eZqc4teZfH8pxV3yXc9XXOYfUI6JNpw7mfHNkAeWtBxrTyykB6HA==", + "dev": true, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", + "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-url-attributes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.0.tgz", + "integrity": "sha512-/sXbVCWayk6GDVg3ctOX6nxaVj7So40FcFAnWlWGNAB1LpYKcV5Cd10APjPjW80O7zYW2MsjBV4zZ7IZO5fVow==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/inline-style-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.3.tgz", + "integrity": "sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==" + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", + "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/markdown-table": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", + "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", + "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", + "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", + "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz", + "integrity": "sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", + "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", + "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz", + "integrity": "sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-remove-position": "^5.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", + "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", + "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz", + "integrity": "sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", + "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", + "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-import/node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz", + "integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "node_modules/react-markdown": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.0.1.tgz", + "integrity": "sha512-186Gw/vF1uRkydbsOIkcGXw7aHq0sZOCRFFjGrr7b9+nVZg4UfA4enXCaxm4fUzecU38sWfrNDitGhshuU7rdg==", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" + } + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", + "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", + "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.20.0.tgz", + "integrity": "sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.20.0", + "@rollup/rollup-android-arm64": "4.20.0", + "@rollup/rollup-darwin-arm64": "4.20.0", + "@rollup/rollup-darwin-x64": "4.20.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.20.0", + "@rollup/rollup-linux-arm-musleabihf": "4.20.0", + "@rollup/rollup-linux-arm64-gnu": "4.20.0", + "@rollup/rollup-linux-arm64-musl": "4.20.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.20.0", + "@rollup/rollup-linux-riscv64-gnu": "4.20.0", + "@rollup/rollup-linux-s390x-gnu": "4.20.0", + "@rollup/rollup-linux-x64-gnu": "4.20.0", + "@rollup/rollup-linux-x64-musl": "4.20.0", + "@rollup/rollup-win32-arm64-msvc": "4.20.0", + "@rollup/rollup-win32-ia32-msvc": "4.20.0", + "@rollup/rollup-win32-x64-msvc": "4.20.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-to-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.6.tgz", + "integrity": "sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==", + "dependencies": { + "inline-style-parser": "0.2.3" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.7.tgz", + "integrity": "sha512-rxWZbe87YJb4OcSopb7up2Ba4U82BoiSGUdoDr3Ydrg9ckxFS/YWsvhN323GMcddgU65QRy7JndC7ahhInhvlQ==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/vfile": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.2.tgz", + "integrity": "sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.5.tgz", + "integrity": "sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.39", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", + "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", + "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zustand": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.4.tgz", + "integrity": "sha512-/BPMyLKJPtFEvVL0E9E9BTUM63MNyhPGlvxk1XjrfWTUlV+BR8jufjsovHzrtR6YNcBEcL7cMHovL1n9xHawEg==", + "dependencies": { + "use-sync-external-store": "1.2.0" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "immer": ">=9.0.6", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/examples/semiconductor/semiconductor-ui/ui/package.json b/examples/semiconductor/semiconductor-ui/ui/package.json new file mode 100644 index 000000000..c24ce510b --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/ui/package.json @@ -0,0 +1,35 @@ +{ + "name": "ui", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "start": "vite --host 0.0.0.0", + "dev": "vite", + "build": "vite build", + "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "-": "^0.0.1", + "axios": "^1.7.3", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-markdown": "^9.0.1", + "remark-gfm": "^4.0.0", + "zustand": "^4.5.4" + }, + "devDependencies": { + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^4.3.1", + "autoprefixer": "^10.4.20", + "eslint": "^8.57.0", + "eslint-plugin-react": "^7.34.3", + "eslint-plugin-react-hooks": "^4.6.2", + "eslint-plugin-react-refresh": "^0.4.7", + "postcss": "^8.4.41", + "tailwindcss": "^3.4.7", + "vite": "^5.3.4" + } +} diff --git a/examples/semiconductor/semiconductor-ui/ui/postcss.config.js b/examples/semiconductor/semiconductor-ui/ui/postcss.config.js new file mode 100644 index 000000000..2e7af2b7f --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/ui/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/examples/semiconductor/semiconductor-ui/ui/public/images/image-14.png b/examples/semiconductor/semiconductor-ui/ui/public/images/image-14.png new file mode 100644 index 000000000..bbc5fc06d Binary files /dev/null and b/examples/semiconductor/semiconductor-ui/ui/public/images/image-14.png differ diff --git a/examples/semiconductor/semiconductor-ui/ui/public/images/image-16.png b/examples/semiconductor/semiconductor-ui/ui/public/images/image-16.png new file mode 100644 index 000000000..d6fe80b45 Binary files /dev/null and b/examples/semiconductor/semiconductor-ui/ui/public/images/image-16.png differ diff --git a/examples/semiconductor/semiconductor-ui/ui/public/images/image-17.png b/examples/semiconductor/semiconductor-ui/ui/public/images/image-17.png new file mode 100644 index 000000000..ef0ca61e9 Binary files /dev/null and b/examples/semiconductor/semiconductor-ui/ui/public/images/image-17.png differ diff --git a/examples/semiconductor/semiconductor-ui/ui/public/images/nanophys.png b/examples/semiconductor/semiconductor-ui/ui/public/images/nanophys.png new file mode 100644 index 000000000..2c78a427c Binary files /dev/null and b/examples/semiconductor/semiconductor-ui/ui/public/images/nanophys.png differ diff --git a/examples/semiconductor/semiconductor-ui/ui/public/images/screenshot-20240808-at-1000121.png b/examples/semiconductor/semiconductor-ui/ui/public/images/screenshot-20240808-at-1000121.png new file mode 100644 index 000000000..1df20dfa3 Binary files /dev/null and b/examples/semiconductor/semiconductor-ui/ui/public/images/screenshot-20240808-at-1000121.png differ diff --git a/examples/semiconductor/semiconductor-ui/ui/public/vite.svg b/examples/semiconductor/semiconductor-ui/ui/public/vite.svg new file mode 100644 index 000000000..e7b8dfb1b --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/ui/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/semiconductor/semiconductor-ui/ui/src/App.css b/examples/semiconductor/semiconductor-ui/ui/src/App.css new file mode 100644 index 000000000..e69de29bb diff --git a/examples/semiconductor/semiconductor-ui/ui/src/App.jsx b/examples/semiconductor/semiconductor-ui/ui/src/App.jsx new file mode 100644 index 000000000..51b21224e --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/ui/src/App.jsx @@ -0,0 +1,8 @@ +import "./App.css"; +import { MainView } from "./views/main"; + +function App() { + return ; +} + +export default App; diff --git a/examples/semiconductor/semiconductor-ui/ui/src/assets/react.svg b/examples/semiconductor/semiconductor-ui/ui/src/assets/react.svg new file mode 100644 index 000000000..6c87de9bb --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/ui/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/semiconductor/semiconductor-ui/ui/src/index.css b/examples/semiconductor/semiconductor-ui/ui/src/index.css new file mode 100644 index 000000000..b5c61c956 --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/ui/src/index.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/examples/semiconductor/semiconductor-ui/ui/src/main.jsx b/examples/semiconductor/semiconductor-ui/ui/src/main.jsx new file mode 100644 index 000000000..54b39dd1d --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/ui/src/main.jsx @@ -0,0 +1,10 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App.jsx' +import './index.css' + +ReactDOM.createRoot(document.getElementById('root')).render( + + + , +) diff --git a/examples/semiconductor/semiconductor-ui/ui/src/views/Header/index.jsx b/examples/semiconductor/semiconductor-ui/ui/src/views/Header/index.jsx new file mode 100644 index 000000000..fb0c0ddca --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/ui/src/views/Header/index.jsx @@ -0,0 +1,166 @@ +export const Header = () => { + return ( +
+
+
+ + + +
+
+
Specifications
+
Loremm ipsum dolor sit amet consectetur
+
+
+
+
+ + + +
+
+
Paramters
+
Loremm ipsum dolor sit amet consectetur
+
+
+
+
+ + + +
+
+
Steps
+
Loremm ipsum dolor sit amet consectetur
+
+
+
+ ); +}; + +export const TitleHeader = () => { + return ( +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+
+ SiO2 Etching Advisor +
+
powered by SemiKong
+
+
+ ); +}; diff --git a/examples/semiconductor/semiconductor-ui/ui/src/views/LeftPane/Loading.jsx b/examples/semiconductor/semiconductor-ui/ui/src/views/LeftPane/Loading.jsx new file mode 100644 index 000000000..8b63d3ad0 --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/ui/src/views/LeftPane/Loading.jsx @@ -0,0 +1,176 @@ +export const Loading = () => { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; diff --git a/examples/semiconductor/semiconductor-ui/ui/src/views/LeftPane/index.jsx b/examples/semiconductor/semiconductor-ui/ui/src/views/LeftPane/index.jsx new file mode 100644 index 000000000..d99be3803 --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/ui/src/views/LeftPane/index.jsx @@ -0,0 +1,369 @@ +import { useState } from "react"; +import { useData } from "../store"; +import { MarkdownViewer } from "../components/MarkdownViewer"; + +export const Specification = () => { + return ( +
+
Specifications
+
+
+
+
+ This recipe is designed to achieve a higher SiO etch rate while + maintaining good selectivity over the PR mask and minimizing + polymer redeposition. +
+
    +
  • + Gases: +
      +
    • CF4: 50 sccm
    • +
    • CHF3: 20 sccm
    • +
    • Ar: 10 sccm
    • +
    +
  • +
  • ICP Power: 800 W
  • +
  • Bias Power: 100 W
  • +
  • Temperature: 20°C
  • +
+
+
+ +
+
+
+ +
+
+
+ ); +}; + +export const Plan = () => { + return ( +
+
Plans
+
+
+ + + + + + + + + + +
+ Main task: + + sit amet consectetur + +
+
+
+ + + + + + + + + + +
+ Subtask 1: + + sit amet consectetur + +
+
+
+ + + + + + + + + + +
+ Subtask 2: + + sit amet consectetur + +
+
+
+ + + + + + + + + + +
+ Subtask 3: + + sit amet consectetur + +
+
+
+ + + + + + + + + + +
+ Subtask 4: + + sit amet consectetur + +
+
+
+
+ ); +}; + +export const Data1 = () => { + const { data } = useData(); + const { recipe_1 } = data; + if (!recipe_1) return <>; + const strings = recipe_1.split("\n"); + + return ( +
+
+
+ Recipe 1 +
+
+
+
+ {strings.map((s, index) => ( +
+ {s} +
+ ))} +
+
+
+
+
+ ); +}; + +export const Data2 = () => { + const { data } = useData(); + const { recipe_2 = "" } = data; + if (!recipe_2) return <>; + const strings = recipe_2.split("\n"); + return ( +
+
+
+ Recipe 2 +
+
+
+
+ {strings.map((s, index) => ( +
+ {s} +
+ ))} +
+
+
+
+
+ ); +}; + +export const Images = () => { + return ( +
+
+
+ PlasmaPro 100 Cobra ICP RIE Etch +
+
+
+ +
+
+ +
+
+
+
+ ); +}; + +export const LeftPane = () => { + const [message, setMessage] = useState("I am trying to etch 2 μm of PECVD SiO2 using a ~4 μm PR mask to create a pattern of 20 * 60 μm. Recommend me 2 recipes."); + const { isLoading, sendMessage, data } = useData(); + + return ( +
+
+ +
+
+ REQUIREMENTS & SPECIFICATIONS +
+
+
+ +
+
+ +
+
+
+
+ {/* + */} + {isLoading && ( +
Getting recipe advice ...
+ )} + {data.recipe_2 && ( +
+
+ RECIPES +
+
+
+ +
+
+ +
+
+
+ )} +
+ ); +}; diff --git a/examples/semiconductor/semiconductor-ui/ui/src/views/RightPane/index.jsx b/examples/semiconductor/semiconductor-ui/ui/src/views/RightPane/index.jsx new file mode 100644 index 000000000..a56c09f26 --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/ui/src/views/RightPane/index.jsx @@ -0,0 +1,216 @@ +import { useData } from "../store"; +import { MarkdownViewer } from "../components/MarkdownViewer"; + +export const Solution = () => { + return ( +
+
Solution
+
+
+
+ First suggested parameter +
+
+ Recommended +
+
+
+
+ Parameter +
+
+ Value +
+
+
+
+ Ar (Argon) +
+
+ 1213 sccm +
+
+
+
+ Power +
+
+ 123231 W +
+
+
+
+ DCS (Dichlorosilane) +
+
+ 1213 sccm +
+
+
+
+ Temperature +
+
+ 123231 W +
+
+
+
+ Pressure +
+
+ 1213 sccm +
+
+
+
+ ); +}; + +export const Solution2 = () => { + return ( +
+
+
+
+ Second suggested parameter +
+
+ Recommended +
+
+
+
+ Parameter +
+
+ Value +
+
+
+
+ Ar (Argon) +
+
+ 1213 sccm +
+
+
+
+ Power +
+
+ 123231 W +
+
+
+
+ DCS (Dichlorosilane) +
+
+ 1213 sccm +
+
+
+
+ Temperature +
+
+ 123231 W +
+
+
+
+ Pressure +
+
+ 1213 sccm +
+
+
+
+ ); +}; + +export const EtchImg = () => { + return ( +
+
Steps to Optimize the Etching Process
+
+ +
+
+ ); +}; + +export const AgentAdvice = () => { + const { data } = useData(); + const { agent_advice = "" } = data; + if (!agent_advice) return <>; + const strings = agent_advice.split("\n"); + return ( +
+
+ QUALITY & SAFETY ADVICE +
+
+
+
+
+ {strings.map((s, index) => ( +
+ {s} +
+ ))} +
+
+
+
+
+ ); +}; + +export const RightPane = () => { + return ( +
+
+ +
+ {/* + + */} + +
+ ); +}; diff --git a/examples/semiconductor/semiconductor-ui/ui/src/views/components/MarkdownViewer/MarkdownViewer.module.css b/examples/semiconductor/semiconductor-ui/ui/src/views/components/MarkdownViewer/MarkdownViewer.module.css new file mode 100644 index 000000000..ca0ad678c --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/ui/src/views/components/MarkdownViewer/MarkdownViewer.module.css @@ -0,0 +1,37 @@ +.content table { + @apply table border-collapse; +} + +.content th { + @apply border border-gray-200 px-3 py-2.5 text-left bg-gray-100; +} + +.content td { + @apply border border-gray-200 px-3 py-2.5 text-left; +} + +/* .content-small p { + @apply py-1; +} */ + +.content ul { + @apply pl-6; + + list-style: disc; +} + +.content ol { + @apply pl-6; + + list-style: decimal; +} + +.content-small { + font-size: 14px; +} + +.content pre { + @apply py-1 text-sm; + + white-space: pre-wrap !important; +} \ No newline at end of file diff --git a/examples/semiconductor/semiconductor-ui/ui/src/views/components/MarkdownViewer/index.jsx b/examples/semiconductor/semiconductor-ui/ui/src/views/components/MarkdownViewer/index.jsx new file mode 100644 index 000000000..6235378a5 --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/ui/src/views/components/MarkdownViewer/index.jsx @@ -0,0 +1,15 @@ +/* eslint-disable react/prop-types */ +import ReactMarkdown from "react-markdown"; +import remarkGfm from "remark-gfm"; +import styles from "./MarkdownViewer.module.css"; + +export const MarkdownViewer = ({ children }) => { + return ( + + ); +}; diff --git a/examples/semiconductor/semiconductor-ui/ui/src/views/main.jsx b/examples/semiconductor/semiconductor-ui/ui/src/views/main.jsx new file mode 100644 index 000000000..6857ee16b --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/ui/src/views/main.jsx @@ -0,0 +1,15 @@ +import { LeftPane } from "./LeftPane"; +import { RightPane } from "./RightPane"; +import { TitleHeader } from "./Header"; + +export const MainView = () => { + return ( +
+ +
+ + +
+
+ ); +}; diff --git a/examples/semiconductor/semiconductor-ui/ui/src/views/store.js b/examples/semiconductor/semiconductor-ui/ui/src/views/store.js new file mode 100644 index 000000000..5bab5372a --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/ui/src/views/store.js @@ -0,0 +1,81 @@ +import { create } from "zustand"; +import axios from "axios"; + +const BACKEND_URL = "http://localhost:9000"; + +export const SAMPLE_DATA = { + recipe_1: `Gases & Flow Rates: + + CHF3: 40 sccm + Ar: 10 sccm + O2: 3 sccm + ICP Power: + 800 W + RF Power: + 30 W + Pressure: + 10 mTorr + Etch Time: + Approximately 10 minutes (adjust based on actual etch rate and periodic depth measurements) + Pros: + High Etch Rate: The higher ICP power and CHF3 flow rate will result in a faster etch rate, reducing overall process time. + Good Anisotropy: The combination of CHF3 and O2 helps in achieving good anisotropic profiles, which is crucial for pattern fidelity. + Cons: + Potential for Physical Damage: Higher ICP power can lead to more physical damage to the PR mask and underlying layers. + Less Control Over Uniformity: Faster etch rates can sometimes lead to less uniform etching across the wafer.`, + recipe_2: ` +Gases & Flow Rates: + CHF3: 30 sccm + + Ar: 5 sccm + O2: 2 sccm + ICP Power: + 600 W + RF Power: + 20 W + Pressure: + 15 mTorr + Etch Time: + Approximately 15 minutes (adjust based on actual etch rate and periodic depth measurements) + Pros: + High Anisotropy: Lower RF power and optimized gas flow rates help in achieving highly anisotropic etch profiles, which is beneficial for maintaining pattern dimensions. + Reduced Physical Damage: Lower ICP power reduces the risk of physical damage to the PR mask and underlying layers. + Cons: + Slower Etch Rate: The etch rate will be slower compared to the high etch rate recipe, increasing the overall process time. + Potential for Polymer Build-Up: Lower O2 flow rates might lead to polymer build-up, which could affect etch uniformity and profile.`, + agent_advice: `#### Etch Rate and Uniformity: + Regularly measure the etch depth to ensure uniformity and to adjust the etch time as needed. The etch rate can vary across the wafer and over time. + + + End-Point Detection: Utilize optical emission spectroscopy (OES) or interferometry if available on your system to accurately determine when the desired etch depth is reached. + Safety Procedures: Always follow safety protocols when handling gases and operating the ICP-RIE system. Confirm with your facility and equipment manager that the chosen recipes are compatible with your system to avoid any damage or contamination. + `, +}; + +export const sample_q = + "How to etch 2 um silicon dioxide (PR mask) using ICP RIE Plasmalab System 100? Any suggestions for recipe? I am trying to etch 2 μm of PECVD SiO2 using a ~4 μm PR mask to create a pattern of 20 * 60 μm. I am using the Oxford ICP-RIE Plasmalab System 100. Recommend me 2 recipes and their pros/cons."; + +export const useData = create((set) => ({ + data: {}, + // data: SAMPLE_DATA, + isLoading: false, + getData: async () => { + try { + const response = await axios.get(BACKEND_URL + "/data"); + set({ data: response.data }); + } catch (error) { + console.error(error); + } + }, + sendMessage: async (message) => { + try { + set({ isLoading: true }); + const res = await axios.post(BACKEND_URL + "/data", { + question: message, + }); + set({ data: res.data, isLoading: false }); + } catch (error) { + console.error(error); + } + }, +})); diff --git a/examples/semiconductor/semiconductor-ui/ui/tailwind.config.js b/examples/semiconductor/semiconductor-ui/ui/tailwind.config.js new file mode 100644 index 000000000..614c86b48 --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/ui/tailwind.config.js @@ -0,0 +1,8 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"], + theme: { + extend: {}, + }, + plugins: [], +}; diff --git a/examples/semiconductor/semiconductor-ui/ui/vite.config.js b/examples/semiconductor/semiconductor-ui/ui/vite.config.js new file mode 100644 index 000000000..9cc50ead1 --- /dev/null +++ b/examples/semiconductor/semiconductor-ui/ui/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], +}); diff --git a/examples/semiconductor/semikong_lm.py b/examples/semiconductor/semikong_lm.py index d6183997b..4f29e0827 100644 --- a/examples/semiconductor/semikong_lm.py +++ b/examples/semiconductor/semikong_lm.py @@ -8,7 +8,7 @@ DEFAULT_MODEL = 'pentagoniac/SEMIKONG-70B' DEFAULT_API_KEY = '...' -DEFAULT_API_BASE = 'http://34.44.90.64:8081/v1' +DEFAULT_API_BASE = 'http://semikong70b.aitomatic.com/v1' @dataclass diff --git a/examples/semiconductor/streamlit-main.py b/examples/semiconductor/streamlit-main.py index 1d643c8a1..472d23fbd 100644 --- a/examples/semiconductor/streamlit-main.py +++ b/examples/semiconductor/streamlit-main.py @@ -1,14 +1,14 @@ from collections import defaultdict -from loguru import logger import streamlit as st +from loguru import logger +# pylint: disable=wrong-import-order from agent import get_or_create_agent - +from openssa import OpenAILM TITLE: str = 'OpenSSA: Semiconductor Industry-Specific Agent leveraging SemiKong LM' - st.set_page_config(page_title=TITLE, page_icon=None, layout='wide', @@ -17,11 +17,18 @@ st.title(body=TITLE, anchor=None, help=None) +DEFAULT_PROBLEM: str = ( + 'I am trying to etch 2 μm of PECVD SiO2 using a ~4 μm PR mask to create a pattern of 20 * 60 μm. ' + '\n' + 'I am using the Oxford ICP-RIE Plasmalab System 100. ' + '\n' + 'Recommend me 2 recipes and their pros & cons.' +) st.write('__PROBLEM/QUESTION__:') if 'typed_problem' not in st.session_state: - st.session_state.typed_problem: str = 'what industry do you know best?' + st.session_state.typed_problem: str = DEFAULT_PROBLEM st.session_state.typed_problem: str = st.text_area(label='Problem/Question', value=st.session_state.typed_problem, @@ -34,51 +41,67 @@ disabled=False, label_visibility='collapsed') - -generic_agent, semikong_agent = st.columns(spec=2, gap='large') - - -if 'generic_agent_solutions' not in st.session_state: - st.session_state.generic_agent_solutions: defaultdict[str, str] = defaultdict(str) - - -with generic_agent: - st.subheader('Generic Agent') - st.subheader('_using generic LM_') - - if st.button(label='SOLVE', - on_click=None, args=None, kwargs=None, - type='secondary', - disabled=False, - use_container_width=False): - with st.spinner(text='_SOLVING..._'): - logger.level('DEBUG') - - st.session_state.generic_agent_solutions[st.session_state.typed_problem]: str = \ - get_or_create_agent(use_semikong_lm=False).solve(problem=st.session_state.typed_problem) - - if (solution := st.session_state.generic_agent_solutions[st.session_state.typed_problem]): - st.markdown(body=solution.replace('$', r'\$')) - - if 'semikong_agent_solutions' not in st.session_state: st.session_state.semikong_agent_solutions: defaultdict[str, str] = defaultdict(str) - -with semikong_agent: - st.subheader('SEMICONDUCTOR INDUSTRY AGENT') - st.subheader('_using `SemiKong` LM_') - - if st.button(label='SOLVE', - on_click=None, args=None, kwargs=None, - type='primary', - disabled=False, - use_container_width=False): - with st.spinner(text='_SOLVING..._'): - logger.level('DEBUG') - - st.session_state.semikong_agent_solutions[st.session_state.typed_problem]: str = \ - get_or_create_agent(use_semikong_lm=True).solve(problem=st.session_state.typed_problem) - - if (solution := st.session_state.semikong_agent_solutions[st.session_state.typed_problem]): - st.markdown(body=solution.replace('$', r'\$')) +st.subheader('SEMICONDUCTOR INDUSTRY-SPECIFIC AGENT') +st.subheader('_using `SemiKong` LM_') + +if st.button(label='SOLVE', + on_click=None, args=None, kwargs=None, + type='primary', + disabled=False, + use_container_width=False): + with st.spinner(text='_SOLVING..._'): + logger.level('DEBUG') + + st.session_state.semikong_agent_solutions[st.session_state.typed_problem]: str = \ + get_or_create_agent(use_semikong_lm=False).solve(problem=st.session_state.typed_problem) + + +def parse_recipe_text(text: str) -> dict[str, str]: + # Initialize an empty dictionary to store the parsed data + parsed_data = {"recipe_1": "", "recipe_2": "", "agent_advice": ""} + + # Split the text by lines + lines = text.split("\n") + + # Initialize a variable to keep track of the current section + current_section = None + + # Loop through each line + for line in lines: + # Check if the line indicates the start of a new section + if "recipe_1:" in line: + current_section = "recipe_1" + elif "recipe_2:" in line: + current_section = "recipe_2" + elif "agent_advice:" in line: + current_section = "agent_advice" + elif current_section: + # If we are in a section, append the line to the corresponding key in the dictionary + parsed_data[current_section] += line + "\n" + + # Remove any trailing newlines from the values + parsed_data = {key: value.strip() for key, value in parsed_data.items()} + + return parsed_data + + +if (solution := st.session_state.semikong_agent_solutions[st.session_state.typed_problem]): + solution = OpenAILM.from_defaults().get_response( + prompt=f"""{solution} \n\n Please help me parse the above text into this format:\n + recipe_1: Show the recipe 1 here\n + recipe_2: Show the recipe 2 here\n + agent_advice: Show the agent's general considerations here\n + DO NOT forget the key and DO NOT change the key format. +""", + history=[ + {"role": "system", + "content": "You are an expert in parsing text into a specific format. Please help me with this task."}, + ] + ) + + # solution = parse_recipe_text(solution) + + st.markdown(body=solution) diff --git a/openssa/__init__.py b/openssa/__init__.py index 3f7a4f02f..ca6daf92d 100644 --- a/openssa/__init__.py +++ b/openssa/__init__.py @@ -13,17 +13,17 @@ from .core.agent.dana import DANA -from .core.program_store import ProgramStore +from .core.program_store.program_store import ProgramStore from .core.programming.hierarchical.plan import HTP from .core.programming.hierarchical.planner import HTPlanner -from .core.reasoning.base import BaseReasoner -from .core.reasoning.ooda import OodaReasoner +from .core.reasoning.ooda.ooda_reasoner import OodaReasoner +from .core.reasoning.simple.simple_reasoner import SimpleReasoner from .core.resource.file import FileResource from .core.resource.db import DbResource -from .core.task import Task +from .core.task.task import Task from .core.util.lm.config import LMConfig from .core.util.lm.huggingface import HuggingFaceLM diff --git a/openssa/core/agent/dana.py b/openssa/core/agent/dana.py index 99051f502..cb8084d1d 100644 --- a/openssa/core/agent/dana.py +++ b/openssa/core/agent/dana.py @@ -23,15 +23,15 @@ from dataclasses import dataclass, field from typing import Any, TYPE_CHECKING -from openssa.core.program_store import ProgramStore +from openssa.core.program_store.program_store import ProgramStore from openssa.core.programming.hierarchical.planner import HTPlanner -from openssa.core.task import Task +from openssa.core.task.task import Task if TYPE_CHECKING: - from openssa.core.programming.abstract.program import AbstractProgram - from openssa.core.programming.abstract.programmer import AbstractProgrammer - from openssa.core.knowledge.abstract import Knowledge - from openssa.core.resource.abstract import AbstractResource + from openssa.core.programming.base.program import BaseProgram + from openssa.core.programming.base.programmer import BaseProgrammer + from openssa.core.knowledge.base import Knowledge + from openssa.core.resource.base import BaseResource @dataclass @@ -60,33 +60,34 @@ class DANA: # Programmer for creating problem-solving Programs # (default: Hierarchical Task Planner) - programmer: AbstractProgrammer = field(default_factory=HTPlanner, - init=True, - repr=True, - hash=None, - compare=True, - metadata=None, - kw_only=False) + programmer: BaseProgrammer = field(default_factory=HTPlanner, + init=True, + repr=True, + hash=None, + compare=True, + metadata=None, + kw_only=False) # Resources for answering information-querying questions # (default: empty set) - resources: set[AbstractResource] = field(default_factory=set, - init=True, - repr=True, - hash=None, - compare=True, - metadata=None, - kw_only=False) + resources: set[BaseResource] = field(default_factory=set, + init=True, + repr=True, + hash=None, + compare=True, + metadata=None, + kw_only=False) def add_knowledge(self, *new_knowledge: Knowledge): """Add new Knowledge piece(s) stored in string(s).""" self.knowledge.update(new_knowledge) - def add_resources(self, *new_resources: AbstractResource): + def add_resources(self, *new_resources: BaseResource): """Add new Resource(s).""" self.resources.update(new_resources) - def solve(self, problem: str, adaptations_from_known_programs: dict[str, Any] | None = None) -> str: + def solve(self, problem: str, adaptations_from_known_programs: dict[str, Any] | None = None, + allow_reject: bool = False) -> str: """Solve the posed Problem. First either find from the Program Store a solution Program suitable for the Problem, @@ -96,11 +97,11 @@ def solve(self, problem: str, adaptations_from_known_programs: dict[str, Any] | """ task: Task = Task(ask=problem, resources=self.resources) - program: AbstractProgram = ( + program: BaseProgram = ( self.program_store.find_program(task=task, knowledge=self.knowledge, adaptations_from_known_programs=adaptations_from_known_programs) or self.programmer.create_program(task=task, knowledge=self.knowledge) ) - return program.execute(knowledge=self.knowledge) + return program.execute(knowledge=self.knowledge, allow_reject=allow_reject) diff --git a/openssa/core/knowledge/_prompts.py b/openssa/core/knowledge/_prompts.py index e49fd053c..f7e91e907 100644 --- a/openssa/core/knowledge/_prompts.py +++ b/openssa/core/knowledge/_prompts.py @@ -1,6 +1,6 @@ -from openssa.core.util.lm.abstract import LMChatHist +from openssa.core.util.lm.base import LMChatHist -from .abstract import Knowledge +from .base import Knowledge KNOWLEDGE_INJECTION_PROMPT_TEMPLATE: str = \ diff --git a/openssa/core/knowledge/abstract.py b/openssa/core/knowledge/abstract.py deleted file mode 100644 index b094dedbb..000000000 --- a/openssa/core/knowledge/abstract.py +++ /dev/null @@ -1,4 +0,0 @@ -"""Abstract Knowledge.""" - - -type Knowledge = str diff --git a/openssa/core/knowledge/base.py b/openssa/core/knowledge/base.py new file mode 100644 index 000000000..c5e2068a6 --- /dev/null +++ b/openssa/core/knowledge/base.py @@ -0,0 +1,4 @@ +"""Knowledge.""" + + +type Knowledge = str diff --git a/openssa/core/knowledge/fact/abstract.py b/openssa/core/knowledge/fact/abstract.py deleted file mode 100644 index a4bfb34d1..000000000 --- a/openssa/core/knowledge/fact/abstract.py +++ /dev/null @@ -1,8 +0,0 @@ -"""Abstract Fact.""" - - -from abc import ABC - - -class AbstractFact(ABC): # noqa: B024 - """Abstract Fact.""" diff --git a/openssa/core/knowledge/fact/base.py b/openssa/core/knowledge/fact/base.py new file mode 100644 index 000000000..183cdd23f --- /dev/null +++ b/openssa/core/knowledge/fact/base.py @@ -0,0 +1,8 @@ +"""Fact abstract base class.""" + + +from abc import ABC + + +class BaseFact(ABC): # noqa: B024 + """Fact abstract base class.""" diff --git a/openssa/core/knowledge/heuristic/abstract.py b/openssa/core/knowledge/heuristic/abstract.py deleted file mode 100644 index 6be73e104..000000000 --- a/openssa/core/knowledge/heuristic/abstract.py +++ /dev/null @@ -1,8 +0,0 @@ -"""Abstract Heuristic.""" - - -from abc import ABC - - -class AbstractHeuristic(ABC): # noqa: B024 - """Abstract Heuristic.""" diff --git a/openssa/core/knowledge/heuristic/base.py b/openssa/core/knowledge/heuristic/base.py new file mode 100644 index 000000000..080b85a17 --- /dev/null +++ b/openssa/core/knowledge/heuristic/base.py @@ -0,0 +1,8 @@ +"""Heuristic abstract base class.""" + + +from abc import ABC + + +class BaseHeuristic(ABC): # noqa: B024 + """Heuristic abstract base class.""" diff --git a/openssa/core/knowledge/inference_rule/abstract.py b/openssa/core/knowledge/inference_rule/abstract.py deleted file mode 100644 index a66303901..000000000 --- a/openssa/core/knowledge/inference_rule/abstract.py +++ /dev/null @@ -1,8 +0,0 @@ -"""Abstract Inference Rule.""" - - -from abc import ABC - - -class AbstractInferenceRule(ABC): # noqa: B024 - """Abstract Inference Rule.""" diff --git a/openssa/core/knowledge/inference_rule/base.py b/openssa/core/knowledge/inference_rule/base.py new file mode 100644 index 000000000..636106d19 --- /dev/null +++ b/openssa/core/knowledge/inference_rule/base.py @@ -0,0 +1,8 @@ +"""Inference Rule abstract base class.""" + + +from abc import ABC + + +class BaseInferenceRule(ABC): # noqa: B024 + """Inference Rule abstract base class.""" diff --git a/openssa/core/program_store/__init__.py b/openssa/core/program_store/program_store.py similarity index 61% rename from openssa/core/program_store/__init__.py rename to openssa/core/program_store/program_store.py index 04594c20b..a5de8e78e 100644 --- a/openssa/core/program_store/__init__.py +++ b/openssa/core/program_store/program_store.py @@ -1,7 +1,7 @@ """ -============================================================= -PROGRAM SPACE for storing searchable problem-solving Programs -============================================================= +============================================================ +PROGRAM STORE containing searchable problem-solving Programs +============================================================ """ @@ -17,16 +17,16 @@ from ._prompts import PROGRAM_SEARCH_PROMPT_TEMPLATE if TYPE_CHECKING: - from openssa.core.knowledge.abstract import Knowledge - from openssa.core.programming.abstract.program import AbstractProgram - from openssa.core.resource.abstract import AbstractResource - from openssa.core.task import Task - from openssa.core.util.lm.abstract import AbstractLM, LMChatHist + from openssa.core.knowledge.base import Knowledge + from openssa.core.programming.base.program import BaseProgram + from openssa.core.resource.base import BaseResource + from openssa.core.task.task import Task + from openssa.core.util.lm.base import BaseLM, LMChatHist @dataclass class ProgramStore: - """Program Store for storing searchable problem-solving Programs.""" + """Program Store containing searchable problem-solving Programs.""" # informative descriptions of stored problem-solving Programs, indexed by name descriptions: dict[str, str] = field(default_factory=dict, @@ -38,30 +38,30 @@ class ProgramStore: kw_only=False) # stored problem-solving Programs, indexed by name - programs: dict[str, AbstractProgram] = field(default_factory=dict, - init=True, - repr=False, - hash=None, - compare=True, - metadata=None, - kw_only=False) + programs: dict[str, BaseProgram] = field(default_factory=dict, + init=True, + repr=False, + hash=None, + compare=True, + metadata=None, + kw_only=False) # language model for searching among stored problem-solving Programs - lm: AbstractLM = field(default_factory=OpenAILM.from_defaults, - init=True, - repr=True, - hash=None, - compare=True, - metadata=None, - kw_only=False) - - def add_or_update_program(self, name: str, description: str, program: AbstractProgram): + lm: BaseLM = field(default_factory=OpenAILM.from_defaults, + init=True, + repr=True, + hash=None, + compare=True, + metadata=None, + kw_only=False) + + def add_or_update_program(self, name: str, description: str, program: BaseProgram): """Add or update a Program with its unique identifying name & informative description.""" self.descriptions[name]: str = description - self.programs[name]: AbstractProgram = program + self.programs[name]: BaseProgram = program def find_program(self, task: Task, knowledge: set[Knowledge] | None = None, - adaptations_from_known_programs: dict[str, Any] | None = None) -> AbstractProgram | None: + adaptations_from_known_programs: dict[str, Any] | None = None) -> BaseProgram | None: """Find a suitable Program for the posed Problem, or return None.""" knowledge_lm_hist: LMChatHist | None = (knowledge_injection_lm_chat_msgs(knowledge=knowledge) if knowledge @@ -82,6 +82,6 @@ def find_program(self, task: Task, knowledge: set[Knowledge] | None = None, if matching_program_name == 'NONE': return None - adapted_program: AbstractProgram = self.programs[matching_program_name].adapt(**(adaptations_from_known_programs or {})) + adapted_program: BaseProgram = self.programs[matching_program_name].adapt(**(adaptations_from_known_programs or {})) adapted_program.task: Task = task return adapted_program diff --git a/openssa/core/programming/abstract/programmer.py b/openssa/core/programming/abstract/programmer.py deleted file mode 100644 index 975403fe1..000000000 --- a/openssa/core/programming/abstract/programmer.py +++ /dev/null @@ -1,40 +0,0 @@ -""" -============================= -ABSTRACT PROGRAMMER INTERFACE -============================= - -`AbstractProgrammer` is `OpenSSA`'s abstract base class for using LMs to create problem-solving Programs. -""" - - -from __future__ import annotations - -from abc import ABC, abstractmethod -from dataclasses import dataclass, field -from typing import Any, TYPE_CHECKING - -from openssa.core.util.lm.openai import OpenAILM - -if TYPE_CHECKING: - from openssa.core.knowledge.abstract import Knowledge - from openssa.core.task import Task - from openssa.core.util.lm.abstract import AbstractLM - from .program import AbstractProgram - - -@dataclass -class AbstractProgrammer(ABC): - """Abstract Programmer.""" - - # language model for generating problem-solving Programs - lm: AbstractLM = field(default_factory=OpenAILM.from_defaults, - init=True, - repr=True, - hash=None, - compare=True, - metadata=None, - kw_only=False) - - @abstractmethod - def create_program(self, task: Task, knowledge: set[Knowledge] | None = None, **kwargs: Any) -> AbstractProgram: - """Construct a Program for solving the posed Problem using given Knowledge & Resources.""" diff --git a/openssa/core/programming/abstract/program.py b/openssa/core/programming/base/program.py similarity index 62% rename from openssa/core/programming/abstract/program.py rename to openssa/core/programming/base/program.py index ee74bab09..6967c4c33 100644 --- a/openssa/core/programming/abstract/program.py +++ b/openssa/core/programming/base/program.py @@ -1,9 +1,9 @@ """ -========================== -ABSTRACT PROGRAM INTERFACE -========================== +================= +PROGRAM INTERFACE +================= -`AbstractProgram` is `OpenSSA`'s abstract base class for problem-solving Programs. +`BaseProgram` is `OpenSSA`'s abstract base class for problem-solving Programs. A Program has a target Task, which encapsulates a posed Problem to solve and a set of Resources to help solve it. @@ -21,27 +21,27 @@ from typing import Any, Self as SameType, TYPE_CHECKING if TYPE_CHECKING: - from openssa.core.knowledge.abstract import Knowledge - from openssa.core.task import Task - from .programmer import AbstractProgrammer + from openssa.core.knowledge.base import Knowledge + from openssa.core.task.task import Task + from .programmer import BaseProgrammer @dataclass -class AbstractProgram(ABC): - """Abstract Program.""" +class BaseProgram(ABC): + """Program abstract base class.""" # target Task to solve task: Task # Programmer that has created this - programmer: AbstractProgrammer | None = None + programmer: BaseProgrammer | None = None @abstractmethod def adapt(self, **kwargs: Any) -> SameType: """Return adapted copy.""" @abstractmethod - def execute(self, knowledge: set[Knowledge] | None = None, **kwargs: Any) -> str: + def execute(self, knowledge: set[Knowledge] | None = None, allow_reject: bool = False, **kwargs: Any) -> str: """Execute and return string result. Execution also optionally takes into account domain-specific Knowledge. diff --git a/openssa/core/programming/base/programmer.py b/openssa/core/programming/base/programmer.py new file mode 100644 index 000000000..36237161a --- /dev/null +++ b/openssa/core/programming/base/programmer.py @@ -0,0 +1,40 @@ +""" +==================== +PROGRAMMER INTERFACE +==================== + +`BaseProgrammer` is `OpenSSA`'s abstract base class for using LMs to create problem-solving Programs. +""" + + +from __future__ import annotations + +from abc import ABC, abstractmethod +from dataclasses import dataclass, field +from typing import Any, TYPE_CHECKING + +from openssa.core.util.lm.openai import OpenAILM + +if TYPE_CHECKING: + from openssa.core.knowledge.base import Knowledge + from openssa.core.task.task import Task + from openssa.core.util.lm.base import BaseLM + from .program import BaseProgram + + +@dataclass +class BaseProgrammer(ABC): + """Programmer abstract base class.""" + + # language model for generating problem-solving Programs + lm: BaseLM = field(default_factory=OpenAILM.from_defaults, + init=True, + repr=True, + hash=None, + compare=True, + metadata=None, + kw_only=False) + + @abstractmethod + def create_program(self, task: Task, knowledge: set[Knowledge] | None = None, **kwargs: Any) -> BaseProgram: + """Construct a Program for solving the posed Problem using given Knowledge & Resources.""" diff --git a/openssa/core/programming/hierarchical/plan.py b/openssa/core/programming/hierarchical/plan.py index e942b794e..25e8f504d 100644 --- a/openssa/core/programming/hierarchical/plan.py +++ b/openssa/core/programming/hierarchical/plan.py @@ -15,7 +15,6 @@ to enable the execution of a subsequent HTP node to benefit from results from earlier nodes at the same depth level. """ - from __future__ import annotations from dataclasses import dataclass, field, replace @@ -24,24 +23,20 @@ from typing import TypedDict, Required, NotRequired, TYPE_CHECKING from loguru import logger -from tqdm import tqdm - -from openssa.core.programming.abstract.program import AbstractProgram from openssa.core.knowledge._prompts import knowledge_injection_lm_chat_msgs -from openssa.core.reasoning.ooda import OodaReasoner -from openssa.core.task import Task, TaskDict +from openssa.core.programming.base.program import BaseProgram +from openssa.core.reasoning.ooda.ooda_reasoner import OodaReasoner from openssa.core.task.status import TaskStatus +from openssa.core.task.task import Task, TaskDict +from tqdm import tqdm from ._prompts import HTP_RESULTS_SYNTH_PROMPT_TEMPLATE if TYPE_CHECKING: - from openssa.core.reasoning.abstract import AbstractReasoner - from openssa.core.resource.abstract import AbstractResource - from openssa.core.knowledge.abstract import Knowledge - from openssa.core.util.lm.abstract import LMChatHist + from openssa.core.reasoning.base import BaseReasoner + from openssa.core.resource.base import BaseResource + from openssa.core.knowledge.base import Knowledge from openssa.core.util.misc import AskAnsPair - from .planner import HTPlanner - type HTPDict = TypedDict('HTPDict', {'task': Required[TaskDict | str], 'sub-htps': NotRequired[list[HTPDict]]}, @@ -53,7 +48,7 @@ class PLAN(SimpleNamespace): @dataclass -class HTP(AbstractProgram): +class HTP(BaseProgram): """Hierarchical Task Plan (HTP).""" # decomposed sub-HTPs for solving target Task @@ -67,13 +62,13 @@ class HTP(AbstractProgram): # Reasoner for working through individual Tasks to either conclude or make partial progress on them # (default: Observe-Orient-Decide-Act (OODA) Reasoner) - reasoner: AbstractReasoner = field(default_factory=OodaReasoner, - init=True, - repr=True, - hash=None, - compare=True, - metadata=None, - kw_only=False) + reasoner: BaseReasoner = field(default_factory=OodaReasoner, + init=True, + repr=True, + hash=None, + compare=True, + metadata=None, + kw_only=False) @property def quick_repr(self) -> PLAN: @@ -111,7 +106,7 @@ def fill_missing_resources(self): """Fix missing Resources in HTP.""" for sub_htp in self.sub_htps: if not sub_htp.task.resources: - sub_htp.task.resources: set[AbstractResource] = self.task.resources + sub_htp.task.resources: set[BaseResource] = self.task.resources sub_htp.fill_missing_resources() def adapt(self, **kwargs: str): @@ -120,7 +115,8 @@ def adapt(self, **kwargs: str): task=replace(self.task, ask=self.task.ask.format(**kwargs)), sub_htps=[sub_htp.adapt(**kwargs) for sub_htp in self.sub_htps]) - def execute(self, knowledge: set[Knowledge] | None = None, other_results: list[AskAnsPair] | None = None) -> str: + def execute(self, knowledge: set[Knowledge] | None = None, other_results: list[AskAnsPair] | None = None, + allow_reject: bool = False) -> str: # pylint: disable=arguments-differ """Execute and return string result, using specified Reasoner to work through involved Task & Sub-Tasks. @@ -129,7 +125,8 @@ def execute(self, knowledge: set[Knowledge] | None = None, other_results: list[A self.fill_missing_resources() # TODO: optimize to not always use all resources # first, attempt direct solution with Reasoner - reasoning_wo_sub_results: str = self.reasoner.reason(task=self.task, knowledge=knowledge, other_results=other_results) # noqa: E501 + reasoning_wo_sub_results: str = self.reasoner.reason(task=self.task, knowledge=knowledge, + other_results=other_results) # noqa: E501 if self.sub_htps: decomposed_htp: HTP = self @@ -138,7 +135,8 @@ def execute(self, knowledge: set[Knowledge] | None = None, other_results: list[A # and if there is still allowed recursive depth, # use Programmer to decompose Problem into sub-HTPs elif (self.task.is_attempted and not self.task.is_done) and (self.programmer and self.programmer.max_depth): - decomposed_htp: HTP = self.programmer.create_htp(task=self.task, knowledge=knowledge, reasoner=self.reasoner) + decomposed_htp: HTP = self.programmer.create_htp(task=self.task, knowledge=knowledge, + reasoner=self.reasoner) else: decomposed_htp = None @@ -154,21 +152,38 @@ def execute(self, knowledge: set[Knowledge] | None = None, other_results: list[A for sub_htp in tqdm(decomposed_htp.sub_htps): sub_results.append((sub_htp.task.ask, sub_htp.execute(knowledge=knowledge, other_results=sub_results))) - inputs: str = ('REASONING WITHOUT SUPPORTING/OTHER RESULTS ' - '(preliminary conclusions here can be overriden by more convincing supporting/other data):\n' - f'{reasoning_wo_sub_results}\n' - '\n\n' + - '\n\n'.join((f'SUPPORTING QUESTION/TASK #{i + 1}:\n{ask}\n' - '\n' - f'SUPPORTING RESULT #{i + 1}:\n{result}\n') - for i, (ask, result) in enumerate(sub_results)) + - (('\n\n' + - '\n\n'.join((f'OTHER QUESTION/TASK #{i + 1}:\n{ask}\n' - '\n' - f'OTHER RESULT #{i + 1}:\n{result}\n') - for i, (ask, result) in enumerate(other_results))) - if other_results - else '')) + # If the Reasoner allows for rejecting to answer due to lack of information + if allow_reject: + inputs: str = ( + "If supporting information request for clarification or more information, " + "just request more information without doing any other thing. " + + '\n\n'.join((f'SUPPORTING QUESTION/TASK #{i + 1}:\n{ask}\n' + '\n' + f'SUPPORTING RESULT #{i + 1}:\n{result}\n') + for i, (ask, result) in enumerate(sub_results)) + + (('\n\n' + + '\n\n'.join((f'OTHER QUESTION/TASK #{i + 1}:\n{ask}\n' + '\n' + f'OTHER RESULT #{i + 1}:\n{result}\n') + for i, (ask, result) in enumerate(other_results))) + if other_results + else '')) + else: + inputs: str = ('REASONING WITHOUT SUPPORTING/OTHER RESULTS ' + '(preliminary conclusions here can be overriden by more convincing supporting/other data):\n' + f'{reasoning_wo_sub_results}\n' + '\n\n' + + '\n\n'.join((f'SUPPORTING QUESTION/TASK #{i + 1}:\n{ask}\n' + '\n' + f'SUPPORTING RESULT #{i + 1}:\n{result}\n') + for i, (ask, result) in enumerate(sub_results)) + + (('\n\n' + + '\n\n'.join((f'OTHER QUESTION/TASK #{i + 1}:\n{ask}\n' + '\n' + f'OTHER RESULT #{i + 1}:\n{result}\n') + for i, (ask, result) in enumerate(other_results))) + if other_results + else '')) self.task.result: str = self.reasoner.lm.get_response( prompt=HTP_RESULTS_SYNTH_PROMPT_TEMPLATE.format(ask=self.task.ask, info=inputs), diff --git a/openssa/core/programming/hierarchical/planner.py b/openssa/core/programming/hierarchical/planner.py index 09696e5c0..3dd6a6486 100644 --- a/openssa/core/programming/hierarchical/planner.py +++ b/openssa/core/programming/hierarchical/planner.py @@ -14,19 +14,19 @@ from dataclasses import dataclass, replace from typing import TYPE_CHECKING -from openssa.core.programming.abstract.programmer import AbstractProgrammer +from openssa.core.programming.base.programmer import BaseProgrammer from openssa.core.knowledge._prompts import knowledge_injection_lm_chat_msgs -from openssa.core.reasoning.ooda import OodaReasoner -from openssa.core.task import Task +from openssa.core.reasoning.ooda.ooda_reasoner import OodaReasoner +from openssa.core.task.task import Task from .plan import HTP from ._prompts import SIMPLIFIED_DECOMPOSITION_PROMPT_TEMPLATE if TYPE_CHECKING: - from openssa.core.knowledge.abstract import Knowledge - from openssa.core.reasoning.abstract import AbstractReasoner - from openssa.core.resource.abstract import AbstractResource - from openssa.core.util.lm.abstract import LMChatHist + from openssa.core.knowledge.base import Knowledge + from openssa.core.reasoning.base import BaseReasoner + from openssa.core.resource.base import BaseResource + from openssa.core.util.lm.base import LMChatHist from .plan import HTPDict @@ -34,7 +34,7 @@ @dataclass -class HTPlanner(AbstractProgrammer): +class HTPlanner(BaseProgrammer): """Hierarchical Task Planner.""" # maximum allowed depth @@ -43,10 +43,10 @@ class HTPlanner(AbstractProgrammer): # maximum number of sub-tasks per decomposition max_subtasks_per_decomp: int = 4 - def create_htp(self, task: Task, knowledge: set[Knowledge] | None = None, reasoner: AbstractReasoner | None = None) -> HTP: # noqa: E501 + def create_htp(self, task: Task, knowledge: set[Knowledge] | None = None, reasoner: BaseReasoner | None = None) -> HTP: # noqa: E501 """Construct HTP for solving posed Problem with given Knowledge and Resources.""" if not reasoner: - reasoner: AbstractReasoner = OodaReasoner(lm=self.lm) + reasoner: BaseReasoner = OodaReasoner(lm=self.lm) if self.max_depth > 0: prompt: str = SIMPLIFIED_DECOMPOSITION_PROMPT_TEMPLATE.format( diff --git a/openssa/core/reasoning/abstract.py b/openssa/core/reasoning/base.py similarity index 55% rename from openssa/core/reasoning/abstract.py rename to openssa/core/reasoning/base.py index b0062d32e..9c77e881d 100644 --- a/openssa/core/reasoning/abstract.py +++ b/openssa/core/reasoning/base.py @@ -1,9 +1,9 @@ """ -=========================== -ABSTRACT REASONER INTERFACE -=========================== +================== +REASONER INTERFACE +================== -`AbstractReasoner` is `OpenSSA`'s abstract base class for reasoning. +`BaseReasoner` is `OpenSSA`'s abstract base class for reasoning. A reasoner has an LM and can `.reason(...)` through a given task (which can come with assigned informational resources), optionally leveraging some given domain-specific knowledge and/or some other results from elsewhere, @@ -20,24 +20,24 @@ from openssa.core.util.lm.openai import OpenAILM if TYPE_CHECKING: - from openssa.core.knowledge.abstract import Knowledge - from openssa.core.task import Task - from openssa.core.util.lm.abstract import AbstractLM + from openssa.core.knowledge.base import Knowledge + from openssa.core.task.task import Task + from openssa.core.util.lm.base import BaseLM from openssa.core.util.misc import AskAnsPair @dataclass -class AbstractReasoner(ABC): - """Abstract Reasoner.""" +class BaseReasoner(ABC): + """Reasoner abstract base class.""" # language model for reasoning - lm: AbstractLM = field(default_factory=OpenAILM.from_defaults, - init=True, - repr=True, - hash=None, - compare=True, - metadata=None, - kw_only=False) + lm: BaseLM = field(default_factory=OpenAILM.from_defaults, + init=True, + repr=True, + hash=None, + compare=True, + metadata=None, + kw_only=False) @abstractmethod def reason(self, task: Task, *, diff --git a/openssa/core/reasoning/ooda/__init__.py b/openssa/core/reasoning/ooda/ooda_reasoner.py similarity index 94% rename from openssa/core/reasoning/ooda/__init__.py rename to openssa/core/reasoning/ooda/ooda_reasoner.py index ee2997002..a98cc5717 100644 --- a/openssa/core/reasoning/ooda/__init__.py +++ b/openssa/core/reasoning/ooda/ooda_reasoner.py @@ -24,16 +24,16 @@ from typing import TYPE_CHECKING from openssa.core.knowledge._prompts import knowledge_injection_lm_chat_msgs -from openssa.core.reasoning.abstract import AbstractReasoner +from openssa.core.reasoning.base import BaseReasoner from openssa.core.task.status import TaskStatus from openssa.core.util.misc import format_other_result from ._prompts import ORIENT_PROMPT_TEMPLATE if TYPE_CHECKING: - from openssa.core.knowledge.abstract import Knowledge - from openssa.core.task import Task - from openssa.core.util.lm.abstract import LMChatHist + from openssa.core.knowledge.base import Knowledge + from openssa.core.task.task import Task + from openssa.core.util.lm.base import LMChatHist from openssa.core.util.misc import AskAnsPair @@ -46,7 +46,7 @@ @dataclass -class OodaReasoner(AbstractReasoner): +class OodaReasoner(BaseReasoner): """OODA Reasoner.""" def reason(self, task: Task, *, diff --git a/openssa/core/reasoning/base/_prompts.py b/openssa/core/reasoning/simple/_prompts.py similarity index 100% rename from openssa/core/reasoning/base/_prompts.py rename to openssa/core/reasoning/simple/_prompts.py diff --git a/openssa/core/reasoning/base/__init__.py b/openssa/core/reasoning/simple/simple_reasoner.py similarity index 91% rename from openssa/core/reasoning/base/__init__.py rename to openssa/core/reasoning/simple/simple_reasoner.py index 41f77728d..b24745e21 100644 --- a/openssa/core/reasoning/base/__init__.py +++ b/openssa/core/reasoning/simple/simple_reasoner.py @@ -3,7 +3,7 @@ BASE REASONER ============= -`BaseReasoner` is `OpenSSA`'s basic reasoning implementation, +`SimpleReasoner` is `OpenSSA`'s basic reasoning implementation, which simply forwards posed problems/questions/tasks to available informational resources, and aggregates answers from such resources without much further analysis. """ @@ -14,7 +14,7 @@ from dataclasses import dataclass from typing import TYPE_CHECKING -from openssa.core.reasoning.abstract import AbstractReasoner +from openssa.core.reasoning.base import BaseReasoner from openssa.core.knowledge._prompts import knowledge_injection_lm_chat_msgs from openssa.core.task.status import TaskStatus from openssa.core.util.misc import format_other_result @@ -23,14 +23,14 @@ OTHER_RESULTS_CONSO_PROMPT_TEMPLATE) if TYPE_CHECKING: - from openssa.core.planning.abstract.plan import AskAnsPair - from openssa.core.knowledge.abstract import Knowledge - from openssa.core.task import Task + from openssa.core.knowledge.base import Knowledge + from openssa.core.task.task import Task + from openssa.core.util.misc import AskAnsPair @dataclass -class BaseReasoner(AbstractReasoner): - """Base Reasoner.""" +class SimpleReasoner(BaseReasoner): + """Simple Reasoner.""" def reason(self, task: Task, *, knowledge: set[Knowledge], other_results: list[AskAnsPair] | None = None, n_words: int = 1000) -> str: diff --git a/openssa/core/resource/_global.py b/openssa/core/resource/_global.py index c991137ab..763f48146 100644 --- a/openssa/core/resource/_global.py +++ b/openssa/core/resource/_global.py @@ -7,10 +7,10 @@ if TYPE_CHECKING: from collections.abc import Callable - from .abstract import AbstractResource + from .base import BaseResource -GLOBAL_RESOURCES: dict[str, AbstractResource] = {} +GLOBAL_RESOURCES: dict[str, BaseResource] = {} def global_register(resource_class): @@ -20,7 +20,7 @@ def wrapped_init(self, *args, **kwargs) -> None: orig_init(self, *args, **kwargs) # pylint: disable=unnecessary-dunder-call if self.unique_name not in GLOBAL_RESOURCES: - GLOBAL_RESOURCES[self.unique_name]: AbstractResource = self + GLOBAL_RESOURCES[self.unique_name]: BaseResource = self resource_class.__init__: Callable[..., None] = wrapped_init diff --git a/openssa/core/resource/abstract.py b/openssa/core/resource/base.py similarity index 87% rename from openssa/core/resource/abstract.py rename to openssa/core/resource/base.py index 82ced641e..187bfa792 100644 --- a/openssa/core/resource/abstract.py +++ b/openssa/core/resource/base.py @@ -1,9 +1,9 @@ """ -========================================= -ABSTRACT INFORMATIONAL RESOURCE INTERFACE -========================================= +================================ +INFORMATIONAL RESOURCE INTERFACE +================================ -`AbstractResource` is `OpenSSA`'s abstract base class for informational resources that problem-solving agents access. +`BaseResource` is `OpenSSA`'s abstract base class for informational resources that problem-solving agents access. An informational resource is simply something that has a globally-unique name (within the running program), has a potentially non-unique but informationally helpful name, @@ -19,8 +19,8 @@ from ._prompts import RESOURCE_OVERVIEW_PROMPT_TEMPLATE -class AbstractResource(ABC): - """Abstract Resource.""" +class BaseResource(ABC): + """Resource abstract base class.""" @cached_property @abstractmethod diff --git a/openssa/core/resource/db.py b/openssa/core/resource/db.py index 3b26bc38f..65853776f 100644 --- a/openssa/core/resource/db.py +++ b/openssa/core/resource/db.py @@ -9,6 +9,7 @@ from __future__ import annotations +from .base import BaseResource from dataclasses import dataclass from typing import Any import os @@ -16,7 +17,6 @@ from sqlalchemy.orm import sessionmaker from llama_index.core import SummaryIndex, Document -from .abstract import AbstractResource from ._global import global_register @@ -44,7 +44,7 @@ def get_session(self): @global_register @dataclass -class DbResource(AbstractResource): +class DbResource(BaseResource): """Database Informational Resource.""" query: str diff --git a/openssa/core/resource/file.py b/openssa/core/resource/file.py index 4dc09f3a7..2b905ac95 100644 --- a/openssa/core/resource/file.py +++ b/openssa/core/resource/file.py @@ -39,7 +39,7 @@ from openssa.core.util.lm.openai import default_llama_index_openai_embed_model, default_llama_index_openai_lm -from .abstract import AbstractResource +from .base import BaseResource from ._global import global_register from ._prompts import RESOURCE_QA_PROMPT_TEMPLATE @@ -75,7 +75,7 @@ @global_register @dataclass -class FileResource(AbstractResource): +class FileResource(BaseResource): """File-stored Informational Resource.""" # directory or file path to file-stored Informational Resource diff --git a/openssa/core/resource/rss.py b/openssa/core/resource/rss.py index ba6cf6314..8eb747944 100644 --- a/openssa/core/resource/rss.py +++ b/openssa/core/resource/rss.py @@ -7,10 +7,10 @@ from __future__ import annotations -from .abstract import AbstractResource +from .base import BaseResource from ._global import global_register @global_register -class RssResource(AbstractResource): +class RssResource(BaseResource): """RSS Informational Resource.""" diff --git a/openssa/core/resource/sensor.py b/openssa/core/resource/sensor.py index 6dfffb810..b450cb688 100644 --- a/openssa/core/resource/sensor.py +++ b/openssa/core/resource/sensor.py @@ -7,10 +7,10 @@ from __future__ import annotations -from .abstract import AbstractResource +from .base import BaseResource from ._global import global_register @global_register -class SensorResource(AbstractResource): +class SensorResource(BaseResource): """Sensor Informational Resource.""" diff --git a/openssa/core/resource/web.py b/openssa/core/resource/web.py index cfe982664..27886422b 100644 --- a/openssa/core/resource/web.py +++ b/openssa/core/resource/web.py @@ -14,11 +14,11 @@ from llama_index.readers.web import SimpleWebPageReader from ._global import global_register -from .abstract import AbstractResource +from .base import BaseResource @global_register -class WebPageResource(AbstractResource): +class WebPageResource(BaseResource): """Webpage Informational Resource.""" def __init__(self, url: str): self.url: str = url @@ -74,7 +74,7 @@ def answer(self, question: str, n_words: int = 1000) -> str: # pylint: disable= @global_register -class WebSearchResource(AbstractResource): +class WebSearchResource(BaseResource): """Webpage Informational Resource.""" def __init__(self, search_query: str): self.search_query: str = search_query diff --git a/openssa/core/task/__init__.py b/openssa/core/task/task.py similarity index 77% rename from openssa/core/task/__init__.py rename to openssa/core/task/task.py index 624eea1ec..ebd8e7733 100644 --- a/openssa/core/task/__init__.py +++ b/openssa/core/task/task.py @@ -19,14 +19,12 @@ from .status import TaskStatus if TYPE_CHECKING: - from openssa.core.planning.abstract.plan import APlan - from openssa.core.planning.abstract.planner import APlanner - from openssa.core.resource.abstract import AbstractResource + from openssa.core.resource.base import BaseResource class TaskDict(TypedDict, total=False): ask: Required[str] - resources: NotRequired[set[AbstractResource]] + resources: NotRequired[set[BaseResource]] nature: NotRequired[TaskNature] status: NotRequired[TaskStatus] result: NotRequired[str] @@ -37,7 +35,7 @@ class Task: """Task.""" ask: str - resources: set[AbstractResource] = field(default_factory=set) + resources: set[BaseResource] = field(default_factory=set) nature: TaskNature | None = None status: TaskStatus = TaskStatus.PENDING result: str | None = None @@ -48,8 +46,8 @@ def from_dict(cls, d: TaskDict, /) -> Task: task: Task = cls(**d) if task.resources: - task.resources: set[AbstractResource] = {(GLOBAL_RESOURCES[resource] if isinstance(resource, str) else resource) # noqa: E501 - for resource in task.resources} + task.resources: set[BaseResource] = {(GLOBAL_RESOURCES[resource] if isinstance(resource, str) else resource) # noqa: E501 + for resource in task.resources} if task.nature: task.nature: TaskNature = TaskNature(task.nature) @@ -60,7 +58,7 @@ def from_dict(cls, d: TaskDict, /) -> Task: def to_json_dict(self) -> dict: d: TaskDict = asdict(self) - d['resources']: list[AbstractResource] = list(d['resources']) + d['resources']: list[BaseResource] = list(d['resources']) return d @classmethod diff --git a/openssa/core/util/lm/abstract.py b/openssa/core/util/lm/base.py similarity index 92% rename from openssa/core/util/lm/abstract.py rename to openssa/core/util/lm/base.py index f0c6a6414..36eb5a8d2 100644 --- a/openssa/core/util/lm/abstract.py +++ b/openssa/core/util/lm/base.py @@ -1,7 +1,7 @@ """ -====================================== -ABSTRACT LANGUAGE MODEL (LM) INTERFACE -====================================== +============================= +LANGUAGE MODEL (LM) INTERFACE +============================= """ @@ -21,7 +21,7 @@ @dataclass -class AbstractLM(ABC): +class BaseLM(ABC): """Abstract base class for consistent API for different LM services.""" model: str diff --git a/openssa/core/util/lm/huggingface.py b/openssa/core/util/lm/huggingface.py index 4aace50b8..dac71c8a1 100644 --- a/openssa/core/util/lm/huggingface.py +++ b/openssa/core/util/lm/huggingface.py @@ -14,16 +14,16 @@ from loguru import logger from huggingface_hub.inference._client import InferenceClient -from .abstract import AbstractLM +from .base import BaseLM from .config import LMConfig if TYPE_CHECKING: from openai.types.chat.chat_completion import ChatCompletion - from .abstract import LMChatHist + from .base import LMChatHist @dataclass -class HuggingFaceLM(AbstractLM): +class HuggingFaceLM(BaseLM): """HuggingFace LM.""" client: InferenceClient = field(init=False) diff --git a/openssa/core/util/lm/llama.py b/openssa/core/util/lm/llama.py index 0d80db6a3..6b901c538 100644 --- a/openssa/core/util/lm/llama.py +++ b/openssa/core/util/lm/llama.py @@ -14,7 +14,7 @@ from .openai import OpenAILM if TYPE_CHECKING: - from .abstract import LMChatHist + from .base import LMChatHist @dataclass diff --git a/openssa/core/util/lm/openai.py b/openssa/core/util/lm/openai.py index 642690723..b514eb132 100644 --- a/openssa/core/util/lm/openai.py +++ b/openssa/core/util/lm/openai.py @@ -17,16 +17,16 @@ from llama_index.embeddings.openai.base import OpenAIEmbedding, OpenAIEmbeddingMode, OpenAIEmbeddingModelType from llama_index.llms.openai.base import OpenAI as LlamaIndexOpenAILM -from .abstract import AbstractLM +from .base import BaseLM from .config import LMConfig if TYPE_CHECKING: from openai.types.chat.chat_completion import ChatCompletion - from .abstract import LMChatHist + from .base import LMChatHist @dataclass -class OpenAILM(AbstractLM): +class OpenAILM(BaseLM): """OpenAI LM.""" client: OpenAI = field(init=False) diff --git a/pyproject.toml b/pyproject.toml index c6901c986..4de7a7233 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openssa" -version = "0.24.9.25" +version = "0.24.10.10" authors = [ "Aitomatic, Inc. ", @@ -12,9 +12,9 @@ maintainers = [ "Aitomatic, Inc. ", "Vinh Luong ", "Sang Dinh ", - "Quynh Le ", "Shruti Raghavan ", "William Nguyen ", + "Quynh Le ", "Zooey Nguyen ", ] @@ -53,13 +53,13 @@ notebook = ">=7.2" [tool.poetry.group.docs.dependencies] sphinx = ">=8.0" -sphinx-autobuild = ">=2024.9" +sphinx-autobuild = ">=2024.10" sphinx-press-theme = ">=0.9" myst-parser = ">=4.0" [tool.poetry.group.lint.dependencies] flake8 = ">=7.1" -pylint = ">=3.2" +pylint = ">=3.3" ruff = ">=0.6" [tool.poetry.group.test.dependencies] @@ -70,7 +70,7 @@ python = ">=3.12,<3.14" # Llama interface huggingface-hub = ">=0.25" # OpenAI interface -openai = ">=1.46" +openai = ">=1.51" # LlamaIndex & related llama-index = ">=0.11" llama-index-embeddings-azure-openai = ">=0.2" @@ -78,14 +78,15 @@ llama-index-llms-azure-openai = ">=0.2" llama-index-readers-web = ">=0.2" docx2txt = ">=0.8" # for reading .docx files pypdf = ">=4.3" # for reading .pdf files -pycryptodome = ">=3.20" # for reading .pdf files: PyCryptodome is required for AES algorithm +pycryptodome = ">=3.21" # for reading .pdf files: PyCryptodome is required for AES algorithm # file systems fsspec = ">=2024.9" # base/local file system adlfs = ">=2024.7" # Azure Data Lake gcsfs = ">=2024.9" # Google Cloud Storage s3fs = ">=2024.9" # S3 # misc / other -google-api-python-client = ">=2.146" +certifi = ">2023.8" +google-api-python-client = ">=2.147" googlesearch-python = ">=1.2" httpx = ">=0.27" loguru = ">=0.7" @@ -95,7 +96,7 @@ torch = ">=2.2,<2.3" # 2.3 fails installing on Mac with M chip tqdm = ">=4.66" # optional dependencies required by extras -streamlit = {version = ">=1.38", optional = true} +streamlit = {version = ">=1.39", optional = true} streamlit-extras = {version = ">=0.4", optional = true} streamlit-mic-recorder = {version = ">=0.0.8", optional = true} @@ -142,6 +143,7 @@ disable = [ "relative-beyond-top-level", "too-few-public-methods", "too-many-positional-arguments", + "unknown-option-value", "unnecessary-pass", ]