From 09971ff55e46c9f79dbd214a1f01c1e376f25c59 Mon Sep 17 00:00:00 2001 From: philschmid Date: Thu, 29 May 2025 15:46:39 -0700 Subject: [PATCH] init --- .gitignore | 202 + Dockerfile | 46 + Makefile | 20 + README.md | 106 + backend/.env.example | 1 + backend/.gitignore | 163 + backend/LICENSE | 21 + backend/Makefile | 64 + backend/langgraph.json | 10 + backend/pyproject.toml | 59 + backend/src/agent/__init__.py | 3 + backend/src/agent/app.py | 61 + backend/src/agent/configuration.py | 60 + backend/src/agent/graph.py | 293 + backend/src/agent/prompts.py | 96 + backend/src/agent/state.py | 50 + backend/src/agent/tools_and_schemas.py | 23 + backend/src/agent/utils.py | 166 + backend/test-agent.ipynb | 530 ++ deepsearch.png | Bin 0 -> 108841 bytes docker-compose.yml | 41 + frontend/.gitignore | 24 + frontend/components.json | 21 + frontend/eslint.config.js | 28 + frontend/index.html | 13 + frontend/package-lock.json | 5829 ++++++++++++++++++ frontend/package.json | 46 + frontend/public/vite.svg | 1 + frontend/src/App.tsx | 184 + frontend/src/components/ActivityTimeline.tsx | 146 + frontend/src/components/ChatMessagesView.tsx | 321 + frontend/src/components/InputForm.tsx | 180 + frontend/src/components/WelcomeScreen.tsx | 39 + frontend/src/components/ui/badge.tsx | 46 + frontend/src/components/ui/button.tsx | 59 + frontend/src/components/ui/card.tsx | 92 + frontend/src/components/ui/input.tsx | 21 + frontend/src/components/ui/scroll-area.tsx | 56 + frontend/src/components/ui/select.tsx | 183 + frontend/src/components/ui/tabs.tsx | 64 + frontend/src/components/ui/textarea.tsx | 18 + frontend/src/global.css | 154 + frontend/src/lib/utils.ts | 6 + frontend/src/main.tsx | 13 + frontend/src/vite-env.d.ts | 1 + frontend/tsconfig.json | 28 + frontend/tsconfig.node.json | 24 + frontend/vite.config.ts | 26 + 48 files changed, 9638 insertions(+) create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 Makefile create mode 100644 README.md create mode 100644 backend/.env.example create mode 100644 backend/.gitignore create mode 100644 backend/LICENSE create mode 100644 backend/Makefile create mode 100644 backend/langgraph.json create mode 100644 backend/pyproject.toml create mode 100644 backend/src/agent/__init__.py create mode 100644 backend/src/agent/app.py create mode 100644 backend/src/agent/configuration.py create mode 100644 backend/src/agent/graph.py create mode 100644 backend/src/agent/prompts.py create mode 100644 backend/src/agent/state.py create mode 100644 backend/src/agent/tools_and_schemas.py create mode 100644 backend/src/agent/utils.py create mode 100644 backend/test-agent.ipynb create mode 100644 deepsearch.png create mode 100644 docker-compose.yml create mode 100644 frontend/.gitignore create mode 100644 frontend/components.json create mode 100644 frontend/eslint.config.js create mode 100644 frontend/index.html create mode 100644 frontend/package-lock.json create mode 100644 frontend/package.json create mode 100644 frontend/public/vite.svg create mode 100644 frontend/src/App.tsx create mode 100644 frontend/src/components/ActivityTimeline.tsx create mode 100644 frontend/src/components/ChatMessagesView.tsx create mode 100644 frontend/src/components/InputForm.tsx create mode 100644 frontend/src/components/WelcomeScreen.tsx create mode 100644 frontend/src/components/ui/badge.tsx create mode 100644 frontend/src/components/ui/button.tsx create mode 100644 frontend/src/components/ui/card.tsx create mode 100644 frontend/src/components/ui/input.tsx create mode 100644 frontend/src/components/ui/scroll-area.tsx create mode 100644 frontend/src/components/ui/select.tsx create mode 100644 frontend/src/components/ui/tabs.tsx create mode 100644 frontend/src/components/ui/textarea.tsx create mode 100644 frontend/src/global.css create mode 100644 frontend/src/lib/utils.ts create mode 100644 frontend/src/main.tsx create mode 100644 frontend/src/vite-env.d.ts create mode 100644 frontend/tsconfig.json create mode 100644 frontend/tsconfig.node.json create mode 100644 frontend/vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ad4a67f --- /dev/null +++ b/.gitignore @@ -0,0 +1,202 @@ +# Node / Frontend +node_modules/ +frontend/dist/ +frontend/.vite/ +frontend/coverage/ +.DS_Store +*.local + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +# OS generated files +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# IDE files +.idea/ +.vscode/ +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# Optional backend venv (if created in root) +#.venv/ + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class +uv.lock + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/latest/usage/project/#working-with-version-control +.pdm.toml +.pdm-python +.pdm-build/ + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +backend/.langgraph_api \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..fd23820 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,46 @@ +# Stage 1: Build React Frontend +FROM node:20-alpine AS frontend-builder + +# Set working directory for frontend +WORKDIR /app/frontend + +# Copy frontend package files and install dependencies +COPY frontend/package.json ./ +COPY frontend/package-lock.json ./ +# If you use yarn or pnpm, adjust accordingly (e.g., copy yarn.lock or pnpm-lock.yaml and use yarn install or pnpm install) +RUN npm install + +# Copy the rest of the frontend source code +COPY frontend/ ./ + +# Build the frontend +RUN npm run build + +# Stage 2: Python Backend +FROM docker.io/langchain/langgraph-api:3.11 + +# -- Copy built frontend from builder stage -- +# The app.py expects the frontend build to be at ../frontend/dist relative to its own location. +# If app.py is at /deps/backend/src/agent/app.py, then ../frontend/dist resolves to /deps/frontend/dist. +COPY --from=frontend-builder /app/frontend/dist /deps/frontend/dist +# -- End of copying built frontend -- + +# -- Adding local package . -- +ADD backend/ /deps/backend +# -- End of local package . -- + +# -- Installing all local dependencies -- +RUN PYTHONDONTWRITEBYTECODE=1 pip install --no-cache-dir -c /api/constraints.txt -e /deps/backend +# -- End of local dependencies install -- +ENV LANGGRAPH_HTTP='{"app": "/deps/backend/src/agent/app.py:app"}' +ENV LANGSERVE_GRAPHS='{"agent": "/deps/backend/src/agent/graph.py:graph"}' + +# -- Ensure user deps didn't inadvertently overwrite langgraph-api +RUN mkdir -p /api/langgraph_api /api/langgraph_runtime /api/langgraph_license && touch /api/langgraph_api/__init__.py /api/langgraph_runtime/__init__.py /api/langgraph_license/__init__.py +RUN PYTHONDONTWRITEBYTECODE=1 pip install --no-cache-dir --no-deps -e /api +# -- End of ensuring user deps didn't inadvertently overwrite langgraph-api -- +# -- Removing pip from the final image ~<:===~~~ -- +RUN pip uninstall -y pip setuptools wheel && rm -rf /usr/local/lib/python*/site-packages/pip* /usr/local/lib/python*/site-packages/setuptools* /usr/local/lib/python*/site-packages/wheel* && find /usr/local/bin -name "pip*" -delete +# -- End of pip removal -- + +WORKDIR /deps/backend \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..2e5c903 --- /dev/null +++ b/Makefile @@ -0,0 +1,20 @@ +.PHONY: help dev-frontend dev-backend dev + +help: + @echo "Available commands:" + @echo " make dev-frontend - Starts the frontend development server (Vite)" + @echo " make dev-backend - Starts the backend development server (Uvicorn with reload)" + @echo " make dev - Starts both frontend and backend development servers" + +dev-frontend: + @echo "Starting frontend development server..." + @cd frontend && npm run dev + +dev-backend: + @echo "Starting backend development server..." + @cd backend && langgraph dev + +# Run frontend and backend concurrently +dev: + @echo "Starting both frontend and backend development servers..." + @make dev-frontend & make dev-backend \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..958ca2b --- /dev/null +++ b/README.md @@ -0,0 +1,106 @@ +# Gemini DeepSearch LangGraph Quickstart + +This project demonstrates a fullstack application using a React frontend and a LangGraph-powered backend agent. The agent is designed to perform comprehensive research on a user's query by dynamically generating search terms, querying the web using Google Search, reflecting on the results to identify knowledge gaps, and iteratively refining its search until it can provide a well-supported answer with citations. This application serves as an example of building research-augmented conversational AI using LangGraph and Google's Gemini models. + +## Features + +- 💬 Fullstack application with a React frontend and LangGraph backend. +- 🧠 Powered by a LangGraph agent for advanced research and conversational AI. +- 🔍 Dynamic search query generation using Google Gemini models. +- 🌐 Integrated web research via Google Search API. +- 🤔 Reflective reasoning to identify knowledge gaps and refine searches. +- 📄 Generates answers with citations from gathered sources. +- 🔄 Hot-reloading for both frontend and backend development during development. + +## Project Structure + +The project is divided into two main directories: + +- `frontend/`: Contains the React application built with Vite. +- `backend/`: Contains the LangGraph/FastAPI application, including the research agent logic. + +## Getting Started: Development and Local Testing + +Follow these steps to get the application running locally for development and testing. + +**1. Prerequisites:** + +- Node.js and npm (or yarn/pnpm) +- Python 3.8+ +- **`GEMINI_API_KEY`**: The backend agent requires a Google Gemini API key. + 1. Navigate to the `backend/` directory. + 2. Create a file named `.env` by copying the `backend/.env.example` file. + 3. Open the `.env` file and add your Gemini API key: `GEMINI_API_KEY="YOUR_ACTUAL_API_KEY"` + +**2. Install Dependencies:** + +**Backend:** + +```bash +cd backend +pip install . +``` + +**Frontend:** + +```bash +cd frontend +npm install +``` + +**3. Run Development Servers:** + +**Backend & Frontend:** + +```bash +make dev +``` +This will run the backend and frontend development servers. Open your browser and navigate to the frontend development server URL (e.g., `http://localhost:5173/app`). + +_Alternatively, you can run the backend and frontend development servers separately. For the backend, open a terminal in the `backend/` directory and run `langgraph dev`. The backend API will be available at `http://127.0.0.1:2024`. It will also open a browser window to the LangGraph UI. For the frontend, open a terminal in the `frontend/` directory and run `npm run dev`. The frontend will be available at `http://localhost:5173`._ + +## How the Backend Agent Works (High-Level) + +The core of the backend is a LangGraph agent defined in `backend/src/agent/graph.py`. It follows these steps: + +![Agent Flow](./deepsearch.png) + +1. **Generate Initial Queries:** Based on your input, it generates a set of initial search queries using a Gemini model. +2. **Web Research:** For each query, it uses the Gemini model with the Google Search API to find relevant web pages. +3. **Reflection & Knowledge Gap Analysis:** The agent analyzes the search results to determine if the information is sufficient or if there are knowledge gaps. It uses a Gemini model for this reflection process. +4. **Iterative Refinement:** If gaps are found or the information is insufficient, it generates follow-up queries and repeats the web research and reflection steps (up to a configured maximum number of loops). +5. **Finalize Answer:** Once the research is deemed sufficient, the agent synthesizes the gathered information into a coherent answer, including citations from the web sources, using a Gemini model. + +## Deployment + +In production, the backend server serves the optimized static frontend build. LangGraph requires a Redis instance and a Postgres database. Redis is used as a pub-sub broker to enable streaming real time output from background runs. Postgres is used to store assistants, threads, runs, persist thread state and long term memory, and to manage the state of the background task queue with 'exactly once' semantics. For more details on how to deploy the backend server, take a look at the [LangGraph Documentation](https://langchain-ai.github.io/langgraph/concepts/deployment_options/). Below is an example of how to build a Docker image that includes the optimized frontend build and the backend server and run it via `docker-compose`. + +_Note: For the docker-compose.yml example you need a LangSmith API key, you can get one from [LangSmith](https://smith.langchain.com/settings)._ + +_Note: If you are not running the docker-compose.yml example or exposing the backend server to the public internet, you update the `apiUrl` in the `frontend/src/App.tsx` file your host. Currently the `apiUrl` is set to `http://localhost:8123` for docker-compose or `http://localhost:2024` for development._ + +**1. Build the Docker Image:** + + Run the following command from the **project root directory**: + ```bash + docker build -t deepsearch -f Dockerfile . + ``` +**2. Run the Production Server:** + + ```bash + GEMINI_API_KEY= LANGSMITH_API_KEY= docker-compose up + ``` + +Open your browser and navigate to `http://localhost:8123/app/` to see the application. The API will be available at `http://localhost:8123`. + +## Technologies Used + +- [React](https://reactjs.org/) (with [Vite](https://vitejs.dev/)) - For the frontend user interface. +- [Tailwind CSS](https://tailwindcss.com/) - For styling. +- [Shadcn UI](https://ui.shadcn.com/) - For components. +- [LangGraph](https://github.com/langchain-ai/langgraph) - For building the backend research agent. +- [Google Gemini](https://ai.google.dev/models/gemini) - LLM for query generation, reflection, and answer synthesis. + +## License + +This project is licensed under the Apache License 2.0. See the [LICENSE](LICENSE) file for details. \ No newline at end of file diff --git a/backend/.env.example b/backend/.env.example new file mode 100644 index 0000000..fde5f6b --- /dev/null +++ b/backend/.env.example @@ -0,0 +1 @@ +# GEMINI_API_KEY= \ No newline at end of file diff --git a/backend/.gitignore b/backend/.gitignore new file mode 100644 index 0000000..97f415d --- /dev/null +++ b/backend/.gitignore @@ -0,0 +1,163 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class +uv.lock + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/latest/usage/project/#working-with-version-control +.pdm.toml +.pdm-python +.pdm-build/ + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ diff --git a/backend/LICENSE b/backend/LICENSE new file mode 100644 index 0000000..7313079 --- /dev/null +++ b/backend/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Philipp Schmid + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/backend/Makefile b/backend/Makefile new file mode 100644 index 0000000..a1bc6d2 --- /dev/null +++ b/backend/Makefile @@ -0,0 +1,64 @@ +.PHONY: all format lint test tests test_watch integration_tests docker_tests help extended_tests + +# Default target executed when no arguments are given to make. +all: help + +# Define a variable for the test file path. +TEST_FILE ?= tests/unit_tests/ + +test: + uv run --with-editable . pytest $(TEST_FILE) + +test_watch: + uv run --with-editable . ptw --snapshot-update --now . -- -vv tests/unit_tests + +test_profile: + uv run --with-editable . pytest -vv tests/unit_tests/ --profile-svg + +extended_tests: + uv run --with-editable . pytest --only-extended $(TEST_FILE) + + +###################### +# LINTING AND FORMATTING +###################### + +# Define a variable for Python and notebook files. +PYTHON_FILES=src/ +MYPY_CACHE=.mypy_cache +lint format: PYTHON_FILES=. +lint_diff format_diff: PYTHON_FILES=$(shell git diff --name-only --diff-filter=d main | grep -E '\.py$$|\.ipynb$$') +lint_package: PYTHON_FILES=src +lint_tests: PYTHON_FILES=tests +lint_tests: MYPY_CACHE=.mypy_cache_test + +lint lint_diff lint_package lint_tests: + uv run ruff check . + [ "$(PYTHON_FILES)" = "" ] || uv run ruff format $(PYTHON_FILES) --diff + [ "$(PYTHON_FILES)" = "" ] || uv run ruff check --select I $(PYTHON_FILES) + [ "$(PYTHON_FILES)" = "" ] || uv run mypy --strict $(PYTHON_FILES) + [ "$(PYTHON_FILES)" = "" ] || mkdir -p $(MYPY_CACHE) && uv run mypy --strict $(PYTHON_FILES) --cache-dir $(MYPY_CACHE) + +format format_diff: + uv run ruff format $(PYTHON_FILES) + uv run ruff check --select I --fix $(PYTHON_FILES) + +spell_check: + codespell --toml pyproject.toml + +spell_fix: + codespell --toml pyproject.toml -w + +###################### +# HELP +###################### + +help: + @echo '----' + @echo 'format - run code formatters' + @echo 'lint - run linters' + @echo 'test - run unit tests' + @echo 'tests - run unit tests' + @echo 'test TEST_FILE= - run all tests in file' + @echo 'test_watch - run unit tests in watch mode' + diff --git a/backend/langgraph.json b/backend/langgraph.json new file mode 100644 index 0000000..3932dde --- /dev/null +++ b/backend/langgraph.json @@ -0,0 +1,10 @@ +{ + "dependencies": ["."], + "graphs": { + "agent": "./src/agent/graph.py:graph" + }, + "http": { + "app": "./src/agent/app.py:app" + }, + "env": ".env" +} diff --git a/backend/pyproject.toml b/backend/pyproject.toml new file mode 100644 index 0000000..09eb598 --- /dev/null +++ b/backend/pyproject.toml @@ -0,0 +1,59 @@ +[project] +name = "agent" +version = "0.0.1" +description = "Backend for the LangGraph agent" +authors = [ + { name = "Philipp Schmid", email = "schmidphilipp1995@gmail.com" }, +] +readme = "README.md" +license = { text = "MIT" } +requires-python = ">=3.11,<4.0" +dependencies = [ + "langgraph>=0.2.6", + "langchain>=0.3.19", + "langchain-google-genai", + "python-dotenv>=1.0.1", + "langgraph-sdk>=0.1.57", + "langgraph-cli", + "langgraph-api", + "fastapi", + "google-genai", +] + + +[project.optional-dependencies] +dev = ["mypy>=1.11.1", "ruff>=0.6.1"] + +[build-system] +requires = ["setuptools>=73.0.0", "wheel"] +build-backend = "setuptools.build_meta" + +[tool.ruff] +lint.select = [ + "E", # pycodestyle + "F", # pyflakes + "I", # isort + "D", # pydocstyle + "D401", # First line should be in imperative mood + "T201", + "UP", +] +lint.ignore = [ + "UP006", + "UP007", + # We actually do want to import from typing_extensions + "UP035", + # Relax the convention by _not_ requiring documentation for every function parameter. + "D417", + "E501", +] +[tool.ruff.lint.per-file-ignores] +"tests/*" = ["D", "UP"] +[tool.ruff.lint.pydocstyle] +convention = "google" + +[dependency-groups] +dev = [ + "langgraph-cli[inmem]>=0.1.71", + "pytest>=8.3.5", +] diff --git a/backend/src/agent/__init__.py b/backend/src/agent/__init__.py new file mode 100644 index 0000000..659e7ee --- /dev/null +++ b/backend/src/agent/__init__.py @@ -0,0 +1,3 @@ +from agent.graph import graph + +__all__ = ["graph"] diff --git a/backend/src/agent/app.py b/backend/src/agent/app.py new file mode 100644 index 0000000..090e2ed --- /dev/null +++ b/backend/src/agent/app.py @@ -0,0 +1,61 @@ +# mypy: disable - error - code = "no-untyped-def,misc" +import pathlib +from fastapi import FastAPI, Request, Response +from fastapi.staticfiles import StaticFiles +import fastapi.exceptions + +# Define the FastAPI app +app = FastAPI() + + +def create_frontend_router(build_dir="../frontend/dist"): + """Creates a router to serve the React frontend. + + Args: + build_dir: Path to the React build directory relative to this file. + + Returns: + A Starlette application serving the frontend. + """ + build_path = pathlib.Path(__file__).parent.parent.parent / build_dir + static_files_path = build_path / "assets" # Vite uses 'assets' subdir + + if not build_path.is_dir() or not (build_path / "index.html").is_file(): + print( + f"WARN: Frontend build directory not found or incomplete at {build_path}. Serving frontend will likely fail." + ) + # Return a dummy router if build isn't ready + from starlette.routing import Route + + async def dummy_frontend(request): + return Response( + "Frontend not built. Run 'npm run build' in the frontend directory.", + media_type="text/plain", + status_code=503, + ) + + return Route("/{path:path}", endpoint=dummy_frontend) + + build_dir = pathlib.Path(build_dir) + + react = FastAPI(openapi_url="") + react.mount( + "/assets", StaticFiles(directory=static_files_path), name="static_assets" + ) + + @react.get("/{path:path}") + async def handle_catch_all(request: Request, path: str): + fp = build_path / path + if not fp.exists() or not fp.is_file(): + fp = build_path / "index.html" + return fastapi.responses.FileResponse(fp) + + return react + + +# Mount the frontend under /app to not conflict with the LangGraph API routes +app.mount( + "/app", + create_frontend_router(), + name="frontend", +) diff --git a/backend/src/agent/configuration.py b/backend/src/agent/configuration.py new file mode 100644 index 0000000..6256dee --- /dev/null +++ b/backend/src/agent/configuration.py @@ -0,0 +1,60 @@ +import os +from pydantic import BaseModel, Field +from typing import Any, Optional + +from langchain_core.runnables import RunnableConfig + + +class Configuration(BaseModel): + """The configuration for the agent.""" + + query_generator_model: str = Field( + default="gemini-2.0-flash", + metadata={ + "description": "The name of the language model to use for the agent's query generation." + }, + ) + + reflection_model: str = Field( + default="gemini-2.5-flash-preview-04-17", + metadata={ + "description": "The name of the language model to use for the agent's reflection." + }, + ) + + answer_model: str = Field( + default="gemini-2.5-pro-preview-05-06", + metadata={ + "description": "The name of the language model to use for the agent's answer." + }, + ) + + number_of_initial_queries: int = Field( + default=3, + metadata={"description": "The number of initial search queries to generate."}, + ) + + max_research_loops: int = Field( + default=2, + metadata={"description": "The maximum number of research loops to perform."}, + ) + + @classmethod + def from_runnable_config( + cls, config: Optional[RunnableConfig] = None + ) -> "Configuration": + """Create a Configuration instance from a RunnableConfig.""" + configurable = ( + config["configurable"] if config and "configurable" in config else {} + ) + + # Get raw values from environment or config + raw_values: dict[str, Any] = { + name: os.environ.get(name.upper(), configurable.get(name)) + for name in cls.model_fields.keys() + } + + # Filter out None values + values = {k: v for k, v in raw_values.items() if v is not None} + + return cls(**values) diff --git a/backend/src/agent/graph.py b/backend/src/agent/graph.py new file mode 100644 index 0000000..dae64b7 --- /dev/null +++ b/backend/src/agent/graph.py @@ -0,0 +1,293 @@ +import os + +from agent.tools_and_schemas import SearchQueryList, Reflection +from dotenv import load_dotenv +from langchain_core.messages import AIMessage +from langgraph.types import Send +from langgraph.graph import StateGraph +from langgraph.graph import START, END +from langchain_core.runnables import RunnableConfig +from google.genai import Client + +from agent.state import ( + OverallState, + QueryGenerationState, + ReflectionState, + WebSearchState, +) +from agent.configuration import Configuration +from agent.prompts import ( + get_current_date, + query_writer_instructions, + web_searcher_instructions, + reflection_instructions, + answer_instructions, +) +from langchain_google_genai import ChatGoogleGenerativeAI +from agent.utils import ( + get_citations, + get_research_topic, + insert_citation_markers, + resolve_urls, +) + +load_dotenv() + +if os.getenv("GEMINI_API_KEY") is None: + raise ValueError("GEMINI_API_KEY is not set") + +# Used for Google Search API +genai_client = Client(api_key=os.getenv("GEMINI_API_KEY")) + + +# Nodes +def generate_query(state: OverallState, config: RunnableConfig) -> QueryGenerationState: + """LangGraph node that generates a search queries based on the User's question. + + Uses Gemini 2.0 Flash to create an optimized search query for web research based on + the User's question. + + Args: + state: Current graph state containing the User's question + config: Configuration for the runnable, including LLM provider settings + + Returns: + Dictionary with state update, including search_query key containing the generated query + """ + configurable = Configuration.from_runnable_config(config) + + # check for custom initial search query count + if state.get("initial_search_query_count") is None: + state["initial_search_query_count"] = configurable.number_of_initial_queries + + # init Gemini 2.0 Flash + llm = ChatGoogleGenerativeAI( + model=configurable.query_generator_model, + temperature=1.0, + max_retries=2, + api_key=os.getenv("GEMINI_API_KEY"), + ) + structured_llm = llm.with_structured_output(SearchQueryList) + + # Format the prompt + current_date = get_current_date() + formatted_prompt = query_writer_instructions.format( + current_date=current_date, + research_topic=get_research_topic(state["messages"]), + number_queries=state["initial_search_query_count"], + ) + # Generate the search queries + result = structured_llm.invoke(formatted_prompt) + return {"query_list": result.query} + + +def continue_to_web_research(state: QueryGenerationState): + """LangGraph node that sends the search queries to the web research node. + + This is used to spawn n number of web research nodes, one for each search query. + """ + return [ + Send("web_research", {"search_query": search_query, "id": int(idx)}) + for idx, search_query in enumerate(state["query_list"]) + ] + + +def web_research(state: WebSearchState, config: RunnableConfig) -> OverallState: + """LangGraph node that performs web research using the native Google Search API tool. + + Executes a web search using the native Google Search API tool in combination with Gemini 2.0 Flash. + + Args: + state: Current graph state containing the search query and research loop count + config: Configuration for the runnable, including search API settings + + Returns: + Dictionary with state update, including sources_gathered, research_loop_count, and web_research_results + """ + # Configure + configurable = Configuration.from_runnable_config(config) + formatted_prompt = web_searcher_instructions.format( + current_date=get_current_date(), + research_topic=state["search_query"], + ) + + # Uses the google genai client as the langchain client doesn't return grounding metadata + response = genai_client.models.generate_content( + model=configurable.query_generator_model, + contents=formatted_prompt, + config={ + "tools": [{"google_search": {}}], + "temperature": 0, + }, + ) + # resolve the urls to short urls for saving tokens and time + resolved_urls = resolve_urls( + response.candidates[0].grounding_metadata.grounding_chunks, state["id"] + ) + # Gets the citations and adds them to the generated text + citations = get_citations(response, resolved_urls) + modified_text = insert_citation_markers(response.text, citations) + sources_gathered = [item for citation in citations for item in citation["segments"]] + + return { + "sources_gathered": sources_gathered, + "search_query": [state["search_query"]], + "web_research_result": [modified_text], + } + + +def reflection(state: OverallState, config: RunnableConfig) -> ReflectionState: + """LangGraph node that identifies knowledge gaps and generates potential follow-up queries. + + Analyzes the current summary to identify areas for further research and generates + potential follow-up queries. Uses structured output to extract + the follow-up query in JSON format. + + Args: + state: Current graph state containing the running summary and research topic + config: Configuration for the runnable, including LLM provider settings + + Returns: + Dictionary with state update, including search_query key containing the generated follow-up query + """ + configurable = Configuration.from_runnable_config(config) + # Increment the research loop count and get the reasoning model + state["research_loop_count"] = state.get("research_loop_count", 0) + 1 + reasoning_model = state.get("reasoning_model") or configurable.reasoning_model + + # Format the prompt + current_date = get_current_date() + formatted_prompt = reflection_instructions.format( + current_date=current_date, + research_topic=get_research_topic(state["messages"]), + summaries="\n\n---\n\n".join(state["web_research_result"]), + ) + # init Reasoning Model + llm = ChatGoogleGenerativeAI( + model=reasoning_model, + temperature=1.0, + max_retries=2, + api_key=os.getenv("GEMINI_API_KEY"), + ) + result = llm.with_structured_output(Reflection).invoke(formatted_prompt) + + return { + "is_sufficient": result.is_sufficient, + "knowledge_gap": result.knowledge_gap, + "follow_up_queries": result.follow_up_queries, + "research_loop_count": state["research_loop_count"], + "number_of_ran_queries": len(state["search_query"]), + } + + +def evaluate_research( + state: ReflectionState, + config: RunnableConfig, +) -> OverallState: + """LangGraph routing function that determines the next step in the research flow. + + Controls the research loop by deciding whether to continue gathering information + or to finalize the summary based on the configured maximum number of research loops. + + Args: + state: Current graph state containing the research loop count + config: Configuration for the runnable, including max_research_loops setting + + Returns: + String literal indicating the next node to visit ("web_research" or "finalize_summary") + """ + configurable = Configuration.from_runnable_config(config) + max_research_loops = ( + state.get("max_research_loops") + if state.get("max_research_loops") is not None + else configurable.max_research_loops + ) + if state["is_sufficient"] or state["research_loop_count"] >= max_research_loops: + return "finalize_answer" + else: + return [ + Send( + "web_research", + { + "search_query": follow_up_query, + "id": state["number_of_ran_queries"] + int(idx), + }, + ) + for idx, follow_up_query in enumerate(state["follow_up_queries"]) + ] + + +def finalize_answer(state: OverallState, config: RunnableConfig): + """LangGraph node that finalizes the research summary. + + Prepares the final output by deduplicating and formatting sources, then + combining them with the running summary to create a well-structured + research report with proper citations. + + Args: + state: Current graph state containing the running summary and sources gathered + + Returns: + Dictionary with state update, including running_summary key containing the formatted final summary with sources + """ + configurable = Configuration.from_runnable_config(config) + reasoning_model = state.get("reasoning_model") or configurable.reasoning_model + + # Format the prompt + current_date = get_current_date() + formatted_prompt = answer_instructions.format( + current_date=current_date, + research_topic=get_research_topic(state["messages"]), + summaries="\n---\n\n".join(state["web_research_result"]), + ) + + # init Reasoning Model, default to Gemini 2.5 Flash + llm = ChatGoogleGenerativeAI( + model=reasoning_model, + temperature=0, + max_retries=2, + api_key=os.getenv("GEMINI_API_KEY"), + ) + result = llm.invoke(formatted_prompt) + + # Replace the short urls with the original urls and add all used urls to the sources_gathered + unique_sources = [] + for source in state["sources_gathered"]: + if source["short_url"] in result.content: + result.content = result.content.replace( + source["short_url"], source["value"] + ) + unique_sources.append(source) + + return { + "messages": [AIMessage(content=result.content)], + "sources_gathered": unique_sources, + } + + +# Create our Agent Graph +builder = StateGraph(OverallState, config_schema=Configuration) + +# Define the nodes we will cycle between +builder.add_node("generate_query", generate_query) +builder.add_node("web_research", web_research) +builder.add_node("reflection", reflection) +builder.add_node("finalize_answer", finalize_answer) + +# Set the entrypoint as `generate_query` +# This means that this node is the first one called +builder.add_edge(START, "generate_query") +# Add conditional edge to continue with search queries in a parallel branch +builder.add_conditional_edges( + "generate_query", continue_to_web_research, ["web_research"] +) +# Reflect on the web research +builder.add_edge("web_research", "reflection") +# Evaluate the research +builder.add_conditional_edges( + "reflection", evaluate_research, ["web_research", "finalize_answer"] +) +# Finalize the answer +builder.add_edge("finalize_answer", END) + +graph = builder.compile(name="pro-search-agent") diff --git a/backend/src/agent/prompts.py b/backend/src/agent/prompts.py new file mode 100644 index 0000000..635eaf9 --- /dev/null +++ b/backend/src/agent/prompts.py @@ -0,0 +1,96 @@ +from datetime import datetime + + +# Get current date in a readable format +def get_current_date(): + return datetime.now().strftime("%B %d, %Y") + + +query_writer_instructions = """Your goal is to generate sophisticated and diverse web search queries. These queries are intended for an advanced automated web research tool capable of analyzing complex results, following links, and synthesizing information. + +Instructions: +- Always prefer a single search query, only add another query if the original question requests multiple aspects or elements and one query is not enough. +- Each query should focus on one specific aspect of the original question. +- Don't produce more than {number_queries} queries. +- Queries should be diverse, if the topic is broad, generate more than 1 query. +- Don't generate multiple similar queries, 1 is enough. +- Query should ensure that the most current information is gathered. The current date is {current_date}. + +Format: +- Format your response as a JSON object with ALL three of these exact keys: + - "rationale": Brief explanation of why these queries are relevant + - "query": A list of search queries + +Example: + +Topic: What revenue grew more last year apple stock or the number of people buying an iphone +```json +{{ + "rationale": "To answer this comparative growth question accurately, we need specific data points on Apple's stock performance and iPhone sales metrics. These queries target the precise financial information needed: company revenue trends, product-specific unit sales figures, and stock price movement over the same fiscal period for direct comparison.", + "query": ["Apple total revenue growth fiscal year 2024", "iPhone unit sales growth fiscal year 2024", "Apple stock price growth fiscal year 2024"], +}} +``` + +Context: {research_topic}""" + + +web_searcher_instructions = """Conduct targeted Google Searches to gather the most recent, credible information on "{research_topic}" and synthesize it into a verifiable text artifact. + +Instructions: +- Query should ensure that the most current information is gathered. The current date is {current_date}. +- Conduct multiple, diverse searches to gather comprehensive information. +- Consolidate key findings while meticulously tracking the source(s) for each specific piece of information. +- The output should be a well-written summary or report based on your search findings. +- Only include the information found in the search results, don't make up any information. + +Research Topic: +{research_topic} +""" + +reflection_instructions = """You are an expert research assistant analyzing summaries about "{research_topic}". + +Instructions: +- Identify knowledge gaps or areas that need deeper exploration and generate a follow-up query. (1 or multiple). +- If provided summaries are sufficient to answer the user's question, don't generate a follow-up query. +- If there is a knowledge gap, generate a follow-up query that would help expand your understanding. +- Focus on technical details, implementation specifics, or emerging trends that weren't fully covered. + +Requirements: +- Ensure the follow-up query is self-contained and includes necessary context for web search. + +Output Format: +- Format your response as a JSON object with these exact keys: + - "is_sufficient": true or false + - "knowledge_gap": Describe what information is missing or needs clarification + - "follow_up_queries": Write a specific question to address this gap + +Example: +```json +{{ + "is_sufficient": true, // or false + "knowledge_gap": "The summary lacks information about performance metrics and benchmarks", // "" if is_sufficient is true + "follow_up_queries": ["What are typical performance benchmarks and metrics used to evaluate [specific technology]?"] // [] if is_sufficient is true +}} +``` + +Reflect carefully on the Summaries to identify knowledge gaps and produce a follow-up query. Then, produce your output following this JSON format: + +Summaries: +{summaries} +""" + +answer_instructions = """Generate a high-quality answer to the user's question based on the provided summaries. + +Instructions: +- The current date is {current_date}. +- You are the finaly step of a multi-step research process, don't mention that you are the final step. +- You have access to all the information gathered from the previous steps. +- You have access to the user's question. +- Generate a high-quality answer to the user's question based on the provided summaries and the user's question. +- you MUST include all the citations from the summaries in the answer correctly. + +User Context: +- {research_topic} + +Summaries: +{summaries}""" diff --git a/backend/src/agent/state.py b/backend/src/agent/state.py new file mode 100644 index 0000000..5a45fb4 --- /dev/null +++ b/backend/src/agent/state.py @@ -0,0 +1,50 @@ +from __future__ import annotations + +from dataclasses import dataclass, field +from typing import TypedDict + +from langgraph.graph import add_messages +from typing_extensions import Annotated + + +import operator +from dataclasses import dataclass, field +from typing_extensions import Annotated + + +class OverallState(TypedDict): + messages: Annotated[list, add_messages] + search_query: Annotated[list, operator.add] + web_research_result: Annotated[list, operator.add] + sources_gathered: Annotated[list, operator.add] + initial_search_query_count: int + max_research_loops: int + research_loop_count: int + reasoning_model: str + + +class ReflectionState(TypedDict): + is_sufficient: bool + knowledge_gap: str + follow_up_queries: Annotated[list, operator.add] + research_loop_count: int + number_of_ran_queries: int + + +class Query(TypedDict): + query: str + rationale: str + + +class QueryGenerationState(TypedDict): + query_list: list[Query] + + +class WebSearchState(TypedDict): + search_query: str + id: str + + +@dataclass(kw_only=True) +class SearchStateOutput: + running_summary: str = field(default=None) # Final report diff --git a/backend/src/agent/tools_and_schemas.py b/backend/src/agent/tools_and_schemas.py new file mode 100644 index 0000000..5e683c3 --- /dev/null +++ b/backend/src/agent/tools_and_schemas.py @@ -0,0 +1,23 @@ +from typing import List +from pydantic import BaseModel, Field + + +class SearchQueryList(BaseModel): + query: List[str] = Field( + description="A list of search queries to be used for web research." + ) + rationale: str = Field( + description="A brief explanation of why these queries are relevant to the research topic." + ) + + +class Reflection(BaseModel): + is_sufficient: bool = Field( + description="Whether the provided summaries are sufficient to answer the user's question." + ) + knowledge_gap: str = Field( + description="A description of what information is missing or needs clarification." + ) + follow_up_queries: List[str] = Field( + description="A list of follow-up queries to address the knowledge gap." + ) diff --git a/backend/src/agent/utils.py b/backend/src/agent/utils.py new file mode 100644 index 0000000..d02c8d9 --- /dev/null +++ b/backend/src/agent/utils.py @@ -0,0 +1,166 @@ +from typing import Any, Dict, List +from langchain_core.messages import AnyMessage, AIMessage, HumanMessage + + +def get_research_topic(messages: List[AnyMessage]) -> str: + """ + Get the research topic from the messages. + """ + # check if request has a history and combine the messages into a single string + if len(messages) == 1: + research_topic = messages[-1].content + else: + research_topic = "" + for message in messages: + if isinstance(message, HumanMessage): + research_topic += f"User: {message.content}\n" + elif isinstance(message, AIMessage): + research_topic += f"Assistant: {message.content}\n" + return research_topic + + +def resolve_urls(urls_to_resolve: List[Any], id: int) -> Dict[str, str]: + """ + Create a map of the vertex ai search urls (very long) to a short url with a unique id for each url. + Ensures each original URL gets a consistent shortened form while maintaining uniqueness. + """ + prefix = f"https://vertexaisearch.cloud.google.com/id/" + urls = [site.web.uri for site in urls_to_resolve] + + # Create a dictionary that maps each unique URL to its first occurrence index + resolved_map = {} + for idx, url in enumerate(urls): + if url not in resolved_map: + resolved_map[url] = f"{prefix}{id}-{idx}" + + return resolved_map + + +def insert_citation_markers(text, citations_list): + """ + Inserts citation markers into a text string based on start and end indices. + + Args: + text (str): The original text string. + citations_list (list): A list of dictionaries, where each dictionary + contains 'start_index', 'end_index', and + 'segment_string' (the marker to insert). + Indices are assumed to be for the original text. + + Returns: + str: The text with citation markers inserted. + """ + # Sort citations by end_index in descending order. + # If end_index is the same, secondary sort by start_index descending. + # This ensures that insertions at the end of the string don't affect + # the indices of earlier parts of the string that still need to be processed. + sorted_citations = sorted( + citations_list, key=lambda c: (c["end_index"], c["start_index"]), reverse=True + ) + + modified_text = text + for citation_info in sorted_citations: + # These indices refer to positions in the *original* text, + # but since we iterate from the end, they remain valid for insertion + # relative to the parts of the string already processed. + end_idx = citation_info["end_index"] + marker_to_insert = "" + for segment in citation_info["segments"]: + marker_to_insert += f" [{segment['label']}]({segment['short_url']})" + # Insert the citation marker at the original end_idx position + modified_text = ( + modified_text[:end_idx] + marker_to_insert + modified_text[end_idx:] + ) + + return modified_text + + +def get_citations(response, resolved_urls_map): + """ + Extracts and formats citation information from a Gemini model's response. + + This function processes the grounding metadata provided in the response to + construct a list of citation objects. Each citation object includes the + start and end indices of the text segment it refers to, and a string + containing formatted markdown links to the supporting web chunks. + + Args: + response: The response object from the Gemini model, expected to have + a structure including `candidates[0].grounding_metadata`. + It also relies on a `resolved_map` being available in its + scope to map chunk URIs to resolved URLs. + + Returns: + list: A list of dictionaries, where each dictionary represents a citation + and has the following keys: + - "start_index" (int): The starting character index of the cited + segment in the original text. Defaults to 0 + if not specified. + - "end_index" (int): The character index immediately after the + end of the cited segment (exclusive). + - "segments" (list[str]): A list of individual markdown-formatted + links for each grounding chunk. + - "segment_string" (str): A concatenated string of all markdown- + formatted links for the citation. + Returns an empty list if no valid candidates or grounding supports + are found, or if essential data is missing. + """ + citations = [] + + # Ensure response and necessary nested structures are present + if not response or not response.candidates: + return citations + + candidate = response.candidates[0] + if ( + not hasattr(candidate, "grounding_metadata") + or not candidate.grounding_metadata + or not hasattr(candidate.grounding_metadata, "grounding_supports") + ): + return citations + + for support in candidate.grounding_metadata.grounding_supports: + citation = {} + + # Ensure segment information is present + if not hasattr(support, "segment") or support.segment is None: + continue # Skip this support if segment info is missing + + start_index = ( + support.segment.start_index + if support.segment.start_index is not None + else 0 + ) + + # Ensure end_index is present to form a valid segment + if support.segment.end_index is None: + continue # Skip if end_index is missing, as it's crucial + + # Add 1 to end_index to make it an exclusive end for slicing/range purposes + # (assuming the API provides an inclusive end_index) + citation["start_index"] = start_index + citation["end_index"] = support.segment.end_index + + citation["segments"] = [] + if ( + hasattr(support, "grounding_chunk_indices") + and support.grounding_chunk_indices + ): + for ind in support.grounding_chunk_indices: + try: + chunk = candidate.grounding_metadata.grounding_chunks[ind] + resolved_url = resolved_urls_map.get(chunk.web.uri, None) + citation["segments"].append( + { + "label": chunk.web.title.split(".")[:-1][0], + "short_url": resolved_url, + "value": chunk.web.uri, + } + ) + except (IndexError, AttributeError, NameError): + # Handle cases where chunk, web, uri, or resolved_map might be problematic + # For simplicity, we'll just skip adding this particular segment link + # In a production system, you might want to log this. + pass + citations.append(citation) + return citations diff --git a/backend/test-agent.ipynb b/backend/test-agent.ipynb new file mode 100644 index 0000000..d100b7f --- /dev/null +++ b/backend/test-agent.ipynb @@ -0,0 +1,530 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from agent import graph\n", + "\n", + "state = graph.invoke({\"messages\": [{\"role\": \"user\", \"content\": \"Who won the euro 2024\"}], \"max_research_loops\": 3, \"initial_search_query_count\": 3})" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'messages': [HumanMessage(content='Who won the euro 2024', additional_kwargs={}, response_metadata={}, id='4b0ccc12-2e74-4a55-a85e-c512e7867c26'),\n", + " AIMessage(content=\"Spain won the UEFA Euro 2024 tournament [youtube](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGFcidniPKtBR-_QjSR1P1Oathq_0T9FTwfpCAWZxbXsroItHQU8zRcyOPDgMcvsWoD2fEnwYFKwanV18ep2_cyS5BlHF6-OFNsijWb-peAgsgLAVRiubekRnzMugsYtiWrhZyO3Q==) [aljazeera](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEk7ApC7Y41UOrTWJ40wP2rsT0VDxqhqF-WJEI-FNKW7SNpR7LoA22sRQecS8hZNeZ_-62Vh7X75RmcmZUtnAOuQunrLAsETkkSx5l75dt9ESgTRkIURwtu4Pew7hn8yFz_LY_FJXUpmRfoWP7MWrDfPHcKrOpfmKqONj6mJcASNvAfCZ0p6qK3K4PvKWye6NyBMyYxWCuJig==) [foxsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHh_4hBL0Giyuw_cyfT8m7tUSnMqBqH4Lis1CtJICPJNGGLhT6PADTIoUtrj3Rl5qcKNE9T6rzOmedAER_gxJOBDrCF8pnr9lUvhYvmDJxYCJzELkE5rTap4dx6FzOIKZKm1QBp5aHXzd_LCkSTV9ag7Q1A6_t8Vjdbskch6ZG3BoIfjYDQSPgRKDNFAAwt5J07cVFV5pDQzggmM7pxwsUz4drz) [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGd9ZQky3X7RQLbTs6mY1i4Pg7ppcI5H_vtxpvQPiEyD8Qw0f7hjvn3QeoOeAVcCG_pEt5Aeu8ofWCgjwQy4_u6qU-NOOJsYPWOW94XcvtkmKiv46vbNkJF-Mb4OpvBztrDa28BfIdCGHdfF9o=) [youtube](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGZc-qDhRx_v3mPelXEfAVmWCpNTa_rzUKundc0pRc7PlTgppymao-_wO7O1oPaAhJYLcZkazIg8T5jA6t9OGgOxUd_Vl88BjouHsot0OK8TlM5hmPf4ECMWGeJthqVwndE3h4wdQ==) [uefa](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXG1Lj9FnmuckfU0k1NC_ThQBZVxFCppp4tPl4FCcM3JZGF9aPvn9ZNFUo0fLfqw4Adt63Cdv8thcFSbsBRcf3rj1sz4LALJvrGfh6OayGo0KJ-UEKmKoOz8cxj5nIILCzKjFh2_0ZgTwrf1pkhhYbnWqj2E8hrVN4S5_sxvlCpLXPxjTsE4R0gYKXH_utqqm1NBkpl3p-C9v6kz-zm6V-JJoePAppIXFICF0DMYjOIBA9Mj0z4yO9Y9Tdgx2oaP) [aljazeera](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFY5CRvcfjdkBz3h8Md_PscguyZ7LtYrxeHHP3eagcmIOnjaMyZbOHFqUAsa2cgkwvb26FZTvGiRgLKNLfiAsH1oP-5kGwnL6Ejhm4ZXhWGg0R3yE_8zkIKde4RgjIXlBvQW4kZ-LI5yhag-ESoh771z6hob8AigAVXT7WeWABMlQNfcbyG_UZIkqAs18U5e6to44ruNbSyDIyd5gobsVpEmdU256oVxa9d7co=) [coachesvoice](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHxgpkZWF64tZ8-iypkI2fiFi2cpsj4AFjZXkcYUzf5hSOWYb5etIbCoZd_L6zDJi6mWWisxAO6T5V4T8H7XiRow6dmVqXpSEIKhPSdG0HAQbQK74lwxeV_uXx9fSPllIKPOs2tFNRqTuHdJBNcwpcJp6MJbVLEskyhYnWlyOd9ouQv) [aljazeera](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEV-g6Hxxcan5Xre1yYGM3BtP3fo9uF2zHQ9sVeK_4poD-aBN5CRvhz471beYCC26wdrjhtbiCvDT9dAnPI-ruyqJZhwB3vbKS5HCFb9tPn7Dkj99LpjLXqYyuzbFGsHCbr5SCHoMEhNg--dMU7xB5TiH8HeqKH8B4lk_h00dqhEVQFb05w5TuLtbX1UdXN6NDzHlFN_xyXzOU=) [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFNtaBQTFVnSbEW5Bbo8LUIs0h5cv4Pc4aS6Q8qG7jIMCsJPKy5_o6R8x7Z_xQ7AuDEAFlj2JY_AVV1YpwLqtXZxiAyvpfboH_VuMpo6MVbQAu2ZASSSD2slWaIqsUGkTEaPa2z2809z7UhEWUL).\\n\\nIn the final match held in Berlin, Germany, Spain defeated England 2-1 [olympics](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFARil0pwjYQuFrDObawlDzu-eVtUPC4_nINjcXT-mlTL3MDgVPI83UB8gWS1rzGZkaMEmAUIeAzo2ihpMXUsWibzVzeAdQ7nUyqAOq0En87kpfuISduBuWI3__7yJw-vmdApD56-_G2ZhhZC4d_ll2iyNBaZHxxdNqXbb76mUiq99xV0hdoPEkp9RLk7T-uYYfTYXa8oYCXy2ysa9SZDa9hffEHrVe) [aljazeera](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEk7ApC7Y41UOrTWJ40wP2rsT0VDxqhqF-WJEI-FNKW7SNpR7LoA22sRQecS8hZNeZ_-62Vh7X75RmcmZUtnAOuQunrLAsETkkSx5l75dt9ESgTRkIURwtu4Pew7hn8yFz_LY_FJXUpmRfoWP7MWrDfPHcKrOpfmKqONj6mJcASNvAfCZ0p6qK3K4PvKWye6NyBMyYxWCuJig==) [foxsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHh_4hBL0Giyuw_cyfT8m7tUSnMqBqH4Lis1CtJICPJNGGLhT6PADTIoUtrj3Rl5qcKNE9T6rzOmedAER_gxJOBDrCF8pnr9lUvhYvmDJxYCJzELkE5rTap4dx6FzOIKZKm1QBp5aHXzd_LCkSTV9ag7Q1A6_t8Vjdbskch6ZG3BoIfjYDQSPgRKDNFAAwt5J07cVFV5pDQzggmM7pxwsUz4drz) [aljazeera](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFY5CRvcfjdkBz3h8Md_PscguyZ7LtYrxeHHP3eagcmIOnjaMyZbOHFqUAsa2cgkwvb26FZTvGiRgLKNLfiAsH1oP-5kGwnL6Ejhm4ZXhWGg0R3yE_8zkIKde4RgjIXlBvQW4kZ-LI5yhag-ESoh771z6hob8AigAVXT7WeWABMlQNfcbyG_UZIkqAs18U5e6to44ruNbSyDIyd5gobsVpEmdU256oVxa9d7co=) [coachesvoice](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHxgpkZWF64tZ8-iypkI2fiFi2cpsj4AFjZXkcYUzf5hSOWYb5etIbCoZd_L6zDJi6mWWisxAO6T5V4T8H7XiRow6dmVqXpSEIKhPSdG0HAQbQK74lwxeV_uXx9fSPllIKPOs2tFNRqTuHdJBNcwpcJp6MJbVLEskyhYnWlyOd9ouQv) [aljazeera](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEV-g6Hxxcan5Xre1yYGM3BtP3fo9uF2zHQ9sVeK_4poD-aBN5CRvhz471beYCC26wdrjhtbiCvDT9dAnPI-ruyqJZhwB3vbKS5HCFb9tPn7Dkj99LpjLXqYyuzbFGsHCbr5SCHoMEhNg--dMU7xB5TiH8HeqKH8B4lk_h00dqhEVQFb05w5TuLtbX1UdXN6NDzHlFN_xyXzOU=) [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFNtaBQTFVnSbEW5Bbo8LUIs0h5cv4Pc4aS6Q8qG7jIMCsJPKy5_o6R8x7Z_xQ7AuDEAFlj2JY_AVV1YpwLqtXZxiAyvpfboH_VuMpo6MVbQAu2ZASSSD2slWaIqsUGkTEaPa2z2809z7UhEWUL). Nico Williams scored the opening goal for Spain, and Mikel Oyarzabal scored the winning goal [youtube](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGFcidniPKtBR-_QjSR1P1Oathq_0T9FTwfpCAWZxbXsroItHQU8zRcyOPDgMcvsWoD2fEnwYFKwanV18ep2_cyS5BlHF6-OFNsijWb-peAgsgLAVRiubekRnzMugsYtiWrhZyO3Q==) [aljazeera](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEk7ApC7Y41UOrTWJ40wP2rsT0VDxqhqF-WJEI-FNKW7SNpR7LoA22sRQecS8hZNeZ_-62Vh7X75RmcmZUtnAOuQunrLAsETkkSx5l75dt9ESgTRkIURwtu4Pew7hn8yFz_LY_FJXUpmRfoWP7MWrDfPHcKrOpfmKqONj6mJcASNvAfCZ0p6qK3K4PvKWye6NyBMyYxWCuJig==) [foxsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHh_4hBL0Giyuw_cyfT8m7tUSnMqBqH4Lis1CtJICPJNGGLhT6PADTIoUtrj3Rl5qcKNE9T6rzOmedAER_gxJOBDrCF8pnr9lUvhYvmDJxYCJzELkE5rTap4dx6FzOIKZKm1QBp5aHXzd_LCkSTV9ag7Q1A6_t8Vjdbskch6ZG3BoIfjYDQSPgRKDNFAAwt5J07cVFV5pDQzggmM7pxwsUz4drz). Cole Palmer scored England's only goal [olympics](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFARil0pwjYQuFrDObawlDzu-eVtUPC4_nINjcXT-mlTL3MDgVPI83UB8gWS1rzGZkaMEmAUIeAzo2ihpMXUsWibzVzeAdQ7nUyqAOq0En87kpfuISduBuWI3__7yJw-vmdApD56-_G2ZhhZC4d_ll2iyNBaZHxxdNqXbb76mUiq99xV0hdoPEkp9RLk7T-uYYfTYXa8oYCXy2ysa9SZDa9hffEHrVe) [aljazeera](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEk7ApC7Y41UOrTWJ40wP2rsT0VDxqhqF-WJEI-FNKW7SNpR7LoA22sRQecS8hZNeZ_-62Vh7X75RmcmZUtnAOuQunrLAsETkkSx5l75dt9ESgTRkIURwtu4Pew7hn8yFz_LY_FJXUpmRfoWP7MWrDfPHcKrOpfmKqONj6mJcASNvAfCZ0p6qK3K4PvKWye6NyBMyYxWCuJig==) [foxsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHh_4hBL0Giyuw_cyfT8m7tUSnMqBqH4Lis1CtJICPJNGGLhT6PADTIoUtrj3Rl5qcKNE9T6rzOmedAER_gxJOBDrCF8pnr9lUvhYvmDJxYCJzELkE5rTap4dx6FzOIKZKm1QBp5aHXzd_LCkSTV9ag7Q1A6_t8Vjdbskch6ZG3BoIfjYDQSPgRKDNFAAwt5J07cVFV5pDQzggmM7pxwsUz4drz).\\n\\nThis victory marked Spain's record fourth European Championship title [youtube](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGFcidniPKtBR-_QjSR1P1Oathq_0T9FTwfpCAWZxbXsroItHQU8zRcyOPDgMcvsWoD2fEnwYFKwanV18ep2_cyS5BlHF6-OFNsijWb-peAgsgLAVRiubekRnzMugsYtiWrhZyO3Q==) [aljazeera](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEk7ApC7Y41UOrTWJ40wP2rsT0VDxqhqF-WJEI-FNKW7SNpR7LoA22sRQecS8hZNeZ_-62Vh7X75RmcmZUtnAOuQunrLAsETkkSx5l75dt9ESgTRkIURwtu4Pew7hn8yFz_LY_FJXUpmRfoWP7MWrDfPHcKrOpfmKqONj6mJcASNvAfCZ0p6qK3K4PvKWye6NyBMyYxWCuJig==) [foxsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHh_4hBL0Giyuw_cyfT8m7tUSnMqBqH4Lis1CtJICPJNGGLhT6PADTIoUtrj3Rl5qcKNE9T6rzOmedAER_gxJOBDrCF8pnr9lUvhYvmDJxYCJzELkE5rTap4dx6FzOIKZKm1QBp5aHXzd_LCkSTV9ag7Q1A6_t8Vjdbskch6ZG3BoIfjYDQSPgRKDNFAAwt5J07cVFV5pDQzggmM7pxwsUz4drz) [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGd9ZQky3X7RQLbTs6mY1i4Pg7ppcI5H_vtxpvQPiEyD8Qw0f7hjvn3QeoOeAVcCG_pEt5Aeu8ofWCgjwQy4_u6qU-NOOJsYPWOW94XcvtkmKiv46vbNkJF-Mb4OpvBztrDa28BfIdCGHdfF9o=) [youtube](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGZc-qDhRx_v3mPelXEfAVmWCpNTa_rzUKundc0pRc7PlTgppymao-_wO7O1oPaAhJYLcZkazIg8T5jA6t9OGgOxUd_Vl88BjouHsot0OK8TlM5hmPf4ECMWGeJthqVwndE3h4wdQ==) [uefa](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXG1Lj9FnmuckfU0k1NC_ThQBZVxFCppp4tPl4FCcM3JZGF9aPvn9ZNFUo0fLfqw4Adt63Cdv8thcFSbsBRcf3rj1sz4LALJvrGfh6OayGo0KJ-UEKmKoOz8cxj5nIILCzKjFh2_0ZgTwrf1pkhhYbnWqj2E8hrVN4S5_sxvlCpLXPxjTsE4R0gYKXH_utqqm1NBkpl3p-C9v6kz-zm6V-JJoePAppIXFICF0DMYjOIBA9Mj0z4yO9Y9Tdgx2oaP) [aljazeera](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFY5CRvcfjdkBz3h8Md_PscguyZ7LtYrxeHHP3eagcmIOnjaMyZbOHFqUAsa2cgkwvb26FZTvGiRgLKNLfiAsH1oP-5kGwnL6Ejhm4ZXhWGg0R3yE_8zkIKde4RgjIXlBvQW4kZ-LI5yhag-ESoh771z6hob8AigAVXT7WeWABMlQNfcbyG_UZIkqAs18U5e6to44ruNbSyDIyd5gobsVpEmdU256oVxa9d7co=) [coachesvoice](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHxgpkZWF64tZ8-iypkI2fiFi2cpsj4AFjZXkcYUzf5hSOWYb5etIbCoZd_L6zDJi6mWWisxAO6T5V4T8H7XiRow6dmVqXpSEIKhPSdG0HAQbQK74lwxeV_uXx9fSPllIKPOs2tFNRqTuHdJBNcwpcJp6MJbVLEskyhYnWlyOd9ouQv) [aljazeera](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEV-g6Hxxcan5Xre1yYGM3BtP3fo9uF2zHQ9sVeK_4poD-aBN5CRvhz471beYCC26wdrjhtbiCvDT9dAnPI-ruyqJZhwB3vbKS5HCFb9tPn7Dkj99LpjLXqYyuzbFGsHCbr5SCHoMEhNg--dMU7xB5TiH8HeqKH8B4lk_h00dqhEVQFb05w5TuLtbX1UdXN6NDzHlFN_xyXzOU=) [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFNtaBQTFVnSbEW5Bbo8LUIs0h5cv4Pc4aS6Q8qG7jIMCsJPKy5_o6R8x7Z_xQ7AuDEAFlj2JY_AVV1YpwLqtXZxiAyvpfboH_VuMpo6MVbQAu2ZASSSD2slWaIqsUGkTEaPa2z2809z7UhEWUL). Spain achieved this by winning all seven of their matches throughout the tournament [youtube](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFgwKo5lPes5M_GObnkYEzn3QYn1kpTQpx42ANaNqvNMgRsB1Xp2TIXI82SYTSYuLd9ysgKfmlJJy3lcLxrmNBg1R_Z37PCO9vbqIBIbw6DKqMif7pHdtDTS7FUq69c29hkYb_b5w==) [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGd9ZQky3X7RQLbTs6mY1i4Pg7ppcI5H_vtxpvQPiEyD8Qw0f7hjvn3QeoOeAVcCG_pEt5Aeu8ofWCgjwQy4_u6qU-NOOJsYPWOW94XcvtkmKiv46vbNkJF-Mb4OpvBztrDa28BfIdCGHdfF9o=) [youtube](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGZc-qDhRx_v3mPelXEfAVmWCpNTa_rzUKundc0pRc7PlTgppymao-_wO7O1oPaAhJYLcZkazIg8T5jA6t9OGgOxUd_Vl88BjouHsot0OK8TlM5hmPf4ECMWGeJthqVwndE3h4wdQ==) [uefa](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXG1Lj9FnmuckfU0k1NC_ThQBZVxFCppp4tPl4FCcM3JZGF9aPvn9ZNFUo0fLfqw4Adt63Cdv8thcFSbsBRcf3rj1sz4LALJvrGfh6OayGo0KJ-UEKmKoOz8cxj5nIILCzKjFh2_0ZgTwrf1pkhhYbnWqj2E8hrVN4S5_sxvlCpLXPxjTsE4R0gYKXH_utqqm1NBkpl3p-C9v6kz-zm6V-JJoePAppIXFICF0DMYjOIBA9Mj0z4yO9Y9Tdgx2oaP) [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFNtaBQTFVnSbEW5Bbo8LUIs0h5cv4Pc4aS6Q8qG7jIMCsJPKy5_o6R8x7Z_xQ7AuDEAFlj2JY_AVV1YpwLqtXZxiAyvpfboH_VuMpo6MVbQAu2ZASSSD2slWaIqsUGkTEaPa2z2809z7UhEWUL) [newsbytesapp](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFIl5Xc3f44I1nYw_YrJqkByrRl20SiAopZqjfJIK6U62o27CrxLvxaJ4v1M7L5eOfTMMlBCHHYCUooPoG0aObaeRG3YxrcoFT7Xtd4KIrvCS6AWWRpOZasCW-sGtFA56DEDf-qbJ8lsXEJ4GQ386iGTdRkyK9EtJWw1mRpDu7dfPQ6Qy1hNIqTgTdo-3yq1WNmWEl8Xtnag0s=).\\n\\nKey individual awards for the tournament went to Spain's players: Rodri was named the Best Player, and Lamine Yamal was named the Best Young Player [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEk7ApC7Y41UOrTWJ40wP2rsT0VDxqhqF-WJEI-FNKW7SNpR7LoA22sRQecS8hZNeZ_-62Vh7X75RmcmZUtnAOuQunrLAsETkkSx5l75dt9ESgTRkIURwtu4Pew7hn8yFz_LY_FJXUpmRfoWP7MWrDfPHcKrOpfmKqONj6mJcASNvAfCZ0p6qK3K4PvKWye6NyBMyYxWCuJig==0) [bet9ja](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFgj0MP_IEmC842xTfmMPnbybBGYTUb_wEpwJ58keX5x_qPfUmC7Zz0o6IQeQ8TEqoRpv-Uq6oOqfbazu_aP0fMhP7UrSln6rB4SRvCRC327tM1LNaXpiXN-h6xlg0TN_-AWQORV4PSH7G5u2qD_NaNEWkz_oaEHxj22-qOam52fwRvqISOdoFDNTptlM6t0BbhcA==) [uefa](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGKGygrv0aVjWa7JUdwqtuttcPxVIiVFb2_Mxv32q-4AyOVwd8oMKLXq6sl2kw4A37lHLmUUQYqVfDMkX3DLXr4or1Xpx1lnOpIUanPjOtrr2Hk6tPPc0308hdE0xJ5CClC220Tz30xD6538_DOvrVWqfA7pV7x651519Zz37wgqYhN00Ah3LX4QZnW981_-SM8tjVSLDXutPphZBXXmMehNgUynvNd2IiGB9UtkLyGeWINIqR2F7lejStuXJ8U2Q==) [beinsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXExRli0zGmQZlemPPItRH3qShabB-QVHrgUAECeXIs3GUKgd2oIHd45-ULY--TosnkRkiM-XHqZlPxeQlOV6Ktgxb-L5r9Hhf8M-nQS_T0N7NK0BeynreRZtFivuKzwwOByq6uALzoVtombjsREMmsPG7s07CMlMrQjyJCVX8McNdnGC7-mdlHEjdfXN4sgi-YGxdxCdAxaHUaMQxPL0GUUmqDzMMpzVC_lRnrYfuk17UhXI9QhsEi3TMeuUgHu3kl16g1mHA==) [thehindu](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEAlCtejIOwzHPUOAXi7oLu469wYzGUJN86oxtrB6YCAHKAocfkxog6XZeXOUjAl9MTY2_jU5igYEOpyy5RZV2jhxGHtahvQGi8Bq0XkJmaFvludGqwpuBn-vFf-MR3As1CXu9GZNh0TW5f3eLPgvDjB6N3IoYaGhGT8BUiqSyZS6k41T-vL9h6fEFMoOFUYhG2S0AfuVZDuyF2nJHJP1WVWZS42csWXEJUDxqhYjyzmx33HaCxKk0Rbe3_Ovc_Kgdagw==).\", additional_kwargs={}, response_metadata={}, id='4c4aa673-391d-48b2-954a-9fcb7053c634')],\n", + " 'search_query': ['Euro 2024 winner',\n", + " \"What were Spain's key team performance statistics throughout Euro 2024?\",\n", + " 'What specific stats or performances led to Rodri being named Euro 2024 Best Player?',\n", + " 'What specific stats or performances led to Lamine Yamal being named Euro 2024 Best Young Player?'],\n", + " 'web_research_result': [\"Spain won the UEFA Euro 2024, securing their record fourth title [youtube](https://vertexaisearch.cloud.google.com/id/0-0) [aljazeera](https://vertexaisearch.cloud.google.com/id/0-1) [foxsports](https://vertexaisearch.cloud.google.com/id/0-2) [wikipedia](https://vertexaisearch.cloud.google.com/id/0-3) [youtube](https://vertexaisearch.cloud.google.com/id/0-4) [uefa](https://vertexaisearch.cloud.google.com/id/0-5). The final match was held in Berlin, Germany, where Spain defeated England 2-1 [olympics](https://vertexaisearch.cloud.google.com/id/0-6) [aljazeera](https://vertexaisearch.cloud.google.com/id/0-1) [foxsports](https://vertexaisearch.cloud.google.com/id/0-2). Spain's Nico Williams scored the opening goal, and Mikel Oyarzabal scored the winning goal [youtube](https://vertexaisearch.cloud.google.com/id/0-0) [aljazeera](https://vertexaisearch.cloud.google.com/id/0-1) [foxsports](https://vertexaisearch.cloud.google.com/id/0-2). England's Cole Palmer scored their lone goal [olympics](https://vertexaisearch.cloud.google.com/id/0-6) [aljazeera](https://vertexaisearch.cloud.google.com/id/0-1) [foxsports](https://vertexaisearch.cloud.google.com/id/0-2).\\n\\nSpain won all seven of their matches in the tournament [youtube](https://vertexaisearch.cloud.google.com/id/0-7) [wikipedia](https://vertexaisearch.cloud.google.com/id/0-3) [youtube](https://vertexaisearch.cloud.google.com/id/0-4) [uefa](https://vertexaisearch.cloud.google.com/id/0-5). In the quarter-finals, Spain defeated Germany 2-1 after extra time [olympics](https://vertexaisearch.cloud.google.com/id/0-6) [wikipedia](https://vertexaisearch.cloud.google.com/id/0-3). In the semi-finals, Spain beat France 2-1 [olympics](https://vertexaisearch.cloud.google.com/id/0-6) [aljazeera](https://vertexaisearch.cloud.google.com/id/0-8) [wikipedia](https://vertexaisearch.cloud.google.com/id/0-3). Lamine Yamal became the youngest player to score in a UEFA European Championship [ndtv](https://vertexaisearch.cloud.google.com/id/0-9) [uefa](https://vertexaisearch.cloud.google.com/id/0-5).\\n\\nThe top scorers of the tournament were Harry Kane, Georges Mikautadze, Jamal Musiala, Cody Gakpo, Ivan Schranz and Dani Olmo, each with 3 goals [wikipedia](https://vertexaisearch.cloud.google.com/id/0-10). Rodri was named best player and Lamine Yamal best young player of the tournament [wikipedia](https://vertexaisearch.cloud.google.com/id/0-10). Luis de la Fuente was the coach who led Spain to victory [transfermarkt](https://vertexaisearch.cloud.google.com/id/0-11).\\n\",\n", + " \"Spain won Euro 2024, defeating England 2-1 in the final to secure their record fourth European Championship [aljazeera](https://vertexaisearch.cloud.google.com/id/1-0) [coachesvoice](https://vertexaisearch.cloud.google.com/id/1-1) [aljazeera](https://vertexaisearch.cloud.google.com/id/1-2) [wikipedia](https://vertexaisearch.cloud.google.com/id/1-3). They won all seven of their matches in the competition [wikipedia](https://vertexaisearch.cloud.google.com/id/1-3).\\n\\nHere's a summary of Spain's key team performance statistics throughout Euro 2024:\\n\\n**General Stats:**\\n\\n* **Goals Scored:** Spain scored 15 goals throughout the tournament, setting a new record for most goals in a single European Championship [wikipedia](https://vertexaisearch.cloud.google.com/id/1-3). They scored 13 goals before the final [thehindu](https://vertexaisearch.cloud.google.com/id/1-4) [newsbytesapp](https://vertexaisearch.cloud.google.com/id/1-5).\\n* **Goals Conceded:** Spain conceded only three goals in the tournament [thehindu](https://vertexaisearch.cloud.google.com/id/1-4) [newsbytesapp](https://vertexaisearch.cloud.google.com/id/1-5).\\n* **Wins:** Spain had a 100% win record in Euro 2024 [newsbytesapp](https://vertexaisearch.cloud.google.com/id/1-5). They won all six of their matches leading up to the final [aljazeera](https://vertexaisearch.cloud.google.com/id/1-2) [sportsmole](https://vertexaisearch.cloud.google.com/id/1-6).\\n* **Clean Sheets:** Spain had three clean sheets in Euro 2024 [thehindu](https://vertexaisearch.cloud.google.com/id/1-4) [thehindu](https://vertexaisearch.cloud.google.com/id/1-7).\\n* **Possession:** Spain averaged 57.3% possession during the tournament [thehindu](https://vertexaisearch.cloud.google.com/id/1-4). They often maintained possession for over 65% of their matches [spanishprofootball](https://vertexaisearch.cloud.google.com/id/1-8).\\n* **Passing Accuracy:** Spain had a passing accuracy of 90% [thehindu](https://vertexaisearch.cloud.google.com/id/1-4).\\n* **Ball Recoveries:** Spain led the tournament in ball recoveries with 255 [thehindu](https://vertexaisearch.cloud.google.com/id/1-4).\\n* **Shots:** Spain had 80 shots (excluding blocks), with 38 on target [newsbytesapp](https://vertexaisearch.cloud.google.com/id/1-5). They had the most attempts in Euro 2024, with 108, 37 of which were on target [thehindu](https://vertexaisearch.cloud.google.com/id/1-4).\\n* **Chances Created:** Spain created 85 chances [newsbytesapp](https://vertexaisearch.cloud.google.com/id/1-5).\\n* **Tackles:** Spain made 92 tackles [newsbytesapp](https://vertexaisearch.cloud.google.com/id/1-5).\\n\\n**Team Composition and Tactics:**\\n\\n* The squad featured a blend of experienced players and young talents [totalfootballanalysis](https://vertexaisearch.cloud.google.com/id/1-9).\\n* Luis de la Fuente employed multifaceted tactics, adapting to different opponents [totalfootballanalysis](https://vertexaisearch.cloud.google.com/id/1-10).\\n* Spain dominated possession and controlled the tempo of matches [spanishprofootball](https://vertexaisearch.cloud.google.com/id/1-8).\\n* They utilized a high pressing strategy and quick recovery [spanishprofootball](https://vertexaisearch.cloud.google.com/id/1-8).\\n* Fluid midfield dynamics were powered by players like Pedri, Rodri, and Gavi [spanishprofootball](https://vertexaisearch.cloud.google.com/id/1-8).\\n\\n**Individual Player Stats:**\\n\\n* **Dani Olmo:** Joint leading goal scorer with three goals [thehindu](https://vertexaisearch.cloud.google.com/id/1-4) [newsbytesapp](https://vertexaisearch.cloud.google.com/id/1-5). He also provided two assists [newsbytesapp](https://vertexaisearch.cloud.google.com/id/1-5).\\n* **Lamine Yamal:** Joint assist leader with three assists [thehindu](https://vertexaisearch.cloud.google.com/id/1-4) [thehindu](https://vertexaisearch.cloud.google.com/id/1-7). He also became the youngest-ever Euros scorer [sportsmole](https://vertexaisearch.cloud.google.com/id/1-6) [wikipedia](https://vertexaisearch.cloud.google.com/id/1-3).\\n* **Rodri:** Completed the most passes for Spain [thehindu](https://vertexaisearch.cloud.google.com/id/1-4) [thehindu](https://vertexaisearch.cloud.google.com/id/1-7).\\n* **Aymeric Laporte:** Recovered the ball the most number of times for Spain defensively [thehindu](https://vertexaisearch.cloud.google.com/id/1-4).\\n* **Unai Simon:** Conceded three goals and made 12 saves in five matches [thehindu](https://vertexaisearch.cloud.google.com/id/1-4).\\n* **Nico Williams:** Named Man of the Match in the final [wikipedia](https://vertexaisearch.cloud.google.com/id/1-3).\\n\\nSpain's coach, Luis de la Fuente, emphasized versatility, pace on the wings, control in the middle, and a solid defense as key to their balance [coachesvoice](https://vertexaisearch.cloud.google.com/id/1-1).\\n\",\n", + " 'Rodri was named Euro 2024 Best Player due to his consistent and brilliant performances throughout the tournament [bet9ja](https://vertexaisearch.cloud.google.com/id/2-0). He was the centerpiece of Spain\\'s midfield, playing a crucial role in nearly every game [europeanchampionship2024](https://vertexaisearch.cloud.google.com/id/2-1). Here\\'s a breakdown of the specific stats and performances that led to the award:\\n\\n* **Key Role in Spain\\'s Victories:** Rodri played a crucial role in Spain\\'s victories over Germany and France [bet9ja](https://vertexaisearch.cloud.google.com/id/2-0).\\n* **Midfield Dominance:** Rodri\\'s consistent presence in midfield was pivotal for Spain [europeanchampionship2024](https://vertexaisearch.cloud.google.com/id/2-1).\\n* **Only Goal:** He scored a goal in Spain\\'s 4-1 win over Georgia in the Last 16 [indiatimes](https://vertexaisearch.cloud.google.com/id/2-2) [bet9ja](https://vertexaisearch.cloud.google.com/id/2-0).\\n* **Passing Accuracy:** Rodri had a remarkable passing accuracy of 92.84% [uefa](https://vertexaisearch.cloud.google.com/id/2-3) [mancity](https://vertexaisearch.cloud.google.com/id/2-4) [uefa](https://vertexaisearch.cloud.google.com/id/2-5). Only Aymeric Laporte completed more passes for Spain with 411 passes [mancity](https://vertexaisearch.cloud.google.com/id/2-4).\\n* **Ball Recoveries:** Rodri was also pivotal when out of possession, with just one other midfielder registering more ball recoveries than the Spaniard\\'s 33 [mancity](https://vertexaisearch.cloud.google.com/id/2-4).\\n* **Leadership:** He led his team with distinction [europeanchampionship2024](https://vertexaisearch.cloud.google.com/id/2-1). Rodri\\'s leadership on the field helped integrate young talents [bet9ja](https://vertexaisearch.cloud.google.com/id/2-0).\\n* **Strategic Rest:** He started in six of Spain\\'s seven matches, only sitting out the final group stage game against Slovakia, which Spain won 1-0. This strategic rest allowed Rodri to stay fresh for the knockout stages [upthrust](https://vertexaisearch.cloud.google.com/id/2-6).\\n* **Calmness Under Pressure:** Rodri\\'s calmness under pressure was a recurring theme throughout the tournament [upthrust](https://vertexaisearch.cloud.google.com/id/2-6).\\n* **Dictating Tempo:** His ability to dictate the tempo of the game, coupled with his defensive prowess, made Rodri indispensable [upthrust](https://vertexaisearch.cloud.google.com/id/2-6).\\n* **Orchestration:** Rodri\\'s orchestration was crucial in maintaining possession and preventing Germany from gaining momentum in the quarter-final [upthrust](https://vertexaisearch.cloud.google.com/id/2-6).\\n* **Midfield Control:** His performance against France in the semi-finals was another masterclass in midfield control [upthrust](https://vertexaisearch.cloud.google.com/id/2-6).\\n* **Composure and Strategic Thinking:** Rodri\\'s composure and strategic thinking brought a sense of reliability to Spain\\'s gameplay [upthrust](https://vertexaisearch.cloud.google.com/id/2-6).\\n* **Impact in the Final:** Despite his early exit due to a hamstring injury in the final against England, Rodri\\'s presence in the first half helped Spain establish control and set the tone for the rest of the match [upthrust](https://vertexaisearch.cloud.google.com/id/2-6).\\n\\nLuis de la Fuente, the coach of the Spanish team, described Rodri as a \"perfect computer\" due to his precise passing and exceptional understanding of the game [indiatimes](https://vertexaisearch.cloud.google.com/id/2-2) [bet9ja](https://vertexaisearch.cloud.google.com/id/2-0). UEFA\\'s team of technical observers at EURO 2024 also recognized Rodri\\'s influence in central midfield [uefa](https://vertexaisearch.cloud.google.com/id/2-7).\\n',\n", + " \"Lamine Yamal was named Euro 2024 Young Player of the Tournament due to several outstanding achievements [uefa](https://vertexaisearch.cloud.google.com/id/3-0) [beinsports](https://vertexaisearch.cloud.google.com/id/3-1) [thehindu](https://vertexaisearch.cloud.google.com/id/3-2). He played in all seven of Spain's Euro 2024 matches, starting in six of them [uefa](https://vertexaisearch.cloud.google.com/id/3-0). He became the youngest player ever to play in the tournament when he started against Croatia at 16 years, 338 days old [uefa](https://vertexaisearch.cloud.google.com/id/3-0) [uefa](https://vertexaisearch.cloud.google.com/id/3-3). In the semi-final against France, he scored a remarkable goal, making him the youngest goalscorer in Euros history at 16 years, 362 days [wikipedia](https://vertexaisearch.cloud.google.com/id/3-4) [uefa](https://vertexaisearch.cloud.google.com/id/3-0) [uefa](https://vertexaisearch.cloud.google.com/id/3-3) [beinsports](https://vertexaisearch.cloud.google.com/id/3-1) [thehindu](https://vertexaisearch.cloud.google.com/id/3-2). Furthermore, he provided four assists during the tournament [wikipedia](https://vertexaisearch.cloud.google.com/id/3-4) [thehindu](https://vertexaisearch.cloud.google.com/id/3-5) [beinsports](https://vertexaisearch.cloud.google.com/id/3-1). In the final, he set up the opening goal against England [uefa](https://vertexaisearch.cloud.google.com/id/3-0).\\n\\nKey statistics from the tournament include [uefa](https://vertexaisearch.cloud.google.com/id/3-6) [uefa](https://vertexaisearch.cloud.google.com/id/3-7):\\n* 7 Matches played\\n* 507 Minutes played\\n* 1 Goal\\n* 4 Assists\\n\\nThese performances led to Yamal receiving the Euro 2024 Young Player of the Tournament award [uefa](https://vertexaisearch.cloud.google.com/id/3-0) [beinsports](https://vertexaisearch.cloud.google.com/id/3-1) [thehindu](https://vertexaisearch.cloud.google.com/id/3-2).\\n\"],\n", + " 'sources_gathered': [{'label': 'youtube',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-0',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGFcidniPKtBR-_QjSR1P1Oathq_0T9FTwfpCAWZxbXsroItHQU8zRcyOPDgMcvsWoD2fEnwYFKwanV18ep2_cyS5BlHF6-OFNsijWb-peAgsgLAVRiubekRnzMugsYtiWrhZyO3Q=='},\n", + " {'label': 'aljazeera',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-1',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEk7ApC7Y41UOrTWJ40wP2rsT0VDxqhqF-WJEI-FNKW7SNpR7LoA22sRQecS8hZNeZ_-62Vh7X75RmcmZUtnAOuQunrLAsETkkSx5l75dt9ESgTRkIURwtu4Pew7hn8yFz_LY_FJXUpmRfoWP7MWrDfPHcKrOpfmKqONj6mJcASNvAfCZ0p6qK3K4PvKWye6NyBMyYxWCuJig=='},\n", + " {'label': 'foxsports',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-2',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHh_4hBL0Giyuw_cyfT8m7tUSnMqBqH4Lis1CtJICPJNGGLhT6PADTIoUtrj3Rl5qcKNE9T6rzOmedAER_gxJOBDrCF8pnr9lUvhYvmDJxYCJzELkE5rTap4dx6FzOIKZKm1QBp5aHXzd_LCkSTV9ag7Q1A6_t8Vjdbskch6ZG3BoIfjYDQSPgRKDNFAAwt5J07cVFV5pDQzggmM7pxwsUz4drz'},\n", + " {'label': 'wikipedia',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-3',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGd9ZQky3X7RQLbTs6mY1i4Pg7ppcI5H_vtxpvQPiEyD8Qw0f7hjvn3QeoOeAVcCG_pEt5Aeu8ofWCgjwQy4_u6qU-NOOJsYPWOW94XcvtkmKiv46vbNkJF-Mb4OpvBztrDa28BfIdCGHdfF9o='},\n", + " {'label': 'youtube',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-4',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGZc-qDhRx_v3mPelXEfAVmWCpNTa_rzUKundc0pRc7PlTgppymao-_wO7O1oPaAhJYLcZkazIg8T5jA6t9OGgOxUd_Vl88BjouHsot0OK8TlM5hmPf4ECMWGeJthqVwndE3h4wdQ=='},\n", + " {'label': 'uefa',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-5',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXG1Lj9FnmuckfU0k1NC_ThQBZVxFCppp4tPl4FCcM3JZGF9aPvn9ZNFUo0fLfqw4Adt63Cdv8thcFSbsBRcf3rj1sz4LALJvrGfh6OayGo0KJ-UEKmKoOz8cxj5nIILCzKjFh2_0ZgTwrf1pkhhYbnWqj2E8hrVN4S5_sxvlCpLXPxjTsE4R0gYKXH_utqqm1NBkpl3p-C9v6kz-zm6V-JJoePAppIXFICF0DMYjOIBA9Mj0z4yO9Y9Tdgx2oaP'},\n", + " {'label': 'olympics',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-6',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFARil0pwjYQuFrDObawlDzu-eVtUPC4_nINjcXT-mlTL3MDgVPI83UB8gWS1rzGZkaMEmAUIeAzo2ihpMXUsWibzVzeAdQ7nUyqAOq0En87kpfuISduBuWI3__7yJw-vmdApD56-_G2ZhhZC4d_ll2iyNBaZHxxdNqXbb76mUiq99xV0hdoPEkp9RLk7T-uYYfTYXa8oYCXy2ysa9SZDa9hffEHrVe'},\n", + " {'label': 'aljazeera',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-1',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEk7ApC7Y41UOrTWJ40wP2rsT0VDxqhqF-WJEI-FNKW7SNpR7LoA22sRQecS8hZNeZ_-62Vh7X75RmcmZUtnAOuQunrLAsETkkSx5l75dt9ESgTRkIURwtu4Pew7hn8yFz_LY_FJXUpmRfoWP7MWrDfPHcKrOpfmKqONj6mJcASNvAfCZ0p6qK3K4PvKWye6NyBMyYxWCuJig=='},\n", + " {'label': 'foxsports',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-2',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHh_4hBL0Giyuw_cyfT8m7tUSnMqBqH4Lis1CtJICPJNGGLhT6PADTIoUtrj3Rl5qcKNE9T6rzOmedAER_gxJOBDrCF8pnr9lUvhYvmDJxYCJzELkE5rTap4dx6FzOIKZKm1QBp5aHXzd_LCkSTV9ag7Q1A6_t8Vjdbskch6ZG3BoIfjYDQSPgRKDNFAAwt5J07cVFV5pDQzggmM7pxwsUz4drz'},\n", + " {'label': 'youtube',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-0',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGFcidniPKtBR-_QjSR1P1Oathq_0T9FTwfpCAWZxbXsroItHQU8zRcyOPDgMcvsWoD2fEnwYFKwanV18ep2_cyS5BlHF6-OFNsijWb-peAgsgLAVRiubekRnzMugsYtiWrhZyO3Q=='},\n", + " {'label': 'aljazeera',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-1',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEk7ApC7Y41UOrTWJ40wP2rsT0VDxqhqF-WJEI-FNKW7SNpR7LoA22sRQecS8hZNeZ_-62Vh7X75RmcmZUtnAOuQunrLAsETkkSx5l75dt9ESgTRkIURwtu4Pew7hn8yFz_LY_FJXUpmRfoWP7MWrDfPHcKrOpfmKqONj6mJcASNvAfCZ0p6qK3K4PvKWye6NyBMyYxWCuJig=='},\n", + " {'label': 'foxsports',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-2',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHh_4hBL0Giyuw_cyfT8m7tUSnMqBqH4Lis1CtJICPJNGGLhT6PADTIoUtrj3Rl5qcKNE9T6rzOmedAER_gxJOBDrCF8pnr9lUvhYvmDJxYCJzELkE5rTap4dx6FzOIKZKm1QBp5aHXzd_LCkSTV9ag7Q1A6_t8Vjdbskch6ZG3BoIfjYDQSPgRKDNFAAwt5J07cVFV5pDQzggmM7pxwsUz4drz'},\n", + " {'label': 'olympics',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-6',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFARil0pwjYQuFrDObawlDzu-eVtUPC4_nINjcXT-mlTL3MDgVPI83UB8gWS1rzGZkaMEmAUIeAzo2ihpMXUsWibzVzeAdQ7nUyqAOq0En87kpfuISduBuWI3__7yJw-vmdApD56-_G2ZhhZC4d_ll2iyNBaZHxxdNqXbb76mUiq99xV0hdoPEkp9RLk7T-uYYfTYXa8oYCXy2ysa9SZDa9hffEHrVe'},\n", + " {'label': 'aljazeera',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-1',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEk7ApC7Y41UOrTWJ40wP2rsT0VDxqhqF-WJEI-FNKW7SNpR7LoA22sRQecS8hZNeZ_-62Vh7X75RmcmZUtnAOuQunrLAsETkkSx5l75dt9ESgTRkIURwtu4Pew7hn8yFz_LY_FJXUpmRfoWP7MWrDfPHcKrOpfmKqONj6mJcASNvAfCZ0p6qK3K4PvKWye6NyBMyYxWCuJig=='},\n", + " {'label': 'foxsports',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-2',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHh_4hBL0Giyuw_cyfT8m7tUSnMqBqH4Lis1CtJICPJNGGLhT6PADTIoUtrj3Rl5qcKNE9T6rzOmedAER_gxJOBDrCF8pnr9lUvhYvmDJxYCJzELkE5rTap4dx6FzOIKZKm1QBp5aHXzd_LCkSTV9ag7Q1A6_t8Vjdbskch6ZG3BoIfjYDQSPgRKDNFAAwt5J07cVFV5pDQzggmM7pxwsUz4drz'},\n", + " {'label': 'youtube',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-7',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFgwKo5lPes5M_GObnkYEzn3QYn1kpTQpx42ANaNqvNMgRsB1Xp2TIXI82SYTSYuLd9ysgKfmlJJy3lcLxrmNBg1R_Z37PCO9vbqIBIbw6DKqMif7pHdtDTS7FUq69c29hkYb_b5w=='},\n", + " {'label': 'wikipedia',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-3',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGd9ZQky3X7RQLbTs6mY1i4Pg7ppcI5H_vtxpvQPiEyD8Qw0f7hjvn3QeoOeAVcCG_pEt5Aeu8ofWCgjwQy4_u6qU-NOOJsYPWOW94XcvtkmKiv46vbNkJF-Mb4OpvBztrDa28BfIdCGHdfF9o='},\n", + " {'label': 'youtube',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-4',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGZc-qDhRx_v3mPelXEfAVmWCpNTa_rzUKundc0pRc7PlTgppymao-_wO7O1oPaAhJYLcZkazIg8T5jA6t9OGgOxUd_Vl88BjouHsot0OK8TlM5hmPf4ECMWGeJthqVwndE3h4wdQ=='},\n", + " {'label': 'uefa',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-5',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXG1Lj9FnmuckfU0k1NC_ThQBZVxFCppp4tPl4FCcM3JZGF9aPvn9ZNFUo0fLfqw4Adt63Cdv8thcFSbsBRcf3rj1sz4LALJvrGfh6OayGo0KJ-UEKmKoOz8cxj5nIILCzKjFh2_0ZgTwrf1pkhhYbnWqj2E8hrVN4S5_sxvlCpLXPxjTsE4R0gYKXH_utqqm1NBkpl3p-C9v6kz-zm6V-JJoePAppIXFICF0DMYjOIBA9Mj0z4yO9Y9Tdgx2oaP'},\n", + " {'label': 'olympics',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-6',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFARil0pwjYQuFrDObawlDzu-eVtUPC4_nINjcXT-mlTL3MDgVPI83UB8gWS1rzGZkaMEmAUIeAzo2ihpMXUsWibzVzeAdQ7nUyqAOq0En87kpfuISduBuWI3__7yJw-vmdApD56-_G2ZhhZC4d_ll2iyNBaZHxxdNqXbb76mUiq99xV0hdoPEkp9RLk7T-uYYfTYXa8oYCXy2ysa9SZDa9hffEHrVe'},\n", + " {'label': 'wikipedia',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-3',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGd9ZQky3X7RQLbTs6mY1i4Pg7ppcI5H_vtxpvQPiEyD8Qw0f7hjvn3QeoOeAVcCG_pEt5Aeu8ofWCgjwQy4_u6qU-NOOJsYPWOW94XcvtkmKiv46vbNkJF-Mb4OpvBztrDa28BfIdCGHdfF9o='},\n", + " {'label': 'olympics',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-6',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFARil0pwjYQuFrDObawlDzu-eVtUPC4_nINjcXT-mlTL3MDgVPI83UB8gWS1rzGZkaMEmAUIeAzo2ihpMXUsWibzVzeAdQ7nUyqAOq0En87kpfuISduBuWI3__7yJw-vmdApD56-_G2ZhhZC4d_ll2iyNBaZHxxdNqXbb76mUiq99xV0hdoPEkp9RLk7T-uYYfTYXa8oYCXy2ysa9SZDa9hffEHrVe'},\n", + " {'label': 'aljazeera',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-8',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFdu_dxqteuc9vM3oGH5WgEnFuOA6vlmbqof-iVRg2OviD2jzkp1jlCRsWkLfb64cK8TJ_g5jKKfZgmaMCk4LA-E2zjYGBfmsWiHdwfSg5Zv3VDMngM3HxT-VLjWYdBdpvpcBTj9VNRkqSCAjGVL9ar0VAOF0uRF6Z96LFz7G9KCSL50llqG7XLpbXmQTFIV4FUsffI8aQG9KKmIaZ1eGqeWQl2xaaRu6-Pwzqxizg8'},\n", + " {'label': 'wikipedia',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-3',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGd9ZQky3X7RQLbTs6mY1i4Pg7ppcI5H_vtxpvQPiEyD8Qw0f7hjvn3QeoOeAVcCG_pEt5Aeu8ofWCgjwQy4_u6qU-NOOJsYPWOW94XcvtkmKiv46vbNkJF-Mb4OpvBztrDa28BfIdCGHdfF9o='},\n", + " {'label': 'ndtv',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-9',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFRRH83ij2MgKWwrGFVWMaFDAT0_GKCFdwVIjaYn7DOoBlxXCGR-Y2RTw9AdKH8dYuhXxSxUTaZNXOBac2nknNZpdmwJiGIj51H6lRWREPUPOiKQkfVPJ0f4ubRSJBLm7_QcAkz4BwzJr3OM06jh-41TbNFZ9t6D7WrbzxmSs7x1O5DCnrPM2OeI6Nc0OhVT0AbeC6f_dTaBR9APlQFDrzIsvDIAn-W5eWuEohDs8w6np0eW65RuhQWrofdY8vFz-bsHgK0J3ew'},\n", + " {'label': 'uefa',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-5',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXG1Lj9FnmuckfU0k1NC_ThQBZVxFCppp4tPl4FCcM3JZGF9aPvn9ZNFUo0fLfqw4Adt63Cdv8thcFSbsBRcf3rj1sz4LALJvrGfh6OayGo0KJ-UEKmKoOz8cxj5nIILCzKjFh2_0ZgTwrf1pkhhYbnWqj2E8hrVN4S5_sxvlCpLXPxjTsE4R0gYKXH_utqqm1NBkpl3p-C9v6kz-zm6V-JJoePAppIXFICF0DMYjOIBA9Mj0z4yO9Y9Tdgx2oaP'},\n", + " {'label': 'wikipedia',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-10',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGbyTk6AGj4XMhW66noNoKqe8eCt9-HZUMs6FXsKVyXcMuoG1WLLhBHa9dITcU3zQFJqCzcxPmnu6rj3ZHmJp-n2xdffBtWYFl2pqxmLrEiZONNYLwleA-T8cnaL7gXWfFlJ2jnvB0='},\n", + " {'label': 'wikipedia',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-10',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGbyTk6AGj4XMhW66noNoKqe8eCt9-HZUMs6FXsKVyXcMuoG1WLLhBHa9dITcU3zQFJqCzcxPmnu6rj3ZHmJp-n2xdffBtWYFl2pqxmLrEiZONNYLwleA-T8cnaL7gXWfFlJ2jnvB0='},\n", + " {'label': 'transfermarkt',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-11',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFMeGs_GRmx0zI6E_xQZfylxykYcTT9MnZlM3ICoa41Pogn4H-1tLirtdPBOrumyI8s_C9i9cBukjUKHxlPfPP49aqTep7xFPgfe2uQFyG37Acsn9RtVv5VenCS5kfPLDQB7sGR-Tyj6wGyiptaTP1uhRnGgYg0u92BW5OH-MY='},\n", + " {'label': 'aljazeera',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-0',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFY5CRvcfjdkBz3h8Md_PscguyZ7LtYrxeHHP3eagcmIOnjaMyZbOHFqUAsa2cgkwvb26FZTvGiRgLKNLfiAsH1oP-5kGwnL6Ejhm4ZXhWGg0R3yE_8zkIKde4RgjIXlBvQW4kZ-LI5yhag-ESoh771z6hob8AigAVXT7WeWABMlQNfcbyG_UZIkqAs18U5e6to44ruNbSyDIyd5gobsVpEmdU256oVxa9d7co='},\n", + " {'label': 'coachesvoice',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-1',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHxgpkZWF64tZ8-iypkI2fiFi2cpsj4AFjZXkcYUzf5hSOWYb5etIbCoZd_L6zDJi6mWWisxAO6T5V4T8H7XiRow6dmVqXpSEIKhPSdG0HAQbQK74lwxeV_uXx9fSPllIKPOs2tFNRqTuHdJBNcwpcJp6MJbVLEskyhYnWlyOd9ouQv'},\n", + " {'label': 'aljazeera',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-2',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEV-g6Hxxcan5Xre1yYGM3BtP3fo9uF2zHQ9sVeK_4poD-aBN5CRvhz471beYCC26wdrjhtbiCvDT9dAnPI-ruyqJZhwB3vbKS5HCFb9tPn7Dkj99LpjLXqYyuzbFGsHCbr5SCHoMEhNg--dMU7xB5TiH8HeqKH8B4lk_h00dqhEVQFb05w5TuLtbX1UdXN6NDzHlFN_xyXzOU='},\n", + " {'label': 'wikipedia',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-3',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFNtaBQTFVnSbEW5Bbo8LUIs0h5cv4Pc4aS6Q8qG7jIMCsJPKy5_o6R8x7Z_xQ7AuDEAFlj2JY_AVV1YpwLqtXZxiAyvpfboH_VuMpo6MVbQAu2ZASSSD2slWaIqsUGkTEaPa2z2809z7UhEWUL'},\n", + " {'label': 'wikipedia',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-3',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFNtaBQTFVnSbEW5Bbo8LUIs0h5cv4Pc4aS6Q8qG7jIMCsJPKy5_o6R8x7Z_xQ7AuDEAFlj2JY_AVV1YpwLqtXZxiAyvpfboH_VuMpo6MVbQAu2ZASSSD2slWaIqsUGkTEaPa2z2809z7UhEWUL'},\n", + " {'label': 'wikipedia',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-3',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFNtaBQTFVnSbEW5Bbo8LUIs0h5cv4Pc4aS6Q8qG7jIMCsJPKy5_o6R8x7Z_xQ7AuDEAFlj2JY_AVV1YpwLqtXZxiAyvpfboH_VuMpo6MVbQAu2ZASSSD2slWaIqsUGkTEaPa2z2809z7UhEWUL'},\n", + " {'label': 'thehindu',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-4',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHtzvfIxJ0Lv3W7kqwlmY7CzFQxcbvXZqh4rRp3xBgV1vY01z4BRWA-GFu4INE8yFv9DE-eCib4cYnC-iv_PVgR8yPkBv8uRhI93Yf29MdbDoi_LGu46heOoxRLdMV58jlLI5nr-1sxKdfPutXE_rjuKehCswPGD-9RlbPI8NjyUQ69XAAOjDDhAN-MBxcIt_r3raV86AQfoo1UtYpUoUjhTGVcYBisvHRxv8-XjDjkr65nPm9vdaO7j28yCcokCCeGWv074_AGWeewDQWwczQM'},\n", + " {'label': 'newsbytesapp',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-5',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFIl5Xc3f44I1nYw_YrJqkByrRl20SiAopZqjfJIK6U62o27CrxLvxaJ4v1M7L5eOfTMMlBCHHYCUooPoG0aObaeRG3YxrcoFT7Xtd4KIrvCS6AWWRpOZasCW-sGtFA56DEDf-qbJ8lsXEJ4GQ386iGTdRkyK9EtJWw1mRpDu7dfPQ6Qy1hNIqTgTdo-3yq1WNmWEl8Xtnag0s='},\n", + " {'label': 'thehindu',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-4',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHtzvfIxJ0Lv3W7kqwlmY7CzFQxcbvXZqh4rRp3xBgV1vY01z4BRWA-GFu4INE8yFv9DE-eCib4cYnC-iv_PVgR8yPkBv8uRhI93Yf29MdbDoi_LGu46heOoxRLdMV58jlLI5nr-1sxKdfPutXE_rjuKehCswPGD-9RlbPI8NjyUQ69XAAOjDDhAN-MBxcIt_r3raV86AQfoo1UtYpUoUjhTGVcYBisvHRxv8-XjDjkr65nPm9vdaO7j28yCcokCCeGWv074_AGWeewDQWwczQM'},\n", + " {'label': 'newsbytesapp',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-5',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFIl5Xc3f44I1nYw_YrJqkByrRl20SiAopZqjfJIK6U62o27CrxLvxaJ4v1M7L5eOfTMMlBCHHYCUooPoG0aObaeRG3YxrcoFT7Xtd4KIrvCS6AWWRpOZasCW-sGtFA56DEDf-qbJ8lsXEJ4GQ386iGTdRkyK9EtJWw1mRpDu7dfPQ6Qy1hNIqTgTdo-3yq1WNmWEl8Xtnag0s='},\n", + " {'label': 'newsbytesapp',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-5',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFIl5Xc3f44I1nYw_YrJqkByrRl20SiAopZqjfJIK6U62o27CrxLvxaJ4v1M7L5eOfTMMlBCHHYCUooPoG0aObaeRG3YxrcoFT7Xtd4KIrvCS6AWWRpOZasCW-sGtFA56DEDf-qbJ8lsXEJ4GQ386iGTdRkyK9EtJWw1mRpDu7dfPQ6Qy1hNIqTgTdo-3yq1WNmWEl8Xtnag0s='},\n", + " {'label': 'aljazeera',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-2',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEV-g6Hxxcan5Xre1yYGM3BtP3fo9uF2zHQ9sVeK_4poD-aBN5CRvhz471beYCC26wdrjhtbiCvDT9dAnPI-ruyqJZhwB3vbKS5HCFb9tPn7Dkj99LpjLXqYyuzbFGsHCbr5SCHoMEhNg--dMU7xB5TiH8HeqKH8B4lk_h00dqhEVQFb05w5TuLtbX1UdXN6NDzHlFN_xyXzOU='},\n", + " {'label': 'sportsmole',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-6',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEVHkRwlOhx_8CZHVDe9XPE_nCs4XYVbx6aIl19aXGNLZxDpcsK5-hcYvMX_et8vasZtMNzmJNTtVd3Vne666vIkkRFUNJxVSBH9bMoGEFcPMcPoxFMUY5LV1YGZjm3n6xbDrkskawWb9MBS-zIIXiXZk7n6TluCji9k3ur3i5-ZhJcgPtAYU-KyfWRTdN0JY4bJt4tAl87Ba9ZInk9YuRlLlAFJ6flaKI-a4cZSXYDQeERhB742z_heWOhDchdvlPfoJaAuYSKKaABrbZQeZw='},\n", + " {'label': 'thehindu',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-4',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHtzvfIxJ0Lv3W7kqwlmY7CzFQxcbvXZqh4rRp3xBgV1vY01z4BRWA-GFu4INE8yFv9DE-eCib4cYnC-iv_PVgR8yPkBv8uRhI93Yf29MdbDoi_LGu46heOoxRLdMV58jlLI5nr-1sxKdfPutXE_rjuKehCswPGD-9RlbPI8NjyUQ69XAAOjDDhAN-MBxcIt_r3raV86AQfoo1UtYpUoUjhTGVcYBisvHRxv8-XjDjkr65nPm9vdaO7j28yCcokCCeGWv074_AGWeewDQWwczQM'},\n", + " {'label': 'thehindu',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-7',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXG7_kutwvl9NHZQl-k0Vpvj_1I7o8MCX8jNlw6rYXEOGSC9QcRvzaH9ycR3JQUjJLvUhUSeaR7hmJ-qPTgMSfw9US7uXQzTF3CJ-tXnIVI1UC8VRyJoW6fH2r-MRFd5EI-PS494grt4Xey1x7WsaZ_Q7tRcQgVX_EM0JxQK12s8yYAY3TIUpa1L5fZOmsi6ZKq-jrXYOmIV5OTu2AaleBeQE_Z-B10oU2qin2Q3T8w6LP2ispUlVEh54d5fWLcHlEtskrRHC8psjrarTgqn'},\n", + " {'label': 'thehindu',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-4',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHtzvfIxJ0Lv3W7kqwlmY7CzFQxcbvXZqh4rRp3xBgV1vY01z4BRWA-GFu4INE8yFv9DE-eCib4cYnC-iv_PVgR8yPkBv8uRhI93Yf29MdbDoi_LGu46heOoxRLdMV58jlLI5nr-1sxKdfPutXE_rjuKehCswPGD-9RlbPI8NjyUQ69XAAOjDDhAN-MBxcIt_r3raV86AQfoo1UtYpUoUjhTGVcYBisvHRxv8-XjDjkr65nPm9vdaO7j28yCcokCCeGWv074_AGWeewDQWwczQM'},\n", + " {'label': 'spanishprofootball',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-8',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFG8gCwweIne3MmZpbUnDq24EeYu1w6OpSNeS2U5DtRYUbqRVtIjCnFAOjlXy8XjD8MvbmoNIsRD9rdadJ7tWoyG3T5fj2QvlMdWjCXwpMs7W3D_49AT_d1vWRuu8i_-nAK0WHpo6Wo5abiRpwUyjtFX1rYGXujmwsodi5hUV9Q4Qd1ltJe2cuLhq2cPRU='},\n", + " {'label': 'thehindu',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-4',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHtzvfIxJ0Lv3W7kqwlmY7CzFQxcbvXZqh4rRp3xBgV1vY01z4BRWA-GFu4INE8yFv9DE-eCib4cYnC-iv_PVgR8yPkBv8uRhI93Yf29MdbDoi_LGu46heOoxRLdMV58jlLI5nr-1sxKdfPutXE_rjuKehCswPGD-9RlbPI8NjyUQ69XAAOjDDhAN-MBxcIt_r3raV86AQfoo1UtYpUoUjhTGVcYBisvHRxv8-XjDjkr65nPm9vdaO7j28yCcokCCeGWv074_AGWeewDQWwczQM'},\n", + " {'label': 'thehindu',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-4',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHtzvfIxJ0Lv3W7kqwlmY7CzFQxcbvXZqh4rRp3xBgV1vY01z4BRWA-GFu4INE8yFv9DE-eCib4cYnC-iv_PVgR8yPkBv8uRhI93Yf29MdbDoi_LGu46heOoxRLdMV58jlLI5nr-1sxKdfPutXE_rjuKehCswPGD-9RlbPI8NjyUQ69XAAOjDDhAN-MBxcIt_r3raV86AQfoo1UtYpUoUjhTGVcYBisvHRxv8-XjDjkr65nPm9vdaO7j28yCcokCCeGWv074_AGWeewDQWwczQM'},\n", + " {'label': 'newsbytesapp',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-5',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFIl5Xc3f44I1nYw_YrJqkByrRl20SiAopZqjfJIK6U62o27CrxLvxaJ4v1M7L5eOfTMMlBCHHYCUooPoG0aObaeRG3YxrcoFT7Xtd4KIrvCS6AWWRpOZasCW-sGtFA56DEDf-qbJ8lsXEJ4GQ386iGTdRkyK9EtJWw1mRpDu7dfPQ6Qy1hNIqTgTdo-3yq1WNmWEl8Xtnag0s='},\n", + " {'label': 'thehindu',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-4',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHtzvfIxJ0Lv3W7kqwlmY7CzFQxcbvXZqh4rRp3xBgV1vY01z4BRWA-GFu4INE8yFv9DE-eCib4cYnC-iv_PVgR8yPkBv8uRhI93Yf29MdbDoi_LGu46heOoxRLdMV58jlLI5nr-1sxKdfPutXE_rjuKehCswPGD-9RlbPI8NjyUQ69XAAOjDDhAN-MBxcIt_r3raV86AQfoo1UtYpUoUjhTGVcYBisvHRxv8-XjDjkr65nPm9vdaO7j28yCcokCCeGWv074_AGWeewDQWwczQM'},\n", + " {'label': 'newsbytesapp',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-5',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFIl5Xc3f44I1nYw_YrJqkByrRl20SiAopZqjfJIK6U62o27CrxLvxaJ4v1M7L5eOfTMMlBCHHYCUooPoG0aObaeRG3YxrcoFT7Xtd4KIrvCS6AWWRpOZasCW-sGtFA56DEDf-qbJ8lsXEJ4GQ386iGTdRkyK9EtJWw1mRpDu7dfPQ6Qy1hNIqTgTdo-3yq1WNmWEl8Xtnag0s='},\n", + " {'label': 'newsbytesapp',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-5',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFIl5Xc3f44I1nYw_YrJqkByrRl20SiAopZqjfJIK6U62o27CrxLvxaJ4v1M7L5eOfTMMlBCHHYCUooPoG0aObaeRG3YxrcoFT7Xtd4KIrvCS6AWWRpOZasCW-sGtFA56DEDf-qbJ8lsXEJ4GQ386iGTdRkyK9EtJWw1mRpDu7dfPQ6Qy1hNIqTgTdo-3yq1WNmWEl8Xtnag0s='},\n", + " {'label': 'totalfootballanalysis',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-9',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGQ6VynwIGq-L7FKFu-L5vh_TzCWZHXL9rXmzI0uuR1Qexwi1jRKOzvfthF3hl-KGOQhdsEC67FoNIH5ojbVkEVCxdDkX73E9DZUv8Vz_GRld1NHm0gm0i7n-KaZ5w72dfptRLWKyKnfY6UZawwFX3OtwTfYQzHd32wv1s4sk0PIUNOj-FdhnWxaYO-PJSC_aZcwpuVrmEgOqXy0Xk='},\n", + " {'label': 'totalfootballanalysis',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-10',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHYrmUdaz_yH2TIUYp54IQ9PxJYBikelavTVFZ5gy2Up1Kaavkf0zeM14L7mTiuPxGEHjaQjn8mLt3I1HdZH34VrBJn6sZ07KzPCX9Bo7gkM44oroevlhaXZtFG65maD7igABOGLBJjZE0Hg17i3EIGTMVfE-OEn0NN53EhY1pLQObHKWJogrtjbLil0XJOV9Ym5_La7JuWQpKo7IiuPlH-w7N_vJHgTDZOxJMY'},\n", + " {'label': 'spanishprofootball',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-8',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFG8gCwweIne3MmZpbUnDq24EeYu1w6OpSNeS2U5DtRYUbqRVtIjCnFAOjlXy8XjD8MvbmoNIsRD9rdadJ7tWoyG3T5fj2QvlMdWjCXwpMs7W3D_49AT_d1vWRuu8i_-nAK0WHpo6Wo5abiRpwUyjtFX1rYGXujmwsodi5hUV9Q4Qd1ltJe2cuLhq2cPRU='},\n", + " {'label': 'spanishprofootball',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-8',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFG8gCwweIne3MmZpbUnDq24EeYu1w6OpSNeS2U5DtRYUbqRVtIjCnFAOjlXy8XjD8MvbmoNIsRD9rdadJ7tWoyG3T5fj2QvlMdWjCXwpMs7W3D_49AT_d1vWRuu8i_-nAK0WHpo6Wo5abiRpwUyjtFX1rYGXujmwsodi5hUV9Q4Qd1ltJe2cuLhq2cPRU='},\n", + " {'label': 'spanishprofootball',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-8',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFG8gCwweIne3MmZpbUnDq24EeYu1w6OpSNeS2U5DtRYUbqRVtIjCnFAOjlXy8XjD8MvbmoNIsRD9rdadJ7tWoyG3T5fj2QvlMdWjCXwpMs7W3D_49AT_d1vWRuu8i_-nAK0WHpo6Wo5abiRpwUyjtFX1rYGXujmwsodi5hUV9Q4Qd1ltJe2cuLhq2cPRU='},\n", + " {'label': 'thehindu',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-4',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHtzvfIxJ0Lv3W7kqwlmY7CzFQxcbvXZqh4rRp3xBgV1vY01z4BRWA-GFu4INE8yFv9DE-eCib4cYnC-iv_PVgR8yPkBv8uRhI93Yf29MdbDoi_LGu46heOoxRLdMV58jlLI5nr-1sxKdfPutXE_rjuKehCswPGD-9RlbPI8NjyUQ69XAAOjDDhAN-MBxcIt_r3raV86AQfoo1UtYpUoUjhTGVcYBisvHRxv8-XjDjkr65nPm9vdaO7j28yCcokCCeGWv074_AGWeewDQWwczQM'},\n", + " {'label': 'newsbytesapp',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-5',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFIl5Xc3f44I1nYw_YrJqkByrRl20SiAopZqjfJIK6U62o27CrxLvxaJ4v1M7L5eOfTMMlBCHHYCUooPoG0aObaeRG3YxrcoFT7Xtd4KIrvCS6AWWRpOZasCW-sGtFA56DEDf-qbJ8lsXEJ4GQ386iGTdRkyK9EtJWw1mRpDu7dfPQ6Qy1hNIqTgTdo-3yq1WNmWEl8Xtnag0s='},\n", + " {'label': 'newsbytesapp',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-5',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFIl5Xc3f44I1nYw_YrJqkByrRl20SiAopZqjfJIK6U62o27CrxLvxaJ4v1M7L5eOfTMMlBCHHYCUooPoG0aObaeRG3YxrcoFT7Xtd4KIrvCS6AWWRpOZasCW-sGtFA56DEDf-qbJ8lsXEJ4GQ386iGTdRkyK9EtJWw1mRpDu7dfPQ6Qy1hNIqTgTdo-3yq1WNmWEl8Xtnag0s='},\n", + " {'label': 'thehindu',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-4',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHtzvfIxJ0Lv3W7kqwlmY7CzFQxcbvXZqh4rRp3xBgV1vY01z4BRWA-GFu4INE8yFv9DE-eCib4cYnC-iv_PVgR8yPkBv8uRhI93Yf29MdbDoi_LGu46heOoxRLdMV58jlLI5nr-1sxKdfPutXE_rjuKehCswPGD-9RlbPI8NjyUQ69XAAOjDDhAN-MBxcIt_r3raV86AQfoo1UtYpUoUjhTGVcYBisvHRxv8-XjDjkr65nPm9vdaO7j28yCcokCCeGWv074_AGWeewDQWwczQM'},\n", + " {'label': 'thehindu',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-7',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXG7_kutwvl9NHZQl-k0Vpvj_1I7o8MCX8jNlw6rYXEOGSC9QcRvzaH9ycR3JQUjJLvUhUSeaR7hmJ-qPTgMSfw9US7uXQzTF3CJ-tXnIVI1UC8VRyJoW6fH2r-MRFd5EI-PS494grt4Xey1x7WsaZ_Q7tRcQgVX_EM0JxQK12s8yYAY3TIUpa1L5fZOmsi6ZKq-jrXYOmIV5OTu2AaleBeQE_Z-B10oU2qin2Q3T8w6LP2ispUlVEh54d5fWLcHlEtskrRHC8psjrarTgqn'},\n", + " {'label': 'sportsmole',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-6',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEVHkRwlOhx_8CZHVDe9XPE_nCs4XYVbx6aIl19aXGNLZxDpcsK5-hcYvMX_et8vasZtMNzmJNTtVd3Vne666vIkkRFUNJxVSBH9bMoGEFcPMcPoxFMUY5LV1YGZjm3n6xbDrkskawWb9MBS-zIIXiXZk7n6TluCji9k3ur3i5-ZhJcgPtAYU-KyfWRTdN0JY4bJt4tAl87Ba9ZInk9YuRlLlAFJ6flaKI-a4cZSXYDQeERhB742z_heWOhDchdvlPfoJaAuYSKKaABrbZQeZw='},\n", + " {'label': 'wikipedia',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-3',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFNtaBQTFVnSbEW5Bbo8LUIs0h5cv4Pc4aS6Q8qG7jIMCsJPKy5_o6R8x7Z_xQ7AuDEAFlj2JY_AVV1YpwLqtXZxiAyvpfboH_VuMpo6MVbQAu2ZASSSD2slWaIqsUGkTEaPa2z2809z7UhEWUL'},\n", + " {'label': 'thehindu',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-4',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHtzvfIxJ0Lv3W7kqwlmY7CzFQxcbvXZqh4rRp3xBgV1vY01z4BRWA-GFu4INE8yFv9DE-eCib4cYnC-iv_PVgR8yPkBv8uRhI93Yf29MdbDoi_LGu46heOoxRLdMV58jlLI5nr-1sxKdfPutXE_rjuKehCswPGD-9RlbPI8NjyUQ69XAAOjDDhAN-MBxcIt_r3raV86AQfoo1UtYpUoUjhTGVcYBisvHRxv8-XjDjkr65nPm9vdaO7j28yCcokCCeGWv074_AGWeewDQWwczQM'},\n", + " {'label': 'thehindu',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-7',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXG7_kutwvl9NHZQl-k0Vpvj_1I7o8MCX8jNlw6rYXEOGSC9QcRvzaH9ycR3JQUjJLvUhUSeaR7hmJ-qPTgMSfw9US7uXQzTF3CJ-tXnIVI1UC8VRyJoW6fH2r-MRFd5EI-PS494grt4Xey1x7WsaZ_Q7tRcQgVX_EM0JxQK12s8yYAY3TIUpa1L5fZOmsi6ZKq-jrXYOmIV5OTu2AaleBeQE_Z-B10oU2qin2Q3T8w6LP2ispUlVEh54d5fWLcHlEtskrRHC8psjrarTgqn'},\n", + " {'label': 'thehindu',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-4',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHtzvfIxJ0Lv3W7kqwlmY7CzFQxcbvXZqh4rRp3xBgV1vY01z4BRWA-GFu4INE8yFv9DE-eCib4cYnC-iv_PVgR8yPkBv8uRhI93Yf29MdbDoi_LGu46heOoxRLdMV58jlLI5nr-1sxKdfPutXE_rjuKehCswPGD-9RlbPI8NjyUQ69XAAOjDDhAN-MBxcIt_r3raV86AQfoo1UtYpUoUjhTGVcYBisvHRxv8-XjDjkr65nPm9vdaO7j28yCcokCCeGWv074_AGWeewDQWwczQM'},\n", + " {'label': 'thehindu',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-4',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHtzvfIxJ0Lv3W7kqwlmY7CzFQxcbvXZqh4rRp3xBgV1vY01z4BRWA-GFu4INE8yFv9DE-eCib4cYnC-iv_PVgR8yPkBv8uRhI93Yf29MdbDoi_LGu46heOoxRLdMV58jlLI5nr-1sxKdfPutXE_rjuKehCswPGD-9RlbPI8NjyUQ69XAAOjDDhAN-MBxcIt_r3raV86AQfoo1UtYpUoUjhTGVcYBisvHRxv8-XjDjkr65nPm9vdaO7j28yCcokCCeGWv074_AGWeewDQWwczQM'},\n", + " {'label': 'wikipedia',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-3',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFNtaBQTFVnSbEW5Bbo8LUIs0h5cv4Pc4aS6Q8qG7jIMCsJPKy5_o6R8x7Z_xQ7AuDEAFlj2JY_AVV1YpwLqtXZxiAyvpfboH_VuMpo6MVbQAu2ZASSSD2slWaIqsUGkTEaPa2z2809z7UhEWUL'},\n", + " {'label': 'coachesvoice',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-1',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHxgpkZWF64tZ8-iypkI2fiFi2cpsj4AFjZXkcYUzf5hSOWYb5etIbCoZd_L6zDJi6mWWisxAO6T5V4T8H7XiRow6dmVqXpSEIKhPSdG0HAQbQK74lwxeV_uXx9fSPllIKPOs2tFNRqTuHdJBNcwpcJp6MJbVLEskyhYnWlyOd9ouQv'},\n", + " {'label': 'bet9ja',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/2-0',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFgj0MP_IEmC842xTfmMPnbybBGYTUb_wEpwJ58keX5x_qPfUmC7Zz0o6IQeQ8TEqoRpv-Uq6oOqfbazu_aP0fMhP7UrSln6rB4SRvCRC327tM1LNaXpiXN-h6xlg0TN_-AWQORV4PSH7G5u2qD_NaNEWkz_oaEHxj22-qOam52fwRvqISOdoFDNTptlM6t0BbhcA=='},\n", + " {'label': 'europeanchampionship2024',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/2-1',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGLP8ZiV1gSErFyEW_mBaeUabOdyppbZMUHyMPTq_nC68lIlF28o4vXtvlsLYq7C-ANzy6iwTpWA4ri2fUKevBCGLRotUVZjLX6Au_hnO-mbPGp_Z7nyomkjYhu2iLoPXbmTS8KmWJr8ZAul7j0XQA-S621HaOSBDk0-XBGiKgISgeQb7Tuc-OGj_NMlPQkzK2y4qrs_TBcPgfh5w=='},\n", + " {'label': 'bet9ja',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/2-0',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFgj0MP_IEmC842xTfmMPnbybBGYTUb_wEpwJ58keX5x_qPfUmC7Zz0o6IQeQ8TEqoRpv-Uq6oOqfbazu_aP0fMhP7UrSln6rB4SRvCRC327tM1LNaXpiXN-h6xlg0TN_-AWQORV4PSH7G5u2qD_NaNEWkz_oaEHxj22-qOam52fwRvqISOdoFDNTptlM6t0BbhcA=='},\n", + " {'label': 'europeanchampionship2024',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/2-1',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGLP8ZiV1gSErFyEW_mBaeUabOdyppbZMUHyMPTq_nC68lIlF28o4vXtvlsLYq7C-ANzy6iwTpWA4ri2fUKevBCGLRotUVZjLX6Au_hnO-mbPGp_Z7nyomkjYhu2iLoPXbmTS8KmWJr8ZAul7j0XQA-S621HaOSBDk0-XBGiKgISgeQb7Tuc-OGj_NMlPQkzK2y4qrs_TBcPgfh5w=='},\n", + " {'label': 'indiatimes',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/2-2',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXESZAkHCLh4VxzVLM3prMQrm-sk5x27L8Z70Q4PKkte0vxhTZVZGCY1s5VfC7u5gECHBavdf1DHRCmh77mAaONSIJ78dcaGelojd2Cd5NuJcyQD8juxOERO1zD147S62xcwKy0GZ9Pb64Yj9cPLEx3fDJvTEm4sn013e_e13dTXUQd4m2yHuO72CfsZSbEq-wVsP47O20GMQXLlZov73MCd1uS1eMq9I5cj1QjiIOjiTC484inoCaShm3LTkXA-Jk5L8GvL'},\n", + " {'label': 'bet9ja',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/2-0',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFgj0MP_IEmC842xTfmMPnbybBGYTUb_wEpwJ58keX5x_qPfUmC7Zz0o6IQeQ8TEqoRpv-Uq6oOqfbazu_aP0fMhP7UrSln6rB4SRvCRC327tM1LNaXpiXN-h6xlg0TN_-AWQORV4PSH7G5u2qD_NaNEWkz_oaEHxj22-qOam52fwRvqISOdoFDNTptlM6t0BbhcA=='},\n", + " {'label': 'uefa',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/2-3',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFG1hC1YkRcN1pqrLp05aZRwvU2gEv7qauPowe-Co8wgi3HfVrNby2N2i7C3--nu8eYku9ak1DQeH8zJX6XRVKe8psOQ02y3nY5TYcHp-Uk3aZay-sGe4bQZJxVKeF5NS2vtG-h09y3TD_5Aox3V9Yh0z1MYKTBE3Q='},\n", + " {'label': 'mancity',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/2-4',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFs-OAM9wd4bVstgUzRYVeAqGBbUckmq77-BWTs9IkGYZc-WwzHbZ1khSV8T91YQpZkd8c6vZTke-Wgkf4O1SdhMLwYXVj3SsWViVDOT-eeZPBI5v1BuE1Wb0wg9XGzxOl66-faN_8zKvvdm-KEzx5OfL7ytu0i-cG9AzKpZPgi5HNCuLw8PwcbPPxXB_QE5VSuCC5uYGMJ'},\n", + " {'label': 'uefa',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/2-5',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHlzgFESCAkLrjGTw5ZRNnr68tC-GrAg3iL61UJu3ZT8SJX4HYaFE6qOIR8iNpXpJDUMDnTwIpG6IFrT6NPqAbQCSoj_GIPC-eBrrVrUqA8IdzvncYpRAubOVFFkNVBZGbY64I2FiF6wA-biL0bKFD02adziHempLuyjM5YvnOFDR1r0A=='},\n", + " {'label': 'mancity',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/2-4',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFs-OAM9wd4bVstgUzRYVeAqGBbUckmq77-BWTs9IkGYZc-WwzHbZ1khSV8T91YQpZkd8c6vZTke-Wgkf4O1SdhMLwYXVj3SsWViVDOT-eeZPBI5v1BuE1Wb0wg9XGzxOl66-faN_8zKvvdm-KEzx5OfL7ytu0i-cG9AzKpZPgi5HNCuLw8PwcbPPxXB_QE5VSuCC5uYGMJ'},\n", + " {'label': 'mancity',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/2-4',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFs-OAM9wd4bVstgUzRYVeAqGBbUckmq77-BWTs9IkGYZc-WwzHbZ1khSV8T91YQpZkd8c6vZTke-Wgkf4O1SdhMLwYXVj3SsWViVDOT-eeZPBI5v1BuE1Wb0wg9XGzxOl66-faN_8zKvvdm-KEzx5OfL7ytu0i-cG9AzKpZPgi5HNCuLw8PwcbPPxXB_QE5VSuCC5uYGMJ'},\n", + " {'label': 'europeanchampionship2024',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/2-1',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGLP8ZiV1gSErFyEW_mBaeUabOdyppbZMUHyMPTq_nC68lIlF28o4vXtvlsLYq7C-ANzy6iwTpWA4ri2fUKevBCGLRotUVZjLX6Au_hnO-mbPGp_Z7nyomkjYhu2iLoPXbmTS8KmWJr8ZAul7j0XQA-S621HaOSBDk0-XBGiKgISgeQb7Tuc-OGj_NMlPQkzK2y4qrs_TBcPgfh5w=='},\n", + " {'label': 'bet9ja',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/2-0',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFgj0MP_IEmC842xTfmMPnbybBGYTUb_wEpwJ58keX5x_qPfUmC7Zz0o6IQeQ8TEqoRpv-Uq6oOqfbazu_aP0fMhP7UrSln6rB4SRvCRC327tM1LNaXpiXN-h6xlg0TN_-AWQORV4PSH7G5u2qD_NaNEWkz_oaEHxj22-qOam52fwRvqISOdoFDNTptlM6t0BbhcA=='},\n", + " {'label': 'upthrust',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/2-6',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGAjXBUZABbe0t7dJcEjK-t1A0Gqoyhqd7tS8SrIRQNiNGFC_prv2xazEc-9Xd7vH1V9PgjWB5k8TBWcxtRc8Z2ZHRS3i6cwhdKxLswfDAFFuamfuITm699F648K4tmBYZABT6neMReI4c4sINJAEKqrn6hNzZZjtTt44X78i2dTIOQe74qvl9ofmwm6Q=='},\n", + " {'label': 'upthrust',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/2-6',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGAjXBUZABbe0t7dJcEjK-t1A0Gqoyhqd7tS8SrIRQNiNGFC_prv2xazEc-9Xd7vH1V9PgjWB5k8TBWcxtRc8Z2ZHRS3i6cwhdKxLswfDAFFuamfuITm699F648K4tmBYZABT6neMReI4c4sINJAEKqrn6hNzZZjtTt44X78i2dTIOQe74qvl9ofmwm6Q=='},\n", + " {'label': 'upthrust',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/2-6',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGAjXBUZABbe0t7dJcEjK-t1A0Gqoyhqd7tS8SrIRQNiNGFC_prv2xazEc-9Xd7vH1V9PgjWB5k8TBWcxtRc8Z2ZHRS3i6cwhdKxLswfDAFFuamfuITm699F648K4tmBYZABT6neMReI4c4sINJAEKqrn6hNzZZjtTt44X78i2dTIOQe74qvl9ofmwm6Q=='},\n", + " {'label': 'upthrust',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/2-6',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGAjXBUZABbe0t7dJcEjK-t1A0Gqoyhqd7tS8SrIRQNiNGFC_prv2xazEc-9Xd7vH1V9PgjWB5k8TBWcxtRc8Z2ZHRS3i6cwhdKxLswfDAFFuamfuITm699F648K4tmBYZABT6neMReI4c4sINJAEKqrn6hNzZZjtTt44X78i2dTIOQe74qvl9ofmwm6Q=='},\n", + " {'label': 'upthrust',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/2-6',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGAjXBUZABbe0t7dJcEjK-t1A0Gqoyhqd7tS8SrIRQNiNGFC_prv2xazEc-9Xd7vH1V9PgjWB5k8TBWcxtRc8Z2ZHRS3i6cwhdKxLswfDAFFuamfuITm699F648K4tmBYZABT6neMReI4c4sINJAEKqrn6hNzZZjtTt44X78i2dTIOQe74qvl9ofmwm6Q=='},\n", + " {'label': 'upthrust',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/2-6',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGAjXBUZABbe0t7dJcEjK-t1A0Gqoyhqd7tS8SrIRQNiNGFC_prv2xazEc-9Xd7vH1V9PgjWB5k8TBWcxtRc8Z2ZHRS3i6cwhdKxLswfDAFFuamfuITm699F648K4tmBYZABT6neMReI4c4sINJAEKqrn6hNzZZjtTt44X78i2dTIOQe74qvl9ofmwm6Q=='},\n", + " {'label': 'upthrust',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/2-6',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGAjXBUZABbe0t7dJcEjK-t1A0Gqoyhqd7tS8SrIRQNiNGFC_prv2xazEc-9Xd7vH1V9PgjWB5k8TBWcxtRc8Z2ZHRS3i6cwhdKxLswfDAFFuamfuITm699F648K4tmBYZABT6neMReI4c4sINJAEKqrn6hNzZZjtTt44X78i2dTIOQe74qvl9ofmwm6Q=='},\n", + " {'label': 'indiatimes',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/2-2',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXESZAkHCLh4VxzVLM3prMQrm-sk5x27L8Z70Q4PKkte0vxhTZVZGCY1s5VfC7u5gECHBavdf1DHRCmh77mAaONSIJ78dcaGelojd2Cd5NuJcyQD8juxOERO1zD147S62xcwKy0GZ9Pb64Yj9cPLEx3fDJvTEm4sn013e_e13dTXUQd4m2yHuO72CfsZSbEq-wVsP47O20GMQXLlZov73MCd1uS1eMq9I5cj1QjiIOjiTC484inoCaShm3LTkXA-Jk5L8GvL'},\n", + " {'label': 'bet9ja',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/2-0',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFgj0MP_IEmC842xTfmMPnbybBGYTUb_wEpwJ58keX5x_qPfUmC7Zz0o6IQeQ8TEqoRpv-Uq6oOqfbazu_aP0fMhP7UrSln6rB4SRvCRC327tM1LNaXpiXN-h6xlg0TN_-AWQORV4PSH7G5u2qD_NaNEWkz_oaEHxj22-qOam52fwRvqISOdoFDNTptlM6t0BbhcA=='},\n", + " {'label': 'uefa',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/2-7',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHcZMzOblU6pNw1gc0QlnRNhCK5VfMY4bW1wPz51w6-AyhvvZnyXcfFxJd4JPdnEfEPD0GB5vHPql6jFppUeKKRysRvwpwaTwaDyFAkvRGab-UAPOOUuK72HsYGrlGVEUHLO6mkzthFd_p8HUaj_JJqlhIaQOuosrZ2y7vf9ouEvd10Uh-rBOqmPRclpkcg3o3WpHhgBY5xNUPEw22V45KhXrqiQhUn5ZSKw3TcsGjla-vA'},\n", + " {'label': 'uefa',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/3-0',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGKGygrv0aVjWa7JUdwqtuttcPxVIiVFb2_Mxv32q-4AyOVwd8oMKLXq6sl2kw4A37lHLmUUQYqVfDMkX3DLXr4or1Xpx1lnOpIUanPjOtrr2Hk6tPPc0308hdE0xJ5CClC220Tz30xD6538_DOvrVWqfA7pV7x651519Zz37wgqYhN00Ah3LX4QZnW981_-SM8tjVSLDXutPphZBXXmMehNgUynvNd2IiGB9UtkLyGeWINIqR2F7lejStuXJ8U2Q=='},\n", + " {'label': 'beinsports',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/3-1',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXExRli0zGmQZlemPPItRH3qShabB-QVHrgUAECeXIs3GUKgd2oIHd45-ULY--TosnkRkiM-XHqZlPxeQlOV6Ktgxb-L5r9Hhf8M-nQS_T0N7NK0BeynreRZtFivuKzwwOByq6uALzoVtombjsREMmsPG7s07CMlMrQjyJCVX8McNdnGC7-mdlHEjdfXN4sgi-YGxdxCdAxaHUaMQxPL0GUUmqDzMMpzVC_lRnrYfuk17UhXI9QhsEi3TMeuUgHu3kl16g1mHA=='},\n", + " {'label': 'thehindu',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/3-2',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEAlCtejIOwzHPUOAXi7oLu469wYzGUJN86oxtrB6YCAHKAocfkxog6XZeXOUjAl9MTY2_jU5igYEOpyy5RZV2jhxGHtahvQGi8Bq0XkJmaFvludGqwpuBn-vFf-MR3As1CXu9GZNh0TW5f3eLPgvDjB6N3IoYaGhGT8BUiqSyZS6k41T-vL9h6fEFMoOFUYhG2S0AfuVZDuyF2nJHJP1WVWZS42csWXEJUDxqhYjyzmx33HaCxKk0Rbe3_Ovc_Kgdagw=='},\n", + " {'label': 'uefa',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/3-0',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGKGygrv0aVjWa7JUdwqtuttcPxVIiVFb2_Mxv32q-4AyOVwd8oMKLXq6sl2kw4A37lHLmUUQYqVfDMkX3DLXr4or1Xpx1lnOpIUanPjOtrr2Hk6tPPc0308hdE0xJ5CClC220Tz30xD6538_DOvrVWqfA7pV7x651519Zz37wgqYhN00Ah3LX4QZnW981_-SM8tjVSLDXutPphZBXXmMehNgUynvNd2IiGB9UtkLyGeWINIqR2F7lejStuXJ8U2Q=='},\n", + " {'label': 'uefa',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/3-0',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGKGygrv0aVjWa7JUdwqtuttcPxVIiVFb2_Mxv32q-4AyOVwd8oMKLXq6sl2kw4A37lHLmUUQYqVfDMkX3DLXr4or1Xpx1lnOpIUanPjOtrr2Hk6tPPc0308hdE0xJ5CClC220Tz30xD6538_DOvrVWqfA7pV7x651519Zz37wgqYhN00Ah3LX4QZnW981_-SM8tjVSLDXutPphZBXXmMehNgUynvNd2IiGB9UtkLyGeWINIqR2F7lejStuXJ8U2Q=='},\n", + " {'label': 'uefa',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/3-3',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGIh15GjQTH5sloOsTsyL7xu4UxiL1iUhCOmOYuQn2I3oTzOmC8I6vpqG7puUq20dPwFWNyGzUT1m4eiDf3XTrvfO-BRbRz80it26jo1H0Wq6Dr8jI2xYQbW8suUGcHTE6aT6FUa57v2oHiBP2yTBe4FyTP3w-us4RhdAgxy32VvGJhczpHTp36FWBtxK-ESh5KTcPHflNroQkKP0rE17DLYrMfoQVNGf41jeTM2YCvoSeymtFHc-wvySulmtIFlQ=='},\n", + " {'label': 'wikipedia',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/3-4',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGEIQE8ljNdOpLHYgNFDjPekNZfDVP_W7aAbZgzTSgSraVNbalzctN2llZ3do9v9r7sRqxOXioKpebZrVCBnux58qbMLK8wpc4MmOKDRG3bAD8hwE7xMl_InBIfHuIMbuZ_twEC'},\n", + " {'label': 'uefa',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/3-0',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGKGygrv0aVjWa7JUdwqtuttcPxVIiVFb2_Mxv32q-4AyOVwd8oMKLXq6sl2kw4A37lHLmUUQYqVfDMkX3DLXr4or1Xpx1lnOpIUanPjOtrr2Hk6tPPc0308hdE0xJ5CClC220Tz30xD6538_DOvrVWqfA7pV7x651519Zz37wgqYhN00Ah3LX4QZnW981_-SM8tjVSLDXutPphZBXXmMehNgUynvNd2IiGB9UtkLyGeWINIqR2F7lejStuXJ8U2Q=='},\n", + " {'label': 'uefa',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/3-3',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGIh15GjQTH5sloOsTsyL7xu4UxiL1iUhCOmOYuQn2I3oTzOmC8I6vpqG7puUq20dPwFWNyGzUT1m4eiDf3XTrvfO-BRbRz80it26jo1H0Wq6Dr8jI2xYQbW8suUGcHTE6aT6FUa57v2oHiBP2yTBe4FyTP3w-us4RhdAgxy32VvGJhczpHTp36FWBtxK-ESh5KTcPHflNroQkKP0rE17DLYrMfoQVNGf41jeTM2YCvoSeymtFHc-wvySulmtIFlQ=='},\n", + " {'label': 'beinsports',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/3-1',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXExRli0zGmQZlemPPItRH3qShabB-QVHrgUAECeXIs3GUKgd2oIHd45-ULY--TosnkRkiM-XHqZlPxeQlOV6Ktgxb-L5r9Hhf8M-nQS_T0N7NK0BeynreRZtFivuKzwwOByq6uALzoVtombjsREMmsPG7s07CMlMrQjyJCVX8McNdnGC7-mdlHEjdfXN4sgi-YGxdxCdAxaHUaMQxPL0GUUmqDzMMpzVC_lRnrYfuk17UhXI9QhsEi3TMeuUgHu3kl16g1mHA=='},\n", + " {'label': 'thehindu',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/3-2',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEAlCtejIOwzHPUOAXi7oLu469wYzGUJN86oxtrB6YCAHKAocfkxog6XZeXOUjAl9MTY2_jU5igYEOpyy5RZV2jhxGHtahvQGi8Bq0XkJmaFvludGqwpuBn-vFf-MR3As1CXu9GZNh0TW5f3eLPgvDjB6N3IoYaGhGT8BUiqSyZS6k41T-vL9h6fEFMoOFUYhG2S0AfuVZDuyF2nJHJP1WVWZS42csWXEJUDxqhYjyzmx33HaCxKk0Rbe3_Ovc_Kgdagw=='},\n", + " {'label': 'wikipedia',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/3-4',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGEIQE8ljNdOpLHYgNFDjPekNZfDVP_W7aAbZgzTSgSraVNbalzctN2llZ3do9v9r7sRqxOXioKpebZrVCBnux58qbMLK8wpc4MmOKDRG3bAD8hwE7xMl_InBIfHuIMbuZ_twEC'},\n", + " {'label': 'thehindu',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/3-5',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEMtKj653gIrpD8CpAaGVkViYwCyEhmCj8w_zAO27Y874XFgkkvvuoVtNU8EXpJiVPDKnShMChgFWK7PnBV3QvbRcOYN268OM1yuPY9DK17q4-9-oGuqw_TYIaEECQxe5JpzVXGBtNidMqlMxM902_iqlm5wQnzMjMO8Vuqj5V3MdMdYj9O_rde6dkewGJFWGMZvPHAySCCMoZPoERD5ErPcaRjpyFQp7VjKoUWvG-mBQkBEn7NP93nxb49ZKVqpt_JhQPlk2HTq-yVyXxh_loL1JE6'},\n", + " {'label': 'beinsports',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/3-1',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXExRli0zGmQZlemPPItRH3qShabB-QVHrgUAECeXIs3GUKgd2oIHd45-ULY--TosnkRkiM-XHqZlPxeQlOV6Ktgxb-L5r9Hhf8M-nQS_T0N7NK0BeynreRZtFivuKzwwOByq6uALzoVtombjsREMmsPG7s07CMlMrQjyJCVX8McNdnGC7-mdlHEjdfXN4sgi-YGxdxCdAxaHUaMQxPL0GUUmqDzMMpzVC_lRnrYfuk17UhXI9QhsEi3TMeuUgHu3kl16g1mHA=='},\n", + " {'label': 'uefa',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/3-0',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGKGygrv0aVjWa7JUdwqtuttcPxVIiVFb2_Mxv32q-4AyOVwd8oMKLXq6sl2kw4A37lHLmUUQYqVfDMkX3DLXr4or1Xpx1lnOpIUanPjOtrr2Hk6tPPc0308hdE0xJ5CClC220Tz30xD6538_DOvrVWqfA7pV7x651519Zz37wgqYhN00Ah3LX4QZnW981_-SM8tjVSLDXutPphZBXXmMehNgUynvNd2IiGB9UtkLyGeWINIqR2F7lejStuXJ8U2Q=='},\n", + " {'label': 'uefa',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/3-6',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXH4pOTdyyQxNadaQjyKh8oQuOvZAoJv3h8lUaUpf_DBGcg11x3NZ3be0osuI4NKZmKmtGvI4IXelQLdf0gHIZB2h6x13iHVuz5kCoohIkFmaL2HaKjkQlzZw3KDIAr8j3KoVbWNXnx34wDW2qtFTmECR6UBkLFiy0VEjcYwowJ_8ex10JM14KzcvA=='},\n", + " {'label': 'uefa',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/3-7',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXE1pV-r8eRyTFjoRu12FcAetb5Lb1qPrl-GdPkb649C5b4zo99jtjYGI4y5B2EiF6SE413Ct9omXh3NwD0-r8rGqOMROSYEsfwUaFafM10vFtJGs_eWVcMMLVqgqNELj9BrG4JeBEHbYjDRSlCmVMQcWbIHC28goFDBa-dqi3Q='},\n", + " {'label': 'uefa',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/3-0',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGKGygrv0aVjWa7JUdwqtuttcPxVIiVFb2_Mxv32q-4AyOVwd8oMKLXq6sl2kw4A37lHLmUUQYqVfDMkX3DLXr4or1Xpx1lnOpIUanPjOtrr2Hk6tPPc0308hdE0xJ5CClC220Tz30xD6538_DOvrVWqfA7pV7x651519Zz37wgqYhN00Ah3LX4QZnW981_-SM8tjVSLDXutPphZBXXmMehNgUynvNd2IiGB9UtkLyGeWINIqR2F7lejStuXJ8U2Q=='},\n", + " {'label': 'beinsports',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/3-1',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXExRli0zGmQZlemPPItRH3qShabB-QVHrgUAECeXIs3GUKgd2oIHd45-ULY--TosnkRkiM-XHqZlPxeQlOV6Ktgxb-L5r9Hhf8M-nQS_T0N7NK0BeynreRZtFivuKzwwOByq6uALzoVtombjsREMmsPG7s07CMlMrQjyJCVX8McNdnGC7-mdlHEjdfXN4sgi-YGxdxCdAxaHUaMQxPL0GUUmqDzMMpzVC_lRnrYfuk17UhXI9QhsEi3TMeuUgHu3kl16g1mHA=='},\n", + " {'label': 'thehindu',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/3-2',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEAlCtejIOwzHPUOAXi7oLu469wYzGUJN86oxtrB6YCAHKAocfkxog6XZeXOUjAl9MTY2_jU5igYEOpyy5RZV2jhxGHtahvQGi8Bq0XkJmaFvludGqwpuBn-vFf-MR3As1CXu9GZNh0TW5f3eLPgvDjB6N3IoYaGhGT8BUiqSyZS6k41T-vL9h6fEFMoOFUYhG2S0AfuVZDuyF2nJHJP1WVWZS42csWXEJUDxqhYjyzmx33HaCxKk0Rbe3_Ovc_Kgdagw=='},\n", + " {'label': 'youtube',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-0',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGFcidniPKtBR-_QjSR1P1Oathq_0T9FTwfpCAWZxbXsroItHQU8zRcyOPDgMcvsWoD2fEnwYFKwanV18ep2_cyS5BlHF6-OFNsijWb-peAgsgLAVRiubekRnzMugsYtiWrhZyO3Q=='},\n", + " {'label': 'aljazeera',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-1',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEk7ApC7Y41UOrTWJ40wP2rsT0VDxqhqF-WJEI-FNKW7SNpR7LoA22sRQecS8hZNeZ_-62Vh7X75RmcmZUtnAOuQunrLAsETkkSx5l75dt9ESgTRkIURwtu4Pew7hn8yFz_LY_FJXUpmRfoWP7MWrDfPHcKrOpfmKqONj6mJcASNvAfCZ0p6qK3K4PvKWye6NyBMyYxWCuJig=='},\n", + " {'label': 'foxsports',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-2',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHh_4hBL0Giyuw_cyfT8m7tUSnMqBqH4Lis1CtJICPJNGGLhT6PADTIoUtrj3Rl5qcKNE9T6rzOmedAER_gxJOBDrCF8pnr9lUvhYvmDJxYCJzELkE5rTap4dx6FzOIKZKm1QBp5aHXzd_LCkSTV9ag7Q1A6_t8Vjdbskch6ZG3BoIfjYDQSPgRKDNFAAwt5J07cVFV5pDQzggmM7pxwsUz4drz'},\n", + " {'label': 'wikipedia',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-3',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGd9ZQky3X7RQLbTs6mY1i4Pg7ppcI5H_vtxpvQPiEyD8Qw0f7hjvn3QeoOeAVcCG_pEt5Aeu8ofWCgjwQy4_u6qU-NOOJsYPWOW94XcvtkmKiv46vbNkJF-Mb4OpvBztrDa28BfIdCGHdfF9o='},\n", + " {'label': 'youtube',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-4',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGZc-qDhRx_v3mPelXEfAVmWCpNTa_rzUKundc0pRc7PlTgppymao-_wO7O1oPaAhJYLcZkazIg8T5jA6t9OGgOxUd_Vl88BjouHsot0OK8TlM5hmPf4ECMWGeJthqVwndE3h4wdQ=='},\n", + " {'label': 'uefa',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-5',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXG1Lj9FnmuckfU0k1NC_ThQBZVxFCppp4tPl4FCcM3JZGF9aPvn9ZNFUo0fLfqw4Adt63Cdv8thcFSbsBRcf3rj1sz4LALJvrGfh6OayGo0KJ-UEKmKoOz8cxj5nIILCzKjFh2_0ZgTwrf1pkhhYbnWqj2E8hrVN4S5_sxvlCpLXPxjTsE4R0gYKXH_utqqm1NBkpl3p-C9v6kz-zm6V-JJoePAppIXFICF0DMYjOIBA9Mj0z4yO9Y9Tdgx2oaP'},\n", + " {'label': 'olympics',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-6',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFARil0pwjYQuFrDObawlDzu-eVtUPC4_nINjcXT-mlTL3MDgVPI83UB8gWS1rzGZkaMEmAUIeAzo2ihpMXUsWibzVzeAdQ7nUyqAOq0En87kpfuISduBuWI3__7yJw-vmdApD56-_G2ZhhZC4d_ll2iyNBaZHxxdNqXbb76mUiq99xV0hdoPEkp9RLk7T-uYYfTYXa8oYCXy2ysa9SZDa9hffEHrVe'},\n", + " {'label': 'youtube',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/0-7',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFgwKo5lPes5M_GObnkYEzn3QYn1kpTQpx42ANaNqvNMgRsB1Xp2TIXI82SYTSYuLd9ysgKfmlJJy3lcLxrmNBg1R_Z37PCO9vbqIBIbw6DKqMif7pHdtDTS7FUq69c29hkYb_b5w=='},\n", + " {'label': 'aljazeera',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-0',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFY5CRvcfjdkBz3h8Md_PscguyZ7LtYrxeHHP3eagcmIOnjaMyZbOHFqUAsa2cgkwvb26FZTvGiRgLKNLfiAsH1oP-5kGwnL6Ejhm4ZXhWGg0R3yE_8zkIKde4RgjIXlBvQW4kZ-LI5yhag-ESoh771z6hob8AigAVXT7WeWABMlQNfcbyG_UZIkqAs18U5e6to44ruNbSyDIyd5gobsVpEmdU256oVxa9d7co='},\n", + " {'label': 'coachesvoice',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-1',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHxgpkZWF64tZ8-iypkI2fiFi2cpsj4AFjZXkcYUzf5hSOWYb5etIbCoZd_L6zDJi6mWWisxAO6T5V4T8H7XiRow6dmVqXpSEIKhPSdG0HAQbQK74lwxeV_uXx9fSPllIKPOs2tFNRqTuHdJBNcwpcJp6MJbVLEskyhYnWlyOd9ouQv'},\n", + " {'label': 'aljazeera',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-2',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEV-g6Hxxcan5Xre1yYGM3BtP3fo9uF2zHQ9sVeK_4poD-aBN5CRvhz471beYCC26wdrjhtbiCvDT9dAnPI-ruyqJZhwB3vbKS5HCFb9tPn7Dkj99LpjLXqYyuzbFGsHCbr5SCHoMEhNg--dMU7xB5TiH8HeqKH8B4lk_h00dqhEVQFb05w5TuLtbX1UdXN6NDzHlFN_xyXzOU='},\n", + " {'label': 'wikipedia',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-3',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFNtaBQTFVnSbEW5Bbo8LUIs0h5cv4Pc4aS6Q8qG7jIMCsJPKy5_o6R8x7Z_xQ7AuDEAFlj2JY_AVV1YpwLqtXZxiAyvpfboH_VuMpo6MVbQAu2ZASSSD2slWaIqsUGkTEaPa2z2809z7UhEWUL'},\n", + " {'label': 'newsbytesapp',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/1-5',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFIl5Xc3f44I1nYw_YrJqkByrRl20SiAopZqjfJIK6U62o27CrxLvxaJ4v1M7L5eOfTMMlBCHHYCUooPoG0aObaeRG3YxrcoFT7Xtd4KIrvCS6AWWRpOZasCW-sGtFA56DEDf-qbJ8lsXEJ4GQ386iGTdRkyK9EtJWw1mRpDu7dfPQ6Qy1hNIqTgTdo-3yq1WNmWEl8Xtnag0s='},\n", + " {'label': 'bet9ja',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/2-0',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFgj0MP_IEmC842xTfmMPnbybBGYTUb_wEpwJ58keX5x_qPfUmC7Zz0o6IQeQ8TEqoRpv-Uq6oOqfbazu_aP0fMhP7UrSln6rB4SRvCRC327tM1LNaXpiXN-h6xlg0TN_-AWQORV4PSH7G5u2qD_NaNEWkz_oaEHxj22-qOam52fwRvqISOdoFDNTptlM6t0BbhcA=='},\n", + " {'label': 'uefa',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/3-0',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGKGygrv0aVjWa7JUdwqtuttcPxVIiVFb2_Mxv32q-4AyOVwd8oMKLXq6sl2kw4A37lHLmUUQYqVfDMkX3DLXr4or1Xpx1lnOpIUanPjOtrr2Hk6tPPc0308hdE0xJ5CClC220Tz30xD6538_DOvrVWqfA7pV7x651519Zz37wgqYhN00Ah3LX4QZnW981_-SM8tjVSLDXutPphZBXXmMehNgUynvNd2IiGB9UtkLyGeWINIqR2F7lejStuXJ8U2Q=='},\n", + " {'label': 'beinsports',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/3-1',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXExRli0zGmQZlemPPItRH3qShabB-QVHrgUAECeXIs3GUKgd2oIHd45-ULY--TosnkRkiM-XHqZlPxeQlOV6Ktgxb-L5r9Hhf8M-nQS_T0N7NK0BeynreRZtFivuKzwwOByq6uALzoVtombjsREMmsPG7s07CMlMrQjyJCVX8McNdnGC7-mdlHEjdfXN4sgi-YGxdxCdAxaHUaMQxPL0GUUmqDzMMpzVC_lRnrYfuk17UhXI9QhsEi3TMeuUgHu3kl16g1mHA=='},\n", + " {'label': 'thehindu',\n", + " 'short_url': 'https://vertexaisearch.cloud.google.com/id/3-2',\n", + " 'value': 'https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEAlCtejIOwzHPUOAXi7oLu469wYzGUJN86oxtrB6YCAHKAocfkxog6XZeXOUjAl9MTY2_jU5igYEOpyy5RZV2jhxGHtahvQGi8Bq0XkJmaFvludGqwpuBn-vFf-MR3As1CXu9GZNh0TW5f3eLPgvDjB6N3IoYaGhGT8BUiqSyZS6k41T-vL9h6fEFMoOFUYhG2S0AfuVZDuyF2nJHJP1WVWZS42csWXEJUDxqhYjyzmx33HaCxKk0Rbe3_Ovc_Kgdagw=='}],\n", + " 'initial_search_query_count': 3,\n", + " 'max_research_loops': 3,\n", + " 'research_loop_count': 2}" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "state" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "Spain won the UEFA Euro 2024 tournament [youtube](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGFcidniPKtBR-_QjSR1P1Oathq_0T9FTwfpCAWZxbXsroItHQU8zRcyOPDgMcvsWoD2fEnwYFKwanV18ep2_cyS5BlHF6-OFNsijWb-peAgsgLAVRiubekRnzMugsYtiWrhZyO3Q==) [aljazeera](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEk7ApC7Y41UOrTWJ40wP2rsT0VDxqhqF-WJEI-FNKW7SNpR7LoA22sRQecS8hZNeZ_-62Vh7X75RmcmZUtnAOuQunrLAsETkkSx5l75dt9ESgTRkIURwtu4Pew7hn8yFz_LY_FJXUpmRfoWP7MWrDfPHcKrOpfmKqONj6mJcASNvAfCZ0p6qK3K4PvKWye6NyBMyYxWCuJig==) [foxsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHh_4hBL0Giyuw_cyfT8m7tUSnMqBqH4Lis1CtJICPJNGGLhT6PADTIoUtrj3Rl5qcKNE9T6rzOmedAER_gxJOBDrCF8pnr9lUvhYvmDJxYCJzELkE5rTap4dx6FzOIKZKm1QBp5aHXzd_LCkSTV9ag7Q1A6_t8Vjdbskch6ZG3BoIfjYDQSPgRKDNFAAwt5J07cVFV5pDQzggmM7pxwsUz4drz) [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGd9ZQky3X7RQLbTs6mY1i4Pg7ppcI5H_vtxpvQPiEyD8Qw0f7hjvn3QeoOeAVcCG_pEt5Aeu8ofWCgjwQy4_u6qU-NOOJsYPWOW94XcvtkmKiv46vbNkJF-Mb4OpvBztrDa28BfIdCGHdfF9o=) [youtube](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGZc-qDhRx_v3mPelXEfAVmWCpNTa_rzUKundc0pRc7PlTgppymao-_wO7O1oPaAhJYLcZkazIg8T5jA6t9OGgOxUd_Vl88BjouHsot0OK8TlM5hmPf4ECMWGeJthqVwndE3h4wdQ==) [uefa](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXG1Lj9FnmuckfU0k1NC_ThQBZVxFCppp4tPl4FCcM3JZGF9aPvn9ZNFUo0fLfqw4Adt63Cdv8thcFSbsBRcf3rj1sz4LALJvrGfh6OayGo0KJ-UEKmKoOz8cxj5nIILCzKjFh2_0ZgTwrf1pkhhYbnWqj2E8hrVN4S5_sxvlCpLXPxjTsE4R0gYKXH_utqqm1NBkpl3p-C9v6kz-zm6V-JJoePAppIXFICF0DMYjOIBA9Mj0z4yO9Y9Tdgx2oaP) [aljazeera](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFY5CRvcfjdkBz3h8Md_PscguyZ7LtYrxeHHP3eagcmIOnjaMyZbOHFqUAsa2cgkwvb26FZTvGiRgLKNLfiAsH1oP-5kGwnL6Ejhm4ZXhWGg0R3yE_8zkIKde4RgjIXlBvQW4kZ-LI5yhag-ESoh771z6hob8AigAVXT7WeWABMlQNfcbyG_UZIkqAs18U5e6to44ruNbSyDIyd5gobsVpEmdU256oVxa9d7co=) [coachesvoice](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHxgpkZWF64tZ8-iypkI2fiFi2cpsj4AFjZXkcYUzf5hSOWYb5etIbCoZd_L6zDJi6mWWisxAO6T5V4T8H7XiRow6dmVqXpSEIKhPSdG0HAQbQK74lwxeV_uXx9fSPllIKPOs2tFNRqTuHdJBNcwpcJp6MJbVLEskyhYnWlyOd9ouQv) [aljazeera](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEV-g6Hxxcan5Xre1yYGM3BtP3fo9uF2zHQ9sVeK_4poD-aBN5CRvhz471beYCC26wdrjhtbiCvDT9dAnPI-ruyqJZhwB3vbKS5HCFb9tPn7Dkj99LpjLXqYyuzbFGsHCbr5SCHoMEhNg--dMU7xB5TiH8HeqKH8B4lk_h00dqhEVQFb05w5TuLtbX1UdXN6NDzHlFN_xyXzOU=) [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFNtaBQTFVnSbEW5Bbo8LUIs0h5cv4Pc4aS6Q8qG7jIMCsJPKy5_o6R8x7Z_xQ7AuDEAFlj2JY_AVV1YpwLqtXZxiAyvpfboH_VuMpo6MVbQAu2ZASSSD2slWaIqsUGkTEaPa2z2809z7UhEWUL).\n", + "\n", + "In the final match held in Berlin, Germany, Spain defeated England 2-1 [olympics](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFARil0pwjYQuFrDObawlDzu-eVtUPC4_nINjcXT-mlTL3MDgVPI83UB8gWS1rzGZkaMEmAUIeAzo2ihpMXUsWibzVzeAdQ7nUyqAOq0En87kpfuISduBuWI3__7yJw-vmdApD56-_G2ZhhZC4d_ll2iyNBaZHxxdNqXbb76mUiq99xV0hdoPEkp9RLk7T-uYYfTYXa8oYCXy2ysa9SZDa9hffEHrVe) [aljazeera](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEk7ApC7Y41UOrTWJ40wP2rsT0VDxqhqF-WJEI-FNKW7SNpR7LoA22sRQecS8hZNeZ_-62Vh7X75RmcmZUtnAOuQunrLAsETkkSx5l75dt9ESgTRkIURwtu4Pew7hn8yFz_LY_FJXUpmRfoWP7MWrDfPHcKrOpfmKqONj6mJcASNvAfCZ0p6qK3K4PvKWye6NyBMyYxWCuJig==) [foxsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHh_4hBL0Giyuw_cyfT8m7tUSnMqBqH4Lis1CtJICPJNGGLhT6PADTIoUtrj3Rl5qcKNE9T6rzOmedAER_gxJOBDrCF8pnr9lUvhYvmDJxYCJzELkE5rTap4dx6FzOIKZKm1QBp5aHXzd_LCkSTV9ag7Q1A6_t8Vjdbskch6ZG3BoIfjYDQSPgRKDNFAAwt5J07cVFV5pDQzggmM7pxwsUz4drz) [aljazeera](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFY5CRvcfjdkBz3h8Md_PscguyZ7LtYrxeHHP3eagcmIOnjaMyZbOHFqUAsa2cgkwvb26FZTvGiRgLKNLfiAsH1oP-5kGwnL6Ejhm4ZXhWGg0R3yE_8zkIKde4RgjIXlBvQW4kZ-LI5yhag-ESoh771z6hob8AigAVXT7WeWABMlQNfcbyG_UZIkqAs18U5e6to44ruNbSyDIyd5gobsVpEmdU256oVxa9d7co=) [coachesvoice](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHxgpkZWF64tZ8-iypkI2fiFi2cpsj4AFjZXkcYUzf5hSOWYb5etIbCoZd_L6zDJi6mWWisxAO6T5V4T8H7XiRow6dmVqXpSEIKhPSdG0HAQbQK74lwxeV_uXx9fSPllIKPOs2tFNRqTuHdJBNcwpcJp6MJbVLEskyhYnWlyOd9ouQv) [aljazeera](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEV-g6Hxxcan5Xre1yYGM3BtP3fo9uF2zHQ9sVeK_4poD-aBN5CRvhz471beYCC26wdrjhtbiCvDT9dAnPI-ruyqJZhwB3vbKS5HCFb9tPn7Dkj99LpjLXqYyuzbFGsHCbr5SCHoMEhNg--dMU7xB5TiH8HeqKH8B4lk_h00dqhEVQFb05w5TuLtbX1UdXN6NDzHlFN_xyXzOU=) [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFNtaBQTFVnSbEW5Bbo8LUIs0h5cv4Pc4aS6Q8qG7jIMCsJPKy5_o6R8x7Z_xQ7AuDEAFlj2JY_AVV1YpwLqtXZxiAyvpfboH_VuMpo6MVbQAu2ZASSSD2slWaIqsUGkTEaPa2z2809z7UhEWUL). Nico Williams scored the opening goal for Spain, and Mikel Oyarzabal scored the winning goal [youtube](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGFcidniPKtBR-_QjSR1P1Oathq_0T9FTwfpCAWZxbXsroItHQU8zRcyOPDgMcvsWoD2fEnwYFKwanV18ep2_cyS5BlHF6-OFNsijWb-peAgsgLAVRiubekRnzMugsYtiWrhZyO3Q==) [aljazeera](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEk7ApC7Y41UOrTWJ40wP2rsT0VDxqhqF-WJEI-FNKW7SNpR7LoA22sRQecS8hZNeZ_-62Vh7X75RmcmZUtnAOuQunrLAsETkkSx5l75dt9ESgTRkIURwtu4Pew7hn8yFz_LY_FJXUpmRfoWP7MWrDfPHcKrOpfmKqONj6mJcASNvAfCZ0p6qK3K4PvKWye6NyBMyYxWCuJig==) [foxsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHh_4hBL0Giyuw_cyfT8m7tUSnMqBqH4Lis1CtJICPJNGGLhT6PADTIoUtrj3Rl5qcKNE9T6rzOmedAER_gxJOBDrCF8pnr9lUvhYvmDJxYCJzELkE5rTap4dx6FzOIKZKm1QBp5aHXzd_LCkSTV9ag7Q1A6_t8Vjdbskch6ZG3BoIfjYDQSPgRKDNFAAwt5J07cVFV5pDQzggmM7pxwsUz4drz). Cole Palmer scored England's only goal [olympics](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFARil0pwjYQuFrDObawlDzu-eVtUPC4_nINjcXT-mlTL3MDgVPI83UB8gWS1rzGZkaMEmAUIeAzo2ihpMXUsWibzVzeAdQ7nUyqAOq0En87kpfuISduBuWI3__7yJw-vmdApD56-_G2ZhhZC4d_ll2iyNBaZHxxdNqXbb76mUiq99xV0hdoPEkp9RLk7T-uYYfTYXa8oYCXy2ysa9SZDa9hffEHrVe) [aljazeera](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEk7ApC7Y41UOrTWJ40wP2rsT0VDxqhqF-WJEI-FNKW7SNpR7LoA22sRQecS8hZNeZ_-62Vh7X75RmcmZUtnAOuQunrLAsETkkSx5l75dt9ESgTRkIURwtu4Pew7hn8yFz_LY_FJXUpmRfoWP7MWrDfPHcKrOpfmKqONj6mJcASNvAfCZ0p6qK3K4PvKWye6NyBMyYxWCuJig==) [foxsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHh_4hBL0Giyuw_cyfT8m7tUSnMqBqH4Lis1CtJICPJNGGLhT6PADTIoUtrj3Rl5qcKNE9T6rzOmedAER_gxJOBDrCF8pnr9lUvhYvmDJxYCJzELkE5rTap4dx6FzOIKZKm1QBp5aHXzd_LCkSTV9ag7Q1A6_t8Vjdbskch6ZG3BoIfjYDQSPgRKDNFAAwt5J07cVFV5pDQzggmM7pxwsUz4drz).\n", + "\n", + "This victory marked Spain's record fourth European Championship title [youtube](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGFcidniPKtBR-_QjSR1P1Oathq_0T9FTwfpCAWZxbXsroItHQU8zRcyOPDgMcvsWoD2fEnwYFKwanV18ep2_cyS5BlHF6-OFNsijWb-peAgsgLAVRiubekRnzMugsYtiWrhZyO3Q==) [aljazeera](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEk7ApC7Y41UOrTWJ40wP2rsT0VDxqhqF-WJEI-FNKW7SNpR7LoA22sRQecS8hZNeZ_-62Vh7X75RmcmZUtnAOuQunrLAsETkkSx5l75dt9ESgTRkIURwtu4Pew7hn8yFz_LY_FJXUpmRfoWP7MWrDfPHcKrOpfmKqONj6mJcASNvAfCZ0p6qK3K4PvKWye6NyBMyYxWCuJig==) [foxsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHh_4hBL0Giyuw_cyfT8m7tUSnMqBqH4Lis1CtJICPJNGGLhT6PADTIoUtrj3Rl5qcKNE9T6rzOmedAER_gxJOBDrCF8pnr9lUvhYvmDJxYCJzELkE5rTap4dx6FzOIKZKm1QBp5aHXzd_LCkSTV9ag7Q1A6_t8Vjdbskch6ZG3BoIfjYDQSPgRKDNFAAwt5J07cVFV5pDQzggmM7pxwsUz4drz) [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGd9ZQky3X7RQLbTs6mY1i4Pg7ppcI5H_vtxpvQPiEyD8Qw0f7hjvn3QeoOeAVcCG_pEt5Aeu8ofWCgjwQy4_u6qU-NOOJsYPWOW94XcvtkmKiv46vbNkJF-Mb4OpvBztrDa28BfIdCGHdfF9o=) [youtube](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGZc-qDhRx_v3mPelXEfAVmWCpNTa_rzUKundc0pRc7PlTgppymao-_wO7O1oPaAhJYLcZkazIg8T5jA6t9OGgOxUd_Vl88BjouHsot0OK8TlM5hmPf4ECMWGeJthqVwndE3h4wdQ==) [uefa](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXG1Lj9FnmuckfU0k1NC_ThQBZVxFCppp4tPl4FCcM3JZGF9aPvn9ZNFUo0fLfqw4Adt63Cdv8thcFSbsBRcf3rj1sz4LALJvrGfh6OayGo0KJ-UEKmKoOz8cxj5nIILCzKjFh2_0ZgTwrf1pkhhYbnWqj2E8hrVN4S5_sxvlCpLXPxjTsE4R0gYKXH_utqqm1NBkpl3p-C9v6kz-zm6V-JJoePAppIXFICF0DMYjOIBA9Mj0z4yO9Y9Tdgx2oaP) [aljazeera](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFY5CRvcfjdkBz3h8Md_PscguyZ7LtYrxeHHP3eagcmIOnjaMyZbOHFqUAsa2cgkwvb26FZTvGiRgLKNLfiAsH1oP-5kGwnL6Ejhm4ZXhWGg0R3yE_8zkIKde4RgjIXlBvQW4kZ-LI5yhag-ESoh771z6hob8AigAVXT7WeWABMlQNfcbyG_UZIkqAs18U5e6to44ruNbSyDIyd5gobsVpEmdU256oVxa9d7co=) [coachesvoice](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHxgpkZWF64tZ8-iypkI2fiFi2cpsj4AFjZXkcYUzf5hSOWYb5etIbCoZd_L6zDJi6mWWisxAO6T5V4T8H7XiRow6dmVqXpSEIKhPSdG0HAQbQK74lwxeV_uXx9fSPllIKPOs2tFNRqTuHdJBNcwpcJp6MJbVLEskyhYnWlyOd9ouQv) [aljazeera](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEV-g6Hxxcan5Xre1yYGM3BtP3fo9uF2zHQ9sVeK_4poD-aBN5CRvhz471beYCC26wdrjhtbiCvDT9dAnPI-ruyqJZhwB3vbKS5HCFb9tPn7Dkj99LpjLXqYyuzbFGsHCbr5SCHoMEhNg--dMU7xB5TiH8HeqKH8B4lk_h00dqhEVQFb05w5TuLtbX1UdXN6NDzHlFN_xyXzOU=) [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFNtaBQTFVnSbEW5Bbo8LUIs0h5cv4Pc4aS6Q8qG7jIMCsJPKy5_o6R8x7Z_xQ7AuDEAFlj2JY_AVV1YpwLqtXZxiAyvpfboH_VuMpo6MVbQAu2ZASSSD2slWaIqsUGkTEaPa2z2809z7UhEWUL). Spain achieved this by winning all seven of their matches throughout the tournament [youtube](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFgwKo5lPes5M_GObnkYEzn3QYn1kpTQpx42ANaNqvNMgRsB1Xp2TIXI82SYTSYuLd9ysgKfmlJJy3lcLxrmNBg1R_Z37PCO9vbqIBIbw6DKqMif7pHdtDTS7FUq69c29hkYb_b5w==) [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGd9ZQky3X7RQLbTs6mY1i4Pg7ppcI5H_vtxpvQPiEyD8Qw0f7hjvn3QeoOeAVcCG_pEt5Aeu8ofWCgjwQy4_u6qU-NOOJsYPWOW94XcvtkmKiv46vbNkJF-Mb4OpvBztrDa28BfIdCGHdfF9o=) [youtube](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGZc-qDhRx_v3mPelXEfAVmWCpNTa_rzUKundc0pRc7PlTgppymao-_wO7O1oPaAhJYLcZkazIg8T5jA6t9OGgOxUd_Vl88BjouHsot0OK8TlM5hmPf4ECMWGeJthqVwndE3h4wdQ==) [uefa](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXG1Lj9FnmuckfU0k1NC_ThQBZVxFCppp4tPl4FCcM3JZGF9aPvn9ZNFUo0fLfqw4Adt63Cdv8thcFSbsBRcf3rj1sz4LALJvrGfh6OayGo0KJ-UEKmKoOz8cxj5nIILCzKjFh2_0ZgTwrf1pkhhYbnWqj2E8hrVN4S5_sxvlCpLXPxjTsE4R0gYKXH_utqqm1NBkpl3p-C9v6kz-zm6V-JJoePAppIXFICF0DMYjOIBA9Mj0z4yO9Y9Tdgx2oaP) [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFNtaBQTFVnSbEW5Bbo8LUIs0h5cv4Pc4aS6Q8qG7jIMCsJPKy5_o6R8x7Z_xQ7AuDEAFlj2JY_AVV1YpwLqtXZxiAyvpfboH_VuMpo6MVbQAu2ZASSSD2slWaIqsUGkTEaPa2z2809z7UhEWUL) [newsbytesapp](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFIl5Xc3f44I1nYw_YrJqkByrRl20SiAopZqjfJIK6U62o27CrxLvxaJ4v1M7L5eOfTMMlBCHHYCUooPoG0aObaeRG3YxrcoFT7Xtd4KIrvCS6AWWRpOZasCW-sGtFA56DEDf-qbJ8lsXEJ4GQ386iGTdRkyK9EtJWw1mRpDu7dfPQ6Qy1hNIqTgTdo-3yq1WNmWEl8Xtnag0s=).\n", + "\n", + "Key individual awards for the tournament went to Spain's players: Rodri was named the Best Player, and Lamine Yamal was named the Best Young Player [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEk7ApC7Y41UOrTWJ40wP2rsT0VDxqhqF-WJEI-FNKW7SNpR7LoA22sRQecS8hZNeZ_-62Vh7X75RmcmZUtnAOuQunrLAsETkkSx5l75dt9ESgTRkIURwtu4Pew7hn8yFz_LY_FJXUpmRfoWP7MWrDfPHcKrOpfmKqONj6mJcASNvAfCZ0p6qK3K4PvKWye6NyBMyYxWCuJig==0) [bet9ja](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFgj0MP_IEmC842xTfmMPnbybBGYTUb_wEpwJ58keX5x_qPfUmC7Zz0o6IQeQ8TEqoRpv-Uq6oOqfbazu_aP0fMhP7UrSln6rB4SRvCRC327tM1LNaXpiXN-h6xlg0TN_-AWQORV4PSH7G5u2qD_NaNEWkz_oaEHxj22-qOam52fwRvqISOdoFDNTptlM6t0BbhcA==) [uefa](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGKGygrv0aVjWa7JUdwqtuttcPxVIiVFb2_Mxv32q-4AyOVwd8oMKLXq6sl2kw4A37lHLmUUQYqVfDMkX3DLXr4or1Xpx1lnOpIUanPjOtrr2Hk6tPPc0308hdE0xJ5CClC220Tz30xD6538_DOvrVWqfA7pV7x651519Zz37wgqYhN00Ah3LX4QZnW981_-SM8tjVSLDXutPphZBXXmMehNgUynvNd2IiGB9UtkLyGeWINIqR2F7lejStuXJ8U2Q==) [beinsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXExRli0zGmQZlemPPItRH3qShabB-QVHrgUAECeXIs3GUKgd2oIHd45-ULY--TosnkRkiM-XHqZlPxeQlOV6Ktgxb-L5r9Hhf8M-nQS_T0N7NK0BeynreRZtFivuKzwwOByq6uALzoVtombjsREMmsPG7s07CMlMrQjyJCVX8McNdnGC7-mdlHEjdfXN4sgi-YGxdxCdAxaHUaMQxPL0GUUmqDzMMpzVC_lRnrYfuk17UhXI9QhsEi3TMeuUgHu3kl16g1mHA==) [thehindu](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEAlCtejIOwzHPUOAXi7oLu469wYzGUJN86oxtrB6YCAHKAocfkxog6XZeXOUjAl9MTY2_jU5igYEOpyy5RZV2jhxGHtahvQGi8Bq0XkJmaFvludGqwpuBn-vFf-MR3As1CXu9GZNh0TW5f3eLPgvDjB6N3IoYaGhGT8BUiqSyZS6k41T-vL9h6fEFMoOFUYhG2S0AfuVZDuyF2nJHJP1WVWZS42csWXEJUDxqhYjyzmx33HaCxKk0Rbe3_Ovc_Kgdagw==)." + ], + "text/plain": [ + "" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import Markdown\n", + "\n", + "Markdown(state[\"messages\"][-1].content)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "state = graph.invoke({\"messages\": state[\"messages\"] + [{\"role\": \"user\", \"content\": \"How has the most titles? List the top 5\"}]})" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "Based on the number of UEFA European Championship titles won, Spain holds the record [olympics](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHoAXOG7_3DUjYvRr_buN8IAL3xE5yQoPetZCb1KlcaMOgJEE5BeBoqQEVVkDZLDpwgTmFkPYeWS7i_D23Vd5bKzUTfc0HSLI481VbXjMD9ECeZRFZ17g3xAYLg5I0QU34RWLCRcV_zgphUsJZ0L5gXjpYz5gl8syuYAX3VkHCwh0x6Wqau4er_cZ56CoiA-3S_r2I=) [sportsadda](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEYq2a0benYn0vF2WrfvmqEsgwriQ08aVcDdpS1MUjBxlzaV_scV0ldVeUpwqcgVLCfxgX3oVmbUxbkFPzeHbknsAbxLFk4Iyvtxgacx54AZBnL1szGQ9cQQGOOT8f-zGZhzKWEhAIOYTsz89uAr55R546MlC31OFXiU7AGhMgLi0Ekk6wQvPJVTWs_TiaG4MHoHo0obaRhJK1iPYaAxqHKD2Zf5rTr2jmdPBPd9w==) [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXG_0rXuWu0vsaIzCzaUG9Rw0L65I3o3RWhCp4gzXiHDZW3GaJXLntEQNi-O88mGf5LlE0tAkMNd_5VBNOkzIxAkbVsdkpPjwtzuY1sjv2gjtHLnvbIa8Y9jFbdS8kE3xqj95_TayzxNWpyr-XkwY9qLW4NI) [yahoo](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEN_wi1zong77ArtYg3CR5q-wmd_1KK_G72jrRoZv8_QlUFZUvjqyDXL5Co8RzGzWRzP9To5pq0kSBorMh3qgNVcOLGuCbF3giTuegc9yb0k9JqiOTFNYINKJQNAAmMo2ZziC5Iu_F1S5cpLJkKgCXLKk3VLkhqY-hSV1h_ryZRIMjENlsw7Q0=) [sportingnews](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFAkEqJsPiiUSSUWhHm2Qtc30qed2JljSZ9Nu4JrcJ--CkX_Rif1AO5L0Kxl09j6yo8n5MS9NWdFsXi7KRIg5EJL0d0jm8YA-E4sllbJojNNQDwII8cb1A3b9b5RP3JoFTp2xEYQu914rrEFmRmjsFb44LU8bgGFJijrBG237B67YqLXiQThCPZjP-Gq3BKv3cTxZKseIXSRjaxosiM4LDpxDxZPAdpeIIpb3aiH7w_IyC8dWXpCyoHZYZfYe6EGNXfkmE=) [foxsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXF2tzG9OJk8Y6nPflMmiUEr826naRNP0ncayg9rczFwi4d_IOq9k99b_7K4ISJPMpAOTzV_VCw8H33rEC6z2N99GWxlB7evrGw__IwY8ZILaE4kYzojFvnmrvRwEdAQsRU2xkUH2AM_VDc6bXduEQBjjkHRi1XFwuY5OvVbGImLznn0dEidu45aQ0Kq) [sportingnews](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGCVmrxZzE4ELt_Nl2fd2hYXp7QBGE7bqB8y4I0CRyiGrIB4dMu7krUBEuukEN1Go8KCJme8GuKl3dNqiW-UD7oR6MNWR47NKy1wqoNBxzrgZ2q1nnmjCAqxSeNejx_KTeAkiRVjUBXOQApJL_gUDI4Lwl3BCGcmlNVZGcuP88YN09iuu_stghqGJ7ulc6rUpHEZy9w0SpxUzexpKo27306oSXBPvvYVX6VnltFWvASMRsDfmD3dc94t715Ig04wFvaSIicHg==) [nbcsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHgdp86b29MgI2_Kvo4j5P0Iz8d3W8YgVkRwx31hZAoC9_dL-zyj_jP1vbDkxBiCA8kYArwSMPRVetYZR9WYYAwm3VwowkVtH7slpfObvQLnlHb2SQ386cBdZeZBZmEhgvVFE07YR4Z83RgohnOi26cW1BsZiRYlm1Adh1pgWtiNeiUl7ZNUMxtMQ5XvBx0GM1FpBd1QPsnhjU-pwNz-7ETG_XhsC7ocHEgWyMozF0cJOsEoR-Uye62Q0M=).\n", + "\n", + "Here are the top countries ranked by the number of UEFA European Championship titles:\n", + "\n", + "1. **Spain:** 4 titles (1964, 2008, 2012, 2024) [olympics](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHoAXOG7_3DUjYvRr_buN8IAL3xE5yQoPetZCb1KlcaMOgJEE5BeBoqQEVVkDZLDpwgTmFkPYeWS7i_D23Vd5bKzUTfc0HSLI481VbXjMD9ECeZRFZ17g3xAYLg5I0QU34RWLCRcV_zgphUsJZ0L5gXjpYz5gl8syuYAX3VkHCwh0x6Wqau4er_cZ56CoiA-3S_r2I=) [sportsadda](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEYq2a0benYn0vF2WrfvmqEsgwriQ08aVcDdpS1MUjBxlzaV_scV0ldVeUpwqcgVLCfxgX3oVmbUxbkFPzeHbknsAbxLFk4Iyvtxgacx54AZBnL1szGQ9cQQGOOT8f-zGZhzKWEhAIOYTsz89uAr55R546MlC31OFXiU7AGhMgLi0Ekk6wQvPJVTWs_TiaG4MHoHo0obaRhJK1iPYaAxqHKD2Zf5rTr2jmdPBPd9w==) [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXG_0rXuWu0vsaIzCzaUG9Rw0L65I3o3RWhCp4gzXiHDZW3GaJXLntEQNi-O88mGf5LlE0tAkMNd_5VBNOkzIxAkbVsdkpPjwtzuY1sjv2gjtHLnvbIa8Y9jFbdS8kE3xqj95_TayzxNWpyr-XkwY9qLW4NI) [yahoo](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEN_wi1zong77ArtYg3CR5q-wmd_1KK_G72jrRoZv8_QlUFZUvjqyDXL5Co8RzGzWRzP9To5pq0kSBorMh3qgNVcOLGuCbF3giTuegc9yb0k9JqiOTFNYINKJQNAAmMo2ZziC5Iu_F1S5cpLJkKgCXLKk3VLkhqY-hSV1h_ryZRIMjENlsw7Q0=) [sportingnews](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFAkEqJsPiiUSSUWhHm2Qtc30qed2JljSZ9Nu4JrcJ--CkX_Rif1AO5L0Kxl09j6yo8n5MS9NWdFsXi7KRIg5EJL0d0jm8YA-E4sllbJojNNQDwII8cb1A3b9b5RP3JoFTp2xEYQu914rrEFmRmjsFb44LU8bgGFJijrBG237B67YqLXiQThCPZjP-Gq3BKv3cTxZKseIXSRjaxosiM4LDpxDxZPAdpeIIpb3aiH7w_IyC8dWXpCyoHZYZfYe6EGNXfkmE=) [foxsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXF2tzG9OJk8Y6nPflMmiUEr826naRNP0ncayg9rczFwi4d_IOq9k99b_7K4ISJPMpAOTzV_VCw8H33rEC6z2N99GWxlB7evrGw__IwY8ZILaE4kYzojFvnmrvRwEdAQsRU2xkUH2AM_VDc6bXduEQBjjkHRi1XFwuY5OvVbGImLznn0dEidu45aQ0Kq) [sportingnews](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXGCVmrxZzE4ELt_Nl2fd2hYXp7QBGE7bqB8y4I0CRyiGrIB4dMu7krUBEuukEN1Go8KCJme8GuKl3dNqiW-UD7oR6MNWR47NKy1wqoNBxzrgZ2q1nnmjCAqxSeNejx_KTeAkiRVjUBXOQApJL_gUDI4Lwl3BCGcmlNVZGcuP88YN09iuu_stghqGJ7ulc6rUpHEZy9w0SpxUzexpKo27306oSXBPvvYVX6VnltFWvASMRsDfmD3dc94t715Ig04wFvaSIicHg==) [nbcsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHgdp86b29MgI2_Kvo4j5P0Iz8d3W8YgVkRwx31hZAoC9_dL-zyj_jP1vbDkxBiCA8kYArwSMPRVetYZR9WYYAwm3VwowkVtH7slpfObvQLnlHb2SQ386cBdZeZBZmEhgvVFE07YR4Z83RgohnOi26cW1BsZiRYlm1Adh1pgWtiNeiUl7ZNUMxtMQ5XvBx0GM1FpBd1QPsnhjU-pwNz-7ETG_XhsC7ocHEgWyMozF0cJOsEoR-Uye62Q0M=). Spain is also the only nation to have won consecutive titles (2008 and 2012) [sportsadda](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEYq2a0benYn0vF2WrfvmqEsgwriQ08aVcDdpS1MUjBxlzaV_scV0ldVeUpwqcgVLCfxgX3oVmbUxbkFPzeHbknsAbxLFk4Iyvtxgacx54AZBnL1szGQ9cQQGOOT8f-zGZhzKWEhAIOYTsz89uAr55R546MlC31OFXiU7AGhMgLi0Ekk6wQvPJVTWs_TiaG4MHoHo0obaRhJK1iPYaAxqHKD2Zf5rTr2jmdPBPd9w==) [topendsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFvGr1KOv5qWkUO63kL5-QFEKn41IArXdrcLcMuaCc69bmwu_VsGzE7QI4scHdLjQxYxoFD3eg4ZflqzFcnNk7UJKM5cT8IR13LrrWodcNzotVidnczmVCFCd1-w10ixHS2rgykLdSr8UqFNJ88T2hZL-HL6YCLUUAXJjFP) [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXG_0rXuWu0vsaIzCzaUG9Rw0L65I3o3RWhCp4gzXiHDZW3GaJXLntEQNi-O88mGf5LlE0tAkMNd_5VBNOkzIxAkbVsdkpPjwtzuY1sjv2gjtHLnvbIa8Y9jFbdS8kE3xqj95_TayzxNWpyr-XkwY9qLW4NI) [topendsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHD7IG-bFCCNoc-2iRxXvo468klJLjiQmPdQCkRubtvT83i-Xbpg5XKxyLQB9Yc7qVwRuLjHIB37ywnZ8fdT3fM2ydpLggvdTGxAUVL1M0havCvEQpxiqcmS9LaBnOqWnMOWyy_ztdfTrVihPRb0chKtGeDHA-2EMQlW9ge) [foxsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXF2tzG9OJk8Y6nPflMmiUEr826naRNP0ncayg9rczFwi4d_IOq9k99b_7K4ISJPMpAOTzV_VCw8H33rEC6z2N99GWxlB7evrGw__IwY8ZILaE4kYzojFvnmrvRwEdAQsRU2xkUH2AM_VDc6bXduEQBjjkHRi1XFwuY5OvVbGImLznn0dEidu45aQ0Kq) [nbcsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHgdp86b29MgI2_Kvo4j5P0Iz8d3W8YgVkRwx31hZAoC9_dL-zyj_jP1vbDkxBiCA8kYArwSMPRVetYZR9WYYAwm3VwowkVtH7slpfObvQLnlHb2SQ386cBdZeZBZmEhgvVFE07YR4Z83RgohnOi26cW1BsZiRYlm1Adh1pgWtiNeiUl7ZNUMxtMQ5XvBx0GM1FpBd1QPsnhjU-pwNz-7ETG_XhsC7ocHEgWyMozF0cJOsEoR-Uye62Q0M=).\n", + "2. **Germany:** 3 titles (1972, 1980, 1996) [olympics](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHoAXOG7_3DUjYvRr_buN8IAL3xE5yQoPetZCb1KlcaMOgJEE5BeBoqQEVVkDZLDpwgTmFkPYeWS7i_D23Vd5bKzUTfc0HSLI481VbXjMD9ECeZRFZ17g3xAYLg5I0QU34RWLCRcV_zgphUsJZ0L5gXjpYz5gl8syuYAX3VkHCwh0x6Wqau4er_cZ56CoiA-3S_r2I=) [sportsadda](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEYq2a0benYn0vF2WrfvmqEsgwriQ08aVcDdpS1MUjBxlzaV_scV0ldVeUpwqcgVLCfxgX3oVmbUxbkFPzeHbknsAbxLFk4Iyvtxgacx54AZBnL1szGQ9cQQGOOT8f-zGZhzKWEhAIOYTsz89uAr55R546MlC31OFXiU7AGhMgLi0Ekk6wQvPJVTWs_TiaG4MHoHo0obaRhJK1iPYaAxqHKD2Zf5rTr2jmdPBPd9w==) [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXG_0rXuWu0vsaIzCzaUG9Rw0L65I3o3RWhCp4gzXiHDZW3GaJXLntEQNi-O88mGf5LlE0tAkMNd_5VBNOkzIxAkbVsdkpPjwtzuY1sjv2gjtHLnvbIa8Y9jFbdS8kE3xqj95_TayzxNWpyr-XkwY9qLW4NI) [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFXDSskdzRBS66rtxun9egUAz7spzUcDjq30yCoOdFr_SzKkrXBLgAPbzZKVQhx-Z28pOO3phMnr-qIhLuS9zJrp0MTCyIohI6EYxlJ3DpFXTNxneDn9OzNs7sZX_LwKKYA2E-7Mjr46dqZuprKzRn9amiPHusHo3dRWKpOzMSfhXpO) [topendsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHD7IG-bFCCNoc-2iRxXvo468klJLjiQmPdQCkRubtvT83i-Xbpg5XKxyLQB9Yc7qVwRuLjHIB37ywnZ8fdT3fM2ydpLggvdTGxAUVL1M0havCvEQpxiqcmS9LaBnOqWnMOWyy_ztdfTrVihPRb0chKtGeDHA-2EMQlW9ge) [yahoo](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEN_wi1zong77ArtYg3CR5q-wmd_1KK_G72jrRoZv8_QlUFZUvjqyDXL5Co8RzGzWRzP9To5pq0kSBorMh3qgNVcOLGuCbF3giTuegc9yb0k9JqiOTFNYINKJQNAAmMo2ZziC5Iu_F1S5cpLJkKgCXLKk3VLkhqY-hSV1h_ryZRIMjENlsw7Q0=) [sportingnews](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFAkEqJsPiiUSSUWhHm2Qtc30qed2JljSZ9Nu4JrcJ--CkX_Rif1AO5L0Kxl09j6yo8n5MS9NWdFsXi7KRIg5EJL0d0jm8YA-E4sllbJojNNQDwII8cb1A3b9b5RP3JoFTp2xEYQu914rrEFmRmjsFb44LU8bgGFJijrBG237B67YqLXiQThCPZjP-Gq3BKv3cTxZKseIXSRjaxosiM4LDpxDxZPAdpeIIpb3aiH7w_IyC8dWXpCyoHZYZfYe6EGNXfkmE=) [foxsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXF2tzG9OJk8Y6nPflMmiUEr826naRNP0ncayg9rczFwi4d_IOq9k99b_7K4ISJPMpAOTzV_VCw8H33rEC6z2N99GWxlB7evrGw__IwY8ZILaE4kYzojFvnmrvRwEdAQsRU2xkUH2AM_VDc6bXduEQBjjkHRi1XFwuY5OvVbGImLznn0dEidu45aQ0Kq) [sportskeeda](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFIIs54t2O4RL3Y8cvfgbTs_CjcMeedsitpXc8PsaUZXOA7sohYdYTdTiN1-kLAhtXi2UZT4A-iIPZ6ufIpvuD_53Qtr4zqZnqZ6ox74EgyOPyjxs9k1qS_Gq1kR57IdjnMG4JbC7y9nVq2xZRNevSC-PJLSfCoLc36ahu6Xp6Fssl1Yw8LjgX2ranBbG72OvyijpJj1UygG-SVqr7h0y-DECQ=) [youtube](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXETMGJq-qIccM3rUu2XPme69mRXj51ItevakpVZcxWa26F74sDgeP3slSuSCccKFyv9Xx5P1r4-3kY4ckWQclfnA3leE1ctTGdnIn-5GBRQrjxIwNSlKADP46pBTqgg_LhybRo2at4=). (Note: The first two titles were won as West Germany) [sportsadda](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEYq2a0benYn0vF2WrfvmqEsgwriQ08aVcDdpS1MUjBxlzaV_scV0ldVeUpwqcgVLCfxgX3oVmbUxbkFPzeHbknsAbxLFk4Iyvtxgacx54AZBnL1szGQ9cQQGOOT8f-zGZhzKWEhAIOYTsz89uAr55R546MlC31OFXiU7AGhMgLi0Ekk6wQvPJVTWs_TiaG4MHoHo0obaRhJK1iPYaAxqHKD2Zf5rTr2jmdPBPd9w==) [byfarthegreatestteam](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHbs0yJwq86sGLUvo-8IgZfAus8ZnQcTe_dDlaZhfp7awMYMvU3mq8EL4VYyYWhahCYeRlACi-5eOq4maub0x3GsfKHvhgLBe8KOJG7f-CaPLRKjmRFPRNS2sig2ZCw6VXQeyLq_JWgmbIof5uLvNFqs_qOwFwqZvSmqWKbEnrw2dXMdEmsLKprFbsvAwd9GdMzFr9HojBPpSSk95SzVt2a849gqAGFyIq89tv-mirQaMRqwVUL).\n", + "3. **Italy:** 2 titles (1968, 2021) [olympics](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHoAXOG7_3DUjYvRr_buN8IAL3xE5yQoPetZCb1KlcaMOgJEE5BeBoqQEVVkDZLDpwgTmFkPYeWS7i_D23Vd5bKzUTfc0HSLI481VbXjMD9ECeZRFZ17g3xAYLg5I0QU34RWLCRcV_zgphUsJZ0L5gXjpYz5gl8syuYAX3VkHCwh0x6Wqau4er_cZ56CoiA-3S_r2I=) [topendsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFvGr1KOv5qWkUO63kL5-QFEKn41IArXdrcLcMuaCc69bmwu_VsGzE7QI4scHdLjQxYxoFD3eg4ZflqzFcnNk7UJKM5cT8IR13LrrWodcNzotVidnczmVCFCd1-w10ixHS2rgykLdSr8UqFNJ88T2hZL-HL6YCLUUAXJjFP) [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXG_0rXuWu0vsaIzCzaUG9Rw0L65I3o3RWhCp4gzXiHDZW3GaJXLntEQNi-O88mGf5LlE0tAkMNd_5VBNOkzIxAkbVsdkpPjwtzuY1sjv2gjtHLnvbIa8Y9jFbdS8kE3xqj95_TayzxNWpyr-XkwY9qLW4NI) [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFXDSskdzRBS66rtxun9egUAz7spzUcDjq30yCoOdFr_SzKkrXBLgAPbzZKVQhx-Z28pOO3phMnr-qIhLuS9zJrp0MTCyIohI6EYxlJ3DpFXTNxneDn9OzNs7sZX_LwKKYA2E-7Mjr46dqZuprKzRn9amiPHusHo3dRWKpOzMSfhXpO) [topendsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHD7IG-bFCCNoc-2iRxXvo468klJLjiQmPdQCkRubtvT83i-Xbpg5XKxyLQB9Yc7qVwRuLjHIB37ywnZ8fdT3fM2ydpLggvdTGxAUVL1M0havCvEQpxiqcmS9LaBnOqWnMOWyy_ztdfTrVihPRb0chKtGeDHA-2EMQlW9ge) [sportingnews](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFAkEqJsPiiUSSUWhHm2Qtc30qed2JljSZ9Nu4JrcJ--CkX_Rif1AO5L0Kxl09j6yo8n5MS9NWdFsXi7KRIg5EJL0d0jm8YA-E4sllbJojNNQDwII8cb1A3b9b5RP3JoFTp2xEYQu914rrEFmRmjsFb44LU8bgGFJijrBG237B67YqLXiQThCPZjP-Gq3BKv3cTxZKseIXSRjaxosiM4LDpxDxZPAdpeIIpb3aiH7w_IyC8dWXpCyoHZYZfYe6EGNXfkmE=) [foxsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXF2tzG9OJk8Y6nPflMmiUEr826naRNP0ncayg9rczFwi4d_IOq9k99b_7K4ISJPMpAOTzV_VCw8H33rEC6z2N99GWxlB7evrGw__IwY8ZILaE4kYzojFvnmrvRwEdAQsRU2xkUH2AM_VDc6bXduEQBjjkHRi1XFwuY5OvVbGImLznn0dEidu45aQ0Kq) [sportskeeda](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFIIs54t2O4RL3Y8cvfgbTs_CjcMeedsitpXc8PsaUZXOA7sohYdYTdTiN1-kLAhtXi2UZT4A-iIPZ6ufIpvuD_53Qtr4zqZnqZ6ox74EgyOPyjxs9k1qS_Gq1kR57IdjnMG4JbC7y9nVq2xZRNevSC-PJLSfCoLc36ahu6Xp6Fssl1Yw8LjgX2ranBbG72OvyijpJj1UygG-SVqr7h0y-DECQ=).\n", + "4. **France:** 2 titles (1984, 2000) [olympics](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHoAXOG7_3DUjYvRr_buN8IAL3xE5yQoPetZCb1KlcaMOgJEE5BeBoqQEVVkDZLDpwgTmFkPYeWS7i_D23Vd5bKzUTfc0HSLI481VbXjMD9ECeZRFZ17g3xAYLg5I0QU34RWLCRcV_zgphUsJZ0L5gXjpYz5gl8syuYAX3VkHCwh0x6Wqau4er_cZ56CoiA-3S_r2I=) [topendsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFvGr1KOv5qWkUO63kL5-QFEKn41IArXdrcLcMuaCc69bmwu_VsGzE7QI4scHdLjQxYxoFD3eg4ZflqzFcnNk7UJKM5cT8IR13LrrWodcNzotVidnczmVCFCd1-w10ixHS2rgykLdSr8UqFNJ88T2hZL-HL6YCLUUAXJjFP) [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXG_0rXuWu0vsaIzCzaUG9Rw0L65I3o3RWhCp4gzXiHDZW3GaJXLntEQNi-O88mGf5LlE0tAkMNd_5VBNOkzIxAkbVsdkpPjwtzuY1sjv2gjtHLnvbIa8Y9jFbdS8kE3xqj95_TayzxNWpyr-XkwY9qLW4NI) [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFXDSskdzRBS66rtxun9egUAz7spzUcDjq30yCoOdFr_SzKkrXBLgAPbzZKVQhx-Z28pOO3phMnr-qIhLuS9zJrp0MTCyIohI6EYxlJ3DpFXTNxneDn9OzNs7sZX_LwKKYA2E-7Mjr46dqZuprKzRn9amiPHusHo3dRWKpOzMSfhXpO) [topendsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHD7IG-bFCCNoc-2iRxXvo468klJLjiQmPdQCkRubtvT83i-Xbpg5XKxyLQB9Yc7qVwRuLjHIB37ywnZ8fdT3fM2ydpLggvdTGxAUVL1M0havCvEQpxiqcmS9LaBnOqWnMOWyy_ztdfTrVihPRb0chKtGeDHA-2EMQlW9ge) [sportingnews](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFAkEqJsPiiUSSUWhHm2Qtc30qed2JljSZ9Nu4JrcJ--CkX_Rif1AO5L0Kxl09j6yo8n5MS9NWdFsXi7KRIg5EJL0d0jm8YA-E4sllbJojNNQDwII8cb1A3b9b5RP3JoFTp2xEYQu914rrEFmRmjsFb44LU8bgGFJijrBG237B67YqLXiQThCPZjP-Gq3BKv3cTxZKseIXSRjaxosiM4LDpxDxZPAdpeIIpb3aiH7w_IyC8dWXpCyoHZYZfYe6EGNXfkmE=) [youtube](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXETMGJq-qIccM3rUu2XPme69mRXj51ItevakpVZcxWa26F74sDgeP3slSuSCccKFyv9Xx5P1r4-3kY4ckWQclfnA3leE1ctTGdnIn-5GBRQrjxIwNSlKADP46pBTqgg_LhybRo2at4=).\n", + "5. **Tied with 1 title each:**\n", + " * Soviet Union (1960) [olympics](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHoAXOG7_3DUjYvRr_buN8IAL3xE5yQoPetZCb1KlcaMOgJEE5BeBoqQEVVkDZLDpwgTmFkPYeWS7i_D23Vd5bKzUTfc0HSLI481VbXjMD9ECeZRFZ17g3xAYLg5I0QU34RWLCRcV_zgphUsJZ0L5gXjpYz5gl8syuYAX3VkHCwh0x6Wqau4er_cZ56CoiA-3S_r2I=) [topendsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFvGr1KOv5qWkUO63kL5-QFEKn41IArXdrcLcMuaCc69bmwu_VsGzE7QI4scHdLjQxYxoFD3eg4ZflqzFcnNk7UJKM5cT8IR13LrrWodcNzotVidnczmVCFCd1-w10ixHS2rgykLdSr8UqFNJ88T2hZL-HL6YCLUUAXJjFP) [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXG_0rXuWu0vsaIzCzaUG9Rw0L65I3o3RWhCp4gzXiHDZW3GaJXLntEQNi-O88mGf5LlE0tAkMNd_5VBNOkzIxAkbVsdkpPjwtzuY1sjv2gjtHLnvbIa8Y9jFbdS8kE3xqj95_TayzxNWpyr-XkwY9qLW4NI) [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFXDSskdzRBS66rtxun9egUAz7spzUcDjq30yCoOdFr_SzKkrXBLgAPbzZKVQhx-Z28pOO3phMnr-qIhLuS9zJrp0MTCyIohI6EYxlJ3DpFXTNxneDn9OzNs7sZX_LwKKYA2E-7Mjr46dqZuprKzRn9amiPHusHo3dRWKpOzMSfhXpO) [topendsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHD7IG-bFCCNoc-2iRxXvo468klJLjiQmPdQCkRubtvT83i-Xbpg5XKxyLQB9Yc7qVwRuLjHIB37ywnZ8fdT3fM2ydpLggvdTGxAUVL1M0havCvEQpxiqcmS9LaBnOqWnMOWyy_ztdfTrVihPRb0chKtGeDHA-2EMQlW9ge) [sportingnews](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFAkEqJsPiiUSSUWhHm2Qtc30qed2JljSZ9Nu4JrcJ--CkX_Rif1AO5L0Kxl09j6yo8n5MS9NWdFsXi7KRIg5EJL0d0jm8YA-E4sllbJojNNQDwII8cb1A3b9b5RP3JoFTp2xEYQu914rrEFmRmjsFb44LU8bgGFJijrBG237B67YqLXiQThCPZjP-Gq3BKv3cTxZKseIXSRjaxosiM4LDpxDxZPAdpeIIpb3aiH7w_IyC8dWXpCyoHZYZfYe6EGNXfkmE=) [sportskeeda](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFIIs54t2O4RL3Y8cvfgbTs_CjcMeedsitpXc8PsaUZXOA7sohYdYTdTiN1-kLAhtXi2UZT4A-iIPZ6ufIpvuD_53Qtr4zqZnqZ6ox74EgyOPyjxs9k1qS_Gq1kR57IdjnMG4JbC7y9nVq2xZRNevSC-PJLSfCoLc36ahu6Xp6Fssl1Yw8LjgX2ranBbG72OvyijpJj1UygG-SVqr7h0y-DECQ=)\n", + " * Czechoslovakia (1976) [olympics](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHoAXOG7_3DUjYvRr_buN8IAL3xE5yQoPetZCb1KlcaMOgJEE5BeBoqQEVVkDZLDpwgTmFkPYeWS7i_D23Vd5bKzUTfc0HSLI481VbXjMD9ECeZRFZ17g3xAYLg5I0QU34RWLCRcV_zgphUsJZ0L5gXjpYz5gl8syuYAX3VkHCwh0x6Wqau4er_cZ56CoiA-3S_r2I=) [topendsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFvGr1KOv5qWkUO63kL5-QFEKn41IArXdrcLcMuaCc69bmwu_VsGzE7QI4scHdLjQxYxoFD3eg4ZflqzFcnNk7UJKM5cT8IR13LrrWodcNzotVidnczmVCFCd1-w10ixHS2rgykLdSr8UqFNJ88T2hZL-HL6YCLUUAXJjFP) [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXG_0rXuWu0vsaIzCzaUG9Rw0L65I3o3RWhCp4gzXiHDZW3GaJXLntEQNi-O88mGf5LlE0tAkMNd_5VBNOkzIxAkbVsdkpPjwtzuY1sjv2gjtHLnvbIa8Y9jFbdS8kE3xqj95_TayzxNWpyr-XkwY9qLW4NI) [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFXDSskdzRBS66rtxun9egUAz7spzUcDjq30yCoOdFr_SzKkrXBLgAPbzZKVQhx-Z28pOO3phMnr-qIhLuS9zJrp0MTCyIohI6EYxlJ3DpFXTNxneDn9OzNs7sZX_LwKKYA2E-7Mjr46dqZuprKzRn9amiPHusHo3dRWKpOzMSfhXpO) [topendsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHD7IG-bFCCNoc-2iRxXvo468klJLjiQmPdQCkRubtvT83i-Xbpg5XKxyLQB9Yc7qVwRuLjHIB37ywnZ8fdT3fM2ydpLggvdTGxAUVL1M0havCvEQpxiqcmS9LaBnOqWnMOWyy_ztdfTrVihPRb0chKtGeDHA-2EMQlW9ge) [sportingnews](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFAkEqJsPiiUSSUWhHm2Qtc30qed2JljSZ9Nu4JrcJ--CkX_Rif1AO5L0Kxl09j6yo8n5MS9NWdFsXi7KRIg5EJL0d0jm8YA-E4sllbJojNNQDwII8cb1A3b9b5RP3JoFTp2xEYQu914rrEFmRmjsFb44LU8bgGFJijrBG237B67YqLXiQThCPZjP-Gq3BKv3cTxZKseIXSRjaxosiM4LDpxDxZPAdpeIIpb3aiH7w_IyC8dWXpCyoHZYZfYe6EGNXfkmE=) [sportskeeda](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFIIs54t2O4RL3Y8cvfgbTs_CjcMeedsitpXc8PsaUZXOA7sohYdYTdTiN1-kLAhtXi2UZT4A-iIPZ6ufIpvuD_53Qtr4zqZnqZ6ox74EgyOPyjxs9k1qS_Gq1kR57IdjnMG4JbC7y9nVq2xZRNevSC-PJLSfCoLc36ahu6Xp6Fssl1Yw8LjgX2ranBbG72OvyijpJj1UygG-SVqr7h0y-DECQ=)\n", + " * Netherlands (1988) [olympics](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHoAXOG7_3DUjYvRr_buN8IAL3xE5yQoPetZCb1KlcaMOgJEE5BeBoqQEVVkDZLDpwgTmFkPYeWS7i_D23Vd5bKzUTfc0HSLI481VbXjMD9ECeZRFZ17g3xAYLg5I0QU34RWLCRcV_zgphUsJZ0L5gXjpYz5gl8syuYAX3VkHCwh0x6Wqau4er_cZ56CoiA-3S_r2I=) [topendsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFvGr1KOv5qWkUO63kL5-QFEKn41IArXdrcLcMuaCc69bmwu_VsGzE7QI4scHdLjQxYxoFD3eg4ZflqzFcnNk7UJKM5cT8IR13LrrWodcNzotVidnczmVCFCd1-w10ixHS2rgykLdSr8UqFNJ88T2hZL-HL6YCLUUAXJjFP) [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXG_0rXuWu0vsaIzCzaUG9Rw0L65I3o3RWhCp4gzXiHDZW3GaJXLntEQNi-O88mGf5LlE0tAkMNd_5VBNOkzIxAkbVsdkpPjwtzuY1sjv2gjtHLnvbIa8Y9jFbdS8kE3xqj95_TayzxNWpyr-XkwY9qLW4NI) [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFXDSskdzRBS66rtxun9egUAz7spzUcDjq30yCoOdFr_SzKkrXBLgAPbzZKVQhx-Z28pOO3phMnr-qIhLuS9zJrp0MTCyIohI6EYxlJ3DpFXTNxneDn9OzNs7sZX_LwKKYA2E-7Mjr46dqZuprKzRn9amiPHusHo3dRWKpOzMSfhXpO) [topendsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHD7IG-bFCCNoc-2iRxXvo468klJLjiQmPdQCkRubtvT83i-Xbpg5XKxyLQB9Yc7qVwRuLjHIB37ywnZ8fdT3fM2ydpLggvdTGxAUVL1M0havCvEQpxiqcmS9LaBnOqWnMOWyy_ztdfTrVihPRb0chKtGeDHA-2EMQlW9ge) [sportingnews](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFAkEqJsPiiUSSUWhHm2Qtc30qed2JljSZ9Nu4JrcJ--CkX_Rif1AO5L0Kxl09j6yo8n5MS9NWdFsXi7KRIg5EJL0d0jm8YA-E4sllbJojNNQDwII8cb1A3b9b5RP3JoFTp2xEYQu914rrEFmRmjsFb44LU8bgGFJijrBG237B67YqLXiQThCPZjP-Gq3BKv3cTxZKseIXSRjaxosiM4LDpxDxZPAdpeIIpb3aiH7w_IyC8dWXpCyoHZYZfYe6EGNXfkmE=) [sportskeeda](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFIIs54t2O4RL3Y8cvfgbTs_CjcMeedsitpXc8PsaUZXOA7sohYdYTdTiN1-kLAhtXi2UZT4A-iIPZ6ufIpvuD_53Qtr4zqZnqZ6ox74EgyOPyjxs9k1qS_Gq1kR57IdjnMG4JbC7y9nVq2xZRNevSC-PJLSfCoLc36ahu6Xp6Fssl1Yw8LjgX2ranBbG72OvyijpJj1UygG-SVqr7h0y-DECQ=)\n", + " * Denmark (1992) [sportsadda](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEYq2a0benYn0vF2WrfvmqEsgwriQ08aVcDdpS1MUjBxlzaV_scV0ldVeUpwqcgVLCfxgX3oVmbUxbkFPzeHbknsAbxLFk4Iyvtxgacx54AZBnL1szGQ9cQQGOOT8f-zGZhzKWEhAIOYTsz89uAr55R546MlC31OFXiU7AGhMgLi0Ekk6wQvPJVTWs_TiaG4MHoHo0obaRhJK1iPYaAxqHKD2Zf5rTr2jmdPBPd9w==) [topendsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFvGr1KOv5qWkUO63kL5-QFEKn41IArXdrcLcMuaCc69bmwu_VsGzE7QI4scHdLjQxYxoFD3eg4ZflqzFcnNk7UJKM5cT8IR13LrrWodcNzotVidnczmVCFCd1-w10ixHS2rgykLdSr8UqFNJ88T2hZL-HL6YCLUUAXJjFP) [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXG_0rXuWu0vsaIzCzaUG9Rw0L65I3o3RWhCp4gzXiHDZW3GaJXLntEQNi-O88mGf5LlE0tAkMNd_5VBNOkzIxAkbVsdkpPjwtzuY1sjv2gjtHLnvbIa8Y9jFbdS8kE3xqj95_TayzxNWpyr-XkwY9qLW4NI) [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFXDSskdzRBS66rtxun9egUAz7spzUcDjq30yCoOdFr_SzKkrXBLgAPbzZKVQhx-Z28pOO3phMnr-qIhLuS9zJrp0MTCyIohI6EYxlJ3DpFXTNxneDn9OzNs7sZX_LwKKYA2E-7Mjr46dqZuprKzRn9amiPHusHo3dRWKpOzMSfhXpO) [topendsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHD7IG-bFCCNoc-2iRxXvo468klJLjiQmPdQCkRubtvT83i-Xbpg5XKxyLQB9Yc7qVwRuLjHIB37ywnZ8fdT3fM2ydpLggvdTGxAUVL1M0havCvEQpxiqcmS9LaBnOqWnMOWyy_ztdfTrVihPRb0chKtGeDHA-2EMQlW9ge) [sportingnews](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFAkEqJsPiiUSSUWhHm2Qtc30qed2JljSZ9Nu4JrcJ--CkX_Rif1AO5L0Kxl09j6yo8n5MS9NWdFsXi7KRIg5EJL0d0jm8YA-E4sllbJojNNQDwII8cb1A3b9b5RP3JoFTp2xEYQu914rrEFmRmjsFb44LU8bgGFJijrBG237B67YqLXiQThCPZjP-Gq3BKv3cTxZKseIXSRjaxosiM4LDpxDxZPAdpeIIpb3aiH7w_IyC8dWXpCyoHZYZfYe6EGNXfkmE=) [sportskeeda](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFIIs54t2O4RL3Y8cvfgbTs_CjcMeedsitpXc8PsaUZXOA7sohYdYTdTiN1-kLAhtXi2UZT4A-iIPZ6ufIpvuD_53Qtr4zqZnqZ6ox74EgyOPyjxs9k1qS_Gq1kR57IdjnMG4JbC7y9nVq2xZRNevSC-PJLSfCoLc36ahu6Xp6Fssl1Yw8LjgX2ranBbG72OvyijpJj1UygG-SVqr7h0y-DECQ=)\n", + " * Greece (2004) [olympics](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHoAXOG7_3DUjYvRr_buN8IAL3xE5yQoPetZCb1KlcaMOgJEE5BeBoqQEVVkDZLDpwgTmFkPYeWS7i_D23Vd5bKzUTfc0HSLI481VbXjMD9ECeZRFZ17g3xAYLg5I0QU34RWLCRcV_zgphUsJZ0L5gXjpYz5gl8syuYAX3VkHCwh0x6Wqau4er_cZ56CoiA-3S_r2I=) [topendsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFvGr1KOv5qWkUO63kL5-QFEKn41IArXdrcLcMuaCc69bmwu_VsGzE7QI4scHdLjQxYxoFD3eg4ZflqzFcnNk7UJKM5cT8IR13LrrWodcNzotVidnczmVCFCd1-w10ixHS2rgykLdSr8UqFNJ88T2hZL-HL6YCLUUAXJjFP) [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXG_0rXuWu0vsaIzCzaUG9Rw0L65I3o3RWhCp4gzXiHDZW3GaJXLntEQNi-O88mGf5LlE0tAkMNd_5VBNOkzIxAkbVsdkpPjwtzuY1sjv2gjtHLnvbIa8Y9jFbdS8kE3xqj95_TayzxNWpyr-XkwY9qLW4NI) [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFXDSskdzRBS66rtxun9egUAz7spzUcDjq30yCoOdFr_SzKkrXBLgAPbzZKVQhx-Z28pOO3phMnr-qIhLuS9zJrp0MTCyIohI6EYxlJ3DpFXTNxneDn9OzNs7sZX_LwKKYA2E-7Mjr46dqZuprKzRn9amiPHusHo3dRWKpOzMSfhXpO) [topendsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHD7IG-bFCCNoc-2iRxXvo468klJLjiQmPdQCkRubtvT83i-Xbpg5XKxyLQB9Yc7qVwRuLjHIB37ywnZ8fdT3fM2ydpLggvdTGxAUVL1M0havCvEQpxiqcmS9LaBnOqWnMOWyy_ztdfTrVihPRb0chKtGeDHA-2EMQlW9ge) [sportingnews](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFAkEqJsPiiUSSUWhHm2Qtc30qed2JljSZ9Nu4JrcJ--CkX_Rif1AO5L0Kxl09j6yo8n5MS9NWdFsXi7KRIg5EJL0d0jm8YA-E4sllbJojNNQDwII8cb1A3b9b5RP3JoFTp2xEYQu914rrEFmRmjsFb44LU8bgGFJijrBG237B67YqLXiQThCPZjP-Gq3BKv3cTxZKseIXSRjaxosiM4LDpxDxZPAdpeIIpb3aiH7w_IyC8dWXpCyoHZYZfYe6EGNXfkmE=) [sportskeeda](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFIIs54t2O4RL3Y8cvfgbTs_CjcMeedsitpXc8PsaUZXOA7sohYdYTdTiN1-kLAhtXi2UZT4A-iIPZ6ufIpvuD_53Qtr4zqZnqZ6ox74EgyOPyjxs9k1qS_Gq1kR57IdjnMG4JbC7y9nVq2xZRNevSC-PJLSfCoLc36ahu6Xp6Fssl1Yw8LjgX2ranBbG72OvyijpJj1UygG-SVqr7h0y-DECQ=)\n", + " * Portugal (2016) [sportsadda](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXEYq2a0benYn0vF2WrfvmqEsgwriQ08aVcDdpS1MUjBxlzaV_scV0ldVeUpwqcgVLCfxgX3oVmbUxbkFPzeHbknsAbxLFk4Iyvtxgacx54AZBnL1szGQ9cQQGOOT8f-zGZhzKWEhAIOYTsz89uAr55R546MlC31OFXiU7AGhMgLi0Ekk6wQvPJVTWs_TiaG4MHoHo0obaRhJK1iPYaAxqHKD2Zf5rTr2jmdPBPd9w==) [topendsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFvGr1KOv5qWkUO63kL5-QFEKn41IArXdrcLcMuaCc69bmwu_VsGzE7QI4scHdLjQxYxoFD3eg4ZflqzFcnNk7UJKM5cT8IR13LrrWodcNzotVidnczmVCFCd1-w10ixHS2rgykLdSr8UqFNJ88T2hZL-HL6YCLUUAXJjFP) [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXG_0rXuWu0vsaIzCzaUG9Rw0L65I3o3RWhCp4gzXiHDZW3GaJXLntEQNi-O88mGf5LlE0tAkMNd_5VBNOkzIxAkbVsdkpPjwtzuY1sjv2gjtHLnvbIa8Y9jFbdS8kE3xqj95_TayzxNWpyr-XkwY9qLW4NI) [wikipedia](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFXDSskdzRBS66rtxun9egUAz7spzUcDjq30yCoOdFr_SzKkrXBLgAPbzZKVQhx-Z28pOO3phMnr-qIhLuS9zJrp0MTCyIohI6EYxlJ3DpFXTNxneDn9OzNs7sZX_LwKKYA2E-7Mjr46dqZuprKzRn9amiPHusHo3dRWKpOzMSfhXpO) [topendsports](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXHD7IG-bFCCNoc-2iRxXvo468klJLjiQmPdQCkRubtvT83i-Xbpg5XKxyLQB9Yc7qVwRuLjHIB37ywnZ8fdT3fM2ydpLggvdTGxAUVL1M0havCvEQpxiqcmS9LaBnOqWnMOWyy_ztdfTrVihPRb0chKtGeDHA-2EMQlW9ge) [sportingnews](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFAkEqJsPiiUSSUWhHm2Qtc30qed2JljSZ9Nu4JrcJ--CkX_Rif1AO5L0Kxl09j6yo8n5MS9NWdFsXi7KRIg5EJL0d0jm8YA-E4sllbJojNNQDwII8cb1A3b9b5RP3JoFTp2xEYQu914rrEFmRmjsFb44LU8bgGFJijrBG237B67YqLXiQThCPZjP-Gq3BKv3cTxZKseIXSRjaxosiM4LDpxDxZPAdpeIIpb3aiH7w_IyC8dWXpCyoHZYZfYe6EGNXfkmE=) [sportskeeda](https://vertexaisearch.cloud.google.com/grounding-api-redirect/AbF9wXFIIs54t2O4RL3Y8cvfgbTs_CjcMeedsitpXc8PsaUZXOA7sohYdYTdTiN1-kLAhtXi2UZT4A-iIPZ6ufIpvuD_53Qtr4zqZnqZ6ox74EgyOPyjxs9k1qS_Gq1kR57IdjnMG4JbC7y9nVq2xZRNevSC-PJLSfCoLc36ahu6Xp6Fssl1Yw8LjgX2ranBbG72OvyijpJj1UygG-SVqr7h0y-DECQ=)\n", + "\n", + "Therefore, while Spain has the most titles, the top 5 ranking positions are held by Spain (1st), Germany (2nd), Italy and France (tied 3rd), and the six nations tied for 5th place." + ], + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Markdown(state[\"messages\"][-1].content)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/deepsearch.png b/deepsearch.png new file mode 100644 index 0000000000000000000000000000000000000000..ae13671de24f70548499dc3efdc71d10afc30fa2 GIT binary patch literal 108841 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%0A6O&)`dSB&2iCkd)%h)E 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 Lx7t^*$1Uo=XIvJ` literal 0 HcmV?d00001 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..0257468 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,41 @@ +volumes: + langgraph-data: + driver: local +services: + langgraph-redis: + image: docker.io/redis:6 + healthcheck: + test: redis-cli ping + interval: 5s + timeout: 1s + retries: 5 + langgraph-postgres: + image: docker.io/postgres:16 + ports: + - "5433:5432" + environment: + POSTGRES_DB: postgres + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + volumes: + - langgraph-data:/var/lib/postgresql/data + healthcheck: + test: pg_isready -U postgres + start_period: 10s + timeout: 1s + retries: 5 + interval: 5s + langgraph-api: + image: deepsearch + ports: + - "8123:8000" + depends_on: + langgraph-redis: + condition: service_healthy + langgraph-postgres: + condition: service_healthy + environment: + GEMINI_API_KEY: ${GEMINI_API_KEY} + LANGSMITH_API_KEY: ${LANGSMITH_API_KEY} + REDIS_URI: redis://langgraph-redis:6379 + POSTGRES_URI: postgres://postgres:postgres@langgraph-postgres:5432/postgres?sslmode=disable diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/frontend/.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/frontend/components.json b/frontend/components.json new file mode 100644 index 0000000..45874ee --- /dev/null +++ b/frontend/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "", + "css": "src/app.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "iconLibrary": "lucide" +} \ No newline at end of file diff --git a/frontend/eslint.config.js b/frontend/eslint.config.js new file mode 100644 index 0000000..092408a --- /dev/null +++ b/frontend/eslint.config.js @@ -0,0 +1,28 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' + +export default tseslint.config( + { ignores: ['dist'] }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended], + files: ['**/*.{ts,tsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, + }, +) diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..e4b78ea --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + TS + + +
+ + + diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 0000000..4859909 --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,5829 @@ +{ + "name": "frontend", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "frontend", + "version": "0.0.0", + "dependencies": { + "@langchain/core": "^0.3.55", + "@langchain/langgraph-sdk": "^0.0.74", + "@radix-ui/react-scroll-area": "^1.2.8", + "@radix-ui/react-select": "^2.2.4", + "@radix-ui/react-slot": "^1.2.2", + "@radix-ui/react-tabs": "^1.1.11", + "@radix-ui/react-tooltip": "^1.2.6", + "@tailwindcss/vite": "^4.1.5", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.508.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-markdown": "^9.0.3", + "react-router-dom": "^7.5.3", + "tailwind-merge": "^3.2.0", + "tailwindcss": "^4.1.5" + }, + "devDependencies": { + "@eslint/js": "^9.22.0", + "@types/node": "^22.15.17", + "@types/react": "^19.1.2", + "@types/react-dom": "^19.1.3", + "@vitejs/plugin-react-swc": "^3.9.0", + "eslint": "^9.22.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.19", + "globals": "^16.0.0", + "tw-animate-css": "^1.2.9", + "typescript": "~5.7.2", + "typescript-eslint": "^8.26.1", + "vite": "^6.3.4" + } + }, + "node_modules/@cfworker/json-schema": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@cfworker/json-schema/-/json-schema-4.1.1.tgz", + "integrity": "sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==", + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.3.tgz", + "integrity": "sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.3.tgz", + "integrity": "sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.3.tgz", + "integrity": "sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.3.tgz", + "integrity": "sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.3.tgz", + "integrity": "sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.3.tgz", + "integrity": "sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.3.tgz", + "integrity": "sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.3.tgz", + "integrity": "sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.3.tgz", + "integrity": "sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.3.tgz", + "integrity": "sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.3.tgz", + "integrity": "sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.3.tgz", + "integrity": "sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.3.tgz", + "integrity": "sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.3.tgz", + "integrity": "sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.3.tgz", + "integrity": "sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.3.tgz", + "integrity": "sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.3.tgz", + "integrity": "sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.3.tgz", + "integrity": "sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.3.tgz", + "integrity": "sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.3.tgz", + "integrity": "sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.3.tgz", + "integrity": "sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.3.tgz", + "integrity": "sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.3.tgz", + "integrity": "sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.3.tgz", + "integrity": "sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.3.tgz", + "integrity": "sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.6.1.tgz", + "integrity": "sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/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, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", + "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.1.tgz", + "integrity": "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", + "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.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": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.25.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.25.1.tgz", + "integrity": "sha512-dEIwmjntEx8u3Uvv+kr3PDeeArL8Hw07H9kyYxCjnM9pBjfEhk6uLXSchxxzgiwtRhhzVzqmUSDFBOi1TuZ7qg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", + "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.13.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.0.tgz", + "integrity": "sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.0.tgz", + "integrity": "sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.0", + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", + "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", + "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==", + "license": "MIT" + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "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, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", + "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@langchain/core": { + "version": "0.3.55", + "resolved": "https://registry.npmjs.org/@langchain/core/-/core-0.3.55.tgz", + "integrity": "sha512-SojY2ugpT6t9eYfFB9Ysvyhhyh+KJTGXs50hdHUE9tAEQWp3WAwoxe4djwJnOZ6fSpWYdpFt2UT2ksHVDy2vXA==", + "license": "MIT", + "dependencies": { + "@cfworker/json-schema": "^4.0.2", + "ansi-styles": "^5.0.0", + "camelcase": "6", + "decamelize": "1.2.0", + "js-tiktoken": "^1.0.12", + "langsmith": "^0.3.16", + "mustache": "^4.2.0", + "p-queue": "^6.6.2", + "p-retry": "4", + "uuid": "^10.0.0", + "zod": "^3.22.4", + "zod-to-json-schema": "^3.22.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@langchain/core/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@langchain/langgraph-sdk": { + "version": "0.0.74", + "resolved": "https://registry.npmjs.org/@langchain/langgraph-sdk/-/langgraph-sdk-0.0.74.tgz", + "integrity": "sha512-IUN0m4BYkGWdviFd4EaWDcQgxNq8z+1LIwXajCSt9B+Cb/pz0ZNpIPdu5hAIsf6a0RWu5yRUhzL1L40t7vu3Zg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.15", + "p-queue": "^6.6.2", + "p-retry": "4", + "uuid": "^9.0.0" + }, + "peerDependencies": { + "@langchain/core": ">=0.2.31 <0.4.0", + "react": "^18 || ^19" + }, + "peerDependenciesMeta": { + "@langchain/core": { + "optional": true + }, + "react": { + "optional": true + } + } + }, + "node_modules/@langchain/langgraph-sdk/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@radix-ui/number": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", + "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz", + "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.6.tgz", + "integrity": "sha512-2JMfHJf/eVnwq+2dewT3C0acmCWD3XiVA1Da+jTDqo342UlU13WvXtqHhG+yJw5JeQmu4ue2eMy6gcEArLBlcw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.6.tgz", + "integrity": "sha512-PbhRFK4lIEw9ADonj48tiYWzkllz81TM7KVYyyMMw2cwHO7D5h4XKEblL8NlaRisTK3QTe6tBEhDccFUryxHBQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-slot": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", + "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.9.tgz", + "integrity": "sha512-way197PiTvNp+WBP7svMJasHl+vibhWGQDb6Mgf5mhEWJkgb85z7Lfl9TUdkqpWsf8GRNmoopx9ZxCyDzmgRMQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.2.tgz", + "integrity": "sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.6.tgz", + "integrity": "sha512-r9zpYNUQY+2jWHWZGyddQLL9YHkM/XvSFHVcWs7bdVuxMAnCwTAuy6Pf47Z4nw7dYcUou1vg/VgjjrrH03VeBw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.6.tgz", + "integrity": "sha512-7iqXaOWIjDBfIG7aq8CUEeCSsQMLFdn7VEE8TaFz704DtEzpPHR7w/uuzRflvKgltqSAImgcmxQ7fFX3X7wasg==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.6", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-rect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.8.tgz", + "integrity": "sha512-hQsTUIn7p7fxCPvao/q6wpbxmCwgLrlz+nOrJgC+RwfZqWY/WN+UMqkXzrtKbPrF82P43eCTl3ekeKuyAQbFeg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.4.tgz", + "integrity": "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.2.tgz", + "integrity": "sha512-uHa+l/lKfxuDD2zjN/0peM/RhhSmRjr5YWdk/37EnSv1nJ88uvG85DPexSm8HdFQROd2VdERJ6ynXbkCFi+APw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.9.tgz", + "integrity": "sha512-ZzrIFnMYHHCNqSNCsuN6l7wlewBEq0O0BCSBkabJMFXVO51LRUTq71gLP1UxFvmrXElqmPjA5VX7IqC9VpazAQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-collection": "1.1.6", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-scroll-area": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.8.tgz", + "integrity": "sha512-K5h1RkYA6M0Sn61BV5LQs686zqBsSC0sGzL4/Gw4mNnjzrQcGSc6YXfC6CRFNaGydSdv5+M8cb0eNsOGo0OXtQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.4.tgz", + "integrity": "sha512-/OOm58Gil4Ev5zT8LyVzqfBcij4dTHYdeyuF5lMHZ2bIp0Lk9oETocYiJ5QC0dHekEQnK6L/FNJCceeb4AkZ6Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-collection": "1.1.6", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.9", + "@radix-ui/react-focus-guards": "1.1.2", + "@radix-ui/react-focus-scope": "1.1.6", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.6", + "@radix-ui/react-portal": "1.1.8", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-slot": "1.2.2", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.2.tgz", + "integrity": "sha512-y7TBO4xN4Y94FvcWIOIh18fM4R1A8S4q1jhoz4PNzOoHsFcN8pogcFmZrTYAm4F9VRUrWP/Mw7xSKybIeRI+CQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.11.tgz", + "integrity": "sha512-4FiKSVoXqPP/KfzlB7lwwqoFV6EPwkrrqGp9cUYXjwDYHhvpnqq79P+EPHKcdoTE7Rl8w/+6s9rTlsfXHES9GA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-roving-focus": "1.1.9", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.6.tgz", + "integrity": "sha512-zYb+9dc9tkoN2JjBDIIPLQtk3gGyz8FMKoqYTb8EMVQ5a5hBcdHPECrsZVI4NpPAUOixhkoqg7Hj5ry5USowfA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.9", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.6", + "@radix-ui/react-portal": "1.1.8", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.2", + "@radix-ui/react-slot": "1.2.2", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-visually-hidden": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", + "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", + "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", + "license": "MIT", + "dependencies": { + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", + "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.2.tgz", + "integrity": "sha512-ORCmRUbNiZIv6uV5mhFrhsIKw4UX/N3syZtyqvry61tbGm4JlgQuSn0hk5TwCARsCjkcnuRkSdCE3xfb+ADHew==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", + "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.1.tgz", + "integrity": "sha512-kxz0YeeCrRUHz3zyqvd7n+TVRlNyTifBsmnmNPtk3hQURUyG9eAB+usz6DAwagMusjx/zb3AjvDUvhFGDAexGw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.1.tgz", + "integrity": "sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.1.tgz", + "integrity": "sha512-VWXGISWFY18v/0JyNUy4A46KCFCb9NVsH+1100XP31lud+TzlezBbz24CYzbnA4x6w4hx+NYCXDfnvDVO6lcAA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.1.tgz", + "integrity": "sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.1.tgz", + "integrity": "sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.1.tgz", + "integrity": "sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.1.tgz", + "integrity": "sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.1.tgz", + "integrity": "sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.1.tgz", + "integrity": "sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.1.tgz", + "integrity": "sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.1.tgz", + "integrity": "sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.1.tgz", + "integrity": "sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.1.tgz", + "integrity": "sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.1.tgz", + "integrity": "sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.1.tgz", + "integrity": "sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.1.tgz", + "integrity": "sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.1.tgz", + "integrity": "sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.1.tgz", + "integrity": "sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.1.tgz", + "integrity": "sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.1.tgz", + "integrity": "sha512-ECyOuDeH3C1I8jH2MK1RtBJW+YPMvSfT0a5NN0nHfQYnDSJ6tUiZH3gzwVP5/Kfh/+Tt7tpWVF9LXNTnhTJ3kA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@swc/core": { + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.11.24.tgz", + "integrity": "sha512-MaQEIpfcEMzx3VWWopbofKJvaraqmL6HbLlw2bFZ7qYqYw3rkhM0cQVEgyzbHtTWwCwPMFZSC2DUbhlZgrMfLg==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.21" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.11.24", + "@swc/core-darwin-x64": "1.11.24", + "@swc/core-linux-arm-gnueabihf": "1.11.24", + "@swc/core-linux-arm64-gnu": "1.11.24", + "@swc/core-linux-arm64-musl": "1.11.24", + "@swc/core-linux-x64-gnu": "1.11.24", + "@swc/core-linux-x64-musl": "1.11.24", + "@swc/core-win32-arm64-msvc": "1.11.24", + "@swc/core-win32-ia32-msvc": "1.11.24", + "@swc/core-win32-x64-msvc": "1.11.24" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.17" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.11.24.tgz", + "integrity": "sha512-dhtVj0PC1APOF4fl5qT2neGjRLgHAAYfiVP8poJelhzhB/318bO+QCFWAiimcDoyMgpCXOhTp757gnoJJrheWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.11.24.tgz", + "integrity": "sha512-H/3cPs8uxcj2Fe3SoLlofN5JG6Ny5bl8DuZ6Yc2wr7gQFBmyBkbZEz+sPVgsID7IXuz7vTP95kMm1VL74SO5AQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.11.24.tgz", + "integrity": "sha512-PHJgWEpCsLo/NGj+A2lXZ2mgGjsr96ULNW3+T3Bj2KTc8XtMUkE8tmY2Da20ItZOvPNC/69KroU7edyo1Flfbw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.11.24.tgz", + "integrity": "sha512-C2FJb08+n5SD4CYWCTZx1uR88BN41ZieoHvI8A55hfVf2woT8+6ZiBzt74qW2g+ntZ535Jts5VwXAKdu41HpBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.11.24.tgz", + "integrity": "sha512-ypXLIdszRo0re7PNNaXN0+2lD454G8l9LPK/rbfRXnhLWDBPURxzKlLlU/YGd2zP98wPcVooMmegRSNOKfvErw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.11.24.tgz", + "integrity": "sha512-IM7d+STVZD48zxcgo69L0yYptfhaaE9cMZ+9OoMxirNafhKKXwoZuufol1+alEFKc+Wbwp+aUPe/DeWC/Lh3dg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.11.24.tgz", + "integrity": "sha512-DZByJaMVzSfjQKKQn3cqSeqwy6lpMaQDQQ4HPlch9FWtDx/dLcpdIhxssqZXcR2rhaQVIaRQsCqwV6orSDGAGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.11.24.tgz", + "integrity": "sha512-Q64Ytn23y9aVDKN5iryFi8mRgyHw3/kyjTjT4qFCa8AEb5sGUuSj//AUZ6c0J7hQKMHlg9do5Etvoe61V98/JQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.11.24.tgz", + "integrity": "sha512-9pKLIisE/Hh2vJhGIPvSoTK4uBSPxNVyXHmOrtdDot4E1FUUI74Vi8tFdlwNbaj8/vusVnb8xPXsxF1uB0VgiQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.11.24", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.11.24.tgz", + "integrity": "sha512-sybnXtOsdB+XvzVFlBVGgRHLqp3yRpHK7CrmpuDKszhj/QhmsaZzY/GHSeALlMtLup13M0gqbcQvsTNlAHTg3w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@swc/types": { + "version": "0.1.21", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.21.tgz", + "integrity": "sha512-2YEtj5HJVbKivud9N4bpPBAyZhj4S2Ipe5LkUG94alTpr7in/GU/EARgPAd3BwU+YOmFVJC2+kjqhGRi3r0ZpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.5.tgz", + "integrity": "sha512-CBhSWo0vLnWhXIvpD0qsPephiaUYfHUX3U9anwDaHZAeuGpTiB3XmsxPAN6qX7bFhipyGBqOa1QYQVVhkOUGxg==", + "license": "MIT", + "dependencies": { + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "lightningcss": "1.29.2", + "tailwindcss": "4.1.5" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.5.tgz", + "integrity": "sha512-1n4br1znquEvyW/QuqMKQZlBen+jxAbvyduU87RS8R3tUSvByAkcaMTkJepNIrTlYhD+U25K4iiCIxE6BGdRYA==", + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.5", + "@tailwindcss/oxide-darwin-arm64": "4.1.5", + "@tailwindcss/oxide-darwin-x64": "4.1.5", + "@tailwindcss/oxide-freebsd-x64": "4.1.5", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.5", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.5", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.5", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.5", + "@tailwindcss/oxide-linux-x64-musl": "4.1.5", + "@tailwindcss/oxide-wasm32-wasi": "4.1.5", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.5", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.5" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.5.tgz", + "integrity": "sha512-LVvM0GirXHED02j7hSECm8l9GGJ1RfgpWCW+DRn5TvSaxVsv28gRtoL4aWKGnXqwvI3zu1GABeDNDVZeDPOQrw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.5.tgz", + "integrity": "sha512-//TfCA3pNrgnw4rRJOqavW7XUk8gsg9ddi8cwcsWXp99tzdBAZW0WXrD8wDyNbqjW316Pk2hiN/NJx/KWHl8oA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.5.tgz", + "integrity": "sha512-XQorp3Q6/WzRd9OalgHgaqgEbjP3qjHrlSUb5k1EuS1Z9NE9+BbzSORraO+ecW432cbCN7RVGGL/lSnHxcd+7Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.5.tgz", + "integrity": "sha512-bPrLWbxo8gAo97ZmrCbOdtlz/Dkuy8NK97aFbVpkJ2nJ2Jo/rsCbu0TlGx8joCuA3q6vMWTSn01JY46iwG+clg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.5.tgz", + "integrity": "sha512-1gtQJY9JzMAhgAfvd/ZaVOjh/Ju/nCoAsvOVJenWZfs05wb8zq+GOTnZALWGqKIYEtyNpCzvMk+ocGpxwdvaVg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.5.tgz", + "integrity": "sha512-dtlaHU2v7MtdxBXoqhxwsWjav7oim7Whc6S9wq/i/uUMTWAzq/gijq1InSgn2yTnh43kR+SFvcSyEF0GCNu1PQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.5.tgz", + "integrity": "sha512-fg0F6nAeYcJ3CriqDT1iVrqALMwD37+sLzXs8Rjy8Z1ZHshJoYceodfyUwGJEsQoTyWbliFNRs2wMQNXtT7MVA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.5.tgz", + "integrity": "sha512-SO+F2YEIAHa1AITwc8oPwMOWhgorPzzcbhWEb+4oLi953h45FklDmM8dPSZ7hNHpIk9p/SCZKUYn35t5fjGtHA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.5.tgz", + "integrity": "sha512-6UbBBplywkk/R+PqqioskUeXfKcBht3KU7juTi1UszJLx0KPXUo10v2Ok04iBJIaDPkIFkUOVboXms5Yxvaz+g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.5.tgz", + "integrity": "sha512-hwALf2K9FHuiXTPqmo1KeOb83fTRNbe9r/Ixv9ZNQ/R24yw8Ge1HOWDDgTdtzntIaIUJG5dfXCf4g9AD4RiyhQ==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@emnapi/wasi-threads": "^1.0.2", + "@napi-rs/wasm-runtime": "^0.2.9", + "@tybys/wasm-util": "^0.9.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.5.tgz", + "integrity": "sha512-oDKncffWzaovJbkuR7/OTNFRJQVdiw/n8HnzaCItrNQUeQgjy7oUiYpsm9HUBgpmvmDpSSbGaCa2Evzvk3eFmA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.5.tgz", + "integrity": "sha512-WiR4dtyrFdbb+ov0LK+7XsFOsG+0xs0PKZKkt41KDn9jYpO7baE3bXiudPVkTqUEwNfiglCygQHl2jklvSBi7Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.5.tgz", + "integrity": "sha512-FE1stRoqdHSb7RxesMfCXE8icwI1W6zGE/512ae3ZDrpkQYTTYeSyUJPRCjZd8CwVAhpDUbi1YR8pcZioFJQ/w==", + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.1.5", + "@tailwindcss/oxide": "4.1.5", + "tailwindcss": "4.1.5" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.15.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.17.tgz", + "integrity": "sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/react": { + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.2.tgz", + "integrity": "sha512-oxLPMytKchWGbnQM9O7D67uPa9paTNxO7jVoNMXgkkErULBPhPARCfkKL9ytcIJJRGjbsVwW4ugJzyFFvm/Tiw==", + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.3.tgz", + "integrity": "sha512-rJXC08OG0h3W6wDMFxQrZF00Kq6qQvw0djHRdzl3U5DnIERz0MRce3WVc7IS6JYBwtaP/DwYtRRjVlvivNveKg==", + "devOptional": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.31.1.tgz", + "integrity": "sha512-oUlH4h1ABavI4F0Xnl8/fOtML/eu8nI2A1nYd+f+55XI0BLu+RIqKoCiZKNo6DtqZBEQm5aNKA20G3Z5w3R6GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.31.1", + "@typescript-eslint/type-utils": "8.31.1", + "@typescript-eslint/utils": "8.31.1", + "@typescript-eslint/visitor-keys": "8.31.1", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.31.1.tgz", + "integrity": "sha512-oU/OtYVydhXnumd0BobL9rkJg7wFJ9bFFPmSmB/bf/XWN85hlViji59ko6bSKBXyseT9V8l+CN1nwmlbiN0G7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.31.1", + "@typescript-eslint/types": "8.31.1", + "@typescript-eslint/typescript-estree": "8.31.1", + "@typescript-eslint/visitor-keys": "8.31.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.31.1.tgz", + "integrity": "sha512-BMNLOElPxrtNQMIsFHE+3P0Yf1z0dJqV9zLdDxN/xLlWMlXK/ApEsVEKzpizg9oal8bAT5Sc7+ocal7AC1HCVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.31.1", + "@typescript-eslint/visitor-keys": "8.31.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.31.1.tgz", + "integrity": "sha512-fNaT/m9n0+dpSp8G/iOQ05GoHYXbxw81x+yvr7TArTuZuCA6VVKbqWYVZrV5dVagpDTtj/O8k5HBEE/p/HM5LA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.31.1", + "@typescript-eslint/utils": "8.31.1", + "debug": "^4.3.4", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.31.1.tgz", + "integrity": "sha512-SfepaEFUDQYRoA70DD9GtytljBePSj17qPxFHA/h3eg6lPTqGJ5mWOtbXCk1YrVU1cTJRd14nhaXWFu0l2troQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.31.1.tgz", + "integrity": "sha512-kaA0ueLe2v7KunYOyWYtlf/QhhZb7+qh4Yw6Ni5kgukMIG+iP773tjgBiLWIXYumWCwEq3nLW+TUywEp8uEeag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.31.1", + "@typescript-eslint/visitor-keys": "8.31.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.31.1.tgz", + "integrity": "sha512-2DSI4SNfF5T4oRveQ4nUrSjUqjMND0nLq9rEkz0gfGr3tg0S5KB6DhwR+WZPCjzkZl3cH+4x2ce3EsL50FubjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.31.1", + "@typescript-eslint/types": "8.31.1", + "@typescript-eslint/typescript-estree": "8.31.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.31.1.tgz", + "integrity": "sha512-I+/rgqOVBn6f0o7NDTmAPWWC6NuqhV174lfYvAm9fUaWeiefLdux9/YI3/nLugEn9L8fcSi0XmpKi/r5u0nmpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.31.1", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@vitejs/plugin-react-swc": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.9.0.tgz", + "integrity": "sha512-jYFUSXhwMCYsh/aQTgSGLIN3Foz5wMbH9ahb0Zva//UzwZYbMiZd7oT3AU9jHT9DLswYDswsRwPU9jVF3yA48Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@swc/core": "^1.11.21" + }, + "peerDependencies": { + "vite": "^4 || ^5 || ^6" + } + }, + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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, + "license": "Python-2.0" + }, + "node_modules/aria-hidden": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", + "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "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, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/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==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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, + "license": "MIT" + }, + "node_modules/console-table-printer": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/console-table-printer/-/console-table-printer-2.12.1.tgz", + "integrity": "sha512-wKGOQRRvdnd89pCeH96e2Fn4wkbenSP6LMHfjfyNLMbGuHEFbMqQNuxXqd0oXG9caIOQ1FTvc5Uijp9/4jujnQ==", + "license": "MIT", + "dependencies": { + "simple-wcswidth": "^1.0.1" + } + }, + "node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.1.0.tgz", + "integrity": "sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==", + "license": "MIT", + "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, + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/esbuild": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.3.tgz", + "integrity": "sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.3", + "@esbuild/android-arm": "0.25.3", + "@esbuild/android-arm64": "0.25.3", + "@esbuild/android-x64": "0.25.3", + "@esbuild/darwin-arm64": "0.25.3", + "@esbuild/darwin-x64": "0.25.3", + "@esbuild/freebsd-arm64": "0.25.3", + "@esbuild/freebsd-x64": "0.25.3", + "@esbuild/linux-arm": "0.25.3", + "@esbuild/linux-arm64": "0.25.3", + "@esbuild/linux-ia32": "0.25.3", + "@esbuild/linux-loong64": "0.25.3", + "@esbuild/linux-mips64el": "0.25.3", + "@esbuild/linux-ppc64": "0.25.3", + "@esbuild/linux-riscv64": "0.25.3", + "@esbuild/linux-s390x": "0.25.3", + "@esbuild/linux-x64": "0.25.3", + "@esbuild/netbsd-arm64": "0.25.3", + "@esbuild/netbsd-x64": "0.25.3", + "@esbuild/openbsd-arm64": "0.25.3", + "@esbuild/openbsd-x64": "0.25.3", + "@esbuild/sunos-x64": "0.25.3", + "@esbuild/win32-arm64": "0.25.3", + "@esbuild/win32-ia32": "0.25.3", + "@esbuild/win32-x64": "0.25.3" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.25.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.25.1.tgz", + "integrity": "sha512-E6Mtz9oGQWDCpV12319d59n4tx9zOTXSTmc8BLVxBx+G/0RdM5MvEEJLU9c0+aleoePYYgVTOsRblx433qmhWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.20.0", + "@eslint/config-helpers": "^0.2.1", + "@eslint/core": "^0.13.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.25.1", + "@eslint/plugin-kit": "^0.2.8", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.3.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.20", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz", + "integrity": "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.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, + "license": "BSD-3-Clause", + "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, + "license": "BSD-2-Clause", + "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, + "license": "BSD-2-Clause", + "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==", + "license": "MIT", + "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, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "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.8" + }, + "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, + "license": "ISC", + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.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, + "license": "MIT", + "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, + "license": "MIT", + "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": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.0.0.tgz", + "integrity": "sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "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": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^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==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-url-attributes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", + "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inline-style-parser": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "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==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tiktoken": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/js-tiktoken/-/js-tiktoken-1.0.20.tgz", + "integrity": "sha512-Xlaqhhs8VfCd6Sh7a1cFkZHQbYTLCwVJJWiHVxBYzLPxW0XsoxBy1hitmjkdIjD3Aon5BXLHFwU5O8WUx6HH+A==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.5.1" + } + }, + "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, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/langsmith": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/langsmith/-/langsmith-0.3.25.tgz", + "integrity": "sha512-KuJu89VY3DmCdFvlVxQG4owQl546Z6pQc6TbhsyP77MkVJgZr8yvevZvvcXDWIpT2o2s52c9Aww2XVOH6GmHxQ==", + "license": "MIT", + "dependencies": { + "@types/uuid": "^10.0.0", + "chalk": "^4.1.2", + "console-table-printer": "^2.12.1", + "p-queue": "^6.6.2", + "p-retry": "4", + "semver": "^7.6.3", + "uuid": "^10.0.0" + }, + "peerDependencies": { + "openai": "*" + }, + "peerDependenciesMeta": { + "openai": { + "optional": true + } + } + }, + "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, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.2.tgz", + "integrity": "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.29.2", + "lightningcss-darwin-x64": "1.29.2", + "lightningcss-freebsd-x64": "1.29.2", + "lightningcss-linux-arm-gnueabihf": "1.29.2", + "lightningcss-linux-arm64-gnu": "1.29.2", + "lightningcss-linux-arm64-musl": "1.29.2", + "lightningcss-linux-x64-gnu": "1.29.2", + "lightningcss-linux-x64-musl": "1.29.2", + "lightningcss-win32-arm64-msvc": "1.29.2", + "lightningcss-win32-x64-msvc": "1.29.2" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.2.tgz", + "integrity": "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.2.tgz", + "integrity": "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.2.tgz", + "integrity": "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.2.tgz", + "integrity": "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.2.tgz", + "integrity": "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.2.tgz", + "integrity": "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz", + "integrity": "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz", + "integrity": "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz", + "integrity": "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz", + "integrity": "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT" + }, + "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==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lucide-react": { + "version": "0.508.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.508.0.tgz", + "integrity": "sha512-gcP16PnexqtOFrTtv98kVsGzTfnbPekzZiQfByi2S89xfk7E/4uKE1USZqccIp58v42LqkO7MuwpCqshwSrJCg==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "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-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "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.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "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-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==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "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.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "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-classify-character": "^2.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==", + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "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.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "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-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "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.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "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.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "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.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "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.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "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.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "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.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "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.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "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.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.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, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "license": "MIT", + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "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, + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "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-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^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.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "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" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/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" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", + "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.0" + } + }, + "node_modules/react-markdown": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.1.0.tgz", + "integrity": "sha512-xaijuJB0kzGiUdG7nc2MOMDUDBWPyGAjZtUrow9XxUeua8IqeP+VlIfAZ3bphpcLTnSZXz6z9jcVC/TCwbfgdw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.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-remove-scroll": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.6.3.tgz", + "integrity": "sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-router": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.5.3.tgz", + "integrity": "sha512-3iUDM4/fZCQ89SXlDa+Ph3MevBrozBAI655OAfWQlTm9nBR0IKlrmNwFow5lPHttbwvITZfkeeeZFP6zt3F7pw==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0", + "turbo-stream": "2.4.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.5.3.tgz", + "integrity": "sha512-cK0jSaTyW4jV9SRKAItMIQfWZ/D6WEZafgHuuCb9g+SjhLolY78qc+De4w/Cz9ybjvLzShAmaIMEXt8iF1Cm+A==", + "license": "MIT", + "dependencies": { + "react-router": "7.5.3" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "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==", + "license": "MIT", + "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.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "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/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, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.40.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.1.tgz", + "integrity": "sha512-C5VvvgCCyfyotVITIAv+4efVytl5F7wt+/I2i9q9GZcEXW9BP52YYOXC58igUi+LFZVHukErIIqQSWwv/M3WRw==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.7" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.40.1", + "@rollup/rollup-android-arm64": "4.40.1", + "@rollup/rollup-darwin-arm64": "4.40.1", + "@rollup/rollup-darwin-x64": "4.40.1", + "@rollup/rollup-freebsd-arm64": "4.40.1", + "@rollup/rollup-freebsd-x64": "4.40.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.40.1", + "@rollup/rollup-linux-arm-musleabihf": "4.40.1", + "@rollup/rollup-linux-arm64-gnu": "4.40.1", + "@rollup/rollup-linux-arm64-musl": "4.40.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.40.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.40.1", + "@rollup/rollup-linux-riscv64-gnu": "4.40.1", + "@rollup/rollup-linux-riscv64-musl": "4.40.1", + "@rollup/rollup-linux-s390x-gnu": "4.40.1", + "@rollup/rollup-linux-x64-gnu": "4.40.1", + "@rollup/rollup-linux-x64-musl": "4.40.1", + "@rollup/rollup-win32-arm64-msvc": "4.40.1", + "@rollup/rollup-win32-ia32-msvc": "4.40.1", + "@rollup/rollup-win32-x64-msvc": "4.40.1", + "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" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "license": "MIT" + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/simple-wcswidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-wcswidth/-/simple-wcswidth-1.0.1.tgz", + "integrity": "sha512-xMO/8eNREtaROt7tJvWJqHBDTMFN4eiQ5I4JRMuilwfnFcV5W9u7RUkueNkdw0jPqGMX36iCywelS5yilTuOxg==", + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "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==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "license": "MIT", + "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-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, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-to-js": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.16.tgz", + "integrity": "sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.8" + } + }, + "node_modules/style-to-object": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz", + "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.4" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tailwind-merge": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.2.0.tgz", + "integrity": "sha512-FQT/OVqCD+7edmmJpsgCsY820RTD5AkBryuG5IUqR5YQZSdj5xlH5nLgH7YPths7WsLPSpSBNneJdM8aS8aeFA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.5.tgz", + "integrity": "sha512-nYtSPfWGDiWgCkwQG/m+aX83XCwf62sBgg3bIlNiiOcggnS1x3uVRDAuyelBFL+vJdOPPCGElxv9DjHJjRHiVA==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", + "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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, + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/turbo-stream": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz", + "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==", + "license": "ISC" + }, + "node_modules/tw-animate-css": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.2.9.tgz", + "integrity": "sha512-9O4k1at9pMQff9EAcCEuy1UNO43JmaPQvq+0lwza9Y0BQ6LB38NiMj+qHqjoQf40355MX+gs6wtlR6H9WsSXFg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Wombosvideo" + } + }, + "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, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.31.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.31.1.tgz", + "integrity": "sha512-j6DsEotD/fH39qKzXTQRwYYWlt7D+0HmfpOK+DVhwJOFLcdmn92hq3mBb7HlKJHbjjI/gTOqEcc9d6JfpFf/VA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.31.1", + "@typescript-eslint/parser": "8.31.1", + "@typescript-eslint/utils": "8.31.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.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==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.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==", + "license": "MIT", + "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": "6.3.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.4.tgz", + "integrity": "sha512-BiReIiMS2fyFqbqNT/Qqt4CVITDU9M9vE+DKcVAsB+ZV0wvTKd+3hMbkpxz1b+NmEDMegpVbisKiAZOnvO92Sw==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.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 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.24.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.4.tgz", + "integrity": "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.24.5", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz", + "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } + }, + "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==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..9dba4f4 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,46 @@ +{ + "name": "frontend", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@langchain/core": "^0.3.55", + "@langchain/langgraph-sdk": "^0.0.74", + "@radix-ui/react-scroll-area": "^1.2.8", + "@radix-ui/react-select": "^2.2.4", + "@radix-ui/react-slot": "^1.2.2", + "@radix-ui/react-tabs": "^1.1.11", + "@radix-ui/react-tooltip": "^1.2.6", + "@tailwindcss/vite": "^4.1.5", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.508.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-markdown": "^9.0.3", + "react-router-dom": "^7.5.3", + "tailwind-merge": "^3.2.0", + "tailwindcss": "^4.1.5" + }, + "devDependencies": { + "@eslint/js": "^9.22.0", + "@types/node": "^22.15.17", + "@types/react": "^19.1.2", + "@types/react-dom": "^19.1.3", + "@vitejs/plugin-react-swc": "^3.9.0", + "eslint": "^9.22.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.19", + "globals": "^16.0.0", + "tw-animate-css": "^1.2.9", + "typescript": "~5.7.2", + "typescript-eslint": "^8.26.1", + "vite": "^6.3.4" + } +} diff --git a/frontend/public/vite.svg b/frontend/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/frontend/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx new file mode 100644 index 0000000..6e68e50 --- /dev/null +++ b/frontend/src/App.tsx @@ -0,0 +1,184 @@ +import { useStream } from "@langchain/langgraph-sdk/react"; +import type { Message } from "@langchain/langgraph-sdk"; +import { useState, useEffect, useRef, useCallback } from "react"; +import { ProcessedEvent } from "@/components/ActivityTimeline"; +import { WelcomeScreen } from "@/components/WelcomeScreen"; +import { ChatMessagesView } from "@/components/ChatMessagesView"; + +export default function App() { + const [processedEventsTimeline, setProcessedEventsTimeline] = useState< + ProcessedEvent[] + >([]); + const [historicalActivities, setHistoricalActivities] = useState< + Record + >({}); + const scrollAreaRef = useRef(null); + const hasFinalizeEventOccurredRef = useRef(false); + + const thread = useStream<{ + messages: Message[]; + initial_search_query_count: number; + max_research_loops: number; + reasoning_model: string; + }>({ + apiUrl: import.meta.env.DEV + ? "http://localhost:2024" + : "http://localhost:8123", + assistantId: "agent", + messagesKey: "messages", + onFinish: (event: any) => { + console.log(event); + }, + onUpdateEvent: (event: any) => { + let processedEvent: ProcessedEvent | null = null; + if (event.generate_query) { + processedEvent = { + title: "Generating Search Queries", + data: event.generate_query.query_list.join(", "), + }; + } else if (event.web_research) { + const sources = event.web_research.sources_gathered || []; + const numSources = sources.length; + const uniqueLabels = [ + ...new Set(sources.map((s: any) => s.label).filter(Boolean)), + ]; + const exampleLabels = uniqueLabels.slice(0, 3).join(", "); + processedEvent = { + title: "Web Research", + data: `Gathered ${numSources} sources. Related to: ${ + exampleLabels || "N/A" + }.`, + }; + } else if (event.reflection) { + processedEvent = { + title: "Reflection", + data: event.reflection.is_sufficient + ? "Search successful, generating final answer." + : `Need more information, searching for ${event.reflection.follow_up_queries.join( + ", " + )}`, + }; + } else if (event.finalize_answer) { + processedEvent = { + title: "Finalizing Answer", + data: "Composing and presenting the final answer.", + }; + hasFinalizeEventOccurredRef.current = true; + } + if (processedEvent) { + setProcessedEventsTimeline((prevEvents) => [ + ...prevEvents, + processedEvent!, + ]); + } + }, + }); + + useEffect(() => { + if (scrollAreaRef.current) { + const scrollViewport = scrollAreaRef.current.querySelector( + "[data-radix-scroll-area-viewport]" + ); + if (scrollViewport) { + scrollViewport.scrollTop = scrollViewport.scrollHeight; + } + } + }, [thread.messages]); + + useEffect(() => { + if ( + hasFinalizeEventOccurredRef.current && + !thread.isLoading && + thread.messages.length > 0 + ) { + const lastMessage = thread.messages[thread.messages.length - 1]; + if (lastMessage && lastMessage.type === "ai" && lastMessage.id) { + setHistoricalActivities((prev) => ({ + ...prev, + [lastMessage.id!]: [...processedEventsTimeline], + })); + } + hasFinalizeEventOccurredRef.current = false; + } + }, [thread.messages, thread.isLoading, processedEventsTimeline]); + + const handleSubmit = useCallback( + (submittedInputValue: string, effort: string, model: string) => { + if (!submittedInputValue.trim()) return; + setProcessedEventsTimeline([]); + hasFinalizeEventOccurredRef.current = false; + + // convert effort to, initial_search_query_count and max_research_loops + // low means max 1 loop and 1 query + // medium means max 3 loops and 3 queries + // high means max 10 loops and 5 queries + let initial_search_query_count = 0; + let max_research_loops = 0; + switch (effort) { + case "low": + initial_search_query_count = 1; + max_research_loops = 1; + break; + case "medium": + initial_search_query_count = 3; + max_research_loops = 3; + break; + case "high": + initial_search_query_count = 5; + max_research_loops = 10; + break; + } + + const newMessages: Message[] = [ + ...(thread.messages || []), + { + type: "human", + content: submittedInputValue, + id: Date.now().toString(), + }, + ]; + thread.submit({ + messages: newMessages, + initial_search_query_count: initial_search_query_count, + max_research_loops: max_research_loops, + reasoning_model: model, + }); + }, + [thread] + ); + + const handleCancel = useCallback(() => { + thread.stop(); + window.location.reload(); + }, [thread]); + + return ( +
+
+
+ {thread.messages.length === 0 ? ( + + ) : ( + + )} +
+
+
+ ); +} diff --git a/frontend/src/components/ActivityTimeline.tsx b/frontend/src/components/ActivityTimeline.tsx new file mode 100644 index 0000000..b366929 --- /dev/null +++ b/frontend/src/components/ActivityTimeline.tsx @@ -0,0 +1,146 @@ +import { + Card, + CardContent, + CardDescription, + CardHeader, +} from "@/components/ui/card"; +import { ScrollArea } from "@/components/ui/scroll-area"; +import { + Loader2, + Activity, + Info, + Search, + TextSearch, + Brain, + Pen, + ChevronDown, + ChevronUp, +} from "lucide-react"; +import { useEffect, useState } from "react"; + +export interface ProcessedEvent { + title: string; + data: any; +} + +interface ActivityTimelineProps { + processedEvents: ProcessedEvent[]; + isLoading: boolean; +} + +export function ActivityTimeline({ + processedEvents, + isLoading, +}: ActivityTimelineProps) { + const [isTimelineCollapsed, setIsTimelineCollapsed] = + useState(false); + const getEventIcon = (title: string, index: number) => { + if (index === 0 && isLoading && processedEvents.length === 0) { + return ; + } + if (title.toLowerCase().includes("generating")) { + return ; + } else if (title.toLowerCase().includes("thinking")) { + return ; + } else if (title.toLowerCase().includes("reflection")) { + return ; + } else if (title.toLowerCase().includes("research")) { + return ; + } else if (title.toLowerCase().includes("finalizing")) { + return ; + } + return ; + }; + + useEffect(() => { + if (!isLoading && processedEvents.length !== 0) { + setIsTimelineCollapsed(true); + } + }, [isLoading, processedEvents]); + + return ( + + + +
setIsTimelineCollapsed(!isTimelineCollapsed)} + > + Research + {isTimelineCollapsed ? ( + + ) : ( + + )} +
+
+
+ {!isTimelineCollapsed && ( + + + {isLoading && processedEvents.length === 0 && ( +
+
+
+ +
+
+

+ Searching... +

+
+
+ )} + {processedEvents.length > 0 ? ( +
+ {processedEvents.map((eventItem, index) => ( +
+ {index < processedEvents.length - 1 || + (isLoading && index === processedEvents.length - 1) ? ( +
+ ) : null} +
+ {getEventIcon(eventItem.title, index)} +
+
+

+ {eventItem.title} +

+

+ {typeof eventItem.data === "string" + ? eventItem.data + : Array.isArray(eventItem.data) + ? (eventItem.data as string[]).join(", ") + : JSON.stringify(eventItem.data)} +

+
+
+ ))} + {isLoading && processedEvents.length > 0 && ( +
+
+ +
+
+

+ Searching... +

+
+
+ )} +
+ ) : !isLoading ? ( // Only show "No activity" if not loading and no events +
+ +

No activity to display.

+

+ Timeline will update during processing. +

+
+ ) : null} + + + )} + + ); +} diff --git a/frontend/src/components/ChatMessagesView.tsx b/frontend/src/components/ChatMessagesView.tsx new file mode 100644 index 0000000..1792e6f --- /dev/null +++ b/frontend/src/components/ChatMessagesView.tsx @@ -0,0 +1,321 @@ +import type React from "react"; +import type { Message } from "@langchain/langgraph-sdk"; +import { ScrollArea } from "@/components/ui/scroll-area"; +import { Loader2, Copy, CopyCheck } from "lucide-react"; +import { InputForm } from "@/components/InputForm"; +import { Button } from "@/components/ui/button"; +import { useState, ReactNode } from "react"; +import ReactMarkdown from "react-markdown"; +import { cn } from "@/lib/utils"; +import { Badge } from "@/components/ui/badge"; +import { + ActivityTimeline, + ProcessedEvent, +} from "@/components/ActivityTimeline"; // Assuming ActivityTimeline is in the same dir or adjust path + +// Markdown component props type from former ReportView +type MdComponentProps = { + className?: string; + children?: ReactNode; + [key: string]: any; +}; + +// Markdown components (from former ReportView.tsx) +const mdComponents = { + h1: ({ className, children, ...props }: MdComponentProps) => ( +

+ {children} +

+ ), + h2: ({ className, children, ...props }: MdComponentProps) => ( +

+ {children} +

+ ), + h3: ({ className, children, ...props }: MdComponentProps) => ( +

+ {children} +

+ ), + p: ({ className, children, ...props }: MdComponentProps) => ( +

+ {children} +

+ ), + a: ({ className, children, href, ...props }: MdComponentProps) => ( + + + {children} + + + ), + ul: ({ className, children, ...props }: MdComponentProps) => ( +
    + {children} +
+ ), + ol: ({ className, children, ...props }: MdComponentProps) => ( +
    + {children} +
+ ), + li: ({ className, children, ...props }: MdComponentProps) => ( +
  • + {children} +
  • + ), + blockquote: ({ className, children, ...props }: MdComponentProps) => ( +
    + {children} +
    + ), + code: ({ className, children, ...props }: MdComponentProps) => ( + + {children} + + ), + pre: ({ className, children, ...props }: MdComponentProps) => ( +
    +      {children}
    +    
    + ), + hr: ({ className, ...props }: MdComponentProps) => ( +
    + ), + table: ({ className, children, ...props }: MdComponentProps) => ( +
    + + {children} +
    +
    + ), + th: ({ className, children, ...props }: MdComponentProps) => ( + + {children} + + ), + td: ({ className, children, ...props }: MdComponentProps) => ( + + {children} + + ), +}; + +// Props for HumanMessageBubble +interface HumanMessageBubbleProps { + message: Message; + mdComponents: typeof mdComponents; +} + +// HumanMessageBubble Component +const HumanMessageBubble: React.FC = ({ + message, + mdComponents, +}) => { + return ( +
    + + {typeof message.content === "string" + ? message.content + : JSON.stringify(message.content)} + +
    + ); +}; + +// Props for AiMessageBubble +interface AiMessageBubbleProps { + message: Message; + historicalActivity: ProcessedEvent[] | undefined; + liveActivity: ProcessedEvent[] | undefined; + isLastMessage: boolean; + isOverallLoading: boolean; + mdComponents: typeof mdComponents; + handleCopy: (text: string, messageId: string) => void; + copiedMessageId: string | null; +} + +// AiMessageBubble Component +const AiMessageBubble: React.FC = ({ + message, + historicalActivity, + liveActivity, + isLastMessage, + isOverallLoading, + mdComponents, + handleCopy, + copiedMessageId, +}) => { + // Determine which activity events to show and if it's for a live loading message + const activityForThisBubble = + isLastMessage && isOverallLoading ? liveActivity : historicalActivity; + const isLiveActivityForThisBubble = isLastMessage && isOverallLoading; + + return ( +
    + {activityForThisBubble && activityForThisBubble.length > 0 && ( +
    + +
    + )} + + {typeof message.content === "string" + ? message.content + : JSON.stringify(message.content)} + + +
    + ); +}; + +interface ChatMessagesViewProps { + messages: Message[]; + isLoading: boolean; + scrollAreaRef: React.RefObject; + onSubmit: (inputValue: string, effort: string, model: string) => void; + onCancel: () => void; + liveActivityEvents: ProcessedEvent[]; + historicalActivities: Record; +} + +export function ChatMessagesView({ + messages, + isLoading, + scrollAreaRef, + onSubmit, + onCancel, + liveActivityEvents, + historicalActivities, +}: ChatMessagesViewProps) { + const [copiedMessageId, setCopiedMessageId] = useState(null); + + const handleCopy = async (text: string, messageId: string) => { + try { + await navigator.clipboard.writeText(text); + setCopiedMessageId(messageId); + setTimeout(() => setCopiedMessageId(null), 2000); // Reset after 2 seconds + } catch (err) { + console.error("Failed to copy text: ", err); + } + }; + + return ( +
    + +
    + {messages.map((message, index) => { + const isLast = index === messages.length - 1; + return ( +
    +
    + {message.type === "human" ? ( + + ) : ( + + )} +
    +
    + ); + })} + {isLoading && + (messages.length === 0 || + messages[messages.length - 1].type === "human") && ( +
    + {" "} + {/* AI message row structure */} +
    + {liveActivityEvents.length > 0 ? ( +
    + +
    + ) : ( +
    + + Processing... +
    + )} +
    +
    + )} +
    +
    + 0} + /> +
    + ); +} diff --git a/frontend/src/components/InputForm.tsx b/frontend/src/components/InputForm.tsx new file mode 100644 index 0000000..6f3127c --- /dev/null +++ b/frontend/src/components/InputForm.tsx @@ -0,0 +1,180 @@ +import { useState } from "react"; +import { Button } from "@/components/ui/button"; +import { SquarePen, Brain, Send, StopCircle, Zap, Cpu } from "lucide-react"; +import { Textarea } from "@/components/ui/textarea"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; + +// Updated InputFormProps +interface InputFormProps { + onSubmit: (inputValue: string, effort: string, model: string) => void; + onCancel: () => void; + isLoading: boolean; + hasHistory: boolean; +} + +export const InputForm: React.FC = ({ + onSubmit, + onCancel, + isLoading, + hasHistory, +}) => { + const [internalInputValue, setInternalInputValue] = useState(""); + const [effort, setEffort] = useState("medium"); + const [model, setModel] = useState("gemini-2.5-flash-preview-04-17"); + + const handleInternalSubmit = (e?: React.FormEvent) => { + if (e) e.preventDefault(); + if (!internalInputValue.trim()) return; + onSubmit(internalInputValue, effort, model); + setInternalInputValue(""); + }; + + const handleInternalKeyDown = ( + e: React.KeyboardEvent + ) => { + if (e.key === "Enter" && !e.shiftKey) { + e.preventDefault(); + handleInternalSubmit(); + } + }; + + const isSubmitDisabled = !internalInputValue.trim() || isLoading; + + return ( +
    +
    +